@appinternalleads/ui 0.3.0 → 0.4.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 (988) hide show
  1. package/dist/cjs/agent/AgentComponent.js +1 -1
  2. package/dist/cjs/agent/AgentComponent.js.map +1 -1
  3. package/dist/cjs/agent/base.js +25 -0
  4. package/dist/cjs/agent/base.js.map +1 -0
  5. package/dist/cjs/agent/catalog.js +0 -32
  6. package/dist/cjs/agent/catalog.js.map +1 -1
  7. package/dist/cjs/agent/core.js +22 -20
  8. package/dist/cjs/agent/core.js.map +1 -1
  9. package/dist/cjs/agent/index.js +6 -5
  10. package/dist/cjs/agent/index.js.map +1 -1
  11. package/dist/cjs/agent/manifests.js +81 -1
  12. package/dist/cjs/agent/manifests.js.map +1 -1
  13. package/dist/cjs/agent/result.js +6 -0
  14. package/dist/cjs/agent/result.js.map +1 -1
  15. package/dist/cjs/agent/search/document.js +50 -0
  16. package/dist/cjs/agent/search/document.js.map +1 -0
  17. package/dist/cjs/agent/search/embedding.js +107 -0
  18. package/dist/cjs/agent/search/embedding.js.map +1 -0
  19. package/dist/cjs/agent/search/index.js +25 -0
  20. package/dist/cjs/agent/search/index.js.map +1 -0
  21. package/dist/cjs/agent/search/lexical.js +28 -0
  22. package/dist/cjs/agent/search/lexical.js.map +1 -0
  23. package/dist/cjs/agent/search/normalize.js +15 -0
  24. package/dist/cjs/agent/search/normalize.js.map +1 -0
  25. package/dist/cjs/agent/search/search.js +123 -0
  26. package/dist/cjs/agent/search/search.js.map +1 -0
  27. package/dist/cjs/agent/search/searchIndex.js +120 -0
  28. package/dist/cjs/agent/search/searchIndex.js.map +1 -0
  29. package/dist/cjs/agent/search/types.js +8 -0
  30. package/dist/cjs/agent/search/types.js.map +1 -0
  31. package/dist/cjs/agent/search/weights.js +34 -0
  32. package/dist/cjs/agent/search/weights.js.map +1 -0
  33. package/dist/cjs/agent/search/wordvectors.json +1 -0
  34. package/dist/cjs/components/catalog.js +18 -0
  35. package/dist/cjs/components/catalog.js.map +1 -1
  36. package/dist/cjs/components/onboarding/animated-status/AnimatedStage.js +21 -0
  37. package/dist/cjs/components/onboarding/animated-status/AnimatedStage.js.map +1 -0
  38. package/dist/cjs/components/onboarding/animated-status/AnimatedStage.types.js +6 -0
  39. package/dist/cjs/components/onboarding/animated-status/AnimatedStage.types.js.map +1 -0
  40. package/dist/cjs/components/onboarding/animated-status/AnimatedStage.web.js +89 -0
  41. package/dist/cjs/components/onboarding/animated-status/AnimatedStage.web.js.map +1 -0
  42. package/dist/cjs/components/onboarding/animated-status/AnimatedStatusView.js +62 -0
  43. package/dist/cjs/components/onboarding/animated-status/AnimatedStatusView.js.map +1 -0
  44. package/dist/cjs/components/onboarding/animated-status/AnimatedStill.js +20 -0
  45. package/dist/cjs/components/onboarding/animated-status/AnimatedStill.js.map +1 -0
  46. package/dist/cjs/components/onboarding/animated-status/contract.js +87 -0
  47. package/dist/cjs/components/onboarding/animated-status/contract.js.map +1 -0
  48. package/dist/cjs/components/onboarding/animated-status/engine.js +40 -0
  49. package/dist/cjs/components/onboarding/animated-status/engine.js.map +1 -0
  50. package/dist/cjs/components/onboarding/animated-status/index.js +20 -0
  51. package/dist/cjs/components/onboarding/animated-status/index.js.map +1 -0
  52. package/dist/cjs/components/onboarding/animated-status/presets.json +126 -0
  53. package/dist/cjs/components/onboarding/animated-status/riv.js +7 -0
  54. package/dist/cjs/components/onboarding/animated-status/riv.js.map +1 -0
  55. package/dist/cjs/components/onboarding/index.js +4 -0
  56. package/dist/cjs/components/onboarding/index.js.map +1 -1
  57. package/dist/cjs/components/onboarding/presets.js +90 -84
  58. package/dist/cjs/components/onboarding/presets.js.map +1 -1
  59. package/dist/cjs/components/onboarding/receipt-printer/ReceiptStage.js +43 -6
  60. package/dist/cjs/components/onboarding/receipt-printer/ReceiptStage.js.map +1 -1
  61. package/dist/cjs/components/onboarding/send-completion/SendCompletionView.js +111 -0
  62. package/dist/cjs/components/onboarding/send-completion/SendCompletionView.js.map +1 -0
  63. package/dist/cjs/components/onboarding/send-completion/SendStage.js +37 -0
  64. package/dist/cjs/components/onboarding/send-completion/SendStage.js.map +1 -0
  65. package/dist/cjs/components/onboarding/send-completion/SendStage.types.js +6 -0
  66. package/dist/cjs/components/onboarding/send-completion/SendStage.types.js.map +1 -0
  67. package/dist/cjs/components/onboarding/send-completion/SendStage.web.js +107 -0
  68. package/dist/cjs/components/onboarding/send-completion/SendStage.web.js.map +1 -0
  69. package/dist/cjs/components/onboarding/send-completion/SendStill.js +17 -0
  70. package/dist/cjs/components/onboarding/send-completion/SendStill.js.map +1 -0
  71. package/dist/cjs/components/onboarding/send-completion/contract.js +83 -0
  72. package/dist/cjs/components/onboarding/send-completion/contract.js.map +1 -0
  73. package/dist/cjs/components/onboarding/send-completion/engine.js +32 -0
  74. package/dist/cjs/components/onboarding/send-completion/engine.js.map +1 -0
  75. package/dist/cjs/components/onboarding/send-completion/index.js +22 -0
  76. package/dist/cjs/components/onboarding/send-completion/index.js.map +1 -0
  77. package/dist/cjs/components/onboarding/send-completion/presets.json +132 -0
  78. package/dist/cjs/components/onboarding/send-completion/riv.js +7 -0
  79. package/dist/cjs/components/onboarding/send-completion/riv.js.map +1 -0
  80. package/dist/cjs/components/onboarding/shared/actions-data.js +2 -0
  81. package/dist/cjs/components/onboarding/shared/actions-data.js.map +1 -1
  82. package/dist/cjs/components/onboarding/shared/configColor.js +76 -0
  83. package/dist/cjs/components/onboarding/shared/configColor.js.map +1 -0
  84. package/dist/cjs/components/onboarding/shared/contract.js +4 -0
  85. package/dist/cjs/components/onboarding/shared/contract.js.map +1 -1
  86. package/dist/cjs/components/onboarding/shared/describe.js +1 -1
  87. package/dist/cjs/components/onboarding/shared/describe.js.map +1 -1
  88. package/dist/cjs/components/onboarding/shared/mock.js +2 -0
  89. package/dist/cjs/components/onboarding/shared/mock.js.map +1 -1
  90. package/dist/cjs/components/onboarding/views.js +8 -0
  91. package/dist/cjs/components/onboarding/views.js.map +1 -1
  92. package/dist/cjs/index.js +1 -1
  93. package/dist/cjs/index.js.map +1 -1
  94. package/dist/cjs/motion/MotionPlayer.js +42 -0
  95. package/dist/cjs/motion/MotionPlayer.js.map +1 -0
  96. package/dist/cjs/motion/agent.js +323 -0
  97. package/dist/cjs/motion/agent.js.map +1 -0
  98. package/dist/cjs/motion/cat/Cat.js +79 -0
  99. package/dist/cjs/motion/cat/Cat.js.map +1 -0
  100. package/dist/cjs/motion/cat/animation.js +204 -0
  101. package/dist/cjs/motion/cat/animation.js.map +1 -0
  102. package/dist/cjs/motion/cat/art.generated.js +37 -0
  103. package/dist/cjs/motion/cat/art.generated.js.map +1 -0
  104. package/dist/cjs/motion/cat/config.js +136 -0
  105. package/dist/cjs/motion/cat/config.js.map +1 -0
  106. package/dist/cjs/motion/cat/index.js +75 -0
  107. package/dist/cjs/motion/cat/index.js.map +1 -0
  108. package/dist/cjs/motion/cat/rig.js +99 -0
  109. package/dist/cjs/motion/cat/rig.js.map +1 -0
  110. package/dist/cjs/motion/cat/scene.js +148 -0
  111. package/dist/cjs/motion/cat/scene.js.map +1 -0
  112. package/dist/cjs/motion/configurable/config.js +477 -0
  113. package/dist/cjs/motion/configurable/config.js.map +1 -0
  114. package/dist/cjs/motion/configurable/controls.js +44 -0
  115. package/dist/cjs/motion/configurable/controls.js.map +1 -0
  116. package/dist/cjs/motion/easing.js +62 -0
  117. package/dist/cjs/motion/easing.js.map +1 -0
  118. package/dist/cjs/motion/fit.js +12 -0
  119. package/dist/cjs/motion/fit.js.map +1 -0
  120. package/dist/cjs/motion/index.js +101 -0
  121. package/dist/cjs/motion/index.js.map +1 -0
  122. package/dist/cjs/motion/neon/GlowRenderer.js +18 -0
  123. package/dist/cjs/motion/neon/GlowRenderer.js.map +1 -0
  124. package/dist/cjs/motion/neon/NeonCanvas.js +97 -0
  125. package/dist/cjs/motion/neon/NeonCanvas.js.map +1 -0
  126. package/dist/cjs/motion/neon/NeonText.js +108 -0
  127. package/dist/cjs/motion/neon/NeonText.js.map +1 -0
  128. package/dist/cjs/motion/neon/NeonTextFrame.js +36 -0
  129. package/dist/cjs/motion/neon/NeonTextFrame.js.map +1 -0
  130. package/dist/cjs/motion/neon/artwork.js +102 -0
  131. package/dist/cjs/motion/neon/artwork.js.map +1 -0
  132. package/dist/cjs/motion/neon/audio.js +165 -0
  133. package/dist/cjs/motion/neon/audio.js.map +1 -0
  134. package/dist/cjs/motion/neon/config.js +334 -0
  135. package/dist/cjs/motion/neon/config.js.map +1 -0
  136. package/dist/cjs/motion/neon/flicker.js +196 -0
  137. package/dist/cjs/motion/neon/flicker.js.map +1 -0
  138. package/dist/cjs/motion/neon/fonts.js +52 -0
  139. package/dist/cjs/motion/neon/fonts.js.map +1 -0
  140. package/dist/cjs/motion/neon/frame.js +24 -0
  141. package/dist/cjs/motion/neon/frame.js.map +1 -0
  142. package/dist/cjs/motion/neon/glitch.js +114 -0
  143. package/dist/cjs/motion/neon/glitch.js.map +1 -0
  144. package/dist/cjs/motion/neon/index.js +119 -0
  145. package/dist/cjs/motion/neon/index.js.map +1 -0
  146. package/dist/cjs/motion/neon/layers.js +68 -0
  147. package/dist/cjs/motion/neon/layers.js.map +1 -0
  148. package/dist/cjs/motion/neon/material.js +56 -0
  149. package/dist/cjs/motion/neon/material.js.map +1 -0
  150. package/dist/cjs/motion/neon/random.js +43 -0
  151. package/dist/cjs/motion/neon/random.js.map +1 -0
  152. package/dist/cjs/motion/neon/scene.js +549 -0
  153. package/dist/cjs/motion/neon/scene.js.map +1 -0
  154. package/dist/cjs/motion/neon/synth.js +213 -0
  155. package/dist/cjs/motion/neon/synth.js.map +1 -0
  156. package/dist/cjs/motion/neon/typography.js +81 -0
  157. package/dist/cjs/motion/neon/typography.js.map +1 -0
  158. package/dist/cjs/motion/neon/wall.js +113 -0
  159. package/dist/cjs/motion/neon/wall.js.map +1 -0
  160. package/dist/cjs/motion/paperfold/PaperFold.js +40 -0
  161. package/dist/cjs/motion/paperfold/PaperFold.js.map +1 -0
  162. package/dist/cjs/motion/paperfold/PaperFoldFrame.js +290 -0
  163. package/dist/cjs/motion/paperfold/PaperFoldFrame.js.map +1 -0
  164. package/dist/cjs/motion/paperfold/PaperFoldPlayer.js +59 -0
  165. package/dist/cjs/motion/paperfold/PaperFoldPlayer.js.map +1 -0
  166. package/dist/cjs/motion/paperfold/art.js +388 -0
  167. package/dist/cjs/motion/paperfold/art.js.map +1 -0
  168. package/dist/cjs/motion/paperfold/config.js +103 -0
  169. package/dist/cjs/motion/paperfold/config.js.map +1 -0
  170. package/dist/cjs/motion/paperfold/controls.js +493 -0
  171. package/dist/cjs/motion/paperfold/controls.js.map +1 -0
  172. package/dist/cjs/motion/paperfold/engine.js +722 -0
  173. package/dist/cjs/motion/paperfold/engine.js.map +1 -0
  174. package/dist/cjs/motion/paperfold/fonts.js +25 -0
  175. package/dist/cjs/motion/paperfold/fonts.js.map +1 -0
  176. package/dist/cjs/motion/paperfold/index.js +113 -0
  177. package/dist/cjs/motion/paperfold/index.js.map +1 -0
  178. package/dist/cjs/motion/paperfold/manipulate.js +170 -0
  179. package/dist/cjs/motion/paperfold/manipulate.js.map +1 -0
  180. package/dist/cjs/motion/paperfold/presets.js +119 -0
  181. package/dist/cjs/motion/paperfold/presets.js.map +1 -0
  182. package/dist/cjs/motion/paperfold/template.js +40 -0
  183. package/dist/cjs/motion/paperfold/template.js.map +1 -0
  184. package/dist/cjs/motion/player.js +203 -0
  185. package/dist/cjs/motion/player.js.map +1 -0
  186. package/dist/cjs/motion/promo/PromoFrame.js +293 -0
  187. package/dist/cjs/motion/promo/PromoFrame.js.map +1 -0
  188. package/dist/cjs/motion/promo/PromoShowcasePlayer.js +59 -0
  189. package/dist/cjs/motion/promo/PromoShowcasePlayer.js.map +1 -0
  190. package/dist/cjs/motion/promo/config.js +565 -0
  191. package/dist/cjs/motion/promo/config.js.map +1 -0
  192. package/dist/cjs/motion/promo/controls.js +571 -0
  193. package/dist/cjs/motion/promo/controls.js.map +1 -0
  194. package/dist/cjs/motion/promo/easing.js +35 -0
  195. package/dist/cjs/motion/promo/easing.js.map +1 -0
  196. package/dist/cjs/motion/promo/engine.js +567 -0
  197. package/dist/cjs/motion/promo/engine.js.map +1 -0
  198. package/dist/cjs/motion/promo/fonts.js +20 -0
  199. package/dist/cjs/motion/promo/fonts.js.map +1 -0
  200. package/dist/cjs/motion/promo/icons.js +29 -0
  201. package/dist/cjs/motion/promo/icons.js.map +1 -0
  202. package/dist/cjs/motion/promo/index.js +73 -0
  203. package/dist/cjs/motion/promo/index.js.map +1 -0
  204. package/dist/cjs/motion/promo/presets.js +44 -0
  205. package/dist/cjs/motion/promo/presets.js.map +1 -0
  206. package/dist/cjs/motion/promo/template.js +38 -0
  207. package/dist/cjs/motion/promo/template.js.map +1 -0
  208. package/dist/cjs/motion/replication2/Replication2Player.js +93 -0
  209. package/dist/cjs/motion/replication2/Replication2Player.js.map +1 -0
  210. package/dist/cjs/motion/replication2/config.js +352 -0
  211. package/dist/cjs/motion/replication2/config.js.map +1 -0
  212. package/dist/cjs/motion/replication2/controls.js +286 -0
  213. package/dist/cjs/motion/replication2/controls.js.map +1 -0
  214. package/dist/cjs/motion/replication2/driver.js +68 -0
  215. package/dist/cjs/motion/replication2/driver.js.map +1 -0
  216. package/dist/cjs/motion/replication2/easing.js +97 -0
  217. package/dist/cjs/motion/replication2/easing.js.map +1 -0
  218. package/dist/cjs/motion/replication2/engine.js +481 -0
  219. package/dist/cjs/motion/replication2/engine.js.map +1 -0
  220. package/dist/cjs/motion/replication2/html.js +88 -0
  221. package/dist/cjs/motion/replication2/html.js.map +1 -0
  222. package/dist/cjs/motion/replication2/index.js +61 -0
  223. package/dist/cjs/motion/replication2/index.js.map +1 -0
  224. package/dist/cjs/motion/replication2/measure.js +30 -0
  225. package/dist/cjs/motion/replication2/measure.js.map +1 -0
  226. package/dist/cjs/motion/replication2/metrics.js +10 -0
  227. package/dist/cjs/motion/replication2/metrics.js.map +1 -0
  228. package/dist/cjs/motion/replication2/presets.js +67 -0
  229. package/dist/cjs/motion/replication2/presets.js.map +1 -0
  230. package/dist/cjs/motion/replication2/riv.js +7 -0
  231. package/dist/cjs/motion/replication2/riv.js.map +1 -0
  232. package/dist/cjs/motion/replication2/rive-contract.js +158 -0
  233. package/dist/cjs/motion/replication2/rive-contract.js.map +1 -0
  234. package/dist/cjs/motion/replication2/template.js +35 -0
  235. package/dist/cjs/motion/replication2/template.js.map +1 -0
  236. package/dist/cjs/motion/sample.js +149 -0
  237. package/dist/cjs/motion/sample.js.map +1 -0
  238. package/dist/cjs/motion/templates/hey-template.js +1552 -0
  239. package/dist/cjs/motion/templates/hey-template.js.map +1 -0
  240. package/dist/cjs/motion/templates/index.js +22 -0
  241. package/dist/cjs/motion/templates/index.js.map +1 -0
  242. package/dist/cjs/motion/templates/word-motion.js +1165 -0
  243. package/dist/cjs/motion/templates/word-motion.js.map +1 -0
  244. package/dist/cjs/motion/types.js +3 -0
  245. package/dist/cjs/motion/types.js.map +1 -0
  246. package/dist/cjs/motion/typesurface/TypeSurfaceCanvas.js +62 -0
  247. package/dist/cjs/motion/typesurface/TypeSurfaceCanvas.js.map +1 -0
  248. package/dist/cjs/motion/typesurface/art.js +861 -0
  249. package/dist/cjs/motion/typesurface/art.js.map +1 -0
  250. package/dist/cjs/motion/typesurface/config.js +269 -0
  251. package/dist/cjs/motion/typesurface/config.js.map +1 -0
  252. package/dist/cjs/motion/typesurface/engine.js +607 -0
  253. package/dist/cjs/motion/typesurface/engine.js.map +1 -0
  254. package/dist/cjs/motion/typesurface/fonts.js +45 -0
  255. package/dist/cjs/motion/typesurface/fonts.js.map +1 -0
  256. package/dist/cjs/motion/typesurface/index.js +72 -0
  257. package/dist/cjs/motion/typesurface/index.js.map +1 -0
  258. package/dist/cjs/motion/typesurface/layout.js +130 -0
  259. package/dist/cjs/motion/typesurface/layout.js.map +1 -0
  260. package/dist/cjs/motion/typesurface/ops.js +175 -0
  261. package/dist/cjs/motion/typesurface/ops.js.map +1 -0
  262. package/dist/cjs/motion/typesurface/presets.js +192 -0
  263. package/dist/cjs/motion/typesurface/presets.js.map +1 -0
  264. package/dist/cjs/motion/typesurface/renderer.js +672 -0
  265. package/dist/cjs/motion/typesurface/renderer.js.map +1 -0
  266. package/dist/cjs/motion/typesurface/shaders.js +300 -0
  267. package/dist/cjs/motion/typesurface/shaders.js.map +1 -0
  268. package/dist/cjs/motion/typesurface/surfaces.js +156 -0
  269. package/dist/cjs/motion/typesurface/surfaces.js.map +1 -0
  270. package/dist/cjs/motion/typesurface/text.js +34 -0
  271. package/dist/cjs/motion/typesurface/text.js.map +1 -0
  272. package/dist/cjs/motion/typesurface/timeline.js +64 -0
  273. package/dist/cjs/motion/typesurface/timeline.js.map +1 -0
  274. package/dist/cjs/motion/validate.js +89 -0
  275. package/dist/cjs/motion/validate.js.map +1 -0
  276. package/dist/cjs/native/RiveReceiptStage.js +9 -150
  277. package/dist/cjs/native/RiveReceiptStage.js.map +1 -1
  278. package/dist/cjs/native/riveReceiptStageFactory.js +162 -0
  279. package/dist/cjs/native/riveReceiptStageFactory.js.map +1 -0
  280. package/dist/cjs/tokens/stage.js +10 -0
  281. package/dist/cjs/tokens/stage.js.map +1 -0
  282. package/dist/esm/agent/AgentComponent.js +1 -1
  283. package/dist/esm/agent/AgentComponent.js.map +1 -1
  284. package/dist/esm/agent/base.d.ts +11 -0
  285. package/dist/esm/agent/base.d.ts.map +1 -0
  286. package/dist/esm/agent/base.js +11 -0
  287. package/dist/esm/agent/base.js.map +1 -0
  288. package/dist/esm/agent/catalog.d.ts +0 -8
  289. package/dist/esm/agent/catalog.d.ts.map +1 -1
  290. package/dist/esm/agent/catalog.js +0 -31
  291. package/dist/esm/agent/catalog.js.map +1 -1
  292. package/dist/esm/agent/core.d.ts +6 -7
  293. package/dist/esm/agent/core.d.ts.map +1 -1
  294. package/dist/esm/agent/core.js +6 -7
  295. package/dist/esm/agent/core.js.map +1 -1
  296. package/dist/esm/agent/index.d.ts +6 -5
  297. package/dist/esm/agent/index.d.ts.map +1 -1
  298. package/dist/esm/agent/index.js +6 -5
  299. package/dist/esm/agent/index.js.map +1 -1
  300. package/dist/esm/agent/manifests.d.ts.map +1 -1
  301. package/dist/esm/agent/manifests.js +81 -1
  302. package/dist/esm/agent/manifests.js.map +1 -1
  303. package/dist/esm/agent/result.d.ts.map +1 -1
  304. package/dist/esm/agent/result.js +6 -0
  305. package/dist/esm/agent/result.js.map +1 -1
  306. package/dist/esm/agent/search/document.d.ts +6 -0
  307. package/dist/esm/agent/search/document.d.ts.map +1 -0
  308. package/dist/esm/agent/search/document.js +46 -0
  309. package/dist/esm/agent/search/document.js.map +1 -0
  310. package/dist/esm/agent/search/embedding.d.ts +31 -0
  311. package/dist/esm/agent/search/embedding.d.ts.map +1 -0
  312. package/dist/esm/agent/search/embedding.js +103 -0
  313. package/dist/esm/agent/search/embedding.js.map +1 -0
  314. package/dist/esm/agent/search/index.d.ts +10 -0
  315. package/dist/esm/agent/search/index.d.ts.map +1 -0
  316. package/dist/esm/agent/search/index.js +17 -0
  317. package/dist/esm/agent/search/index.js.map +1 -0
  318. package/dist/esm/agent/search/lexical.d.ts +3 -0
  319. package/dist/esm/agent/search/lexical.d.ts.map +1 -0
  320. package/dist/esm/agent/search/lexical.js +25 -0
  321. package/dist/esm/agent/search/lexical.js.map +1 -0
  322. package/dist/esm/agent/search/normalize.d.ts +13 -0
  323. package/dist/esm/agent/search/normalize.d.ts.map +1 -0
  324. package/dist/esm/agent/search/normalize.js +12 -0
  325. package/dist/esm/agent/search/normalize.js.map +1 -0
  326. package/dist/esm/agent/search/search.d.ts +42 -0
  327. package/dist/esm/agent/search/search.d.ts.map +1 -0
  328. package/dist/esm/agent/search/search.js +119 -0
  329. package/dist/esm/agent/search/search.js.map +1 -0
  330. package/dist/esm/agent/search/searchIndex.d.ts +42 -0
  331. package/dist/esm/agent/search/searchIndex.d.ts.map +1 -0
  332. package/dist/esm/agent/search/searchIndex.js +114 -0
  333. package/dist/esm/agent/search/searchIndex.js.map +1 -0
  334. package/dist/esm/agent/search/types.d.ts +67 -0
  335. package/dist/esm/agent/search/types.d.ts.map +1 -0
  336. package/dist/esm/agent/search/types.js +7 -0
  337. package/dist/esm/agent/search/types.js.map +1 -0
  338. package/dist/esm/agent/search/weights.d.ts +22 -0
  339. package/dist/esm/agent/search/weights.d.ts.map +1 -0
  340. package/dist/esm/agent/search/weights.js +31 -0
  341. package/dist/esm/agent/search/weights.js.map +1 -0
  342. package/dist/esm/agent/search/wordvectors.json +1 -0
  343. package/dist/esm/agent/types.d.ts +1 -1
  344. package/dist/esm/agent/types.d.ts.map +1 -1
  345. package/dist/esm/components/catalog.d.ts +1 -1
  346. package/dist/esm/components/catalog.d.ts.map +1 -1
  347. package/dist/esm/components/catalog.js +18 -0
  348. package/dist/esm/components/catalog.js.map +1 -1
  349. package/dist/esm/components/onboarding/animated-status/AnimatedStage.d.ts +9 -0
  350. package/dist/esm/components/onboarding/animated-status/AnimatedStage.d.ts.map +1 -0
  351. package/dist/esm/components/onboarding/animated-status/AnimatedStage.js +18 -0
  352. package/dist/esm/components/onboarding/animated-status/AnimatedStage.js.map +1 -0
  353. package/dist/esm/components/onboarding/animated-status/AnimatedStage.types.d.ts +31 -0
  354. package/dist/esm/components/onboarding/animated-status/AnimatedStage.types.d.ts.map +1 -0
  355. package/dist/esm/components/onboarding/animated-status/AnimatedStage.types.js +3 -0
  356. package/dist/esm/components/onboarding/animated-status/AnimatedStage.types.js.map +1 -0
  357. package/dist/esm/components/onboarding/animated-status/AnimatedStage.web.d.ts +4 -0
  358. package/dist/esm/components/onboarding/animated-status/AnimatedStage.web.d.ts.map +1 -0
  359. package/dist/esm/components/onboarding/animated-status/AnimatedStage.web.js +86 -0
  360. package/dist/esm/components/onboarding/animated-status/AnimatedStage.web.js.map +1 -0
  361. package/dist/esm/components/onboarding/animated-status/AnimatedStatusView.d.ts +32 -0
  362. package/dist/esm/components/onboarding/animated-status/AnimatedStatusView.d.ts.map +1 -0
  363. package/dist/esm/components/onboarding/animated-status/AnimatedStatusView.js +59 -0
  364. package/dist/esm/components/onboarding/animated-status/AnimatedStatusView.js.map +1 -0
  365. package/dist/esm/components/onboarding/animated-status/AnimatedStill.d.ts +8 -0
  366. package/dist/esm/components/onboarding/animated-status/AnimatedStill.d.ts.map +1 -0
  367. package/dist/esm/components/onboarding/animated-status/AnimatedStill.js +17 -0
  368. package/dist/esm/components/onboarding/animated-status/AnimatedStill.js.map +1 -0
  369. package/dist/esm/components/onboarding/animated-status/contract.d.ts +61 -0
  370. package/dist/esm/components/onboarding/animated-status/contract.d.ts.map +1 -0
  371. package/dist/esm/components/onboarding/animated-status/contract.js +78 -0
  372. package/dist/esm/components/onboarding/animated-status/contract.js.map +1 -0
  373. package/dist/esm/components/onboarding/animated-status/engine.d.ts +24 -0
  374. package/dist/esm/components/onboarding/animated-status/engine.d.ts.map +1 -0
  375. package/dist/esm/components/onboarding/animated-status/engine.js +32 -0
  376. package/dist/esm/components/onboarding/animated-status/engine.js.map +1 -0
  377. package/dist/esm/components/onboarding/animated-status/index.d.ts +5 -0
  378. package/dist/esm/components/onboarding/animated-status/index.d.ts.map +1 -0
  379. package/dist/esm/components/onboarding/animated-status/index.js +4 -0
  380. package/dist/esm/components/onboarding/animated-status/index.js.map +1 -0
  381. package/dist/esm/components/onboarding/animated-status/presets.json +126 -0
  382. package/dist/esm/components/onboarding/animated-status/riv.d.ts +3 -0
  383. package/dist/esm/components/onboarding/animated-status/riv.d.ts.map +1 -0
  384. package/dist/esm/components/onboarding/animated-status/riv.js +4 -0
  385. package/dist/esm/components/onboarding/animated-status/riv.js.map +1 -0
  386. package/dist/esm/components/onboarding/index.d.ts +2 -0
  387. package/dist/esm/components/onboarding/index.d.ts.map +1 -1
  388. package/dist/esm/components/onboarding/index.js +4 -0
  389. package/dist/esm/components/onboarding/index.js.map +1 -1
  390. package/dist/esm/components/onboarding/presets.d.ts.map +1 -1
  391. package/dist/esm/components/onboarding/presets.js +6 -0
  392. package/dist/esm/components/onboarding/presets.js.map +1 -1
  393. package/dist/esm/components/onboarding/receipt-printer/ReceiptStage.d.ts +4 -6
  394. package/dist/esm/components/onboarding/receipt-printer/ReceiptStage.d.ts.map +1 -1
  395. package/dist/esm/components/onboarding/receipt-printer/ReceiptStage.js +42 -6
  396. package/dist/esm/components/onboarding/receipt-printer/ReceiptStage.js.map +1 -1
  397. package/dist/esm/components/onboarding/send-completion/SendCompletionView.d.ts +47 -0
  398. package/dist/esm/components/onboarding/send-completion/SendCompletionView.d.ts.map +1 -0
  399. package/dist/esm/components/onboarding/send-completion/SendCompletionView.js +108 -0
  400. package/dist/esm/components/onboarding/send-completion/SendCompletionView.js.map +1 -0
  401. package/dist/esm/components/onboarding/send-completion/SendStage.d.ts +9 -0
  402. package/dist/esm/components/onboarding/send-completion/SendStage.d.ts.map +1 -0
  403. package/dist/esm/components/onboarding/send-completion/SendStage.js +34 -0
  404. package/dist/esm/components/onboarding/send-completion/SendStage.js.map +1 -0
  405. package/dist/esm/components/onboarding/send-completion/SendStage.types.d.ts +33 -0
  406. package/dist/esm/components/onboarding/send-completion/SendStage.types.d.ts.map +1 -0
  407. package/dist/esm/components/onboarding/send-completion/SendStage.types.js +3 -0
  408. package/dist/esm/components/onboarding/send-completion/SendStage.types.js.map +1 -0
  409. package/dist/esm/components/onboarding/send-completion/SendStage.web.d.ts +4 -0
  410. package/dist/esm/components/onboarding/send-completion/SendStage.web.d.ts.map +1 -0
  411. package/dist/esm/components/onboarding/send-completion/SendStage.web.js +104 -0
  412. package/dist/esm/components/onboarding/send-completion/SendStage.web.js.map +1 -0
  413. package/dist/esm/components/onboarding/send-completion/SendStill.d.ts +11 -0
  414. package/dist/esm/components/onboarding/send-completion/SendStill.d.ts.map +1 -0
  415. package/dist/esm/components/onboarding/send-completion/SendStill.js +14 -0
  416. package/dist/esm/components/onboarding/send-completion/SendStill.js.map +1 -0
  417. package/dist/esm/components/onboarding/send-completion/contract.d.ts +99 -0
  418. package/dist/esm/components/onboarding/send-completion/contract.d.ts.map +1 -0
  419. package/dist/esm/components/onboarding/send-completion/contract.js +76 -0
  420. package/dist/esm/components/onboarding/send-completion/contract.js.map +1 -0
  421. package/dist/esm/components/onboarding/send-completion/engine.d.ts +20 -0
  422. package/dist/esm/components/onboarding/send-completion/engine.d.ts.map +1 -0
  423. package/dist/esm/components/onboarding/send-completion/engine.js +28 -0
  424. package/dist/esm/components/onboarding/send-completion/engine.js.map +1 -0
  425. package/dist/esm/components/onboarding/send-completion/index.d.ts +6 -0
  426. package/dist/esm/components/onboarding/send-completion/index.d.ts.map +1 -0
  427. package/dist/esm/components/onboarding/send-completion/index.js +6 -0
  428. package/dist/esm/components/onboarding/send-completion/index.js.map +1 -0
  429. package/dist/esm/components/onboarding/send-completion/presets.json +132 -0
  430. package/dist/esm/components/onboarding/send-completion/riv.d.ts +3 -0
  431. package/dist/esm/components/onboarding/send-completion/riv.d.ts.map +1 -0
  432. package/dist/esm/components/onboarding/send-completion/riv.js +4 -0
  433. package/dist/esm/components/onboarding/send-completion/riv.js.map +1 -0
  434. package/dist/esm/components/onboarding/shared/actions-data.d.ts.map +1 -1
  435. package/dist/esm/components/onboarding/shared/actions-data.js +2 -0
  436. package/dist/esm/components/onboarding/shared/actions-data.js.map +1 -1
  437. package/dist/esm/components/onboarding/shared/configColor.d.ts +29 -0
  438. package/dist/esm/components/onboarding/shared/configColor.d.ts.map +1 -0
  439. package/dist/esm/components/onboarding/shared/configColor.js +69 -0
  440. package/dist/esm/components/onboarding/shared/configColor.js.map +1 -0
  441. package/dist/esm/components/onboarding/shared/contract.d.ts +1 -1
  442. package/dist/esm/components/onboarding/shared/contract.d.ts.map +1 -1
  443. package/dist/esm/components/onboarding/shared/contract.js +4 -0
  444. package/dist/esm/components/onboarding/shared/contract.js.map +1 -1
  445. package/dist/esm/components/onboarding/shared/describe.d.ts.map +1 -1
  446. package/dist/esm/components/onboarding/shared/describe.js +1 -1
  447. package/dist/esm/components/onboarding/shared/describe.js.map +1 -1
  448. package/dist/esm/components/onboarding/shared/mock.d.ts +2 -0
  449. package/dist/esm/components/onboarding/shared/mock.d.ts.map +1 -1
  450. package/dist/esm/components/onboarding/shared/mock.js +2 -0
  451. package/dist/esm/components/onboarding/shared/mock.js.map +1 -1
  452. package/dist/esm/components/onboarding/views.d.ts.map +1 -1
  453. package/dist/esm/components/onboarding/views.js +8 -0
  454. package/dist/esm/components/onboarding/views.js.map +1 -1
  455. package/dist/esm/index.js +1 -1
  456. package/dist/esm/index.js.map +1 -1
  457. package/dist/esm/motion/MotionPlayer.d.ts +22 -0
  458. package/dist/esm/motion/MotionPlayer.d.ts.map +1 -0
  459. package/dist/esm/motion/MotionPlayer.js +39 -0
  460. package/dist/esm/motion/MotionPlayer.js.map +1 -0
  461. package/dist/esm/motion/agent.d.ts +146 -0
  462. package/dist/esm/motion/agent.d.ts.map +1 -0
  463. package/dist/esm/motion/agent.js +278 -0
  464. package/dist/esm/motion/agent.js.map +1 -0
  465. package/dist/esm/motion/cat/Cat.d.ts +43 -0
  466. package/dist/esm/motion/cat/Cat.d.ts.map +1 -0
  467. package/dist/esm/motion/cat/Cat.js +74 -0
  468. package/dist/esm/motion/cat/Cat.js.map +1 -0
  469. package/dist/esm/motion/cat/animation.d.ts +86 -0
  470. package/dist/esm/motion/cat/animation.d.ts.map +1 -0
  471. package/dist/esm/motion/cat/animation.js +193 -0
  472. package/dist/esm/motion/cat/animation.js.map +1 -0
  473. package/dist/esm/motion/cat/art.generated.d.ts +53 -0
  474. package/dist/esm/motion/cat/art.generated.d.ts.map +1 -0
  475. package/dist/esm/motion/cat/art.generated.js +34 -0
  476. package/dist/esm/motion/cat/art.generated.js.map +1 -0
  477. package/dist/esm/motion/cat/config.d.ts +103 -0
  478. package/dist/esm/motion/cat/config.d.ts.map +1 -0
  479. package/dist/esm/motion/cat/config.js +129 -0
  480. package/dist/esm/motion/cat/config.js.map +1 -0
  481. package/dist/esm/motion/cat/index.d.ts +13 -0
  482. package/dist/esm/motion/cat/index.d.ts.map +1 -0
  483. package/dist/esm/motion/cat/index.js +13 -0
  484. package/dist/esm/motion/cat/index.js.map +1 -0
  485. package/dist/esm/motion/cat/rig.d.ts +44 -0
  486. package/dist/esm/motion/cat/rig.d.ts.map +1 -0
  487. package/dist/esm/motion/cat/rig.js +86 -0
  488. package/dist/esm/motion/cat/rig.js.map +1 -0
  489. package/dist/esm/motion/cat/scene.d.ts +66 -0
  490. package/dist/esm/motion/cat/scene.d.ts.map +1 -0
  491. package/dist/esm/motion/cat/scene.js +137 -0
  492. package/dist/esm/motion/cat/scene.js.map +1 -0
  493. package/dist/esm/motion/configurable/config.d.ts +80 -0
  494. package/dist/esm/motion/configurable/config.d.ts.map +1 -0
  495. package/dist/esm/motion/configurable/config.js +468 -0
  496. package/dist/esm/motion/configurable/config.js.map +1 -0
  497. package/dist/esm/motion/configurable/controls.d.ts +74 -0
  498. package/dist/esm/motion/configurable/controls.d.ts.map +1 -0
  499. package/dist/esm/motion/configurable/controls.js +38 -0
  500. package/dist/esm/motion/configurable/controls.js.map +1 -0
  501. package/dist/esm/motion/easing.d.ts +4 -0
  502. package/dist/esm/motion/easing.d.ts.map +1 -0
  503. package/dist/esm/motion/easing.js +58 -0
  504. package/dist/esm/motion/easing.js.map +1 -0
  505. package/dist/esm/motion/fit.d.ts +8 -0
  506. package/dist/esm/motion/fit.d.ts.map +1 -0
  507. package/dist/esm/motion/fit.js +8 -0
  508. package/dist/esm/motion/fit.js.map +1 -0
  509. package/dist/esm/motion/index.d.ts +27 -0
  510. package/dist/esm/motion/index.d.ts.map +1 -0
  511. package/dist/esm/motion/index.js +21 -0
  512. package/dist/esm/motion/index.js.map +1 -0
  513. package/dist/esm/motion/neon/GlowRenderer.d.ts +31 -0
  514. package/dist/esm/motion/neon/GlowRenderer.d.ts.map +1 -0
  515. package/dist/esm/motion/neon/GlowRenderer.js +14 -0
  516. package/dist/esm/motion/neon/GlowRenderer.js.map +1 -0
  517. package/dist/esm/motion/neon/NeonCanvas.d.ts +42 -0
  518. package/dist/esm/motion/neon/NeonCanvas.d.ts.map +1 -0
  519. package/dist/esm/motion/neon/NeonCanvas.js +92 -0
  520. package/dist/esm/motion/neon/NeonCanvas.js.map +1 -0
  521. package/dist/esm/motion/neon/NeonText.d.ts +26 -0
  522. package/dist/esm/motion/neon/NeonText.d.ts.map +1 -0
  523. package/dist/esm/motion/neon/NeonText.js +103 -0
  524. package/dist/esm/motion/neon/NeonText.js.map +1 -0
  525. package/dist/esm/motion/neon/NeonTextFrame.d.ts +29 -0
  526. package/dist/esm/motion/neon/NeonTextFrame.d.ts.map +1 -0
  527. package/dist/esm/motion/neon/NeonTextFrame.js +33 -0
  528. package/dist/esm/motion/neon/NeonTextFrame.js.map +1 -0
  529. package/dist/esm/motion/neon/artwork.d.ts +29 -0
  530. package/dist/esm/motion/neon/artwork.d.ts.map +1 -0
  531. package/dist/esm/motion/neon/artwork.js +98 -0
  532. package/dist/esm/motion/neon/artwork.js.map +1 -0
  533. package/dist/esm/motion/neon/audio.d.ts +49 -0
  534. package/dist/esm/motion/neon/audio.d.ts.map +1 -0
  535. package/dist/esm/motion/neon/audio.js +161 -0
  536. package/dist/esm/motion/neon/audio.js.map +1 -0
  537. package/dist/esm/motion/neon/config.d.ts +319 -0
  538. package/dist/esm/motion/neon/config.d.ts.map +1 -0
  539. package/dist/esm/motion/neon/config.js +319 -0
  540. package/dist/esm/motion/neon/config.js.map +1 -0
  541. package/dist/esm/motion/neon/flicker.d.ts +82 -0
  542. package/dist/esm/motion/neon/flicker.d.ts.map +1 -0
  543. package/dist/esm/motion/neon/flicker.js +187 -0
  544. package/dist/esm/motion/neon/flicker.js.map +1 -0
  545. package/dist/esm/motion/neon/fonts.d.ts +29 -0
  546. package/dist/esm/motion/neon/fonts.d.ts.map +1 -0
  547. package/dist/esm/motion/neon/fonts.js +47 -0
  548. package/dist/esm/motion/neon/fonts.js.map +1 -0
  549. package/dist/esm/motion/neon/frame.d.ts +22 -0
  550. package/dist/esm/motion/neon/frame.d.ts.map +1 -0
  551. package/dist/esm/motion/neon/frame.js +20 -0
  552. package/dist/esm/motion/neon/frame.js.map +1 -0
  553. package/dist/esm/motion/neon/glitch.d.ts +64 -0
  554. package/dist/esm/motion/neon/glitch.d.ts.map +1 -0
  555. package/dist/esm/motion/neon/glitch.js +108 -0
  556. package/dist/esm/motion/neon/glitch.js.map +1 -0
  557. package/dist/esm/motion/neon/index.d.ts +29 -0
  558. package/dist/esm/motion/neon/index.d.ts.map +1 -0
  559. package/dist/esm/motion/neon/index.js +28 -0
  560. package/dist/esm/motion/neon/index.js.map +1 -0
  561. package/dist/esm/motion/neon/layers.d.ts +56 -0
  562. package/dist/esm/motion/neon/layers.d.ts.map +1 -0
  563. package/dist/esm/motion/neon/layers.js +64 -0
  564. package/dist/esm/motion/neon/layers.js.map +1 -0
  565. package/dist/esm/motion/neon/material.d.ts +68 -0
  566. package/dist/esm/motion/neon/material.d.ts.map +1 -0
  567. package/dist/esm/motion/neon/material.js +51 -0
  568. package/dist/esm/motion/neon/material.js.map +1 -0
  569. package/dist/esm/motion/neon/random.d.ts +15 -0
  570. package/dist/esm/motion/neon/random.d.ts.map +1 -0
  571. package/dist/esm/motion/neon/random.js +37 -0
  572. package/dist/esm/motion/neon/random.js.map +1 -0
  573. package/dist/esm/motion/neon/scene.d.ts +255 -0
  574. package/dist/esm/motion/neon/scene.d.ts.map +1 -0
  575. package/dist/esm/motion/neon/scene.js +532 -0
  576. package/dist/esm/motion/neon/scene.js.map +1 -0
  577. package/dist/esm/motion/neon/synth.d.ts +18 -0
  578. package/dist/esm/motion/neon/synth.d.ts.map +1 -0
  579. package/dist/esm/motion/neon/synth.js +208 -0
  580. package/dist/esm/motion/neon/synth.js.map +1 -0
  581. package/dist/esm/motion/neon/typography.d.ts +53 -0
  582. package/dist/esm/motion/neon/typography.d.ts.map +1 -0
  583. package/dist/esm/motion/neon/typography.js +74 -0
  584. package/dist/esm/motion/neon/typography.js.map +1 -0
  585. package/dist/esm/motion/neon/wall.d.ts +62 -0
  586. package/dist/esm/motion/neon/wall.d.ts.map +1 -0
  587. package/dist/esm/motion/neon/wall.js +106 -0
  588. package/dist/esm/motion/neon/wall.js.map +1 -0
  589. package/dist/esm/motion/paperfold/PaperFold.d.ts +36 -0
  590. package/dist/esm/motion/paperfold/PaperFold.d.ts.map +1 -0
  591. package/dist/esm/motion/paperfold/PaperFold.js +37 -0
  592. package/dist/esm/motion/paperfold/PaperFold.js.map +1 -0
  593. package/dist/esm/motion/paperfold/PaperFoldFrame.d.ts +39 -0
  594. package/dist/esm/motion/paperfold/PaperFoldFrame.d.ts.map +1 -0
  595. package/dist/esm/motion/paperfold/PaperFoldFrame.js +283 -0
  596. package/dist/esm/motion/paperfold/PaperFoldFrame.js.map +1 -0
  597. package/dist/esm/motion/paperfold/PaperFoldPlayer.d.ts +27 -0
  598. package/dist/esm/motion/paperfold/PaperFoldPlayer.d.ts.map +1 -0
  599. package/dist/esm/motion/paperfold/PaperFoldPlayer.js +56 -0
  600. package/dist/esm/motion/paperfold/PaperFoldPlayer.js.map +1 -0
  601. package/dist/esm/motion/paperfold/art.d.ts +148 -0
  602. package/dist/esm/motion/paperfold/art.d.ts.map +1 -0
  603. package/dist/esm/motion/paperfold/art.js +374 -0
  604. package/dist/esm/motion/paperfold/art.js.map +1 -0
  605. package/dist/esm/motion/paperfold/config.d.ts +47 -0
  606. package/dist/esm/motion/paperfold/config.d.ts.map +1 -0
  607. package/dist/esm/motion/paperfold/config.js +96 -0
  608. package/dist/esm/motion/paperfold/config.js.map +1 -0
  609. package/dist/esm/motion/paperfold/controls.d.ts +57 -0
  610. package/dist/esm/motion/paperfold/controls.d.ts.map +1 -0
  611. package/dist/esm/motion/paperfold/controls.js +506 -0
  612. package/dist/esm/motion/paperfold/controls.js.map +1 -0
  613. package/dist/esm/motion/paperfold/engine.d.ts +397 -0
  614. package/dist/esm/motion/paperfold/engine.d.ts.map +1 -0
  615. package/dist/esm/motion/paperfold/engine.js +699 -0
  616. package/dist/esm/motion/paperfold/engine.js.map +1 -0
  617. package/dist/esm/motion/paperfold/fonts.d.ts +3 -0
  618. package/dist/esm/motion/paperfold/fonts.d.ts.map +1 -0
  619. package/dist/esm/motion/paperfold/fonts.js +21 -0
  620. package/dist/esm/motion/paperfold/fonts.js.map +1 -0
  621. package/dist/esm/motion/paperfold/index.d.ts +17 -0
  622. package/dist/esm/motion/paperfold/index.d.ts.map +1 -0
  623. package/dist/esm/motion/paperfold/index.js +17 -0
  624. package/dist/esm/motion/paperfold/index.js.map +1 -0
  625. package/dist/esm/motion/paperfold/manipulate.d.ts +59 -0
  626. package/dist/esm/motion/paperfold/manipulate.d.ts.map +1 -0
  627. package/dist/esm/motion/paperfold/manipulate.js +161 -0
  628. package/dist/esm/motion/paperfold/manipulate.js.map +1 -0
  629. package/dist/esm/motion/paperfold/presets.d.ts +9 -0
  630. package/dist/esm/motion/paperfold/presets.d.ts.map +1 -0
  631. package/dist/esm/motion/paperfold/presets.js +115 -0
  632. package/dist/esm/motion/paperfold/presets.js.map +1 -0
  633. package/dist/esm/motion/paperfold/template.d.ts +3 -0
  634. package/dist/esm/motion/paperfold/template.d.ts.map +1 -0
  635. package/dist/esm/motion/paperfold/template.js +37 -0
  636. package/dist/esm/motion/paperfold/template.js.map +1 -0
  637. package/dist/esm/motion/player.d.ts +35 -0
  638. package/dist/esm/motion/player.d.ts.map +1 -0
  639. package/dist/esm/motion/player.js +197 -0
  640. package/dist/esm/motion/player.js.map +1 -0
  641. package/dist/esm/motion/promo/PromoFrame.d.ts +31 -0
  642. package/dist/esm/motion/promo/PromoFrame.d.ts.map +1 -0
  643. package/dist/esm/motion/promo/PromoFrame.js +288 -0
  644. package/dist/esm/motion/promo/PromoFrame.js.map +1 -0
  645. package/dist/esm/motion/promo/PromoShowcasePlayer.d.ts +25 -0
  646. package/dist/esm/motion/promo/PromoShowcasePlayer.d.ts.map +1 -0
  647. package/dist/esm/motion/promo/PromoShowcasePlayer.js +56 -0
  648. package/dist/esm/motion/promo/PromoShowcasePlayer.js.map +1 -0
  649. package/dist/esm/motion/promo/config.d.ts +91 -0
  650. package/dist/esm/motion/promo/config.d.ts.map +1 -0
  651. package/dist/esm/motion/promo/config.js +550 -0
  652. package/dist/esm/motion/promo/config.js.map +1 -0
  653. package/dist/esm/motion/promo/controls.d.ts +86 -0
  654. package/dist/esm/motion/promo/controls.d.ts.map +1 -0
  655. package/dist/esm/motion/promo/controls.js +567 -0
  656. package/dist/esm/motion/promo/controls.js.map +1 -0
  657. package/dist/esm/motion/promo/easing.d.ts +3 -0
  658. package/dist/esm/motion/promo/easing.d.ts.map +1 -0
  659. package/dist/esm/motion/promo/easing.js +32 -0
  660. package/dist/esm/motion/promo/easing.js.map +1 -0
  661. package/dist/esm/motion/promo/engine.d.ts +205 -0
  662. package/dist/esm/motion/promo/engine.d.ts.map +1 -0
  663. package/dist/esm/motion/promo/engine.js +551 -0
  664. package/dist/esm/motion/promo/engine.js.map +1 -0
  665. package/dist/esm/motion/promo/fonts.d.ts +7 -0
  666. package/dist/esm/motion/promo/fonts.d.ts.map +1 -0
  667. package/dist/esm/motion/promo/fonts.js +16 -0
  668. package/dist/esm/motion/promo/fonts.js.map +1 -0
  669. package/dist/esm/motion/promo/icons.d.ts +7 -0
  670. package/dist/esm/motion/promo/icons.d.ts.map +1 -0
  671. package/dist/esm/motion/promo/icons.js +26 -0
  672. package/dist/esm/motion/promo/icons.js.map +1 -0
  673. package/dist/esm/motion/promo/index.d.ts +15 -0
  674. package/dist/esm/motion/promo/index.d.ts.map +1 -0
  675. package/dist/esm/motion/promo/index.js +15 -0
  676. package/dist/esm/motion/promo/index.js.map +1 -0
  677. package/dist/esm/motion/promo/presets.d.ts +13 -0
  678. package/dist/esm/motion/promo/presets.d.ts.map +1 -0
  679. package/dist/esm/motion/promo/presets.js +40 -0
  680. package/dist/esm/motion/promo/presets.js.map +1 -0
  681. package/dist/esm/motion/promo/template.d.ts +8 -0
  682. package/dist/esm/motion/promo/template.d.ts.map +1 -0
  683. package/dist/esm/motion/promo/template.js +35 -0
  684. package/dist/esm/motion/promo/template.js.map +1 -0
  685. package/dist/esm/motion/replication2/Replication2Player.d.ts +26 -0
  686. package/dist/esm/motion/replication2/Replication2Player.d.ts.map +1 -0
  687. package/dist/esm/motion/replication2/Replication2Player.js +90 -0
  688. package/dist/esm/motion/replication2/Replication2Player.js.map +1 -0
  689. package/dist/esm/motion/replication2/config.d.ts +78 -0
  690. package/dist/esm/motion/replication2/config.d.ts.map +1 -0
  691. package/dist/esm/motion/replication2/config.js +341 -0
  692. package/dist/esm/motion/replication2/config.js.map +1 -0
  693. package/dist/esm/motion/replication2/controls.d.ts +70 -0
  694. package/dist/esm/motion/replication2/controls.d.ts.map +1 -0
  695. package/dist/esm/motion/replication2/controls.js +283 -0
  696. package/dist/esm/motion/replication2/controls.js.map +1 -0
  697. package/dist/esm/motion/replication2/driver.d.ts +23 -0
  698. package/dist/esm/motion/replication2/driver.d.ts.map +1 -0
  699. package/dist/esm/motion/replication2/driver.js +65 -0
  700. package/dist/esm/motion/replication2/driver.js.map +1 -0
  701. package/dist/esm/motion/replication2/easing.d.ts +19 -0
  702. package/dist/esm/motion/replication2/easing.d.ts.map +1 -0
  703. package/dist/esm/motion/replication2/easing.js +92 -0
  704. package/dist/esm/motion/replication2/easing.js.map +1 -0
  705. package/dist/esm/motion/replication2/engine.d.ts +236 -0
  706. package/dist/esm/motion/replication2/engine.d.ts.map +1 -0
  707. package/dist/esm/motion/replication2/engine.js +470 -0
  708. package/dist/esm/motion/replication2/engine.js.map +1 -0
  709. package/dist/esm/motion/replication2/html.d.ts +30 -0
  710. package/dist/esm/motion/replication2/html.d.ts.map +1 -0
  711. package/dist/esm/motion/replication2/html.js +83 -0
  712. package/dist/esm/motion/replication2/html.js.map +1 -0
  713. package/dist/esm/motion/replication2/index.d.ts +15 -0
  714. package/dist/esm/motion/replication2/index.d.ts.map +1 -0
  715. package/dist/esm/motion/replication2/index.js +15 -0
  716. package/dist/esm/motion/replication2/index.js.map +1 -0
  717. package/dist/esm/motion/replication2/measure.d.ts +3 -0
  718. package/dist/esm/motion/replication2/measure.d.ts.map +1 -0
  719. package/dist/esm/motion/replication2/measure.js +27 -0
  720. package/dist/esm/motion/replication2/measure.js.map +1 -0
  721. package/dist/esm/motion/replication2/metrics.d.ts +6 -0
  722. package/dist/esm/motion/replication2/metrics.d.ts.map +1 -0
  723. package/dist/esm/motion/replication2/metrics.js +7 -0
  724. package/dist/esm/motion/replication2/metrics.js.map +1 -0
  725. package/dist/esm/motion/replication2/presets.d.ts +13 -0
  726. package/dist/esm/motion/replication2/presets.d.ts.map +1 -0
  727. package/dist/esm/motion/replication2/presets.js +63 -0
  728. package/dist/esm/motion/replication2/presets.js.map +1 -0
  729. package/dist/esm/motion/replication2/riv.d.ts +3 -0
  730. package/dist/esm/motion/replication2/riv.d.ts.map +1 -0
  731. package/dist/esm/motion/replication2/riv.js +4 -0
  732. package/dist/esm/motion/replication2/riv.js.map +1 -0
  733. package/dist/esm/motion/replication2/rive-contract.d.ts +27 -0
  734. package/dist/esm/motion/replication2/rive-contract.d.ts.map +1 -0
  735. package/dist/esm/motion/replication2/rive-contract.js +153 -0
  736. package/dist/esm/motion/replication2/rive-contract.js.map +1 -0
  737. package/dist/esm/motion/replication2/template.d.ts +8 -0
  738. package/dist/esm/motion/replication2/template.d.ts.map +1 -0
  739. package/dist/esm/motion/replication2/template.js +32 -0
  740. package/dist/esm/motion/replication2/template.js.map +1 -0
  741. package/dist/esm/motion/sample.d.ts +61 -0
  742. package/dist/esm/motion/sample.d.ts.map +1 -0
  743. package/dist/esm/motion/sample.js +138 -0
  744. package/dist/esm/motion/sample.js.map +1 -0
  745. package/dist/esm/motion/templates/hey-template.d.ts +3 -0
  746. package/dist/esm/motion/templates/hey-template.d.ts.map +1 -0
  747. package/dist/esm/motion/templates/hey-template.js +1549 -0
  748. package/dist/esm/motion/templates/hey-template.js.map +1 -0
  749. package/dist/esm/motion/templates/index.d.ts +22 -0
  750. package/dist/esm/motion/templates/index.d.ts.map +1 -0
  751. package/dist/esm/motion/templates/index.js +15 -0
  752. package/dist/esm/motion/templates/index.js.map +1 -0
  753. package/dist/esm/motion/templates/word-motion.d.ts +3 -0
  754. package/dist/esm/motion/templates/word-motion.d.ts.map +1 -0
  755. package/dist/esm/motion/templates/word-motion.js +1162 -0
  756. package/dist/esm/motion/templates/word-motion.js.map +1 -0
  757. package/dist/esm/motion/types.d.ts +192 -0
  758. package/dist/esm/motion/types.d.ts.map +1 -0
  759. package/dist/esm/motion/types.js +2 -0
  760. package/dist/esm/motion/types.js.map +1 -0
  761. package/dist/esm/motion/typesurface/TypeSurfaceCanvas.d.ts +22 -0
  762. package/dist/esm/motion/typesurface/TypeSurfaceCanvas.d.ts.map +1 -0
  763. package/dist/esm/motion/typesurface/TypeSurfaceCanvas.js +58 -0
  764. package/dist/esm/motion/typesurface/TypeSurfaceCanvas.js.map +1 -0
  765. package/dist/esm/motion/typesurface/art.d.ts +21 -0
  766. package/dist/esm/motion/typesurface/art.d.ts.map +1 -0
  767. package/dist/esm/motion/typesurface/art.js +854 -0
  768. package/dist/esm/motion/typesurface/art.js.map +1 -0
  769. package/dist/esm/motion/typesurface/config.d.ts +273 -0
  770. package/dist/esm/motion/typesurface/config.d.ts.map +1 -0
  771. package/dist/esm/motion/typesurface/config.js +260 -0
  772. package/dist/esm/motion/typesurface/config.js.map +1 -0
  773. package/dist/esm/motion/typesurface/engine.d.ts +94 -0
  774. package/dist/esm/motion/typesurface/engine.d.ts.map +1 -0
  775. package/dist/esm/motion/typesurface/engine.js +603 -0
  776. package/dist/esm/motion/typesurface/engine.js.map +1 -0
  777. package/dist/esm/motion/typesurface/fonts.d.ts +25 -0
  778. package/dist/esm/motion/typesurface/fonts.d.ts.map +1 -0
  779. package/dist/esm/motion/typesurface/fonts.js +40 -0
  780. package/dist/esm/motion/typesurface/fonts.js.map +1 -0
  781. package/dist/esm/motion/typesurface/index.d.ts +17 -0
  782. package/dist/esm/motion/typesurface/index.d.ts.map +1 -0
  783. package/dist/esm/motion/typesurface/index.js +17 -0
  784. package/dist/esm/motion/typesurface/index.js.map +1 -0
  785. package/dist/esm/motion/typesurface/layout.d.ts +57 -0
  786. package/dist/esm/motion/typesurface/layout.d.ts.map +1 -0
  787. package/dist/esm/motion/typesurface/layout.js +122 -0
  788. package/dist/esm/motion/typesurface/layout.js.map +1 -0
  789. package/dist/esm/motion/typesurface/ops.d.ts +70 -0
  790. package/dist/esm/motion/typesurface/ops.d.ts.map +1 -0
  791. package/dist/esm/motion/typesurface/ops.js +164 -0
  792. package/dist/esm/motion/typesurface/ops.js.map +1 -0
  793. package/dist/esm/motion/typesurface/presets.d.ts +33 -0
  794. package/dist/esm/motion/typesurface/presets.d.ts.map +1 -0
  795. package/dist/esm/motion/typesurface/presets.js +185 -0
  796. package/dist/esm/motion/typesurface/presets.js.map +1 -0
  797. package/dist/esm/motion/typesurface/renderer.d.ts +78 -0
  798. package/dist/esm/motion/typesurface/renderer.d.ts.map +1 -0
  799. package/dist/esm/motion/typesurface/renderer.js +666 -0
  800. package/dist/esm/motion/typesurface/renderer.js.map +1 -0
  801. package/dist/esm/motion/typesurface/shaders.d.ts +17 -0
  802. package/dist/esm/motion/typesurface/shaders.d.ts.map +1 -0
  803. package/dist/esm/motion/typesurface/shaders.js +297 -0
  804. package/dist/esm/motion/typesurface/shaders.js.map +1 -0
  805. package/dist/esm/motion/typesurface/surfaces.d.ts +81 -0
  806. package/dist/esm/motion/typesurface/surfaces.d.ts.map +1 -0
  807. package/dist/esm/motion/typesurface/surfaces.js +149 -0
  808. package/dist/esm/motion/typesurface/surfaces.js.map +1 -0
  809. package/dist/esm/motion/typesurface/text.d.ts +17 -0
  810. package/dist/esm/motion/typesurface/text.d.ts.map +1 -0
  811. package/dist/esm/motion/typesurface/text.js +28 -0
  812. package/dist/esm/motion/typesurface/text.js.map +1 -0
  813. package/dist/esm/motion/typesurface/timeline.d.ts +15 -0
  814. package/dist/esm/motion/typesurface/timeline.d.ts.map +1 -0
  815. package/dist/esm/motion/typesurface/timeline.js +57 -0
  816. package/dist/esm/motion/typesurface/timeline.js.map +1 -0
  817. package/dist/esm/motion/validate.d.ts +22 -0
  818. package/dist/esm/motion/validate.d.ts.map +1 -0
  819. package/dist/esm/motion/validate.js +84 -0
  820. package/dist/esm/motion/validate.js.map +1 -0
  821. package/dist/esm/native/RiveReceiptStage.d.ts +25 -2
  822. package/dist/esm/native/RiveReceiptStage.d.ts.map +1 -1
  823. package/dist/esm/native/RiveReceiptStage.js +7 -148
  824. package/dist/esm/native/RiveReceiptStage.js.map +1 -1
  825. package/dist/esm/native/riveReceiptStageFactory.d.ts +26 -0
  826. package/dist/esm/native/riveReceiptStageFactory.d.ts.map +1 -0
  827. package/dist/esm/native/riveReceiptStageFactory.js +159 -0
  828. package/dist/esm/native/riveReceiptStageFactory.js.map +1 -0
  829. package/dist/esm/tokens/stage.d.ts +7 -0
  830. package/dist/esm/tokens/stage.d.ts.map +1 -0
  831. package/dist/esm/tokens/stage.js +7 -0
  832. package/dist/esm/tokens/stage.js.map +1 -0
  833. package/package.json +36 -1
  834. package/spec/examples/components/onboarding/animated-status/case1.json +42 -0
  835. package/spec/examples/components/onboarding/animated-status/case2.json +42 -0
  836. package/spec/examples/components/onboarding/animated-status/case3.json +42 -0
  837. package/spec/examples/components/onboarding/animated-status/case4.json +42 -0
  838. package/spec/examples/components/onboarding/animated-status/case5.json +42 -0
  839. package/spec/examples/components/onboarding/send-completion/case1.json +48 -0
  840. package/spec/examples/components/onboarding/send-completion/case2.json +48 -0
  841. package/spec/examples/components/onboarding/send-completion/case3.json +48 -0
  842. package/spec/examples/components/onboarding/send-completion/case4.json +48 -0
  843. package/spec/examples/components/onboarding/send-completion/case5.json +48 -0
  844. package/spec/families/onboarding.schema.json +610 -1
  845. package/src/agent/AgentComponent.tsx +1 -1
  846. package/src/agent/base.ts +17 -0
  847. package/src/agent/catalog.ts +0 -32
  848. package/src/agent/core.ts +6 -14
  849. package/src/agent/index.ts +6 -5
  850. package/src/agent/manifests.ts +83 -1
  851. package/src/agent/result.ts +6 -0
  852. package/src/agent/search/document.ts +46 -0
  853. package/src/agent/search/embedding.ts +95 -0
  854. package/src/agent/search/index.ts +20 -0
  855. package/src/agent/search/lexical.ts +25 -0
  856. package/src/agent/search/normalize.ts +17 -0
  857. package/src/agent/search/search.ts +148 -0
  858. package/src/agent/search/searchIndex.ts +107 -0
  859. package/src/agent/search/types.ts +68 -0
  860. package/src/agent/search/weights.ts +32 -0
  861. package/src/agent/types.ts +1 -1
  862. package/src/components/catalog.ts +21 -1
  863. package/src/components/onboarding/animated-status/AnimatedStage.tsx +18 -0
  864. package/src/components/onboarding/animated-status/AnimatedStage.types.ts +30 -0
  865. package/src/components/onboarding/animated-status/AnimatedStage.web.tsx +99 -0
  866. package/src/components/onboarding/animated-status/AnimatedStatusView.tsx +109 -0
  867. package/src/components/onboarding/animated-status/AnimatedStill.tsx +23 -0
  868. package/src/components/onboarding/animated-status/contract.ts +105 -0
  869. package/src/components/onboarding/animated-status/engine.ts +49 -0
  870. package/src/components/onboarding/animated-status/index.ts +8 -0
  871. package/src/components/onboarding/animated-status/presets.json +126 -0
  872. package/src/components/onboarding/animated-status/riv.ts +4 -0
  873. package/src/components/onboarding/index.ts +4 -0
  874. package/src/components/onboarding/presets.ts +6 -0
  875. package/src/components/onboarding/receipt-printer/ReceiptStage.tsx +46 -7
  876. package/src/components/onboarding/send-completion/SendCompletionView.tsx +164 -0
  877. package/src/components/onboarding/send-completion/SendStage.tsx +27 -0
  878. package/src/components/onboarding/send-completion/SendStage.types.ts +32 -0
  879. package/src/components/onboarding/send-completion/SendStage.web.tsx +116 -0
  880. package/src/components/onboarding/send-completion/SendStill.tsx +19 -0
  881. package/src/components/onboarding/send-completion/contract.ts +127 -0
  882. package/src/components/onboarding/send-completion/engine.ts +37 -0
  883. package/src/components/onboarding/send-completion/index.ts +10 -0
  884. package/src/components/onboarding/send-completion/presets.json +132 -0
  885. package/src/components/onboarding/send-completion/riv.ts +4 -0
  886. package/src/components/onboarding/shared/actions-data.ts +2 -0
  887. package/src/components/onboarding/shared/configColor.ts +72 -0
  888. package/src/components/onboarding/shared/contract.ts +4 -0
  889. package/src/components/onboarding/shared/describe.ts +1 -1
  890. package/src/components/onboarding/shared/mock.ts +2 -0
  891. package/src/components/onboarding/views.ts +8 -0
  892. package/src/index.ts +1 -1
  893. package/src/motion/MotionPlayer.tsx +62 -0
  894. package/src/motion/agent.ts +288 -0
  895. package/src/motion/cat/Cat.tsx +118 -0
  896. package/src/motion/cat/animation.ts +206 -0
  897. package/src/motion/cat/art.generated.ts +44 -0
  898. package/src/motion/cat/config.ts +186 -0
  899. package/src/motion/cat/index.ts +26 -0
  900. package/src/motion/cat/rig.ts +102 -0
  901. package/src/motion/cat/scene.ts +181 -0
  902. package/src/motion/configurable/config.ts +420 -0
  903. package/src/motion/configurable/controls.ts +93 -0
  904. package/src/motion/easing.ts +55 -0
  905. package/src/motion/fit.ts +8 -0
  906. package/src/motion/index.ts +29 -0
  907. package/src/motion/neon/GlowRenderer.tsx +83 -0
  908. package/src/motion/neon/NeonCanvas.tsx +175 -0
  909. package/src/motion/neon/NeonText.tsx +113 -0
  910. package/src/motion/neon/NeonTextFrame.tsx +67 -0
  911. package/src/motion/neon/artwork.ts +95 -0
  912. package/src/motion/neon/audio.ts +162 -0
  913. package/src/motion/neon/config.ts +484 -0
  914. package/src/motion/neon/flicker.ts +225 -0
  915. package/src/motion/neon/fonts.ts +76 -0
  916. package/src/motion/neon/frame.ts +34 -0
  917. package/src/motion/neon/glitch.ts +142 -0
  918. package/src/motion/neon/index.ts +41 -0
  919. package/src/motion/neon/layers.tsx +209 -0
  920. package/src/motion/neon/material.ts +88 -0
  921. package/src/motion/neon/random.ts +40 -0
  922. package/src/motion/neon/scene.ts +610 -0
  923. package/src/motion/neon/synth.ts +188 -0
  924. package/src/motion/neon/typography.ts +102 -0
  925. package/src/motion/neon/wall.ts +157 -0
  926. package/src/motion/paperfold/PaperFold.tsx +45 -0
  927. package/src/motion/paperfold/PaperFoldFrame.tsx +576 -0
  928. package/src/motion/paperfold/PaperFoldPlayer.tsx +80 -0
  929. package/src/motion/paperfold/art.ts +455 -0
  930. package/src/motion/paperfold/config.ts +98 -0
  931. package/src/motion/paperfold/controls.ts +557 -0
  932. package/src/motion/paperfold/engine.ts +852 -0
  933. package/src/motion/paperfold/fonts.ts +21 -0
  934. package/src/motion/paperfold/index.ts +30 -0
  935. package/src/motion/paperfold/manipulate.ts +188 -0
  936. package/src/motion/paperfold/presets.ts +117 -0
  937. package/src/motion/paperfold/template.ts +38 -0
  938. package/src/motion/player.ts +207 -0
  939. package/src/motion/promo/PromoFrame.tsx +501 -0
  940. package/src/motion/promo/PromoShowcasePlayer.tsx +78 -0
  941. package/src/motion/promo/config.ts +479 -0
  942. package/src/motion/promo/controls.ts +643 -0
  943. package/src/motion/promo/easing.ts +36 -0
  944. package/src/motion/promo/engine.ts +587 -0
  945. package/src/motion/promo/fonts.ts +16 -0
  946. package/src/motion/promo/icons.tsx +29 -0
  947. package/src/motion/promo/index.ts +24 -0
  948. package/src/motion/promo/presets.ts +40 -0
  949. package/src/motion/promo/template.ts +36 -0
  950. package/src/motion/replication2/Replication2Player.tsx +115 -0
  951. package/src/motion/replication2/config.ts +323 -0
  952. package/src/motion/replication2/controls.ts +336 -0
  953. package/src/motion/replication2/driver.ts +92 -0
  954. package/src/motion/replication2/easing.ts +88 -0
  955. package/src/motion/replication2/engine.ts +539 -0
  956. package/src/motion/replication2/html.ts +87 -0
  957. package/src/motion/replication2/index.ts +14 -0
  958. package/src/motion/replication2/measure.ts +28 -0
  959. package/src/motion/replication2/metrics.ts +7 -0
  960. package/src/motion/replication2/presets.ts +63 -0
  961. package/src/motion/replication2/riv.ts +4 -0
  962. package/src/motion/replication2/rive-contract.ts +165 -0
  963. package/src/motion/replication2/template.ts +33 -0
  964. package/src/motion/sample.ts +173 -0
  965. package/src/motion/templates/hey-template.ts +1553 -0
  966. package/src/motion/templates/index.ts +17 -0
  967. package/src/motion/templates/word-motion.ts +1166 -0
  968. package/src/motion/types.ts +162 -0
  969. package/src/motion/typesurface/TypeSurfaceCanvas.tsx +73 -0
  970. package/src/motion/typesurface/art.ts +639 -0
  971. package/src/motion/typesurface/config.ts +486 -0
  972. package/src/motion/typesurface/engine.ts +586 -0
  973. package/src/motion/typesurface/fonts.ts +63 -0
  974. package/src/motion/typesurface/index.ts +16 -0
  975. package/src/motion/typesurface/layout.ts +133 -0
  976. package/src/motion/typesurface/ops.ts +196 -0
  977. package/src/motion/typesurface/presets.ts +199 -0
  978. package/src/motion/typesurface/renderer.ts +579 -0
  979. package/src/motion/typesurface/shaders.ts +303 -0
  980. package/src/motion/typesurface/surfaces.ts +223 -0
  981. package/src/motion/typesurface/text.ts +35 -0
  982. package/src/motion/typesurface/timeline.ts +58 -0
  983. package/src/motion/validate.ts +101 -0
  984. package/src/native/RiveReceiptStage.tsx +8 -155
  985. package/src/native/riveReceiptStageFactory.tsx +175 -0
  986. package/src/tokens/stage.ts +6 -0
  987. package/tools/ask/dist/components.mjs +7221 -44
  988. package/tools/ask/mcp.mjs +80 -1
@@ -0,0 +1,699 @@
1
+ import { getPath, phaseSpans } from './config';
2
+ import { LAYOUT_FOR, PANELS, PHASES } from './controls';
3
+ import { ease } from '../promo/easing';
4
+ import { mixHex, rgba, seeded } from '../promo/engine';
5
+ /**
6
+ * **The paper-fold engine — a pure function from (config, frame, size) to everything on screen.** No
7
+ * clock, no unseeded randomness, no DOM: the same config, seed and frame always give the same state, so
8
+ * Remotion can render frames in any order and in parallel, and the live player and the video agree.
9
+ * The renderer (`PaperFoldFrame`) only draws what this returns.
10
+ *
11
+ * **The fold model.** The sheet is three rigid panels hinged at two creases — a kinematic chain. A
12
+ * fold is a rotation about its crease line (y = crease, z = 0 in the sheet's own frame) by the crease's
13
+ * dihedral angle; the panel on the moving side (`direction`) turns with it, the panel that stays put
14
+ * (the anchor) does not, and a panel beyond a moving panel is carried along. Each panel's full pose is
15
+ * a 4×4 matrix: sheet pose · hinge rotations · the camera's perspective. The renderer hands that
16
+ * matrix to CSS `matrix3d`, so the panel — its colour, texture and live text — is drawn in true
17
+ * perspective, turning about the exact crease line. Nothing is scaled to fake a fold.
18
+ *
19
+ * Depth is explicit: panels are painted back to front by the depth of their centres, and each hand's
20
+ * body and gripping finger are slotted in relative to the panel they hold. Lighting is Lambertian on
21
+ * each panel's normal; a closing crease darkens its valley and shades the panel it closes over.
22
+ *
23
+ * Frames here are authored 60 fps motion frames; `outputFrameToMotion` maps an output frame (at
24
+ * canvas.fps, after motion.speed) onto them.
25
+ */
26
+ export const MOTION_FPS = 60;
27
+ export { mixHex, rgba, seeded };
28
+ const clamp = (v, lo = 0, hi = 1) => (v < lo ? lo : v > hi ? hi : v);
29
+ const lerp = (a, b, t) => a + (b - a) * t;
30
+ const RAD = Math.PI / 180;
31
+ const TAU = Math.PI * 2;
32
+ function reader(cfg) {
33
+ return {
34
+ n: (p) => getPath(cfg, p),
35
+ s: (p) => getPath(cfg, p),
36
+ b: (p) => getPath(cfg, p),
37
+ list: (p) => getPath(cfg, p) ?? [],
38
+ };
39
+ }
40
+ const I = () => [1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1];
41
+ export function mul(a, b) {
42
+ const o = new Array(16);
43
+ for (let r = 0; r < 4; r++)
44
+ for (let c = 0; c < 4; c++) {
45
+ o[r * 4 + c] = a[r * 4] * b[c] + a[r * 4 + 1] * b[4 + c] + a[r * 4 + 2] * b[8 + c] + a[r * 4 + 3] * b[12 + c];
46
+ }
47
+ return o;
48
+ }
49
+ const chain = (...ms) => ms.reduce((acc, m) => mul(acc, m), I());
50
+ const translate = (x, y, z = 0) => [1, 0, 0, x, 0, 1, 0, y, 0, 0, 1, z, 0, 0, 0, 1];
51
+ const scale3 = (x, y) => [x, 0, 0, 0, 0, y, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1];
52
+ /** About the x axis. With y down and z toward the viewer, a positive turn brings a point below the axis toward the viewer. */
53
+ const rotX = (a) => { const c = Math.cos(a), s = Math.sin(a); return [1, 0, 0, 0, 0, c, -s, 0, 0, s, c, 0, 0, 0, 0, 1]; };
54
+ const rotY = (a) => { const c = Math.cos(a), s = Math.sin(a); return [c, 0, s, 0, 0, 1, 0, 0, -s, 0, c, 0, 0, 0, 0, 1]; };
55
+ /** In the picture plane; positive is clockwise on screen (as CSS rotate). */
56
+ const rotZ = (a) => { const c = Math.cos(a), s = Math.sin(a); return [c, -s, 0, 0, s, c, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1]; };
57
+ const skew = (ax, ay) => [1, Math.tan(ax), 0, 0, Math.tan(ay), 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1];
58
+ /** A viewer at distance d on the z axis, looking at (vx, vy): w = 1 − z/d (CSS perspective). */
59
+ const perspectiveAt = (vx, vy, d) => chain(translate(vx, vy), [1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, -1 / d, 1], translate(-vx, -vy));
60
+ /** A turn of `a` radians about the horizontal line y = yc (z = 0): the hinge of a crease. */
61
+ const hinge = (yc, a) => chain(translate(0, yc), rotX(a), translate(0, -yc));
62
+ export function apply(m, p) {
63
+ const [x, y, z] = p;
64
+ return [
65
+ m[0] * x + m[1] * y + m[2] * z + m[3], m[4] * x + m[5] * y + m[6] * z + m[7],
66
+ m[8] * x + m[9] * y + m[10] * z + m[11], m[12] * x + m[13] * y + m[14] * z + m[15],
67
+ ];
68
+ }
69
+ /** A point through a projective matrix, onto the picture. */
70
+ export function project(m, p) {
71
+ const [x, y, , w] = apply(m, p);
72
+ const ww = Math.max(w, 1e-3);
73
+ return [x / ww, y / ww];
74
+ }
75
+ const r4 = (v) => Math.round(v * 1e4) / 1e4;
76
+ /** CSS `matrix3d(...)` (column-major) of a row-major matrix. */
77
+ export function cssMatrix(m) {
78
+ const o = [];
79
+ for (let c = 0; c < 4; c++)
80
+ for (let r = 0; r < 4; r++)
81
+ o.push(m[r * 4 + c]);
82
+ // The perspective row (w) is tiny (≈ 1/distance): keep it at full precision, never in exponent form.
83
+ return `matrix3d(${o.map((v, i) => (i === 3 || i === 7 || i === 11 ? v.toFixed(12) : String(r4(v)))).join(', ')})`;
84
+ }
85
+ const cross = (a, b) => [a[1] * b[2] - a[2] * b[1], a[2] * b[0] - a[0] * b[2], a[0] * b[1] - a[1] * b[0]];
86
+ const norm3 = (v) => { const l = Math.hypot(v[0], v[1], v[2]) || 1; return [v[0] / l, v[1] / l, v[2] / l]; };
87
+ const dot3 = (a, b) => a[0] * b[0] + a[1] * b[1] + a[2] * b[2];
88
+ const linear = (m, v) => [m[0] * v[0] + m[1] * v[1] + m[2] * v[2], m[4] * v[0] + m[5] * v[1] + m[6] * v[2], m[8] * v[0] + m[9] * v[1] + m[10] * v[2]];
89
+ export function timeline(cfg) {
90
+ const { n, s } = reader(cfg);
91
+ const order = phaseSpans(cfg).map((p) => ({ id: p.id, label: p.label, start: p.start, end: p.end }));
92
+ const phases = Object.fromEntries(order.map((p) => [p.id, p]));
93
+ const end = Math.max(...order.map((p) => p.end));
94
+ const speed = n('motion.speed');
95
+ // `length` is in authored frames: the part of the timeline the video shows.
96
+ const length = s('canvas.durationMode') === 'fixed' ? (n('canvas.durationFrames') * MOTION_FPS * speed) / n('canvas.fps') : end;
97
+ return { phases, order, end, length, speed };
98
+ }
99
+ /** Output frames for one play of the video at canvas.fps. */
100
+ export function outputDuration(cfg) {
101
+ const { n, s } = reader(cfg);
102
+ if (s('canvas.durationMode') === 'fixed')
103
+ return n('canvas.durationFrames');
104
+ return Math.max(1, Math.round(((timeline(cfg).end / n('motion.speed')) * n('canvas.fps')) / MOTION_FPS));
105
+ }
106
+ /** The authored motion frame an output frame shows. */
107
+ export function outputFrameToMotion(cfg, frame) {
108
+ return (frame * MOTION_FPS * getPath(cfg, 'motion.speed')) / getPath(cfg, 'canvas.fps');
109
+ }
110
+ /** The output frame that shows an authored motion frame (the inverse of outputFrameToMotion, rounded). */
111
+ export function motionToOutputFrame(cfg, motion) {
112
+ return Math.round((motion * getPath(cfg, 'canvas.fps')) / (MOTION_FPS * getPath(cfg, 'motion.speed')));
113
+ }
114
+ /** The phase playing at motion frame `t` (the last phase that has started), and how far into it. */
115
+ export function phaseAt(tl, t) {
116
+ let cur = tl.order[0];
117
+ for (const p of tl.order)
118
+ if (t >= p.start && p.end > p.start)
119
+ cur = p;
120
+ return { id: cur.id, label: cur.label, progress: cur.end > cur.start ? clamp((t - cur.start) / (cur.end - cur.start)) : 1 };
121
+ }
122
+ /** Representative motion frames of the seven stages (the render tests and the reference comparison use them). */
123
+ export function stageFrames(cfg) {
124
+ const { phases: p, end } = timeline(cfg);
125
+ const mid = (id) => (p[id].start + p[id].end) / 2;
126
+ const at = (id, f) => p[id].start + (p[id].end - p[id].start) * f;
127
+ return {
128
+ OPEN: p.topFold.start - 1 > 0 ? p.topFold.start - 1 : 0,
129
+ TOP_FOLD: mid('topFold'),
130
+ TOP_FOLD_BEGIN: p.topFold.start + (p.topFold.end - p.topFold.start) * 0.2,
131
+ TOP_FOLD_DEEPEST: p.topFold.end,
132
+ BOTTOM_FOLD: mid('bottomFold'),
133
+ BOTTOM_FOLD_BEGIN: p.bottomFold.start + (p.bottomFold.end - p.bottomFold.start) * 0.2,
134
+ FOLDED_HOLD: mid('foldedHold'),
135
+ BOTTOM_UNFOLD: mid('bottomUnfold'),
136
+ UNFOLD_BEGIN: p.bottomUnfold.start + (p.bottomUnfold.end - p.bottomUnfold.start) * 0.2,
137
+ TOP_UNFOLD: mid('topUnfold'),
138
+ FINAL_OPEN: Math.max(0, end - 1),
139
+ // The quality-check set: fractions of the top fold, the peaks, halfway through the whole unfold.
140
+ TOP_FOLD_25: at('topFold', 0.25),
141
+ TOP_FOLD_75: at('topFold', 0.75),
142
+ TOP_FOLD_PEAK: p.topFold.end,
143
+ BOTTOM_FOLD_PEAK: p.bottomFold.end,
144
+ FULLY_FOLDED: mid('foldedHold'),
145
+ UNFOLD_50: (p.bottomUnfold.start + p.topUnfold.end) / 2,
146
+ };
147
+ }
148
+ /** The edge lift over a fold's progress `p` (0‥1, linear): it rises first and is flat again by 75%. */
149
+ const liftAt = (f, p) => f.edgeLift * Math.max(0, Math.sin(Math.PI * clamp(p / 0.75)));
150
+ /**
151
+ * The folds posed by FOLD PROGRESS (motion.foldProgress, 0‥1) instead of the timeline: the first half
152
+ * folds the top crease from flat (0°) to its peak, the second half the bottom crease; a single enabled
153
+ * fold takes the whole range. 0 is the paper completely flat, 1 completely folded.
154
+ */
155
+ export function manualFolds(folds, progress) {
156
+ const on = folds.map((f) => f.enabled);
157
+ const both = on[0] && on[1];
158
+ return folds.map((f, k) => {
159
+ const sigma = f.side === 'inward' ? 1 : -1;
160
+ const a = !f.enabled ? 0 : both ? clamp(progress * 2 - k) : clamp(progress);
161
+ const e = ease(f.easing, a, f.durationFrames);
162
+ const angle = lerp(0, f.peakAngle, e);
163
+ return {
164
+ id: f.id, angle, dihedral: sigma * angle, amount: e, activity: 0, phase: 'manual',
165
+ scale: lerp(1, f.peakScale, e), perspective: lerp(1, f.perspective, e), tx: f.translationX * e, ty: f.translationY * e, rz: f.rotationZ * e,
166
+ lift: liftAt(f, a),
167
+ };
168
+ });
169
+ }
170
+ export function foldState(f, foldSpan, unfoldSpan, t) {
171
+ const sigma = f.side === 'inward' ? 1 : -1;
172
+ if (!f.enabled)
173
+ return { id: f.id, angle: f.startAngle, dihedral: sigma * f.startAngle, amount: 0, activity: 0, phase: 'off', scale: 1, perspective: 1, tx: 0, ty: 0, rz: 0, lift: 0 };
174
+ const pf = clamp((t - foldSpan.start) / Math.max(1e-6, foldSpan.end - foldSpan.start));
175
+ const pu = clamp((t - unfoldSpan.start) / Math.max(1e-6, unfoldSpan.end - unfoldSpan.start));
176
+ const ef = ease(f.easing, pf, f.durationFrames), eu = ease(f.unfoldEasing, pu, f.unfoldDurationFrames);
177
+ const unfolding = t >= unfoldSpan.start;
178
+ let angle, amount, sc;
179
+ if (!unfolding) {
180
+ angle = lerp(f.startAngle, f.peakAngle, ef);
181
+ amount = ef;
182
+ sc = lerp(f.startScale, f.peakScale, ef);
183
+ }
184
+ else {
185
+ angle = lerp(f.peakAngle, f.endAngle, eu);
186
+ amount = f.peakAngle === f.startAngle ? 1 - eu : clamp((angle - f.startAngle) / (f.peakAngle - f.startAngle), -0.5, 1.5);
187
+ sc = lerp(f.peakScale, f.endScale, eu);
188
+ }
189
+ angle = clamp(angle, -110, 180);
190
+ const moving = (!unfolding && pf > 0 && pf < 1) ? Math.sin(Math.PI * pf) : (unfolding && pu > 0 && pu < 1) ? Math.sin(Math.PI * pu) : 0;
191
+ const phase = t < foldSpan.start ? 'before' : pf < 1 ? 'folding' : !unfolding ? 'folded' : pu < 1 ? 'unfolding' : 'after';
192
+ return {
193
+ id: f.id, angle, dihedral: sigma * angle, amount, activity: moving, phase,
194
+ scale: sc, perspective: lerp(1, f.perspective, clamp(amount, 0, 1.2)), tx: f.translationX * amount, ty: f.translationY * amount, rz: f.rotationZ * amount,
195
+ // The gripped edge lifts ahead of the fold (linear progress, so it leads the eased turn), and again as it unfolds.
196
+ lift: !unfolding ? (pf > 0 && pf < 1 ? liftAt(f, pf) : 0) : (pu > 0 && pu < 1 ? liftAt(f, 1 - pu) : 0),
197
+ };
198
+ }
199
+ export function layout(cfg, width, height) {
200
+ const { n, s } = reader(cfg);
201
+ const shape = LAYOUT_FOR[s('canvas.aspectRatio')] ?? 'portrait';
202
+ const L = `layout.${shape}`;
203
+ const unit = Math.min(width, height) / 1080;
204
+ const PH = n(`${L}.paper.height`) * height;
205
+ const PW = PH * n('paper.aspect');
206
+ const c0 = n('creases.0.position') * PH, c1 = n('creases.1.position') * PH;
207
+ const safe = n('canvas.safeArea') * Math.min(width, height);
208
+ const inside = (v, size) => clamp(v, safe / size, 1 - safe / size);
209
+ return {
210
+ width, height, unit, pu: PW / 1000, shape,
211
+ paper: { width: PW, height: PH, pivotX: n(`${L}.paper.x`) * width, pivotY: n(`${L}.paper.y`) * height },
212
+ creases: [c0, c1],
213
+ panels: { top: { y0: 0, y1: c0, height: c0 }, middle: { y0: c0, y1: c1, height: c1 - c0 }, bottom: { y0: c1, y1: PH, height: PH - c1 } },
214
+ logo: { x: inside(n(`${L}.logo.x`), width) * width, y: inside(n(`${L}.logo.y`), height) * height, scale: n(`${L}.logo.scale`) },
215
+ cta: { x: inside(n(`${L}.cta.x`), width) * width, y: inside(n(`${L}.cta.y`), height) * height, scale: n(`${L}.cta.scale`) },
216
+ backgroundType: { scale: n(`${L}.backgroundType.scale`), x: n(`${L}.backgroundType.x`) * unit, y: n(`${L}.backgroundType.y`) * unit },
217
+ handScale: n(`${L}.handScale`),
218
+ };
219
+ }
220
+ /** The panel that stays put, from the two folds' directions (the validator refuses the one impossible pair). */
221
+ export function anchorOf(folds) {
222
+ const [top, bottom] = folds;
223
+ if (top.enabled && top.direction === 'up')
224
+ return 'top';
225
+ if (bottom.enabled && bottom.direction === 'down')
226
+ return 'bottom';
227
+ return 'middle';
228
+ }
229
+ /** Which folds move a panel relative to the anchor (the hinges between them). */
230
+ export function moversOf(anchor, panel) {
231
+ const idx = { top: 0, middle: 1, bottom: 2 };
232
+ const a = idx[anchor], p = idx[panel];
233
+ const out = [];
234
+ for (let k = Math.min(a, p); k < Math.max(a, p); k++)
235
+ out.push(k);
236
+ return out;
237
+ }
238
+ /** How many hinges a curved crease is spread over (its bend is drawn as that many narrow strips). */
239
+ export const BEND_SEGMENTS = 6;
240
+ /** The widest bend band, as a fraction of the shorter panel beside the crease (at curvature 1). */
241
+ const MAX_BEND = 0.22;
242
+ /** Hinges near the sheet's free edges that curl the gripped edge (EDGE_LIFT_SEGMENTS per edge). */
243
+ export const EDGE_LIFT_SEGMENTS = 4;
244
+ function buildSheet(cfg, lay, dihedrals, curvatures, perspectiveFactor, extra, anchor, lift = { top: 0, bottom: 0, topSize: 0, bottomSize: 0 }) {
245
+ const { n } = reader(cfg);
246
+ const { width: PW, height: PH, pivotX, pivotY } = lay.paper;
247
+ const u = lay.unit;
248
+ const sc = n('paper.scale') * extra.scale;
249
+ const S = chain(translate(pivotX + (n('paper.translateX') + extra.tx) * u, pivotY + (n('paper.translateY') + extra.ty) * u), rotZ((n('paper.rotationZ') + extra.rz) * RAD), rotY(n('paper.rotationY') * RAD), rotX(n('paper.rotationX') * RAD), skew(n('paper.skewX') * RAD, n('paper.skewY') * RAD), scale3(n('paper.scaleX') * sc, n('paper.scaleY') * sc), translate(-n('paper.originX') * PW, -n('paper.originY') * PH));
250
+ // Hinges: a sharp crease is one hinge carrying the whole dihedral; a curved one spreads it evenly
251
+ // over BEND_SEGMENTS hinges across a band centred on the crease — a bend, not a card rotation.
252
+ const hinges = [];
253
+ const bands = [0, 1].map((k) => {
254
+ const yc = lay.creases[k];
255
+ const beside = Math.min(k === 0 ? lay.panels.top.height : lay.panels.middle.height, k === 0 ? lay.panels.middle.height : lay.panels.bottom.height);
256
+ const L = curvatures[k] * MAX_BEND * beside;
257
+ if (L < 0.5) {
258
+ hinges.push({ y: yc, a: dihedrals[k] });
259
+ return [yc, yc];
260
+ }
261
+ for (let i = 0; i < BEND_SEGMENTS; i++)
262
+ hinges.push({ y: yc - L / 2 + ((i + 0.5) * L) / BEND_SEGMENTS, a: dihedrals[k] / BEND_SEGMENTS });
263
+ return [yc - L / 2, yc + L / 2];
264
+ });
265
+ // The lift curl: a few hinges across a band at a free edge, sharing its lift angle, so that edge rolls up.
266
+ const liftHinges = [];
267
+ if (lift.topSize > 0)
268
+ for (let i = 0; i < EDGE_LIFT_SEGMENTS; i++)
269
+ liftHinges.push({ y: ((i + 1) / (EDGE_LIFT_SEGMENTS + 1)) * lift.topSize * lay.panels.top.height, a: lift.top / EDGE_LIFT_SEGMENTS });
270
+ if (lift.bottomSize > 0)
271
+ for (let i = 0; i < EDGE_LIFT_SEGMENTS; i++)
272
+ liftHinges.push({ y: PH - ((EDGE_LIFT_SEGMENTS - i) / (EDGE_LIFT_SEGMENTS + 1)) * lift.bottomSize * lay.panels.bottom.height, a: lift.bottom / EDGE_LIFT_SEGMENTS });
273
+ hinges.push(...liftHinges);
274
+ hinges.sort((a, b) => a.y - b.y);
275
+ const liftTop = lift.topSize > 0 ? lift.topSize * lay.panels.top.height : -1, liftBottom = lift.bottomSize > 0 ? PH - lift.bottomSize * lay.panels.bottom.height : PH + 1;
276
+ const edges = [0, ...hinges.map((h) => h.y), PH];
277
+ const regionOf = (mid) => mid < bands[0][0] ? 'top' : mid < bands[0][1] ? 'crease0' : mid < bands[1][0] ? 'middle' : mid < bands[1][1] ? 'crease1' : 'bottom';
278
+ const strips = edges.slice(0, -1).map((y0, i) => {
279
+ const y1 = edges[i + 1], mid = (y0 + y1) / 2;
280
+ return { index: i, y0, y1, region: regionOf(mid), T: I(), ...(mid < liftTop || mid > liftBottom ? { lift: true } : {}) };
281
+ });
282
+ // Walk the chain outward from the anchored panel's flat part: below a hinge the next strip turns by
283
+ // the hinge's angle about the hinge line; above it, by the inverse.
284
+ const flatOf = (id) => strips.reduce((best, st, i) => (st.region === id && !st.lift && (best < 0 || st.y1 - st.y0 > strips[best].y1 - strips[best].y0) ? i : best), -1);
285
+ const a = flatOf(anchor);
286
+ for (let i = a + 1; i < strips.length; i++)
287
+ strips[i].T = mul(strips[i - 1].T, hinge(hinges[i - 1].y, hinges[i - 1].a * RAD));
288
+ for (let i = a - 1; i >= 0; i--)
289
+ strips[i].T = mul(strips[i + 1].T, hinge(hinges[i].y, -hinges[i].a * RAD));
290
+ const T = Object.fromEntries(PANELS.map((id) => [id, strips[flatOf(id)].T]));
291
+ const [vx, vy] = project(S, [n('camera.vanishX') * PW, n('camera.vanishY') * PH, 0]);
292
+ const P = perspectiveAt(vx, vy, (n('camera.perspective') * u) / perspectiveFactor);
293
+ return { anchor, S, strips, T, bands, P };
294
+ }
295
+ /** The strip that carries sheet height `y` (px). */
296
+ export function stripAt(sheet, y) {
297
+ return sheet.strips.find((st) => y >= st.y0 && y <= st.y1) ?? (y < 0 ? sheet.strips[0] : sheet.strips.at(-1));
298
+ }
299
+ /* ─── lighting ────────────────────────────────────────────────────────────────────────────────── */
300
+ function lightVector(cfg) {
301
+ const { n } = reader(cfg);
302
+ const az = n('foldLighting.lightAngle') * RAD, el = n('foldLighting.lightElevation') * RAD;
303
+ return norm3([Math.cos(el) * Math.cos(az), Math.cos(el) * Math.sin(az), Math.sin(el)]);
304
+ }
305
+ /** Everything the frame needs from the fold state at motion frame t (no hands). */
306
+ function sheetAt(cfg, lay, tl, t) {
307
+ const { n, s, b, list } = reader(cfg);
308
+ const foldsCfg = list('folds');
309
+ const manual = s('motion.progressMode') === 'manual';
310
+ const folds = manual
311
+ ? manualFolds(foldsCfg, n('motion.foldProgress'))
312
+ : foldsCfg.map((f, k) => foldState(f, tl.phases[k === 0 ? 'topFold' : 'bottomFold'], tl.phases[k === 0 ? 'topUnfold' : 'bottomUnfold'], t));
313
+ const anchor = anchorOf(foldsCfg);
314
+ // Idle sway and bob; the intro rise.
315
+ const rnd = seeded(n('canvas.seed'));
316
+ const ph1 = rnd() * TAU, ph2 = rnd() * TAU;
317
+ const sec = t / MOTION_FPS;
318
+ const idle = b('motion.idle.enabled');
319
+ const swayRz = idle ? n('motion.idle.swayAngle') * Math.sin(TAU * n('motion.idle.frequency') * sec + ph1) : 0;
320
+ const bob = idle ? n('motion.idle.bobAmplitude') * Math.sin(TAU * n('motion.idle.frequency') * 1.31 * sec + ph2) : 0;
321
+ const intro = tl.phases.intro;
322
+ const eIntro = ease(s('timeline.intro.easing'), (t - intro.start) / Math.max(1, intro.end - intro.start), intro.end - intro.start);
323
+ const rise = s('motion.intro.mode') === 'rise' ? 1 - eIntro : 0;
324
+ const hold = tl.phases.foldedHold;
325
+ const pHold = hold.end > hold.start ? clamp((t - hold.start) / (hold.end - hold.start)) : 0;
326
+ const squeeze = lerp(1, n('motion.holdSqueeze'), Math.sin(Math.PI * ease(s('timeline.foldedHold.easing'), pHold, hold.end - hold.start)));
327
+ const base = { tx: 0, ty: bob + n('motion.intro.paperOffsetY') * rise, rz: swayRz + n('motion.intro.paperRotation') * rise, scale: 1 };
328
+ const withFolds = {
329
+ tx: base.tx + folds.reduce((a, f) => a + f.tx, 0),
330
+ ty: base.ty + folds.reduce((a, f) => a + f.ty, 0),
331
+ rz: base.rz + folds.reduce((a, f) => a + f.rz, 0),
332
+ scale: folds.reduce((a, f) => a * f.scale, 1) * squeeze,
333
+ };
334
+ const persp = folds.reduce((a, f) => a * f.perspective, 1);
335
+ const curv = foldsCfg.map((f) => f.curvature);
336
+ // The free edge each fold swings (down: the sheet's top edge; up: its bottom edge) lifts ahead of it.
337
+ const lift = { top: 0, bottom: 0, topSize: 0, bottomSize: 0 };
338
+ foldsCfg.forEach((f, k) => {
339
+ if (!f.enabled || f.edgeLift <= 0)
340
+ return;
341
+ const sign = f.side === 'inward' ? 1 : -1;
342
+ if (f.direction === 'down') {
343
+ lift.top += sign * folds[k].lift;
344
+ lift.topSize = Math.max(lift.topSize, f.edgeLiftSize);
345
+ }
346
+ else {
347
+ lift.bottom += sign * folds[k].lift;
348
+ lift.bottomSize = Math.max(lift.bottomSize, f.edgeLiftSize);
349
+ }
350
+ });
351
+ const sheet = buildSheet(cfg, lay, [folds[0].dihedral, folds[1].dihedral], curv, persp, withFolds, anchor, lift);
352
+ // The same sheet with every crease at its start angle and no fold-driven motion: where the hands rest.
353
+ const restDihedrals = foldsCfg.map((f) => (f.side === 'inward' ? 1 : -1) * f.startAngle);
354
+ const rest = buildSheet(cfg, lay, restDihedrals, curv, 1, base, anchor, { ...lift, top: 0, bottom: 0 });
355
+ return { folds, anchor, sheet, rest, foldsCfg, manual };
356
+ }
357
+ function panelOf(cfg, gy) {
358
+ const c0 = getPath(cfg, 'creases.0.position'), c1 = getPath(cfg, 'creases.1.position');
359
+ return gy < c0 ? 'top' : gy < c1 ? 'middle' : 'bottom';
360
+ }
361
+ /** Where a paper point is on the picture, and the paper's local direction and scale there. */
362
+ function gripOn(sheet, lay, _panel, gx, gy) {
363
+ const q = [gx * lay.paper.width, gy * lay.paper.height, 0];
364
+ const M = chain(sheet.P, sheet.S, stripAt(sheet, q[1]).T);
365
+ const g = project(M, q);
366
+ const e = project(M, [q[0] + 10, q[1], 0]);
367
+ return { x: g[0], y: g[1], angle: Math.atan2(e[1] - g[1], e[0] - g[0]) / RAD, scale: Math.hypot(e[0] - g[0], e[1] - g[1]) / 10 };
368
+ }
369
+ /** The pose a hand is pulled toward at motion frame t (before its settle spring). */
370
+ function handTarget(cfg, lay, tl, id, t) {
371
+ const { n, s } = reader(cfg);
372
+ const H = `hands.${id}`, HI = `handInteraction.${id}`;
373
+ const lead = n(`${HI}.leadFrames`);
374
+ const gx = n(`${H}.x`), gy = n(`${H}.y`);
375
+ const panel = panelOf(cfg, gy);
376
+ const at = sheetAt(cfg, lay, tl, t + lead);
377
+ const now = gripOn(at.sheet, lay, panel, gx, gy);
378
+ const rest = gripOn(at.rest, lay, panel, gx, gy);
379
+ const follow = n(`${HI}.followStrength`);
380
+ const movers = moversOf(at.anchor, panel);
381
+ const own = movers.map((k) => at.folds[k]);
382
+ const amount = own.reduce((a, f) => Math.max(a, clamp(f.amount)), 0);
383
+ const tugActivity = own.reduce((a, f) => Math.max(a, f.activity), 0);
384
+ const anyActivity = at.folds.reduce((a, f) => Math.max(a, f.activity), 0);
385
+ const bx = rest.x + follow * (now.x - rest.x), by = rest.y + follow * (now.y - rest.y);
386
+ let x = bx, y = by;
387
+ // The tug: the hand pulls ahead along the way its grip point is travelling.
388
+ if (tugActivity > 0) {
389
+ const ahead = gripOn(sheetAt(cfg, lay, tl, t + lead + 2).sheet, lay, panel, gx, gy);
390
+ const dx = ahead.x - now.x, dy = ahead.y - now.y, len = Math.hypot(dx, dy);
391
+ if (len > 1e-3) {
392
+ x += (dx / len) * n(`${HI}.gripOffset`) * lay.pu * tugActivity;
393
+ y += (dy / len) * n(`${HI}.gripOffset`) * lay.pu * tugActivity;
394
+ }
395
+ }
396
+ // Bracing: while any fold moves, the hand leans toward the sheet's centre.
397
+ if (anyActivity > 0) {
398
+ const c = project(chain(at.sheet.P, at.sheet.S), [lay.paper.width / 2, lay.paper.height / 2, 0]);
399
+ const dx = c[0] - rest.x, dy = c[1] - rest.y, len = Math.hypot(dx, dy) || 1;
400
+ x += (dx / len) * n(`${HI}.movementAmplitude`) * lay.pu * anyActivity;
401
+ y += (dy / len) * n(`${HI}.movementAmplitude`) * lay.pu * anyActivity;
402
+ }
403
+ // The approach from off the paper (none in manual mode: the hands already hold it).
404
+ if (s('motion.intro.mode') === 'hands' && s('motion.progressMode') !== 'manual') {
405
+ const intro = tl.phases.intro, delay = n(`${HI}.enterDelayFrames`);
406
+ const dur = Math.max(1, intro.end - intro.start - delay);
407
+ const e = ease(s('timeline.intro.easing'), (t - intro.start - delay) / dur, dur);
408
+ x += n(`${HI}.enterFromX`) * lay.width * (1 - e);
409
+ y += n(`${HI}.enterFromY`) * lay.height * (1 - e);
410
+ }
411
+ const rot = n(`${H}.rotation`) + follow * angleDelta(now.angle, rest.angle) + n(`${HI}.rotationAmplitude`) * amount;
412
+ const scale = n(`${H}.scale`) * (1 + follow * (now.scale / Math.max(1e-3, rest.scale) - 1));
413
+ return { x, y, rot, scale, bx, by };
414
+ }
415
+ const angleDelta = (a, b) => { let d = a - b; while (d > 180)
416
+ d -= 360; while (d < -180)
417
+ d += 360; return d; };
418
+ /**
419
+ * The hands' settle is a damped spring pulled toward the target, integrated from frame 0 in fixed
420
+ * one-frame steps — so any frame, sampled on its own and in any order, gets the same pose. The
421
+ * trajectory is cached per config object and size.
422
+ */
423
+ const TRAJECTORIES = new WeakMap();
424
+ function handPose(cfg, lay, tl, id, t) {
425
+ // FOLD PROGRESS poses the paper directly: the hands sit exactly on their grip, no settle to play out.
426
+ if (getPath(cfg, 'motion.progressMode') === 'manual')
427
+ return handTarget(cfg, lay, tl, id, t);
428
+ const key = `${id}:${lay.width}x${lay.height}`;
429
+ let byKey = TRAJECTORIES.get(cfg);
430
+ if (!byKey) {
431
+ byKey = new Map();
432
+ TRAJECTORIES.set(cfg, byKey);
433
+ }
434
+ let traj = byKey.get(key);
435
+ if (!traj) {
436
+ traj = [];
437
+ byKey.set(key, traj);
438
+ }
439
+ const HI = `handInteraction.${id}`;
440
+ const zeta = getPath(cfg, `${HI}.bounce`);
441
+ // One-frame steps stay stable while ω ≤ 1 (a settle of at least ~4/ζ frames).
442
+ const omega = Math.min(1, 4 / (zeta * getPath(cfg, `${HI}.settleDuration`)));
443
+ const target = Math.max(0, Math.ceil(t));
444
+ // The spring carries only what the hand adds to its grip (the approach, the bracing, the wrist turn):
445
+ // the grip point itself is ridden exactly, so the fingers never trail the paper however fast it folds.
446
+ const offset = (g) => ({ ...g, x: g.x - g.bx, y: g.y - g.by });
447
+ if (!traj.length)
448
+ traj.push(offset(handTarget(cfg, lay, tl, id, 0)));
449
+ // Velocities are recomputed from the last two samples, so the cache holds only poses.
450
+ while (traj.length <= target) {
451
+ const k = traj.length;
452
+ const cur = traj[k - 1], prev = traj[k - 2] ?? cur;
453
+ const goal = offset(handTarget(cfg, lay, tl, id, k));
454
+ const step = (x, px, g) => {
455
+ let v = x - px;
456
+ v += -2 * zeta * omega * v - omega * omega * (x - g);
457
+ return x + v;
458
+ };
459
+ traj.push({ x: step(cur.x, prev.x, goal.x), y: step(cur.y, prev.y, goal.y), rot: step(cur.rot, prev.rot, goal.rot), scale: step(cur.scale, prev.scale, goal.scale), bx: 0, by: 0 });
460
+ }
461
+ const f = Math.max(0, Math.floor(t)), fr = t <= 0 ? 0 : t - f;
462
+ const a = traj[f], bb = traj[Math.min(f + 1, traj.length - 1)];
463
+ const now = handTarget(cfg, lay, tl, id, Math.max(0, t));
464
+ return { x: now.bx + lerp(a.x, bb.x, fr), y: now.by + lerp(a.y, bb.y, fr), rot: lerp(a.rot, bb.rot, fr), scale: lerp(a.scale, bb.scale, fr), bx: now.bx, by: now.by };
465
+ }
466
+ const TEXT_SLOTS = [
467
+ { slot: 'topLogo', path: 'content.top.logo', panel: 'top' }, { slot: 'topHeadline', path: 'content.top.headline', panel: 'top' },
468
+ { slot: 'topSubtitle', path: 'content.top.subtitle', panel: 'top' }, { slot: 'middleHeadline', path: 'content.middle.headline', panel: 'middle' },
469
+ { slot: 'middleBody', path: 'content.middle.body', panel: 'middle' }, { slot: 'bottomHeadline', path: 'content.bottom.headline', panel: 'bottom' },
470
+ { slot: 'bottomBody', path: 'content.bottom.body', panel: 'bottom' }, { slot: 'bottomCta', path: 'content.bottom.cta', panel: 'bottom' },
471
+ ];
472
+ /**
473
+ * How many lines `text` wraps to at `width` px: greedy word wrap on an estimated advance (an average
474
+ * glyph is ≈ 0.52 em at weight 400, a little wider when heavier, plus the tracking). Pure and
475
+ * deterministic; the renderer's own wrapping may differ by a word, and the content area clips anyway.
476
+ */
477
+ export function estimateLines(text, fontSize, width, weight, tracking) {
478
+ const em = fontSize * (0.5 + Math.max(0, weight - 300) * 0.00016 + tracking);
479
+ const maxChars = Math.max(1, Math.floor(width / Math.max(0.1, em)));
480
+ let lines = 0;
481
+ for (const para of text.split('\n')) {
482
+ let cur = 0;
483
+ lines++;
484
+ for (const word of para.split(/\s+/).filter(Boolean)) {
485
+ const need = (cur ? cur + 1 : 0) + word.length;
486
+ if (need > maxChars && cur) {
487
+ lines++;
488
+ cur = word.length;
489
+ }
490
+ else
491
+ cur = need;
492
+ }
493
+ }
494
+ return lines;
495
+ }
496
+ /** Every text element placed on its panel and fitted into the panel's content area. */
497
+ export function textFits(cfg, lay) {
498
+ const { n, s, b } = reader(cfg);
499
+ const PW = lay.paper.width;
500
+ const out = [];
501
+ for (const { slot, path, panel } of TEXT_SLOTS) {
502
+ const text = s(path);
503
+ if (!text)
504
+ continue;
505
+ const T = `typography.${slot}`, A = `panels.${panel}.contentArea`;
506
+ const h = lay.panels[panel].height, pad = n(`${A}.padding`) * lay.pu;
507
+ const area = { x: n(`${A}.x`) * PW + pad, y: n(`${A}.y`) * h + pad, width: Math.max(1, n(`${A}.width`) * PW - 2 * pad), height: Math.max(1, n(`${A}.height`) * h - 2 * pad) };
508
+ const x = n(`${T}.x`) * PW, y = n(`${T}.y`) * h, size = n(`${T}.fontSize`) * lay.pu;
509
+ const overflow = b(`panels.${panel}.overflow`);
510
+ const width = overflow ? n(`${T}.maxWidth`) * PW : Math.max(1, Math.min(n(`${T}.maxWidth`) * PW, area.x + area.width - Math.max(x, area.x)));
511
+ let scale = 1, lines = estimateLines(text, size, width, n(`${T}.fontWeight`), n(`${T}.letterSpacing`));
512
+ if (!overflow) {
513
+ const room = area.y + area.height - Math.max(y, area.y);
514
+ while (scale > 0.4 && lines * n(`${T}.lineHeight`) * size * scale > room) {
515
+ scale -= 0.04;
516
+ lines = estimateLines(text, size * scale, width, n(`${T}.fontWeight`), n(`${T}.letterSpacing`));
517
+ }
518
+ }
519
+ out.push({ slot, panel, x: overflow ? x : Math.max(x, area.x), y: overflow ? y : Math.max(y, area.y), width, fontSize: size * scale, scale: Math.round(scale * 100) / 100, lines, area });
520
+ }
521
+ return out;
522
+ }
523
+ /** Everything drawn at motion frame `frame` on a `width` × `height` canvas. */
524
+ export function frameState(cfg, frame, width, height) {
525
+ const { n, s, b, list } = reader(cfg);
526
+ const lay = layout(cfg, width, height);
527
+ const tl = timeline(cfg);
528
+ const t = clamp(frame, 0, Math.max(0, tl.length));
529
+ const { folds, anchor, sheet, foldsCfg } = sheetAt(cfg, lay, tl, t);
530
+ const L = lightVector(cfg);
531
+ const PW = lay.paper.width;
532
+ const creases = list('creases');
533
+ /* strips: the one sheet, cut at its hinges */
534
+ const halfway = norm3([L[0], L[1], L[2] + 1]);
535
+ const rawStrips = sheet.strips.map((st) => {
536
+ const h = st.y1 - st.y0;
537
+ const world = mul(sheet.S, st.T);
538
+ const M = chain(sheet.P, world, translate(0, st.y0));
539
+ const corners = [[0, 0], [PW, 0], [PW, h], [0, h]].map(([x, y]) => project(M, [x, y, 0]));
540
+ let area = 0;
541
+ for (let i = 0; i < 4; i++) {
542
+ const [x1, y1] = corners[i], [x2, y2] = corners[(i + 1) % 4];
543
+ area += x1 * y2 - x2 * y1;
544
+ }
545
+ const facing = area >= 0 ? 'front' : 'back';
546
+ const centre = apply(world, [PW / 2, st.y0 + h / 2, 0]);
547
+ let normal = norm3(cross(linear(world, [1, 0, 0]), linear(world, [0, 1, 0])));
548
+ if (facing === 'back')
549
+ normal = [-normal[0], -normal[1], -normal[2]];
550
+ const panel = st.region === 'crease0' ? ((st.y0 + st.y1) / 2 < lay.creases[0] ? 'top' : 'middle') : st.region === 'crease1' ? ((st.y0 + st.y1) / 2 < lay.creases[1] ? 'middle' : 'bottom') : st.region;
551
+ const brightness = n('foldLighting.ambient') + n('foldLighting.diffuse') * Math.max(0, dot3(normal, L)) + n(`panels.${panel}.shade`) + (facing === 'back' ? n('foldLighting.backShade') : 0);
552
+ const sheen = n('foldLighting.highlightOpacity') * n(`panels.${panel}.highlightOpacity`) * Math.pow(Math.max(0, dot3(normal, halfway)), 24);
553
+ return { st, M, corners, facing, depth: centre[2], brightness, sheen, edgeOn: 1 - Math.abs(normal[2]) };
554
+ });
555
+ /* explicit depth order: back to front by the depth of each strip's centre (ties keep top → bottom) */
556
+ const order = [...rawStrips].sort((a, c) => a.depth - c.depth || a.st.index - c.st.index);
557
+ const STRIP_Z0 = 100, STRIP_STEP = 4;
558
+ const strips = rawStrips.map((r) => {
559
+ const rank = order.indexOf(r);
560
+ return {
561
+ index: r.st.index, region: r.st.region, y0: r.st.y0, y1: r.st.y1, matrix: cssMatrix(r.M), corners: r.corners, facing: r.facing,
562
+ depth: r.depth, rank, z: STRIP_Z0 + rank * STRIP_STEP, brightness: r.brightness, sheen: r.sheen, edgeOn: r.edgeOn, ...(r.st.lift ? { lift: true } : {}),
563
+ };
564
+ });
565
+ /** A sheet point on the picture, through the strip that carries it. */
566
+ const onPicture = (x, y) => project(chain(sheet.P, sheet.S, stripAt(sheet, y).T), [x, y, 0]);
567
+ /* crease effects on each panel's edges (drawn in sheet coordinates, on whichever strips carry them) */
568
+ const heightOf = (id) => lay.panels[id].height;
569
+ const edgeFx = (id, facing) => {
570
+ const out = [];
571
+ const adj = id === 'top' ? [[0, 'bottom', 'middle']] : id === 'middle' ? [[0, 'top', 'top'], [1, 'bottom', 'bottom']] : [[1, 'top', 'middle']];
572
+ for (const [k, edge, other] of adj) {
573
+ const c = creases[k], f = folds[k], fc = foldsCfg[k];
574
+ const closed = Math.abs(f.dihedral) / 180;
575
+ // Seen from the front, a positive dihedral (the fronts closing) is a valley; seen from the back, a ridge.
576
+ const concave = (facing === 'front') === (f.dihedral > 0) && Math.abs(f.dihedral) > 0.5;
577
+ const lineOpacity = c.enabled ? c.opacity * n('paperMaterial.creaseShadow') * clamp(n('paperMaterial.creaseTexture') + (1 - n('paperMaterial.creaseTexture')) * clamp(closed * fc.creaseIntensity)) : 0;
578
+ const moving = moversOf(anchor, id).includes(k);
579
+ const edgeLight = !concave && moving ? n('foldLighting.edgeHighlight') * Math.abs(Math.sin(f.dihedral * RAD)) : 0;
580
+ const shadowLen = Math.min(heightOf(id), heightOf(other) * (1 - Math.cos(f.dihedral * RAD)) / 2 + n('foldLighting.shadowOffset') * lay.pu);
581
+ out.push({
582
+ edge, crease: k,
583
+ line: { opacity: clamp(lineOpacity), width: c.width * lay.pu, blur: c.softness * lay.pu, color: c.color },
584
+ highlight: {
585
+ opacity: concave ? 0 : clamp(((c.enabled ? c.highlight * (0.35 + 0.65 * clamp(closed * fc.creaseIntensity)) : 0) + edgeLight) * n('paperMaterial.creaseHighlight')),
586
+ width: Math.max(c.width * lay.pu * 0.8, n('paper.thickness') * lay.pu * clamp(closed * 1.6)), color: c.highlightColor,
587
+ },
588
+ valley: { opacity: concave ? clamp(n('foldLighting.creaseDarkness') * c.darkness * 2 * clamp(closed * fc.creaseIntensity)) : 0, length: 70 * lay.pu * (0.4 + closed) },
589
+ shadow: {
590
+ opacity: concave ? n('foldLighting.shadowOpacity') * fc.shadowIntensity * n(`panels.${id}.shadowOpacity`) * clamp(closed * 1.4) ** 1.5 : 0,
591
+ length: Math.max(0, shadowLen), blur: n('foldLighting.shadowBlur') * lay.pu,
592
+ },
593
+ });
594
+ }
595
+ return out;
596
+ };
597
+ /* panels: the three regions of the sheet, summarized (their flat strip gives facing, light and depth) */
598
+ const panels = PANELS.map((id) => {
599
+ const { y0, y1, height: h } = lay.panels[id];
600
+ const flat = strips.filter((st) => st.region === id && !st.lift).reduce((a, b) => (b.y1 - b.y0 > a.y1 - a.y0 ? b : a));
601
+ const corners = [onPicture(0, y0), onPicture(PW, y0), onPicture(PW, y1), onPicture(0, y1)];
602
+ return {
603
+ id, y0, height: h, width: PW, matrix: flat.matrix, corners, facing: flat.facing, depth: flat.depth,
604
+ rank: flat.rank, z: flat.z, brightness: flat.brightness, sheen: flat.sheen, edges: edgeFx(id, flat.facing),
605
+ };
606
+ });
607
+ /* text: each element in its panel's content area, shrunk to fit unless the panel allows overflow */
608
+ const text = textFits(cfg, lay);
609
+ /* hands */
610
+ const hands = ['top', 'bottom'].map((id, i) => {
611
+ const H = `hands.${id}`, HI = `handInteraction.${id}`;
612
+ const gx = n(`${H}.x`), gy = n(`${H}.y`);
613
+ const panelId = panelOf(cfg, gy);
614
+ const panel = panels.find((p) => p.id === panelId);
615
+ const pose = handPose(cfg, lay, tl, id, t);
616
+ const exact = gripOn(sheet, lay, panelId, gx, gy);
617
+ const intro = tl.phases.intro, delay = n(`${HI}.enterDelayFrames`);
618
+ const manualMode = s('motion.progressMode') === 'manual';
619
+ const approach = s('motion.intro.mode') === 'hands' && !manualMode ? clamp((t - intro.start - delay) / Math.max(1, intro.end - intro.start - delay)) : 1;
620
+ const closeOn = ease(s('easing.fingerGrip'), clamp((approach - 0.55) / 0.45), 30);
621
+ // Contact → grip → pull → fold → stabilize; while the paper holds folded the hand eases its grip,
622
+ // then takes it again before the paper unfolds.
623
+ const hold = tl.phases.foldedHold, rf = n(`${HI}.releaseFrames`);
624
+ const release = manualMode || hold.end <= hold.start ? 0 : Math.min(clamp((t - hold.start) / rf), clamp((hold.end - t) / rf));
625
+ const grip = closeOn * (1 - n(`${HI}.releaseAmount`) * ease('easeInOut', release, rf));
626
+ // Front-facing: the body is behind the whole sheet and the finger lies on the panel's front.
627
+ // Turned over: what was behind the panel is now in front of it, so the two swap.
628
+ const front = panel.facing === 'front';
629
+ return {
630
+ id, enabled: b(`${H}.enabled`), panel: panelId,
631
+ x: pose.x, y: pose.y, rotation: pose.rot, scale: pose.scale * lay.handScale, skewX: n(`${H}.skewX`), skewY: n(`${H}.skewY`), opacity: n(`${H}.opacity`),
632
+ offsetX: n(`${H}.offsetX`) * 0.6, offsetY: n(`${H}.offsetY`) * 0.6,
633
+ // Open by gripAngle before the grip closes; once holding, open by whatever pose.grip leaves open.
634
+ fingerAngle: n(`${HI}.gripAngle`) * (1 - grip * n(`${H}.pose.grip`)),
635
+ gripX: exact.x, gripY: exact.y,
636
+ bodyZ: front ? 20 + i : panel.z + 2,
637
+ fingerZ: front ? panel.z + 2 : panel.z - 2,
638
+ unitScale: PW / 600,
639
+ pose: {
640
+ wrist: n(`${H}.pose.wrist`),
641
+ fingerCurl: n(`${H}.pose.fingerCurl`), thumbBend: n(`${H}.pose.thumbBend`), thumbRotation: n(`${H}.thumb.rotation`),
642
+ thumbScale: n(`${H}.thumb.scale`), thumbX: n(`${H}.thumb.x`), thumbY: n(`${H}.thumb.y`),
643
+ },
644
+ };
645
+ });
646
+ const anchors = Object.fromEntries(hands.map((h) => [h.id, { paper: [h.gripX, h.gripY], hand: [h.x, h.y] }]));
647
+ /* camera */
648
+ const enabledFolds = folds.filter((f, k) => foldsCfg[k].enabled);
649
+ const foldAmount = enabledFolds.length ? enabledFolds.reduce((a, f) => a + clamp(f.amount), 0) / enabledFolds.length : 0;
650
+ const fin = tl.phases.finalHold;
651
+ let zoom = lerp(n('camera.startZoom'), n('camera.foldZoom'), ease(s('easing.camera'), foldAmount, 60));
652
+ if (t >= fin.start && fin.end > fin.start)
653
+ zoom = lerp(zoom, n('camera.endZoom'), ease(s('timeline.finalHold.easing'), (t - fin.start) / (fin.end - fin.start), fin.end - fin.start));
654
+ const u = lay.unit, W = width, Hh = height;
655
+ const camT = (z, k) => `translate(${W / 2}px, ${Hh / 2}px) rotate(${n('camera.rotation') * k}deg) scale(${z}) translate(${-W / 2 - n('camera.x') * u * k}px, ${-Hh / 2 - n('camera.y') * u * k}px)`;
656
+ const par = n('camera.parallax');
657
+ /* background type rows */
658
+ const bt = 'background.backgroundTypography';
659
+ const size = n(`${bt}.fontSize`) * u * lay.backgroundType.scale;
660
+ const pitch = size * n(`${bt}.rowGap`);
661
+ const drift = n(`${bt}.drift`) * u * (t / MOTION_FPS);
662
+ const typeRows = Array.from({ length: n(`${bt}.rows`) }, (_, i) => ({
663
+ y: n(`${bt}.y`) * u + lay.backgroundType.y + i * pitch,
664
+ x: n(`${bt}.x`) * u + lay.backgroundType.x + (b(`${bt}.alternate`) && i % 2 ? -drift : drift),
665
+ }));
666
+ // Fill: an estimate of the word's width (caps ≈ 0.66 em each, plus tracking) decides how many repeats span the canvas.
667
+ const wordWidth = Math.max(1, s(`${bt}.text`).length * (0.66 + n(`${bt}.tracking`)) * size + 0.3 * size);
668
+ const reach = width + Math.abs(n(`${bt}.x`) * u + lay.backgroundType.x) + Math.abs(drift) + size;
669
+ const typeRepeat = Math.max(n(`${bt}.repeat`), b(`${bt}.fill`) ? Math.min(12, Math.ceil(reach / wordWidth)) : 1);
670
+ /* logo and CTA */
671
+ const introSpan = tl.phases.intro;
672
+ const eLogo = ease(s('easing.logoEnter'), (t - introSpan.start) / Math.max(1, introSpan.end - introSpan.start), introSpan.end - introSpan.start);
673
+ const logoMode = s('logo.animation');
674
+ const logo = { x: lay.logo.x, y: lay.logo.y - (logoMode === 'drop' ? (1 - eLogo) * 60 * u : 0), opacity: logoMode === 'none' ? 1 : eLogo, scale: lay.logo.scale };
675
+ const ctaMode = s('cta.animation');
676
+ const pCta = clamp((t - n('cta.enterDelayFrames')) / n('cta.enterDurationFrames'));
677
+ const pop = ctaMode === 'pop' || ctaMode === 'pop-pulse';
678
+ const pulse = ctaMode === 'pulse' || ctaMode === 'pop-pulse';
679
+ const pulseT = Math.max(0, t - fin.start) / MOTION_FPS;
680
+ const pulseK = pulse && t >= fin.start ? n('cta.pulseAmount') * (0.5 - 0.5 * Math.cos(TAU * n('cta.pulseFrequency') * pulseT)) : 0;
681
+ const cta = { x: lay.cta.x, y: lay.cta.y, opacity: pop ? clamp(pCta * 3) : 1, scale: lay.cta.scale * (pop ? Math.max(0, ease(s('easing.ctaEnter'), pCta, n('cta.enterDurationFrames'))) : 1) * (1 + pulseK) };
682
+ /* debug: the creases on the picture */
683
+ const creaseLine = (k) => {
684
+ const y = lay.creases[k];
685
+ return { id: k === 0 ? 'top' : 'bottom', from: onPicture(0, y), to: onPicture(PW, y), position: creases[k].position, angle: folds[k].angle };
686
+ };
687
+ return {
688
+ cfg, frame: t, size: lay, timeline: tl, phase: phaseAt(tl, t), folds, anchor, panels, strips, bands: sheet.bands, text, anchors, hands,
689
+ camera: { transform: camT(zoom, 1), backgroundTransform: camT(1 + (zoom - 1) * par, par), zoom },
690
+ shadowQuads: strips.map((p) => p.corners),
691
+ sheetCentre: project(chain(sheet.P, sheet.S), [PW / 2, lay.paper.height / 2, 0]),
692
+ background: { typeRows, typeRepeat },
693
+ logo, cta,
694
+ debug: { creases: [creaseLine(0), creaseLine(1)] },
695
+ };
696
+ }
697
+ /** The phase ids in order (re-exported for tests and tools). */
698
+ export { PHASES };
699
+ //# sourceMappingURL=engine.js.map