@vysmo/transitions 0.1.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (384) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +618 -0
  3. package/dist/index.d.ts +6 -0
  4. package/dist/index.d.ts.map +1 -0
  5. package/dist/index.js +3 -0
  6. package/dist/index.js.map +1 -0
  7. package/dist/inputs/normalize.d.ts +2 -0
  8. package/dist/inputs/normalize.d.ts.map +1 -0
  9. package/dist/inputs/normalize.js +2 -0
  10. package/dist/inputs/normalize.js.map +1 -0
  11. package/dist/runner/gl.d.ts +7 -0
  12. package/dist/runner/gl.d.ts.map +1 -0
  13. package/dist/runner/gl.js +59 -0
  14. package/dist/runner/gl.js.map +1 -0
  15. package/dist/runner/mesh.d.ts +28 -0
  16. package/dist/runner/mesh.d.ts.map +1 -0
  17. package/dist/runner/mesh.js +96 -0
  18. package/dist/runner/mesh.js.map +1 -0
  19. package/dist/runner/runner.d.ts +107 -0
  20. package/dist/runner/runner.d.ts.map +1 -0
  21. package/dist/runner/runner.js +410 -0
  22. package/dist/runner/runner.js.map +1 -0
  23. package/dist/transitions/all.d.ts +9 -0
  24. package/dist/transitions/all.d.ts.map +1 -0
  25. package/dist/transitions/all.js +129 -0
  26. package/dist/transitions/all.js.map +1 -0
  27. package/dist/transitions/bloom-reveal.d.ts +27 -0
  28. package/dist/transitions/bloom-reveal.d.ts.map +1 -0
  29. package/dist/transitions/bloom-reveal.js +106 -0
  30. package/dist/transitions/bloom-reveal.js.map +1 -0
  31. package/dist/transitions/chromatic-pulse.d.ts +4 -0
  32. package/dist/transitions/chromatic-pulse.d.ts.map +1 -0
  33. package/dist/transitions/chromatic-pulse.js +40 -0
  34. package/dist/transitions/chromatic-pulse.js.map +1 -0
  35. package/dist/transitions/clock-wipe.d.ts +6 -0
  36. package/dist/transitions/clock-wipe.d.ts.map +1 -0
  37. package/dist/transitions/clock-wipe.js +33 -0
  38. package/dist/transitions/clock-wipe.js.map +1 -0
  39. package/dist/transitions/color-phase.d.ts +10 -0
  40. package/dist/transitions/color-phase.d.ts.map +1 -0
  41. package/dist/transitions/color-phase.js +24 -0
  42. package/dist/transitions/color-phase.js.map +1 -0
  43. package/dist/transitions/colour-distance.d.ts.map +1 -0
  44. package/dist/transitions/cross-warp.d.ts.map +1 -0
  45. package/dist/transitions/cross-zoom.d.ts +5 -0
  46. package/dist/transitions/cross-zoom.d.ts.map +1 -0
  47. package/dist/transitions/cross-zoom.js +59 -0
  48. package/dist/transitions/cross-zoom.js.map +1 -0
  49. package/dist/transitions/crosshatch.d.ts +12 -0
  50. package/dist/transitions/crosshatch.d.ts.map +1 -0
  51. package/dist/transitions/crosshatch.js +49 -0
  52. package/dist/transitions/crosshatch.js.map +1 -0
  53. package/dist/transitions/define.d.ts +35 -0
  54. package/dist/transitions/define.d.ts.map +1 -0
  55. package/dist/transitions/define.js +37 -0
  56. package/dist/transitions/define.js.map +1 -0
  57. package/dist/transitions/directional-burn.d.ts +14 -0
  58. package/dist/transitions/directional-burn.d.ts.map +1 -0
  59. package/dist/transitions/directional-burn.js +67 -0
  60. package/dist/transitions/directional-burn.js.map +1 -0
  61. package/dist/transitions/directional-warp.d.ts +12 -0
  62. package/dist/transitions/directional-warp.d.ts.map +1 -0
  63. package/dist/transitions/directional-warp.js +46 -0
  64. package/dist/transitions/directional-warp.js.map +1 -0
  65. package/dist/transitions/dissolve.d.ts +2 -0
  66. package/dist/transitions/dissolve.d.ts.map +1 -0
  67. package/dist/transitions/dissolve.js +16 -0
  68. package/dist/transitions/dissolve.js.map +1 -0
  69. package/dist/transitions/dreamy-zoom.d.ts +25 -0
  70. package/dist/transitions/dreamy-zoom.d.ts.map +1 -0
  71. package/dist/transitions/dreamy-zoom.js +66 -0
  72. package/dist/transitions/dreamy-zoom.js.map +1 -0
  73. package/dist/transitions/dreamy.d.ts +8 -0
  74. package/dist/transitions/dreamy.d.ts.map +1 -0
  75. package/dist/transitions/dreamy.js +26 -0
  76. package/dist/transitions/dreamy.js.map +1 -0
  77. package/dist/transitions/drip-wipe.d.ts +22 -0
  78. package/dist/transitions/drip-wipe.d.ts.map +1 -0
  79. package/dist/transitions/drip-wipe.js +109 -0
  80. package/dist/transitions/drip-wipe.js.map +1 -0
  81. package/dist/transitions/ember-scatter.d.ts +22 -0
  82. package/dist/transitions/ember-scatter.d.ts.map +1 -0
  83. package/dist/transitions/ember-scatter.js +94 -0
  84. package/dist/transitions/ember-scatter.js.map +1 -0
  85. package/dist/transitions/film-burn.d.ts +17 -0
  86. package/dist/transitions/film-burn.d.ts.map +1 -0
  87. package/dist/transitions/film-burn.js +101 -0
  88. package/dist/transitions/film-burn.js.map +1 -0
  89. package/dist/transitions/film-grain.d.ts +24 -0
  90. package/dist/transitions/film-grain.d.ts.map +1 -0
  91. package/dist/transitions/film-grain.js +78 -0
  92. package/dist/transitions/film-grain.js.map +1 -0
  93. package/dist/transitions/flow-warp.d.ts +20 -0
  94. package/dist/transitions/flow-warp.d.ts.map +1 -0
  95. package/dist/transitions/flow-warp.js +51 -0
  96. package/dist/transitions/flow-warp.js.map +1 -0
  97. package/dist/transitions/fluid-flow.d.ts +26 -0
  98. package/dist/transitions/fluid-flow.d.ts.map +1 -0
  99. package/dist/transitions/fluid-flow.js +94 -0
  100. package/dist/transitions/fluid-flow.js.map +1 -0
  101. package/dist/transitions/fly-eye.d.ts.map +1 -0
  102. package/dist/transitions/fly-eye.js +58 -0
  103. package/dist/transitions/fly-eye.js.map +1 -0
  104. package/dist/transitions/glass-shatter.d.ts +25 -0
  105. package/dist/transitions/glass-shatter.d.ts.map +1 -0
  106. package/dist/transitions/glass-shatter.js +86 -0
  107. package/dist/transitions/glass-shatter.js.map +1 -0
  108. package/dist/transitions/glitch.d.ts +6 -0
  109. package/dist/transitions/glitch.d.ts.map +1 -0
  110. package/dist/transitions/glitch.js +59 -0
  111. package/dist/transitions/glitch.js.map +1 -0
  112. package/dist/transitions/god-rays-reveal.d.ts +32 -0
  113. package/dist/transitions/god-rays-reveal.d.ts.map +1 -0
  114. package/dist/transitions/god-rays-reveal.js +110 -0
  115. package/dist/transitions/god-rays-reveal.js.map +1 -0
  116. package/dist/transitions/gravity-pull.d.ts +16 -0
  117. package/dist/transitions/gravity-pull.d.ts.map +1 -0
  118. package/dist/transitions/gravity-pull.js +65 -0
  119. package/dist/transitions/gravity-pull.js.map +1 -0
  120. package/dist/transitions/grid-reveal.d.ts +12 -0
  121. package/dist/transitions/grid-reveal.d.ts.map +1 -0
  122. package/dist/transitions/grid-reveal.js +53 -0
  123. package/dist/transitions/grid-reveal.js.map +1 -0
  124. package/dist/transitions/heat-haze.d.ts +13 -0
  125. package/dist/transitions/heat-haze.d.ts.map +1 -0
  126. package/dist/transitions/heat-haze.js +51 -0
  127. package/dist/transitions/heat-haze.js.map +1 -0
  128. package/dist/transitions/index.d.ts +64 -0
  129. package/dist/transitions/index.d.ts.map +1 -0
  130. package/dist/transitions/index.js +63 -0
  131. package/dist/transitions/index.js.map +1 -0
  132. package/dist/transitions/ink-bloom.d.ts +15 -0
  133. package/dist/transitions/ink-bloom.d.ts.map +1 -0
  134. package/dist/transitions/ink-bloom.js +76 -0
  135. package/dist/transitions/ink-bloom.js.map +1 -0
  136. package/dist/transitions/ink-diffuse.d.ts +26 -0
  137. package/dist/transitions/ink-diffuse.d.ts.map +1 -0
  138. package/dist/transitions/ink-diffuse.js +90 -0
  139. package/dist/transitions/ink-diffuse.js.map +1 -0
  140. package/dist/transitions/iris-zoom.d.ts +13 -0
  141. package/dist/transitions/iris-zoom.d.ts.map +1 -0
  142. package/dist/transitions/iris-zoom.js +67 -0
  143. package/dist/transitions/iris-zoom.js.map +1 -0
  144. package/dist/transitions/kinetic-bands.d.ts +7 -0
  145. package/dist/transitions/kinetic-bands.d.ts.map +1 -0
  146. package/dist/transitions/kinetic-bands.js +58 -0
  147. package/dist/transitions/kinetic-bands.js.map +1 -0
  148. package/dist/transitions/lenticular-flip.d.ts +22 -0
  149. package/dist/transitions/lenticular-flip.d.ts.map +1 -0
  150. package/dist/transitions/lenticular-flip.js +73 -0
  151. package/dist/transitions/lenticular-flip.js.map +1 -0
  152. package/dist/transitions/light-leak.d.ts +7 -0
  153. package/dist/transitions/light-leak.d.ts.map +1 -0
  154. package/dist/transitions/light-leak.js +43 -0
  155. package/dist/transitions/light-leak.js.map +1 -0
  156. package/dist/transitions/lightning-strike.d.ts +22 -0
  157. package/dist/transitions/lightning-strike.d.ts.map +1 -0
  158. package/dist/transitions/lightning-strike.js +90 -0
  159. package/dist/transitions/lightning-strike.js.map +1 -0
  160. package/dist/transitions/linear-blur.d.ts +11 -0
  161. package/dist/transitions/linear-blur.d.ts.map +1 -0
  162. package/dist/transitions/linear-blur.js +40 -0
  163. package/dist/transitions/linear-blur.js.map +1 -0
  164. package/dist/transitions/liquid-chrome.d.ts +22 -0
  165. package/dist/transitions/liquid-chrome.d.ts.map +1 -0
  166. package/dist/transitions/liquid-chrome.js +114 -0
  167. package/dist/transitions/liquid-chrome.js.map +1 -0
  168. package/dist/transitions/liquid-morph.d.ts +6 -0
  169. package/dist/transitions/liquid-morph.d.ts.map +1 -0
  170. package/dist/transitions/liquid-morph.js +50 -0
  171. package/dist/transitions/liquid-morph.js.map +1 -0
  172. package/dist/transitions/lumina-melt.d.ts +11 -0
  173. package/dist/transitions/lumina-melt.d.ts.map +1 -0
  174. package/dist/transitions/lumina-melt.js +36 -0
  175. package/dist/transitions/lumina-melt.js.map +1 -0
  176. package/dist/transitions/mosaic.d.ts +13 -0
  177. package/dist/transitions/mosaic.d.ts.map +1 -0
  178. package/dist/transitions/mosaic.js +58 -0
  179. package/dist/transitions/mosaic.js.map +1 -0
  180. package/dist/transitions/noise-dissolve.d.ts +5 -0
  181. package/dist/transitions/noise-dissolve.d.ts.map +1 -0
  182. package/dist/transitions/noise-dissolve.js +41 -0
  183. package/dist/transitions/noise-dissolve.js.map +1 -0
  184. package/dist/transitions/page-curl.d.ts +32 -0
  185. package/dist/transitions/page-curl.d.ts.map +1 -0
  186. package/dist/transitions/page-curl.js +165 -0
  187. package/dist/transitions/page-curl.js.map +1 -0
  188. package/dist/transitions/paint-bleed.d.ts +12 -0
  189. package/dist/transitions/paint-bleed.d.ts.map +1 -0
  190. package/dist/transitions/paint-bleed.js +59 -0
  191. package/dist/transitions/paint-bleed.js.map +1 -0
  192. package/dist/transitions/particle-assemble.d.ts +23 -0
  193. package/dist/transitions/particle-assemble.d.ts.map +1 -0
  194. package/dist/transitions/particle-assemble.js +65 -0
  195. package/dist/transitions/particle-assemble.js.map +1 -0
  196. package/dist/transitions/pinwheel.d.ts +11 -0
  197. package/dist/transitions/pinwheel.d.ts.map +1 -0
  198. package/dist/transitions/pinwheel.js +40 -0
  199. package/dist/transitions/pinwheel.js.map +1 -0
  200. package/dist/transitions/pixelate.d.ts +4 -0
  201. package/dist/transitions/pixelate.d.ts.map +1 -0
  202. package/dist/transitions/pixelate.js +26 -0
  203. package/dist/transitions/pixelate.js.map +1 -0
  204. package/dist/transitions/plasma-pulse.d.ts.map +1 -0
  205. package/dist/transitions/plasma-pulse.js +92 -0
  206. package/dist/transitions/plasma-pulse.js.map +1 -0
  207. package/dist/transitions/polka-dots-curtain.d.ts +13 -0
  208. package/dist/transitions/polka-dots-curtain.d.ts.map +1 -0
  209. package/dist/transitions/polka-dots-curtain.js +46 -0
  210. package/dist/transitions/polka-dots-curtain.js.map +1 -0
  211. package/dist/transitions/polygon-flip.d.ts +27 -0
  212. package/dist/transitions/polygon-flip.d.ts.map +1 -0
  213. package/dist/transitions/polygon-flip.js +97 -0
  214. package/dist/transitions/polygon-flip.js.map +1 -0
  215. package/dist/transitions/portal-dive.d.ts +18 -0
  216. package/dist/transitions/portal-dive.d.ts.map +1 -0
  217. package/dist/transitions/portal-dive.js +83 -0
  218. package/dist/transitions/portal-dive.js.map +1 -0
  219. package/dist/transitions/prism-split.d.ts +12 -0
  220. package/dist/transitions/prism-split.d.ts.map +1 -0
  221. package/dist/transitions/prism-split.js +52 -0
  222. package/dist/transitions/prism-split.js.map +1 -0
  223. package/dist/transitions/push.d.ts +4 -0
  224. package/dist/transitions/push.d.ts.map +1 -0
  225. package/dist/transitions/push.js +34 -0
  226. package/dist/transitions/push.js.map +1 -0
  227. package/dist/transitions/radial-reveal.d.ts +5 -0
  228. package/dist/transitions/radial-reveal.d.ts.map +1 -0
  229. package/dist/transitions/radial-reveal.js +31 -0
  230. package/dist/transitions/radial-reveal.js.map +1 -0
  231. package/dist/transitions/ripple-wave.d.ts +24 -0
  232. package/dist/transitions/ripple-wave.d.ts.map +1 -0
  233. package/dist/transitions/ripple-wave.js +135 -0
  234. package/dist/transitions/ripple-wave.js.map +1 -0
  235. package/dist/transitions/ripple.d.ts +7 -0
  236. package/dist/transitions/ripple.d.ts.map +1 -0
  237. package/dist/transitions/ripple.js +43 -0
  238. package/dist/transitions/ripple.js.map +1 -0
  239. package/dist/transitions/shape-reveal.d.ts +12 -0
  240. package/dist/transitions/shape-reveal.d.ts.map +1 -0
  241. package/dist/transitions/shape-reveal.js +53 -0
  242. package/dist/transitions/shape-reveal.js.map +1 -0
  243. package/dist/transitions/shockwave.d.ts +10 -0
  244. package/dist/transitions/shockwave.d.ts.map +1 -0
  245. package/dist/transitions/shockwave.js +56 -0
  246. package/dist/transitions/shockwave.js.map +1 -0
  247. package/dist/transitions/singularity.d.ts +22 -0
  248. package/dist/transitions/singularity.d.ts.map +1 -0
  249. package/dist/transitions/singularity.js +59 -0
  250. package/dist/transitions/singularity.js.map +1 -0
  251. package/dist/transitions/slide.d.ts +10 -0
  252. package/dist/transitions/slide.d.ts.map +1 -0
  253. package/dist/transitions/slide.js +76 -0
  254. package/dist/transitions/slide.js.map +1 -0
  255. package/dist/transitions/smoldering-edge.d.ts +15 -0
  256. package/dist/transitions/smoldering-edge.d.ts.map +1 -0
  257. package/dist/transitions/smoldering-edge.js +74 -0
  258. package/dist/transitions/smoldering-edge.js.map +1 -0
  259. package/dist/transitions/split.d.ts +14 -0
  260. package/dist/transitions/split.d.ts.map +1 -0
  261. package/dist/transitions/split.js +53 -0
  262. package/dist/transitions/split.js.map +1 -0
  263. package/dist/transitions/swirl.d.ts +12 -0
  264. package/dist/transitions/swirl.d.ts.map +1 -0
  265. package/dist/transitions/swirl.js +42 -0
  266. package/dist/transitions/swirl.js.map +1 -0
  267. package/dist/transitions/tangent-motion-blur.d.ts +13 -0
  268. package/dist/transitions/tangent-motion-blur.d.ts.map +1 -0
  269. package/dist/transitions/tangent-motion-blur.js +58 -0
  270. package/dist/transitions/tangent-motion-blur.js.map +1 -0
  271. package/dist/transitions/tile-scatter.d.ts +22 -0
  272. package/dist/transitions/tile-scatter.d.ts.map +1 -0
  273. package/dist/transitions/tile-scatter.js +122 -0
  274. package/dist/transitions/tile-scatter.js.map +1 -0
  275. package/dist/transitions/tilt-sweep.d.ts +11 -0
  276. package/dist/transitions/tilt-sweep.d.ts.map +1 -0
  277. package/dist/transitions/tilt-sweep.js +31 -0
  278. package/dist/transitions/tilt-sweep.js.map +1 -0
  279. package/dist/transitions/warp-zoom.d.ts +7 -0
  280. package/dist/transitions/warp-zoom.d.ts.map +1 -0
  281. package/dist/transitions/warp-zoom.js +70 -0
  282. package/dist/transitions/warp-zoom.js.map +1 -0
  283. package/dist/transitions/wave-stripes.d.ts +16 -0
  284. package/dist/transitions/wave-stripes.d.ts.map +1 -0
  285. package/dist/transitions/wave-stripes.js +55 -0
  286. package/dist/transitions/wave-stripes.js.map +1 -0
  287. package/dist/transitions/wave-wipe.d.ts +23 -0
  288. package/dist/transitions/wave-wipe.d.ts.map +1 -0
  289. package/dist/transitions/wave-wipe.js +84 -0
  290. package/dist/transitions/wave-wipe.js.map +1 -0
  291. package/dist/transitions/wind.d.ts +9 -0
  292. package/dist/transitions/wind.d.ts.map +1 -0
  293. package/dist/transitions/wind.js +48 -0
  294. package/dist/transitions/wind.js.map +1 -0
  295. package/dist/transitions/window-slice.d.ts +11 -0
  296. package/dist/transitions/window-slice.d.ts.map +1 -0
  297. package/dist/transitions/window-slice.js +34 -0
  298. package/dist/transitions/window-slice.js.map +1 -0
  299. package/dist/transitions/wipe-directional.d.ts +5 -0
  300. package/dist/transitions/wipe-directional.d.ts.map +1 -0
  301. package/dist/transitions/wipe-directional.js +26 -0
  302. package/dist/transitions/wipe-directional.js.map +1 -0
  303. package/dist/types.d.ts +78 -0
  304. package/dist/types.d.ts.map +1 -0
  305. package/dist/types.js +2 -0
  306. package/dist/types.js.map +1 -0
  307. package/package.json +56 -0
  308. package/src/__tests__/__screenshots__/endpoint-correctness.test.ts/endpoint-correctness---every-transition-must-be-pixel-pure-from-to-at-progress-0-1-rippleWave-at-progress-0-is-pure--from--1.png +0 -0
  309. package/src/__tests__/__screenshots__/endpoint-correctness.test.ts/endpoint-correctness---every-transition-must-be-pixel-pure-from-to-at-progress-0-1-rippleWave-at-progress-1-is-pure--to--1.png +0 -0
  310. package/src/__tests__/endpoint-correctness.test.ts +161 -0
  311. package/src/__tests__/readme.test.ts +39 -0
  312. package/src/__tests__/ssr.test.ts +45 -0
  313. package/src/index.ts +75 -0
  314. package/src/inputs/normalize.ts +1 -0
  315. package/src/runner/__tests__/__screenshots__/mesh.test.ts/buildSubdividedPlane-centroid-is-shared-across-a-face-and-equals-mean-of-its-3-positions-1.png +0 -0
  316. package/src/runner/__tests__/__screenshots__/mesh.test.ts/buildSubdividedPlane-uv-matches-aPosition---0-5---0-5-1.png +0 -0
  317. package/src/runner/__tests__/mesh.test.ts +128 -0
  318. package/src/runner/gl.ts +69 -0
  319. package/src/runner/mesh.ts +135 -0
  320. package/src/runner/runner.ts +528 -0
  321. package/src/transitions/all.ts +131 -0
  322. package/src/transitions/bloom-reveal.ts +106 -0
  323. package/src/transitions/chromatic-pulse.ts +40 -0
  324. package/src/transitions/clock-wipe.ts +33 -0
  325. package/src/transitions/color-phase.ts +24 -0
  326. package/src/transitions/cross-zoom.ts +59 -0
  327. package/src/transitions/crosshatch.ts +49 -0
  328. package/src/transitions/define.ts +56 -0
  329. package/src/transitions/directional-burn.ts +67 -0
  330. package/src/transitions/directional-warp.ts +46 -0
  331. package/src/transitions/dissolve.ts +16 -0
  332. package/src/transitions/dreamy-zoom.ts +66 -0
  333. package/src/transitions/dreamy.ts +26 -0
  334. package/src/transitions/drip-wipe.ts +109 -0
  335. package/src/transitions/ember-scatter.ts +94 -0
  336. package/src/transitions/film-burn.ts +101 -0
  337. package/src/transitions/film-grain.ts +78 -0
  338. package/src/transitions/flow-warp.ts +51 -0
  339. package/src/transitions/fluid-flow.ts +94 -0
  340. package/src/transitions/glass-shatter.ts +86 -0
  341. package/src/transitions/glitch.ts +59 -0
  342. package/src/transitions/god-rays-reveal.ts +110 -0
  343. package/src/transitions/gravity-pull.ts +65 -0
  344. package/src/transitions/grid-reveal.ts +53 -0
  345. package/src/transitions/heat-haze.ts +51 -0
  346. package/src/transitions/index.ts +63 -0
  347. package/src/transitions/ink-bloom.ts +76 -0
  348. package/src/transitions/ink-diffuse.ts +90 -0
  349. package/src/transitions/iris-zoom.ts +67 -0
  350. package/src/transitions/kinetic-bands.ts +58 -0
  351. package/src/transitions/lenticular-flip.ts +73 -0
  352. package/src/transitions/light-leak.ts +43 -0
  353. package/src/transitions/linear-blur.ts +40 -0
  354. package/src/transitions/liquid-chrome.ts +114 -0
  355. package/src/transitions/liquid-morph.ts +50 -0
  356. package/src/transitions/lumina-melt.ts +36 -0
  357. package/src/transitions/mosaic.ts +58 -0
  358. package/src/transitions/noise-dissolve.ts +41 -0
  359. package/src/transitions/page-curl.ts +165 -0
  360. package/src/transitions/paint-bleed.ts +59 -0
  361. package/src/transitions/pinwheel.ts +40 -0
  362. package/src/transitions/pixelate.ts +26 -0
  363. package/src/transitions/polka-dots-curtain.ts +46 -0
  364. package/src/transitions/polygon-flip.ts +97 -0
  365. package/src/transitions/portal-dive.ts +83 -0
  366. package/src/transitions/prism-split.ts +52 -0
  367. package/src/transitions/push.ts +34 -0
  368. package/src/transitions/radial-reveal.ts +31 -0
  369. package/src/transitions/ripple-wave.ts +135 -0
  370. package/src/transitions/ripple.ts +43 -0
  371. package/src/transitions/shape-reveal.ts +53 -0
  372. package/src/transitions/shockwave.ts +56 -0
  373. package/src/transitions/singularity.ts +59 -0
  374. package/src/transitions/slide.ts +76 -0
  375. package/src/transitions/smoldering-edge.ts +74 -0
  376. package/src/transitions/split.ts +53 -0
  377. package/src/transitions/swirl.ts +42 -0
  378. package/src/transitions/tangent-motion-blur.ts +58 -0
  379. package/src/transitions/tile-scatter.ts +122 -0
  380. package/src/transitions/warp-zoom.ts +70 -0
  381. package/src/transitions/wave-stripes.ts +55 -0
  382. package/src/transitions/wind.ts +48 -0
  383. package/src/transitions/wipe-directional.ts +26 -0
  384. package/src/types.ts +87 -0
@@ -0,0 +1,109 @@
1
+ import { defineTransition } from "./define.js";
2
+
3
+ /**
4
+ * Faithful port of akella demo1. Horizontal sweep whose boundary is broken
5
+ * up by high-frequency Perlin noise hard-thresholded against the sweep
6
+ * position, producing isolated drip/splatter islands as the edge crosses.
7
+ *
8
+ * Deviations from the original:
9
+ * - The original's `smoothstep(edge, edge, x)` (undefined behavior when
10
+ * edge0 == edge1) is avoided by clamping `w` to a tiny positive value,
11
+ * so the edge smoothstep is always well-formed.
12
+ * - Endpoint position is `mix(-w, 1+w, progress)` (not akella's
13
+ * `mix(-w/2, 1-w/2, progress)`) so at progress=0/1 the mask saturates
14
+ * fully past the image bounds instead of relying on the UB fallback.
15
+ * - The displacement sampler is dropped — akella's shader declares it
16
+ * but never references it.
17
+ */
18
+ export const dripWipe = defineTransition({
19
+ name: "drip-wipe",
20
+ defaults: {
21
+ direction: [-1, 0],
22
+ width: 0.5,
23
+ scaleX: 40,
24
+ scaleY: 40,
25
+ },
26
+ glsl: `
27
+ uniform vec2 uDirection;
28
+ uniform float uWidth;
29
+ uniform float uScaleX;
30
+ uniform float uScaleY;
31
+
32
+ // Stefan Gustavson classic 2D Perlin noise. Output range ≈ [-1, 1].
33
+ vec4 mod289(vec4 x) { return x - floor(x * (1.0 / 289.0)) * 289.0; }
34
+ vec4 permute(vec4 x) { return mod289((x * 34.0 + 1.0) * x); }
35
+ vec2 fade2(vec2 t) { return t * t * t * (t * (t * 6.0 - 15.0) + 10.0); }
36
+
37
+ float pnoise(vec2 P) {
38
+ vec4 Pi = floor(P.xyxy) + vec4(0.0, 0.0, 1.0, 1.0);
39
+ vec4 Pf = fract(P.xyxy) - vec4(0.0, 0.0, 1.0, 1.0);
40
+ Pi = mod289(Pi);
41
+ vec4 ix = Pi.xzxz;
42
+ vec4 iy = Pi.yyww;
43
+ vec4 fx = Pf.xzxz;
44
+ vec4 fy = Pf.yyww;
45
+ vec4 i = permute(permute(ix) + iy);
46
+ vec4 gx = 2.0 * fract(i * (1.0 / 41.0)) - 1.0;
47
+ vec4 gy = abs(gx) - 0.5;
48
+ vec4 tx = floor(gx + 0.5);
49
+ gx = gx - tx;
50
+ vec2 g00 = vec2(gx.x, gy.x);
51
+ vec2 g10 = vec2(gx.y, gy.y);
52
+ vec2 g01 = vec2(gx.z, gy.z);
53
+ vec2 g11 = vec2(gx.w, gy.w);
54
+ vec4 norm = 1.79284291400159 - 0.85373472095314 *
55
+ vec4(dot(g00, g00), dot(g01, g01), dot(g10, g10), dot(g11, g11));
56
+ g00 *= norm.x;
57
+ g01 *= norm.y;
58
+ g10 *= norm.z;
59
+ g11 *= norm.w;
60
+ float n00 = dot(g00, vec2(fx.x, fy.x));
61
+ float n10 = dot(g10, vec2(fx.y, fy.y));
62
+ float n01 = dot(g01, vec2(fx.z, fy.z));
63
+ float n11 = dot(g11, vec2(fx.w, fy.w));
64
+ vec2 fxy = fade2(Pf.xy);
65
+ vec2 n_x = mix(vec2(n00, n01), vec2(n10, n11), fxy.x);
66
+ return 2.3 * mix(n_x.x, n_x.y, fxy.y);
67
+ }
68
+
69
+ // Snap to nearest axis-aligned unit. The proj normalization below assumes
70
+ // axis-aligned d (so proj ∈ [0,1]); diagonals would push it outside [0,1]
71
+ // and the wipe edge would never reach part of the canvas. Enforced
72
+ // in-shader so the UI's axis-only picker matches.
73
+ vec2 snapAxis(vec2 v) {
74
+ vec2 dn = normalize(v);
75
+ return abs(dn.x) > abs(dn.y) ? vec2(sign(dn.x), 0.0) : vec2(0.0, sign(dn.y));
76
+ }
77
+
78
+ vec4 transition(vec2 uv) {
79
+ vec2 d = snapAxis(uDirection);
80
+
81
+ // Project uv onto -d, centered at 0.5, so axis-aligned d gives a sweep
82
+ // coordinate in [0, 1]. Replaces the original's hardcoded uv.x.
83
+ // d=[-1, 0] (Left) → proj = uv.x (default; matches old shader)
84
+ // d=[ 1, 0] (Right) → proj = 1.0 - uv.x
85
+ // d=[ 0,-1] (Down) → proj = uv.y
86
+ // d=[ 0, 1] (Up) → proj = 1.0 - uv.y
87
+ float proj = dot(uv - vec2(0.5), -d) + 0.5;
88
+
89
+ // Width envelope: 0 at endpoints, 1 at mid-transition.
90
+ float dt = 4.0 * uProgress * (1.0 - uProgress);
91
+ // Keep w strictly positive so smoothstep(edge0, edge1, ...) never collapses.
92
+ float w = max(uWidth * dt, 0.001);
93
+
94
+ // Edge sweep: proj + shift spans well past [1 - w, 1] at both endpoints,
95
+ // so maskvalue saturates to 0 at progress=0 and 1 at progress=1.
96
+ float shift = mix(-w, 1.0 + w, uProgress);
97
+ float maskvalue = smoothstep(1.0 - w, 1.0, proj + shift);
98
+
99
+ // High-frequency Perlin, remapped to [0, 1] for akella's additive form.
100
+ float realnoise = 0.5 * (pnoise(uv * vec2(uScaleX, uScaleY)) + 1.0);
101
+
102
+ // Hard threshold with tiny softness (anti-alias only).
103
+ float mask = maskvalue + maskvalue * realnoise;
104
+ float final = smoothstep(0.99, 1.0, mask);
105
+
106
+ return mix(getFromColor(uv), getToColor(uv), final);
107
+ }
108
+ `,
109
+ });
@@ -0,0 +1,94 @@
1
+ import { defineTransition } from "./define.js";
2
+
3
+ /**
4
+ * Multi-point film-burn: a jittered grid of ignition points each expand
5
+ * outward with their own warm flame glow, merging as they meet to cover
6
+ * the frame. Per-ember staggered start times so different burns are at
7
+ * different phases.
8
+ *
9
+ * Locality invariant (to avoid cell-boundary rectangles): effective max
10
+ * reach of any ember = maxRadius + edgeWidth + noiseStrength, and this
11
+ * MUST stay under the distance to the nearest cell outside the search
12
+ * window (= (window_half-1) / uCount uv-units). With a 7x7 window that
13
+ * nearest-outside distance is 3/uCount, so `maxRadius = 1.6/uCount` plus
14
+ * edgeWidth=0.04 plus noiseStrength=0.06 gives reach = 1.6/uCount + 0.1,
15
+ * which stays below 3/uCount for uCount ≤ 12 (slider's max).
16
+ */
17
+ export const emberScatter = defineTransition({
18
+ name: "ember-scatter",
19
+ defaults: {
20
+ count: 5,
21
+ scale: 8,
22
+ edgeWidth: 0.04,
23
+ stagger: 0.35,
24
+ flameColor: [1.6, 0.7, 0.15],
25
+ },
26
+ glsl: `
27
+ uniform float uCount;
28
+ uniform float uScale;
29
+ uniform float uEdgeWidth;
30
+ uniform float uStagger;
31
+ uniform vec3 uFlameColor;
32
+
33
+ float hash21(vec2 p) {
34
+ return fract(sin(dot(p, vec2(12.9898, 78.233))) * 43758.5453);
35
+ }
36
+
37
+ float valueNoise(vec2 p) {
38
+ vec2 i = floor(p);
39
+ vec2 f = fract(p);
40
+ f = f * f * (3.0 - 2.0 * f);
41
+ float a = hash21(i);
42
+ float b = hash21(i + vec2(1.0, 0.0));
43
+ float c = hash21(i + vec2(0.0, 1.0));
44
+ float d = hash21(i + vec2(1.0, 1.0));
45
+ return mix(mix(a, b, f.x), mix(c, d, f.x), f.y);
46
+ }
47
+
48
+ vec4 transition(vec2 uv) {
49
+ float noiseStrength = 0.06;
50
+ float n = valueNoise(uv * uScale);
51
+ float noiseOffset = (n - 0.5) * noiseStrength;
52
+ float totalEdge = uEdgeWidth + noiseStrength * 0.5;
53
+ float maxRadius = 1.6 / max(uCount, 1.0);
54
+
55
+ vec2 gridPos = uv * uCount;
56
+ vec2 gridCell = floor(gridPos);
57
+
58
+ float bestSignedDist = 100.0;
59
+ for (int dy = -3; dy <= 3; dy++) {
60
+ for (int dx = -3; dx <= 3; dx++) {
61
+ vec2 neighborCell = gridCell + vec2(float(dx), float(dy));
62
+ vec2 jitter = vec2(
63
+ hash21(neighborCell + vec2(3.14, 0.0)),
64
+ hash21(neighborCell + vec2(0.0, 2.71))
65
+ );
66
+ vec2 emberUv = (neighborCell + jitter) / max(uCount, 1.0);
67
+
68
+ float emberStart = hash21(neighborCell + vec2(5.55, 5.55)) * uStagger;
69
+ float localP = clamp(
70
+ (uProgress - emberStart) / max(1.0 - uStagger, 0.0001),
71
+ 0.0, 1.0
72
+ );
73
+
74
+ float d = distance(uv, emberUv);
75
+ float perturbed = d - noiseOffset;
76
+ float burnRadius = localP * (maxRadius + 2.0 * totalEdge) - totalEdge;
77
+ float signedDist = perturbed - burnRadius;
78
+
79
+ bestSignedDist = min(bestSignedDist, signedDist);
80
+ }
81
+ }
82
+
83
+ float w = smoothstep(-uEdgeWidth, uEdgeWidth, -bestSignedDist);
84
+ vec4 base = mix(getFromColor(uv), getToColor(uv), w);
85
+
86
+ float bandX = bestSignedDist / max(uEdgeWidth * 1.5, 0.0001);
87
+ float flameBand = exp(-bandX * bandX * 3.0);
88
+ float env = 4.0 * uProgress * (1.0 - uProgress);
89
+ vec3 flame = uFlameColor * flameBand * env;
90
+
91
+ return vec4(base.rgb + flame, base.a);
92
+ }
93
+ `,
94
+ });
@@ -0,0 +1,101 @@
1
+ import { defineTransition } from "./define.js";
2
+
3
+ /**
4
+ * Cinematic film-burn reveal: an irregular hot-edged hole expands from a
5
+ * center point, eating through `from` to reveal `to` beneath. The burn
6
+ * front glows with a warm flame color that fades at the endpoints.
7
+ *
8
+ * Optional `chroma` param adds a radial RGB split concentrated at the
9
+ * advancing edge — set `flameColor` to a cool triplet (e.g. [1.2, 1.6, 2.5]
10
+ * "Electric") and `chroma > 0` for an electric / plasma-style vibe.
11
+ */
12
+ export const filmBurn = defineTransition({
13
+ name: "film-burn",
14
+ defaults: {
15
+ center: [0.5, 0.5],
16
+ scale: 6,
17
+ edgeWidth: 0.05,
18
+ chroma: 0,
19
+ flameColor: [1.6, 0.7, 0.15],
20
+ },
21
+ glsl: `
22
+ uniform vec2 uCenter;
23
+ uniform float uScale;
24
+ uniform float uEdgeWidth;
25
+ uniform float uChroma;
26
+ uniform vec3 uFlameColor;
27
+
28
+ float hash21(vec2 p) {
29
+ return fract(sin(dot(p, vec2(12.9898, 78.233))) * 43758.5453);
30
+ }
31
+
32
+ float valueNoise(vec2 p) {
33
+ vec2 i = floor(p);
34
+ vec2 f = fract(p);
35
+ f = f * f * (3.0 - 2.0 * f);
36
+ float a = hash21(i);
37
+ float b = hash21(i + vec2(1.0, 0.0));
38
+ float c = hash21(i + vec2(0.0, 1.0));
39
+ float d = hash21(i + vec2(1.0, 1.0));
40
+ return mix(mix(a, b, f.x), mix(c, d, f.x), f.y);
41
+ }
42
+
43
+ vec4 transition(vec2 uv) {
44
+ // Aspect-correct radial distance from center, normalized to [0,1] by the
45
+ // farthest canvas corner (matches the shape-reveal pattern).
46
+ vec2 pixel = uv * uResolution;
47
+ vec2 centerPx = uCenter * uResolution;
48
+ float dist = distance(pixel, centerPx);
49
+ float maxDist = max(
50
+ max(length(centerPx), length(centerPx - vec2(uResolution.x, 0.0))),
51
+ max(length(centerPx - vec2(0.0, uResolution.y)), length(centerPx - uResolution))
52
+ );
53
+ float normalizedDist = dist / max(maxDist, 0.0001);
54
+
55
+ // Noise pushes the burn edge organically off a perfect circle.
56
+ float noiseStrength = 0.15;
57
+ float n = valueNoise(uv * uScale);
58
+ float perturbed = normalizedDist - (n - 0.5) * noiseStrength;
59
+
60
+ // Extend the threshold sweep so the full edgeWidth + noise half-range is
61
+ // beyond the valid [0,1] normalized-distance band at each endpoint.
62
+ float totalEdge = uEdgeWidth + noiseStrength * 0.5;
63
+ float burnRadius = uProgress * (1.0 + 2.0 * totalEdge) - totalEdge;
64
+ float signedDist = perturbed - burnRadius;
65
+
66
+ // Inside the burn: show to. Outside: show from.
67
+ float w = smoothstep(-uEdgeWidth, uEdgeWidth, -signedDist);
68
+ float env = 4.0 * uProgress * (1.0 - uProgress);
69
+
70
+ // Optional radial chromatic aberration concentrated at the burn edge.
71
+ // chroma=0 → no split; sample once and mix normally. chroma>0 → split
72
+ // R/B along the radial direction with edge-proximity Gaussian falloff.
73
+ vec3 baseRGB;
74
+ if (uChroma > 0.0001) {
75
+ float edgeX = signedDist / max(uEdgeWidth * 2.0, 0.0001);
76
+ float edgeProximity = exp(-edgeX * edgeX * 2.0);
77
+ float chromaStrength = env * edgeProximity * uChroma;
78
+
79
+ vec2 toCenter = uv - uCenter;
80
+ float r = length(toCenter);
81
+ vec2 dir = r > 0.0001 ? toCenter / r : vec2(1.0, 0.0);
82
+ vec2 offR = clamp(uv - dir * chromaStrength, 0.0, 1.0);
83
+ vec2 offB = clamp(uv + dir * chromaStrength, 0.0, 1.0);
84
+
85
+ vec3 fromRGB = vec3(getFromColor(offR).r, getFromColor(uv).g, getFromColor(offB).b);
86
+ vec3 toRGB = vec3(getToColor(offR).r, getToColor(uv).g, getToColor(offB).b);
87
+ baseRGB = mix(fromRGB, toRGB, w);
88
+ } else {
89
+ baseRGB = mix(getFromColor(uv).rgb, getToColor(uv).rgb, w);
90
+ }
91
+
92
+ // Flame glow: tight Gaussian band at the burn edge, env-gated to zero
93
+ // at both endpoints.
94
+ float bandX = signedDist / max(uEdgeWidth * 1.5, 0.0001);
95
+ float flameBand = exp(-bandX * bandX * 3.0);
96
+ vec3 flame = uFlameColor * flameBand * env;
97
+
98
+ return vec4(baseRGB + flame, 1.0);
99
+ }
100
+ `,
101
+ });
@@ -0,0 +1,78 @@
1
+ import { defineTransition } from "./define.js";
2
+
3
+ /**
4
+ * Filmic dissolve. Everything that modulates the image is gated by a
5
+ * 4·p·(1-p) peak envelope so endpoints are pixel-pure from/to.
6
+ *
7
+ * At peak, the image picks up:
8
+ * - multi-scale animated grain (fine + medium + coarse), reseeded
9
+ * in discrete progress frames so scrubbing flickers like a
10
+ * projector
11
+ * - partial desaturation (content drifts toward luminance)
12
+ * - subtle warm tint (R up, B down)
13
+ * - a soft corner vignette
14
+ * - occasional dark vertical scratches on ~2% of columns, reseeded
15
+ * every couple of frames
16
+ *
17
+ * Base crossfade is a soft smoothstep(0.25, 0.75) so from and to
18
+ * overlap through the grainy middle — the grain is what carries the
19
+ * hand-off, rather than a geometric wipe with film on top.
20
+ *
21
+ * One param: grain (master intensity of the whole film character).
22
+ */
23
+ export const filmGrain = defineTransition({
24
+ name: "film-grain",
25
+ defaults: {
26
+ grain: 1.0,
27
+ },
28
+ glsl: `
29
+ uniform float uGrain;
30
+
31
+ float hash21(vec2 p) {
32
+ return fract(sin(dot(p, vec2(12.9898, 78.233))) * 43758.5453);
33
+ }
34
+
35
+ vec4 transition(vec2 uv) {
36
+ vec3 fromC = getFromColor(uv).rgb;
37
+ vec3 toC = getToColor(uv).rgb;
38
+ vec3 base = mix(fromC, toC, smoothstep(0.25, 0.75, uProgress));
39
+
40
+ // Peak envelope — zero at both endpoints, 1 at mid.
41
+ float peak = 4.0 * uProgress * (1.0 - uProgress) * uGrain;
42
+
43
+ // Partial desaturation toward luminance (old film is less vivid).
44
+ float lum = dot(base, vec3(0.299, 0.587, 0.114));
45
+ base = mix(base, vec3(lum), peak * 0.25);
46
+
47
+ // Warm tint: subtle R boost + B drop at peak. Still multiplicative
48
+ // on content (no synthetic colour introduced from nothing).
49
+ base *= mix(vec3(1.0), vec3(1.08, 1.00, 0.88), peak * 0.6);
50
+
51
+ // Stepped seed → scrubbing reads as projector flicker between
52
+ // a handful of discrete grain "frames" across the transition.
53
+ float frame = floor(uProgress * 22.0);
54
+
55
+ // Multi-scale grain. Fine texture + medium clumps + occasional
56
+ // coarse blotches — reads as film-stock rather than digital noise.
57
+ float g = 0.0;
58
+ g += (hash21(uv * 520.0 + vec2(frame, 0.0)) - 0.5) * 0.6;
59
+ g += (hash21(uv * 130.0 + vec2(0.0, frame)) - 0.5) * 0.3;
60
+ g += (hash21(uv * 32.0 + vec2(frame, frame)) - 0.5) * 0.18;
61
+ base += vec3(g) * peak * 0.55;
62
+
63
+ // Vertical scratches on ~2% of columns, reseeded every two frames.
64
+ float scratchCol = floor(uv.x * 220.0);
65
+ float scratchSeed = floor(frame * 0.5);
66
+ float scratchHash = hash21(vec2(scratchCol, scratchSeed));
67
+ float isScratch = step(0.98, scratchHash);
68
+ base *= mix(1.0, 0.32, isScratch * peak);
69
+
70
+ // Soft corner vignette at peak only — old projector look.
71
+ float d = distance(uv, vec2(0.5));
72
+ float vignette = 1.0 - smoothstep(0.35, 0.9, d);
73
+ base *= mix(1.0, 0.65 + 0.35 * vignette, peak * 0.8);
74
+
75
+ return vec4(base, 1.0);
76
+ }
77
+ `,
78
+ });
@@ -0,0 +1,51 @@
1
+ import { defineTransition } from "./define.js";
2
+
3
+ /**
4
+ * Faithful port of akella demo6 (the "planetary" transition). Reads a
5
+ * displacement-map texture supplied via `RenderArgs.displacement` to drive
6
+ * a per-pixel UV offset vector. From-image is displaced in the direction
7
+ * `rotate(angle1) * dispVec * progress`; to-image is displaced in the
8
+ * direction `rotate(angle2) * dispVec * (1-progress)`. The two opposing
9
+ * angles produce the signature dual-flow akella aesthetic.
10
+ *
11
+ * The displacement is interpreted as centered: mid-gray (0.5) maps to
12
+ * zero offset; channel-r drives the x-component, channel-g the y. This
13
+ * differs from akella's raw [0,1] convention so the runner's default
14
+ * mid-gray fallback degrades to a clean crossfade when no displacement
15
+ * is supplied.
16
+ */
17
+ export const flowWarp = defineTransition({
18
+ name: "flow-warp",
19
+ defaults: {
20
+ intensity: 0.4,
21
+ angle1: 0.7853982,
22
+ angle2: -2.3561945,
23
+ },
24
+ glsl: `
25
+ uniform float uIntensity;
26
+ uniform float uAngle1;
27
+ uniform float uAngle2;
28
+
29
+ mat2 rotate2d(float a) {
30
+ float s = sin(a);
31
+ float c = cos(a);
32
+ return mat2(c, -s, s, c);
33
+ }
34
+
35
+ // Out-of-range UVs use the runner-prologue mirrorUv() so displacement
36
+ // reads as mirrored continuation rather than streaked edge texels.
37
+ vec4 transition(vec2 uv) {
38
+ vec4 disp = getDisplacement(uv);
39
+ // Centered convention: mid-gray = no displacement, range [-1, 1].
40
+ vec2 dispVec = (disp.rg - 0.5) * 2.0;
41
+
42
+ vec2 distorted1 = uv + rotate2d(uAngle1) * dispVec * uIntensity * uProgress;
43
+ vec2 distorted2 = uv + rotate2d(uAngle2) * dispVec * uIntensity * (1.0 - uProgress);
44
+
45
+ vec4 t1 = getFromColor(mirrorUv(distorted1));
46
+ vec4 t2 = getToColor(mirrorUv(distorted2));
47
+
48
+ return mix(t1, t2, uProgress);
49
+ }
50
+ `,
51
+ });
@@ -0,0 +1,94 @@
1
+ import { defineTransition } from "./define.js";
2
+
3
+ /**
4
+ * Multi-pass pixel advection. The from-image is progressively carried
5
+ * along a swirly vector field, then blended toward to. Each pass
6
+ * samples uPrevious at a displaced position — pixels genuinely move
7
+ * (follow flow lines across iterations) rather than fading in place,
8
+ * so the character is closer to ink-stirring-into-water than any
9
+ * crossfade. Impossible single-pass: resolving a multi-step flow
10
+ * trajectory requires reading previous pass output.
11
+ *
12
+ * pass 0 — seed: sample from.
13
+ * pass 1..passCount-2 — advection: sample uPrevious at uv - flow·step,
14
+ * and blend toward to by a per-pass amount
15
+ * chosen so the compounded blend reaches
16
+ * progress after all advection passes.
17
+ * final pass — pass-through (output previous).
18
+ *
19
+ * Endpoints: at progress 0, step = 0 and per-pass blend = 0, so the
20
+ * chain preserves from. At progress 1, the per-pass blend = 1 so the
21
+ * first advection pass already writes to, and every subsequent pass
22
+ * preserves it (advecting a uniform field is a fixed point).
23
+ */
24
+ export const fluidFlow = defineTransition({
25
+ name: "fluid-flow",
26
+ passes: 6,
27
+ defaults: {
28
+ strength: 0.12,
29
+ scale: 3,
30
+ },
31
+ glsl: `
32
+ uniform float uStrength;
33
+ uniform float uScale;
34
+
35
+ float hash21(vec2 p) {
36
+ return fract(sin(dot(p, vec2(12.9898, 78.233))) * 43758.5453);
37
+ }
38
+
39
+ float valNoise(vec2 p) {
40
+ vec2 i = floor(p);
41
+ vec2 f = fract(p);
42
+ f = f * f * (3.0 - 2.0 * f);
43
+ float a = hash21(i);
44
+ float b = hash21(i + vec2(1.0, 0.0));
45
+ float c = hash21(i + vec2(0.0, 1.0));
46
+ float d = hash21(i + vec2(1.0, 1.0));
47
+ return mix(mix(a, b, f.x), mix(c, d, f.x), f.y);
48
+ }
49
+
50
+ float fbm(vec2 p) {
51
+ return valNoise(p) * 0.55 +
52
+ valNoise(p * 2.1) * 0.28 +
53
+ valNoise(p * 4.3) * 0.17;
54
+ }
55
+
56
+ // Swirly 2D vector field in [-1,1]² per axis. Two offset fbm fields
57
+ // give a non-divergence-free flow that still reads as fluid swirl.
58
+ vec2 flowField(vec2 p) {
59
+ return vec2(
60
+ fbm(p) * 2.0 - 1.0,
61
+ fbm(p + vec2(17.3, 23.7)) * 2.0 - 1.0
62
+ );
63
+ }
64
+
65
+ vec4 transition(vec2 uv) {
66
+ // Final pass: pass through the accumulated result.
67
+ if (uPass == uPassCount - 1) {
68
+ return getPrevious(uv);
69
+ }
70
+
71
+ // Seed pass: carry the from image in untouched.
72
+ if (uPass == 0) {
73
+ return vec4(getFromColor(uv).rgb, 1.0);
74
+ }
75
+
76
+ float nAdvect = float(uPassCount - 2);
77
+ vec2 flow = flowField(uv * uScale);
78
+ float stepAmount = uStrength * uProgress / nAdvect;
79
+
80
+ // Sample previous at the advected position — pixels flow along the
81
+ // field. Clamp keeps samples in-bounds when the flow pushes near
82
+ // the frame edge.
83
+ vec2 advectedUv = clamp(uv - flow * stepAmount, 0.0, 1.0);
84
+ vec3 advected = getPrevious(advectedUv).rgb;
85
+
86
+ // Per-pass blend chosen so (1 - blend)^N = 1 - progress, i.e. after
87
+ // nAdvect passes the compounded blend exactly equals progress.
88
+ float perPassBlend = 1.0 - pow(1.0 - uProgress, 1.0 / nAdvect);
89
+
90
+ vec3 blended = mix(advected, getToColor(uv).rgb, perPassBlend);
91
+ return vec4(blended, 1.0);
92
+ }
93
+ `,
94
+ });
@@ -0,0 +1,86 @@
1
+ import { defineTransition } from "./define.js";
2
+
3
+ /**
4
+ * Voronoi tessellation where each cell flips from from to to at its own
5
+ * randomised moment, with a soft temporal window so the flip isn't an
6
+ * instant step. Every pixel samples both source images at its own uv —
7
+ * no per-shard displacement — so adjacent cells never diverge into
8
+ * different sample positions and the Voronoi edges resolve cleanly
9
+ * without halos or ghost outlines.
10
+ *
11
+ * Optional env-map glint (reflection > 0): each shard gets a random
12
+ * "facet direction" which picks a different patch of the env map, and
13
+ * that reflection blends in strongest at the shard's own mid-flip
14
+ * moment — reads as broken mirror catching the light as each piece
15
+ * rotates through, not a coloured tile. Defaults to 0 (no reflection)
16
+ * so the transition is unchanged without an env map.
17
+ *
18
+ * Endpoints: each cell's flip moment is constrained to [flipWindow/2,
19
+ * 1 - flipWindow/2] with a small safety margin, so at progress 0/1 the
20
+ * smoothstep is saturated off/on for every cell AND the mid-flip
21
+ * glint envelope is zero for every cell.
22
+ */
23
+ export const glassShatter = defineTransition({
24
+ name: "glass-shatter",
25
+ defaults: {
26
+ cells: 14,
27
+ reflection: 0.0,
28
+ },
29
+ glsl: `
30
+ uniform float uCells;
31
+ uniform float uReflection;
32
+ const float uFlipWindow = 0.12;
33
+
34
+ float hash21(vec2 p) {
35
+ return fract(sin(dot(p, vec2(12.9898, 78.233))) * 43758.5453);
36
+ }
37
+ vec2 hash22(vec2 p) {
38
+ return vec2(hash21(p), hash21(p + vec2(17.5, 31.3)));
39
+ }
40
+
41
+ vec4 transition(vec2 uv) {
42
+ float aspect = uResolution.x / uResolution.y;
43
+ vec2 freq = vec2(uCells * aspect, uCells);
44
+ vec2 p = uv * freq;
45
+ vec2 cellBase = floor(p);
46
+ vec2 local = fract(p);
47
+
48
+ // 3x3 neighbourhood search for the closest cell (Voronoi).
49
+ float dist1 = 999.0;
50
+ vec2 id1 = cellBase;
51
+ for (int j = -1; j <= 1; j++) {
52
+ for (int i = -1; i <= 1; i++) {
53
+ vec2 nId = cellBase + vec2(float(i), float(j));
54
+ vec2 jitter = hash22(nId);
55
+ vec2 nPos = vec2(float(i), float(j)) + jitter;
56
+ float d = length(nPos - local);
57
+ if (d < dist1) {
58
+ dist1 = d;
59
+ id1 = nId;
60
+ }
61
+ }
62
+ }
63
+
64
+ // Keep cell flip moments away from 0 and 1 with enough headroom for
65
+ // the window, plus a tiny safety margin so endpoints saturate cleanly.
66
+ float halfWin = uFlipWindow * 0.5;
67
+ float cellFlip = mix(halfWin + 0.02, 1.0 - halfWin - 0.02, hash21(id1 + vec2(0.31)));
68
+
69
+ float reveal = smoothstep(cellFlip - halfWin, cellFlip + halfWin, uProgress);
70
+ vec4 baseColor = mix(getFromColor(uv), getToColor(uv), reveal);
71
+
72
+ // Per-shard mirror glint: each shard has its own facet direction, and
73
+ // its reflection of the env map peaks at reveal=0.5 (the moment the
74
+ // shard flips). Reveal=0 or 1 → glintEnv=0, so endpoints stay clean.
75
+ if (uReflection > 0.0) {
76
+ vec2 facetDir = normalize(hash22(id1 + vec2(0.83)) * 2.0 - 1.0);
77
+ vec2 envUv = vec2(0.5 + 0.5 * facetDir.x, 0.5 - 0.5 * facetDir.y);
78
+ vec3 envColor = getEnvironment(envUv).rgb;
79
+ float glintEnv = 4.0 * reveal * (1.0 - reveal);
80
+ baseColor.rgb = mix(baseColor.rgb, envColor, glintEnv * uReflection);
81
+ }
82
+
83
+ return baseColor;
84
+ }
85
+ `,
86
+ });
@@ -0,0 +1,59 @@
1
+ import { defineTransition } from "./define.js";
2
+
3
+ export const glitch = defineTransition({
4
+ name: "glitch",
5
+ defaults: {
6
+ intensity: 0.6,
7
+ chroma: 0.02,
8
+ blocks: 30,
9
+ },
10
+ glsl: `
11
+ uniform float uIntensity;
12
+ uniform float uChroma;
13
+ uniform float uBlocks;
14
+
15
+ float hash11(float n) { return fract(sin(n * 12.9898) * 43758.5453); }
16
+ float hash21(vec2 p) { return fract(sin(dot(p, vec2(12.9898, 78.233))) * 43758.5453); }
17
+
18
+ vec4 transition(vec2 uv) {
19
+ // Envelope: ramps up to max at midpoint, zero at endpoints.
20
+ float envelope = 4.0 * uProgress * (1.0 - uProgress);
21
+ float glitchAmt = uIntensity * envelope;
22
+
23
+ // Per-stripe horizontal displacement; stripe layout evolves over time.
24
+ float stripeId = floor(uv.y * uBlocks);
25
+ float timeStep = floor(uProgress * 24.0);
26
+ float stripeSeed = hash21(vec2(stripeId, timeStep));
27
+ float displaceActive = step(0.6, stripeSeed);
28
+ float displaceAmount = (hash11(stripeSeed + 1.0) - 0.5) * 0.12 * glitchAmt * displaceActive;
29
+
30
+ vec2 displacedUv = vec2(uv.x + displaceAmount, uv.y);
31
+ vec2 clamped = clamp(displacedUv, 0.0, 1.0);
32
+
33
+ // RGB channel split scales with glitch amount. chroma is the per-channel
34
+ // UV offset multiplier — capped at 0.05; past that, R/B samples come from
35
+ // unrelated parts of the scene and edge-clamping creates color stripes
36
+ // instead of reading as glitch chromatic aberration.
37
+ float chromaOffset = glitchAmt * min(uChroma, 0.05);
38
+ vec2 offR = clamp(displacedUv + vec2(chromaOffset, 0.0), 0.0, 1.0);
39
+ vec2 offB = clamp(displacedUv - vec2(chromaOffset, 0.0), 0.0, 1.0);
40
+
41
+ vec3 fromRgb = vec3(
42
+ getFromColor(offR).r,
43
+ getFromColor(clamped).g,
44
+ getFromColor(offB).b
45
+ );
46
+ vec3 toRgb = vec3(
47
+ getToColor(offR).r,
48
+ getToColor(clamped).g,
49
+ getToColor(offB).b
50
+ );
51
+
52
+ // Hard-ish crossover concentrated in the middle 20% for a "cut" feel.
53
+ float mixW = smoothstep(0.45, 0.55, uProgress);
54
+ vec3 rgb = mix(fromRgb, toRgb, mixW);
55
+
56
+ return vec4(rgb, 1.0);
57
+ }
58
+ `,
59
+ });