sanity-plugin-iframe-pane 5.0.20 → 5.0.22

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.
package/dist/index.js CHANGED
@@ -1,424 +1,539 @@
1
- import { jsx, jsxs, Fragment } from "react/jsx-runtime";
2
1
  import { c } from "react/compiler-runtime";
3
2
  import { WarningOutlineIcon } from "@sanity/icons/WarningOutline";
4
3
  import { createPreviewSecret } from "@sanity/preview-url-secret/create-secret";
5
4
  import { definePreviewUrl } from "@sanity/preview-url-secret/define-preview-url";
6
- import { Text, useToast, Button, Flex, Tooltip, Box, Card, usePrefersReducedMotion, Container, Stack, Spinner } from "@sanity/ui";
7
- import { motion, MotionConfig, AnimatePresence } from "motion/react";
8
- import { useRef, useState, memo, useEffect, useTransition, Suspense } from "react";
9
- import { useActiveWorkspace, useCurrentUser, useClient, usePerspective } from "sanity";
5
+ import { Box, Button, Card, Container, Flex, Spinner, Stack, Text, Tooltip, usePrefersReducedMotion, useToast } from "@sanity/ui";
6
+ import { AnimatePresence, MotionConfig, motion } from "motion/react";
7
+ import { Suspense, memo, useEffect, useRef, useState, useTransition } from "react";
8
+ import { useActiveWorkspace, useClient, useCurrentUser, usePerspective } from "sanity";
10
9
  import { suspend } from "suspend-react";
11
10
  import { CopyIcon } from "@sanity/icons/Copy";
12
11
  import { LaunchIcon } from "@sanity/icons/Launch";
13
12
  import { MobileDeviceIcon } from "@sanity/icons/MobileDevice";
14
13
  import { RefreshIcon } from "@sanity/icons/Refresh";
15
14
  import { getRedirectTo } from "@sanity/preview-url-secret/get-redirect-to";
15
+ import { Fragment, jsx, jsxs } from "react/jsx-runtime";
16
16
  function DisplayUrl(props) {
17
- const $ = c(4);
18
- let t0;
19
- $[0] !== props.url ? (t0 = getRedirectTo(props.url), $[0] = props.url, $[1] = t0) : t0 = $[1];
20
- const url = t0, truncatedUrl = `${url.origin === location.origin ? "" : url.origin}${url.pathname}${url.search}`;
21
- let t1;
22
- return $[2] !== truncatedUrl ? (t1 = /* @__PURE__ */ jsx(Text, { size: 0, textOverflow: "ellipsis", children: truncatedUrl }), $[2] = truncatedUrl, $[3] = t1) : t1 = $[3], t1;
17
+ let $ = c(4), t0;
18
+ $[0] === props.url ? t0 = $[1] : (t0 = getRedirectTo(props.url), $[0] = props.url, $[1] = t0);
19
+ let url = t0, truncatedUrl = `${url.origin === location.origin ? "" : url.origin}${url.pathname}${url.search}`, t1;
20
+ return $[2] === truncatedUrl ? t1 = $[3] : (t1 = /* @__PURE__ */ jsx(Text, {
21
+ size: 0,
22
+ textOverflow: "ellipsis",
23
+ children: truncatedUrl
24
+ }), $[2] = truncatedUrl, $[3] = t1), t1;
23
25
  }
24
26
  const sizes = {
25
- desktop: {
26
- width: "100%",
27
- height: "100%"
28
- },
29
- mobile: {
30
- width: 414,
31
- height: 746
32
- }
27
+ desktop: {
28
+ width: "100%",
29
+ height: "100%"
30
+ },
31
+ mobile: {
32
+ width: 414,
33
+ height: 746
34
+ }
33
35
  }, DEFAULT_SIZE = "desktop";
34
36
  function Toolbar(props) {
35
- const $ = c(60), {
36
- url,
37
- iframeSize,
38
- setIframeSize,
39
- reloading,
40
- showUrl,
41
- reloadButton,
42
- handleReload
43
- } = props, validUrl = url instanceof URL, input = useRef(null), {
44
- push: pushToast
45
- } = useToast(), [, copy] = useCopyToClipboard();
46
- let t0;
47
- $[0] === /* @__PURE__ */ Symbol.for("react.memo_cache_sentinel") ? (t0 = {
48
- position: "absolute",
49
- pointerEvents: "none",
50
- opacity: 0
51
- }, $[0] = t0) : t0 = $[0];
52
- let t1;
53
- $[1] !== url || $[2] !== validUrl ? (t1 = validUrl ? url.toString() : "", $[1] = url, $[2] = validUrl, $[3] = t1) : t1 = $[3];
54
- let t2;
55
- $[4] !== t1 ? (t2 = /* @__PURE__ */ jsx("textarea", { "aria-hidden": !0, style: t0, ref: input, value: t1, readOnly: !0, tabIndex: -1 }), $[4] = t1, $[5] = t2) : t2 = $[5];
56
- let t3;
57
- $[6] === /* @__PURE__ */ Symbol.for("react.memo_cache_sentinel") ? (t3 = {
58
- whiteSpace: "nowrap"
59
- }, $[6] = t3) : t3 = $[6];
60
- const t4 = iframeSize === "mobile" ? "Exit mobile preview" : "Preview mobile viewport";
61
- let t5;
62
- $[7] !== t4 ? (t5 = /* @__PURE__ */ jsx(Text, { size: 1, style: t3, children: t4 }), $[7] = t4, $[8] = t5) : t5 = $[8];
63
- const t6 = !validUrl;
64
- let t7;
65
- $[9] === /* @__PURE__ */ Symbol.for("react.memo_cache_sentinel") ? (t7 = [1], $[9] = t7) : t7 = $[9];
66
- const t8 = iframeSize === "mobile" ? "default" : "ghost";
67
- let t9;
68
- $[10] !== iframeSize || $[11] !== setIframeSize ? (t9 = () => setIframeSize(iframeSize === "mobile" ? "desktop" : "mobile"), $[10] = iframeSize, $[11] = setIframeSize, $[12] = t9) : t9 = $[12];
69
- let t10;
70
- $[13] !== t6 || $[14] !== t8 || $[15] !== t9 ? (t10 = /* @__PURE__ */ jsx(Button, { disabled: t6, fontSize: t7, padding: 2, mode: t8, icon: MobileDeviceIcon, onClick: t9 }), $[13] = t6, $[14] = t8, $[15] = t9, $[16] = t10) : t10 = $[16];
71
- let t11;
72
- $[17] !== t10 || $[18] !== t5 ? (t11 = /* @__PURE__ */ jsx(Flex, { align: "center", gap: 1, children: /* @__PURE__ */ jsx(Tooltip, { animate: !0, content: t5, padding: 2, placement: "bottom-start", children: t10 }) }), $[17] = t10, $[18] = t5, $[19] = t11) : t11 = $[19];
73
- let t12;
74
- $[20] !== showUrl || $[21] !== url || $[22] !== validUrl ? (t12 = showUrl && validUrl && /* @__PURE__ */ jsx(DisplayUrl, { url }), $[20] = showUrl, $[21] = url, $[22] = validUrl, $[23] = t12) : t12 = $[23];
75
- let t13;
76
- $[24] !== t12 ? (t13 = /* @__PURE__ */ jsx(Box, { flex: 1, children: t12 }), $[24] = t12, $[25] = t13) : t13 = $[25];
77
- let t14;
78
- $[26] !== handleReload || $[27] !== reloadButton || $[28] !== reloading || $[29] !== validUrl ? (t14 = reloadButton ? /* @__PURE__ */ jsx(Tooltip, { animate: !0, content: /* @__PURE__ */ jsx(Text, { size: 1, style: {
79
- whiteSpace: "nowrap"
80
- }, children: reloading ? "Reloading\u2026" : "Reload" }), padding: 2, children: /* @__PURE__ */ jsx(Button, { disabled: !validUrl, mode: "bleed", fontSize: [1], padding: 2, icon: RefreshIcon, loading: reloading, "aria-label": "Reload", onClick: () => handleReload() }) }) : null, $[26] = handleReload, $[27] = reloadButton, $[28] = reloading, $[29] = validUrl, $[30] = t14) : t14 = $[30];
81
- let t15;
82
- $[31] === /* @__PURE__ */ Symbol.for("react.memo_cache_sentinel") ? (t15 = /* @__PURE__ */ jsx(Text, { size: 1, style: {
83
- whiteSpace: "nowrap"
84
- }, children: "Copy URL" }), $[31] = t15) : t15 = $[31];
85
- const t16 = !validUrl;
86
- let t17;
87
- $[32] === /* @__PURE__ */ Symbol.for("react.memo_cache_sentinel") ? (t17 = [1], $[32] = t17) : t17 = $[32];
88
- let t18;
89
- $[33] === /* @__PURE__ */ Symbol.for("react.memo_cache_sentinel") ? (t18 = [2], $[33] = t18) : t18 = $[33];
90
- let t19;
91
- $[34] !== copy || $[35] !== pushToast ? (t19 = () => {
92
- input?.current?.value && copy(input.current.value).then((copied) => (pushToast(copied ? {
93
- closable: !0,
94
- status: "success",
95
- title: "The URL is copied to the clipboard"
96
- } : {
97
- closable: !0,
98
- status: "error",
99
- title: "Failed to copy the URL to the clipboard"
100
- }), copied));
101
- }, $[34] = copy, $[35] = pushToast, $[36] = t19) : t19 = $[36];
102
- let t20;
103
- $[37] !== t16 || $[38] !== t19 ? (t20 = /* @__PURE__ */ jsx(Tooltip, { animate: !0, content: t15, padding: 2, children: /* @__PURE__ */ jsx(Button, { mode: "bleed", disabled: t16, fontSize: t17, icon: CopyIcon, padding: t18, "aria-label": "Copy URL", onClick: t19 }) }), $[37] = t16, $[38] = t19, $[39] = t20) : t20 = $[39];
104
- let t21;
105
- $[40] === /* @__PURE__ */ Symbol.for("react.memo_cache_sentinel") ? (t21 = /* @__PURE__ */ jsx(Text, { size: 1, style: {
106
- whiteSpace: "nowrap"
107
- }, children: "Open URL in a new tab" }), $[40] = t21) : t21 = $[40];
108
- const t22 = !validUrl;
109
- let t23;
110
- $[41] === /* @__PURE__ */ Symbol.for("react.memo_cache_sentinel") ? (t23 = [1], $[41] = t23) : t23 = $[41];
111
- let t24;
112
- $[42] === /* @__PURE__ */ Symbol.for("react.memo_cache_sentinel") ? (t24 = [2], $[42] = t24) : t24 = $[42];
113
- let t25;
114
- $[43] !== url || $[44] !== validUrl ? (t25 = validUrl ? () => window.open(url.toString()) : void 0, $[43] = url, $[44] = validUrl, $[45] = t25) : t25 = $[45];
115
- let t26;
116
- $[46] !== t22 || $[47] !== t25 ? (t26 = /* @__PURE__ */ jsx(Tooltip, { animate: !0, content: t21, padding: 2, placement: "bottom-end", children: /* @__PURE__ */ jsx(Button, { disabled: t22, fontSize: t23, icon: LaunchIcon, mode: "ghost", paddingY: t24, text: "Open", "aria-label": "Open URL in a new tab", onClick: t25 }) }), $[46] = t22, $[47] = t25, $[48] = t26) : t26 = $[48];
117
- let t27;
118
- $[49] !== t14 || $[50] !== t20 || $[51] !== t26 ? (t27 = /* @__PURE__ */ jsxs(Flex, { align: "center", gap: 1, children: [
119
- t14,
120
- t20,
121
- t26
122
- ] }), $[49] = t14, $[50] = t20, $[51] = t26, $[52] = t27) : t27 = $[52];
123
- let t28;
124
- $[53] !== t11 || $[54] !== t13 || $[55] !== t27 ? (t28 = /* @__PURE__ */ jsx(Card, { padding: 2, borderBottom: !0, children: /* @__PURE__ */ jsxs(Flex, { align: "center", gap: 2, children: [
125
- t11,
126
- t13,
127
- t27
128
- ] }) }), $[53] = t11, $[54] = t13, $[55] = t27, $[56] = t28) : t28 = $[56];
129
- let t29;
130
- return $[57] !== t2 || $[58] !== t28 ? (t29 = /* @__PURE__ */ jsxs(Fragment, { children: [
131
- t2,
132
- t28
133
- ] }), $[57] = t2, $[58] = t28, $[59] = t29) : t29 = $[59], t29;
37
+ let $ = c(60), { url, iframeSize, setIframeSize, reloading, showUrl, reloadButton, handleReload } = props, validUrl = url instanceof URL, input = useRef(null), { push: pushToast } = useToast(), [, copy] = useCopyToClipboard(), t0;
38
+ $[0] === Symbol.for("react.memo_cache_sentinel") ? (t0 = {
39
+ position: "absolute",
40
+ pointerEvents: "none",
41
+ opacity: 0
42
+ }, $[0] = t0) : t0 = $[0];
43
+ let t1;
44
+ $[1] !== url || $[2] !== validUrl ? (t1 = validUrl ? url.toString() : "", $[1] = url, $[2] = validUrl, $[3] = t1) : t1 = $[3];
45
+ let t2;
46
+ $[4] === t1 ? t2 = $[5] : (t2 = /* @__PURE__ */ jsx("textarea", {
47
+ "aria-hidden": !0,
48
+ style: t0,
49
+ ref: input,
50
+ value: t1,
51
+ readOnly: !0,
52
+ tabIndex: -1
53
+ }), $[4] = t1, $[5] = t2);
54
+ let t3;
55
+ $[6] === Symbol.for("react.memo_cache_sentinel") ? (t3 = { whiteSpace: "nowrap" }, $[6] = t3) : t3 = $[6];
56
+ let t4 = iframeSize === "mobile" ? "Exit mobile preview" : "Preview mobile viewport", t5;
57
+ $[7] === t4 ? t5 = $[8] : (t5 = /* @__PURE__ */ jsx(Text, {
58
+ size: 1,
59
+ style: t3,
60
+ children: t4
61
+ }), $[7] = t4, $[8] = t5);
62
+ let t6 = !validUrl, t7;
63
+ $[9] === Symbol.for("react.memo_cache_sentinel") ? (t7 = [1], $[9] = t7) : t7 = $[9];
64
+ let t8 = iframeSize === "mobile" ? "default" : "ghost", t9;
65
+ $[10] !== iframeSize || $[11] !== setIframeSize ? (t9 = () => setIframeSize(iframeSize === "mobile" ? "desktop" : "mobile"), $[10] = iframeSize, $[11] = setIframeSize, $[12] = t9) : t9 = $[12];
66
+ let t10;
67
+ $[13] !== t6 || $[14] !== t8 || $[15] !== t9 ? (t10 = /* @__PURE__ */ jsx(Button, {
68
+ disabled: t6,
69
+ fontSize: t7,
70
+ padding: 2,
71
+ mode: t8,
72
+ icon: MobileDeviceIcon,
73
+ onClick: t9
74
+ }), $[13] = t6, $[14] = t8, $[15] = t9, $[16] = t10) : t10 = $[16];
75
+ let t11;
76
+ $[17] !== t10 || $[18] !== t5 ? (t11 = /* @__PURE__ */ jsx(Flex, {
77
+ align: "center",
78
+ gap: 1,
79
+ children: /* @__PURE__ */ jsx(Tooltip, {
80
+ animate: !0,
81
+ content: t5,
82
+ padding: 2,
83
+ placement: "bottom-start",
84
+ children: t10
85
+ })
86
+ }), $[17] = t10, $[18] = t5, $[19] = t11) : t11 = $[19];
87
+ let t12;
88
+ $[20] !== showUrl || $[21] !== url || $[22] !== validUrl ? (t12 = showUrl && validUrl && /* @__PURE__ */ jsx(DisplayUrl, { url }), $[20] = showUrl, $[21] = url, $[22] = validUrl, $[23] = t12) : t12 = $[23];
89
+ let t13;
90
+ $[24] === t12 ? t13 = $[25] : (t13 = /* @__PURE__ */ jsx(Box, {
91
+ flex: 1,
92
+ children: t12
93
+ }), $[24] = t12, $[25] = t13);
94
+ let t14;
95
+ $[26] !== handleReload || $[27] !== reloadButton || $[28] !== reloading || $[29] !== validUrl ? (t14 = reloadButton ? /* @__PURE__ */ jsx(Tooltip, {
96
+ animate: !0,
97
+ content: /* @__PURE__ */ jsx(Text, {
98
+ size: 1,
99
+ style: { whiteSpace: "nowrap" },
100
+ children: reloading ? "Reloading…" : "Reload"
101
+ }),
102
+ padding: 2,
103
+ children: /* @__PURE__ */ jsx(Button, {
104
+ disabled: !validUrl,
105
+ mode: "bleed",
106
+ fontSize: [1],
107
+ padding: 2,
108
+ icon: RefreshIcon,
109
+ loading: reloading,
110
+ "aria-label": "Reload",
111
+ onClick: () => handleReload()
112
+ })
113
+ }) : null, $[26] = handleReload, $[27] = reloadButton, $[28] = reloading, $[29] = validUrl, $[30] = t14) : t14 = $[30];
114
+ let t15;
115
+ $[31] === Symbol.for("react.memo_cache_sentinel") ? (t15 = /* @__PURE__ */ jsx(Text, {
116
+ size: 1,
117
+ style: { whiteSpace: "nowrap" },
118
+ children: "Copy URL"
119
+ }), $[31] = t15) : t15 = $[31];
120
+ let t16 = !validUrl, t17;
121
+ $[32] === Symbol.for("react.memo_cache_sentinel") ? (t17 = [1], $[32] = t17) : t17 = $[32];
122
+ let t18;
123
+ $[33] === Symbol.for("react.memo_cache_sentinel") ? (t18 = [2], $[33] = t18) : t18 = $[33];
124
+ let t19;
125
+ $[34] !== copy || $[35] !== pushToast ? (t19 = () => {
126
+ input?.current?.value && copy(input.current.value).then((copied) => (pushToast(copied ? {
127
+ closable: !0,
128
+ status: "success",
129
+ title: "The URL is copied to the clipboard"
130
+ } : {
131
+ closable: !0,
132
+ status: "error",
133
+ title: "Failed to copy the URL to the clipboard"
134
+ }), copied));
135
+ }, $[34] = copy, $[35] = pushToast, $[36] = t19) : t19 = $[36];
136
+ let t20;
137
+ $[37] !== t16 || $[38] !== t19 ? (t20 = /* @__PURE__ */ jsx(Tooltip, {
138
+ animate: !0,
139
+ content: t15,
140
+ padding: 2,
141
+ children: /* @__PURE__ */ jsx(Button, {
142
+ mode: "bleed",
143
+ disabled: t16,
144
+ fontSize: t17,
145
+ icon: CopyIcon,
146
+ padding: t18,
147
+ "aria-label": "Copy URL",
148
+ onClick: t19
149
+ })
150
+ }), $[37] = t16, $[38] = t19, $[39] = t20) : t20 = $[39];
151
+ let t21;
152
+ $[40] === Symbol.for("react.memo_cache_sentinel") ? (t21 = /* @__PURE__ */ jsx(Text, {
153
+ size: 1,
154
+ style: { whiteSpace: "nowrap" },
155
+ children: "Open URL in a new tab"
156
+ }), $[40] = t21) : t21 = $[40];
157
+ let t22 = !validUrl, t23;
158
+ $[41] === Symbol.for("react.memo_cache_sentinel") ? (t23 = [1], $[41] = t23) : t23 = $[41];
159
+ let t24;
160
+ $[42] === Symbol.for("react.memo_cache_sentinel") ? (t24 = [2], $[42] = t24) : t24 = $[42];
161
+ let t25;
162
+ $[43] !== url || $[44] !== validUrl ? (t25 = validUrl ? () => window.open(url.toString()) : void 0, $[43] = url, $[44] = validUrl, $[45] = t25) : t25 = $[45];
163
+ let t26;
164
+ $[46] !== t22 || $[47] !== t25 ? (t26 = /* @__PURE__ */ jsx(Tooltip, {
165
+ animate: !0,
166
+ content: t21,
167
+ padding: 2,
168
+ placement: "bottom-end",
169
+ children: /* @__PURE__ */ jsx(Button, {
170
+ disabled: t22,
171
+ fontSize: t23,
172
+ icon: LaunchIcon,
173
+ mode: "ghost",
174
+ paddingY: t24,
175
+ text: "Open",
176
+ "aria-label": "Open URL in a new tab",
177
+ onClick: t25
178
+ })
179
+ }), $[46] = t22, $[47] = t25, $[48] = t26) : t26 = $[48];
180
+ let t27;
181
+ $[49] !== t14 || $[50] !== t20 || $[51] !== t26 ? (t27 = /* @__PURE__ */ jsxs(Flex, {
182
+ align: "center",
183
+ gap: 1,
184
+ children: [
185
+ t14,
186
+ t20,
187
+ t26
188
+ ]
189
+ }), $[49] = t14, $[50] = t20, $[51] = t26, $[52] = t27) : t27 = $[52];
190
+ let t28;
191
+ $[53] !== t11 || $[54] !== t13 || $[55] !== t27 ? (t28 = /* @__PURE__ */ jsx(Card, {
192
+ padding: 2,
193
+ borderBottom: !0,
194
+ children: /* @__PURE__ */ jsxs(Flex, {
195
+ align: "center",
196
+ gap: 2,
197
+ children: [
198
+ t11,
199
+ t13,
200
+ t27
201
+ ]
202
+ })
203
+ }), $[53] = t11, $[54] = t13, $[55] = t27, $[56] = t28) : t28 = $[56];
204
+ let t29;
205
+ return $[57] !== t2 || $[58] !== t28 ? (t29 = /* @__PURE__ */ jsxs(Fragment, { children: [t2, t28] }), $[57] = t2, $[58] = t28, $[59] = t29) : t29 = $[59], t29;
134
206
  }
135
207
  function useCopyToClipboard() {
136
- const $ = c(3), [copiedText, setCopiedText] = useState(null);
137
- let t0;
138
- $[0] === /* @__PURE__ */ Symbol.for("react.memo_cache_sentinel") ? (t0 = async (text) => {
139
- if (!navigator?.clipboard)
140
- return console.warn("Clipboard not supported"), !1;
141
- try {
142
- return await navigator.clipboard.writeText(text), setCopiedText(text), !0;
143
- } catch (t12) {
144
- return console.warn("Copy failed", t12), setCopiedText(null), !1;
145
- }
146
- }, $[0] = t0) : t0 = $[0];
147
- const copy = t0;
148
- let t1;
149
- return $[1] !== copiedText ? (t1 = [copiedText, copy], $[1] = copiedText, $[2] = t1) : t1 = $[2], t1;
208
+ let $ = c(3), [copiedText, setCopiedText] = useState(null), t0;
209
+ $[0] === Symbol.for("react.memo_cache_sentinel") ? (t0 = async (text) => {
210
+ if (!navigator?.clipboard) return console.warn("Clipboard not supported"), !1;
211
+ try {
212
+ return await navigator.clipboard.writeText(text), setCopiedText(text), !0;
213
+ } catch (t1) {
214
+ return console.warn("Copy failed", t1), setCopiedText(null), !1;
215
+ }
216
+ }, $[0] = t0) : t0 = $[0];
217
+ let copy = t0, t1;
218
+ return $[1] === copiedText ? t1 = $[2] : (t1 = [copiedText, copy], $[1] = copiedText, $[2] = t1), t1;
150
219
  }
151
220
  const MotionFlex = motion.create(Flex);
152
221
  function encodeStudioPerspective(studioPerspective) {
153
- return Array.isArray(studioPerspective) ? studioPerspective.join(",") : studioPerspective;
222
+ return Array.isArray(studioPerspective) ? studioPerspective.join(",") : studioPerspective;
154
223
  }
155
224
  function Iframe(props) {
156
- const $ = c(36), {
157
- document,
158
- options
159
- } = props, draft = document.draft || document.published || document.displayed, {
160
- defaultSize: t0,
161
- reload,
162
- attributes,
163
- showDisplayUrl: t1,
164
- key
165
- } = options, defaultSize = t0 === void 0 ? DEFAULT_SIZE : t0, showDisplayUrl = t1 === void 0 ? !0 : t1, basePath = useActiveWorkspace()?.activeWorkspace?.basePath || "/", urlRef = useRef(options.url);
166
- let t2;
167
- $[0] !== draft || $[1] !== key ? (t2 = () => ({
168
- key,
169
- draft
170
- }), $[0] = draft, $[1] = key, $[2] = t2) : t2 = $[2];
171
- const [draftSnapshot, setDraftSnapshot] = useState(t2);
172
- let t3, t4;
173
- $[3] !== options.url ? (t3 = () => {
174
- urlRef.current = options.url;
175
- }, t4 = [options.url], $[3] = options.url, $[4] = t3, $[5] = t4) : (t3 = $[4], t4 = $[5]), useEffect(t3, t4);
176
- const currentUser = useCurrentUser();
177
- let t5;
178
- $[6] === /* @__PURE__ */ Symbol.for("react.memo_cache_sentinel") ? (t5 = {
179
- apiVersion: "2023-10-16"
180
- }, $[6] = t5) : t5 = $[6];
181
- const client = useClient(t5), [expiresAt, setExpiresAt] = useState(), previewSecretRef = useRef(void 0), [isResolvingUrl, startTransition] = useTransition(), {
182
- perspectiveStack,
183
- selectedPerspectiveName
184
- } = usePerspective();
185
- let t6;
186
- $[7] !== perspectiveStack || $[8] !== selectedPerspectiveName ? (t6 = {
187
- perspectiveStack,
188
- selectedPerspectiveName
189
- }, $[7] = perspectiveStack, $[8] = selectedPerspectiveName, $[9] = t6) : t6 = $[9];
190
- const perspective = t6;
191
- let t7, t8;
192
- $[10] !== draft || $[11] !== draftSnapshot || $[12] !== key ? (t7 = () => {
193
- JSON.stringify({
194
- key,
195
- draft
196
- }) !== JSON.stringify(draftSnapshot) && startTransition(() => setDraftSnapshot({
197
- key,
198
- draft
199
- }));
200
- }, t8 = [draft, draftSnapshot, key, startTransition], $[10] = draft, $[11] = draftSnapshot, $[12] = key, $[13] = t7, $[14] = t8) : (t7 = $[13], t8 = $[14]), useEffect(t7, t8);
201
- let t9;
202
- $[15] !== basePath || $[16] !== client || $[17] !== currentUser?.id || $[18] !== perspective ? (t9 = async (draft_0) => {
203
- if (typeof location > "u")
204
- return;
205
- const urlProp = urlRef.current;
206
- if (typeof urlProp == "string")
207
- return new URL(urlProp, location.origin);
208
- if (typeof urlProp == "function") {
209
- const url = await urlProp(draft_0, perspective);
210
- return typeof url == "string" ? new URL(url, location.origin) : url;
211
- }
212
- if (typeof urlProp == "object") {
213
- const preview = typeof urlProp.preview == "function" ? await urlProp.preview(draft_0, perspective) : urlProp.preview;
214
- if (typeof preview != "string")
215
- return preview;
216
- if (!previewSecretRef.current) {
217
- const {
218
- secret,
219
- expiresAt: expiresAt_0
220
- } = await createPreviewSecret(client, "sanity-plugin-iframe-pane", location.href, currentUser?.id);
221
- previewSecretRef.current = secret, startTransition(() => setExpiresAt(expiresAt_0.getTime()));
222
- }
223
- const url_0 = await definePreviewUrl({
224
- origin: urlProp.origin === "same-origin" ? location.origin : urlProp.origin,
225
- preview,
226
- draftMode: {
227
- enable: urlProp.draftMode
228
- }
229
- })({
230
- client,
231
- previewUrlSecret: previewSecretRef.current,
232
- previewSearchParam: null,
233
- studioBasePath: basePath,
234
- studioPreviewPerspective: encodeStudioPerspective(perspective.perspectiveStack)
235
- });
236
- return new URL(url_0, location.origin);
237
- }
238
- }, $[15] = basePath, $[16] = client, $[17] = currentUser?.id, $[18] = perspective, $[19] = t9) : t9 = $[19], currentUser?.id;
239
- const url_1 = t9;
240
- let t10, t11;
241
- $[20] !== expiresAt ? (t10 = () => {
242
- if (expiresAt) {
243
- const timeout = setTimeout(() => {
244
- startTransition(() => setExpiresAt(void 0)), previewSecretRef.current = void 0;
245
- }, Math.max(0, expiresAt - Date.now()));
246
- return () => clearTimeout(timeout);
247
- }
248
- }, t11 = [expiresAt], $[20] = expiresAt, $[21] = t10, $[22] = t11) : (t10 = $[21], t11 = $[22]), useEffect(t10, t11);
249
- let t12;
250
- $[23] === /* @__PURE__ */ Symbol.for("react.memo_cache_sentinel") ? (t12 = /* @__PURE__ */ jsx(Loading, { iframeSize: "desktop" }), $[23] = t12) : t12 = $[23];
251
- const t13 = `${draftSnapshot.key}-${selectedPerspectiveName || "draft"}`, t14 = currentUser?.id;
252
- let t15;
253
- 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, { fallback: t12, children: /* @__PURE__ */ jsx(IframeInner, { _key: draftSnapshot.key, draftSnapshot: draftSnapshot.draft, url: url_1, isResolvingUrl, attributes, perspective, defaultSize, reload, showDisplayUrl, userId: t14 }, t13) }), $[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;
225
+ 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 ? !0 : t1, basePath = useActiveWorkspace()?.activeWorkspace?.basePath || "/", urlRef = useRef(options.url), t2;
226
+ $[0] !== draft || $[1] !== key ? (t2 = () => ({
227
+ key,
228
+ draft
229
+ }), $[0] = draft, $[1] = key, $[2] = t2) : t2 = $[2];
230
+ let [draftSnapshot, setDraftSnapshot] = useState(t2), t3, t4;
231
+ $[3] === options.url ? (t3 = $[4], t4 = $[5]) : (t3 = () => {
232
+ urlRef.current = options.url;
233
+ }, t4 = [options.url], $[3] = options.url, $[4] = t3, $[5] = t4), useEffect(t3, t4);
234
+ let currentUser = useCurrentUser(), t5;
235
+ $[6] === Symbol.for("react.memo_cache_sentinel") ? (t5 = { apiVersion: "2023-10-16" }, $[6] = t5) : t5 = $[6];
236
+ let client = useClient(t5), [expiresAt, setExpiresAt] = useState(), previewSecretRef = useRef(void 0), [isResolvingUrl, startTransition] = useTransition(), { perspectiveStack, selectedPerspectiveName } = usePerspective(), t6;
237
+ $[7] !== perspectiveStack || $[8] !== selectedPerspectiveName ? (t6 = {
238
+ perspectiveStack,
239
+ selectedPerspectiveName
240
+ }, $[7] = perspectiveStack, $[8] = selectedPerspectiveName, $[9] = t6) : t6 = $[9];
241
+ let perspective = t6, t7, t8;
242
+ $[10] !== draft || $[11] !== draftSnapshot || $[12] !== key ? (t7 = () => {
243
+ JSON.stringify({
244
+ key,
245
+ draft
246
+ }) !== JSON.stringify(draftSnapshot) && startTransition(() => setDraftSnapshot({
247
+ key,
248
+ draft
249
+ }));
250
+ }, t8 = [
251
+ draft,
252
+ draftSnapshot,
253
+ key,
254
+ startTransition
255
+ ], $[10] = draft, $[11] = draftSnapshot, $[12] = key, $[13] = t7, $[14] = t8) : (t7 = $[13], t8 = $[14]), useEffect(t7, t8);
256
+ let t9;
257
+ $[15] !== basePath || $[16] !== client || $[17] !== currentUser?.id || $[18] !== perspective ? (t9 = async (draft_0) => {
258
+ if (typeof location > "u") return;
259
+ let urlProp = urlRef.current;
260
+ if (typeof urlProp == "string") return new URL(urlProp, location.origin);
261
+ if (typeof urlProp == "function") {
262
+ let url = await urlProp(draft_0, perspective);
263
+ return typeof url == "string" ? new URL(url, location.origin) : url;
264
+ }
265
+ if (typeof urlProp == "object") {
266
+ let preview = typeof urlProp.preview == "function" ? await urlProp.preview(draft_0, perspective) : urlProp.preview;
267
+ if (typeof preview != "string") return preview;
268
+ if (!previewSecretRef.current) {
269
+ let { secret, expiresAt: expiresAt_0 } = await createPreviewSecret(client, "sanity-plugin-iframe-pane", location.href, currentUser?.id);
270
+ previewSecretRef.current = secret, startTransition(() => setExpiresAt(expiresAt_0.getTime()));
271
+ }
272
+ let url_0 = await definePreviewUrl({
273
+ origin: urlProp.origin === "same-origin" ? location.origin : urlProp.origin,
274
+ preview,
275
+ draftMode: { enable: urlProp.draftMode }
276
+ })({
277
+ client,
278
+ previewUrlSecret: previewSecretRef.current,
279
+ previewSearchParam: null,
280
+ studioBasePath: basePath,
281
+ studioPreviewPerspective: encodeStudioPerspective(perspective.perspectiveStack)
282
+ });
283
+ return new URL(url_0, location.origin);
284
+ }
285
+ }, $[15] = basePath, $[16] = client, $[17] = currentUser?.id, $[18] = perspective, $[19] = t9) : t9 = $[19], currentUser?.id;
286
+ let url_1 = t9, t10, t11;
287
+ $[20] === expiresAt ? (t10 = $[21], t11 = $[22]) : (t10 = () => {
288
+ if (expiresAt) {
289
+ let timeout = setTimeout(() => {
290
+ startTransition(() => setExpiresAt(void 0)), previewSecretRef.current = void 0;
291
+ }, Math.max(0, expiresAt - Date.now()));
292
+ return () => clearTimeout(timeout);
293
+ }
294
+ }, t11 = [expiresAt], $[20] = expiresAt, $[21] = t10, $[22] = t11), useEffect(t10, t11);
295
+ let t12;
296
+ $[23] === Symbol.for("react.memo_cache_sentinel") ? (t12 = /* @__PURE__ */ jsx(Loading, { iframeSize: "desktop" }), $[23] = t12) : t12 = $[23];
297
+ let t13 = `${draftSnapshot.key}-${selectedPerspectiveName || "draft"}`, t14 = currentUser?.id, t15;
298
+ 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, {
299
+ fallback: t12,
300
+ children: /* @__PURE__ */ jsx(IframeInner, {
301
+ _key: draftSnapshot.key,
302
+ draftSnapshot: draftSnapshot.draft,
303
+ url: url_1,
304
+ isResolvingUrl,
305
+ attributes,
306
+ perspective,
307
+ defaultSize,
308
+ reload,
309
+ showDisplayUrl,
310
+ userId: t14
311
+ }, t13)
312
+ }), $[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;
254
313
  }
255
314
  const IframeInner = memo(function(props) {
256
- const $ = c(35), {
257
- isResolvingUrl,
258
- defaultSize: t0,
259
- reload,
260
- attributes: t1,
261
- showDisplayUrl: t2,
262
- draftSnapshot,
263
- userId,
264
- expiresAt,
265
- perspective: t3,
266
- _key
267
- } = props, defaultSize = t0 === void 0 ? DEFAULT_SIZE : t0;
268
- let t4;
269
- $[0] !== t1 ? (t4 = t1 === void 0 ? {} : t1, $[0] = t1, $[1] = t4) : t4 = $[1];
270
- const attributes = t4, showDisplayUrl = t2 === void 0 ? !0 : t2, {
271
- selectedPerspectiveName,
272
- perspectiveStack
273
- } = t3, [iframeSize, setIframeSize] = useState(sizes?.[defaultSize] ? defaultSize : DEFAULT_SIZE), prefersReducedMotion = usePrefersReducedMotion();
274
- let t5;
275
- $[2] !== draftSnapshot || $[3] !== props ? (t5 = () => props.url(draftSnapshot), $[2] = draftSnapshot, $[3] = props, $[4] = t5) : t5 = $[4];
276
- let t6;
277
- $[5] !== _key || $[6] !== draftSnapshot || $[7] !== expiresAt || $[8] !== perspectiveStack || $[9] !== selectedPerspectiveName || $[10] !== t5 || $[11] !== userId ? (t6 = suspend(t5, ["sanity-plugin-iframe-pane", draftSnapshot, selectedPerspectiveName, perspectiveStack, userId, expiresAt, _key, resolveUUID]), $[5] = _key, $[6] = draftSnapshot, $[7] = expiresAt, $[8] = perspectiveStack, $[9] = selectedPerspectiveName, $[10] = t5, $[11] = userId, $[12] = t6) : t6 = $[12];
278
- const url = t6, [loading, setLoading] = useState(!0), [_reloading, setReloading] = useState(!1), reloading = _reloading || isResolvingUrl, iframe = useRef(null);
279
- let t7;
280
- $[13] === /* @__PURE__ */ Symbol.for("react.memo_cache_sentinel") ? (t7 = () => {
281
- if (!iframe?.current)
282
- return;
283
- const {
284
- src
285
- } = iframe.current;
286
- iframe.current.src = src, setReloading(!0);
287
- }, $[13] = t7) : t7 = $[13];
288
- const handleReload = t7;
289
- let t8;
290
- $[14] !== prefersReducedMotion ? (t8 = prefersReducedMotion ? {
291
- duration: 0
292
- } : void 0, $[14] = prefersReducedMotion, $[15] = t8) : t8 = $[15];
293
- let t9;
294
- $[16] === /* @__PURE__ */ Symbol.for("react.memo_cache_sentinel") ? (t9 = {
295
- height: "100%"
296
- }, $[16] = t9) : t9 = $[16];
297
- const t10 = !!reload?.button;
298
- let t11;
299
- $[17] !== iframeSize || $[18] !== reloading || $[19] !== showDisplayUrl || $[20] !== t10 || $[21] !== url ? (t11 = /* @__PURE__ */ jsx(Toolbar, { url, iframeSize, reloading, setIframeSize, showUrl: showDisplayUrl, reloadButton: t10, handleReload }), $[17] = iframeSize, $[18] = reloading, $[19] = showDisplayUrl, $[20] = t10, $[21] = url, $[22] = t11) : t11 = $[22];
300
- let t12;
301
- $[23] !== attributes || $[24] !== iframeSize || $[25] !== loading || $[26] !== reloading || $[27] !== url ? (t12 = url instanceof Error ? /* @__PURE__ */ jsx(ErrorCard, { error: url }) : /* @__PURE__ */ jsx(Card, { tone: "transparent", style: {
302
- height: "100%"
303
- }, children: /* @__PURE__ */ jsx(Frame, { ref: iframe, loading, reloading, iframeSize, setReloading, setLoading, url, attributes }) }), $[23] = attributes, $[24] = iframeSize, $[25] = loading, $[26] = reloading, $[27] = url, $[28] = t12) : t12 = $[28];
304
- let t13;
305
- $[29] !== t11 || $[30] !== t12 ? (t13 = /* @__PURE__ */ jsxs(Flex, { direction: "column", style: t9, children: [
306
- t11,
307
- t12
308
- ] }), $[29] = t11, $[30] = t12, $[31] = t13) : t13 = $[31];
309
- let t14;
310
- return $[32] !== t13 || $[33] !== t8 ? (t14 = /* @__PURE__ */ jsx(MotionConfig, { transition: t8, children: t13 }), $[32] = t13, $[33] = t8, $[34] = t14) : t14 = $[34], t14;
315
+ 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;
316
+ $[0] === t1 ? t4 = $[1] : (t4 = t1 === void 0 ? {} : t1, $[0] = t1, $[1] = t4);
317
+ let attributes = t4, showDisplayUrl = t2 === void 0 ? !0 : t2, { selectedPerspectiveName, perspectiveStack } = t3, [iframeSize, setIframeSize] = useState(sizes?.[defaultSize] ? defaultSize : DEFAULT_SIZE), prefersReducedMotion = usePrefersReducedMotion(), t5;
318
+ $[2] !== draftSnapshot || $[3] !== props ? (t5 = () => props.url(draftSnapshot), $[2] = draftSnapshot, $[3] = props, $[4] = t5) : t5 = $[4];
319
+ let t6;
320
+ $[5] !== _key || $[6] !== draftSnapshot || $[7] !== expiresAt || $[8] !== perspectiveStack || $[9] !== selectedPerspectiveName || $[10] !== t5 || $[11] !== userId ? (t6 = suspend(t5, [
321
+ "sanity-plugin-iframe-pane",
322
+ draftSnapshot,
323
+ selectedPerspectiveName,
324
+ perspectiveStack,
325
+ userId,
326
+ expiresAt,
327
+ _key,
328
+ resolveUUID
329
+ ]), $[5] = _key, $[6] = draftSnapshot, $[7] = expiresAt, $[8] = perspectiveStack, $[9] = selectedPerspectiveName, $[10] = t5, $[11] = userId, $[12] = t6) : t6 = $[12];
330
+ let url = t6, [loading, setLoading] = useState(!0), [_reloading, setReloading] = useState(!1), reloading = _reloading || isResolvingUrl, iframe = useRef(null), t7;
331
+ $[13] === Symbol.for("react.memo_cache_sentinel") ? (t7 = () => {
332
+ if (!iframe?.current) return;
333
+ let { src } = iframe.current;
334
+ iframe.current.src = src, setReloading(!0);
335
+ }, $[13] = t7) : t7 = $[13];
336
+ let handleReload = t7, t8;
337
+ $[14] === prefersReducedMotion ? t8 = $[15] : (t8 = prefersReducedMotion ? { duration: 0 } : void 0, $[14] = prefersReducedMotion, $[15] = t8);
338
+ let t9;
339
+ $[16] === Symbol.for("react.memo_cache_sentinel") ? (t9 = { height: "100%" }, $[16] = t9) : t9 = $[16];
340
+ let t10 = !!reload?.button, t11;
341
+ $[17] !== iframeSize || $[18] !== reloading || $[19] !== showDisplayUrl || $[20] !== t10 || $[21] !== url ? (t11 = /* @__PURE__ */ jsx(Toolbar, {
342
+ url,
343
+ iframeSize,
344
+ reloading,
345
+ setIframeSize,
346
+ showUrl: showDisplayUrl,
347
+ reloadButton: t10,
348
+ handleReload
349
+ }), $[17] = iframeSize, $[18] = reloading, $[19] = showDisplayUrl, $[20] = t10, $[21] = url, $[22] = t11) : t11 = $[22];
350
+ let t12;
351
+ $[23] !== attributes || $[24] !== iframeSize || $[25] !== loading || $[26] !== reloading || $[27] !== url ? (t12 = url instanceof Error ? /* @__PURE__ */ jsx(ErrorCard, { error: url }) : /* @__PURE__ */ jsx(Card, {
352
+ tone: "transparent",
353
+ style: { height: "100%" },
354
+ children: /* @__PURE__ */ jsx(Frame, {
355
+ ref: iframe,
356
+ loading,
357
+ reloading,
358
+ iframeSize,
359
+ setReloading,
360
+ setLoading,
361
+ url,
362
+ attributes
363
+ })
364
+ }), $[23] = attributes, $[24] = iframeSize, $[25] = loading, $[26] = reloading, $[27] = url, $[28] = t12) : t12 = $[28];
365
+ let t13;
366
+ $[29] !== t11 || $[30] !== t12 ? (t13 = /* @__PURE__ */ jsxs(Flex, {
367
+ direction: "column",
368
+ style: t9,
369
+ children: [t11, t12]
370
+ }), $[29] = t11, $[30] = t12, $[31] = t13) : t13 = $[31];
371
+ let t14;
372
+ return $[32] !== t13 || $[33] !== t8 ? (t14 = /* @__PURE__ */ jsx(MotionConfig, {
373
+ transition: t8,
374
+ children: t13
375
+ }), $[32] = t13, $[33] = t8, $[34] = t14) : t14 = $[34], t14;
311
376
  });
312
377
  function Frame(props) {
313
- const $ = c(22), {
314
- loading,
315
- setLoading,
316
- iframeSize,
317
- attributes,
318
- reloading,
319
- url,
320
- setReloading,
321
- ref: iframe
322
- } = props;
323
- let t0;
324
- $[0] !== attributes || $[1] !== setLoading || $[2] !== setReloading ? (t0 = function() {
325
- setLoading(!1), setReloading(!1), attributes.onLoad && typeof attributes.onLoad == "function" && attributes.onLoad();
326
- }, $[0] = attributes, $[1] = setLoading, $[2] = setReloading, $[3] = t0) : t0 = $[3];
327
- const handleIframeLoad = t0;
328
- let t1;
329
- $[4] === /* @__PURE__ */ Symbol.for("react.memo_cache_sentinel") ? (t1 = {
330
- height: "100%",
331
- position: "relative"
332
- }, $[4] = t1) : t1 = $[4];
333
- let t2;
334
- $[5] !== iframeSize || $[6] !== loading || $[7] !== url ? (t2 = !url || loading && /* @__PURE__ */ jsx(MotionFlex, { initial: "initial", animate: "animate", exit: "exit", variants: spinnerVariants, justify: "center", align: "center", style: {
335
- inset: "0",
336
- position: "absolute"
337
- }, children: /* @__PURE__ */ jsx(Loading, { iframeSize }) }), $[5] = iframeSize, $[6] = loading, $[7] = url, $[8] = t2) : t2 = $[8];
338
- let t3;
339
- $[9] !== t2 ? (t3 = /* @__PURE__ */ jsx(AnimatePresence, { children: t2 }), $[9] = t2, $[10] = t3) : t3 = $[10];
340
- let t4;
341
- $[11] !== attributes || $[12] !== handleIframeLoad || $[13] !== iframe || $[14] !== iframeSize || $[15] !== loading || $[16] !== reloading || $[17] !== url ? (t4 = url && /* @__PURE__ */ jsx(motion.iframe, { ref: iframe, title: "preview", frameBorder: "0", style: {
342
- maxHeight: "100%"
343
- }, src: url.toString(), initial: ["background", iframeSize], variants: iframeVariants, animate: [loading ? "background" : "active", reloading ? "reloading" : "idle", iframeSize], ...attributes, onLoad: handleIframeLoad }), $[11] = attributes, $[12] = handleIframeLoad, $[13] = iframe, $[14] = iframeSize, $[15] = loading, $[16] = reloading, $[17] = url, $[18] = t4) : t4 = $[18];
344
- let t5;
345
- return $[19] !== t3 || $[20] !== t4 ? (t5 = /* @__PURE__ */ jsxs(Flex, { align: "center", justify: "center", style: t1, children: [
346
- t3,
347
- t4
348
- ] }), $[19] = t3, $[20] = t4, $[21] = t5) : t5 = $[21], t5;
378
+ let $ = c(22), { loading, setLoading, iframeSize, attributes, reloading, url, setReloading, ref: iframe } = props, t0;
379
+ $[0] !== attributes || $[1] !== setLoading || $[2] !== setReloading ? (t0 = function() {
380
+ setLoading(!1), setReloading(!1), attributes.onLoad && typeof attributes.onLoad == "function" && attributes.onLoad();
381
+ }, $[0] = attributes, $[1] = setLoading, $[2] = setReloading, $[3] = t0) : t0 = $[3];
382
+ let handleIframeLoad = t0, t1;
383
+ $[4] === Symbol.for("react.memo_cache_sentinel") ? (t1 = {
384
+ height: "100%",
385
+ position: "relative"
386
+ }, $[4] = t1) : t1 = $[4];
387
+ let t2;
388
+ $[5] !== iframeSize || $[6] !== loading || $[7] !== url ? (t2 = !url || loading && /* @__PURE__ */ jsx(MotionFlex, {
389
+ initial: "initial",
390
+ animate: "animate",
391
+ exit: "exit",
392
+ variants: spinnerVariants,
393
+ justify: "center",
394
+ align: "center",
395
+ style: {
396
+ inset: "0",
397
+ position: "absolute"
398
+ },
399
+ children: /* @__PURE__ */ jsx(Loading, { iframeSize })
400
+ }), $[5] = iframeSize, $[6] = loading, $[7] = url, $[8] = t2) : t2 = $[8];
401
+ let t3;
402
+ $[9] === t2 ? t3 = $[10] : (t3 = /* @__PURE__ */ jsx(AnimatePresence, { children: t2 }), $[9] = t2, $[10] = t3);
403
+ let t4;
404
+ $[11] !== attributes || $[12] !== handleIframeLoad || $[13] !== iframe || $[14] !== iframeSize || $[15] !== loading || $[16] !== reloading || $[17] !== url ? (t4 = url && /* @__PURE__ */ jsx(motion.iframe, {
405
+ ref: iframe,
406
+ title: "preview",
407
+ frameBorder: "0",
408
+ style: { maxHeight: "100%" },
409
+ src: url.toString(),
410
+ initial: ["background", iframeSize],
411
+ variants: iframeVariants,
412
+ animate: [
413
+ loading ? "background" : "active",
414
+ reloading ? "reloading" : "idle",
415
+ iframeSize
416
+ ],
417
+ ...attributes,
418
+ onLoad: handleIframeLoad
419
+ }), $[11] = attributes, $[12] = handleIframeLoad, $[13] = iframe, $[14] = iframeSize, $[15] = loading, $[16] = reloading, $[17] = url, $[18] = t4) : t4 = $[18];
420
+ let t5;
421
+ return $[19] !== t3 || $[20] !== t4 ? (t5 = /* @__PURE__ */ jsxs(Flex, {
422
+ align: "center",
423
+ justify: "center",
424
+ style: t1,
425
+ children: [t3, t4]
426
+ }), $[19] = t3, $[20] = t4, $[21] = t5) : t5 = $[21], t5;
349
427
  }
350
428
  const spinnerVariants = {
351
- initial: {
352
- opacity: 1
353
- },
354
- animate: {
355
- opacity: [0, 0, 1]
356
- },
357
- exit: {
358
- opacity: [1, 0, 0]
359
- }
429
+ initial: { opacity: 1 },
430
+ animate: { opacity: [
431
+ 0,
432
+ 0,
433
+ 1
434
+ ] },
435
+ exit: { opacity: [
436
+ 1,
437
+ 0,
438
+ 0
439
+ ] }
360
440
  }, iframeVariants = {
361
- ...sizes,
362
- desktop: {
363
- ...sizes.desktop,
364
- boxShadow: "0 0 0 0px var(--card-shadow-outline-color)"
365
- },
366
- mobile: {
367
- ...sizes.mobile,
368
- boxShadow: "0 0 0 1px var(--card-shadow-outline-color)"
369
- },
370
- background: {
371
- opacity: 0,
372
- scale: 1
373
- },
374
- idle: {
375
- scale: 1
376
- },
377
- reloading: {
378
- scale: [1, 1, 1, 0.98]
379
- },
380
- active: {
381
- opacity: [0, 0, 1],
382
- scale: 1
383
- }
441
+ ...sizes,
442
+ desktop: {
443
+ ...sizes.desktop,
444
+ boxShadow: "0 0 0 0px var(--card-shadow-outline-color)"
445
+ },
446
+ mobile: {
447
+ ...sizes.mobile,
448
+ boxShadow: "0 0 0 1px var(--card-shadow-outline-color)"
449
+ },
450
+ background: {
451
+ opacity: 0,
452
+ scale: 1
453
+ },
454
+ idle: { scale: 1 },
455
+ reloading: { scale: [
456
+ 1,
457
+ 1,
458
+ 1,
459
+ .98
460
+ ] },
461
+ active: {
462
+ opacity: [
463
+ 0,
464
+ 0,
465
+ 1
466
+ ],
467
+ scale: 1
468
+ }
384
469
  };
385
470
  function Loading(t0) {
386
- const $ = c(6), {
387
- iframeSize
388
- } = t0, t1 = sizes[iframeSize];
389
- let t2;
390
- $[0] !== t1 ? (t2 = {
391
- ...t1
392
- }, $[0] = t1, $[1] = t2) : t2 = $[1];
393
- let t3, t4;
394
- $[2] === /* @__PURE__ */ Symbol.for("react.memo_cache_sentinel") ? (t3 = /* @__PURE__ */ jsx(Spinner, { muted: !0 }), t4 = /* @__PURE__ */ jsx(Text, { muted: !0, size: 1, children: "Loading\u2026" }), $[2] = t3, $[3] = t4) : (t3 = $[2], t4 = $[3]);
395
- let t5;
396
- return $[4] !== t2 ? (t5 = /* @__PURE__ */ jsxs(Flex, { style: t2, justify: "center", align: "center", direction: "column", gap: 4, children: [
397
- t3,
398
- t4
399
- ] }), $[4] = t2, $[5] = t5) : t5 = $[5], t5;
471
+ let $ = c(6), { iframeSize } = t0, t1 = sizes[iframeSize], t2;
472
+ $[0] === t1 ? t2 = $[1] : (t2 = { ...t1 }, $[0] = t1, $[1] = t2);
473
+ let t3, t4;
474
+ $[2] === Symbol.for("react.memo_cache_sentinel") ? (t3 = /* @__PURE__ */ jsx(Spinner, { muted: !0 }), t4 = /* @__PURE__ */ jsx(Text, {
475
+ muted: !0,
476
+ size: 1,
477
+ children: "Loading…"
478
+ }), $[2] = t3, $[3] = t4) : (t3 = $[2], t4 = $[3]);
479
+ let t5;
480
+ return $[4] === t2 ? t5 = $[5] : (t5 = /* @__PURE__ */ jsxs(Flex, {
481
+ style: t2,
482
+ justify: "center",
483
+ align: "center",
484
+ direction: "column",
485
+ gap: 4,
486
+ children: [t3, t4]
487
+ }), $[4] = t2, $[5] = t5), t5;
400
488
  }
401
489
  function ErrorCard(t0) {
402
- const $ = c(8), {
403
- error
404
- } = t0;
405
- let t1;
406
- $[0] === /* @__PURE__ */ Symbol.for("react.memo_cache_sentinel") ? (t1 = /* @__PURE__ */ jsx(Box, { children: /* @__PURE__ */ jsx(Text, { size: 1, children: /* @__PURE__ */ jsx(WarningOutlineIcon, {}) }) }), $[0] = t1) : t1 = $[0];
407
- let t2;
408
- $[1] !== error.name ? (t2 = /* @__PURE__ */ jsx(Text, { as: "h1", size: 1, weight: "bold", children: error.name }), $[1] = error.name, $[2] = t2) : t2 = $[2];
409
- let t3;
410
- $[3] !== error.message ? (t3 = /* @__PURE__ */ jsx(Text, { as: "p", muted: !0, size: 1, children: error.message }), $[3] = error.message, $[4] = t3) : t3 = $[4];
411
- let t4;
412
- return $[5] !== t2 || $[6] !== t3 ? (t4 = /* @__PURE__ */ jsx(Card, { height: "fill", children: /* @__PURE__ */ jsx(Flex, { align: "center", height: "fill", justify: "center", padding: 4, sizing: "border", children: /* @__PURE__ */ jsx(Container, { width: 0, children: /* @__PURE__ */ jsx(Card, { padding: 4, radius: 2, shadow: 1, tone: "caution", children: /* @__PURE__ */ jsxs(Flex, { children: [
413
- t1,
414
- /* @__PURE__ */ jsxs(Stack, { flex: 1, marginLeft: 3, gap: 3, children: [
415
- t2,
416
- t3
417
- ] })
418
- ] }) }) }) }) }), $[5] = t2, $[6] = t3, $[7] = t4) : t4 = $[7], t4;
490
+ let $ = c(8), { error } = t0, t1;
491
+ $[0] === Symbol.for("react.memo_cache_sentinel") ? (t1 = /* @__PURE__ */ jsx(Box, { children: /* @__PURE__ */ jsx(Text, {
492
+ size: 1,
493
+ children: /* @__PURE__ */ jsx(WarningOutlineIcon, {})
494
+ }) }), $[0] = t1) : t1 = $[0];
495
+ let t2;
496
+ $[1] === error.name ? t2 = $[2] : (t2 = /* @__PURE__ */ jsx(Text, {
497
+ as: "h1",
498
+ size: 1,
499
+ weight: "bold",
500
+ children: error.name
501
+ }), $[1] = error.name, $[2] = t2);
502
+ let t3;
503
+ $[3] === error.message ? t3 = $[4] : (t3 = /* @__PURE__ */ jsx(Text, {
504
+ as: "p",
505
+ muted: !0,
506
+ size: 1,
507
+ children: error.message
508
+ }), $[3] = error.message, $[4] = t3);
509
+ let t4;
510
+ return $[5] !== t2 || $[6] !== t3 ? (t4 = /* @__PURE__ */ jsx(Card, {
511
+ height: "fill",
512
+ children: /* @__PURE__ */ jsx(Flex, {
513
+ align: "center",
514
+ height: "fill",
515
+ justify: "center",
516
+ padding: 4,
517
+ sizing: "border",
518
+ children: /* @__PURE__ */ jsx(Container, {
519
+ width: 0,
520
+ children: /* @__PURE__ */ jsx(Card, {
521
+ padding: 4,
522
+ radius: 2,
523
+ shadow: 1,
524
+ tone: "caution",
525
+ children: /* @__PURE__ */ jsxs(Flex, { children: [t1, /* @__PURE__ */ jsxs(Stack, {
526
+ flex: 1,
527
+ marginLeft: 3,
528
+ gap: 3,
529
+ children: [t2, t3]
530
+ })] })
531
+ })
532
+ })
533
+ })
534
+ }), $[5] = t2, $[6] = t3, $[7] = t4) : t4 = $[7], t4;
419
535
  }
420
- const resolveUUID = /* @__PURE__ */ Symbol();
421
- export {
422
- Iframe
423
- };
424
- //# sourceMappingURL=index.js.map
536
+ const resolveUUID = Symbol();
537
+ export { Iframe };
538
+
539
+ //# sourceMappingURL=index.js.map
package/dist/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","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, Tooltip, useToast} from '@sanity/ui'\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 draftMode: {\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"],"names":["DisplayUrl","props","$","_c","t0","url","getRedirectTo","truncatedUrl","origin","location","pathname","search","t1","sizes","desktop","width","height","mobile","DEFAULT_SIZE","Toolbar","iframeSize","setIframeSize","reloading","showUrl","reloadButton","handleReload","validUrl","URL","input","useRef","push","pushToast","useToast","copy","useCopyToClipboard","for","position","pointerEvents","opacity","toString","t2","t3","whiteSpace","t4","t5","t6","t7","Symbol","t8","t9","t10","MobileDeviceIcon","t11","t12","t13","t14","RefreshIcon","t15","t16","t17","t18","t19","current","value","then","copied","closable","status","title","t20","CopyIcon","t21","t22","t23","t24","t25","window","open","undefined","t26","LaunchIcon","t27","t28","t29","copiedText","setCopiedText","useState","text","navigator","clipboard","console","warn","writeText","error","MotionFlex","motion","create","Flex","encodeStudioPerspective","studioPerspective","Array","isArray","join","Iframe","document","options","draft","published","displayed","defaultSize","reload","attributes","showDisplayUrl","key","basePath","useActiveWorkspace","activeWorkspace","urlRef","draftSnapshot","setDraftSnapshot","useEffect","currentUser","useCurrentUser","apiVersion","client","useClient","expiresAt","setExpiresAt","previewSecretRef","isResolvingUrl","startTransition","useTransition","perspectiveStack","selectedPerspectiveName","usePerspective","perspective","JSON","stringify","id","draft_0","urlProp","preview","secret","expiresAt_0","createPreviewSecret","href","getTime","url_0","definePreviewUrl","draftMode","enable","previewUrlSecret","previewSearchParam","studioBasePath","studioPreviewPerspective","url_1","timeout","setTimeout","Math","max","Date","now","clearTimeout","IframeInner","memo","userId","_key","prefersReducedMotion","usePrefersReducedMotion","suspend","resolveUUID","loading","setLoading","_reloading","setReloading","iframe","src","duration","button","Error","Frame","ref","onLoad","handleIframeLoad","spinnerVariants","inset","maxHeight","iframeVariants","initial","animate","exit","boxShadow","background","scale","idle","active","Loading","ErrorCard","name","message"],"mappings":"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"}
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","Tooltip","useToast","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","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, Tooltip, useToast} from '@sanity/ui'\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 draftMode: {\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,SAAOG,WAAAC,OAAA;CAAA,IAAAC,IAAAC,EAAA,CAAA,GAAAC;CAAA,AAAAF,EAAA,OAAAD,MAAAI,MAEiCD,KAAAF,EAAA,MAAxBE,KAAAP,cAAcI,MAAKI,GAAI,GAACH,EAAA,KAAAD,MAAAI,KAAAH,EAAA,KAAAE;CAApC,IAAAC,MAAYD,IADdE,eAEE,GAAUD,IAAGE,WAAYC,SAAQD,SAAvB,KAAsCF,IAAGE,SAAUF,IAAGI,WAAYJ,IAAGK,UAClEC;CAKN,OALMT,EAAA,OAAAI,eAKNK,KAAAT,EAAA,MAFPS,KAAA,oBAAC,MAAD;EAAY,MAAA;EAAgB,cAAA;YACzBL;CADE,CAAA,GAEEJ,EAAA,KAAAI,cAAAJ,EAAA,KAAAS,KAFPA;AAEO;ACHX,MAAakB,QAAmB;CAC9BC,SAAS;EACPC,OAAO;EACPC,QAAQ;CACV;CACAC,QAAQ;EACNF,OAAO;EACPC,QAAQ;CACV;AACF,GAEaE,eAAe;AAW5B,SAAOY,QAAAC,OAAA;CAAA,IAAAC,IAAAC,EAAA,EAAA,GACL,EAAAb,KAAAG,YAAAC,eAAAG,WAAAD,SAAAE,cAAAC,iBAAyFE,OACzFG,WAAiBd,eAAeC,KAEhCc,QAAc3B,OAA4B,IAAI,GAC9C,EAAA4B,MAAAC,cAA0B/B,SAAS,GACnC,GAAAgC,QAAiBC,mBAAmB,GAACC;CAAA,AAAAR,EAAA,OAAAS,OAAAC,IAAA,2BAAA,KAMxBF,KAAA;EAAAG,UAAW;EAAUC,eAAiB;EAAMC,SAAW;CAAC,GAACb,EAAA,KAAAQ,MAAAA,KAAAR,EAAA;CAAA,IAAAc;CAAA,AAAAd,EAAA,OAAAZ,OAAAY,EAAA,OAAAE,YAEzDY,KAAAZ,WAAWd,IAAG2B,SAAe,IAA7B,IAA8Bf,EAAA,KAAAZ,KAAAY,EAAA,KAAAE,UAAAF,EAAA,KAAAc,MAAAA,KAAAd,EAAA;CAAA,IAAAgB;CAAA,AAAAhB,EAAA,OAAAc,KAGrCE,KAAAhB,EAAA,MAPFgB,KAAA,oBAAA,YAAA;EACE,eAAA;EACO,OAAAR;EACFL,KAAAA;EACE,OAAAW;EACP,UAAA;EACU,UAAA;CAAE,CAAA,GACZd,EAAA,KAAAc,IAAAd,EAAA,KAAAgB;CAAA,IAAAC;CAAA,AAAAjB,EAAA,OAAAS,OAAAC,IAAA,2BAAA,KAO8BO,KAAA,EAAAC,YAAa,SAAQ,GAAClB,EAAA,KAAAiB,MAAAA,KAAAjB,EAAA;CACzC,IAAAmB,KAAA5B,eAAe,WAAf,wBAAA,2BAA2E6B;CAAA,AAAApB,EAAA,OAAAmB,KACvEC,KAAApB,EAAA,MAFPoB,KAAA,oBAAC,MAAD;EAAY,MAAA;EAAU,OAAAH;YACnBE;CADE,CAAA,GAEEnB,EAAA,KAAAmB,IAAAnB,EAAA,KAAAoB;CAMG,IAAAC,KAAA,CAACnB,UAAQoB;CAAA,AAAAtB,EAAA,OAAAS,OAAAC,IAAA,2BAAA,KACTY,KAAA,CAAC,CAAC,GAACtB,EAAA,KAAAsB,MAAAA,KAAAtB,EAAA;CAEP,IAAAuB,KAAAhC,eAAe,WAAf,YAAA,SAA6CiC;CAAA,AAAAxB,EAAA,QAAAT,cAAAS,EAAA,QAAAR,iBAE1CgC,WAAMhC,cAAcD,eAAe,WAAf,YAAA,QAA8C,GAACS,EAAA,MAAAT,YAAAS,EAAA,MAAAR,eAAAQ,EAAA,MAAAwB,MAAAA,KAAAxB,EAAA;CAAA,IAAAyB;CAAA,AAAAzB,EAAA,QAAAqB,MAAArB,EAAA,QAAAuB,MAAAvB,EAAA,QAAAwB,MAN9EC,MAAA,oBAAC,QAAD;EACY,UAAAJ;EACA,UAAAC;EACD,SAAA;EACH,MAAAC;EACAzD,MAAAA;EACG,SAAA0D;CAAmE,CAAA,GAC5ExB,EAAA,MAAAqB,IAAArB,EAAA,MAAAuB,IAAAvB,EAAA,MAAAwB,IAAAxB,EAAA,MAAAyB,OAAAA,MAAAzB,EAAA;CAAA,IAAA0B;CAAA,AAAA1B,EAAA,QAAAyB,OAAAzB,EAAA,QAAAoB,MAlBNM,MAAA,oBAAC,MAAD;EAAY,OAAA;EAAc,KAAA;YACxB,oBAAC,SAAD;GACE,SAAA;GAEE,SAAAN;GAIO,SAAA;GACC,WAAA;aAEVK;EAVM,CAAA;CADL,CAAA,GAoBEzB,EAAA,MAAAyB,KAAAzB,EAAA,MAAAoB,IAAApB,EAAA,MAAA0B,OAAAA,MAAA1B,EAAA;CAAA,IAAA2B;CAAA,AAAA3B,EAAA,QAAAN,WAAAM,EAAA,QAAAZ,OAAAY,EAAA,QAAAE,YACQyB,MAAAjC,WAAAQ,YAAuB,oBAAC,YAAD,EAAiBd,IAAG,CAAA,GAAIY,EAAA,MAAAN,SAAAM,EAAA,MAAAZ,KAAAY,EAAA,MAAAE,UAAAF,EAAA,MAAA2B,OAAAA,MAAA3B,EAAA;CAAA,IAAA4B;CAAA,AAAA5B,EAAA,QAAA2B,MAAOC,MAAA5B,EAAA,OAArE4B,MAAA,oBAAC,KAAD;EAAW,MAAA;YAAID;CAAX,CAAA,GAAiE3B,EAAA,MAAA2B,KAAA3B,EAAA,MAAA4B;CAAA,IAAAC;CAAA,AAAA7B,EAAA,QAAAH,gBAAAG,EAAA,QAAAJ,gBAAAI,EAAA,QAAAL,aAAAK,EAAA,QAAAE,YAElE2B,MAAAjC,eACC,oBAAC,SAAD;EACE,SAAA;EAEE,SAAA,oBAAC,MAAD;GAAY,MAAA;GAAU,OAAA,EAAAsB,YAAa,SAAQ;aACxCvB,YAAA,eAAA;EADE,CAAA;EAIE,SAAA;YAET,oBAAC,QAAD;GACY,UAAA,CAACO;GACN,MAAA;GACK,UAAA,CAAC,CAAC;GACH,SAAA;GACHnC,MAAAA;GACG4B,SAAAA;GACE,cAAA;GACF,eAAME,aAAa;EAAC,CAAA;CAjBzB,CAAA,IADT,MAqBOG,EAAA,MAAAH,cAAAG,EAAA,MAAAJ,cAAAI,EAAA,MAAAL,WAAAK,EAAA,MAAAE,UAAAF,EAAA,MAAA6B,OAAAA,MAAA7B,EAAA;CAAA,IAAA8B;CAAA,AAAA9B,EAAA,QAAAS,OAAAC,IAAA,2BAAA,KAIJoB,MAAA,oBAAC,MAAD;EAAY,MAAA;EAAU,OAAA,EAAAZ,YAAa,SAAQ;YAAG;CAAzC,CAAA,GAEElB,EAAA,MAAA8B,OAAAA,MAAA9B,EAAA;CAMG,IAAA+B,MAAA,CAAC7B,UAAQ8B;CAAA,AAAAhC,EAAA,QAAAS,OAAAC,IAAA,2BAAA,KACTsB,MAAA,CAAC,CAAC,GAAChC,EAAA,MAAAgC,OAAAA,MAAAhC,EAAA;CAAA,IAAAiC;CAAA,AAAAjC,EAAA,QAAAS,OAAAC,IAAA,2BAAA,KAEJuB,MAAA,CAAC,CAAC,GAACjC,EAAA,MAAAiC,OAAAA,MAAAjC,EAAA;CAAA,IAAAkC;CAAA,AAAAlC,EAAA,QAAAM,QAAAN,EAAA,QAAAK,aAEH6B,YAAA;EACF/B,OAAKgC,SAAgBC,SAErB9B,KAAKH,MAAKgC,QAAQC,KAAM,CAAC,CAAAC,MAAMC,YAEhCjC,UADEiC,SACQ;GAAAC,UACE;GAAIC,QACN;GAASC,OACV;EACT,IAEU;GAAAF,UACE;GAAIC,QACN;GAAOC,OACR;EACT,CAAC,GAEIH,OACR;CAAC,GACHtC,EAAA,MAAAM,MAAAN,EAAA,MAAAK,WAAAL,EAAA,MAAAkC,OAAAA,MAAAlC,EAAA;CAAA,IAAA0C;CAAA,AAAA1C,EAAA,QAAA+B,OAAA/B,EAAA,QAAAkC,OAnCLQ,MAAA,oBAAC,SAAD;EACE,SAAA;EAEE,SAAAZ;EAIO,SAAA;YAET,oBAAC,QAAD;GACO,MAAA;GACK,UAAAC;GACA,UAAAC;GACJpE,MAAAA;GACG,SAAAqE;GACE,cAAA;GACF,SAAAC;EAmBR,CAAA;CAnCG,CAAA,GAqCElC,EAAA,MAAA+B,KAAA/B,EAAA,MAAAkC,KAAAlC,EAAA,MAAA0C,OAAAA,MAAA1C,EAAA;CAAA,IAAA2C;CAAA,AAAA3C,EAAA,QAAAS,OAAAC,IAAA,2BAAA,KAINiC,MAAA,oBAAC,MAAD;EAAY,MAAA;EAAU,OAAA,EAAAzB,YAAa,SAAQ;YAAG;CAAzC,CAAA,GAEElB,EAAA,MAAA2C,OAAAA,MAAA3C,EAAA;CAMG,IAAA4C,MAAA,CAAC1C,UAAQ2C;CAAA,AAAA7C,EAAA,QAAAS,OAAAC,IAAA,2BAAA,KACTmC,MAAA,CAAC,CAAC,GAAC7C,EAAA,MAAA6C,OAAAA,MAAA7C,EAAA;CAAA,IAAA8C;CAAA,AAAA9C,EAAA,QAAAS,OAAAC,IAAA,2BAAA,KAGHoC,MAAA,CAAC,CAAC,GAAC9C,EAAA,MAAA8C,OAAAA,MAAA9C,EAAA;CAAA,IAAA+C;CAAA,AAAA/C,EAAA,QAAAZ,OAAAY,EAAA,QAAAE,YAGJ6C,MAAA7C,iBAAiB8C,OAAMC,KAAM7D,IAAG2B,SAAU,CAAC,IAA3CmC,KAAAA,GAAwDlD,EAAA,MAAAZ,KAAAY,EAAA,MAAAE,UAAAF,EAAA,MAAA+C,OAAAA,MAAA/C,EAAA;CAAA,IAAAmD;CAAA,AAAAnD,EAAA,QAAA4C,OAAA5C,EAAA,QAAA+C,OAlBrEI,MAAA,oBAAC,SAAD;EACE,SAAA;EAEE,SAAAR;EAIO,SAAA;EACC,WAAA;YAEV,oBAAC,QAAD;GACY,UAAAC;GACA,UAAAC;GACJhF,MAAAA;GACD,MAAA;GACK,UAAAiF;GACL,MAAA;GACM,cAAA;GACF,SAAAC;EAAwD,CAAA;CAlB7D,CAAA,GAoBE/C,EAAA,MAAA4C,KAAA5C,EAAA,MAAA+C,KAAA/C,EAAA,MAAAmD,OAAAA,MAAAnD,EAAA;CAAA,IAAAoD;CAAA,AAAApD,EAAA,QAAA6B,OAAA7B,EAAA,QAAA0C,OAAA1C,EAAA,QAAAmD,OAjFZC,MAAA,qBAAC,MAAD;EAAY,OAAA;EAAc,KAAA;YAA1B;GACGvB;GAsBDa;GAsCAS;EA7DG;KAkFEnD,EAAA,MAAA6B,KAAA7B,EAAA,MAAA0C,KAAA1C,EAAA,MAAAmD,KAAAnD,EAAA,MAAAoD,OAAAA,MAAApD,EAAA;CAAA,IAAAqD;CAAA,AAAArD,EAAA,QAAA0B,OAAA1B,EAAA,QAAA4B,OAAA5B,EAAA,QAAAoD,OA1GXC,MAAA,oBAAC,MAAD;EAAe,SAAA;EAAG,cAAA;YAChB,qBAAC,MAAD;GAAY,OAAA;GAAc,KAAA;aAA1B;IACE3B;IAqBAE;IACAwB;GAvBG;;CADF,CAAA,GA4GEpD,EAAA,MAAA0B,KAAA1B,EAAA,MAAA4B,KAAA5B,EAAA,MAAAoD,KAAApD,EAAA,MAAAqD,OAAAA,MAAArD,EAAA;CAAA,IAAAsD;CACN,OADMtD,EAAA,QAAAgB,MAAAhB,EAAA,QAAAqD,OArHTC,MAAA,qBAAA,UAAA,EAAA,UAAA,CACEtC,IAQAqC,GA4GO,EAAA,CAAA,GACNrD,EAAA,MAAAgB,IAAAhB,EAAA,MAAAqD,KAAArD,EAAA,MAAAsD,OAAAA,MAAAtD,EAAA,KAtHHsD;AAsHG;AAQP,SAAA/C,qBAAA;CAAA,IAAAP,IAAAC,EAAA,CAAA,GACE,CAAA0D,YAAAC,iBAAoCnF,SAAsB,IAAI,GAAC+B;CAAA,AAAAR,EAAA,OAAAS,OAAAC,IAAA,2BAAA,KAE9BF,KAAA,OAAAiD,SAAA;EAC/B,IAAI,CAACI,WAASC,WAC2B,OAAvCC,QAAOC,KAAM,yBAAyB,GAC/B;EAIT,IAAA;GAEqB,OADnB,MAAMH,UAASC,UAAUG,UAAWR,IAAI,GACxCG,cAAcH,IAAI,GACX;EAAI,SAAA3C,IAAA;GAGQ,OADnBiD,QAAOC,KAAM,eAAeE,EAAK,GACjCN,cAAc,IAAI,GACX;EAAK;CACb,GACF5D,EAAA,KAAAQ,MAAAA,KAAAR,EAAA;CAhBD,IAAAM,OAAqBE,IAgBfM;CAEmB,OAFnBd,EAAA,OAAA2D,aAEmB7C,KAAAd,EAAA,MAAlBc,KAAA,CAAC6C,YAAYrD,IAAI,GAACN,EAAA,KAAA2D,YAAA3D,EAAA,KAAAc,KAAlBA;AAAkB;AC9G3B,MAAM6G,aAAa5C,OAAO6C,OAAOnD,IAAI;AAWrC,SAASyD,wBAAwBC,mBAA8C;CAC7E,OAAOC,MAAMC,QAAQF,iBAAiB,IAAIA,kBAAkBG,KAAK,GAAG,IAAIH;AAC1E;AAEA,SAAOI,OAAAC,OAAA;CAAA,IAAAC,IAAAC,EAAA,EAAA,GACL,EAAArC,UAAA4B,YAA4BO,OAC5BT,QAAc1B,SAAQ0B,SAAU1B,SAAQ2B,aAAc3B,SAAQyB,WAE9D,EAAAb,aAAA0B,IAAAxB,QAAAE,YAAAH,gBAAA0B,IAAAhC,QAAqFqB,SAA9EhB,cAAA0B,OAAAE,KAAAA,IAAA7C,eAAA2C,IAAgDzB,iBAAA0B,OAAAC,KAAAA,IAAA,KAAAD,IAGvDG,WADkBpD,mBACDmD,CAAS,EAAAE,iBAA2BD,YAApC,KACjBE,SAAe1D,OAAO0C,QAAOpB,GAAI,GAACqC;CAAA,AAAAT,EAAA,OAAAV,SAAAU,EAAA,OAAA7B,OACiBsC,YAAO;EAAAtC;EAAAmB;CAAW,IAAEU,EAAA,KAAAV,OAAAU,EAAA,KAAA7B,KAAA6B,EAAA,KAAAS,MAAAA,KAAAT,EAAA;CAAvE,IAAA,CAAAU,eAAAC,oBAA0C5D,SAAS0D,EAAoB,GAACG,IAAAC;CACxEjE,AADwEoD,EAAA,OAAAR,QAAApB,OAGxDwC,KAAAZ,EAAA,IAAAa,KAAAb,EAAA,OAFNY,WAAA;EACRJ,OAAMM,UAAWtB,QAAOpB;CAAV,GACbyC,KAAA,CAACrB,QAAOpB,GAAI,GAAC4B,EAAA,KAAAR,QAAApB,KAAA4B,EAAA,KAAAY,IAAAZ,EAAA,KAAAa,KAFhBjE,UAAUgE,IAEPC,EAAa;CAChB,IAAAE,cAAoB3D,eAAe,GAAC4D;CAAA,AAAAhB,EAAA,OAAAiB,OAAAC,IAAA,2BAAA,KACXF,KAAA,EAAAG,YAAa,aAAY,GAACnB,EAAA,KAAAgB,MAAAA,KAAAhB,EAAA;CAAnD,IAAAoB,SAAejE,UAAU6D,EAA0B,GACnD,CAAAK,WAAAC,gBAAkCvE,SAA6B,GAC/DwE,mBAAyBzE,OAA2BsD,KAAAA,CAAS,GAC7D,CAAAoB,gBAAAC,mBAA0CzE,cAAc,GACxD,EAAA0E,kBAAAC,4BAAoDtE,eAAe,GAACuE;CAAA,AAAA5B,EAAA,OAAA0B,oBAAA1B,EAAA,OAAA2B,2BAE3DC,KAAA;EAAAF;EAAAC;CAGP,GAAC3B,EAAA,KAAA0B,kBAAA1B,EAAA,KAAA2B,yBAAA3B,EAAA,KAAA4B,MAAAA,KAAA5B,EAAA;CAJH,IAAAnC,cACS+D,IAKRC,IAAAC;CAEDlF,AAFCoD,EAAA,QAAAV,SAAAU,EAAA,QAAAU,iBAAAV,EAAA,QAAA7B,OAES0D,WAAA;EACR,AAAIE,KAAIC,UAAW;GAAA7D;GAAAmB;EAAW,CAAC,MAAMyC,KAAIC,UAAWtB,aAAa,KAC/De,sBAAsBd,iBAAiB;GAAAxC;GAAAmB;EAAW,CAAC,CAAC;CACrD,GACAwC,KAAA;EAACxC;EAAOoB;EAAevC;EAAKsD;CAAe,GAACzB,EAAA,MAAAV,OAAAU,EAAA,MAAAU,eAAAV,EAAA,MAAA7B,KAAA6B,EAAA,MAAA6B,IAAA7B,EAAA,MAAA8B,OAAAD,KAAA7B,EAAA,KAAA8B,KAAA9B,EAAA,MAJ/CpD,UAAUiF,IAIPC,EAA4C;CAAC,IAAAG;CAoD3BlB,AApD2Bf,EAAA,QAAAM,YAAAN,EAAA,QAAAoB,UAAApB,EAAA,QAAAe,aAAAmB,MAAAlC,EAAA,QAAAnC,eAG9CoE,KAAA,OAAAE,YAAA;EACE,IAAI,OAAOC,WAAa,KAAW;EAGnC,IAAAC,UAAgB7B,OAAMM;EACtB,IAAI,OAAOuB,WAAY,UAAQ,OACtB,IAAIC,IAAID,SAASD,SAAQ/D,MAAO;EAEzC,IAAI,OAAOgE,WAAY,YAAU;GAC/B,IAAAjE,MAAY,MAAMiE,QAAQ/C,SAAOzB,WAAW;GAAC,OACtC,OAAOO,OAAQ,WAAf,IAA8BkE,IAAIlE,KAAKgE,SAAQ/D,MAAa,IAA5DD;EAA6D;EAEtE,IAAI,OAAOiE,WAAY,UAAQ;GAC7B,IAAA/D,UACE,OAAO+D,QAAO/D,WAAa,aAA3B,MACU+D,QAAO/D,QAASgB,SAAOzB,WAAW,IACxCwE,QAAO/D;GACb,IAAI,OAAOA,WAAY,UAAQ,OACtBA;GAET,IAAI,CAACiD,iBAAgBT,SAAQ;IAC3B,IAAA,EAAAyB,QAAAlB,WAAAmB,gBAA4B,MAAM7G,oBAChCyF,QACA,6BACAgB,SAAQK,MACR1B,aAAWmB,EACb;IAEAT,AADAF,iBAAgBT,UAAWyB,QAC3Bd,sBAAsBH,aAAaD,YAASqB,QAAS,CAAC,CAAC;GAAC;GAU1D,IAAAG,QAAY,MAPcjH,iBAAiB;IAAAyC,QACjCgE,QAAOhE,WAAY,gBAAgB+D,SAAQ/D,SAAUgE,QAAOhE;IAAOC;IAAAC,WAEhE,EAAAqE,QACDP,QAAO9D,UACjB;GACF,CACkBoE,CAAiB,CAAC;IAAAvB;IAAA0B,kBAEhBvB,iBAAgBT;IAAQiC,oBACtB;IAAIC,gBACR1C;IAAQ2C,0BACExD,wBAAwB5B,YAAW6D,gBAAiB;GAChF,CAAC;GAAC,OACK,IAAIY,IAAIlE,OAAKgE,SAAQ/D,MAAO;EAAC;CACrC,GAEF2B,EAAA,MAAAM,UAAAN,EAAA,MAAAoB,QAAApB,EAAA,MAAAe,aAAAmB,IAAAlC,EAAA,MAAAnC,aAAAmC,EAAA,MAAAiC,MAAAA,KAAAjC,EAAA,KACkBe,aAAWmB;CAlDhC,IAAAgB,QAAYjB,IAmDXkB,KAAAC;CACDxG,AADCoD,EAAA,QAAAqB,aAaa8B,MAAAnD,EAAA,KAAAoD,MAAApD,EAAA,QAZJmD,YAAA;EACR,IAAI9B,WAAS;GACX,IAAAgC,UAAgBC,iBACd;IAEE/B,AADAE,sBAAsBH,aAAalB,KAAAA,CAAS,CAAC,GAC7CmB,iBAAgBT,UAAWV,KAAAA;GAAH,GAE1BmD,KAAIC,IAAK,GAAGnC,YAAYoC,KAAIC,IAAK,CAAC,CACpC;GAAC,aACYC,aAAaN,OAAO;EAAC;CACnC,GAEAD,MAAA,CAAC/B,SAAS,GAACrB,EAAA,MAAAqB,WAAArB,EAAA,MAAAmD,KAAAnD,EAAA,MAAAoD,MAZdxG,UAAUuG,KAYPC,GAAW;CAAC,IAAAQ;CAAA,AAAA5D,EAAA,QAAAiB,OAAAC,IAAA,2BAAA,KAGO0C,MAAA,oBAAC,SAAD,EAAoB,YAAA,UAAS,CAAA,GAAG5D,EAAA,MAAA4D,OAAAA,MAAA5D,EAAA;CAE3C,IAAA6D,MAAA,GAAGnD,cAAavC,IAAI,GAAIwD,2BAAA,WAUrBmC,MAAA/C,aAAWmB,IAAI6B;CAEhB,OAFgB/D,EAAA,QAAApB,cAAAoB,EAAA,QAAAxB,eAAAwB,EAAA,QAAAU,cAAApB,SAAAU,EAAA,QAAAU,cAAAvC,OAAA6B,EAAA,QAAAwB,kBAAAxB,EAAA,QAAAnC,eAAAmC,EAAA,QAAAtB,UAAAsB,EAAA,QAAAvB,kBAAAuB,EAAA,QAAA6D,OAAA7D,EAAA,QAAA8D,OAAA9D,EAAA,QAAAkD,SAZ3Ba,MAAA,oBAAC,UAAD;EAAoB,UAAAH;YAClB,oBAAC,aAAD;GAEQ,MAAAlD,cAAavC;GACJ,eAAAuC,cAAapB;GACvBlB,KAAAA;GACWoD;GACJ5C;GACCf;GACAW;GACLE;GACQD;GACR,QAAAqF;EAAe,GAVlBD,GAUkB;CAZlB,CAAA,GAcE7D,EAAA,MAAApB,YAAAoB,EAAA,MAAAxB,aAAAwB,EAAA,MAAAU,cAAApB,OAAAU,EAAA,MAAAU,cAAAvC,KAAA6B,EAAA,MAAAwB,gBAAAxB,EAAA,MAAAnC,aAAAmC,EAAA,MAAAtB,QAAAsB,EAAA,MAAAvB,gBAAAuB,EAAA,MAAA6D,KAAA7D,EAAA,MAAA8D,KAAA9D,EAAA,MAAAkD,OAAAlD,EAAA,MAAA+D,OAAAA,MAAA/D,EAAA,KAdX+D;AAcW;AAaf,MAAMM,cAAc5H,KAAK,SAAAsD,OAAA;CAAA,IAAAC,IAAAC,EAAA,EAAA,GACvB,EAAAuB,gBAAAhD,aAAA0B,IAAAxB,QAAAE,YAAAuB,IAAA1B,gBAAAgC,IAAAC,eAAAyD,QAAA9C,WAAAxD,aAAA+C,IAAAwD,SAWIrE,OATFvB,cAAA0B,OAAAE,KAAAA,IAAA7C,eAAA2C,IAA0BW;CAAA,AAAAb,EAAA,OAAAG,KAEXU,KAAAb,EAAA,MAAfa,KAAAV,OAAAC,KAAAA,IAAA,CAAc,IAAdD,IAAeH,EAAA,KAAAG,IAAAH,EAAA,KAAAa;CAAf,IAAAjC,aAAAiC,IACApC,iBAAAgC,OAAAL,KAAAA,IAAA,KAAAK,IAIa,EAAAkB,yBAAAD,qBAAAd,IAGf,CAAA0D,YAAAC,iBAAoCxH,SAASS,QAAQgB,eAARA,cAAAjB,YAAiD,GAE9FiH,uBAA6BpI,wBAAwB,GAAC4E;CAAA,AAAAhB,EAAA,OAAAU,iBAAAV,EAAA,OAAAD,SAGpDiB,WAAMjB,MAAK3B,IAAKsC,aAAa,GAACV,EAAA,KAAAU,eAAAV,EAAA,KAAAD,OAAAC,EAAA,KAAAgB,MAAAA,KAAAhB,EAAA;CAAA,IAAA4B;CAAA,AAAA5B,EAAA,OAAAoE,QAAApE,EAAA,OAAAU,iBAAAV,EAAA,OAAAqB,aAAArB,EAAA,OAAA0B,oBAAA1B,EAAA,OAAA2B,2BAAA3B,EAAA,QAAAgB,MAAAhB,EAAA,QAAAmE,UADpBvC,KAAAtE,QACV0D,IACA;EAEE;EACAN;EACAiB;EACAD;EACAyC;EACA9C;EACA+C;EACAK;CAAW,CAEf,GAACzE,EAAA,KAAAoE,MAAApE,EAAA,KAAAU,eAAAV,EAAA,KAAAqB,WAAArB,EAAA,KAAA0B,kBAAA1B,EAAA,KAAA2B,yBAAA3B,EAAA,MAAAgB,IAAAhB,EAAA,MAAAmE,QAAAnE,EAAA,MAAA4B,MAAAA,KAAA5B,EAAA;CAbD,IAAA5B,MAAYwD,IAeZ,CAAA8C,SAAAC,cAA8B5H,SAAS,EAAI,GAC3C,CAAA6H,YAAAC,gBAAmC9H,SAAS,EAAK,GACjD+H,YAAkBF,cAAApD,gBAElBuD,SAAejI,OAA0B,IAAI,GAAC+E;CAAA,AAAA7B,EAAA,QAAAiB,OAAAC,IAAA,2BAAA,KAEbW,WAAA;EAC/B,IAAI,CAACkD,QAAMjE,SAAS;EAKpB,IAAA,EAAAkE,QAAcD,OAAMjE;EAGpB+D,AAFAE,OAAMjE,QAAQkE,MAAOA,KAErBH,aAAa,EAAI;CAAC,GACnB7E,EAAA,MAAA6B,MAAAA,KAAA7B,EAAA;CAVD,IAAAiF,eAAqBpD,IAUfC;CAAA,AAAA9B,EAAA,QAAAwE,uBAGsE1C,KAAA9B,EAAA,OAAhD8B,KAAA0C,uBAAA,EAAAU,UAAkC,EAAa,IAA/C9E,KAAAA,GAAgDJ,EAAA,MAAAwE,sBAAAxE,EAAA,MAAA8B;CAAA,IAAAG;CAAA,AAAAjC,EAAA,QAAAiB,OAAAC,IAAA,2BAAA,KACxCe,KAAA,EAAAkD,QAAS,OAAM,GAACnF,EAAA,MAAAiC,MAAAA,KAAAjC,EAAA;CAO9B,IAAAmD,MAAA,CAAC,CAACzE,QAAMC,QAAQyE;CAAA,AAAApD,EAAA,QAAAsE,cAAAtE,EAAA,QAAA8E,aAAA9E,EAAA,QAAAvB,kBAAAuB,EAAA,QAAAmD,OAAAnD,EAAA,QAAA5B,OANhCgF,MAAA,oBAAC,SAAD;EACOhF;EACOkG;EACDQ;EACIP;EACN9F,SAAAA;EACK,cAAA0E;EACA8B;CAAY,CAAA,GAC1BjF,EAAA,MAAAsE,YAAAtE,EAAA,MAAA8E,WAAA9E,EAAA,MAAAvB,gBAAAuB,EAAA,MAAAmD,KAAAnD,EAAA,MAAA5B,KAAA4B,EAAA,MAAAoD,OAAAA,MAAApD,EAAA;CAAA,IAAA4D;CAAA,AAAA5D,EAAA,QAAApB,cAAAoB,EAAA,QAAAsE,cAAAtE,EAAA,QAAA0E,WAAA1E,EAAA,QAAA8E,aAAA9E,EAAA,QAAA5B,OACDwF,MAAAxF,eAAeJ,QACd,oBAAC,WAAD,EAAkBI,OAAAA,IAAG,CAAA,IAErB,oBAAC,MAAD;EAAW,MAAA;EAAqB,OAAA,EAAA+G,QAAS,OAAM;YAC7C,oBAAC,OAAD;GACOJ,KAAAA;GACIL;GACEI;GACCR;GACEO;GACFF;GACPvG;GACOQ;EAAU,CAAA;CATrB,CAAA,GAYNoB,EAAA,MAAApB,YAAAoB,EAAA,MAAAsE,YAAAtE,EAAA,MAAA0E,SAAA1E,EAAA,MAAA8E,WAAA9E,EAAA,MAAA5B,KAAA4B,EAAA,MAAA4D,OAAAA,MAAA5D,EAAA;CAAA,IAAA6D;CAAA,AAAA7D,EAAA,QAAAoD,OAAApD,EAAA,QAAA4D,OAzBHC,MAAA,qBAAC,MAAD;EAAgB,WAAA;EAAgB,OAAA5B;YAAhC,CACEmB,KASCQ,GAVE;KA0BE5D,EAAA,MAAAoD,KAAApD,EAAA,MAAA4D,KAAA5D,EAAA,MAAA6D,OAAAA,MAAA7D,EAAA;CAAA,IAAA8D;CACM,OADN9D,EAAA,QAAA6D,OAAA7D,EAAA,QAAA8B,MA3BTgC,MAAA,oBAAC,cAAD;EAA0B,YAAAhC;YACxB+B;CADW,CAAA,GA4BE7D,EAAA,MAAA6D,KAAA7D,EAAA,MAAA8B,IAAA9B,EAAA,MAAA8D,OAAAA,MAAA9D,EAAA,KA5Bf8D;AA4Be,CAElB;AAUD,SAAAwB,MAAAvF,OAAA;CAAA,IAAAC,IAAAC,EAAA,EAAA,GACE,EAAAyE,SAAAC,YAAAL,YAAA1F,YAAAkG,WAAA1G,KAAAyG,cAAAU,KAAAR,WASIhF,OAAKG;CAAA,AAAAF,EAAA,OAAApB,cAAAoB,EAAA,OAAA2E,cAAA3E,EAAA,OAAA6E,gBAET3E,KAAA,WAAA;EAIE,AAHAyE,WAAW,EAAK,GAChBE,aAAa,EAAK,GAEdjG,WAAUK,UAAW,OAAOL,WAAUK,UAAY,cACpDL,WAAUK,OAAQ;CACnB,GACFe,EAAA,KAAApB,YAAAoB,EAAA,KAAA2E,YAAA3E,EAAA,KAAA6E,cAAA7E,EAAA,KAAAE,MAAAA,KAAAF,EAAA;CAPD,IAAAwF,mBAAAtF,IAOCC;CAAA,AAAAH,EAAA,OAAAiB,OAAAC,IAAA,2BAAA,KAG8Cf,KAAA;EAAAgF,QAAS;EAAMM,UAAY;CAAU,GAACzF,EAAA,KAAAG,MAAAA,KAAAH,EAAA;CAAA,IAAAS;CAAA,AAAAT,EAAA,OAAAsE,cAAAtE,EAAA,OAAA0E,WAAA1E,EAAA,OAAA5B,OAE9EqC,KAAA,CAACrC,OACCsG,WACC,oBAAC,YAAD;EACU,SAAA;EACA,SAAA;EACH,MAAA;EACKgB,UAAAA;EACF,SAAA;EACF,OAAA;EACC,OAAA;GAAAC,OAAQ;GAAGF,UAAY;EAAU;YAExC,oBAAC,SAAD,EAAqBnB,WAAU,CAAA;CATtB,CAAA,GAWXtE,EAAA,KAAAsE,YAAAtE,EAAA,KAAA0E,SAAA1E,EAAA,KAAA5B,KAAA4B,EAAA,KAAAS,MAAAA,KAAAT,EAAA;CAAA,IAAAY;CAAA,AAAAZ,EAAA,OAAAS,KACYG,KAAAZ,EAAA,OAflBY,KAAA,oBAAC,iBAAD,EAAA,UACGH,GADa,CAAA,GAeET,EAAA,KAAAS,IAAAT,EAAA,MAAAY;CAAA,IAAAC;CAAA,AAAAb,EAAA,QAAApB,cAAAoB,EAAA,QAAAwF,oBAAAxF,EAAA,QAAA+E,UAAA/E,EAAA,QAAAsE,cAAAtE,EAAA,QAAA0E,WAAA1E,EAAA,QAAA8E,aAAA9E,EAAA,QAAA5B,OACjByC,KAAAzC,OACC,oBAAA,OAAA,QAAA;EACO2G,KAAAA;EACC,OAAA;EACM,aAAA;EACL,OAAA,EAAAa,WAAY,OAAM;EACpB,KAAAxH,IAAGyH,SAAU;EACT,SAAA,CAAC,cAAcvB,UAAU;EACxBwB,UAAAA;EACD,SAAA;GACPpB,UAAA,eAAA;GACAI,YAAA,cAAA;GACAR;EAAU;EACX,GACG1F;EACI4G,QAAAA;CAAgB,CAAA,GAE3BxF,EAAA,MAAApB,YAAAoB,EAAA,MAAAwF,kBAAAxF,EAAA,MAAA+E,QAAA/E,EAAA,MAAAsE,YAAAtE,EAAA,MAAA0E,SAAA1E,EAAA,MAAA8E,WAAA9E,EAAA,MAAA5B,KAAA4B,EAAA,MAAAa,MAAAA,KAAAb,EAAA;CAAA,IAAAgB;CACI,OADJhB,EAAA,QAAAY,MAAAZ,EAAA,QAAAa,MAlCHG,KAAA,qBAAC,MAAD;EAAY,OAAA;EAAiB,SAAA;EAAgB,OAAAb;YAA7C,CACES,IAgBCC,EAjBE;KAmCEb,EAAA,MAAAY,IAAAZ,EAAA,MAAAa,IAAAb,EAAA,MAAAgB,MAAAA,KAAAhB,EAAA,KAnCPgB;AAmCO;AAIX,MAAM0E,kBAAkB;CACtBK,SAAS,EAACC,SAAS,EAAC;CACpBC,SAAS,EAACD,SAAS;EAAC;EAAG;EAAG;CAAC,EAAC;CAC5BE,MAAM,EAACF,SAAS;EAAC;EAAG;EAAG;CAAC,EAAC;AAC3B,GAEMF,iBAAiB;CACrB,GAAGtI;CACH2I,SAAS;EACP,GAAG3I,MAAM2I;EACTC,WAAW;CACb;CACAC,QAAQ;EACN,GAAG7I,MAAM6I;EACTD,WAAW;CACb;CACAE,YAAY;EACVN,SAAS;EACTO,OAAO;CACT;CACAC,MAAM,EACJD,OAAO,EACT;CACAzB,WAAW,EACTyB,OAAO;EAAC;EAAG;EAAG;EAAG;CAAI,EACvB;CACAE,QAAQ;EACNT,SAAS;GAAC;GAAG;GAAG;EAAC;EACjBO,OAAO;CACT;AACF;AAEA,SAAAG,QAAAxG,IAAA;CAAA,IAAAF,IAAAC,EAAA,CAAA,GAAiB,EAAAqE,eAAApE,IAEIC,KAAA3C,MAAM8G,aAAW7D;CAAA,AAAAT,EAAA,OAAAG,KAACM,KAAAT,EAAA,MAAtBS,KAAA,EAAA,GAAIN,GAAiB,GAACH,EAAA,KAAAG,IAAAH,EAAA,KAAAS;CAAA,IAAAG,IAAAC;CAAA,AAAAb,EAAA,OAAAiB,OAAAC,IAAA,2BAAA,KACjCN,KAAA,oBAAC,SAAD,EAAS,OAAA,GAAK,CAAA,GACdC,KAAA,oBAAC,MAAD;EAAM,OAAA;EAAY,MAAA;YAAG;CAAhB,CAAA,GAEEb,EAAA,KAAAY,IAAAZ,EAAA,KAAAa,OAAAD,KAAAZ,EAAA,IAAAa,KAAAb,EAAA;CAAA,IAAAgB;CACF,OADEhB,EAAA,OAAAS,KACFO,KAAAhB,EAAA,MALPgB,KAAA,qBAAC,MAAD;EAAa,OAAAP;EAAgC,SAAA;EAAe,OAAA;EAAmB,WAAA;EAAc,KAAA;YAA7F,CACEG,IACAC,EAFG;KAKEb,EAAA,KAAAS,IAAAT,EAAA,KAAAgB,KALPA;AAKO;AAIX,SAAA2F,UAAAzG,IAAA;CAAA,IAAAF,IAAAC,EAAA,CAAA,GAAmB,EAAA2G,UAAA1G,IAAuBC;CAAA,AAAAH,EAAA,OAAAiB,OAAAC,IAAA,2BAAA,KAO5Bf,KAAA,oBAAC,KAAD,EAAA,UACE,oBAAC,MAAD;EAAY,MAAA;YACV,oBAAC,oBAAD,CAAmB,CAAA;CADhB,CAAA,EADH,CAAA,GAIEH,EAAA,KAAAG,MAAAA,KAAAH,EAAA;CAAA,IAAAS;CAAA,AAAAT,EAAA,OAAA4G,MAAAC,OAIGpG,KAAAT,EAAA,MAFPS,KAAA,oBAAC,MAAD;EAAS,IAAA;EAAW,MAAA;EAAU,QAAA;YAC3BmG,MAAKC;CADH,CAAA,GAEE7G,EAAA,KAAA4G,MAAAC,MAAA7G,EAAA,KAAAS;CAAA,IAAAG;CAAA,AAAAZ,EAAA,OAAA4G,MAAAE,UAGAlG,KAAAZ,EAAA,MAFPY,KAAA,oBAAC,MAAD;EAAS,IAAA;EAAI,OAAA;EAAY,MAAA;YACtBgG,MAAKE;CADH,CAAA,GAEE9G,EAAA,KAAA4G,MAAAE,SAAA9G,EAAA,KAAAY;CAAA,IAAAC;CAMZ,OANYb,EAAA,OAAAS,MAAAT,EAAA,OAAAY,MAhBnBC,KAAA,oBAAC,MAAD;EAAa,QAAA;YACX,oBAAC,MAAD;GAAY,OAAA;GAAgB,QAAA;GAAe,SAAA;GAAkB,SAAA;GAAU,QAAA;aACrE,oBAAC,WAAD;IAAkB,OAAA;cAChB,oBAAC,MAAD;KAAe,SAAA;KAAW,QAAA;KAAW,QAAA;KAAQ,MAAA;eAC3C,qBAAC,MAAD,EAAA,UAAA,CACEV,IAKA,qBAAC,OAAD;MAAa,MAAA;MAAe,YAAA;MAAQ,KAAA;gBAApC,CACEM,IAGAG,EAJI;OANH,EAAA,CAAA;IADF,CAAA;GADG,CAAA;EADP,CAAA;CADF,CAAA,GAsBEZ,EAAA,KAAAS,IAAAT,EAAA,KAAAY,IAAAZ,EAAA,KAAAa,MAAAA,KAAAb,EAAA,IAtBPa;AAsBO;AAKX,MAAM4D,cAAcxD,OAAO"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "sanity-plugin-iframe-pane",
3
- "version": "5.0.20",
3
+ "version": "5.0.22",
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",
@@ -30,22 +30,21 @@
30
30
  "@sanity/icons": "^5.0.0",
31
31
  "@sanity/preview-url-secret": "^4.0.7",
32
32
  "@sanity/ui": "^3.3.0",
33
- "motion": "^12.42.0",
33
+ "motion": "^12.42.2",
34
34
  "suspend-react": "^0.1.3"
35
35
  },
36
36
  "devDependencies": {
37
- "@sanity/pkg-utils": "^10.9.0",
37
+ "@sanity/tsconfig": "^2.2.0",
38
+ "@sanity/tsdown-config": "^0.11.0",
38
39
  "@types/node": "^24.13.2",
39
40
  "@types/react": "^19.2.17",
40
41
  "@types/react-dom": "^19.2.3",
41
42
  "babel-plugin-react-compiler": "^1.0.0",
42
- "babel-plugin-styled-components": "^2.3.0",
43
43
  "react": "^19.2.7",
44
44
  "react-dom": "^19.2.7",
45
45
  "sanity": "^6.3.0",
46
46
  "styled-components": "^6.4.3",
47
- "@repo/package.config": "0.0.0",
48
- "@repo/tsconfig": "0.0.0"
47
+ "tsdown": "^0.22.3"
49
48
  },
50
49
  "peerDependencies": {
51
50
  "react": "^19.2",
@@ -57,6 +56,6 @@
57
56
  "node": ">=20.19 <22 || >=22.12"
58
57
  },
59
58
  "scripts": {
60
- "build": "pkg build --strict --check --clean"
59
+ "build": "tsdown"
61
60
  }
62
61
  }