sanity-plugin-iframe-pane 5.0.34 → 5.0.36

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","names":[],"sources":["../src/types.ts","../src/Iframe.tsx"],"mappings":";;;KAAY,sBAAsB;KAEtB;KAEA,eACT,OAAO;EACN;EACA;;KCqBQ,eACV,UAAU,uBACV,aAAa,KACX,kBAAkB,8EAGR,oBAAoB,iBAAiB;UAIlC;;;;EAIf;EACA,cAEI;;;;;IAME;;;;;;;IAOA,kBAAkB;;;;;IAKlB;;EAEN,cAAc;EACd;EACA;IACE;;EAEF,aAAa;IACX;IACA,gBAAgB;IAChB;IACA;;;UAMa;EACf;IACE,WAAW;IACX,OAAO;IACP,WAAW;;EAEb,SAAS;;iBAOK,OAAO,OAAO,cAAc,MAAM,IAAI"}
1
+ {"version":3,"file":"index.d.ts","names":[],"sources":["../src/types.ts","../src/Iframe.tsx"],"mappings":";;;KAAY,sBAAsB;KAEtB;KAEA,eACT,OAAO;EACN;EACA;;KCsBQ,eACV,UAAU,uBACV,aAAa,KACX,kBAAkB,8EAGR,oBAAoB,iBAAiB;UAIlC;;;;EAIf;EACA,cAEI;;;;;IAME;;;;;;;IAOA,kBAAkB;;;;;IAKlB;;EAEN,cAAc;EACd;EACA;IACE;;EAEF,aAAa;IACX;IACA,gBAAgB;IAChB;IACA;;;UAMa;EACf;IACE,WAAW;IACX,OAAO;IACP,WAAW;;EAEb,SAAS;;iBAOK,OAAO,OAAO,cAAc,MAAM,IAAI"}
package/dist/index.js CHANGED
@@ -4,6 +4,7 @@ import { WarningOutlineIcon } from "@sanity/icons/WarningOutline";
4
4
  import { createPreviewSecret } from "@sanity/preview-url-secret/create-secret";
5
5
  import { definePreviewUrl } from "@sanity/preview-url-secret/define-preview-url";
6
6
  import { Box, Button, Card, Container, Flex, Spinner, Stack, Text, usePrefersReducedMotion } from "@sanity/ui";
7
+ import { dequal } from "dequal/lite";
7
8
  import { AnimatePresence, MotionConfig, motion } from "motion/react";
8
9
  import { Suspense, memo, useEffect, useRef, useState, useTransition } from "react";
9
10
  import { useActiveWorkspace, useClient, useCurrentUser, usePerspective } from "sanity";
@@ -225,7 +226,7 @@ function encodeStudioPerspective(studioPerspective) {
225
226
  return Array.isArray(studioPerspective) ? studioPerspective.join(",") : studioPerspective;
226
227
  }
227
228
  function Iframe(props) {
228
- let $ = c(36), { document, options } = props, draft = document.draft || document.published || document.displayed, { defaultSize: t0, reload, attributes, showDisplayUrl: t1, key } = options, defaultSize = t0 === void 0 ? DEFAULT_SIZE : t0, showDisplayUrl = t1 === void 0 || t1, basePath = useActiveWorkspace()?.activeWorkspace?.basePath || "/", urlRef = useRef(options.url), t2;
229
+ let $ = c(40), { document, options } = props, draft = document.draft || document.published || document.displayed, { defaultSize: t0, reload, attributes, showDisplayUrl: t1, key } = options, defaultSize = t0 === void 0 ? DEFAULT_SIZE : t0, showDisplayUrl = t1 === void 0 || t1, basePath = useActiveWorkspace()?.activeWorkspace?.basePath || "/", urlRef = useRef(options.url), t2;
229
230
  $[0] !== draft || $[1] !== key ? (t2 = () => ({
230
231
  key,
231
232
  draft
@@ -241,23 +242,22 @@ function Iframe(props) {
241
242
  perspectiveStack,
242
243
  selectedPerspectiveName
243
244
  }, $[7] = perspectiveStack, $[8] = selectedPerspectiveName, $[9] = t6) : t6 = $[9];
244
- let perspective = t6, t7, t8;
245
- $[10] !== draft || $[11] !== draftSnapshot || $[12] !== key ? (t7 = () => {
246
- JSON.stringify({
247
- key,
248
- draft
249
- }) !== JSON.stringify(draftSnapshot) && startTransition(() => setDraftSnapshot({
245
+ let perspective = t6, t7;
246
+ $[10] !== draft || $[11] !== draftSnapshot.draft || $[12] !== draftSnapshot.key || $[13] !== key ? (t7 = () => {
247
+ (key !== draftSnapshot.key || !dequal(draft, draftSnapshot.draft)) && startTransition(() => setDraftSnapshot({
250
248
  key,
251
249
  draft
252
250
  }));
253
- }, t8 = [
251
+ }, $[10] = draft, $[11] = draftSnapshot.draft, $[12] = draftSnapshot.key, $[13] = key, $[14] = t7) : t7 = $[14];
252
+ let t8;
253
+ $[15] !== draft || $[16] !== draftSnapshot || $[17] !== key ? (t8 = [
254
254
  draft,
255
255
  draftSnapshot,
256
256
  key,
257
257
  startTransition
258
- ], $[10] = draft, $[11] = draftSnapshot, $[12] = key, $[13] = t7, $[14] = t8) : (t7 = $[13], t8 = $[14]), useEffect(t7, t8);
258
+ ], $[15] = draft, $[16] = draftSnapshot, $[17] = key, $[18] = t8) : t8 = $[18], useEffect(t7, t8);
259
259
  let t9;
260
- $[15] !== basePath || $[16] !== client || $[17] !== currentUser?.id || $[18] !== perspective ? (t9 = async (draft_0) => {
260
+ $[19] !== basePath || $[20] !== client || $[21] !== currentUser?.id || $[22] !== perspective ? (t9 = async (draft_0) => {
261
261
  if (typeof location > "u") return;
262
262
  let urlProp = urlRef.current;
263
263
  if (typeof urlProp == "string") return new URL(urlProp, location.origin);
@@ -285,20 +285,20 @@ function Iframe(props) {
285
285
  });
286
286
  return new URL(url_0, location.origin);
287
287
  }
288
- }, $[15] = basePath, $[16] = client, $[17] = currentUser?.id, $[18] = perspective, $[19] = t9) : t9 = $[19], currentUser?.id;
288
+ }, $[19] = basePath, $[20] = client, $[21] = currentUser?.id, $[22] = perspective, $[23] = t9) : t9 = $[23], currentUser?.id;
289
289
  let url_1 = t9, t10, t11;
290
- $[20] === expiresAt ? (t10 = $[21], t11 = $[22]) : (t10 = () => {
290
+ $[24] === expiresAt ? (t10 = $[25], t11 = $[26]) : (t10 = () => {
291
291
  if (expiresAt) {
292
292
  let timeout = setTimeout(() => {
293
293
  startTransition(() => setExpiresAt(void 0)), previewSecretRef.current = void 0;
294
294
  }, Math.max(0, expiresAt - Date.now()));
295
295
  return () => clearTimeout(timeout);
296
296
  }
297
- }, t11 = [expiresAt], $[20] = expiresAt, $[21] = t10, $[22] = t11), useEffect(t10, t11);
297
+ }, t11 = [expiresAt], $[24] = expiresAt, $[25] = t10, $[26] = t11), useEffect(t10, t11);
298
298
  let t12;
299
- $[23] === Symbol.for("react.memo_cache_sentinel") ? (t12 = /* @__PURE__ */ jsx(Loading, { iframeSize: "desktop" }), $[23] = t12) : t12 = $[23];
299
+ $[27] === Symbol.for("react.memo_cache_sentinel") ? (t12 = /* @__PURE__ */ jsx(Loading, { iframeSize: "desktop" }), $[27] = t12) : t12 = $[27];
300
300
  let t13 = `${draftSnapshot.key}-${selectedPerspectiveName || "draft"}`, t14 = currentUser?.id, t15;
301
- return $[24] !== attributes || $[25] !== defaultSize || $[26] !== draftSnapshot.draft || $[27] !== draftSnapshot.key || $[28] !== isResolvingUrl || $[29] !== perspective || $[30] !== reload || $[31] !== showDisplayUrl || $[32] !== t13 || $[33] !== t14 || $[34] !== url_1 ? (t15 = /* @__PURE__ */ jsx(Suspense, {
301
+ return $[28] !== attributes || $[29] !== defaultSize || $[30] !== draftSnapshot.draft || $[31] !== draftSnapshot.key || $[32] !== isResolvingUrl || $[33] !== perspective || $[34] !== reload || $[35] !== showDisplayUrl || $[36] !== t13 || $[37] !== t14 || $[38] !== url_1 ? (t15 = /* @__PURE__ */ jsx(Suspense, {
302
302
  fallback: t12,
303
303
  children: /* @__PURE__ */ jsx(IframeInner, {
304
304
  _key: draftSnapshot.key,
@@ -312,7 +312,7 @@ function Iframe(props) {
312
312
  showDisplayUrl,
313
313
  userId: t14
314
314
  }, t13)
315
- }), $[24] = attributes, $[25] = defaultSize, $[26] = draftSnapshot.draft, $[27] = draftSnapshot.key, $[28] = isResolvingUrl, $[29] = perspective, $[30] = reload, $[31] = showDisplayUrl, $[32] = t13, $[33] = t14, $[34] = url_1, $[35] = t15) : t15 = $[35], t15;
315
+ }), $[28] = attributes, $[29] = defaultSize, $[30] = draftSnapshot.draft, $[31] = draftSnapshot.key, $[32] = isResolvingUrl, $[33] = perspective, $[34] = reload, $[35] = showDisplayUrl, $[36] = t13, $[37] = t14, $[38] = url_1, $[39] = t15) : t15 = $[39], t15;
316
316
  }
317
317
  const IframeInner = memo(function IframeInner(props) {
318
318
  let $ = c(35), { isResolvingUrl, defaultSize: t0, reload, attributes: t1, showDisplayUrl: t2, draftSnapshot, userId, expiresAt, perspective: t3, _key } = props, defaultSize = t0 === void 0 ? DEFAULT_SIZE : t0, t4;
package/dist/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","names":["getRedirectTo","Text","useMemo","DisplayUrl","props","$","_c","t0","url","truncatedUrl","origin","location","pathname","search","t1","CopyIcon","LaunchIcon","MobileDeviceIcon","RefreshIcon","Box","Button","Card","Flex","Text","useToast","Tooltip","useCallback","useRef","useState","DisplayUrl","IframeSizeKey","SizeProps","sizes","desktop","width","height","mobile","DEFAULT_SIZE","ToolbarProps","url","URL","Error","iframeSize","setIframeSize","size","showUrl","reloading","reloadButton","handleReload","Toolbar","props","$","_c","validUrl","input","push","pushToast","copy","useCopyToClipboard","t0","Symbol","for","position","pointerEvents","opacity","t1","toString","t2","t3","whiteSpace","t4","t5","t6","t7","t8","t9","t10","t11","t12","t13","t14","t15","t16","t17","t18","t19","current","value","then","copied","closable","status","title","t20","t21","t22","t23","t24","t25","window","open","undefined","t26","t27","t28","t29","CopiedValue","CopyFn","text","Promise","copiedText","setCopiedText","navigator","clipboard","console","warn","writeText","error","WarningOutlineIcon","createPreviewSecret","definePreviewUrl","Box","Card","Container","Flex","Spinner","Stack","Text","usePrefersReducedMotion","AnimatePresence","motion","MotionConfig","HTMLAttributeReferrerPolicy","memo","Suspense","useCallback","useEffect","useMemo","useRef","useState","useTransition","SanityDocument","useActiveWorkspace","useClient","useCurrentUser","usePerspective","suspend","DEFAULT_SIZE","sizes","Toolbar","IframeSizeKey","UrlResolver","document","perspective","Pick","ReturnType","Error","Promise","IframeOptions","key","url","origin","preview","draftMode","defaultSize","showDisplayUrl","reload","button","attributes","Partial","allow","referrerPolicy","sandbox","onLoad","MotionFlex","create","IframeProps","displayed","draft","published","options","encodeStudioPerspective","studioPerspective","Array","isArray","join","Iframe","props","$","_c","t0","t1","undefined","workspace","basePath","activeWorkspace","urlRef","t2","draftSnapshot","setDraftSnapshot","t3","t4","current","currentUser","t5","Symbol","for","apiVersion","client","expiresAt","setExpiresAt","previewSecretRef","isResolvingUrl","startTransition","perspectiveStack","selectedPerspectiveName","t6","t7","t8","JSON","stringify","t9","id","draft_0","location","urlProp","URL","secret","expiresAt_0","href","getTime","resolvePreviewUrl","previewMode","enable","url_0","previewUrlSecret","previewSearchParam","studioBasePath","studioPreviewPerspective","url_1","t10","t11","timeout","setTimeout","Math","max","Date","now","clearTimeout","t12","t13","t14","t15","IframeInnerProps","Omit","Parameters","userId","_key","IframeInner","iframeSize","setIframeSize","prefersReducedMotion","resolveUUID","loading","setLoading","_reloading","setReloading","reloading","iframe","src","handleReload","duration","height","FrameProps","Required","Frame","ref","handleIframeLoad","position","spinnerVariants","inset","maxHeight","toString","iframeVariants","initial","opacity","animate","exit","desktop","boxShadow","mobile","background","scale","idle","active","Loading","ErrorCard","error","name","message"],"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 {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 (JSON.stringify({key, draft}) !== JSON.stringify(draftSnapshot)) {\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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"}
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":";;;;;;;;;;;;;;;;;;;AAIA,SAAgB,WAAW,OAAmB;eAE9BA;CAAoBC,AAAAA,EAAAA,OAAAA,MAAAA,mBAApB,KAAA,cAAc,MAAM,GAAG,GAAHA,EAAAA,KAAAA,MAAAA;CAAhC,IAAM,MAAMD,IADR,eAAe,GAET,IAAI,WAAW,SAAS,SAAS,KAAK,IAAI,SAAS,IAAI,WAAW,IAAI,UAIhFE;CADF,OAEK,EAAA,OAAA,4BADH,KAAA,oBAAC,MAAD;EAAM,MAAM;EAAG,cAAa;EACzB,UAAA;CACG,CAAA,GADH,EAAA,KAAA,0BADHA;AAIJ;ACHA,MAAa,QAAmB;CAC9B,SAAS;EACP,OAAO;EACP,QAAQ;CACV;CACA,QAAQ;EACN,OAAO;EACP,QAAQ;CACV;AACF,GAEa,eAAe;AAW5B,SAAgB,QAAQ,OAAqB;gBACrC,EAAC,KAAK,YAAY,eAAe,WAAW,SAAS,cAAc,iBAAgB,OACnF,WAAW,eAAe,KAE1B,QAAQ,OAA4B,IAAI,GACxC,EAAC,MAAM,cAAa,SAAS,GAC7B,GAAG,QAAQ,mBAAmB,GAMvBC;;EAAC,UAAU;EAAY,eAAe;EAAQ,SAAS;CAAC;CAExDC,IAAAA;CAAW,AAAA,EAAA,OAAA,OAAA,EAAA,OAAX,YAAW,KAAA,WAAA,IAAI,SAAS,IAAI,IAAjB,EAAA,KAAA,KAAX,EAAA,KAAA;CAJTC,IAAAA;CAISD,AAAAA,EAAAA,OAAAA,kBAJT,KAAA,oBAAC,YAAD;EACE,eAAA;EACA,OAAOD;EACP,KAAK;EACL,OAAOC;EACP,UAAA;EACA,UAAU;CACX,CAAA,GAHQA,EAAAA,KAAAA;CAUuBE,IAAAA;qDAAC,KAAA,EAAA,YAAY,SAAQ;CACxC,IAAA,KAAA,eAAe,WAAW,wBAAwB,2BADrDC;CACGC,AAAAA,EAAAA,OAAAA,kBADH,KAAA,oBAAC,MAAD;EAAM,MAAM;EAAG,OAAOF;EACnBE,UAAAA;CACG,CAAA,GADHA,EAAAA,KAAAA;CAOO,IAAA,KAAA,CAAC,UACDC;qDAAC,KAAA,CAAA,CAAC;CAEN,IAAA,KAAA,eAAe,WAAW,YAAY,SAEnCC;CAAoB,AAAA,EAAA,QAAA,cAAA,EAAA,QAAd,iBAAN,WAAM,cAAc,eAAe,WAAW,YAAY,QAAQ,GAA9C,EAAA,MAAA,YAAd,EAAA,MAAA;CANjBC,IAAAA;CACYC,AAAAA,EAAAA,QAAAA,MAAAA,EAAAA,QAGJC,MAAAA,EAAAA,QAEGH,MANX,MAAA,oBAAC,QAAD;EACE,UAAUE;EACV,UAAUH;EACV,SAAS;EACT,MAAMI;EACN,MAAM;EACN,SAASH;CACV,CAAA,GANWE,EAAAA,MAAAA,IAGJC,EAAAA,MAAAA,IAEGH,EAAAA,MAAAA;CAjBfI,IAAAA;CAWIH,AAAAA,EAAAA,QAAAA,OAAAA,EAAAA,QAPEJ,MAJN,MAAA,oBAAC,MAAD;EAAM,OAAM;EAAS,KAAK;EACxB,UAAA,oBAAC,SAAD;GACE,SAAA;GACA,SACEA;GAIF,SAAS;GACT,WAAU;GAEVI,UAAAA;EAQO,CAAA;CACL,CAAA,GATFA,EAAAA,MAAAA,KAPEJ,EAAAA,MAAAA;CAiBSQ,IAAAA;CAAwC,AAAA,EAAA,QAAA,WAAA,EAAA,QAAA,OAAA,EAAA,QAA7B,YAAX,MAAA,WAAW,YAAY,oBAAC,YAAD,EAAiB,IAAM,CAAA,GAA9C,EAAA,MAAA,SAAwC,EAAA,MAAA,KAA7B,EAAA,MAAA;CAA1BC,IAAAA;CAAeD,AAAAA,EAAAA,QAAAA,qBAAf,MAAA,oBAAC,KAAD;EAAK,MAAM;EAAIA,UAAAA;CAAqD,CAAA,GAArDA,EAAAA,MAAAA;CAEZE,IAAAA;CAkBoB,AAAA,EAAA,QAAA,gBAAA,EAAA,QAlBpB,gBAAA,EAAA,QAKQ,aAAA,EAAA,QAMQ,YAXhB,MAAA,eACC,oBAAC,SAAD;EACE,SAAA;EACA,SACE,oBAAC,MAAD;GAAM,MAAM;GAAG,OAAO,EAAC,YAAY,SAAQ;GACxC,UAAA,YAAY,eAAe;EACxB,CAAA;EAER,SAAS;EAET,UAAA,oBAAC,QAAD;GACE,UAAU,CAAC;GACX,MAAK;GACL,UAAU,CAAC,CAAC;GACZ,SAAS;GACT,MAAM;GACN,SAAS;GACT,cAAW;GACX,eAAe,aAAa;EAC7B,CAAA;CACM,CAAA,IACP,MAHiB,EAAA,MAAA,cAlBpB,EAAA,MAAA,cAKQ,EAAA,MAAA,WAMQ,EAAA,MAAA;CAcbC,IAAAA;sDAAC,MAAA,oBAAA,MAAD;EAAM,MAAM;EAAG,OAAO,EAAC,YAAY,SAAQ;EACzC,UAAA;CACI,CAAA;CAMI,IAAA,MAAA,CAAC,UACDT;sDAAC,MAAA,CAAA,CAAC;CAEHU,IAAAA;sDAAC,MAAA,CAAA,CAAC;CAEFC,IAAAA;CAGF,AAAA,EAAA,QAAA,QAAA,EAAA,QAED,aALG,YAAM;EACR,OAAO,SAAS,SAEhB,KAAK,MAAM,QAAQ,KAAK,CAAC,CAAC,MAAM,YAEjC,UADE,SACQ;GACR,UAAU;GACV,QAAQ;GACR,OAAO;EACT,IAEU;GACR,UAAU;GACV,QAAQ;GACR,OAAO;EACT,CAAC,GAEI,OACR;CACH,GAhBO,EAAA,MAAA,MAED,EAAA,MAAA;CArBVC,IAAAA;CAWcT,AAAAA,EAAAA,QAAAA,OAAAA,EAAAA,QAKDQ,OAhBb,MAAA,oBAAC,SAAD;EACE,SAAA;EACA,SACEF;EAIF,SAAS;EAET,UAAA,oBAAC,QAAD;GACE,MAAK;GACL,UAAUN;GACV,UAAUH;GACV,MAAM;GACN,SAASU;GACT,cAAW;GACX,SAASC;EAoBV,CAAA;CACM,CAAA,GA1BKR,EAAAA,MAAAA,KAKDQ,EAAAA,MAAAA;CAyBTE,IAAAA;sDAAC,MAAA,oBAAA,MAAD;EAAM,MAAM;EAAG,OAAO,EAAC,YAAY,SAAQ;EACzC,UAAA;CACI,CAAA;CAMI,IAAA,MAAA,CAAC,UACDb;sDAAC,MAAA,CAAA,CAAC;CAGFU,IAAAA;sDAAC,MAAA,CAAA,CAAC;CAGHI,IAAAA;CAA6B,AAAA,EAAA,QAAA,OAAA,EAAA,QAA7B,YAAiB,MAAA,iBAAA,OAAO,KAAK,IAAI,SAAS,CAAC,IAAI,KAAA,GAAlB,EAAA,MAAA,KAA7B,EAAA,MAAA;CAlBbC,IAAAA;CAWcZ,AAAAA,EAAAA,QAAAA,OAAAA,EAAAA,QAODW,OAlBb,MAAA,oBAAC,SAAD;EACE,SAAA;EACA,SACED;EAIF,SAAS;EACT,WAAU;EAEV,UAAA,oBAAC,QAAD;GACE,UAAUV;GACV,UAAUH;GACV,MAAM;GACN,MAAK;GACL,UAAUU;GACV,MAAK;GACL,cAAW;GACX,SAASI;EACV,CAAA;CACM,CAAA,GATKX,EAAAA,MAAAA,KAODW,EAAAA,MAAAA;CA/EfE,IAAAA;CACGR,AAAAA,EAAAA,QAAAA,OAAAA,EAAAA,QAsBDI,OAAAA,EAAAA,QAsCAG,OA7DF,MAAA,qBAAC,MAAD;EAAM,OAAM;EAAS,KAAK;EAA1B,UAAA;GACGP;GAsBDI;GAsCAG;EAqBI;KAjFHP,EAAAA,MAAAA,KAsBDI,EAAAA,MAAAA,KAsCAG,EAAAA,MAAAA;CArFNE,IAAAA;CAEIZ,AAAAA,EAAAA,QAAAA,OAAAA,EAAAA,QAqBAE,OAAAA,EAAAA,QACAS,OAxBJ,MAAA,oBAAC,MAAD;EAAM,SAAS;EAAG,cAAA;EAChB,UAAA,qBAAC,MAAD;GAAM,OAAM;GAAS,KAAK;GAA1B,UAAA;IACEX;IAqBAE;IACAS;GAmFI;;CACF,CAAA,GA1GFX,EAAAA,MAAAA,KAqBAE,EAAAA,MAAAA,KACAS,EAAAA,MAAAA;CAjCNE,IAAAA;CADF,OAEItB,EAAAA,QAAAA,MAAAA,EAAAA,QAQAqB,OATF,MAAA,qBAAA,UAAA,EAAA,UAAA,CACErB,IAQAqB,GA6GA,EAAA,CAAA,GArHArB,EAAAA,MAAAA,IAQAqB,EAAAA,MAAAA,iCATFC;AAwHJ;AAMA,SAAS,qBAA4C;eAC7C,CAAC,YAAY,iBAAiB,SAAsB,IAAI,GAE7BC;qDAAO,KAAA,OAAA,SAAS;EAC/C,IAAI,CAAC,WAAW,WAEd,OADA,QAAQ,KAAK,yBAAyB,GAC/B;EAIT,IAAI;GAGF,OAFA,MAAM,UAAU,UAAU,UAAU,IAAI,GACxC,cAAc,IAAI,GACX;EACT,SAASC,IAAO;GAGd,OAFA,QAAQ,KAAK,eAAe,EAAK,GACjC,cAAc,IAAI,GACX;EACT;CACF;CAhBA,IAAM,OAAeC,IAkBdC;CAAP,OAAQ,EAAA,OAAA,0BAAD,KAAA,CAAC,YAAY,IAAI,GAAhB,EAAA,KAAA,wBAADA;AACT;AChHA,MAAM,aAAa,OAAO,OAAO,IAAI;AAWrC,SAAS,wBAAwB,mBAA8C;CAC7E,OAAO,MAAM,QAAQ,iBAAiB,IAAI,kBAAkB,KAAK,GAAG,IAAI;AAC1E;AAEA,SAAgB,OAAO,OAAuC;gBACtD,EAAC,UAAU,YAAW,OACtB,QAAQ,SAAS,SAAS,SAAS,aAAa,SAAS,WAEzD,EAAC,aAAA,IAA4B,QAAQ,YAAY,gBAAA,IAAuB,QAAO,SAA9E,cAAA,OAAA,KAAA,IAAc,eAAdC,IAAgD,iBAAA,OAAA,KAAA,KAAAC,IAGjD,WADY,mBACD,CAAA,EAAW,iBAAiB,YAAY,KACnD,SAAS,OAAO,QAAQ,GAAG,GACkBC;CAAa,AAAA,EAAA,OAAA,SAAA,EAAA,OAAL,OAAR,YAAO;EAAC;EAAK;CAAK,IAAL,EAAA,KAAA,OAAL,EAAA,KAAA;CAA3D,IAAM,CAAC,eAAe,oBAAoB,SAASA,EAAoB,GAC7DC,IAEPC;CAFH,AAC2BC,EAAAA,OAAAA,QAAAA,gCADjB,WAAM;EACd,OAAO,UAAU,QAAQ;CAC3B,GAAG,KAAA,CAAC,QAAQ,GAAG,GADYA,EAAAA,KAAAA,QAAAA,4BAD3B,UAAUF,IAEPC,EAAa;CAChB,IAAM,cAAc,eAAe,GACVE;qDAAC,KAAA,EAAA,YAAY,aAAY;CAAlD,IAAM,SAAS,UAAUA,EAA0B,GAC7C,CAAC,WAAW,gBAAgB,SAA6B,GACzD,mBAAmB,OAA2B,KAAA,CAAS,GACvD,CAAC,gBAAgB,mBAAmB,cAAc,GAClD,EAAC,kBAAkB,4BAA2B,eAAe,GAE1DC;CACL,AAAA,EAAA,OAAA,oBAAA,EAAA,OACA,2BAFK,KAAA;EACL;EACA;CACF,GAFE,EAAA,KAAA,kBACA,EAAA,KAAA;CAHJ,IAAM,cAAcC,IAQVC;CACiC,AAAA,EAAA,QAAA,SAAA,EAAA,QAAqBC,cAAAA,SAAAA,EAAAA,QAApCC,cAAAA,OAAAA,EAAAA,QAAtB,OADI,WAAM;EACd,CAAI,QAAQ,cAAc,OAAO,CAAC,OAAO,OAAO,cAAc,KAAK,MACjE,sBAAsB,iBAAiB;GAAC;GAAK;EAAK,CAAC,CAAC;CAExD,GAH2C,EAAA,MAAA,OAAqBD,EAAAA,MAAAA,cAAAA,OAApCC,EAAAA,MAAAA,cAAAA,KAAtB,EAAA,MAAA;CAGHC,IAAAA;CAJH,AAII,EAAA,QAAA,SAAA,EAAA,QAAO,iBAAA,EAAA,QAAe,OAAvB,KAAA;EAAC;EAAO;EAAe;EAAK;CAAe,GAA1C,EAAA,MAAA,OAAO,EAAA,MAAA,eAAe,EAAA,MAAA,+BAJ1B,UAAUH,IAIPG,EAA4C;CAG7CC,IAAAA;CAiDmB,AAPG,EAAA,QAAA,YAAA,EAAA,QApBd,UAAA,EAAA,QAGaC,aAAAA,MAAAA,EAAAA,QAhBgB,eATrC,KAAA,OAAO,YAAiC;EACtC,IAAI,OAAO,WAAa,KACtB;EAEF,IAAM,UAAU,OAAO;EACvB,IAAI,OAAO,WAAY,UACrB,OAAO,IAAI,IAAI,SAAS,SAAS,MAAM;EAEzC,IAAI,OAAO,WAAY,YAAY;GACjC,IAAM,MAAM,MAAM,QAAQJ,SAAO,WAAW;GAC5C,OAAO,OAAO,OAAQ,WAAW,IAAI,IAAI,KAAK,SAAS,MAAM,IAAI;EACnE;EACA,IAAI,OAAO,WAAY,UAAU;GAC/B,IAAM,UACJ,OAAO,QAAQ,WAAY,aACvB,MAAM,QAAQ,QAAQA,SAAO,WAAW,IACxC,QAAQ;GACd,IAAI,OAAO,WAAY,UACrB,OAAO;GAET,IAAI,CAAC,iBAAiB,SAAS;IAC7B,IAAM,EAAC,QAAQ,WAAA,gBAAa,MAAM,oBAChC,QACA,6BACA,SAAS,MACT,aAAa,EACf;IAEA,AADA,iBAAiB,UAAU,QAC3B,sBAAsB,aAAaK,YAAU,QAAQ,CAAC,CAAC;GACzD;GASA,IAAMV,QAAM,MAPc,iBAAiB;IACzC,QAAQ,QAAQ,WAAW,gBAAgB,SAAS,SAAS,QAAQ;IACrE;IACA,aAAa,EACX,QAAQ,QAAQ,UAClB;GACF,CACkB,CAAA,CAAkB;IAClC;IACA,kBAAkB,iBAAiB;IACnC,oBAAoB;IACpB,gBAAgB;IAChB,0BAA0B,wBAAwB,YAAY,gBAAgB;GAChF,CAAC;GACD,OAAO,IAAI,IAAIA,OAAK,SAAS,MAAM;EACrC;CAEF,GANsB,EAAA,MAAA,UApBd,EAAA,MAAA,QAGaS,EAAAA,MAAAA,aAAAA,IAhBgB,EAAA,MAAA,uCAwClB,aAAa;CAlDlC,IAAMT,QAAMW,IAoDFC,KAYPC;CAZH,AACM,EAAA,QAAA,0CADI,YAAM;EACd,IAAI,WAAW;GACb,IAAM,UAAU,iBACR;IAEJ,AADA,sBAAsB,aAAa,KAAA,CAAS,CAAC,GAC7C,iBAAiB,UAAU,KAAA;GAC7B,GACA,KAAK,IAAI,GAAG,YAAY,KAAK,IAAI,CAAC,CACpC;GACA,aAAa,aAAa,OAAO;EACnC;CAEF,GAAG,MAAA,CAAC,SAAS,GAXP,EAAA,MAAA,sCADN,UAAUD,KAYPC,GAAW;CAGQC,IAAAA;sDAAC,MAAA,oBAAA,SAAD,EAAS,YAAW,UAAW,CAAA;CAE1C,IAAA,MAAA,GAAG,cAAc,IAAI,GAAG,2BAA2B,WAUhD,MAAA,aAAa,IAZzBC;CADF,OAQkB,EAAA,QAAA,cAAA,EAAA,QAEC,eAAA,EAAA,QALgBV,cAAAA,SAAAA,EAAAA,QADTC,cAAAA,OAAAA,EAAAA,QAGJ,kBAAA,EAAA,QAEH,eAAA,EAAA,QAEL,UAAA,EAAA,QACQ,kBAAA,EAAA,QATXU,OAAAA,EAAAA,QAUGC,OAAAA,EAAAA,QAPHjB,SALT,MAAA,oBAAC,UAAD;EAAU,UAAUc;EAClB,UAAA,oBAAC,aAAD;GAEE,MAAM,cAAc;GACpB,eAAe,cAAc;GAC7B,KAAKd;GACW;GACJ;GACC;GACA;GACL;GACQ;GAChB,QAAQiB;EACT,GAXMD,GAWN;CACO,CAAA,GAPM,EAAA,MAAA,YAEC,EAAA,MAAA,aALgBX,EAAAA,MAAAA,cAAAA,OADTC,EAAAA,MAAAA,cAAAA,KAGJ,EAAA,MAAA,gBAEH,EAAA,MAAA,aAEL,EAAA,MAAA,QACQ,EAAA,MAAA,gBATXU,EAAAA,MAAAA,KAUGC,EAAAA,MAAAA,KAPHjB,EAAAA,MAAAA,mCALTe;AAgBJ;AAWA,MAAM,cAAc,KAAK,SAAS,YAAY,OAAyB;gBAC/D,EACJ,gBACA,aAAA,IACA,QACA,YAAA,IACA,gBAAA,IACA,eACA,QACA,WACA,aAAaG,IACb,SACE,OATF,cAAA,OAAA,KAAA,IAAc,eAAdvB,IAEAwB;4BAAa,KAAA,OAAA,KAAA,IAAA,CAAC,IAAdA;sBACA,iBAAA,OAAA,KAAA,KAAAvB,IAIa,EAAC,yBAAyB,qBAA1BsB,IAGT,CAAC,YAAY,iBAAiB,SAAS,QAAQ,eAAe,cAAc,YAAY,GAExF,uBAAuB,wBAAwB,GAGnDE;CAAgB,AAAA,EAAA,OAAA,iBAAA,EAAA,OAAV,SAAN,WAAM,MAAM,IAAI,aAAa,GAAb,EAAA,KAAA,eAAV,EAAA,KAAA;CADIC,IAAAA;CAUR,AAAA,EAAA,OAAA,QAAA,EAAA,OALA,iBAAA,EAAA,OAIA,aAAA,EAAA,OAFA,oBAAA,EAAA,OADA,2BAAA,EAAA,QALFD,MAAAA,EAAAA,QAOE,UARQ,KAAA,QACVA,IACA;EAEE;EACA;EACA;EACA;EACA;EACA;EACA;EACA;CACF,CACF,GAHI,EAAA,KAAA,MALA,EAAA,KAAA,eAIA,EAAA,KAAA,WAFA,EAAA,KAAA,kBADA,EAAA,KAAA,yBALFA,EAAAA,MAAAA,IAOE,EAAA,MAAA;CARJ,IAAM,MAAMC,IAeN,CAAC,SAAS,cAAc,SAAS,EAAI,GACrC,CAAC,YAAY,gBAAgB,SAAS,EAAK,GAC3C,YAAY,cAAc,gBAE1B,SAAS,OAA0B,IAAI,GAEZC;sDAAM,WAAA;EACrC,IAAI,CAAC,QAAQ,SACX;EAIF,IAAM,EAAC,QAAO,OAAO;EAGrB,AAFA,OAAO,QAAQ,MAAM,KAErB,aAAa,EAAI;CACnB;CAVA,IAAM,eAAeC,IAaOC;gDAAuB,KAAA,uBAAA,EAAC,UAAU,EAAC,IAAI,KAAA,GAAvC,EAAA,MAAA;CACQC,IAAAA;sDAAC,KAAA,EAAA,QAAQ,OAAM;CAO7B,IAAA,MAAA,CAAC,CAAC,QAAQ,QAN1BC;CAEc,AAAA,EAAA,QAAA,cAAA,EAAA,QACD,aAAA,EAAA,QAEF,kBAAA,EAAA,QACKC,OAAAA,EAAAA,QALT,OADP,MAAA,oBAAC,SAAD;EACO;EACO;EACD;EACI;EACf,SAAS;EACT,cAAcA;EACA;CACf,CAAA,GANa,EAAA,MAAA,YACD,EAAA,MAAA,WAEF,EAAA,MAAA,gBACKA,EAAAA,MAAAA,KALT,EAAA,MAAA;CAQNC,IAAAA;CAYiB,AAAA,EAAA,QAAA,cAAA,EAAA,QAJA,cAAA,EAAA,QAFH,WAAA,EAAA,QACE,aAAA,EAAA,QAPhB,OAAe,MAAA,eAAA,QACd,oBAAC,WAAD,EAAW,OAAO,IAAM,CAAA,IAExB,oBAAC,MAAD;EAAM,MAAK;EAAc,OAAO,EAAC,QAAQ,OAAM;EAC7C,UAAA,oBAAC,OAAD;GACE,KAAK;GACI;GACE;GACC;GACE;GACF;GACP;GACO;EACb,CAAA;CACG,CAAA,GAFU,EAAA,MAAA,YAJA,EAAA,MAAA,YAFH,EAAA,MAAA,SACE,EAAA,MAAA,WAPhB,EAAA,MAAA;CAVHC,IAAAA;CACEH,AAAAA,EAAAA,QAAAA,OAAAA,EAAAA,QASCE,OAVH,MAAA,qBAAC,MAAD;EAAM,WAAU;EAAS,OAAOH;EAAhC,UAAA,CACEC,KASCE,GAgBG;KAzBJF,EAAAA,MAAAA,KASCE,EAAAA,MAAAA;CAXLE,IAAAA;CADF,OAEID,EAAAA,QAAAA,OAAAA,EAAAA,QADwBL,MAA1B,MAAA,oBAAC,cAAD;EAAc,YAAYA;EACxBK,UAAAA;CA2BY,CAAA,GA3BZA,EAAAA,MAAAA,KADwBL,EAAAA,MAAAA,gCAA1BM;AA8BJ,CAAC;AAUD,SAAS,MAAM,OAA0D;gBACjE,EACJ,SACA,YACA,YACA,YACA,WACA,KACA,cACA,KAAK,WACH,OAEJC;CAIMC,AAAAA,EAAAA,OAAAA,cAAAA,EAAAA,OAHJ,cAAA,EAAA,OACA,gBAFF,KAAA,SAAS,mBAAmB;EAI1B,AAHA,WAAW,EAAK,GAChB,aAAa,EAAK,GAEd,WAAW,UAAU,OAAO,WAAW,UAAW,cACpD,WAAW,OAAO;CAEtB,GAHMA,EAAAA,KAAAA,YAHJ,EAAA,KAAA,YACA,EAAA,KAAA;CAFF,IAAS,mBAATD,IAU+CE;;EAAC,QAAQ;EAAQ,UAAU;CAAU;CAE7EC,IAAAA;CAW0B,AAAA,EAAA,OAAA,cAAA,EAAA,OAVxB,WAAA,EAAA,OADD,OAAD,KAAA,CAAC,OACC,WACC,oBAAC,YAAD;EACE,SAAQ;EACR,SAAQ;EACR,MAAK;EACL,UAAU;EACV,SAAQ;EACR,OAAM;EACN,OAAO;GAAC,OAAO;GAAK,UAAU;EAAU;EAExC,UAAA,oBAAC,SAAD,EAAqB,WAAa,CAAA;CACxB,CAAA,GADW,EAAA,KAAA,YAVxB,EAAA,KAAA,SADD,EAAA,KAAA;CADJC,IAAAA;CACGD,AAAAA,EAAAA,OAAAA,mBADH,KAAA,oBAAC,iBAAD,EAAA,UACGA,GAcc,CAAA,GAddA,EAAAA,KAAAA;CAeFE,IAAAA;CAcO,AAAA,EAAA,QAAA,cAAA,EAAA,QACI,oBAAA,EAAA,QAbH,UAAA,EAAA,QAKmB,cAAA,EAAA,QAGtB,WAAA,EAAA,QACA,aAAA,EAAA,QAXL,OACC,KAAA,OAAA,oBAACC,OAAAA,QAAD;EACE,KAAK;EACL,OAAM;EACN,aAAY;EACZ,OAAO,EAAC,WAAW,OAAM;EACzB,KAAK,IAAI,SAAS;EAClB,SAAS,CAAC,cAAc,UAAU;EAClC,UAAU;EACV,SAAS;GACP,UAAU,eAAe;GACzB,YAAY,cAAc;GAC1B;EACF;EACA,GAAI;EACJ,QAAQ;CACT,CAAA,GAFK,EAAA,MAAA,YACI,EAAA,MAAA,kBAbH,EAAA,MAAA,QAKmB,EAAA,MAAA,YAGtB,EAAA,MAAA,SACA,EAAA,MAAA,WAXL,EAAA,MAAA;CAjBHC,IAAAA;CADF,OAEIH,EAAAA,QAAAA,MAAAA,EAAAA,QAgBCC,MAjBH,KAAA,qBAAC,MAAD;EAAM,OAAM;EAAS,SAAQ;EAAS,OAAOH;EAA7C,UAAA,CACEE,IAgBCC,EAkBG;KAlCJD,EAAAA,MAAAA,IAgBCC,EAAAA,MAAAA,8BAjBHE;AAqCJ;AAEA,MAAM,kBAAkB;CACtB,SAAS,EAAC,SAAS,EAAC;CACpB,SAAS,EAAC,SAAS;EAAC;EAAG;EAAG;CAAC,EAAC;CAC5B,MAAM,EAAC,SAAS;EAAC;EAAG;EAAG;CAAC,EAAC;AAC3B,GAEM,iBAAiB;CACrB,GAAG;CACH,SAAS;EACP,GAAG,MAAM;EACT,WAAW;CACb;CACA,QAAQ;EACN,GAAG,MAAM;EACT,WAAW;CACb;CACA,YAAY;EACV,SAAS;EACT,OAAO;CACT;CACA,MAAM,EACJ,OAAO,EACT;CACA,WAAW,EACT,OAAO;EAAC;EAAG;EAAG;EAAG;CAAI,EACvB;CACA,QAAQ;EACN,SAAS;GAAC;GAAG;GAAG;EAAC;EACjB,OAAO;CACT;AACF;AAEA,SAAS,QAAA,IAAmD;eAA3C,EAAC,eAADC,IAEI,KAAA,MAAM,aAAVC;CAAIC,AAAAA,EAAAA,OAAAA,kBAAJ,KAAA,EAAC,GAAGA,GAAiB,GAAjBA,EAAAA,KAAAA;CACfC,IAAAA,IACAC;qDADA,KAAA,oBAAC,SAAD,EAAS,OAAA,GAAO,CAAA,GAChB,KAAA,oBAAC,MAAD;EAAM,OAAA;EAAM,MAAM;EAChB,UAAA;CACI,CAAA;CAJRC,IAAAA;CADF,OACeJ,EAAAA,OAAAA,kBAAb,KAAA,qBAAC,MAAD;EAAM,OAAOA;EAAwB,SAAQ;EAAS,OAAM;EAAS,WAAU;EAAS,KAAK;EAA7F,UAAA,CACEE,IACAC,EAGI;KALOH,EAAAA,KAAAA,gBAAbI;AAOJ;AAEA,SAAS,UAAA,IAAmC;eAAzB,EAAC,UAADC,IAOLC;qDAAC,KAAA,oBAAA,KAAD,EAAA,UACE,oBAAC,MAAD;EAAM,MAAM;EACV,UAAA,oBAAC,oBAAD,CAAqB,CAAA;CACjB,CAAA,EACH,CAAA;CAEHC,IAAAA;CACSC,AAAAA,EAAAA,OAAAA,MAAAA,oBADT,KAAA,oBAAC,MAAD;EAAM,IAAG;EAAK,MAAM;EAAG,QAAO;EAC3B,UAAA,MAAM;CACH,CAAA,GADGA,EAAAA,KAAAA,MAAAA;CAETC,IAAAA;CACSC,AAAAA,EAAAA,OAAAA,MAAAA,uBADT,KAAA,oBAAC,MAAD;EAAM,IAAG;EAAI,OAAA;EAAM,MAAM;EACtB,UAAA,MAAM;CACH,CAAA,GADGA,EAAAA,KAAAA,MAAAA;CAfrBC,IAAAA;CADF,OAYcJ,EAAAA,OAAAA,MAAAA,EAAAA,OAGAE,MAdZ,KAAA,oBAAC,MAAD;EAAM,QAAO;EACX,UAAA,oBAAC,MAAD;GAAM,OAAM;GAAS,QAAO;GAAO,SAAQ;GAAS,SAAS;GAAG,QAAO;GACrE,UAAA,oBAAC,WAAD;IAAW,OAAO;IAChB,UAAA,oBAAC,MAAD;KAAM,SAAS;KAAG,QAAQ;KAAG,QAAQ;KAAG,MAAK;KAC3C,UAAA,qBAAC,MAAD,EAAA,UAAA,CACEH,IAKA,qBAAC,OAAD;MAAO,MAAM;MAAG,YAAY;MAAG,KAAK;MAApC,UAAA,CACEC,IAGAE,EAGK;KACH,CAAA,CAAA,EAAA,CAAA;IACF,CAAA;GACG,CAAA;EACP,CAAA;CACF,CAAA,GAXMF,EAAAA,KAAAA,IAGAE,EAAAA,KAAAA,4BAdZE;AAwBJ;AAGA,MAAM,cAAc,OAAO"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "sanity-plugin-iframe-pane",
3
- "version": "5.0.34",
3
+ "version": "5.0.36",
4
4
  "description": "Display any URL in a View Pane, along with helpful buttons to Copy the URL or open in a new tab",
5
5
  "keywords": [
6
6
  "sanity",
@@ -27,23 +27,24 @@
27
27
  "./package.json": "./package.json"
28
28
  },
29
29
  "dependencies": {
30
- "@sanity/client": "^8.2.0",
30
+ "@sanity/client": "^8.6.1",
31
31
  "@sanity/icons": "^5.2.1",
32
- "@sanity/preview-url-secret": "^4.1.4",
33
- "@sanity/ui": "^4.0.4",
32
+ "@sanity/preview-url-secret": "^4.1.5",
33
+ "@sanity/ui": "^4.0.7",
34
+ "dequal": "^2.0.3",
34
35
  "motion": "^13.1.0",
35
36
  "suspend-react": "^0.1.3"
36
37
  },
37
38
  "devDependencies": {
38
39
  "@sanity/tsconfig": "^2.2.1",
39
- "@sanity/tsdown-config": "^0.26.0",
40
+ "@sanity/tsdown-config": "^0.27.1",
40
41
  "@types/node": "^24.13.3",
41
42
  "@types/react": "^19.2.18",
42
43
  "@types/react-dom": "^19.2.4",
43
- "babel-plugin-react-compiler": "^1.0.0",
44
+ "oxc-transform-react": "^0.147.0",
44
45
  "react": "^19.2.8",
45
46
  "react-dom": "^19.2.8",
46
- "sanity": "^6.10.1",
47
+ "sanity": "^6.11.0",
47
48
  "styled-components": "^6.5.3",
48
49
  "tsdown": "^0.22.14"
49
50
  },