@cueframe/kernel 0.1.0 → 0.1.1

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 (355) hide show
  1. package/LICENSE +661 -0
  2. package/dist/_members/composition/ops/compositionOps.d.ts +1 -0
  3. package/dist/_members/composition/projection/behind-readiness.d.ts +127 -0
  4. package/dist/_members/composition/projection/index.d.ts +2 -0
  5. package/dist/_members/composition/projection/reframe-readiness.d.ts +156 -0
  6. package/dist/_members/composition/validators/composition.d.ts +42 -25
  7. package/dist/_members/composition/validators/render.d.ts +32 -0
  8. package/dist/_members/core/render/compositionRender.d.ts +17 -1
  9. package/dist/_members/core/render/types.d.ts +31 -0
  10. package/dist/authoring/build-tools.js +6 -6
  11. package/dist/authoring/context.js +4 -4
  12. package/dist/authoring/tools.js +5 -5
  13. package/dist/authoring.js +11 -9
  14. package/dist/{chunk-ZB3C3HM7.js → chunk-7FO3ZJ43.js} +3 -0
  15. package/dist/{chunk-ODL7GQJG.js → chunk-AP6ZIVAV.js} +2 -2
  16. package/dist/{chunk-IBYQG46O.js → chunk-AQBREB5O.js} +1 -1
  17. package/dist/{chunk-YIOY2XEO.js → chunk-DK2ODBNT.js} +15 -5
  18. package/dist/{chunk-JRQVPFLF.js → chunk-HY3RIEZW.js} +1 -1
  19. package/dist/{chunk-GEA7E2FL.js → chunk-JJ6XD7NG.js} +151 -1
  20. package/dist/{chunk-COYMZ76S.js → chunk-MBCXCJOE.js} +1 -1
  21. package/dist/{chunk-37NJ27UU.js → chunk-OCFDUCF4.js} +3 -0
  22. package/dist/{chunk-VOO5FQSS.js → chunk-PDYO3DOJ.js} +5 -5
  23. package/dist/{chunk-MXFAADCQ.js → chunk-PODIYN2K.js} +9 -2
  24. package/dist/{chunk-NFEGPWGS.js → chunk-TOJEXFXL.js} +1 -1
  25. package/dist/{chunk-LM4WDUQJ.js → chunk-UHGSZZDI.js} +1 -1
  26. package/dist/{chunk-XWKZB5U5.js → chunk-ZWMV6DD2.js} +24 -1
  27. package/dist/compose/renderer.js +3 -3
  28. package/dist/compose.js +6 -6
  29. package/dist/composition/graphics-plan.js +1 -1
  30. package/dist/composition/ops.js +3 -3
  31. package/dist/composition/primitive-catalog.js +1 -1
  32. package/dist/composition/projection.js +19 -3
  33. package/dist/composition/validators.js +6 -4
  34. package/dist/composition-ops.js +8 -6
  35. package/dist/composition.js +24 -6
  36. package/dist/{context-OKX3HHFS.js → context-YWUZDG5X.js} +4 -4
  37. package/dist/core/render.js +3 -3
  38. package/dist/core/select.js +2 -2
  39. package/dist/core.js +3 -3
  40. package/dist/errors.js +1 -1
  41. package/dist/mcp/adapter.js +1 -0
  42. package/dist/media-model/testing.js +1071 -718
  43. package/dist/nle-export/server.js +328 -130
  44. package/dist/nle-export.js +7 -6
  45. package/package.json +13 -14
  46. package/dist/_members/account-model/index.js +0 -4
  47. package/dist/_members/account-model/testing/conversationStoreContract.js +0 -168
  48. package/dist/_members/account-model/testing/index.js +0 -7
  49. package/dist/_members/account-model/testing/restorePointStoreContract.js +0 -69
  50. package/dist/_members/account-model/types/index.js +0 -1
  51. package/dist/_members/account-model/validators/contextFile.js +0 -18
  52. package/dist/_members/account-model/validators/conversation.js +0 -95
  53. package/dist/_members/account-model/validators/dashboardInsight.js +0 -16
  54. package/dist/_members/account-model/validators/index.js +0 -7
  55. package/dist/_members/account-model/validators/sessionToken.js +0 -49
  56. package/dist/_members/account-model/validators/uploadToken.js +0 -16
  57. package/dist/_members/account-model/validators/userSettings.js +0 -12
  58. package/dist/_members/account-model/validators/workingComposition.js +0 -20
  59. package/dist/_members/brand-derivation/constants.js +0 -20
  60. package/dist/_members/brand-derivation/contrastSafe.js +0 -114
  61. package/dist/_members/brand-derivation/index.js +0 -1
  62. package/dist/_members/cloud-import/chunk-XKO6ZSWI.js +0 -162
  63. package/dist/_members/cloud-import/chunk-XKO6ZSWI.js.map +0 -1
  64. package/dist/_members/cloud-import/index.js +0 -241
  65. package/dist/_members/cloud-import/index.js.map +0 -1
  66. package/dist/_members/cloud-import/multipartUpload.js +0 -7
  67. package/dist/_members/cloud-import/multipartUpload.js.map +0 -1
  68. package/dist/_members/composition/audio/audioMix.js +0 -61
  69. package/dist/_members/composition/audio/index.js +0 -5
  70. package/dist/_members/composition/audio/mixStaging.js +0 -195
  71. package/dist/_members/composition/audio/musicPack.generated.js +0 -136
  72. package/dist/_members/composition/audio/musicPack.js +0 -36
  73. package/dist/_members/composition/audio/pack.generated.js +0 -603
  74. package/dist/_members/composition/audio/pack.js +0 -48
  75. package/dist/_members/composition/audio/palette.js +0 -134
  76. package/dist/_members/composition/autozoom/index.js +0 -83
  77. package/dist/_members/composition/brand-kit.js +0 -45
  78. package/dist/_members/composition/brief/contract.js +0 -209
  79. package/dist/_members/composition/color-grade.js +0 -80
  80. package/dist/_members/composition/depth.js +0 -8
  81. package/dist/_members/composition/fixtures/index.js +0 -143
  82. package/dist/_members/composition/fixtures/vaayaErrored.d.ts +0 -25
  83. package/dist/_members/composition/fixtures/vaayaErrored.js +0 -203
  84. package/dist/_members/composition/fonts.js +0 -162
  85. package/dist/_members/composition/graphics-plan/compile.js +0 -221
  86. package/dist/_members/composition/graphics-plan/index.js +0 -10
  87. package/dist/_members/composition/graphics-plan/instantiateMotif.js +0 -44
  88. package/dist/_members/composition/graphics-plan/motion.js +0 -66
  89. package/dist/_members/composition/graphics-plan/schemas.js +0 -261
  90. package/dist/_members/composition/graphics-plan/solve.js +0 -145
  91. package/dist/_members/composition/index.js +0 -5
  92. package/dist/_members/composition/invariants/clipPlacement.js +0 -69
  93. package/dist/_members/composition/invariants/composition.js +0 -28
  94. package/dist/_members/composition/invariants/errors.js +0 -10
  95. package/dist/_members/composition/invariants/etag.js +0 -38
  96. package/dist/_members/composition/invariants/ids.js +0 -33
  97. package/dist/_members/composition/invariants/index.js +0 -9
  98. package/dist/_members/composition/invariants/keyframes.js +0 -45
  99. package/dist/_members/composition/invariants/markers.js +0 -29
  100. package/dist/_members/composition/invariants/time.js +0 -20
  101. package/dist/_members/composition/invariants/tracks.js +0 -304
  102. package/dist/_members/composition/ops/compositionOps.js +0 -1056
  103. package/dist/_members/composition/ops/headlessStore.js +0 -94
  104. package/dist/_members/composition/ops/index.js +0 -4
  105. package/dist/_members/composition/ops/selectors.js +0 -118
  106. package/dist/_members/composition/ops/timeline-word.js +0 -1
  107. package/dist/_members/composition/ops/transcript.js +0 -77
  108. package/dist/_members/composition/ops/types.js +0 -16
  109. package/dist/_members/composition/primitive-catalog/catalogQuery.js +0 -150
  110. package/dist/_members/composition/primitive-catalog/disabled.js +0 -32
  111. package/dist/_members/composition/primitive-catalog/generated/meta.js +0 -15161
  112. package/dist/_members/composition/primitive-catalog/index.js +0 -46
  113. package/dist/_members/composition/primitive-catalog/paramValidation.js +0 -231
  114. package/dist/_members/composition/primitive-catalog/projection.js +0 -164
  115. package/dist/_members/composition/primitive-catalog/types.js +0 -14
  116. package/dist/_members/composition/projection/behind-placement.js +0 -62
  117. package/dist/_members/composition/projection/brandKit.js +0 -482
  118. package/dist/_members/composition/projection/cardTokens.js +0 -209
  119. package/dist/_members/composition/projection/composition-floor.js +0 -582
  120. package/dist/_members/composition/projection/cropProjection.js +0 -257
  121. package/dist/_members/composition/projection/index.js +0 -7
  122. package/dist/_members/composition/projection/occlusion-budget.js +0 -104
  123. package/dist/_members/composition/projection/safe-zones.js +0 -99
  124. package/dist/_members/composition/reframe/aspectLoss.js +0 -115
  125. package/dist/_members/composition/reframe/coverage.js +0 -62
  126. package/dist/_members/composition/reframe/derive.js +0 -73
  127. package/dist/_members/composition/reframe/index.js +0 -109
  128. package/dist/_members/composition/reframe/kenBurns.js +0 -64
  129. package/dist/_members/composition/reframe/shotScale.js +0 -176
  130. package/dist/_members/composition/reframe/trajectory.js +0 -124
  131. package/dist/_members/composition/timeline/compound.js +0 -134
  132. package/dist/_members/composition/timeline/index.js +0 -9
  133. package/dist/_members/composition/timeline/intent.js +0 -228
  134. package/dist/_members/composition/timeline/keyframes.js +0 -121
  135. package/dist/_members/composition/timeline/link.js +0 -59
  136. package/dist/_members/composition/timeline/occupancy.js +0 -36
  137. package/dist/_members/composition/timeline/placement.js +0 -74
  138. package/dist/_members/composition/timeline/plan.js +0 -31
  139. package/dist/_members/composition/timeline/resolve.js +0 -170
  140. package/dist/_members/composition/timeline/trims.js +0 -278
  141. package/dist/_members/composition/types/index.js +0 -1
  142. package/dist/_members/composition/validators/brandKit.js +0 -295
  143. package/dist/_members/composition/validators/composePlan.js +0 -113
  144. package/dist/_members/composition/validators/composition.js +0 -703
  145. package/dist/_members/composition/validators/font.js +0 -34
  146. package/dist/_members/composition/validators/graphicKinds.js +0 -30
  147. package/dist/_members/composition/validators/index.js +0 -9
  148. package/dist/_members/composition/validators/project.js +0 -29
  149. package/dist/_members/composition/validators/registry.js +0 -41
  150. package/dist/_members/composition/validators/render.js +0 -139
  151. package/dist/_members/composition/validators/session.js +0 -37
  152. package/dist/_members/composition/validators/webhook.js +0 -72
  153. package/dist/_members/composition-ops/alphaLayers.js +0 -141
  154. package/dist/_members/composition-ops/index.js +0 -637
  155. package/dist/_members/composition-ops/materializeGrid.js +0 -99
  156. package/dist/_members/composition-ops/opRecorder.js +0 -196
  157. package/dist/_members/composition-ops/recordingStore.js +0 -14
  158. package/dist/_members/composition-ops/replaceRegion.js +0 -102
  159. package/dist/_members/composition-ops/testFixtures.js +0 -19
  160. package/dist/_members/core/index.js +0 -5
  161. package/dist/_members/core/render/bookends.js +0 -53
  162. package/dist/_members/core/render/captions.js +0 -127
  163. package/dist/_members/core/render/compositionRender.js +0 -1249
  164. package/dist/_members/core/render/deriveTrajectory.js +0 -889
  165. package/dist/_members/core/render/emphasis.js +0 -16
  166. package/dist/_members/core/render/eval/cropBox.js +0 -139
  167. package/dist/_members/core/render/eval/inclusion.js +0 -96
  168. package/dist/_members/core/render/eval/index.js +0 -146
  169. package/dist/_members/core/render/eval/metrics.js +0 -94
  170. package/dist/_members/core/render/exportSettings.js +0 -65
  171. package/dist/_members/core/render/index.js +0 -20
  172. package/dist/_members/core/render/mapFaceToPerson.js +0 -73
  173. package/dist/_members/core/render/types.js +0 -8
  174. package/dist/_members/core/render/vcam/cameraPath.js +0 -248
  175. package/dist/_members/core/render/vcam/constants.js +0 -115
  176. package/dist/_members/core/render/vcam/errorCodes.js +0 -39
  177. package/dist/_members/core/render/vcam/framing.js +0 -136
  178. package/dist/_members/core/render/vcam/requiredRegion.js +0 -137
  179. package/dist/_members/core/render/vcam/shots.js +0 -53
  180. package/dist/_members/core/render/vcam/subjectSet.js +0 -388
  181. package/dist/_members/core/select/errorCodes.js +0 -38
  182. package/dist/_members/core/select/index.js +0 -26
  183. package/dist/_members/core/select/model.js +0 -18
  184. package/dist/_members/core/select/select.js +0 -244
  185. package/dist/_members/core/select/stabilize.js +0 -242
  186. package/dist/_members/core/types.js +0 -7
  187. package/dist/_members/errors/index.js +0 -1
  188. package/dist/_members/errors/registry.js +0 -560
  189. package/dist/_members/foundation/codes/index.js +0 -31
  190. package/dist/_members/foundation/index.js +0 -2
  191. package/dist/_members/foundation/primitives/index.js +0 -5
  192. package/dist/_members/mcp/adapter.js +0 -771
  193. package/dist/_members/mcp/burnedNames.js +0 -73
  194. package/dist/_members/mcp/core.js +0 -390
  195. package/dist/_members/mcp/curation.js +0 -792
  196. package/dist/_members/mcp/executor.js +0 -142
  197. package/dist/_members/mcp/format.js +0 -9
  198. package/dist/_members/mcp/generated/catalogPreviews.js +0 -95
  199. package/dist/_members/mcp/generated/harness.js +0 -81
  200. package/dist/_members/mcp/generated/operations.js +0 -131
  201. package/dist/_members/mcp/index.js +0 -50
  202. package/dist/_members/mcp/internalLoopTools.js +0 -109
  203. package/dist/_members/mcp/prompts.js +0 -45
  204. package/dist/_members/mcp/resources.js +0 -166
  205. package/dist/_members/mcp/server.js +0 -340
  206. package/dist/_members/mcp/wait.js +0 -378
  207. package/dist/_members/mcp/x402Meta.js +0 -66
  208. package/dist/_members/media-model/api.js +0 -175
  209. package/dist/_members/media-model/index.js +0 -1
  210. package/dist/_members/media-model/media-kind.js +0 -116
  211. package/dist/_members/media-model/testing/index.js +0 -1
  212. package/dist/_members/media-model/testing/mediaStoreContract.js +0 -82
  213. package/dist/_members/media-model/transcriptSearch.js +0 -70
  214. package/dist/_members/media-model/transcriptSearchCases.json +0 -79
  215. package/dist/_members/nle-export/compact-timeline.js +0 -73
  216. package/dist/_members/nle-export/compact-timeline.js.map +0 -1
  217. package/dist/_members/nle-export/composition-to-input.js +0 -147
  218. package/dist/_members/nle-export/composition-to-input.js.map +0 -1
  219. package/dist/_members/nle-export/fcpxml.js +0 -159
  220. package/dist/_members/nle-export/fcpxml.js.map +0 -1
  221. package/dist/_members/nle-export/index.js +0 -12
  222. package/dist/_members/nle-export/index.js.map +0 -1
  223. package/dist/_members/nle-export/premiere.js +0 -161
  224. package/dist/_members/nle-export/premiere.js.map +0 -1
  225. package/dist/_members/nle-export/server/index.js +0 -2
  226. package/dist/_members/nle-export/server/index.js.map +0 -1
  227. package/dist/_members/nle-export/server/pack-zip.js +0 -38
  228. package/dist/_members/nle-export/server/pack-zip.js.map +0 -1
  229. package/dist/_members/nle-export/srt.js +0 -50
  230. package/dist/_members/nle-export/srt.js.map +0 -1
  231. package/dist/_members/nle-export/types.js +0 -9
  232. package/dist/_members/nle-export/types.js.map +0 -1
  233. package/dist/_members/nle-export/xml/index.js +0 -11
  234. package/dist/_members/nle-export/xml/index.js.map +0 -1
  235. package/dist/_members/nle-export/xml-utils.js +0 -48
  236. package/dist/_members/nle-export/xml-utils.js.map +0 -1
  237. package/dist/_members/perception/activeSpeaker.js +0 -103
  238. package/dist/_members/perception/audioQuality.js +0 -76
  239. package/dist/_members/perception/energyBeat.js +0 -99
  240. package/dist/_members/perception/identityMatch.js +0 -91
  241. package/dist/_members/perception/index.js +0 -48
  242. package/dist/_members/perception/visualQuality.js +0 -95
  243. package/dist/_members/plane/conformance.js +0 -90
  244. package/dist/_members/plane/contract.js +0 -49
  245. package/dist/_members/plane/index.js +0 -16
  246. package/dist/_members/primitives/backgrounds/index.js +0 -32
  247. package/dist/_members/primitives/backgrounds/index.js.map +0 -1
  248. package/dist/_members/primitives/captions/index.js +0 -398
  249. package/dist/_members/primitives/captions/index.js.map +0 -1
  250. package/dist/_members/primitives/chunk-2LVE4UIT.js +0 -139
  251. package/dist/_members/primitives/chunk-2LVE4UIT.js.map +0 -1
  252. package/dist/_members/primitives/chunk-3IQUH6KK.js +0 -20
  253. package/dist/_members/primitives/chunk-3IQUH6KK.js.map +0 -1
  254. package/dist/_members/primitives/chunk-3OMURV6Q.js +0 -112
  255. package/dist/_members/primitives/chunk-3OMURV6Q.js.map +0 -1
  256. package/dist/_members/primitives/chunk-4IS6TMEG.js +0 -21
  257. package/dist/_members/primitives/chunk-4IS6TMEG.js.map +0 -1
  258. package/dist/_members/primitives/chunk-5MWGAEGQ.js +0 -1644
  259. package/dist/_members/primitives/chunk-5MWGAEGQ.js.map +0 -1
  260. package/dist/_members/primitives/chunk-7RRPFPQK.js +0 -15
  261. package/dist/_members/primitives/chunk-7RRPFPQK.js.map +0 -1
  262. package/dist/_members/primitives/chunk-DH5TRZK2.js +0 -125
  263. package/dist/_members/primitives/chunk-DH5TRZK2.js.map +0 -1
  264. package/dist/_members/primitives/chunk-E3KNUSFG.js +0 -2337
  265. package/dist/_members/primitives/chunk-E3KNUSFG.js.map +0 -1
  266. package/dist/_members/primitives/chunk-G2B3G4HK.js +0 -47
  267. package/dist/_members/primitives/chunk-G2B3G4HK.js.map +0 -1
  268. package/dist/_members/primitives/chunk-HFPFGZXT.js +0 -1494
  269. package/dist/_members/primitives/chunk-HFPFGZXT.js.map +0 -1
  270. package/dist/_members/primitives/chunk-HIWVFZVH.js +0 -19
  271. package/dist/_members/primitives/chunk-HIWVFZVH.js.map +0 -1
  272. package/dist/_members/primitives/chunk-IDAL6G3Y.js +0 -134
  273. package/dist/_members/primitives/chunk-IDAL6G3Y.js.map +0 -1
  274. package/dist/_members/primitives/chunk-KNC6JP5F.js +0 -34
  275. package/dist/_members/primitives/chunk-KNC6JP5F.js.map +0 -1
  276. package/dist/_members/primitives/chunk-KYRDVZST.js +0 -459
  277. package/dist/_members/primitives/chunk-KYRDVZST.js.map +0 -1
  278. package/dist/_members/primitives/chunk-LWLHS2NS.js +0 -3410
  279. package/dist/_members/primitives/chunk-LWLHS2NS.js.map +0 -1
  280. package/dist/_members/primitives/chunk-QAQ3P7DR.js +0 -8855
  281. package/dist/_members/primitives/chunk-QAQ3P7DR.js.map +0 -1
  282. package/dist/_members/primitives/chunk-ROV2ODWC.js +0 -81
  283. package/dist/_members/primitives/chunk-ROV2ODWC.js.map +0 -1
  284. package/dist/_members/primitives/chunk-TCRC2FH3.js +0 -183
  285. package/dist/_members/primitives/chunk-TCRC2FH3.js.map +0 -1
  286. package/dist/_members/primitives/chunk-US4YEDAA.js +0 -96
  287. package/dist/_members/primitives/chunk-US4YEDAA.js.map +0 -1
  288. package/dist/_members/primitives/chunk-UVKRO5ER.js +0 -13
  289. package/dist/_members/primitives/chunk-UVKRO5ER.js.map +0 -1
  290. package/dist/_members/primitives/chunk-W4EIIF2I.js +0 -10
  291. package/dist/_members/primitives/chunk-W4EIIF2I.js.map +0 -1
  292. package/dist/_members/primitives/chunk-WPGKIPCO.js +0 -3563
  293. package/dist/_members/primitives/chunk-WPGKIPCO.js.map +0 -1
  294. package/dist/_members/primitives/chunk-WZFLEGMD.js +0 -1435
  295. package/dist/_members/primitives/chunk-WZFLEGMD.js.map +0 -1
  296. package/dist/_members/primitives/chunk-XHU3WBEI.js +0 -33
  297. package/dist/_members/primitives/chunk-XHU3WBEI.js.map +0 -1
  298. package/dist/_members/primitives/chunk-YN7WTZZ7.js +0 -46
  299. package/dist/_members/primitives/chunk-YN7WTZZ7.js.map +0 -1
  300. package/dist/_members/primitives/effects/index.js +0 -30
  301. package/dist/_members/primitives/effects/index.js.map +0 -1
  302. package/dist/_members/primitives/hero-text/index.js +0 -14
  303. package/dist/_members/primitives/hero-text/index.js.map +0 -1
  304. package/dist/_members/primitives/index.js +0 -64
  305. package/dist/_members/primitives/index.js.map +0 -1
  306. package/dist/_members/primitives/layouts/index.js +0 -24
  307. package/dist/_members/primitives/layouts/index.js.map +0 -1
  308. package/dist/_members/primitives/lib/easings.js +0 -26
  309. package/dist/_members/primitives/lib/easings.js.map +0 -1
  310. package/dist/_members/primitives/lib/index.js +0 -74
  311. package/dist/_members/primitives/lib/index.js.map +0 -1
  312. package/dist/_members/primitives/lib/palette.js +0 -72
  313. package/dist/_members/primitives/lib/palette.js.map +0 -1
  314. package/dist/_members/primitives/lib/preview.js +0 -8
  315. package/dist/_members/primitives/lib/preview.js.map +0 -1
  316. package/dist/_members/primitives/lib/schema.js +0 -12
  317. package/dist/_members/primitives/lib/schema.js.map +0 -1
  318. package/dist/_members/primitives/lib/seeded-random.js +0 -14
  319. package/dist/_members/primitives/lib/seeded-random.js.map +0 -1
  320. package/dist/_members/primitives/lib/text/contrast.js +0 -12
  321. package/dist/_members/primitives/lib/text/contrast.js.map +0 -1
  322. package/dist/_members/primitives/lib/text/fill.js +0 -8
  323. package/dist/_members/primitives/lib/text/fill.js.map +0 -1
  324. package/dist/_members/primitives/lib/text/fitText.js +0 -10
  325. package/dist/_members/primitives/lib/text/fitText.js.map +0 -1
  326. package/dist/_members/primitives/lib/text/marker.js +0 -8
  327. package/dist/_members/primitives/lib/text/marker.js.map +0 -1
  328. package/dist/_members/primitives/lib/text/motion.js +0 -16
  329. package/dist/_members/primitives/lib/text/motion.js.map +0 -1
  330. package/dist/_members/primitives/lib/text/recolor.js +0 -8
  331. package/dist/_members/primitives/lib/text/recolor.js.map +0 -1
  332. package/dist/_members/primitives/lib/text/spec.js +0 -1
  333. package/dist/_members/primitives/lib/text/spec.js.map +0 -1
  334. package/dist/_members/primitives/lib/text/stage.js +0 -8
  335. package/dist/_members/primitives/lib/text/stage.js.map +0 -1
  336. package/dist/_members/primitives/lib/text/typeface.js +0 -8
  337. package/dist/_members/primitives/lib/text/typeface.js.map +0 -1
  338. package/dist/_members/primitives/lib/tokens.js +0 -24
  339. package/dist/_members/primitives/lib/tokens.js.map +0 -1
  340. package/dist/_members/primitives/lib/types.js +0 -1
  341. package/dist/_members/primitives/lib/types.js.map +0 -1
  342. package/dist/_members/primitives/params-required.json +0 -153
  343. package/dist/_members/primitives/scenes/index.js +0 -25
  344. package/dist/_members/primitives/scenes/index.js.map +0 -1
  345. package/dist/_members/primitives/subject-foreground/index.js +0 -30
  346. package/dist/_members/primitives/subject-foreground/index.js.map +0 -1
  347. package/dist/_members/primitives/text/index.js +0 -57
  348. package/dist/_members/primitives/text/index.js.map +0 -1
  349. package/dist/_members/primitives/transitions/index.js +0 -67
  350. package/dist/_members/primitives/transitions/index.js.map +0 -1
  351. package/dist/_members/primitives/ui-blocks/index.js +0 -76
  352. package/dist/_members/primitives/ui-blocks/index.js.map +0 -1
  353. package/dist/_members/primitives/version-map.json +0 -105
  354. package/dist/_members/primitives/workspace.js +0 -60
  355. package/dist/_members/primitives/workspace.js.map +0 -1
@@ -1,2337 +0,0 @@
1
- import {
2
- ACCENT,
3
- ACCENT_SOFT,
4
- ACCENT_STRONG,
5
- BG,
6
- BG_DEEP,
7
- BLUE,
8
- BORDER,
9
- DANGER,
10
- SUCCESS,
11
- SUCCESS_SOFT,
12
- SURFACE,
13
- TEAL,
14
- TEXT_FAINT,
15
- TEXT_HI,
16
- VIOLET,
17
- WARNING
18
- } from "./chunk-3OMURV6Q.js";
19
- import {
20
- resolveFitFontSize
21
- } from "./chunk-ROV2ODWC.js";
22
-
23
- // src/backgrounds/animated-bar-chart/index.tsx
24
- import { spring, useCurrentFrame, useVideoConfig } from "remotion";
25
- import { jsx, jsxs } from "react/jsx-runtime";
26
- function AnimatedBarChart({
27
- data = [35, 60, 45, 80, 55, 70, 90, 65],
28
- labels,
29
- width = 1e3,
30
- height = 500,
31
- barColor = ACCENT,
32
- accentColor = TEAL,
33
- background = BG,
34
- valueLabels = true,
35
- gap = 16,
36
- staggerFrames = 5,
37
- speed = 1,
38
- className
39
- }) {
40
- const frame = useCurrentFrame() * speed;
41
- const { fps } = useVideoConfig();
42
- const t = frame / fps;
43
- const padding = 60;
44
- const labelSpace = labels ? 40 : 0;
45
- const valueSpace = valueLabels ? 34 : 0;
46
- const innerWidth = width - padding * 2;
47
- const innerHeight = height - padding * 2 - labelSpace - valueSpace;
48
- const max = Math.max(...data);
49
- const maxIndex = data.indexOf(max);
50
- const barWidth = (innerWidth - gap * (data.length - 1)) / data.length;
51
- const baseY = padding + valueSpace + innerHeight;
52
- const labelFontSize = 16;
53
- const labelPitch = barWidth + gap;
54
- const maxLabelChars = Math.max(1, Math.floor((labelPitch - 6) / (labelFontSize * 0.6)));
55
- const fitLabel = (text) => text.length <= maxLabelChars ? text : text.slice(0, Math.max(0, maxLabelChars - 1)) + "\u2026";
56
- const GRID_LINES = 4;
57
- return /* @__PURE__ */ jsx(
58
- "div",
59
- {
60
- className,
61
- style: {
62
- position: "absolute",
63
- inset: 0,
64
- display: "flex",
65
- alignItems: "center",
66
- justifyContent: "center",
67
- background,
68
- fontFamily: "inherit"
69
- },
70
- children: /* @__PURE__ */ jsxs("svg", { width, height, viewBox: `0 0 ${width} ${height}`, children: [
71
- /* @__PURE__ */ jsxs("defs", { children: [
72
- /* @__PURE__ */ jsxs("linearGradient", { id: "abc-bar", x1: "0", y1: "0", x2: "0", y2: "1", children: [
73
- /* @__PURE__ */ jsx("stop", { offset: "0%", stopColor: barColor, stopOpacity: 1 }),
74
- /* @__PURE__ */ jsx("stop", { offset: "100%", stopColor: barColor, stopOpacity: 0.55 })
75
- ] }),
76
- /* @__PURE__ */ jsxs("linearGradient", { id: "abc-peak", x1: "0", y1: "0", x2: "0", y2: "1", children: [
77
- /* @__PURE__ */ jsx("stop", { offset: "0%", stopColor: accentColor, stopOpacity: 1 }),
78
- /* @__PURE__ */ jsx("stop", { offset: "100%", stopColor: accentColor, stopOpacity: 0.55 })
79
- ] })
80
- ] }),
81
- Array.from({ length: GRID_LINES }, (_, g) => {
82
- const y = baseY - (g + 1) / GRID_LINES * innerHeight;
83
- return /* @__PURE__ */ jsx(
84
- "line",
85
- {
86
- x1: padding,
87
- x2: padding + innerWidth,
88
- y1: y,
89
- y2: y,
90
- stroke: "rgba(255,255,255,0.07)",
91
- strokeWidth: 1
92
- },
93
- `grid-${g}`
94
- );
95
- }),
96
- /* @__PURE__ */ jsx(
97
- "line",
98
- {
99
- x1: padding,
100
- x2: padding + innerWidth,
101
- y1: baseY,
102
- y2: baseY,
103
- stroke: "rgba(255,255,255,0.22)",
104
- strokeWidth: 2
105
- }
106
- ),
107
- data.map((value, index) => {
108
- const targetHeight = value / max * innerHeight;
109
- const x = padding + index * (barWidth + gap);
110
- const isPeak = index === maxIndex && accentColor !== barColor;
111
- const enter = spring({
112
- frame: frame - index * staggerFrames,
113
- fps,
114
- config: { damping: 13, stiffness: 110, mass: 0.8 },
115
- from: 0,
116
- to: 1
117
- });
118
- const breathe = enter > 0.98 ? 1 + Math.sin(2 * Math.PI * (0.05 + index * 0.013) * t + index * 1.7) * 0.015 : 1;
119
- const scaleY = enter * breathe;
120
- const y = baseY - targetHeight;
121
- const shown = Math.round(value * Math.min(1, enter));
122
- return /* @__PURE__ */ jsxs("g", { children: [
123
- /* @__PURE__ */ jsx(
124
- "rect",
125
- {
126
- x,
127
- y,
128
- width: barWidth,
129
- height: targetHeight,
130
- rx: Math.min(8, barWidth / 4),
131
- fill: isPeak ? "url(#abc-peak)" : "url(#abc-bar)",
132
- style: {
133
- transform: `scaleY(${scaleY})`,
134
- transformOrigin: `${x + barWidth / 2}px ${baseY}px`,
135
- transformBox: "view-box"
136
- }
137
- }
138
- ),
139
- valueLabels && /* @__PURE__ */ jsx(
140
- "text",
141
- {
142
- x: x + barWidth / 2,
143
- y: baseY - targetHeight * scaleY - 12,
144
- fill: isPeak ? accentColor : "rgba(255,255,255,0.85)",
145
- fontSize: 18,
146
- fontWeight: 700,
147
- textAnchor: "middle",
148
- style: { opacity: Math.min(1, enter * 1.2), fontFamily: "inherit" },
149
- children: shown
150
- }
151
- ),
152
- labels && labels[index] && /* @__PURE__ */ jsx(
153
- "text",
154
- {
155
- x: x + barWidth / 2,
156
- y: baseY + 28,
157
- fill: "rgba(255,255,255,0.55)",
158
- fontSize: labelFontSize,
159
- textAnchor: "middle",
160
- style: { opacity: enter, fontFamily: "inherit" },
161
- children: fitLabel(labels[index])
162
- }
163
- )
164
- ] }, index);
165
- })
166
- ] })
167
- }
168
- );
169
- }
170
-
171
- // src/backgrounds/animated-line-chart/index.tsx
172
- import { spring as spring2, useCurrentFrame as useCurrentFrame2, useVideoConfig as useVideoConfig2 } from "remotion";
173
- import { Fragment, jsx as jsx2, jsxs as jsxs2 } from "react/jsx-runtime";
174
- function AnimatedLineChart({
175
- data = [12, 19, 8, 15, 22, 18, 28, 25, 32],
176
- width = 1e3,
177
- height = 500,
178
- strokeColor = ACCENT,
179
- accentColor = TEAL,
180
- strokeWidth = 4,
181
- background = BG,
182
- gridColor = "rgba(255,255,255,0.07)",
183
- endpointValue = true,
184
- showDot = true,
185
- speed = 1,
186
- className
187
- }) {
188
- const frame = useCurrentFrame2() * speed;
189
- const { fps, durationInFrames } = useVideoConfig2();
190
- const t = frame / fps;
191
- const padding = 60;
192
- const innerWidth = width - padding * 2;
193
- const innerHeight = height - padding * 2;
194
- const min = Math.min(...data);
195
- const max = Math.max(...data);
196
- const range = max - min || 1;
197
- const points = data.map((value, index) => {
198
- const x = padding + index / (data.length - 1) * innerWidth;
199
- const y = padding + innerHeight - (value - min) / range * innerHeight;
200
- return { x, y };
201
- });
202
- let pathLength = 0;
203
- for (let i = 1; i < points.length; i++) {
204
- const dx = points[i].x - points[i - 1].x;
205
- const dy = points[i].y - points[i - 1].y;
206
- pathLength += Math.sqrt(dx * dx + dy * dy);
207
- }
208
- const d = points.map((p, i) => `${i === 0 ? "M" : "L"}${p.x.toFixed(2)},${p.y.toFixed(2)}`).join(" ");
209
- const areaD = `${d} L${(padding + innerWidth).toFixed(2)},${(padding + innerHeight).toFixed(2)} L${padding},${(padding + innerHeight).toFixed(2)} Z`;
210
- const progress = spring2({
211
- frame,
212
- fps,
213
- durationInFrames: Math.max(20, Math.round(durationInFrames * 0.5)),
214
- config: { damping: 200 }
215
- });
216
- const dashOffset = pathLength * (1 - progress);
217
- const targetLen = pathLength * progress;
218
- let traveled = 0;
219
- let dotX = points[0].x;
220
- let dotY = points[0].y;
221
- for (let i = 1; i < points.length; i++) {
222
- const dx = points[i].x - points[i - 1].x;
223
- const dy = points[i].y - points[i - 1].y;
224
- const segLen = Math.sqrt(dx * dx + dy * dy);
225
- if (traveled + segLen >= targetLen) {
226
- const s = (targetLen - traveled) / segLen;
227
- dotX = points[i - 1].x + dx * s;
228
- dotY = points[i - 1].y + dy * s;
229
- break;
230
- }
231
- traveled += segLen;
232
- dotX = points[i].x;
233
- dotY = points[i].y;
234
- }
235
- const settled = progress >= 0.999;
236
- const pulse = settled ? 1 + Math.sin(2 * Math.PI * 0.55 * t) * 0.25 : 1;
237
- const haloR = settled ? strokeWidth * (2.4 + Math.sin(2 * Math.PI * 0.55 * t) * 0.9) : 0;
238
- const shownValue = Math.round(
239
- min + (data[data.length - 1] - min) * Math.min(1, progress)
240
- );
241
- const gridRows = 4;
242
- return /* @__PURE__ */ jsx2(
243
- "div",
244
- {
245
- className,
246
- style: {
247
- position: "absolute",
248
- inset: 0,
249
- display: "flex",
250
- alignItems: "center",
251
- justifyContent: "center",
252
- background,
253
- fontFamily: "inherit"
254
- },
255
- children: /* @__PURE__ */ jsxs2(
256
- "svg",
257
- {
258
- width,
259
- height,
260
- viewBox: `0 0 ${width} ${height}`,
261
- style: { overflow: "visible" },
262
- children: [
263
- /* @__PURE__ */ jsxs2("defs", { children: [
264
- /* @__PURE__ */ jsxs2("linearGradient", { id: "alc-area", x1: "0", y1: "0", x2: "0", y2: "1", children: [
265
- /* @__PURE__ */ jsx2("stop", { offset: "0%", stopColor: strokeColor, stopOpacity: 0.28 }),
266
- /* @__PURE__ */ jsx2("stop", { offset: "100%", stopColor: strokeColor, stopOpacity: 0 })
267
- ] }),
268
- /* @__PURE__ */ jsx2("clipPath", { id: "alc-reveal", children: /* @__PURE__ */ jsx2(
269
- "rect",
270
- {
271
- x: padding,
272
- y: 0,
273
- width: innerWidth * progress,
274
- height
275
- }
276
- ) })
277
- ] }),
278
- Array.from({ length: gridRows + 1 }).map((_, i) => {
279
- const y = padding + i / gridRows * innerHeight;
280
- return /* @__PURE__ */ jsx2(
281
- "line",
282
- {
283
- x1: padding,
284
- x2: padding + innerWidth,
285
- y1: y,
286
- y2: y,
287
- stroke: gridColor,
288
- strokeWidth: 1
289
- },
290
- `h-${i}`
291
- );
292
- }),
293
- /* @__PURE__ */ jsx2(
294
- "line",
295
- {
296
- x1: padding,
297
- x2: padding + innerWidth,
298
- y1: padding + innerHeight,
299
- y2: padding + innerHeight,
300
- stroke: "rgba(255,255,255,0.22)",
301
- strokeWidth: 2
302
- }
303
- ),
304
- /* @__PURE__ */ jsx2("path", { d: areaD, fill: "url(#alc-area)", clipPath: "url(#alc-reveal)" }),
305
- /* @__PURE__ */ jsx2(
306
- "path",
307
- {
308
- d,
309
- fill: "none",
310
- stroke: strokeColor,
311
- strokeWidth,
312
- strokeLinecap: "round",
313
- strokeLinejoin: "round",
314
- strokeDasharray: pathLength,
315
- strokeDashoffset: dashOffset
316
- }
317
- ),
318
- showDot && progress > 0 && /* @__PURE__ */ jsxs2(Fragment, { children: [
319
- settled && /* @__PURE__ */ jsx2(
320
- "circle",
321
- {
322
- cx: dotX,
323
- cy: dotY,
324
- r: haloR,
325
- fill: "none",
326
- stroke: accentColor,
327
- strokeWidth: 1.5,
328
- opacity: 0.5
329
- }
330
- ),
331
- /* @__PURE__ */ jsx2(
332
- "circle",
333
- {
334
- cx: dotX,
335
- cy: dotY,
336
- r: strokeWidth * 1.6 * pulse,
337
- fill: accentColor
338
- }
339
- )
340
- ] }),
341
- endpointValue && progress > 0.15 && /* @__PURE__ */ jsx2(
342
- "text",
343
- {
344
- x: Math.min(dotX + 16, padding + innerWidth),
345
- y: dotY - 16,
346
- fill: accentColor,
347
- fontSize: 22,
348
- fontWeight: 800,
349
- textAnchor: "start",
350
- style: { fontFamily: "inherit" },
351
- children: shownValue
352
- }
353
- )
354
- ]
355
- }
356
- )
357
- }
358
- );
359
- }
360
-
361
- // src/backgrounds/dither-gradient-bg/index.tsx
362
- import { useEffect, useRef } from "react";
363
- import { useCurrentFrame as useCurrentFrame3, useVideoConfig as useVideoConfig3 } from "remotion";
364
- import { jsx as jsx3 } from "react/jsx-runtime";
365
- var BAYER8 = [
366
- 0,
367
- 32,
368
- 8,
369
- 40,
370
- 2,
371
- 34,
372
- 10,
373
- 42,
374
- 48,
375
- 16,
376
- 56,
377
- 24,
378
- 50,
379
- 18,
380
- 58,
381
- 26,
382
- 12,
383
- 44,
384
- 4,
385
- 36,
386
- 14,
387
- 46,
388
- 6,
389
- 38,
390
- 60,
391
- 28,
392
- 52,
393
- 20,
394
- 62,
395
- 30,
396
- 54,
397
- 22,
398
- 3,
399
- 35,
400
- 11,
401
- 43,
402
- 1,
403
- 33,
404
- 9,
405
- 41,
406
- 51,
407
- 19,
408
- 59,
409
- 27,
410
- 49,
411
- 17,
412
- 57,
413
- 25,
414
- 15,
415
- 47,
416
- 7,
417
- 39,
418
- 13,
419
- 45,
420
- 5,
421
- 37,
422
- 63,
423
- 31,
424
- 55,
425
- 23,
426
- 61,
427
- 29,
428
- 53,
429
- 21
430
- ].map((v) => (v + 0.5) / 64);
431
- function hash2(ix, iy, seed) {
432
- let h = Math.imul(ix, 374761393) + Math.imul(iy, 668265263) + Math.imul(seed, 1013904223);
433
- h = Math.imul(h ^ h >>> 13, 1274126177);
434
- h ^= h >>> 16;
435
- return (h >>> 0) / 4294967295;
436
- }
437
- function smoother(f) {
438
- return f * f * f * (f * (f * 6 - 15) + 10);
439
- }
440
- function noise2(x, y, seed) {
441
- const ix = Math.floor(x);
442
- const iy = Math.floor(y);
443
- const u = smoother(x - ix);
444
- const v = smoother(y - iy);
445
- const a = hash2(ix, iy, seed);
446
- const b = hash2(ix + 1, iy, seed);
447
- const c = hash2(ix, iy + 1, seed);
448
- const d = hash2(ix + 1, iy + 1, seed);
449
- return a + (b - a) * u + (c - a) * v + (a - b - c + d) * u * v;
450
- }
451
- function hexToRgb(hex) {
452
- const m = hex.replace("#", "");
453
- return [
454
- parseInt(m.slice(0, 2), 16),
455
- parseInt(m.slice(2, 4), 16),
456
- parseInt(m.slice(4, 6), 16)
457
- ];
458
- }
459
- function DitherGradientBg({
460
- color = BLUE,
461
- color2 = TEAL,
462
- background = BG,
463
- pixelSize = 8,
464
- angle = -30,
465
- speed = 1,
466
- seed = 7,
467
- className
468
- }) {
469
- const frame = useCurrentFrame3();
470
- const { fps, width, height } = useVideoConfig3();
471
- const canvasRef = useRef(null);
472
- const t = frame / fps * speed;
473
- useEffect(() => {
474
- const canvas = canvasRef.current;
475
- if (!canvas) return;
476
- const ctx = canvas.getContext("2d");
477
- if (!ctx) return;
478
- const px = Math.max(2, Math.round(pixelSize * (height / 1080)));
479
- const cols = Math.ceil(width / px);
480
- const rows = Math.ceil(height / px);
481
- canvas.width = cols;
482
- canvas.height = rows;
483
- const img = ctx.createImageData(cols, rows);
484
- const [r1, g1, b1] = hexToRgb(color);
485
- const [r2, g2, b2] = hexToRgb(color2);
486
- const [rb, gb, bb] = hexToRgb(background);
487
- const rad = angle * Math.PI / 180;
488
- const dx = Math.cos(rad);
489
- const dy = Math.sin(rad);
490
- const drift = t * 0.045;
491
- const warpT = 2 * Math.PI * 0.03 * t;
492
- for (let y = 0; y < rows; y++) {
493
- for (let x = 0; x < cols; x++) {
494
- const nx = x / cols;
495
- const ny = y / rows;
496
- const ramp = nx * dx + ny * dy + drift;
497
- const warp = (noise2(nx * 2.3 + Math.sin(warpT) * 0.4, ny * 2.3 + Math.cos(warpT) * 0.4, seed) - 0.5) * 0.55;
498
- const v = ((ramp + warp) % 1 + 1) % 1;
499
- const lum = v < 0.5 ? v * 2 : (1 - v) * 2;
500
- const threshold = BAYER8[y % 8 * 8 + x % 8];
501
- const on = lum > threshold;
502
- const i = (y * cols + x) * 4;
503
- if (on) {
504
- const mix = smoother(lum);
505
- img.data[i] = Math.round(r1 + (r2 - r1) * mix);
506
- img.data[i + 1] = Math.round(g1 + (g2 - g1) * mix);
507
- img.data[i + 2] = Math.round(b1 + (b2 - b1) * mix);
508
- } else {
509
- img.data[i] = rb;
510
- img.data[i + 1] = gb;
511
- img.data[i + 2] = bb;
512
- }
513
- img.data[i + 3] = 255;
514
- }
515
- }
516
- ctx.putImageData(img, 0, 0);
517
- }, [frame, fps, width, height, color, color2, background, pixelSize, angle, speed, seed, t]);
518
- return /* @__PURE__ */ jsx3(
519
- "div",
520
- {
521
- className,
522
- style: { position: "absolute", inset: 0, background, overflow: "hidden" },
523
- children: /* @__PURE__ */ jsx3(
524
- "canvas",
525
- {
526
- ref: canvasRef,
527
- style: {
528
- position: "absolute",
529
- inset: 0,
530
- width: "100%",
531
- height: "100%",
532
- imageRendering: "pixelated"
533
- }
534
- }
535
- )
536
- }
537
- );
538
- }
539
-
540
- // src/backgrounds/dynamic-grid/index.tsx
541
- import { useCurrentFrame as useCurrentFrame4 } from "remotion";
542
- import { jsx as jsx4 } from "react/jsx-runtime";
543
- function DynamicGrid({
544
- cellSize = 40,
545
- lineColor = BORDER,
546
- background = BG,
547
- speed = 0.5,
548
- direction = "diagonal",
549
- className
550
- }) {
551
- const frame = useCurrentFrame4();
552
- const offset = frame * speed % cellSize;
553
- let tx = 0;
554
- let ty = 0;
555
- if (direction === "horizontal") {
556
- tx = offset;
557
- } else if (direction === "vertical") {
558
- ty = offset;
559
- } else {
560
- tx = offset;
561
- ty = offset;
562
- }
563
- return /* @__PURE__ */ jsx4(
564
- "div",
565
- {
566
- className,
567
- style: {
568
- position: "absolute",
569
- inset: 0,
570
- background,
571
- overflow: "hidden"
572
- },
573
- children: /* @__PURE__ */ jsx4(
574
- "div",
575
- {
576
- style: {
577
- position: "absolute",
578
- inset: `-${cellSize}px`,
579
- backgroundImage: `
580
- linear-gradient(to right, ${lineColor} 1px, transparent 1px),
581
- linear-gradient(to bottom, ${lineColor} 1px, transparent 1px)
582
- `,
583
- backgroundSize: `${cellSize}px ${cellSize}px`,
584
- transform: `translate(${tx}px, ${ty}px)`,
585
- willChange: "transform"
586
- }
587
- }
588
- )
589
- }
590
- );
591
- }
592
-
593
- // src/backgrounds/ecosystem-constellation/index.tsx
594
- import { interpolate, spring as spring3, useCurrentFrame as useCurrentFrame5, useVideoConfig as useVideoConfig4 } from "remotion";
595
- import { jsx as jsx5, jsxs as jsxs3 } from "react/jsx-runtime";
596
- var FONT_FAMILY = "inherit";
597
- function GitHubMark() {
598
- return /* @__PURE__ */ jsx5("svg", { viewBox: "0 0 24 24", width: 30, height: 30, "aria-hidden": "true", children: /* @__PURE__ */ jsx5(
599
- "path",
600
- {
601
- fill: "#fff",
602
- d: "M12 .5C5.65.5.5 5.65.5 12c0 5.08 3.29 9.39 7.86 10.91.58.11.79-.25.79-.55v-2.06c-3.2.7-3.87-1.36-3.87-1.36-.52-1.33-1.27-1.69-1.27-1.69-1.04-.71.08-.7.08-.7 1.15.08 1.76 1.18 1.76 1.18 1.02 1.75 2.69 1.24 3.35.95.1-.74.4-1.24.72-1.53-2.55-.29-5.24-1.28-5.24-5.7 0-1.26.45-2.29 1.18-3.1-.12-.29-.51-1.46.11-3.05 0 0 .97-.31 3.18 1.18.92-.26 1.91-.39 2.89-.39s1.97.13 2.89.39c2.21-1.49 3.18-1.18 3.18-1.18.62 1.59.23 2.76.11 3.05.74.81 1.18 1.84 1.18 3.1 0 4.43-2.7 5.41-5.27 5.69.41.36.77 1.06.77 2.13v3.16c0 .31.21.67.8.55C20.21 21.39 23.5 17.08 23.5 12 23.5 5.65 18.35.5 12 .5z"
603
- }
604
- ) });
605
- }
606
- function VercelMark() {
607
- return /* @__PURE__ */ jsx5("svg", { viewBox: "0 0 24 24", width: 28, height: 28, "aria-hidden": "true", children: /* @__PURE__ */ jsx5("path", { fill: "#fff", d: "M12 2 L23 21 L1 21 Z" }) });
608
- }
609
- function StripeMark() {
610
- return /* @__PURE__ */ jsx5("svg", { viewBox: "0 0 24 24", width: 28, height: 28, "aria-hidden": "true", children: /* @__PURE__ */ jsx5(
611
- "path",
612
- {
613
- fill: "#fff",
614
- d: "M13.5 9.6c0-.6.5-.85 1.3-.85 1.15 0 2.6.35 3.75.97V6.16c-1.25-.5-2.5-.7-3.75-.7C11.7 5.46 9.6 7.06 9.6 9.7c0 4.13 5.7 3.47 5.7 5.25 0 .7-.6.93-1.45.93-1.25 0-2.85-.52-4.1-1.2v3.65c1.4.6 2.8.85 4.1.85 3.2 0 5.4-1.55 5.4-4.25-.02-4.45-5.75-3.65-5.75-5.33z"
615
- }
616
- ) });
617
- }
618
- function SlackMark() {
619
- return /* @__PURE__ */ jsxs3("svg", { viewBox: "0 0 24 24", width: 26, height: 26, "aria-hidden": "true", children: [
620
- /* @__PURE__ */ jsx5("rect", { x: "2", y: "10", width: "9", height: "2.5", rx: "1.25", fill: "#36C5F0" }),
621
- /* @__PURE__ */ jsx5("rect", { x: "13", y: "10", width: "9", height: "2.5", rx: "1.25", fill: "#2EB67D" }),
622
- /* @__PURE__ */ jsx5("rect", { x: "10", y: "2", width: "2.5", height: "9", rx: "1.25", fill: "#ECB22E" }),
623
- /* @__PURE__ */ jsx5("rect", { x: "10", y: "13", width: "2.5", height: "9", rx: "1.25", fill: "#E01E5A" })
624
- ] });
625
- }
626
- function LinearMark() {
627
- return /* @__PURE__ */ jsxs3("svg", { viewBox: "0 0 24 24", width: 28, height: 28, "aria-hidden": "true", children: [
628
- /* @__PURE__ */ jsx5("defs", { children: /* @__PURE__ */ jsxs3("linearGradient", { id: "linear-grad", x1: "0", x2: "1", y1: "0", y2: "1", children: [
629
- /* @__PURE__ */ jsx5("stop", { offset: "0%", stopColor: "#fff", stopOpacity: "0.95" }),
630
- /* @__PURE__ */ jsx5("stop", { offset: "100%", stopColor: "#fff", stopOpacity: "0.55" })
631
- ] }) }),
632
- /* @__PURE__ */ jsx5("circle", { cx: "12", cy: "12", r: "10", fill: "url(#linear-grad)" }),
633
- /* @__PURE__ */ jsx5(
634
- "path",
635
- {
636
- d: "M5 13 L11 19 M5 9 L15 19 M5 5 L19 19 M9 5 L19 15 M13 5 L19 11",
637
- stroke: "#0a0a0a",
638
- strokeWidth: "0.9",
639
- strokeLinecap: "round",
640
- opacity: "0.85"
641
- }
642
- )
643
- ] });
644
- }
645
- function FigmaMark() {
646
- return /* @__PURE__ */ jsxs3("svg", { viewBox: "0 0 24 24", width: 26, height: 26, "aria-hidden": "true", children: [
647
- /* @__PURE__ */ jsx5("circle", { cx: "9", cy: "4", r: "3.5", fill: "#F24E1E" }),
648
- /* @__PURE__ */ jsx5("circle", { cx: "15", cy: "4", r: "3.5", fill: "#FF7262" }),
649
- /* @__PURE__ */ jsx5("circle", { cx: "9", cy: "11", r: "3.5", fill: "#A259FF" }),
650
- /* @__PURE__ */ jsx5("circle", { cx: "15", cy: "11", r: "3.5", fill: "#1ABCFE" }),
651
- /* @__PURE__ */ jsx5("circle", { cx: "9", cy: "18", r: "3.5", fill: "#0ACF83" })
652
- ] });
653
- }
654
- function NotionMark() {
655
- return /* @__PURE__ */ jsxs3("svg", { viewBox: "0 0 24 24", width: 26, height: 26, "aria-hidden": "true", children: [
656
- /* @__PURE__ */ jsx5("rect", { x: "3", y: "3", width: "18", height: "18", rx: "3", fill: "#fff" }),
657
- /* @__PURE__ */ jsx5(
658
- "path",
659
- {
660
- d: "M8 7 V17 M8 7 L16 17 M16 7 V17",
661
- stroke: "#0a0a0a",
662
- strokeWidth: "2",
663
- strokeLinecap: "round",
664
- strokeLinejoin: "round",
665
- fill: "none"
666
- }
667
- )
668
- ] });
669
- }
670
- function DiscordMark() {
671
- return /* @__PURE__ */ jsx5("svg", { viewBox: "0 0 24 24", width: 28, height: 28, "aria-hidden": "true", children: /* @__PURE__ */ jsx5(
672
- "path",
673
- {
674
- fill: "#fff",
675
- d: "M19.5 4.7A18 18 0 0 0 15 3.3l-.2.4a16.5 16.5 0 0 0-5.6 0L9 3.3a18 18 0 0 0-4.5 1.4C2 8.7 1.4 12.5 1.7 16.3a18 18 0 0 0 5.5 2.8l.4-.6a13 13 0 0 1-2-1l.5-.4a13 13 0 0 0 11.7 0l.5.4a13 13 0 0 1-2 1l.4.6a18 18 0 0 0 5.5-2.8c.4-4.4-.6-8.2-2.7-11.6zM8.5 14c-.9 0-1.7-.9-1.7-2s.8-2 1.7-2 1.7.9 1.7 2-.8 2-1.7 2zm7 0c-.9 0-1.7-.9-1.7-2s.8-2 1.7-2 1.7.9 1.7 2-.8 2-1.7 2z"
676
- }
677
- ) });
678
- }
679
- var SATELLITE_BRANDS = [
680
- { Logo: GitHubMark, bg: "#1f1f23" },
681
- { Logo: VercelMark, bg: "#0a0a0a" },
682
- { Logo: StripeMark, bg: "#635bff" },
683
- { Logo: SlackMark, bg: "#1a1d21" },
684
- { Logo: LinearMark, bg: "#5e6ad2" },
685
- { Logo: FigmaMark, bg: "#1e1e1e" },
686
- { Logo: NotionMark, bg: "#1a1a1a" },
687
- { Logo: DiscordMark, bg: "#5865f2" }
688
- ];
689
- function EcosystemConstellation({
690
- satelliteCount = 6,
691
- centerLabel = "V",
692
- accentColor = VIOLET,
693
- speed = 1,
694
- className
695
- }) {
696
- const frame = useCurrentFrame5() * speed;
697
- const { fps } = useVideoConfig4();
698
- const count = Math.max(
699
- 3,
700
- Math.min(SATELLITE_BRANDS.length, Math.floor(satelliteCount))
701
- );
702
- const pulse = (Math.sin(frame / 12) + 1) / 2;
703
- const centerScale = 1 + pulse * 0.06;
704
- const cx = 640;
705
- const cy = 360;
706
- const baseRadiusX = 230;
707
- const baseRadiusY = 180;
708
- const offscreenRadius = 1200;
709
- const satellites = Array.from({ length: count }).map((_, i) => {
710
- const stagger = i * 4;
711
- const sp = spring3({
712
- frame: frame - stagger,
713
- fps,
714
- config: { mass: 1.1, damping: 16, stiffness: 70 },
715
- durationInFrames: 50
716
- });
717
- const radiusFactor = interpolate(sp, [0, 1], [offscreenRadius, 1]);
718
- const orbitOffset = i * 22;
719
- const rX = baseRadiusX + orbitOffset;
720
- const rY = baseRadiusY + orbitOffset * 0.7;
721
- const angularSpeed = 0.012 - i * 8e-4;
722
- const baseAngle = i / count * Math.PI * 2;
723
- const angle = baseAngle + frame * angularSpeed;
724
- const x = cx + Math.cos(angle) * rX * radiusFactor;
725
- const y = cy + Math.sin(angle) * rY * radiusFactor;
726
- const activeIdx = Math.floor(frame / 30) % count;
727
- const isActive = activeIdx === i;
728
- const localFrame = frame - Math.floor(frame / 30) * 30;
729
- const lineOpacity = isActive ? interpolate(localFrame, [0, 8, 22, 30], [0.15, 0.9, 0.9, 0.15], {
730
- extrapolateLeft: "clamp",
731
- extrapolateRight: "clamp"
732
- }) : 0.15;
733
- const satScale = isActive ? interpolate(localFrame, [0, 8, 22, 30], [1, 1.1, 1.1, 1], {
734
- extrapolateLeft: "clamp",
735
- extrapolateRight: "clamp"
736
- }) : 1;
737
- const brand = SATELLITE_BRANDS[i % SATELLITE_BRANDS.length];
738
- return {
739
- x,
740
- y,
741
- Logo: brand.Logo,
742
- color: brand.bg,
743
- lineOpacity,
744
- satScale,
745
- visible: sp > 0.02
746
- };
747
- });
748
- return /* @__PURE__ */ jsxs3(
749
- "div",
750
- {
751
- className,
752
- style: {
753
- position: "absolute",
754
- inset: 0,
755
- overflow: "hidden",
756
- background: `radial-gradient(ellipse at center, ${BG} 0%, ${BG_DEEP} 75%)`,
757
- fontFamily: FONT_FAMILY
758
- },
759
- children: [
760
- /* @__PURE__ */ jsxs3(
761
- "svg",
762
- {
763
- width: "100%",
764
- height: "100%",
765
- viewBox: "0 0 1280 720",
766
- style: { position: "absolute", inset: 0 },
767
- children: [
768
- satellites.map((s, i) => /* @__PURE__ */ jsx5(
769
- "line",
770
- {
771
- x1: cx,
772
- y1: cy,
773
- x2: s.x,
774
- y2: s.y,
775
- stroke: accentColor,
776
- strokeWidth: 2,
777
- strokeLinecap: "round",
778
- opacity: s.visible ? s.lineOpacity : 0
779
- },
780
- `line-${i}`
781
- )),
782
- /* @__PURE__ */ jsx5(
783
- "circle",
784
- {
785
- cx,
786
- cy,
787
- r: 70 + pulse * 8,
788
- fill: accentColor,
789
- opacity: 0.12
790
- }
791
- ),
792
- /* @__PURE__ */ jsx5(
793
- "circle",
794
- {
795
- cx,
796
- cy,
797
- r: 50 + pulse * 4,
798
- fill: accentColor,
799
- opacity: 0.2
800
- }
801
- )
802
- ]
803
- }
804
- ),
805
- /* @__PURE__ */ jsx5(
806
- "div",
807
- {
808
- style: {
809
- position: "absolute",
810
- left: cx,
811
- top: cy,
812
- width: 96,
813
- height: 96,
814
- marginLeft: -48,
815
- marginTop: -48,
816
- borderRadius: 24,
817
- background: `linear-gradient(180deg, ${accentColor} 0%, ${accentColor}cc 100%)`,
818
- display: "flex",
819
- alignItems: "center",
820
- justifyContent: "center",
821
- color: "white",
822
- fontWeight: 800,
823
- fontSize: 52,
824
- letterSpacing: "-0.05em",
825
- transform: `scale(${centerScale})`,
826
- border: "1px solid rgba(255,255,255,0.15)"
827
- },
828
- children: centerLabel
829
- }
830
- ),
831
- satellites.map((s, i) => {
832
- const Logo = s.Logo;
833
- return /* @__PURE__ */ jsx5(
834
- "div",
835
- {
836
- style: {
837
- position: "absolute",
838
- left: s.x,
839
- top: s.y,
840
- width: 56,
841
- height: 56,
842
- marginLeft: -28,
843
- marginTop: -28,
844
- borderRadius: 14,
845
- background: `linear-gradient(180deg, ${s.color} 0%, ${s.color}dd 100%)`,
846
- display: "flex",
847
- alignItems: "center",
848
- justifyContent: "center",
849
- transform: `scale(${s.satScale})`,
850
- border: "1px solid rgba(255,255,255,0.12)",
851
- opacity: s.visible ? 1 : 0,
852
- willChange: "transform"
853
- },
854
- children: /* @__PURE__ */ jsx5(Logo, {})
855
- },
856
- `sat-${i}`
857
- );
858
- })
859
- ]
860
- }
861
- );
862
- }
863
-
864
- // src/backgrounds/infinite-marquee/index.tsx
865
- import { useCurrentFrame as useCurrentFrame6 } from "remotion";
866
- import { jsx as jsx6, jsxs as jsxs4 } from "react/jsx-runtime";
867
- function InfiniteMarquee({
868
- text = "ship \xB7 build \xB7 animate \xB7 ",
869
- fontSize = 120,
870
- color = SURFACE,
871
- fontWeight = 900,
872
- pixelsPerFrame = 4,
873
- stroke = false,
874
- strokeColor = SURFACE,
875
- background = TEXT_HI,
876
- speed = 1,
877
- className
878
- }) {
879
- const frame = useCurrentFrame6() * speed;
880
- const approxWidth = text.length * fontSize * 0.55;
881
- const offset = -(frame * pixelsPerFrame % approxWidth);
882
- const spanStyle = {
883
- fontSize,
884
- fontWeight,
885
- fontFamily: "inherit",
886
- color: stroke ? "transparent" : color,
887
- WebkitTextStroke: stroke ? `2px ${strokeColor}` : void 0,
888
- paddingRight: "0.4em",
889
- letterSpacing: "-0.03em"
890
- };
891
- return /* @__PURE__ */ jsx6(
892
- "div",
893
- {
894
- style: {
895
- position: "absolute",
896
- inset: 0,
897
- display: "flex",
898
- alignItems: "center",
899
- justifyContent: "center",
900
- background
901
- },
902
- children: /* @__PURE__ */ jsxs4(
903
- "div",
904
- {
905
- className,
906
- style: {
907
- display: "flex",
908
- whiteSpace: "nowrap",
909
- transform: `translateX(${offset}px)`
910
- },
911
- children: [
912
- /* @__PURE__ */ jsx6("span", { style: spanStyle, children: text }),
913
- /* @__PURE__ */ jsx6("span", { style: spanStyle, children: text }),
914
- /* @__PURE__ */ jsx6("span", { style: spanStyle, children: text })
915
- ]
916
- }
917
- )
918
- }
919
- );
920
- }
921
-
922
- // src/backgrounds/mesh-gradient-bg/index.tsx
923
- import { useCurrentFrame as useCurrentFrame7, useVideoConfig as useVideoConfig5 } from "remotion";
924
- import { jsx as jsx7 } from "react/jsx-runtime";
925
- function MeshGradientBg({
926
- colors = [BLUE, VIOLET, TEAL],
927
- speed = 1,
928
- background = BG,
929
- blur = 100,
930
- className
931
- }) {
932
- const frame = useCurrentFrame7();
933
- const { fps } = useVideoConfig5();
934
- const isDark = isColorDark(background);
935
- const blendMode = isDark ? "screen" : "multiply";
936
- const t = frame / fps * speed;
937
- const blobs = colors.map((color, i) => {
938
- const phase = i * 1.7;
939
- const f1 = 0.045 + i * 0.013;
940
- const f2 = 0.06 + i * 0.011;
941
- const f3 = 0.05 + i * 0.017;
942
- const left = 50 + Math.sin(2 * Math.PI * f1 * t + phase) * 22;
943
- const top = 50 + Math.cos(2 * Math.PI * f2 * t + phase * 0.6) * 20;
944
- const scale = 1 + Math.sin(2 * Math.PI * f3 * t + phase * 1.3) * 0.12;
945
- return { color, left, top, scale, key: `blob-${i}` };
946
- });
947
- return /* @__PURE__ */ jsx7(
948
- "div",
949
- {
950
- className,
951
- style: {
952
- position: "absolute",
953
- inset: 0,
954
- background,
955
- overflow: "hidden"
956
- },
957
- children: blobs.map((b) => /* @__PURE__ */ jsx7(
958
- "div",
959
- {
960
- style: {
961
- position: "absolute",
962
- left: `${b.left}%`,
963
- top: `${b.top}%`,
964
- width: "55%",
965
- height: "55%",
966
- borderRadius: "50%",
967
- background: `radial-gradient(circle, ${b.color}f2 0%, ${b.color}99 38%, ${b.color}33 62%, ${b.color}00 80%)`,
968
- filter: `blur(${blur}px)`,
969
- mixBlendMode: blendMode,
970
- transform: `translate(-50%, -50%) scale(${b.scale})`,
971
- willChange: "transform"
972
- }
973
- },
974
- b.key
975
- ))
976
- }
977
- );
978
- }
979
- function isColorDark(hex) {
980
- const m = hex.replace("#", "");
981
- if (m.length !== 6 && m.length !== 3) return true;
982
- const full = m.length === 3 ? m.split("").map((c) => c + c).join("") : m;
983
- const r = parseInt(full.slice(0, 2), 16);
984
- const g = parseInt(full.slice(2, 4), 16);
985
- const b = parseInt(full.slice(4, 6), 16);
986
- const luminance = (0.299 * r + 0.587 * g + 0.114 * b) / 255;
987
- return luminance < 0.5;
988
- }
989
-
990
- // src/backgrounds/perspective-marquee/index.tsx
991
- import { useCurrentFrame as useCurrentFrame8 } from "remotion";
992
- import { jsx as jsx8, jsxs as jsxs5 } from "react/jsx-runtime";
993
- var FONT_FAMILY2 = "inherit";
994
- var DEFAULT_ITEMS = [
995
- "Vercel",
996
- "Linear",
997
- "Stripe",
998
- "Figma",
999
- "Notion",
1000
- "Raycast",
1001
- "Arc",
1002
- "Cursor"
1003
- ];
1004
- function PerspectiveMarquee({
1005
- items = DEFAULT_ITEMS,
1006
- fontSize = 84,
1007
- color = TEXT_HI,
1008
- fontWeight = 700,
1009
- pixelsPerFrame = 2,
1010
- rotateY = -28,
1011
- rotateX = 8,
1012
- perspective = 1200,
1013
- fadeColor = BG,
1014
- background = BG,
1015
- speed = 1,
1016
- className
1017
- }) {
1018
- const frame = useCurrentFrame8() * speed;
1019
- const itemPadding = fontSize * 0.9;
1020
- const approxItemWidth = items.reduce(
1021
- (acc, item) => acc + item.length * fontSize * 0.6 + itemPadding,
1022
- 0
1023
- );
1024
- const offset = -(frame * pixelsPerFrame % approxItemWidth);
1025
- const rendered = [...items, ...items, ...items];
1026
- return /* @__PURE__ */ jsxs5(
1027
- "div",
1028
- {
1029
- className,
1030
- style: {
1031
- position: "absolute",
1032
- inset: 0,
1033
- background,
1034
- display: "flex",
1035
- alignItems: "center",
1036
- justifyContent: "center",
1037
- overflow: "hidden",
1038
- perspective: `${perspective}px`
1039
- },
1040
- children: [
1041
- /* @__PURE__ */ jsx8(
1042
- "div",
1043
- {
1044
- style: {
1045
- width: "100%",
1046
- display: "flex",
1047
- alignItems: "center",
1048
- justifyContent: "flex-start",
1049
- transform: `rotateX(${rotateX}deg) rotateY(${rotateY}deg)`,
1050
- transformStyle: "preserve-3d"
1051
- },
1052
- children: /* @__PURE__ */ jsx8(
1053
- "div",
1054
- {
1055
- style: {
1056
- display: "flex",
1057
- whiteSpace: "nowrap",
1058
- transform: `translateX(${offset}px)`
1059
- },
1060
- children: rendered.map((item, i) => {
1061
- const itemCenter = i * (approxItemWidth / items.length) + approxItemWidth / items.length / 2 + offset;
1062
- const norm = (itemCenter - 640) / 640;
1063
- const distance = Math.min(1, Math.abs(norm));
1064
- const blurPx = distance * 6;
1065
- const opacity = 1 - distance * 0.4;
1066
- return /* @__PURE__ */ jsx8(
1067
- "span",
1068
- {
1069
- style: {
1070
- display: "inline-block",
1071
- fontFamily: FONT_FAMILY2,
1072
- fontSize,
1073
- fontWeight,
1074
- color,
1075
- letterSpacing: "-0.03em",
1076
- paddingRight: itemPadding,
1077
- filter: `blur(${blurPx}px)`,
1078
- opacity
1079
- },
1080
- children: item
1081
- },
1082
- i
1083
- );
1084
- })
1085
- }
1086
- )
1087
- }
1088
- ),
1089
- /* @__PURE__ */ jsx8(
1090
- "div",
1091
- {
1092
- style: {
1093
- position: "absolute",
1094
- inset: 0,
1095
- pointerEvents: "none",
1096
- background: `linear-gradient(90deg, ${fadeColor} 0%, transparent 18%, transparent 82%, ${fadeColor} 100%)`
1097
- }
1098
- }
1099
- ),
1100
- /* @__PURE__ */ jsx8(
1101
- "div",
1102
- {
1103
- style: {
1104
- position: "absolute",
1105
- inset: 0,
1106
- pointerEvents: "none",
1107
- background: `linear-gradient(180deg, ${fadeColor} 0%, transparent 25%, transparent 75%, ${fadeColor} 100%)`
1108
- }
1109
- }
1110
- )
1111
- ]
1112
- }
1113
- );
1114
- }
1115
-
1116
- // src/backgrounds/silk-flow-bg/index.tsx
1117
- import { useEffect as useEffect2, useRef as useRef2 } from "react";
1118
- import { useCurrentFrame as useCurrentFrame9, useVideoConfig as useVideoConfig6 } from "remotion";
1119
- import { jsx as jsx9, jsxs as jsxs6 } from "react/jsx-runtime";
1120
- function hash22(ix, iy, seed) {
1121
- let h = Math.imul(ix, 374761393) + Math.imul(iy, 668265263) + Math.imul(seed, 1013904223);
1122
- h = Math.imul(h ^ h >>> 13, 1274126177);
1123
- h ^= h >>> 16;
1124
- return (h >>> 0) / 4294967295;
1125
- }
1126
- function smoother2(f) {
1127
- return f * f * f * (f * (f * 6 - 15) + 10);
1128
- }
1129
- function noise22(x, y, seed) {
1130
- const ix = Math.floor(x);
1131
- const iy = Math.floor(y);
1132
- const u = smoother2(x - ix);
1133
- const v = smoother2(y - iy);
1134
- const a = hash22(ix, iy, seed);
1135
- const b = hash22(ix + 1, iy, seed);
1136
- const c = hash22(ix, iy + 1, seed);
1137
- const d = hash22(ix + 1, iy + 1, seed);
1138
- return a + (b - a) * u + (c - a) * v + (a - b - c + d) * u * v;
1139
- }
1140
- function fbm2(x, y, seed) {
1141
- return noise22(x, y, seed) * 0.667 + noise22(x * 2.13 + 7.3, y * 2.13 + 3.1, seed + 101) * 0.333;
1142
- }
1143
- function seededRandom(seed) {
1144
- let s = seed > 0 ? seed : 1;
1145
- return () => {
1146
- s = s * 16807 % 2147483647;
1147
- return (s - 1) / 2147483646;
1148
- };
1149
- }
1150
- function isColorDark2(hex) {
1151
- const m = hex.replace("#", "");
1152
- const r = parseInt(m.slice(0, 2), 16);
1153
- const g = parseInt(m.slice(2, 4), 16);
1154
- const b = parseInt(m.slice(4, 6), 16);
1155
- return (0.299 * r + 0.587 * g + 0.114 * b) / 255 < 0.5;
1156
- }
1157
- function pickColor(colors, r) {
1158
- if (colors.length === 1) return colors[0];
1159
- if (r < 0.7) return colors[0];
1160
- const rest = colors.length - 1;
1161
- return colors[1 + Math.min(rest - 1, Math.floor((r - 0.7) / 0.3 * rest))];
1162
- }
1163
- function SilkFlowBg({
1164
- colors = [BLUE, VIOLET, TEAL],
1165
- background = BG,
1166
- density = 1,
1167
- speed = 1,
1168
- glow = 0.55,
1169
- grain = 0.07,
1170
- vignette = 0.45,
1171
- angle = -16,
1172
- seed = 7,
1173
- className
1174
- }) {
1175
- const frame = useCurrentFrame9();
1176
- const { fps, width, height } = useVideoConfig6();
1177
- const canvasRef = useRef2(null);
1178
- const grainRef = useRef2(null);
1179
- const sceneRef = useRef2(null);
1180
- const isDark = isColorDark2(background);
1181
- const t = frame / fps * speed;
1182
- useEffect2(() => {
1183
- const canvas = canvasRef.current;
1184
- if (!canvas) return;
1185
- const ctx = canvas.getContext("2d");
1186
- if (!ctx) return;
1187
- canvas.width = width;
1188
- canvas.height = height;
1189
- if (!sceneRef.current) sceneRef.current = document.createElement("canvas");
1190
- const scene = sceneRef.current;
1191
- scene.width = width;
1192
- scene.height = height;
1193
- const sctx = scene.getContext("2d");
1194
- if (!sctx) return;
1195
- sctx.clearRect(0, 0, width, height);
1196
- sctx.lineCap = "round";
1197
- sctx.lineJoin = "round";
1198
- sctx.globalCompositeOperation = isDark ? "lighter" : "source-over";
1199
- const aspect = width / height;
1200
- const baseAngle = angle * Math.PI / 180;
1201
- const nLines = Math.round(170 * density);
1202
- const STEPS = 88;
1203
- const CHUNK = 8;
1204
- const stepLen = 0.011;
1205
- const NOISE_SCALE = 1.15;
1206
- const CURL = 2.2;
1207
- const swayPhase = t * 0.055 * 2 * Math.PI;
1208
- const px = new Float64Array(STEPS);
1209
- const py = new Float64Array(STEPS);
1210
- for (let i = 0; i < nLines; i++) {
1211
- const r1 = hash22(i, 11, seed);
1212
- const r2 = hash22(i, 23, seed);
1213
- const r3 = hash22(i, 37, seed);
1214
- const r4 = hash22(i, 53, seed);
1215
- const r5 = hash22(i, 71, seed);
1216
- const r6 = hash22(i, 89, seed);
1217
- let x = -0.08 + (aspect + 0.16) * (i * 0.6180339887 % 1);
1218
- let y = -0.08 + 1.16 * (i * 0.7548776662 % 1);
1219
- for (let s = 0; s < STEPS; s++) {
1220
- px[s] = x;
1221
- py[s] = y;
1222
- const n = fbm2(x * NOISE_SCALE, y * NOISE_SCALE, seed);
1223
- const sway = Math.sin(swayPhase + fbm2(x * 0.9 + 31.7, y * 0.9 + 17.3, seed + 999) * 6.28318) * 0.16;
1224
- const th = baseAngle + (n - 0.5) * CURL + sway;
1225
- x += Math.cos(th) * stepLen;
1226
- y += Math.sin(th) * stepLen;
1227
- }
1228
- const color = pickColor(colors, r1);
1229
- const w = (0.9 + r2 * 1.5) * (height / 1080);
1230
- const baseAlpha = 0.22 + r3 * 0.4;
1231
- const breathe = 0.75 + 0.25 * Math.sin(2 * Math.PI * (0.045 + r4 * 0.05) * t + r5 * 6.283);
1232
- const p = (t / 10 + r6) % 1;
1233
- sctx.strokeStyle = color;
1234
- for (let c0 = 0; c0 < STEPS - 1; c0 += CHUNK) {
1235
- const c1 = Math.min(c0 + CHUNK, STEPS - 1);
1236
- const sMid = (c0 + c1) / 2 / (STEPS - 1);
1237
- const env = Math.sin(Math.PI * sMid) ** 0.9;
1238
- let d = Math.abs(sMid - p);
1239
- d = Math.min(d, 1 - d);
1240
- const shim = Math.exp(-(d * d) / (2 * 0.05 * 0.05));
1241
- sctx.globalAlpha = Math.min(1, baseAlpha * env * breathe * (1 + 1.8 * shim));
1242
- sctx.lineWidth = w * (1 + shim * 1.2);
1243
- sctx.beginPath();
1244
- sctx.moveTo(px[c0] * height, py[c0] * height);
1245
- for (let s = c0 + 1; s <= c1; s++) sctx.lineTo(px[s] * height, py[s] * height);
1246
- sctx.stroke();
1247
- }
1248
- }
1249
- ctx.clearRect(0, 0, width, height);
1250
- if (glow > 0) {
1251
- ctx.save();
1252
- ctx.filter = `blur(${Math.round(18 * (height / 1080))}px)`;
1253
- ctx.globalAlpha = Math.min(1, glow);
1254
- ctx.globalCompositeOperation = isDark ? "lighter" : "multiply";
1255
- ctx.drawImage(scene, 0, 0);
1256
- ctx.restore();
1257
- }
1258
- ctx.filter = "none";
1259
- ctx.globalAlpha = 1;
1260
- ctx.globalCompositeOperation = "source-over";
1261
- ctx.drawImage(scene, 0, 0);
1262
- }, [frame, fps, width, height, colors, density, speed, glow, angle, seed, isDark, t]);
1263
- useEffect2(() => {
1264
- if (grain <= 0) return;
1265
- const canvas = grainRef.current;
1266
- if (!canvas) return;
1267
- const ctx = canvas.getContext("2d");
1268
- if (!ctx) return;
1269
- const gw = Math.ceil(width * 0.25);
1270
- const gh = Math.ceil(height * 0.25);
1271
- canvas.width = gw;
1272
- canvas.height = gh;
1273
- const img = ctx.createImageData(gw, gh);
1274
- const rand = seededRandom(Math.floor(frame) * 7919 + seed + 1);
1275
- for (let i = 0; i < img.data.length; i += 4) {
1276
- const v = Math.floor(rand() * 256);
1277
- img.data[i] = v;
1278
- img.data[i + 1] = v;
1279
- img.data[i + 2] = v;
1280
- img.data[i + 3] = 255;
1281
- }
1282
- ctx.putImageData(img, 0, 0);
1283
- }, [frame, grain, width, height, seed]);
1284
- return /* @__PURE__ */ jsxs6(
1285
- "div",
1286
- {
1287
- className,
1288
- style: { position: "absolute", inset: 0, background, overflow: "hidden" },
1289
- children: [
1290
- /* @__PURE__ */ jsx9(
1291
- "canvas",
1292
- {
1293
- ref: canvasRef,
1294
- style: { position: "absolute", inset: 0, width: "100%", height: "100%" }
1295
- }
1296
- ),
1297
- vignette > 0 && /* @__PURE__ */ jsx9(
1298
- "div",
1299
- {
1300
- style: {
1301
- position: "absolute",
1302
- inset: 0,
1303
- pointerEvents: "none",
1304
- background: `radial-gradient(ellipse 130% 100% at 50% 46%, transparent 52%, ${background} 128%)`,
1305
- opacity: vignette
1306
- }
1307
- }
1308
- ),
1309
- grain > 0 && /* @__PURE__ */ jsx9(
1310
- "canvas",
1311
- {
1312
- ref: grainRef,
1313
- style: {
1314
- position: "absolute",
1315
- inset: 0,
1316
- width: "100%",
1317
- height: "100%",
1318
- mixBlendMode: "overlay",
1319
- opacity: grain,
1320
- pointerEvents: "none"
1321
- }
1322
- }
1323
- )
1324
- ]
1325
- }
1326
- );
1327
- }
1328
-
1329
- // src/backgrounds/vector-field/index.tsx
1330
- import { useEffect as useEffect3, useRef as useRef3 } from "react";
1331
- import { useCurrentFrame as useCurrentFrame10, useVideoConfig as useVideoConfig7 } from "remotion";
1332
- import { jsx as jsx10 } from "react/jsx-runtime";
1333
- function hash23(ix, iy, seed) {
1334
- let h = Math.imul(ix, 374761393) + Math.imul(iy, 668265263) + Math.imul(seed, 1013904223);
1335
- h = Math.imul(h ^ h >>> 13, 1274126177);
1336
- h ^= h >>> 16;
1337
- return (h >>> 0) / 4294967295;
1338
- }
1339
- function hexToRgb2(hex) {
1340
- const m = hex.replace("#", "");
1341
- return [parseInt(m.slice(0, 2), 16), parseInt(m.slice(2, 4), 16), parseInt(m.slice(4, 6), 16)];
1342
- }
1343
- function VectorField({
1344
- pointCount = 140,
1345
- color = BLUE,
1346
- accentColor = ACCENT,
1347
- background = BG,
1348
- queryAt = 40,
1349
- neighbors = 6,
1350
- seed = 7,
1351
- className
1352
- }) {
1353
- const frame = useCurrentFrame10();
1354
- const { fps, width, height } = useVideoConfig7();
1355
- const canvasRef = useRef3(null);
1356
- const t = frame / fps;
1357
- useEffect3(() => {
1358
- const canvas = canvasRef.current;
1359
- if (!canvas) return;
1360
- const ctx = canvas.getContext("2d");
1361
- if (!ctx) return;
1362
- canvas.width = width;
1363
- canvas.height = height;
1364
- ctx.clearRect(0, 0, width, height);
1365
- const [cr, cg, cb] = hexToRgb2(color);
1366
- const [ar, ag, ab] = hexToRgb2(accentColor);
1367
- const qx0 = width * 0.58;
1368
- const qy0 = height * 0.46;
1369
- const qIn = Math.min(1, Math.max(0, (frame - queryAt) / 12));
1370
- const qEase = 1 - (1 - qIn) * (1 - qIn);
1371
- const queryLive = frame >= queryAt;
1372
- const pts = [];
1373
- for (let i = 0; i < pointCount; i++) {
1374
- const r1 = hash23(i, 11, seed);
1375
- const r2 = hash23(i, 23, seed);
1376
- const r3 = hash23(i, 37, seed);
1377
- const r4 = hash23(i, 53, seed);
1378
- const bx = (0.06 + r1 * 0.88) * width;
1379
- const by = (0.08 + r2 * 0.84) * height;
1380
- const f1 = 0.03 + r3 * 0.03;
1381
- const f2 = 0.025 + r4 * 0.03;
1382
- let x = bx + Math.sin(2 * Math.PI * f1 * t + r1 * 6.28) * width * 0.012;
1383
- let y = by + Math.cos(2 * Math.PI * f2 * t + r2 * 6.28) * height * 0.016;
1384
- const d = Math.hypot(x - qx0, y - qy0);
1385
- if (queryLive && d < Math.min(width, height) * 0.4) {
1386
- const pull = qEase * 0.04 * (1 - d / (Math.min(width, height) * 0.4));
1387
- x += (qx0 - x) * pull;
1388
- y += (qy0 - y) * pull;
1389
- }
1390
- pts.push({ x, y, r: 2.8 + r3 * 3.2, d: Math.hypot(x - qx0, y - qy0) });
1391
- }
1392
- const nearest = queryLive ? [...pts].sort((a, b) => a.d - b.d).slice(0, neighbors) : [];
1393
- if (queryLive) {
1394
- const shimmer = 0.55 + Math.sin(2 * Math.PI * 0.5 * t) * 0.25;
1395
- for (const p of nearest) {
1396
- const grad = ctx.createLinearGradient(qx0, qy0, p.x, p.y);
1397
- grad.addColorStop(0, `rgba(${ar},${ag},${ab},${0.65 * qEase * shimmer})`);
1398
- grad.addColorStop(1, `rgba(${ar},${ag},${ab},0.06)`);
1399
- ctx.strokeStyle = grad;
1400
- ctx.lineWidth = 1.6;
1401
- ctx.beginPath();
1402
- ctx.moveTo(qx0, qy0);
1403
- ctx.lineTo(p.x, p.y);
1404
- ctx.stroke();
1405
- }
1406
- }
1407
- for (const p of pts) {
1408
- const isNear = queryLive && nearest.includes(p);
1409
- const alpha = isNear ? 0.95 : 0.6;
1410
- ctx.fillStyle = isNear ? `rgba(${ar},${ag},${ab},${alpha})` : `rgba(${cr},${cg},${cb},${alpha})`;
1411
- ctx.beginPath();
1412
- ctx.arc(p.x, p.y, isNear ? p.r * 1.5 : p.r, 0, Math.PI * 2);
1413
- ctx.fill();
1414
- }
1415
- if (queryLive) {
1416
- const ringAge = (frame - queryAt) / 20;
1417
- if (ringAge < 1.6) {
1418
- ctx.strokeStyle = `rgba(${ar},${ag},${ab},${Math.max(0, 0.7 - ringAge * 0.45)})`;
1419
- ctx.lineWidth = 2;
1420
- ctx.beginPath();
1421
- ctx.arc(qx0, qy0, 14 + ringAge * 46, 0, Math.PI * 2);
1422
- ctx.stroke();
1423
- }
1424
- const idlePulse = 1 + Math.sin(2 * Math.PI * 0.55 * t) * 0.12;
1425
- ctx.fillStyle = `rgba(${ar},${ag},${ab},${qEase})`;
1426
- ctx.shadowColor = accentColor;
1427
- ctx.shadowBlur = 22;
1428
- ctx.beginPath();
1429
- ctx.arc(qx0, qy0, 8 * qEase * idlePulse, 0, Math.PI * 2);
1430
- ctx.fill();
1431
- ctx.shadowBlur = 0;
1432
- }
1433
- }, [frame, fps, width, height, pointCount, color, accentColor, background, queryAt, neighbors, seed, t]);
1434
- return /* @__PURE__ */ jsx10(
1435
- "div",
1436
- {
1437
- className,
1438
- style: { position: "absolute", inset: 0, background, overflow: "hidden" },
1439
- children: /* @__PURE__ */ jsx10(
1440
- "canvas",
1441
- {
1442
- ref: canvasRef,
1443
- style: { position: "absolute", inset: 0, width: "100%", height: "100%" }
1444
- }
1445
- )
1446
- }
1447
- );
1448
- }
1449
-
1450
- // src/backgrounds/volumetric-rays/index.tsx
1451
- import { interpolate as interpolate2, useCurrentFrame as useCurrentFrame11 } from "remotion";
1452
- import { fitTextOnNLines } from "@remotion/layout-utils";
1453
- import { jsx as jsx11, jsxs as jsxs7 } from "react/jsx-runtime";
1454
- var FONT_FAMILY3 = "inherit";
1455
- function VolumetricRays({
1456
- text = "REMOCN",
1457
- fontSize = 240,
1458
- fontWeight = 800,
1459
- rayColor = ACCENT,
1460
- background = BG,
1461
- textColor = BG,
1462
- intensity = 1,
1463
- speed = 1,
1464
- className
1465
- }) {
1466
- const frame = useCurrentFrame11() * speed;
1467
- const RAYS_MAX_WIDTH = 1400;
1468
- let singleLineFit = fontSize;
1469
- if (text.trim().length > 0) {
1470
- try {
1471
- const { fontSize: fit } = fitTextOnNLines({
1472
- text,
1473
- maxLines: 1,
1474
- maxBoxWidth: RAYS_MAX_WIDTH,
1475
- fontFamily: FONT_FAMILY3,
1476
- fontWeight,
1477
- letterSpacing: "-0.04em",
1478
- maxFontSize: fontSize,
1479
- validateFontIsLoaded: false
1480
- });
1481
- singleLineFit = fit;
1482
- } catch {
1483
- singleLineFit = fontSize;
1484
- }
1485
- }
1486
- const { fontSize: fittedFontSize } = resolveFitFontSize({
1487
- singleLineFitFontSize: singleLineFit,
1488
- minFontSize: Math.round(fontSize * 0.55),
1489
- maxFontSize: fontSize
1490
- });
1491
- const rotation = interpolate2(frame, [0, 240], [-4, 8]);
1492
- const bloomOpacity = interpolate2(frame, [0, 30], [0, 0.95 * intensity], {
1493
- extrapolateLeft: "clamp",
1494
- extrapolateRight: "clamp"
1495
- });
1496
- const haloPulse = 0.6 + Math.sin(frame / 14) * 0.15;
1497
- const sharedTextStyle = {
1498
- position: "absolute",
1499
- inset: 0,
1500
- display: "flex",
1501
- alignItems: "center",
1502
- justifyContent: "center",
1503
- fontFamily: FONT_FAMILY3,
1504
- fontSize: fittedFontSize,
1505
- fontWeight,
1506
- letterSpacing: "-0.04em",
1507
- textAlign: "center",
1508
- whiteSpace: "nowrap"
1509
- };
1510
- return /* @__PURE__ */ jsxs7(
1511
- "div",
1512
- {
1513
- className,
1514
- style: {
1515
- position: "absolute",
1516
- inset: 0,
1517
- background,
1518
- overflow: "hidden"
1519
- },
1520
- children: [
1521
- /* @__PURE__ */ jsx11(
1522
- "div",
1523
- {
1524
- style: {
1525
- ...sharedTextStyle,
1526
- color: rayColor,
1527
- filter: `blur(${60 * intensity}px)`,
1528
- transform: "scale(1.2, 1.6)",
1529
- transformOrigin: "center bottom",
1530
- opacity: bloomOpacity * haloPulse
1531
- },
1532
- children: text
1533
- }
1534
- ),
1535
- /* @__PURE__ */ jsx11(
1536
- "div",
1537
- {
1538
- style: {
1539
- ...sharedTextStyle,
1540
- backgroundImage: `conic-gradient(from ${rotation}deg at 50% 100%,
1541
- transparent 0deg,
1542
- ${rayColor} 20deg,
1543
- transparent 40deg,
1544
- ${rayColor} 80deg,
1545
- transparent 100deg,
1546
- ${rayColor} 140deg,
1547
- transparent 160deg,
1548
- ${rayColor} 200deg,
1549
- transparent 220deg,
1550
- ${rayColor} 260deg,
1551
- transparent 280deg,
1552
- ${rayColor} 320deg,
1553
- transparent 360deg)`,
1554
- color: "transparent",
1555
- WebkitBackgroundClip: "text",
1556
- backgroundClip: "text",
1557
- opacity: 0.5 * intensity,
1558
- filter: "blur(2px)"
1559
- },
1560
- children: text
1561
- }
1562
- ),
1563
- /* @__PURE__ */ jsx11(
1564
- "div",
1565
- {
1566
- style: {
1567
- ...sharedTextStyle,
1568
- color: textColor,
1569
- textShadow: `0 0 ${30 * intensity}px ${rayColor}`
1570
- },
1571
- children: text
1572
- }
1573
- ),
1574
- /* @__PURE__ */ jsx11(
1575
- "div",
1576
- {
1577
- style: {
1578
- position: "absolute",
1579
- left: 0,
1580
- right: 0,
1581
- bottom: 0,
1582
- height: 200,
1583
- pointerEvents: "none",
1584
- background: `radial-gradient(ellipse at 50% 100%, ${rayColor}55 0%, transparent 60%)`,
1585
- opacity: bloomOpacity
1586
- }
1587
- }
1588
- )
1589
- ]
1590
- }
1591
- );
1592
- }
1593
-
1594
- // src/backgrounds/animated-bar-chart/config.ts
1595
- import { z } from "zod";
1596
- var paramsSchema = z.object({
1597
- data: z.array(z.number().min(0)).min(2).max(24).default([35, 60, 45, 80, 55, 70, 90, 65]).describe(
1598
- "Bar values. Any non-negative numbers; the primitive auto-scales to the max. 6\u201310 bars reads cleanest."
1599
- ),
1600
- labels: z.array(z.string().max(24)).optional().describe(
1601
- "Optional x-axis labels, one per data point. Omit for an unlabeled, pure-shape chart."
1602
- ),
1603
- width: z.number().min(400).max(1920).default(1e3).describe("Chart width in pixels (the SVG inner box)."),
1604
- height: z.number().min(200).max(1080).default(500).describe("Chart height in pixels."),
1605
- barColor: z.string().default(ACCENT).describe(
1606
- "Bar fill color. Use a single brand color \u2014 chart is monochromatic by design."
1607
- ),
1608
- accentColor: z.string().default(TEAL).describe("Peak (max value) bar accent \u2014 the number that lands. Set equal to barColor to disable."),
1609
- valueLabels: z.boolean().default(true).describe("Counting value labels above the bars."),
1610
- background: z.string().default(BG).describe("Frame background behind the chart."),
1611
- gap: z.number().min(0).max(60).default(16).describe("Gap between bars in pixels."),
1612
- staggerFrames: z.number().int().min(0).max(30).default(6).describe(
1613
- "Frames between each bar's spring-up entrance. 4\u20138 reads as confident; 0 lands them all at once."
1614
- ),
1615
- speed: z.number().min(0.25).max(4).default(1).describe("Playback speed multiplier.")
1616
- }).passthrough();
1617
- var config = {
1618
- id: "animated-bar-chart",
1619
- component: AnimatedBarChart,
1620
- name: "Animated Bar Chart",
1621
- category: "backgrounds",
1622
- kind: "component",
1623
- version: "0.2.1",
1624
- intent: "render-chart",
1625
- description: "Spring-driven bar chart that scales each bar up from the baseline with a configurable stagger. SVG-based, clean flat bars. Designed as a hero data visualization \u2014 full-frame, single accent color, no chart junk.",
1626
- useWhen: 'Quarterly numbers, growth charts, "we shipped X this month" data beats, single-metric storytelling. Avoid for >12 bars (axis becomes unreadable at 1920\xD71080) and avoid when the data range crosses zero \u2014 this primitive only renders non-negative bars.',
1627
- pairsWith: ["kinetic-type", "cinematic-title", "lower-third", "mesh-gradient-bg"],
1628
- avoidWith: ["animated-line-chart"],
1629
- tier: "standard",
1630
- useCase: ["explainer"],
1631
- tags: ["background", "chart", "bar", "data", "analytics", "metric", "svg"],
1632
- mood: ["corporate", "editorial", "tech-demo", "minimal"],
1633
- paramsSchema,
1634
- propDefaults: {
1635
- data: [35, 60, 45, 80, 55, 70, 90, 65],
1636
- width: 1e3,
1637
- height: 500,
1638
- barColor: ACCENT,
1639
- accentColor: TEAL,
1640
- background: BG,
1641
- valueLabels: true,
1642
- gap: 16,
1643
- staggerFrames: 5,
1644
- speed: 1
1645
- },
1646
- examples: [
1647
- {
1648
- name: "quarterly-revenue",
1649
- mood: ["corporate"],
1650
- params: {
1651
- data: [120, 180, 240, 360],
1652
- labels: ["Q1", "Q2", "Q3", "Q4"],
1653
- barColor: SUCCESS,
1654
- staggerFrames: 8
1655
- },
1656
- description: "Four quarters, growing bars, green for revenue."
1657
- },
1658
- {
1659
- name: "monthly-active-users",
1660
- mood: ["tech-demo", "editorial"],
1661
- params: {
1662
- data: [12, 18, 24, 31, 42, 58, 76, 94, 110, 142, 168, 215],
1663
- labels: ["J", "F", "M", "A", "M", "J", "J", "A", "S", "O", "N", "D"],
1664
- barColor: VIOLET,
1665
- gap: 10,
1666
- staggerFrames: 4
1667
- },
1668
- description: "12-month MAU growth chart."
1669
- }
1670
- ],
1671
- textParam: null,
1672
- subtextParam: null,
1673
- tokens: [
1674
- { propPath: "barColor", cssVar: "--cf-accent", fallback: ACCENT, brandKitPath: "colors.accent" },
1675
- { propPath: "background", cssVar: "--cf-bg", fallback: BG, brandKitPath: "colors.background" }
1676
- ],
1677
- durationInFrames: 90,
1678
- fps: 30,
1679
- width: 1920,
1680
- height: 1080,
1681
- preview: { thumbnailFrame: 60, mode: "oneshot", defaultExample: "quarterly-revenue" }
1682
- };
1683
-
1684
- // src/backgrounds/animated-line-chart/config.ts
1685
- import { z as z2 } from "zod";
1686
- var paramsSchema2 = z2.object({
1687
- data: z2.array(z2.number()).min(2).max(60).default([12, 19, 8, 15, 22, 18, 28, 25, 32]).describe(
1688
- "Y-values. Any numbers; auto-scaled to fit. 8\u201314 points reads as a clean trend line."
1689
- ),
1690
- width: z2.number().min(400).max(1920).default(1e3).describe("Chart width in pixels."),
1691
- height: z2.number().min(200).max(1080).default(500).describe("Chart height in pixels."),
1692
- strokeColor: z2.string().default(ACCENT).describe(
1693
- "Line + dot color. Single accent \u2014 green reads as growth, red as alarm."
1694
- ),
1695
- accentColor: z2.string().default(TEAL).describe("Endpoint dot + value accent."),
1696
- endpointValue: z2.boolean().default(true).describe("Endpoint value counts up with the draw and holds."),
1697
- strokeWidth: z2.number().min(1).max(16).default(4).describe("Line thickness in pixels."),
1698
- background: z2.string().default(BG).describe("Frame background."),
1699
- gridColor: z2.string().default("rgba(255,255,255,0.07)").describe("Grid line color. Keep dim \u2014 grid sits behind the line."),
1700
- showDot: z2.boolean().default(true).describe("Show the leading dot that traces the line as it draws."),
1701
- speed: z2.number().min(0.25).max(4).default(1).describe("Playback speed multiplier.")
1702
- }).passthrough();
1703
- var config2 = {
1704
- id: "animated-line-chart",
1705
- component: AnimatedLineChart,
1706
- name: "Animated Line Chart",
1707
- category: "backgrounds",
1708
- kind: "component",
1709
- version: "0.2.1",
1710
- intent: "render-chart",
1711
- description: "SVG line chart with stroke-dasharray draw-on animation and a leading dot that traces the path in realtime. Spring-driven progress with no bounce. Includes a faint background grid and a clean, crisp line.",
1712
- useWhen: 'Trend lines (revenue, users, latency), "the chart goes up" hero beats, time-series narratives. Avoid for unordered categorical data (use animated-bar-chart) and avoid for >40 points at 1920\xD71080 (line becomes a noisy zigzag).',
1713
- pairsWith: ["kinetic-type", "cinematic-title", "lower-third", "pulsing-indicator"],
1714
- avoidWith: ["animated-bar-chart"],
1715
- tier: "standard",
1716
- useCase: ["explainer"],
1717
- tags: ["background", "chart", "line", "data", "trend", "analytics", "svg", "time-series"],
1718
- mood: ["corporate", "editorial", "tech-demo", "minimal"],
1719
- paramsSchema: paramsSchema2,
1720
- propDefaults: {
1721
- data: [12, 19, 8, 15, 22, 18, 28, 25, 32],
1722
- width: 1e3,
1723
- height: 500,
1724
- strokeColor: ACCENT,
1725
- accentColor: TEAL,
1726
- strokeWidth: 4,
1727
- background: BG,
1728
- gridColor: "rgba(255,255,255,0.07)",
1729
- endpointValue: true,
1730
- showDot: true,
1731
- speed: 1
1732
- },
1733
- examples: [
1734
- {
1735
- name: "growth-curve",
1736
- mood: ["corporate", "tech-demo"],
1737
- params: {
1738
- data: [10, 14, 18, 22, 28, 35, 44, 56, 72, 95],
1739
- strokeColor: SUCCESS
1740
- },
1741
- description: "Up-and-to-the-right growth chart, green."
1742
- },
1743
- {
1744
- name: "latency-drop",
1745
- mood: ["tech-demo", "editorial"],
1746
- params: {
1747
- data: [820, 740, 680, 540, 420, 320, 240, 180, 140, 110],
1748
- strokeColor: TEAL,
1749
- strokeWidth: 5
1750
- },
1751
- description: 'Latency-down chart, blue. "We made it 7\xD7 faster".'
1752
- }
1753
- ],
1754
- textParam: null,
1755
- subtextParam: null,
1756
- tokens: [
1757
- { propPath: "strokeColor", cssVar: "--cf-accent", fallback: ACCENT, brandKitPath: "colors.accent" },
1758
- { propPath: "background", cssVar: "--cf-bg", fallback: BG, brandKitPath: "colors.background" }
1759
- ],
1760
- durationInFrames: 120,
1761
- fps: 30,
1762
- width: 1920,
1763
- height: 1080,
1764
- preview: { thumbnailFrame: 90, mode: "oneshot", defaultExample: "growth-curve" }
1765
- };
1766
-
1767
- // src/backgrounds/dither-gradient-bg/config.ts
1768
- import { z as z3 } from "zod";
1769
- var hexColor = z3.string().regex(/^#[0-9a-fA-F]{6}$/, "hex #rrggbb");
1770
- var paramsSchema3 = z3.object({
1771
- color: hexColor.default(BLUE).describe("Ink color of the dither dots."),
1772
- color2: hexColor.default(TEAL).describe("Second ink \u2014 dots blend between the two along the field."),
1773
- background: hexColor.default(BG).describe("Ground behind the dots."),
1774
- pixelSize: z3.number().int().min(3).max(24).default(8).describe("Dither cell size in px at 1080p. 6\u201310 reads deliberate; larger goes retro."),
1775
- angle: z3.number().min(-180).max(180).default(-30).describe("Base gradient direction in degrees."),
1776
- speed: z3.number().min(0.1).max(3).default(1).describe("Field drift speed."),
1777
- seed: z3.number().int().min(0).max(9999).default(7).describe("Field seed \u2014 different warp layouts.")
1778
- }).passthrough();
1779
- var config3 = {
1780
- id: "dither-gradient-bg",
1781
- component: DitherGradientBg,
1782
- name: "Dither Gradient Background",
1783
- category: "backgrounds",
1784
- kind: "component",
1785
- version: "0.1.1",
1786
- intent: "gradient-fill",
1787
- description: "Ordered-dither gradient \u2014 an animated luminance field quantized through a Bayer 8\xD78 matrix into hard pixel dots that drift and warp slowly. The pixel-craft dev-tool aesthetic: texture with intent, zero banding by construction. Sits between silk-flow-bg (organic threads) and mesh-gradient-bg (soft wash) as the technical register.",
1788
- useWhen: "Dev-tool launches, terminal/CLI product beats, changelog and release videos \u2014 anywhere the brand voice is precise and software-native. Title-safe by default (ambient drift). Pair with typewriter / terminal-simulator / glass-code-block.",
1789
- pairsWith: ["typewriter", "terminal-simulator", "glass-code-block", "stat-counter", "cinematic-title"],
1790
- avoidWith: ["mesh-gradient-bg", "silk-flow-bg", "dynamic-grid"],
1791
- tier: "recommended",
1792
- useCase: ["background", "intro"],
1793
- tags: ["background", "dither", "bayer", "pixel", "gradient", "retro-digital", "dev-tool"],
1794
- mood: ["tech-demo", "minimal", "editorial"],
1795
- paramsSchema: paramsSchema3,
1796
- propDefaults: {
1797
- color: BLUE,
1798
- color2: TEAL,
1799
- background: BG,
1800
- pixelSize: 8,
1801
- angle: -30,
1802
- speed: 1,
1803
- seed: 7
1804
- },
1805
- examples: [
1806
- { name: "indigo-terminal", mood: ["tech-demo"], params: { color: BLUE, color2: TEAL, background: BG, pixelSize: 8, angle: -30, speed: 1, seed: 7 } },
1807
- { name: "phosphor", mood: ["tech-demo", "minimal"], params: { color: SUCCESS, color2: SUCCESS_SOFT, background: BG_DEEP, pixelSize: 6, angle: -15, speed: 0.8, seed: 21 } },
1808
- { name: "paper-print", mood: ["editorial", "minimal"], params: { color: "#334155", color2: "#94a3b8", background: "#f5f1e8", pixelSize: 7, angle: -40, speed: 0.6, seed: 12 } }
1809
- ],
1810
- textParam: null,
1811
- subtextParam: null,
1812
- tokens: [
1813
- { propPath: "background", cssVar: "--cf-bg", fallback: BG, brandKitPath: "colors.background" },
1814
- { propPath: "color", cssVar: "--cf-accent", fallback: BLUE, brandKitPath: "colors.accent" }
1815
- ],
1816
- durationInFrames: 300,
1817
- fps: 30,
1818
- width: 1920,
1819
- height: 1080,
1820
- preview: { thumbnailFrame: 90, mode: "loop", defaultExample: "indigo-terminal" }
1821
- };
1822
-
1823
- // src/backgrounds/dynamic-grid/config.ts
1824
- import { z as z4 } from "zod";
1825
- var paramsSchema4 = z4.object({
1826
- cellSize: z4.number().min(20).max(200).default(60).describe("Grid cell size in pixels at 1920\xD71080."),
1827
- lineColor: z4.string().default("rgba(255,255,255,0.22)").describe("Grid line color. Low-alpha keeps it underneath \u2014 but stay above ~0.15 or H.264 crushes it to black."),
1828
- background: z4.string().default(BG).describe("Frame background."),
1829
- direction: z4.enum(["diagonal", "horizontal", "vertical"]).default("diagonal").describe("Animation direction."),
1830
- speed: z4.number().min(0.25).max(4).default(1).describe("Playback speed.")
1831
- }).passthrough();
1832
- var config4 = {
1833
- id: "dynamic-grid",
1834
- component: DynamicGrid,
1835
- name: "Dynamic Grid",
1836
- category: "backgrounds",
1837
- kind: "component",
1838
- version: "0.1.2",
1839
- intent: "pattern-fill",
1840
- description: 'Slowly translating grid lines across a dark background. The "tech-product" background for code, terminal, or product-demo content. Three directions of motion (diagonal/horizontal/vertical).',
1841
- useWhen: "Tech demos, code reveals, dark-mode UI showcases, anywhere a clean grid sits underneath the content. Pair with terminal-simulator or glass-code-block for the full developer aesthetic.",
1842
- pairsWith: ["terminal-simulator", "glass-code-block", "typewriter", "pulsing-indicator"],
1843
- avoidWith: ["mesh-gradient-bg"],
1844
- tier: "standard",
1845
- useCase: ["background"],
1846
- tags: ["background", "grid", "tech", "lines", "pattern", "minimal"],
1847
- mood: ["tech-demo", "minimal", "corporate"],
1848
- paramsSchema: paramsSchema4,
1849
- propDefaults: { cellSize: 60, lineColor: "rgba(255,255,255,0.22)", background: BG, direction: "diagonal", speed: 1 },
1850
- examples: [
1851
- { name: "tech-default", mood: ["tech-demo"], params: { cellSize: 60, lineColor: "rgba(255,255,255,0.22)", background: BG, direction: "diagonal", speed: 1 } },
1852
- { name: "tight-horizontal", mood: ["minimal"], params: { cellSize: 40, lineColor: "rgba(255,255,255,0.06)", background: BG, direction: "horizontal", speed: 0.7 } }
1853
- ],
1854
- textParam: null,
1855
- subtextParam: null,
1856
- tokens: [
1857
- { propPath: "background", cssVar: "--cf-bg", fallback: BG, brandKitPath: "colors.background" },
1858
- { propPath: "lineColor", cssVar: "--cf-grid-line", fallback: "rgba(255,255,255,0.22)", brandKitPath: "colors.gridLine" }
1859
- ],
1860
- durationInFrames: 240,
1861
- fps: 30,
1862
- width: 1920,
1863
- height: 1080,
1864
- preview: { thumbnailFrame: 60, mode: "loop", defaultExample: "tech-default" }
1865
- };
1866
-
1867
- // src/backgrounds/ecosystem-constellation/config.ts
1868
- import { z as z5 } from "zod";
1869
- var paramsSchema5 = z5.object({
1870
- satelliteCount: z5.number().int().min(3).max(8).default(6).describe(
1871
- "How many satellite logos orbit the center. 5\u20137 reads as a busy ecosystem; 3\u20134 feels focused."
1872
- ),
1873
- centerLabel: z5.string().min(1).max(3).default("V").describe(
1874
- 'Single character (or short monogram) shown in the center hub. The "your brand" letter.'
1875
- ),
1876
- accentColor: z5.string().default(VIOLET).describe(
1877
- "Center hub gradient and connection-line color. Brand accent."
1878
- ),
1879
- speed: z5.number().min(0.25).max(4).default(1).describe("Playback speed multiplier (orbit + pulse + data-fire).")
1880
- }).passthrough();
1881
- var config5 = {
1882
- id: "ecosystem-constellation",
1883
- component: EcosystemConstellation,
1884
- name: "Ecosystem Constellation",
1885
- category: "backgrounds",
1886
- kind: "component",
1887
- version: "0.1.1",
1888
- intent: "fill-background",
1889
- description: 'Center brand hub with satellite logos (GitHub, Vercel, Stripe, Slack, Linear, Figma, Notion, Discord) orbiting on elliptical paths. Connection lines pulse on a 30-frame cycle, illuminating one satellite at a time to suggest "data flowing". Satellites assemble from offscreen on a staggered spring at frame 0.',
1890
- useWhen: `Integration showcases ("works with all your tools"), platform-overview heroes, ecosystem maps, "we connect your stack" beats. Avoid when the integrations shown don't match the audience's stack \u2014 the brand list is fixed in this primitive.`,
1891
- pairsWith: ["cinematic-title", "kinetic-type", "lower-third", "volumetric-rays"],
1892
- avoidWith: ["perspective-marquee", "infinite-bento-pan"],
1893
- tier: "standard",
1894
- useCase: ["explainer", "background"],
1895
- tags: ["background", "ecosystem", "integrations", "orbit", "constellation", "logos", "platform"],
1896
- mood: ["tech-demo", "cinematic", "corporate"],
1897
- paramsSchema: paramsSchema5,
1898
- propDefaults: { satelliteCount: 6, centerLabel: "V", accentColor: VIOLET, speed: 1 },
1899
- examples: [
1900
- {
1901
- name: "platform-hub",
1902
- mood: ["tech-demo"],
1903
- params: { satelliteCount: 6, centerLabel: "V", accentColor: VIOLET },
1904
- description: "Default 6-satellite purple hub."
1905
- },
1906
- {
1907
- name: "tight-trio",
1908
- mood: ["minimal", "corporate"],
1909
- params: { satelliteCount: 3, centerLabel: "C", accentColor: BLUE },
1910
- description: "Three satellites only \u2014 focused integration story."
1911
- }
1912
- ],
1913
- textParam: "centerLabel",
1914
- subtextParam: null,
1915
- tokens: [
1916
- { propPath: "accentColor", cssVar: "--cf-accent", fallback: VIOLET, brandKitPath: "colors.accent" }
1917
- ],
1918
- durationInFrames: 240,
1919
- fps: 30,
1920
- width: 1920,
1921
- height: 1080,
1922
- preview: { thumbnailFrame: 120, mode: "loop", defaultExample: "platform-hub" }
1923
- };
1924
-
1925
- // src/backgrounds/infinite-marquee/config.ts
1926
- import { z as z6 } from "zod";
1927
- var paramsSchema6 = z6.object({
1928
- text: z6.string().default("CUEFRAME / NEXT / NEW / NOW / ").describe('Repeating marquee text. End with a separator (" / " or " \u2022 ") for clean repetition.'),
1929
- fontSize: z6.number().min(20).max(280).default(120).describe("Font size in pixels."),
1930
- color: z6.string().default(SURFACE).describe("Text color."),
1931
- fontWeight: z6.number().min(100).max(900).default(800).describe("Font weight. Heavy reads as the news-ticker / runway feel."),
1932
- pixelsPerFrame: z6.number().min(0.5).max(20).default(4).describe("Scroll speed in px/frame. 4 reads steady; >8 reads frantic."),
1933
- stroke: z6.boolean().default(false).describe("Render as outline-only (stroke) text."),
1934
- strokeColor: z6.string().default(SURFACE).describe("Stroke color when stroke=true."),
1935
- background: z6.string().default(TEXT_HI).describe("Frame background."),
1936
- speed: z6.number().min(0.25).max(4).default(1).describe("Playback speed multiplier.")
1937
- }).passthrough();
1938
- var config6 = {
1939
- id: "infinite-marquee",
1940
- component: InfiniteMarquee,
1941
- name: "Infinite Marquee",
1942
- category: "backgrounds",
1943
- kind: "component",
1944
- version: "0.1.1",
1945
- intent: "pattern-fill",
1946
- description: "Endlessly scrolling text band. Repeating word/phrase scrolling left across the frame as a background. Stripe / fashion-runway / news-ticker aesthetic.",
1947
- useWhen: "Lower-third tickers, product-page bands, brand statement loops. Stack two with opposite directions for an even more graphic feel. Avoid for moments that need narrative attention \u2014 the constant motion is hypnotic.",
1948
- pairsWith: ["cinematic-title", "lower-third", "shimmer-sweep"],
1949
- avoidWith: [],
1950
- tier: "niche",
1951
- useCase: ["background"],
1952
- tags: ["background", "marquee", "ticker", "scrolling", "repeating", "loop"],
1953
- mood: ["breaking-news", "corporate", "aggressive"],
1954
- paramsSchema: paramsSchema6,
1955
- propDefaults: { text: "CUEFRAME / NEXT / NEW / NOW / ", fontSize: 120, color: SURFACE, fontWeight: 800, pixelsPerFrame: 4, stroke: false, strokeColor: SURFACE, background: TEXT_HI, speed: 1 },
1956
- examples: [
1957
- { name: "product-band", mood: ["corporate"], params: { text: "cueframe / cueframe / cueframe / ", fontSize: 100, color: SURFACE, fontWeight: 800, pixelsPerFrame: 4, stroke: false, strokeColor: SURFACE, background: TEXT_HI, speed: 1 } },
1958
- { name: "breaking-ticker", mood: ["breaking-news"], params: { text: "BREAKING / LIVE / NOW / ", fontSize: 140, color: DANGER, fontWeight: 900, pixelsPerFrame: 6, stroke: false, strokeColor: DANGER, background: BG, speed: 1 } },
1959
- { name: "outline-runway", mood: ["minimal"], params: { text: "PREMIUM / PREMIUM / PREMIUM / ", fontSize: 160, color: "transparent", fontWeight: 900, pixelsPerFrame: 3, stroke: true, strokeColor: BG, background: TEXT_HI, speed: 1 } }
1960
- ],
1961
- textParam: "text",
1962
- subtextParam: null,
1963
- tokens: [
1964
- { propPath: "color", cssVar: "--cf-text", fallback: SURFACE, brandKitPath: "colors.text" },
1965
- { propPath: "background", cssVar: "--cf-bg", fallback: TEXT_HI, brandKitPath: "colors.background" }
1966
- ],
1967
- durationInFrames: 240,
1968
- fps: 30,
1969
- width: 1920,
1970
- height: 1080,
1971
- preview: { thumbnailFrame: 60, mode: "loop", defaultExample: "product-band" }
1972
- };
1973
-
1974
- // src/backgrounds/mesh-gradient-bg/config.ts
1975
- import { z as z7 } from "zod";
1976
- var paramsSchema7 = z7.object({
1977
- colors: z7.array(z7.string()).min(2).max(8).default([BLUE, VIOLET, TEAL]).describe("Mesh blob colors. 2\u20133 analogous hues read premium; whole-wheel rainbows read templated."),
1978
- speed: z7.number().min(0.25).max(4).default(1).describe("Animation speed."),
1979
- background: z7.string().default(BG).describe("Frame background underneath the blobs."),
1980
- blur: z7.number().min(0).max(160).default(100).describe("Gaussian blur radius for the mesh \u2014 high values create the soft mesh look.")
1981
- }).passthrough();
1982
- var config7 = {
1983
- id: "mesh-gradient-bg",
1984
- component: MeshGradientBg,
1985
- name: "Mesh Gradient Background",
1986
- category: "backgrounds",
1987
- kind: "component",
1988
- version: "0.2.1",
1989
- intent: "gradient-fill",
1990
- description: "Animated mesh gradient \u2014 multiple soft-blurred color blobs drifting across the frame. The Stripe / Linear / Vercel marketing-page background, in motion. Universal warm/cool/brand-tinted background.",
1991
- useWhen: "Default background for any text-overlay primitive, hero frames, brand pages, anywhere a static color would feel flat. Pair with brand-kit colors for cascade theming.",
1992
- pairsWith: ["blur-reveal", "cinematic-title", "kinetic-type", "shimmer-sweep"],
1993
- avoidWith: ["dynamic-grid"],
1994
- tier: "standard",
1995
- useCase: ["background"],
1996
- tags: ["background", "mesh", "gradient", "blobs", "soft", "animated"],
1997
- mood: ["minimal", "soft", "corporate", "cinematic"],
1998
- paramsSchema: paramsSchema7,
1999
- propDefaults: { colors: [BLUE, VIOLET, TEAL], speed: 1, background: BG, blur: 100 },
2000
- examples: [
2001
- { name: "launch-wash", mood: ["minimal", "corporate"], params: { colors: [BLUE, VIOLET, TEAL], speed: 1, background: BG, blur: 100 } },
2002
- { name: "brand-warm", mood: ["corporate"], params: { colors: [ACCENT_STRONG, ACCENT, WARNING], speed: 0.7, background: BG, blur: 100 } },
2003
- { name: "cinema-dark", mood: ["cinematic"], params: { colors: ["#1e3a5f", "#3b1f5e", "#1e293b"], speed: 0.5, background: BG, blur: 120 } }
2004
- ],
2005
- textParam: null,
2006
- subtextParam: null,
2007
- tokens: [
2008
- { propPath: "background", cssVar: "--cf-bg", fallback: BG, brandKitPath: "colors.background" }
2009
- ],
2010
- durationInFrames: 240,
2011
- fps: 30,
2012
- width: 1920,
2013
- height: 1080,
2014
- preview: { thumbnailFrame: 120, mode: "loop", defaultExample: "launch-wash" }
2015
- };
2016
-
2017
- // src/backgrounds/perspective-marquee/config.ts
2018
- import { z as z8 } from "zod";
2019
- var paramsSchema8 = z8.object({
2020
- items: z8.array(z8.string().min(1).max(80)).min(2).max(40).default([
2021
- "Northwind",
2022
- "Vertex",
2023
- "Lumina",
2024
- "Datum",
2025
- "Forgeworks",
2026
- "Overture",
2027
- "Solace",
2028
- "Pinnacle"
2029
- ]).describe(
2030
- "Items to scroll across the marquee. Brand names, feature words, customer logos-as-text. 6\u201312 items loops cleanly."
2031
- ),
2032
- fontSize: z8.number().min(40).max(240).default(84).describe("Item font size in pixels at 1920\xD71080."),
2033
- color: z8.string().default(TEXT_HI).describe("Item text color."),
2034
- fontWeight: z8.number().min(100).max(900).default(700).describe("CSS font weight. 700\u2013800 reads as confident logo wall."),
2035
- pixelsPerFrame: z8.number().min(0.25).max(20).default(2).describe("Marquee scroll rate. 1\u20133 is the readable sweet spot."),
2036
- rotateY: z8.number().min(-60).max(60).default(-28).describe(
2037
- "Y-axis 3D rotation in degrees. Negative tilts the row to the left. 0 disables the perspective effect."
2038
- ),
2039
- rotateX: z8.number().min(-30).max(30).default(8).describe("X-axis tilt in degrees."),
2040
- perspective: z8.number().min(400).max(3e3).default(1200).describe(
2041
- "CSS perspective in pixels. Lower = more dramatic foreshortening; 1000\u20131400 reads as cinematic."
2042
- ),
2043
- fadeColor: z8.string().default(BG).describe("Edge-fade color. Match the background for a clean vignette."),
2044
- background: z8.string().default(BG).describe("Frame background."),
2045
- speed: z8.number().min(0.25).max(4).default(1).describe("Playback speed multiplier.")
2046
- }).passthrough();
2047
- var config8 = {
2048
- id: "perspective-marquee",
2049
- component: PerspectiveMarquee,
2050
- name: "Perspective Marquee",
2051
- category: "backgrounds",
2052
- kind: "component",
2053
- version: "0.1.2",
2054
- intent: "fill-background",
2055
- description: 'Infinite horizontal marquee tilted in 3D with rotateX/rotateY perspective. Items fade and blur toward the edges via depth-of-field calculation, with a vignette fade to background on all four sides. The "logo wall in motion" \u2014 modern alternative to the flat infinite-marquee.',
2056
- useWhen: 'Brand walls ("trusted by"), feature word-clouds, customer logo strips, modern hero backgrounds for product launches. Avoid when items must remain individually readable through the entire scroll (edge blur reduces legibility) \u2014 use infinite-marquee for that.',
2057
- pairsWith: ["cinematic-title", "kinetic-type", "volumetric-rays", "grain"],
2058
- avoidWith: ["infinite-marquee", "mesh-gradient-bg"],
2059
- tier: "standard",
2060
- useCase: ["background"],
2061
- tags: ["background", "marquee", "perspective", "3d", "logo-wall", "scrolling", "tilted"],
2062
- mood: ["cinematic", "tech-demo", "editorial", "corporate"],
2063
- paramsSchema: paramsSchema8,
2064
- propDefaults: {
2065
- items: ["Northwind", "Vertex", "Lumina", "Datum", "Forgeworks", "Overture", "Arc", "Cursor"],
2066
- fontSize: 84,
2067
- color: TEXT_HI,
2068
- fontWeight: 700,
2069
- pixelsPerFrame: 2,
2070
- rotateY: -28,
2071
- rotateX: 8,
2072
- perspective: 1200,
2073
- fadeColor: BG,
2074
- background: BG,
2075
- speed: 1
2076
- },
2077
- examples: [
2078
- {
2079
- name: "logo-wall",
2080
- mood: ["tech-demo", "corporate"],
2081
- params: {
2082
- items: ["Northwind", "Vertex", "Lumina", "Datum", "Forgeworks", "Overture"],
2083
- rotateY: -28,
2084
- rotateX: 8
2085
- },
2086
- description: "Default tilted brand-wall."
2087
- },
2088
- {
2089
- name: "feature-keywords",
2090
- mood: ["editorial", "cinematic"],
2091
- params: {
2092
- items: ["Streaming", "Caching", "Tools", "Eval", "Tracing", "Costs", "Routing"],
2093
- fontSize: 100,
2094
- rotateY: -20,
2095
- rotateX: 4,
2096
- color: WARNING
2097
- },
2098
- description: "Feature words, gold, gentler tilt \u2014 editorial hero."
2099
- }
2100
- ],
2101
- textParam: null,
2102
- subtextParam: null,
2103
- tokens: [
2104
- { propPath: "background", cssVar: "--cf-bg", fallback: BG, brandKitPath: "colors.background" },
2105
- { propPath: "fadeColor", cssVar: "--cf-bg", fallback: BG, brandKitPath: "colors.background" },
2106
- { propPath: "color", cssVar: "--cf-fg", fallback: TEXT_HI, brandKitPath: "colors.textOnMedia" }
2107
- ],
2108
- durationInFrames: 240,
2109
- fps: 30,
2110
- width: 1920,
2111
- height: 1080,
2112
- preview: { thumbnailFrame: 120, mode: "loop", defaultExample: "logo-wall" }
2113
- };
2114
-
2115
- // src/backgrounds/silk-flow-bg/config.ts
2116
- import { z as z9 } from "zod";
2117
- var hexColor2 = z9.string().regex(/^#[0-9a-fA-F]{6}$/, "hex #rrggbb");
2118
- var paramsSchema9 = z9.object({
2119
- colors: z9.array(hexColor2).min(1).max(5).default([BLUE, VIOLET, TEAL]).describe("Thread hues. First = dominant (~70% of threads), rest = sparse accents. 2\u20133 is the sweet spot."),
2120
- background: hexColor2.default(BG).describe("Ground color. Dark grounds get luminous additive threads; light grounds get ink-on-paper strokes."),
2121
- density: z9.number().min(0.2).max(2).default(1).describe("Thread-count multiplier (1 \u2248 170 threads)."),
2122
- speed: z9.number().min(0.1).max(3).default(1).describe("Motion speed \u2014 travelling light + silk sway."),
2123
- glow: z9.number().min(0).max(1).default(0.55).describe("Bloom intensity around the threads."),
2124
- grain: z9.number().min(0).max(0.3).default(0.07).describe("Film-grain opacity. Kills gradient banding; 0 disables."),
2125
- vignette: z9.number().min(0).max(1).default(0.45).describe("Edge falloff that seats a centered title. 0 disables."),
2126
- angle: z9.number().min(-180).max(180).default(-16).describe("Base flow direction in degrees."),
2127
- seed: z9.number().int().min(0).max(9999).default(7).describe("Field seed \u2014 different seeds give different silk layouts.")
2128
- }).passthrough();
2129
- var config9 = {
2130
- id: "silk-flow-bg",
2131
- component: SilkFlowBg,
2132
- name: "Silk Flow Background",
2133
- category: "backgrounds",
2134
- kind: "component",
2135
- version: "0.1.1",
2136
- intent: "gradient-fill",
2137
- description: "Luminous flow-field silk \u2014 hundreds of fine threads drawn through an organic noise current, with travelling light, bloom, film grain and vignette. Generative-art-grade texture that reads authored, not generated: the title-sequence background for product launches. On light grounds it becomes an ink-etching on paper.",
2138
- useWhen: "Hero backgrounds for product launch and marketing videos, behind cinematic-title / hero text, brand films \u2014 anywhere the background must feel designed. Prefer over mesh-gradient-bg when the video sells a product.",
2139
- pairsWith: ["cinematic-title", "blur-reveal", "masked-slide-reveal", "kinetic-type"],
2140
- avoidWith: ["mesh-gradient-bg", "dynamic-grid", "particles"],
2141
- tier: "recommended",
2142
- useCase: ["background", "intro"],
2143
- tags: ["background", "silk", "flow-field", "threads", "generative", "luminous", "grain", "launch"],
2144
- mood: ["cinematic", "editorial", "minimal", "corporate"],
2145
- paramsSchema: paramsSchema9,
2146
- propDefaults: {
2147
- colors: [BLUE, VIOLET, TEAL],
2148
- background: BG,
2149
- density: 1,
2150
- speed: 1,
2151
- glow: 0.55,
2152
- grain: 0.07,
2153
- vignette: 0.45,
2154
- angle: -16,
2155
- seed: 7
2156
- },
2157
- examples: [
2158
- { name: "launch-night", mood: ["cinematic", "corporate"], params: { colors: [BLUE, VIOLET, TEAL], background: BG, density: 1, speed: 1, glow: 0.55, grain: 0.07, vignette: 0.45, angle: -16, seed: 7 } },
2159
- { name: "ember", mood: ["cinematic"], params: { colors: [ACCENT_STRONG, ACCENT, ACCENT_SOFT], background: BG, density: 0.9, speed: 0.8, glow: 0.6, grain: 0.08, vignette: 0.5, angle: -30, seed: 21 } },
2160
- { name: "aurora", mood: ["cinematic", "minimal"], params: { colors: [SUCCESS, TEAL, BLUE], background: BG, density: 1.1, speed: 0.7, glow: 0.65, grain: 0.06, vignette: 0.4, angle: -60, seed: 4 } },
2161
- { name: "ink-paper", mood: ["editorial", "minimal"], params: { colors: ["#334155", "#0f172a", "#b45309"], background: "#f5f1e8", density: 0.8, speed: 0.6, glow: 0.25, grain: 0.05, vignette: 0.3, angle: -12, seed: 12 } },
2162
- { name: "mono-wire", mood: ["minimal"], params: { colors: [TEXT_FAINT], background: BG, density: 0.7, speed: 0.9, glow: 0.4, grain: 0.06, vignette: 0.4, angle: -8, seed: 33 } }
2163
- ],
2164
- textParam: null,
2165
- subtextParam: null,
2166
- tokens: [
2167
- { propPath: "background", cssVar: "--cf-bg", fallback: BG, brandKitPath: "colors.background" }
2168
- ],
2169
- durationInFrames: 300,
2170
- fps: 30,
2171
- width: 1920,
2172
- height: 1080,
2173
- preview: { thumbnailFrame: 90, mode: "loop", defaultExample: "launch-night" }
2174
- };
2175
-
2176
- // src/backgrounds/vector-field/config.ts
2177
- import { z as z10 } from "zod";
2178
- var hexColor3 = z10.string().regex(/^#[0-9a-fA-F]{6}$/, "hex #rrggbb");
2179
- var paramsSchema10 = z10.object({
2180
- pointCount: z10.number().int().min(30).max(400).default(140).describe("Embedding points in the field."),
2181
- color: hexColor3.default(BLUE).describe("Base point color."),
2182
- accentColor: hexColor3.default(ACCENT).describe("Query point + neighbor-edge accent."),
2183
- background: hexColor3.default(BG).describe("Ground."),
2184
- queryAt: z10.number().int().min(0).max(200).default(40).describe("Frame the query point lands (ring pulse + neighbor pull)."),
2185
- neighbors: z10.number().int().min(2).max(14).default(6).describe("Nearest neighbors that brighten and connect."),
2186
- seed: z10.number().int().min(0).max(9999).default(7).describe("Layout seed \u2014 different point fields.")
2187
- }).passthrough();
2188
- var config10 = {
2189
- id: "vector-field",
2190
- component: VectorField,
2191
- name: "Vector Field",
2192
- category: "backgrounds",
2193
- kind: "component",
2194
- version: "0.1.1",
2195
- intent: "gradient-fill",
2196
- description: "Embedding space, cinematized: a drifting field of points; a query lands with a ring pulse, its nearest neighbors brighten and draw shimmering edges to it, and the local cluster leans in. Semantic search made visible. Ambient enough to hold a title.",
2197
- useWhen: 'RAG/search product beats, "understands meaning" claims, memory/recall features, vector-DB launches. Title-safe ambient; the query beat lands ~1.5s in. For app-icon orbits use ecosystem-constellation instead.',
2198
- pairsWith: ["token-stream", "stat-counter", "cinematic-title", "vignette"],
2199
- avoidWith: ["ecosystem-constellation", "particles", "data-flow-pipes"],
2200
- tier: "recommended",
2201
- useCase: ["background", "intro", "explainer"],
2202
- tags: ["background", "ai", "embeddings", "vectors", "semantic-search", "rag", "points"],
2203
- mood: ["tech-demo", "minimal", "cinematic"],
2204
- paramsSchema: paramsSchema10,
2205
- propDefaults: {
2206
- pointCount: 140,
2207
- color: BLUE,
2208
- accentColor: ACCENT,
2209
- background: BG,
2210
- queryAt: 40,
2211
- neighbors: 6,
2212
- seed: 7
2213
- },
2214
- examples: [
2215
- { name: "semantic-search", mood: ["tech-demo"], params: { pointCount: 140, color: BLUE, accentColor: ACCENT, background: BG, queryAt: 40, neighbors: 6, seed: 7 } },
2216
- { name: "memory-recall", mood: ["cinematic", "minimal"], params: { pointCount: 220, color: BLUE, accentColor: VIOLET, background: BG, queryAt: 55, neighbors: 8, seed: 21 } }
2217
- ],
2218
- textParam: null,
2219
- subtextParam: null,
2220
- tokens: [
2221
- { propPath: "background", cssVar: "--cf-bg", fallback: BG, brandKitPath: "colors.background" },
2222
- { propPath: "accentColor", cssVar: "--cf-accent", fallback: ACCENT, brandKitPath: "colors.accent" }
2223
- ],
2224
- durationInFrames: 240,
2225
- fps: 30,
2226
- width: 1920,
2227
- height: 1080,
2228
- preview: { thumbnailFrame: 80, mode: "loop", defaultExample: "semantic-search" }
2229
- };
2230
-
2231
- // src/backgrounds/volumetric-rays/config.ts
2232
- import { z as z11 } from "zod";
2233
- var paramsSchema11 = z11.object({
2234
- text: z11.string().min(1).max(48).default("REMOCN").describe(
2235
- "Text the rays pour through. 4\u20138 characters reads best \u2014 longer strings shrink and lose the god-rays effect. Auto-fits (shrinks to one line)."
2236
- ),
2237
- fontSize: z11.number().min(80).max(480).default(240).describe("Font size in pixels at 1920\xD71080."),
2238
- fontWeight: z11.number().min(100).max(900).default(800).describe(
2239
- "Font weight. 700\u2013900 reads dramatic; <600 looks washed out by the bloom."
2240
- ),
2241
- rayColor: z11.string().default(ACCENT).describe(
2242
- "Ray + bloom color. Warm yellows and oranges read as sun; cool cyans read as data/sci-fi."
2243
- ),
2244
- background: z11.string().default(BG).describe("Frame background. Should be near-black for the rays to read."),
2245
- textColor: z11.string().default(BG).describe(
2246
- "Front silhouette color. Match background to make the letters read as cut-outs against the light."
2247
- ),
2248
- intensity: z11.number().min(0).max(2).default(1).describe(
2249
- "Bloom + ray strength multiplier. 0.5 reads subtle; 1 is canonical; >1.5 starts blowing out."
2250
- ),
2251
- speed: z11.number().min(0.25).max(4).default(1).describe("Playback speed multiplier (rotation + bloom ramp).")
2252
- }).passthrough();
2253
- var config11 = {
2254
- id: "volumetric-rays",
2255
- component: VolumetricRays,
2256
- name: "Volumetric Rays",
2257
- category: "backgrounds",
2258
- kind: "component",
2259
- version: "0.1.1",
2260
- intent: "animate-rays",
2261
- description: "God-rays / volumetric-light effect built entirely from CSS + SVG masks. Same text rendered three times: a heavily-blurred halo behind, a conic-gradient ray mask clipped to the text shape, and a solid silhouette in front. The result reads as light pouring through cut-out lettering. Slow rotation + sine-wave halo pulse keep the scene from feeling frozen.",
2262
- useWhen: 'Cinematic title cards, "the announcement" reveals, brand-name heroes, dramatic openers. Avoid for body copy or anything that needs to be read quickly (the bloom obscures text edges) and avoid stacking with other heavy bloom/glow effects (kinetic-type, mesh-gradient-bg).',
2263
- pairsWith: ["cinematic-title", "grain", "vignette", "perspective-marquee"],
2264
- avoidWith: ["mesh-gradient-bg", "kinetic-type"],
2265
- tier: "standard",
2266
- useCase: ["intro", "background"],
2267
- tags: ["background", "rays", "volumetric", "god-rays", "bloom", "cinematic", "title"],
2268
- mood: ["cinematic", "aggressive", "editorial"],
2269
- paramsSchema: paramsSchema11,
2270
- propDefaults: {
2271
- text: "REMOCN",
2272
- fontSize: 240,
2273
- fontWeight: 800,
2274
- rayColor: ACCENT,
2275
- background: BG,
2276
- textColor: BG,
2277
- intensity: 1,
2278
- speed: 1
2279
- },
2280
- examples: [
2281
- {
2282
- name: "golden-hero",
2283
- mood: ["cinematic", "editorial"],
2284
- params: { text: "LAUNCH", rayColor: ACCENT, intensity: 1 },
2285
- description: "Default warm-yellow god-rays for a brand reveal."
2286
- },
2287
- {
2288
- name: "cyber-blue",
2289
- mood: ["cinematic", "aggressive"],
2290
- params: { text: "2026", rayColor: TEAL, fontSize: 280, intensity: 1.2 },
2291
- description: "Cyan rays \u2014 sci-fi / cyber feel."
2292
- }
2293
- ],
2294
- textParam: "text",
2295
- subtextParam: null,
2296
- tokens: [
2297
- { propPath: "rayColor", cssVar: "--cf-accent", fallback: ACCENT, brandKitPath: "colors.accent" },
2298
- { propPath: "background", cssVar: "--cf-bg", fallback: BG, brandKitPath: "colors.background" },
2299
- { propPath: "textColor", cssVar: "--cf-bg", fallback: BG, brandKitPath: "colors.background" }
2300
- ],
2301
- durationInFrames: 240,
2302
- fps: 30,
2303
- width: 1920,
2304
- height: 1080,
2305
- preview: { thumbnailFrame: 90, mode: "loop", defaultExample: "golden-hero" }
2306
- };
2307
-
2308
- // src/backgrounds/index.ts
2309
- var catalog = [
2310
- config,
2311
- config2,
2312
- config3,
2313
- config4,
2314
- config5,
2315
- config6,
2316
- config7,
2317
- config8,
2318
- config9,
2319
- config10,
2320
- config11
2321
- ];
2322
-
2323
- export {
2324
- AnimatedBarChart,
2325
- AnimatedLineChart,
2326
- DitherGradientBg,
2327
- DynamicGrid,
2328
- EcosystemConstellation,
2329
- InfiniteMarquee,
2330
- MeshGradientBg,
2331
- PerspectiveMarquee,
2332
- SilkFlowBg,
2333
- VectorField,
2334
- VolumetricRays,
2335
- catalog
2336
- };
2337
- //# sourceMappingURL=chunk-E3KNUSFG.js.map