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