sanity-plugin-iframe-pane

5.0.365.0.37
dist/index.js.map
~dist/index.js.mapModified
+1−1
Index: package/dist/index.js.map
===================================================================
--- package/dist/index.js.map
+++ package/dist/index.js.map
@@ -1,1 +1,1 @@
-{"version":3,"file":"index.js","names":["getRedirectTo(props.url)","url","<Text size={0} textOverflow=\"ellipsis\">\n      {truncatedUrl}\n    </Text>","{position: 'absolute', pointerEvents: 'none', opacity: 0}","validUrl ? url.toString() : ''","<textarea\n        aria-hidden\n        style={{position: 'absolute', pointerEvents: 'none', opacity: 0}}\n        ref={input}\n        value={validUrl ? url.toString() : ''}\n        readOnly\n        tabIndex={-1}\n      />","{whiteSpace: 'nowrap'}","<Text size={1} style={{whiteSpace: 'nowrap'}}>\n                  {iframeSize === 'mobile' ? 'Exit mobile preview' : 'Preview mobile viewport'}\n                </Text>","iframeSize === 'mobile' ? 'Exit mobile preview' : 'Preview mobile viewport'","[1]","() => setIframeSize(iframeSize === 'mobile' ? 'desktop' : 'mobile')","<Button\n                disabled={!validUrl}\n                fontSize={[1]}\n                padding={2}\n                mode={iframeSize === 'mobile' ? 'default' : 'ghost'}\n                icon={MobileDeviceIcon}\n                onClick={() => setIframeSize(iframeSize === 'mobile' ? 'desktop' : 'mobile')}\n              />","!validUrl","iframeSize === 'mobile' ? 'default' : 'ghost'","<Flex align=\"center\" gap={1}>\n            <Tooltip\n              animate\n              content={\n                <Text size={1} style={{whiteSpace: 'nowrap'}}>\n                  {iframeSize === 'mobile' ? 'Exit mobile preview' : 'Preview mobile viewport'}\n                </Text>\n              }\n              padding={2}\n              placement=\"bottom-start\"\n            >\n              <Button\n                disabled={!validUrl}\n                fontSize={[1]}\n                padding={2}\n                mode={iframeSize === 'mobile' ? 'default' : 'ghost'}\n                icon={MobileDeviceIcon}\n                onClick={() => setIframeSize(iframeSize === 'mobile' ? 'desktop' : 'mobile')}\n              />\n            </Tooltip>\n          </Flex>","showUrl && validUrl && <DisplayUrl url={url} />","<Box flex={1}>{showUrl && validUrl && <DisplayUrl url={url} />}</Box>","reloadButton ? (\n              <Tooltip\n                animate\n                content={\n                  <Text size={1} style={{whiteSpace: 'nowrap'}}>\n                    {reloading ? 'Reloading…' : 'Reload'}\n                  </Text>\n                }\n                padding={2}\n              >\n                <Button\n                  disabled={!validUrl}\n                  mode=\"bleed\"\n                  fontSize={[1]}\n                  padding={2}\n                  icon={RefreshIcon}\n                  loading={reloading}\n                  aria-label=\"Reload\"\n                  onClick={() => handleReload()}\n                />\n              </Tooltip>\n            ) : null","<Text size={1} style={{whiteSpace: 'nowrap'}}>\n                  Copy URL\n                </Text>","[2]","() => {\n                  if (!input?.current?.value) return\n\n                  void copy(input.current.value).then((copied) => {\n                    if (copied) {\n                      pushToast({\n                        closable: true,\n                        status: 'success',\n                        title: 'The URL is copied to the clipboard',\n                      })\n                    } else {\n                      pushToast({\n                        closable: true,\n                        status: 'error',\n                        title: 'Failed to copy the URL to the clipboard',\n                      })\n                    }\n                    return copied\n                  })\n                }","<Tooltip\n              animate\n              content={\n                <Text size={1} style={{whiteSpace: 'nowrap'}}>\n                  Copy URL\n                </Text>\n              }\n              padding={2}\n            >\n              <Button\n                mode=\"bleed\"\n                disabled={!validUrl}\n                fontSize={[1]}\n                icon={CopyIcon}\n                padding={[2]}\n                aria-label=\"Copy URL\"\n                onClick={() => {\n                  if (!input?.current?.value) return\n\n                  void copy(input.current.value).then((copied) => {\n                    if (copied) {\n                      pushToast({\n                        closable: true,\n                        status: 'success',\n                        title: 'The URL is copied to the clipboard',\n                      })\n                    } else {\n                      pushToast({\n                        closable: true,\n                        status: 'error',\n                        title: 'Failed to copy the URL to the clipboard',\n                      })\n                    }\n                    return copied\n                  })\n                }}\n              />\n            </Tooltip>","<Text size={1} style={{whiteSpace: 'nowrap'}}>\n                  Open URL in a new tab\n                </Text>","validUrl ? () => window.open(url.toString()) : undefined","<Tooltip\n              animate\n              content={\n                <Text size={1} style={{whiteSpace: 'nowrap'}}>\n                  Open URL in a new tab\n                </Text>\n              }\n              padding={2}\n              placement=\"bottom-end\"\n            >\n              <Button\n                disabled={!validUrl}\n                fontSize={[1]}\n                icon={LaunchIcon}\n                mode=\"ghost\"\n                paddingY={[2]}\n                text=\"Open\"\n                aria-label=\"Open URL in a new tab\"\n                onClick={validUrl ? () => window.open(url.toString()) : undefined}\n              />\n            </Tooltip>","<Flex align=\"center\" gap={1}>\n            {reloadButton ? (\n              <Tooltip\n                animate\n                content={\n                  <Text size={1} style={{whiteSpace: 'nowrap'}}>\n                    {reloading ? 'Reloading…' : 'Reload'}\n                  </Text>\n                }\n                padding={2}\n              >\n                <Button\n                  disabled={!validUrl}\n                  mode=\"bleed\"\n                  fontSize={[1]}\n                  padding={2}\n                  icon={RefreshIcon}\n                  loading={reloading}\n                  aria-label=\"Reload\"\n                  onClick={() => handleReload()}\n                />\n              </Tooltip>\n            ) : null}\n            <Tooltip\n              animate\n              content={\n                <Text size={1} style={{whiteSpace: 'nowrap'}}>\n                  Copy URL\n                </Text>\n              }\n              padding={2}\n            >\n              <Button\n                mode=\"bleed\"\n                disabled={!validUrl}\n                fontSize={[1]}\n                icon={CopyIcon}\n                padding={[2]}\n                aria-label=\"Copy URL\"\n                onClick={() => {\n                  if (!input?.current?.value) return\n\n                  void copy(input.current.value).then((copied) => {\n                    if (copied) {\n                      pushToast({\n                        closable: true,\n                        status: 'success',\n                        title: 'The URL is copied to the clipboard',\n                      })\n                    } else {\n                      pushToast({\n                        closable: true,\n                        status: 'error',\n                        title: 'Failed to copy the URL to the clipboard',\n                      })\n                    }\n                    return copied\n                  })\n                }}\n              />\n            </Tooltip>\n            <Tooltip\n              animate\n              content={\n                <Text size={1} style={{whiteSpace: 'nowrap'}}>\n                  Open URL in a new tab\n                </Text>\n              }\n              padding={2}\n              placement=\"bottom-end\"\n            >\n              <Button\n                disabled={!validUrl}\n                fontSize={[1]}\n                icon={LaunchIcon}\n                mode=\"ghost\"\n                paddingY={[2]}\n                text=\"Open\"\n                aria-label=\"Open URL in a new tab\"\n                onClick={validUrl ? () => window.open(url.toString()) : undefined}\n              />\n            </Tooltip>\n          </Flex>","<Card padding={2} borderBottom>\n        <Flex align=\"center\" gap={2}>\n          <Flex align=\"center\" gap={1}>\n            <Tooltip\n              animate\n              content={\n                <Text size={1} style={{whiteSpace: 'nowrap'}}>\n                  {iframeSize === 'mobile' ? 'Exit mobile preview' : 'Preview mobile viewport'}\n                </Text>\n              }\n              padding={2}\n              placement=\"bottom-start\"\n            >\n              <Button\n                disabled={!validUrl}\n                fontSize={[1]}\n                padding={2}\n                mode={iframeSize === 'mobile' ? 'default' : 'ghost'}\n                icon={MobileDeviceIcon}\n                onClick={() => setIframeSize(iframeSize === 'mobile' ? 'desktop' : 'mobile')}\n              />\n            </Tooltip>\n          </Flex>\n          <Box flex={1}>{showUrl && validUrl && <DisplayUrl url={url} />}</Box>\n          <Flex align=\"center\" gap={1}>\n            {reloadButton ? (\n              <Tooltip\n                animate\n                content={\n                  <Text size={1} style={{whiteSpace: 'nowrap'}}>\n                    {reloading ? 'Reloading…' : 'Reload'}\n                  </Text>\n                }\n                padding={2}\n              >\n                <Button\n                  disabled={!validUrl}\n                  mode=\"bleed\"\n                  fontSize={[1]}\n                  padding={2}\n                  icon={RefreshIcon}\n                  loading={reloading}\n                  aria-label=\"Reload\"\n                  onClick={() => handleReload()}\n                />\n              </Tooltip>\n            ) : null}\n            <Tooltip\n              animate\n              content={\n                <Text size={1} style={{whiteSpace: 'nowrap'}}>\n                  Copy URL\n                </Text>\n              }\n              padding={2}\n            >\n              <Button\n                mode=\"bleed\"\n                disabled={!validUrl}\n                fontSize={[1]}\n                icon={CopyIcon}\n                padding={[2]}\n                aria-label=\"Copy URL\"\n                onClick={() => {\n                  if (!input?.current?.value) return\n\n                  void copy(input.current.value).then((copied) => {\n                    if (copied) {\n                      pushToast({\n                        closable: true,\n                        status: 'success',\n                        title: 'The URL is copied to the clipboard',\n                      })\n                    } else {\n                      pushToast({\n                        closable: true,\n                        status: 'error',\n                        title: 'Failed to copy the URL to the clipboard',\n                      })\n                    }\n                    return copied\n                  })\n                }}\n              />\n            </Tooltip>\n            <Tooltip\n              animate\n              content={\n                <Text size={1} style={{whiteSpace: 'nowrap'}}>\n                  Open URL in a new tab\n                </Text>\n              }\n              padding={2}\n              placement=\"bottom-end\"\n            >\n              <Button\n                disabled={!validUrl}\n                fontSize={[1]}\n                icon={LaunchIcon}\n                mode=\"ghost\"\n                paddingY={[2]}\n                text=\"Open\"\n                aria-label=\"Open URL in a new tab\"\n                onClick={validUrl ? () => window.open(url.toString()) : undefined}\n              />\n            </Tooltip>\n          </Flex>\n        </Flex>\n      </Card>","<>\n      <textarea\n        aria-hidden\n        style={{position: 'absolute', pointerEvents: 'none', opacity: 0}}\n        ref={input}\n        value={validUrl ? url.toString() : ''}\n        readOnly\n        tabIndex={-1}\n      />\n      <Card padding={2} borderBottom>\n        <Flex align=\"center\" gap={2}>\n          <Flex align=\"center\" gap={1}>\n            <Tooltip\n              animate\n              content={\n                <Text size={1} style={{whiteSpace: 'nowrap'}}>\n                  {iframeSize === 'mobile' ? 'Exit mobile preview' : 'Preview mobile viewport'}\n                </Text>\n              }\n              padding={2}\n              placement=\"bottom-start\"\n            >\n              <Button\n                disabled={!validUrl}\n                fontSize={[1]}\n                padding={2}\n                mode={iframeSize === 'mobile' ? 'default' : 'ghost'}\n                icon={MobileDeviceIcon}\n                onClick={() => setIframeSize(iframeSize === 'mobile' ? 'desktop' : 'mobile')}\n              />\n            </Tooltip>\n          </Flex>\n          <Box flex={1}>{showUrl && validUrl && <DisplayUrl url={url} />}</Box>\n          <Flex align=\"center\" gap={1}>\n            {reloadButton ? (\n              <Tooltip\n                animate\n                content={\n                  <Text size={1} style={{whiteSpace: 'nowrap'}}>\n                    {reloading ? 'Reloading…' : 'Reload'}\n                  </Text>\n                }\n                padding={2}\n              >\n                <Button\n                  disabled={!validUrl}\n                  mode=\"bleed\"\n                  fontSize={[1]}\n                  padding={2}\n                  icon={RefreshIcon}\n                  loading={reloading}\n                  aria-label=\"Reload\"\n                  onClick={() => handleReload()}\n                />\n              </Tooltip>\n            ) : null}\n            <Tooltip\n              animate\n              content={\n                <Text size={1} style={{whiteSpace: 'nowrap'}}>\n                  Copy URL\n                </Text>\n              }\n              padding={2}\n            >\n              <Button\n                mode=\"bleed\"\n                disabled={!validUrl}\n                fontSize={[1]}\n                icon={CopyIcon}\n                padding={[2]}\n                aria-label=\"Copy URL\"\n                onClick={() => {\n                  if (!input?.current?.value) return\n\n                  void copy(input.current.value).then((copied) => {\n                    if (copied) {\n                      pushToast({\n                        closable: true,\n                        status: 'success',\n                        title: 'The URL is copied to the clipboard',\n                      })\n                    } else {\n                      pushToast({\n                        closable: true,\n                        status: 'error',\n                        title: 'Failed to copy the URL to the clipboard',\n                      })\n                    }\n                    return copied\n                  })\n                }}\n              />\n            </Tooltip>\n            <Tooltip\n              animate\n              content={\n                <Text size={1} style={{whiteSpace: 'nowrap'}}>\n                  Open URL in a new tab\n                </Text>\n              }\n              padding={2}\n              placement=\"bottom-end\"\n            >\n              <Button\n                disabled={!validUrl}\n                fontSize={[1]}\n                icon={LaunchIcon}\n                mode=\"ghost\"\n                paddingY={[2]}\n                text=\"Open\"\n                aria-label=\"Open URL in a new tab\"\n                onClick={validUrl ? () => window.open(url.toString()) : undefined}\n              />\n            </Tooltip>\n          </Flex>\n        </Flex>\n      </Card>\n    </>","async (text) => {\n    if (!navigator?.clipboard) {\n      console.warn('Clipboard not supported')\n      return false\n    }\n\n    // Try to save to clipboard then save it in the state if worked\n    try {\n      await navigator.clipboard.writeText(text)\n      setCopiedText(text)\n      return true\n    } catch (error) {\n      console.warn('Copy failed', error)\n      setCopiedText(null)\n      return false\n    }\n  }","error","useCallback(async (text) => {\n    if (!navigator?.clipboard) {\n      console.warn('Clipboard not supported')\n      return false\n    }\n\n    // Try to save to clipboard then save it in the state if worked\n    try {\n      await navigator.clipboard.writeText(text)\n      setCopiedText(text)\n      return true\n    } catch (error) {\n      console.warn('Copy failed', error)\n      setCopiedText(null)\n      return false\n    }\n  }, [])","[copiedText, copy]","defaultSize = DEFAULT_SIZE","showDisplayUrl = true","() => ({key, draft})","() => {\n    urlRef.current = options.url\n  }","[options.url]","url","{apiVersion: '2023-10-16'}","{\n      perspectiveStack,\n      selectedPerspectiveName,\n    }","useMemo(\n    () => ({\n      perspectiveStack,\n      selectedPerspectiveName,\n    }),\n    [perspectiveStack, selectedPerspectiveName],\n  )","() => {\n    if (key !== draftSnapshot.key || !dequal(draft, draftSnapshot.draft)) {\n      startTransition(() => setDraftSnapshot({key, draft}))\n    }\n  }","draft","key","[draft, draftSnapshot, key, startTransition]","async (draft: SanityDocument | null) => {\n      if (typeof location === 'undefined') {\n        return undefined\n      }\n      const urlProp = urlRef.current\n      if (typeof urlProp === 'string') {\n        return new URL(urlProp, location.origin)\n      }\n      if (typeof urlProp === 'function') {\n        const url = await urlProp(draft, perspective)\n        return typeof url === 'string' ? new URL(url, location.origin) : url\n      }\n      if (typeof urlProp === 'object') {\n        const preview =\n          typeof urlProp.preview === 'function'\n            ? await urlProp.preview(draft, perspective)\n            : urlProp.preview\n        if (typeof preview !== 'string') {\n          return preview\n        }\n        if (!previewSecretRef.current) {\n          const {secret, expiresAt} = await createPreviewSecret(\n            client,\n            'sanity-plugin-iframe-pane',\n            location.href,\n            currentUser?.id,\n          )\n          previewSecretRef.current = secret\n          startTransition(() => setExpiresAt(expiresAt.getTime()))\n        }\n\n        const resolvePreviewUrl = definePreviewUrl({\n          origin: urlProp.origin === 'same-origin' ? location.origin : urlProp.origin,\n          preview,\n          previewMode: {\n            enable: urlProp.draftMode,\n          },\n        })\n        const url = await resolvePreviewUrl({\n          client,\n          previewUrlSecret: previewSecretRef.current,\n          previewSearchParam: null,\n          studioBasePath: basePath,\n          studioPreviewPerspective: encodeStudioPerspective(perspective.perspectiveStack),\n        })\n        return new URL(url, location.origin)\n      }\n      return undefined\n    }","id","expiresAt","useCallback(\n    async (draft: SanityDocument | null) => {\n      if (typeof location === 'undefined') {\n        return undefined\n      }\n      const urlProp = urlRef.current\n      if (typeof urlProp === 'string') {\n        return new URL(urlProp, location.origin)\n      }\n      if (typeof urlProp === 'function') {\n        const url = await urlProp(draft, perspective)\n        return typeof url === 'string' ? new URL(url, location.origin) : url\n      }\n      if (typeof urlProp === 'object') {\n        const preview =\n          typeof urlProp.preview === 'function'\n            ? await urlProp.preview(draft, perspective)\n            : urlProp.preview\n        if (typeof preview !== 'string') {\n          return preview\n        }\n        if (!previewSecretRef.current) {\n          const {secret, expiresAt} = await createPreviewSecret(\n            client,\n            'sanity-plugin-iframe-pane',\n            location.href,\n            currentUser?.id,\n          )\n          previewSecretRef.current = secret\n          startTransition(() => setExpiresAt(expiresAt.getTime()))\n        }\n\n        const resolvePreviewUrl = definePreviewUrl({\n          origin: urlProp.origin === 'same-origin' ? location.origin : urlProp.origin,\n          preview,\n          previewMode: {\n            enable: urlProp.draftMode,\n          },\n        })\n        const url = await resolvePreviewUrl({\n          client,\n          previewUrlSecret: previewSecretRef.current,\n          previewSearchParam: null,\n          studioBasePath: basePath,\n          studioPreviewPerspective: encodeStudioPerspective(perspective.perspectiveStack),\n        })\n        return new URL(url, location.origin)\n      }\n      return undefined\n    },\n    [basePath, client, currentUser?.id, perspective, startTransition],\n  )","() => {\n    if (expiresAt) {\n      const timeout = setTimeout(\n        () => {\n          startTransition(() => setExpiresAt(undefined))\n          previewSecretRef.current = undefined\n        },\n        Math.max(0, expiresAt - Date.now()),\n      )\n      return () => clearTimeout(timeout)\n    }\n    return undefined\n  }","[expiresAt]","<Loading iframeSize=\"desktop\" />","<Suspense fallback={<Loading iframeSize=\"desktop\" />}>\n      <IframeInner\n        key={`${draftSnapshot.key}-${selectedPerspectiveName || 'draft'}`}\n        _key={draftSnapshot.key}\n        draftSnapshot={draftSnapshot.draft}\n        url={url}\n        isResolvingUrl={isResolvingUrl}\n        attributes={attributes}\n        perspective={perspective}\n        defaultSize={defaultSize}\n        reload={reload}\n        showDisplayUrl={showDisplayUrl}\n        userId={currentUser?.id}\n      />\n    </Suspense>","`${draftSnapshot.key}-${selectedPerspectiveName || 'draft'}`","currentUser?.id","{selectedPerspectiveName, perspectiveStack}","attributes = {}","() => props.url(draftSnapshot)","suspend(\n    () => props.url(draftSnapshot),\n    [\n      // Cache based on a few specific conditions\n      'sanity-plugin-iframe-pane',\n      draftSnapshot,\n      selectedPerspectiveName,\n      perspectiveStack,\n      userId,\n      expiresAt,\n      _key,\n      resolveUUID,\n    ],\n  )","() => {\n    if (!iframe?.current) {\n      return\n    }\n\n    // Funky way to reload an iframe without CORS issues\n    const {src} = iframe.current\n    iframe.current.src = src\n\n    setReloading(true)\n  }","useCallback(() => {\n    if (!iframe?.current) {\n      return\n    }\n\n    // Funky way to reload an iframe without CORS issues\n    const {src} = iframe.current\n    iframe.current.src = src\n\n    setReloading(true)\n  }, [])","prefersReducedMotion ? {duration: 0} : undefined","{height: '100%'}","<Toolbar\n          url={url}\n          iframeSize={iframeSize}\n          reloading={reloading}\n          setIframeSize={setIframeSize}\n          showUrl={showDisplayUrl}\n          reloadButton={!!reload?.button}\n          handleReload={handleReload}\n        />","!!reload?.button","url instanceof Error ? (\n          <ErrorCard error={url} />\n        ) : (\n          <Card tone=\"transparent\" style={{height: '100%'}}>\n            <Frame\n              ref={iframe}\n              loading={loading}\n              reloading={reloading}\n              iframeSize={iframeSize}\n              setReloading={setReloading}\n              setLoading={setLoading}\n              url={url}\n              attributes={attributes}\n            />\n          </Card>\n        )","<Flex direction=\"column\" style={{height: '100%'}}>\n        <Toolbar\n          url={url}\n          iframeSize={iframeSize}\n          reloading={reloading}\n          setIframeSize={setIframeSize}\n          showUrl={showDisplayUrl}\n          reloadButton={!!reload?.button}\n          handleReload={handleReload}\n        />\n        {url instanceof Error ? (\n          <ErrorCard error={url} />\n        ) : (\n          <Card tone=\"transparent\" style={{height: '100%'}}>\n            <Frame\n              ref={iframe}\n              loading={loading}\n              reloading={reloading}\n              iframeSize={iframeSize}\n              setReloading={setReloading}\n              setLoading={setLoading}\n              url={url}\n              attributes={attributes}\n            />\n          </Card>\n        )}\n      </Flex>","<MotionConfig transition={prefersReducedMotion ? {duration: 0} : undefined}>\n      <Flex direction=\"column\" style={{height: '100%'}}>\n        <Toolbar\n          url={url}\n          iframeSize={iframeSize}\n          reloading={reloading}\n          setIframeSize={setIframeSize}\n          showUrl={showDisplayUrl}\n          reloadButton={!!reload?.button}\n          handleReload={handleReload}\n        />\n        {url instanceof Error ? (\n          <ErrorCard error={url} />\n        ) : (\n          <Card tone=\"transparent\" style={{height: '100%'}}>\n            <Frame\n              ref={iframe}\n              loading={loading}\n              reloading={reloading}\n              iframeSize={iframeSize}\n              setReloading={setReloading}\n              setLoading={setLoading}\n              url={url}\n              attributes={attributes}\n            />\n          </Card>\n        )}\n      </Flex>\n    </MotionConfig>","function handleIframeLoad() {\n    setLoading(false)\n    setReloading(false)\n    // Run onLoad from attributes\n    if (attributes.onLoad && typeof attributes.onLoad === 'function') {\n      attributes.onLoad()\n    }\n  }","attributes.onLoad","{height: '100%', position: 'relative'}","!url ||\n          (loading && (\n            <MotionFlex\n              initial=\"initial\"\n              animate=\"animate\"\n              exit=\"exit\"\n              variants={spinnerVariants}\n              justify=\"center\"\n              align=\"center\"\n              style={{inset: '0', position: 'absolute'}}\n            >\n              <Loading iframeSize={iframeSize} />\n            </MotionFlex>\n          ))","<AnimatePresence>\n        {!url ||\n          (loading && (\n            <MotionFlex\n              initial=\"initial\"\n              animate=\"animate\"\n              exit=\"exit\"\n              variants={spinnerVariants}\n              justify=\"center\"\n              align=\"center\"\n              style={{inset: '0', position: 'absolute'}}\n            >\n              <Loading iframeSize={iframeSize} />\n            </MotionFlex>\n          ))}\n      </AnimatePresence>","url && (\n        <motion.iframe\n          ref={iframe}\n          title=\"preview\"\n          frameBorder=\"0\"\n          style={{maxHeight: '100%'}}\n          src={url.toString()}\n          initial={['background', iframeSize]}\n          variants={iframeVariants}\n          animate={[\n            loading ? 'background' : 'active',\n            reloading ? 'reloading' : 'idle',\n            iframeSize,\n          ]}\n          {...attributes}\n          onLoad={handleIframeLoad}\n        />\n      )","motion.iframe","<Flex align=\"center\" justify=\"center\" style={{height: '100%', position: 'relative'}}>\n      <AnimatePresence>\n        {!url ||\n          (loading && (\n            <MotionFlex\n              initial=\"initial\"\n              animate=\"animate\"\n              exit=\"exit\"\n              variants={spinnerVariants}\n              justify=\"center\"\n              align=\"center\"\n              style={{inset: '0', position: 'absolute'}}\n            >\n              <Loading iframeSize={iframeSize} />\n            </MotionFlex>\n          ))}\n      </AnimatePresence>\n      {url && (\n        <motion.iframe\n          ref={iframe}\n          title=\"preview\"\n          frameBorder=\"0\"\n          style={{maxHeight: '100%'}}\n          src={url.toString()}\n          initial={['background', iframeSize]}\n          variants={iframeVariants}\n          animate={[\n            loading ? 'background' : 'active',\n            reloading ? 'reloading' : 'idle',\n            iframeSize,\n          ]}\n          {...attributes}\n          onLoad={handleIframeLoad}\n        />\n      )}\n    </Flex>","{iframeSize}: {iframeSize: IframeSizeKey}","{...sizes[iframeSize]}","sizes[iframeSize]","<Spinner muted />","<Text muted size={1}>\n        Loading…\n      </Text>","<Flex style={{...sizes[iframeSize]}} justify=\"center\" align=\"center\" direction=\"column\" gap={4}>\n      <Spinner muted />\n      <Text muted size={1}>\n        Loading…\n      </Text>\n    </Flex>","{error}: {error: Error}","<Box>\n                <Text size={1}>\n                  <WarningOutlineIcon />\n                </Text>\n              </Box>","<Text as=\"h1\" size={1} weight=\"bold\">\n                  {error.name}\n                </Text>","name","<Text as=\"p\" muted size={1}>\n                  {error.message}\n                </Text>","message","<Card height=\"fill\">\n      <Flex align=\"center\" height=\"fill\" justify=\"center\" padding={4} sizing=\"border\">\n        <Container width={0}>\n          <Card padding={4} radius={2} shadow={1} tone=\"caution\">\n            <Flex>\n              <Box>\n                <Text size={1}>\n                  <WarningOutlineIcon />\n                </Text>\n              </Box>\n              <Stack flex={1} marginLeft={3} gap={3}>\n                <Text as=\"h1\" size={1} weight=\"bold\">\n                  {error.name}\n                </Text>\n                <Text as=\"p\" muted size={1}>\n                  {error.message}\n                </Text>\n              </Stack>\n            </Flex>\n          </Card>\n        </Container>\n      </Flex>\n    </Card>"],"sources":["../src/DisplayUrl.tsx","../src/Toolbar.tsx","../src/Iframe.tsx"],"sourcesContent":["import {getRedirectTo} from '@sanity/preview-url-secret/get-redirect-to'\nimport {Text} from '@sanity/ui'\nimport {useMemo} from 'react'\n\nexport function DisplayUrl(props: {url: URL}) {\n  const truncatedUrl = useMemo(() => {\n    const url = getRedirectTo(props.url)\n    return `${url.origin === location.origin ? '' : url.origin}${url.pathname}${url.search}`\n  }, [props.url])\n\n  return (\n    <Text size={0} textOverflow=\"ellipsis\">\n      {truncatedUrl}\n    </Text>\n  )\n}\n","import {CopyIcon} from '@sanity/icons/Copy'\nimport {LaunchIcon} from '@sanity/icons/Launch'\nimport {MobileDeviceIcon} from '@sanity/icons/MobileDevice'\nimport {RefreshIcon} from '@sanity/icons/Refresh'\nimport {Box, Button, Card, Flex, Text} from '@sanity/ui'\nimport {useToast} from '@sanity/ui/toast'\nimport {Tooltip} from '@sanity/ui/tooltip'\nimport {useCallback, useRef, useState} from 'react'\n\nimport {DisplayUrl} from './DisplayUrl'\nimport type {IframeSizeKey, SizeProps} from './types'\n\nexport const sizes: SizeProps = {\n  desktop: {\n    width: '100%',\n    height: '100%',\n  },\n  mobile: {\n    width: 414,\n    height: 746,\n  },\n}\n\nexport const DEFAULT_SIZE = 'desktop'\n\nexport interface ToolbarProps {\n  url: URL | Error | undefined\n  iframeSize: IframeSizeKey\n  setIframeSize: (size: IframeSizeKey) => void\n  showUrl: boolean\n  reloading: boolean\n  reloadButton: boolean\n  handleReload: () => void\n}\nexport function Toolbar(props: ToolbarProps) {\n  const {url, iframeSize, setIframeSize, reloading, showUrl, reloadButton, handleReload} = props\n  const validUrl = url instanceof URL\n\n  const input = useRef<HTMLTextAreaElement>(null)\n  const {push: pushToast} = useToast()\n  const [, copy] = useCopyToClipboard()\n\n  return (\n    <>\n      <textarea\n        aria-hidden\n        style={{position: 'absolute', pointerEvents: 'none', opacity: 0}}\n        ref={input}\n        value={validUrl ? url.toString() : ''}\n        readOnly\n        tabIndex={-1}\n      />\n      <Card padding={2} borderBottom>\n        <Flex align=\"center\" gap={2}>\n          <Flex align=\"center\" gap={1}>\n            <Tooltip\n              animate\n              content={\n                <Text size={1} style={{whiteSpace: 'nowrap'}}>\n                  {iframeSize === 'mobile' ? 'Exit mobile preview' : 'Preview mobile viewport'}\n                </Text>\n              }\n              padding={2}\n              placement=\"bottom-start\"\n            >\n              <Button\n                disabled={!validUrl}\n                fontSize={[1]}\n                padding={2}\n                mode={iframeSize === 'mobile' ? 'default' : 'ghost'}\n                icon={MobileDeviceIcon}\n                onClick={() => setIframeSize(iframeSize === 'mobile' ? 'desktop' : 'mobile')}\n              />\n            </Tooltip>\n          </Flex>\n          <Box flex={1}>{showUrl && validUrl && <DisplayUrl url={url} />}</Box>\n          <Flex align=\"center\" gap={1}>\n            {reloadButton ? (\n              <Tooltip\n                animate\n                content={\n                  <Text size={1} style={{whiteSpace: 'nowrap'}}>\n                    {reloading ? 'Reloading…' : 'Reload'}\n                  </Text>\n                }\n                padding={2}\n              >\n                <Button\n                  disabled={!validUrl}\n                  mode=\"bleed\"\n                  fontSize={[1]}\n                  padding={2}\n                  icon={RefreshIcon}\n                  loading={reloading}\n                  aria-label=\"Reload\"\n                  onClick={() => handleReload()}\n                />\n              </Tooltip>\n            ) : null}\n            <Tooltip\n              animate\n              content={\n                <Text size={1} style={{whiteSpace: 'nowrap'}}>\n                  Copy URL\n                </Text>\n              }\n              padding={2}\n            >\n              <Button\n                mode=\"bleed\"\n                disabled={!validUrl}\n                fontSize={[1]}\n                icon={CopyIcon}\n                padding={[2]}\n                aria-label=\"Copy URL\"\n                onClick={() => {\n                  if (!input?.current?.value) return\n\n                  void copy(input.current.value).then((copied) => {\n                    if (copied) {\n                      pushToast({\n                        closable: true,\n                        status: 'success',\n                        title: 'The URL is copied to the clipboard',\n                      })\n                    } else {\n                      pushToast({\n                        closable: true,\n                        status: 'error',\n                        title: 'Failed to copy the URL to the clipboard',\n                      })\n                    }\n                    return copied\n                  })\n                }}\n              />\n            </Tooltip>\n            <Tooltip\n              animate\n              content={\n                <Text size={1} style={{whiteSpace: 'nowrap'}}>\n                  Open URL in a new tab\n                </Text>\n              }\n              padding={2}\n              placement=\"bottom-end\"\n            >\n              <Button\n                disabled={!validUrl}\n                fontSize={[1]}\n                icon={LaunchIcon}\n                mode=\"ghost\"\n                paddingY={[2]}\n                text=\"Open\"\n                aria-label=\"Open URL in a new tab\"\n                onClick={validUrl ? () => window.open(url.toString()) : undefined}\n              />\n            </Tooltip>\n          </Flex>\n        </Flex>\n      </Card>\n    </>\n  )\n}\n\ntype CopiedValue = string | null\n\ntype CopyFn = (text: string) => Promise<boolean>\n\nfunction useCopyToClipboard(): [CopiedValue, CopyFn] {\n  const [copiedText, setCopiedText] = useState<CopiedValue>(null)\n\n  const copy: CopyFn = useCallback(async (text) => {\n    if (!navigator?.clipboard) {\n      console.warn('Clipboard not supported')\n      return false\n    }\n\n    // Try to save to clipboard then save it in the state if worked\n    try {\n      await navigator.clipboard.writeText(text)\n      setCopiedText(text)\n      return true\n    } catch (error) {\n      console.warn('Copy failed', error)\n      setCopiedText(null)\n      return false\n    }\n  }, [])\n\n  return [copiedText, copy]\n}\n","import {WarningOutlineIcon} from '@sanity/icons/WarningOutline'\nimport {createPreviewSecret} from '@sanity/preview-url-secret/create-secret'\nimport {definePreviewUrl} from '@sanity/preview-url-secret/define-preview-url'\nimport {Box, Card, Container, Flex, Spinner, Stack, Text, usePrefersReducedMotion} from '@sanity/ui'\nimport {dequal} from 'dequal/lite'\nimport {AnimatePresence, motion, MotionConfig} from 'motion/react'\nimport type {HTMLAttributeReferrerPolicy} from 'react'\nimport {\n  memo,\n  Suspense,\n  useCallback,\n  useEffect,\n  useMemo,\n  useRef,\n  useState,\n  useTransition,\n} from 'react'\nimport {\n  type SanityDocument,\n  useActiveWorkspace,\n  useClient,\n  useCurrentUser,\n  usePerspective,\n} from 'sanity'\nimport {suspend} from 'suspend-react'\n\nimport {DEFAULT_SIZE, sizes, Toolbar} from './Toolbar'\nimport type {IframeSizeKey} from './types'\n\nexport type UrlResolver = (\n  document: SanityDocument | null,\n  perspective: Pick<\n    ReturnType<typeof usePerspective>,\n    'selectedPerspectiveName' | 'perspectiveStack'\n  >,\n) => string | Error | undefined | Promise<string | Error | undefined>\n\nexport type {IframeSizeKey}\n\nexport interface IframeOptions {\n  /**\n   * If you have multiple iframe instances side-by-side you need to give each a unique key.\n   */\n  key?: string\n  url:\n    | string\n    | UrlResolver\n    | {\n        /**\n         * The URL origin of where the preview is hosted, for example `https://example.com`.\n         * If it's an embedded Studio then set it to `'same-origin'`.\n         */\n        origin: 'same-origin' | (string & {})\n        /**\n         * The route to redirect to after enabling Draft Mode.\n         * If you don't have enough data to build the URL, return an `Error` instance to show an error message.\n         * @example `return new Error('Missing slug')`\n         * To prolong the loading state, return `undefined`\n         */\n        preview: string | UrlResolver\n        /**\n         * The route that enables Draft Mode\n         * @example '/api/draft'\n         */\n        draftMode: string\n      }\n  defaultSize?: IframeSizeKey\n  showDisplayUrl?: boolean\n  reload?: {\n    button?: boolean\n  }\n  attributes?: Partial<{\n    allow: string\n    referrerPolicy: HTMLAttributeReferrerPolicy | undefined\n    sandbox: string\n    onLoad: () => void\n  }>\n}\n\nconst MotionFlex = motion.create(Flex)\n\nexport interface IframeProps {\n  document: {\n    displayed: SanityDocument\n    draft: SanityDocument | null\n    published: SanityDocument | null\n  }\n  options: IframeOptions\n}\n\nfunction encodeStudioPerspective(studioPerspective: string[] | string): string {\n  return Array.isArray(studioPerspective) ? studioPerspective.join(',') : studioPerspective\n}\n\nexport function Iframe(props: IframeProps): React.JSX.Element {\n  const {document, options} = props\n  const draft = document.draft || document.published || document.displayed\n\n  const {defaultSize = DEFAULT_SIZE, reload, attributes, showDisplayUrl = true, key} = options\n\n  const workspace = useActiveWorkspace()\n  const basePath = workspace?.activeWorkspace?.basePath || '/'\n  const urlRef = useRef(options.url)\n  const [draftSnapshot, setDraftSnapshot] = useState(() => ({key, draft}))\n  useEffect(() => {\n    urlRef.current = options.url\n  }, [options.url])\n  const currentUser = useCurrentUser()\n  const client = useClient({apiVersion: '2023-10-16'})\n  const [expiresAt, setExpiresAt] = useState<number | undefined>()\n  const previewSecretRef = useRef<string | undefined>(undefined)\n  const [isResolvingUrl, startTransition] = useTransition()\n  const {perspectiveStack, selectedPerspectiveName} = usePerspective()\n  const perspective = useMemo(\n    () => ({\n      perspectiveStack,\n      selectedPerspectiveName,\n    }),\n    [perspectiveStack, selectedPerspectiveName],\n  )\n\n  useEffect(() => {\n    if (key !== draftSnapshot.key || !dequal(draft, draftSnapshot.draft)) {\n      startTransition(() => setDraftSnapshot({key, draft}))\n    }\n  }, [draft, draftSnapshot, key, startTransition])\n\n  const url = useCallback(\n    async (draft: SanityDocument | null) => {\n      if (typeof location === 'undefined') {\n        return undefined\n      }\n      const urlProp = urlRef.current\n      if (typeof urlProp === 'string') {\n        return new URL(urlProp, location.origin)\n      }\n      if (typeof urlProp === 'function') {\n        const url = await urlProp(draft, perspective)\n        return typeof url === 'string' ? new URL(url, location.origin) : url\n      }\n      if (typeof urlProp === 'object') {\n        const preview =\n          typeof urlProp.preview === 'function'\n            ? await urlProp.preview(draft, perspective)\n            : urlProp.preview\n        if (typeof preview !== 'string') {\n          return preview\n        }\n        if (!previewSecretRef.current) {\n          const {secret, expiresAt} = await createPreviewSecret(\n            client,\n            'sanity-plugin-iframe-pane',\n            location.href,\n            currentUser?.id,\n          )\n          previewSecretRef.current = secret\n          startTransition(() => setExpiresAt(expiresAt.getTime()))\n        }\n\n        const resolvePreviewUrl = definePreviewUrl({\n          origin: urlProp.origin === 'same-origin' ? location.origin : urlProp.origin,\n          preview,\n          previewMode: {\n            enable: urlProp.draftMode,\n          },\n        })\n        const url = await resolvePreviewUrl({\n          client,\n          previewUrlSecret: previewSecretRef.current,\n          previewSearchParam: null,\n          studioBasePath: basePath,\n          studioPreviewPerspective: encodeStudioPerspective(perspective.perspectiveStack),\n        })\n        return new URL(url, location.origin)\n      }\n      return undefined\n    },\n    [basePath, client, currentUser?.id, perspective, startTransition],\n  )\n  useEffect(() => {\n    if (expiresAt) {\n      const timeout = setTimeout(\n        () => {\n          startTransition(() => setExpiresAt(undefined))\n          previewSecretRef.current = undefined\n        },\n        Math.max(0, expiresAt - Date.now()),\n      )\n      return () => clearTimeout(timeout)\n    }\n    return undefined\n  }, [expiresAt])\n\n  return (\n    <Suspense fallback={<Loading iframeSize=\"desktop\" />}>\n      <IframeInner\n        key={`${draftSnapshot.key}-${selectedPerspectiveName || 'draft'}`}\n        _key={draftSnapshot.key}\n        draftSnapshot={draftSnapshot.draft}\n        url={url}\n        isResolvingUrl={isResolvingUrl}\n        attributes={attributes}\n        perspective={perspective}\n        defaultSize={defaultSize}\n        reload={reload}\n        showDisplayUrl={showDisplayUrl}\n        userId={currentUser?.id}\n      />\n    </Suspense>\n  )\n}\n\nexport interface IframeInnerProps extends Omit<IframeOptions, 'url'> {\n  url: (draftSnapshot: SanityDocument | null) => Promise<URL | Error | undefined>\n  isResolvingUrl: boolean\n  draftSnapshot: SanityDocument | null\n  perspective: Parameters<UrlResolver>[1]\n  userId?: string\n  expiresAt?: number\n  _key?: string\n}\nconst IframeInner = memo(function IframeInner(props: IframeInnerProps) {\n  const {\n    isResolvingUrl,\n    defaultSize = DEFAULT_SIZE,\n    reload,\n    attributes = {},\n    showDisplayUrl = true,\n    draftSnapshot,\n    userId,\n    expiresAt,\n    perspective: {selectedPerspectiveName, perspectiveStack},\n    _key,\n  } = props\n  const [iframeSize, setIframeSize] = useState(sizes?.[defaultSize] ? defaultSize : DEFAULT_SIZE)\n\n  const prefersReducedMotion = usePrefersReducedMotion()\n\n  const url = suspend(\n    () => props.url(draftSnapshot),\n    [\n      // Cache based on a few specific conditions\n      'sanity-plugin-iframe-pane',\n      draftSnapshot,\n      selectedPerspectiveName,\n      perspectiveStack,\n      userId,\n      expiresAt,\n      _key,\n      resolveUUID,\n    ],\n  )\n\n  const [loading, setLoading] = useState(true)\n  const [_reloading, setReloading] = useState(false)\n  const reloading = _reloading || isResolvingUrl\n\n  const iframe = useRef<HTMLIFrameElement>(null)\n\n  const handleReload = useCallback(() => {\n    if (!iframe?.current) {\n      return\n    }\n\n    // Funky way to reload an iframe without CORS issues\n    const {src} = iframe.current\n    iframe.current.src = src\n\n    setReloading(true)\n  }, [])\n\n  return (\n    <MotionConfig transition={prefersReducedMotion ? {duration: 0} : undefined}>\n      <Flex direction=\"column\" style={{height: '100%'}}>\n        <Toolbar\n          url={url}\n          iframeSize={iframeSize}\n          reloading={reloading}\n          setIframeSize={setIframeSize}\n          showUrl={showDisplayUrl}\n          reloadButton={!!reload?.button}\n          handleReload={handleReload}\n        />\n        {url instanceof Error ? (\n          <ErrorCard error={url} />\n        ) : (\n          <Card tone=\"transparent\" style={{height: '100%'}}>\n            <Frame\n              ref={iframe}\n              loading={loading}\n              reloading={reloading}\n              iframeSize={iframeSize}\n              setReloading={setReloading}\n              setLoading={setLoading}\n              url={url}\n              attributes={attributes}\n            />\n          </Card>\n        )}\n      </Flex>\n    </MotionConfig>\n  )\n})\n\ninterface FrameProps extends Required<Pick<IframeOptions, 'attributes'>> {\n  loading: boolean\n  reloading: boolean\n  setLoading: (loading: boolean) => void\n  setReloading: (reloading: boolean) => void\n  iframeSize: IframeSizeKey\n  url: URL | undefined\n}\nfunction Frame(props: FrameProps & {ref?: React.Ref<HTMLIFrameElement>}) {\n  const {\n    loading,\n    setLoading,\n    iframeSize,\n    attributes,\n    reloading,\n    url,\n    setReloading,\n    ref: iframe,\n  } = props\n\n  function handleIframeLoad() {\n    setLoading(false)\n    setReloading(false)\n    // Run onLoad from attributes\n    if (attributes.onLoad && typeof attributes.onLoad === 'function') {\n      attributes.onLoad()\n    }\n  }\n\n  return (\n    <Flex align=\"center\" justify=\"center\" style={{height: '100%', position: 'relative'}}>\n      <AnimatePresence>\n        {!url ||\n          (loading && (\n            <MotionFlex\n              initial=\"initial\"\n              animate=\"animate\"\n              exit=\"exit\"\n              variants={spinnerVariants}\n              justify=\"center\"\n              align=\"center\"\n              style={{inset: '0', position: 'absolute'}}\n            >\n              <Loading iframeSize={iframeSize} />\n            </MotionFlex>\n          ))}\n      </AnimatePresence>\n      {url && (\n        <motion.iframe\n          ref={iframe}\n          title=\"preview\"\n          frameBorder=\"0\"\n          style={{maxHeight: '100%'}}\n          src={url.toString()}\n          initial={['background', iframeSize]}\n          variants={iframeVariants}\n          animate={[\n            loading ? 'background' : 'active',\n            reloading ? 'reloading' : 'idle',\n            iframeSize,\n          ]}\n          {...attributes}\n          onLoad={handleIframeLoad}\n        />\n      )}\n    </Flex>\n  )\n}\n\nconst spinnerVariants = {\n  initial: {opacity: 1},\n  animate: {opacity: [0, 0, 1]},\n  exit: {opacity: [1, 0, 0]},\n}\n\nconst iframeVariants = {\n  ...sizes,\n  desktop: {\n    ...sizes.desktop,\n    boxShadow: '0 0 0 0px var(--card-shadow-outline-color)',\n  },\n  mobile: {\n    ...sizes.mobile,\n    boxShadow: '0 0 0 1px var(--card-shadow-outline-color)',\n  },\n  background: {\n    opacity: 0,\n    scale: 1,\n  },\n  idle: {\n    scale: 1,\n  },\n  reloading: {\n    scale: [1, 1, 1, 0.98],\n  },\n  active: {\n    opacity: [0, 0, 1],\n    scale: 1,\n  },\n}\n\nfunction Loading({iframeSize}: {iframeSize: IframeSizeKey}) {\n  return (\n    <Flex style={{...sizes[iframeSize]}} justify=\"center\" align=\"center\" direction=\"column\" gap={4}>\n      <Spinner muted />\n      <Text muted size={1}>\n        Loading…\n      </Text>\n    </Flex>\n  )\n}\n\nfunction ErrorCard({error}: {error: Error}) {\n  return (\n    <Card height=\"fill\">\n      <Flex align=\"center\" height=\"fill\" justify=\"center\" padding={4} sizing=\"border\">\n        <Container width={0}>\n          <Card padding={4} radius={2} shadow={1} tone=\"caution\">\n            <Flex>\n              <Box>\n                <Text size={1}>\n                  <WarningOutlineIcon />\n                </Text>\n              </Box>\n              <Stack flex={1} marginLeft={3} gap={3}>\n                <Text as=\"h1\" size={1} weight=\"bold\">\n                  {error.name}\n                </Text>\n                <Text as=\"p\" muted size={1}>\n                  {error.message}\n                </Text>\n              </Stack>\n            </Flex>\n          </Card>\n        </Container>\n      </Flex>\n    </Card>\n  )\n}\n\n// https://github.com/pmndrs/suspend-react?tab=readme-ov-file#making-cache-keys-unique\nconst resolveUUID = Symbol()\n"],"mappings":"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"}
\ No newline at end of file
+{"version":3,"file":"index.js","names":["getRedirectTo(props.url)","url","<Text size={0} textOverflow=\"ellipsis\">\n      {truncatedUrl}\n    </Text>","_c","{position: 'absolute', pointerEvents: 'none', opacity: 0}","validUrl ? url.toString() : ''","<textarea\n        aria-hidden\n        style={{position: 'absolute', pointerEvents: 'none', opacity: 0}}\n        ref={input}\n        value={validUrl ? url.toString() : ''}\n        readOnly\n        tabIndex={-1}\n      />","{whiteSpace: 'nowrap'}","<Text size={1} style={{whiteSpace: 'nowrap'}}>\n                  {iframeSize === 'mobile' ? 'Exit mobile preview' : 'Preview mobile viewport'}\n                </Text>","iframeSize === 'mobile' ? 'Exit mobile preview' : 'Preview mobile viewport'","[1]","() => setIframeSize(iframeSize === 'mobile' ? 'desktop' : 'mobile')","<Button\n                disabled={!validUrl}\n                fontSize={[1]}\n                padding={2}\n                mode={iframeSize === 'mobile' ? 'default' : 'ghost'}\n                icon={MobileDeviceIcon}\n                onClick={() => setIframeSize(iframeSize === 'mobile' ? 'desktop' : 'mobile')}\n              />","!validUrl","iframeSize === 'mobile' ? 'default' : 'ghost'","<Flex align=\"center\" gap={1}>\n            <Tooltip\n              animate\n              content={\n                <Text size={1} style={{whiteSpace: 'nowrap'}}>\n                  {iframeSize === 'mobile' ? 'Exit mobile preview' : 'Preview mobile viewport'}\n                </Text>\n              }\n              padding={2}\n              placement=\"bottom-start\"\n            >\n              <Button\n                disabled={!validUrl}\n                fontSize={[1]}\n                padding={2}\n                mode={iframeSize === 'mobile' ? 'default' : 'ghost'}\n                icon={MobileDeviceIcon}\n                onClick={() => setIframeSize(iframeSize === 'mobile' ? 'desktop' : 'mobile')}\n              />\n            </Tooltip>\n          </Flex>","showUrl && validUrl && <DisplayUrl url={url} />","<Box flex={1}>{showUrl && validUrl && <DisplayUrl url={url} />}</Box>","reloadButton ? (\n              <Tooltip\n                animate\n                content={\n                  <Text size={1} style={{whiteSpace: 'nowrap'}}>\n                    {reloading ? 'Reloading…' : 'Reload'}\n                  </Text>\n                }\n                padding={2}\n              >\n                <Button\n                  disabled={!validUrl}\n                  mode=\"bleed\"\n                  fontSize={[1]}\n                  padding={2}\n                  icon={RefreshIcon}\n                  loading={reloading}\n                  aria-label=\"Reload\"\n                  onClick={() => handleReload()}\n                />\n              </Tooltip>\n            ) : null","<Text size={1} style={{whiteSpace: 'nowrap'}}>\n                  Copy URL\n                </Text>","[2]","() => {\n                  if (!input?.current?.value) return\n\n                  void copy(input.current.value).then((copied) => {\n                    if (copied) {\n                      pushToast({\n                        closable: true,\n                        status: 'success',\n                        title: 'The URL is copied to the clipboard',\n                      })\n                    } else {\n                      pushToast({\n                        closable: true,\n                        status: 'error',\n                        title: 'Failed to copy the URL to the clipboard',\n                      })\n                    }\n                    return copied\n                  })\n                }","<Tooltip\n              animate\n              content={\n                <Text size={1} style={{whiteSpace: 'nowrap'}}>\n                  Copy URL\n                </Text>\n              }\n              padding={2}\n            >\n              <Button\n                mode=\"bleed\"\n                disabled={!validUrl}\n                fontSize={[1]}\n                icon={CopyIcon}\n                padding={[2]}\n                aria-label=\"Copy URL\"\n                onClick={() => {\n                  if (!input?.current?.value) return\n\n                  void copy(input.current.value).then((copied) => {\n                    if (copied) {\n                      pushToast({\n                        closable: true,\n                        status: 'success',\n                        title: 'The URL is copied to the clipboard',\n                      })\n                    } else {\n                      pushToast({\n                        closable: true,\n                        status: 'error',\n                        title: 'Failed to copy the URL to the clipboard',\n                      })\n                    }\n                    return copied\n                  })\n                }}\n              />\n            </Tooltip>","<Text size={1} style={{whiteSpace: 'nowrap'}}>\n                  Open URL in a new tab\n                </Text>","validUrl ? () => window.open(url.toString()) : undefined","<Tooltip\n              animate\n              content={\n                <Text size={1} style={{whiteSpace: 'nowrap'}}>\n                  Open URL in a new tab\n                </Text>\n              }\n              padding={2}\n              placement=\"bottom-end\"\n            >\n              <Button\n                disabled={!validUrl}\n                fontSize={[1]}\n                icon={LaunchIcon}\n                mode=\"ghost\"\n                paddingY={[2]}\n                text=\"Open\"\n                aria-label=\"Open URL in a new tab\"\n                onClick={validUrl ? () => window.open(url.toString()) : undefined}\n              />\n            </Tooltip>","<Flex align=\"center\" gap={1}>\n            {reloadButton ? (\n              <Tooltip\n                animate\n                content={\n                  <Text size={1} style={{whiteSpace: 'nowrap'}}>\n                    {reloading ? 'Reloading…' : 'Reload'}\n                  </Text>\n                }\n                padding={2}\n              >\n                <Button\n                  disabled={!validUrl}\n                  mode=\"bleed\"\n                  fontSize={[1]}\n                  padding={2}\n                  icon={RefreshIcon}\n                  loading={reloading}\n                  aria-label=\"Reload\"\n                  onClick={() => handleReload()}\n                />\n              </Tooltip>\n            ) : null}\n            <Tooltip\n              animate\n              content={\n                <Text size={1} style={{whiteSpace: 'nowrap'}}>\n                  Copy URL\n                </Text>\n              }\n              padding={2}\n            >\n              <Button\n                mode=\"bleed\"\n                disabled={!validUrl}\n                fontSize={[1]}\n                icon={CopyIcon}\n                padding={[2]}\n                aria-label=\"Copy URL\"\n                onClick={() => {\n                  if (!input?.current?.value) return\n\n                  void copy(input.current.value).then((copied) => {\n                    if (copied) {\n                      pushToast({\n                        closable: true,\n                        status: 'success',\n                        title: 'The URL is copied to the clipboard',\n                      })\n                    } else {\n                      pushToast({\n                        closable: true,\n                        status: 'error',\n                        title: 'Failed to copy the URL to the clipboard',\n                      })\n                    }\n                    return copied\n                  })\n                }}\n              />\n            </Tooltip>\n            <Tooltip\n              animate\n              content={\n                <Text size={1} style={{whiteSpace: 'nowrap'}}>\n                  Open URL in a new tab\n                </Text>\n              }\n              padding={2}\n              placement=\"bottom-end\"\n            >\n              <Button\n                disabled={!validUrl}\n                fontSize={[1]}\n                icon={LaunchIcon}\n                mode=\"ghost\"\n                paddingY={[2]}\n                text=\"Open\"\n                aria-label=\"Open URL in a new tab\"\n                onClick={validUrl ? () => window.open(url.toString()) : undefined}\n              />\n            </Tooltip>\n          </Flex>","<Card padding={2} borderBottom>\n        <Flex align=\"center\" gap={2}>\n          <Flex align=\"center\" gap={1}>\n            <Tooltip\n              animate\n              content={\n                <Text size={1} style={{whiteSpace: 'nowrap'}}>\n                  {iframeSize === 'mobile' ? 'Exit mobile preview' : 'Preview mobile viewport'}\n                </Text>\n              }\n              padding={2}\n              placement=\"bottom-start\"\n            >\n              <Button\n                disabled={!validUrl}\n                fontSize={[1]}\n                padding={2}\n                mode={iframeSize === 'mobile' ? 'default' : 'ghost'}\n                icon={MobileDeviceIcon}\n                onClick={() => setIframeSize(iframeSize === 'mobile' ? 'desktop' : 'mobile')}\n              />\n            </Tooltip>\n          </Flex>\n          <Box flex={1}>{showUrl && validUrl && <DisplayUrl url={url} />}</Box>\n          <Flex align=\"center\" gap={1}>\n            {reloadButton ? (\n              <Tooltip\n                animate\n                content={\n                  <Text size={1} style={{whiteSpace: 'nowrap'}}>\n                    {reloading ? 'Reloading…' : 'Reload'}\n                  </Text>\n                }\n                padding={2}\n              >\n                <Button\n                  disabled={!validUrl}\n                  mode=\"bleed\"\n                  fontSize={[1]}\n                  padding={2}\n                  icon={RefreshIcon}\n                  loading={reloading}\n                  aria-label=\"Reload\"\n                  onClick={() => handleReload()}\n                />\n              </Tooltip>\n            ) : null}\n            <Tooltip\n              animate\n              content={\n                <Text size={1} style={{whiteSpace: 'nowrap'}}>\n                  Copy URL\n                </Text>\n              }\n              padding={2}\n            >\n              <Button\n                mode=\"bleed\"\n                disabled={!validUrl}\n                fontSize={[1]}\n                icon={CopyIcon}\n                padding={[2]}\n                aria-label=\"Copy URL\"\n                onClick={() => {\n                  if (!input?.current?.value) return\n\n                  void copy(input.current.value).then((copied) => {\n                    if (copied) {\n                      pushToast({\n                        closable: true,\n                        status: 'success',\n                        title: 'The URL is copied to the clipboard',\n                      })\n                    } else {\n                      pushToast({\n                        closable: true,\n                        status: 'error',\n                        title: 'Failed to copy the URL to the clipboard',\n                      })\n                    }\n                    return copied\n                  })\n                }}\n              />\n            </Tooltip>\n            <Tooltip\n              animate\n              content={\n                <Text size={1} style={{whiteSpace: 'nowrap'}}>\n                  Open URL in a new tab\n                </Text>\n              }\n              padding={2}\n              placement=\"bottom-end\"\n            >\n              <Button\n                disabled={!validUrl}\n                fontSize={[1]}\n                icon={LaunchIcon}\n                mode=\"ghost\"\n                paddingY={[2]}\n                text=\"Open\"\n                aria-label=\"Open URL in a new tab\"\n                onClick={validUrl ? () => window.open(url.toString()) : undefined}\n              />\n            </Tooltip>\n          </Flex>\n        </Flex>\n      </Card>","<>\n      <textarea\n        aria-hidden\n        style={{position: 'absolute', pointerEvents: 'none', opacity: 0}}\n        ref={input}\n        value={validUrl ? url.toString() : ''}\n        readOnly\n        tabIndex={-1}\n      />\n      <Card padding={2} borderBottom>\n        <Flex align=\"center\" gap={2}>\n          <Flex align=\"center\" gap={1}>\n            <Tooltip\n              animate\n              content={\n                <Text size={1} style={{whiteSpace: 'nowrap'}}>\n                  {iframeSize === 'mobile' ? 'Exit mobile preview' : 'Preview mobile viewport'}\n                </Text>\n              }\n              padding={2}\n              placement=\"bottom-start\"\n            >\n              <Button\n                disabled={!validUrl}\n                fontSize={[1]}\n                padding={2}\n                mode={iframeSize === 'mobile' ? 'default' : 'ghost'}\n                icon={MobileDeviceIcon}\n                onClick={() => setIframeSize(iframeSize === 'mobile' ? 'desktop' : 'mobile')}\n              />\n            </Tooltip>\n          </Flex>\n          <Box flex={1}>{showUrl && validUrl && <DisplayUrl url={url} />}</Box>\n          <Flex align=\"center\" gap={1}>\n            {reloadButton ? (\n              <Tooltip\n                animate\n                content={\n                  <Text size={1} style={{whiteSpace: 'nowrap'}}>\n                    {reloading ? 'Reloading…' : 'Reload'}\n                  </Text>\n                }\n                padding={2}\n              >\n                <Button\n                  disabled={!validUrl}\n                  mode=\"bleed\"\n                  fontSize={[1]}\n                  padding={2}\n                  icon={RefreshIcon}\n                  loading={reloading}\n                  aria-label=\"Reload\"\n                  onClick={() => handleReload()}\n                />\n              </Tooltip>\n            ) : null}\n            <Tooltip\n              animate\n              content={\n                <Text size={1} style={{whiteSpace: 'nowrap'}}>\n                  Copy URL\n                </Text>\n              }\n              padding={2}\n            >\n              <Button\n                mode=\"bleed\"\n                disabled={!validUrl}\n                fontSize={[1]}\n                icon={CopyIcon}\n                padding={[2]}\n                aria-label=\"Copy URL\"\n                onClick={() => {\n                  if (!input?.current?.value) return\n\n                  void copy(input.current.value).then((copied) => {\n                    if (copied) {\n                      pushToast({\n                        closable: true,\n                        status: 'success',\n                        title: 'The URL is copied to the clipboard',\n                      })\n                    } else {\n                      pushToast({\n                        closable: true,\n                        status: 'error',\n                        title: 'Failed to copy the URL to the clipboard',\n                      })\n                    }\n                    return copied\n                  })\n                }}\n              />\n            </Tooltip>\n            <Tooltip\n              animate\n              content={\n                <Text size={1} style={{whiteSpace: 'nowrap'}}>\n                  Open URL in a new tab\n                </Text>\n              }\n              padding={2}\n              placement=\"bottom-end\"\n            >\n              <Button\n                disabled={!validUrl}\n                fontSize={[1]}\n                icon={LaunchIcon}\n                mode=\"ghost\"\n                paddingY={[2]}\n                text=\"Open\"\n                aria-label=\"Open URL in a new tab\"\n                onClick={validUrl ? () => window.open(url.toString()) : undefined}\n              />\n            </Tooltip>\n          </Flex>\n        </Flex>\n      </Card>\n    </>","async (text) => {\n    if (!navigator?.clipboard) {\n      console.warn('Clipboard not supported')\n      return false\n    }\n\n    // Try to save to clipboard then save it in the state if worked\n    try {\n      await navigator.clipboard.writeText(text)\n      setCopiedText(text)\n      return true\n    } catch (error) {\n      console.warn('Copy failed', error)\n      setCopiedText(null)\n      return false\n    }\n  }","error","useCallback(async (text) => {\n    if (!navigator?.clipboard) {\n      console.warn('Clipboard not supported')\n      return false\n    }\n\n    // Try to save to clipboard then save it in the state if worked\n    try {\n      await navigator.clipboard.writeText(text)\n      setCopiedText(text)\n      return true\n    } catch (error) {\n      console.warn('Copy failed', error)\n      setCopiedText(null)\n      return false\n    }\n  }, [])","[copiedText, copy]","_c","_Fragment","error","defaultSize = DEFAULT_SIZE","showDisplayUrl = true","() => ({key, draft})","() => {\n    urlRef.current = options.url\n  }","[options.url]","url","{apiVersion: '2023-10-16'}","{\n      perspectiveStack,\n      selectedPerspectiveName,\n    }","useMemo(\n    () => ({\n      perspectiveStack,\n      selectedPerspectiveName,\n    }),\n    [perspectiveStack, selectedPerspectiveName],\n  )","() => {\n    if (key !== draftSnapshot.key || !dequal(draft, draftSnapshot.draft)) {\n      startTransition(() => setDraftSnapshot({key, draft}))\n    }\n  }","draft","key","[draft, draftSnapshot, key, startTransition]","async (draft: SanityDocument | null) => {\n      if (typeof location === 'undefined') {\n        return undefined\n      }\n      const urlProp = urlRef.current\n      if (typeof urlProp === 'string') {\n        return new URL(urlProp, location.origin)\n      }\n      if (typeof urlProp === 'function') {\n        const url = await urlProp(draft, perspective)\n        return typeof url === 'string' ? new URL(url, location.origin) : url\n      }\n      if (typeof urlProp === 'object') {\n        const preview =\n          typeof urlProp.preview === 'function'\n            ? await urlProp.preview(draft, perspective)\n            : urlProp.preview\n        if (typeof preview !== 'string') {\n          return preview\n        }\n        if (!previewSecretRef.current) {\n          const {secret, expiresAt} = await createPreviewSecret(\n            client,\n            'sanity-plugin-iframe-pane',\n            location.href,\n            currentUser?.id,\n          )\n          previewSecretRef.current = secret\n          startTransition(() => setExpiresAt(expiresAt.getTime()))\n        }\n\n        const resolvePreviewUrl = definePreviewUrl({\n          origin: urlProp.origin === 'same-origin' ? location.origin : urlProp.origin,\n          preview,\n          previewMode: {\n            enable: urlProp.draftMode,\n          },\n        })\n        const url = await resolvePreviewUrl({\n          client,\n          previewUrlSecret: previewSecretRef.current,\n          previewSearchParam: null,\n          studioBasePath: basePath,\n          studioPreviewPerspective: encodeStudioPerspective(perspective.perspectiveStack),\n        })\n        return new URL(url, location.origin)\n      }\n      return undefined\n    }","id","expiresAt","useCallback(\n    async (draft: SanityDocument | null) => {\n      if (typeof location === 'undefined') {\n        return undefined\n      }\n      const urlProp = urlRef.current\n      if (typeof urlProp === 'string') {\n        return new URL(urlProp, location.origin)\n      }\n      if (typeof urlProp === 'function') {\n        const url = await urlProp(draft, perspective)\n        return typeof url === 'string' ? new URL(url, location.origin) : url\n      }\n      if (typeof urlProp === 'object') {\n        const preview =\n          typeof urlProp.preview === 'function'\n            ? await urlProp.preview(draft, perspective)\n            : urlProp.preview\n        if (typeof preview !== 'string') {\n          return preview\n        }\n        if (!previewSecretRef.current) {\n          const {secret, expiresAt} = await createPreviewSecret(\n            client,\n            'sanity-plugin-iframe-pane',\n            location.href,\n            currentUser?.id,\n          )\n          previewSecretRef.current = secret\n          startTransition(() => setExpiresAt(expiresAt.getTime()))\n        }\n\n        const resolvePreviewUrl = definePreviewUrl({\n          origin: urlProp.origin === 'same-origin' ? location.origin : urlProp.origin,\n          preview,\n          previewMode: {\n            enable: urlProp.draftMode,\n          },\n        })\n        const url = await resolvePreviewUrl({\n          client,\n          previewUrlSecret: previewSecretRef.current,\n          previewSearchParam: null,\n          studioBasePath: basePath,\n          studioPreviewPerspective: encodeStudioPerspective(perspective.perspectiveStack),\n        })\n        return new URL(url, location.origin)\n      }\n      return undefined\n    },\n    [basePath, client, currentUser?.id, perspective, startTransition],\n  )","() => {\n    if (expiresAt) {\n      const timeout = setTimeout(\n        () => {\n          startTransition(() => setExpiresAt(undefined))\n          previewSecretRef.current = undefined\n        },\n        Math.max(0, expiresAt - Date.now()),\n      )\n      return () => clearTimeout(timeout)\n    }\n    return undefined\n  }","[expiresAt]","<Loading iframeSize=\"desktop\" />","<Suspense fallback={<Loading iframeSize=\"desktop\" />}>\n      <IframeInner\n        key={`${draftSnapshot.key}-${selectedPerspectiveName || 'draft'}`}\n        _key={draftSnapshot.key}\n        draftSnapshot={draftSnapshot.draft}\n        url={url}\n        isResolvingUrl={isResolvingUrl}\n        attributes={attributes}\n        perspective={perspective}\n        defaultSize={defaultSize}\n        reload={reload}\n        showDisplayUrl={showDisplayUrl}\n        userId={currentUser?.id}\n      />\n    </Suspense>","`${draftSnapshot.key}-${selectedPerspectiveName || 'draft'}`","currentUser?.id","{selectedPerspectiveName, perspectiveStack}","attributes = {}","() => props.url(draftSnapshot)","suspend(\n    () => props.url(draftSnapshot),\n    [\n      // Cache based on a few specific conditions\n      'sanity-plugin-iframe-pane',\n      draftSnapshot,\n      selectedPerspectiveName,\n      perspectiveStack,\n      userId,\n      expiresAt,\n      _key,\n      resolveUUID,\n    ],\n  )","() => {\n    if (!iframe?.current) {\n      return\n    }\n\n    // Funky way to reload an iframe without CORS issues\n    const {src} = iframe.current\n    iframe.current.src = src\n\n    setReloading(true)\n  }","useCallback(() => {\n    if (!iframe?.current) {\n      return\n    }\n\n    // Funky way to reload an iframe without CORS issues\n    const {src} = iframe.current\n    iframe.current.src = src\n\n    setReloading(true)\n  }, [])","prefersReducedMotion ? {duration: 0} : undefined","{height: '100%'}","<Toolbar\n          url={url}\n          iframeSize={iframeSize}\n          reloading={reloading}\n          setIframeSize={setIframeSize}\n          showUrl={showDisplayUrl}\n          reloadButton={!!reload?.button}\n          handleReload={handleReload}\n        />","!!reload?.button","url instanceof Error ? (\n          <ErrorCard error={url} />\n        ) : (\n          <Card tone=\"transparent\" style={{height: '100%'}}>\n            <Frame\n              ref={iframe}\n              loading={loading}\n              reloading={reloading}\n              iframeSize={iframeSize}\n              setReloading={setReloading}\n              setLoading={setLoading}\n              url={url}\n              attributes={attributes}\n            />\n          </Card>\n        )","<Flex direction=\"column\" style={{height: '100%'}}>\n        <Toolbar\n          url={url}\n          iframeSize={iframeSize}\n          reloading={reloading}\n          setIframeSize={setIframeSize}\n          showUrl={showDisplayUrl}\n          reloadButton={!!reload?.button}\n          handleReload={handleReload}\n        />\n        {url instanceof Error ? (\n          <ErrorCard error={url} />\n        ) : (\n          <Card tone=\"transparent\" style={{height: '100%'}}>\n            <Frame\n              ref={iframe}\n              loading={loading}\n              reloading={reloading}\n              iframeSize={iframeSize}\n              setReloading={setReloading}\n              setLoading={setLoading}\n              url={url}\n              attributes={attributes}\n            />\n          </Card>\n        )}\n      </Flex>","<MotionConfig transition={prefersReducedMotion ? {duration: 0} : undefined}>\n      <Flex direction=\"column\" style={{height: '100%'}}>\n        <Toolbar\n          url={url}\n          iframeSize={iframeSize}\n          reloading={reloading}\n          setIframeSize={setIframeSize}\n          showUrl={showDisplayUrl}\n          reloadButton={!!reload?.button}\n          handleReload={handleReload}\n        />\n        {url instanceof Error ? (\n          <ErrorCard error={url} />\n        ) : (\n          <Card tone=\"transparent\" style={{height: '100%'}}>\n            <Frame\n              ref={iframe}\n              loading={loading}\n              reloading={reloading}\n              iframeSize={iframeSize}\n              setReloading={setReloading}\n              setLoading={setLoading}\n              url={url}\n              attributes={attributes}\n            />\n          </Card>\n        )}\n      </Flex>\n    </MotionConfig>","function handleIframeLoad() {\n    setLoading(false)\n    setReloading(false)\n    // Run onLoad from attributes\n    if (attributes.onLoad && typeof attributes.onLoad === 'function') {\n      attributes.onLoad()\n    }\n  }","attributes.onLoad","{height: '100%', position: 'relative'}","!url ||\n          (loading && (\n            <MotionFlex\n              initial=\"initial\"\n              animate=\"animate\"\n              exit=\"exit\"\n              variants={spinnerVariants}\n              justify=\"center\"\n              align=\"center\"\n              style={{inset: '0', position: 'absolute'}}\n            >\n              <Loading iframeSize={iframeSize} />\n            </MotionFlex>\n          ))","<AnimatePresence>\n        {!url ||\n          (loading && (\n            <MotionFlex\n              initial=\"initial\"\n              animate=\"animate\"\n              exit=\"exit\"\n              variants={spinnerVariants}\n              justify=\"center\"\n              align=\"center\"\n              style={{inset: '0', position: 'absolute'}}\n            >\n              <Loading iframeSize={iframeSize} />\n            </MotionFlex>\n          ))}\n      </AnimatePresence>","url && (\n        <motion.iframe\n          ref={iframe}\n          title=\"preview\"\n          frameBorder=\"0\"\n          style={{maxHeight: '100%'}}\n          src={url.toString()}\n          initial={['background', iframeSize]}\n          variants={iframeVariants}\n          animate={[\n            loading ? 'background' : 'active',\n            reloading ? 'reloading' : 'idle',\n            iframeSize,\n          ]}\n          {...attributes}\n          onLoad={handleIframeLoad}\n        />\n      )","motion.iframe","<Flex align=\"center\" justify=\"center\" style={{height: '100%', position: 'relative'}}>\n      <AnimatePresence>\n        {!url ||\n          (loading && (\n            <MotionFlex\n              initial=\"initial\"\n              animate=\"animate\"\n              exit=\"exit\"\n              variants={spinnerVariants}\n              justify=\"center\"\n              align=\"center\"\n              style={{inset: '0', position: 'absolute'}}\n            >\n              <Loading iframeSize={iframeSize} />\n            </MotionFlex>\n          ))}\n      </AnimatePresence>\n      {url && (\n        <motion.iframe\n          ref={iframe}\n          title=\"preview\"\n          frameBorder=\"0\"\n          style={{maxHeight: '100%'}}\n          src={url.toString()}\n          initial={['background', iframeSize]}\n          variants={iframeVariants}\n          animate={[\n            loading ? 'background' : 'active',\n            reloading ? 'reloading' : 'idle',\n            iframeSize,\n          ]}\n          {...attributes}\n          onLoad={handleIframeLoad}\n        />\n      )}\n    </Flex>","{iframeSize}: {iframeSize: IframeSizeKey}","{...sizes[iframeSize]}","sizes[iframeSize]","<Spinner muted />","<Text muted size={1}>\n        Loading…\n      </Text>","<Flex style={{...sizes[iframeSize]}} justify=\"center\" align=\"center\" direction=\"column\" gap={4}>\n      <Spinner muted />\n      <Text muted size={1}>\n        Loading…\n      </Text>\n    </Flex>","{error}: {error: Error}","<Box>\n                <Text size={1}>\n                  <WarningOutlineIcon />\n                </Text>\n              </Box>","<Text as=\"h1\" size={1} weight=\"bold\">\n                  {error.name}\n                </Text>","name","<Text as=\"p\" muted size={1}>\n                  {error.message}\n                </Text>","message","<Card height=\"fill\">\n      <Flex align=\"center\" height=\"fill\" justify=\"center\" padding={4} sizing=\"border\">\n        <Container width={0}>\n          <Card padding={4} radius={2} shadow={1} tone=\"caution\">\n            <Flex>\n              <Box>\n                <Text size={1}>\n                  <WarningOutlineIcon />\n                </Text>\n              </Box>\n              <Stack flex={1} marginLeft={3} gap={3}>\n                <Text as=\"h1\" size={1} weight=\"bold\">\n                  {error.name}\n                </Text>\n                <Text as=\"p\" muted size={1}>\n                  {error.message}\n                </Text>\n              </Stack>\n            </Flex>\n          </Card>\n        </Container>\n      </Flex>\n    </Card>","_c"],"sources":["../src/DisplayUrl.tsx","../src/Toolbar.tsx","../src/Iframe.tsx"],"sourcesContent":["import {getRedirectTo} from '@sanity/preview-url-secret/get-redirect-to'\nimport {Text} from '@sanity/ui'\nimport {useMemo} from 'react'\n\nexport function DisplayUrl(props: {url: URL}) {\n  const truncatedUrl = useMemo(() => {\n    const url = getRedirectTo(props.url)\n    return `${url.origin === location.origin ? '' : url.origin}${url.pathname}${url.search}`\n  }, [props.url])\n\n  return (\n    <Text size={0} textOverflow=\"ellipsis\">\n      {truncatedUrl}\n    </Text>\n  )\n}\n","import {CopyIcon} from '@sanity/icons/Copy'\nimport {LaunchIcon} from '@sanity/icons/Launch'\nimport {MobileDeviceIcon} from '@sanity/icons/MobileDevice'\nimport {RefreshIcon} from '@sanity/icons/Refresh'\nimport {Box, Button, Card, Flex, Text} from '@sanity/ui'\nimport {useToast} from '@sanity/ui/toast'\nimport {Tooltip} from '@sanity/ui/tooltip'\nimport {useCallback, useRef, useState} from 'react'\n\nimport {DisplayUrl} from './DisplayUrl'\nimport type {IframeSizeKey, SizeProps} from './types'\n\nexport const sizes: SizeProps = {\n  desktop: {\n    width: '100%',\n    height: '100%',\n  },\n  mobile: {\n    width: 414,\n    height: 746,\n  },\n}\n\nexport const DEFAULT_SIZE = 'desktop'\n\nexport interface ToolbarProps {\n  url: URL | Error | undefined\n  iframeSize: IframeSizeKey\n  setIframeSize: (size: IframeSizeKey) => void\n  showUrl: boolean\n  reloading: boolean\n  reloadButton: boolean\n  handleReload: () => void\n}\nexport function Toolbar(props: ToolbarProps) {\n  const {url, iframeSize, setIframeSize, reloading, showUrl, reloadButton, handleReload} = props\n  const validUrl = url instanceof URL\n\n  const input = useRef<HTMLTextAreaElement>(null)\n  const {push: pushToast} = useToast()\n  const [, copy] = useCopyToClipboard()\n\n  return (\n    <>\n      <textarea\n        aria-hidden\n        style={{position: 'absolute', pointerEvents: 'none', opacity: 0}}\n        ref={input}\n        value={validUrl ? url.toString() : ''}\n        readOnly\n        tabIndex={-1}\n      />\n      <Card padding={2} borderBottom>\n        <Flex align=\"center\" gap={2}>\n          <Flex align=\"center\" gap={1}>\n            <Tooltip\n              animate\n              content={\n                <Text size={1} style={{whiteSpace: 'nowrap'}}>\n                  {iframeSize === 'mobile' ? 'Exit mobile preview' : 'Preview mobile viewport'}\n                </Text>\n              }\n              padding={2}\n              placement=\"bottom-start\"\n            >\n              <Button\n                disabled={!validUrl}\n                fontSize={[1]}\n                padding={2}\n                mode={iframeSize === 'mobile' ? 'default' : 'ghost'}\n                icon={MobileDeviceIcon}\n                onClick={() => setIframeSize(iframeSize === 'mobile' ? 'desktop' : 'mobile')}\n              />\n            </Tooltip>\n          </Flex>\n          <Box flex={1}>{showUrl && validUrl && <DisplayUrl url={url} />}</Box>\n          <Flex align=\"center\" gap={1}>\n            {reloadButton ? (\n              <Tooltip\n                animate\n                content={\n                  <Text size={1} style={{whiteSpace: 'nowrap'}}>\n                    {reloading ? 'Reloading…' : 'Reload'}\n                  </Text>\n                }\n                padding={2}\n              >\n                <Button\n                  disabled={!validUrl}\n                  mode=\"bleed\"\n                  fontSize={[1]}\n                  padding={2}\n                  icon={RefreshIcon}\n                  loading={reloading}\n                  aria-label=\"Reload\"\n                  onClick={() => handleReload()}\n                />\n              </Tooltip>\n            ) : null}\n            <Tooltip\n              animate\n              content={\n                <Text size={1} style={{whiteSpace: 'nowrap'}}>\n                  Copy URL\n                </Text>\n              }\n              padding={2}\n            >\n              <Button\n                mode=\"bleed\"\n                disabled={!validUrl}\n                fontSize={[1]}\n                icon={CopyIcon}\n                padding={[2]}\n                aria-label=\"Copy URL\"\n                onClick={() => {\n                  if (!input?.current?.value) return\n\n                  void copy(input.current.value).then((copied) => {\n                    if (copied) {\n                      pushToast({\n                        closable: true,\n                        status: 'success',\n                        title: 'The URL is copied to the clipboard',\n                      })\n                    } else {\n                      pushToast({\n                        closable: true,\n                        status: 'error',\n                        title: 'Failed to copy the URL to the clipboard',\n                      })\n                    }\n                    return copied\n                  })\n                }}\n              />\n            </Tooltip>\n            <Tooltip\n              animate\n              content={\n                <Text size={1} style={{whiteSpace: 'nowrap'}}>\n                  Open URL in a new tab\n                </Text>\n              }\n              padding={2}\n              placement=\"bottom-end\"\n            >\n              <Button\n                disabled={!validUrl}\n                fontSize={[1]}\n                icon={LaunchIcon}\n                mode=\"ghost\"\n                paddingY={[2]}\n                text=\"Open\"\n                aria-label=\"Open URL in a new tab\"\n                onClick={validUrl ? () => window.open(url.toString()) : undefined}\n              />\n            </Tooltip>\n          </Flex>\n        </Flex>\n      </Card>\n    </>\n  )\n}\n\ntype CopiedValue = string | null\n\ntype CopyFn = (text: string) => Promise<boolean>\n\nfunction useCopyToClipboard(): [CopiedValue, CopyFn] {\n  const [copiedText, setCopiedText] = useState<CopiedValue>(null)\n\n  const copy: CopyFn = useCallback(async (text) => {\n    if (!navigator?.clipboard) {\n      console.warn('Clipboard not supported')\n      return false\n    }\n\n    // Try to save to clipboard then save it in the state if worked\n    try {\n      await navigator.clipboard.writeText(text)\n      setCopiedText(text)\n      return true\n    } catch (error) {\n      console.warn('Copy failed', error)\n      setCopiedText(null)\n      return false\n    }\n  }, [])\n\n  return [copiedText, copy]\n}\n","import {WarningOutlineIcon} from '@sanity/icons/WarningOutline'\nimport {createPreviewSecret} from '@sanity/preview-url-secret/create-secret'\nimport {definePreviewUrl} from '@sanity/preview-url-secret/define-preview-url'\nimport {Box, Card, Container, Flex, Spinner, Stack, Text, usePrefersReducedMotion} from '@sanity/ui'\nimport {dequal} from 'dequal/lite'\nimport {AnimatePresence, motion, MotionConfig} from 'motion/react'\nimport type {HTMLAttributeReferrerPolicy} from 'react'\nimport {\n  memo,\n  Suspense,\n  useCallback,\n  useEffect,\n  useMemo,\n  useRef,\n  useState,\n  useTransition,\n} from 'react'\nimport {\n  type SanityDocument,\n  useActiveWorkspace,\n  useClient,\n  useCurrentUser,\n  usePerspective,\n} from 'sanity'\nimport {suspend} from 'suspend-react'\n\nimport {DEFAULT_SIZE, sizes, Toolbar} from './Toolbar'\nimport type {IframeSizeKey} from './types'\n\nexport type UrlResolver = (\n  document: SanityDocument | null,\n  perspective: Pick<\n    ReturnType<typeof usePerspective>,\n    'selectedPerspectiveName' | 'perspectiveStack'\n  >,\n) => string | Error | undefined | Promise<string | Error | undefined>\n\nexport type {IframeSizeKey}\n\nexport interface IframeOptions {\n  /**\n   * If you have multiple iframe instances side-by-side you need to give each a unique key.\n   */\n  key?: string\n  url:\n    | string\n    | UrlResolver\n    | {\n        /**\n         * The URL origin of where the preview is hosted, for example `https://example.com`.\n         * If it's an embedded Studio then set it to `'same-origin'`.\n         */\n        origin: 'same-origin' | (string & {})\n        /**\n         * The route to redirect to after enabling Draft Mode.\n         * If you don't have enough data to build the URL, return an `Error` instance to show an error message.\n         * @example `return new Error('Missing slug')`\n         * To prolong the loading state, return `undefined`\n         */\n        preview: string | UrlResolver\n        /**\n         * The route that enables Draft Mode\n         * @example '/api/draft'\n         */\n        draftMode: string\n      }\n  defaultSize?: IframeSizeKey\n  showDisplayUrl?: boolean\n  reload?: {\n    button?: boolean\n  }\n  attributes?: Partial<{\n    allow: string\n    referrerPolicy: HTMLAttributeReferrerPolicy | undefined\n    sandbox: string\n    onLoad: () => void\n  }>\n}\n\nconst MotionFlex = motion.create(Flex)\n\nexport interface IframeProps {\n  document: {\n    displayed: SanityDocument\n    draft: SanityDocument | null\n    published: SanityDocument | null\n  }\n  options: IframeOptions\n}\n\nfunction encodeStudioPerspective(studioPerspective: string[] | string): string {\n  return Array.isArray(studioPerspective) ? studioPerspective.join(',') : studioPerspective\n}\n\nexport function Iframe(props: IframeProps): React.JSX.Element {\n  const {document, options} = props\n  const draft = document.draft || document.published || document.displayed\n\n  const {defaultSize = DEFAULT_SIZE, reload, attributes, showDisplayUrl = true, key} = options\n\n  const workspace = useActiveWorkspace()\n  const basePath = workspace?.activeWorkspace?.basePath || '/'\n  const urlRef = useRef(options.url)\n  const [draftSnapshot, setDraftSnapshot] = useState(() => ({key, draft}))\n  useEffect(() => {\n    urlRef.current = options.url\n  }, [options.url])\n  const currentUser = useCurrentUser()\n  const client = useClient({apiVersion: '2023-10-16'})\n  const [expiresAt, setExpiresAt] = useState<number | undefined>()\n  const previewSecretRef = useRef<string | undefined>(undefined)\n  const [isResolvingUrl, startTransition] = useTransition()\n  const {perspectiveStack, selectedPerspectiveName} = usePerspective()\n  const perspective = useMemo(\n    () => ({\n      perspectiveStack,\n      selectedPerspectiveName,\n    }),\n    [perspectiveStack, selectedPerspectiveName],\n  )\n\n  useEffect(() => {\n    if (key !== draftSnapshot.key || !dequal(draft, draftSnapshot.draft)) {\n      startTransition(() => setDraftSnapshot({key, draft}))\n    }\n  }, [draft, draftSnapshot, key, startTransition])\n\n  const url = useCallback(\n    async (draft: SanityDocument | null) => {\n      if (typeof location === 'undefined') {\n        return undefined\n      }\n      const urlProp = urlRef.current\n      if (typeof urlProp === 'string') {\n        return new URL(urlProp, location.origin)\n      }\n      if (typeof urlProp === 'function') {\n        const url = await urlProp(draft, perspective)\n        return typeof url === 'string' ? new URL(url, location.origin) : url\n      }\n      if (typeof urlProp === 'object') {\n        const preview =\n          typeof urlProp.preview === 'function'\n            ? await urlProp.preview(draft, perspective)\n            : urlProp.preview\n        if (typeof preview !== 'string') {\n          return preview\n        }\n        if (!previewSecretRef.current) {\n          const {secret, expiresAt} = await createPreviewSecret(\n            client,\n            'sanity-plugin-iframe-pane',\n            location.href,\n            currentUser?.id,\n          )\n          previewSecretRef.current = secret\n          startTransition(() => setExpiresAt(expiresAt.getTime()))\n        }\n\n        const resolvePreviewUrl = definePreviewUrl({\n          origin: urlProp.origin === 'same-origin' ? location.origin : urlProp.origin,\n          preview,\n          previewMode: {\n            enable: urlProp.draftMode,\n          },\n        })\n        const url = await resolvePreviewUrl({\n          client,\n          previewUrlSecret: previewSecretRef.current,\n          previewSearchParam: null,\n          studioBasePath: basePath,\n          studioPreviewPerspective: encodeStudioPerspective(perspective.perspectiveStack),\n        })\n        return new URL(url, location.origin)\n      }\n      return undefined\n    },\n    [basePath, client, currentUser?.id, perspective, startTransition],\n  )\n  useEffect(() => {\n    if (expiresAt) {\n      const timeout = setTimeout(\n        () => {\n          startTransition(() => setExpiresAt(undefined))\n          previewSecretRef.current = undefined\n        },\n        Math.max(0, expiresAt - Date.now()),\n      )\n      return () => clearTimeout(timeout)\n    }\n    return undefined\n  }, [expiresAt])\n\n  return (\n    <Suspense fallback={<Loading iframeSize=\"desktop\" />}>\n      <IframeInner\n        key={`${draftSnapshot.key}-${selectedPerspectiveName || 'draft'}`}\n        _key={draftSnapshot.key}\n        draftSnapshot={draftSnapshot.draft}\n        url={url}\n        isResolvingUrl={isResolvingUrl}\n        attributes={attributes}\n        perspective={perspective}\n        defaultSize={defaultSize}\n        reload={reload}\n        showDisplayUrl={showDisplayUrl}\n        userId={currentUser?.id}\n      />\n    </Suspense>\n  )\n}\n\nexport interface IframeInnerProps extends Omit<IframeOptions, 'url'> {\n  url: (draftSnapshot: SanityDocument | null) => Promise<URL | Error | undefined>\n  isResolvingUrl: boolean\n  draftSnapshot: SanityDocument | null\n  perspective: Parameters<UrlResolver>[1]\n  userId?: string\n  expiresAt?: number\n  _key?: string\n}\nconst IframeInner = memo(function IframeInner(props: IframeInnerProps) {\n  const {\n    isResolvingUrl,\n    defaultSize = DEFAULT_SIZE,\n    reload,\n    attributes = {},\n    showDisplayUrl = true,\n    draftSnapshot,\n    userId,\n    expiresAt,\n    perspective: {selectedPerspectiveName, perspectiveStack},\n    _key,\n  } = props\n  const [iframeSize, setIframeSize] = useState(sizes?.[defaultSize] ? defaultSize : DEFAULT_SIZE)\n\n  const prefersReducedMotion = usePrefersReducedMotion()\n\n  const url = suspend(\n    () => props.url(draftSnapshot),\n    [\n      // Cache based on a few specific conditions\n      'sanity-plugin-iframe-pane',\n      draftSnapshot,\n      selectedPerspectiveName,\n      perspectiveStack,\n      userId,\n      expiresAt,\n      _key,\n      resolveUUID,\n    ],\n  )\n\n  const [loading, setLoading] = useState(true)\n  const [_reloading, setReloading] = useState(false)\n  const reloading = _reloading || isResolvingUrl\n\n  const iframe = useRef<HTMLIFrameElement>(null)\n\n  const handleReload = useCallback(() => {\n    if (!iframe?.current) {\n      return\n    }\n\n    // Funky way to reload an iframe without CORS issues\n    const {src} = iframe.current\n    iframe.current.src = src\n\n    setReloading(true)\n  }, [])\n\n  return (\n    <MotionConfig transition={prefersReducedMotion ? {duration: 0} : undefined}>\n      <Flex direction=\"column\" style={{height: '100%'}}>\n        <Toolbar\n          url={url}\n          iframeSize={iframeSize}\n          reloading={reloading}\n          setIframeSize={setIframeSize}\n          showUrl={showDisplayUrl}\n          reloadButton={!!reload?.button}\n          handleReload={handleReload}\n        />\n        {url instanceof Error ? (\n          <ErrorCard error={url} />\n        ) : (\n          <Card tone=\"transparent\" style={{height: '100%'}}>\n            <Frame\n              ref={iframe}\n              loading={loading}\n              reloading={reloading}\n              iframeSize={iframeSize}\n              setReloading={setReloading}\n              setLoading={setLoading}\n              url={url}\n              attributes={attributes}\n            />\n          </Card>\n        )}\n      </Flex>\n    </MotionConfig>\n  )\n})\n\ninterface FrameProps extends Required<Pick<IframeOptions, 'attributes'>> {\n  loading: boolean\n  reloading: boolean\n  setLoading: (loading: boolean) => void\n  setReloading: (reloading: boolean) => void\n  iframeSize: IframeSizeKey\n  url: URL | undefined\n}\nfunction Frame(props: FrameProps & {ref?: React.Ref<HTMLIFrameElement>}) {\n  const {\n    loading,\n    setLoading,\n    iframeSize,\n    attributes,\n    reloading,\n    url,\n    setReloading,\n    ref: iframe,\n  } = props\n\n  function handleIframeLoad() {\n    setLoading(false)\n    setReloading(false)\n    // Run onLoad from attributes\n    if (attributes.onLoad && typeof attributes.onLoad === 'function') {\n      attributes.onLoad()\n    }\n  }\n\n  return (\n    <Flex align=\"center\" justify=\"center\" style={{height: '100%', position: 'relative'}}>\n      <AnimatePresence>\n        {!url ||\n          (loading && (\n            <MotionFlex\n              initial=\"initial\"\n              animate=\"animate\"\n              exit=\"exit\"\n              variants={spinnerVariants}\n              justify=\"center\"\n              align=\"center\"\n              style={{inset: '0', position: 'absolute'}}\n            >\n              <Loading iframeSize={iframeSize} />\n            </MotionFlex>\n          ))}\n      </AnimatePresence>\n      {url && (\n        <motion.iframe\n          ref={iframe}\n          title=\"preview\"\n          frameBorder=\"0\"\n          style={{maxHeight: '100%'}}\n          src={url.toString()}\n          initial={['background', iframeSize]}\n          variants={iframeVariants}\n          animate={[\n            loading ? 'background' : 'active',\n            reloading ? 'reloading' : 'idle',\n            iframeSize,\n          ]}\n          {...attributes}\n          onLoad={handleIframeLoad}\n        />\n      )}\n    </Flex>\n  )\n}\n\nconst spinnerVariants = {\n  initial: {opacity: 1},\n  animate: {opacity: [0, 0, 1]},\n  exit: {opacity: [1, 0, 0]},\n}\n\nconst iframeVariants = {\n  ...sizes,\n  desktop: {\n    ...sizes.desktop,\n    boxShadow: '0 0 0 0px var(--card-shadow-outline-color)',\n  },\n  mobile: {\n    ...sizes.mobile,\n    boxShadow: '0 0 0 1px var(--card-shadow-outline-color)',\n  },\n  background: {\n    opacity: 0,\n    scale: 1,\n  },\n  idle: {\n    scale: 1,\n  },\n  reloading: {\n    scale: [1, 1, 1, 0.98],\n  },\n  active: {\n    opacity: [0, 0, 1],\n    scale: 1,\n  },\n}\n\nfunction Loading({iframeSize}: {iframeSize: IframeSizeKey}) {\n  return (\n    <Flex style={{...sizes[iframeSize]}} justify=\"center\" align=\"center\" direction=\"column\" gap={4}>\n      <Spinner muted />\n      <Text muted size={1}>\n        Loading…\n      </Text>\n    </Flex>\n  )\n}\n\nfunction ErrorCard({error}: {error: Error}) {\n  return (\n    <Card height=\"fill\">\n      <Flex align=\"center\" height=\"fill\" justify=\"center\" padding={4} sizing=\"border\">\n        <Container width={0}>\n          <Card padding={4} radius={2} shadow={1} tone=\"caution\">\n            <Flex>\n              <Box>\n                <Text size={1}>\n                  <WarningOutlineIcon />\n                </Text>\n              </Box>\n              <Stack flex={1} marginLeft={3} gap={3}>\n                <Text as=\"h1\" size={1} weight=\"bold\">\n                  {error.name}\n                </Text>\n                <Text as=\"p\" muted size={1}>\n                  {error.message}\n                </Text>\n              </Stack>\n            </Flex>\n          </Card>\n        </Container>\n      </Flex>\n    </Card>\n  )\n}\n\n// https://github.com/pmndrs/suspend-react?tab=readme-ov-file#making-cache-keys-unique\nconst resolveUUID = Symbol()\n"],"mappings":"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"}
\ No newline at end of file