{
  "version": 3,
  "sources": ["../../src/document/components/utils/siteParameters.ts", "../../esbuild/editorbar-externals/react-dom/index.js", "../../src/services/hooks/iframeFeaturePolicy.ts", "../../src/editorbar-initializer/editingFavicon.ts", "../../src/utils/typeChecks.ts", "../../src/editorbar-initializer/useComponentInitialized.ts", "../../src/document/models/CanvasTree/traits/WithLocales.ts", "../../esbuild/editorbar-externals/library/index.js", "../../src/editorbar-initializer/useNodeIdsForCurrentRoute.ts", "../../src/editorbar-initializer/useSynchronizeEditableNodeIdForActiveRoute.ts", "../../src/editorbar-initializer/init.tsx"],
  "sourcesContent": ["export const FRAMER_SITE_PARAMETER_PREFIX = \"framer_\"\nexport const EDIT_SITE_KEY = \"editSite\"\nexport const FRAMER_VARIANT_KEY = `framer_variant` // Must match FramerDomainsServer\n", "import { getDependency } from \"../getDependency.js\"\n\nexport const { createPortal } = getDependency(\"react-dom\")\n", "import { assertNever } from \"@framerjs/shared/src/assert.ts\"\n\nconst CANVAS_IFRAME_FEATURE_POLICY =\n\t\"autoplay; ambient-light-sensor; accelerometer; camera; display-capture; encrypted-media; fullscreen; geolocation; gyroscope; magnetometer; microphone; midi; picture-in-picture; usb; xr-spatial-tracking\"\n\nconst CANVAS_ON_PAGE_IFRAME_FEATURE_POLICY = \"autoplay\"\n\nconst PREVIEW_IFRAME_FEATURE_POLICY =\n\t\"autoplay; ambient-light-sensor; accelerometer; camera; display-capture; encrypted-media; fullscreen; geolocation; gyroscope; magnetometer; microphone; midi; picture-in-picture; usb; xr-spatial-tracking; clipboard-read; clipboard-write\"\n\n/**\n * Returns the appropriate iframe allow policy for the given type.\n * Automatically appends local-network-access in development builds.\n */\nexport function getIFrameAllowPolicy(type: \"on_page\" | \"editor\" | \"preview\"): string {\n\tlet basePolicy: string | undefined\n\n\tswitch (type) {\n\t\tcase \"on_page\":\n\t\t\tbasePolicy = CANVAS_ON_PAGE_IFRAME_FEATURE_POLICY\n\t\t\tbreak\n\t\tcase \"editor\":\n\t\t\tbasePolicy = CANVAS_IFRAME_FEATURE_POLICY\n\t\t\tbreak\n\t\tcase \"preview\":\n\t\t\tbasePolicy = PREVIEW_IFRAME_FEATURE_POLICY\n\t\t\tbreak\n\t\tdefault:\n\t\t\tassertNever(type)\n\t}\n\n\t// Append local-network-access in development builds\n\tif (process.env.NODE_ENV === \"development\") {\n\t\treturn `${basePolicy}; local-network-access`\n\t}\n\n\treturn basePolicy\n}\n", "const dataKey = \"data-original-href\"\nconst selector = \"link[rel*='icon']\"\nconst selectorNoOriginalHref = `${selector}:not([${dataKey}])`\nconst editingFaviconAssetURL = \"https://framerusercontent.com/sites/icons/writing-hand-favicon.png\"\n\nexport function setEditingFavicon() {\n\t// We CAN'T know which favicon has been decided to be used by the browser, so we need to \"deactivate\" all of them,\n\t// saving their original href's and replacing them with the editing favicon.\n\t// The selector checks for all links with the rel attribute containing \"icon\" and that have not been modified yet.\n\t// We do that to avoid rewriting the original href if editor bar re-renders\n\tdocument.querySelectorAll(selectorNoOriginalHref).forEach(link => {\n\t\tif (link instanceof HTMLLinkElement) {\n\t\t\tlink.setAttribute(dataKey, link.href)\n\t\t\tlink.setAttribute(\"href\", editingFaviconAssetURL)\n\t\t}\n\t})\n}\n\nexport function revertEditingFavicon() {\n\tdocument.querySelectorAll(selector).forEach(link => {\n\t\tif (link instanceof HTMLLinkElement && link.getAttribute(dataKey)) {\n\t\t\tlink.setAttribute(\"href\", link.getAttribute(dataKey) ?? \"\")\n\t\t\tlink.removeAttribute(dataKey)\n\t\t}\n\t})\n}\n", "export function isBoolean(value: unknown): value is boolean {\n\treturn value === true || value === false\n}\n\nexport function isString(value: unknown): value is string {\n\treturn typeof value === \"string\"\n}\n\nexport function isBooleanString(value: unknown): value is \"true\" | \"false\" {\n\tif (!isString(value)) return false\n\treturn value === \"true\" || value === \"false\"\n}\n\nexport function isNonEmptyString(value: unknown): value is string {\n\treturn isString(value) && value.length > 0\n}\n\nexport function isNumber(value: unknown): value is number {\n\treturn Number.isFinite(value)\n}\n\nexport function isObject(value: unknown): value is Record<string, unknown> {\n\treturn typeof value === \"object\" && value !== null && !Array.isArray(value)\n}\n\nexport function isObjectWithKey<K extends string>(value: unknown, key: K): value is Record<K, unknown> {\n\treturn isObject(value) && key in value\n}\n\nexport function isArray(value: unknown): value is unknown[] {\n\treturn Array.isArray(value)\n}\n\nexport function isArrayOfStrings(value: unknown): value is string[] {\n\treturn isArray(value) && value.every(isString)\n}\n\n/**\n * We can't check for readonly at runtime. But unfortunately TypeScript sees readonly arrays as a\n * completely different type as regular arrays. So we can't check for both with a single function.\n */\nexport function isReadonlyArray(value: unknown): value is readonly unknown[] {\n\treturn Array.isArray(value)\n}\n\nexport function isSet(value: unknown): value is Set<unknown> {\n\treturn value instanceof Set\n}\n\nexport function isUndefined(value: unknown): value is undefined {\n\treturn value === undefined\n}\n\n/** **Note:** Use `!isUndefined` when possible! */\nexport function isDefined<T>(value: T | undefined): value is T {\n\treturn value !== undefined\n}\n\nexport function isFunction(value: unknown): value is (...parameters: unknown[]) => unknown {\n\treturn typeof value === \"function\"\n}\n\nexport function isNull(value: unknown): value is null {\n\treturn value === null\n}\n\nexport function isNonNull<T>(value: T): value is typeof value extends null ? never : T {\n\treturn value !== null\n}\n\nexport function isSymbol(value: unknown): value is symbol {\n\treturn typeof value === \"symbol\"\n}\n\nexport function isNullish(value: unknown): value is null | undefined {\n\t// this is faster than checking value === null || value === undefined in V8.\n\treturn value == null\n}\n\nexport function isPromise(object: unknown): object is Promise<unknown> {\n\treturn typeof object === \"object\" && object !== null && \"then\" in object && typeof object.then === \"function\"\n}\n\nexport function isPromiseFulfilled<T>(promise: PromiseSettledResult<T>): promise is PromiseFulfilledResult<T> {\n\treturn promise.status === \"fulfilled\"\n}\n\nexport function isValidDate(value: unknown): value is Date {\n\treturn value instanceof Date && !Number.isNaN(value.getTime())\n}\n\nexport type Primitive = string | number | boolean | null | undefined\nexport function isPrimitive(value: unknown): value is Primitive {\n\treturn isNull(value) || isUndefined(value) || isString(value) || isNumber(value) || isBoolean(value)\n}\n", "import { useEffect, useState } from \"react\"\nimport { isObject } from \"utils/typeChecks.ts\"\n\nexport function useComponentInitialized(editorBarOrigin: string, name: string): boolean {\n\tconst [isInitialized, setIsInitialized] = useState(false)\n\n\tuseEffect(() => {\n\t\tconst handleMessage = (event: MessageEvent<unknown>) => {\n\t\t\tif (event.origin !== editorBarOrigin) return\n\n\t\t\t// TODO: use more robust protocol definitions https://github.com/framer/company/issues/31027\n\t\t\tif (!isObject(event.data)) return\n\n\t\t\tconst { apiVersion, type, component } = event.data\n\n\t\t\tif (apiVersion === 1 && type === \"initializeComponent\" && component === name) {\n\t\t\t\tsetIsInitialized(true)\n\t\t\t}\n\t\t}\n\n\t\twindow.addEventListener(\"message\", handleMessage)\n\n\t\treturn () => {\n\t\t\twindow.removeEventListener(\"message\", handleMessage)\n\t\t}\n\t}, [editorBarOrigin, name])\n\n\treturn isInitialized\n}\n", "import type { LanguageModel } from \"app/ai/languageModels.ts\"\nimport { isObject } from \"utils/typeChecks.ts\"\n\nexport type LocaleId = string\n\nexport const defaultLocaleId = \"default\"\n\nexport interface Locale {\n\tid: LocaleId\n\tcode: string\n\tslug: string\n\tname: string\n\tdraft: boolean\n\tcustomAiInstructions?: string\n\tfallback?: LocaleId\n\taiModel?: LanguageModel\n\tmanagedByAI?: boolean\n}\n\nexport interface WithLocales {\n\tlocales: readonly Locale[] | undefined\n}\n\nconst key = \"locales\" satisfies keyof WithLocales\nexport function isLocalesUpdate(change: unknown): change is WithLocales {\n\treturn isObject(change) && key in change\n}\n\n/**\n * Removing a locale may affect other locales' fallback chains. CMS Databases\n * generate locale fallback chains into indices. This means that removing a\n * locale that is a fallback or changing a fallback requires databases to be\n * regenerated.\n */\nexport function shouldRegenerateCollections(\n\tfromLocales: readonly Locale[] | undefined,\n\ttoLocales: readonly Locale[] | undefined,\n): boolean {\n\tif (!toLocales || !fromLocales) return false\n\n\t// Removing a locale may affect other locales' fallback chains\n\tif (fromLocales.length > toLocales.length) return true\n\n\tfor (const locale of toLocales) {\n\t\tconst matchingFromLocale = fromLocales.find(fromLocale => fromLocale.id === locale.id)\n\n\t\tif (!matchingFromLocale) continue\n\n\t\t// Changing a locale's fallback affects its fallback chain\n\t\tif (matchingFromLocale.fallback !== locale.fallback) return true\n\t}\n\n\treturn false\n}\n", "import { getDependency } from \"../getDependency.js\"\n\n/**\n * @important This file is part of `framer.com/edit/init.mjs`, which gets published after building.\n * In other words, when a PR is deployed to production, this file is published independently of the\n * library of Framer sites.\n * This means, it should only rely on exports from the library that are guaranteed to be available\n * in production (which is not guaranteed for new exports, as users might not have published with\n * the latest library version).\n */\nexport const { useCurrentRoute, useLocaleInfo, useRouter } = getDependency(\"framer\")\n", "import type { NodeID } from \"document/models/CanvasTree/index.ts\"\nimport { defaultLocaleId } from \"document/models/CanvasTree/traits/WithLocales.ts\"\nimport { useCurrentRoute, useLocaleInfo, useRouter } from \"library/index.ts\"\nimport type { Locale, LocaleId, UtilsByCollectionId } from \"library/router/types.ts\"\nimport { useEffect, useState } from \"react\"\n\nexport interface NodeIdsForRoute {\n\tcollectionItemNodeId?: NodeID\n\twebPageNodeId: NodeID\n\tactiveLocaleId: LocaleId\n}\n\nexport function useNodeIdsForCurrentRoute(): NodeIdsForRoute | undefined {\n\tconst activeRoute = useCurrentRoute()\n\tconst activeLocale = useLocaleInfo()?.activeLocale ?? undefined\n\tconst { collectionUtils } = useRouter()\n\n\tconst [nodeIds, setNodeIds] = useState<NodeIdsForRoute>()\n\n\tconst webPageNodeId = activeRoute?.id\n\tconst collectionId = activeRoute?.collectionId\n\tconst pathVariables = activeRoute?.pathVariables\n\n\tuseEffect(() => {\n\t\tif (!webPageNodeId) return\n\n\t\tlet ignore = false\n\n\t\tresolveWebPageIdToCollectionItemNodeId(activeLocale, collectionId, collectionUtils, pathVariables)\n\t\t\t.then(collectionItemNodeId => {\n\t\t\t\tif (!ignore) {\n\t\t\t\t\tsetNodeIds({\n\t\t\t\t\t\tcollectionItemNodeId,\n\t\t\t\t\t\twebPageNodeId,\n\t\t\t\t\t\tactiveLocaleId: activeLocale?.id ?? defaultLocaleId,\n\t\t\t\t\t})\n\t\t\t\t}\n\t\t\t})\n\t\t\t.catch(() => {\n\t\t\t\tif (!ignore) {\n\t\t\t\t\tsetNodeIds({\n\t\t\t\t\t\tcollectionItemNodeId: undefined,\n\t\t\t\t\t\twebPageNodeId,\n\t\t\t\t\t\tactiveLocaleId: activeLocale?.id ?? defaultLocaleId,\n\t\t\t\t\t})\n\t\t\t\t}\n\t\t\t})\n\n\t\treturn () => {\n\t\t\tignore = true\n\t\t}\n\t}, [activeLocale, collectionId, collectionUtils, pathVariables, webPageNodeId])\n\n\treturn nodeIds\n}\n\nasync function resolveWebPageIdToCollectionItemNodeId(\n\tactiveLocale: Locale | undefined,\n\tcollectionId: string | undefined,\n\tcollectionUtils: UtilsByCollectionId | undefined,\n\tpathVariables: Record<string, unknown> | undefined,\n): Promise<NodeID | undefined> {\n\tif (!collectionId) return undefined\n\n\tconst slugs = Object.values(pathVariables ?? {})\n\n\tconst [slug] = slugs\n\tif (slugs.length !== 1 || !slug || typeof slug !== \"string\") {\n\t\t// We don't support WebPages with multiple slugs at the moment\n\t\treturn undefined\n\t}\n\n\tconst getUtils = collectionUtils?.[collectionId]\n\tconst utils = await getUtils?.()\n\treturn utils?.getRecordIdBySlug(slug, activeLocale)\n}\n", "import { type RefObject, useEffect } from \"react\"\nimport { useComponentInitialized } from \"./useComponentInitialized.ts\"\nimport { useNodeIdsForCurrentRoute } from \"./useNodeIdsForCurrentRoute.ts\"\n\nexport function useSynchronizeEditableNodeIdForActiveRoute(\n\tiframeRef: RefObject<HTMLIFrameElement>,\n\teditorBarOrigin: string,\n) {\n\tconst nodeIds = useNodeIdsForCurrentRoute()\n\n\tconst isInitialized = useComponentInitialized(editorBarOrigin, \"OnPageActiveRouteStore\")\n\n\tuseEffect(() => {\n\t\tif (!isInitialized) return\n\n\t\tiframeRef.current?.contentWindow?.postMessage(\n\t\t\t{\n\t\t\t\tapiVersion: 1,\n\t\t\t\ttype: \"updateNodeIds\",\n\t\t\t\tnodeIds,\n\t\t\t},\n\t\t\teditorBarOrigin,\n\t\t)\n\t}, [iframeRef, nodeIds, editorBarOrigin, isInitialized])\n}\n", "import \"./entryPointStyles.ts\"\nimport { ResolvablePromise } from \"@framerjs/shared/src/ResolvablePromise.ts\"\nimport { isWebView } from \"@framerjs/shared/src/environment.ts\"\nimport { EDIT_SITE_KEY, FRAMER_SITE_PARAMETER_PREFIX } from \"document/components/utils/siteParameters.ts\"\nimport { FORCE_SHOW_KEY, MAX_Z_INDEX, ON_PAGE_EDITING_TRANSITION_DURATION_MILLIS } from \"editorbar/constants.ts\"\nimport type { EditorBarProps } from \"library/modules/EditorBarLauncher.tsx\"\nimport { type RefObject, memo, useCallback, useEffect, useRef, useState } from \"react\"\nimport { createPortal } from \"react-dom\"\nimport { getIFrameAllowPolicy } from \"services/hooks/iframeFeaturePolicy.ts\"\nimport type { EditButtonProps } from \"./EditButton.tsx\"\nimport { revertEditingFavicon, setEditingFavicon } from \"./editingFavicon.ts\"\nimport { useSynchronizeEditableNodeIdForActiveRoute } from \"./useSynchronizeEditableNodeIdForActiveRoute.ts\"\n\nconst loadStart = Date.now()\n\nfunction isRunningInIframe() {\n\treturn window.self !== window.top\n}\n\n// language=CSS\nconst css = `\n#__framer-editorbar {\n    /* https://sergeyski.com/css-color-scheme-and-iframes-lessons-learned-from-disqus-background-bug */\n    color-scheme: light dark;\n    overflow: hidden;\n    position: fixed;\n    border: none;\n    z-index: calc(${MAX_Z_INDEX});\n    top: 0;\n    left: 0;\n    width: 100vw;\n    height: 100vh;\n    touch-action: manipulation;\n}\n\n@supports (height: 100dvh) {\n    #__framer-editorbar {\n        height: 100dvh;\n    }\n}\n\n#__framer-editorbar.status_hidden {\n    display: none;\n}\n\n#__framer-editorbar.status_visually_hidden {\n    clip-path: circle(1px at calc(100% - 1px) calc(100% - 1px));\n    z-index: calc(${MAX_Z_INDEX} - 1);\n}\n\n#__framer-editorbar.status_measuring {\n    clip-path: unset;\n}\n`\n\nconst style = document.createElement(\"style\")\nstyle.innerHTML = css\ndocument.head.appendChild(style)\n\nconst editorBarOrigin = new URL(import.meta.url).origin\n\n/**\n * Checks if the `editSite` parameter should forcefully show the editor bar, and\n * if so, removes the parameter from the URL.\n *\n * Requirements:\n *\n *  1. The editSite parameter (or lowercase) must be present and valueless\n *  2. It should be the only parameter, except for parameters prefixed with \"framer_\"\n *\n * These requirements minimize the chance of the `editSite` name clashing with\n * legitimate query parameters from customers.\n */\nfunction shouldForceShowEditorBar(): boolean {\n\tif (localStorage[FORCE_SHOW_KEY]) {\n\t\tdeleteForceShowEditorBarParameter()\n\t\treturn true\n\t}\n\n\tconst url = new URL(window.location.href)\n\tconst hasEditSite = url.searchParams.has(EDIT_SITE_KEY)\n\tconst hasEditSiteLowercase = url.searchParams.has(EDIT_SITE_KEY.toLowerCase())\n\n\tif (!hasEditSite && !hasEditSiteLowercase) return false\n\n\tconst keyToCheck = hasEditSite ? EDIT_SITE_KEY : EDIT_SITE_KEY.toLowerCase()\n\n\tconst editSiteValue = url.searchParams.get(keyToCheck)\n\tif (editSiteValue !== \"\" && editSiteValue !== null) return false\n\n\tfor (const param of url.searchParams.keys()) {\n\t\tif (\n\t\t\tparam !== EDIT_SITE_KEY &&\n\t\t\tparam !== EDIT_SITE_KEY.toLowerCase() &&\n\t\t\t!param.startsWith(FRAMER_SITE_PARAMETER_PREFIX)\n\t\t) {\n\t\t\treturn false\n\t\t}\n\t}\n\n\tdeleteForceShowEditorBarParameter()\n\n\tlocalStorage[FORCE_SHOW_KEY] = new Date().toString()\n\n\treturn true\n}\n\n// Removes the editSite parameter to keep the URL clean and avoid users sharing URLs with it\nfunction deleteForceShowEditorBarParameter() {\n\tconst url = new URL(window.location.href)\n\n\tif (url.searchParams.has(EDIT_SITE_KEY)) {\n\t\turl.searchParams.delete(EDIT_SITE_KEY)\n\t\turl.searchParams.delete(EDIT_SITE_KEY.toLowerCase())\n\t\twindow.history.replaceState({}, \"\", url.toString())\n\t}\n}\n\nconst forceShow = (() => {\n\ttry {\n\t\treturn shouldForceShowEditorBar()\n\t} catch (e) {\n\t\t// biome-ignore lint/suspicious/noConsole: intentional\n\t\tconsole.error(e)\n\t\treturn false\n\t}\n})()\n\nfunction NoopEditorBar() {\n\treturn null\n}\n\n/**\n * The Framer University Smooth Scroll component adds a scrolling class to the html when navigating\n * from a page that was scrolled down. If the user doesn't scroll before clicking the edit button\n * then the entire page becomes blocked from interaction. This is a workaround fix so we can ensure\n * that the issue doesn't occur until we can get the component fixed and be fairly sure that the\n * fixed version has wide enough adoption.\n */\nfunction workaroundSmoothScrollComponentBug() {\n\tconst lenisScrollingBlockers = document.getElementsByClassName(\"lenis-scrolling\")\n\tfor (const element of lenisScrollingBlockers) {\n\t\telement.classList.remove(\"lenis-scrolling\")\n\t}\n}\n\n// Rendering the page is higher priority than the editor bar, so wait until a good time.\nfunction useLauncherReady(forceShow: boolean) {\n\tconst [ready, setReady] = useState(forceShow)\n\n\tconst launch = useCallback(() => {\n\t\tif (\"requestIdleCallback\" in window) {\n\t\t\trequestIdleCallback(() => {\n\t\t\t\t// eslint-disable-next-line @eslint-react/hooks-extra/no-direct-set-state-in-use-effect\n\t\t\t\tsetReady(true)\n\t\t\t})\n\t\t} else {\n\t\t\tsetTimeout(() => {\n\t\t\t\t// eslint-disable-next-line @eslint-react/hooks-extra/no-direct-set-state-in-use-effect\n\t\t\t\tsetReady(true)\n\t\t\t}, 300)\n\t\t}\n\t}, [])\n\n\tuseEffect(() => {\n\t\tif (ready) return\n\n\t\tif (document.readyState === \"complete\") {\n\t\t\tlaunch()\n\t\t} else {\n\t\t\tconst listener = () => {\n\t\t\t\tif (document.readyState === \"complete\") {\n\t\t\t\t\tlaunch()\n\t\t\t\t}\n\t\t\t}\n\t\t\tdocument.addEventListener(\"readystatechange\", listener, { once: true })\n\n\t\t\treturn () => {\n\t\t\t\tdocument.removeEventListener(\"readystatechange\", listener)\n\t\t\t}\n\t\t}\n\t}, [ready, launch])\n\n\treturn ready\n}\n\nfunction useEditorBarEntrypoint(iframeRef: RefObject<HTMLIFrameElement>, forceShow: boolean) {\n\tconst [showEntrypointButton, setShowEntrypointButton] = useState(forceShow)\n\tconst [entrypointButtonLoading, setEntrypointButtonLoading] = useState(true)\n\tconst [showLoader, setShowLoader] = useState(false)\n\tconst [iframeState, setIframeState] = useState<\"fullscreen\" | \"hidden\">(\"hidden\")\n\n\tconst readyPromise = useRef<ResolvablePromise<void>>()\n\treadyPromise.current ??= new ResolvablePromise()\n\n\tuseEffect(() => {\n\t\tfunction handleMessage(event: MessageEvent) {\n\t\t\tif (event.origin !== editorBarOrigin) return\n\t\t\tif (typeof event.data === \"object\" && event.data?.apiVersion === 1) {\n\t\t\t\tif (event.data.type === \"accessResult\" && event.data.data.status === \"success\") {\n\t\t\t\t\tsetShowEntrypointButton(true)\n\n\t\t\t\t\t// From now on, always show the Editor Bar and load it faster\n\t\t\t\t\ttry {\n\t\t\t\t\t\tlocalStorage[FORCE_SHOW_KEY] = new Date().toString()\n\t\t\t\t\t} catch (e) {\n\t\t\t\t\t\t// biome-ignore lint/suspicious/noConsole: intentional\n\t\t\t\t\t\tconsole.error(e)\n\t\t\t\t\t}\n\t\t\t\t} else if (event.data.type === \"exitFullscreen\") {\n\t\t\t\t\tdocument.body.style.overflow = \"auto\"\n\n\t\t\t\t\twindow.scrollTo({\n\t\t\t\t\t\tbehavior: \"instant\",\n\t\t\t\t\t\ttop: event.data.position?.top ?? 0,\n\t\t\t\t\t})\n\n\t\t\t\t\tsetIframeState(\"hidden\")\n\t\t\t\t} else if (event.data.type === \"sandboxReadyState\" && event.data.data.status === \"ready\") {\n\t\t\t\t\tsetEntrypointButtonLoading(false)\n\t\t\t\t\t// TODO: fix this hack\n\t\t\t\t\tsetTimeout(() => {\n\t\t\t\t\t\treadyPromise.current?.resolve()\n\t\t\t\t\t}, 50)\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\twindow.addEventListener(\"message\", handleMessage)\n\n\t\treturn () => {\n\t\t\twindow.removeEventListener(\"message\", handleMessage)\n\t\t}\n\t}, [])\n\n\treturn {\n\t\tshowEntrypointButton,\n\t\tentrypointButtonLoading: showLoader\n\t\t\t? entrypointButtonLoading\n\t\t\t: // If the user didn't click, hide the loading state from them\n\t\t\t\tfalse,\n\t\tiframeState,\n\t\tonEditContent: () => {\n\t\t\tiframeRef.current?.contentWindow?.postMessage(\n\t\t\t\t{\n\t\t\t\t\tapiVersion: 1,\n\t\t\t\t\ttype: \"enterOnPageEditing\",\n\t\t\t\t},\n\t\t\t\teditorBarOrigin,\n\t\t\t)\n\n\t\t\tsetIframeState(\"fullscreen\")\n\t\t\tsetShowLoader(true)\n\n\t\t\tvoid readyPromise.current?.then(() => {\n\t\t\t\tiframeRef.current?.contentWindow?.postMessage(\n\t\t\t\t\t{\n\t\t\t\t\t\tapiVersion: 1,\n\t\t\t\t\t\ttype: \"showCanvas\",\n\t\t\t\t\t\tposition: {\n\t\t\t\t\t\t\ttop: window.scrollY,\n\t\t\t\t\t\t},\n\t\t\t\t\t},\n\t\t\t\t\teditorBarOrigin,\n\t\t\t\t)\n\n\t\t\t\tsetTimeout(() => {\n\t\t\t\t\tdocument.body.style.overflow = \"hidden\"\n\t\t\t\t}, ON_PAGE_EDITING_TRANSITION_DURATION_MILLIS)\n\n\t\t\t\tsetShowLoader(false)\n\t\t\t})\n\n\t\t\tworkaroundSmoothScrollComponentBug()\n\t\t},\n\t}\n}\n\ninterface EditorBarIframeProps {\n\tframerSiteId: string\n\tfeatures: Record<string, boolean> | undefined\n\tiframeRef: React.RefObject<HTMLIFrameElement>\n\tclassName: string\n}\n\nfunction EditorBarIframe({ framerSiteId, features, iframeRef, className }: EditorBarIframeProps) {\n\tuseSynchronizeEditableNodeIdForActiveRoute(iframeRef, editorBarOrigin)\n\tconst url = new URL(import.meta.url)\n\n\tconst lastSlashIndex = url.pathname.lastIndexOf(\"/\")\n\tif (lastSlashIndex < 0) {\n\t\tthrow new Error(\"Invalid pathname\")\n\t}\n\n\tconst source = features?.editorBarDisableFrameAncestorsSecurity ? \"fake-domain.example\" : window.location.hostname\n\n\turl.pathname = url.pathname.slice(0, lastSlashIndex)\n\n\turl.searchParams.set(\"framerSiteId\", framerSiteId)\n\turl.searchParams.set(\"source\", source)\n\turl.searchParams.set(\"features\", JSON.stringify(features || {}))\n\turl.searchParams.set(\"loadStart\", loadStart.toString())\n\n\tif (forceShow) {\n\t\turl.searchParams.set(\"forceShow\", \"true\")\n\t}\n\n\treturn (\n\t\t// biome-ignore lint/a11y/useIframeTitle: Intentional\n\t\t<iframe\n\t\t\tid=\"__framer-editorbar\"\n\t\t\tref={iframeRef}\n\t\t\tsrc={url.href}\n\t\t\taria-hidden=\"true\"\n\t\t\tallow={getIFrameAllowPolicy(\"on_page\")}\n\t\t\ttabIndex={-1}\n\t\t\tclassName={className}\n\t\t/>\n\t)\n}\n\nlet lazyEditButtonPromise: Promise<{ EditButton: React.ComponentType<EditButtonProps> }> | undefined = undefined\n\nfunction LazyEditButton({ shouldLoad, ...props }: EditButtonProps & { shouldLoad: boolean }) {\n\tif (shouldLoad) lazyEditButtonPromise ??= import(\"./EditButton.tsx\")\n\n\tconst [EditButtonComponent, setEditButtonComponent] = useState<React.ComponentType<EditButtonProps> | null>(null)\n\n\tuseEffect(() => {\n\t\t// Only start loading EditButton when we know it will be shown\n\t\tif (!shouldLoad) return\n\t\tif (!lazyEditButtonPromise) return\n\n\t\tlazyEditButtonPromise\n\t\t\t.then(module => {\n\t\t\t\tsetEditButtonComponent(() => module.EditButton)\n\t\t\t})\n\t\t\t.catch(() => {\n\t\t\t\t// Ignore error\n\t\t\t})\n\t}, [shouldLoad])\n\n\tif (!shouldLoad || !EditButtonComponent) return null\n\n\treturn <EditButtonComponent {...props} />\n}\n\nfunction EditorBar({ framerSiteId, features }: EditorBarProps) {\n\tconst iframeRef = useRef<HTMLIFrameElement>(null)\n\n\tconst _launcherReady = useLauncherReady(forceShow)\n\t// When `forceShow = true`, load the editor bar faster\n\tconst launcherReady = forceShow || _launcherReady\n\n\tconst { showEntrypointButton, entrypointButtonLoading, iframeState, onEditContent } = useEditorBarEntrypoint(\n\t\tiframeRef,\n\t\tforceShow,\n\t)\n\n\tuseEffect(() => {\n\t\tif (iframeState !== \"fullscreen\") return\n\n\t\tconst pageTitle = document.title\n\n\t\tdocument.title = \"Editing Page\u2026\"\n\t\tsetEditingFavicon()\n\n\t\treturn () => {\n\t\t\tdocument.title = pageTitle\n\t\t\trevertEditingFavicon()\n\t\t}\n\t}, [iframeState])\n\n\tif (!launcherReady) return null\n\n\tlet iframeClassName: string | undefined\n\n\tif (iframeState === \"fullscreen\") {\n\t\tiframeClassName = \"fullscreen\"\n\t} else if (showEntrypointButton) {\n\t\tiframeClassName = \"status_visually_hidden\"\n\t} else {\n\t\tiframeClassName = \"status_hidden\"\n\t}\n\n\treturn createPortal(\n\t\t[\n\t\t\t<LazyEditButton\n\t\t\t\tkey=\"button\"\n\t\t\t\tshouldLoad={showEntrypointButton}\n\t\t\t\tisLoading={entrypointButtonLoading}\n\t\t\t\tonClick={onEditContent}\n\t\t\t\tisEditorVisible={iframeState === \"fullscreen\"}\n\t\t\t/>,\n\t\t\t<EditorBarIframe\n\t\t\t\tkey=\"iframe\"\n\t\t\t\tframerSiteId={framerSiteId}\n\t\t\t\tfeatures={features}\n\t\t\t\tiframeRef={iframeRef}\n\t\t\t\tclassName={iframeClassName}\n\t\t\t/>,\n\t\t],\n\t\tdocument.body,\n\t)\n}\n\nexport function createEditorBar() {\n\t// The Editor Bar is likely not useful for sites embedded in an iframe.\n\t// There seem to be some customers that do that:\n\t// https://framer-team.slack.com/archives/C051TFHTQGM/p1738933277511379\n\tif (isRunningInIframe()) {\n\t\t// biome-ignore lint/suspicious/noConsole: useful for debugging\n\t\tconsole.log(\"[Framer On-Page Editing] Unavailable because site is embedded in iframe\")\n\t\treturn NoopEditorBar\n\t}\n\n\t// The Editor Bar is never useful in a WebView (e.g. a browser inside a mobile app).\n\t// We've seen a case where loading edit.framer.com caused unexpected behavior in WebViews.\n\t// Therefore, the safest option is to not load it.\n\t// https://framer-team.slack.com/archives/C068W7EDVMY/p1738322998535039\n\tif (isWebView()) {\n\t\t// biome-ignore lint/suspicious/noConsole: useful for debugging\n\t\tconsole.log(\"[Framer On-Page Editing] Unavailable because running in WebView\")\n\t\treturn NoopEditorBar\n\t}\n\n\treturn memo(EditorBar)\n}\n"],
  "mappings": "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",
  "names": ["editorBarOrigin", "editorBarOrigin", "forceShow"]
}
