@appinternalleads/ui 0.4.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 (890) 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/manifests.js +81 -1
  4. package/dist/cjs/agent/manifests.js.map +1 -1
  5. package/dist/cjs/agent/result.js +6 -0
  6. package/dist/cjs/agent/result.js.map +1 -1
  7. package/dist/cjs/components/catalog.js +18 -0
  8. package/dist/cjs/components/catalog.js.map +1 -1
  9. package/dist/cjs/components/onboarding/animated-status/AnimatedStage.js +21 -0
  10. package/dist/cjs/components/onboarding/animated-status/AnimatedStage.js.map +1 -0
  11. package/dist/cjs/components/onboarding/animated-status/AnimatedStage.types.js +6 -0
  12. package/dist/cjs/components/onboarding/animated-status/AnimatedStage.types.js.map +1 -0
  13. package/dist/cjs/components/onboarding/animated-status/AnimatedStage.web.js +89 -0
  14. package/dist/cjs/components/onboarding/animated-status/AnimatedStage.web.js.map +1 -0
  15. package/dist/cjs/components/onboarding/animated-status/AnimatedStatusView.js +62 -0
  16. package/dist/cjs/components/onboarding/animated-status/AnimatedStatusView.js.map +1 -0
  17. package/dist/cjs/components/onboarding/animated-status/AnimatedStill.js +20 -0
  18. package/dist/cjs/components/onboarding/animated-status/AnimatedStill.js.map +1 -0
  19. package/dist/cjs/components/onboarding/animated-status/contract.js +87 -0
  20. package/dist/cjs/components/onboarding/animated-status/contract.js.map +1 -0
  21. package/dist/cjs/components/onboarding/animated-status/engine.js +40 -0
  22. package/dist/cjs/components/onboarding/animated-status/engine.js.map +1 -0
  23. package/dist/cjs/components/onboarding/animated-status/index.js +20 -0
  24. package/dist/cjs/components/onboarding/animated-status/index.js.map +1 -0
  25. package/dist/cjs/components/onboarding/animated-status/presets.json +126 -0
  26. package/dist/cjs/components/onboarding/animated-status/riv.js +7 -0
  27. package/dist/cjs/components/onboarding/animated-status/riv.js.map +1 -0
  28. package/dist/cjs/components/onboarding/index.js +4 -0
  29. package/dist/cjs/components/onboarding/index.js.map +1 -1
  30. package/dist/cjs/components/onboarding/presets.js +90 -84
  31. package/dist/cjs/components/onboarding/presets.js.map +1 -1
  32. package/dist/cjs/components/onboarding/receipt-printer/ReceiptStage.js +43 -6
  33. package/dist/cjs/components/onboarding/receipt-printer/ReceiptStage.js.map +1 -1
  34. package/dist/cjs/components/onboarding/send-completion/SendCompletionView.js +111 -0
  35. package/dist/cjs/components/onboarding/send-completion/SendCompletionView.js.map +1 -0
  36. package/dist/cjs/components/onboarding/send-completion/SendStage.js +37 -0
  37. package/dist/cjs/components/onboarding/send-completion/SendStage.js.map +1 -0
  38. package/dist/cjs/components/onboarding/send-completion/SendStage.types.js +6 -0
  39. package/dist/cjs/components/onboarding/send-completion/SendStage.types.js.map +1 -0
  40. package/dist/cjs/components/onboarding/send-completion/SendStage.web.js +107 -0
  41. package/dist/cjs/components/onboarding/send-completion/SendStage.web.js.map +1 -0
  42. package/dist/cjs/components/onboarding/send-completion/SendStill.js +17 -0
  43. package/dist/cjs/components/onboarding/send-completion/SendStill.js.map +1 -0
  44. package/dist/cjs/components/onboarding/send-completion/contract.js +83 -0
  45. package/dist/cjs/components/onboarding/send-completion/contract.js.map +1 -0
  46. package/dist/cjs/components/onboarding/send-completion/engine.js +32 -0
  47. package/dist/cjs/components/onboarding/send-completion/engine.js.map +1 -0
  48. package/dist/cjs/components/onboarding/send-completion/index.js +22 -0
  49. package/dist/cjs/components/onboarding/send-completion/index.js.map +1 -0
  50. package/dist/cjs/components/onboarding/send-completion/presets.json +132 -0
  51. package/dist/cjs/components/onboarding/send-completion/riv.js +7 -0
  52. package/dist/cjs/components/onboarding/send-completion/riv.js.map +1 -0
  53. package/dist/cjs/components/onboarding/shared/actions-data.js +2 -0
  54. package/dist/cjs/components/onboarding/shared/actions-data.js.map +1 -1
  55. package/dist/cjs/components/onboarding/shared/configColor.js +76 -0
  56. package/dist/cjs/components/onboarding/shared/configColor.js.map +1 -0
  57. package/dist/cjs/components/onboarding/shared/contract.js +4 -0
  58. package/dist/cjs/components/onboarding/shared/contract.js.map +1 -1
  59. package/dist/cjs/components/onboarding/shared/describe.js +1 -1
  60. package/dist/cjs/components/onboarding/shared/describe.js.map +1 -1
  61. package/dist/cjs/components/onboarding/shared/mock.js +2 -0
  62. package/dist/cjs/components/onboarding/shared/mock.js.map +1 -1
  63. package/dist/cjs/components/onboarding/views.js +8 -0
  64. package/dist/cjs/components/onboarding/views.js.map +1 -1
  65. package/dist/cjs/motion/MotionPlayer.js +42 -0
  66. package/dist/cjs/motion/MotionPlayer.js.map +1 -0
  67. package/dist/cjs/motion/agent.js +323 -0
  68. package/dist/cjs/motion/agent.js.map +1 -0
  69. package/dist/cjs/motion/cat/Cat.js +79 -0
  70. package/dist/cjs/motion/cat/Cat.js.map +1 -0
  71. package/dist/cjs/motion/cat/animation.js +204 -0
  72. package/dist/cjs/motion/cat/animation.js.map +1 -0
  73. package/dist/cjs/motion/cat/art.generated.js +37 -0
  74. package/dist/cjs/motion/cat/art.generated.js.map +1 -0
  75. package/dist/cjs/motion/cat/config.js +136 -0
  76. package/dist/cjs/motion/cat/config.js.map +1 -0
  77. package/dist/cjs/motion/cat/index.js +75 -0
  78. package/dist/cjs/motion/cat/index.js.map +1 -0
  79. package/dist/cjs/motion/cat/rig.js +99 -0
  80. package/dist/cjs/motion/cat/rig.js.map +1 -0
  81. package/dist/cjs/motion/cat/scene.js +148 -0
  82. package/dist/cjs/motion/cat/scene.js.map +1 -0
  83. package/dist/cjs/motion/configurable/config.js +477 -0
  84. package/dist/cjs/motion/configurable/config.js.map +1 -0
  85. package/dist/cjs/motion/configurable/controls.js +44 -0
  86. package/dist/cjs/motion/configurable/controls.js.map +1 -0
  87. package/dist/cjs/motion/easing.js +62 -0
  88. package/dist/cjs/motion/easing.js.map +1 -0
  89. package/dist/cjs/motion/fit.js +12 -0
  90. package/dist/cjs/motion/fit.js.map +1 -0
  91. package/dist/cjs/motion/index.js +101 -0
  92. package/dist/cjs/motion/index.js.map +1 -0
  93. package/dist/cjs/motion/neon/GlowRenderer.js +18 -0
  94. package/dist/cjs/motion/neon/GlowRenderer.js.map +1 -0
  95. package/dist/cjs/motion/neon/NeonCanvas.js +97 -0
  96. package/dist/cjs/motion/neon/NeonCanvas.js.map +1 -0
  97. package/dist/cjs/motion/neon/NeonText.js +108 -0
  98. package/dist/cjs/motion/neon/NeonText.js.map +1 -0
  99. package/dist/cjs/motion/neon/NeonTextFrame.js +36 -0
  100. package/dist/cjs/motion/neon/NeonTextFrame.js.map +1 -0
  101. package/dist/cjs/motion/neon/artwork.js +102 -0
  102. package/dist/cjs/motion/neon/artwork.js.map +1 -0
  103. package/dist/cjs/motion/neon/audio.js +165 -0
  104. package/dist/cjs/motion/neon/audio.js.map +1 -0
  105. package/dist/cjs/motion/neon/config.js +334 -0
  106. package/dist/cjs/motion/neon/config.js.map +1 -0
  107. package/dist/cjs/motion/neon/flicker.js +196 -0
  108. package/dist/cjs/motion/neon/flicker.js.map +1 -0
  109. package/dist/cjs/motion/neon/fonts.js +52 -0
  110. package/dist/cjs/motion/neon/fonts.js.map +1 -0
  111. package/dist/cjs/motion/neon/frame.js +24 -0
  112. package/dist/cjs/motion/neon/frame.js.map +1 -0
  113. package/dist/cjs/motion/neon/glitch.js +114 -0
  114. package/dist/cjs/motion/neon/glitch.js.map +1 -0
  115. package/dist/cjs/motion/neon/index.js +119 -0
  116. package/dist/cjs/motion/neon/index.js.map +1 -0
  117. package/dist/cjs/motion/neon/layers.js +68 -0
  118. package/dist/cjs/motion/neon/layers.js.map +1 -0
  119. package/dist/cjs/motion/neon/material.js +56 -0
  120. package/dist/cjs/motion/neon/material.js.map +1 -0
  121. package/dist/cjs/motion/neon/random.js +43 -0
  122. package/dist/cjs/motion/neon/random.js.map +1 -0
  123. package/dist/cjs/motion/neon/scene.js +549 -0
  124. package/dist/cjs/motion/neon/scene.js.map +1 -0
  125. package/dist/cjs/motion/neon/synth.js +213 -0
  126. package/dist/cjs/motion/neon/synth.js.map +1 -0
  127. package/dist/cjs/motion/neon/typography.js +81 -0
  128. package/dist/cjs/motion/neon/typography.js.map +1 -0
  129. package/dist/cjs/motion/neon/wall.js +113 -0
  130. package/dist/cjs/motion/neon/wall.js.map +1 -0
  131. package/dist/cjs/motion/paperfold/PaperFold.js +40 -0
  132. package/dist/cjs/motion/paperfold/PaperFold.js.map +1 -0
  133. package/dist/cjs/motion/paperfold/PaperFoldFrame.js +290 -0
  134. package/dist/cjs/motion/paperfold/PaperFoldFrame.js.map +1 -0
  135. package/dist/cjs/motion/paperfold/PaperFoldPlayer.js +59 -0
  136. package/dist/cjs/motion/paperfold/PaperFoldPlayer.js.map +1 -0
  137. package/dist/cjs/motion/paperfold/art.js +388 -0
  138. package/dist/cjs/motion/paperfold/art.js.map +1 -0
  139. package/dist/cjs/motion/paperfold/config.js +103 -0
  140. package/dist/cjs/motion/paperfold/config.js.map +1 -0
  141. package/dist/cjs/motion/paperfold/controls.js +493 -0
  142. package/dist/cjs/motion/paperfold/controls.js.map +1 -0
  143. package/dist/cjs/motion/paperfold/engine.js +722 -0
  144. package/dist/cjs/motion/paperfold/engine.js.map +1 -0
  145. package/dist/cjs/motion/paperfold/fonts.js +25 -0
  146. package/dist/cjs/motion/paperfold/fonts.js.map +1 -0
  147. package/dist/cjs/motion/paperfold/index.js +113 -0
  148. package/dist/cjs/motion/paperfold/index.js.map +1 -0
  149. package/dist/cjs/motion/paperfold/manipulate.js +170 -0
  150. package/dist/cjs/motion/paperfold/manipulate.js.map +1 -0
  151. package/dist/cjs/motion/paperfold/presets.js +119 -0
  152. package/dist/cjs/motion/paperfold/presets.js.map +1 -0
  153. package/dist/cjs/motion/paperfold/template.js +40 -0
  154. package/dist/cjs/motion/paperfold/template.js.map +1 -0
  155. package/dist/cjs/motion/player.js +203 -0
  156. package/dist/cjs/motion/player.js.map +1 -0
  157. package/dist/cjs/motion/promo/PromoFrame.js +293 -0
  158. package/dist/cjs/motion/promo/PromoFrame.js.map +1 -0
  159. package/dist/cjs/motion/promo/PromoShowcasePlayer.js +59 -0
  160. package/dist/cjs/motion/promo/PromoShowcasePlayer.js.map +1 -0
  161. package/dist/cjs/motion/promo/config.js +565 -0
  162. package/dist/cjs/motion/promo/config.js.map +1 -0
  163. package/dist/cjs/motion/promo/controls.js +571 -0
  164. package/dist/cjs/motion/promo/controls.js.map +1 -0
  165. package/dist/cjs/motion/promo/easing.js +35 -0
  166. package/dist/cjs/motion/promo/easing.js.map +1 -0
  167. package/dist/cjs/motion/promo/engine.js +567 -0
  168. package/dist/cjs/motion/promo/engine.js.map +1 -0
  169. package/dist/cjs/motion/promo/fonts.js +20 -0
  170. package/dist/cjs/motion/promo/fonts.js.map +1 -0
  171. package/dist/cjs/motion/promo/icons.js +29 -0
  172. package/dist/cjs/motion/promo/icons.js.map +1 -0
  173. package/dist/cjs/motion/promo/index.js +73 -0
  174. package/dist/cjs/motion/promo/index.js.map +1 -0
  175. package/dist/cjs/motion/promo/presets.js +44 -0
  176. package/dist/cjs/motion/promo/presets.js.map +1 -0
  177. package/dist/cjs/motion/promo/template.js +38 -0
  178. package/dist/cjs/motion/promo/template.js.map +1 -0
  179. package/dist/cjs/motion/replication2/Replication2Player.js +93 -0
  180. package/dist/cjs/motion/replication2/Replication2Player.js.map +1 -0
  181. package/dist/cjs/motion/replication2/config.js +352 -0
  182. package/dist/cjs/motion/replication2/config.js.map +1 -0
  183. package/dist/cjs/motion/replication2/controls.js +286 -0
  184. package/dist/cjs/motion/replication2/controls.js.map +1 -0
  185. package/dist/cjs/motion/replication2/driver.js +68 -0
  186. package/dist/cjs/motion/replication2/driver.js.map +1 -0
  187. package/dist/cjs/motion/replication2/easing.js +97 -0
  188. package/dist/cjs/motion/replication2/easing.js.map +1 -0
  189. package/dist/cjs/motion/replication2/engine.js +481 -0
  190. package/dist/cjs/motion/replication2/engine.js.map +1 -0
  191. package/dist/cjs/motion/replication2/html.js +88 -0
  192. package/dist/cjs/motion/replication2/html.js.map +1 -0
  193. package/dist/cjs/motion/replication2/index.js +61 -0
  194. package/dist/cjs/motion/replication2/index.js.map +1 -0
  195. package/dist/cjs/motion/replication2/measure.js +30 -0
  196. package/dist/cjs/motion/replication2/measure.js.map +1 -0
  197. package/dist/cjs/motion/replication2/metrics.js +10 -0
  198. package/dist/cjs/motion/replication2/metrics.js.map +1 -0
  199. package/dist/cjs/motion/replication2/presets.js +67 -0
  200. package/dist/cjs/motion/replication2/presets.js.map +1 -0
  201. package/dist/cjs/motion/replication2/riv.js +7 -0
  202. package/dist/cjs/motion/replication2/riv.js.map +1 -0
  203. package/dist/cjs/motion/replication2/rive-contract.js +158 -0
  204. package/dist/cjs/motion/replication2/rive-contract.js.map +1 -0
  205. package/dist/cjs/motion/replication2/template.js +35 -0
  206. package/dist/cjs/motion/replication2/template.js.map +1 -0
  207. package/dist/cjs/motion/sample.js +149 -0
  208. package/dist/cjs/motion/sample.js.map +1 -0
  209. package/dist/cjs/motion/templates/hey-template.js +1552 -0
  210. package/dist/cjs/motion/templates/hey-template.js.map +1 -0
  211. package/dist/cjs/motion/templates/index.js +22 -0
  212. package/dist/cjs/motion/templates/index.js.map +1 -0
  213. package/dist/cjs/motion/templates/word-motion.js +1165 -0
  214. package/dist/cjs/motion/templates/word-motion.js.map +1 -0
  215. package/dist/cjs/motion/types.js +3 -0
  216. package/dist/cjs/motion/types.js.map +1 -0
  217. package/dist/cjs/motion/typesurface/TypeSurfaceCanvas.js +62 -0
  218. package/dist/cjs/motion/typesurface/TypeSurfaceCanvas.js.map +1 -0
  219. package/dist/cjs/motion/typesurface/art.js +861 -0
  220. package/dist/cjs/motion/typesurface/art.js.map +1 -0
  221. package/dist/cjs/motion/typesurface/config.js +269 -0
  222. package/dist/cjs/motion/typesurface/config.js.map +1 -0
  223. package/dist/cjs/motion/typesurface/engine.js +607 -0
  224. package/dist/cjs/motion/typesurface/engine.js.map +1 -0
  225. package/dist/cjs/motion/typesurface/fonts.js +45 -0
  226. package/dist/cjs/motion/typesurface/fonts.js.map +1 -0
  227. package/dist/cjs/motion/typesurface/index.js +72 -0
  228. package/dist/cjs/motion/typesurface/index.js.map +1 -0
  229. package/dist/cjs/motion/typesurface/layout.js +130 -0
  230. package/dist/cjs/motion/typesurface/layout.js.map +1 -0
  231. package/dist/cjs/motion/typesurface/ops.js +175 -0
  232. package/dist/cjs/motion/typesurface/ops.js.map +1 -0
  233. package/dist/cjs/motion/typesurface/presets.js +192 -0
  234. package/dist/cjs/motion/typesurface/presets.js.map +1 -0
  235. package/dist/cjs/motion/typesurface/renderer.js +672 -0
  236. package/dist/cjs/motion/typesurface/renderer.js.map +1 -0
  237. package/dist/cjs/motion/typesurface/shaders.js +300 -0
  238. package/dist/cjs/motion/typesurface/shaders.js.map +1 -0
  239. package/dist/cjs/motion/typesurface/surfaces.js +156 -0
  240. package/dist/cjs/motion/typesurface/surfaces.js.map +1 -0
  241. package/dist/cjs/motion/typesurface/text.js +34 -0
  242. package/dist/cjs/motion/typesurface/text.js.map +1 -0
  243. package/dist/cjs/motion/typesurface/timeline.js +64 -0
  244. package/dist/cjs/motion/typesurface/timeline.js.map +1 -0
  245. package/dist/cjs/motion/validate.js +89 -0
  246. package/dist/cjs/motion/validate.js.map +1 -0
  247. package/dist/cjs/native/RiveReceiptStage.js +9 -150
  248. package/dist/cjs/native/RiveReceiptStage.js.map +1 -1
  249. package/dist/cjs/native/riveReceiptStageFactory.js +162 -0
  250. package/dist/cjs/native/riveReceiptStageFactory.js.map +1 -0
  251. package/dist/cjs/tokens/stage.js +10 -0
  252. package/dist/cjs/tokens/stage.js.map +1 -0
  253. package/dist/esm/agent/AgentComponent.js +1 -1
  254. package/dist/esm/agent/AgentComponent.js.map +1 -1
  255. package/dist/esm/agent/manifests.d.ts.map +1 -1
  256. package/dist/esm/agent/manifests.js +81 -1
  257. package/dist/esm/agent/manifests.js.map +1 -1
  258. package/dist/esm/agent/result.d.ts.map +1 -1
  259. package/dist/esm/agent/result.js +6 -0
  260. package/dist/esm/agent/result.js.map +1 -1
  261. package/dist/esm/agent/types.d.ts +1 -1
  262. package/dist/esm/agent/types.d.ts.map +1 -1
  263. package/dist/esm/components/catalog.d.ts +1 -1
  264. package/dist/esm/components/catalog.d.ts.map +1 -1
  265. package/dist/esm/components/catalog.js +18 -0
  266. package/dist/esm/components/catalog.js.map +1 -1
  267. package/dist/esm/components/onboarding/animated-status/AnimatedStage.d.ts +9 -0
  268. package/dist/esm/components/onboarding/animated-status/AnimatedStage.d.ts.map +1 -0
  269. package/dist/esm/components/onboarding/animated-status/AnimatedStage.js +18 -0
  270. package/dist/esm/components/onboarding/animated-status/AnimatedStage.js.map +1 -0
  271. package/dist/esm/components/onboarding/animated-status/AnimatedStage.types.d.ts +31 -0
  272. package/dist/esm/components/onboarding/animated-status/AnimatedStage.types.d.ts.map +1 -0
  273. package/dist/esm/components/onboarding/animated-status/AnimatedStage.types.js +3 -0
  274. package/dist/esm/components/onboarding/animated-status/AnimatedStage.types.js.map +1 -0
  275. package/dist/esm/components/onboarding/animated-status/AnimatedStage.web.d.ts +4 -0
  276. package/dist/esm/components/onboarding/animated-status/AnimatedStage.web.d.ts.map +1 -0
  277. package/dist/esm/components/onboarding/animated-status/AnimatedStage.web.js +86 -0
  278. package/dist/esm/components/onboarding/animated-status/AnimatedStage.web.js.map +1 -0
  279. package/dist/esm/components/onboarding/animated-status/AnimatedStatusView.d.ts +32 -0
  280. package/dist/esm/components/onboarding/animated-status/AnimatedStatusView.d.ts.map +1 -0
  281. package/dist/esm/components/onboarding/animated-status/AnimatedStatusView.js +59 -0
  282. package/dist/esm/components/onboarding/animated-status/AnimatedStatusView.js.map +1 -0
  283. package/dist/esm/components/onboarding/animated-status/AnimatedStill.d.ts +8 -0
  284. package/dist/esm/components/onboarding/animated-status/AnimatedStill.d.ts.map +1 -0
  285. package/dist/esm/components/onboarding/animated-status/AnimatedStill.js +17 -0
  286. package/dist/esm/components/onboarding/animated-status/AnimatedStill.js.map +1 -0
  287. package/dist/esm/components/onboarding/animated-status/contract.d.ts +61 -0
  288. package/dist/esm/components/onboarding/animated-status/contract.d.ts.map +1 -0
  289. package/dist/esm/components/onboarding/animated-status/contract.js +78 -0
  290. package/dist/esm/components/onboarding/animated-status/contract.js.map +1 -0
  291. package/dist/esm/components/onboarding/animated-status/engine.d.ts +24 -0
  292. package/dist/esm/components/onboarding/animated-status/engine.d.ts.map +1 -0
  293. package/dist/esm/components/onboarding/animated-status/engine.js +32 -0
  294. package/dist/esm/components/onboarding/animated-status/engine.js.map +1 -0
  295. package/dist/esm/components/onboarding/animated-status/index.d.ts +5 -0
  296. package/dist/esm/components/onboarding/animated-status/index.d.ts.map +1 -0
  297. package/dist/esm/components/onboarding/animated-status/index.js +4 -0
  298. package/dist/esm/components/onboarding/animated-status/index.js.map +1 -0
  299. package/dist/esm/components/onboarding/animated-status/presets.json +126 -0
  300. package/dist/esm/components/onboarding/animated-status/riv.d.ts +3 -0
  301. package/dist/esm/components/onboarding/animated-status/riv.d.ts.map +1 -0
  302. package/dist/esm/components/onboarding/animated-status/riv.js +4 -0
  303. package/dist/esm/components/onboarding/animated-status/riv.js.map +1 -0
  304. package/dist/esm/components/onboarding/index.d.ts +2 -0
  305. package/dist/esm/components/onboarding/index.d.ts.map +1 -1
  306. package/dist/esm/components/onboarding/index.js +4 -0
  307. package/dist/esm/components/onboarding/index.js.map +1 -1
  308. package/dist/esm/components/onboarding/presets.d.ts.map +1 -1
  309. package/dist/esm/components/onboarding/presets.js +6 -0
  310. package/dist/esm/components/onboarding/presets.js.map +1 -1
  311. package/dist/esm/components/onboarding/receipt-printer/ReceiptStage.d.ts +4 -6
  312. package/dist/esm/components/onboarding/receipt-printer/ReceiptStage.d.ts.map +1 -1
  313. package/dist/esm/components/onboarding/receipt-printer/ReceiptStage.js +42 -6
  314. package/dist/esm/components/onboarding/receipt-printer/ReceiptStage.js.map +1 -1
  315. package/dist/esm/components/onboarding/send-completion/SendCompletionView.d.ts +47 -0
  316. package/dist/esm/components/onboarding/send-completion/SendCompletionView.d.ts.map +1 -0
  317. package/dist/esm/components/onboarding/send-completion/SendCompletionView.js +108 -0
  318. package/dist/esm/components/onboarding/send-completion/SendCompletionView.js.map +1 -0
  319. package/dist/esm/components/onboarding/send-completion/SendStage.d.ts +9 -0
  320. package/dist/esm/components/onboarding/send-completion/SendStage.d.ts.map +1 -0
  321. package/dist/esm/components/onboarding/send-completion/SendStage.js +34 -0
  322. package/dist/esm/components/onboarding/send-completion/SendStage.js.map +1 -0
  323. package/dist/esm/components/onboarding/send-completion/SendStage.types.d.ts +33 -0
  324. package/dist/esm/components/onboarding/send-completion/SendStage.types.d.ts.map +1 -0
  325. package/dist/esm/components/onboarding/send-completion/SendStage.types.js +3 -0
  326. package/dist/esm/components/onboarding/send-completion/SendStage.types.js.map +1 -0
  327. package/dist/esm/components/onboarding/send-completion/SendStage.web.d.ts +4 -0
  328. package/dist/esm/components/onboarding/send-completion/SendStage.web.d.ts.map +1 -0
  329. package/dist/esm/components/onboarding/send-completion/SendStage.web.js +104 -0
  330. package/dist/esm/components/onboarding/send-completion/SendStage.web.js.map +1 -0
  331. package/dist/esm/components/onboarding/send-completion/SendStill.d.ts +11 -0
  332. package/dist/esm/components/onboarding/send-completion/SendStill.d.ts.map +1 -0
  333. package/dist/esm/components/onboarding/send-completion/SendStill.js +14 -0
  334. package/dist/esm/components/onboarding/send-completion/SendStill.js.map +1 -0
  335. package/dist/esm/components/onboarding/send-completion/contract.d.ts +99 -0
  336. package/dist/esm/components/onboarding/send-completion/contract.d.ts.map +1 -0
  337. package/dist/esm/components/onboarding/send-completion/contract.js +76 -0
  338. package/dist/esm/components/onboarding/send-completion/contract.js.map +1 -0
  339. package/dist/esm/components/onboarding/send-completion/engine.d.ts +20 -0
  340. package/dist/esm/components/onboarding/send-completion/engine.d.ts.map +1 -0
  341. package/dist/esm/components/onboarding/send-completion/engine.js +28 -0
  342. package/dist/esm/components/onboarding/send-completion/engine.js.map +1 -0
  343. package/dist/esm/components/onboarding/send-completion/index.d.ts +6 -0
  344. package/dist/esm/components/onboarding/send-completion/index.d.ts.map +1 -0
  345. package/dist/esm/components/onboarding/send-completion/index.js +6 -0
  346. package/dist/esm/components/onboarding/send-completion/index.js.map +1 -0
  347. package/dist/esm/components/onboarding/send-completion/presets.json +132 -0
  348. package/dist/esm/components/onboarding/send-completion/riv.d.ts +3 -0
  349. package/dist/esm/components/onboarding/send-completion/riv.d.ts.map +1 -0
  350. package/dist/esm/components/onboarding/send-completion/riv.js +4 -0
  351. package/dist/esm/components/onboarding/send-completion/riv.js.map +1 -0
  352. package/dist/esm/components/onboarding/shared/actions-data.d.ts.map +1 -1
  353. package/dist/esm/components/onboarding/shared/actions-data.js +2 -0
  354. package/dist/esm/components/onboarding/shared/actions-data.js.map +1 -1
  355. package/dist/esm/components/onboarding/shared/configColor.d.ts +29 -0
  356. package/dist/esm/components/onboarding/shared/configColor.d.ts.map +1 -0
  357. package/dist/esm/components/onboarding/shared/configColor.js +69 -0
  358. package/dist/esm/components/onboarding/shared/configColor.js.map +1 -0
  359. package/dist/esm/components/onboarding/shared/contract.d.ts +1 -1
  360. package/dist/esm/components/onboarding/shared/contract.d.ts.map +1 -1
  361. package/dist/esm/components/onboarding/shared/contract.js +4 -0
  362. package/dist/esm/components/onboarding/shared/contract.js.map +1 -1
  363. package/dist/esm/components/onboarding/shared/describe.d.ts.map +1 -1
  364. package/dist/esm/components/onboarding/shared/describe.js +1 -1
  365. package/dist/esm/components/onboarding/shared/describe.js.map +1 -1
  366. package/dist/esm/components/onboarding/shared/mock.d.ts +2 -0
  367. package/dist/esm/components/onboarding/shared/mock.d.ts.map +1 -1
  368. package/dist/esm/components/onboarding/shared/mock.js +2 -0
  369. package/dist/esm/components/onboarding/shared/mock.js.map +1 -1
  370. package/dist/esm/components/onboarding/views.d.ts.map +1 -1
  371. package/dist/esm/components/onboarding/views.js +8 -0
  372. package/dist/esm/components/onboarding/views.js.map +1 -1
  373. package/dist/esm/motion/MotionPlayer.d.ts +22 -0
  374. package/dist/esm/motion/MotionPlayer.d.ts.map +1 -0
  375. package/dist/esm/motion/MotionPlayer.js +39 -0
  376. package/dist/esm/motion/MotionPlayer.js.map +1 -0
  377. package/dist/esm/motion/agent.d.ts +146 -0
  378. package/dist/esm/motion/agent.d.ts.map +1 -0
  379. package/dist/esm/motion/agent.js +278 -0
  380. package/dist/esm/motion/agent.js.map +1 -0
  381. package/dist/esm/motion/cat/Cat.d.ts +43 -0
  382. package/dist/esm/motion/cat/Cat.d.ts.map +1 -0
  383. package/dist/esm/motion/cat/Cat.js +74 -0
  384. package/dist/esm/motion/cat/Cat.js.map +1 -0
  385. package/dist/esm/motion/cat/animation.d.ts +86 -0
  386. package/dist/esm/motion/cat/animation.d.ts.map +1 -0
  387. package/dist/esm/motion/cat/animation.js +193 -0
  388. package/dist/esm/motion/cat/animation.js.map +1 -0
  389. package/dist/esm/motion/cat/art.generated.d.ts +53 -0
  390. package/dist/esm/motion/cat/art.generated.d.ts.map +1 -0
  391. package/dist/esm/motion/cat/art.generated.js +34 -0
  392. package/dist/esm/motion/cat/art.generated.js.map +1 -0
  393. package/dist/esm/motion/cat/config.d.ts +103 -0
  394. package/dist/esm/motion/cat/config.d.ts.map +1 -0
  395. package/dist/esm/motion/cat/config.js +129 -0
  396. package/dist/esm/motion/cat/config.js.map +1 -0
  397. package/dist/esm/motion/cat/index.d.ts +13 -0
  398. package/dist/esm/motion/cat/index.d.ts.map +1 -0
  399. package/dist/esm/motion/cat/index.js +13 -0
  400. package/dist/esm/motion/cat/index.js.map +1 -0
  401. package/dist/esm/motion/cat/rig.d.ts +44 -0
  402. package/dist/esm/motion/cat/rig.d.ts.map +1 -0
  403. package/dist/esm/motion/cat/rig.js +86 -0
  404. package/dist/esm/motion/cat/rig.js.map +1 -0
  405. package/dist/esm/motion/cat/scene.d.ts +66 -0
  406. package/dist/esm/motion/cat/scene.d.ts.map +1 -0
  407. package/dist/esm/motion/cat/scene.js +137 -0
  408. package/dist/esm/motion/cat/scene.js.map +1 -0
  409. package/dist/esm/motion/configurable/config.d.ts +80 -0
  410. package/dist/esm/motion/configurable/config.d.ts.map +1 -0
  411. package/dist/esm/motion/configurable/config.js +468 -0
  412. package/dist/esm/motion/configurable/config.js.map +1 -0
  413. package/dist/esm/motion/configurable/controls.d.ts +74 -0
  414. package/dist/esm/motion/configurable/controls.d.ts.map +1 -0
  415. package/dist/esm/motion/configurable/controls.js +38 -0
  416. package/dist/esm/motion/configurable/controls.js.map +1 -0
  417. package/dist/esm/motion/easing.d.ts +4 -0
  418. package/dist/esm/motion/easing.d.ts.map +1 -0
  419. package/dist/esm/motion/easing.js +58 -0
  420. package/dist/esm/motion/easing.js.map +1 -0
  421. package/dist/esm/motion/fit.d.ts +8 -0
  422. package/dist/esm/motion/fit.d.ts.map +1 -0
  423. package/dist/esm/motion/fit.js +8 -0
  424. package/dist/esm/motion/fit.js.map +1 -0
  425. package/dist/esm/motion/index.d.ts +27 -0
  426. package/dist/esm/motion/index.d.ts.map +1 -0
  427. package/dist/esm/motion/index.js +21 -0
  428. package/dist/esm/motion/index.js.map +1 -0
  429. package/dist/esm/motion/neon/GlowRenderer.d.ts +31 -0
  430. package/dist/esm/motion/neon/GlowRenderer.d.ts.map +1 -0
  431. package/dist/esm/motion/neon/GlowRenderer.js +14 -0
  432. package/dist/esm/motion/neon/GlowRenderer.js.map +1 -0
  433. package/dist/esm/motion/neon/NeonCanvas.d.ts +42 -0
  434. package/dist/esm/motion/neon/NeonCanvas.d.ts.map +1 -0
  435. package/dist/esm/motion/neon/NeonCanvas.js +92 -0
  436. package/dist/esm/motion/neon/NeonCanvas.js.map +1 -0
  437. package/dist/esm/motion/neon/NeonText.d.ts +26 -0
  438. package/dist/esm/motion/neon/NeonText.d.ts.map +1 -0
  439. package/dist/esm/motion/neon/NeonText.js +103 -0
  440. package/dist/esm/motion/neon/NeonText.js.map +1 -0
  441. package/dist/esm/motion/neon/NeonTextFrame.d.ts +29 -0
  442. package/dist/esm/motion/neon/NeonTextFrame.d.ts.map +1 -0
  443. package/dist/esm/motion/neon/NeonTextFrame.js +33 -0
  444. package/dist/esm/motion/neon/NeonTextFrame.js.map +1 -0
  445. package/dist/esm/motion/neon/artwork.d.ts +29 -0
  446. package/dist/esm/motion/neon/artwork.d.ts.map +1 -0
  447. package/dist/esm/motion/neon/artwork.js +98 -0
  448. package/dist/esm/motion/neon/artwork.js.map +1 -0
  449. package/dist/esm/motion/neon/audio.d.ts +49 -0
  450. package/dist/esm/motion/neon/audio.d.ts.map +1 -0
  451. package/dist/esm/motion/neon/audio.js +161 -0
  452. package/dist/esm/motion/neon/audio.js.map +1 -0
  453. package/dist/esm/motion/neon/config.d.ts +319 -0
  454. package/dist/esm/motion/neon/config.d.ts.map +1 -0
  455. package/dist/esm/motion/neon/config.js +319 -0
  456. package/dist/esm/motion/neon/config.js.map +1 -0
  457. package/dist/esm/motion/neon/flicker.d.ts +82 -0
  458. package/dist/esm/motion/neon/flicker.d.ts.map +1 -0
  459. package/dist/esm/motion/neon/flicker.js +187 -0
  460. package/dist/esm/motion/neon/flicker.js.map +1 -0
  461. package/dist/esm/motion/neon/fonts.d.ts +29 -0
  462. package/dist/esm/motion/neon/fonts.d.ts.map +1 -0
  463. package/dist/esm/motion/neon/fonts.js +47 -0
  464. package/dist/esm/motion/neon/fonts.js.map +1 -0
  465. package/dist/esm/motion/neon/frame.d.ts +22 -0
  466. package/dist/esm/motion/neon/frame.d.ts.map +1 -0
  467. package/dist/esm/motion/neon/frame.js +20 -0
  468. package/dist/esm/motion/neon/frame.js.map +1 -0
  469. package/dist/esm/motion/neon/glitch.d.ts +64 -0
  470. package/dist/esm/motion/neon/glitch.d.ts.map +1 -0
  471. package/dist/esm/motion/neon/glitch.js +108 -0
  472. package/dist/esm/motion/neon/glitch.js.map +1 -0
  473. package/dist/esm/motion/neon/index.d.ts +29 -0
  474. package/dist/esm/motion/neon/index.d.ts.map +1 -0
  475. package/dist/esm/motion/neon/index.js +28 -0
  476. package/dist/esm/motion/neon/index.js.map +1 -0
  477. package/dist/esm/motion/neon/layers.d.ts +56 -0
  478. package/dist/esm/motion/neon/layers.d.ts.map +1 -0
  479. package/dist/esm/motion/neon/layers.js +64 -0
  480. package/dist/esm/motion/neon/layers.js.map +1 -0
  481. package/dist/esm/motion/neon/material.d.ts +68 -0
  482. package/dist/esm/motion/neon/material.d.ts.map +1 -0
  483. package/dist/esm/motion/neon/material.js +51 -0
  484. package/dist/esm/motion/neon/material.js.map +1 -0
  485. package/dist/esm/motion/neon/random.d.ts +15 -0
  486. package/dist/esm/motion/neon/random.d.ts.map +1 -0
  487. package/dist/esm/motion/neon/random.js +37 -0
  488. package/dist/esm/motion/neon/random.js.map +1 -0
  489. package/dist/esm/motion/neon/scene.d.ts +255 -0
  490. package/dist/esm/motion/neon/scene.d.ts.map +1 -0
  491. package/dist/esm/motion/neon/scene.js +532 -0
  492. package/dist/esm/motion/neon/scene.js.map +1 -0
  493. package/dist/esm/motion/neon/synth.d.ts +18 -0
  494. package/dist/esm/motion/neon/synth.d.ts.map +1 -0
  495. package/dist/esm/motion/neon/synth.js +208 -0
  496. package/dist/esm/motion/neon/synth.js.map +1 -0
  497. package/dist/esm/motion/neon/typography.d.ts +53 -0
  498. package/dist/esm/motion/neon/typography.d.ts.map +1 -0
  499. package/dist/esm/motion/neon/typography.js +74 -0
  500. package/dist/esm/motion/neon/typography.js.map +1 -0
  501. package/dist/esm/motion/neon/wall.d.ts +62 -0
  502. package/dist/esm/motion/neon/wall.d.ts.map +1 -0
  503. package/dist/esm/motion/neon/wall.js +106 -0
  504. package/dist/esm/motion/neon/wall.js.map +1 -0
  505. package/dist/esm/motion/paperfold/PaperFold.d.ts +36 -0
  506. package/dist/esm/motion/paperfold/PaperFold.d.ts.map +1 -0
  507. package/dist/esm/motion/paperfold/PaperFold.js +37 -0
  508. package/dist/esm/motion/paperfold/PaperFold.js.map +1 -0
  509. package/dist/esm/motion/paperfold/PaperFoldFrame.d.ts +39 -0
  510. package/dist/esm/motion/paperfold/PaperFoldFrame.d.ts.map +1 -0
  511. package/dist/esm/motion/paperfold/PaperFoldFrame.js +283 -0
  512. package/dist/esm/motion/paperfold/PaperFoldFrame.js.map +1 -0
  513. package/dist/esm/motion/paperfold/PaperFoldPlayer.d.ts +27 -0
  514. package/dist/esm/motion/paperfold/PaperFoldPlayer.d.ts.map +1 -0
  515. package/dist/esm/motion/paperfold/PaperFoldPlayer.js +56 -0
  516. package/dist/esm/motion/paperfold/PaperFoldPlayer.js.map +1 -0
  517. package/dist/esm/motion/paperfold/art.d.ts +148 -0
  518. package/dist/esm/motion/paperfold/art.d.ts.map +1 -0
  519. package/dist/esm/motion/paperfold/art.js +374 -0
  520. package/dist/esm/motion/paperfold/art.js.map +1 -0
  521. package/dist/esm/motion/paperfold/config.d.ts +47 -0
  522. package/dist/esm/motion/paperfold/config.d.ts.map +1 -0
  523. package/dist/esm/motion/paperfold/config.js +96 -0
  524. package/dist/esm/motion/paperfold/config.js.map +1 -0
  525. package/dist/esm/motion/paperfold/controls.d.ts +57 -0
  526. package/dist/esm/motion/paperfold/controls.d.ts.map +1 -0
  527. package/dist/esm/motion/paperfold/controls.js +506 -0
  528. package/dist/esm/motion/paperfold/controls.js.map +1 -0
  529. package/dist/esm/motion/paperfold/engine.d.ts +397 -0
  530. package/dist/esm/motion/paperfold/engine.d.ts.map +1 -0
  531. package/dist/esm/motion/paperfold/engine.js +699 -0
  532. package/dist/esm/motion/paperfold/engine.js.map +1 -0
  533. package/dist/esm/motion/paperfold/fonts.d.ts +3 -0
  534. package/dist/esm/motion/paperfold/fonts.d.ts.map +1 -0
  535. package/dist/esm/motion/paperfold/fonts.js +21 -0
  536. package/dist/esm/motion/paperfold/fonts.js.map +1 -0
  537. package/dist/esm/motion/paperfold/index.d.ts +17 -0
  538. package/dist/esm/motion/paperfold/index.d.ts.map +1 -0
  539. package/dist/esm/motion/paperfold/index.js +17 -0
  540. package/dist/esm/motion/paperfold/index.js.map +1 -0
  541. package/dist/esm/motion/paperfold/manipulate.d.ts +59 -0
  542. package/dist/esm/motion/paperfold/manipulate.d.ts.map +1 -0
  543. package/dist/esm/motion/paperfold/manipulate.js +161 -0
  544. package/dist/esm/motion/paperfold/manipulate.js.map +1 -0
  545. package/dist/esm/motion/paperfold/presets.d.ts +9 -0
  546. package/dist/esm/motion/paperfold/presets.d.ts.map +1 -0
  547. package/dist/esm/motion/paperfold/presets.js +115 -0
  548. package/dist/esm/motion/paperfold/presets.js.map +1 -0
  549. package/dist/esm/motion/paperfold/template.d.ts +3 -0
  550. package/dist/esm/motion/paperfold/template.d.ts.map +1 -0
  551. package/dist/esm/motion/paperfold/template.js +37 -0
  552. package/dist/esm/motion/paperfold/template.js.map +1 -0
  553. package/dist/esm/motion/player.d.ts +35 -0
  554. package/dist/esm/motion/player.d.ts.map +1 -0
  555. package/dist/esm/motion/player.js +197 -0
  556. package/dist/esm/motion/player.js.map +1 -0
  557. package/dist/esm/motion/promo/PromoFrame.d.ts +31 -0
  558. package/dist/esm/motion/promo/PromoFrame.d.ts.map +1 -0
  559. package/dist/esm/motion/promo/PromoFrame.js +288 -0
  560. package/dist/esm/motion/promo/PromoFrame.js.map +1 -0
  561. package/dist/esm/motion/promo/PromoShowcasePlayer.d.ts +25 -0
  562. package/dist/esm/motion/promo/PromoShowcasePlayer.d.ts.map +1 -0
  563. package/dist/esm/motion/promo/PromoShowcasePlayer.js +56 -0
  564. package/dist/esm/motion/promo/PromoShowcasePlayer.js.map +1 -0
  565. package/dist/esm/motion/promo/config.d.ts +91 -0
  566. package/dist/esm/motion/promo/config.d.ts.map +1 -0
  567. package/dist/esm/motion/promo/config.js +550 -0
  568. package/dist/esm/motion/promo/config.js.map +1 -0
  569. package/dist/esm/motion/promo/controls.d.ts +86 -0
  570. package/dist/esm/motion/promo/controls.d.ts.map +1 -0
  571. package/dist/esm/motion/promo/controls.js +567 -0
  572. package/dist/esm/motion/promo/controls.js.map +1 -0
  573. package/dist/esm/motion/promo/easing.d.ts +3 -0
  574. package/dist/esm/motion/promo/easing.d.ts.map +1 -0
  575. package/dist/esm/motion/promo/easing.js +32 -0
  576. package/dist/esm/motion/promo/easing.js.map +1 -0
  577. package/dist/esm/motion/promo/engine.d.ts +205 -0
  578. package/dist/esm/motion/promo/engine.d.ts.map +1 -0
  579. package/dist/esm/motion/promo/engine.js +551 -0
  580. package/dist/esm/motion/promo/engine.js.map +1 -0
  581. package/dist/esm/motion/promo/fonts.d.ts +7 -0
  582. package/dist/esm/motion/promo/fonts.d.ts.map +1 -0
  583. package/dist/esm/motion/promo/fonts.js +16 -0
  584. package/dist/esm/motion/promo/fonts.js.map +1 -0
  585. package/dist/esm/motion/promo/icons.d.ts +7 -0
  586. package/dist/esm/motion/promo/icons.d.ts.map +1 -0
  587. package/dist/esm/motion/promo/icons.js +26 -0
  588. package/dist/esm/motion/promo/icons.js.map +1 -0
  589. package/dist/esm/motion/promo/index.d.ts +15 -0
  590. package/dist/esm/motion/promo/index.d.ts.map +1 -0
  591. package/dist/esm/motion/promo/index.js +15 -0
  592. package/dist/esm/motion/promo/index.js.map +1 -0
  593. package/dist/esm/motion/promo/presets.d.ts +13 -0
  594. package/dist/esm/motion/promo/presets.d.ts.map +1 -0
  595. package/dist/esm/motion/promo/presets.js +40 -0
  596. package/dist/esm/motion/promo/presets.js.map +1 -0
  597. package/dist/esm/motion/promo/template.d.ts +8 -0
  598. package/dist/esm/motion/promo/template.d.ts.map +1 -0
  599. package/dist/esm/motion/promo/template.js +35 -0
  600. package/dist/esm/motion/promo/template.js.map +1 -0
  601. package/dist/esm/motion/replication2/Replication2Player.d.ts +26 -0
  602. package/dist/esm/motion/replication2/Replication2Player.d.ts.map +1 -0
  603. package/dist/esm/motion/replication2/Replication2Player.js +90 -0
  604. package/dist/esm/motion/replication2/Replication2Player.js.map +1 -0
  605. package/dist/esm/motion/replication2/config.d.ts +78 -0
  606. package/dist/esm/motion/replication2/config.d.ts.map +1 -0
  607. package/dist/esm/motion/replication2/config.js +341 -0
  608. package/dist/esm/motion/replication2/config.js.map +1 -0
  609. package/dist/esm/motion/replication2/controls.d.ts +70 -0
  610. package/dist/esm/motion/replication2/controls.d.ts.map +1 -0
  611. package/dist/esm/motion/replication2/controls.js +283 -0
  612. package/dist/esm/motion/replication2/controls.js.map +1 -0
  613. package/dist/esm/motion/replication2/driver.d.ts +23 -0
  614. package/dist/esm/motion/replication2/driver.d.ts.map +1 -0
  615. package/dist/esm/motion/replication2/driver.js +65 -0
  616. package/dist/esm/motion/replication2/driver.js.map +1 -0
  617. package/dist/esm/motion/replication2/easing.d.ts +19 -0
  618. package/dist/esm/motion/replication2/easing.d.ts.map +1 -0
  619. package/dist/esm/motion/replication2/easing.js +92 -0
  620. package/dist/esm/motion/replication2/easing.js.map +1 -0
  621. package/dist/esm/motion/replication2/engine.d.ts +236 -0
  622. package/dist/esm/motion/replication2/engine.d.ts.map +1 -0
  623. package/dist/esm/motion/replication2/engine.js +470 -0
  624. package/dist/esm/motion/replication2/engine.js.map +1 -0
  625. package/dist/esm/motion/replication2/html.d.ts +30 -0
  626. package/dist/esm/motion/replication2/html.d.ts.map +1 -0
  627. package/dist/esm/motion/replication2/html.js +83 -0
  628. package/dist/esm/motion/replication2/html.js.map +1 -0
  629. package/dist/esm/motion/replication2/index.d.ts +15 -0
  630. package/dist/esm/motion/replication2/index.d.ts.map +1 -0
  631. package/dist/esm/motion/replication2/index.js +15 -0
  632. package/dist/esm/motion/replication2/index.js.map +1 -0
  633. package/dist/esm/motion/replication2/measure.d.ts +3 -0
  634. package/dist/esm/motion/replication2/measure.d.ts.map +1 -0
  635. package/dist/esm/motion/replication2/measure.js +27 -0
  636. package/dist/esm/motion/replication2/measure.js.map +1 -0
  637. package/dist/esm/motion/replication2/metrics.d.ts +6 -0
  638. package/dist/esm/motion/replication2/metrics.d.ts.map +1 -0
  639. package/dist/esm/motion/replication2/metrics.js +7 -0
  640. package/dist/esm/motion/replication2/metrics.js.map +1 -0
  641. package/dist/esm/motion/replication2/presets.d.ts +13 -0
  642. package/dist/esm/motion/replication2/presets.d.ts.map +1 -0
  643. package/dist/esm/motion/replication2/presets.js +63 -0
  644. package/dist/esm/motion/replication2/presets.js.map +1 -0
  645. package/dist/esm/motion/replication2/riv.d.ts +3 -0
  646. package/dist/esm/motion/replication2/riv.d.ts.map +1 -0
  647. package/dist/esm/motion/replication2/riv.js +4 -0
  648. package/dist/esm/motion/replication2/riv.js.map +1 -0
  649. package/dist/esm/motion/replication2/rive-contract.d.ts +27 -0
  650. package/dist/esm/motion/replication2/rive-contract.d.ts.map +1 -0
  651. package/dist/esm/motion/replication2/rive-contract.js +153 -0
  652. package/dist/esm/motion/replication2/rive-contract.js.map +1 -0
  653. package/dist/esm/motion/replication2/template.d.ts +8 -0
  654. package/dist/esm/motion/replication2/template.d.ts.map +1 -0
  655. package/dist/esm/motion/replication2/template.js +32 -0
  656. package/dist/esm/motion/replication2/template.js.map +1 -0
  657. package/dist/esm/motion/sample.d.ts +61 -0
  658. package/dist/esm/motion/sample.d.ts.map +1 -0
  659. package/dist/esm/motion/sample.js +138 -0
  660. package/dist/esm/motion/sample.js.map +1 -0
  661. package/dist/esm/motion/templates/hey-template.d.ts +3 -0
  662. package/dist/esm/motion/templates/hey-template.d.ts.map +1 -0
  663. package/dist/esm/motion/templates/hey-template.js +1549 -0
  664. package/dist/esm/motion/templates/hey-template.js.map +1 -0
  665. package/dist/esm/motion/templates/index.d.ts +22 -0
  666. package/dist/esm/motion/templates/index.d.ts.map +1 -0
  667. package/dist/esm/motion/templates/index.js +15 -0
  668. package/dist/esm/motion/templates/index.js.map +1 -0
  669. package/dist/esm/motion/templates/word-motion.d.ts +3 -0
  670. package/dist/esm/motion/templates/word-motion.d.ts.map +1 -0
  671. package/dist/esm/motion/templates/word-motion.js +1162 -0
  672. package/dist/esm/motion/templates/word-motion.js.map +1 -0
  673. package/dist/esm/motion/types.d.ts +192 -0
  674. package/dist/esm/motion/types.d.ts.map +1 -0
  675. package/dist/esm/motion/types.js +2 -0
  676. package/dist/esm/motion/types.js.map +1 -0
  677. package/dist/esm/motion/typesurface/TypeSurfaceCanvas.d.ts +22 -0
  678. package/dist/esm/motion/typesurface/TypeSurfaceCanvas.d.ts.map +1 -0
  679. package/dist/esm/motion/typesurface/TypeSurfaceCanvas.js +58 -0
  680. package/dist/esm/motion/typesurface/TypeSurfaceCanvas.js.map +1 -0
  681. package/dist/esm/motion/typesurface/art.d.ts +21 -0
  682. package/dist/esm/motion/typesurface/art.d.ts.map +1 -0
  683. package/dist/esm/motion/typesurface/art.js +854 -0
  684. package/dist/esm/motion/typesurface/art.js.map +1 -0
  685. package/dist/esm/motion/typesurface/config.d.ts +273 -0
  686. package/dist/esm/motion/typesurface/config.d.ts.map +1 -0
  687. package/dist/esm/motion/typesurface/config.js +260 -0
  688. package/dist/esm/motion/typesurface/config.js.map +1 -0
  689. package/dist/esm/motion/typesurface/engine.d.ts +94 -0
  690. package/dist/esm/motion/typesurface/engine.d.ts.map +1 -0
  691. package/dist/esm/motion/typesurface/engine.js +603 -0
  692. package/dist/esm/motion/typesurface/engine.js.map +1 -0
  693. package/dist/esm/motion/typesurface/fonts.d.ts +25 -0
  694. package/dist/esm/motion/typesurface/fonts.d.ts.map +1 -0
  695. package/dist/esm/motion/typesurface/fonts.js +40 -0
  696. package/dist/esm/motion/typesurface/fonts.js.map +1 -0
  697. package/dist/esm/motion/typesurface/index.d.ts +17 -0
  698. package/dist/esm/motion/typesurface/index.d.ts.map +1 -0
  699. package/dist/esm/motion/typesurface/index.js +17 -0
  700. package/dist/esm/motion/typesurface/index.js.map +1 -0
  701. package/dist/esm/motion/typesurface/layout.d.ts +57 -0
  702. package/dist/esm/motion/typesurface/layout.d.ts.map +1 -0
  703. package/dist/esm/motion/typesurface/layout.js +122 -0
  704. package/dist/esm/motion/typesurface/layout.js.map +1 -0
  705. package/dist/esm/motion/typesurface/ops.d.ts +70 -0
  706. package/dist/esm/motion/typesurface/ops.d.ts.map +1 -0
  707. package/dist/esm/motion/typesurface/ops.js +164 -0
  708. package/dist/esm/motion/typesurface/ops.js.map +1 -0
  709. package/dist/esm/motion/typesurface/presets.d.ts +33 -0
  710. package/dist/esm/motion/typesurface/presets.d.ts.map +1 -0
  711. package/dist/esm/motion/typesurface/presets.js +185 -0
  712. package/dist/esm/motion/typesurface/presets.js.map +1 -0
  713. package/dist/esm/motion/typesurface/renderer.d.ts +78 -0
  714. package/dist/esm/motion/typesurface/renderer.d.ts.map +1 -0
  715. package/dist/esm/motion/typesurface/renderer.js +666 -0
  716. package/dist/esm/motion/typesurface/renderer.js.map +1 -0
  717. package/dist/esm/motion/typesurface/shaders.d.ts +17 -0
  718. package/dist/esm/motion/typesurface/shaders.d.ts.map +1 -0
  719. package/dist/esm/motion/typesurface/shaders.js +297 -0
  720. package/dist/esm/motion/typesurface/shaders.js.map +1 -0
  721. package/dist/esm/motion/typesurface/surfaces.d.ts +81 -0
  722. package/dist/esm/motion/typesurface/surfaces.d.ts.map +1 -0
  723. package/dist/esm/motion/typesurface/surfaces.js +149 -0
  724. package/dist/esm/motion/typesurface/surfaces.js.map +1 -0
  725. package/dist/esm/motion/typesurface/text.d.ts +17 -0
  726. package/dist/esm/motion/typesurface/text.d.ts.map +1 -0
  727. package/dist/esm/motion/typesurface/text.js +28 -0
  728. package/dist/esm/motion/typesurface/text.js.map +1 -0
  729. package/dist/esm/motion/typesurface/timeline.d.ts +15 -0
  730. package/dist/esm/motion/typesurface/timeline.d.ts.map +1 -0
  731. package/dist/esm/motion/typesurface/timeline.js +57 -0
  732. package/dist/esm/motion/typesurface/timeline.js.map +1 -0
  733. package/dist/esm/motion/validate.d.ts +22 -0
  734. package/dist/esm/motion/validate.d.ts.map +1 -0
  735. package/dist/esm/motion/validate.js +84 -0
  736. package/dist/esm/motion/validate.js.map +1 -0
  737. package/dist/esm/native/RiveReceiptStage.d.ts +25 -2
  738. package/dist/esm/native/RiveReceiptStage.d.ts.map +1 -1
  739. package/dist/esm/native/RiveReceiptStage.js +7 -148
  740. package/dist/esm/native/RiveReceiptStage.js.map +1 -1
  741. package/dist/esm/native/riveReceiptStageFactory.d.ts +26 -0
  742. package/dist/esm/native/riveReceiptStageFactory.d.ts.map +1 -0
  743. package/dist/esm/native/riveReceiptStageFactory.js +159 -0
  744. package/dist/esm/native/riveReceiptStageFactory.js.map +1 -0
  745. package/dist/esm/tokens/stage.d.ts +7 -0
  746. package/dist/esm/tokens/stage.d.ts.map +1 -0
  747. package/dist/esm/tokens/stage.js +7 -0
  748. package/dist/esm/tokens/stage.js.map +1 -0
  749. package/package.json +35 -1
  750. package/spec/examples/components/onboarding/animated-status/case1.json +42 -0
  751. package/spec/examples/components/onboarding/animated-status/case2.json +42 -0
  752. package/spec/examples/components/onboarding/animated-status/case3.json +42 -0
  753. package/spec/examples/components/onboarding/animated-status/case4.json +42 -0
  754. package/spec/examples/components/onboarding/animated-status/case5.json +42 -0
  755. package/spec/examples/components/onboarding/send-completion/case1.json +48 -0
  756. package/spec/examples/components/onboarding/send-completion/case2.json +48 -0
  757. package/spec/examples/components/onboarding/send-completion/case3.json +48 -0
  758. package/spec/examples/components/onboarding/send-completion/case4.json +48 -0
  759. package/spec/examples/components/onboarding/send-completion/case5.json +48 -0
  760. package/spec/families/onboarding.schema.json +610 -1
  761. package/src/agent/AgentComponent.tsx +1 -1
  762. package/src/agent/manifests.ts +83 -1
  763. package/src/agent/result.ts +6 -0
  764. package/src/agent/types.ts +1 -1
  765. package/src/components/catalog.ts +21 -1
  766. package/src/components/onboarding/animated-status/AnimatedStage.tsx +18 -0
  767. package/src/components/onboarding/animated-status/AnimatedStage.types.ts +30 -0
  768. package/src/components/onboarding/animated-status/AnimatedStage.web.tsx +99 -0
  769. package/src/components/onboarding/animated-status/AnimatedStatusView.tsx +109 -0
  770. package/src/components/onboarding/animated-status/AnimatedStill.tsx +23 -0
  771. package/src/components/onboarding/animated-status/contract.ts +105 -0
  772. package/src/components/onboarding/animated-status/engine.ts +49 -0
  773. package/src/components/onboarding/animated-status/index.ts +8 -0
  774. package/src/components/onboarding/animated-status/presets.json +126 -0
  775. package/src/components/onboarding/animated-status/riv.ts +4 -0
  776. package/src/components/onboarding/index.ts +4 -0
  777. package/src/components/onboarding/presets.ts +6 -0
  778. package/src/components/onboarding/receipt-printer/ReceiptStage.tsx +46 -7
  779. package/src/components/onboarding/send-completion/SendCompletionView.tsx +164 -0
  780. package/src/components/onboarding/send-completion/SendStage.tsx +27 -0
  781. package/src/components/onboarding/send-completion/SendStage.types.ts +32 -0
  782. package/src/components/onboarding/send-completion/SendStage.web.tsx +116 -0
  783. package/src/components/onboarding/send-completion/SendStill.tsx +19 -0
  784. package/src/components/onboarding/send-completion/contract.ts +127 -0
  785. package/src/components/onboarding/send-completion/engine.ts +37 -0
  786. package/src/components/onboarding/send-completion/index.ts +10 -0
  787. package/src/components/onboarding/send-completion/presets.json +132 -0
  788. package/src/components/onboarding/send-completion/riv.ts +4 -0
  789. package/src/components/onboarding/shared/actions-data.ts +2 -0
  790. package/src/components/onboarding/shared/configColor.ts +72 -0
  791. package/src/components/onboarding/shared/contract.ts +4 -0
  792. package/src/components/onboarding/shared/describe.ts +1 -1
  793. package/src/components/onboarding/shared/mock.ts +2 -0
  794. package/src/components/onboarding/views.ts +8 -0
  795. package/src/motion/MotionPlayer.tsx +62 -0
  796. package/src/motion/agent.ts +288 -0
  797. package/src/motion/cat/Cat.tsx +118 -0
  798. package/src/motion/cat/animation.ts +206 -0
  799. package/src/motion/cat/art.generated.ts +44 -0
  800. package/src/motion/cat/config.ts +186 -0
  801. package/src/motion/cat/index.ts +26 -0
  802. package/src/motion/cat/rig.ts +102 -0
  803. package/src/motion/cat/scene.ts +181 -0
  804. package/src/motion/configurable/config.ts +420 -0
  805. package/src/motion/configurable/controls.ts +93 -0
  806. package/src/motion/easing.ts +55 -0
  807. package/src/motion/fit.ts +8 -0
  808. package/src/motion/index.ts +29 -0
  809. package/src/motion/neon/GlowRenderer.tsx +83 -0
  810. package/src/motion/neon/NeonCanvas.tsx +175 -0
  811. package/src/motion/neon/NeonText.tsx +113 -0
  812. package/src/motion/neon/NeonTextFrame.tsx +67 -0
  813. package/src/motion/neon/artwork.ts +95 -0
  814. package/src/motion/neon/audio.ts +162 -0
  815. package/src/motion/neon/config.ts +484 -0
  816. package/src/motion/neon/flicker.ts +225 -0
  817. package/src/motion/neon/fonts.ts +76 -0
  818. package/src/motion/neon/frame.ts +34 -0
  819. package/src/motion/neon/glitch.ts +142 -0
  820. package/src/motion/neon/index.ts +41 -0
  821. package/src/motion/neon/layers.tsx +209 -0
  822. package/src/motion/neon/material.ts +88 -0
  823. package/src/motion/neon/random.ts +40 -0
  824. package/src/motion/neon/scene.ts +610 -0
  825. package/src/motion/neon/synth.ts +188 -0
  826. package/src/motion/neon/typography.ts +102 -0
  827. package/src/motion/neon/wall.ts +157 -0
  828. package/src/motion/paperfold/PaperFold.tsx +45 -0
  829. package/src/motion/paperfold/PaperFoldFrame.tsx +576 -0
  830. package/src/motion/paperfold/PaperFoldPlayer.tsx +80 -0
  831. package/src/motion/paperfold/art.ts +455 -0
  832. package/src/motion/paperfold/config.ts +98 -0
  833. package/src/motion/paperfold/controls.ts +557 -0
  834. package/src/motion/paperfold/engine.ts +852 -0
  835. package/src/motion/paperfold/fonts.ts +21 -0
  836. package/src/motion/paperfold/index.ts +30 -0
  837. package/src/motion/paperfold/manipulate.ts +188 -0
  838. package/src/motion/paperfold/presets.ts +117 -0
  839. package/src/motion/paperfold/template.ts +38 -0
  840. package/src/motion/player.ts +207 -0
  841. package/src/motion/promo/PromoFrame.tsx +501 -0
  842. package/src/motion/promo/PromoShowcasePlayer.tsx +78 -0
  843. package/src/motion/promo/config.ts +479 -0
  844. package/src/motion/promo/controls.ts +643 -0
  845. package/src/motion/promo/easing.ts +36 -0
  846. package/src/motion/promo/engine.ts +587 -0
  847. package/src/motion/promo/fonts.ts +16 -0
  848. package/src/motion/promo/icons.tsx +29 -0
  849. package/src/motion/promo/index.ts +24 -0
  850. package/src/motion/promo/presets.ts +40 -0
  851. package/src/motion/promo/template.ts +36 -0
  852. package/src/motion/replication2/Replication2Player.tsx +115 -0
  853. package/src/motion/replication2/config.ts +323 -0
  854. package/src/motion/replication2/controls.ts +336 -0
  855. package/src/motion/replication2/driver.ts +92 -0
  856. package/src/motion/replication2/easing.ts +88 -0
  857. package/src/motion/replication2/engine.ts +539 -0
  858. package/src/motion/replication2/html.ts +87 -0
  859. package/src/motion/replication2/index.ts +14 -0
  860. package/src/motion/replication2/measure.ts +28 -0
  861. package/src/motion/replication2/metrics.ts +7 -0
  862. package/src/motion/replication2/presets.ts +63 -0
  863. package/src/motion/replication2/riv.ts +4 -0
  864. package/src/motion/replication2/rive-contract.ts +165 -0
  865. package/src/motion/replication2/template.ts +33 -0
  866. package/src/motion/sample.ts +173 -0
  867. package/src/motion/templates/hey-template.ts +1553 -0
  868. package/src/motion/templates/index.ts +17 -0
  869. package/src/motion/templates/word-motion.ts +1166 -0
  870. package/src/motion/types.ts +162 -0
  871. package/src/motion/typesurface/TypeSurfaceCanvas.tsx +73 -0
  872. package/src/motion/typesurface/art.ts +639 -0
  873. package/src/motion/typesurface/config.ts +486 -0
  874. package/src/motion/typesurface/engine.ts +586 -0
  875. package/src/motion/typesurface/fonts.ts +63 -0
  876. package/src/motion/typesurface/index.ts +16 -0
  877. package/src/motion/typesurface/layout.ts +133 -0
  878. package/src/motion/typesurface/ops.ts +196 -0
  879. package/src/motion/typesurface/presets.ts +199 -0
  880. package/src/motion/typesurface/renderer.ts +579 -0
  881. package/src/motion/typesurface/shaders.ts +303 -0
  882. package/src/motion/typesurface/surfaces.ts +223 -0
  883. package/src/motion/typesurface/text.ts +35 -0
  884. package/src/motion/typesurface/timeline.ts +58 -0
  885. package/src/motion/validate.ts +101 -0
  886. package/src/native/RiveReceiptStage.tsx +8 -155
  887. package/src/native/riveReceiptStageFactory.tsx +175 -0
  888. package/src/tokens/stage.ts +6 -0
  889. package/tools/ask/dist/components.mjs +6887 -46
  890. package/tools/ask/mcp.mjs +80 -1
@@ -0,0 +1,557 @@
1
+ /* eslint-disable comppack/no-raw-colour -- the defaults are content: the reference look's colours, which people and agents replace (DECISIONS §25–§27). */
2
+ import { controlKit, expandControls, inGroup, type Control as BaseControl, type ListSpec as BaseListSpec } from '../configurable/controls';
3
+ import { EASING_NAMES, FONT_FAMILIES } from '../promo/controls';
4
+
5
+ /**
6
+ * **paper-fold-promo — the control table.** Every editable value of the template, once: its path, type,
7
+ * range or options, default, description, and who may edit it. The defaults, validator, JSON Schema,
8
+ * patch API, Remotion Studio schema, site editor and the docs table are all generated from here, so a
9
+ * person and an agent always edit the same contract.
10
+ *
11
+ * The defaults are a neutral starting point in the reference look. The reference copy (the tixdoor
12
+ * launch) lives only in the `reference` preset (`presets.ts` → `content/paper-fold-promo/reference.json`).
13
+ *
14
+ * Units:
15
+ * - `frames` — motion frames at the canonical 60 fps, whatever `canvas.fps` the output samples at.
16
+ * - `du` — design units: 1/1080 of the canvas's short side (2 px at 4K). Canvas-level things: logo, CTA,
17
+ * background type, camera, shadows on the background.
18
+ * - `pu` — paper units: 1/1000 of the open sheet's width. Everything printed on or attached to the paper
19
+ * (text, creases, hands), so it scales with the sheet in every layout.
20
+ * - `normalized` — 0‥1 across the box the description names (the canvas, the sheet, one panel).
21
+ * - `deg` — degrees. A fold angle is the dihedral turn at its crease: 0 = flat, 180 = folded flat.
22
+ */
23
+ export { EASING_NAMES, FONT_FAMILIES };
24
+ export type EasingName = (typeof EASING_NAMES)[number];
25
+ export const ASPECT_RATIOS = ['9:16', '16:9', '1:1'] as const;
26
+ export type AspectRatio = (typeof ASPECT_RATIOS)[number];
27
+ export const LAYOUT_FOR: Record<AspectRatio, 'portrait' | 'landscape' | 'square'> = { '9:16': 'portrait', '16:9': 'landscape', '1:1': 'square' };
28
+ export const FPS_OPTIONS = [24, 25, 30, 50, 60] as const;
29
+ export const FONT_WEIGHTS = [300, 400, 500, 600, 700, 800, 900] as const;
30
+ export const PANELS = ['top', 'middle', 'bottom'] as const;
31
+ export type PanelId = (typeof PANELS)[number];
32
+ export const FOLD_KEYS = ['top', 'bottom'] as const;
33
+ export type FoldKey = (typeof FOLD_KEYS)[number];
34
+ export const HANDS = ['top', 'bottom'] as const;
35
+ export type HandId = (typeof HANDS)[number];
36
+ /** Which side of the crease swings: `down` — the part above the crease; `up` — the part below it. */
37
+ export const FOLD_DIRECTIONS = ['down', 'up'] as const;
38
+ /** `inward` — the fronts close together (a valley, the flap comes toward the viewer); `outward` — the backs do (a mountain, the flap goes behind). */
39
+ export const FOLD_SIDES = ['inward', 'outward'] as const;
40
+ export const PHASES = ['intro', 'topFold', 'bottomFold', 'foldedHold', 'bottomUnfold', 'topUnfold', 'finalHold'] as const;
41
+ export type PhaseId = (typeof PHASES)[number];
42
+ export const PHASE_LABEL: Record<PhaseId, string> = {
43
+ intro: 'INTRO', topFold: 'TOP_FOLD', bottomFold: 'BOTTOM_FOLD', foldedHold: 'FOLDED_HOLD', bottomUnfold: 'BOTTOM_UNFOLD', topUnfold: 'TOP_UNFOLD', finalHold: 'FINAL_HOLD',
44
+ };
45
+ /** The text slots printed on the paper, and the two canvas-level text elements. */
46
+ export const PAPER_TEXT = ['topLogo', 'topHeadline', 'topSubtitle', 'middleHeadline', 'middleBody', 'bottomHeadline', 'bottomBody', 'bottomCta', 'back'] as const;
47
+ export type PaperTextId = (typeof PAPER_TEXT)[number];
48
+
49
+ /** The groups people see (the Studio sections and the site editor tabs), in order. */
50
+ export const GROUPS = [
51
+ 'Canvas', 'Content', 'Typography', 'Logo', 'Paper', 'Paper Material', 'Panels', 'Folds', 'Creases', 'Fold Lighting',
52
+ 'Hands', 'Hand Styling', 'Hand Motion', 'Background', 'Background Typography', 'Noise', 'CTA', 'Camera', 'Timeline',
53
+ 'Motion', 'Easing', 'Responsive Layout', 'Export',
54
+ ] as const;
55
+ export type Group = (typeof GROUPS)[number];
56
+ export type Control = BaseControl<Group>;
57
+ export type ListSpec = BaseListSpec<Group>;
58
+
59
+ /** Which group a path belongs to: the longest matching prefix wins. */
60
+ const GROUP_PREFIX: [string, Group][] = ([
61
+ ['canvas', 'Canvas'], ['layout', 'Responsive Layout'], ['content', 'Content'], ['typography', 'Typography'], ['logo', 'Logo'],
62
+ ['paper', 'Paper'], ['paperMaterial', 'Paper Material'], ['panels', 'Panels'], ['folds', 'Folds'], ['creases', 'Creases'],
63
+ ['foldLighting', 'Fold Lighting'], ['hands', 'Hands'], ['handInteraction', 'Hand Motion'],
64
+ ['background', 'Background'], ['background.backgroundTypography', 'Background Typography'], ['hands.style', 'Hand Styling'], ['hands.nails', 'Hand Styling'], ['background.noise', 'Noise'],
65
+ ['cta', 'CTA'], ['camera', 'Camera'], ['timeline', 'Timeline'], ['motion', 'Motion'], ['easing', 'Easing'], ['export', 'Export'],
66
+ ] as [string, Group][]).sort((a, b) => b[0].length - a[0].length);
67
+ const groupOf = (path: string): Group => GROUP_PREFIX.find(([p]) => path === p || path.startsWith(`${p}.`))?.[1] ?? 'Canvas';
68
+
69
+ const K = controlKit<Group>(groupOf, EASING_NAMES);
70
+ const { num, int, frames, bool, color, choice, text, easing, asset, opacity, du, pu, norm, deg, factor } = K;
71
+ const weight = (path: string, def: number, description: string) => choice(path, def, FONT_WEIGHTS, description, { unit: 'weight' });
72
+
73
+ /* ─── per-aspect layout blocks ────────────────────────────────────────────────────────────────── */
74
+ type LayoutDefaults = {
75
+ paperX: number; paperY: number; paperHeight: number; logoX: number; logoY: number; logoScale: number;
76
+ ctaX: number; ctaY: number; ctaScale: number; typeScale: number; typeX: number; typeY: number; handScale: number;
77
+ };
78
+ const LAYOUTS: Record<'portrait' | 'landscape' | 'square', LayoutDefaults> = {
79
+ portrait: { paperX: 0.47, paperY: 0.55, paperHeight: 0.43, logoX: 0.5, logoY: 0.095, logoScale: 1.25, ctaX: 0.79, ctaY: 0.93, ctaScale: 1.3, typeScale: 1, typeX: 0, typeY: 0, handScale: 1 },
80
+ landscape: { paperX: 0.37, paperY: 0.57, paperHeight: 0.66, logoX: 0.74, logoY: 0.3, logoScale: 1.35, ctaX: 0.74, ctaY: 0.7, ctaScale: 1.35, typeScale: 0.92, typeX: 0, typeY: -30, handScale: 1 },
81
+ square: { paperX: 0.46, paperY: 0.55, paperHeight: 0.6, logoX: 0.5, logoY: 0.075, logoScale: 1, ctaX: 0.8, ctaY: 0.925, ctaScale: 1, typeScale: 0.78, typeX: 0, typeY: -10, handScale: 1 },
82
+ };
83
+ const layoutControls = (name: keyof typeof LAYOUTS, d: LayoutDefaults): Control[] => {
84
+ const p = `layout.${name}`;
85
+ const shape = name === 'portrait' ? '9:16' : name === 'landscape' ? '16:9' : '1:1';
86
+ return [
87
+ norm(`${p}.paper.x`, d.paperX, 0, 1, `(${shape}) Where the sheet's pivot (paper.originX/Y) sits across the canvas.`),
88
+ norm(`${p}.paper.y`, d.paperY, 0, 1, `(${shape}) Where the sheet's pivot sits down the canvas.`),
89
+ norm(`${p}.paper.height`, d.paperHeight, 0.15, 1.2, `(${shape}) Height of the open (flat) sheet as a fraction of the canvas height; its width follows paper.aspect.`),
90
+ norm(`${p}.logo.x`, d.logoX, 0, 1, `(${shape}) Centre of the logo across the canvas.`),
91
+ norm(`${p}.logo.y`, d.logoY, 0, 1, `(${shape}) Centre of the logo down the canvas.`),
92
+ factor(`${p}.logo.scale`, d.logoScale, 0.2, 4, `(${shape}) Multiplies the logo's size on this canvas shape.`),
93
+ norm(`${p}.cta.x`, d.ctaX, 0, 1, `(${shape}) Centre of the call-to-action button across the canvas.`),
94
+ norm(`${p}.cta.y`, d.ctaY, 0, 1, `(${shape}) Centre of the call-to-action button down the canvas.`),
95
+ factor(`${p}.cta.scale`, d.ctaScale, 0.2, 4, `(${shape}) Multiplies the CTA's size on this canvas shape.`),
96
+ factor(`${p}.backgroundType.scale`, d.typeScale, 0.2, 4, `(${shape}) Multiplies the background typography's size on this canvas shape.`),
97
+ du(`${p}.backgroundType.x`, d.typeX, -2000, 2000, `(${shape}) Extra horizontal offset of the background typography.`),
98
+ du(`${p}.backgroundType.y`, d.typeY, -2000, 2000, `(${shape}) Extra vertical offset of the background typography.`),
99
+ factor(`${p}.handScale`, d.handScale, 0.2, 4, `(${shape}) Multiplies both hands' size on this canvas shape (they already scale with the sheet).`),
100
+ ];
101
+ };
102
+
103
+ /* ─── typography blocks ───────────────────────────────────────────────────────────────────────── */
104
+ type TypeDefaults = { family?: string; weight: number; style?: 'normal' | 'italic'; size: number; lineHeight?: number; tracking?: number; color?: string; x?: number; y?: number; maxWidth?: number; align?: string; rotation?: number; skew?: number };
105
+ /** A text element printed on the paper: position and size are relative to its panel (pu, normalized). */
106
+ const paperType = (id: PaperTextId, what: string, d: TypeDefaults): Control[] => {
107
+ const p = `typography.${id}`;
108
+ return [
109
+ choice(`${p}.fontFamily`, d.family ?? 'Inter', FONT_FAMILIES, `Typeface of the ${what}.`),
110
+ weight(`${p}.fontWeight`, d.weight, `Weight of the ${what}.`),
111
+ choice(`${p}.fontStyle`, d.style ?? 'normal', ['normal', 'italic'], `Upright or italic ${what}.`),
112
+ num(`${p}.fontSize`, d.size, 8, 400, `Type size of the ${what}, in paper units (1/1000 of the sheet's width).`, { step: 1, unit: 'pu' }),
113
+ factor(`${p}.lineHeight`, d.lineHeight ?? 1.05, 0.6, 2.5, `Line height of the ${what}, as a multiple of its size.`),
114
+ num(`${p}.letterSpacing`, d.tracking ?? 0, -0.2, 0.5, `Letter spacing of the ${what}, in em.`, { step: 0.005, unit: 'em' }),
115
+ color(`${p}.color`, d.color ?? '#ffffff', `Colour of the ${what}.`),
116
+ opacity(`${p}.opacity`, 1, `Opacity of the ${what}.`),
117
+ norm(`${p}.x`, d.x ?? 0.12, -0.5, 1.5, `Left edge of the ${what}'s box across its panel (0 = the panel's left edge, 1 = its right edge).`),
118
+ norm(`${p}.y`, d.y ?? 0.2, -0.5, 1.5, `Top of the ${what}'s box down its panel.`),
119
+ norm(`${p}.maxWidth`, d.maxWidth ?? 0.76, 0.05, 1.5, `Width the ${what} wraps within, as a fraction of the panel's width.`),
120
+ choice(`${p}.alignment`, d.align ?? 'left', ['left', 'center', 'right'], `Alignment of the ${what} inside its box.`),
121
+ deg(`${p}.rotation`, d.rotation ?? 0, -45, 45, `Rotation of the ${what} on the paper.`),
122
+ factor(`${p}.scale`, 1, 0.1, 4, `Scale of the ${what}.`),
123
+ deg(`${p}.skew`, d.skew ?? 0, -30, 30, `Horizontal slant of the ${what} (negative leans it forward).`),
124
+ color(`${p}.shadow`, '#1b0a33', `Colour of the ${what}'s shadow.`),
125
+ num(`${p}.shadowBlur`, 0, 0, 80, `Blur of the ${what}'s shadow.`, { step: 1, unit: 'pu' }),
126
+ opacity(`${p}.shadowOpacity`, 0, `Strength of the ${what}'s shadow (0 = none).`),
127
+ ];
128
+ };
129
+ /** A canvas-level text element (logo wordmark, CTA label): placed by its own group and the layout. */
130
+ const uiType = (id: 'logo' | 'cta', what: string, d: TypeDefaults): Control[] => {
131
+ const p = `typography.${id}`;
132
+ return [
133
+ choice(`${p}.fontFamily`, d.family ?? 'Inter', FONT_FAMILIES, `Typeface of the ${what}.`),
134
+ weight(`${p}.fontWeight`, d.weight, `Weight of the ${what}.`),
135
+ choice(`${p}.fontStyle`, d.style ?? 'normal', ['normal', 'italic'], `Upright or italic ${what}.`),
136
+ du(`${p}.fontSize`, d.size, 6, 300, `Type size of the ${what}.`),
137
+ num(`${p}.letterSpacing`, d.tracking ?? 0, -0.2, 0.5, `Letter spacing of the ${what}, in em.`, { step: 0.005, unit: 'em' }),
138
+ color(`${p}.color`, d.color ?? '#ffffff', `Colour of the ${what}.`),
139
+ opacity(`${p}.opacity`, 1, `Opacity of the ${what}.`),
140
+ color(`${p}.shadow`, '#1b0a33', `Colour of the ${what}'s shadow.`),
141
+ du(`${p}.shadowBlur`, 0, 0, 80, `Blur of the ${what}'s shadow.`),
142
+ opacity(`${p}.shadowOpacity`, 0, `Strength of the ${what}'s shadow (0 = none).`),
143
+ ];
144
+ };
145
+
146
+ /* ─── panels, hands, timeline ─────────────────────────────────────────────────────────────────── */
147
+ const panelControls = (id: PanelId, shade: number, area: { x: number; y: number; width: number; height: number }): Control[] => {
148
+ const p = `panels.${id}`;
149
+ return [
150
+ choice(`${p}.colorMode`, 'material', ['material', 'own'], `material: the ${id} panel shows the paper (paperMaterial). own: it is printed in panels.${id}.backgroundColor. The panel's shape never changes — it is part of the one sheet.`),
151
+ color(`${p}.backgroundColor`, '#763bb3', `The ${id} panel's own colour (colorMode own).`),
152
+ bool(`${p}.gradient`, true, `Show the paper gradient on the ${id} panel (off: its flat colour).`),
153
+ factor(`${p}.textureOpacity`, 1, 0, 3, `Multiplies the paper texture and grain on the ${id} panel.`),
154
+ num(`${p}.shade`, shade, -1, 1, `Brightness offset of the ${id} panel over the lighting (negative darkens it). The lighting alone already shades a panel by its angle.`, { step: 0.01 }),
155
+ opacity(`${p}.highlightOpacity`, 1, `How much of the fold lighting's sheen the ${id} panel shows.`),
156
+ opacity(`${p}.shadowOpacity`, 1, `How much shadow the ${id} panel receives from a panel folded over it.`),
157
+ norm(`${p}.contentArea.x`, area.x, 0, 1, `Left edge of the ${id} panel's content safe area (0‥1 across the panel). Text is kept inside it.`),
158
+ norm(`${p}.contentArea.y`, area.y, 0, 1, `Top of the ${id} panel's content safe area (0‥1 down the panel).`),
159
+ norm(`${p}.contentArea.width`, area.width, 0.1, 1, `Width of the ${id} panel's content safe area.`),
160
+ norm(`${p}.contentArea.height`, area.height, 0.1, 1, `Height of the ${id} panel's content safe area.`),
161
+ pu(`${p}.contentArea.padding`, 0, 0, 200, `Inset inside the ${id} panel's content safe area.`),
162
+ bool(`${p}.overflow`, false, `Let text on the ${id} panel run outside its content safe area (off: text is shrunk to fit and clipped to it).`),
163
+ pu(`${p}.contentOffsetX`, 0, -500, 500, `Moves everything printed on the ${id} panel across it (the panel itself never moves off the sheet).`),
164
+ pu(`${p}.contentOffsetY`, 0, -500, 500, `Moves everything printed on the ${id} panel down it.`),
165
+ deg(`${p}.contentRotation`, 0, -45, 45, `Rotates everything printed on the ${id} panel.`),
166
+ factor(`${p}.contentScale`, 1, 0.1, 3, `Scales everything printed on the ${id} panel.`),
167
+ ];
168
+ };
169
+ type HandDefaults = { x: number; y: number; rotation: number; scale: number; offsetX: number; offsetY: number; armLength: number };
170
+ const handControls = (id: HandId, d: HandDefaults): Control[] => {
171
+ const p = `hands.${id}`;
172
+ return [
173
+ bool(`${p}.enabled`, true, `Show the ${id} hand.`),
174
+ norm(`${p}.x`, d.x, 0, 1, `Where the ${id} hand grips the sheet, across it (0 = the left edge, 1 = the right edge). The hand is attached to that point of the paper and follows it through every fold.`),
175
+ norm(`${p}.y`, d.y, 0, 1, `Where the ${id} hand grips the sheet, down it (0 = the top edge, 1 = the bottom edge). The panel under this point is the one it holds.`),
176
+ pu(`${p}.offsetX`, d.offsetX, -600, 600, `Nudges the ${id} hand's drawing across, relative to its grip point.`),
177
+ pu(`${p}.offsetY`, d.offsetY, -600, 600, `Nudges the ${id} hand's drawing down, relative to its grip point.`),
178
+ deg(`${p}.rotation`, d.rotation, -180, 180, `Rotation of the ${id} hand at rest.`),
179
+ factor(`${p}.scale`, d.scale, 0.2, 4, `Size of the ${id} hand (it also scales with the sheet and with depth).`),
180
+ deg(`${p}.skewX`, 0, -30, 30, `Horizontal skew of the ${id} hand.`),
181
+ deg(`${p}.skewY`, 0, -30, 30, `Vertical skew of the ${id} hand.`),
182
+ opacity(`${p}.opacity`, 1, `Opacity of the ${id} hand.`),
183
+ num(`${p}.armLength`, d.armLength, 100, 4000, `How far the ${id} arm reaches back from the wrist (paper units). Long enough to leave the canvas on every shape.`, { step: 10, unit: 'pu' }),
184
+ factor(`${p}.pose.grip`, 1, 0, 1, `How firmly the ${id} hand's gripping fingers close on the paper once it holds it (1 = pressed to the sheet, 0 = open).`),
185
+ factor(`${p}.pose.fingerCurl`, 1, 0.3, 1.4, `How far the ${id} hand's fingers curl at their joints (1 = the reference pose).`),
186
+ num(`${p}.pose.thumbBend`, 0, -1, 1, `Bends the ${id} thumb at its two joints (-1 straighter, 1 more bent).`, { step: 0.01 }),
187
+ deg(`${p}.pose.wrist`, 0, -35, 35, `Bends the ${id} wrist: turns the hand against the forearm about the wrist (the grip stays on the paper; the forearm swings).`),
188
+ deg(`${p}.thumb.rotation`, 0, -25, 25, `Turns the ${id} thumb about its root at the side of the palm.`),
189
+ factor(`${p}.thumb.scale`, 1, 0.8, 1.25, `Size of the ${id} thumb relative to the hand.`),
190
+ num(`${p}.thumb.x`, 0, -30, 30, `Moves the ${id} thumb's root along the side of the palm (hand units).`, { step: 1 }),
191
+ num(`${p}.thumb.y`, 0, -30, 30, `Moves the ${id} thumb's root across the side of the palm (hand units).`, { step: 1 }),
192
+ ];
193
+ };
194
+ type InteractionDefaults = { follow: number; grip: number; move: number; rotate: number; settle: number; lead: number; fromX: number; fromY: number; delay: number; bounce: number; release: number };
195
+ const interactionControls = (id: HandId, d: InteractionDefaults): Control[] => {
196
+ const p = `handInteraction.${id}`;
197
+ return [
198
+ factor(`${p}.followStrength`, d.follow, 0, 1.5, `How closely the ${id} hand follows its grip point as the paper folds (1 = stays on it, 0 = stays put).`),
199
+ pu(`${p}.gripOffset`, d.grip, 0, 200, `The tug: how far the ${id} hand pulls ahead of its grip point while the paper under it is moving.`),
200
+ pu(`${p}.movementAmplitude`, d.move, 0, 200, `How far the ${id} hand shifts toward the sheet's centre while any fold is moving (it braces the sheet).`),
201
+ deg(`${p}.rotationAmplitude`, d.rotate, -60, 60, `How much the ${id} hand's wrist turns at the peak of the fold that moves it.`),
202
+ frames(`${p}.settleDuration`, d.settle, 240, `How long the ${id} hand takes to settle after a move (a damped spring; shorter is tighter).`, 8),
203
+ num(`${p}.bounce`, d.bounce, 0.2, 1.2, `Damping of the ${id} hand's settle: below 1 it overshoots and settles, 1 and above it glides in.`, { step: 0.01, unit: 'factor' }),
204
+ frames(`${p}.leadFrames`, d.lead, 30, `The ${id} hand moves this many frames ahead of the paper — it pulls, the paper follows.`),
205
+ num(`${p}.enterFromX`, d.fromX, -1.5, 1.5, `Where the ${id} hand starts its approach, as an offset across the canvas from its grip (the intro).`, { step: 0.01, unit: 'normalized' }),
206
+ num(`${p}.enterFromY`, d.fromY, -1.5, 1.5, `Where the ${id} hand starts its approach, as an offset down the canvas from its grip.`, { step: 0.01, unit: 'normalized' }),
207
+ frames(`${p}.enterDelayFrames`, d.delay, 600, `Delay of the ${id} hand's approach after the intro starts.`),
208
+ deg(`${p}.gripAngle`, 22, -90, 90, `How far the ${id} hand's gripping finger is open before it closes on the paper.`),
209
+ factor(`${p}.releaseAmount`, d.release, 0, 1, `During FOLDED_HOLD the ${id} hand eases its grip by this much (0 = holds on, 1 = lets go), and grips again before the paper unfolds.`),
210
+ frames(`${p}.releaseFrames`, 14, 120, `How long the ${id} hand takes to ease and re-take its grip.`, 1),
211
+ ];
212
+ };
213
+
214
+ export const CONTROLS: readonly Control[] = [
215
+ /* ─── canvas ─────────────────────────────────────────────────────────────────────────────── */
216
+ choice('canvas.aspectRatio', '9:16', ASPECT_RATIOS, 'Canvas shape. Each shape reads its own layout block (layout.portrait / landscape / square): the composition is laid out again, never stretched. 9:16 is the reference.'),
217
+ int('canvas.width', 2160, 256, 7680, 'Output width in pixels. Must match the aspect ratio (±1%).', { unit: 'px' }),
218
+ int('canvas.height', 3840, 256, 7680, 'Output height in pixels. Must match the aspect ratio (±1%).', { unit: 'px' }),
219
+ choice('canvas.fps', 60, FPS_OPTIONS, 'Output frame rate. Timing is authored in 60 fps motion frames; a lower rate samples the same motion, it does not slow it down.'),
220
+ choice('canvas.durationMode', 'auto', ['auto', 'fixed'], 'auto: the video lasts as long as the timeline. fixed: it lasts canvas.durationFrames — the end is held, or the timeline is cut.'),
221
+ int('canvas.durationFrames', 480, 30, 36000, 'Output length in output frames (durationMode fixed).', { unit: 'frames' }),
222
+ int('canvas.seed', 20260930, 0, 2147483647, 'The seed of every random choice not seeded on its own (the idle sway\'s phase). Same config + same seed = identical frames.'),
223
+ num('canvas.safeArea', 0.03, 0, 0.2, 'Inset on every side, as a fraction of the short side, that the logo and CTA keep clear of.', { unit: 'fraction' }),
224
+
225
+ /* ─── layout (per aspect ratio) ─────────────────────────────────────────────────────────── */
226
+ ...layoutControls('portrait', LAYOUTS.portrait),
227
+ ...layoutControls('landscape', LAYOUTS.landscape),
228
+ ...layoutControls('square', LAYOUTS.square),
229
+
230
+ /* ─── content: every word, plain text ─────────────────────────────────────────────────────── */
231
+ text('content.logo', 'brand', 32, 'The logo wordmark. Empty shows the mark alone.'),
232
+ text('content.top.headline', 'Your headline here', 140, 'The headline printed on the top panel. Wraps within its box; line breaks are kept. Empty hides it.', { multiline: true }),
233
+ text('content.top.logo', '', 32, 'A small wordmark printed at the top of the top panel. Empty hides it.'),
234
+ text('content.top.subtitle', '', 220, 'A subtitle on the top panel. Empty hides it.', { multiline: true }),
235
+ text('content.middle.headline', 'A second message on the middle panel', 140, 'The headline printed on the middle panel. Empty hides it.', { multiline: true }),
236
+ text('content.middle.body', '', 220, 'A subtitle on the middle panel. Empty hides it.', { multiline: true }),
237
+ text('content.bottom.headline', '', 140, 'A headline on the bottom panel. Empty hides it.', { multiline: true }),
238
+ text('content.bottom.body', 'Body copy printed on the bottom panel.', 260, 'The body copy on the bottom panel. Empty hides it.', { multiline: true }),
239
+ text('content.bottom.cta', '', 40, 'A call to action printed on the bottom panel (it folds with the paper). Empty hides it; content.cta.text is the button beside the paper.'),
240
+ text('content.back.text', '', 60, 'Printed on the back of one panel (content.back.panel) — the side the viewer sees once the paper is folded. Empty leaves the back plain.', { multiline: true }),
241
+ choice('content.back.panel', 'top', PANELS, 'Which panel\'s back carries content.back.text.'),
242
+ text('content.cta.text', 'Call to action', 40, 'The call-to-action label. Empty hides the button.'),
243
+
244
+ /* ─── typography ─────────────────────────────────────────────────────────────────────────── */
245
+ ...paperType('topHeadline', 'top headline', { weight: 900, style: 'italic', size: 104, lineHeight: 0.86, tracking: -0.01, x: 0.2, y: 0.17, maxWidth: 0.74, skew: -4 }),
246
+ ...paperType('topLogo', 'wordmark on the top panel', { weight: 700, size: 40, lineHeight: 1, tracking: -0.01, x: 0.2, y: 0.07, maxWidth: 0.6 }),
247
+ ...paperType('topSubtitle', 'top subtitle', { weight: 500, size: 44, lineHeight: 1.15, x: 0.2, y: 0.72, maxWidth: 0.7 }),
248
+ ...paperType('middleHeadline', 'middle headline', { weight: 500, size: 80, lineHeight: 0.98, tracking: -0.025, x: 0.17, y: 0.2, maxWidth: 0.72 }),
249
+ ...paperType('middleBody', 'middle subtitle', { weight: 400, size: 42, lineHeight: 1.2, x: 0.17, y: 0.7, maxWidth: 0.72 }),
250
+ ...paperType('bottomHeadline', 'bottom headline', { weight: 800, size: 70, lineHeight: 0.95, x: 0.2, y: 0.12, maxWidth: 0.72 }),
251
+ ...paperType('bottomBody', 'bottom body copy', { weight: 500, style: 'italic', size: 50, lineHeight: 1.08, tracking: 0.005, x: 0.21, y: 0.24, maxWidth: 0.74 }),
252
+ ...paperType('bottomCta', 'CTA printed on the bottom panel', { weight: 700, size: 40, lineHeight: 1, x: 0.21, y: 0.68, maxWidth: 0.6, color: '#1b0a33' }),
253
+ ...paperType('back', 'text on the back', { weight: 800, size: 90, lineHeight: 1, tracking: -0.02, x: 0.1, y: 0.36, maxWidth: 0.8, align: 'center' }),
254
+ ...uiType('logo', 'logo wordmark', { weight: 600, size: 56, tracking: -0.02 }),
255
+ ...uiType('cta', 'CTA label', { weight: 500, size: 27, tracking: 0, color: '#0a0a0a' }),
256
+
257
+ /* ─── logo ───────────────────────────────────────────────────────────────────────────────── */
258
+ bool('logo.enabled', true, 'Show the logo.'),
259
+ bool('logo.showMark', true, 'Draw the logo mark (a rounded tile with a letter) before the wordmark.'),
260
+ text('logo.markText', 'B', 2, 'The letter(s) on the logo mark.'),
261
+ color('logo.markColor', '#5e4de6', 'Logo mark colour (top-left of its gradient).'),
262
+ color('logo.markColorEnd', '#7a5cff', 'Logo mark colour (bottom-right of its gradient).'),
263
+ color('logo.markTextColor', '#ffffff', 'Colour of the letter on the logo mark.'),
264
+ factor('logo.markSize', 1.05, 0.3, 3, 'Size of the mark, as a multiple of the wordmark\'s type size.'),
265
+ factor('logo.markRadius', 0.26, 0, 0.5, 'Corner radius of the mark, as a fraction of its size.'),
266
+ factor('logo.gap', 0.18, 0, 2, 'Gap between the mark and the wordmark, as a multiple of the type size.'),
267
+ deg('logo.rotation', 0, -45, 45, 'Rotation of the logo.'),
268
+ asset('logo.image', 'A logo image (asset reference) shown instead of the mark and wordmark. Empty: the procedural mark and the wordmark.'),
269
+ du('logo.imageHeight', 90, 10, 600, 'Height of the logo image.'),
270
+ choice('logo.animation', 'drop', ['none', 'drop', 'fade'], 'How the logo arrives during the intro: drop (slides down into place), fade, or none (there from the start).'),
271
+
272
+ /* ─── paper: the sheet and its pose ───────────────────────────────────────────────────────── */
273
+ factor('paper.aspect', 0.7, 0.3, 1.6, 'Width of the open sheet divided by its height.'),
274
+ pu('paper.thickness', 3, 0, 20, 'Paper thickness: the width of the rolled edge a fold makes, and the lip a folded flap shows.'),
275
+ pu('paper.cornerRadius', 3, 0, 60, 'Corner rounding of the sheet.'),
276
+ norm('paper.originX', 0.5, 0, 1, 'The sheet\'s pivot across it: where layout.<shape>.paper.x places it, and what it rotates, skews and scales about.'),
277
+ norm('paper.originY', 0.5, 0, 1, 'The sheet\'s pivot down it.'),
278
+ deg('paper.rotationX', 8, -60, 60, 'Tilts the whole sheet toward (negative) or away from (positive) the viewer about a horizontal axis, in perspective.'),
279
+ deg('paper.rotationY', -9, -60, 60, 'Turns the whole sheet about a vertical axis, in perspective.'),
280
+ deg('paper.rotationZ', 3, -45, 45, 'Rotates the whole sheet in the picture plane.'),
281
+ deg('paper.skewX', -2, -30, 30, 'Skews the whole sheet horizontally.'),
282
+ deg('paper.skewY', 0, -30, 30, 'Skews the whole sheet vertically.'),
283
+ du('paper.translateX', 0, -1500, 1500, 'Moves the whole sheet across.'),
284
+ du('paper.translateY', 0, -1500, 1500, 'Moves the whole sheet down.'),
285
+ factor('paper.scaleX', 1, 0.2, 3, 'Scales the whole sheet across.'),
286
+ factor('paper.scaleY', 1, 0.2, 3, 'Scales the whole sheet down.'),
287
+ factor('paper.scale', 1, 0.2, 3, 'Scales the whole sheet (with scaleX and scaleY).'),
288
+ color('paper.edgeColor', '#4a1f7a', 'Colour of the paper\'s cut edge (its thickness), seen as a panel turns edge-on.'),
289
+ bool('paper.shadow.enabled', true, 'Cast the sheet\'s shadow onto the background.'),
290
+ color('paper.shadow.color', '#3c1473', 'Colour of the sheet\'s shadow on the background.'),
291
+ opacity('paper.shadow.opacity', 0.32, 'Strength of the sheet\'s shadow on the background.'),
292
+ du('paper.shadow.blur', 36, 0, 300, 'Blur of the sheet\'s shadow on the background.'),
293
+ du('paper.shadow.offsetX', 16, -400, 400, 'Horizontal offset of the sheet\'s shadow.'),
294
+ du('paper.shadow.offsetY', 28, -400, 400, 'Vertical offset of the sheet\'s shadow.'),
295
+
296
+ /* ─── paper material ─────────────────────────────────────────────────────────────────────── */
297
+ color('paperMaterial.baseColor', '#7b3fb9', 'The paper\'s colour (its front). With the gradient on, it runs from this colour to secondaryColor.'),
298
+ color('paperMaterial.secondaryColor', '#7036ac', 'The far end of the paper gradient.'),
299
+ color('paperMaterial.backColor', '#8750c2', 'The paper\'s colour on its back, seen when a panel turns over.'),
300
+ bool('paperMaterial.gradientEnabled', true, 'Print a gradient from baseColor to secondaryColor across the whole sheet (continuous over the creases).'),
301
+ deg('paperMaterial.gradientAngle', 170, 0, 360, 'Direction of the paper gradient (CSS angle: 180 = top to bottom).'),
302
+ opacity('paperMaterial.textureOpacity', 0.07, 'Strength of the paper fibre texture (procedural, seeded).'),
303
+ bool('paperMaterial.grainEnabled', true, 'Fine procedural grain on the paper.'),
304
+ opacity('paperMaterial.grainOpacity', 0.05, 'Strength of the fine paper grain.'),
305
+ factor('paperMaterial.grainScale', 1, 0.3, 4, 'Size of the grain (1 = fine).'),
306
+ int('paperMaterial.grainSeed', 7, 0, 99999, 'Seed of the paper texture and grain.'),
307
+ opacity('paperMaterial.edgeHighlight', 0.22, 'A light line along the sheet\'s outer edges.'),
308
+ opacity('paperMaterial.edgeShadow', 0.18, 'A dark line along the sheet\'s outer edges.'),
309
+ opacity('paperMaterial.creaseTexture', 0.12, 'How visible a crease is while the paper lies flat (it deepens as the paper folds).'),
310
+ factor('paperMaterial.creaseHighlight', 1, 0, 2, 'Multiplies every crease\'s ridge highlight.'),
311
+ factor('paperMaterial.creaseShadow', 1, 0, 2, 'Multiplies every crease\'s valley shading.'),
312
+
313
+ /* ─── panels ─────────────────────────────────────────────────────────────────────────────── */
314
+ ...panelControls('top', 0, { x: 0.06, y: 0.05, width: 0.88, height: 0.9 }),
315
+ ...panelControls('middle', 0, { x: 0.06, y: 0.05, width: 0.88, height: 0.9 }),
316
+ ...panelControls('bottom', 0, { x: 0.06, y: 0.05, width: 0.88, height: 0.9 }),
317
+
318
+ /* ─── fold lighting ──────────────────────────────────────────────────────────────────────── */
319
+ deg('foldLighting.lightAngle', -95, -180, 180, 'Where the light comes from in the picture plane (-90 = from above, 0 = from the right, 90 = from below).'),
320
+ deg('foldLighting.lightElevation', 25, 0, 90, 'How far the light is raised toward the viewer (90 = straight from the viewer: every panel facing you is equally lit).'),
321
+ num('foldLighting.ambient', 0.62, 0, 1.5, 'Light every panel gets whatever its angle.', { unit: 'factor' }),
322
+ num('foldLighting.diffuse', 0.6, 0, 1.5, 'Light a panel gets from facing the light.', { unit: 'factor' }),
323
+ opacity('foldLighting.shadowOpacity', 0.5, 'Strength of the shadow a folding panel casts on the panel it closes over (the contact region darkens).'),
324
+ pu('foldLighting.shadowBlur', 40, 0, 300, 'Softness of that shadow\'s far edge.'),
325
+ pu('foldLighting.shadowOffset', 18, 0, 300, 'How far the shadow reaches past the folding panel\'s edge.'),
326
+ opacity('foldLighting.creaseDarkness', 0.45, 'Darkening in the valley of a crease as it closes.'),
327
+ opacity('foldLighting.edgeHighlight', 0.55, 'Highlight on a folded edge where it turns toward the light.'),
328
+ opacity('foldLighting.highlightOpacity', 0.16, 'The sheen a panel shows when it faces the light.'),
329
+ num('foldLighting.backShade', -0.05, -1, 1, 'Brightness offset of the paper\'s back.', { step: 0.01 }),
330
+
331
+ /* ─── hands ──────────────────────────────────────────────────────────────────────────────── */
332
+ ...handControls('top', { x: 0.5, y: 0, rotation: -4, scale: 1.15, offsetX: 0, offsetY: 0, armLength: 2600 }),
333
+ ...handControls('bottom', { x: 0.55, y: 0.955, rotation: 0, scale: 1.1, offsetX: 0, offsetY: 0, armLength: 2000 }),
334
+
335
+ /* ─── hand styling ───────────────────────────────────────────────────────────────────────── */
336
+ color('hands.style.baseColor', '#873a1c', 'Skin colour (both hands).'),
337
+ color('hands.style.midtoneColor', '#7a3217', 'Skin turning away from the light (the sides of fingers, the far side of the palm).'),
338
+ color('hands.style.shadowColor', '#5e260b', 'Skin in shadow: under and between fingers, under the thumb, the wrist crease, fingers behind the paper.'),
339
+ color('hands.style.highlightColor', '#9d4b26', 'Lit skin (the knuckles, the top of the hand and thumb).'),
340
+ color('hands.style.nailColor', '#e57953', 'Fingernail colour.'),
341
+ opacity('hands.style.highlightOpacity', 0.9, 'Strength of the highlight shapes.'),
342
+ opacity('hands.style.shadowOpacity', 1, 'Strength of the shadow shapes.'),
343
+ opacity('hands.style.dropShadowOpacity', 0.28, 'Strength of the contact shadow the gripping fingers cast on the paper.'),
344
+ pu('hands.style.dropShadowBlur', 10, 0, 100, 'Blur of that contact shadow.'),
345
+ pu('hands.style.dropShadowOffset', 7, 0, 100, 'Offset of that contact shadow.'),
346
+ bool('hands.style.sleeve.enabled', false, 'Draw a sleeve on each forearm.'),
347
+ color('hands.style.sleeve.color', '#1f2a44', 'Sleeve colour.'),
348
+ factor('hands.style.sleeve.position', 0.35, 0, 1, 'Where the cuff sits along the arm, from the wrist (0) to the arm\'s far end (1).'),
349
+ pu('hands.style.outlineWidth', 0, 0, 20, 'An outline around the hand\'s silhouette (0 = none, as in the reference).'),
350
+ color('hands.style.outlineColor', '#3a1606', 'Outline colour.'),
351
+ bool('hands.nails.enabled', true, 'Draw fingernails where they face the viewer.'),
352
+ opacity('hands.nails.opacity', 0.95, 'Nail opacity (lower for a subtler accent).'),
353
+ factor('hands.nails.scale', 1, 0.6, 1.3, 'Nail size relative to its fingertip.'),
354
+
355
+ /* ─── hand motion ────────────────────────────────────────────────────────────────────────── */
356
+ ...interactionControls('top', { follow: 1, grip: 0, move: 6, rotate: 14, settle: 24, lead: 0, fromX: -0.35, fromY: -0.22, delay: 0, bounce: 0.62, release: 0.4 }),
357
+ ...interactionControls('bottom', { follow: 1, grip: 0, move: 12, rotate: -8, settle: 28, lead: 0, fromX: -0.28, fromY: 0.26, delay: 8, bounce: 0.7, release: 0.2 }),
358
+
359
+ /* ─── background ─────────────────────────────────────────────────────────────────────────── */
360
+ color('background.baseColor', '#b46cff', 'Background colour (under the gradient).'),
361
+ bool('background.gradient.enabled', true, 'Paint the background with the gradient stops.'),
362
+ choice('background.gradient.type', 'linear', ['linear', 'radial'], 'Linear or radial gradient.'),
363
+ deg('background.gradient.angle', 180, 0, 360, 'Direction of a linear gradient (CSS angle: 180 = top to bottom).'),
364
+ bool('background.glow.enabled', true, 'A soft glow behind the paper.'),
365
+ norm('background.glow.x', 0.46, -0.5, 1.5, 'Glow centre across the canvas.'),
366
+ norm('background.glow.y', 0.52, -0.5, 1.5, 'Glow centre down the canvas.'),
367
+ num('background.glow.radius', 0.6, 0.02, 3, 'Glow radius, as a fraction of the short side.', { unit: 'short' }),
368
+ color('background.glow.color', '#d6a6ff', 'Glow colour.'),
369
+ opacity('background.glow.opacity', 0.28, 'Glow strength.'),
370
+ du('background.glow.blur', 90, 0, 600, 'Glow blur.'),
371
+
372
+ /* ─── background typography ──────────────────────────────────────────────────────────────── */
373
+ bool('background.backgroundTypography.enabled', true, 'Show the large background word.'),
374
+ text('background.backgroundTypography.text', 'PROMO', 24, 'The background word, repeated in rows.'),
375
+ choice('background.backgroundTypography.fontFamily', 'Inter', FONT_FAMILIES, 'Typeface of the background word.'),
376
+ du('background.backgroundTypography.fontSize', 262, 20, 1600, 'Type size of the background word.'),
377
+ weight('background.backgroundTypography.weight', 700, 'Weight of the background word.'),
378
+ opacity('background.backgroundTypography.opacity', 1, 'Opacity of the background word.'),
379
+ color('background.backgroundTypography.color', '#a05ce7', 'Colour of the background word.'),
380
+ num('background.backgroundTypography.tracking', -0.03, -0.3, 1, 'Letter spacing of the background word, in em.', { step: 0.005, unit: 'em' }),
381
+ du('background.backgroundTypography.x', -16, -2000, 2000, 'Horizontal offset of the rows.'),
382
+ du('background.backgroundTypography.y', -42, -2000, 2000, 'Vertical offset of the first row.'),
383
+ deg('background.backgroundTypography.rotation', 0, -90, 90, 'Rotation of the whole block of rows.'),
384
+ int('background.backgroundTypography.rows', 9, 1, 24, 'How many rows of the word.'),
385
+ factor('background.backgroundTypography.rowGap', 0.8, 0.4, 3, 'Row pitch, as a multiple of the type size.'),
386
+ int('background.backgroundTypography.repeat', 1, 1, 8, 'How many times the word repeats along each row (at least).'),
387
+ bool('background.backgroundTypography.fill', true, 'Repeat the word further where one row would not span the canvas (a wide canvas), so every shape is covered edge to edge.'),
388
+ num('background.backgroundTypography.drift', 0, -400, 400, 'Rows slide sideways at this speed.', { step: 1, unit: 'du/s' }),
389
+ bool('background.backgroundTypography.alternate', true, 'Alternate rows slide the opposite way.'),
390
+
391
+ /* ─── noise ──────────────────────────────────────────────────────────────────────────────── */
392
+ bool('background.noise.enabled', true, 'Procedural grain over the background.'),
393
+ opacity('background.noise.opacity', 0.05, 'Grain strength.'),
394
+ factor('background.noise.scale', 1, 0.2, 5, 'Grain size (1 = fine film grain).'),
395
+ int('background.noise.seed', 11, 0, 99999, 'Grain seed. Same seed = same grain.'),
396
+
397
+ /* ─── CTA ────────────────────────────────────────────────────────────────────────────────── */
398
+ bool('cta.enabled', true, 'Show the call-to-action button.'),
399
+ color('cta.backgroundColor', '#ffffff', 'Button colour.'),
400
+ color('cta.borderColor', '#ffffff', 'Button border colour.'),
401
+ du('cta.borderWidth', 0, 0, 20, 'Button border width.'),
402
+ du('cta.radius', 9, 0, 200, 'Button corner radius.'),
403
+ du('cta.paddingX', 30, 0, 200, 'Space left and right of the label.'),
404
+ du('cta.paddingY', 13, 0, 120, 'Space above and below the label.'),
405
+ deg('cta.rotation', -4, -45, 45, 'Button rotation.'),
406
+ color('cta.shadowColor', '#3c1473', 'Button shadow colour.'),
407
+ opacity('cta.shadowOpacity', 0.2, 'Button shadow strength.'),
408
+ du('cta.shadowBlur', 18, 0, 120, 'Button shadow blur.'),
409
+ choice('cta.animation', 'pop-pulse', ['none', 'pop', 'pulse', 'pop-pulse'], 'pop: springs in during the intro. pulse: breathes during the final hold. pop-pulse: both. none: there from the start, still.'),
410
+ frames('cta.enterDelayFrames', 24, 3600, 'When the button pops in, after the video starts.'),
411
+ frames('cta.enterDurationFrames', 30, 600, 'How long the pop takes.', 1),
412
+ factor('cta.pulseAmount', 0.04, 0, 0.3, 'How much the button grows at the top of each pulse.'),
413
+ num('cta.pulseFrequency', 1.1, 0.1, 4, 'Pulses per second.', { unit: 'hz' }),
414
+
415
+ /* ─── camera ─────────────────────────────────────────────────────────────────────────────── */
416
+ factor('camera.startZoom', 1, 0.5, 3, 'Zoom while the paper is open, before it folds.'),
417
+ factor('camera.foldZoom', 1.12, 0.5, 3, 'Zoom the camera pushes to as the paper folds (reached when every fold is at its peak).'),
418
+ factor('camera.endZoom', 1, 0.5, 3, 'Zoom the camera settles at in the final hold.'),
419
+ du('camera.x', 0, -1500, 1500, 'Camera pan across (positive moves the view right: the picture moves left).'),
420
+ du('camera.y', 0, -1500, 1500, 'Camera pan down.'),
421
+ deg('camera.rotation', 0, -30, 30, 'Camera roll.'),
422
+ du('camera.perspective', 2400, 1400, 12000, 'Distance from the viewer to the paper: smaller is a stronger perspective (a fold looks deeper).'),
423
+ norm('camera.vanishX', 0.5, -0.5, 1.5, 'The vanishing point across the sheet (0.5 = its centre).'),
424
+ norm('camera.vanishY', 0.45, -0.5, 1.5, 'The vanishing point down the sheet.'),
425
+ factor('camera.parallax', 0.35, 0, 1, 'How much the background follows the camera (0 = it stays still, 1 = it moves with the paper).'),
426
+
427
+ /* ─── timeline ───────────────────────────────────────────────────────────────────────────── */
428
+ int('timeline.intro.startFrame', 0, 0, 3600, 'Frame the intro starts on (the hands approach and grip).', { unit: 'frames' }),
429
+ int('timeline.intro.delayFrames', 0, 0, 600, 'Extra frames before the intro starts.', { unit: 'frames' }),
430
+ frames('timeline.intro.durationFrames', 60, 600, 'Length of the intro: the hands\' approach and grip.', 1),
431
+ easing('timeline.intro.easing', 'easeOutCubic', 'How the hands (and, with motion.intro.mode rise, the paper) arrive.'),
432
+ int('timeline.topFold.startFrame', -1, -1, 3600, 'Frame TOP_FOLD starts on; -1 = right after the intro. Its delay, length and easing are the top fold\'s (folds.top.delayFrames / durationFrames / easing).', { unit: 'frames' }),
433
+ int('timeline.bottomFold.startFrame', -1, -1, 3600, 'Frame BOTTOM_FOLD starts on; -1 = right after TOP_FOLD. Delay, length and easing: folds.bottom.', { unit: 'frames' }),
434
+ int('timeline.foldedHold.startFrame', -1, -1, 3600, 'Frame FOLDED_HOLD starts on; -1 = right after BOTTOM_FOLD.', { unit: 'frames' }),
435
+ int('timeline.foldedHold.delayFrames', 0, -240, 600, 'Gap before the hold (negative overlaps the fold).', { unit: 'frames' }),
436
+ frames('timeline.foldedHold.durationFrames', 44, 3600, 'How long the paper stays folded.'),
437
+ easing('timeline.foldedHold.easing', 'easeInOut', 'Shapes the squeeze the paper gives while it is held folded (motion.holdSqueeze).'),
438
+ int('timeline.bottomUnfold.startFrame', -1, -1, 3600, 'Frame BOTTOM_UNFOLD starts on; -1 = right after the hold. Delay, length and easing: folds.bottom.unfold*.', { unit: 'frames' }),
439
+ int('timeline.topUnfold.startFrame', -1, -1, 3600, 'Frame TOP_UNFOLD starts on; -1 = right after BOTTOM_UNFOLD. Delay, length and easing: folds.top.unfold*.', { unit: 'frames' }),
440
+ int('timeline.finalHold.startFrame', -1, -1, 3600, 'Frame FINAL_HOLD starts on; -1 = right after TOP_UNFOLD.', { unit: 'frames' }),
441
+ int('timeline.finalHold.delayFrames', 0, -240, 600, 'Gap before the final hold (negative overlaps the unfold).', { unit: 'frames' }),
442
+ frames('timeline.finalHold.durationFrames', 60, 3600, 'How long the open paper holds at the end.'),
443
+ easing('timeline.finalHold.easing', 'easeInOutCubic', 'How the camera settles to camera.endZoom in the final hold.'),
444
+
445
+ /* ─── motion ─────────────────────────────────────────────────────────────────────────────── */
446
+ factor('motion.speed', 1, 0.25, 4, 'Plays the whole timeline faster (above 1) or slower (below 1). The video\'s length follows.'),
447
+ choice('motion.progressMode', 'timeline', ['timeline', 'manual'], 'timeline: the folds play as the timeline says. manual: motion.foldProgress poses the paper directly (the hands hold on; the rest of the motion still plays).'),
448
+ factor('motion.foldProgress', 0, 0, 1, 'FOLD PROGRESS (manual mode): 0 = the paper completely flat, 0.5 = the first fold done, 1 = completely folded. It sets the crease angles themselves — the geometry, not a picture of it.'),
449
+ choice('motion.intro.mode', 'hands', ['hands', 'rise', 'none'], 'hands: the paper is there, the hands reach in and grip it. rise: paper and hands rise into frame together. none: everything in place from the first frame.'),
450
+ du('motion.intro.paperOffsetY', 900, 0, 4000, 'rise: how far below its place the paper starts.'),
451
+ deg('motion.intro.paperRotation', -8, -90, 90, 'rise: the paper\'s rotation as it starts.'),
452
+ bool('motion.idle.enabled', true, 'A slow sway and bob that keeps the held paper alive.'),
453
+ deg('motion.idle.swayAngle', 0.7, 0, 10, 'How far the paper sways.'),
454
+ du('motion.idle.bobAmplitude', 5, 0, 80, 'How far the paper bobs up and down.'),
455
+ num('motion.idle.frequency', 0.3, 0.02, 3, 'Sway and bob cycles per second.', { unit: 'hz' }),
456
+ factor('motion.holdSqueeze', 0.985, 0.8, 1.2, 'The folded paper\'s scale at the middle of FOLDED_HOLD (below 1 squeezes it; the hands press it).'),
457
+
458
+ /* ─── easing ─────────────────────────────────────────────────────────────────────────────── */
459
+ easing('easing.camera', 'easeInOutCubic', 'How the camera moves toward camera.foldZoom as the paper folds.'),
460
+ easing('easing.ctaEnter', 'easeOutBack', 'How the CTA pops in.'),
461
+ easing('easing.fingerGrip', 'easeInOutCubic', 'How the gripping fingers close on the paper at the end of each hand\'s approach.'),
462
+ easing('easing.logoEnter', 'easeOutCubic', 'How the logo arrives.'),
463
+
464
+ /* ─── export ─────────────────────────────────────────────────────────────────────────────── */
465
+ choice('export.codec', 'h264', ['h264', 'h265', 'prores', 'vp9'], 'Video codec of the rendered file.'),
466
+ choice('export.pixelFormat', 'yuv420p', ['yuv420p', 'yuv444p', 'yuv422p10le'], 'Pixel format. yuv420p plays everywhere.'),
467
+ choice('export.colorSpace', 'bt709', ['bt709', 'default'], 'Colour space tag. bt709 is correct for HD/4K SDR.'),
468
+ int('export.crf', 12, 0, 51, 'H.264/H.265 quality (lower is better; 12 is visually lossless).'),
469
+ choice('export.x264Preset', 'slow', ['ultrafast', 'veryfast', 'fast', 'medium', 'slow', 'slower', 'veryslow'], 'Encoder effort.'),
470
+ choice('export.imageFormat', 'png', ['png', 'jpeg'], 'Frame capture format (png keeps gradients clean).'),
471
+ ];
472
+
473
+ /* ─── lists ───────────────────────────────────────────────────────────────────────────────────── */
474
+ const F = (c: BaseControl<string>) => inGroup<Group>('Folds', c);
475
+ const FOLD_ITEM: Control[] = [
476
+ F({ ...choice('id', 'top', FOLD_KEYS, 'Which crease this fold turns about: top = creases.top, bottom = creases.bottom. Fixed.'), userEditable: false, agentEditable: false }),
477
+ F(bool('enabled', true, 'Fold at this crease. Off: the crease stays at its start angle and its phases take no time.')),
478
+ F(choice('direction', 'down', FOLD_DIRECTIONS, 'Which side of the crease swings: down — the part above it (the top panel, for the top fold); up — the part below it. The two folds must agree on one panel that stays put: top up + bottom down is refused.')),
479
+ F(choice('side', 'inward', FOLD_SIDES, 'inward: the panel folds toward the viewer, over the front (a valley). outward: it folds away, behind (a mountain). Decides whether the folded panel lies in front of or behind its neighbour.')),
480
+ F(deg('startAngle', 0, -90, 180, 'The crease\'s angle while the paper is open, before this fold (0 = flat; negative bends it the other way).')),
481
+ F(deg('peakAngle', 150, -90, 180, 'The crease\'s angle at the peak of the fold (180 = folded flat).')),
482
+ F(deg('endAngle', 0, -90, 180, 'The crease\'s angle after it unfolds (the same as startAngle returns the paper to its open geometry).')),
483
+ F(factor('startScale', 1, 0.5, 1.5, 'The sheet\'s scale before this fold.')),
484
+ F(factor('peakScale', 1, 0.5, 1.5, 'The sheet\'s scale at the fold\'s peak (the folds multiply).')),
485
+ F(factor('endScale', 1, 0.5, 1.5, 'The sheet\'s scale after this fold unfolds.')),
486
+ F(deg('edgeLift', 40, 0, 70, 'How far the gripped free edge lifts and curls ahead of the fold (the hand lifts the paper before it folds over). Peaks early in the fold, flat again when folded.')),
487
+ F(factor('edgeLiftSize', 0.32, 0.05, 0.6, 'How much of the panel, from its free edge, curls with that lift.')),
488
+ F(factor('curvature', 0.35, 0, 1, 'How round the fold is: 0 = a sharp hinge, 1 = a wide bend. The turn is spread over a band of the sheet around the crease, so the paper bends rather than rotating like a card.')),
489
+ F(factor('perspective', 1.15, 0.5, 2.5, 'Perspective strength at the peak of this fold (above 1 deepens it; it relaxes as the paper unfolds).')),
490
+ F(du('translationX', 0, -800, 800, 'How far the sheet shifts across at the peak of this fold (the hands move it).')),
491
+ F(du('translationY', 0, -800, 800, 'How far the sheet shifts down at the peak of this fold.')),
492
+ F(deg('rotationZ', 0, -30, 30, 'How far the sheet turns in the picture plane at the peak of this fold.')),
493
+ F({ ...int('delayFrames', 6, -240, 600, 'Gap before the fold starts (negative overlaps the phase before).', { unit: 'frames' }) }),
494
+ F(frames('durationFrames', 54, 3600, 'How long the fold takes.', 1)),
495
+ F(easing('easing', 'easeInOutCubic', 'How the fold moves.')),
496
+ F({ ...int('unfoldDelayFrames', 0, -240, 600, 'Gap before the unfold starts (negative overlaps the phase before).', { unit: 'frames' }) }),
497
+ F(frames('unfoldDurationFrames', 50, 3600, 'How long the unfold takes.', 1)),
498
+ F(easing('unfoldEasing', 'easeInOutCubic', 'How the unfold moves.')),
499
+ F(factor('shadowIntensity', 1, 0, 2, 'Multiplies the fold lighting\'s shadow for this fold.')),
500
+ F(factor('creaseIntensity', 1, 0, 2, 'How much this crease darkens as it folds (it softens again as it opens).')),
501
+ ];
502
+ const C = (c: BaseControl<string>) => inGroup<Group>('Creases', c);
503
+ const CREASE_ITEM: Control[] = [
504
+ C({ ...choice('id', 'top', FOLD_KEYS, 'Which crease: top (between the top and middle panels) or bottom (between the middle and bottom panels). Fixed.'), userEditable: false, agentEditable: false }),
505
+ C(bool('enabled', true, 'Draw the crease line (the paper still folds here when this is off).')),
506
+ C(norm('position', 0.333, 0.1, 0.9, 'Where the crease runs, down the sheet (0 = the top edge, 1 = the bottom edge). The panels are the strips between the creases.')),
507
+ C(pu('width', 3, 0.5, 30, 'Width of the crease line.')),
508
+ C(color('color', '#2c0f52', 'Crease colour.')),
509
+ C(opacity('opacity', 0.55, 'Crease line strength at full fold.')),
510
+ C(opacity('darkness', 0.45, 'How dark the crease\'s valley gets as it closes (× foldLighting.creaseDarkness).')),
511
+ C(pu('softness', 1.5, 0, 30, 'Softness (blur) of the crease line.')),
512
+ C(opacity('highlight', 0.35, 'The light ridge beside the crease on its convex side.')),
513
+ C(color('highlightColor', '#c9a0ff', 'Colour of that ridge.')),
514
+ ];
515
+ const G = (c: BaseControl<string>) => inGroup<Group>('Background', c);
516
+ const STOP_ITEM: Control[] = [
517
+ G(num('offset', 0, 0, 1, 'Where the stop sits along the gradient (0‥1). Stops must be in order.', { step: 0.01, unit: 'fraction' })),
518
+ G(color('color', '#b46cff', 'Stop colour.')),
519
+ ];
520
+
521
+ const fold = (id: FoldKey, over: Record<string, unknown>) => ({
522
+ id, enabled: true, direction: id === 'top' ? 'down' : 'up', side: 'inward', startAngle: 0, peakAngle: 150, endAngle: 0,
523
+ startScale: 1, peakScale: 1, endScale: 1, edgeLift: 40, edgeLiftSize: 0.32, curvature: 0.35, perspective: 1.15, translationX: 0, translationY: 0, rotationZ: 0,
524
+ delayFrames: 6, durationFrames: 54, easing: 'easeInOutCubic', unfoldDelayFrames: 0, unfoldDurationFrames: 50, unfoldEasing: 'easeInOutCubic',
525
+ shadowIntensity: 1, creaseIntensity: 1, ...over,
526
+ });
527
+ const crease = (id: FoldKey, position: number) => ({ id, enabled: true, position, width: 3, color: '#2c0f52', opacity: 0.55, darkness: 0.45, softness: 1.5, highlight: 0.35, highlightColor: '#c9a0ff' });
528
+
529
+ export const LISTS: readonly ListSpec[] = [
530
+ {
531
+ path: 'folds', group: 'Folds', minItems: 2, maxItems: 2, item: FOLD_ITEM, keyField: 'id', keys: FOLD_KEYS,
532
+ description: 'The two folds, one per crease, in order: top (folds.0, also folds.top), then bottom (folds.1, also folds.bottom).',
533
+ default: [
534
+ // The reference: the bottom hand holds the bottom panel still (both folds swing the part above
535
+ // their crease). The top hand pulls the top panel forward over the front; then the folded pair
536
+ // tucks behind the bottom panel, leaving a small card with the body copy facing the viewer.
537
+ fold('top', { side: 'inward', startAngle: 0, peakAngle: 172, endAngle: 0, peakScale: 1.02, translationY: 40, rotationZ: -1.5, delayFrames: 26, durationFrames: 84, unfoldDurationFrames: 62, curvature: 0.4 }),
538
+ fold('bottom', { direction: 'down', side: 'outward', startAngle: 0, peakAngle: 168, endAngle: 0, peakScale: 1.02, translationY: -70, rotationZ: 1, delayFrames: 4, durationFrames: 78, unfoldDurationFrames: 60, edgeLift: 18, curvature: 0.4 }),
539
+ ],
540
+ },
541
+ {
542
+ path: 'creases', group: 'Creases', minItems: 2, maxItems: 2, item: CREASE_ITEM, keyField: 'id', keys: FOLD_KEYS,
543
+ description: 'The two creases, top (creases.0, also creases.top) then bottom. Their positions split the sheet into the three panels.',
544
+ default: [crease('top', 0.333), crease('bottom', 0.655)],
545
+ },
546
+ {
547
+ path: 'background.gradient.stops', group: 'Background', minItems: 2, maxItems: 6, item: STOP_ITEM,
548
+ description: 'Background gradient stops, in order of offset.',
549
+ default: [{ offset: 0, color: '#b46cff' }, { offset: 1, color: '#aa62f7' }],
550
+ },
551
+ ];
552
+
553
+ export const CONTROL_BY_PATH = new Map(CONTROLS.map((c) => [c.path, c]));
554
+ export const LIST_BY_PATH = new Map(LISTS.map((l) => [l.path, l]));
555
+
556
+ /** Every editable leaf, lists expanded as `<list>[].<field>` — the count people and agents see. */
557
+ export const allControls = () => expandControls(CONTROLS, LISTS);