shaders 2.5.127 → 2.5.129

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 (248) hide show
  1. package/dist/core/{Blur-5_t3tR_g.js → Blur-LkvIPGj0.js} +1 -1
  2. package/dist/core/{ChannelBlur-DWgS3nhn.js → ChannelBlur-WTXL0B7t.js} +1 -1
  3. package/dist/core/Exposure-CFn2J_t3.js +29 -0
  4. package/dist/core/{Glass-CXT1jdLw.js → Glass-Cy1wvfuu.js} +1 -1
  5. package/dist/core/{Glow-5PP4-rM9.js → Glow-CJ7MTzc4.js} +6 -4
  6. package/dist/core/{ProgressiveBlur-BJwJ5mE0.js → ProgressiveBlur-jvN5Adf4.js} +1 -1
  7. package/dist/core/{ReflectivePlane-UIT4xlmn.js → ReflectivePlane-CGXUsPVJ.js} +1 -1
  8. package/dist/core/ThinFilm-CUsi8eSg.js +305 -0
  9. package/dist/core/{TiltShift-DtQ3dRL-.js → TiltShift-e-1ia_HN.js} +1 -1
  10. package/dist/core/{VideoTexture-ClutlOqj.js → VideoTexture-FmV1l91c.js} +1 -1
  11. package/dist/core/{WebcamTexture-D4e06ajM.js → WebcamTexture-DlS4MCDm.js} +1 -1
  12. package/dist/core/blendModes/linearDodge.d.ts.map +1 -1
  13. package/dist/core/{computeBlur-CprKe0xa.js → computeBlur-DNlXBk7b.js} +7 -3
  14. package/dist/core/effects/thinFilm.d.ts +81 -0
  15. package/dist/core/effects/thinFilm.d.ts.map +1 -0
  16. package/dist/core/index.js +91 -107
  17. package/dist/core/registry.js +89 -87
  18. package/dist/core/renderer.d.ts.map +1 -1
  19. package/dist/core/shaderRegistry-RdJlP7Pq.js +276 -0
  20. package/dist/core/shaderRegistry.d.ts.map +1 -1
  21. package/dist/core/shaders/Blur/index.js +2 -2
  22. package/dist/core/shaders/ChannelBlur/index.js +2 -2
  23. package/dist/core/shaders/Exposure/index.d.ts +13 -0
  24. package/dist/core/shaders/Exposure/index.d.ts.map +1 -0
  25. package/dist/core/shaders/Exposure/index.js +2 -0
  26. package/dist/core/shaders/FallingLines/index.js +1 -1
  27. package/dist/core/shaders/FilmGrain/index.js +1 -1
  28. package/dist/core/shaders/FloatingParticles/index.js +1 -1
  29. package/dist/core/shaders/FlowField/index.js +1 -1
  30. package/dist/core/shaders/Flower/index.js +1 -1
  31. package/dist/core/shaders/FlowingGradient/index.js +1 -1
  32. package/dist/core/shaders/FlutedGlass/index.js +1 -1
  33. package/dist/core/shaders/Fog/index.js +1 -1
  34. package/dist/core/shaders/Form3D/index.js +1 -1
  35. package/dist/core/shaders/FractalNoise/index.js +1 -1
  36. package/dist/core/shaders/Glass/index.js +2 -2
  37. package/dist/core/shaders/GlassTiles/index.js +1 -1
  38. package/dist/core/shaders/Glitch/index.js +1 -1
  39. package/dist/core/shaders/Glow/index.d.ts.map +1 -1
  40. package/dist/core/shaders/Glow/index.js +2 -2
  41. package/dist/core/shaders/Godrays/index.js +1 -1
  42. package/dist/core/shaders/Grayscale/index.js +1 -1
  43. package/dist/core/shaders/Grid/index.js +1 -1
  44. package/dist/core/shaders/GridDistortion/index.js +1 -1
  45. package/dist/core/shaders/Group/index.js +1 -1
  46. package/dist/core/shaders/Halftone/index.js +1 -1
  47. package/dist/core/shaders/HexGrid/index.js +1 -1
  48. package/dist/core/shaders/HueShift/index.js +1 -1
  49. package/dist/core/shaders/ImageTexture/index.js +1 -1
  50. package/dist/core/shaders/Invert/index.js +1 -1
  51. package/dist/core/shaders/Kaleidoscope/index.js +1 -1
  52. package/dist/core/shaders/LensFlare/index.js +1 -1
  53. package/dist/core/shaders/LinearBlur/index.js +1 -1
  54. package/dist/core/shaders/LinearGradient/index.js +1 -1
  55. package/dist/core/shaders/Liquify/index.js +1 -1
  56. package/dist/core/shaders/Marble/index.js +1 -1
  57. package/dist/core/shaders/Mirror/index.js +1 -1
  58. package/dist/core/shaders/MultiPointGradient/index.js +1 -1
  59. package/dist/core/shaders/Neon/index.js +1 -1
  60. package/dist/core/shaders/Paper/index.js +1 -1
  61. package/dist/core/shaders/Perspective/index.js +1 -1
  62. package/dist/core/shaders/Pixelate/index.js +1 -1
  63. package/dist/core/shaders/Plasma/index.js +1 -1
  64. package/dist/core/shaders/PolarCoordinates/index.js +1 -1
  65. package/dist/core/shaders/Polygon/index.js +1 -1
  66. package/dist/core/shaders/Posterize/index.js +1 -1
  67. package/dist/core/shaders/ProgressiveBlur/index.js +2 -2
  68. package/dist/core/shaders/RadialGradient/index.js +1 -1
  69. package/dist/core/shaders/RectangularCoordinates/index.js +1 -1
  70. package/dist/core/shaders/ReflectivePlane/index.js +2 -2
  71. package/dist/core/shaders/Ring/index.js +1 -1
  72. package/dist/core/shaders/Ripples/index.js +1 -1
  73. package/dist/core/shaders/RoundedRect/index.js +1 -1
  74. package/dist/core/shaders/Saturation/index.js +1 -1
  75. package/dist/core/shaders/Sharpness/index.js +1 -1
  76. package/dist/core/shaders/Shatter/index.js +1 -1
  77. package/dist/core/shaders/SimplexNoise/index.js +1 -1
  78. package/dist/core/shaders/SineWave/index.js +1 -1
  79. package/dist/core/shaders/Smoke/index.js +1 -1
  80. package/dist/core/shaders/SmokeFill/index.js +1 -1
  81. package/dist/core/shaders/Solarize/index.js +1 -1
  82. package/dist/core/shaders/SolidColor/index.js +1 -1
  83. package/dist/core/shaders/Spherize/index.js +1 -1
  84. package/dist/core/shaders/Spiral/index.js +1 -1
  85. package/dist/core/shaders/Star/index.js +1 -1
  86. package/dist/core/shaders/Strands/index.js +1 -1
  87. package/dist/core/shaders/Stretch/index.js +1 -1
  88. package/dist/core/shaders/Stripes/index.js +1 -1
  89. package/dist/core/shaders/StudioBackground/index.js +1 -1
  90. package/dist/core/shaders/SunBurst/index.js +1 -1
  91. package/dist/core/shaders/Swirl/index.js +1 -1
  92. package/dist/core/shaders/ThinFilm/index.d.ts +130 -0
  93. package/dist/core/shaders/ThinFilm/index.d.ts.map +1 -0
  94. package/dist/core/shaders/ThinFilm/index.js +6 -0
  95. package/dist/core/shaders/TiltShift/index.js +2 -2
  96. package/dist/core/shaders/Tint/index.js +1 -1
  97. package/dist/core/shaders/Trapezoid/index.js +1 -1
  98. package/dist/core/shaders/Tritone/index.js +1 -1
  99. package/dist/core/shaders/Truchet/index.js +1 -1
  100. package/dist/core/shaders/Twirl/index.js +1 -1
  101. package/dist/core/shaders/VHS/index.js +1 -1
  102. package/dist/core/shaders/Vesica/index.js +1 -1
  103. package/dist/core/shaders/Vibrance/index.js +1 -1
  104. package/dist/core/shaders/VideoTexture/index.js +2 -2
  105. package/dist/core/shaders/Vignette/index.js +1 -1
  106. package/dist/core/shaders/Voronoi/index.js +1 -1
  107. package/dist/core/shaders/WaveDistortion/index.js +1 -1
  108. package/dist/core/shaders/Weave/index.js +1 -1
  109. package/dist/core/shaders/WebcamTexture/index.js +2 -2
  110. package/dist/core/shaders/WorleyNoise/index.js +1 -1
  111. package/dist/core/shaders/ZoomBlur/index.js +1 -1
  112. package/dist/core/utilities/computeBlur.d.ts.map +1 -1
  113. package/dist/js/bundle.js +216 -216
  114. package/dist/js/createShader.js +1 -1
  115. package/dist/js/utils/generatePresetCode.d.ts.map +1 -1
  116. package/dist/js/utils/generatePresetCode.js +31 -0
  117. package/dist/react/Exposure.js +217 -0
  118. package/dist/react/Preview.js +2 -0
  119. package/dist/react/Shader.js +1 -1
  120. package/dist/react/ThinFilm.js +217 -0
  121. package/dist/react/bundle.js +218 -218
  122. package/dist/react/components/Exposure.d.ts +33 -0
  123. package/dist/react/components/Exposure.d.ts.map +1 -0
  124. package/dist/react/components/ThinFilm.d.ts +41 -0
  125. package/dist/react/components/ThinFilm.d.ts.map +1 -0
  126. package/dist/react/engine/Preview.d.ts.map +1 -1
  127. package/dist/react/index.d.ts +2 -0
  128. package/dist/react/index.d.ts.map +1 -1
  129. package/dist/react/index.js +3 -1
  130. package/dist/react/utils/generatePresetCode.d.ts.map +1 -1
  131. package/dist/react/utils/generatePresetCode.js +31 -0
  132. package/dist/registry.js +590 -0
  133. package/dist/solid/components/Exposure.d.ts +30 -0
  134. package/dist/solid/components/Exposure.d.ts.map +1 -0
  135. package/dist/solid/components/Exposure.js +228 -0
  136. package/dist/solid/components/ThinFilm.d.ts +38 -0
  137. package/dist/solid/components/ThinFilm.d.ts.map +1 -0
  138. package/dist/solid/components/ThinFilm.js +228 -0
  139. package/dist/solid/engine/Preview.d.ts.map +1 -1
  140. package/dist/solid/engine/Preview.js +204 -200
  141. package/dist/solid/engine/Shader.js +1 -1
  142. package/dist/solid/index.d.ts +2 -0
  143. package/dist/solid/index.d.ts.map +1 -1
  144. package/dist/solid/index.js +172 -168
  145. package/dist/solid/utils/generatePresetCode.d.ts.map +1 -1
  146. package/dist/solid/utils/generatePresetCode.js +31 -0
  147. package/dist/svelte/components/Exposure.svelte.d.ts +20 -0
  148. package/dist/svelte/components/ThinFilm.svelte.d.ts +28 -0
  149. package/dist/svelte/index.d.ts +2 -0
  150. package/dist/svelte/index.js +1033 -633
  151. package/dist/svelte/source/components/Exposure.svelte +326 -0
  152. package/dist/svelte/source/components/ThinFilm.svelte +334 -0
  153. package/dist/svelte/source/engine/Preview.svelte +4 -0
  154. package/dist/svelte/source/index.js +2 -0
  155. package/dist/svelte/utils/generatePresetCode.js +31 -0
  156. package/dist/vue/Exposure.js +3 -0
  157. package/dist/vue/Exposure.vue_vue_type_script_setup_true_lang.js +213 -0
  158. package/dist/vue/Preview.vue_vue_type_script_setup_true_lang.js +4 -0
  159. package/dist/vue/Shader.vue_vue_type_script_setup_true_lang.js +1 -1
  160. package/dist/vue/ThinFilm.js +3 -0
  161. package/dist/vue/ThinFilm.vue_vue_type_script_setup_true_lang.js +231 -0
  162. package/dist/vue/components/Exposure.vue.d.ts +55 -0
  163. package/dist/vue/components/Exposure.vue.d.ts.map +1 -0
  164. package/dist/vue/components/ThinFilm.vue.d.ts +63 -0
  165. package/dist/vue/components/ThinFilm.vue.d.ts.map +1 -0
  166. package/dist/vue/index.d.ts +2 -0
  167. package/dist/vue/index.d.ts.map +1 -1
  168. package/dist/vue/index.js +3 -1
  169. package/dist/vue/utils/generatePresetCode.d.ts.map +1 -1
  170. package/dist/vue/utils/generatePresetCode.js +31 -0
  171. package/package.json +17 -1
  172. package/dist/core/shaderRegistry-Brvv9sO8.js +0 -272
  173. /package/dist/core/{FallingLines-DqIZ8wTH.js → FallingLines-9elMmSlj.js} +0 -0
  174. /package/dist/core/{FilmGrain-DdV7_b8g.js → FilmGrain-DIydVgOW.js} +0 -0
  175. /package/dist/core/{FloatingParticles-LMsFTJKp.js → FloatingParticles-B068TLIi.js} +0 -0
  176. /package/dist/core/{FlowField-D3CAHBBG.js → FlowField-CeZjhyEo.js} +0 -0
  177. /package/dist/core/{Flower-BbRNrXIa.js → Flower-DSr0JWa2.js} +0 -0
  178. /package/dist/core/{FlowingGradient-BRQ_K-k3.js → FlowingGradient-Bd8KBK5P.js} +0 -0
  179. /package/dist/core/{FlutedGlass-CyFWN_SM.js → FlutedGlass-BJtMfV2c.js} +0 -0
  180. /package/dist/core/{Fog-CLGVVVeo.js → Fog-BQuVDReH.js} +0 -0
  181. /package/dist/core/{Form3D-8tPyUgh4.js → Form3D-DOek31CJ.js} +0 -0
  182. /package/dist/core/{FractalNoise-Ccufnbw6.js → FractalNoise-Dyhbvx9a.js} +0 -0
  183. /package/dist/core/{GlassTiles-CXJHjEBe.js → GlassTiles-Bb3cuOkr.js} +0 -0
  184. /package/dist/core/{Glitch-Bg9W-KNm.js → Glitch-zqdbCc2E.js} +0 -0
  185. /package/dist/core/{Godrays-DHXKsw5B.js → Godrays-DdSLZtBs.js} +0 -0
  186. /package/dist/core/{Grayscale-DgXoUcmg.js → Grayscale-BC40hfXH.js} +0 -0
  187. /package/dist/core/{Grid-DwyhjFAT.js → Grid-Lc4S0Hmp.js} +0 -0
  188. /package/dist/core/{GridDistortion-DJ8S-96Y.js → GridDistortion-DQcPYbXS.js} +0 -0
  189. /package/dist/core/{Group-DmgNNlDd.js → Group-BeZhHbOT.js} +0 -0
  190. /package/dist/core/{Halftone-x9boWkFW.js → Halftone-CsblgxnY.js} +0 -0
  191. /package/dist/core/{HexGrid-BUsgyF8P.js → HexGrid-DWRNPMET.js} +0 -0
  192. /package/dist/core/{HueShift-D3_5D7jx.js → HueShift-C-p9W5sr.js} +0 -0
  193. /package/dist/core/{ImageTexture-6ZzBt79u.js → ImageTexture-bqgQxAt9.js} +0 -0
  194. /package/dist/core/{Invert-kXxY97QJ.js → Invert-D-RVP34v.js} +0 -0
  195. /package/dist/core/{Kaleidoscope-D4jRcZCt.js → Kaleidoscope-HQNQrRP_.js} +0 -0
  196. /package/dist/core/{LensFlare-D7vypE2Q.js → LensFlare-DtES749p.js} +0 -0
  197. /package/dist/core/{LinearBlur-2hspd2YP.js → LinearBlur-6mCJ9fY5.js} +0 -0
  198. /package/dist/core/{LinearGradient-glCc9IaB.js → LinearGradient-DIbCAHc7.js} +0 -0
  199. /package/dist/core/{Liquify-uZjs0wcu.js → Liquify-8dcdv2Sl.js} +0 -0
  200. /package/dist/core/{Marble-DkHLcqFD.js → Marble-DX29RG-p.js} +0 -0
  201. /package/dist/core/{Mirror-Dv5fOEp6.js → Mirror-BM2xf3Nr.js} +0 -0
  202. /package/dist/core/{MultiPointGradient-Dvt1GUiv.js → MultiPointGradient-BzM24vnR.js} +0 -0
  203. /package/dist/core/{Neon-DQDB7hAE.js → Neon-nPiMi3wt.js} +0 -0
  204. /package/dist/core/{Paper-DNP2-hPM.js → Paper-Ddpe8-EI.js} +0 -0
  205. /package/dist/core/{Perspective-CAIchX9p.js → Perspective-BIKpqd4H.js} +0 -0
  206. /package/dist/core/{Pixelate-BbT3Rrf2.js → Pixelate-Cp0-lwkG.js} +0 -0
  207. /package/dist/core/{Plasma-D9rhkH2y.js → Plasma-M--gLd1Q.js} +0 -0
  208. /package/dist/core/{PolarCoordinates-2RBCk-fo.js → PolarCoordinates-C42rlD2q.js} +0 -0
  209. /package/dist/core/{Polygon-C6_siOs0.js → Polygon-CKqH0ApY.js} +0 -0
  210. /package/dist/core/{Posterize-DNxTRgvF.js → Posterize-B6ZhRkH2.js} +0 -0
  211. /package/dist/core/{RadialGradient-CQIctl__.js → RadialGradient-SHxJ9ZNF.js} +0 -0
  212. /package/dist/core/{RectangularCoordinates-F2VzXmal.js → RectangularCoordinates-Dw6Xr9uV.js} +0 -0
  213. /package/dist/core/{Ring-UT__kmzY.js → Ring-V4sEHwwm.js} +0 -0
  214. /package/dist/core/{Ripples-CWVLSUP0.js → Ripples-DC1y3YuP.js} +0 -0
  215. /package/dist/core/{RoundedRect-BPWHTT1j.js → RoundedRect-JY2z6YEH.js} +0 -0
  216. /package/dist/core/{Saturation-DFOp2yD9.js → Saturation-ChJ9IWnl.js} +0 -0
  217. /package/dist/core/{Sharpness-PIWR4gYc.js → Sharpness-C1ufX8S-.js} +0 -0
  218. /package/dist/core/{Shatter-CUYQp-qy.js → Shatter-Du5THcwZ.js} +0 -0
  219. /package/dist/core/{SimplexNoise-LAxWw8fJ.js → SimplexNoise--vwIZVu0.js} +0 -0
  220. /package/dist/core/{SineWave-CEQWxC9Q.js → SineWave-BIVPG3oc.js} +0 -0
  221. /package/dist/core/{Smoke-DO4yylWk.js → Smoke-DSBQreo0.js} +0 -0
  222. /package/dist/core/{SmokeFill-Dm0sZS5F.js → SmokeFill-Dy-0kjsX.js} +0 -0
  223. /package/dist/core/{Solarize-mE7LU1li.js → Solarize-BymZlSu0.js} +0 -0
  224. /package/dist/core/{SolidColor-BljkSdvg.js → SolidColor-D8XC4aoJ.js} +0 -0
  225. /package/dist/core/{Spherize-DARagREe.js → Spherize-tRTB4WdO.js} +0 -0
  226. /package/dist/core/{Spiral-CumsIpkp.js → Spiral-CiDp2Tg2.js} +0 -0
  227. /package/dist/core/{Star-8fAlzR9L.js → Star-Cp4dt6Fl.js} +0 -0
  228. /package/dist/core/{Strands-BB4RIsFz.js → Strands-V3q8N-y1.js} +0 -0
  229. /package/dist/core/{Stretch-3S2atBkJ.js → Stretch-CTgtc3nG.js} +0 -0
  230. /package/dist/core/{Stripes-BGFVSZIt.js → Stripes-CZV6oGMy.js} +0 -0
  231. /package/dist/core/{StudioBackground-BtJ6b1Ki.js → StudioBackground-CWSHq6vE.js} +0 -0
  232. /package/dist/core/{SunBurst-BJRFFYhs.js → SunBurst-CskZwXc3.js} +0 -0
  233. /package/dist/core/{Swirl-fkUEZ2TQ.js → Swirl-CyGfVZ8n.js} +0 -0
  234. /package/dist/core/{Tint-W_EvzN1-.js → Tint-R7y5CJ4U.js} +0 -0
  235. /package/dist/core/{Trapezoid-cQzS6-bh.js → Trapezoid-BXzH--z9.js} +0 -0
  236. /package/dist/core/{Tritone-B3hI2nAi.js → Tritone-CF4Oj1sl.js} +0 -0
  237. /package/dist/core/{Truchet-s9PmowCP.js → Truchet-BL4jzZDX.js} +0 -0
  238. /package/dist/core/{Twirl-UDDXGkFl.js → Twirl-BVLPHKJD.js} +0 -0
  239. /package/dist/core/{VHS-DW1H7Wuy.js → VHS-B2IBdQgX.js} +0 -0
  240. /package/dist/core/{Vesica-ChQBYWuw.js → Vesica-DzIEa3aJ.js} +0 -0
  241. /package/dist/core/{Vibrance-DUj7hwzE.js → Vibrance-jrvT49Du.js} +0 -0
  242. /package/dist/core/{Vignette-F9yxi-UM.js → Vignette-ng_5gjXc.js} +0 -0
  243. /package/dist/core/{Voronoi-D8HHP_WR.js → Voronoi-C8iIU7AT.js} +0 -0
  244. /package/dist/core/{WaveDistortion-MbB-Kgjz.js → WaveDistortion-Crt9JSXN.js} +0 -0
  245. /package/dist/core/{Weave-ou5shgl3.js → Weave-CFmLkEaq.js} +0 -0
  246. /package/dist/core/{WorleyNoise-Uf6IPm7A.js → WorleyNoise-CEZiaVAN.js} +0 -0
  247. /package/dist/core/{ZoomBlur-DJ-RNKHM.js → ZoomBlur-DTVSwIvc.js} +0 -0
  248. /package/dist/core/{browser-NUM-x2tw.js → browser-CDogs09U.js} +0 -0
@@ -0,0 +1,326 @@
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/Exposure/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
+ exposure?: ComponentProps['exposure'] | PropDriver;
31
+ blendMode?: BlendMode;
32
+ opacity?: number;
33
+ visible?: boolean;
34
+ id?: string;
35
+ maskSource?: string;
36
+ maskType?: string;
37
+ renderOrder?: number;
38
+ transform?: Partial<TransformConfig>;
39
+ children?: import('svelte').Snippet;
40
+ }
41
+
42
+ function isPropDriver(value: unknown): value is PropDriver {
43
+ return typeof value === 'object' && value !== null && 'type' in value &&
44
+ ((value as any).type === 'map' || (value as any).type === 'mouse' || (value as any).type === 'mouse-position' || (value as any).type === 'auto-animate');
45
+ }
46
+
47
+ /**
48
+ * Default transform configuration (optimized for zero overhead)
49
+ */
50
+ const DEFAULT_TRANSFORM: TransformConfig = {
51
+ offsetX: 0,
52
+ offsetY: 0,
53
+ rotation: 0,
54
+ scale: 1,
55
+ anchorX: 0.5,
56
+ anchorY: 0.5,
57
+ edges: 'transparent'
58
+ };
59
+
60
+ // Define the component props and their default values from the shader definition
61
+ const componentDefaults = {
62
+ blendMode: 'normal' as BlendMode,
63
+ visible: true,
64
+ // opacity intentionally has no default - handled by renderer
65
+ // transform intentionally has no default - handled by effectiveTransform
66
+ ...Object.entries(componentDefinition.props).reduce(
67
+ (acc, [key, config]) => {
68
+ acc[key] = (config as unknown as PropConfig<typeof config>).default;
69
+ return acc;
70
+ },
71
+ {} as Record<string, any>
72
+ )
73
+ };
74
+
75
+ // Declare props using Svelte 5's syntax
76
+ const props: ExtendedComponentProps = $props();
77
+
78
+ // Apply defaults manually since Svelte 5 doesn't have withDefaults equivalent
79
+ // Use $derived so the metadata $effect re-runs when any of these change at runtime
80
+ const blendMode = $derived(props.blendMode ?? componentDefaults.blendMode);
81
+ const opacity = $derived(props.opacity); // No default - handled by renderer
82
+ const visible = $derived(props.visible ?? componentDefaults.visible); // Default to true
83
+ const id = $derived(props.id);
84
+ const maskSource = $derived(props.maskSource);
85
+ const maskType = $derived(props.maskType);
86
+ const renderOrder = $derived(props.renderOrder);
87
+ const { children } = props;
88
+
89
+ // Collect PropDriver values from shader props into the maps metadata structure
90
+ const mapsFromProps = $derived.by(() => {
91
+ const maps: Record<string, PropDriver> = {};
92
+ for (const key of Object.keys(componentDefinition.props)) {
93
+ const val = (props as any)[key];
94
+ if (isPropDriver(val)) maps[key] = val as PropDriver;
95
+ }
96
+ return Object.keys(maps).length > 0 ? maps : undefined;
97
+ });
98
+
99
+ /**
100
+ * Computed transform that merges user-provided values with defaults
101
+ */
102
+ const effectiveTransform = $derived({
103
+ ...DEFAULT_TRANSFORM,
104
+ ...props.transform
105
+ });
106
+
107
+ /**
108
+ * FIRST: Get the parent ID from context BEFORE setting our own context
109
+ */
110
+ const parentId = getContext<string>('shaderParentId');
111
+ if (parentId === undefined) {
112
+ throw new Error('Shader components must be used inside an <Shader> component or another shader component');
113
+ }
114
+
115
+ /**
116
+ * Use the provided ID or generate a unique identifier for this component instance
117
+ */
118
+ const instanceId = (id ? id.replace(/[^a-zA-Z0-9_]/g, '_') : null) || Math.random().toString(36).substring(2, 10);
119
+
120
+ /**
121
+ * THEN: Provide our unique identifier to child components
122
+ */
123
+ setContext('shaderParentId', instanceId);
124
+
125
+ /**
126
+ * Creates a non-reactive object containing only props that differ from defaults
127
+ * This optimization prevents unnecessary GPU uniform updates for unchanged values
128
+ * Special props like blendMode and opacity are handled separately
129
+ */
130
+ const shaderReadyProps = $derived.by(() => {
131
+ let baseProps = { ...componentDefaults };
132
+
133
+ // Only include props that differ from defaults (excluding special props and PropDrivers)
134
+ for (const key in props) {
135
+ if (key !== 'blendMode' && key !== 'opacity' && key !== 'visible' &&
136
+ key !== 'id' && key !== 'maskSource' && key !== 'maskType' && key !== 'renderOrder' &&
137
+ key !== 'transform' && key !== 'children') {
138
+ const propValue = (props as any)[key];
139
+ if (isPropDriver(propValue)) continue; // PropDrivers go to metadata.maps, not uniforms
140
+ const defaultValue = (componentDefaults as any)[key];
141
+ if (propValue !== undefined && propValue !== defaultValue) {
142
+ (baseProps as any)[key] = propValue;
143
+ }
144
+ }
145
+ }
146
+ return baseProps;
147
+ });
148
+
149
+ /**
150
+ * Get the color space from the root Shader component.
151
+ * Used to set the global color space mode before creating uniforms.
152
+ */
153
+ const shaderColorSpace = getContext<() => 'p3-linear' | 'srgb'>('shaderColorSpace');
154
+
155
+ /**
156
+ * Creates the GPU uniform values map using only the changed props
157
+ * Set the global color space mode before creating uniforms so colors are transformed correctly
158
+ * Note: Intentionally captures initial value - props are immutable after initialization
159
+ */
160
+ if (shaderColorSpace) {
161
+ setColorSpaceMode(shaderColorSpace());
162
+ }
163
+ // svelte-ignore state_referenced_locally
164
+ const uniforms: UniformsMap = createUniformsMap(componentDefinition, shaderReadyProps, instanceId);
165
+
166
+ /**
167
+ * Get the node registration function from parent context
168
+ */
169
+ const parentRegister = getContext<(id: string, fragmentNodeFunc: any, parentId: string | null, metadata: NodeMetadata | null, uniforms: UniformsMap | null, componentDefinition: any, domCanvas?: HTMLCanvasElement) => void>('shaderNodeRegister');
170
+ if (parentRegister === undefined) {
171
+ throw new Error('Shader components must be used inside an <Shader> component or another shader component');
172
+ }
173
+
174
+ /**
175
+ * Get the uniform update function from parent context
176
+ */
177
+ const parentUniformUpdate = getContext<(nodeId: string, uniformName: string, value: any) => void>('shaderUniformUpdate');
178
+ if (parentUniformUpdate === undefined) {
179
+ throw new Error('Shader components require shaderUniformUpdate from parent');
180
+ }
181
+
182
+ /**
183
+ * Get the metadata update function from parent context
184
+ */
185
+ const parentMetadataUpdate = getContext<(nodeId: string, metadata: NodeMetadata) => void>('shaderMetadataUpdate');
186
+ if (parentMetadataUpdate === undefined) {
187
+ throw new Error('Shader components require shaderMetadataUpdate from parent');
188
+ }
189
+
190
+ // capturesDOM — canvas layoutsubtree portal for DOMTexture-style shaders
191
+ const isCapturesDOM = !!(componentDefinition as any).capturesDOM;
192
+ let captureCanvas: HTMLCanvasElement | undefined;
193
+ let captureW = $state(typeof window !== 'undefined' ? Math.round(window.innerWidth * Math.min(window.devicePixelRatio, 2)) : 0);
194
+ let captureH = $state(typeof window !== 'undefined' ? Math.round(window.innerHeight * Math.min(window.devicePixelRatio, 2)) : 0);
195
+
196
+ function teleportToBody(node: HTMLElement) {
197
+ document.body.appendChild(node);
198
+ return { destroy() { node.remove(); } };
199
+ }
200
+
201
+ if (isCapturesDOM) {
202
+ const onWinResize = () => {
203
+ const d = Math.min(window.devicePixelRatio, 2);
204
+ captureW = Math.round(window.innerWidth * d);
205
+ captureH = Math.round(window.innerHeight * d);
206
+ };
207
+ onMount(() => { window.addEventListener('resize', onWinResize); });
208
+ onDestroy(() => { window.removeEventListener('resize', onWinResize); });
209
+ }
210
+
211
+ // DOM marker ref for determining render order from template position
212
+ let orderMarker: HTMLSpanElement;
213
+
214
+ // Stores the DOM-detected render order
215
+ let detectedRenderOrder: number | undefined = undefined;
216
+
217
+ // Flag to track when component is registered
218
+ let isRegistered = $state(false);
219
+
220
+ // Setup uniform watchers with registration guard
221
+ Object.entries(uniforms).forEach(([propName, { uniform, transform }]) => {
222
+ $effect(() => {
223
+ // Only run after component is registered
224
+ if (!isRegistered) return;
225
+
226
+ if (uniform && uniform.value !== undefined) {
227
+ const newValue = (props as any)[propName];
228
+ if (newValue !== undefined && !isPropDriver(newValue)) {
229
+ // Send raw value - renderer will handle transformation
230
+ // PropDriver values go to metadata.maps, not uniforms
231
+ parentUniformUpdate(instanceId, propName, newValue);
232
+ }
233
+ }
234
+ });
235
+ });
236
+
237
+ // Watch blend mode, opacity, visibility, masking, transformations, and prop maps changes
238
+ $effect(() => {
239
+ // Only run after component is registered
240
+ if (!isRegistered) return;
241
+
242
+ const metadata: NodeMetadata = {
243
+ blendMode,
244
+ opacity,
245
+ visible: visible === false ? false : true,
246
+ id,
247
+ mask: maskSource ? {
248
+ source: maskSource,
249
+ type: (maskType || 'alpha') as MaskConfig['type']
250
+ } : undefined,
251
+ maps: mapsFromProps,
252
+ renderOrder: renderOrder ?? detectedRenderOrder,
253
+ transform: effectiveTransform
254
+ };
255
+ parentMetadataUpdate(instanceId, metadata);
256
+ });
257
+
258
+ // Register this component after mount to ensure parent is ready
259
+ onMount(() => {
260
+ // Register this component with safety check
261
+ if (componentDefinition && typeof componentDefinition.fragmentNode === 'function') {
262
+ parentRegister(
263
+ instanceId,
264
+ componentDefinition.fragmentNode,
265
+ parentId,
266
+ {
267
+ blendMode,
268
+ opacity,
269
+ visible: visible !== false ? true : false,
270
+ id,
271
+ mask: maskSource ? {
272
+ source: maskSource,
273
+ type: (maskType || 'alpha') as MaskConfig['type']
274
+ } as MaskConfig : undefined,
275
+ maps: mapsFromProps,
276
+ renderOrder: renderOrder ?? detectedRenderOrder,
277
+ transform: effectiveTransform
278
+ },
279
+ uniforms,
280
+ componentDefinition,
281
+ isCapturesDOM ? captureCanvas : undefined
282
+ );
283
+
284
+ // Set flag to enable effects after successful registration
285
+ isRegistered = true;
286
+
287
+ // Detect DOM position for correct render ordering
288
+ if (renderOrder === undefined && orderMarker) {
289
+ const parent = orderMarker.parentElement;
290
+ if (parent) {
291
+ const siblings = parent.querySelectorAll(':scope > [data-shader-id]');
292
+ const position = Array.from(siblings).indexOf(orderMarker);
293
+ if (position >= 0) {
294
+ detectedRenderOrder = position;
295
+ parentMetadataUpdate(instanceId, { renderOrder: position } as NodeMetadata);
296
+ }
297
+ }
298
+ }
299
+ } else {
300
+ console.error('componentDefinition.fragmentNode is not a function:', {
301
+ componentDefinition,
302
+ fragmentNode: componentDefinition?.fragmentNode,
303
+ type: typeof componentDefinition?.fragmentNode
304
+ });
305
+ }
306
+ });
307
+
308
+ // Clean up node from registry when component is unmounted
309
+ onDestroy(() => {
310
+ isRegistered = false;
311
+ parentRegister(instanceId, null, null, null, null);
312
+ });
313
+ </script>
314
+
315
+ <span bind:this={orderMarker} style="display:contents" data-shader-id={instanceId}>
316
+ {#if !isCapturesDOM}
317
+ {@render children?.()}
318
+ {/if}
319
+ </span>
320
+ {#if isCapturesDOM}
321
+ <canvas use:teleportToBody bind:this={captureCanvas} layoutsubtree
322
+ width={captureW} height={captureH}
323
+ style="position:fixed;inset:0;width:100vw;height:100vh;z-index:-9999">
324
+ {@render children?.()}
325
+ </canvas>
326
+ {/if}
@@ -0,0 +1,334 @@
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/ThinFilm/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
+ center?: ComponentProps['center'] | PropDriver;
31
+ scale?: ComponentProps['scale'] | PropDriver;
32
+ intensity?: ComponentProps['intensity'] | PropDriver;
33
+ rimWidth?: ComponentProps['rimWidth'] | PropDriver;
34
+ edgeSoftness?: ComponentProps['edgeSoftness'] | PropDriver;
35
+ thickness?: ComponentProps['thickness'] | PropDriver;
36
+ dispersion?: ComponentProps['dispersion'] | PropDriver;
37
+ saturation?: ComponentProps['saturation'] | PropDriver;
38
+ hueShift?: ComponentProps['hueShift'] | PropDriver;
39
+ blendMode?: BlendMode;
40
+ opacity?: number;
41
+ visible?: boolean;
42
+ id?: string;
43
+ maskSource?: string;
44
+ maskType?: string;
45
+ renderOrder?: number;
46
+ transform?: Partial<TransformConfig>;
47
+ children?: import('svelte').Snippet;
48
+ }
49
+
50
+ function isPropDriver(value: unknown): value is PropDriver {
51
+ return typeof value === 'object' && value !== null && 'type' in value &&
52
+ ((value as any).type === 'map' || (value as any).type === 'mouse' || (value as any).type === 'mouse-position' || (value as any).type === 'auto-animate');
53
+ }
54
+
55
+ /**
56
+ * Default transform configuration (optimized for zero overhead)
57
+ */
58
+ const DEFAULT_TRANSFORM: TransformConfig = {
59
+ offsetX: 0,
60
+ offsetY: 0,
61
+ rotation: 0,
62
+ scale: 1,
63
+ anchorX: 0.5,
64
+ anchorY: 0.5,
65
+ edges: 'transparent'
66
+ };
67
+
68
+ // Define the component props and their default values from the shader definition
69
+ const componentDefaults = {
70
+ blendMode: 'normal' as BlendMode,
71
+ visible: true,
72
+ // opacity intentionally has no default - handled by renderer
73
+ // transform intentionally has no default - handled by effectiveTransform
74
+ ...Object.entries(componentDefinition.props).reduce(
75
+ (acc, [key, config]) => {
76
+ acc[key] = (config as unknown as PropConfig<typeof config>).default;
77
+ return acc;
78
+ },
79
+ {} as Record<string, any>
80
+ )
81
+ };
82
+
83
+ // Declare props using Svelte 5's syntax
84
+ const props: ExtendedComponentProps = $props();
85
+
86
+ // Apply defaults manually since Svelte 5 doesn't have withDefaults equivalent
87
+ // Use $derived so the metadata $effect re-runs when any of these change at runtime
88
+ const blendMode = $derived(props.blendMode ?? componentDefaults.blendMode);
89
+ const opacity = $derived(props.opacity); // No default - handled by renderer
90
+ const visible = $derived(props.visible ?? componentDefaults.visible); // Default to true
91
+ const id = $derived(props.id);
92
+ const maskSource = $derived(props.maskSource);
93
+ const maskType = $derived(props.maskType);
94
+ const renderOrder = $derived(props.renderOrder);
95
+ const { children } = props;
96
+
97
+ // Collect PropDriver values from shader props into the maps metadata structure
98
+ const mapsFromProps = $derived.by(() => {
99
+ const maps: Record<string, PropDriver> = {};
100
+ for (const key of Object.keys(componentDefinition.props)) {
101
+ const val = (props as any)[key];
102
+ if (isPropDriver(val)) maps[key] = val as PropDriver;
103
+ }
104
+ return Object.keys(maps).length > 0 ? maps : undefined;
105
+ });
106
+
107
+ /**
108
+ * Computed transform that merges user-provided values with defaults
109
+ */
110
+ const effectiveTransform = $derived({
111
+ ...DEFAULT_TRANSFORM,
112
+ ...props.transform
113
+ });
114
+
115
+ /**
116
+ * FIRST: Get the parent ID from context BEFORE setting our own context
117
+ */
118
+ const parentId = getContext<string>('shaderParentId');
119
+ if (parentId === undefined) {
120
+ throw new Error('Shader components must be used inside an <Shader> component or another shader component');
121
+ }
122
+
123
+ /**
124
+ * Use the provided ID or generate a unique identifier for this component instance
125
+ */
126
+ const instanceId = (id ? id.replace(/[^a-zA-Z0-9_]/g, '_') : null) || Math.random().toString(36).substring(2, 10);
127
+
128
+ /**
129
+ * THEN: Provide our unique identifier to child components
130
+ */
131
+ setContext('shaderParentId', instanceId);
132
+
133
+ /**
134
+ * Creates a non-reactive object containing only props that differ from defaults
135
+ * This optimization prevents unnecessary GPU uniform updates for unchanged values
136
+ * Special props like blendMode and opacity are handled separately
137
+ */
138
+ const shaderReadyProps = $derived.by(() => {
139
+ let baseProps = { ...componentDefaults };
140
+
141
+ // Only include props that differ from defaults (excluding special props and PropDrivers)
142
+ for (const key in props) {
143
+ if (key !== 'blendMode' && key !== 'opacity' && key !== 'visible' &&
144
+ key !== 'id' && key !== 'maskSource' && key !== 'maskType' && key !== 'renderOrder' &&
145
+ key !== 'transform' && key !== 'children') {
146
+ const propValue = (props as any)[key];
147
+ if (isPropDriver(propValue)) continue; // PropDrivers go to metadata.maps, not uniforms
148
+ const defaultValue = (componentDefaults as any)[key];
149
+ if (propValue !== undefined && propValue !== defaultValue) {
150
+ (baseProps as any)[key] = propValue;
151
+ }
152
+ }
153
+ }
154
+ return baseProps;
155
+ });
156
+
157
+ /**
158
+ * Get the color space from the root Shader component.
159
+ * Used to set the global color space mode before creating uniforms.
160
+ */
161
+ const shaderColorSpace = getContext<() => 'p3-linear' | 'srgb'>('shaderColorSpace');
162
+
163
+ /**
164
+ * Creates the GPU uniform values map using only the changed props
165
+ * Set the global color space mode before creating uniforms so colors are transformed correctly
166
+ * Note: Intentionally captures initial value - props are immutable after initialization
167
+ */
168
+ if (shaderColorSpace) {
169
+ setColorSpaceMode(shaderColorSpace());
170
+ }
171
+ // svelte-ignore state_referenced_locally
172
+ const uniforms: UniformsMap = createUniformsMap(componentDefinition, shaderReadyProps, instanceId);
173
+
174
+ /**
175
+ * Get the node registration function from parent context
176
+ */
177
+ const parentRegister = getContext<(id: string, fragmentNodeFunc: any, parentId: string | null, metadata: NodeMetadata | null, uniforms: UniformsMap | null, componentDefinition: any, domCanvas?: HTMLCanvasElement) => void>('shaderNodeRegister');
178
+ if (parentRegister === undefined) {
179
+ throw new Error('Shader components must be used inside an <Shader> component or another shader component');
180
+ }
181
+
182
+ /**
183
+ * Get the uniform update function from parent context
184
+ */
185
+ const parentUniformUpdate = getContext<(nodeId: string, uniformName: string, value: any) => void>('shaderUniformUpdate');
186
+ if (parentUniformUpdate === undefined) {
187
+ throw new Error('Shader components require shaderUniformUpdate from parent');
188
+ }
189
+
190
+ /**
191
+ * Get the metadata update function from parent context
192
+ */
193
+ const parentMetadataUpdate = getContext<(nodeId: string, metadata: NodeMetadata) => void>('shaderMetadataUpdate');
194
+ if (parentMetadataUpdate === undefined) {
195
+ throw new Error('Shader components require shaderMetadataUpdate from parent');
196
+ }
197
+
198
+ // capturesDOM — canvas layoutsubtree portal for DOMTexture-style shaders
199
+ const isCapturesDOM = !!(componentDefinition as any).capturesDOM;
200
+ let captureCanvas: HTMLCanvasElement | undefined;
201
+ let captureW = $state(typeof window !== 'undefined' ? Math.round(window.innerWidth * Math.min(window.devicePixelRatio, 2)) : 0);
202
+ let captureH = $state(typeof window !== 'undefined' ? Math.round(window.innerHeight * Math.min(window.devicePixelRatio, 2)) : 0);
203
+
204
+ function teleportToBody(node: HTMLElement) {
205
+ document.body.appendChild(node);
206
+ return { destroy() { node.remove(); } };
207
+ }
208
+
209
+ if (isCapturesDOM) {
210
+ const onWinResize = () => {
211
+ const d = Math.min(window.devicePixelRatio, 2);
212
+ captureW = Math.round(window.innerWidth * d);
213
+ captureH = Math.round(window.innerHeight * d);
214
+ };
215
+ onMount(() => { window.addEventListener('resize', onWinResize); });
216
+ onDestroy(() => { window.removeEventListener('resize', onWinResize); });
217
+ }
218
+
219
+ // DOM marker ref for determining render order from template position
220
+ let orderMarker: HTMLSpanElement;
221
+
222
+ // Stores the DOM-detected render order
223
+ let detectedRenderOrder: number | undefined = undefined;
224
+
225
+ // Flag to track when component is registered
226
+ let isRegistered = $state(false);
227
+
228
+ // Setup uniform watchers with registration guard
229
+ Object.entries(uniforms).forEach(([propName, { uniform, transform }]) => {
230
+ $effect(() => {
231
+ // Only run after component is registered
232
+ if (!isRegistered) return;
233
+
234
+ if (uniform && uniform.value !== undefined) {
235
+ const newValue = (props as any)[propName];
236
+ if (newValue !== undefined && !isPropDriver(newValue)) {
237
+ // Send raw value - renderer will handle transformation
238
+ // PropDriver values go to metadata.maps, not uniforms
239
+ parentUniformUpdate(instanceId, propName, newValue);
240
+ }
241
+ }
242
+ });
243
+ });
244
+
245
+ // Watch blend mode, opacity, visibility, masking, transformations, and prop maps changes
246
+ $effect(() => {
247
+ // Only run after component is registered
248
+ if (!isRegistered) return;
249
+
250
+ const metadata: NodeMetadata = {
251
+ blendMode,
252
+ opacity,
253
+ visible: visible === false ? false : true,
254
+ id,
255
+ mask: maskSource ? {
256
+ source: maskSource,
257
+ type: (maskType || 'alpha') as MaskConfig['type']
258
+ } : undefined,
259
+ maps: mapsFromProps,
260
+ renderOrder: renderOrder ?? detectedRenderOrder,
261
+ transform: effectiveTransform
262
+ };
263
+ parentMetadataUpdate(instanceId, metadata);
264
+ });
265
+
266
+ // Register this component after mount to ensure parent is ready
267
+ onMount(() => {
268
+ // Register this component with safety check
269
+ if (componentDefinition && typeof componentDefinition.fragmentNode === 'function') {
270
+ parentRegister(
271
+ instanceId,
272
+ componentDefinition.fragmentNode,
273
+ parentId,
274
+ {
275
+ blendMode,
276
+ opacity,
277
+ visible: visible !== false ? true : false,
278
+ id,
279
+ mask: maskSource ? {
280
+ source: maskSource,
281
+ type: (maskType || 'alpha') as MaskConfig['type']
282
+ } as MaskConfig : undefined,
283
+ maps: mapsFromProps,
284
+ renderOrder: renderOrder ?? detectedRenderOrder,
285
+ transform: effectiveTransform
286
+ },
287
+ uniforms,
288
+ componentDefinition,
289
+ isCapturesDOM ? captureCanvas : undefined
290
+ );
291
+
292
+ // Set flag to enable effects after successful registration
293
+ isRegistered = true;
294
+
295
+ // Detect DOM position for correct render ordering
296
+ if (renderOrder === undefined && orderMarker) {
297
+ const parent = orderMarker.parentElement;
298
+ if (parent) {
299
+ const siblings = parent.querySelectorAll(':scope > [data-shader-id]');
300
+ const position = Array.from(siblings).indexOf(orderMarker);
301
+ if (position >= 0) {
302
+ detectedRenderOrder = position;
303
+ parentMetadataUpdate(instanceId, { renderOrder: position } as NodeMetadata);
304
+ }
305
+ }
306
+ }
307
+ } else {
308
+ console.error('componentDefinition.fragmentNode is not a function:', {
309
+ componentDefinition,
310
+ fragmentNode: componentDefinition?.fragmentNode,
311
+ type: typeof componentDefinition?.fragmentNode
312
+ });
313
+ }
314
+ });
315
+
316
+ // Clean up node from registry when component is unmounted
317
+ onDestroy(() => {
318
+ isRegistered = false;
319
+ parentRegister(instanceId, null, null, null, null);
320
+ });
321
+ </script>
322
+
323
+ <span bind:this={orderMarker} style="display:contents" data-shader-id={instanceId}>
324
+ {#if !isCapturesDOM}
325
+ {@render children?.()}
326
+ {/if}
327
+ </span>
328
+ {#if isCapturesDOM}
329
+ <canvas use:teleportToBody bind:this={captureCanvas} layoutsubtree
330
+ width={captureW} height={captureH}
331
+ style="position:fixed;inset:0;width:100vw;height:100vh;z-index:-9999">
332
+ {@render children?.()}
333
+ </canvas>
334
+ {/if}
@@ -40,6 +40,7 @@ import DropShadow from '../components/DropShadow.svelte'
40
40
  import Duotone from '../components/Duotone.svelte'
41
41
  import Ellipse from '../components/Ellipse.svelte'
42
42
  import Emboss from '../components/Emboss.svelte'
43
+ import Exposure from '../components/Exposure.svelte'
43
44
  import FallingLines from '../components/FallingLines.svelte'
44
45
  import FilmGrain from '../components/FilmGrain.svelte'
45
46
  import FloatingParticles from '../components/FloatingParticles.svelte'
@@ -105,6 +106,7 @@ import Stripes from '../components/Stripes.svelte'
105
106
  import StudioBackground from '../components/StudioBackground.svelte'
106
107
  import SunBurst from '../components/SunBurst.svelte'
107
108
  import Swirl from '../components/Swirl.svelte'
109
+ import ThinFilm from '../components/ThinFilm.svelte'
108
110
  import TiltShift from '../components/TiltShift.svelte'
109
111
  import Tint from '../components/Tint.svelte'
110
112
  import Trapezoid from '../components/Trapezoid.svelte'
@@ -161,6 +163,7 @@ const componentMap: Record<string, any> = {
161
163
  Duotone,
162
164
  Ellipse,
163
165
  Emboss,
166
+ Exposure,
164
167
  FallingLines,
165
168
  FilmGrain,
166
169
  FloatingParticles,
@@ -226,6 +229,7 @@ const componentMap: Record<string, any> = {
226
229
  StudioBackground,
227
230
  SunBurst,
228
231
  Swirl,
232
+ ThinFilm,
229
233
  TiltShift,
230
234
  Tint,
231
235
  Trapezoid,