@basementstudio/shader-lab 0.1.0 → 1.0.2

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 (399) hide show
  1. package/dist/src/easings.d.ts +3 -0
  2. package/dist/src/easings.js +3 -0
  3. package/dist/src/index.d.ts +5 -0
  4. package/dist/src/index.js +4 -0
  5. package/dist/src/lib/editor/custom-shader/shared.d.ts +1 -0
  6. package/dist/src/lib/editor/custom-shader/shared.js +1 -0
  7. package/dist/src/renderer/ascii-atlas.d.ts +5 -0
  8. package/dist/src/renderer/ascii-atlas.js +61 -0
  9. package/dist/src/renderer/ascii-pass.d.ts +50 -0
  10. package/dist/src/renderer/ascii-pass.js +271 -0
  11. package/dist/src/renderer/asset-url.d.ts +1 -0
  12. package/dist/src/renderer/asset-url.js +3 -0
  13. package/dist/src/renderer/blend-modes.d.ts +4 -0
  14. package/dist/src/renderer/blend-modes.js +157 -0
  15. package/dist/src/renderer/contracts.d.ts +26 -0
  16. package/dist/src/renderer/contracts.js +13 -0
  17. package/dist/src/renderer/create-webgpu-renderer.d.ts +3 -0
  18. package/dist/src/renderer/create-webgpu-renderer.js +37 -0
  19. package/dist/src/renderer/crt-pass.d.ts +72 -0
  20. package/dist/src/renderer/crt-pass.js +536 -0
  21. package/dist/src/renderer/custom-shader-pass.d.ts +17 -0
  22. package/dist/src/renderer/custom-shader-pass.js +79 -0
  23. package/dist/src/renderer/custom-shader-runtime.d.ts +16 -0
  24. package/dist/src/renderer/custom-shader-runtime.js +169 -0
  25. package/dist/src/renderer/dither-textures.d.ts +8 -0
  26. package/dist/src/renderer/dither-textures.js +66 -0
  27. package/dist/src/renderer/dithering-pass.d.ts +45 -0
  28. package/dist/src/renderer/dithering-pass.js +229 -0
  29. package/dist/src/renderer/gradient-pass.d.ts +39 -0
  30. package/dist/src/renderer/gradient-pass.js +358 -0
  31. package/dist/src/renderer/halftone-pass.d.ts +65 -0
  32. package/dist/src/renderer/halftone-pass.js +530 -0
  33. package/dist/src/renderer/ink-pass.d.ts +84 -0
  34. package/dist/src/renderer/ink-pass.js +526 -0
  35. package/dist/src/renderer/live-pass.d.ts +31 -0
  36. package/dist/src/renderer/live-pass.js +136 -0
  37. package/dist/src/renderer/media-pass.d.ts +32 -0
  38. package/dist/src/renderer/media-pass.js +130 -0
  39. package/dist/src/renderer/media-texture.d.ts +8 -0
  40. package/dist/src/renderer/media-texture.js +41 -0
  41. package/dist/src/renderer/particle-grid-pass.d.ts +48 -0
  42. package/dist/src/renderer/particle-grid-pass.js +269 -0
  43. package/dist/src/renderer/pass-node.d.ts +36 -0
  44. package/dist/src/renderer/pass-node.js +120 -0
  45. package/dist/src/renderer/pattern-atlas.d.ts +8 -0
  46. package/dist/src/renderer/pattern-atlas.js +79 -0
  47. package/dist/src/renderer/pattern-pass.d.ts +58 -0
  48. package/dist/src/renderer/pattern-pass.js +316 -0
  49. package/dist/src/renderer/pipeline-manager.d.ts +39 -0
  50. package/dist/src/renderer/pipeline-manager.js +287 -0
  51. package/dist/src/renderer/pixel-sorting-pass.d.ts +33 -0
  52. package/dist/src/renderer/pixel-sorting-pass.js +179 -0
  53. package/dist/src/renderer/shaders/tsl/color/tonemapping.d.ts +9 -0
  54. package/dist/src/renderer/shaders/tsl/color/tonemapping.js +59 -0
  55. package/dist/src/renderer/shaders/tsl/cosine-palette.d.ts +4 -0
  56. package/{packages/shader-lab-react/src/renderer/shaders/tsl/cosine-palette.ts → dist/src/renderer/shaders/tsl/cosine-palette.js} +3 -4
  57. package/dist/src/renderer/shaders/tsl/noise/common.d.ts +5 -0
  58. package/dist/src/renderer/shaders/tsl/noise/common.js +24 -0
  59. package/dist/src/renderer/shaders/tsl/noise/curl-noise-3d.d.ts +1 -0
  60. package/dist/src/renderer/shaders/tsl/noise/curl-noise-3d.js +27 -0
  61. package/dist/src/renderer/shaders/tsl/noise/curl-noise-4d.d.ts +1 -0
  62. package/dist/src/renderer/shaders/tsl/noise/curl-noise-4d.js +27 -0
  63. package/dist/src/renderer/shaders/tsl/noise/fbm.d.ts +1 -0
  64. package/dist/src/renderer/shaders/tsl/noise/fbm.js +11 -0
  65. package/dist/src/renderer/shaders/tsl/noise/perlin-noise-3d.d.ts +5 -0
  66. package/dist/src/renderer/shaders/tsl/noise/perlin-noise-3d.js +66 -0
  67. package/dist/src/renderer/shaders/tsl/noise/ridge-noise.d.ts +1 -0
  68. package/dist/src/renderer/shaders/tsl/noise/ridge-noise.js +19 -0
  69. package/dist/src/renderer/shaders/tsl/noise/simplex-noise-3d.d.ts +1 -0
  70. package/dist/src/renderer/shaders/tsl/noise/simplex-noise-3d.js +44 -0
  71. package/dist/src/renderer/shaders/tsl/noise/simplex-noise-4d.d.ts +1 -0
  72. package/dist/src/renderer/shaders/tsl/noise/simplex-noise-4d.js +51 -0
  73. package/dist/src/renderer/shaders/tsl/noise/turbulence.d.ts +7 -0
  74. package/dist/src/renderer/shaders/tsl/noise/turbulence.js +34 -0
  75. package/dist/src/renderer/shaders/tsl/noise/value-noise-3d.d.ts +1 -0
  76. package/dist/src/renderer/shaders/tsl/noise/value-noise-3d.js +27 -0
  77. package/dist/src/renderer/shaders/tsl/noise/voronoi-noise-3d.d.ts +1 -0
  78. package/dist/src/renderer/shaders/tsl/noise/voronoi-noise-3d.js +45 -0
  79. package/dist/src/renderer/shaders/tsl/patterns/bloom-edge-pattern.d.ts +4 -0
  80. package/dist/src/renderer/shaders/tsl/patterns/bloom-edge-pattern.js +13 -0
  81. package/dist/src/renderer/shaders/tsl/patterns/bloom.d.ts +4 -0
  82. package/{packages/shader-lab-react/src/renderer/shaders/tsl/patterns/bloom.ts → dist/src/renderer/shaders/tsl/patterns/bloom.js} +4 -6
  83. package/dist/src/renderer/shaders/tsl/patterns/canvas-weave-pattern.d.ts +4 -0
  84. package/dist/src/renderer/shaders/tsl/patterns/canvas-weave-pattern.js +16 -0
  85. package/dist/src/renderer/shaders/tsl/patterns/grain-texture-pattern.d.ts +4 -0
  86. package/{packages/shader-lab-react/src/renderer/shaders/tsl/patterns/grain-texture-pattern.ts → dist/src/renderer/shaders/tsl/patterns/grain-texture-pattern.js} +3 -4
  87. package/dist/src/renderer/shaders/tsl/patterns/repeating-pattern.d.ts +4 -0
  88. package/{packages/shader-lab-react/src/renderer/shaders/tsl/patterns/repeating-pattern.ts → dist/src/renderer/shaders/tsl/patterns/repeating-pattern.js} +4 -6
  89. package/dist/src/renderer/shaders/tsl/utils/atan2.d.ts +1 -0
  90. package/dist/src/renderer/shaders/tsl/utils/atan2.js +7 -0
  91. package/dist/src/renderer/shaders/tsl/utils/complex-conj.d.ts +4 -0
  92. package/{packages/shader-lab-react/src/renderer/shaders/tsl/utils/complex-conj.ts → dist/src/renderer/shaders/tsl/utils/complex-conj.js} +3 -4
  93. package/dist/src/renderer/shaders/tsl/utils/complex-cos.d.ts +4 -0
  94. package/dist/src/renderer/shaders/tsl/utils/complex-cos.js +9 -0
  95. package/dist/src/renderer/shaders/tsl/utils/complex-div.d.ts +1 -0
  96. package/dist/src/renderer/shaders/tsl/utils/complex-div.js +6 -0
  97. package/dist/src/renderer/shaders/tsl/utils/complex-log.d.ts +1 -0
  98. package/dist/src/renderer/shaders/tsl/utils/complex-log.js +6 -0
  99. package/dist/src/renderer/shaders/tsl/utils/complex-mobius.d.ts +4 -0
  100. package/dist/src/renderer/shaders/tsl/utils/complex-mobius.js +10 -0
  101. package/dist/src/renderer/shaders/tsl/utils/complex-mul.d.ts +4 -0
  102. package/{packages/shader-lab-react/src/renderer/shaders/tsl/utils/complex-mul.ts → dist/src/renderer/shaders/tsl/utils/complex-mul.js} +3 -4
  103. package/dist/src/renderer/shaders/tsl/utils/complex-pow.d.ts +5 -0
  104. package/dist/src/renderer/shaders/tsl/utils/complex-pow.js +14 -0
  105. package/dist/src/renderer/shaders/tsl/utils/complex-sin.d.ts +4 -0
  106. package/dist/src/renderer/shaders/tsl/utils/complex-sin.js +9 -0
  107. package/dist/src/renderer/shaders/tsl/utils/complex-sqrt.d.ts +5 -0
  108. package/dist/src/renderer/shaders/tsl/utils/complex-sqrt.js +12 -0
  109. package/dist/src/renderer/shaders/tsl/utils/complex-tan.d.ts +4 -0
  110. package/dist/src/renderer/shaders/tsl/utils/complex-tan.js +11 -0
  111. package/dist/src/renderer/shaders/tsl/utils/complex-to-polar.d.ts +4 -0
  112. package/dist/src/renderer/shaders/tsl/utils/complex-to-polar.js +9 -0
  113. package/dist/src/renderer/shaders/tsl/utils/hyperbolic.d.ts +8 -0
  114. package/{packages/shader-lab-react/src/renderer/shaders/tsl/utils/hyperbolic.ts → dist/src/renderer/shaders/tsl/utils/hyperbolic.js} +7 -11
  115. package/dist/src/renderer/shaders/tsl/utils/index.d.ts +38 -0
  116. package/dist/src/renderer/shaders/tsl/utils/index.js +39 -0
  117. package/dist/src/renderer/shaders/tsl/utils/rotate.d.ts +2 -0
  118. package/dist/src/renderer/shaders/tsl/utils/rotate.js +7 -0
  119. package/dist/src/renderer/shaders/tsl/utils/screen-aspect-uv.d.ts +2 -0
  120. package/dist/src/renderer/shaders/tsl/utils/screen-aspect-uv.js +6 -0
  121. package/dist/src/renderer/shaders/tsl/utils/sd-box-2d.d.ts +1 -0
  122. package/dist/src/renderer/shaders/tsl/utils/sd-box-2d.js +5 -0
  123. package/dist/src/renderer/shaders/tsl/utils/sd-diamond.d.ts +1 -0
  124. package/dist/src/renderer/shaders/tsl/utils/sd-diamond.js +5 -0
  125. package/dist/src/renderer/shaders/tsl/utils/sd-rhombus.d.ts +1 -0
  126. package/dist/src/renderer/shaders/tsl/utils/sd-rhombus.js +14 -0
  127. package/dist/src/renderer/shaders/tsl/utils/sd-sphere.d.ts +1 -0
  128. package/dist/src/renderer/shaders/tsl/utils/sd-sphere.js +5 -0
  129. package/dist/src/renderer/shaders/tsl/utils/smax.d.ts +1 -0
  130. package/dist/src/renderer/shaders/tsl/utils/smax.js +6 -0
  131. package/dist/src/renderer/shaders/tsl/utils/smin.d.ts +1 -0
  132. package/dist/src/renderer/shaders/tsl/utils/smin.js +6 -0
  133. package/dist/src/renderer/text-pass.d.ts +23 -0
  134. package/dist/src/renderer/text-pass.js +129 -0
  135. package/dist/src/runtime-clock.d.ts +9 -0
  136. package/dist/src/runtime-clock.js +20 -0
  137. package/dist/src/runtime-frame.d.ts +11 -0
  138. package/dist/src/runtime-frame.js +12 -0
  139. package/dist/src/shader-lab-composition.d.ts +9 -0
  140. package/dist/src/shader-lab-composition.js +96 -0
  141. package/dist/src/timeline.d.ts +8 -0
  142. package/dist/src/timeline.js +179 -0
  143. package/dist/src/types/editor.d.ts +3 -0
  144. package/dist/src/types/editor.js +1 -0
  145. package/dist/src/types.d.ts +81 -0
  146. package/dist/src/types.js +1 -0
  147. package/package.json +28 -65
  148. package/.biome/plugins/README.md +0 -21
  149. package/.biome/plugins/no-anchor-element.grit +0 -12
  150. package/.biome/plugins/no-relative-parent-imports.grit +0 -10
  151. package/.biome/plugins/no-unnecessary-forwardref.grit +0 -9
  152. package/.changeset/README.md +0 -17
  153. package/.changeset/config.json +0 -11
  154. package/.editorconfig +0 -40
  155. package/.env.example +0 -81
  156. package/.gitattributes +0 -19
  157. package/.github/workflows/canary.yml +0 -80
  158. package/.github/workflows/ci.yml +0 -37
  159. package/.github/workflows/release.yml +0 -56
  160. package/.tldrignore +0 -84
  161. package/.vscode/extensions.json +0 -20
  162. package/.vscode/settings.json +0 -105
  163. package/biome.json +0 -249
  164. package/bun.lock +0 -1224
  165. package/next.config.ts +0 -131
  166. package/packages/shader-lab-react/CHANGELOG.md +0 -9
  167. package/packages/shader-lab-react/README.md +0 -119
  168. package/packages/shader-lab-react/package.json +0 -36
  169. package/packages/shader-lab-react/scripts/fix-esm-specifiers.mjs +0 -57
  170. package/packages/shader-lab-react/scripts/prepare-dist.mjs +0 -4
  171. package/packages/shader-lab-react/src/ambient/three-tsl.d.ts +0 -146
  172. package/packages/shader-lab-react/src/ambient/three-webgpu.d.ts +0 -51
  173. package/packages/shader-lab-react/src/easings.ts +0 -4
  174. package/packages/shader-lab-react/src/index.ts +0 -35
  175. package/packages/shader-lab-react/src/lib/editor/custom-shader/shared.ts +0 -2
  176. package/packages/shader-lab-react/src/renderer/ascii-atlas.ts +0 -83
  177. package/packages/shader-lab-react/src/renderer/ascii-pass.ts +0 -416
  178. package/packages/shader-lab-react/src/renderer/asset-url.ts +0 -3
  179. package/packages/shader-lab-react/src/renderer/blend-modes.ts +0 -229
  180. package/packages/shader-lab-react/src/renderer/contracts.ts +0 -54
  181. package/packages/shader-lab-react/src/renderer/create-webgpu-renderer.ts +0 -48
  182. package/packages/shader-lab-react/src/renderer/crt-pass.ts +0 -1040
  183. package/packages/shader-lab-react/src/renderer/custom-shader-pass.ts +0 -108
  184. package/packages/shader-lab-react/src/renderer/custom-shader-runtime.ts +0 -309
  185. package/packages/shader-lab-react/src/renderer/dither-textures.ts +0 -99
  186. package/packages/shader-lab-react/src/renderer/dithering-pass.ts +0 -322
  187. package/packages/shader-lab-react/src/renderer/gradient-pass.ts +0 -521
  188. package/packages/shader-lab-react/src/renderer/halftone-pass.ts +0 -932
  189. package/packages/shader-lab-react/src/renderer/ink-pass.ts +0 -802
  190. package/packages/shader-lab-react/src/renderer/live-pass.ts +0 -194
  191. package/packages/shader-lab-react/src/renderer/media-pass.ts +0 -187
  192. package/packages/shader-lab-react/src/renderer/media-texture.ts +0 -66
  193. package/packages/shader-lab-react/src/renderer/particle-grid-pass.ts +0 -389
  194. package/packages/shader-lab-react/src/renderer/pass-node.ts +0 -209
  195. package/packages/shader-lab-react/src/renderer/pattern-atlas.ts +0 -133
  196. package/packages/shader-lab-react/src/renderer/pattern-pass.ts +0 -552
  197. package/packages/shader-lab-react/src/renderer/pipeline-manager.ts +0 -369
  198. package/packages/shader-lab-react/src/renderer/pixel-sorting-pass.ts +0 -277
  199. package/packages/shader-lab-react/src/renderer/shaders/tsl/color/tonemapping.ts +0 -87
  200. package/packages/shader-lab-react/src/renderer/shaders/tsl/noise/common.ts +0 -31
  201. package/packages/shader-lab-react/src/renderer/shaders/tsl/noise/curl-noise-3d.ts +0 -36
  202. package/packages/shader-lab-react/src/renderer/shaders/tsl/noise/curl-noise-4d.ts +0 -36
  203. package/packages/shader-lab-react/src/renderer/shaders/tsl/noise/fbm.ts +0 -13
  204. package/packages/shader-lab-react/src/renderer/shaders/tsl/noise/perlin-noise-3d.ts +0 -96
  205. package/packages/shader-lab-react/src/renderer/shaders/tsl/noise/ridge-noise.ts +0 -24
  206. package/packages/shader-lab-react/src/renderer/shaders/tsl/noise/simplex-noise-3d.ts +0 -79
  207. package/packages/shader-lab-react/src/renderer/shaders/tsl/noise/simplex-noise-4d.ts +0 -89
  208. package/packages/shader-lab-react/src/renderer/shaders/tsl/noise/turbulence.ts +0 -56
  209. package/packages/shader-lab-react/src/renderer/shaders/tsl/noise/value-noise-3d.ts +0 -32
  210. package/packages/shader-lab-react/src/renderer/shaders/tsl/noise/voronoi-noise-3d.ts +0 -60
  211. package/packages/shader-lab-react/src/renderer/shaders/tsl/patterns/bloom-edge-pattern.ts +0 -15
  212. package/packages/shader-lab-react/src/renderer/shaders/tsl/patterns/canvas-weave-pattern.ts +0 -24
  213. package/packages/shader-lab-react/src/renderer/shaders/tsl/utils/atan2.ts +0 -9
  214. package/packages/shader-lab-react/src/renderer/shaders/tsl/utils/complex-cos.ts +0 -10
  215. package/packages/shader-lab-react/src/renderer/shaders/tsl/utils/complex-div.ts +0 -11
  216. package/packages/shader-lab-react/src/renderer/shaders/tsl/utils/complex-log.ts +0 -7
  217. package/packages/shader-lab-react/src/renderer/shaders/tsl/utils/complex-mobius.ts +0 -12
  218. package/packages/shader-lab-react/src/renderer/shaders/tsl/utils/complex-pow.ts +0 -16
  219. package/packages/shader-lab-react/src/renderer/shaders/tsl/utils/complex-sin.ts +0 -10
  220. package/packages/shader-lab-react/src/renderer/shaders/tsl/utils/complex-sqrt.ts +0 -18
  221. package/packages/shader-lab-react/src/renderer/shaders/tsl/utils/complex-tan.ts +0 -12
  222. package/packages/shader-lab-react/src/renderer/shaders/tsl/utils/complex-to-polar.ts +0 -10
  223. package/packages/shader-lab-react/src/renderer/shaders/tsl/utils/index.ts +0 -48
  224. package/packages/shader-lab-react/src/renderer/shaders/tsl/utils/rotate.ts +0 -15
  225. package/packages/shader-lab-react/src/renderer/shaders/tsl/utils/screen-aspect-uv.ts +0 -15
  226. package/packages/shader-lab-react/src/renderer/shaders/tsl/utils/sd-box-2d.ts +0 -6
  227. package/packages/shader-lab-react/src/renderer/shaders/tsl/utils/sd-diamond.ts +0 -6
  228. package/packages/shader-lab-react/src/renderer/shaders/tsl/utils/sd-rhombus.ts +0 -27
  229. package/packages/shader-lab-react/src/renderer/shaders/tsl/utils/sd-sphere.ts +0 -6
  230. package/packages/shader-lab-react/src/renderer/shaders/tsl/utils/smax.ts +0 -7
  231. package/packages/shader-lab-react/src/renderer/shaders/tsl/utils/smin.ts +0 -7
  232. package/packages/shader-lab-react/src/renderer/text-pass.ts +0 -176
  233. package/packages/shader-lab-react/src/runtime-clock.ts +0 -42
  234. package/packages/shader-lab-react/src/runtime-frame.ts +0 -29
  235. package/packages/shader-lab-react/src/shader-lab-composition.tsx +0 -163
  236. package/packages/shader-lab-react/src/timeline.ts +0 -283
  237. package/packages/shader-lab-react/src/types/editor.ts +0 -5
  238. package/packages/shader-lab-react/src/types.ts +0 -141
  239. package/packages/shader-lab-react/tsconfig.build.json +0 -8
  240. package/packages/shader-lab-react/tsconfig.json +0 -21
  241. package/postcss.config.mjs +0 -5
  242. package/public/assets/fonts/msdf/geist-mono/GeistMono-Regular-msdf-atlas.png +0 -0
  243. package/public/assets/fonts/msdf/geist-mono/GeistMono-Regular-msdf.json +0 -1412
  244. package/public/assets/patterns/bars/1.svg +0 -3
  245. package/public/assets/patterns/bars/2.svg +0 -3
  246. package/public/assets/patterns/bars/3.svg +0 -3
  247. package/public/assets/patterns/bars/4.svg +0 -3
  248. package/public/assets/patterns/bars/5.svg +0 -3
  249. package/public/assets/patterns/bars/6.svg +0 -3
  250. package/public/assets/patterns/candles/1.svg +0 -3
  251. package/public/assets/patterns/candles/2.svg +0 -3
  252. package/public/assets/patterns/candles/3.svg +0 -3
  253. package/public/assets/patterns/candles/4.svg +0 -3
  254. package/public/assets/patterns/shapes/1.svg +0 -3
  255. package/public/assets/patterns/shapes/2.svg +0 -3
  256. package/public/assets/patterns/shapes/3.svg +0 -3
  257. package/public/assets/patterns/shapes/4.svg +0 -4
  258. package/public/assets/patterns/shapes/5.svg +0 -3
  259. package/public/assets/patterns/shapes/6.svg +0 -4
  260. package/public/fonts/geist/Geist-Mono.woff2 +0 -0
  261. package/public/textures/blue-noise.png +0 -0
  262. package/public/textures/crt-mask.png +0 -0
  263. package/src/app/design/page.tsx +0 -398
  264. package/src/app/favicon.ico +0 -0
  265. package/src/app/globals.css +0 -280
  266. package/src/app/layout.tsx +0 -89
  267. package/src/app/page.tsx +0 -20
  268. package/src/app/robots.ts +0 -13
  269. package/src/app/sitemap.ts +0 -13
  270. package/src/components/editor/editor-canvas-viewport.tsx +0 -116
  271. package/src/components/editor/editor-export-dialog.tsx +0 -1177
  272. package/src/components/editor/editor-timeline-overlay.tsx +0 -983
  273. package/src/components/editor/editor-topbar.tsx +0 -287
  274. package/src/components/editor/layer-sidebar.tsx +0 -738
  275. package/src/components/editor/properties-sidebar-content.tsx +0 -574
  276. package/src/components/editor/properties-sidebar-fields.tsx +0 -389
  277. package/src/components/editor/properties-sidebar-utils.ts +0 -178
  278. package/src/components/editor/properties-sidebar.tsx +0 -421
  279. package/src/components/ui/button/index.tsx +0 -57
  280. package/src/components/ui/color-picker/index.tsx +0 -358
  281. package/src/components/ui/glass-panel/index.tsx +0 -45
  282. package/src/components/ui/icon-button/index.tsx +0 -46
  283. package/src/components/ui/select/index.tsx +0 -136
  284. package/src/components/ui/slider/index.tsx +0 -192
  285. package/src/components/ui/toggle/index.tsx +0 -34
  286. package/src/components/ui/typography/index.tsx +0 -61
  287. package/src/components/ui/xy-pad/index.tsx +0 -160
  288. package/src/features/editor/components/editor-export-dialog.module.css +0 -271
  289. package/src/hooks/use-editor-renderer.ts +0 -182
  290. package/src/lib/app.ts +0 -6
  291. package/src/lib/cn.ts +0 -7
  292. package/src/lib/easings.ts +0 -240
  293. package/src/lib/editor/config/layer-registry.ts +0 -2434
  294. package/src/lib/editor/custom-shader/shared.ts +0 -28
  295. package/src/lib/editor/export.ts +0 -420
  296. package/src/lib/editor/history.ts +0 -71
  297. package/src/lib/editor/layers.ts +0 -76
  298. package/src/lib/editor/parameter-schema.ts +0 -75
  299. package/src/lib/editor/project-file.ts +0 -145
  300. package/src/lib/editor/shader-export-snippet.ts +0 -37
  301. package/src/lib/editor/shader-export.ts +0 -315
  302. package/src/lib/editor/timeline/evaluate.ts +0 -252
  303. package/src/lib/editor/view-transform.ts +0 -58
  304. package/src/lib/fonts.ts +0 -28
  305. package/src/renderer/ascii-atlas.ts +0 -83
  306. package/src/renderer/ascii-pass.ts +0 -416
  307. package/src/renderer/blend-modes.ts +0 -229
  308. package/src/renderer/contracts.ts +0 -161
  309. package/src/renderer/create-webgpu-renderer.ts +0 -48
  310. package/src/renderer/crt-pass.ts +0 -1040
  311. package/src/renderer/custom-shader-pass.ts +0 -117
  312. package/src/renderer/custom-shader-runtime.ts +0 -309
  313. package/src/renderer/dither-textures.ts +0 -99
  314. package/src/renderer/dithering-pass.ts +0 -322
  315. package/src/renderer/gradient-pass.ts +0 -520
  316. package/src/renderer/halftone-pass.ts +0 -932
  317. package/src/renderer/ink-pass.ts +0 -683
  318. package/src/renderer/live-pass.ts +0 -194
  319. package/src/renderer/media-pass.ts +0 -187
  320. package/src/renderer/media-texture.ts +0 -66
  321. package/src/renderer/particle-grid-pass.ts +0 -389
  322. package/src/renderer/pass-node-factory.ts +0 -33
  323. package/src/renderer/pass-node.ts +0 -209
  324. package/src/renderer/pattern-atlas.ts +0 -97
  325. package/src/renderer/pattern-pass.ts +0 -552
  326. package/src/renderer/pipeline-manager.ts +0 -343
  327. package/src/renderer/pixel-sorting-pass.ts +0 -277
  328. package/src/renderer/project-clock.ts +0 -57
  329. package/src/renderer/shaders/tsl/color/tonemapping.ts +0 -86
  330. package/src/renderer/shaders/tsl/cosine-palette.ts +0 -8
  331. package/src/renderer/shaders/tsl/noise/common.ts +0 -30
  332. package/src/renderer/shaders/tsl/noise/curl-noise-3d.ts +0 -35
  333. package/src/renderer/shaders/tsl/noise/curl-noise-4d.ts +0 -35
  334. package/src/renderer/shaders/tsl/noise/fbm.ts +0 -12
  335. package/src/renderer/shaders/tsl/noise/perlin-noise-3d.ts +0 -97
  336. package/src/renderer/shaders/tsl/noise/ridge-noise.ts +0 -23
  337. package/src/renderer/shaders/tsl/noise/simplex-noise-3d.ts +0 -78
  338. package/src/renderer/shaders/tsl/noise/simplex-noise-4d.ts +0 -88
  339. package/src/renderer/shaders/tsl/noise/turbulence.ts +0 -55
  340. package/src/renderer/shaders/tsl/noise/value-noise-3d.ts +0 -31
  341. package/src/renderer/shaders/tsl/noise/voronoi-noise-3d.ts +0 -59
  342. package/src/renderer/shaders/tsl/patterns/bloom-edge-pattern.ts +0 -14
  343. package/src/renderer/shaders/tsl/patterns/bloom.ts +0 -10
  344. package/src/renderer/shaders/tsl/patterns/canvas-weave-pattern.ts +0 -23
  345. package/src/renderer/shaders/tsl/patterns/grain-texture-pattern.ts +0 -8
  346. package/src/renderer/shaders/tsl/patterns/repeating-pattern.ts +0 -10
  347. package/src/renderer/shaders/tsl/utils/atan2.ts +0 -8
  348. package/src/renderer/shaders/tsl/utils/complex-conj.ts +0 -8
  349. package/src/renderer/shaders/tsl/utils/complex-cos.ts +0 -9
  350. package/src/renderer/shaders/tsl/utils/complex-div.ts +0 -10
  351. package/src/renderer/shaders/tsl/utils/complex-log.ts +0 -6
  352. package/src/renderer/shaders/tsl/utils/complex-mobius.ts +0 -11
  353. package/src/renderer/shaders/tsl/utils/complex-mul.ts +0 -8
  354. package/src/renderer/shaders/tsl/utils/complex-pow.ts +0 -15
  355. package/src/renderer/shaders/tsl/utils/complex-sin.ts +0 -9
  356. package/src/renderer/shaders/tsl/utils/complex-sqrt.ts +0 -17
  357. package/src/renderer/shaders/tsl/utils/complex-tan.ts +0 -11
  358. package/src/renderer/shaders/tsl/utils/complex-to-polar.ts +0 -9
  359. package/src/renderer/shaders/tsl/utils/hyperbolic.ts +0 -19
  360. package/src/renderer/shaders/tsl/utils/index.ts +0 -47
  361. package/src/renderer/shaders/tsl/utils/rotate.ts +0 -14
  362. package/src/renderer/shaders/tsl/utils/screen-aspect-uv.ts +0 -14
  363. package/src/renderer/shaders/tsl/utils/sd-box-2d.ts +0 -5
  364. package/src/renderer/shaders/tsl/utils/sd-diamond.ts +0 -5
  365. package/src/renderer/shaders/tsl/utils/sd-rhombus.ts +0 -26
  366. package/src/renderer/shaders/tsl/utils/sd-sphere.ts +0 -5
  367. package/src/renderer/shaders/tsl/utils/smax.ts +0 -7
  368. package/src/renderer/shaders/tsl/utils/smin.ts +0 -6
  369. package/src/renderer/text-pass.ts +0 -176
  370. package/src/store/asset-store.ts +0 -193
  371. package/src/store/editor-store.ts +0 -223
  372. package/src/store/history-store.ts +0 -172
  373. package/src/store/index.ts +0 -31
  374. package/src/store/layer-store.ts +0 -675
  375. package/src/store/timeline-store.ts +0 -572
  376. package/src/types/assets.d.ts +0 -6
  377. package/src/types/css.d.ts +0 -21
  378. package/src/types/editor.ts +0 -357
  379. package/src/types/react.d.ts +0 -15
  380. package/src/types/three-tsl.d.ts +0 -146
  381. package/src/types/three-webgpu.d.ts +0 -51
  382. package/tsconfig.json +0 -49
  383. /package/{packages/shader-lab-react/assets → assets}/patterns/bars/1.svg +0 -0
  384. /package/{packages/shader-lab-react/assets → assets}/patterns/bars/2.svg +0 -0
  385. /package/{packages/shader-lab-react/assets → assets}/patterns/bars/3.svg +0 -0
  386. /package/{packages/shader-lab-react/assets → assets}/patterns/bars/4.svg +0 -0
  387. /package/{packages/shader-lab-react/assets → assets}/patterns/bars/5.svg +0 -0
  388. /package/{packages/shader-lab-react/assets → assets}/patterns/bars/6.svg +0 -0
  389. /package/{packages/shader-lab-react/assets → assets}/patterns/candles/1.svg +0 -0
  390. /package/{packages/shader-lab-react/assets → assets}/patterns/candles/2.svg +0 -0
  391. /package/{packages/shader-lab-react/assets → assets}/patterns/candles/3.svg +0 -0
  392. /package/{packages/shader-lab-react/assets → assets}/patterns/candles/4.svg +0 -0
  393. /package/{packages/shader-lab-react/assets → assets}/patterns/shapes/1.svg +0 -0
  394. /package/{packages/shader-lab-react/assets → assets}/patterns/shapes/2.svg +0 -0
  395. /package/{packages/shader-lab-react/assets → assets}/patterns/shapes/3.svg +0 -0
  396. /package/{packages/shader-lab-react/assets → assets}/patterns/shapes/4.svg +0 -0
  397. /package/{packages/shader-lab-react/assets → assets}/patterns/shapes/5.svg +0 -0
  398. /package/{packages/shader-lab-react/assets → assets}/patterns/shapes/6.svg +0 -0
  399. /package/{packages/shader-lab-react/assets → assets}/textures/blue-noise.png +0 -0
@@ -1,271 +0,0 @@
1
- .dialogRoot {
2
- inset: 0;
3
- position: fixed;
4
- z-index: 90;
5
- }
6
-
7
- .backdrop {
8
- background: rgb(4 5 7 / 0.56);
9
- border: 0;
10
- inset: 0;
11
- position: absolute;
12
- width: 100%;
13
- }
14
-
15
- .dialog {
16
- max-height: calc(100vh - 112px);
17
- overflow: hidden;
18
- padding: 0;
19
- }
20
-
21
- .dialogWrap {
22
- inset: 76px auto auto 50%;
23
- max-width: min(560px, calc(100vw - 32px));
24
- position: absolute;
25
- transform: translateX(-50%);
26
- width: min(560px, calc(100vw - 32px));
27
- }
28
-
29
- .dialogMotion {
30
- width: 100%;
31
- }
32
-
33
- .dialogHeader {
34
- align-items: center;
35
- border-bottom: 1px solid var(--ds-border-divider);
36
- display: flex;
37
- justify-content: space-between;
38
- padding: 14px 16px 12px;
39
- }
40
-
41
- .dialogTitle {
42
- line-height: 20px;
43
- }
44
-
45
- .closeButton {
46
- height: 28px;
47
- width: 28px;
48
- }
49
-
50
- .tabRow {
51
- border-bottom: 1px solid var(--ds-border-divider);
52
- display: flex;
53
- gap: 6px;
54
- padding: 10px 16px;
55
- }
56
-
57
- .tabButton {
58
- align-items: center;
59
- background-color: transparent;
60
- border: 1px solid transparent;
61
- border-radius: var(--ds-radius-control);
62
- display: inline-flex;
63
- justify-content: center;
64
- line-height: 1;
65
- min-height: 28px;
66
- padding: 0 10px;
67
- transition:
68
- background-color 160ms var(--ease-out-cubic),
69
- border-color 160ms var(--ease-out-cubic),
70
- color 160ms var(--ease-out-cubic);
71
- }
72
-
73
- .tabButton:hover {
74
- background-color: var(--ds-color-surface-subtle);
75
- border-color: var(--ds-border-subtle);
76
- }
77
-
78
- .tabButtonActive {
79
- background-color: var(--ds-color-surface-active);
80
- border-color: var(--ds-border-active);
81
- }
82
-
83
- .dialogBody {
84
- overflow: hidden;
85
- padding: 14px 16px 16px;
86
- }
87
-
88
- .contentViewport {
89
- position: relative;
90
- }
91
-
92
- .measureWrap {
93
- inset: 0 auto auto 0;
94
- pointer-events: none;
95
- position: absolute;
96
- visibility: hidden;
97
- width: 100%;
98
- z-index: -1;
99
- }
100
-
101
- .measureView {
102
- width: 100%;
103
- }
104
-
105
- .tabPane {
106
- width: 100%;
107
- }
108
-
109
- .sectionStack {
110
- display: flex;
111
- flex-direction: column;
112
- gap: 14px;
113
- }
114
-
115
- .field {
116
- display: flex;
117
- flex-direction: column;
118
- gap: 8px;
119
- }
120
-
121
- .fieldLabel {
122
- text-transform: uppercase;
123
- }
124
-
125
- .presetRow {
126
- display: flex;
127
- flex-wrap: wrap;
128
- gap: 6px;
129
- }
130
-
131
- .pillButton {
132
- align-items: center;
133
- background-color: var(--ds-color-surface-control);
134
- border: 1px solid var(--ds-border-divider);
135
- border-radius: var(--ds-radius-control);
136
- display: inline-flex;
137
- justify-content: center;
138
- line-height: 1;
139
- min-height: 28px;
140
- padding: 0 10px;
141
- transition:
142
- background-color 160ms var(--ease-out-cubic),
143
- border-color 160ms var(--ease-out-cubic),
144
- color 160ms var(--ease-out-cubic);
145
- }
146
-
147
- .tabButton :global(.type-label),
148
- .pillButton :global(.type-label) {
149
- line-height: 1;
150
- }
151
-
152
- .pillButton:hover:not(:disabled) {
153
- background-color: rgb(255 255 255 / 0.08);
154
- border-color: var(--ds-border-hover);
155
- }
156
-
157
- .pillButtonActive {
158
- background-color: var(--ds-color-surface-active);
159
- border-color: var(--ds-border-active);
160
- }
161
-
162
- .pillButton:disabled {
163
- cursor: not-allowed;
164
- opacity: 0.42;
165
- }
166
-
167
- .inlineGrid {
168
- display: grid;
169
- gap: 10px;
170
- grid-template-columns: repeat(2, minmax(0, 1fr));
171
- }
172
-
173
- .numberInput {
174
- background-color: var(--ds-color-surface-control);
175
- border: 1px solid var(--ds-border-divider);
176
- border-radius: var(--ds-radius-control);
177
- color: var(--ds-color-text-primary);
178
- font-family: var(--ds-font-mono);
179
- font-size: 12px;
180
- line-height: 16px;
181
- min-height: 36px;
182
- padding: 8px 10px;
183
- }
184
-
185
- .note {
186
- line-height: 14px;
187
- }
188
-
189
- .inlineCode {
190
- background-color: rgb(255 255 255 / 0.06);
191
- border: 1px solid rgb(255 255 255 / 0.09);
192
- border-radius: 6px;
193
- font-family: var(--ds-font-mono);
194
- font-size: 11px;
195
- padding: 1px 5px;
196
- }
197
-
198
- .issueList {
199
- background-color: rgb(255 74 74 / 0.06);
200
- border: 1px solid rgb(255 74 74 / 0.14);
201
- border-radius: var(--ds-radius-panel);
202
- display: flex;
203
- flex-direction: column;
204
- gap: 8px;
205
- padding: 12px;
206
- }
207
-
208
- .codeBlock {
209
- background-color: rgb(255 255 255 / 0.04);
210
- border: 1px solid var(--ds-border-divider);
211
- border-radius: var(--ds-radius-panel);
212
- font-family: var(--ds-font-mono);
213
- font-size: 11px;
214
- line-height: 1.55;
215
- margin: 0;
216
- max-height: 280px;
217
- overflow: auto;
218
- padding: 12px;
219
- white-space: pre-wrap;
220
- word-break: break-word;
221
- }
222
-
223
- .dropZone {
224
- align-items: center;
225
- background-color: var(--ds-color-surface-subtle);
226
- border: 1px dashed var(--ds-border-divider);
227
- border-radius: var(--ds-radius-panel);
228
- display: grid;
229
- gap: 12px;
230
- grid-template-columns: auto 1fr auto;
231
- padding: 14px;
232
- }
233
-
234
- .dropZoneActive {
235
- background-color: var(--ds-color-surface-active);
236
- border-color: var(--ds-border-hover);
237
- }
238
-
239
- .dropTitle {
240
- line-height: 16px;
241
- }
242
-
243
- .dropText {
244
- margin-top: 4px;
245
- }
246
-
247
- .errorMessage,
248
- .statusMessage {
249
- border-radius: var(--ds-radius-control);
250
- line-height: 14px;
251
- margin: 0 16px 16px;
252
- padding: 10px 12px;
253
- }
254
-
255
- .errorMessage {
256
- background-color: rgb(255 74 74 / 0.08);
257
- border: 1px solid rgb(255 74 74 / 0.18);
258
- color: rgb(255 191 191 / 0.92);
259
- }
260
-
261
- .statusMessage {
262
- background-color: rgb(255 255 255 / 0.06);
263
- border: 1px solid rgb(255 255 255 / 0.09);
264
- }
265
-
266
- @media (width < 900px) {
267
- .inlineGrid,
268
- .dropZone {
269
- grid-template-columns: 1fr;
270
- }
271
- }
@@ -1,182 +0,0 @@
1
- "use client"
2
-
3
- import { useEffect, useRef, useState } from "react"
4
- import {
5
- buildRendererFrame,
6
- type EditorRenderer,
7
- } from "@/renderer/contracts"
8
- import {
9
- browserSupportsWebGPU,
10
- createWebGPURenderer,
11
- } from "@/renderer/create-webgpu-renderer"
12
- import type { Size } from "@/types/editor"
13
- import { useAssetStore } from "@/store/asset-store"
14
- import { useEditorStore } from "@/store/editor-store"
15
- import { useLayerStore } from "@/store/layer-store"
16
- import { useTimelineStore } from "@/store/timeline-store"
17
-
18
- function getPixelRatio(): number {
19
- if (typeof window === "undefined") {
20
- return 1
21
- }
22
-
23
- return Math.min(window.devicePixelRatio || 1, 2)
24
- }
25
-
26
- function measureElement(element: HTMLElement): Size {
27
- const bounds = element.getBoundingClientRect()
28
-
29
- return {
30
- height: Math.max(1, Math.round(bounds.height)),
31
- width: Math.max(1, Math.round(bounds.width)),
32
- }
33
- }
34
-
35
- export function useEditorRenderer() {
36
- const canvasRef = useRef<HTMLCanvasElement | null>(null)
37
- const viewportRef = useRef<HTMLDivElement | null>(null)
38
- const rendererRef = useRef<EditorRenderer | null>(null)
39
- const animationFrameRef = useRef<number | null>(null)
40
- const [isReady, setIsReady] = useState(false)
41
- const [fallbackMessage, setFallbackMessage] = useState<string | null>(null)
42
-
43
- useEffect(() => {
44
- const canvas = canvasRef.current
45
- const viewport = viewportRef.current
46
-
47
- if (!(canvas && viewport)) {
48
- return
49
- }
50
-
51
- const canvasElement = canvas
52
- const viewportElement = viewport
53
-
54
- const editorStore = useEditorStore.getState()
55
-
56
- if (!browserSupportsWebGPU()) {
57
- editorStore.setWebGPUStatus(
58
- "unsupported",
59
- "This browser does not expose WebGPU yet.",
60
- )
61
- setFallbackMessage("WebGPU is not available in this browser.")
62
- return
63
- }
64
-
65
- let isDisposed = false
66
- let lastFrameTime = performance.now()
67
- let previewTime = 0
68
- let resizeObserver: ResizeObserver | null = null
69
-
70
- editorStore.setWebGPUStatus("initializing")
71
-
72
- async function initializeRenderer() {
73
- try {
74
- const renderer = await createWebGPURenderer(canvasElement)
75
-
76
- if (isDisposed) {
77
- renderer.dispose()
78
- return
79
- }
80
-
81
- rendererRef.current = renderer
82
- await renderer.initialize()
83
-
84
- if (isDisposed) {
85
- renderer.dispose()
86
- return
87
- }
88
-
89
- const initialSize = measureElement(viewportElement)
90
- editorStore.setCanvasSize(initialSize.width, initialSize.height)
91
- renderer.resize(initialSize, getPixelRatio())
92
- editorStore.setWebGPUStatus("ready")
93
- setIsReady(true)
94
-
95
- resizeObserver = new ResizeObserver(([entry]) => {
96
- if (!entry) {
97
- return
98
- }
99
-
100
- const nextSize = {
101
- height: Math.max(1, Math.round(entry.contentRect.height)),
102
- width: Math.max(1, Math.round(entry.contentRect.width)),
103
- }
104
-
105
- useEditorStore.getState().setCanvasSize(nextSize.width, nextSize.height)
106
- renderer.resize(nextSize, getPixelRatio())
107
- })
108
-
109
- resizeObserver.observe(viewportElement)
110
-
111
- const renderFrame = (now: number) => {
112
- const layerState = useLayerStore.getState()
113
- const assetState = useAssetStore.getState()
114
- const editorState = useEditorStore.getState()
115
- const delta = Math.max(0, (now - lastFrameTime) / 1000)
116
-
117
- lastFrameTime = now
118
- previewTime += delta
119
-
120
- let timelineState = useTimelineStore.getState()
121
-
122
- if (timelineState.isPlaying) {
123
- timelineState.advance(delta)
124
- timelineState = useTimelineStore.getState()
125
- }
126
-
127
- if (delta > 0) {
128
- editorState.setFps(1 / delta)
129
- }
130
-
131
- const frame = buildRendererFrame({
132
- assets: assetState.assets,
133
- clockTime: timelineState.isPlaying ? timelineState.currentTime : previewTime,
134
- delta,
135
- layers: layerState.layers,
136
- outputSize: editorState.outputSize,
137
- pixelRatio: getPixelRatio(),
138
- startupPreviewDismissed: editorState.startupPreviewDismissed,
139
- timeline: timelineState,
140
- viewportSize: editorState.canvasSize,
141
- })
142
-
143
- renderer.render(frame)
144
- animationFrameRef.current = window.requestAnimationFrame(renderFrame)
145
- }
146
-
147
- animationFrameRef.current = window.requestAnimationFrame(renderFrame)
148
- } catch (error) {
149
- const message =
150
- error instanceof Error ? error.message : "Renderer initialization failed."
151
-
152
- useEditorStore.getState().setWebGPUStatus("error", message)
153
- setFallbackMessage(message)
154
- }
155
- }
156
-
157
- void initializeRenderer()
158
-
159
- return () => {
160
- isDisposed = true
161
-
162
- if (resizeObserver) {
163
- resizeObserver.disconnect()
164
- }
165
-
166
- if (animationFrameRef.current !== null) {
167
- window.cancelAnimationFrame(animationFrameRef.current)
168
- }
169
-
170
- rendererRef.current?.dispose()
171
- rendererRef.current = null
172
- setIsReady(false)
173
- }
174
- }, [])
175
-
176
- return {
177
- canvasRef,
178
- fallbackMessage,
179
- isReady,
180
- viewportRef,
181
- }
182
- }
package/src/lib/app.ts DELETED
@@ -1,6 +0,0 @@
1
- export const APP_NAME = "ShaderLab"
2
- export const APP_DEFAULT_TITLE = "Shader Lab"
3
- export const APP_TITLE_TEMPLATE = "%s | Shader Lab"
4
- export const APP_DESCRIPTION = "It's shading time"
5
- export const APP_BASE_URL =
6
- process.env.NEXT_PUBLIC_BASE_URL ?? "https://localhost:3000"
package/src/lib/cn.ts DELETED
@@ -1,7 +0,0 @@
1
- import { cx } from "class-variance-authority"
2
- import type { ClassValue } from "class-variance-authority/types"
3
- import { twMerge } from "tailwind-merge"
4
-
5
- export function cn(...inputs: ClassValue[]) {
6
- return twMerge(cx(inputs))
7
- }
@@ -1,240 +0,0 @@
1
- /**
2
- * Easing Functions
3
- *
4
- * A complete collection of easing curves for animations.
5
- * All functions take a progress value (0-1) and return an eased value (0-1).
6
- *
7
- * @see https://easings.net for visual references
8
- *
9
- * @example
10
- * ```ts
11
- * import { easings, type EasingName } from '@/utils/easings'
12
- *
13
- * // Direct usage
14
- * const eased = easings.easeOutCubic(0.5)
15
- *
16
- * // With a variable easing name
17
- * const easingName: EasingName = 'easeInOutQuart'
18
- * const value = easings[easingName](progress)
19
- * ```
20
- *
21
- * ## Choosing an Easing
22
- *
23
- * | Category | Use Case |
24
- * |----------|----------|
25
- * | `easeOut*` | UI feedback, appearing elements (most common) |
26
- * | `easeIn*` | Exiting elements, building tension |
27
- * | `easeInOut*` | State transitions, loading indicators |
28
- * | `*Cubic/Quart` | Natural, balanced motion |
29
- * | `*Expo` | Dramatic, snappy motion |
30
- * | `*Elastic/Bounce` | Playful, attention-grabbing |
31
- */
32
-
33
- const pow = Math.pow
34
- const sqrt = Math.sqrt
35
- const sin = Math.sin
36
- const cos = Math.cos
37
- const PI = Math.PI
38
-
39
- // Easing constants
40
- const c1 = 1.70158
41
- const c2 = c1 * 1.525
42
- const c3 = c1 + 1
43
- const c4 = (2 * PI) / 3
44
- const c5 = (2 * PI) / 4.5
45
-
46
- /** Bounce out helper (used by bounce easings) */
47
- const bounceOut = (x: number): number => {
48
- const n1 = 7.5625
49
- const d1 = 2.75
50
-
51
- if (x < 1 / d1) {
52
- return n1 * x * x
53
- }
54
- if (x < 2 / d1) {
55
- return n1 * (x - 1.5 / d1) * x + 0.75
56
- }
57
- if (x < 2.5 / d1) {
58
- return n1 * (x - 2.25 / d1) * x + 0.9375
59
- }
60
- return n1 * (x - 2.625 / d1) * x + 0.984375
61
- }
62
-
63
- /**
64
- * Collection of easing functions.
65
- * Each function takes progress (0-1) and returns eased value (0-1).
66
- */
67
- export const easings = {
68
- // ─────────────────────────────────────────────────────────────────────────────
69
- // Linear (no easing)
70
- // ─────────────────────────────────────────────────────────────────────────────
71
-
72
- /** No easing - constant speed */
73
- linear: (x: number): number => x,
74
-
75
- // ─────────────────────────────────────────────────────────────────────────────
76
- // Quadratic (power of 2)
77
- // ─────────────────────────────────────────────────────────────────────────────
78
-
79
- /** Slow start */
80
- easeInQuad: (x: number): number => x * x,
81
-
82
- /** Slow end */
83
- easeOutQuad: (x: number): number => 1 - (1 - x) * (1 - x),
84
-
85
- /** Slow start and end */
86
- easeInOutQuad: (x: number): number =>
87
- x < 0.5 ? 2 * x * x : 1 - pow(-2 * x + 2, 2) / 2,
88
-
89
- // ─────────────────────────────────────────────────────────────────────────────
90
- // Cubic (power of 3) - Most commonly used
91
- // ─────────────────────────────────────────────────────────────────────────────
92
-
93
- /** Slow start, natural feel */
94
- easeInCubic: (x: number): number => x * x * x,
95
-
96
- /** Slow end, natural feel - great for UI interactions */
97
- easeOutCubic: (x: number): number => 1 - pow(1 - x, 3),
98
-
99
- /** Smooth start and end - great for transitions */
100
- easeInOutCubic: (x: number): number =>
101
- x < 0.5 ? 4 * x * x * x : 1 - pow(-2 * x + 2, 3) / 2,
102
-
103
- // ─────────────────────────────────────────────────────────────────────────────
104
- // Quartic (power of 4)
105
- // ─────────────────────────────────────────────────────────────────────────────
106
-
107
- /** Slower start than cubic */
108
- easeInQuart: (x: number): number => x * x * x * x,
109
-
110
- /** Slower end than cubic */
111
- easeOutQuart: (x: number): number => 1 - pow(1 - x, 4),
112
-
113
- /** More pronounced ease than cubic */
114
- easeInOutQuart: (x: number): number =>
115
- x < 0.5 ? 8 * x * x * x * x : 1 - pow(-2 * x + 2, 4) / 2,
116
-
117
- // ─────────────────────────────────────────────────────────────────────────────
118
- // Quintic (power of 5)
119
- // ─────────────────────────────────────────────────────────────────────────────
120
-
121
- /** Very slow start */
122
- easeInQuint: (x: number): number => x * x * x * x * x,
123
-
124
- /** Very slow end */
125
- easeOutQuint: (x: number): number => 1 - pow(1 - x, 5),
126
-
127
- /** Very pronounced ease */
128
- easeInOutQuint: (x: number): number =>
129
- x < 0.5 ? 16 * x * x * x * x * x : 1 - pow(-2 * x + 2, 5) / 2,
130
-
131
- // ─────────────────────────────────────────────────────────────────────────────
132
- // Sinusoidal - Gentle, wave-like
133
- // ─────────────────────────────────────────────────────────────────────────────
134
-
135
- /** Gentle slow start */
136
- easeInSine: (x: number): number => 1 - cos((x * PI) / 2),
137
-
138
- /** Gentle slow end */
139
- easeOutSine: (x: number): number => sin((x * PI) / 2),
140
-
141
- /** Gentle ease both ends */
142
- easeInOutSine: (x: number): number => -(cos(PI * x) - 1) / 2,
143
-
144
- // ─────────────────────────────────────────────────────────────────────────────
145
- // Exponential - Dramatic, snappy
146
- // ─────────────────────────────────────────────────────────────────────────────
147
-
148
- /** Dramatic slow start - almost stationary then fast */
149
- easeInExpo: (x: number): number => (x === 0 ? 0 : pow(2, 10 * x - 10)),
150
-
151
- /** Dramatic slow end - fast then almost stops */
152
- easeOutExpo: (x: number): number => (x === 1 ? 1 : 1 - pow(2, -10 * x)),
153
-
154
- /** Dramatic both ends */
155
- easeInOutExpo: (x: number): number => {
156
- if (x === 0) return 0
157
- if (x === 1) return 1
158
- if (x < 0.5) return pow(2, 20 * x - 10) / 2
159
- return (2 - pow(2, -20 * x + 10)) / 2
160
- },
161
-
162
- // ─────────────────────────────────────────────────────────────────────────────
163
- // Circular - Based on circle quarter
164
- // ─────────────────────────────────────────────────────────────────────────────
165
-
166
- /** Circular slow start */
167
- easeInCirc: (x: number): number => 1 - sqrt(1 - pow(x, 2)),
168
-
169
- /** Circular slow end */
170
- easeOutCirc: (x: number): number => sqrt(1 - pow(x - 1, 2)),
171
-
172
- /** Circular both ends */
173
- easeInOutCirc: (x: number): number =>
174
- x < 0.5
175
- ? (1 - sqrt(1 - pow(2 * x, 2))) / 2
176
- : (sqrt(1 - pow(-2 * x + 2, 2)) + 1) / 2,
177
-
178
- // ─────────────────────────────────────────────────────────────────────────────
179
- // Back - Overshoots then returns
180
- // ─────────────────────────────────────────────────────────────────────────────
181
-
182
- /** Pulls back before accelerating */
183
- easeInBack: (x: number): number => c3 * x * x * x - c1 * x * x,
184
-
185
- /** Overshoots target then settles */
186
- easeOutBack: (x: number): number =>
187
- 1 + c3 * pow(x - 1, 3) + c1 * pow(x - 1, 2),
188
-
189
- /** Pulls back, overshoots, settles */
190
- easeInOutBack: (x: number): number =>
191
- x < 0.5
192
- ? (pow(2 * x, 2) * ((c2 + 1) * 2 * x - c2)) / 2
193
- : (pow(2 * x - 2, 2) * ((c2 + 1) * (x * 2 - 2) + c2) + 2) / 2,
194
-
195
- // ─────────────────────────────────────────────────────────────────────────────
196
- // Elastic - Spring-like oscillation
197
- // ─────────────────────────────────────────────────────────────────────────────
198
-
199
- /** Wobbles at start */
200
- easeInElastic: (x: number): number => {
201
- if (x === 0) return 0
202
- if (x === 1) return 1
203
- return -pow(2, 10 * x - 10) * sin((x * 10 - 10.75) * c4)
204
- },
205
-
206
- /** Wobbles at end - great for attention */
207
- easeOutElastic: (x: number): number => {
208
- if (x === 0) return 0
209
- if (x === 1) return 1
210
- return pow(2, -10 * x) * sin((x * 10 - 0.75) * c4) + 1
211
- },
212
-
213
- /** Wobbles both ends */
214
- easeInOutElastic: (x: number): number => {
215
- if (x === 0) return 0
216
- if (x === 1) return 1
217
- if (x < 0.5) return -(pow(2, 20 * x - 10) * sin((20 * x - 11.125) * c5)) / 2
218
- return (pow(2, -20 * x + 10) * sin((20 * x - 11.125) * c5)) / 2 + 1
219
- },
220
-
221
- // ─────────────────────────────────────────────────────────────────────────────
222
- // Bounce - Ball bouncing effect
223
- // ─────────────────────────────────────────────────────────────────────────────
224
-
225
- /** Bounces at start */
226
- easeInBounce: (x: number): number => 1 - bounceOut(1 - x),
227
-
228
- /** Bounces at end - like a ball settling */
229
- easeOutBounce: bounceOut,
230
-
231
- /** Bounces both ends */
232
- easeInOutBounce: (x: number): number =>
233
- x < 0.5 ? (1 - bounceOut(1 - 2 * x)) / 2 : (1 + bounceOut(2 * x - 1)) / 2,
234
- } as const
235
-
236
- /** All available easing function names */
237
- export type EasingName = keyof typeof easings
238
-
239
- /** An easing function signature */
240
- export type EasingFunction = (progress: number) => number