shaders 2.5.117 → 2.5.118

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 (366) hide show
  1. package/dist/core/BarShift-2XBhva1A.js +141 -0
  2. package/dist/core/{Blur-DG7lJKPo.js → Blur-5_t3tR_g.js} +1 -1
  3. package/dist/core/BrickPattern-BfTsjp4I.js +175 -0
  4. package/dist/core/{ChannelBlur-BhcCkwcO.js → ChannelBlur-DWgS3nhn.js} +1 -1
  5. package/dist/core/Chevron-BKZjAXR_.js +142 -0
  6. package/dist/core/ColorWheel-BQUKQPM-.js +140 -0
  7. package/dist/core/{Crescent-DiioCL2k.js → Crescent-ppz7W7eM.js} +1 -1
  8. package/dist/core/{Cross-CxQTHuxC.js → Cross-BfNOtQ6s.js} +1 -1
  9. package/dist/core/{Crystal-B3iO7o_n.js → Crystal-QsQoy8fZ.js} +1 -1
  10. package/dist/core/{Ellipse-iwH-zEvD.js → Ellipse-sWhNvW9-.js} +1 -1
  11. package/dist/core/{Emboss-B4i61QDT.js → Emboss-DGaubb9x.js} +1 -1
  12. package/dist/core/{Flower-CdHVKJKu.js → Flower-BbRNrXIa.js} +1 -1
  13. package/dist/core/FractalNoise-Ccufnbw6.js +184 -0
  14. package/dist/core/{Glass-B19xsZLn.js → Glass-CXT1jdLw.js} +2 -2
  15. package/dist/core/{Glow-CsTZA75y.js → Glow-5PP4-rM9.js} +1 -1
  16. package/dist/core/Marble-DkHLcqFD.js +124 -0
  17. package/dist/core/{Neon-BeGABHrs.js → Neon-DQDB7hAE.js} +1 -1
  18. package/dist/core/{Polygon-_3DSqSBg.js → Polygon-C6_siOs0.js} +1 -1
  19. package/dist/core/{ProgressiveBlur-Dh8W2bZ3.js → ProgressiveBlur-BJwJ5mE0.js} +1 -1
  20. package/dist/core/{Ring-4J6h5Iof.js → Ring-CtnDtTY8.js} +1 -1
  21. package/dist/core/{RoundedRect-Dj-gqOc0.js → RoundedRect-tnt7Jr5b.js} +1 -1
  22. package/dist/core/{SmokeFill-rM9vUIm4.js → SmokeFill-DzEtYeKN.js} +1 -1
  23. package/dist/core/{Star-CJ4mkBZg.js → Star-0Flymgm9.js} +1 -1
  24. package/dist/core/SunBurst-D9X1-buZ.js +127 -0
  25. package/dist/core/{TiltShift-DSQ-CsXz.js → TiltShift-r4qzPb2k.js} +1 -1
  26. package/dist/core/{Trapezoid-P9gXhH9a.js → Trapezoid-JmybJMUr.js} +1 -1
  27. package/dist/core/{Vesica-DYov_i53.js → Vesica-D7iqgpJg.js} +1 -1
  28. package/dist/core/{VideoTexture-Cr1f0IOE.js → VideoTexture-D9XxE1Hw.js} +1 -1
  29. package/dist/core/{WebcamTexture-BQJpZvC5.js → WebcamTexture-9Td8qQWm.js} +1 -1
  30. package/dist/core/index.js +117 -110
  31. package/dist/core/registry.js +117 -110
  32. package/dist/core/shaderRegistry-CO5SCxc6.js +270 -0
  33. package/dist/core/shaderRegistry.d.ts.map +1 -1
  34. package/dist/core/shaders/BarShift/index.d.ts +47 -0
  35. package/dist/core/shaders/BarShift/index.d.ts.map +1 -0
  36. package/dist/core/shaders/BarShift/index.js +6 -0
  37. package/dist/core/shaders/Beam/index.js +1 -1
  38. package/dist/core/shaders/Blob/index.js +1 -1
  39. package/dist/core/shaders/Blur/index.js +2 -2
  40. package/dist/core/shaders/BrickPattern/index.d.ts +79 -0
  41. package/dist/core/shaders/BrickPattern/index.d.ts.map +1 -0
  42. package/dist/core/shaders/BrickPattern/index.js +5 -0
  43. package/dist/core/shaders/BrightnessContrast/index.js +1 -1
  44. package/dist/core/shaders/Bulge/index.js +1 -1
  45. package/dist/core/shaders/CRTScreen/index.js +1 -1
  46. package/dist/core/shaders/ChannelBlur/index.js +2 -2
  47. package/dist/core/shaders/Checkerboard/index.js +1 -1
  48. package/dist/core/shaders/Chevron/index.d.ts +66 -0
  49. package/dist/core/shaders/Chevron/index.d.ts.map +1 -0
  50. package/dist/core/shaders/Chevron/index.js +5 -0
  51. package/dist/core/shaders/ChromaFlow/index.js +1 -1
  52. package/dist/core/shaders/ChromaticAberration/index.js +1 -1
  53. package/dist/core/shaders/Circle/index.js +1 -1
  54. package/dist/core/shaders/ColorWheel/index.d.ts +62 -0
  55. package/dist/core/shaders/ColorWheel/index.d.ts.map +1 -0
  56. package/dist/core/shaders/ColorWheel/index.js +5 -0
  57. package/dist/core/shaders/ConcentricSpin/index.js +1 -1
  58. package/dist/core/shaders/ConicGradient/index.js +1 -1
  59. package/dist/core/shaders/ContourLines/index.js +1 -1
  60. package/dist/core/shaders/Crescent/index.js +2 -2
  61. package/dist/core/shaders/Cross/index.js +2 -2
  62. package/dist/core/shaders/Crystal/index.js +2 -2
  63. package/dist/core/shaders/CursorRipples/index.js +1 -1
  64. package/dist/core/shaders/CursorTrail/index.js +1 -1
  65. package/dist/core/shaders/DOMTexture/index.js +1 -1
  66. package/dist/core/shaders/DiamondGradient/index.js +1 -1
  67. package/dist/core/shaders/DiffuseBlur/index.js +1 -1
  68. package/dist/core/shaders/Dither/index.js +1 -1
  69. package/dist/core/shaders/DotGrid/index.js +1 -1
  70. package/dist/core/shaders/DropShadow/index.js +1 -1
  71. package/dist/core/shaders/Duotone/index.js +1 -1
  72. package/dist/core/shaders/Ellipse/index.js +2 -2
  73. package/dist/core/shaders/Emboss/index.js +2 -2
  74. package/dist/core/shaders/FallingLines/index.js +1 -1
  75. package/dist/core/shaders/FilmGrain/index.js +1 -1
  76. package/dist/core/shaders/FloatingParticles/index.js +1 -1
  77. package/dist/core/shaders/FlowField/index.js +1 -1
  78. package/dist/core/shaders/Flower/index.js +2 -2
  79. package/dist/core/shaders/FlowingGradient/index.js +1 -1
  80. package/dist/core/shaders/FlutedGlass/index.js +1 -1
  81. package/dist/core/shaders/Fog/index.js +1 -1
  82. package/dist/core/shaders/Form3D/index.js +1 -1
  83. package/dist/core/shaders/FractalNoise/index.d.ts +67 -0
  84. package/dist/core/shaders/FractalNoise/index.d.ts.map +1 -0
  85. package/dist/core/shaders/FractalNoise/index.js +5 -0
  86. package/dist/core/shaders/Glass/index.js +3 -3
  87. package/dist/core/shaders/GlassTiles/index.js +1 -1
  88. package/dist/core/shaders/Glitch/index.js +1 -1
  89. package/dist/core/shaders/Glow/index.js +2 -2
  90. package/dist/core/shaders/Godrays/index.js +1 -1
  91. package/dist/core/shaders/Grayscale/index.js +1 -1
  92. package/dist/core/shaders/Grid/index.js +1 -1
  93. package/dist/core/shaders/GridDistortion/index.js +1 -1
  94. package/dist/core/shaders/Group/index.js +1 -1
  95. package/dist/core/shaders/Halftone/index.js +1 -1
  96. package/dist/core/shaders/HexGrid/index.js +1 -1
  97. package/dist/core/shaders/HueShift/index.js +1 -1
  98. package/dist/core/shaders/ImageTexture/index.js +1 -1
  99. package/dist/core/shaders/Invert/index.js +1 -1
  100. package/dist/core/shaders/Kaleidoscope/index.js +1 -1
  101. package/dist/core/shaders/LensFlare/index.js +1 -1
  102. package/dist/core/shaders/LinearBlur/index.js +1 -1
  103. package/dist/core/shaders/LinearGradient/index.js +1 -1
  104. package/dist/core/shaders/Liquify/index.js +1 -1
  105. package/dist/core/shaders/Marble/index.d.ts +61 -0
  106. package/dist/core/shaders/Marble/index.d.ts.map +1 -0
  107. package/dist/core/shaders/Marble/index.js +5 -0
  108. package/dist/core/shaders/Mirror/index.js +1 -1
  109. package/dist/core/shaders/MultiPointGradient/index.js +1 -1
  110. package/dist/core/shaders/Neon/index.js +2 -2
  111. package/dist/core/shaders/Paper/index.js +1 -1
  112. package/dist/core/shaders/Perspective/index.js +1 -1
  113. package/dist/core/shaders/Pixelate/index.js +1 -1
  114. package/dist/core/shaders/Plasma/index.js +1 -1
  115. package/dist/core/shaders/PolarCoordinates/index.js +1 -1
  116. package/dist/core/shaders/Polygon/index.js +2 -2
  117. package/dist/core/shaders/Posterize/index.js +1 -1
  118. package/dist/core/shaders/ProgressiveBlur/index.js +2 -2
  119. package/dist/core/shaders/RadialGradient/index.js +1 -1
  120. package/dist/core/shaders/RectangularCoordinates/index.js +1 -1
  121. package/dist/core/shaders/Ring/index.js +2 -2
  122. package/dist/core/shaders/Ripples/index.js +1 -1
  123. package/dist/core/shaders/RoundedRect/index.js +2 -2
  124. package/dist/core/shaders/Saturation/index.js +1 -1
  125. package/dist/core/shaders/Sharpness/index.js +1 -1
  126. package/dist/core/shaders/Shatter/index.js +1 -1
  127. package/dist/core/shaders/SimplexNoise/index.js +1 -1
  128. package/dist/core/shaders/SineWave/index.js +1 -1
  129. package/dist/core/shaders/Smoke/index.js +1 -1
  130. package/dist/core/shaders/SmokeFill/index.js +2 -2
  131. package/dist/core/shaders/Solarize/index.js +1 -1
  132. package/dist/core/shaders/SolidColor/index.js +1 -1
  133. package/dist/core/shaders/Spherize/index.js +1 -1
  134. package/dist/core/shaders/Spiral/index.js +1 -1
  135. package/dist/core/shaders/Star/index.js +2 -2
  136. package/dist/core/shaders/Strands/index.js +1 -1
  137. package/dist/core/shaders/Stretch/index.js +1 -1
  138. package/dist/core/shaders/Stripes/index.js +1 -1
  139. package/dist/core/shaders/StudioBackground/index.js +1 -1
  140. package/dist/core/shaders/SunBurst/index.d.ts +61 -0
  141. package/dist/core/shaders/SunBurst/index.d.ts.map +1 -0
  142. package/dist/core/shaders/SunBurst/index.js +4 -0
  143. package/dist/core/shaders/Swirl/index.js +1 -1
  144. package/dist/core/shaders/TiltShift/index.js +2 -2
  145. package/dist/core/shaders/Tint/index.js +1 -1
  146. package/dist/core/shaders/Trapezoid/index.js +2 -2
  147. package/dist/core/shaders/Tritone/index.js +1 -1
  148. package/dist/core/shaders/Truchet/index.js +1 -1
  149. package/dist/core/shaders/Twirl/index.js +1 -1
  150. package/dist/core/shaders/VHS/index.js +1 -1
  151. package/dist/core/shaders/Vesica/index.js +2 -2
  152. package/dist/core/shaders/Vibrance/index.js +1 -1
  153. package/dist/core/shaders/VideoTexture/index.js +2 -2
  154. package/dist/core/shaders/Vignette/index.js +1 -1
  155. package/dist/core/shaders/Voronoi/index.js +1 -1
  156. package/dist/core/shaders/WaveDistortion/index.js +1 -1
  157. package/dist/core/shaders/Weave/index.js +1 -1
  158. package/dist/core/shaders/WebcamTexture/index.js +2 -2
  159. package/dist/core/shaders/WorleyNoise/index.js +1 -1
  160. package/dist/core/shaders/ZoomBlur/index.js +1 -1
  161. package/dist/js/createShader.js +1 -1
  162. package/dist/js/utils/generatePresetCode.d.ts.map +1 -1
  163. package/dist/js/utils/generatePresetCode.js +97 -0
  164. package/dist/react/BarShift.js +217 -0
  165. package/dist/react/BrickPattern.js +217 -0
  166. package/dist/react/Chevron.js +217 -0
  167. package/dist/react/ColorWheel.js +217 -0
  168. package/dist/react/FractalNoise.js +217 -0
  169. package/dist/react/Marble.js +217 -0
  170. package/dist/react/Preview.js +7 -0
  171. package/dist/react/Shader.js +1 -1
  172. package/dist/react/SunBurst.js +217 -0
  173. package/dist/react/bundle.js +267 -267
  174. package/dist/react/components/BarShift.d.ts +35 -0
  175. package/dist/react/components/BarShift.d.ts.map +1 -0
  176. package/dist/react/components/BrickPattern.d.ts +38 -0
  177. package/dist/react/components/BrickPattern.d.ts.map +1 -0
  178. package/dist/react/components/Chevron.d.ts +37 -0
  179. package/dist/react/components/Chevron.d.ts.map +1 -0
  180. package/dist/react/components/ColorWheel.d.ts +34 -0
  181. package/dist/react/components/ColorWheel.d.ts.map +1 -0
  182. package/dist/react/components/FractalNoise.d.ts +36 -0
  183. package/dist/react/components/FractalNoise.d.ts.map +1 -0
  184. package/dist/react/components/Marble.d.ts +35 -0
  185. package/dist/react/components/Marble.d.ts.map +1 -0
  186. package/dist/react/components/SunBurst.d.ts +36 -0
  187. package/dist/react/components/SunBurst.d.ts.map +1 -0
  188. package/dist/react/engine/Preview.d.ts.map +1 -1
  189. package/dist/react/index.d.ts +7 -0
  190. package/dist/react/index.d.ts.map +1 -1
  191. package/dist/react/index.js +8 -1
  192. package/dist/react/utils/generatePresetCode.d.ts.map +1 -1
  193. package/dist/react/utils/generatePresetCode.js +97 -0
  194. package/dist/registry.js +2160 -258
  195. package/dist/solid/components/BarShift.d.ts +32 -0
  196. package/dist/solid/components/BarShift.d.ts.map +1 -0
  197. package/dist/solid/components/BarShift.js +228 -0
  198. package/dist/solid/components/BrickPattern.d.ts +35 -0
  199. package/dist/solid/components/BrickPattern.d.ts.map +1 -0
  200. package/dist/solid/components/BrickPattern.js +228 -0
  201. package/dist/solid/components/Chevron.d.ts +34 -0
  202. package/dist/solid/components/Chevron.d.ts.map +1 -0
  203. package/dist/solid/components/Chevron.js +228 -0
  204. package/dist/solid/components/ColorWheel.d.ts +31 -0
  205. package/dist/solid/components/ColorWheel.d.ts.map +1 -0
  206. package/dist/solid/components/ColorWheel.js +228 -0
  207. package/dist/solid/components/FractalNoise.d.ts +33 -0
  208. package/dist/solid/components/FractalNoise.d.ts.map +1 -0
  209. package/dist/solid/components/FractalNoise.js +228 -0
  210. package/dist/solid/components/Marble.d.ts +32 -0
  211. package/dist/solid/components/Marble.d.ts.map +1 -0
  212. package/dist/solid/components/Marble.js +228 -0
  213. package/dist/solid/components/SunBurst.d.ts +33 -0
  214. package/dist/solid/components/SunBurst.d.ts.map +1 -0
  215. package/dist/solid/components/SunBurst.js +228 -0
  216. package/dist/solid/engine/Preview.d.ts.map +1 -1
  217. package/dist/solid/engine/Preview.js +196 -182
  218. package/dist/solid/engine/Shader.js +1 -1
  219. package/dist/solid/index.d.ts +7 -0
  220. package/dist/solid/index.d.ts.map +1 -1
  221. package/dist/solid/index.js +230 -216
  222. package/dist/solid/utils/generatePresetCode.d.ts.map +1 -1
  223. package/dist/solid/utils/generatePresetCode.js +97 -0
  224. package/dist/svelte/components/BarShift.svelte.d.ts +22 -0
  225. package/dist/svelte/components/BrickPattern.svelte.d.ts +25 -0
  226. package/dist/svelte/components/Chevron.svelte.d.ts +24 -0
  227. package/dist/svelte/components/ColorWheel.svelte.d.ts +21 -0
  228. package/dist/svelte/components/FractalNoise.svelte.d.ts +23 -0
  229. package/dist/svelte/components/Marble.svelte.d.ts +22 -0
  230. package/dist/svelte/components/SunBurst.svelte.d.ts +23 -0
  231. package/dist/svelte/index.d.ts +7 -0
  232. package/dist/svelte/index.js +2049 -649
  233. package/dist/svelte/source/components/BarShift.svelte +328 -0
  234. package/dist/svelte/source/components/BrickPattern.svelte +331 -0
  235. package/dist/svelte/source/components/Chevron.svelte +330 -0
  236. package/dist/svelte/source/components/ColorWheel.svelte +327 -0
  237. package/dist/svelte/source/components/FractalNoise.svelte +329 -0
  238. package/dist/svelte/source/components/Marble.svelte +328 -0
  239. package/dist/svelte/source/components/SunBurst.svelte +329 -0
  240. package/dist/svelte/source/engine/Preview.svelte +14 -0
  241. package/dist/svelte/source/index.js +7 -0
  242. package/dist/svelte/utils/generatePresetCode.js +97 -0
  243. package/dist/vue/BarShift.js +3 -0
  244. package/dist/vue/BarShift.vue_vue_type_script_setup_true_lang.js +218 -0
  245. package/dist/vue/BrickPattern.js +3 -0
  246. package/dist/vue/BrickPattern.vue_vue_type_script_setup_true_lang.js +223 -0
  247. package/dist/vue/Chevron.js +3 -0
  248. package/dist/vue/Chevron.vue_vue_type_script_setup_true_lang.js +221 -0
  249. package/dist/vue/ColorWheel.js +3 -0
  250. package/dist/vue/ColorWheel.vue_vue_type_script_setup_true_lang.js +220 -0
  251. package/dist/vue/FractalNoise.js +3 -0
  252. package/dist/vue/FractalNoise.vue_vue_type_script_setup_true_lang.js +221 -0
  253. package/dist/vue/Marble.js +3 -0
  254. package/dist/vue/Marble.vue_vue_type_script_setup_true_lang.js +220 -0
  255. package/dist/vue/Preview.vue_vue_type_script_setup_true_lang.js +14 -0
  256. package/dist/vue/Shader.vue_vue_type_script_setup_true_lang.js +1 -1
  257. package/dist/vue/SunBurst.js +3 -0
  258. package/dist/vue/SunBurst.vue_vue_type_script_setup_true_lang.js +220 -0
  259. package/dist/vue/components/BarShift.vue.d.ts +57 -0
  260. package/dist/vue/components/BarShift.vue.d.ts.map +1 -0
  261. package/dist/vue/components/BrickPattern.vue.d.ts +60 -0
  262. package/dist/vue/components/BrickPattern.vue.d.ts.map +1 -0
  263. package/dist/vue/components/Chevron.vue.d.ts +59 -0
  264. package/dist/vue/components/Chevron.vue.d.ts.map +1 -0
  265. package/dist/vue/components/ColorWheel.vue.d.ts +56 -0
  266. package/dist/vue/components/ColorWheel.vue.d.ts.map +1 -0
  267. package/dist/vue/components/FractalNoise.vue.d.ts +58 -0
  268. package/dist/vue/components/FractalNoise.vue.d.ts.map +1 -0
  269. package/dist/vue/components/Marble.vue.d.ts +57 -0
  270. package/dist/vue/components/Marble.vue.d.ts.map +1 -0
  271. package/dist/vue/components/SunBurst.vue.d.ts +58 -0
  272. package/dist/vue/components/SunBurst.vue.d.ts.map +1 -0
  273. package/dist/vue/index.d.ts +7 -0
  274. package/dist/vue/index.d.ts.map +1 -1
  275. package/dist/vue/index.js +8 -1
  276. package/dist/vue/utils/generatePresetCode.d.ts.map +1 -1
  277. package/dist/vue/utils/generatePresetCode.js +97 -0
  278. package/package.json +142 -1
  279. package/dist/core/shaderRegistry-Ceu0nAxP.js +0 -256
  280. /package/dist/core/{Beam-mvF5Ri7_.js → Beam-B3BX08lR.js} +0 -0
  281. /package/dist/core/{Blob-CLHx5s6k.js → Blob-B7IFHhVB.js} +0 -0
  282. /package/dist/core/{BrightnessContrast-CJTOpQCn.js → BrightnessContrast-GppIqtkO.js} +0 -0
  283. /package/dist/core/{Bulge-wflTcWfI.js → Bulge-DMOATSEs.js} +0 -0
  284. /package/dist/core/{CRTScreen-CTwXU-NX.js → CRTScreen-corekL_R.js} +0 -0
  285. /package/dist/core/{Checkerboard-Db7Rb57F.js → Checkerboard-BVBGTvd-.js} +0 -0
  286. /package/dist/core/{ChromaFlow-DbiVz3hF.js → ChromaFlow-C0guw_LP.js} +0 -0
  287. /package/dist/core/{ChromaticAberration-Bg_I4XF-.js → ChromaticAberration-vygkvgz-.js} +0 -0
  288. /package/dist/core/{Circle-Bfi2e0Vm.js → Circle-BycqVCMt.js} +0 -0
  289. /package/dist/core/{ConcentricSpin-bAFd5_WI.js → ConcentricSpin-CO3Kx1I1.js} +0 -0
  290. /package/dist/core/{ConicGradient-Bcw4_25S.js → ConicGradient-DRvVwiSj.js} +0 -0
  291. /package/dist/core/{ContourLines-CcQWPKLx.js → ContourLines-s4waN3uU.js} +0 -0
  292. /package/dist/core/{CursorRipples-CsYAXG2E.js → CursorRipples-CLP7Sinv.js} +0 -0
  293. /package/dist/core/{CursorTrail-CUtEP_-P.js → CursorTrail-CshoSM5Y.js} +0 -0
  294. /package/dist/core/{DOMTexture-D-RkeyMs.js → DOMTexture-Ec0k6AnK.js} +0 -0
  295. /package/dist/core/{DiamondGradient-3b93bdrv.js → DiamondGradient-D6eyjZOn.js} +0 -0
  296. /package/dist/core/{DiffuseBlur-61Vuq571.js → DiffuseBlur-BjvXHmJx.js} +0 -0
  297. /package/dist/core/{Dither-Cv0Uci60.js → Dither-z6s-TFg7.js} +0 -0
  298. /package/dist/core/{DotGrid-C88Sux6D.js → DotGrid-BxAAGO4F.js} +0 -0
  299. /package/dist/core/{DropShadow-EZyCC_97.js → DropShadow-CR3cecIQ.js} +0 -0
  300. /package/dist/core/{Duotone-D4ads1T9.js → Duotone-PwTfBBtM.js} +0 -0
  301. /package/dist/core/{FallingLines-CQBvwLqn.js → FallingLines-DqIZ8wTH.js} +0 -0
  302. /package/dist/core/{FilmGrain-DSJiMtEp.js → FilmGrain-Dbw02Jz9.js} +0 -0
  303. /package/dist/core/{FloatingParticles-BAvsQDhF.js → FloatingParticles-C4sLwGyT.js} +0 -0
  304. /package/dist/core/{FlowField-D2xJ0Xr4.js → FlowField-D3CAHBBG.js} +0 -0
  305. /package/dist/core/{FlowingGradient-DVDnNpGd.js → FlowingGradient-BRQ_K-k3.js} +0 -0
  306. /package/dist/core/{FlutedGlass-trmBFfQr.js → FlutedGlass-CyFWN_SM.js} +0 -0
  307. /package/dist/core/{Fog-DrsxPyih.js → Fog-CLGVVVeo.js} +0 -0
  308. /package/dist/core/{Form3D-D1TtCjk8.js → Form3D-8tPyUgh4.js} +0 -0
  309. /package/dist/core/{GlassTiles-CMx4NyO-.js → GlassTiles-CXJHjEBe.js} +0 -0
  310. /package/dist/core/{Glitch-BdygvJKe.js → Glitch-Bg9W-KNm.js} +0 -0
  311. /package/dist/core/{Godrays-Mvz7ha2E.js → Godrays-DHXKsw5B.js} +0 -0
  312. /package/dist/core/{Grayscale-ChaVI3AW.js → Grayscale-DgXoUcmg.js} +0 -0
  313. /package/dist/core/{Grid-CsD21Eqg.js → Grid-DwyhjFAT.js} +0 -0
  314. /package/dist/core/{GridDistortion-BcDqBh9i.js → GridDistortion-DJ8S-96Y.js} +0 -0
  315. /package/dist/core/{Group-BqVJ4S7i.js → Group-DmgNNlDd.js} +0 -0
  316. /package/dist/core/{Halftone-3ImN5uQi.js → Halftone-x9boWkFW.js} +0 -0
  317. /package/dist/core/{HexGrid-BWwIHYEg.js → HexGrid-BUsgyF8P.js} +0 -0
  318. /package/dist/core/{HueShift-C1RxETwN.js → HueShift-D3_5D7jx.js} +0 -0
  319. /package/dist/core/{ImageTexture-DXhgMEOT.js → ImageTexture-6ZzBt79u.js} +0 -0
  320. /package/dist/core/{Invert-D3tc2UGp.js → Invert-kXxY97QJ.js} +0 -0
  321. /package/dist/core/{Kaleidoscope-D1HmcoOv.js → Kaleidoscope-D4jRcZCt.js} +0 -0
  322. /package/dist/core/{LensFlare-Be-Z9whi.js → LensFlare-D7vypE2Q.js} +0 -0
  323. /package/dist/core/{LinearBlur-xrHtMmWp.js → LinearBlur-2hspd2YP.js} +0 -0
  324. /package/dist/core/{LinearGradient-BiIad_hA.js → LinearGradient-glCc9IaB.js} +0 -0
  325. /package/dist/core/{Liquify-DkTxZZFW.js → Liquify-uZjs0wcu.js} +0 -0
  326. /package/dist/core/{Mirror-BDTE51kP.js → Mirror-Dv5fOEp6.js} +0 -0
  327. /package/dist/core/{MultiPointGradient-Bd-EGOI8.js → MultiPointGradient-Dvt1GUiv.js} +0 -0
  328. /package/dist/core/{Paper-BmeUPAFe.js → Paper-DNP2-hPM.js} +0 -0
  329. /package/dist/core/{Perspective-CqweSeFv.js → Perspective-CAIchX9p.js} +0 -0
  330. /package/dist/core/{Pixelate-DqZcUKFK.js → Pixelate-BbT3Rrf2.js} +0 -0
  331. /package/dist/core/{Plasma-DqKLBDYd.js → Plasma-D9rhkH2y.js} +0 -0
  332. /package/dist/core/{PolarCoordinates-CKT4CLT7.js → PolarCoordinates-2RBCk-fo.js} +0 -0
  333. /package/dist/core/{Posterize-CxYemXTn.js → Posterize-DNxTRgvF.js} +0 -0
  334. /package/dist/core/{RadialGradient-Dj3-DdO7.js → RadialGradient-CQIctl__.js} +0 -0
  335. /package/dist/core/{RectangularCoordinates-DxeLJ2nt.js → RectangularCoordinates-F2VzXmal.js} +0 -0
  336. /package/dist/core/{Ripples-CXeVzwUd.js → Ripples-B4H0VoZb.js} +0 -0
  337. /package/dist/core/{Saturation-n-aXJS81.js → Saturation-6FlxHXSi.js} +0 -0
  338. /package/dist/core/{Sharpness-7tm7b-Bu.js → Sharpness-C4cJlBuh.js} +0 -0
  339. /package/dist/core/{Shatter-CDza7dSw.js → Shatter-CnkycTRD.js} +0 -0
  340. /package/dist/core/{SimplexNoise-HQTocBLm.js → SimplexNoise-BnRaoxON.js} +0 -0
  341. /package/dist/core/{SineWave-S6nK8ZHR.js → SineWave-CZ4Fanvr.js} +0 -0
  342. /package/dist/core/{Smoke-DjlArYQW.js → Smoke-CXPjGG-b.js} +0 -0
  343. /package/dist/core/{Solarize-gNMmd47z.js → Solarize-CynVlxjT.js} +0 -0
  344. /package/dist/core/{SolidColor-a8bCIksn.js → SolidColor-dCAOGC_P.js} +0 -0
  345. /package/dist/core/{Spherize-BHmD2ajL.js → Spherize-C77QGVWj.js} +0 -0
  346. /package/dist/core/{Spiral-Bjsi8BMH.js → Spiral-eN65wa6O.js} +0 -0
  347. /package/dist/core/{Strands-C9fEwaiR.js → Strands-DnWJDGiO.js} +0 -0
  348. /package/dist/core/{Stretch-Cvht8B0L.js → Stretch-B5XGF1bF.js} +0 -0
  349. /package/dist/core/{Stripes-ChVSAeCO.js → Stripes-CNXJpFyr.js} +0 -0
  350. /package/dist/core/{StudioBackground-B8hilROB.js → StudioBackground-DtiE2mCf.js} +0 -0
  351. /package/dist/core/{Swirl-DZTPLx-W.js → Swirl-BV6pN94G.js} +0 -0
  352. /package/dist/core/{Tint-P7KwJAU5.js → Tint-CJ8FQdzA.js} +0 -0
  353. /package/dist/core/{Tritone-_9VR2bhu.js → Tritone-D_QvxjGc.js} +0 -0
  354. /package/dist/core/{Truchet-CbL5nYMj.js → Truchet-BJeZS_JQ.js} +0 -0
  355. /package/dist/core/{Twirl-C_97m32v.js → Twirl-8ayqS0n8.js} +0 -0
  356. /package/dist/core/{VHS-DbNjgUEX.js → VHS-Gbec95K_.js} +0 -0
  357. /package/dist/core/{Vibrance-IDvmP1Xw.js → Vibrance-COKHmh8r.js} +0 -0
  358. /package/dist/core/{Vignette-DmYVHciL.js → Vignette-Y_2yono-.js} +0 -0
  359. /package/dist/core/{Voronoi-kngFpTNB.js → Voronoi-DQ_f6k5D.js} +0 -0
  360. /package/dist/core/{WaveDistortion-DM-f_XCw.js → WaveDistortion-R5FfwKQN.js} +0 -0
  361. /package/dist/core/{Weave-DO0m0Dsh.js → Weave-DJ4s3Gwc.js} +0 -0
  362. /package/dist/core/{WorleyNoise-Derik4n-.js → WorleyNoise-CWytDfGH.js} +0 -0
  363. /package/dist/core/{ZoomBlur-BdLC9MCq.js → ZoomBlur-DWFQVFMK.js} +0 -0
  364. /package/dist/core/{browser-CsOpQ0L_.js → browser-BamVDhaZ.js} +0 -0
  365. /package/dist/core/{computeBlur-DCRhuYEi.js → computeBlur-CprKe0xa.js} +0 -0
  366. /package/dist/core/{sdf-DyC2H_qS.js → sdf-D_EAGXhN.js} +0 -0
@@ -0,0 +1,328 @@
1
+ <script lang="ts">
2
+ import { getContext, setContext, onMount, onDestroy } from 'svelte';
3
+ import {
4
+ createUniformsMap,
5
+ type UniformsMap,
6
+ type BlendMode,
7
+ type NodeMetadata,
8
+ type PropConfig,
9
+ type MaskConfig,
10
+ type PropDriver,
11
+ type TransformConfig
12
+ } from '../../../core/index.js';
13
+ import {setColorSpaceMode} from '../../../core/utilities/transformations/index.js';
14
+
15
+ // @ts-ignore - this import is replaced at build time
16
+ import { componentDefinition, type ComponentProps } from '../../../core/shaders/BarShift/index.js';
17
+
18
+ // Warn once per page load if this is an experimental component
19
+ let _experimentalWarnedOnce = false;
20
+ if ((componentDefinition as any).experimental && !_experimentalWarnedOnce) {
21
+ _experimentalWarnedOnce = true;
22
+ const _e = (componentDefinition as any).experimental;
23
+ console.info(`%c⚠ [Shaders] ${componentDefinition.name} is experimental: ${_e.message}`, 'color: #f59e0b; font-weight: bold');
24
+ }
25
+
26
+ /**
27
+ * Define component props including blend mode, opacity, visibility, masking, and transformation
28
+ */
29
+ interface ExtendedComponentProps extends Partial<ComponentProps> {
30
+ count?: ComponentProps['count'] | PropDriver;
31
+ angle?: ComponentProps['angle'] | PropDriver;
32
+ intensity?: ComponentProps['intensity'] | PropDriver;
33
+ blendMode?: BlendMode;
34
+ opacity?: number;
35
+ visible?: boolean;
36
+ id?: string;
37
+ maskSource?: string;
38
+ maskType?: string;
39
+ renderOrder?: number;
40
+ transform?: Partial<TransformConfig>;
41
+ children?: import('svelte').Snippet;
42
+ }
43
+
44
+ function isPropDriver(value: unknown): value is PropDriver {
45
+ return typeof value === 'object' && value !== null && 'type' in value &&
46
+ ((value as any).type === 'map' || (value as any).type === 'mouse' || (value as any).type === 'mouse-position' || (value as any).type === 'auto-animate');
47
+ }
48
+
49
+ /**
50
+ * Default transform configuration (optimized for zero overhead)
51
+ */
52
+ const DEFAULT_TRANSFORM: TransformConfig = {
53
+ offsetX: 0,
54
+ offsetY: 0,
55
+ rotation: 0,
56
+ scale: 1,
57
+ anchorX: 0.5,
58
+ anchorY: 0.5,
59
+ edges: 'transparent'
60
+ };
61
+
62
+ // Define the component props and their default values from the shader definition
63
+ const componentDefaults = {
64
+ blendMode: 'normal' as BlendMode,
65
+ visible: true,
66
+ // opacity intentionally has no default - handled by renderer
67
+ // transform intentionally has no default - handled by effectiveTransform
68
+ ...Object.entries(componentDefinition.props).reduce(
69
+ (acc, [key, config]) => {
70
+ acc[key] = (config as unknown as PropConfig<typeof config>).default;
71
+ return acc;
72
+ },
73
+ {} as Record<string, any>
74
+ )
75
+ };
76
+
77
+ // Declare props using Svelte 5's syntax
78
+ const props: ExtendedComponentProps = $props();
79
+
80
+ // Apply defaults manually since Svelte 5 doesn't have withDefaults equivalent
81
+ // Use $derived so the metadata $effect re-runs when any of these change at runtime
82
+ const blendMode = $derived(props.blendMode ?? componentDefaults.blendMode);
83
+ const opacity = $derived(props.opacity); // No default - handled by renderer
84
+ const visible = $derived(props.visible ?? componentDefaults.visible); // Default to true
85
+ const id = $derived(props.id);
86
+ const maskSource = $derived(props.maskSource);
87
+ const maskType = $derived(props.maskType);
88
+ const renderOrder = $derived(props.renderOrder);
89
+ const { children } = props;
90
+
91
+ // Collect PropDriver values from shader props into the maps metadata structure
92
+ const mapsFromProps = $derived.by(() => {
93
+ const maps: Record<string, PropDriver> = {};
94
+ for (const key of Object.keys(componentDefinition.props)) {
95
+ const val = (props as any)[key];
96
+ if (isPropDriver(val)) maps[key] = val as PropDriver;
97
+ }
98
+ return Object.keys(maps).length > 0 ? maps : undefined;
99
+ });
100
+
101
+ /**
102
+ * Computed transform that merges user-provided values with defaults
103
+ */
104
+ const effectiveTransform = $derived({
105
+ ...DEFAULT_TRANSFORM,
106
+ ...props.transform
107
+ });
108
+
109
+ /**
110
+ * FIRST: Get the parent ID from context BEFORE setting our own context
111
+ */
112
+ const parentId = getContext<string>('shaderParentId');
113
+ if (parentId === undefined) {
114
+ throw new Error('Shader components must be used inside an <Shader> component or another shader component');
115
+ }
116
+
117
+ /**
118
+ * Use the provided ID or generate a unique identifier for this component instance
119
+ */
120
+ const instanceId = (id ? id.replace(/[^a-zA-Z0-9_]/g, '_') : null) || Math.random().toString(36).substring(2, 10);
121
+
122
+ /**
123
+ * THEN: Provide our unique identifier to child components
124
+ */
125
+ setContext('shaderParentId', instanceId);
126
+
127
+ /**
128
+ * Creates a non-reactive object containing only props that differ from defaults
129
+ * This optimization prevents unnecessary GPU uniform updates for unchanged values
130
+ * Special props like blendMode and opacity are handled separately
131
+ */
132
+ const shaderReadyProps = $derived.by(() => {
133
+ let baseProps = { ...componentDefaults };
134
+
135
+ // Only include props that differ from defaults (excluding special props and PropDrivers)
136
+ for (const key in props) {
137
+ if (key !== 'blendMode' && key !== 'opacity' && key !== 'visible' &&
138
+ key !== 'id' && key !== 'maskSource' && key !== 'maskType' && key !== 'renderOrder' &&
139
+ key !== 'transform' && key !== 'children') {
140
+ const propValue = (props as any)[key];
141
+ if (isPropDriver(propValue)) continue; // PropDrivers go to metadata.maps, not uniforms
142
+ const defaultValue = (componentDefaults as any)[key];
143
+ if (propValue !== undefined && propValue !== defaultValue) {
144
+ (baseProps as any)[key] = propValue;
145
+ }
146
+ }
147
+ }
148
+ return baseProps;
149
+ });
150
+
151
+ /**
152
+ * Get the color space from the root Shader component.
153
+ * Used to set the global color space mode before creating uniforms.
154
+ */
155
+ const shaderColorSpace = getContext<() => 'p3-linear' | 'srgb'>('shaderColorSpace');
156
+
157
+ /**
158
+ * Creates the GPU uniform values map using only the changed props
159
+ * Set the global color space mode before creating uniforms so colors are transformed correctly
160
+ * Note: Intentionally captures initial value - props are immutable after initialization
161
+ */
162
+ if (shaderColorSpace) {
163
+ setColorSpaceMode(shaderColorSpace());
164
+ }
165
+ // svelte-ignore state_referenced_locally
166
+ const uniforms: UniformsMap = createUniformsMap(componentDefinition, shaderReadyProps, instanceId);
167
+
168
+ /**
169
+ * Get the node registration function from parent context
170
+ */
171
+ const parentRegister = getContext<(id: string, fragmentNodeFunc: any, parentId: string | null, metadata: NodeMetadata | null, uniforms: UniformsMap | null, componentDefinition: any, domCanvas?: HTMLCanvasElement) => void>('shaderNodeRegister');
172
+ if (parentRegister === undefined) {
173
+ throw new Error('Shader components must be used inside an <Shader> component or another shader component');
174
+ }
175
+
176
+ /**
177
+ * Get the uniform update function from parent context
178
+ */
179
+ const parentUniformUpdate = getContext<(nodeId: string, uniformName: string, value: any) => void>('shaderUniformUpdate');
180
+ if (parentUniformUpdate === undefined) {
181
+ throw new Error('Shader components require shaderUniformUpdate from parent');
182
+ }
183
+
184
+ /**
185
+ * Get the metadata update function from parent context
186
+ */
187
+ const parentMetadataUpdate = getContext<(nodeId: string, metadata: NodeMetadata) => void>('shaderMetadataUpdate');
188
+ if (parentMetadataUpdate === undefined) {
189
+ throw new Error('Shader components require shaderMetadataUpdate from parent');
190
+ }
191
+
192
+ // capturesDOM — canvas layoutsubtree portal for DOMTexture-style shaders
193
+ const isCapturesDOM = !!(componentDefinition as any).capturesDOM;
194
+ let captureCanvas: HTMLCanvasElement | undefined;
195
+ let captureW = $state(typeof window !== 'undefined' ? Math.round(window.innerWidth * Math.min(window.devicePixelRatio, 2)) : 0);
196
+ let captureH = $state(typeof window !== 'undefined' ? Math.round(window.innerHeight * Math.min(window.devicePixelRatio, 2)) : 0);
197
+
198
+ function teleportToBody(node: HTMLElement) {
199
+ document.body.appendChild(node);
200
+ return { destroy() { node.remove(); } };
201
+ }
202
+
203
+ if (isCapturesDOM) {
204
+ const onWinResize = () => {
205
+ const d = Math.min(window.devicePixelRatio, 2);
206
+ captureW = Math.round(window.innerWidth * d);
207
+ captureH = Math.round(window.innerHeight * d);
208
+ };
209
+ onMount(() => { window.addEventListener('resize', onWinResize); });
210
+ onDestroy(() => { window.removeEventListener('resize', onWinResize); });
211
+ }
212
+
213
+ // DOM marker ref for determining render order from template position
214
+ let orderMarker: HTMLSpanElement;
215
+
216
+ // Stores the DOM-detected render order
217
+ let detectedRenderOrder: number | undefined = undefined;
218
+
219
+ // Flag to track when component is registered
220
+ let isRegistered = $state(false);
221
+
222
+ // Setup uniform watchers with registration guard
223
+ Object.entries(uniforms).forEach(([propName, { uniform, transform }]) => {
224
+ $effect(() => {
225
+ // Only run after component is registered
226
+ if (!isRegistered) return;
227
+
228
+ if (uniform && uniform.value !== undefined) {
229
+ const newValue = (props as any)[propName];
230
+ if (newValue !== undefined && !isPropDriver(newValue)) {
231
+ // Send raw value - renderer will handle transformation
232
+ // PropDriver values go to metadata.maps, not uniforms
233
+ parentUniformUpdate(instanceId, propName, newValue);
234
+ }
235
+ }
236
+ });
237
+ });
238
+
239
+ // Watch blend mode, opacity, visibility, masking, transformations, and prop maps changes
240
+ $effect(() => {
241
+ // Only run after component is registered
242
+ if (!isRegistered) return;
243
+
244
+ const metadata: NodeMetadata = {
245
+ blendMode,
246
+ opacity,
247
+ visible: visible === false ? false : true,
248
+ id,
249
+ mask: maskSource ? {
250
+ source: maskSource,
251
+ type: (maskType || 'alpha') as MaskConfig['type']
252
+ } : undefined,
253
+ maps: mapsFromProps,
254
+ renderOrder: renderOrder ?? detectedRenderOrder,
255
+ transform: effectiveTransform
256
+ };
257
+ parentMetadataUpdate(instanceId, metadata);
258
+ });
259
+
260
+ // Register this component after mount to ensure parent is ready
261
+ onMount(() => {
262
+ // Register this component with safety check
263
+ if (componentDefinition && typeof componentDefinition.fragmentNode === 'function') {
264
+ parentRegister(
265
+ instanceId,
266
+ componentDefinition.fragmentNode,
267
+ parentId,
268
+ {
269
+ blendMode,
270
+ opacity,
271
+ visible: visible !== false ? true : false,
272
+ id,
273
+ mask: maskSource ? {
274
+ source: maskSource,
275
+ type: (maskType || 'alpha') as MaskConfig['type']
276
+ } as MaskConfig : undefined,
277
+ maps: mapsFromProps,
278
+ renderOrder: renderOrder ?? detectedRenderOrder,
279
+ transform: effectiveTransform
280
+ },
281
+ uniforms,
282
+ componentDefinition,
283
+ isCapturesDOM ? captureCanvas : undefined
284
+ );
285
+
286
+ // Set flag to enable effects after successful registration
287
+ isRegistered = true;
288
+
289
+ // Detect DOM position for correct render ordering
290
+ if (renderOrder === undefined && orderMarker) {
291
+ const parent = orderMarker.parentElement;
292
+ if (parent) {
293
+ const siblings = parent.querySelectorAll(':scope > [data-shader-id]');
294
+ const position = Array.from(siblings).indexOf(orderMarker);
295
+ if (position >= 0) {
296
+ detectedRenderOrder = position;
297
+ parentMetadataUpdate(instanceId, { renderOrder: position } as NodeMetadata);
298
+ }
299
+ }
300
+ }
301
+ } else {
302
+ console.error('componentDefinition.fragmentNode is not a function:', {
303
+ componentDefinition,
304
+ fragmentNode: componentDefinition?.fragmentNode,
305
+ type: typeof componentDefinition?.fragmentNode
306
+ });
307
+ }
308
+ });
309
+
310
+ // Clean up node from registry when component is unmounted
311
+ onDestroy(() => {
312
+ isRegistered = false;
313
+ parentRegister(instanceId, null, null, null, null);
314
+ });
315
+ </script>
316
+
317
+ <span bind:this={orderMarker} style="display:contents" data-shader-id={instanceId}>
318
+ {#if !isCapturesDOM}
319
+ {@render children?.()}
320
+ {/if}
321
+ </span>
322
+ {#if isCapturesDOM}
323
+ <canvas use:teleportToBody bind:this={captureCanvas} layoutsubtree
324
+ width={captureW} height={captureH}
325
+ style="position:fixed;inset:0;width:100vw;height:100vh;z-index:-9999">
326
+ {@render children?.()}
327
+ </canvas>
328
+ {/if}
@@ -0,0 +1,331 @@
1
+ <script lang="ts">
2
+ import { getContext, setContext, onMount, onDestroy } from 'svelte';
3
+ import {
4
+ createUniformsMap,
5
+ type UniformsMap,
6
+ type BlendMode,
7
+ type NodeMetadata,
8
+ type PropConfig,
9
+ type MaskConfig,
10
+ type PropDriver,
11
+ type TransformConfig
12
+ } from '../../../core/index.js';
13
+ import {setColorSpaceMode} from '../../../core/utilities/transformations/index.js';
14
+
15
+ // @ts-ignore - this import is replaced at build time
16
+ import { componentDefinition, type ComponentProps } from '../../../core/shaders/BrickPattern/index.js';
17
+
18
+ // Warn once per page load if this is an experimental component
19
+ let _experimentalWarnedOnce = false;
20
+ if ((componentDefinition as any).experimental && !_experimentalWarnedOnce) {
21
+ _experimentalWarnedOnce = true;
22
+ const _e = (componentDefinition as any).experimental;
23
+ console.info(`%c⚠ [Shaders] ${componentDefinition.name} is experimental: ${_e.message}`, 'color: #f59e0b; font-weight: bold');
24
+ }
25
+
26
+ /**
27
+ * Define component props including blend mode, opacity, visibility, masking, and transformation
28
+ */
29
+ interface ExtendedComponentProps extends Partial<ComponentProps> {
30
+ cellsX?: ComponentProps['cellsX'] | PropDriver;
31
+ cellsY?: ComponentProps['cellsY'] | PropDriver;
32
+ mortar?: ComponentProps['mortar'] | PropDriver;
33
+ angle?: ComponentProps['angle'] | PropDriver;
34
+ offset?: ComponentProps['offset'] | PropDriver;
35
+ speedVariance?: ComponentProps['speedVariance'] | PropDriver;
36
+ blendMode?: BlendMode;
37
+ opacity?: number;
38
+ visible?: boolean;
39
+ id?: string;
40
+ maskSource?: string;
41
+ maskType?: string;
42
+ renderOrder?: number;
43
+ transform?: Partial<TransformConfig>;
44
+ children?: import('svelte').Snippet;
45
+ }
46
+
47
+ function isPropDriver(value: unknown): value is PropDriver {
48
+ return typeof value === 'object' && value !== null && 'type' in value &&
49
+ ((value as any).type === 'map' || (value as any).type === 'mouse' || (value as any).type === 'mouse-position' || (value as any).type === 'auto-animate');
50
+ }
51
+
52
+ /**
53
+ * Default transform configuration (optimized for zero overhead)
54
+ */
55
+ const DEFAULT_TRANSFORM: TransformConfig = {
56
+ offsetX: 0,
57
+ offsetY: 0,
58
+ rotation: 0,
59
+ scale: 1,
60
+ anchorX: 0.5,
61
+ anchorY: 0.5,
62
+ edges: 'transparent'
63
+ };
64
+
65
+ // Define the component props and their default values from the shader definition
66
+ const componentDefaults = {
67
+ blendMode: 'normal' as BlendMode,
68
+ visible: true,
69
+ // opacity intentionally has no default - handled by renderer
70
+ // transform intentionally has no default - handled by effectiveTransform
71
+ ...Object.entries(componentDefinition.props).reduce(
72
+ (acc, [key, config]) => {
73
+ acc[key] = (config as unknown as PropConfig<typeof config>).default;
74
+ return acc;
75
+ },
76
+ {} as Record<string, any>
77
+ )
78
+ };
79
+
80
+ // Declare props using Svelte 5's syntax
81
+ const props: ExtendedComponentProps = $props();
82
+
83
+ // Apply defaults manually since Svelte 5 doesn't have withDefaults equivalent
84
+ // Use $derived so the metadata $effect re-runs when any of these change at runtime
85
+ const blendMode = $derived(props.blendMode ?? componentDefaults.blendMode);
86
+ const opacity = $derived(props.opacity); // No default - handled by renderer
87
+ const visible = $derived(props.visible ?? componentDefaults.visible); // Default to true
88
+ const id = $derived(props.id);
89
+ const maskSource = $derived(props.maskSource);
90
+ const maskType = $derived(props.maskType);
91
+ const renderOrder = $derived(props.renderOrder);
92
+ const { children } = props;
93
+
94
+ // Collect PropDriver values from shader props into the maps metadata structure
95
+ const mapsFromProps = $derived.by(() => {
96
+ const maps: Record<string, PropDriver> = {};
97
+ for (const key of Object.keys(componentDefinition.props)) {
98
+ const val = (props as any)[key];
99
+ if (isPropDriver(val)) maps[key] = val as PropDriver;
100
+ }
101
+ return Object.keys(maps).length > 0 ? maps : undefined;
102
+ });
103
+
104
+ /**
105
+ * Computed transform that merges user-provided values with defaults
106
+ */
107
+ const effectiveTransform = $derived({
108
+ ...DEFAULT_TRANSFORM,
109
+ ...props.transform
110
+ });
111
+
112
+ /**
113
+ * FIRST: Get the parent ID from context BEFORE setting our own context
114
+ */
115
+ const parentId = getContext<string>('shaderParentId');
116
+ if (parentId === undefined) {
117
+ throw new Error('Shader components must be used inside an <Shader> component or another shader component');
118
+ }
119
+
120
+ /**
121
+ * Use the provided ID or generate a unique identifier for this component instance
122
+ */
123
+ const instanceId = (id ? id.replace(/[^a-zA-Z0-9_]/g, '_') : null) || Math.random().toString(36).substring(2, 10);
124
+
125
+ /**
126
+ * THEN: Provide our unique identifier to child components
127
+ */
128
+ setContext('shaderParentId', instanceId);
129
+
130
+ /**
131
+ * Creates a non-reactive object containing only props that differ from defaults
132
+ * This optimization prevents unnecessary GPU uniform updates for unchanged values
133
+ * Special props like blendMode and opacity are handled separately
134
+ */
135
+ const shaderReadyProps = $derived.by(() => {
136
+ let baseProps = { ...componentDefaults };
137
+
138
+ // Only include props that differ from defaults (excluding special props and PropDrivers)
139
+ for (const key in props) {
140
+ if (key !== 'blendMode' && key !== 'opacity' && key !== 'visible' &&
141
+ key !== 'id' && key !== 'maskSource' && key !== 'maskType' && key !== 'renderOrder' &&
142
+ key !== 'transform' && key !== 'children') {
143
+ const propValue = (props as any)[key];
144
+ if (isPropDriver(propValue)) continue; // PropDrivers go to metadata.maps, not uniforms
145
+ const defaultValue = (componentDefaults as any)[key];
146
+ if (propValue !== undefined && propValue !== defaultValue) {
147
+ (baseProps as any)[key] = propValue;
148
+ }
149
+ }
150
+ }
151
+ return baseProps;
152
+ });
153
+
154
+ /**
155
+ * Get the color space from the root Shader component.
156
+ * Used to set the global color space mode before creating uniforms.
157
+ */
158
+ const shaderColorSpace = getContext<() => 'p3-linear' | 'srgb'>('shaderColorSpace');
159
+
160
+ /**
161
+ * Creates the GPU uniform values map using only the changed props
162
+ * Set the global color space mode before creating uniforms so colors are transformed correctly
163
+ * Note: Intentionally captures initial value - props are immutable after initialization
164
+ */
165
+ if (shaderColorSpace) {
166
+ setColorSpaceMode(shaderColorSpace());
167
+ }
168
+ // svelte-ignore state_referenced_locally
169
+ const uniforms: UniformsMap = createUniformsMap(componentDefinition, shaderReadyProps, instanceId);
170
+
171
+ /**
172
+ * Get the node registration function from parent context
173
+ */
174
+ const parentRegister = getContext<(id: string, fragmentNodeFunc: any, parentId: string | null, metadata: NodeMetadata | null, uniforms: UniformsMap | null, componentDefinition: any, domCanvas?: HTMLCanvasElement) => void>('shaderNodeRegister');
175
+ if (parentRegister === undefined) {
176
+ throw new Error('Shader components must be used inside an <Shader> component or another shader component');
177
+ }
178
+
179
+ /**
180
+ * Get the uniform update function from parent context
181
+ */
182
+ const parentUniformUpdate = getContext<(nodeId: string, uniformName: string, value: any) => void>('shaderUniformUpdate');
183
+ if (parentUniformUpdate === undefined) {
184
+ throw new Error('Shader components require shaderUniformUpdate from parent');
185
+ }
186
+
187
+ /**
188
+ * Get the metadata update function from parent context
189
+ */
190
+ const parentMetadataUpdate = getContext<(nodeId: string, metadata: NodeMetadata) => void>('shaderMetadataUpdate');
191
+ if (parentMetadataUpdate === undefined) {
192
+ throw new Error('Shader components require shaderMetadataUpdate from parent');
193
+ }
194
+
195
+ // capturesDOM — canvas layoutsubtree portal for DOMTexture-style shaders
196
+ const isCapturesDOM = !!(componentDefinition as any).capturesDOM;
197
+ let captureCanvas: HTMLCanvasElement | undefined;
198
+ let captureW = $state(typeof window !== 'undefined' ? Math.round(window.innerWidth * Math.min(window.devicePixelRatio, 2)) : 0);
199
+ let captureH = $state(typeof window !== 'undefined' ? Math.round(window.innerHeight * Math.min(window.devicePixelRatio, 2)) : 0);
200
+
201
+ function teleportToBody(node: HTMLElement) {
202
+ document.body.appendChild(node);
203
+ return { destroy() { node.remove(); } };
204
+ }
205
+
206
+ if (isCapturesDOM) {
207
+ const onWinResize = () => {
208
+ const d = Math.min(window.devicePixelRatio, 2);
209
+ captureW = Math.round(window.innerWidth * d);
210
+ captureH = Math.round(window.innerHeight * d);
211
+ };
212
+ onMount(() => { window.addEventListener('resize', onWinResize); });
213
+ onDestroy(() => { window.removeEventListener('resize', onWinResize); });
214
+ }
215
+
216
+ // DOM marker ref for determining render order from template position
217
+ let orderMarker: HTMLSpanElement;
218
+
219
+ // Stores the DOM-detected render order
220
+ let detectedRenderOrder: number | undefined = undefined;
221
+
222
+ // Flag to track when component is registered
223
+ let isRegistered = $state(false);
224
+
225
+ // Setup uniform watchers with registration guard
226
+ Object.entries(uniforms).forEach(([propName, { uniform, transform }]) => {
227
+ $effect(() => {
228
+ // Only run after component is registered
229
+ if (!isRegistered) return;
230
+
231
+ if (uniform && uniform.value !== undefined) {
232
+ const newValue = (props as any)[propName];
233
+ if (newValue !== undefined && !isPropDriver(newValue)) {
234
+ // Send raw value - renderer will handle transformation
235
+ // PropDriver values go to metadata.maps, not uniforms
236
+ parentUniformUpdate(instanceId, propName, newValue);
237
+ }
238
+ }
239
+ });
240
+ });
241
+
242
+ // Watch blend mode, opacity, visibility, masking, transformations, and prop maps changes
243
+ $effect(() => {
244
+ // Only run after component is registered
245
+ if (!isRegistered) return;
246
+
247
+ const metadata: NodeMetadata = {
248
+ blendMode,
249
+ opacity,
250
+ visible: visible === false ? false : true,
251
+ id,
252
+ mask: maskSource ? {
253
+ source: maskSource,
254
+ type: (maskType || 'alpha') as MaskConfig['type']
255
+ } : undefined,
256
+ maps: mapsFromProps,
257
+ renderOrder: renderOrder ?? detectedRenderOrder,
258
+ transform: effectiveTransform
259
+ };
260
+ parentMetadataUpdate(instanceId, metadata);
261
+ });
262
+
263
+ // Register this component after mount to ensure parent is ready
264
+ onMount(() => {
265
+ // Register this component with safety check
266
+ if (componentDefinition && typeof componentDefinition.fragmentNode === 'function') {
267
+ parentRegister(
268
+ instanceId,
269
+ componentDefinition.fragmentNode,
270
+ parentId,
271
+ {
272
+ blendMode,
273
+ opacity,
274
+ visible: visible !== false ? true : false,
275
+ id,
276
+ mask: maskSource ? {
277
+ source: maskSource,
278
+ type: (maskType || 'alpha') as MaskConfig['type']
279
+ } as MaskConfig : undefined,
280
+ maps: mapsFromProps,
281
+ renderOrder: renderOrder ?? detectedRenderOrder,
282
+ transform: effectiveTransform
283
+ },
284
+ uniforms,
285
+ componentDefinition,
286
+ isCapturesDOM ? captureCanvas : undefined
287
+ );
288
+
289
+ // Set flag to enable effects after successful registration
290
+ isRegistered = true;
291
+
292
+ // Detect DOM position for correct render ordering
293
+ if (renderOrder === undefined && orderMarker) {
294
+ const parent = orderMarker.parentElement;
295
+ if (parent) {
296
+ const siblings = parent.querySelectorAll(':scope > [data-shader-id]');
297
+ const position = Array.from(siblings).indexOf(orderMarker);
298
+ if (position >= 0) {
299
+ detectedRenderOrder = position;
300
+ parentMetadataUpdate(instanceId, { renderOrder: position } as NodeMetadata);
301
+ }
302
+ }
303
+ }
304
+ } else {
305
+ console.error('componentDefinition.fragmentNode is not a function:', {
306
+ componentDefinition,
307
+ fragmentNode: componentDefinition?.fragmentNode,
308
+ type: typeof componentDefinition?.fragmentNode
309
+ });
310
+ }
311
+ });
312
+
313
+ // Clean up node from registry when component is unmounted
314
+ onDestroy(() => {
315
+ isRegistered = false;
316
+ parentRegister(instanceId, null, null, null, null);
317
+ });
318
+ </script>
319
+
320
+ <span bind:this={orderMarker} style="display:contents" data-shader-id={instanceId}>
321
+ {#if !isCapturesDOM}
322
+ {@render children?.()}
323
+ {/if}
324
+ </span>
325
+ {#if isCapturesDOM}
326
+ <canvas use:teleportToBody bind:this={captureCanvas} layoutsubtree
327
+ width={captureW} height={captureH}
328
+ style="position:fixed;inset:0;width:100vw;height:100vh;z-index:-9999">
329
+ {@render children?.()}
330
+ </canvas>
331
+ {/if}