karin-plugin-kkk 2.25.0 → 2.25.2

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -1,10 +1,221 @@
1
1
  import { n as __esmMin, o as __toESM, r as __export } from "./rolldown-runtime-BMXAG3ag.js";
2
- import { $ as RiStarFill, $t as ExternalLink, A as init_locale, At as ThumbsUp, B as RiLineChartFill, Bt as QrCode, C as init_hi, Ct as init_io5, D as AiFillHeart, Dt as User, E as init_fa6, Et as Users, F as RiGroupLine, Ft as ShieldCheck, G as RiMessage3Fill, Gt as MapPin, H as RiListCheck2, Ht as Play, I as RiHashtag, It as Share2, J as RiRefreshLine, Jt as Hash, K as RiPieChart2Fill, Kt as Info, L as RiHeart2Line, Lt as ScanLine, M as RiArrowRightFill, Mt as Star, N as RiBarChartFill, Nt as Smartphone, O as AiFillStar, Ot as UserPlus, P as RiBellFill, Pt as Shield, Q as RiSparkling2Fill, Qt as Eye, R as RiHeart3Fill, Rt as Radio, S as HiOutlineMenuAlt2, St as IoSearch, T as FaCommentDots, Tt as Zap, U as RiLiveLine, Ut as Music, V as RiLinkM, Vt as Plug2, W as RiLoginCircleFill, Wt as MessageCircle, X as RiSendPlaneFill, Xt as Gamepad2, Y as RiRobot2Fill, Yt as Gift, Z as RiShareForwardFill, Zt as FileText, _ as init_md, _t as code_default, an as CircleEllipsis, at as RiVideoLine, b as TbScan, bt as HeroUIProvider, c as VictoryPie, cn as ChartColumn, ct as Markdown, d as VictoryAxis, dn as BookOpen, dt as init_date_fns, en as Crown, et as RiStarLine, f as VictoryLabel, fn as Bell, g as MdAccessTime, gn as require_react, gt as init_dist, h as rehypeHighlight, hn as require_server_node, in as CircleFadingArrowUp, it as RiUserFollowLine, j as zhCN, jt as Terminal, k as init_ai, kt as TriangleAlert, l as VictoryLine, ln as Calendar, lt as LuFullscreen, m as init_rehype_highlight, mn as init_clsx, mt as format, nn as Coins, nt as RiTiktokFill, o as init_es, on as CircleCheckBig, ot as init_ri, p as VictoryTheme, pn as clsx_default, pt as formatDistanceToNow, q as RiQuestionFill, qt as Heart, rn as Clock, rt as RiTrophyFill, s as VictoryScatter, sn as CircleAlert, st as init_react_markdown, tn as CornerDownLeft, tt as RiThumbUpFill, u as VictoryChart, un as Bookmark, ut as init_lu, v as SiBilibili, vt as chip_default, w as FaCodeBranch, wt as init_lucide_react, x as init_tb, xt as require_jsx_runtime, y as init_si, yt as button_default, z as RiHeart3Line, zt as Quote } from "./vendor-9pKTNH6x.js";
2
+ import { $ as RiStarFill, $t as CircleEllipsis, A as init_locale, At as Share2, B as RiLineChartFill, Bt as Info, C as init_hi, Ct as TriangleAlert, D as AiFillHeart, Dt as Smartphone, E as init_fa6, Et as Star, F as RiGroupLine, Ft as Plug2, G as RiMessage3Fill, Gt as FileText, H as RiListCheck2, Ht as Hash, I as RiHashtag, It as Play, J as RiRefreshLine, Jt as Crown, K as RiPieChart2Fill, Kt as Eye, L as RiHeart2Line, Lt as Music, M as RiArrowRightFill, Mt as Radio, N as RiBarChartFill, Nt as Quote, O as AiFillStar, Ot as Shield, P as RiBellFill, Pt as QrCode, Q as RiSparkling2Fill, Qt as CircleFadingArrowUp, R as RiHeart3Fill, Rt as MessageCircle, S as HiOutlineMenuAlt2, St as UserPlus, T as FaCommentDots, Tt as Terminal, U as RiLiveLine, Ut as Gift, V as RiLinkM, Vt as Heart, W as RiLoginCircleFill, Wt as Gamepad2, X as RiSendPlaneFill, Xt as Coins, Y as RiRobot2Fill, Yt as CornerDownLeft, Z as RiShareForwardFill, Zt as Clock, _ as init_md, _t as init_io5, an as BookOpen, at as RiVideoLine, b as TbScan, bt as Users, c as VictoryPie, cn as init_dist, ct as Markdown, d as VictoryAxis, dn as button_default, dt as init_date_fns, en as CircleCheckBig, et as RiStarLine, f as VictoryLabel, fn as HeroUIProvider, g as MdAccessTime, gn as require_react, gt as IoSearch, h as rehypeHighlight, hn as init_clsx, in as Bookmark, it as RiUserFollowLine, j as zhCN, jt as ScanLine, k as init_ai, kt as ShieldCheck, l as VictoryLine, ln as code_default, lt as LuFullscreen, m as init_rehype_highlight, mn as clsx_default, mt as format, nn as ChartColumn, nt as RiTiktokFill, o as init_es, on as Bell, ot as init_ri, p as VictoryTheme, pn as require_jsx_runtime, pt as formatDistanceToNow, q as RiQuestionFill, qt as ExternalLink, rn as Calendar, rt as RiTrophyFill, s as VictoryScatter, sn as require_server_node, st as init_react_markdown, tn as CircleAlert, tt as RiThumbUpFill, u as VictoryChart, un as chip_default, ut as init_lu, v as SiBilibili, vt as init_lucide_react, w as FaCodeBranch, wt as ThumbsUp, x as init_tb, xt as User, y as init_si, yt as Zap, z as RiHeart3Line, zt as MapPin } from "./vendor-rZ5rQnq1.js";
3
3
  import { logger as logger$1 } from "node-karin";
4
4
  import fs from "node:fs";
5
5
  import path from "node:path";
6
6
  import { fileURLToPath } from "node:url";
7
7
  var init_main$1 = __esmMin(() => {});
8
+ var formatDuration$2;
9
+ var init_time = __esmMin(() => {
10
+ formatDuration$2 = (ms) => {
11
+ const totalSeconds = Math.max(Math.floor(ms / 1e3), 0);
12
+ const hours = Math.floor(totalSeconds / 3600);
13
+ const minutes = Math.floor(totalSeconds % 3600 / 60);
14
+ const seconds = totalSeconds % 60;
15
+ const pad = (value) => String(value).padStart(2, "0");
16
+ return hours > 0 ? `${pad(hours)}:${pad(minutes)}:${pad(seconds)}` : `${pad(minutes)}:${pad(seconds)}`;
17
+ };
18
+ });
19
+ var buildStatus;
20
+ var init_status = __esmMin(() => {
21
+ init_time();
22
+ buildStatus = (state) => {
23
+ const filePath = state.filePath || state.filename;
24
+ if (!state.removeCache) return {
25
+ statusText: `文件 ${filePath} 不会自动删除`,
26
+ countdownText: "不删除"
27
+ };
28
+ if (state.removed) return {
29
+ statusText: `文件 ${filePath} 已删除`,
30
+ countdownText: "00:00"
31
+ };
32
+ if (state.remainingMs === null) return {
33
+ statusText: `文件 ${filePath} 将在未知时间后删除`,
34
+ countdownText: "--:--"
35
+ };
36
+ const countdownText = formatDuration$2(state.remainingMs);
37
+ return {
38
+ statusText: `文件 ${filePath} 将在 ${countdownText} 后删除`,
39
+ countdownText
40
+ };
41
+ };
42
+ }), import_jsx_runtime$42, PreviewInfoCard;
43
+ var init_PreviewInfoCard = __esmMin(() => {
44
+ __toESM(require_react(), 1);
45
+ init_status();
46
+ import_jsx_runtime$42 = __toESM(require_jsx_runtime(), 1);
47
+ PreviewInfoCard = ({ state }) => {
48
+ const status = buildStatus(state);
49
+ return (0, import_jsx_runtime$42.jsxs)("div", {
50
+ className: "relative z-10 mt-12 flex flex-col gap-4 sm:flex-row sm:items-end sm:justify-between",
51
+ style: {
52
+ mixBlendMode: "difference",
53
+ color: "#ffffff"
54
+ },
55
+ children: [(0, import_jsx_runtime$42.jsxs)("div", { children: [(0, import_jsx_runtime$42.jsx)("div", {
56
+ className: "text-xs uppercase tracking-[0.2em]",
57
+ children: "删除倒计时"
58
+ }), (0, import_jsx_runtime$42.jsx)("div", {
59
+ className: "mt-2 text-5xl font-semibold",
60
+ id: "preview-countdown",
61
+ children: status.countdownText
62
+ })] }), (0, import_jsx_runtime$42.jsx)("a", {
63
+ className: "inline-flex h-10 items-center justify-center rounded-full border border-white/50 px-4 text-sm font-medium text-white backdrop-blur",
64
+ href: state.videoUrl,
65
+ download: true,
66
+ children: "下载视频"
67
+ })]
68
+ });
69
+ };
70
+ }), import_jsx_runtime$41, PreviewVideoCard;
71
+ var init_PreviewVideoCard = __esmMin(() => {
72
+ __toESM(require_react(), 1);
73
+ import_jsx_runtime$41 = __toESM(require_jsx_runtime(), 1);
74
+ PreviewVideoCard = ({ videoUrl }) => (0, import_jsx_runtime$41.jsx)("div", {
75
+ className: "relative z-10 mt-10 w-full",
76
+ children: (0, import_jsx_runtime$41.jsx)("video", {
77
+ className: "w-full max-h-[86vh] rounded-2xl bg-black shadow-2xl",
78
+ controls: true,
79
+ preload: "metadata",
80
+ autoPlay: true,
81
+ loop: true,
82
+ muted: true,
83
+ playsInline: true,
84
+ src: videoUrl
85
+ })
86
+ });
87
+ }), import_jsx_runtime$40, PreviewLayout;
88
+ var init_PreviewLayout = __esmMin(() => {
89
+ __toESM(require_react(), 1);
90
+ init_PreviewInfoCard();
91
+ init_PreviewVideoCard();
92
+ import_jsx_runtime$40 = __toESM(require_jsx_runtime(), 1);
93
+ PreviewLayout = ({ state }) => (0, import_jsx_runtime$40.jsxs)("div", {
94
+ className: "relative min-h-screen bg-(--preview-bg) text-(--preview-fg)",
95
+ children: [(0, import_jsx_runtime$40.jsxs)("div", {
96
+ className: "absolute inset-0 overflow-hidden",
97
+ children: [
98
+ (0, import_jsx_runtime$40.jsx)("video", {
99
+ className: "h-full w-full object-cover blur-3xl scale-110 saturate-150 contrast-125",
100
+ autoPlay: true,
101
+ loop: true,
102
+ muted: true,
103
+ playsInline: true,
104
+ preload: "metadata",
105
+ src: state.videoUrl
106
+ }),
107
+ (0, import_jsx_runtime$40.jsx)("div", {
108
+ className: "absolute inset-0 pointer-events-none opacity-[0.35] mix-blend-overlay dark:mix-blend-soft-light",
109
+ children: (0, import_jsx_runtime$40.jsxs)("svg", {
110
+ className: "h-full w-full",
111
+ xmlns: "http://www.w3.org/2000/svg",
112
+ children: [(0, import_jsx_runtime$40.jsxs)("defs", { children: [(0, import_jsx_runtime$40.jsxs)("filter", {
113
+ id: "previewNoise",
114
+ children: [
115
+ (0, import_jsx_runtime$40.jsx)("feTurbulence", {
116
+ type: "fractalNoise",
117
+ baseFrequency: "1.2",
118
+ numOctaves: "3",
119
+ stitchTiles: "stitch"
120
+ }),
121
+ (0, import_jsx_runtime$40.jsx)("feColorMatrix", {
122
+ type: "saturate",
123
+ values: "0"
124
+ }),
125
+ (0, import_jsx_runtime$40.jsxs)("feComponentTransfer", { children: [
126
+ (0, import_jsx_runtime$40.jsx)("feFuncR", {
127
+ type: "discrete",
128
+ tableValues: "0 1"
129
+ }),
130
+ (0, import_jsx_runtime$40.jsx)("feFuncG", {
131
+ type: "discrete",
132
+ tableValues: "0 1"
133
+ }),
134
+ (0, import_jsx_runtime$40.jsx)("feFuncB", {
135
+ type: "discrete",
136
+ tableValues: "0 1"
137
+ })
138
+ ] }),
139
+ (0, import_jsx_runtime$40.jsx)("feComponentTransfer", { children: (0, import_jsx_runtime$40.jsx)("feFuncA", {
140
+ type: "linear",
141
+ slope: "2",
142
+ intercept: "-0.5"
143
+ }) })
144
+ ]
145
+ }), (0, import_jsx_runtime$40.jsxs)("mask", {
146
+ id: "previewNoiseMask",
147
+ children: [(0, import_jsx_runtime$40.jsxs)("linearGradient", {
148
+ id: "previewNoiseGradient",
149
+ x1: "0%",
150
+ y1: "0%",
151
+ x2: "0%",
152
+ y2: "100%",
153
+ children: [
154
+ (0, import_jsx_runtime$40.jsx)("stop", {
155
+ offset: "0%",
156
+ stopColor: "white",
157
+ stopOpacity: "1"
158
+ }),
159
+ (0, import_jsx_runtime$40.jsx)("stop", {
160
+ offset: "15%",
161
+ stopColor: "white",
162
+ stopOpacity: "0.6"
163
+ }),
164
+ (0, import_jsx_runtime$40.jsx)("stop", {
165
+ offset: "50%",
166
+ stopColor: "white",
167
+ stopOpacity: "0.15"
168
+ }),
169
+ (0, import_jsx_runtime$40.jsx)("stop", {
170
+ offset: "85%",
171
+ stopColor: "white",
172
+ stopOpacity: "0.6"
173
+ }),
174
+ (0, import_jsx_runtime$40.jsx)("stop", {
175
+ offset: "100%",
176
+ stopColor: "white",
177
+ stopOpacity: "1"
178
+ })
179
+ ]
180
+ }), (0, import_jsx_runtime$40.jsx)("rect", {
181
+ width: "100%",
182
+ height: "100%",
183
+ fill: "url(#previewNoiseGradient)"
184
+ })]
185
+ })] }), (0, import_jsx_runtime$40.jsx)("rect", {
186
+ width: "100%",
187
+ height: "100%",
188
+ filter: "url(#previewNoise)",
189
+ mask: "url(#previewNoiseMask)",
190
+ fill: "white"
191
+ })]
192
+ })
193
+ }),
194
+ (0, import_jsx_runtime$40.jsx)("div", { className: "absolute inset-0 bg-black/35" })
195
+ ]
196
+ }), (0, import_jsx_runtime$40.jsxs)("div", {
197
+ className: "relative z-10 w-full px-4 py-16 sm:px-6",
198
+ children: [
199
+ (0, import_jsx_runtime$40.jsxs)("div", {
200
+ className: "flex flex-col gap-2",
201
+ style: {
202
+ mixBlendMode: "difference",
203
+ color: "#ffffff"
204
+ },
205
+ children: [(0, import_jsx_runtime$40.jsx)("h1", {
206
+ className: "text-2xl font-semibold",
207
+ children: "临时预览"
208
+ }), (0, import_jsx_runtime$40.jsx)("p", {
209
+ className: "text-sm",
210
+ children: "查看视频内容与删除时间"
211
+ })]
212
+ }),
213
+ (0, import_jsx_runtime$40.jsx)(PreviewVideoCard, { videoUrl: state.videoUrl }),
214
+ (0, import_jsx_runtime$40.jsx)(PreviewInfoCard, { state })
215
+ ]
216
+ })]
217
+ });
218
+ });
8
219
  var PlatformType;
9
220
  var init_platforms = __esmMin(() => {
10
221
  PlatformType = function(PlatformType$1) {
@@ -13574,7 +13785,7 @@ var init_DevDataManager = __esmMin(() => {
13574
13785
  init_logger();
13575
13786
  try {
13576
13787
  if (process.env.NODE_ENV === "development") {
13577
- const __dirname = fileURLToPath(new URL("data:video/mp2t;base64,ZXhwb3J0ICogZnJvbSAnLi9tYWluJwpleHBvcnQgeyByZWFjdFNlcnZlclJlbmRlciBhcyBkZWZhdWx0IH0gZnJvbSAnLi9tYWluJwpleHBvcnQgKiBmcm9tICcuL3R5cGVzJwo=", "" + import.meta.url));
13788
+ const __dirname = fileURLToPath(new URL("data:video/mp2t;base64,ZXhwb3J0ICogZnJvbSAnLi9tYWluJwpleHBvcnQgeyByZWFjdFNlcnZlclJlbmRlciBhcyBkZWZhdWx0IH0gZnJvbSAnLi9tYWluJwpleHBvcnQgeyByZW5kZXJWaWRlb1ByZXZpZXdQYWdlIH0gZnJvbSAnLi9tYWluJwpleHBvcnQgKiBmcm9tICcuL3R5cGVzJwo=", "" + import.meta.url));
13578
13789
  devDataDir = path.resolve(__dirname, "../dev-data");
13579
13790
  } else devDataDir = "";
13580
13791
  } catch {
@@ -13699,10 +13910,12 @@ var init_DevDataManager = __esmMin(() => {
13699
13910
  }
13700
13911
  };
13701
13912
  });
13702
- var import_react, import_server_node, PluginContainer, ComponentRendererFactory, ResourcePathManager, HtmlWrapper, SSRRender, reactServerRender;
13913
+ var import_react, import_server_node, PluginContainer, ComponentRendererFactory, ResourcePathManager, HtmlWrapper, SSRRender, reactServerRender, VideoPreviewApp, escapeVideoPreviewJson, renderVideoPreviewPage;
13703
13914
  var init_main = __esmMin(() => {
13915
+ init_dist();
13704
13916
  import_react = __toESM(require_react(), 1);
13705
13917
  import_server_node = require_server_node();
13918
+ init_PreviewLayout();
13706
13919
  init_ComponentAutoRegistry();
13707
13920
  init_DevDataManager();
13708
13921
  init_logger();
@@ -14008,6 +14221,24 @@ var init_main = __esmMin(() => {
14008
14221
  if (process.env.NODE_ENV === "development") DevDataManager.saveRenderData(request.templateType, request.templateName, request.data);
14009
14222
  return result;
14010
14223
  };
14224
+ VideoPreviewApp = ({ state }) => import_react.createElement(HeroUIProvider, null, import_react.createElement(PreviewLayout, { state }));
14225
+ escapeVideoPreviewJson = (data) => JSON.stringify(data).replace(/</g, "\\u003c");
14226
+ renderVideoPreviewPage = (options) => {
14227
+ const serverNow = Date.now();
14228
+ const remainingMs = options.removeCache && options.expireAt ? Math.max(options.expireAt - serverNow, 0) : null;
14229
+ const state = {
14230
+ ...options,
14231
+ eventsUrl: options.eventsUrl ?? "",
14232
+ serverNow,
14233
+ remainingMs,
14234
+ removed: false
14235
+ };
14236
+ const appHtml = (0, import_server_node.renderToString)(import_react.createElement(VideoPreviewApp, { state }));
14237
+ const serializedState = escapeVideoPreviewJson(state);
14238
+ const { cssDir } = new ResourcePathManager().getResourcePaths();
14239
+ const cssFilePath = path.join(cssDir, "karin-plugin-kkk.css");
14240
+ return `<!DOCTYPE html>\n<html lang="zh-CN">\n<head>\n <meta charset="UTF-8" />\n <meta name="viewport" content="width=device-width, initial-scale=1.0" />\n <title>临时预览</title>\n <style>\n * { box-sizing: border-box; }\n :root { --preview-bg: #ffffff; --preview-fg: #0f172a; --preview-muted: #64748b; }\n @media (prefers-color-scheme: dark) {\n :root { --preview-bg: #050505; --preview-fg: #e2e8f0; --preview-muted: #94a3b8; }\n }\n body { margin: 0; font-family: "Segoe UI", "PingFang SC", "Microsoft YaHei", sans-serif; background: var(--preview-bg); color: var(--preview-fg); }\n .preview-noise { background-image: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='160' height='160'%3E%3Cfilter id='n'%3E%3CfeTurbulence type='fractalNoise' baseFrequency='0.8' numOctaves='2' stitchTiles='stitch'/%3E%3C/filter%3E%3Crect width='160' height='160' filter='url(%23n)' opacity='0.25'/%3E%3C/svg%3E"); mix-blend-mode: soft-light; opacity: 0.8; }\n @media (max-width: 720px) {\n .max-w-6xl { padding-left: 16px; padding-right: 16px; }\n }\n </style>\n <style>${fs.existsSync(cssFilePath) ? fs.readFileSync(cssFilePath, "utf-8") : ""}</style>\n</head>\n<body>\n <div id="app">${appHtml}</div>\n <script>\n window.__VIDEO_PREVIEW__=${serializedState};\n (() => {\n const state = window.__VIDEO_PREVIEW__ || {};\n const countdownEl = document.getElementById('preview-countdown');\n if (!countdownEl) return;\n const format = (ms) => {\n const totalSeconds = Math.max(Math.floor(ms / 1000), 0);\n const hours = Math.floor(totalSeconds / 3600);\n const minutes = Math.floor((totalSeconds % 3600) / 60);\n const seconds = totalSeconds % 60;\n const pad = (value) => String(value).padStart(2, '0');\n return hours > 0 ? pad(hours) + ':' + pad(minutes) + ':' + pad(seconds) : pad(minutes) + ':' + pad(seconds);\n };\n const update = (payload) => {\n if (!payload.removeCache) {\n countdownEl.textContent = '不删除';\n return;\n }\n if (payload.removed) {\n countdownEl.textContent = '00:00';\n return;\n }\n const remainingMs = typeof payload.remainingMs === 'number'\n ? payload.remainingMs\n : (payload.expireAt ? Math.max(payload.expireAt - (payload.serverNow || Date.now()), 0) : null);\n if (remainingMs === null) {\n countdownEl.textContent = '--:--';\n return;\n }\n countdownEl.textContent = format(remainingMs);\n };\n update(state);\n if (state.eventsUrl) {\n const source = new EventSource(state.eventsUrl);\n source.onmessage = (event) => {\n try {\n update(JSON.parse(event.data));\n } catch {}\n };\n }\n })();\n <\/script>\n</body>\n</html>`;
14241
+ };
14011
14242
  });
14012
14243
  var init_types = __esmMin(() => {});
14013
14244
  var init_client = __esmMin(() => {
@@ -14019,4 +14250,4 @@ var init_client = __esmMin(() => {
14019
14250
  init_client();
14020
14251
  init_client();
14021
14252
  var template_default = reactServerRender;
14022
- export { init_client as n, reactServerRender as r, template_default as t };
14253
+ export { renderVideoPreviewPage as i, init_client as n, reactServerRender as r, template_default as t };
@@ -2082,5 +2082,15 @@ interface ReactServerRenderOptions<K extends keyof DataTypeMap> {
2082
2082
  * ```
2083
2083
  */
2084
2084
  declare const reactServerRender: <K extends keyof DataTypeMap>(options: ReactServerRenderOptions<K>) => Promise<RenderResponse>;
2085
+ type VideoPreviewRenderOptions = {
2086
+ filename: string;
2087
+ filePath: string;
2088
+ videoUrl: string;
2089
+ removeCache: boolean;
2090
+ createdAt: number;
2091
+ expireAt?: number;
2092
+ eventsUrl?: string;
2093
+ };
2094
+ declare const renderVideoPreviewPage: (options: VideoPreviewRenderOptions) => string;
2085
2095
  //#endregion
2086
- export { BaseComponentProps, type DataTypeMap, DynamicRenderPath, ExtractDataTypeFromPath, type Plugin, type PluginContext, type PluginFactory, QRCodeSectionProps, type ReactServerRenderOptions, RenderRequest, RenderResponse, type TypedRenderRequest, reactServerRender as default, reactServerRender };
2096
+ export { BaseComponentProps, type DataTypeMap, DynamicRenderPath, ExtractDataTypeFromPath, type Plugin, type PluginContext, type PluginFactory, QRCodeSectionProps, type ReactServerRenderOptions, RenderRequest, RenderResponse, type TypedRenderRequest, reactServerRender as default, reactServerRender, renderVideoPreviewPage };
@@ -1,4 +1,4 @@
1
1
  import "./rolldown-runtime-BMXAG3ag.js";
2
- import "./vendor-9pKTNH6x.js";
3
- import { r as reactServerRender, t as template_default } from "./template-CsOboAFj.js";
4
- export { template_default as default, reactServerRender };
2
+ import "./vendor-rZ5rQnq1.js";
3
+ import { i as renderVideoPreviewPage, r as reactServerRender, t as template_default } from "./template-B7RenK2I.js";
4
+ export { template_default as default, reactServerRender, renderVideoPreviewPage };