sanity-plugin-mux-input 2.0.2 → 2.0.4

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.
Files changed (49) hide show
  1. package/LICENSE +1 -1
  2. package/lib/_chunks/Input-4e0aa2ef.js +2652 -0
  3. package/lib/_chunks/Input-4e0aa2ef.js.map +1 -0
  4. package/lib/_chunks/Input-7fb0dcd2.js +2682 -0
  5. package/lib/_chunks/Input-7fb0dcd2.js.map +1 -0
  6. package/lib/_chunks/Preview-3e4c2ec9.js +26 -0
  7. package/lib/_chunks/{Preview-3195237b.js.map → Preview-3e4c2ec9.js.map} +1 -1
  8. package/lib/_chunks/Preview-e6f7e765.js +28 -0
  9. package/lib/_chunks/Preview-e6f7e765.js.map +1 -0
  10. package/lib/_chunks/VideoSource.styled-70d38762.js +336 -0
  11. package/lib/_chunks/VideoSource.styled-70d38762.js.map +1 -0
  12. package/lib/_chunks/VideoSource.styled-e880b6e4.js +318 -0
  13. package/lib/_chunks/VideoSource.styled-e880b6e4.js.map +1 -0
  14. package/lib/_chunks/index-a9d40189.js +248 -0
  15. package/lib/_chunks/index-a9d40189.js.map +1 -0
  16. package/lib/_chunks/index-adfcd166.js +265 -0
  17. package/lib/_chunks/index-adfcd166.js.map +1 -0
  18. package/lib/{src/index.d.ts → index.d.ts} +0 -0
  19. package/lib/index.esm.js +2 -1
  20. package/lib/index.esm.js.map +1 -1
  21. package/lib/index.js +9 -1
  22. package/lib/index.js.map +1 -1
  23. package/package.json +28 -35
  24. package/src/actions/assets.ts +1 -1
  25. package/src/actions/secrets.ts +12 -3
  26. package/src/actions/upload.ts +1 -1
  27. package/src/components/__legacy__Uploader.tsx +1 -1
  28. package/src/hooks/useSaveSecrets.ts +1 -1
  29. package/src/util/generateJwt.ts +1 -1
  30. package/src/util/getAnimatedPosterSrc.ts +1 -1
  31. package/src/util/getPosterSrc.ts +1 -1
  32. package/src/util/getStoryboardSrc.ts +1 -1
  33. package/src/util/getVideoSrc.ts +1 -1
  34. package/src/util/readSecrets.ts +1 -1
  35. package/lib/_chunks/Input-2ba004d3.js +0 -2
  36. package/lib/_chunks/Input-2ba004d3.js.map +0 -1
  37. package/lib/_chunks/Input-af5a0a66.esm.js +0 -2
  38. package/lib/_chunks/Input-af5a0a66.esm.js.map +0 -1
  39. package/lib/_chunks/Preview-3195237b.js +0 -2
  40. package/lib/_chunks/Preview-bb256342.esm.js +0 -2
  41. package/lib/_chunks/Preview-bb256342.esm.js.map +0 -1
  42. package/lib/_chunks/VideoSource.styled-1b994d90.js +0 -2
  43. package/lib/_chunks/VideoSource.styled-1b994d90.js.map +0 -1
  44. package/lib/_chunks/VideoSource.styled-f92259cd.esm.js +0 -2
  45. package/lib/_chunks/VideoSource.styled-f92259cd.esm.js.map +0 -1
  46. package/lib/_chunks/index-3d8d7583.esm.js +0 -2
  47. package/lib/_chunks/index-3d8d7583.esm.js.map +0 -1
  48. package/lib/_chunks/index-efe6ce48.js +0 -2
  49. package/lib/_chunks/index-efe6ce48.js.map +0 -1
@@ -0,0 +1,318 @@
1
+ var _templateObject, _templateObject2, _templateObject3, _templateObject4, _templateObject5;
2
+ function _taggedTemplateLiteral(strings, raw) { if (!raw) { raw = strings.slice(0); } return Object.freeze(Object.defineProperties(strings, { raw: { value: Object.freeze(raw) } })); }
3
+ import { useDocumentValues, isReference, useClient as useClient$1, MediaPreview } from 'sanity';
4
+ import { jsx, jsxs, Fragment } from 'react/jsx-runtime';
5
+ import { UnknownIcon, LockIcon } from '@sanity/icons';
6
+ import { Card, Box, Spinner, Grid, Inline } from '@sanity/ui';
7
+ import { memo, useMemo, Suspense } from 'react';
8
+ import styled from 'styled-components';
9
+ import { suspend } from 'suspend-react';
10
+ import { useErrorBoundary } from 'use-error-boundary';
11
+ import { cacheNs } from './index-a9d40189.js';
12
+ const path = ["assetId", "data", "playbackId", "status", "thumbTime", "filename"];
13
+ const useAssetDocumentValues = asset => useDocumentValues(isReference(asset) ? asset._ref : "", path);
14
+ function useClient() {
15
+ return useClient$1({
16
+ apiVersion: "2022-09-14"
17
+ });
18
+ }
19
+ const _id = "secrets.mux";
20
+ function readSecrets(client) {
21
+ const {
22
+ projectId,
23
+ dataset
24
+ } = client.config();
25
+ return suspend(async () => {
26
+ const data = await client.fetch( /* groq */"*[_id == $_id][0]{\n token,\n secretKey,\n enableSignedUrls,\n signingKeyId,\n signingKeyPrivate\n }", {
27
+ _id
28
+ });
29
+ return {
30
+ token: (data == null ? void 0 : data.token) || null,
31
+ secretKey: (data == null ? void 0 : data.secretKey) || null,
32
+ enableSignedUrls: Boolean(data == null ? void 0 : data.enableSignedUrls) || false,
33
+ signingKeyId: (data == null ? void 0 : data.signingKeyId) || null,
34
+ signingKeyPrivate: (data == null ? void 0 : data.signingKeyPrivate) || null
35
+ };
36
+ }, [cacheNs, _id, projectId, dataset]);
37
+ }
38
+ function generateJwt(client, playbackId, aud, payload) {
39
+ const {
40
+ signingKeyId,
41
+ signingKeyPrivate
42
+ } = readSecrets(client);
43
+ if (!signingKeyId) {
44
+ throw new TypeError("Missing signingKeyId");
45
+ }
46
+ if (!signingKeyPrivate) {
47
+ throw new TypeError("Missing signingKeyPrivate");
48
+ }
49
+ const {
50
+ default: sign
51
+ } = suspend(() => import('jsonwebtoken-esm/sign'), ["jsonwebtoken-esm/sign"]);
52
+ return sign(payload ? JSON.parse(JSON.stringify(payload, (_, v) => v != null ? v : void 0)) : {}, atob(signingKeyPrivate), {
53
+ algorithm: "RS256",
54
+ keyid: signingKeyId,
55
+ audience: aud,
56
+ subject: playbackId,
57
+ noTimestamp: true,
58
+ expiresIn: "12h"
59
+ });
60
+ }
61
+ function getPlaybackId(asset) {
62
+ if (!(asset == null ? void 0 : asset.playbackId)) {
63
+ console.error("Asset is missing a playbackId", {
64
+ asset
65
+ });
66
+ throw new TypeError("Missing playbackId");
67
+ }
68
+ return asset.playbackId;
69
+ }
70
+ function getPlaybackPolicy(asset) {
71
+ var _a, _b, _c, _d;
72
+ return (_d = (_c = (_b = (_a = asset.data) == null ? void 0 : _a.playback_ids) == null ? void 0 : _b[0]) == null ? void 0 : _c.policy) != null ? _d : "public";
73
+ }
74
+ function getAnimatedPosterSrc(_ref) {
75
+ let {
76
+ asset,
77
+ client,
78
+ height,
79
+ width,
80
+ start = asset.thumbTime ? Math.max(0, asset.thumbTime - 2.5) : 0,
81
+ end = start + 5,
82
+ fps = 15
83
+ } = _ref;
84
+ const params = {
85
+ height,
86
+ width,
87
+ start,
88
+ end,
89
+ fps
90
+ };
91
+ const playbackId = getPlaybackId(asset);
92
+ let searchParams = new URLSearchParams(JSON.parse(JSON.stringify(params, (_, v) => v != null ? v : void 0)));
93
+ if (getPlaybackPolicy(asset) === "signed") {
94
+ const token = generateJwt(client, playbackId, "g", params);
95
+ searchParams = new URLSearchParams({
96
+ token
97
+ });
98
+ }
99
+ return "https://image.mux.com/".concat(playbackId, "/animated.gif?").concat(searchParams);
100
+ }
101
+ function getPosterSrc(_ref2) {
102
+ let {
103
+ asset,
104
+ client,
105
+ fit_mode,
106
+ height,
107
+ time = asset.thumbTime,
108
+ width
109
+ } = _ref2;
110
+ const params = {
111
+ fit_mode,
112
+ height,
113
+ time,
114
+ width
115
+ };
116
+ const playbackId = getPlaybackId(asset);
117
+ let searchParams = new URLSearchParams(JSON.parse(JSON.stringify(params, (_, v) => v != null ? v : void 0)));
118
+ if (getPlaybackPolicy(asset) === "signed") {
119
+ const token = generateJwt(client, playbackId, "t", params);
120
+ searchParams = new URLSearchParams({
121
+ token
122
+ });
123
+ }
124
+ return "https://image.mux.com/".concat(playbackId, "/thumbnail.png?").concat(searchParams);
125
+ }
126
+ const mediaDimensions = {
127
+ aspect: 16 / 9
128
+ };
129
+ const ImageLoader = memo(function ImageLoader2(_ref3) {
130
+ let {
131
+ alt,
132
+ src,
133
+ height,
134
+ width,
135
+ aspectRatio
136
+ } = _ref3;
137
+ suspend(async () => {
138
+ const img = new Image(width, height);
139
+ img.decoding = "async";
140
+ img.src = src;
141
+ await img.decode();
142
+ }, ["sanity-plugin-mux-input", "image", src]);
143
+ return /* @__PURE__ */jsx("img", {
144
+ alt,
145
+ src,
146
+ height,
147
+ width,
148
+ style: {
149
+ aspectRatio
150
+ }
151
+ });
152
+ });
153
+ const VideoMediaPreview = styled(MediaPreview)(_templateObject || (_templateObject = _taggedTemplateLiteral(["\n img {\n object-fit: cover;\n }\n"])));
154
+ const VideoMediaPreviewSignedSubtitle = _ref4 => {
155
+ let {
156
+ solo
157
+ } = _ref4;
158
+ return /* @__PURE__ */jsxs(Inline, {
159
+ space: 1,
160
+ style: {
161
+ marginTop: solo ? "-1.35em" : void 0,
162
+ marginBottom: solo ? void 0 : "0.35rem"
163
+ },
164
+ children: [/* @__PURE__ */jsx(LockIcon, {}), "Signed playback policy"]
165
+ });
166
+ };
167
+ const PosterImage = _ref5 => {
168
+ let {
169
+ asset,
170
+ height,
171
+ width,
172
+ showTip
173
+ } = _ref5;
174
+ const client = useClient();
175
+ const src = getPosterSrc({
176
+ asset,
177
+ client,
178
+ height,
179
+ width,
180
+ fit_mode: "smartcrop"
181
+ });
182
+ const subtitle = useMemo(() => showTip && getPlaybackPolicy(asset) === "signed" ? /* @__PURE__ */jsx(VideoMediaPreviewSignedSubtitle, {
183
+ solo: true
184
+ }) : void 0, [asset, showTip]);
185
+ return /* @__PURE__ */jsx(VideoMediaPreview, {
186
+ mediaDimensions,
187
+ subtitle,
188
+ title: /* @__PURE__ */jsx(Fragment, {
189
+ children: null
190
+ }),
191
+ media: /* @__PURE__ */jsx(ImageLoader, {
192
+ alt: "",
193
+ src,
194
+ height,
195
+ width
196
+ })
197
+ });
198
+ };
199
+ const VideoThumbnail = memo(function VideoThumbnail2(_ref6) {
200
+ let {
201
+ asset,
202
+ width,
203
+ showTip
204
+ } = _ref6;
205
+ const {
206
+ ErrorBoundary,
207
+ didCatch,
208
+ error
209
+ } = useErrorBoundary();
210
+ const height = Math.round(width * 9 / 16);
211
+ const subtitle = useMemo(() => showTip && getPlaybackPolicy(asset) === "signed" ? /* @__PURE__ */jsx(VideoMediaPreviewSignedSubtitle, {}) : void 0, [showTip, asset]);
212
+ if (didCatch) {
213
+ return /* @__PURE__ */jsx(VideoMediaPreview, {
214
+ subtitle: error.message,
215
+ mediaDimensions,
216
+ title: "Error when loading thumbnail",
217
+ media: /* @__PURE__ */jsx(Card, {
218
+ radius: 2,
219
+ height: "fill",
220
+ style: {
221
+ position: "relative",
222
+ width: "100%"
223
+ },
224
+ children: /* @__PURE__ */jsx(Box, {
225
+ style: {
226
+ display: "flex",
227
+ justifyContent: "center",
228
+ alignItems: "center",
229
+ position: "absolute",
230
+ top: 0,
231
+ left: 0,
232
+ right: 0,
233
+ bottom: 0
234
+ },
235
+ children: /* @__PURE__ */jsx(UnknownIcon, {})
236
+ })
237
+ })
238
+ });
239
+ }
240
+ return /* @__PURE__ */jsx(ErrorBoundary, {
241
+ children: /* @__PURE__ */jsx(Suspense, {
242
+ fallback: /* @__PURE__ */jsx(VideoMediaPreview, {
243
+ isPlaceholder: true,
244
+ title: "Loading thumbnail...",
245
+ subtitle,
246
+ mediaDimensions
247
+ }),
248
+ children: /* @__PURE__ */jsx(PosterImage, {
249
+ showTip,
250
+ asset,
251
+ height,
252
+ width
253
+ })
254
+ })
255
+ });
256
+ });
257
+ const AnimatedVideoMediaPreview = styled(MediaPreview)(_templateObject2 || (_templateObject2 = _taggedTemplateLiteral(["\n img {\n object-fit: contain;\n }\n"])));
258
+ const AnimatedPosterImage = _ref7 => {
259
+ let {
260
+ asset,
261
+ width
262
+ } = _ref7;
263
+ const client = useClient();
264
+ const src = getAnimatedPosterSrc({
265
+ asset,
266
+ client,
267
+ width
268
+ });
269
+ return /* @__PURE__ */jsx(AnimatedVideoMediaPreview, {
270
+ withBorder: false,
271
+ mediaDimensions,
272
+ media: /* @__PURE__ */jsx(ImageLoader, {
273
+ alt: "",
274
+ src,
275
+ width,
276
+ aspectRatio: "16:9"
277
+ })
278
+ });
279
+ };
280
+ const AnimatedVideoThumbnail = memo(function AnimatedVideoThumbnail2(_ref8) {
281
+ let {
282
+ asset,
283
+ width
284
+ } = _ref8;
285
+ const {
286
+ ErrorBoundary,
287
+ didCatch
288
+ } = useErrorBoundary();
289
+ if (didCatch) {
290
+ return null;
291
+ }
292
+ return /* @__PURE__ */jsx(ErrorBoundary, {
293
+ children: /* @__PURE__ */jsx(Suspense, {
294
+ fallback: /* @__PURE__ */jsx(FancyBackdrop, {
295
+ children: /* @__PURE__ */jsx(VideoMediaPreview, {
296
+ mediaDimensions,
297
+ withBorder: false,
298
+ media: /* @__PURE__ */jsx(Spinner, {
299
+ muted: true
300
+ })
301
+ })
302
+ }),
303
+ children: /* @__PURE__ */jsx(Card, {
304
+ height: "fill",
305
+ tone: "transparent",
306
+ children: /* @__PURE__ */jsx(AnimatedPosterImage, {
307
+ asset,
308
+ width
309
+ })
310
+ })
311
+ })
312
+ });
313
+ });
314
+ const FancyBackdrop = styled(Box)(_templateObject3 || (_templateObject3 = _taggedTemplateLiteral(["\n backdrop-filter: blur(8px) brightness(0.5) saturate(2);\n mix-blend-mode: color-dodge;\n"])));
315
+ const ThumbGrid = styled(Grid)(_templateObject4 || (_templateObject4 = _taggedTemplateLiteral(["\n grid-template-columns: repeat(auto-fill, minmax(160px, 1fr));\n"])));
316
+ const CardLoadMore = styled(Card)(_templateObject5 || (_templateObject5 = _taggedTemplateLiteral(["\n border-top: 1px solid var(--card-border-color);\n position: sticky;\n bottom: 0;\n z-index: 200;\n"])));
317
+ export { AnimatedVideoThumbnail, CardLoadMore, ThumbGrid, VideoThumbnail, _id, generateJwt, getPlaybackId, getPlaybackPolicy, getPosterSrc, useAssetDocumentValues, useClient };
318
+ //# sourceMappingURL=VideoSource.styled-e880b6e4.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"VideoSource.styled-e880b6e4.js","sources":["../../src/hooks/useAssetDocumentValues.ts","../../src/hooks/useClient.ts","../../src/util/readSecrets.ts","../../src/util/generateJwt.ts","../../src/util/getPlaybackId.ts","../../src/util/getPlaybackPolicy.ts","../../src/util/getAnimatedPosterSrc.ts","../../src/util/getPosterSrc.ts","../../src/components/VideoSource.styled.tsx"],"sourcesContent":["import {isReference} from 'sanity'\nimport {useDocumentValues} from 'sanity'\n\nimport type {Reference, VideoAssetDocument} from '../util/types'\n\nconst path = ['assetId', 'data', 'playbackId', 'status', 'thumbTime', 'filename']\nexport const useAssetDocumentValues = (asset: Reference | null | undefined) =>\n useDocumentValues<VideoAssetDocument | null | undefined>(\n isReference(asset) ? asset._ref! : '',\n path\n )\n","// As it's required to specify the API Version this custom hook ensures it's all using the same version\nimport {useClient as useSanityClient} from 'sanity'\n\nexport function useClient() {\n return useSanityClient({apiVersion: '2022-09-14'})\n}\n","// Utils with a readName prefix are suspendable and should only be called in the render body\n// Not inside event callbacks or a useEffect.\n// They may be called dynamically, unlike useEffect\n\n// @TODO rename to readSigningPair\n\nimport type {SanityClient} from 'sanity'\nimport {suspend} from 'suspend-react'\n\nimport {cacheNs} from '../util/constants'\nimport {type Secrets} from '../util/types'\n\nexport const _id = 'secrets.mux' as const\n\nexport function readSecrets(client: SanityClient): Secrets {\n const {projectId, dataset} = client.config()\n return suspend(async () => {\n const data = await client.fetch(\n /* groq */ `*[_id == $_id][0]{\n token,\n secretKey,\n enableSignedUrls,\n signingKeyId,\n signingKeyPrivate\n }`,\n {_id}\n )\n return {\n token: data?.token || null,\n secretKey: data?.secretKey || null,\n enableSignedUrls: Boolean(data?.enableSignedUrls) || false,\n signingKeyId: data?.signingKeyId || null,\n signingKeyPrivate: data?.signingKeyPrivate || null,\n }\n }, [cacheNs, _id, projectId, dataset])\n}\n","import type {SanityClient} from 'sanity'\nimport {suspend} from 'suspend-react'\n\nimport {readSecrets} from './readSecrets'\nimport type {AnimatedThumbnailOptions, ThumbnailOptions} from './types'\n\nexport type Audience = 'g' | 's' | 't' | 'v'\n\nexport type Payload<T extends Audience> = T extends 'g'\n ? AnimatedThumbnailOptions\n : T extends 's'\n ? never\n : T extends 't'\n ? ThumbnailOptions\n : T extends 'v'\n ? never\n : never\n\nexport function generateJwt<T extends Audience>(\n client: SanityClient,\n playbackId: string,\n aud: T,\n payload?: Payload<T>\n): string {\n const {signingKeyId, signingKeyPrivate} = readSecrets(client)\n if (!signingKeyId) {\n throw new TypeError('Missing signingKeyId')\n }\n if (!signingKeyPrivate) {\n throw new TypeError('Missing signingKeyPrivate')\n }\n\n const {default: sign} = suspend(() => import('jsonwebtoken-esm/sign'), ['jsonwebtoken-esm/sign'])\n\n return sign(\n payload ? JSON.parse(JSON.stringify(payload, (_, v) => v ?? undefined)) : {},\n atob(signingKeyPrivate),\n {\n algorithm: 'RS256',\n keyid: signingKeyId,\n audience: aud,\n subject: playbackId,\n noTimestamp: true,\n expiresIn: '12h',\n }\n )\n}\n","import type {VideoAssetDocument} from './types'\n\nexport function getPlaybackId(asset: VideoAssetDocument): string {\n if (!asset?.playbackId) {\n console.error('Asset is missing a playbackId', {asset})\n throw new TypeError(`Missing playbackId`)\n }\n return asset.playbackId\n}\n","import type {PlaybackPolicy, VideoAssetDocument} from './types'\n\nexport function getPlaybackPolicy(asset: VideoAssetDocument): PlaybackPolicy {\n return asset.data?.playback_ids?.[0]?.policy ?? 'public'\n}\n","import type {SanityClient} from 'sanity'\n\nimport {generateJwt} from './generateJwt'\nimport {getPlaybackId} from './getPlaybackId'\nimport {getPlaybackPolicy} from './getPlaybackPolicy'\nimport type {AnimatedThumbnailOptions, MuxAnimatedThumbnailUrl, VideoAssetDocument} from './types'\n\nexport interface AnimatedPosterSrcOptions extends AnimatedThumbnailOptions {\n asset: VideoAssetDocument\n client: SanityClient\n}\n\nexport function getAnimatedPosterSrc({\n asset,\n client,\n height,\n width,\n start = asset.thumbTime ? Math.max(0, asset.thumbTime - 2.5) : 0,\n end = start + 5,\n fps = 15,\n}: AnimatedPosterSrcOptions): MuxAnimatedThumbnailUrl {\n const params = {height, width, start, end, fps}\n const playbackId = getPlaybackId(asset)\n\n let searchParams = new URLSearchParams(\n JSON.parse(JSON.stringify(params, (_, v) => v ?? undefined))\n )\n if (getPlaybackPolicy(asset) === 'signed') {\n const token = generateJwt(client, playbackId, 'g', params)\n searchParams = new URLSearchParams({token})\n }\n\n return `https://image.mux.com/${playbackId}/animated.gif?${searchParams}`\n}\n","import type {SanityClient} from 'sanity'\n\nimport {generateJwt} from './generateJwt'\nimport {getPlaybackId} from './getPlaybackId'\nimport {getPlaybackPolicy} from './getPlaybackPolicy'\nimport type {MuxThumbnailUrl, ThumbnailOptions, VideoAssetDocument} from './types'\n\nexport interface PosterSrcOptions extends ThumbnailOptions {\n asset: VideoAssetDocument\n client: SanityClient\n}\n\nexport function getPosterSrc({\n asset,\n client,\n fit_mode,\n height,\n time = asset.thumbTime,\n width,\n}: PosterSrcOptions): MuxThumbnailUrl {\n const params = {fit_mode, height, time, width}\n const playbackId = getPlaybackId(asset)\n\n let searchParams = new URLSearchParams(\n JSON.parse(JSON.stringify(params, (_, v) => v ?? undefined))\n )\n if (getPlaybackPolicy(asset) === 'signed') {\n const token = generateJwt(client, playbackId, 't', params)\n searchParams = new URLSearchParams({token})\n }\n\n return `https://image.mux.com/${playbackId}/thumbnail.png?${searchParams}`\n}\n","import {LockIcon, UnknownIcon} from '@sanity/icons'\nimport {Box, Card, Grid, Inline, Spinner} from '@sanity/ui'\nimport React, {memo, Suspense, useMemo} from 'react'\nimport {MediaPreview} from 'sanity'\nimport styled from 'styled-components'\nimport {suspend} from 'suspend-react'\nimport {useErrorBoundary} from 'use-error-boundary'\n\nimport {useClient} from '../hooks/useClient'\nimport {getAnimatedPosterSrc} from '../util/getAnimatedPosterSrc'\nimport {getPlaybackPolicy} from '../util/getPlaybackPolicy'\nimport {getPosterSrc} from '../util/getPosterSrc'\nimport type {VideoAssetDocument} from '../util/types'\n\nconst mediaDimensions = {aspect: 16 / 9}\n\ninterface ImageLoaderProps {\n alt: string\n src: string\n height?: number\n width: number\n aspectRatio?: string\n}\nconst ImageLoader = memo(function ImageLoader({\n alt,\n src,\n height,\n width,\n aspectRatio,\n}: ImageLoaderProps) {\n suspend(async () => {\n const img = new Image(width, height)\n img.decoding = 'async'\n img.src = src\n await img.decode()\n }, ['sanity-plugin-mux-input', 'image', src])\n\n return <img alt={alt} src={src} height={height} width={width} style={{aspectRatio}} />\n})\n\n// @TODO fix typings errors due to props.renderDefault\nconst VideoMediaPreview = styled<any>(MediaPreview)`\n img {\n object-fit: cover;\n }\n`\n\ninterface VideoMediaPreviewSignedSubtitleProps {\n solo?: boolean\n}\nconst VideoMediaPreviewSignedSubtitle = ({solo}: VideoMediaPreviewSignedSubtitleProps) => {\n return (\n <Inline\n space={1}\n style={{\n marginTop: solo ? '-1.35em' : undefined,\n marginBottom: solo ? undefined : '0.35rem',\n }}\n >\n <LockIcon />\n Signed playback policy\n </Inline>\n )\n}\n\ninterface PosterImageProps extends Omit<ImageLoaderProps, 'src' | 'alt'> {\n asset: VideoAssetDocument\n showTip?: boolean\n}\nconst PosterImage = ({asset, height, width, showTip}: PosterImageProps) => {\n const client = useClient()\n const src = getPosterSrc({\n asset,\n client,\n height,\n width,\n fit_mode: 'smartcrop',\n })\n const subtitle = useMemo(\n () =>\n showTip && getPlaybackPolicy(asset) === 'signed' ? (\n <VideoMediaPreviewSignedSubtitle solo />\n ) : undefined,\n [asset, showTip]\n )\n\n // eslint-disable-next-line no-warning-comments\n // @TODO support setting the alt text in the schema, like how we deal with images\n return (\n <VideoMediaPreview\n mediaDimensions={mediaDimensions}\n subtitle={subtitle}\n title={<>{null}</>}\n media={<ImageLoader alt=\"\" src={src} height={height} width={width} />}\n />\n )\n}\n\nexport interface VideoThumbnailProps extends Omit<PosterImageProps, 'height'> {\n width: number\n}\nexport const VideoThumbnail = memo(function VideoThumbnail({\n asset,\n width,\n showTip,\n}: VideoThumbnailProps) {\n const {ErrorBoundary, didCatch, error} = useErrorBoundary()\n const height = Math.round((width * 9) / 16)\n const subtitle = useMemo(\n () =>\n showTip && getPlaybackPolicy(asset) === 'signed' ? (\n <VideoMediaPreviewSignedSubtitle />\n ) : undefined,\n [showTip, asset]\n )\n\n if (didCatch) {\n return (\n <VideoMediaPreview\n subtitle={error.message}\n mediaDimensions={mediaDimensions}\n title=\"Error when loading thumbnail\"\n media={\n <Card radius={2} height=\"fill\" style={{position: 'relative', width: '100%'}}>\n <Box\n style={{\n display: 'flex',\n justifyContent: 'center',\n alignItems: 'center',\n position: 'absolute',\n top: 0,\n left: 0,\n right: 0,\n bottom: 0,\n }}\n >\n <UnknownIcon />\n </Box>\n </Card>\n }\n />\n )\n }\n\n return (\n <ErrorBoundary>\n <Suspense\n fallback={\n <VideoMediaPreview\n isPlaceholder\n title=\"Loading thumbnail...\"\n subtitle={subtitle}\n mediaDimensions={mediaDimensions}\n />\n }\n >\n <PosterImage showTip={showTip} asset={asset} height={height} width={width} />\n </Suspense>\n </ErrorBoundary>\n )\n})\n\n// @TODO fix typings errors due to props.renderDefault\nconst AnimatedVideoMediaPreview = styled<any>(MediaPreview)`\n img {\n object-fit: contain;\n }\n`\n\ninterface AnimatedPosterImageProps extends Omit<ImageLoaderProps, 'src' | 'alt' | 'height'> {\n asset: VideoAssetDocument\n}\nconst AnimatedPosterImage = ({asset, width}: AnimatedPosterImageProps) => {\n const client = useClient()\n const src = getAnimatedPosterSrc({asset, client, width})\n\n // eslint-disable-next-line no-warning-comments\n // @TODO support setting the alt text in the schema, like how we deal with images\n return (\n <AnimatedVideoMediaPreview\n withBorder={false}\n mediaDimensions={mediaDimensions}\n media={<ImageLoader alt=\"\" src={src} width={width} aspectRatio=\"16:9\" />}\n />\n )\n}\n\nexport interface AnimatedVideoThumbnailProps extends Omit<PosterImageProps, 'height'> {\n width: number\n}\nexport const AnimatedVideoThumbnail = memo(function AnimatedVideoThumbnail({\n asset,\n width,\n}: AnimatedVideoThumbnailProps) {\n const {ErrorBoundary, didCatch} = useErrorBoundary()\n\n if (didCatch) {\n return null\n }\n\n return (\n <ErrorBoundary>\n <Suspense\n fallback={\n <FancyBackdrop>\n <VideoMediaPreview\n mediaDimensions={mediaDimensions}\n withBorder={false}\n media={<Spinner muted />}\n />\n </FancyBackdrop>\n }\n >\n <Card height=\"fill\" tone=\"transparent\">\n <AnimatedPosterImage asset={asset} width={width} />\n </Card>\n </Suspense>\n </ErrorBoundary>\n )\n})\nconst FancyBackdrop = styled(Box)`\n backdrop-filter: blur(8px) brightness(0.5) saturate(2);\n mix-blend-mode: color-dodge;\n`\n\nexport const ThumbGrid = styled(Grid)`\n grid-template-columns: repeat(auto-fill, minmax(160px, 1fr));\n`\n\nexport const CardLoadMore = styled(Card)`\n border-top: 1px solid var(--card-border-color);\n position: sticky;\n bottom: 0;\n z-index: 200;\n`\n"],"names":["path","useAssetDocumentValues","asset","useDocumentValues","isReference","_ref","useClient","useSanityClient","apiVersion","_id","readSecrets","client","projectId","dataset","config","suspend","data","fetch","token","secretKey","enableSignedUrls","Boolean","signingKeyId","signingKeyPrivate","cacheNs","generateJwt","playbackId","aud","payload","TypeError","default","sign","JSON","parse","stringify","_","v","atob","algorithm","keyid","audience","subject","noTimestamp","expiresIn","getPlaybackId","console","error","getPlaybackPolicy","_a","_b","_c","_d","playback_ids","policy","getAnimatedPosterSrc","height","width","start","thumbTime","Math","max","end","fps","params","searchParams","URLSearchParams","getPosterSrc","fit_mode","time","mediaDimensions","aspect","ImageLoader","memo","alt","src","aspectRatio","img","Image","decoding","decode","jsx","style","VideoMediaPreview","styled","MediaPreview","VideoMediaPreviewSignedSubtitle","solo","jsxs","Inline","space","marginTop","marginBottom","children","LockIcon","PosterImage","showTip","subtitle","useMemo","title","media","VideoThumbnail","ErrorBoundary","didCatch","useErrorBoundary","round","message","Card","radius","position","Box","display","justifyContent","alignItems","top","left","right","bottom","UnknownIcon","Suspense","fallback","isPlaceholder","AnimatedVideoMediaPreview","AnimatedPosterImage","withBorder","AnimatedVideoThumbnail","FancyBackdrop","Spinner","muted","tone","ThumbGrid","Grid","CardLoadMore"],"mappings":"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"}
@@ -0,0 +1,248 @@
1
+ var _templateObject;
2
+ function _taggedTemplateLiteral(strings, raw) { if (!raw) { raw = strings.slice(0); } return Object.freeze(Object.defineProperties(strings, { raw: { value: Object.freeze(raw) } })); }
3
+ import { isObjectInputProps, definePlugin } from 'sanity';
4
+ import { jsx, jsxs } from 'react/jsx-runtime';
5
+ import { memo, useRef, useCallback, lazy, Suspense } from 'react';
6
+ import { useToast, Flex, Inline, Button, Card, Grid, Heading, Text, Spinner, Box } from '@sanity/ui';
7
+ import scrollIntoView from 'scroll-into-view-if-needed';
8
+ import { clear } from 'suspend-react';
9
+ import { useErrorBoundary } from 'use-error-boundary';
10
+ import styled from 'styled-components';
11
+ function isMuxInputProps(props) {
12
+ var _a;
13
+ return isObjectInputProps(props) && ((_a = props.schemaType.type) == null ? void 0 : _a.name) === "mux.video";
14
+ }
15
+ function isMuxInputPreviewProps(props) {
16
+ var _a, _b;
17
+ return ((_b = (_a = props.schemaType) == null ? void 0 : _a.type) == null ? void 0 : _b.name) === "mux.video";
18
+ }
19
+ const name = "mux-input";
20
+ const cacheNs = "sanity-plugin-mux-input";
21
+ const muxSecretsDocumentId = "secrets.mux";
22
+ function ErrorBoundaryCard(props) {
23
+ const {
24
+ children,
25
+ schemaType
26
+ } = props;
27
+ const {
28
+ push: pushToast
29
+ } = useToast();
30
+ const errorRef = useRef(null);
31
+ const {
32
+ ErrorBoundary,
33
+ didCatch,
34
+ error,
35
+ reset
36
+ } = useErrorBoundary({
37
+ onDidCatch: (err, errorInfo) => {
38
+ console.group(err.toString());
39
+ console.groupCollapsed("console.error");
40
+ console.error(err);
41
+ console.groupEnd();
42
+ if (err.stack) {
43
+ console.groupCollapsed("error.stack");
44
+ console.log(err.stack);
45
+ console.groupEnd();
46
+ }
47
+ if (errorInfo == null ? void 0 : errorInfo.componentStack) {
48
+ console.groupCollapsed("errorInfo.componentStack");
49
+ console.log(errorInfo.componentStack);
50
+ console.groupEnd();
51
+ }
52
+ console.groupEnd();
53
+ pushToast({
54
+ status: "error",
55
+ title: "Plugin crashed",
56
+ description: /* @__PURE__ */jsx(Flex, {
57
+ align: "center",
58
+ children: /* @__PURE__ */jsxs(Inline, {
59
+ space: 1,
60
+ children: ["An error happened while rendering", /* @__PURE__ */jsx(Button, {
61
+ padding: 1,
62
+ fontSize: 1,
63
+ style: {
64
+ transform: "translateY(1px)"
65
+ },
66
+ mode: "ghost",
67
+ text: schemaType.title,
68
+ onClick: () => {
69
+ if (errorRef.current) {
70
+ scrollIntoView(errorRef.current, {
71
+ behavior: "smooth",
72
+ scrollMode: "if-needed",
73
+ block: "center"
74
+ });
75
+ }
76
+ }
77
+ })]
78
+ })
79
+ })
80
+ });
81
+ }
82
+ });
83
+ const handleRetry = useCallback(() => {
84
+ clear([name]);
85
+ reset();
86
+ }, [reset]);
87
+ if (didCatch) {
88
+ return /* @__PURE__ */jsx(Card, {
89
+ ref: errorRef,
90
+ paddingX: [2, 3, 4, 4],
91
+ height: "fill",
92
+ shadow: 1,
93
+ overflow: "auto",
94
+ children: /* @__PURE__ */jsx(Flex, {
95
+ justify: "flex-start",
96
+ align: "center",
97
+ height: "fill",
98
+ children: /* @__PURE__ */jsxs(Grid, {
99
+ columns: 1,
100
+ gap: [2, 3, 4, 4],
101
+ children: [/* @__PURE__ */jsxs(Heading, {
102
+ as: "h1",
103
+ children: ["The ", /* @__PURE__ */jsx("code", {
104
+ children: name
105
+ }), " plugin crashed"]
106
+ }), (error == null ? void 0 : error.message) && /* @__PURE__ */jsx(Card, {
107
+ padding: 3,
108
+ tone: "critical",
109
+ shadow: 1,
110
+ radius: 2,
111
+ children: /* @__PURE__ */jsx(Text, {
112
+ children: error.message
113
+ })
114
+ }), /* @__PURE__ */jsx(Inline, {
115
+ children: /* @__PURE__ */jsx(Button, {
116
+ onClick: handleRetry,
117
+ text: "Retry"
118
+ })
119
+ })]
120
+ })
121
+ })
122
+ });
123
+ }
124
+ return /* @__PURE__ */jsx(ErrorBoundary, {
125
+ children
126
+ });
127
+ }
128
+ var ErrorBoundaryCard$1 = memo(ErrorBoundaryCard);
129
+ const AspectRatioCard = styled(Card)(_templateObject || (_templateObject = _taggedTemplateLiteral(["\n aspect-ratio: 16 / 9;\n position: relative;\n width: 100%;\n"])));
130
+ const InputFallback = () => {
131
+ return /* @__PURE__ */jsx("div", {
132
+ style: {
133
+ padding: 1
134
+ },
135
+ children: /* @__PURE__ */jsx(Card, {
136
+ shadow: 1,
137
+ sizing: "border",
138
+ style: {
139
+ aspectRatio: "16/9",
140
+ width: "100%",
141
+ borderRadius: "1px"
142
+ },
143
+ children: /* @__PURE__ */jsxs(Flex, {
144
+ align: "center",
145
+ direction: "column",
146
+ height: "fill",
147
+ justify: "center",
148
+ children: [/* @__PURE__ */jsx(Spinner, {
149
+ muted: true
150
+ }), /* @__PURE__ */jsx(Box, {
151
+ marginTop: 3,
152
+ children: /* @__PURE__ */jsx(Text, {
153
+ align: "center",
154
+ muted: true,
155
+ size: 1,
156
+ children: "Loading\u2026"
157
+ })
158
+ })]
159
+ })
160
+ })
161
+ });
162
+ };
163
+ const Input = lazy(() => import('./Input-4e0aa2ef.js'));
164
+ var createFormInput = config => memo(function FormInput(props) {
165
+ if (isMuxInputProps(props)) {
166
+ return /* @__PURE__ */jsx(AspectRatioCard, {
167
+ children: /* @__PURE__ */jsx(ErrorBoundaryCard$1, {
168
+ schemaType: props.schemaType,
169
+ children: /* @__PURE__ */jsx(Suspense, {
170
+ fallback: /* @__PURE__ */jsx(InputFallback, {}),
171
+ children: /* @__PURE__ */jsx(Input, {
172
+ config,
173
+ ...props
174
+ })
175
+ })
176
+ })
177
+ });
178
+ }
179
+ return props.renderDefault(props);
180
+ });
181
+ const Preview = lazy(() => import('./Preview-3e4c2ec9.js'));
182
+ var FormPreview = memo(function FormPreview(props) {
183
+ if (isMuxInputPreviewProps(props)) {
184
+ return /* @__PURE__ */jsx(AspectRatioCard, {
185
+ children: /* @__PURE__ */jsx(Preview, {
186
+ ...props
187
+ })
188
+ });
189
+ }
190
+ return props.renderDefault(props);
191
+ });
192
+ const defaultConfig = {
193
+ mp4_support: "none"
194
+ };
195
+ const muxInput = definePlugin(userConfig => {
196
+ const config = {
197
+ ...defaultConfig,
198
+ ...userConfig
199
+ };
200
+ const InputComponent = createFormInput(config);
201
+ return {
202
+ name: "mux-input",
203
+ form: {
204
+ components: {
205
+ input: InputComponent,
206
+ preview: FormPreview
207
+ }
208
+ },
209
+ schema: {
210
+ types: [{
211
+ name: "mux.video",
212
+ type: "object",
213
+ title: "Video asset reference",
214
+ fields: [{
215
+ title: "Video",
216
+ name: "asset",
217
+ type: "reference",
218
+ weak: true,
219
+ to: [{
220
+ type: "mux.videoAsset"
221
+ }]
222
+ }]
223
+ }, {
224
+ name: "mux.videoAsset",
225
+ type: "object",
226
+ title: "Video asset",
227
+ fields: [{
228
+ type: "string",
229
+ name: "status"
230
+ }, {
231
+ type: "string",
232
+ name: "assetId"
233
+ }, {
234
+ type: "string",
235
+ name: "playbackId"
236
+ }, {
237
+ type: "string",
238
+ name: "filename"
239
+ }, {
240
+ type: "number",
241
+ name: "thumbTime"
242
+ }]
243
+ }]
244
+ }
245
+ };
246
+ });
247
+ export { InputFallback, cacheNs, defaultConfig, muxInput, muxSecretsDocumentId };
248
+ //# sourceMappingURL=index-a9d40189.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index-a9d40189.js","sources":["../../src/util/asserters.ts","../../src/util/constants.ts","../../src/components/ErrorBoundaryCard.tsx","../../src/components/Input.styled.tsx","../../src/components/FormInput.tsx","../../src/components/FormPreview.tsx","../../src/index.ts"],"sourcesContent":["import {type InputProps, type PreviewLayoutKey, type PreviewProps, isObjectInputProps} from 'sanity'\n\nimport type {MuxInputPreviewProps, MuxInputProps} from './types'\n\nexport function isMuxInputProps(props: InputProps): props is MuxInputProps {\n return isObjectInputProps(props) && props.schemaType.type?.name === 'mux.video'\n}\n\nexport function isMuxInputPreviewProps(\n props: PreviewProps<PreviewLayoutKey>\n): props is MuxInputPreviewProps {\n return props.schemaType?.type?.name === 'mux.video'\n}\n","export const name = 'mux-input' as const\n\n// Caching namespace, as suspend-react might be in use by other components on the page we must ensure we don't collide\nexport const cacheNs = 'sanity-plugin-mux-input' as const\n\nexport const muxSecretsDocumentId = 'secrets.mux' as const\n","/* eslint-disable no-console */\nimport {Button, Card, Flex, Grid, Heading, Inline, Text, useToast} from '@sanity/ui'\nimport React, {memo, useCallback, useRef} from 'react'\nimport scrollIntoView from 'scroll-into-view-if-needed'\nimport {clear} from 'suspend-react'\nimport {useErrorBoundary} from 'use-error-boundary'\n\nimport {name} from '../util/constants'\nimport {type MuxInputProps} from '../util/types'\n\nexport interface Props extends Pick<MuxInputProps, 'schemaType'> {\n children: React.ReactNode\n}\nfunction ErrorBoundaryCard(props: Props) {\n const {children, schemaType} = props\n const {push: pushToast} = useToast()\n const errorRef = useRef(null)\n const {ErrorBoundary, didCatch, error, reset} = useErrorBoundary({\n onDidCatch: (err, errorInfo) => {\n console.group(err.toString())\n console.groupCollapsed('console.error')\n console.error(err)\n console.groupEnd()\n if (err.stack) {\n console.groupCollapsed('error.stack')\n console.log(err.stack)\n console.groupEnd()\n }\n if (errorInfo?.componentStack) {\n console.groupCollapsed('errorInfo.componentStack')\n console.log(errorInfo.componentStack)\n console.groupEnd()\n }\n console.groupEnd()\n pushToast({\n status: 'error',\n title: 'Plugin crashed',\n description: (\n <Flex align=\"center\">\n <Inline space={1}>\n An error happened while rendering\n <Button\n padding={1}\n fontSize={1}\n style={{transform: 'translateY(1px)'}}\n mode=\"ghost\"\n text={schemaType.title}\n onClick={() => {\n if (errorRef.current) {\n scrollIntoView(errorRef.current, {\n behavior: 'smooth',\n scrollMode: 'if-needed',\n block: 'center',\n })\n }\n }}\n />\n </Inline>\n </Flex>\n ),\n })\n },\n })\n const handleRetry = useCallback(() => {\n // Purge request cache before retrying, otherwise the cached errors will rethrow\n clear([name])\n\n reset()\n }, [reset])\n\n if (didCatch) {\n return (\n <Card ref={errorRef} paddingX={[2, 3, 4, 4]} height=\"fill\" shadow={1} overflow=\"auto\">\n <Flex justify=\"flex-start\" align=\"center\" height=\"fill\">\n <Grid columns={1} gap={[2, 3, 4, 4]}>\n <Heading as=\"h1\">\n The <code>{name}</code> plugin crashed\n </Heading>\n {error?.message && (\n <Card padding={3} tone=\"critical\" shadow={1} radius={2}>\n <Text>{error.message}</Text>\n </Card>\n )}\n <Inline>\n <Button onClick={handleRetry} text=\"Retry\" />\n </Inline>\n </Grid>\n </Flex>\n </Card>\n )\n }\n\n return <ErrorBoundary>{children}</ErrorBoundary>\n}\n\nexport default memo(ErrorBoundaryCard)\n","import {Box, Card, Flex, Spinner, Text} from '@sanity/ui'\nimport React from 'react'\nimport styled from 'styled-components'\n\n// This container base container ensures everything uses the same aspect ratio, avoids layout shifts and stuff jumping around\nexport const AspectRatioCard = styled(Card)`\n aspect-ratio: 16 / 9;\n position: relative;\n width: 100%;\n`\n\nexport const InputFallback = () => {\n return (\n <div style={{padding: 1}}>\n <Card\n shadow={1}\n sizing=\"border\"\n style={{aspectRatio: '16/9', width: '100%', borderRadius: '1px'}}\n >\n <Flex align=\"center\" direction=\"column\" height=\"fill\" justify=\"center\">\n <Spinner muted />\n <Box marginTop={3}>\n <Text align=\"center\" muted size={1}>\n Loading…\n </Text>\n </Box>\n </Flex>\n </Card>\n </div>\n )\n}\n","import React, {lazy, memo, Suspense} from 'react'\nimport {type InputProps} from 'sanity'\n\nimport {isMuxInputProps} from '../util/asserters'\nimport {type Config} from '../util/types'\nimport ErrorBoundaryCard from './ErrorBoundaryCard'\nimport {AspectRatioCard, InputFallback} from './Input.styled'\n\nconst Input = lazy(() => import('./Input'))\n\n// eslint-disable-next-line import/no-anonymous-default-export\nexport default (config: Config) =>\n memo(function FormInput(props: InputProps) {\n if (isMuxInputProps(props)) {\n return (\n <AspectRatioCard>\n <ErrorBoundaryCard schemaType={props.schemaType}>\n <Suspense fallback={<InputFallback />}>\n <Input config={config} {...props} />\n </Suspense>\n </ErrorBoundaryCard>\n </AspectRatioCard>\n )\n }\n return props.renderDefault(props)\n })\n","import React, {lazy, memo} from 'react'\nimport {PreviewLayoutKey, PreviewProps} from 'sanity'\n\nimport {isMuxInputPreviewProps} from '../util/asserters'\nimport {AspectRatioCard} from './Input.styled'\n\nconst Preview = lazy(() => import('./Preview'))\n\nexport default memo(function FormPreview(props: PreviewProps<PreviewLayoutKey>) {\n if (isMuxInputPreviewProps(props)) {\n return (\n <AspectRatioCard>\n {/* @ts-expect-error */}\n <Preview {...props} />\n </AspectRatioCard>\n )\n }\n return props.renderDefault(props)\n})\n","import {definePlugin} from 'sanity'\n\nimport createFormInput from './components/FormInput'\nimport FormPreview from './components/FormPreview'\nimport {type Config} from './util/types'\n\nexport const defaultConfig: Config = {\n mp4_support: 'none',\n}\n\nexport const muxInput = definePlugin<Partial<Config> | void>((userConfig) => {\n const config: Config = {...defaultConfig, ...userConfig}\n const InputComponent = createFormInput(config)\n return {\n name: 'mux-input',\n form: {\n components: {\n input: InputComponent,\n preview: FormPreview,\n },\n },\n schema: {\n types: [\n {\n name: 'mux.video',\n type: 'object',\n title: 'Video asset reference',\n fields: [\n {\n title: 'Video',\n name: 'asset',\n type: 'reference',\n weak: true,\n to: [{type: 'mux.videoAsset'}],\n },\n ],\n },\n {\n name: 'mux.videoAsset',\n type: 'object',\n title: 'Video asset',\n fields: [\n {\n type: 'string',\n name: 'status',\n },\n {\n type: 'string',\n name: 'assetId',\n },\n {\n type: 'string',\n name: 'playbackId',\n },\n {\n type: 'string',\n name: 'filename',\n },\n {\n type: 'number',\n name: 'thumbTime',\n },\n ],\n },\n ],\n },\n }\n})\n"],"names":["isMuxInputProps","props","_a","isObjectInputProps","schemaType","type","name","isMuxInputPreviewProps","_b","cacheNs","muxSecretsDocumentId","ErrorBoundaryCard","children","push","pushToast","useToast","errorRef","useRef","ErrorBoundary","didCatch","error","reset","useErrorBoundary","onDidCatch","err","errorInfo","console","group","toString","groupCollapsed","groupEnd","stack","log","componentStack","status","title","description","Flex","align","jsxs","Inline","space","jsx","Button","padding","fontSize","style","transform","mode","text","onClick","current","scrollIntoView","behavior","scrollMode","block","handleRetry","useCallback","clear","Card","ref","paddingX","height","shadow","overflow","justify","Grid","columns","gap","Heading","as","message","tone","radius","Text","ErrorBoundaryCard$1","memo","AspectRatioCard","styled","InputFallback","sizing","aspectRatio","width","borderRadius","direction","Spinner","muted","Box","marginTop","size","Input","lazy","createFormInput","config","FormInput","Suspense","fallback","renderDefault","Preview","FormPreview","defaultConfig","mp4_support","muxInput","definePlugin","userConfig","InputComponent","form","components","input","preview","schema","types","fields","weak","to"],"mappings":"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"}