svelte-ag 1.0.14 → 1.0.16

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 (230) hide show
  1. package/dist/app.css +2 -20
  2. package/dist/lib/components/gradient/Gradient.svelte +1 -1
  3. package/dist/lib/components/shader/BaseShader.svelte +204 -0
  4. package/dist/lib/components/shader/BaseShader.svelte.d.ts +23 -0
  5. package/dist/lib/components/shader/BaseShader.svelte.d.ts.map +1 -0
  6. package/dist/lib/components/shader/WebGlShader.svelte +259 -0
  7. package/dist/lib/components/shader/WebGlShader.svelte.d.ts +15 -0
  8. package/dist/lib/components/shader/WebGlShader.svelte.d.ts.map +1 -0
  9. package/dist/lib/components/shader/WebGpuShader.svelte +376 -0
  10. package/dist/lib/components/shader/WebGpuShader.svelte.d.ts +15 -0
  11. package/dist/lib/components/shader/WebGpuShader.svelte.d.ts.map +1 -0
  12. package/dist/lib/components/shader/devicePixelResizeObserver.d.ts +14 -0
  13. package/dist/lib/components/shader/devicePixelResizeObserver.d.ts.map +1 -0
  14. package/dist/lib/components/shader/devicePixelResizeObserver.js +56 -0
  15. package/dist/lib/components/shader/index.d.ts +3 -0
  16. package/dist/lib/components/shader/index.d.ts.map +1 -0
  17. package/dist/lib/components/shader/index.js +2 -0
  18. package/dist/lib/components/shader/intersectionObserver.d.ts +14 -0
  19. package/dist/lib/components/shader/intersectionObserver.d.ts.map +1 -0
  20. package/dist/lib/components/shader/intersectionObserver.js +35 -0
  21. package/dist/lib/components/shader/resources/banner.png +0 -0
  22. package/dist/lib/components/shader/resources/bubbles.png +0 -0
  23. package/dist/lib/components/shader/resources/collage.png +0 -0
  24. package/dist/lib/components/shader/resources/debugShaderWebGl.png +0 -0
  25. package/dist/lib/components/shader/resources/debugShaderWebGpu.png +0 -0
  26. package/dist/lib/components/shader/resources/halo.png +0 -0
  27. package/dist/lib/components/shader/resources/logoDark.png +0 -0
  28. package/dist/lib/components/shader/resources/logoLight.png +0 -0
  29. package/dist/lib/components/shader/resources/slider.png +0 -0
  30. package/dist/lib/components/shader/tests/.generated-screenshots/test-pages.spec.ts/hello-world-webgl.png +0 -0
  31. package/dist/lib/components/shader/tests/.generated-screenshots/test-pages.spec.ts/hello-world-webgpu-unsupported.png +0 -0
  32. package/dist/lib/components/shader/tests/.generated-screenshots/test-pages.spec.ts/hello-world-webgpu.png +0 -0
  33. package/dist/lib/components/shader/tests/.generated-screenshots/test-pages.spec.ts/landing-page-bubbles-webgl.png +0 -0
  34. package/dist/lib/components/shader/tests/.generated-screenshots/test-pages.spec.ts/landing-page-bubbles-webgpu-unsupported.png +0 -0
  35. package/dist/lib/components/shader/tests/.generated-screenshots/test-pages.spec.ts/landing-page-bubbles-webgpu.png +0 -0
  36. package/dist/lib/components/shader/tests/.generated-screenshots/test-pages.spec.ts/landing-page-halo-webgl.png +0 -0
  37. package/dist/lib/components/shader/tests/.generated-screenshots/test-pages.spec.ts/landing-page-halo-webgpu-unsupported.png +0 -0
  38. package/dist/lib/components/shader/tests/.generated-screenshots/test-pages.spec.ts/landing-page-halo-webgpu.png +0 -0
  39. package/dist/lib/components/shader/tests/.generated-screenshots/test-pages.spec.ts/oversized-canvas-webgl-1.png +0 -0
  40. package/dist/lib/components/shader/tests/.generated-screenshots/test-pages.spec.ts/oversized-canvas-webgl-2.png +0 -0
  41. package/dist/lib/components/shader/tests/.generated-screenshots/test-pages.spec.ts/oversized-canvas-webgpu-1.png +0 -0
  42. package/dist/lib/components/shader/tests/.generated-screenshots/test-pages.spec.ts/oversized-canvas-webgpu-2.png +0 -0
  43. package/dist/lib/components/shader/tests/.generated-screenshots/test-pages.spec.ts/oversized-canvas-webgpu-unsupported-1.png +0 -0
  44. package/dist/lib/components/shader/tests/.generated-screenshots/test-pages.spec.ts/oversized-canvas-webgpu-unsupported-2.png +0 -0
  45. package/dist/lib/components/shader/tests/.generated-screenshots/test-pages.spec.ts/remount-webgl-1.png +0 -0
  46. package/dist/lib/components/shader/tests/.generated-screenshots/test-pages.spec.ts/remount-webgl-2.png +0 -0
  47. package/dist/lib/components/shader/tests/.generated-screenshots/test-pages.spec.ts/remount-webgpu-1.png +0 -0
  48. package/dist/lib/components/shader/tests/.generated-screenshots/test-pages.spec.ts/remount-webgpu-2.png +0 -0
  49. package/dist/lib/components/shader/tests/.generated-screenshots/test-pages.spec.ts/remount-webgpu-unsupported-1.png +0 -0
  50. package/dist/lib/components/shader/tests/.generated-screenshots/test-pages.spec.ts/remount-webgpu-unsupported-2.png +0 -0
  51. package/dist/lib/components/shader/tests/.generated-screenshots/test-pages.spec.ts/slider-webgl-1.png +0 -0
  52. package/dist/lib/components/shader/tests/.generated-screenshots/test-pages.spec.ts/slider-webgl-2.png +0 -0
  53. package/dist/lib/components/shader/tests/.generated-screenshots/test-pages.spec.ts/slider-webgl-3.png +0 -0
  54. package/dist/lib/components/shader/tests/.generated-screenshots/test-pages.spec.ts/slider-webgpu-1.png +0 -0
  55. package/dist/lib/components/shader/tests/.generated-screenshots/test-pages.spec.ts/slider-webgpu-2.png +0 -0
  56. package/dist/lib/components/shader/tests/.generated-screenshots/test-pages.spec.ts/slider-webgpu-3.png +0 -0
  57. package/dist/lib/components/shader/tests/.generated-screenshots/test-pages.spec.ts/slider-webgpu-unsupported-1.png +0 -0
  58. package/dist/lib/components/shader/tests/.generated-screenshots/test-pages.spec.ts/slider-webgpu-unsupported-2.png +0 -0
  59. package/dist/lib/components/shader/tests/.generated-screenshots/test-pages.spec.ts/slider-webgpu-unsupported-3.png +0 -0
  60. package/dist/lib/components/shader/tests/test-pages.spec.d.ts +2 -0
  61. package/dist/lib/components/shader/tests/test-pages.spec.d.ts.map +1 -0
  62. package/dist/lib/components/shader/tests/test-pages.spec.js +77 -0
  63. package/dist/lib/components/shader/types.d.ts +66 -0
  64. package/dist/lib/components/shader/types.d.ts.map +1 -0
  65. package/dist/lib/components/shader/types.js +3 -0
  66. package/dist/lib/components/shader/utils.d.ts +11 -0
  67. package/dist/lib/components/shader/utils.d.ts.map +1 -0
  68. package/dist/lib/components/shader/utils.js +30 -0
  69. package/dist/lib/vite/vite-plugin-component-source-collector.d.ts.map +1 -1
  70. package/dist/lib/vite/vite-plugin-component-source-collector.js +6 -4
  71. package/dist/routes/+layout.svelte +3 -4
  72. package/dist/routes/+layout.svelte.d.ts +4 -17
  73. package/dist/routes/+layout.svelte.d.ts.map +1 -1
  74. package/dist/routes/+page.svelte +7 -0
  75. package/dist/routes/+page.svelte.d.ts +6 -14
  76. package/dist/routes/+page.svelte.d.ts.map +1 -1
  77. package/dist/routes/shader/+page.svelte +16 -0
  78. package/dist/routes/shader/+page.svelte.d.ts +27 -0
  79. package/dist/routes/shader/+page.svelte.d.ts.map +1 -0
  80. package/dist/routes/shader/hello-world/+page.svelte +8 -0
  81. package/dist/routes/shader/hello-world/+page.svelte.d.ts +27 -0
  82. package/dist/routes/shader/hello-world/+page.svelte.d.ts.map +1 -0
  83. package/dist/routes/shader/hello-world/webgl/+page.svelte +22 -0
  84. package/dist/routes/shader/hello-world/webgl/+page.svelte.d.ts +27 -0
  85. package/dist/routes/shader/hello-world/webgl/+page.svelte.d.ts.map +1 -0
  86. package/dist/routes/shader/hello-world/webgl/shader.frag +13 -0
  87. package/dist/routes/shader/hello-world/webgpu/+page.svelte +24 -0
  88. package/dist/routes/shader/hello-world/webgpu/+page.svelte.d.ts +27 -0
  89. package/dist/routes/shader/hello-world/webgpu/+page.svelte.d.ts.map +1 -0
  90. package/dist/routes/shader/hello-world/webgpu/shader.wgsl +9 -0
  91. package/dist/routes/shader/landing-page-bubbles/+page.svelte +8 -0
  92. package/dist/routes/shader/landing-page-bubbles/+page.svelte.d.ts +27 -0
  93. package/dist/routes/shader/landing-page-bubbles/+page.svelte.d.ts.map +1 -0
  94. package/dist/routes/shader/landing-page-bubbles/webgl/+page.svelte +95 -0
  95. package/dist/routes/shader/landing-page-bubbles/webgl/+page.svelte.d.ts +27 -0
  96. package/dist/routes/shader/landing-page-bubbles/webgl/+page.svelte.d.ts.map +1 -0
  97. package/dist/routes/shader/landing-page-bubbles/webgl/shader.frag +64 -0
  98. package/dist/routes/shader/landing-page-bubbles/webgpu/+page.svelte +94 -0
  99. package/dist/routes/shader/landing-page-bubbles/webgpu/+page.svelte.d.ts +27 -0
  100. package/dist/routes/shader/landing-page-bubbles/webgpu/+page.svelte.d.ts.map +1 -0
  101. package/dist/routes/shader/landing-page-bubbles/webgpu/shader.wgsl +56 -0
  102. package/dist/routes/shader/landing-page-halo/+page.svelte +8 -0
  103. package/dist/routes/shader/landing-page-halo/+page.svelte.d.ts +27 -0
  104. package/dist/routes/shader/landing-page-halo/+page.svelte.d.ts.map +1 -0
  105. package/dist/routes/shader/landing-page-halo/webgl/+page.svelte +70 -0
  106. package/dist/routes/shader/landing-page-halo/webgl/+page.svelte.d.ts +27 -0
  107. package/dist/routes/shader/landing-page-halo/webgl/+page.svelte.d.ts.map +1 -0
  108. package/dist/routes/shader/landing-page-halo/webgl/shader.frag +69 -0
  109. package/dist/routes/shader/landing-page-halo/webgpu/+page.svelte +72 -0
  110. package/dist/routes/shader/landing-page-halo/webgpu/+page.svelte.d.ts +27 -0
  111. package/dist/routes/shader/landing-page-halo/webgpu/+page.svelte.d.ts.map +1 -0
  112. package/dist/routes/shader/landing-page-halo/webgpu/shader.wgsl +66 -0
  113. package/dist/routes/shader/oversized-canvas/+page.svelte +8 -0
  114. package/dist/routes/shader/oversized-canvas/+page.svelte.d.ts +27 -0
  115. package/dist/routes/shader/oversized-canvas/+page.svelte.d.ts.map +1 -0
  116. package/dist/routes/shader/oversized-canvas/webgl/+page.svelte +22 -0
  117. package/dist/routes/shader/oversized-canvas/webgl/+page.svelte.d.ts +27 -0
  118. package/dist/routes/shader/oversized-canvas/webgl/+page.svelte.d.ts.map +1 -0
  119. package/dist/routes/shader/oversized-canvas/webgl/shader.frag +13 -0
  120. package/dist/routes/shader/oversized-canvas/webgpu/+page.svelte +24 -0
  121. package/dist/routes/shader/oversized-canvas/webgpu/+page.svelte.d.ts +27 -0
  122. package/dist/routes/shader/oversized-canvas/webgpu/+page.svelte.d.ts.map +1 -0
  123. package/dist/routes/shader/oversized-canvas/webgpu/shader.wgsl +9 -0
  124. package/dist/routes/shader/remount/+page.svelte +8 -0
  125. package/dist/routes/shader/remount/+page.svelte.d.ts +27 -0
  126. package/dist/routes/shader/remount/+page.svelte.d.ts.map +1 -0
  127. package/dist/routes/shader/remount/webgl/+page.svelte +28 -0
  128. package/dist/routes/shader/remount/webgl/+page.svelte.d.ts +7 -0
  129. package/dist/routes/shader/remount/webgl/+page.svelte.d.ts.map +1 -0
  130. package/dist/routes/shader/remount/webgl/shader.frag +13 -0
  131. package/dist/routes/shader/remount/webgpu/+page.svelte +30 -0
  132. package/dist/routes/shader/remount/webgpu/+page.svelte.d.ts +7 -0
  133. package/dist/routes/shader/remount/webgpu/+page.svelte.d.ts.map +1 -0
  134. package/dist/routes/shader/remount/webgpu/shader.wgsl +9 -0
  135. package/dist/routes/shader/slider/+page.svelte +8 -0
  136. package/dist/routes/shader/slider/+page.svelte.d.ts +27 -0
  137. package/dist/routes/shader/slider/+page.svelte.d.ts.map +1 -0
  138. package/dist/routes/shader/slider/webgl/+page.svelte +78 -0
  139. package/dist/routes/shader/slider/webgl/+page.svelte.d.ts +7 -0
  140. package/dist/routes/shader/slider/webgl/+page.svelte.d.ts.map +1 -0
  141. package/dist/routes/shader/slider/webgl/shader.frag +63 -0
  142. package/dist/routes/shader/slider/webgpu/+page.svelte +81 -0
  143. package/dist/routes/shader/slider/webgpu/+page.svelte.d.ts +7 -0
  144. package/dist/routes/shader/slider/webgpu/+page.svelte.d.ts.map +1 -0
  145. package/dist/routes/shader/slider/webgpu/shader.wgsl +59 -0
  146. package/package.json +6 -4
  147. package/src/app.css +2 -20
  148. package/src/lib/components/gradient/Gradient.svelte +1 -1
  149. package/src/lib/components/shader/BaseShader.svelte +204 -0
  150. package/src/lib/components/shader/WebGlShader.svelte +259 -0
  151. package/src/lib/components/shader/WebGpuShader.svelte +376 -0
  152. package/src/lib/components/shader/devicePixelResizeObserver.ts +70 -0
  153. package/src/lib/components/shader/index.ts +2 -0
  154. package/src/lib/components/shader/intersectionObserver.ts +55 -0
  155. package/src/lib/components/shader/resources/banner.png +0 -0
  156. package/src/lib/components/shader/resources/bubbles.png +0 -0
  157. package/src/lib/components/shader/resources/collage.png +0 -0
  158. package/src/lib/components/shader/resources/debugShaderWebGl.png +0 -0
  159. package/src/lib/components/shader/resources/debugShaderWebGpu.png +0 -0
  160. package/src/lib/components/shader/resources/halo.png +0 -0
  161. package/src/lib/components/shader/resources/logoDark.png +0 -0
  162. package/src/lib/components/shader/resources/logoLight.png +0 -0
  163. package/src/lib/components/shader/resources/slider.png +0 -0
  164. package/src/lib/components/shader/tests/.generated-screenshots/test-pages.spec.ts/hello-world-webgl.png +0 -0
  165. package/src/lib/components/shader/tests/.generated-screenshots/test-pages.spec.ts/hello-world-webgpu-unsupported.png +0 -0
  166. package/src/lib/components/shader/tests/.generated-screenshots/test-pages.spec.ts/hello-world-webgpu.png +0 -0
  167. package/src/lib/components/shader/tests/.generated-screenshots/test-pages.spec.ts/landing-page-bubbles-webgl.png +0 -0
  168. package/src/lib/components/shader/tests/.generated-screenshots/test-pages.spec.ts/landing-page-bubbles-webgpu-unsupported.png +0 -0
  169. package/src/lib/components/shader/tests/.generated-screenshots/test-pages.spec.ts/landing-page-bubbles-webgpu.png +0 -0
  170. package/src/lib/components/shader/tests/.generated-screenshots/test-pages.spec.ts/landing-page-halo-webgl.png +0 -0
  171. package/src/lib/components/shader/tests/.generated-screenshots/test-pages.spec.ts/landing-page-halo-webgpu-unsupported.png +0 -0
  172. package/src/lib/components/shader/tests/.generated-screenshots/test-pages.spec.ts/landing-page-halo-webgpu.png +0 -0
  173. package/src/lib/components/shader/tests/.generated-screenshots/test-pages.spec.ts/oversized-canvas-webgl-1.png +0 -0
  174. package/src/lib/components/shader/tests/.generated-screenshots/test-pages.spec.ts/oversized-canvas-webgl-2.png +0 -0
  175. package/src/lib/components/shader/tests/.generated-screenshots/test-pages.spec.ts/oversized-canvas-webgpu-1.png +0 -0
  176. package/src/lib/components/shader/tests/.generated-screenshots/test-pages.spec.ts/oversized-canvas-webgpu-2.png +0 -0
  177. package/src/lib/components/shader/tests/.generated-screenshots/test-pages.spec.ts/oversized-canvas-webgpu-unsupported-1.png +0 -0
  178. package/src/lib/components/shader/tests/.generated-screenshots/test-pages.spec.ts/oversized-canvas-webgpu-unsupported-2.png +0 -0
  179. package/src/lib/components/shader/tests/.generated-screenshots/test-pages.spec.ts/remount-webgl-1.png +0 -0
  180. package/src/lib/components/shader/tests/.generated-screenshots/test-pages.spec.ts/remount-webgl-2.png +0 -0
  181. package/src/lib/components/shader/tests/.generated-screenshots/test-pages.spec.ts/remount-webgpu-1.png +0 -0
  182. package/src/lib/components/shader/tests/.generated-screenshots/test-pages.spec.ts/remount-webgpu-2.png +0 -0
  183. package/src/lib/components/shader/tests/.generated-screenshots/test-pages.spec.ts/remount-webgpu-unsupported-1.png +0 -0
  184. package/src/lib/components/shader/tests/.generated-screenshots/test-pages.spec.ts/remount-webgpu-unsupported-2.png +0 -0
  185. package/src/lib/components/shader/tests/.generated-screenshots/test-pages.spec.ts/slider-webgl-1.png +0 -0
  186. package/src/lib/components/shader/tests/.generated-screenshots/test-pages.spec.ts/slider-webgl-2.png +0 -0
  187. package/src/lib/components/shader/tests/.generated-screenshots/test-pages.spec.ts/slider-webgl-3.png +0 -0
  188. package/src/lib/components/shader/tests/.generated-screenshots/test-pages.spec.ts/slider-webgpu-1.png +0 -0
  189. package/src/lib/components/shader/tests/.generated-screenshots/test-pages.spec.ts/slider-webgpu-2.png +0 -0
  190. package/src/lib/components/shader/tests/.generated-screenshots/test-pages.spec.ts/slider-webgpu-3.png +0 -0
  191. package/src/lib/components/shader/tests/.generated-screenshots/test-pages.spec.ts/slider-webgpu-unsupported-1.png +0 -0
  192. package/src/lib/components/shader/tests/.generated-screenshots/test-pages.spec.ts/slider-webgpu-unsupported-2.png +0 -0
  193. package/src/lib/components/shader/tests/.generated-screenshots/test-pages.spec.ts/slider-webgpu-unsupported-3.png +0 -0
  194. package/src/lib/components/shader/tests/test-pages.spec.ts +97 -0
  195. package/src/lib/components/shader/types.ts +66 -0
  196. package/src/lib/components/shader/utils.ts +38 -0
  197. package/src/lib/vite/vite-plugin-component-source-collector.ts +6 -4
  198. package/src/routes/+layout.svelte +3 -4
  199. package/src/routes/+page.svelte +7 -0
  200. package/src/routes/shader/+page.svelte +16 -0
  201. package/src/routes/shader/hello-world/+page.svelte +8 -0
  202. package/src/routes/shader/hello-world/webgl/+page.svelte +22 -0
  203. package/src/routes/shader/hello-world/webgl/shader.frag +13 -0
  204. package/src/routes/shader/hello-world/webgpu/+page.svelte +24 -0
  205. package/src/routes/shader/hello-world/webgpu/shader.wgsl +9 -0
  206. package/src/routes/shader/landing-page-bubbles/+page.svelte +8 -0
  207. package/src/routes/shader/landing-page-bubbles/webgl/+page.svelte +95 -0
  208. package/src/routes/shader/landing-page-bubbles/webgl/shader.frag +64 -0
  209. package/src/routes/shader/landing-page-bubbles/webgpu/+page.svelte +94 -0
  210. package/src/routes/shader/landing-page-bubbles/webgpu/shader.wgsl +56 -0
  211. package/src/routes/shader/landing-page-halo/+page.svelte +8 -0
  212. package/src/routes/shader/landing-page-halo/webgl/+page.svelte +70 -0
  213. package/src/routes/shader/landing-page-halo/webgl/shader.frag +69 -0
  214. package/src/routes/shader/landing-page-halo/webgpu/+page.svelte +72 -0
  215. package/src/routes/shader/landing-page-halo/webgpu/shader.wgsl +66 -0
  216. package/src/routes/shader/oversized-canvas/+page.svelte +8 -0
  217. package/src/routes/shader/oversized-canvas/webgl/+page.svelte +22 -0
  218. package/src/routes/shader/oversized-canvas/webgl/shader.frag +13 -0
  219. package/src/routes/shader/oversized-canvas/webgpu/+page.svelte +24 -0
  220. package/src/routes/shader/oversized-canvas/webgpu/shader.wgsl +9 -0
  221. package/src/routes/shader/remount/+page.svelte +8 -0
  222. package/src/routes/shader/remount/webgl/+page.svelte +28 -0
  223. package/src/routes/shader/remount/webgl/shader.frag +13 -0
  224. package/src/routes/shader/remount/webgpu/+page.svelte +30 -0
  225. package/src/routes/shader/remount/webgpu/shader.wgsl +9 -0
  226. package/src/routes/shader/slider/+page.svelte +8 -0
  227. package/src/routes/shader/slider/webgl/+page.svelte +78 -0
  228. package/src/routes/shader/slider/webgl/shader.frag +63 -0
  229. package/src/routes/shader/slider/webgpu/+page.svelte +81 -0
  230. package/src/routes/shader/slider/webgpu/shader.wgsl +59 -0
package/dist/app.css CHANGED
@@ -12,9 +12,9 @@
12
12
 
13
13
  /* --font-family: -apple-system, BlinkMacSystemFont, 'Segoe UI', 'Roboto', 'Helvetica Neue', 'Ubuntu', sans-serif; */
14
14
 
15
- html {
15
+ /* html {
16
16
  scrollbar-gutter: stable;
17
- }
17
+ } */
18
18
 
19
19
  /* Below is for shadcn */
20
20
 
@@ -185,21 +185,3 @@ html {
185
185
  }
186
186
  }
187
187
  }
188
-
189
- @layer base {
190
- * {
191
- @apply border-border;
192
- }
193
- body {
194
- @apply bg-background text-foreground;
195
- }
196
- h1 {
197
- @apply text-2xl font-bold;
198
- }
199
- h2 {
200
- @apply text-xl font-bold;
201
- }
202
- h3 {
203
- @apply text-lg font-bold;
204
- }
205
- }
@@ -1,5 +1,5 @@
1
1
  <script lang="ts">
2
- import { WebGlShader } from 'svader';
2
+ import { WebGlShader } from '../shader/index.js';
3
3
  import type { Vec2, Vec4 } from '../../utils/glsl.js';
4
4
  import fragment from './gradient.frag?raw';
5
5
  import { cn } from '../../utils';
@@ -0,0 +1,204 @@
1
+ <script lang="ts">
2
+ import { onDestroy, onMount } from 'svelte';
3
+ import type { Snippet } from 'svelte';
4
+
5
+ import { pixelScale, clamp } from './utils.js';
6
+ import { intersectionObserver } from './intersectionObserver.js';
7
+ import { devicePixelResizeObserver, type DevicePixelResizeEvent } from './devicePixelResizeObserver.js';
8
+
9
+ type Props = {
10
+ width?: string;
11
+ height?: string;
12
+ canRender: boolean;
13
+ maxSize: number;
14
+ render: () => void | Promise<void>;
15
+ rerenderEveryFrame: boolean;
16
+ forceAnimation: boolean;
17
+ offsetFromBottom?: boolean;
18
+ updateCanvasSize?: (canvasWidth: number, canvasHeight: number) => void | Promise<void>;
19
+ updateContainerSize: (containerWidth: number, containerHeight: number) => void | Promise<void>;
20
+ updateOffset: (offsetX: number, offsetY: number) => void | Promise<void>;
21
+ updateScale: (scale: number) => void | Promise<void>;
22
+ updateTime: (time: number) => void | Promise<void>;
23
+ canvasElement: HTMLCanvasElement | null;
24
+ requestRender: () => void;
25
+ children?: Snippet;
26
+ };
27
+
28
+ let {
29
+ width,
30
+ height,
31
+ canRender,
32
+ maxSize,
33
+ render,
34
+ rerenderEveryFrame,
35
+ forceAnimation,
36
+ offsetFromBottom = false,
37
+ updateCanvasSize = () => {},
38
+ updateContainerSize,
39
+ updateOffset,
40
+ updateScale,
41
+ updateTime,
42
+ canvasElement = $bindable(),
43
+ requestRender = $bindable(),
44
+ children
45
+ }: Props = $props();
46
+
47
+ function prefersReducedMotion() {
48
+ if (typeof window === 'undefined') return false;
49
+ return window.matchMedia('(prefers-reduced-motion: reduce)').matches;
50
+ }
51
+
52
+ const shouldRerenderEveryFrame = $derived(forceAnimation || !prefersReducedMotion() ? rerenderEveryFrame : false);
53
+
54
+ let mountTime = 0;
55
+ onMount(() => {
56
+ mountTime = performance.now() / 1000;
57
+ });
58
+
59
+ let containerElement = $state<HTMLElement | null>(null);
60
+
61
+ let requestHandle: number | null = null;
62
+ const renderCallbacks: Array<() => void> = [];
63
+
64
+ requestRender = () => {
65
+ if (!canRender) return;
66
+ if (requestHandle !== null) return;
67
+
68
+ requestHandle = requestAnimationFrame(() => {
69
+ renderCallbacks.forEach((callback) => callback());
70
+ renderCallbacks.length = 0;
71
+
72
+ if (shouldRerenderEveryFrame) updateTime(performance.now() / 1000 - mountTime);
73
+
74
+ render();
75
+
76
+ requestHandle = null;
77
+
78
+ if (shouldRerenderEveryFrame) requestRender();
79
+ });
80
+ };
81
+
82
+ function cancelRender() {
83
+ if (requestHandle !== null) {
84
+ cancelAnimationFrame(requestHandle);
85
+ requestHandle = null;
86
+ }
87
+ }
88
+
89
+ function updateCanvasSizeInner(event: DevicePixelResizeEvent) {
90
+ if (!canvasElement) return;
91
+ const nextCanvasElement = canvasElement;
92
+
93
+ // Resizing must happen right before the next render pass.
94
+ renderCallbacks.push(() => {
95
+ const canvasWidth = event.detail.width;
96
+ const canvasHeight = event.detail.height;
97
+
98
+ nextCanvasElement.width = canvasWidth;
99
+ nextCanvasElement.height = canvasHeight;
100
+
101
+ updateCanvasSize(canvasWidth, canvasHeight);
102
+ });
103
+
104
+ requestRender();
105
+ }
106
+
107
+ function updateContainerSizeInner(event: DevicePixelResizeEvent) {
108
+ const canvasWidth = event.detail.width;
109
+ const canvasHeight = event.detail.height;
110
+
111
+ updateContainerSize(canvasWidth, canvasHeight);
112
+ }
113
+
114
+ let offsetX = $state(0);
115
+ let offsetY = $state(0);
116
+
117
+ $effect(() => {
118
+ updateOffset(offsetX, offsetY);
119
+ });
120
+
121
+ $effect(() => {
122
+ updateScale($pixelScale);
123
+ });
124
+
125
+ function updateCanvasCutout() {
126
+ if (!containerElement || !canvasElement) return;
127
+
128
+ const containerRect = containerElement.getBoundingClientRect();
129
+
130
+ const windowSizeX = window.innerWidth;
131
+ const canvasSizeX = canvasElement.offsetWidth;
132
+ const containerSizeX = containerElement.offsetWidth;
133
+ const containerOvershootX = -containerRect.left;
134
+ offsetX =
135
+ clamp(0, containerOvershootX - (canvasSizeX - windowSizeX) / 2, containerSizeX - canvasSizeX) * $pixelScale;
136
+
137
+ const windowSizeY = window.innerHeight;
138
+ const canvasSizeY = canvasElement.offsetHeight;
139
+ const containerSizeY = containerElement.offsetHeight;
140
+ const containerOvershootY = offsetFromBottom
141
+ ? containerRect.top + containerSizeY - windowSizeY
142
+ : -containerRect.top;
143
+ offsetY =
144
+ clamp(0, containerOvershootY - (canvasSizeY - windowSizeY) / 2, containerSizeY - canvasSizeY) * $pixelScale;
145
+ }
146
+
147
+ onDestroy(cancelRender);
148
+ </script>
149
+
150
+ {#if canRender}
151
+ <div
152
+ bind:this={containerElement}
153
+ use:devicePixelResizeObserver
154
+ ondevicepixelresize={updateContainerSizeInner}
155
+ use:intersectionObserver
156
+ onintersectionchanged={updateCanvasCutout}
157
+ style:--width={width}
158
+ style:--height={height}
159
+ >
160
+ <canvas
161
+ bind:this={canvasElement}
162
+ use:devicePixelResizeObserver
163
+ ondevicepixelresize={updateCanvasSizeInner}
164
+ use:intersectionObserver={{ rootMargin: '100px' }}
165
+ onintersectionchanged={updateCanvasCutout}
166
+ class:offset-from-bottom={offsetFromBottom}
167
+ style:--max-size="{maxSize / $pixelScale}px"
168
+ style:--offset-x="{offsetX / $pixelScale}px"
169
+ style:--offset-y="{offsetY / $pixelScale}px"
170
+ >
171
+ {@render children?.()}
172
+ </canvas>
173
+ </div>
174
+ {:else}
175
+ {@render children?.()}
176
+ {/if}
177
+
178
+ <style>
179
+ div {
180
+ position: relative;
181
+ width: var(--width, 100%);
182
+ height: var(--height, 100%);
183
+ }
184
+
185
+ canvas {
186
+ /* Fix bottom spacing */
187
+ display: block;
188
+
189
+ width: 100%;
190
+ height: 100%;
191
+ max-width: var(--max-size);
192
+ max-height: var(--max-size);
193
+
194
+ position: absolute;
195
+ left: var(--offset-x);
196
+
197
+ top: var(--offset-y);
198
+ }
199
+
200
+ canvas.offset-from-bottom {
201
+ top: unset;
202
+ bottom: var(--offset-y);
203
+ }
204
+ </style>
@@ -0,0 +1,23 @@
1
+ import type { Snippet } from 'svelte';
2
+ type Props = {
3
+ width?: string;
4
+ height?: string;
5
+ canRender: boolean;
6
+ maxSize: number;
7
+ render: () => void | Promise<void>;
8
+ rerenderEveryFrame: boolean;
9
+ forceAnimation: boolean;
10
+ offsetFromBottom?: boolean;
11
+ updateCanvasSize?: (canvasWidth: number, canvasHeight: number) => void | Promise<void>;
12
+ updateContainerSize: (containerWidth: number, containerHeight: number) => void | Promise<void>;
13
+ updateOffset: (offsetX: number, offsetY: number) => void | Promise<void>;
14
+ updateScale: (scale: number) => void | Promise<void>;
15
+ updateTime: (time: number) => void | Promise<void>;
16
+ canvasElement: HTMLCanvasElement | null;
17
+ requestRender: () => void;
18
+ children?: Snippet;
19
+ };
20
+ declare const BaseShader: import("svelte").Component<Props, {}, "canvasElement" | "requestRender">;
21
+ type BaseShader = ReturnType<typeof BaseShader>;
22
+ export default BaseShader;
23
+ //# sourceMappingURL=BaseShader.svelte.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"BaseShader.svelte.d.ts","sourceRoot":"","sources":["../../../../src/lib/components/shader/BaseShader.svelte.ts"],"names":[],"mappings":"AAIA,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,QAAQ,CAAC;AAOpC,KAAK,KAAK,GAAG;IACX,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,SAAS,EAAE,OAAO,CAAC;IACnB,OAAO,EAAE,MAAM,CAAC;IAChB,MAAM,EAAE,MAAM,IAAI,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;IACnC,kBAAkB,EAAE,OAAO,CAAC;IAC5B,cAAc,EAAE,OAAO,CAAC;IACxB,gBAAgB,CAAC,EAAE,OAAO,CAAC;IAC3B,gBAAgB,CAAC,EAAE,CAAC,WAAW,EAAE,MAAM,EAAE,YAAY,EAAE,MAAM,KAAK,IAAI,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;IACvF,mBAAmB,EAAE,CAAC,cAAc,EAAE,MAAM,EAAE,eAAe,EAAE,MAAM,KAAK,IAAI,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;IAC/F,YAAY,EAAE,CAAC,OAAO,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,KAAK,IAAI,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;IACzE,WAAW,EAAE,CAAC,KAAK,EAAE,MAAM,KAAK,IAAI,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;IACrD,UAAU,EAAE,CAAC,IAAI,EAAE,MAAM,KAAK,IAAI,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;IACnD,aAAa,EAAE,iBAAiB,GAAG,IAAI,CAAC;IACxC,aAAa,EAAE,MAAM,IAAI,CAAC;IAC1B,QAAQ,CAAC,EAAE,OAAO,CAAC;CACpB,CAAC;AAkJJ,QAAA,MAAM,UAAU,0EAAwC,CAAC;AACzD,KAAK,UAAU,GAAG,UAAU,CAAC,OAAO,UAAU,CAAC,CAAC;AAChD,eAAe,UAAU,CAAC"}
@@ -0,0 +1,259 @@
1
+ <script module lang="ts">
2
+ export type { BuiltinValue, BuiltinParameter, NonBuiltinParameter, WebGlParameter as Parameter } from './types.js';
3
+ </script>
4
+
5
+ <script lang="ts">
6
+ import { onMount } from 'svelte';
7
+ import type { Snippet } from 'svelte';
8
+
9
+ import BaseShader from './BaseShader.svelte';
10
+ import type { BuiltinParameter, WebGlParameter as Parameter } from './types.js';
11
+ import { isBuiltinValue } from './types.js';
12
+
13
+ type Props = {
14
+ width?: string;
15
+ height?: string;
16
+ code: string | Promise<string>;
17
+ parameters?: readonly Parameter[];
18
+ forceAnimation?: boolean;
19
+ children?: Snippet;
20
+ };
21
+
22
+ let {
23
+ width = undefined,
24
+ height = undefined,
25
+ code,
26
+ parameters = [],
27
+ forceAnimation = false,
28
+ children
29
+ }: Props = $props();
30
+
31
+ const rerenderEveryFrame = $derived(parameters.some((parameter) => parameter.value === 'time'));
32
+
33
+ const maxTextureSize = 4096;
34
+
35
+ let requestRender = $state<() => void>(() => {});
36
+ let canvasElement = $state<HTMLCanvasElement | null>(null);
37
+
38
+ let canRender = $state(typeof WebGL2RenderingContext !== 'undefined');
39
+
40
+ type Config = {
41
+ gl: WebGL2RenderingContext;
42
+ shaderProgram: WebGLProgram;
43
+ };
44
+
45
+ const configPromise = new Promise<Config>((resolve) =>
46
+ onMount(async () => {
47
+ try {
48
+ if (!canRender) return;
49
+
50
+ if (canvasElement === null) return;
51
+ const gl = canvasElement.getContext('webgl2');
52
+ if (gl === null) throw new Error('Failed to get WebGL2 context.');
53
+ const shaderProgram = gl.createProgram();
54
+ if (shaderProgram === null) throw new Error('Failed to create WebGL shader program.');
55
+
56
+ const loadShader = (source: string, type: number) => {
57
+ const shader = gl.createShader(type);
58
+ if (shader === null) throw new Error('Failed to create texture.');
59
+ gl.shaderSource(shader, source);
60
+ gl.compileShader(shader);
61
+
62
+ if (!gl.getShaderParameter(shader, gl.COMPILE_STATUS))
63
+ throw new Error(`An error occurred compiling the shaders: ${gl.getShaderInfoLog(shader)}`);
64
+
65
+ gl.attachShader(shaderProgram, shader);
66
+ };
67
+
68
+ // Simple identity function
69
+ const vertexShaderSource = `#version 300 es
70
+ in vec4 pos;
71
+ void main() {
72
+ gl_Position = pos;
73
+ }
74
+ `;
75
+ loadShader(vertexShaderSource, gl.VERTEX_SHADER);
76
+ loadShader(await code, gl.FRAGMENT_SHADER);
77
+
78
+ gl.linkProgram(shaderProgram);
79
+ gl.useProgram(shaderProgram);
80
+
81
+ // Create a rectangle covering the canvas
82
+ const vertexAttributePosition = gl.getAttribLocation(shaderProgram, 'pos');
83
+ const positionBuffer = gl.createBuffer();
84
+ gl.bindBuffer(gl.ARRAY_BUFFER, positionBuffer);
85
+ const positions = [1.0, 1.0, -1.0, 1.0, 1.0, -1.0, -1.0, -1.0];
86
+ gl.bufferData(gl.ARRAY_BUFFER, new Float32Array(positions), gl.STATIC_DRAW);
87
+ const numComponents = 2;
88
+ const type = gl.FLOAT;
89
+ const normalize = false;
90
+ const stride = 0;
91
+ const offset = 0;
92
+ gl.vertexAttribPointer(vertexAttributePosition, numComponents, type, normalize, stride, offset);
93
+ gl.enableVertexAttribArray(vertexAttributePosition);
94
+
95
+ resolve({ gl, shaderProgram });
96
+ } catch (error) {
97
+ console.warn(error);
98
+ canRender = false;
99
+ }
100
+ })
101
+ );
102
+
103
+ async function render() {
104
+ const { gl } = await configPromise;
105
+ gl.drawArrays(gl.TRIANGLE_STRIP, 0, 4);
106
+ }
107
+
108
+ async function updateCanvasSize(canvasWidth: number, canvasHeight: number) {
109
+ const { gl } = await configPromise;
110
+ gl.viewport(0, 0, canvasWidth, canvasHeight);
111
+ }
112
+
113
+ async function updateContainerSize(containerWidth: number, containerHeight: number) {
114
+ const { gl, shaderProgram } = await configPromise;
115
+
116
+ const resolutionParam = parameters.find(
117
+ (parameter): parameter is BuiltinParameter => parameter.value === 'resolution'
118
+ );
119
+ if (resolutionParam !== undefined) {
120
+ const uniformPosition = gl.getUniformLocation(shaderProgram, resolutionParam.name);
121
+ gl.uniform2fv(uniformPosition, [containerWidth, containerHeight]);
122
+
123
+ // If the resolution is not passed to the shader, rerendering cannot change the output.
124
+ requestRender();
125
+ }
126
+ }
127
+
128
+ async function updateOffset(offsetX: number, offsetY: number) {
129
+ const { gl, shaderProgram } = await configPromise;
130
+
131
+ const offsetParam = parameters.find((parameter): parameter is BuiltinParameter => parameter.value === 'offset');
132
+ if (offsetParam !== undefined) {
133
+ const uniformPosition = gl.getUniformLocation(shaderProgram, offsetParam.name);
134
+ gl.uniform2fv(uniformPosition, [offsetX, offsetY]);
135
+
136
+ // If the offset is not passed to the shader, rerendering cannot change the output.
137
+ requestRender();
138
+ }
139
+ }
140
+
141
+ async function updateScale(scale: number) {
142
+ const { gl, shaderProgram } = await configPromise;
143
+
144
+ const scaleParam = parameters.find((parameter): parameter is BuiltinParameter => parameter.value === 'scale');
145
+ if (scaleParam !== undefined) {
146
+ const uniformPosition = gl.getUniformLocation(shaderProgram, scaleParam.name);
147
+ gl.uniform1f(uniformPosition, scale);
148
+
149
+ // If the scale is not passed to the shader, rerendering cannot change the output.
150
+ requestRender();
151
+ }
152
+ }
153
+
154
+ async function updateTime(time: number) {
155
+ const { gl, shaderProgram } = await configPromise;
156
+
157
+ const timeParam = parameters.find((parameter): parameter is BuiltinParameter => parameter.value === 'time');
158
+ if (timeParam !== undefined) {
159
+ const uniformPosition = gl.getUniformLocation(shaderProgram, timeParam.name);
160
+ gl.uniform1f(uniformPosition, time);
161
+ }
162
+ }
163
+
164
+ function isBuiltinParameter(parameter: Parameter): parameter is BuiltinParameter {
165
+ const shouldBeBuiltin = typeof parameter.value === 'string';
166
+ if (!shouldBeBuiltin) return false;
167
+
168
+ if (isBuiltinValue(parameter.value)) return true;
169
+
170
+ throw new Error(`Unknown built-in value: ${parameter.value}`);
171
+ }
172
+
173
+ async function updateParameters(nextParameters: readonly Parameter[]) {
174
+ const { gl, shaderProgram } = await configPromise;
175
+
176
+ for (const parameter of nextParameters) {
177
+ if (parameter.value === undefined) throw new Error('One or more parameters had an undefined value field.');
178
+
179
+ if (!isBuiltinParameter(parameter)) {
180
+ const uniformPosition = gl.getUniformLocation(shaderProgram, parameter.name);
181
+ switch (parameter.type) {
182
+ case 'float':
183
+ gl.uniform1f(uniformPosition, parameter.value);
184
+ break;
185
+ case 'vec2':
186
+ gl.uniform2fv(uniformPosition, parameter.value);
187
+ break;
188
+ case 'vec3':
189
+ gl.uniform3fv(uniformPosition, parameter.value);
190
+ break;
191
+ case 'vec4':
192
+ gl.uniform4fv(uniformPosition, parameter.value);
193
+ break;
194
+ case 'int':
195
+ gl.uniform1i(uniformPosition, parameter.value);
196
+ break;
197
+ case 'ivec2':
198
+ gl.uniform2iv(uniformPosition, parameter.value);
199
+ break;
200
+ case 'ivec3':
201
+ gl.uniform3iv(uniformPosition, parameter.value);
202
+ break;
203
+ case 'ivec4':
204
+ gl.uniform4iv(uniformPosition, parameter.value);
205
+ break;
206
+ case 'uint':
207
+ gl.uniform1ui(uniformPosition, parameter.value);
208
+ break;
209
+ case 'uvec2':
210
+ gl.uniform2uiv(uniformPosition, parameter.value);
211
+ break;
212
+ case 'uvec3':
213
+ gl.uniform3uiv(uniformPosition, parameter.value);
214
+ break;
215
+ case 'uvec4':
216
+ gl.uniform4uiv(uniformPosition, parameter.value);
217
+ break;
218
+ case 'mat2':
219
+ gl.uniformMatrix2fv(uniformPosition, false, parameter.value);
220
+ break;
221
+ case 'mat3':
222
+ gl.uniformMatrix3fv(uniformPosition, false, parameter.value);
223
+ break;
224
+ case 'mat4':
225
+ gl.uniformMatrix4fv(uniformPosition, false, parameter.value);
226
+ break;
227
+ default:
228
+ throw new Error(`Unknown parameter type: ${(parameter as { type: string }).type}`);
229
+ }
230
+ }
231
+ }
232
+
233
+ requestRender();
234
+ }
235
+
236
+ $effect(() => {
237
+ updateParameters(parameters);
238
+ });
239
+ </script>
240
+
241
+ <BaseShader
242
+ {width}
243
+ {height}
244
+ {canRender}
245
+ maxSize={maxTextureSize}
246
+ offsetFromBottom
247
+ {rerenderEveryFrame}
248
+ {forceAnimation}
249
+ {render}
250
+ {updateCanvasSize}
251
+ {updateContainerSize}
252
+ {updateOffset}
253
+ {updateScale}
254
+ {updateTime}
255
+ bind:canvasElement
256
+ bind:requestRender
257
+ >
258
+ {@render children?.()}
259
+ </BaseShader>
@@ -0,0 +1,15 @@
1
+ export type { BuiltinValue, BuiltinParameter, NonBuiltinParameter, WebGlParameter as Parameter } from './types.js';
2
+ import type { Snippet } from 'svelte';
3
+ import type { WebGlParameter as Parameter } from './types.js';
4
+ type Props = {
5
+ width?: string;
6
+ height?: string;
7
+ code: string | Promise<string>;
8
+ parameters?: readonly Parameter[];
9
+ forceAnimation?: boolean;
10
+ children?: Snippet;
11
+ };
12
+ declare const WebGlShader: import("svelte").Component<Props, {}, "">;
13
+ type WebGlShader = ReturnType<typeof WebGlShader>;
14
+ export default WebGlShader;
15
+ //# sourceMappingURL=WebGlShader.svelte.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"WebGlShader.svelte.d.ts","sourceRoot":"","sources":["../../../../src/lib/components/shader/WebGlShader.svelte.ts"],"names":[],"mappings":"AAGE,YAAY,EAAE,YAAY,EAAE,gBAAgB,EAAE,mBAAmB,EAAE,cAAc,IAAI,SAAS,EAAE,MAAM,YAAY,CAAC;AAIrH,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,QAAQ,CAAC;AAGtC,OAAO,KAAK,EAAoB,cAAc,IAAI,SAAS,EAAE,MAAM,YAAY,CAAC;AAI9E,KAAK,KAAK,GAAG;IACX,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC,CAAC;IAC/B,UAAU,CAAC,EAAE,SAAS,SAAS,EAAE,CAAC;IAClC,cAAc,CAAC,EAAE,OAAO,CAAC;IACzB,QAAQ,CAAC,EAAE,OAAO,CAAC;CACpB,CAAC;AA8OJ,QAAA,MAAM,WAAW,2CAAwC,CAAC;AAC1D,KAAK,WAAW,GAAG,UAAU,CAAC,OAAO,WAAW,CAAC,CAAC;AAClD,eAAe,WAAW,CAAC"}