@se-studio/core-ui 1.20.0 → 1.22.0

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 (55) hide show
  1. package/CHANGELOG.md +24 -0
  2. package/dist/components/ClientMonitor.d.ts.map +1 -1
  3. package/dist/components/ClientMonitor.js +2 -0
  4. package/dist/components/ClientMonitor.js.map +1 -1
  5. package/dist/components/DotLottieAnimationComponent.d.ts +16 -0
  6. package/dist/components/DotLottieAnimationComponent.d.ts.map +1 -0
  7. package/dist/components/DotLottieAnimationComponent.js +88 -0
  8. package/dist/components/DotLottieAnimationComponent.js.map +1 -0
  9. package/dist/components/LazyAnimation.d.ts +11 -1
  10. package/dist/components/LazyAnimation.d.ts.map +1 -1
  11. package/dist/components/LazyAnimation.js +62 -18
  12. package/dist/components/LazyAnimation.js.map +1 -1
  13. package/dist/components/dotlottieWasm.d.ts +19 -0
  14. package/dist/components/dotlottieWasm.d.ts.map +1 -0
  15. package/dist/components/dotlottieWasm.js +62 -0
  16. package/dist/components/dotlottieWasm.js.map +1 -0
  17. package/dist/index.d.ts +2 -0
  18. package/dist/index.d.ts.map +1 -1
  19. package/dist/index.js +2 -0
  20. package/dist/index.js.map +1 -1
  21. package/dist/media-library/MediaLibraryAnimationPlayer.d.ts +9 -0
  22. package/dist/media-library/MediaLibraryAnimationPlayer.d.ts.map +1 -0
  23. package/dist/media-library/MediaLibraryAnimationPlayer.js +99 -0
  24. package/dist/media-library/MediaLibraryAnimationPlayer.js.map +1 -0
  25. package/dist/media-library/MediaLibraryGrid.d.ts +5 -0
  26. package/dist/media-library/MediaLibraryGrid.d.ts.map +1 -0
  27. package/dist/media-library/MediaLibraryGrid.js +88 -0
  28. package/dist/media-library/MediaLibraryGrid.js.map +1 -0
  29. package/dist/media-library/MediaLibraryPage.d.ts +17 -0
  30. package/dist/media-library/MediaLibraryPage.d.ts.map +1 -0
  31. package/dist/media-library/MediaLibraryPage.js +30 -0
  32. package/dist/media-library/MediaLibraryPage.js.map +1 -0
  33. package/dist/media-library/index.d.ts +4 -0
  34. package/dist/media-library/index.d.ts.map +1 -0
  35. package/dist/media-library/index.js +4 -0
  36. package/dist/media-library/index.js.map +1 -0
  37. package/dist/media-library/types.d.ts +8 -0
  38. package/dist/media-library/types.d.ts.map +1 -0
  39. package/dist/media-library/types.js +12 -0
  40. package/dist/media-library/types.js.map +1 -0
  41. package/dist/route-handlers/createCmsTxtHandler.d.ts.map +1 -1
  42. package/dist/route-handlers/createCmsTxtHandler.js +28 -0
  43. package/dist/route-handlers/createCmsTxtHandler.js.map +1 -1
  44. package/dist/route-handlers/createMediaLibraryHandler.d.ts +19 -0
  45. package/dist/route-handlers/createMediaLibraryHandler.d.ts.map +1 -0
  46. package/dist/route-handlers/createMediaLibraryHandler.js +76 -0
  47. package/dist/route-handlers/createMediaLibraryHandler.js.map +1 -0
  48. package/dist/route-handlers/index.d.ts +2 -0
  49. package/dist/route-handlers/index.d.ts.map +1 -1
  50. package/dist/route-handlers/index.js +1 -0
  51. package/dist/route-handlers/index.js.map +1 -1
  52. package/dist/showcase/mockFactory.d.ts.map +1 -1
  53. package/dist/showcase/mockFactory.js +11 -0
  54. package/dist/showcase/mockFactory.js.map +1 -1
  55. package/package.json +7 -3
@@ -0,0 +1,99 @@
1
+ 'use client';
2
+ import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
3
+ import { useEffect, useState } from 'react';
4
+ import { getDotLottieWasmUrl } from '../components/dotlottieWasm';
5
+ let playerModulePromise = null;
6
+ function isAbortError(e) {
7
+ if (!e || typeof e !== 'object')
8
+ return false;
9
+ const err = e;
10
+ return err.name === 'AbortError' || (err.message ?? '').includes('aborted');
11
+ }
12
+ /**
13
+ * Load DotLottie once per page. Prefer self-hosted WASM; if missing, leave the
14
+ * library default (built-in CDN backup) so we do not hardcode a package version.
15
+ */
16
+ async function loadDotLottieModule() {
17
+ if (!playerModulePromise) {
18
+ playerModulePromise = (async () => {
19
+ const mod = (await import('@lottiefiles/dotlottie-react'));
20
+ const local = getDotLottieWasmUrl();
21
+ if (local.startsWith('http://') || local.startsWith('https://')) {
22
+ mod.setWasmUrl?.(local);
23
+ return mod;
24
+ }
25
+ try {
26
+ const res = await fetch(local, { method: 'HEAD', cache: 'no-store' });
27
+ if (res.ok) {
28
+ const type = res.headers.get('content-type') ?? '';
29
+ if (!type.includes('text/html')) {
30
+ mod.setWasmUrl?.(local);
31
+ }
32
+ }
33
+ }
34
+ catch {
35
+ // Leave library default WASM resolution
36
+ }
37
+ return mod;
38
+ })().catch((err) => {
39
+ playerModulePromise = null;
40
+ throw err;
41
+ });
42
+ }
43
+ return playerModulePromise;
44
+ }
45
+ /**
46
+ * Lightweight DotLottie player for the media library (one-at-a-time play).
47
+ * Always plays while the card is active (no viewport pause).
48
+ */
49
+ export function MediaLibraryAnimationPlayer({ src, label, }) {
50
+ const [Player, setPlayer] = useState(null);
51
+ const [error, setError] = useState(null);
52
+ const [status, setStatus] = useState('loading');
53
+ useEffect(() => {
54
+ let cancelled = false;
55
+ setStatus('loading');
56
+ setError(null);
57
+ void (async () => {
58
+ try {
59
+ const mod = await loadDotLottieModule();
60
+ if (cancelled)
61
+ return;
62
+ if (!mod.DotLottieReact) {
63
+ throw new Error('@lottiefiles/dotlottie-react has no DotLottieReact export');
64
+ }
65
+ setPlayer(() => mod.DotLottieReact);
66
+ setStatus('ready');
67
+ }
68
+ catch (e) {
69
+ if (cancelled || isAbortError(e))
70
+ return;
71
+ setStatus('error');
72
+ setError(e instanceof Error ? e.message : 'Failed to load DotLottie');
73
+ }
74
+ })();
75
+ return () => {
76
+ cancelled = true;
77
+ };
78
+ }, []);
79
+ if (status === 'error') {
80
+ return (_jsxs("div", { className: "flex h-full w-full flex-col items-center justify-center gap-[6px] bg-[#f3f4f6] px-[8px] text-center", children: [_jsx("span", { className: "text-[11px] font-[600] text-[#b91c1c]", children: "Animation failed" }), _jsx("span", { className: "text-[10px] leading-[1.3] text-[#6b7280]", children: error }), _jsx("a", { href: src, target: "_blank", rel: "noreferrer", className: "text-[11px] text-[#2563eb] underline", children: "Open asset URL" })] }));
81
+ }
82
+ if (status === 'loading' || !Player) {
83
+ return (_jsx("div", { className: "flex h-full w-full items-center justify-center bg-[#ffffff] text-[11px] text-[#9ca3af]", children: "Loading player\u2026" }));
84
+ }
85
+ return (_jsx("div", { className: "h-full w-full bg-[#ffffff]", style: { minHeight: 200 }, "aria-label": label ?? 'Animation', role: "img", "data-se-animation": "media-library-dotlottie", children: _jsx(Player, { src: src, loop: true, autoplay: true, style: { width: '100%', height: '100%', display: 'block', minHeight: 200 }, layout: { fit: 'contain', align: [0.5, 0.5] }, renderConfig: {
86
+ autoResize: true,
87
+ devicePixelRatio: Math.min(window.devicePixelRatio || 1, 2),
88
+ }, dotLottieRefCallback: (ref) => {
89
+ if (!ref)
90
+ return;
91
+ try {
92
+ ref.play();
93
+ }
94
+ catch {
95
+ // ignore destroyed instances
96
+ }
97
+ } }, src) }));
98
+ }
99
+ //# sourceMappingURL=MediaLibraryAnimationPlayer.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"MediaLibraryAnimationPlayer.js","sourceRoot":"","sources":["../../src/media-library/MediaLibraryAnimationPlayer.tsx"],"names":[],"mappings":"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"}
@@ -0,0 +1,5 @@
1
+ import type { MediaLibraryItem } from './types';
2
+ export declare function MediaLibraryGrid({ items }: {
3
+ items: MediaLibraryItem[];
4
+ }): import("react").JSX.Element;
5
+ //# sourceMappingURL=MediaLibraryGrid.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"MediaLibraryGrid.d.ts","sourceRoot":"","sources":["../../src/media-library/MediaLibraryGrid.tsx"],"names":[],"mappings":"AAIA,OAAO,KAAK,EAAE,gBAAgB,EAAoB,MAAM,SAAS,CAAC;AA8NlE,wBAAgB,gBAAgB,CAAC,EAAE,KAAK,EAAE,EAAE;IAAE,KAAK,EAAE,gBAAgB,EAAE,CAAA;CAAE,+BAwBxE"}
@@ -0,0 +1,88 @@
1
+ 'use client';
2
+ import { jsx as _jsx, jsxs as _jsxs, Fragment as _Fragment } from "react/jsx-runtime";
3
+ import { useCallback, useState } from 'react';
4
+ import { MediaLibraryAnimationPlayer } from './MediaLibraryAnimationPlayer';
5
+ function formatDimensions(width, height) {
6
+ if (width != null && height != null)
7
+ return `${width}×${height}`;
8
+ return '—';
9
+ }
10
+ function formatSize(sizeBytes) {
11
+ if (sizeBytes == null)
12
+ return '';
13
+ if (sizeBytes < 1024)
14
+ return `${sizeBytes} B`;
15
+ if (sizeBytes < 1024 * 1024)
16
+ return `${Math.round(sizeBytes / 1024)} KB`;
17
+ return `${(sizeBytes / (1024 * 1024)).toFixed(1)} MB`;
18
+ }
19
+ function placeholderLabel(kind) {
20
+ switch (kind) {
21
+ case 'videos':
22
+ return 'Video';
23
+ case 'animations':
24
+ return 'Animation';
25
+ case 'external-videos':
26
+ return 'External';
27
+ default:
28
+ return 'Media';
29
+ }
30
+ }
31
+ function isPlayable(kind) {
32
+ return kind === 'videos' || kind === 'animations' || kind === 'external-videos';
33
+ }
34
+ function tryGetYouTubeId(url) {
35
+ const match = url.match(/(?:https?:\/\/)?(?:www\.|m\.)?(?:youtube\.com\/(?:watch\?(?:.*&)?v=|embed\/|v\/|shorts\/)|youtu\.be\/)([\w-]{11})/);
36
+ return match?.[1] ?? null;
37
+ }
38
+ function tryGetVimeoId(url) {
39
+ if (!url.includes('vimeo.com'))
40
+ return null;
41
+ const match = url.match(/vimeo\.com\/(?:video\/)?(\d+)/);
42
+ return match?.[1] ?? null;
43
+ }
44
+ function PlayButton({ label }) {
45
+ return (_jsxs("span", { className: "pointer-events-none absolute inset-0 flex flex-col items-center justify-center gap-[6px] bg-[rgba(17,24,39,0.35)]", children: [_jsx("span", { className: "flex h-[40px] w-[40px] items-center justify-center rounded-full bg-[#ffffff] text-[#111827] shadow-[0_1px_4px_rgba(0,0,0,0.25)]", children: _jsx("svg", { width: "16", height: "16", viewBox: "0 0 16 16", "aria-hidden": "true", children: _jsx("path", { fill: "currentColor", d: "M5 3.5v9l8-4.5-8-4.5z" }) }) }), _jsx("span", { className: "text-[11px] font-[600] uppercase tracking-[0.04em] text-[#ffffff]", children: label })] }));
46
+ }
47
+ function PlayingPreview({ item }) {
48
+ if (item.kind === 'videos' && item.url) {
49
+ return (_jsx("video", { src: item.url, className: "h-full w-full object-contain bg-[#111827]", controls: true, autoPlay: true, playsInline: true, muted: true, children: _jsx("track", { kind: "captions" }) }));
50
+ }
51
+ if (item.kind === 'animations') {
52
+ if (!item.url) {
53
+ return _jsx("span", { className: "text-[12px] text-[#9ca3af]", children: "No animation URL" });
54
+ }
55
+ return (_jsx(MediaLibraryAnimationPlayer, { src: item.url, label: item.fileName ?? item.title ?? item.id }));
56
+ }
57
+ if (item.kind === 'external-videos') {
58
+ const external = item.externalUrl ?? item.url;
59
+ if (!external) {
60
+ return _jsx("span", { className: "text-[12px] text-[#9ca3af]", children: "No external URL" });
61
+ }
62
+ const yt = tryGetYouTubeId(external);
63
+ if (yt) {
64
+ return (_jsx("iframe", { title: item.title ?? 'YouTube video', src: `https://www.youtube-nocookie.com/embed/${yt}?autoplay=1&rel=0`, className: "h-full w-full border-0", allow: "accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture", allowFullScreen: true }));
65
+ }
66
+ const vimeo = tryGetVimeoId(external);
67
+ if (vimeo) {
68
+ return (_jsx("iframe", { title: item.title ?? 'Vimeo video', src: `https://player.vimeo.com/video/${vimeo}?autoplay=1`, className: "h-full w-full border-0", allow: "autoplay; fullscreen; picture-in-picture", allowFullScreen: true }));
69
+ }
70
+ return (_jsx("a", { href: external, target: "_blank", rel: "noreferrer", className: "px-[8px] text-center text-[12px] text-[#2563eb] underline", children: "Open external URL" }));
71
+ }
72
+ return null;
73
+ }
74
+ function MediaCard({ item, isPlaying, onPlay, onStop, }) {
75
+ const playable = isPlayable(item.kind) && Boolean(item.url || item.externalUrl);
76
+ return (_jsxs("li", { className: "overflow-hidden rounded-[8px] border border-[#e5e7eb] bg-[#ffffff] shadow-[0_1px_2px_rgba(0,0,0,0.04)]", children: [_jsx("div", { className: `relative flex items-center justify-center overflow-hidden bg-[#f3f4f6] ${isPlaying ? 'h-[200px]' : 'h-[140px]'}`, children: isPlaying && playable ? (_jsxs(_Fragment, { children: [_jsx(PlayingPreview, { item: item }), _jsx("button", { type: "button", onClick: onStop, className: "absolute right-[6px] top-[6px] z-[1] rounded-[4px] bg-[rgba(17,24,39,0.75)] px-[8px] py-[4px] text-[11px] font-[500] text-[#ffffff]", children: "Stop" })] })) : playable ? (_jsxs("button", { type: "button", onClick: () => onPlay(item.id), className: "relative h-full w-full cursor-pointer border-0 bg-transparent p-0", "aria-label": `Play ${item.fileName ?? item.title ?? item.id}`, children: [item.thumbUrl ? (_jsx("img", { src: item.thumbUrl, alt: "", width: 320, height: 320, className: "h-full w-full object-cover", loading: "lazy" })) : (_jsx("span", { className: "text-[12px] font-[500] uppercase tracking-[0.04em] text-[#9ca3af]", children: placeholderLabel(item.kind) })), _jsx(PlayButton, { label: "Play" })] })) : item.thumbUrl ? (_jsx("img", { src: item.thumbUrl, alt: "", width: 320, height: 320, className: "h-full w-full object-cover", loading: "lazy" })) : (_jsx("span", { className: "text-[12px] font-[500] uppercase tracking-[0.04em] text-[#9ca3af]", children: placeholderLabel(item.kind) })) }), _jsxs("div", { className: "flex flex-col gap-[4px] p-[10px]", children: [_jsx("p", { className: "m-0 truncate font-mono text-[11px] leading-[1.3] text-[#111827]", title: item.fileName ?? item.title ?? item.id, children: item.fileName ?? item.title ?? item.id }), _jsx("p", { className: "m-0 line-clamp-2 min-h-[32px] text-[12px] leading-[1.35] text-[#4b5563]", title: item.description ?? undefined, children: item.description?.trim() ? item.description : '—' }), _jsxs("p", { className: "m-0 text-[11px] text-[#6b7280]", children: [formatDimensions(item.width, item.height), item.sizeBytes != null ? ` · ${formatSize(item.sizeBytes)}` : ''] }), _jsx("p", { className: "m-0 truncate font-mono text-[10px] text-[#9ca3af]", title: item.id, children: item.id })] })] }));
77
+ }
78
+ export function MediaLibraryGrid({ items }) {
79
+ const [playingId, setPlayingId] = useState(null);
80
+ const onPlay = useCallback((id) => {
81
+ setPlayingId(id);
82
+ }, []);
83
+ const onStop = useCallback(() => {
84
+ setPlayingId(null);
85
+ }, []);
86
+ return (_jsx("ul", { className: "m-0 grid list-none grid-cols-[repeat(auto-fill,minmax(180px,1fr))] gap-[12px] p-0", children: items.map((item) => (_jsx(MediaCard, { item: item, isPlaying: playingId === item.id, onPlay: onPlay, onStop: onStop }, item.id))) }));
87
+ }
88
+ //# sourceMappingURL=MediaLibraryGrid.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"MediaLibraryGrid.js","sourceRoot":"","sources":["../../src/media-library/MediaLibraryGrid.tsx"],"names":[],"mappings":"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"}
@@ -0,0 +1,17 @@
1
+ import type { MediaLibraryPageData } from './types';
2
+ export type MediaLibraryPageProps = {
3
+ data: MediaLibraryPageData;
4
+ /** Base path without trailing kind, e.g. `/cms/media` */
5
+ basePath?: string;
6
+ };
7
+ /**
8
+ * cms-dev media inventory. Images are thumbnails only; videos / animations /
9
+ * external videos play on click (one at a time).
10
+ */
11
+ export declare function MediaLibraryPage({ data, basePath }: MediaLibraryPageProps): import("react").JSX.Element;
12
+ export type MediaLibraryHubProps = {
13
+ basePath?: string;
14
+ };
15
+ /** Index page linking to each media kind. */
16
+ export declare function MediaLibraryHub({ basePath }: MediaLibraryHubProps): import("react").JSX.Element;
17
+ //# sourceMappingURL=MediaLibraryPage.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"MediaLibraryPage.d.ts","sourceRoot":"","sources":["../../src/media-library/MediaLibraryPage.tsx"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAoB,oBAAoB,EAAE,MAAM,SAAS,CAAC;AAUtE,MAAM,MAAM,qBAAqB,GAAG;IAClC,IAAI,EAAE,oBAAoB,CAAC;IAC3B,yDAAyD;IACzD,QAAQ,CAAC,EAAE,MAAM,CAAC;CACnB,CAAC;AAEF;;;GAGG;AACH,wBAAgB,gBAAgB,CAAC,EAAE,IAAI,EAAE,QAAuB,EAAE,EAAE,qBAAqB,+BAuGxF;AAED,MAAM,MAAM,oBAAoB,GAAG;IACjC,QAAQ,CAAC,EAAE,MAAM,CAAC;CACnB,CAAC;AAEF,6CAA6C;AAC7C,wBAAgB,eAAe,CAAC,EAAE,QAAuB,EAAE,EAAE,oBAAoB,+BA2ChF"}
@@ -0,0 +1,30 @@
1
+ import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
2
+ import { MediaLibraryGrid } from './MediaLibraryGrid';
3
+ import { MEDIA_LIBRARY_KIND_LABELS, MEDIA_LIBRARY_KINDS } from './types';
4
+ function buildPageHref(basePath, kind, page) {
5
+ const params = new URLSearchParams();
6
+ if (page > 1)
7
+ params.set('page', String(page));
8
+ const qs = params.toString();
9
+ return qs ? `${basePath}/${kind}/?${qs}` : `${basePath}/${kind}/`;
10
+ }
11
+ /**
12
+ * cms-dev media inventory. Images are thumbnails only; videos / animations /
13
+ * external videos play on click (one at a time).
14
+ */
15
+ export function MediaLibraryPage({ data, basePath = '/cms/media' }) {
16
+ const totalPages = Math.max(1, Math.ceil(data.total / data.limit) || 1);
17
+ const hasPrev = data.page > 1;
18
+ const hasNext = data.page < totalPages;
19
+ return (_jsxs("div", { className: "min-h-screen bg-[#f9fafb] text-[#111827]", children: [_jsxs("header", { className: "border-b border-[#e5e7eb] bg-[#ffffff]", children: [_jsxs("div", { className: "mx-auto max-w-[1200px] px-[16px] py-[16px]", children: [_jsx("p", { className: "m-0 text-[11px] font-[500] uppercase tracking-[0.06em] text-[#6b7280]", children: "CMS tools" }), _jsx("h1", { className: "m-0 mt-[4px] text-[20px] font-[600] leading-[1.3]", children: "Media library" }), _jsxs("p", { className: "m-0 mt-[6px] max-w-[720px] text-[13px] leading-[1.45] text-[#4b5563]", children: ["All media in this Contentful space (preview). Image thumbs only; click Play on videos, animations, and external videos (one at a time). Agents:", ' ', _jsxs("code", { className: "text-[12px]", children: [basePath, ".json"] }), " and", ' ', _jsxs("code", { className: "text-[12px]", children: [basePath, ".md"] }), "."] })] }), _jsx("nav", { className: "mx-auto flex max-w-[1200px] flex-wrap gap-[8px] px-[16px] pb-[12px]", "aria-label": "Media kinds", children: MEDIA_LIBRARY_KINDS.map((kind) => {
20
+ const active = kind === data.kind;
21
+ return (_jsx("a", { href: `${basePath}/${kind}/`, className: active
22
+ ? 'rounded-[6px] bg-[#111827] px-[12px] py-[6px] text-[13px] font-[500] text-[#ffffff] no-underline'
23
+ : 'rounded-[6px] bg-[#f3f4f6] px-[12px] py-[6px] text-[13px] font-[500] text-[#374151] no-underline hover:bg-[#e5e7eb]', children: MEDIA_LIBRARY_KIND_LABELS[kind] }, kind));
24
+ }) })] }), _jsxs("main", { className: "mx-auto max-w-[1200px] px-[16px] py-[20px]", children: [_jsxs("div", { className: "mb-[16px] flex flex-wrap items-center justify-between gap-[12px]", children: [_jsxs("p", { className: "m-0 text-[13px] text-[#4b5563]", children: [_jsx("span", { className: "font-[600] text-[#111827]", children: MEDIA_LIBRARY_KIND_LABELS[data.kind] }), ' · ', data.total, " total", ' · ', "page ", data.page, " of ", totalPages] }), _jsxs("div", { className: "flex gap-[8px]", children: [hasPrev ? (_jsx("a", { href: buildPageHref(basePath, data.kind, data.page - 1), className: "rounded-[6px] border border-[#d1d5db] bg-[#ffffff] px-[12px] py-[6px] text-[13px] text-[#111827] no-underline", children: "Previous" })) : (_jsx("span", { className: "rounded-[6px] border border-[#e5e7eb] bg-[#f9fafb] px-[12px] py-[6px] text-[13px] text-[#9ca3af]", children: "Previous" })), hasNext ? (_jsx("a", { href: buildPageHref(basePath, data.kind, data.page + 1), className: "rounded-[6px] border border-[#d1d5db] bg-[#ffffff] px-[12px] py-[6px] text-[13px] text-[#111827] no-underline", children: "Next" })) : (_jsx("span", { className: "rounded-[6px] border border-[#e5e7eb] bg-[#f9fafb] px-[12px] py-[6px] text-[13px] text-[#9ca3af]", children: "Next" }))] })] }), data.truncated ? (_jsxs("p", { className: "mb-[16px] rounded-[8px] border border-[#fcd34d] bg-[#fffbeb] px-[12px] py-[10px] text-[13px] leading-[1.45] text-[#92400e]", role: "status", children: ["Scan hit the safety cap \u2014 this list may be incomplete. Total shown (", data.total, ") may under-count animations still later in the asset catalog."] })) : null, data.items.length === 0 ? (_jsxs("p", { className: "rounded-[8px] border border-dashed border-[#d1d5db] bg-[#ffffff] p-[24px] text-[14px] text-[#6b7280]", children: ["No ", MEDIA_LIBRARY_KIND_LABELS[data.kind].toLowerCase(), " in this space (or none on this page)."] })) : (_jsx(MediaLibraryGrid, { items: data.items }))] })] }));
25
+ }
26
+ /** Index page linking to each media kind. */
27
+ export function MediaLibraryHub({ basePath = '/cms/media' }) {
28
+ return (_jsxs("div", { className: "min-h-screen bg-[#f9fafb] text-[#111827]", children: [_jsx("header", { className: "border-b border-[#e5e7eb] bg-[#ffffff]", children: _jsxs("div", { className: "mx-auto max-w-[720px] px-[16px] py-[24px]", children: [_jsx("p", { className: "m-0 text-[11px] font-[500] uppercase tracking-[0.06em] text-[#6b7280]", children: "CMS tools" }), _jsx("h1", { className: "m-0 mt-[4px] text-[22px] font-[600]", children: "Media library" }), _jsx("p", { className: "m-0 mt-[8px] text-[14px] leading-[1.5] text-[#4b5563]", children: "Browse every image, video, animation, and external video entry in the Contentful space. Thumbnails only. For agents use JSON or Markdown endpoints." })] }) }), _jsxs("main", { className: "mx-auto max-w-[720px] px-[16px] py-[24px]", children: [_jsx("ul", { className: "m-0 flex list-none flex-col gap-[10px] p-0", children: MEDIA_LIBRARY_KINDS.map((kind) => (_jsx("li", { children: _jsxs("a", { href: `${basePath}/${kind}/`, className: "flex items-center justify-between rounded-[8px] border border-[#e5e7eb] bg-[#ffffff] px-[16px] py-[14px] text-[15px] font-[500] text-[#111827] no-underline hover:border-[#9ca3af]", children: [_jsx("span", { children: MEDIA_LIBRARY_KIND_LABELS[kind] }), _jsxs("span", { className: "text-[13px] font-[400] text-[#6b7280]", children: ["/", kind, "/"] })] }) }, kind))) }), _jsxs("div", { className: "mt-[24px] rounded-[8px] border border-[#e5e7eb] bg-[#ffffff] p-[16px] text-[13px] leading-[1.5] text-[#4b5563]", children: [_jsx("p", { className: "m-0 font-[600] text-[#111827]", children: "Agent surfaces" }), _jsxs("ul", { className: "mb-0 mt-[8px] pl-[18px]", children: [_jsx("li", { children: _jsxs("code", { children: [basePath, ".json?kind=images&page=1&limit=50"] }) }), _jsx("li", { children: _jsxs("code", { children: [basePath, ".md?kind=images&page=1&limit=50"] }) })] })] })] })] }));
29
+ }
30
+ //# sourceMappingURL=MediaLibraryPage.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"MediaLibraryPage.js","sourceRoot":"","sources":["../../src/media-library/MediaLibraryPage.tsx"],"names":[],"mappings":"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"}
@@ -0,0 +1,4 @@
1
+ export { MediaLibraryGrid } from './MediaLibraryGrid';
2
+ export { MediaLibraryHub, type MediaLibraryHubProps, MediaLibraryPage, type MediaLibraryPageProps, } from './MediaLibraryPage';
3
+ export { isMediaLibraryKind, MEDIA_LIBRARY_KIND_LABELS, MEDIA_LIBRARY_KINDS, type MediaLibraryItem, type MediaLibraryKind, type MediaLibraryPageData, } from './types';
4
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/media-library/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,gBAAgB,EAAE,MAAM,oBAAoB,CAAC;AACtD,OAAO,EACL,eAAe,EACf,KAAK,oBAAoB,EACzB,gBAAgB,EAChB,KAAK,qBAAqB,GAC3B,MAAM,oBAAoB,CAAC;AAC5B,OAAO,EACL,kBAAkB,EAClB,yBAAyB,EACzB,mBAAmB,EACnB,KAAK,gBAAgB,EACrB,KAAK,gBAAgB,EACrB,KAAK,oBAAoB,GAC1B,MAAM,SAAS,CAAC"}
@@ -0,0 +1,4 @@
1
+ export { MediaLibraryGrid } from './MediaLibraryGrid';
2
+ export { MediaLibraryHub, MediaLibraryPage, } from './MediaLibraryPage';
3
+ export { isMediaLibraryKind, MEDIA_LIBRARY_KIND_LABELS, MEDIA_LIBRARY_KINDS, } from './types';
4
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/media-library/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,gBAAgB,EAAE,MAAM,oBAAoB,CAAC;AACtD,OAAO,EACL,eAAe,EAEf,gBAAgB,GAEjB,MAAM,oBAAoB,CAAC;AAC5B,OAAO,EACL,kBAAkB,EAClB,yBAAyB,EACzB,mBAAmB,GAIpB,MAAM,SAAS,CAAC"}
@@ -0,0 +1,8 @@
1
+ /**
2
+ * UI labels for media library kinds. Kind unions / item shapes live in
3
+ * `@se-studio/core-data-types` so REST + UI cannot drift.
4
+ */
5
+ export { isMediaLibraryKind, MEDIA_LIBRARY_KINDS, type MediaLibraryItem, type MediaLibraryKind, type MediaLibraryPage as MediaLibraryPageData, } from '@se-studio/core-data-types';
6
+ import type { MediaLibraryKind } from '@se-studio/core-data-types';
7
+ export declare const MEDIA_LIBRARY_KIND_LABELS: Record<MediaLibraryKind, string>;
8
+ //# sourceMappingURL=types.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../src/media-library/types.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,EACL,kBAAkB,EAClB,mBAAmB,EACnB,KAAK,gBAAgB,EACrB,KAAK,gBAAgB,EACrB,KAAK,gBAAgB,IAAI,oBAAoB,GAC9C,MAAM,4BAA4B,CAAC;AAEpC,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,4BAA4B,CAAC;AAEnE,eAAO,MAAM,yBAAyB,EAAE,MAAM,CAAC,gBAAgB,EAAE,MAAM,CAKtE,CAAC"}
@@ -0,0 +1,12 @@
1
+ /**
2
+ * UI labels for media library kinds. Kind unions / item shapes live in
3
+ * `@se-studio/core-data-types` so REST + UI cannot drift.
4
+ */
5
+ export { isMediaLibraryKind, MEDIA_LIBRARY_KINDS, } from '@se-studio/core-data-types';
6
+ export const MEDIA_LIBRARY_KIND_LABELS = {
7
+ images: 'Images',
8
+ videos: 'Videos',
9
+ animations: 'Animations',
10
+ 'external-videos': 'External videos',
11
+ };
12
+ //# sourceMappingURL=types.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.js","sourceRoot":"","sources":["../../src/media-library/types.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,EACL,kBAAkB,EAClB,mBAAmB,GAIpB,MAAM,4BAA4B,CAAC;AAIpC,MAAM,CAAC,MAAM,yBAAyB,GAAqC;IACzE,MAAM,EAAE,QAAQ;IAChB,MAAM,EAAE,QAAQ;IAChB,UAAU,EAAE,YAAY;IACxB,iBAAiB,EAAE,iBAAiB;CACrC,CAAC"}
@@ -1 +1 @@
1
- {"version":3,"file":"createCmsTxtHandler.d.ts","sourceRoot":"","sources":["../../src/route-handlers/createCmsTxtHandler.ts"],"names":[],"mappings":"AAEA,MAAM,WAAW,oBAAoB;IACnC,qEAAqE;IACrE,OAAO,EAAE,MAAM,CAAC;IAChB,iCAAiC;IACjC,IAAI,EAAE,MAAM,CAAC;IACb,uEAAuE;IACvE,YAAY,CAAC,EAAE,MAAM,CAAC;CACvB;AAED;;;;;;;;GAQG;AACH,wBAAgB,mBAAmB,CACjC,OAAO,EAAE,oBAAoB,GAC5B,CAAC,OAAO,CAAC,EAAE,OAAO,KAAK,QAAQ,CAoHjC"}
1
+ {"version":3,"file":"createCmsTxtHandler.d.ts","sourceRoot":"","sources":["../../src/route-handlers/createCmsTxtHandler.ts"],"names":[],"mappings":"AAEA,MAAM,WAAW,oBAAoB;IACnC,qEAAqE;IACrE,OAAO,EAAE,MAAM,CAAC;IAChB,iCAAiC;IACjC,IAAI,EAAE,MAAM,CAAC;IACb,uEAAuE;IACvE,YAAY,CAAC,EAAE,MAAM,CAAC;CACvB;AAED;;;;;;;;GAQG;AACH,wBAAgB,mBAAmB,CACjC,OAAO,EAAE,oBAAoB,GAC5B,CAAC,OAAO,CAAC,EAAE,OAAO,KAAK,QAAQ,CAgJjC"}
@@ -46,6 +46,34 @@ Render all components or collections on one page:
46
46
 
47
47
  ---
48
48
 
49
+ ## Media library (space inventory)
50
+
51
+ Browse every image, video, Lottie/DotLottie animation asset, and external video entry
52
+ in the Contentful space (Preview API — includes drafts). HTML shows image thumbnails;
53
+ videos/animations/external play on click (one at a time). Not the component showcase.
54
+
55
+ URL: /cms/media
56
+ Type: HTML hub with links to each kind
57
+
58
+ URL: /cms/media/images
59
+ URL: /cms/media/videos
60
+ URL: /cms/media/animations
61
+ URL: /cms/media/external-videos
62
+ Type: HTML thumbnail grids
63
+ Query: ?page=1 (limit fixed at 50 on HTML pages)
64
+
65
+ Machine-readable (same data as HTML pages; non-production only — 404 in production):
66
+
67
+ URL: /cms/media.json?kind=images&page=1&limit=50
68
+ Type: application/json
69
+ kind: images | videos | animations | external-videos
70
+ Cache: private, no-store when using Preview API
71
+
72
+ URL: /cms/media.md?kind=images&page=1&limit=50
73
+ Type: text/markdown
74
+
75
+ ---
76
+
49
77
  ## Component Guidelines (LLM-ready)
50
78
 
51
79
  Self-contained documentation of every component and collection: layout, fields,
@@ -1 +1 @@
1
- {"version":3,"file":"createCmsTxtHandler.js","sourceRoot":"","sources":["../../src/route-handlers/createCmsTxtHandler.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAE,MAAM,aAAa,CAAC;AAW3C;;;;;;;;GAQG;AACH,MAAM,UAAU,mBAAmB,CACjC,OAA6B;IAE7B,MAAM,EAAE,OAAO,EAAE,IAAI,EAAE,YAAY,EAAE,GAAG,OAAO,CAAC;IAEhD,OAAO,SAAS,GAAG;QACjB,MAAM,OAAO,GAAG,+BAA+B,OAAO;;;;;;yCAMjB,IAAI;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;EAiG3C,YAAY,CAAC,CAAC,CAAC,YAAY,YAAY,EAAE,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC;QAE/C,OAAO,IAAI,YAAY,CAAC,OAAO,EAAE;YAC/B,OAAO,EAAE;gBACP,cAAc,EAAE,8BAA8B;gBAC9C,eAAe,EAAE,sBAAsB;aACxC;SACF,CAAC,CAAC;IACL,CAAC,CAAC;AACJ,CAAC"}
1
+ {"version":3,"file":"createCmsTxtHandler.js","sourceRoot":"","sources":["../../src/route-handlers/createCmsTxtHandler.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAE,MAAM,aAAa,CAAC;AAW3C;;;;;;;;GAQG;AACH,MAAM,UAAU,mBAAmB,CACjC,OAA6B;IAE7B,MAAM,EAAE,OAAO,EAAE,IAAI,EAAE,YAAY,EAAE,GAAG,OAAO,CAAC;IAEhD,OAAO,SAAS,GAAG;QACjB,MAAM,OAAO,GAAG,+BAA+B,OAAO;;;;;;yCAMjB,IAAI;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;EA6H3C,YAAY,CAAC,CAAC,CAAC,YAAY,YAAY,EAAE,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC;QAE/C,OAAO,IAAI,YAAY,CAAC,OAAO,EAAE;YAC/B,OAAO,EAAE;gBACP,cAAc,EAAE,8BAA8B;gBAC9C,eAAe,EAAE,sBAAsB;aACxC;SACF,CAAC,CAAC;IACL,CAAC,CAAC;AACJ,CAAC"}
@@ -0,0 +1,19 @@
1
+ import { type ContentfulConfig } from '@se-studio/contentful-rest-api';
2
+ export type MediaLibraryHandlerOptions = {
3
+ /** Resolve Contentful config (prefer preview token for draft assets). */
4
+ getConfig: (preview?: boolean) => ContentfulConfig;
5
+ /**
6
+ * Required. When true, handlers return 404 (same intent as CmsDevLayout).
7
+ * Route handlers do not run React layouts — pass the app `isProduction` flag.
8
+ * Fail closed if omitted at runtime (optional for older call sites until rebuild).
9
+ */
10
+ isProduction: boolean;
11
+ /** Default true — include draft assets via Preview API. */
12
+ preview?: boolean;
13
+ };
14
+ /**
15
+ * Creates GET handlers for `/cms/media.json` and `/cms/media.md` agent surfaces.
16
+ */
17
+ export declare function createMediaLibraryJsonHandler(options: MediaLibraryHandlerOptions): (request: Request) => Promise<Response>;
18
+ export declare function createMediaLibraryMarkdownHandler(options: MediaLibraryHandlerOptions): (request: Request) => Promise<Response>;
19
+ //# sourceMappingURL=createMediaLibraryHandler.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"createMediaLibraryHandler.d.ts","sourceRoot":"","sources":["../../src/route-handlers/createMediaLibraryHandler.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,KAAK,gBAAgB,EAKtB,MAAM,gCAAgC,CAAC;AAGxC,MAAM,MAAM,0BAA0B,GAAG;IACvC,yEAAyE;IACzE,SAAS,EAAE,CAAC,OAAO,CAAC,EAAE,OAAO,KAAK,gBAAgB,CAAC;IACnD;;;;OAIG;IACH,YAAY,EAAE,OAAO,CAAC;IACtB,2DAA2D;IAC3D,OAAO,CAAC,EAAE,OAAO,CAAC;CACnB,CAAC;AA+BF;;GAEG;AACH,wBAAgB,6BAA6B,CAAC,OAAO,EAAE,0BAA0B,IAKrD,SAAS,OAAO,KAAG,OAAO,CAAC,QAAQ,CAAC,CAuB/D;AAED,wBAAgB,iCAAiC,CAAC,OAAO,EAAE,0BAA0B,IAIzD,SAAS,OAAO,KAAG,OAAO,CAAC,QAAQ,CAAC,CA2B/D"}
@@ -0,0 +1,76 @@
1
+ import { isMediaLibraryKind, listMediaLibraryPage, mediaLibraryPageToMarkdown, } from '@se-studio/contentful-rest-api';
2
+ import { NextResponse } from 'next/server';
3
+ function parseSearchParams(request) {
4
+ const url = new URL(request.url);
5
+ const kindRaw = url.searchParams.get('kind');
6
+ const kind = isMediaLibraryKind(kindRaw) ? kindRaw : null;
7
+ const page = Number(url.searchParams.get('page') ?? '1');
8
+ const limit = Number(url.searchParams.get('limit') ?? '50');
9
+ return { kind, page, limit };
10
+ }
11
+ function productionNotFoundJson() {
12
+ return NextResponse.json({ error: 'Not found' }, { status: 404 });
13
+ }
14
+ function productionNotFoundMarkdown() {
15
+ return new Response('# Not found\n', {
16
+ status: 404,
17
+ headers: { 'Content-Type': 'text/markdown; charset=utf-8' },
18
+ });
19
+ }
20
+ /** Preview inventory must not be publicly cacheable. */
21
+ function cacheControlForPreview(preview) {
22
+ return preview ? 'private, no-store' : 'public, s-maxage=60, stale-while-revalidate=300';
23
+ }
24
+ /**
25
+ * Creates GET handlers for `/cms/media.json` and `/cms/media.md` agent surfaces.
26
+ */
27
+ export function createMediaLibraryJsonHandler(options) {
28
+ const preview = options.preview ?? true;
29
+ // Fail closed: missing/undefined isProduction must not open Preview inventory in prod.
30
+ const blocked = options.isProduction !== false;
31
+ return async function GET(request) {
32
+ if (blocked) {
33
+ return productionNotFoundJson();
34
+ }
35
+ const { kind, page, limit } = parseSearchParams(request);
36
+ if (!kind) {
37
+ return NextResponse.json({
38
+ error: 'Missing or invalid kind. Use kind=images|videos|animations|external-videos',
39
+ }, { status: 400 });
40
+ }
41
+ const config = options.getConfig(preview);
42
+ const data = await listMediaLibraryPage(config, kind, { page, limit, preview });
43
+ return NextResponse.json(data, {
44
+ headers: {
45
+ 'Cache-Control': cacheControlForPreview(preview),
46
+ },
47
+ });
48
+ };
49
+ }
50
+ export function createMediaLibraryMarkdownHandler(options) {
51
+ const preview = options.preview ?? true;
52
+ const blocked = options.isProduction !== false;
53
+ return async function GET(request) {
54
+ if (blocked) {
55
+ return productionNotFoundMarkdown();
56
+ }
57
+ const { kind, page, limit } = parseSearchParams(request);
58
+ if (!kind) {
59
+ return new Response('# Error\n\nMissing or invalid `kind`. Use `kind=images|videos|animations|external-videos`.\n', {
60
+ status: 400,
61
+ headers: { 'Content-Type': 'text/markdown; charset=utf-8' },
62
+ });
63
+ }
64
+ const config = options.getConfig(preview);
65
+ const data = await listMediaLibraryPage(config, kind, { page, limit, preview });
66
+ const body = mediaLibraryPageToMarkdown(data);
67
+ return new Response(body, {
68
+ status: 200,
69
+ headers: {
70
+ 'Content-Type': 'text/markdown; charset=utf-8',
71
+ 'Cache-Control': cacheControlForPreview(preview),
72
+ },
73
+ });
74
+ };
75
+ }
76
+ //# sourceMappingURL=createMediaLibraryHandler.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"createMediaLibraryHandler.js","sourceRoot":"","sources":["../../src/route-handlers/createMediaLibraryHandler.ts"],"names":[],"mappings":"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"}
@@ -4,4 +4,6 @@ export type { CollectionEntry, ColourHint, ComponentEntry, DiscoveryHandlerOptio
4
4
  export { createDiscoveryHandler } from './createDiscoveryHandler';
5
5
  export type { GuidelinesHandlerOptions } from './createGuidelinesHandler';
6
6
  export { createGuidelinesHandler } from './createGuidelinesHandler';
7
+ export type { MediaLibraryHandlerOptions } from './createMediaLibraryHandler';
8
+ export { createMediaLibraryJsonHandler, createMediaLibraryMarkdownHandler, } from './createMediaLibraryHandler';
7
9
  //# sourceMappingURL=index.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/route-handlers/index.ts"],"names":[],"mappings":"AAAA,YAAY,EAAE,oBAAoB,EAAE,MAAM,uBAAuB,CAAC;AAClE,OAAO,EAAE,mBAAmB,EAAE,MAAM,uBAAuB,CAAC;AAC5D,YAAY,EACV,eAAe,EACf,UAAU,EACV,cAAc,EACd,uBAAuB,EACvB,iBAAiB,EACjB,aAAa,EACb,SAAS,EACT,OAAO,GACR,MAAM,0BAA0B,CAAC;AAClC,OAAO,EAAE,sBAAsB,EAAE,MAAM,0BAA0B,CAAC;AAClE,YAAY,EAAE,wBAAwB,EAAE,MAAM,2BAA2B,CAAC;AAC1E,OAAO,EAAE,uBAAuB,EAAE,MAAM,2BAA2B,CAAC"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/route-handlers/index.ts"],"names":[],"mappings":"AAAA,YAAY,EAAE,oBAAoB,EAAE,MAAM,uBAAuB,CAAC;AAClE,OAAO,EAAE,mBAAmB,EAAE,MAAM,uBAAuB,CAAC;AAC5D,YAAY,EACV,eAAe,EACf,UAAU,EACV,cAAc,EACd,uBAAuB,EACvB,iBAAiB,EACjB,aAAa,EACb,SAAS,EACT,OAAO,GACR,MAAM,0BAA0B,CAAC;AAClC,OAAO,EAAE,sBAAsB,EAAE,MAAM,0BAA0B,CAAC;AAClE,YAAY,EAAE,wBAAwB,EAAE,MAAM,2BAA2B,CAAC;AAC1E,OAAO,EAAE,uBAAuB,EAAE,MAAM,2BAA2B,CAAC;AACpE,YAAY,EAAE,0BAA0B,EAAE,MAAM,6BAA6B,CAAC;AAC9E,OAAO,EACL,6BAA6B,EAC7B,iCAAiC,GAClC,MAAM,6BAA6B,CAAC"}
@@ -1,4 +1,5 @@
1
1
  export { createCmsTxtHandler } from './createCmsTxtHandler';
2
2
  export { createDiscoveryHandler } from './createDiscoveryHandler';
3
3
  export { createGuidelinesHandler } from './createGuidelinesHandler';
4
+ export { createMediaLibraryJsonHandler, createMediaLibraryMarkdownHandler, } from './createMediaLibraryHandler';
4
5
  //# sourceMappingURL=index.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/route-handlers/index.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,mBAAmB,EAAE,MAAM,uBAAuB,CAAC;AAW5D,OAAO,EAAE,sBAAsB,EAAE,MAAM,0BAA0B,CAAC;AAElE,OAAO,EAAE,uBAAuB,EAAE,MAAM,2BAA2B,CAAC"}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/route-handlers/index.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,mBAAmB,EAAE,MAAM,uBAAuB,CAAC;AAW5D,OAAO,EAAE,sBAAsB,EAAE,MAAM,0BAA0B,CAAC;AAElE,OAAO,EAAE,uBAAuB,EAAE,MAAM,2BAA2B,CAAC;AAEpE,OAAO,EACL,6BAA6B,EAC7B,iCAAiC,GAClC,MAAM,6BAA6B,CAAC"}
@@ -1 +1 @@
1
- {"version":3,"file":"mockFactory.d.ts","sourceRoot":"","sources":["../../src/showcase/mockFactory.ts"],"names":[],"mappings":"AAOA,OAAO,KAAK,EACV,qBAAqB,EACrB,oBAAoB,EACpB,mBAAmB,EACpB,MAAM,gCAAgC,CAAC;AACxC,OAAO,KAAK,EAIV,aAAa,EAEb,iBAAiB,EACjB,OAAO,EACR,MAAM,4BAA4B,CAAC;AACpC,OAAO,KAAK,EAAE,QAAQ,EAA0B,MAAM,oBAAoB,CAAC;AAE3E,OAAO,KAAK,EAAE,oBAAoB,EAAE,MAAM,SAAS,CAAC;AAgCpD;;;;;;GAMG;AACH,wBAAgB,0BAA0B,CAAC,IAAI,EAAE,MAAM,GAAG,mBAAmB,CAmF5E;AAED,qFAAqF;AACrF,wBAAgB,sBAAsB,CAAC,GAAG,EAAE,MAAM,GAAG,SAAS,GAAG,IAAI,GAAG,OAAO,CAgB9E;AAiDD;;;;;;GAMG;AACH,wBAAgB,YAAY,CAC1B,EAAE,EAAE,MAAM,EACV,KAAK,EAAE,MAAM,EACb,MAAM,EAAE,MAAM,EACd,GAAG,CAAC,EAAE,MAAM,EACZ,SAAS,CAAC,EAAE,MAAM,EAClB,YAAY,CAAC,EAAE,MAAM,GAAG,IAAI,GAC3B,OAAO,CAqDT;AAED;;;GAGG;AACH,wBAAgB,sBAAsB,CACpC,UAAU,EAAE,OAAO,EACnB,UAAU,EAAE,OAAO,EACnB,KAAK,SAAM,EACX,MAAM,SAAM,EACZ,GAAG,CAAC,EAAE,MAAM,EACZ,SAAS,CAAC,EAAE,MAAM,EAClB,YAAY,CAAC,EAAE,MAAM,GAAG,IAAI,GAC3B,iBAAiB,GAAG,SAAS,CAuC/B;AAED;;GAEG;AACH,wBAAgB,WAAW,CAAC,KAAK,EAAE,MAAM,GAAG,aAAa,EAAE,CAc1D;AAoHD,wBAAgB,qBAAqB,CAAC,MAAM,GAAG,MAAM,EAAE,SAAS,GAAG,MAAM,EACvE,YAAY,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,GAAG,MAAM,EAAE,GAAG,SAAS,CAAC,EAC3D,YAAY,EAAE,oBAAoB,CAAC,MAAM,EAAE,SAAS,CAAC,GACpD,oBAAoB,CAAC,MAAM,EAAE,SAAS,CAAC,CAwCzC;AAED;;;GAGG;AACH,wBAAgB,6BAA6B,CAC3C,YAAY,EAAE,oBAAoB,EAClC,IAAI,EAAE,MAAM,EACZ,IAAI,EAAE,WAAW,GAAG,YAAY,EAChC,gBAAgB,EAAE,MAAM,CAAC,MAAM,EAAE,QAAQ,CAAC,EAC1C,iBAAiB,EAAE,MAAM,CAAC,MAAM,EAAE,QAAQ,CAAC,GAC1C,oBAAoB,CAkBtB;AAED;;GAEG;AACH,wBAAgB,qBAAqB,CACnC,cAAc,EAAE,MAAM,EACtB,KAAK,EAAE,MAAM,EACb,QAAQ,EAAE,oBAAoB,EAC9B,uBAAuB,EAAE,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,MAAM,CAAC,CAAC,EACpD,YAAY,CAAC,EAAE,QAAQ,GACtB,oBAAoB,GAAG,OAAO,CA+JhC;AAED;;;GAGG;AACH,wBAAgB,sBAAsB,CACpC,IAAI,EAAE,MAAM,EACZ,IAAI,EAAE,WAAW,GAAG,YAAY,EAChC,QAAQ,EAAE,oBAAoB,EAC9B,kBAAkB,EAAE,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,MAAM,CAAC,CAAC,EAC/C,mBAAmB,EAAE,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,MAAM,CAAC,CAAC,EAChD,uBAAuB,EAAE,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,MAAM,CAAC,CAAC,EACpD,gBAAgB,GAAE,MAAM,CAAC,MAAM,EAAE,QAAQ,CAAM,EAC/C,iBAAiB,GAAE,MAAM,CAAC,MAAM,EAAE,QAAQ,CAAM,EAChD,qBAAqB,GAAE,MAAM,CAAC,MAAM,EAAE,QAAQ,GAAG,QAAQ,EAAE,CAAM,EACjE,mBAAmB,GAAE,WAAW,CAAC,MAAM,CAAa,GACnD,oBAAoB,GAAG,qBAAqB,CAiM9C"}
1
+ {"version":3,"file":"mockFactory.d.ts","sourceRoot":"","sources":["../../src/showcase/mockFactory.ts"],"names":[],"mappings":"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"}
@@ -181,14 +181,25 @@ function buildExternalVideoEmbedHtml(url) {
181
181
  */
182
182
  export function createVisual(id, width, height, url, lottieUrl, widthPercent) {
183
183
  if (lottieUrl) {
184
+ const format = lottieUrl.toLowerCase().endsWith('.lottie') ? 'dotlottie' : 'lottie-json';
184
185
  const animation = {
185
186
  type: 'Animation',
186
187
  id: `animation-${id}`,
187
188
  name: 'Sample Animation',
189
+ format,
188
190
  animationSrc: lottieUrl,
189
191
  loop: true,
190
192
  autoPlay: true,
191
193
  ...(widthPercent != null && { widthPercent }),
194
+ ...(width > 0 && height > 0
195
+ ? {
196
+ optimised: {
197
+ width,
198
+ height,
199
+ data: `<svg width="${width}" height="${height}" viewBox="0 0 ${width} ${height}" xmlns="http://www.w3.org/2000/svg"></svg>`,
200
+ },
201
+ }
202
+ : {}),
192
203
  };
193
204
  return { type: 'Visual', id: `visual-${id}`, animation };
194
205
  }