@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,389 +0,0 @@
1
- "use client"
2
-
3
- import { motion } from "motion/react"
4
- import type {
5
- AnimatedPropertyBinding,
6
- ParameterDefinition,
7
- ParameterValue,
8
- SelectParameterDefinition,
9
- TextParameterDefinition,
10
- } from "@/types/editor"
11
- import { cn } from "@/lib/cn"
12
- import { ColorPicker } from "@/components/ui/color-picker"
13
- import { IconButton } from "@/components/ui/icon-button"
14
- import { Select } from "@/components/ui/select"
15
- import { Slider } from "@/components/ui/slider"
16
- import { Toggle } from "@/components/ui/toggle"
17
- import { Typography } from "@/components/ui/typography"
18
- import { XYPad } from "@/components/ui/xy-pad"
19
- import { useLayerStore } from "@/store/layer-store"
20
- import { useTimelineStore } from "@/store/timeline-store"
21
- import {
22
- hasTrackForBinding,
23
- toBooleanValue,
24
- toColorValue,
25
- toNumberValue,
26
- toTextValue,
27
- toVec2Value,
28
- } from "./properties-sidebar-utils"
29
-
30
- export type TimelineKeyframeControl = {
31
- binding: AnimatedPropertyBinding | null
32
- hasTrack: boolean
33
- layerId: string
34
- onKeyframe: (
35
- binding: AnimatedPropertyBinding,
36
- layerId: string,
37
- value: ParameterValue
38
- ) => void
39
- reduceMotion: boolean
40
- timelinePanelOpen: boolean
41
- value: ParameterValue
42
- }
43
-
44
- function RhombusIcon() {
45
- return (
46
- <svg aria-hidden="true" fill="none" viewBox="0 0 14 14">
47
- <path
48
- d="M7 1.8L12.2 7L7 12.2L1.8 7L7 1.8Z"
49
- fill="currentColor"
50
- fillOpacity="0.18"
51
- stroke="currentColor"
52
- strokeWidth="1.2"
53
- />
54
- </svg>
55
- )
56
- }
57
-
58
- function TimelineKeyframeButton({
59
- control,
60
- }: {
61
- control: TimelineKeyframeControl | null
62
- }) {
63
- if (!control?.binding) {
64
- return null
65
- }
66
-
67
- let animation: { opacity: number; scale?: number }
68
-
69
- if (control.timelinePanelOpen) {
70
- animation = control.reduceMotion ? { opacity: 1 } : { opacity: 1, scale: 1 }
71
- } else {
72
- animation = control.reduceMotion
73
- ? { opacity: 0 }
74
- : { opacity: 0, scale: 0.82 }
75
- }
76
-
77
- return (
78
- <span className="inline-flex h-6 w-6 shrink-0 items-center justify-center">
79
- <motion.span
80
- animate={animation}
81
- className="inline-flex shrink-0"
82
- initial={false}
83
- transition={
84
- control.reduceMotion
85
- ? { duration: 0.12, ease: "easeOut" }
86
- : { damping: 20, mass: 0.5, stiffness: 420, type: "spring" }
87
- }
88
- >
89
- <IconButton
90
- aria-hidden={!control.timelinePanelOpen}
91
- aria-label={`Create keyframe for ${control.binding.label}`}
92
- className={cn(
93
- "h-6 w-6 [&_svg]:h-3 [&_svg]:w-3",
94
- control.hasTrack && "text-[rgb(200_220_255_/_0.92)]"
95
- )}
96
- disabled={!control.timelinePanelOpen}
97
- onClick={() =>
98
- control.onKeyframe(
99
- control.binding as AnimatedPropertyBinding,
100
- control.layerId,
101
- control.value
102
- )
103
- }
104
- tabIndex={control.timelinePanelOpen ? 0 : -1}
105
- variant="ghost"
106
- >
107
- <RhombusIcon />
108
- </IconButton>
109
- </motion.span>
110
- </span>
111
- )
112
- }
113
-
114
- function renderFieldLabelStack(
115
- label: string,
116
- description: string | undefined,
117
- control: TimelineKeyframeControl | null
118
- ) {
119
- return (
120
- <span
121
- style={{
122
- display: "flex",
123
- flexDirection: "column",
124
- gap: "2px",
125
- minWidth: 0,
126
- }}
127
- >
128
- <Typography className="min-w-0" tone="secondary" variant="label">
129
- {renderFieldLabel(label, control)}
130
- </Typography>
131
- {description ? (
132
- <Typography tone="muted" variant="caption">
133
- {description}
134
- </Typography>
135
- ) : null}
136
- </span>
137
- )
138
- }
139
-
140
- function getCustomPaletteFieldLabel(
141
- definition: ParameterDefinition,
142
- layerParams: Record<string, ParameterValue> | null
143
- ): string {
144
- if (!layerParams) {
145
- return definition.label
146
- }
147
-
148
- const colorCount =
149
- typeof layerParams.customColorCount === "number"
150
- ? layerParams.customColorCount
151
- : 4
152
-
153
- switch (definition.key) {
154
- case "customColor1":
155
- return "Shadows"
156
- case "customColor2":
157
- return colorCount <= 2 ? "Highlights" : "Midtones"
158
- case "customColor3":
159
- return colorCount === 3 ? "Highlights" : "High Mids"
160
- case "customColor4":
161
- return "Highlights"
162
- default:
163
- return definition.label
164
- }
165
- }
166
-
167
- function shouldRenderCustomPaletteField(
168
- definition: ParameterDefinition,
169
- layerParams: Record<string, ParameterValue> | null
170
- ): boolean {
171
- if (!layerParams) {
172
- return true
173
- }
174
-
175
- if (
176
- definition.key === "customBgColor" ||
177
- definition.key === "customColorCount" ||
178
- definition.key === "customLuminanceBias" ||
179
- definition.key === "customColor1" ||
180
- definition.key === "customColor2"
181
- ) {
182
- return layerParams.colorMode === "custom"
183
- }
184
-
185
- if (definition.key === "customColor3") {
186
- return (
187
- layerParams.colorMode === "custom" &&
188
- typeof layerParams.customColorCount === "number" &&
189
- layerParams.customColorCount >= 3
190
- )
191
- }
192
-
193
- if (definition.key === "customColor4") {
194
- return (
195
- layerParams.colorMode === "custom" &&
196
- typeof layerParams.customColorCount === "number" &&
197
- layerParams.customColorCount >= 4
198
- )
199
- }
200
-
201
- return true
202
- }
203
-
204
- export function renderFieldLabel(
205
- label: string,
206
- control: TimelineKeyframeControl | null
207
- ) {
208
- return (
209
- <span className="inline-flex min-w-0 w-full items-center justify-between gap-2">
210
- <span>{label}</span>
211
- <TimelineKeyframeButton control={control} />
212
- </span>
213
- )
214
- }
215
-
216
- export function ParameterField({
217
- definition,
218
- layerId,
219
- onChange,
220
- onTimelineKeyframe,
221
- reduceMotion,
222
- timelineBinding,
223
- timelinePanelOpen,
224
- value,
225
- }: {
226
- definition: ParameterDefinition
227
- layerId: string
228
- onChange: (id: string, key: string, value: ParameterValue) => void
229
- onTimelineKeyframe: (
230
- binding: AnimatedPropertyBinding,
231
- layerId: string,
232
- value: ParameterValue
233
- ) => void
234
- reduceMotion: boolean
235
- timelineBinding: AnimatedPropertyBinding | null
236
- timelinePanelOpen: boolean
237
- value: ParameterValue
238
- }) {
239
- const layerParams = useLayerStore(
240
- (state) =>
241
- state.layers.find((layer) => layer.id === layerId)?.params ?? null
242
- )
243
- const timelineTracks = useTimelineStore((state) => state.tracks)
244
- const timelineControl: TimelineKeyframeControl | null = timelineBinding
245
- ? {
246
- binding: timelineBinding,
247
- hasTrack: hasTrackForBinding(timelineTracks, layerId, timelineBinding),
248
- layerId,
249
- onKeyframe: onTimelineKeyframe,
250
- reduceMotion,
251
- timelinePanelOpen,
252
- value,
253
- }
254
- : null
255
-
256
- if (!shouldRenderCustomPaletteField(definition, layerParams)) {
257
- return null
258
- }
259
-
260
- const fieldLabel = getCustomPaletteFieldLabel(definition, layerParams)
261
-
262
- switch (definition.type) {
263
- case "number":
264
- return (
265
- <Slider
266
- label={renderFieldLabelStack(
267
- fieldLabel,
268
- definition.description,
269
- timelineControl
270
- )}
271
- max={definition.max ?? 100}
272
- min={definition.min ?? 0}
273
- onValueChange={(nextValue) =>
274
- onChange(layerId, definition.key, nextValue)
275
- }
276
- step={definition.step ?? 0.01}
277
- value={toNumberValue(value, definition.defaultValue)}
278
- valueFormatOptions={{
279
- maximumFractionDigits: 2,
280
- minimumFractionDigits: 0,
281
- }}
282
- />
283
- )
284
-
285
- case "select":
286
- return (
287
- <div
288
- className="grid items-center gap-[10px] [grid-template-columns:minmax(0,1fr)_132px]"
289
- style={definition.description ? { alignItems: "start" } : undefined}
290
- >
291
- {renderFieldLabelStack(
292
- fieldLabel,
293
- definition.description,
294
- timelineControl
295
- )}
296
- <Select
297
- className="w-[132px]"
298
- onValueChange={(nextValue) => {
299
- if (nextValue) {
300
- onChange(layerId, definition.key, nextValue)
301
- }
302
- }}
303
- options={(definition as SelectParameterDefinition).options}
304
- triggerClassName="w-[132px]"
305
- value={typeof value === "string" ? value : definition.defaultValue}
306
- />
307
- </div>
308
- )
309
-
310
- case "boolean":
311
- return (
312
- <div
313
- className="grid items-center gap-[10px] [grid-template-columns:minmax(0,1fr)_auto]"
314
- style={definition.description ? { alignItems: "start" } : undefined}
315
- >
316
- {renderFieldLabelStack(
317
- fieldLabel,
318
- definition.description,
319
- timelineControl
320
- )}
321
- <Toggle
322
- checked={toBooleanValue(value)}
323
- className="justify-self-end"
324
- onCheckedChange={(nextValue) =>
325
- onChange(layerId, definition.key, nextValue)
326
- }
327
- />
328
- </div>
329
- )
330
-
331
- case "color":
332
- return (
333
- <div
334
- className="grid items-center gap-[10px] [grid-template-columns:minmax(0,1fr)_132px]"
335
- style={definition.description ? { alignItems: "start" } : undefined}
336
- >
337
- {renderFieldLabelStack(
338
- fieldLabel,
339
- definition.description,
340
- timelineControl
341
- )}
342
- <ColorPicker
343
- onValueChange={(nextValue) =>
344
- onChange(layerId, definition.key, nextValue)
345
- }
346
- value={toColorValue(value)}
347
- />
348
- </div>
349
- )
350
-
351
- case "vec2":
352
- return (
353
- <XYPad
354
- label={renderFieldLabel(fieldLabel, timelineControl)}
355
- max={definition.max ?? 1}
356
- min={definition.min ?? -1}
357
- onValueChange={(nextValue) =>
358
- onChange(layerId, definition.key, nextValue)
359
- }
360
- step={definition.step ?? 0.01}
361
- value={toVec2Value(value)}
362
- />
363
- )
364
-
365
- case "text":
366
- return (
367
- <label className="flex flex-col gap-2">
368
- {renderFieldLabelStack(
369
- fieldLabel,
370
- definition.description,
371
- timelineControl
372
- )}
373
- <input
374
- className="min-h-9 appearance-none rounded-[var(--ds-radius-control)] border border-[var(--ds-border-divider)] bg-[var(--ds-color-surface-control)] px-[10px] py-2 font-[var(--ds-font-mono)] text-[12px] leading-4 text-[var(--ds-color-text-primary)] outline-none transition-[border-color,background-color] duration-120 ease-[ease] focus:border-[var(--ds-color-text-secondary)] placeholder:text-[var(--ds-color-text-muted)]"
375
- maxLength={(definition as TextParameterDefinition).maxLength}
376
- onChange={(event) =>
377
- onChange(layerId, definition.key, event.currentTarget.value)
378
- }
379
- spellCheck={false}
380
- type="text"
381
- value={toTextValue(value, definition.defaultValue)}
382
- />
383
- </label>
384
- )
385
-
386
- default:
387
- return null
388
- }
389
- }
@@ -1,178 +0,0 @@
1
- "use client"
2
-
3
- import type {
4
- AnimatedPropertyBinding,
5
- EditorAsset,
6
- ParameterDefinition,
7
- ParameterValue,
8
- } from "@/types/editor"
9
- import type { useTimelineStore } from "@/store/timeline-store"
10
-
11
- export const blendModeOptions = [
12
- { label: "Normal", value: "normal" },
13
- { label: "Multiply", value: "multiply" },
14
- { label: "Screen", value: "screen" },
15
- { label: "Overlay", value: "overlay" },
16
- { label: "Darken", value: "darken" },
17
- { label: "Lighten", value: "lighten" },
18
- ] as const
19
-
20
- export const compositeModeOptions = [
21
- { label: "Filter", value: "filter" },
22
- { label: "Mask", value: "mask" },
23
- ] as const
24
-
25
- const COLLAPSIBLE_PARAM_GROUPS = new Set(["Points", "Effects"])
26
- export const DEFAULT_PARAM_GROUP = "Settings"
27
-
28
- export type ParamGroup = {
29
- collapsible: boolean
30
- id: string
31
- label: string
32
- params: ParameterDefinition[]
33
- }
34
-
35
- export function getBindingKey(binding: AnimatedPropertyBinding): string {
36
- if (binding.kind === "layer") {
37
- return `layer:${binding.property}`
38
- }
39
-
40
- return `param:${binding.key}`
41
- }
42
-
43
- export function getSelectedAsset(
44
- assetById: Map<string, EditorAsset>,
45
- assetId: string | null
46
- ): EditorAsset | null {
47
- if (!assetId) {
48
- return null
49
- }
50
-
51
- return assetById.get(assetId) ?? null
52
- }
53
-
54
- export function formatLayerKind(kind: string): string {
55
- switch (kind) {
56
- case "effect":
57
- return "Effect"
58
- case "model":
59
- return "3D Model"
60
- case "source":
61
- return "Source"
62
- default:
63
- return kind
64
- }
65
- }
66
-
67
- export function toColorValue(value: ParameterValue): string {
68
- return typeof value === "string" ? value : "#ffffff"
69
- }
70
-
71
- export function toVec2Value(value: ParameterValue): [number, number] {
72
- return Array.isArray(value) && value.length === 2
73
- ? [value[0] ?? 0, value[1] ?? 0]
74
- : [0, 0]
75
- }
76
-
77
- export function toNumberValue(value: ParameterValue, fallback = 0): number {
78
- return typeof value === "number" ? value : fallback
79
- }
80
-
81
- export function toBooleanValue(value: ParameterValue): boolean {
82
- return value === true
83
- }
84
-
85
- export function toTextValue(value: ParameterValue, fallback: string): string {
86
- return typeof value === "string" ? value : fallback
87
- }
88
-
89
- export function resolveParamValue(
90
- params: Record<string, ParameterValue>,
91
- definitions: ParameterDefinition[],
92
- key: string
93
- ): ParameterValue | undefined {
94
- const explicitValue = params[key]
95
- if (explicitValue !== undefined) {
96
- return explicitValue
97
- }
98
-
99
- const definition = definitions.find((entry) => entry.key === key)
100
- return definition?.defaultValue
101
- }
102
-
103
- export function isParamVisible(
104
- definition: ParameterDefinition,
105
- params: Record<string, ParameterValue>,
106
- definitions: ParameterDefinition[]
107
- ): boolean {
108
- if (!definition.visibleWhen) {
109
- return true
110
- }
111
-
112
- const controllingValue = resolveParamValue(
113
- params,
114
- definitions,
115
- definition.visibleWhen.key
116
- )
117
-
118
- if ("equals" in definition.visibleWhen) {
119
- return controllingValue === definition.visibleWhen.equals
120
- }
121
-
122
- return (
123
- typeof controllingValue === "number" &&
124
- controllingValue >= definition.visibleWhen.gte
125
- )
126
- }
127
-
128
- export function groupVisibleParams(params: ParameterDefinition[]): ParamGroup[] {
129
- const groups = new Map<string, ParamGroup>()
130
-
131
- for (const param of params) {
132
- const label = param.group ?? DEFAULT_PARAM_GROUP
133
- const id = label.toLowerCase().replace(/\s+/g, "-")
134
- const existing = groups.get(id)
135
-
136
- if (existing) {
137
- existing.params.push(param)
138
- continue
139
- }
140
-
141
- groups.set(id, {
142
- collapsible: COLLAPSIBLE_PARAM_GROUPS.has(label),
143
- id,
144
- label,
145
- params: [param],
146
- })
147
- }
148
-
149
- return [...groups.values()]
150
- }
151
-
152
- export function createParamTimelineBinding(
153
- definition: ParameterDefinition
154
- ): AnimatedPropertyBinding | null {
155
- if (definition.type === "text") {
156
- return null
157
- }
158
-
159
- return {
160
- key: definition.key,
161
- kind: "param",
162
- label: definition.label,
163
- valueType: definition.type === "boolean" ? "boolean" : definition.type,
164
- }
165
- }
166
-
167
- export function hasTrackForBinding(
168
- tracks: ReturnType<typeof useTimelineStore.getState>["tracks"],
169
- layerId: string,
170
- binding: AnimatedPropertyBinding
171
- ): boolean {
172
- const bindingKey = getBindingKey(binding)
173
-
174
- return tracks.some(
175
- (track) =>
176
- track.layerId === layerId && getBindingKey(track.binding) === bindingKey
177
- )
178
- }