@vanillaskyai/video 0.8.8 → 0.10.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 (173) hide show
  1. package/CHANGELOG.md +42 -0
  2. package/PUBLIC-API.md +5 -8
  3. package/dist/{builtin-server-CUYPIDE7.js → builtin-server-W4PLJUZ5.js} +2 -2
  4. package/dist/{catalog-types-BIhSpOWK.d.ts → catalog-types-WTbLP6Jh.d.ts} +5 -1
  5. package/dist/chapter-title-YRLIQY3V.js +7 -0
  6. package/dist/check-runtime.js +5 -14
  7. package/dist/{chunk-AITKH6QT.js → chunk-2HFO22K2.js} +15 -40
  8. package/dist/chunk-4YM2M62S.js +13 -0
  9. package/dist/chunk-4ZJLPHBV.js +684 -0
  10. package/dist/chunk-77VY4O7A.js +390 -0
  11. package/dist/{chunk-MMUXVA47.js → chunk-7M56IUUX.js} +9 -8
  12. package/dist/chunk-7NZOMTAL.js +63 -0
  13. package/dist/{chunk-2DOLF4QN.js → chunk-AUPC6MDK.js} +12 -14
  14. package/dist/{chunk-352ZZCET.js → chunk-EGVQODKU.js} +2 -2
  15. package/dist/{chunk-2USVB3CY.js → chunk-ELVOT2FQ.js} +284 -177
  16. package/dist/chunk-EWWCQFTI.js +18 -0
  17. package/dist/{chunk-KT3M7KDL.js → chunk-HKUI5BTB.js} +3 -3
  18. package/dist/chunk-IIN5M5HW.js +697 -0
  19. package/dist/{chunk-LMG3GHLL.js → chunk-IQMYK5DX.js} +29 -3
  20. package/dist/{chunk-OWBT45EN.js → chunk-IR44XKBI.js} +1 -1
  21. package/dist/{chunk-MXZSDGZQ.js → chunk-NMFDC2W2.js} +4 -6
  22. package/dist/{chunk-5SLENAJW.js → chunk-PAJ44TFW.js} +1 -2
  23. package/dist/{chunk-L7QGGKJ2.js → chunk-PDQFQIQW.js} +1 -1
  24. package/dist/{chunk-WJ6FLKNC.js → chunk-R3XAOMKP.js} +14 -0
  25. package/dist/{chunk-2OKB27TG.js → chunk-RXTN2CW6.js} +2 -2
  26. package/dist/{chunk-XWWLKRNU.js → chunk-TVIU23OM.js} +38 -49
  27. package/dist/chunk-XX4GXKTX.js +35 -0
  28. package/dist/chunk-Z67Q5KUW.js +16 -0
  29. package/dist/{chunk-3VRMKFM7.js → chunk-ZDJNFA52.js} +11 -24
  30. package/dist/cinema-media-C7OUPNSH.js +12 -0
  31. package/dist/cli.js +18 -9
  32. package/dist/comparison-GNZOR7MF.js +37 -0
  33. package/dist/compose-video-TBFTONUC.js +12 -0
  34. package/dist/editorial-timeline-EMV5335S.js +43 -0
  35. package/dist/{events-BQ6z264n.d.ts → events-B4YCc4vc.d.ts} +1 -1
  36. package/dist/index.d.ts +4 -6
  37. package/dist/index.js +3 -7
  38. package/dist/key-figure-P37VK425.js +30 -0
  39. package/dist/{kit-tQnCPMOM.d.ts → kit-DrRpdn0p.d.ts} +2 -2
  40. package/dist/mobile-message-OF7T62B7.js +50 -0
  41. package/dist/quote-T6WYLN7A.js +33 -0
  42. package/dist/react.d.ts +21 -11
  43. package/dist/react.js +585 -826
  44. package/dist/scene-video-backdrop-PCTARAAJ.js +7 -0
  45. package/dist/server.d.ts +7 -8
  46. package/dist/server.js +179 -84
  47. package/dist/{system-prompt-RRXIWDDD.js → system-prompt-SYRT5DWM.js} +1 -1
  48. package/dist/template-catalog.d.ts +392 -16
  49. package/dist/template-catalog.js +1 -1
  50. package/dist/templates.d.ts +5 -5
  51. package/dist/test.d.ts +3 -3
  52. package/dist/test.js +18 -18
  53. package/dist/text-stream-LD364KBI.js +9 -0
  54. package/dist/{types-DWFO6qca.d.ts → types-CdBmNTGD.d.ts} +1 -1
  55. package/dist/{types-CEh9eUFu.d.ts → types-DdZw4GRQ.d.ts} +17 -48
  56. package/dist/validate-4OUD2CLX.js +10 -0
  57. package/docs/architecture.md +1 -1
  58. package/docs/concepts.md +1 -1
  59. package/docs/custom-templates.md +13 -28
  60. package/docs/customization.md +11 -59
  61. package/docs/getting-started.md +2 -2
  62. package/docs/immersive-interface.md +3 -4
  63. package/docs/maintainers/cinematic-migration.md +38 -0
  64. package/docs/media-and-audio.md +14 -14
  65. package/docs/motion-and-effects.md +6 -14
  66. package/docs/persistence.md +3 -3
  67. package/docs/production.md +11 -9
  68. package/docs/provider-integration.md +9 -16
  69. package/docs/reference/design-system.html +1 -1
  70. package/docs/reference/protocol.md +14 -4
  71. package/docs/testing.md +1 -1
  72. package/package.json +6 -3
  73. package/registry/items/backgrounds.json +1 -1
  74. package/registry/items/chapterTitle.json +80 -0
  75. package/registry/items/cinemaMedia.json +136 -0
  76. package/registry/items/comparison.json +168 -0
  77. package/registry/items/editorialTimeline.json +172 -0
  78. package/registry/items/keyFigure.json +162 -0
  79. package/registry/items/mobileMessage.json +153 -0
  80. package/registry/items/quote.json +161 -0
  81. package/registry/items/template-context.json +1 -1
  82. package/registry/items/theme.json +1 -1
  83. package/starters/video-chat/README.md +24 -26
  84. package/starters/video-chat/package.json +1 -1
  85. package/starters/video-chat/providers/video.ts +6 -5
  86. package/starters/video-chat/stock.ts +35 -151
  87. package/styles/fonts/OFL.txt +93 -0
  88. package/styles/fonts/manifest.json +66 -0
  89. package/styles/fonts/roboto-v51-cyrillic-ext.woff2 +0 -0
  90. package/styles/fonts/roboto-v51-cyrillic.woff2 +0 -0
  91. package/styles/fonts/roboto-v51-greek-ext.woff2 +0 -0
  92. package/styles/fonts/roboto-v51-greek.woff2 +0 -0
  93. package/styles/fonts/roboto-v51-latin-ext.woff2 +0 -0
  94. package/styles/fonts/roboto-v51-latin.woff2 +0 -0
  95. package/styles/fonts/roboto-v51-math.woff2 +0 -0
  96. package/styles/fonts/roboto-v51-symbols.woff2 +0 -0
  97. package/styles/fonts/roboto-v51-vietnamese.woff2 +0 -0
  98. package/styles/fonts/roboto.css +91 -0
  99. package/styles/video-chat.css +30 -22
  100. package/dist/bg-confetti-HITCGLGD.js +0 -89
  101. package/dist/bg-emoji-VU4UZYZN.js +0 -150
  102. package/dist/bg-media-L34PDQXJ.js +0 -106
  103. package/dist/brand-message-FUJ4STFO.js +0 -256
  104. package/dist/chart-bar-EGPHJATL.js +0 -310
  105. package/dist/chart-counter-5FFWQNZO.js +0 -306
  106. package/dist/chart-progress-ring-JMXQLMLC.js +0 -302
  107. package/dist/chunk-4UNKZEAT.js +0 -3575
  108. package/dist/chunk-5CDAM24P.js +0 -31
  109. package/dist/chunk-AOWSXU2K.js +0 -18
  110. package/dist/chunk-CJ7F2CE6.js +0 -104
  111. package/dist/chunk-FRN6WKHA.js +0 -185
  112. package/dist/chunk-G5JPHBX7.js +0 -336
  113. package/dist/chunk-L5BTTCZV.js +0 -97
  114. package/dist/chunk-P22HHFDK.js +0 -43
  115. package/dist/chunk-PP3MCPN4.js +0 -1998
  116. package/dist/chunk-QAAO7OAY.js +0 -19
  117. package/dist/chunk-S7HFLYNN.js +0 -35
  118. package/dist/chunk-W3VDIBGR.js +0 -217
  119. package/dist/chunk-XGRA2MUV.js +0 -242
  120. package/dist/chunk-XTOXFMLM.js +0 -105
  121. package/dist/chunk-YJJC4N4D.js +0 -761
  122. package/dist/compose-video-2NFH4DZY.js +0 -13
  123. package/dist/cta-logo-YR7LYUR5.js +0 -212
  124. package/dist/cta-media-DQJBKUO2.js +0 -221
  125. package/dist/incoming-call-54KQ7O5A.js +0 -323
  126. package/dist/infographic-before-after-ROS52GOW.js +0 -460
  127. package/dist/infographic-feature-list-E7MGUDAN.js +0 -272
  128. package/dist/infographic-problem-solution-3S6NGO5N.js +0 -343
  129. package/dist/infographic-stat-row-SYB7AB7H.js +0 -247
  130. package/dist/infographic-steps-KCE6JWE2.js +0 -406
  131. package/dist/prompt-input-MHX4O42G.js +0 -239
  132. package/dist/reaction-SLEGR3BE.js +0 -122
  133. package/dist/scene-video-backdrop-XFPX4O3I.js +0 -10
  134. package/dist/showcase-code-2HLAVKBM.js +0 -357
  135. package/dist/showcase-phone-Q4HEO4LH.js +0 -278
  136. package/dist/showcase-terminal-DL45LUFG.js +0 -312
  137. package/dist/showcase-web-2QZO73FZ.js +0 -396
  138. package/dist/social-conversation-75SD2637.js +0 -695
  139. package/dist/social-milestone-GEFUQSBF.js +0 -296
  140. package/dist/social-notification-FJ5VHVLK.js +0 -247
  141. package/dist/social-review-stack-KXQCKFRP.js +0 -242
  142. package/dist/social-testimonial-JZ7CHC7S.js +0 -287
  143. package/dist/social-tweet-UCDXM25F.js +0 -298
  144. package/dist/text-stream-54LXABJW.js +0 -10
  145. package/dist/validate-T7GBU2YF.js +0 -8
  146. package/registry/items/barChart.json +0 -245
  147. package/registry/items/beforeAfter.json +0 -180
  148. package/registry/items/bigNumber.json +0 -232
  149. package/registry/items/brandMessage.json +0 -164
  150. package/registry/items/cardList.json +0 -214
  151. package/registry/items/chatMessenger.json +0 -151
  152. package/registry/items/chatWhatsapp.json +0 -151
  153. package/registry/items/codeEditor.json +0 -191
  154. package/registry/items/confetti.json +0 -107
  155. package/registry/items/ctaLogo.json +0 -167
  156. package/registry/items/ctaMedia.json +0 -200
  157. package/registry/items/emojiBurst.json +0 -101
  158. package/registry/items/incomingCall.json +0 -177
  159. package/registry/items/media.json +0 -187
  160. package/registry/items/milestone.json +0 -212
  161. package/registry/items/notification.json +0 -189
  162. package/registry/items/phoneMockup.json +0 -261
  163. package/registry/items/problemSolution.json +0 -193
  164. package/registry/items/progressRing.json +0 -206
  165. package/registry/items/promptInput.json +0 -155
  166. package/registry/items/reaction.json +0 -176
  167. package/registry/items/reviewStack.json +0 -231
  168. package/registry/items/steps.json +0 -215
  169. package/registry/items/terminal.json +0 -219
  170. package/registry/items/testimonial.json +0 -171
  171. package/registry/items/tripleStats.json +0 -235
  172. package/registry/items/tweet.json +0 -210
  173. package/registry/items/webMockup.json +0 -280
@@ -1,306 +0,0 @@
1
- import {
2
- getResponsiveFontSize
3
- } from "./chunk-S7HFLYNN.js";
4
- import {
5
- ConfettiLayer
6
- } from "./chunk-CJ7F2CE6.js";
7
- import "./chunk-QAAO7OAY.js";
8
- import {
9
- SceneBackground,
10
- getMediaBackgroundProps
11
- } from "./chunk-MXZSDGZQ.js";
12
- import {
13
- TemplateText
14
- } from "./chunk-YJJC4N4D.js";
15
- import "./chunk-L5BTTCZV.js";
16
- import "./chunk-FRN6WKHA.js";
17
- import {
18
- TOP_TEXT_AREA_RATIO,
19
- withOpacity
20
- } from "./chunk-W3VDIBGR.js";
21
- import {
22
- interpolate,
23
- spring
24
- } from "./chunk-XTOXFMLM.js";
25
- import {
26
- hasSceneMedia
27
- } from "./chunk-224QNWRA.js";
28
- import "./chunk-5CDAM24P.js";
29
- import {
30
- MEDIA_TEXT_SHADOW,
31
- TOKEN_DEFAULTS,
32
- resolveTokens
33
- } from "./chunk-XWWLKRNU.js";
34
-
35
- // src/visual-system/primitives/typography/CountUpNumber.tsx
36
- import { jsx, jsxs } from "react/jsx-runtime";
37
- function suppliedDecimalPlaces(value) {
38
- if (!Number.isFinite(value) || Number.isInteger(value)) return 0;
39
- const normalized = String(value).toLowerCase();
40
- if (normalized.includes("e-")) {
41
- const [coefficient, exponentText] = normalized.split("e-");
42
- const coefficientDecimals = coefficient.split(".")[1]?.length ?? 0;
43
- return Math.min(6, Number(exponentText) + coefficientDecimals);
44
- }
45
- return Math.min(6, normalized.split(".")[1]?.length ?? 0);
46
- }
47
- var CountUpNumber = ({
48
- progress,
49
- motionProgress = progress,
50
- target,
51
- decimalPlaces: decimalPlacesOverride,
52
- prefix = "",
53
- unit = "",
54
- label,
55
- width,
56
- height,
57
- numberColor = "#ffffff",
58
- labelColor = "rgba(255,255,255,0.6)",
59
- font = TOKEN_DEFAULTS.font,
60
- hasMediaShadow = false,
61
- beatIntensity = 0,
62
- labelFontSize
63
- }) => {
64
- const s = Math.min(width, height) / 1080;
65
- const displayValue = interpolate(
66
- progress,
67
- [0, 0.55],
68
- [0, target],
69
- { extrapolateRight: "clamp" }
70
- );
71
- const decimalPlaces = Number.isFinite(decimalPlacesOverride) ? Math.max(0, Math.min(6, Math.trunc(decimalPlacesOverride ?? 0))) : suppliedDecimalPlaces(target);
72
- const formattedNumber = displayValue.toLocaleString("en-US", {
73
- minimumFractionDigits: decimalPlaces,
74
- maximumFractionDigits: decimalPlaces
75
- });
76
- const formattedTarget = target.toLocaleString("en-US", {
77
- minimumFractionDigits: decimalPlaces,
78
- maximumFractionDigits: decimalPlaces
79
- });
80
- const semanticValueIsTransient = formattedNumber !== formattedTarget;
81
- const fullNumberStr = `${prefix}${formattedNumber}${unit}`;
82
- const baseSize = 140 * s;
83
- const charCount = fullNumberStr.length;
84
- const numberFontSize = charCount <= 6 ? baseSize : baseSize * Math.max(0.35, 6 / charCount);
85
- const numberSpring = spring(
86
- interpolate(motionProgress, [0, 0.22], [0, 1], {
87
- extrapolateLeft: "clamp",
88
- extrapolateRight: "clamp"
89
- }),
90
- { damping: 9, stiffness: 200 }
91
- );
92
- const numberScale = interpolate(numberSpring, [0, 1], [0.3, 1]);
93
- const numberSettled = numberSpring > 0.99;
94
- const breathe = numberSettled ? 1 + Math.sin(progress * Math.PI * 4) * 8e-3 : 1;
95
- const beatScale = 1 + beatIntensity * 0.03;
96
- const labelOpacity = interpolate(
97
- motionProgress,
98
- [0.2, 0.4],
99
- [0, 1],
100
- { extrapolateLeft: "clamp", extrapolateRight: "clamp" }
101
- );
102
- const mediaTextShadow = hasMediaShadow ? MEDIA_TEXT_SHADOW : void 0;
103
- const finalLabelFontSize = labelFontSize ?? 36 * s * 1.3;
104
- return /* @__PURE__ */ jsxs(
105
- "div",
106
- {
107
- style: {
108
- position: "absolute",
109
- top: 0,
110
- left: 0,
111
- right: 0,
112
- bottom: 0,
113
- display: "flex",
114
- flexDirection: "column",
115
- alignItems: "center",
116
- justifyContent: "center",
117
- pointerEvents: "none",
118
- // font is intentionally NOT set here — caller's outer wrapper
119
- // (chart-counter root div or composed.tsx root) sets fontFamily
120
- // and the children inherit. void to silence unused-arg lint.
121
- ...(void font, {})
122
- },
123
- children: [
124
- /* @__PURE__ */ jsxs(
125
- "div",
126
- {
127
- "data-transition-semantic": semanticValueIsTransient ? "transient" : void 0,
128
- style: {
129
- fontSize: numberFontSize,
130
- fontWeight: 800,
131
- color: numberColor,
132
- textAlign: "center",
133
- lineHeight: 1.1,
134
- position: "relative",
135
- zIndex: 1,
136
- maxWidth: "90%",
137
- overflow: "visible",
138
- ...semanticValueIsTransient ? { visibility: "var(--vanillasky-transition-semantic-visibility,visible)" } : {},
139
- transform: `scale(${numberScale * beatScale * breathe})`,
140
- ...mediaTextShadow ? { textShadow: mediaTextShadow } : {}
141
- },
142
- children: [
143
- prefix,
144
- formattedNumber,
145
- unit
146
- ]
147
- }
148
- ),
149
- /* @__PURE__ */ jsx(
150
- "div",
151
- {
152
- style: {
153
- opacity: labelOpacity,
154
- fontSize: finalLabelFontSize,
155
- color: labelColor,
156
- textTransform: "uppercase",
157
- letterSpacing: 2 * s,
158
- textAlign: "center",
159
- marginTop: 12 * s,
160
- position: "relative",
161
- zIndex: 1,
162
- ...mediaTextShadow ? { textShadow: mediaTextShadow } : {}
163
- },
164
- children: label
165
- }
166
- )
167
- ]
168
- }
169
- );
170
- };
171
-
172
- // src/visual-system/scene-templates/chart-counter.tsx
173
- import { jsx as jsx2, jsxs as jsxs2 } from "react/jsx-runtime";
174
- var ChartCounterTemplate = ({
175
- variables,
176
- style,
177
- progress,
178
- motionProgress = progress,
179
- beatIntensity,
180
- width,
181
- height,
182
- safeZone,
183
- sceneDuration,
184
- isPlaying = true,
185
- backgroundEffect
186
- }) => {
187
- const s = Math.min(width, height) / 1080;
188
- const { primary, foreground, font, background } = resolveTokens(style);
189
- const chartColor = primary;
190
- const textColor = foreground;
191
- const textsRaw = String(variables.texts || "");
192
- const gradSeed = textsRaw.split("").reduce((acc, c) => acc + c.charCodeAt(0), 0);
193
- const parsedValue = Number(variables.value);
194
- const targetValue = Number.isFinite(parsedValue) ? parsedValue : 1e3;
195
- const parsedDecimalPlaces = Number(variables.decimalPlaces);
196
- const decimalPlaces = Number.isFinite(parsedDecimalPlaces) ? Math.max(0, Math.min(6, Math.trunc(parsedDecimalPlaces))) : void 0;
197
- const label = String(variables.label || "Total users");
198
- const prefix = String(variables.prefix || "");
199
- const unit = String(variables.unit || "");
200
- const hasMedia = !!String(variables.mediaUrl || "").trim() && String(variables.mediaType || "auto") !== "gradient";
201
- const numberColor = hasMedia ? "#ffffff" : textColor;
202
- const labelColor = hasMedia ? "#ffffff" : withOpacity(textColor, 0.6);
203
- const confettiActive = variables.confetti === true && motionProgress >= 0.55;
204
- const confettiProgress = confettiActive ? (motionProgress - 0.55) / 0.45 : 0;
205
- const labelFontSize = getResponsiveFontSize(label, width, "subtitle", height) * 1.3;
206
- return /* @__PURE__ */ jsxs2(
207
- "div",
208
- {
209
- style: {
210
- width,
211
- height,
212
- backgroundColor: "var(--vanillasky-template-surface, #000)",
213
- position: "relative",
214
- overflow: "hidden",
215
- fontFamily: font
216
- },
217
- children: [
218
- /* @__PURE__ */ jsx2(
219
- SceneBackground,
220
- {
221
- style,
222
- progress,
223
- sceneDuration,
224
- width,
225
- height,
226
- ...getMediaBackgroundProps(variables),
227
- backgroundEffect,
228
- seed: gradSeed,
229
- isPlaying,
230
- beatIntensity
231
- }
232
- ),
233
- /* @__PURE__ */ jsx2(
234
- "div",
235
- {
236
- style: {
237
- position: "absolute",
238
- top: "50%",
239
- left: "50%",
240
- transform: "translate(-50%, -55%)",
241
- width: 500 * s,
242
- height: 500 * s,
243
- borderRadius: "50%",
244
- background: `radial-gradient(circle, ${withOpacity(primary, 0.15)} 0%, transparent 70%)`,
245
- pointerEvents: "none"
246
- }
247
- }
248
- ),
249
- confettiActive && /* @__PURE__ */ jsx2(
250
- ConfettiLayer,
251
- {
252
- progress: confettiProgress,
253
- width,
254
- height,
255
- beatIntensity,
256
- bgColor: hasMedia ? void 0 : background.type === "solid" ? background.color : background.colors[1]
257
- }
258
- ),
259
- /* @__PURE__ */ jsx2("div", { style: { position: "absolute", top: 0, left: 0, right: 0, height: height * TOP_TEXT_AREA_RATIO, overflow: "visible" }, children: /* @__PURE__ */ jsx2(
260
- TemplateText,
261
- {
262
- overMedia: hasSceneMedia(variables),
263
- motionProgress,
264
- typeTreatment: resolveTokens(style).preset.type,
265
- archetype: "subtle",
266
- text: String(variables.texts ?? ""),
267
- progress,
268
- sceneDuration: sceneDuration ?? 3,
269
- width,
270
- height,
271
- position: "top",
272
- sizeRole: "headline",
273
- safeZone,
274
- font,
275
- color: textColor,
276
- beatIntensity
277
- }
278
- ) }),
279
- /* @__PURE__ */ jsx2(
280
- CountUpNumber,
281
- {
282
- progress,
283
- motionProgress,
284
- target: targetValue,
285
- decimalPlaces,
286
- prefix,
287
- unit,
288
- label,
289
- width,
290
- height,
291
- numberColor,
292
- labelColor,
293
- chartColor,
294
- font,
295
- hasMediaShadow: hasMedia,
296
- beatIntensity,
297
- labelFontSize
298
- }
299
- )
300
- ]
301
- }
302
- );
303
- };
304
- export {
305
- ChartCounterTemplate
306
- };
@@ -1,302 +0,0 @@
1
- import {
2
- getResponsiveFontSize,
3
- stripPipe
4
- } from "./chunk-S7HFLYNN.js";
5
- import {
6
- SceneBackground,
7
- getMediaBackgroundProps
8
- } from "./chunk-MXZSDGZQ.js";
9
- import {
10
- TemplateText
11
- } from "./chunk-YJJC4N4D.js";
12
- import "./chunk-L5BTTCZV.js";
13
- import "./chunk-FRN6WKHA.js";
14
- import {
15
- TOP_TEXT_AREA_RATIO,
16
- withOpacity
17
- } from "./chunk-W3VDIBGR.js";
18
- import {
19
- interpolate
20
- } from "./chunk-XTOXFMLM.js";
21
- import {
22
- hasSceneMedia
23
- } from "./chunk-224QNWRA.js";
24
- import "./chunk-5CDAM24P.js";
25
- import {
26
- TOKEN_DEFAULTS,
27
- resolveTokens
28
- } from "./chunk-XWWLKRNU.js";
29
-
30
- // src/visual-system/primitives/charts/ProgressRing.tsx
31
- import { Fragment, jsx, jsxs } from "react/jsx-runtime";
32
- var ProgressRing = ({
33
- progress,
34
- motionProgress = progress,
35
- targetValue,
36
- decimalPlaces,
37
- unit = "%",
38
- chartColor = "#ffffff",
39
- textColor = "#ffffff",
40
- label: rawLabel = "",
41
- font = TOKEN_DEFAULTS.font,
42
- width,
43
- height,
44
- beatIntensity = 0
45
- }) => {
46
- const s = Math.min(width, height) / 1080;
47
- const label = stripPipe(String(rawLabel || ""));
48
- const radius = Math.min(width, height) * 0.2;
49
- const circumference = 2 * Math.PI * radius;
50
- const cx = width / 2;
51
- const cy = height / 2;
52
- const strokeW = 34 * s;
53
- const fillPercent = interpolate(progress, [0.05, 0.75], [0, targetValue], {
54
- extrapolateLeft: "clamp",
55
- extrapolateRight: "clamp"
56
- });
57
- const dashOffset = circumference * (1 - fillPercent / 100);
58
- const targetDecimals = Number.isFinite(decimalPlaces) ? Math.max(0, Math.min(2, Math.trunc(decimalPlaces ?? 0))) : Number.isInteger(targetValue) ? 0 : Math.min(2, (String(targetValue).split(".")[1] || "1").length);
59
- const displayNumber = targetDecimals === 0 ? String(Math.round(fillPercent)) : fillPercent.toFixed(targetDecimals);
60
- const targetDisplayNumber = targetDecimals === 0 ? String(Math.round(targetValue)) : targetValue.toFixed(targetDecimals);
61
- const semanticValueIsTransient = displayNumber !== targetDisplayNumber;
62
- const beatStroke = strokeW + beatIntensity * 4 * s;
63
- const labelFontSize = getResponsiveFontSize(label, width, "subtitle", height) * 1.3;
64
- const labelOpacity = interpolate(motionProgress, [0.35, 0.55], [0, 1], {
65
- extrapolateLeft: "clamp",
66
- extrapolateRight: "clamp"
67
- });
68
- const labelRise = interpolate(motionProgress, [0.35, 0.55], [16 * s, 0], {
69
- extrapolateLeft: "clamp",
70
- extrapolateRight: "clamp"
71
- });
72
- return /* @__PURE__ */ jsxs(Fragment, { children: [
73
- /* @__PURE__ */ jsx(
74
- "div",
75
- {
76
- style: {
77
- position: "absolute",
78
- top: cy - radius * 1.2,
79
- left: cx - radius * 1.2,
80
- width: radius * 2.4,
81
- height: radius * 2.4,
82
- borderRadius: "50%",
83
- background: `radial-gradient(circle at 50% 50%, ${withOpacity(chartColor, 0.08)} 0%, transparent 70%)`,
84
- pointerEvents: "none"
85
- }
86
- }
87
- ),
88
- /* @__PURE__ */ jsxs(
89
- "svg",
90
- {
91
- viewBox: `0 0 ${width} ${height}`,
92
- style: {
93
- position: "absolute",
94
- inset: 0,
95
- width,
96
- height
97
- },
98
- children: [
99
- /* @__PURE__ */ jsx(
100
- "circle",
101
- {
102
- cx,
103
- cy,
104
- r: radius,
105
- fill: "none",
106
- stroke: withOpacity(chartColor, 0.1),
107
- strokeWidth: strokeW
108
- }
109
- ),
110
- /* @__PURE__ */ jsx(
111
- "circle",
112
- {
113
- cx,
114
- cy,
115
- r: radius,
116
- fill: "none",
117
- stroke: chartColor,
118
- strokeWidth: beatStroke,
119
- strokeLinecap: "round",
120
- strokeDasharray: circumference,
121
- strokeDashoffset: dashOffset,
122
- transform: `rotate(-90, ${cx}, ${cy})`,
123
- style: { transition: "none" }
124
- }
125
- )
126
- ]
127
- }
128
- ),
129
- /* @__PURE__ */ jsxs(
130
- "div",
131
- {
132
- "data-transition-semantic": semanticValueIsTransient ? "transient" : void 0,
133
- style: {
134
- position: "absolute",
135
- left: cx - radius,
136
- top: cy - radius,
137
- width: radius * 2,
138
- height: radius * 2,
139
- display: "flex",
140
- alignItems: "center",
141
- justifyContent: "center",
142
- pointerEvents: "none",
143
- ...semanticValueIsTransient ? { visibility: "var(--vanillasky-transition-semantic-visibility,visible)" } : {}
144
- },
145
- children: [
146
- /* @__PURE__ */ jsx(
147
- "span",
148
- {
149
- style: {
150
- fontSize: 120 * s,
151
- fontWeight: 800,
152
- color: textColor,
153
- lineHeight: 1
154
- },
155
- children: displayNumber
156
- }
157
- ),
158
- /* @__PURE__ */ jsx(
159
- "span",
160
- {
161
- style: {
162
- fontSize: 56 * s,
163
- fontWeight: 700,
164
- color: chartColor,
165
- marginLeft: 4 * s
166
- },
167
- children: unit
168
- }
169
- )
170
- ]
171
- }
172
- ),
173
- label && /* @__PURE__ */ jsx(
174
- "div",
175
- {
176
- style: {
177
- position: "absolute",
178
- top: cy + radius + 48 * s,
179
- left: 0,
180
- right: 0,
181
- display: "flex",
182
- justifyContent: "center",
183
- pointerEvents: "none"
184
- },
185
- children: /* @__PURE__ */ jsx(
186
- "div",
187
- {
188
- style: {
189
- fontSize: labelFontSize,
190
- color: withOpacity(textColor, 0.6),
191
- textTransform: "uppercase",
192
- letterSpacing: 2 * s,
193
- textAlign: "center",
194
- maxWidth: "80%",
195
- opacity: labelOpacity,
196
- transform: `translateY(${labelRise}px)`,
197
- fontFamily: font
198
- },
199
- children: label
200
- }
201
- )
202
- }
203
- )
204
- ] });
205
- };
206
-
207
- // src/visual-system/scene-templates/chart-progress-ring.tsx
208
- import { jsx as jsx2, jsxs as jsxs2 } from "react/jsx-runtime";
209
- var ChartProgressRingTemplate = ({
210
- variables,
211
- style,
212
- progress,
213
- motionProgress = progress,
214
- beatIntensity,
215
- width,
216
- height,
217
- safeZone,
218
- sceneDuration,
219
- backgroundEffect,
220
- isPlaying = true
221
- }) => {
222
- const { primary, foreground, font } = resolveTokens(style);
223
- const chartColor = primary;
224
- const textColor = foreground;
225
- const textsRaw = String(variables.texts || "");
226
- const parsedValue = Number(variables.value);
227
- const targetValue = Math.max(0, Math.min(100, Number.isFinite(parsedValue) ? parsedValue : 75));
228
- const parsedDecimalPlaces = Number(variables.decimalPlaces);
229
- const decimalPlaces = Number.isFinite(parsedDecimalPlaces) ? Math.max(0, Math.min(2, Math.trunc(parsedDecimalPlaces))) : void 0;
230
- const unit = String(variables.unit ?? "%");
231
- const label = String(variables.label ?? "");
232
- return /* @__PURE__ */ jsxs2(
233
- "div",
234
- {
235
- style: {
236
- width,
237
- height,
238
- backgroundColor: "var(--vanillasky-template-surface, #000)",
239
- position: "relative",
240
- overflow: "hidden",
241
- fontFamily: font
242
- },
243
- children: [
244
- /* @__PURE__ */ jsx2(
245
- SceneBackground,
246
- {
247
- style,
248
- progress,
249
- sceneDuration,
250
- width,
251
- height,
252
- ...getMediaBackgroundProps(variables),
253
- backgroundEffect,
254
- seed: textsRaw,
255
- isPlaying,
256
- beatIntensity
257
- }
258
- ),
259
- /* @__PURE__ */ jsx2("div", { style: { position: "absolute", top: 0, left: 0, right: 0, height: height * TOP_TEXT_AREA_RATIO, overflow: "visible" }, children: /* @__PURE__ */ jsx2(
260
- TemplateText,
261
- {
262
- overMedia: hasSceneMedia(variables),
263
- motionProgress,
264
- typeTreatment: resolveTokens(style).preset.type,
265
- archetype: "subtle",
266
- text: String(variables.texts ?? ""),
267
- progress,
268
- sceneDuration: sceneDuration ?? 3,
269
- width,
270
- height,
271
- position: "top",
272
- sizeRole: "headline",
273
- safeZone,
274
- font,
275
- color: textColor,
276
- beatIntensity
277
- }
278
- ) }),
279
- /* @__PURE__ */ jsx2(
280
- ProgressRing,
281
- {
282
- progress,
283
- motionProgress,
284
- targetValue,
285
- decimalPlaces,
286
- unit,
287
- chartColor,
288
- textColor,
289
- label,
290
- font,
291
- width,
292
- height,
293
- beatIntensity
294
- }
295
- )
296
- ]
297
- }
298
- );
299
- };
300
- export {
301
- ChartProgressRingTemplate
302
- };