@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,145 +0,0 @@
1
- import type {
2
- EditorAsset,
3
- EditorLayer,
4
- ProjectPresetConfig,
5
- Size,
6
- } from "@/types/editor"
7
- import { useAssetStore } from "@/store/asset-store"
8
- import { useEditorStore } from "@/store/editor-store"
9
- import { useLayerStore } from "@/store/layer-store"
10
- import { useTimelineStore } from "@/store/timeline-store"
11
-
12
- export interface LabProjectFile extends ProjectPresetConfig {
13
- composition: Size
14
- format: "shader-lab"
15
- }
16
-
17
- export function buildLabProjectFile(): LabProjectFile {
18
- const assets = useAssetStore.getState().assets
19
- const editorState = useEditorStore.getState()
20
- const layerState = useLayerStore.getState()
21
- const timelineState = useTimelineStore.getState()
22
-
23
- return {
24
- assets: assets.map((asset) => ({
25
- fileName: asset.fileName,
26
- id: asset.id,
27
- kind: asset.kind,
28
- })),
29
- composition: structuredClone(editorState.canvasSize),
30
- exportedAt: new Date().toISOString(),
31
- format: "shader-lab",
32
- layers: structuredClone(layerState.layers),
33
- selectedLayerId: layerState.selectedLayerId,
34
- timeline: structuredClone({
35
- duration: timelineState.duration,
36
- loop: timelineState.loop,
37
- tracks: timelineState.tracks,
38
- }),
39
- version: 1,
40
- }
41
- }
42
-
43
- export function parseLabProjectFile(input: string): LabProjectFile {
44
- let parsed: unknown
45
-
46
- try {
47
- parsed = JSON.parse(input)
48
- } catch {
49
- throw new Error("The selected file is not valid JSON.")
50
- }
51
-
52
- if (!(parsed && typeof parsed === "object")) {
53
- throw new Error("The selected file is not a valid Shader Lab project.")
54
- }
55
-
56
- const candidate = parsed as Partial<LabProjectFile>
57
-
58
- if (candidate.format !== "shader-lab") {
59
- throw new Error("This file is not a Shader Lab `.lab` project.")
60
- }
61
-
62
- if (candidate.version !== 1) {
63
- throw new Error("Unsupported Shader Lab project version.")
64
- }
65
-
66
- if (!Array.isArray(candidate.layers)) {
67
- throw new Error("Project file is missing a valid layer stack.")
68
- }
69
-
70
- if (!(candidate.timeline && typeof candidate.timeline === "object")) {
71
- throw new Error("Project file is missing timeline data.")
72
- }
73
-
74
- if (!Array.isArray(candidate.timeline.tracks)) {
75
- throw new Error("Project file is missing valid timeline tracks.")
76
- }
77
-
78
- if (
79
- !(candidate.composition && typeof candidate.composition === "object") ||
80
- typeof candidate.composition.width !== "number" ||
81
- typeof candidate.composition.height !== "number"
82
- ) {
83
- throw new Error("Project file is missing composition dimensions.")
84
- }
85
-
86
- return structuredClone(candidate as LabProjectFile)
87
- }
88
-
89
- export function applyLabProjectFile(
90
- projectFile: LabProjectFile,
91
- currentAssets: EditorAsset[],
92
- ): { missingAssetCount: number } {
93
- const assetIds = new Set(currentAssets.map((asset) => asset.id))
94
- const assetRefById = new Map(projectFile.assets.map((asset) => [asset.id, asset]))
95
-
96
- const nextLayers = projectFile.layers.map((layer) =>
97
- hydrateImportedLayer(layer, assetIds, assetRefById),
98
- )
99
-
100
- const hasSelectedLayer = nextLayers.some(
101
- (layer) => layer.id === projectFile.selectedLayerId,
102
- )
103
-
104
- useLayerStore
105
- .getState()
106
- .replaceState(nextLayers, hasSelectedLayer ? projectFile.selectedLayerId : null, null)
107
-
108
- useTimelineStore.getState().replaceState({
109
- currentTime: 0,
110
- duration: projectFile.timeline.duration,
111
- isPlaying: false,
112
- loop: projectFile.timeline.loop,
113
- selectedKeyframeId: null,
114
- selectedTrackId: null,
115
- tracks: projectFile.timeline.tracks,
116
- })
117
-
118
- return {
119
- missingAssetCount: nextLayers.filter(
120
- (layer) => Boolean(layer.assetId && layer.runtimeError),
121
- ).length,
122
- }
123
- }
124
-
125
- function hydrateImportedLayer(
126
- layer: EditorLayer,
127
- assetIds: Set<string>,
128
- assetRefById: Map<string, LabProjectFile["assets"][number]>,
129
- ): EditorLayer {
130
- if (!(layer.assetId && !assetIds.has(layer.assetId))) {
131
- return {
132
- ...layer,
133
- runtimeError: layer.runtimeError ?? null,
134
- }
135
- }
136
-
137
- const assetRef = assetRefById.get(layer.assetId)
138
-
139
- return {
140
- ...layer,
141
- runtimeError: assetRef
142
- ? `Missing asset: ${assetRef.fileName}`
143
- : "Missing asset reference",
144
- }
145
- }
@@ -1,37 +0,0 @@
1
- import type { ShaderLabConfig } from "@basementstudio/shader-lab"
2
-
3
- const DEFAULT_COMPONENT_NAME = "ExportedShader"
4
-
5
- export function generateShaderExportSnippet(
6
- config: ShaderLabConfig,
7
- componentName = DEFAULT_COMPONENT_NAME
8
- ): string {
9
- const safeComponentName = sanitizeShaderExportComponentName(componentName)
10
- const serializedConfig = JSON.stringify(config, null, 2)
11
-
12
- return [
13
- 'import { ShaderLabComposition, type ShaderLabConfig } from "@basementstudio/shader-lab"',
14
- "",
15
- `const config: ShaderLabConfig = ${serializedConfig}`,
16
- "",
17
- `export function ${safeComponentName}() {`,
18
- " return <ShaderLabComposition config={config} />",
19
- "}",
20
- "",
21
- ].join("\n")
22
- }
23
-
24
- export function sanitizeShaderExportComponentName(input: string): string {
25
- const collapsed = input.replace(/[^a-zA-Z0-9]+/g, " ").trim()
26
- const parts =
27
- collapsed.length > 0 ? collapsed.split(/\s+/) : [DEFAULT_COMPONENT_NAME]
28
- const candidate = parts
29
- .map((part) => part[0]?.toUpperCase() + part.slice(1))
30
- .join("")
31
-
32
- if (!(candidate && /^[A-Z]/.test(candidate))) {
33
- return DEFAULT_COMPONENT_NAME
34
- }
35
-
36
- return candidate
37
- }
@@ -1,315 +0,0 @@
1
- import type {
2
- ShaderLabAssetSource,
3
- ShaderLabBlendMode,
4
- ShaderLabCompositeMode,
5
- ShaderLabConfig,
6
- ShaderLabLayerConfig,
7
- ShaderLabLayerKind,
8
- ShaderLabLayerType,
9
- ShaderLabParameterValue,
10
- ShaderLabSketchSource,
11
- ShaderLabTimelineTrack,
12
- } from "@basementstudio/shader-lab"
13
- import { CUSTOM_SHADER_INTERNAL_KEYS } from "@/lib/editor/custom-shader/shared"
14
- import type {
15
- EditorAsset,
16
- EditorLayer,
17
- LayerType,
18
- TimelineStateSnapshot,
19
- } from "@/types/editor"
20
-
21
- const SUPPORTED_SHADER_EXPORT_LAYER_TYPES = new Set<LayerType>([
22
- "image",
23
- "video",
24
- "gradient",
25
- "text",
26
- "live",
27
- "custom-shader",
28
- "ascii",
29
- "ink",
30
- "pattern",
31
- "crt",
32
- "dithering",
33
- "halftone",
34
- "particle-grid",
35
- "pixel-sorting",
36
- ] as const)
37
-
38
- const UNSUPPORTED_SHADER_EXPORT_LAYER_TYPES = new Set<LayerType>([
39
- "fluid",
40
- "model",
41
- "pixelation",
42
- "blur",
43
- ] as const)
44
-
45
- type SupportedShaderExportLayerType = Extract<
46
- LayerType,
47
- | "ascii"
48
- | "crt"
49
- | "custom-shader"
50
- | "dithering"
51
- | "gradient"
52
- | "halftone"
53
- | "image"
54
- | "ink"
55
- | "live"
56
- | "particle-grid"
57
- | "pattern"
58
- | "pixel-sorting"
59
- | "text"
60
- | "video"
61
- >
62
-
63
- type SupportedShaderExportLayer = EditorLayer & {
64
- kind: ShaderLabLayerKind
65
- type: SupportedShaderExportLayerType
66
- }
67
-
68
- export interface ShaderExportValidationIssue {
69
- layerId?: string
70
- message: string
71
- }
72
-
73
- export interface BuildShaderExportConfigInput {
74
- assets: EditorAsset[]
75
- composition: {
76
- height: number
77
- width: number
78
- }
79
- layers: EditorLayer[]
80
- timeline: Pick<TimelineStateSnapshot, "duration" | "loop" | "tracks">
81
- }
82
-
83
- export function validateShaderExportSupport(
84
- layers: EditorLayer[],
85
- assets: EditorAsset[] = []
86
- ): ShaderExportValidationIssue[] {
87
- const issues: ShaderExportValidationIssue[] = []
88
- const assetById = new Map(assets.map((asset) => [asset.id, asset]))
89
-
90
- for (const layer of layers) {
91
- if (UNSUPPORTED_SHADER_EXPORT_LAYER_TYPES.has(layer.type)) {
92
- issues.push({
93
- layerId: layer.id,
94
- message: `Layer "${layer.name}" uses "${layer.type}", which is not supported by shader export yet.`,
95
- })
96
- continue
97
- }
98
-
99
- if (!SUPPORTED_SHADER_EXPORT_LAYER_TYPES.has(layer.type)) {
100
- issues.push({
101
- layerId: layer.id,
102
- message: `Layer "${layer.name}" uses unknown type "${layer.type}" and cannot be exported.`,
103
- })
104
- }
105
-
106
- if ((layer.type === "image" || layer.type === "video") && !layer.assetId) {
107
- issues.push({
108
- layerId: layer.id,
109
- message: `Layer "${layer.name}" requires a linked ${layer.type} asset before export.`,
110
- })
111
- }
112
-
113
- if (
114
- (layer.type === "image" || layer.type === "video") &&
115
- layer.assetId &&
116
- !assetById.has(layer.assetId)
117
- ) {
118
- issues.push({
119
- layerId: layer.id,
120
- message: `Layer "${layer.name}" references a missing ${layer.type} asset.`,
121
- })
122
- }
123
-
124
- if (
125
- layer.type === "custom-shader" &&
126
- (typeof layer.params.sourceCode !== "string" ||
127
- !layer.params.sourceCode.trim())
128
- ) {
129
- issues.push({
130
- layerId: layer.id,
131
- message: `Layer "${layer.name}" requires custom shader source before export.`,
132
- })
133
- }
134
- }
135
-
136
- return issues
137
- }
138
-
139
- export function buildShaderExportConfig(
140
- input: BuildShaderExportConfigInput
141
- ): ShaderLabConfig {
142
- const issues = validateShaderExportSupport(input.layers, input.assets)
143
-
144
- if (issues.length > 0) {
145
- throw new Error(issues[0]?.message ?? "Shader export is not supported.")
146
- }
147
-
148
- const assetById = new Map(input.assets.map((asset) => [asset.id, asset]))
149
-
150
- return {
151
- composition: {
152
- height: input.composition.height,
153
- width: input.composition.width,
154
- },
155
- layers: input.layers.map((layer) =>
156
- toShaderLabLayerConfig(
157
- layer,
158
- layer.assetId ? (assetById.get(layer.assetId) ?? null) : null
159
- )
160
- ),
161
- timeline: {
162
- duration: input.timeline.duration,
163
- loop: input.timeline.loop,
164
- tracks: structuredClone(
165
- input.timeline.tracks
166
- ) as ShaderLabTimelineTrack[],
167
- },
168
- }
169
- }
170
-
171
- function toShaderLabLayerConfig(
172
- layer: EditorLayer,
173
- asset: EditorAsset | null
174
- ): ShaderLabLayerConfig {
175
- const supportedLayer = assertSupportedShaderExportLayer(layer)
176
- const sketch =
177
- supportedLayer.type === "custom-shader"
178
- ? getSketchSource(supportedLayer)
179
- : undefined
180
- const assetSource = toShaderLabAssetSource(supportedLayer, asset)
181
- const baseLayer: ShaderLabLayerConfig = {
182
- blendMode: supportedLayer.blendMode as ShaderLabBlendMode,
183
- compositeMode: supportedLayer.compositeMode as ShaderLabCompositeMode,
184
- hue: supportedLayer.hue,
185
- id: supportedLayer.id,
186
- kind: supportedLayer.kind,
187
- name: supportedLayer.name,
188
- opacity: supportedLayer.opacity,
189
- params: stripEditorOnlyParams(supportedLayer),
190
- saturation: supportedLayer.saturation,
191
- type: supportedLayer.type as ShaderLabLayerType,
192
- visible: supportedLayer.visible,
193
- }
194
-
195
- if (assetSource) {
196
- baseLayer.asset = assetSource
197
- }
198
-
199
- if (sketch) {
200
- baseLayer.sketch = sketch
201
- }
202
-
203
- return baseLayer
204
- }
205
-
206
- function assertSupportedShaderExportLayer(
207
- layer: EditorLayer
208
- ): SupportedShaderExportLayer {
209
- if (layer.kind !== "effect" && layer.kind !== "source") {
210
- throw new Error(
211
- `Layer "${layer.name}" uses unsupported kind "${layer.kind}".`
212
- )
213
- }
214
-
215
- if (!SUPPORTED_SHADER_EXPORT_LAYER_TYPES.has(layer.type)) {
216
- throw new Error(
217
- `Layer "${layer.name}" uses unsupported type "${layer.type}".`
218
- )
219
- }
220
-
221
- return layer as SupportedShaderExportLayer
222
- }
223
-
224
- function toShaderLabAssetSource(
225
- layer: EditorLayer,
226
- asset: EditorAsset | null
227
- ): ShaderLabAssetSource | undefined {
228
- if (layer.type === "image") {
229
- const fileName = asset?.fileName || "image.png"
230
-
231
- return {
232
- ...(asset?.fileName ? { fileName: asset.fileName } : {}),
233
- kind: "image",
234
- src: buildAssetPlaceholderPath("image", fileName),
235
- }
236
- }
237
-
238
- if (layer.type === "video") {
239
- const fileName = asset?.fileName || "video.mp4"
240
-
241
- return {
242
- ...(asset?.fileName ? { fileName: asset.fileName } : {}),
243
- kind: "video",
244
- src: buildAssetPlaceholderPath("video", fileName),
245
- }
246
- }
247
-
248
- return undefined
249
- }
250
-
251
- function getSketchSource(
252
- layer: EditorLayer
253
- ): ShaderLabSketchSource | undefined {
254
- const sourceCode =
255
- typeof layer.params.sourceCode === "string" ? layer.params.sourceCode : ""
256
-
257
- if (!sourceCode.trim()) {
258
- return undefined
259
- }
260
-
261
- const fileName =
262
- typeof layer.params.sourceFileName === "string" &&
263
- layer.params.sourceFileName.trim()
264
- ? layer.params.sourceFileName.trim()
265
- : null
266
-
267
- return {
268
- code: sourceCode,
269
- entryExport:
270
- typeof layer.params.entryExport === "string" &&
271
- layer.params.entryExport.trim()
272
- ? layer.params.entryExport.trim()
273
- : "sketch",
274
- mode: "inline",
275
- ...(fileName ? { fileName } : {}),
276
- }
277
- }
278
-
279
- function stripEditorOnlyParams(
280
- layer: EditorLayer
281
- ): Record<string, ShaderLabParameterValue> {
282
- const params: Record<string, ShaderLabParameterValue> = {}
283
-
284
- for (const [key, value] of Object.entries(layer.params)) {
285
- if (
286
- layer.type === "custom-shader" &&
287
- CUSTOM_SHADER_INTERNAL_KEYS.has(key)
288
- ) {
289
- continue
290
- }
291
-
292
- params[key] = structuredClone(value) as ShaderLabParameterValue
293
- }
294
-
295
- return params
296
- }
297
-
298
- function buildAssetPlaceholderPath(
299
- kind: Extract<ShaderLabAssetSource["kind"], "image" | "video">,
300
- fileName: string
301
- ): string {
302
- const sanitizedFileName = sanitizeAssetFileName(fileName)
303
-
304
- return `/replace/${kind}/${sanitizedFileName}`
305
- }
306
-
307
- function sanitizeAssetFileName(fileName: string): string {
308
- const trimmed = fileName.trim()
309
-
310
- if (!trimmed) {
311
- return "asset"
312
- }
313
-
314
- return trimmed.replace(/[^a-zA-Z0-9._-]+/g, "-")
315
- }