@genart-dev/components 0.1.0
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.
- package/dist/index.cjs +3985 -0
- package/dist/index.cjs.map +1 -0
- package/dist/index.d.cts +60 -0
- package/dist/index.d.ts +60 -0
- package/dist/index.js +3963 -0
- package/dist/index.js.map +1 -0
- package/package.json +69 -0
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/index.ts","../src/components/js/index.ts","../src/components/js/prng.ts","../src/components/js/prng-utils.ts","../src/components/js/noise-2d.ts","../src/components/js/noise-3d.ts","../src/components/js/noise-4d.ts","../src/components/js/worley.ts","../src/components/js/curl.ts","../src/components/js/math.ts","../src/components/js/math-advanced.ts","../src/components/js/easing.ts","../src/components/js/color.ts","../src/components/js/color-advanced.ts","../src/components/js/vector.ts","../src/components/js/matrix.ts","../src/components/js/grid.ts","../src/components/js/grid-advanced.ts","../src/components/js/particle.ts","../src/components/js/particle-forces.ts","../src/components/js/shape.ts","../src/components/js/shape-advanced.ts","../src/components/js/distribution.ts","../src/components/js/distribution-advanced.ts","../src/components/js/physics-spring.ts","../src/components/js/physics-verlet.ts","../src/components/js/physics-rk4.ts","../src/components/js/flow-field.ts","../src/components/js/l-system.ts","../src/components/js/reaction-diffusion.ts","../src/components/js/dla.ts","../src/components/js/boids.ts","../src/components/js/wave.ts","../src/components/js/animation.ts","../src/components/js/quadtree.ts","../src/components/js/spatial-hash.ts","../src/components/js/turtle.ts","../src/components/js/svg-path.ts","../src/components/js/canvas-utils.ts","../src/components/glsl/index.ts","../src/components/glsl/noise.ts","../src/components/glsl/noise-3d.ts","../src/components/glsl/noise-4d.ts","../src/components/glsl/curl.ts","../src/components/glsl/sdf.ts","../src/components/glsl/sdf-3d.ts","../src/components/glsl/color.ts","../src/components/glsl/pattern.ts","../src/components/glsl/transform.ts","../src/components/glsl/math.ts","../src/components/glsl/easing.ts","../src/components/glsl/blend.ts","../src/components/glsl/lighting.ts","../src/components/glsl/ray.ts","../src/components/glsl/post.ts","../src/components/glsl/shape.ts","../src/components/glsl/domain.ts","../src/components/glsl/gradient.ts","../src/registry.ts","../src/resolver.ts"],"sourcesContent":["// Types\nexport type {\n ComponentEntry,\n ComponentCategory,\n RendererTarget,\n ResolvedComponent,\n} from \"./types.js\";\n\n// Registry\nexport { COMPONENT_REGISTRY } from \"./registry.js\";\n\n// Resolver\nexport { resolveComponents } from \"./resolver.js\";\n","export { default as prng } from \"./prng.js\";\nexport { default as prngUtils } from \"./prng-utils.js\";\nexport { default as noise2d } from \"./noise-2d.js\";\nexport { default as noise3d } from \"./noise-3d.js\";\nexport { default as noise4d } from \"./noise-4d.js\";\nexport { default as worley } from \"./worley.js\";\nexport { default as curl } from \"./curl.js\";\nexport { default as math } from \"./math.js\";\nexport { default as mathAdvanced } from \"./math-advanced.js\";\nexport { default as easing } from \"./easing.js\";\nexport { default as color } from \"./color.js\";\nexport { default as colorAdvanced } from \"./color-advanced.js\";\nexport { default as vector } from \"./vector.js\";\nexport { default as matrix } from \"./matrix.js\";\nexport { default as grid } from \"./grid.js\";\nexport { default as gridAdvanced } from \"./grid-advanced.js\";\nexport { default as particle } from \"./particle.js\";\nexport { default as particleForces } from \"./particle-forces.js\";\nexport { default as shape } from \"./shape.js\";\nexport { default as shapeAdvanced } from \"./shape-advanced.js\";\nexport { default as distribution } from \"./distribution.js\";\nexport { default as distributionAdvanced } from \"./distribution-advanced.js\";\nexport { default as physicsSpring } from \"./physics-spring.js\";\nexport { default as physicsVerlet } from \"./physics-verlet.js\";\nexport { default as physicsRk4 } from \"./physics-rk4.js\";\nexport { default as flowField } from \"./flow-field.js\";\nexport { default as lSystem } from \"./l-system.js\";\nexport { default as reactionDiffusion } from \"./reaction-diffusion.js\";\nexport { default as dla } from \"./dla.js\";\nexport { default as boids } from \"./boids.js\";\nexport { default as wave } from \"./wave.js\";\nexport { default as animation } from \"./animation.js\";\nexport { default as quadtree } from \"./quadtree.js\";\nexport { default as spatialHash } from \"./spatial-hash.js\";\nexport { default as turtle } from \"./turtle.js\";\nexport { default as svgPath } from \"./svg-path.js\";\nexport { default as canvasUtils } from \"./canvas-utils.js\";\n","import type { ComponentEntry } from \"../../types.js\";\n\nconst prng: ComponentEntry = {\n name: \"prng\",\n version: \"1.0.0\",\n category: \"randomness\",\n target: \"js\",\n renderers: [],\n code: `\\\nfunction mulberry32(a) {\n return function() {\n a |= 0; a = a + 0x6D2B79F5 | 0;\n var t = Math.imul(a ^ a >>> 15, 1 | a);\n t = t + Math.imul(t ^ t >>> 7, 61 | t) ^ t;\n return ((t ^ t >>> 14) >>> 0) / 4294967296;\n };\n}\n\nfunction sfc32(a, b, c, d) {\n return function() {\n a |= 0; b |= 0; c |= 0; d |= 0;\n var t = (a + b | 0) + d | 0;\n d = d + 1 | 0; a = b ^ (b >>> 9);\n b = c + (c << 3) | 0; c = (c << 21 | c >>> 11);\n c = c + t | 0;\n return (t >>> 0) / 4294967296;\n };\n}\n`,\n exports: [\"mulberry32\", \"sfc32\"],\n dependencies: [],\n description: \"Seeded pseudo-random number generators (mulberry32, sfc32).\",\n usage: `\\\n### prng — Seeded PRNGs\n\n\\`\\`\\`js\nconst rng = mulberry32(state.SEED);\nrng(); // → 0.0–1.0\n\\`\\`\\`\n\n- **mulberry32(seed)** — fast 32-bit PRNG, good for most use cases\n- **sfc32(a, b, c, d)** — higher quality, 4 seeds, passes PractRand\n`,\n};\n\nexport default prng;\n","import type { ComponentEntry } from \"../../types.js\";\n\nconst prngUtils: ComponentEntry = {\n name: \"prng-utils\",\n version: \"1.0.0\",\n category: \"randomness\",\n target: \"js\",\n renderers: [],\n code: `\\\nfunction randomInt(rng, min, max) {\n return Math.floor(rng() * (max - min + 1)) + min;\n}\n\nfunction randomFloat(rng, min, max) {\n return rng() * (max - min) + min;\n}\n\nfunction randomGaussian(rng) {\n var u = 0, v = 0;\n while (u === 0) u = rng();\n while (v === 0) v = rng();\n return Math.sqrt(-2.0 * Math.log(u)) * Math.cos(2.0 * Math.PI * v);\n}\n\nfunction randomChoice(rng, arr) {\n return arr[Math.floor(rng() * arr.length)];\n}\n\nfunction shuffle(rng, arr) {\n var a = arr.slice();\n for (var i = a.length - 1; i > 0; i--) {\n var j = Math.floor(rng() * (i + 1));\n var tmp = a[i]; a[i] = a[j]; a[j] = tmp;\n }\n return a;\n}\n\nfunction weightedChoice(rng, items, weights) {\n var total = 0;\n for (var i = 0; i < weights.length; i++) total += weights[i];\n var r = rng() * total;\n for (var i = 0; i < items.length; i++) {\n r -= weights[i];\n if (r <= 0) return items[i];\n }\n return items[items.length - 1];\n}\n`,\n exports: [\"randomInt\", \"randomFloat\", \"randomGaussian\", \"randomChoice\", \"shuffle\", \"weightedChoice\"],\n dependencies: [\"prng\"],\n description: \"RNG convenience wrappers (randomInt, randomFloat, shuffle, etc.).\",\n usage: `\\\n### prng-utils — RNG Convenience Wrappers\n\n\\`\\`\\`js\nconst rng = mulberry32(state.SEED);\nrandomInt(rng, 1, 10); // → integer in [1, 10]\nrandomFloat(rng, -1, 1); // → float in [-1, 1)\nrandomGaussian(rng); // → normally distributed float\nrandomChoice(rng, ['a','b']); // → random element\nshuffle(rng, [1,2,3,4]); // → shuffled copy\n\\`\\`\\`\n`,\n};\n\nexport default prngUtils;\n","import type { ComponentEntry } from \"../../types.js\";\n\nconst noise2d: ComponentEntry = {\n name: \"noise-2d\",\n version: \"1.0.0\",\n category: \"noise\",\n target: \"js\",\n renderers: [],\n code: `\\\nfunction perlin2D(rng) {\n var perm = new Uint8Array(512);\n for (var i = 0; i < 256; i++) perm[i] = i;\n for (var i = 255; i > 0; i--) {\n var j = Math.floor(rng() * (i + 1));\n var tmp = perm[i]; perm[i] = perm[j]; perm[j] = tmp;\n }\n for (var i = 0; i < 256; i++) perm[256 + i] = perm[i];\n function fade(t) { return t * t * t * (t * (t * 6 - 15) + 10); }\n function grad(hash, x, y) {\n var h = hash & 3;\n return ((h & 1) ? -x : x) + ((h & 2) ? -y : y);\n }\n return function(x, y) {\n var xi = Math.floor(x) & 255, yi = Math.floor(y) & 255;\n var xf = x - Math.floor(x), yf = y - Math.floor(y);\n var u = fade(xf), v = fade(yf);\n var a0 = perm[xi] + yi, a1 = perm[xi + 1] + yi;\n var aa = grad(perm[a0], xf, yf), ba = grad(perm[a1], xf - 1, yf);\n var ab = grad(perm[a0 + 1], xf, yf - 1), bb = grad(perm[a1 + 1], xf - 1, yf - 1);\n var x1 = aa + u * (ba - aa), x2 = ab + u * (bb - ab);\n return (x1 + v * (x2 - x1) + 1) / 2;\n };\n}\n\nfunction simplex2D(rng) {\n var perm = new Uint8Array(512);\n for (var i = 0; i < 256; i++) perm[i] = i;\n for (var i = 255; i > 0; i--) {\n var j = Math.floor(rng() * (i + 1));\n var tmp = perm[i]; perm[i] = perm[j]; perm[j] = tmp;\n }\n for (var i = 0; i < 256; i++) perm[256 + i] = perm[i];\n var grad2 = [[1,1],[-1,1],[1,-1],[-1,-1],[1,0],[-1,0],[0,1],[0,-1]];\n var F2 = 0.5 * (Math.sqrt(3) - 1), G2 = (3 - Math.sqrt(3)) / 6;\n return function(x, y) {\n var s = (x + y) * F2;\n var i = Math.floor(x + s), j = Math.floor(y + s);\n var t = (i + j) * G2;\n var x0 = x - (i - t), y0 = y - (j - t);\n var i1 = x0 > y0 ? 1 : 0, j1 = x0 > y0 ? 0 : 1;\n var x1 = x0 - i1 + G2, y1 = y0 - j1 + G2;\n var x2 = x0 - 1 + 2 * G2, y2 = y0 - 1 + 2 * G2;\n var ii = i & 255, jj = j & 255;\n function contrib(gx, gy, px, py) {\n var t2 = 0.5 - px * px - py * py;\n if (t2 < 0) return 0;\n t2 *= t2;\n return t2 * t2 * (gx * px + gy * py);\n }\n var g0 = grad2[perm[ii + perm[jj]] & 7];\n var g1 = grad2[perm[ii + i1 + perm[jj + j1]] & 7];\n var g2 = grad2[perm[ii + 1 + perm[jj + 1]] & 7];\n return 0.5 + 35 * (contrib(g0[0], g0[1], x0, y0) + contrib(g1[0], g1[1], x1, y1) + contrib(g2[0], g2[1], x2, y2));\n };\n}\n\nfunction valueNoise2D(rng) {\n var values = new Float64Array(256);\n for (var i = 0; i < 256; i++) values[i] = rng();\n function hash(x, y) {\n return values[((x * 374761393 + y * 668265263) & 0x7fffffff) % 256];\n }\n return function(x, y) {\n var ix = Math.floor(x), iy = Math.floor(y);\n var fx = x - ix, fy = y - iy;\n fx = fx * fx * (3 - 2 * fx);\n fy = fy * fy * (3 - 2 * fy);\n var a = hash(ix, iy), b = hash(ix + 1, iy);\n var c = hash(ix, iy + 1), d = hash(ix + 1, iy + 1);\n return a + fx * (b - a) + fy * (c - a) + fx * fy * (a - b - c + d);\n };\n}\n\nfunction fbm2D(noiseFn, octaves, lacunarity, gain) {\n octaves = octaves || 6; lacunarity = lacunarity || 2; gain = gain || 0.5;\n return function(x, y) {\n var val = 0, amp = 1, freq = 1, mx = 0;\n for (var o = 0; o < octaves; o++) {\n val += amp * noiseFn(x * freq, y * freq);\n mx += amp;\n amp *= gain;\n freq *= lacunarity;\n }\n return val / mx;\n };\n}\n`,\n exports: [\"perlin2D\", \"simplex2D\", \"valueNoise2D\", \"fbm2D\"],\n dependencies: [\"prng\"],\n description: \"2D noise functions (Perlin, simplex, value) and fBm.\",\n usage: `\\\n### noise-2d — 2D Noise Functions\n\n\\`\\`\\`js\nvar rng = mulberry32(state.SEED);\nvar noise = perlin2D(rng);\nnoise(x * 0.01, y * 0.01); // → 0.0–1.0\n\nvar fbm = fbm2D(noise, 6, 2, 0.5);\nfbm(x * 0.01, y * 0.01); // → fractal noise\n\\`\\`\\`\n`,\n};\n\nexport default noise2d;\n","import type { ComponentEntry } from \"../../types.js\";\n\nconst noise3d: ComponentEntry = {\n name: \"noise-3d\",\n version: \"1.0.0\",\n category: \"noise\",\n target: \"js\",\n renderers: [],\n code: `\\\nfunction perlin3D(rng) {\n var perm = new Uint8Array(512);\n for (var i = 0; i < 256; i++) perm[i] = i;\n for (var i = 255; i > 0; i--) {\n var j = Math.floor(rng() * (i + 1));\n var tmp = perm[i]; perm[i] = perm[j]; perm[j] = tmp;\n }\n for (var i = 0; i < 256; i++) perm[256 + i] = perm[i];\n function fade(t) { return t * t * t * (t * (t * 6 - 15) + 10); }\n function grad(hash, x, y, z) {\n var h = hash & 15;\n var u = h < 8 ? x : y;\n var v = h < 4 ? y : (h === 12 || h === 14 ? x : z);\n return ((h & 1) ? -u : u) + ((h & 2) ? -v : v);\n }\n return function(x, y, z) {\n var xi = Math.floor(x) & 255, yi = Math.floor(y) & 255, zi = Math.floor(z) & 255;\n var xf = x - Math.floor(x), yf = y - Math.floor(y), zf = z - Math.floor(z);\n var u = fade(xf), v = fade(yf), w = fade(zf);\n var a = perm[xi]+yi, aa = perm[a]+zi, ab = perm[a+1]+zi;\n var b = perm[xi+1]+yi, ba = perm[b]+zi, bb = perm[b+1]+zi;\n return (\n lerp(\n lerp(lerp(grad(perm[aa],xf,yf,zf), grad(perm[ba],xf-1,yf,zf),u),\n lerp(grad(perm[ab],xf,yf-1,zf), grad(perm[bb],xf-1,yf-1,zf),u),v),\n lerp(lerp(grad(perm[aa+1],xf,yf,zf-1), grad(perm[ba+1],xf-1,yf,zf-1),u),\n lerp(grad(perm[ab+1],xf,yf-1,zf-1), grad(perm[bb+1],xf-1,yf-1,zf-1),u),v),\n w) + 1) / 2;\n };\n function lerp(a, b, t) { return a + t * (b - a); }\n}\n\nfunction simplex3D(rng) {\n var perm = new Uint8Array(512);\n for (var i = 0; i < 256; i++) perm[i] = i;\n for (var i = 255; i > 0; i--) {\n var j = Math.floor(rng() * (i + 1));\n var tmp = perm[i]; perm[i] = perm[j]; perm[j] = tmp;\n }\n for (var i = 0; i < 256; i++) perm[256 + i] = perm[i];\n var grad3 = [[1,1,0],[-1,1,0],[1,-1,0],[-1,-1,0],[1,0,1],[-1,0,1],[1,0,-1],[-1,0,-1],[0,1,1],[0,-1,1],[0,1,-1],[0,-1,-1]];\n var F3 = 1/3, G3 = 1/6;\n return function(x, y, z) {\n var s = (x+y+z)*F3;\n var i=Math.floor(x+s), j=Math.floor(y+s), k=Math.floor(z+s);\n var t = (i+j+k)*G3;\n var x0=x-(i-t), y0=y-(j-t), z0=z-(k-t);\n var i1,j1,k1,i2,j2,k2;\n if (x0>=y0) { if (y0>=z0) {i1=1;j1=0;k1=0;i2=1;j2=1;k2=0;} else if (x0>=z0) {i1=1;j1=0;k1=0;i2=1;j2=0;k2=1;} else {i1=0;j1=0;k1=1;i2=1;j2=0;k2=1;} }\n else { if (y0<z0) {i1=0;j1=0;k1=1;i2=0;j2=1;k2=1;} else if (x0<z0) {i1=0;j1=1;k1=0;i2=0;j2=1;k2=1;} else {i1=0;j1=1;k1=0;i2=1;j2=1;k2=0;} }\n var x1=x0-i1+G3, y1=y0-j1+G3, z1=z0-k1+G3;\n var x2=x0-i2+2*G3, y2=y0-j2+2*G3, z2=z0-k2+2*G3;\n var x3=x0-1+3*G3, y3=y0-1+3*G3, z3=z0-1+3*G3;\n var ii=i&255, jj=j&255, kk=k&255;\n function c(g, px, py, pz) { var t2=0.6-px*px-py*py-pz*pz; return t2<0?0:(t2*=t2, t2*t2*(g[0]*px+g[1]*py+g[2]*pz)); }\n var n = c(grad3[perm[ii+perm[jj+perm[kk]]]%12], x0,y0,z0) + c(grad3[perm[ii+i1+perm[jj+j1+perm[kk+k1]]]%12], x1,y1,z1) + c(grad3[perm[ii+i2+perm[jj+j2+perm[kk+k2]]]%12], x2,y2,z2) + c(grad3[perm[ii+1+perm[jj+1+perm[kk+1]]]%12], x3,y3,z3);\n return 0.5 + 16 * n;\n };\n}\n\nfunction fbm3D(noiseFn, octaves, lacunarity, gain) {\n octaves = octaves || 6; lacunarity = lacunarity || 2; gain = gain || 0.5;\n return function(x, y, z) {\n var val = 0, amp = 1, freq = 1, mx = 0;\n for (var o = 0; o < octaves; o++) {\n val += amp * noiseFn(x * freq, y * freq, z * freq);\n mx += amp; amp *= gain; freq *= lacunarity;\n }\n return val / mx;\n };\n}\n`,\n exports: [\"perlin3D\", \"simplex3D\", \"fbm3D\"],\n dependencies: [\"prng\"],\n description: \"3D noise functions (Perlin, simplex) and fBm.\",\n usage: `\\\n### noise-3d — 3D Noise Functions\n\n\\`\\`\\`js\nvar noise = perlin3D(rng);\nnoise(x, y, z); // → 0.0–1.0\nvar fbm = fbm3D(noise, 6);\n\\`\\`\\`\n`,\n};\n\nexport default noise3d;\n","import type { ComponentEntry } from \"../../types.js\";\n\nconst noise4d: ComponentEntry = {\n name: \"noise-4d\",\n version: \"1.0.0\",\n category: \"noise\",\n target: \"js\",\n renderers: [],\n code: `\\\nfunction simplex4D(rng) {\n var perm = new Uint8Array(512);\n for (var i = 0; i < 256; i++) perm[i] = i;\n for (var i = 255; i > 0; i--) {\n var j = Math.floor(rng() * (i + 1));\n var tmp = perm[i]; perm[i] = perm[j]; perm[j] = tmp;\n }\n for (var i = 0; i < 256; i++) perm[256 + i] = perm[i];\n var grad4 = [[0,1,1,1],[0,1,1,-1],[0,1,-1,1],[0,1,-1,-1],[0,-1,1,1],[0,-1,1,-1],[0,-1,-1,1],[0,-1,-1,-1],\n [1,0,1,1],[1,0,1,-1],[1,0,-1,1],[1,0,-1,-1],[-1,0,1,1],[-1,0,1,-1],[-1,0,-1,1],[-1,0,-1,-1],\n [1,1,0,1],[1,1,0,-1],[1,-1,0,1],[1,-1,0,-1],[-1,1,0,1],[-1,1,0,-1],[-1,-1,0,1],[-1,-1,0,-1],\n [1,1,1,0],[1,1,-1,0],[1,-1,1,0],[1,-1,-1,0],[-1,1,1,0],[-1,1,-1,0],[-1,-1,1,0],[-1,-1,-1,0]];\n var F4 = (Math.sqrt(5) - 1) / 4, G4 = (5 - Math.sqrt(5)) / 20;\n return function(x, y, z, w) {\n var s = (x+y+z+w) * F4;\n var i=Math.floor(x+s), j=Math.floor(y+s), k=Math.floor(z+s), l=Math.floor(w+s);\n var t = (i+j+k+l) * G4;\n var x0=x-(i-t), y0=y-(j-t), z0=z-(k-t), w0=w-(l-t);\n var rankx=0,ranky=0,rankz=0,rankw=0;\n if(x0>y0)rankx++;else ranky++;\n if(x0>z0)rankx++;else rankz++;\n if(x0>w0)rankx++;else rankw++;\n if(y0>z0)ranky++;else rankz++;\n if(y0>w0)ranky++;else rankw++;\n if(z0>w0)rankz++;else rankw++;\n var i1=rankx>=3?1:0,j1=ranky>=3?1:0,k1=rankz>=3?1:0,l1=rankw>=3?1:0;\n var i2=rankx>=2?1:0,j2=ranky>=2?1:0,k2=rankz>=2?1:0,l2=rankw>=2?1:0;\n var i3=rankx>=1?1:0,j3=ranky>=1?1:0,k3=rankz>=1?1:0,l3=rankw>=1?1:0;\n var x1=x0-i1+G4,y1=y0-j1+G4,z1=z0-k1+G4,w1=w0-l1+G4;\n var x2=x0-i2+2*G4,y2=y0-j2+2*G4,z2=z0-k2+2*G4,w2=w0-l2+2*G4;\n var x3=x0-i3+3*G4,y3=y0-j3+3*G4,z3=z0-k3+3*G4,w3=w0-l3+3*G4;\n var x4=x0-1+4*G4,y4=y0-1+4*G4,z4=z0-1+4*G4,w4=w0-1+4*G4;\n var ii=i&255,jj=j&255,kk=k&255,ll=l&255;\n function c(g,px,py,pz,pw){var t2=0.6-px*px-py*py-pz*pz-pw*pw;return t2<0?0:(t2*=t2,t2*t2*(g[0]*px+g[1]*py+g[2]*pz+g[3]*pw));}\n var n = c(grad4[perm[ii+perm[jj+perm[kk+perm[ll]]]]&31],x0,y0,z0,w0)\n + c(grad4[perm[ii+i1+perm[jj+j1+perm[kk+k1+perm[ll+l1]]]]&31],x1,y1,z1,w1)\n + c(grad4[perm[ii+i2+perm[jj+j2+perm[kk+k2+perm[ll+l2]]]]&31],x2,y2,z2,w2)\n + c(grad4[perm[ii+i3+perm[jj+j3+perm[kk+k3+perm[ll+l3]]]]&31],x3,y3,z3,w3)\n + c(grad4[perm[ii+1+perm[jj+1+perm[kk+1+perm[ll+1]]]]&31],x4,y4,z4,w4);\n return 0.5 + 13.5 * n;\n };\n}\n`,\n exports: [\"simplex4D\"],\n dependencies: [\"prng\"],\n description: \"4D simplex noise for loopable animations.\",\n usage: `\\\n### noise-4d — 4D Simplex Noise\n\n\\`\\`\\`js\nvar noise = simplex4D(rng);\n// Loopable: map time to a circle in 4D\nvar nx = noise(x, y, Math.cos(t) * r, Math.sin(t) * r);\n\\`\\`\\`\n`,\n};\n\nexport default noise4d;\n","import type { ComponentEntry } from \"../../types.js\";\n\nconst worley: ComponentEntry = {\n name: \"worley\",\n version: \"1.0.0\",\n category: \"noise\",\n target: \"js\",\n renderers: [],\n code: `\\\nfunction worley2D(rng) {\n var cache = {};\n function cellPoint(ix, iy) {\n var key = ix + ',' + iy;\n if (!cache[key]) {\n var a = ix * 374761393 + iy * 668265263;\n a = (a ^ (a >> 13)) * 1274126177;\n var seed = ((a ^ (a >> 16)) >>> 0);\n var r = mulberry32(seed ^ Math.floor(rng() * 0x7fffffff));\n cache[key] = [ix + r(), iy + r()];\n }\n return cache[key];\n }\n return function(x, y) {\n var ix = Math.floor(x), iy = Math.floor(y);\n var minDist = 1e10;\n for (var dx = -1; dx <= 1; dx++) {\n for (var dy = -1; dy <= 1; dy++) {\n var p = cellPoint(ix + dx, iy + dy);\n var d = (x - p[0]) * (x - p[0]) + (y - p[1]) * (y - p[1]);\n if (d < minDist) minDist = d;\n }\n }\n return Math.sqrt(minDist);\n };\n}\n\nfunction worley3D(rng) {\n var cache = {};\n function cellPoint(ix, iy, iz) {\n var key = ix + ',' + iy + ',' + iz;\n if (!cache[key]) {\n var a = ix * 374761393 + iy * 668265263 + iz * 1274126177;\n a = (a ^ (a >> 13)) * 1103515245;\n var seed = ((a ^ (a >> 16)) >>> 0);\n var r = mulberry32(seed ^ Math.floor(rng() * 0x7fffffff));\n cache[key] = [ix + r(), iy + r(), iz + r()];\n }\n return cache[key];\n }\n return function(x, y, z) {\n var ix = Math.floor(x), iy = Math.floor(y), iz = Math.floor(z);\n var minDist = 1e10;\n for (var dx = -1; dx <= 1; dx++)\n for (var dy = -1; dy <= 1; dy++)\n for (var dz = -1; dz <= 1; dz++) {\n var p = cellPoint(ix + dx, iy + dy, iz + dz);\n var d = (x-p[0])*(x-p[0]) + (y-p[1])*(y-p[1]) + (z-p[2])*(z-p[2]);\n if (d < minDist) minDist = d;\n }\n return Math.sqrt(minDist);\n };\n}\n`,\n exports: [\"worley2D\", \"worley3D\"],\n dependencies: [\"prng\"],\n description: \"Worley/cellular noise (2D and 3D).\",\n usage: `\\\n### worley — Cellular Noise\n\n\\`\\`\\`js\nvar w = worley2D(rng);\nw(x * 5, y * 5); // → distance to nearest cell point\n\\`\\`\\`\n`,\n};\n\nexport default worley;\n","import type { ComponentEntry } from \"../../types.js\";\n\nconst curl: ComponentEntry = {\n name: \"curl\",\n version: \"1.0.0\",\n category: \"noise\",\n target: \"js\",\n renderers: [],\n code: `\\\nfunction curlNoise2D(noiseFn, eps) {\n eps = eps || 0.001;\n return function(x, y) {\n var dndx = (noiseFn(x + eps, y) - noiseFn(x - eps, y)) / (2 * eps);\n var dndy = (noiseFn(x, y + eps) - noiseFn(x, y - eps)) / (2 * eps);\n return [dndy, -dndx];\n };\n}\n\nfunction curlNoise3D(noiseFnX, noiseFnY, noiseFnZ, eps) {\n eps = eps || 0.001;\n return function(x, y, z) {\n var dzdy = (noiseFnZ(x, y + eps, z) - noiseFnZ(x, y - eps, z)) / (2 * eps);\n var dydz = (noiseFnY(x, y, z + eps) - noiseFnY(x, y, z - eps)) / (2 * eps);\n var dxdz = (noiseFnX(x, y, z + eps) - noiseFnX(x, y, z - eps)) / (2 * eps);\n var dzdx = (noiseFnZ(x + eps, y, z) - noiseFnZ(x - eps, y, z)) / (2 * eps);\n var dydx = (noiseFnY(x + eps, y, z) - noiseFnY(x - eps, y, z)) / (2 * eps);\n var dxdy = (noiseFnX(x, y + eps, z) - noiseFnX(x, y - eps, z)) / (2 * eps);\n return [dzdy - dydz, dxdz - dzdx, dydx - dxdy];\n };\n}\n`,\n exports: [\"curlNoise2D\", \"curlNoise3D\"],\n dependencies: [\"noise-2d\", \"noise-3d\"],\n description: \"Curl noise for divergence-free flow fields.\",\n usage: `\\\n### curl — Curl Noise\n\n\\`\\`\\`js\nvar noise = perlin2D(rng);\nvar curl = curlNoise2D(noise);\nvar [vx, vy] = curl(x, y); // divergence-free velocity\n\\`\\`\\`\n`,\n};\n\nexport default curl;\n","import type { ComponentEntry } from \"../../types.js\";\n\nconst math: ComponentEntry = {\n name: \"math\",\n version: \"1.0.0\",\n category: \"math\",\n target: \"js\",\n renderers: [],\n code: `\\\nfunction lerp(a, b, t) { return a + t * (b - a); }\nfunction clamp(v, lo, hi) { return v < lo ? lo : v > hi ? hi : v; }\nfunction clamp01(v) { return v < 0 ? 0 : v > 1 ? 1 : v; }\nfunction remap(v, inLo, inHi, outLo, outHi) {\n return outLo + (v - inLo) / (inHi - inLo) * (outHi - outLo);\n}\nfunction smoothstep(edge0, edge1, x) {\n var t = clamp((x - edge0) / (edge1 - edge0), 0, 1);\n return t * t * (3 - 2 * t);\n}\nfunction inverseLerp(a, b, v) { return (v - a) / (b - a); }\nfunction mod(a, n) { return ((a % n) + n) % n; }\nfunction fract(x) { return x - Math.floor(x); }\nfunction sign0(x) { return x > 0 ? 1 : x < 0 ? -1 : 0; }\nfunction step(edge, x) { return x < edge ? 0 : 1; }\n`,\n exports: [\"lerp\", \"clamp\", \"clamp01\", \"remap\", \"smoothstep\", \"inverseLerp\", \"mod\", \"fract\", \"sign0\", \"step\"],\n dependencies: [],\n description: \"Core math utilities (lerp, clamp, smoothstep, remap, etc.).\",\n usage: `\\\n### math — Core Math Utilities\n\n\\`\\`\\`js\nlerp(0, 100, 0.5); // → 50\nclamp(1.5, 0, 1); // → 1\nsmoothstep(0, 1, 0.5); // → 0.5 (S-curve)\nremap(0.5, 0, 1, -10, 10); // → 0\n\\`\\`\\`\n`,\n};\n\nexport default math;\n","import type { ComponentEntry } from \"../../types.js\";\n\nconst mathAdvanced: ComponentEntry = {\n name: \"math-advanced\",\n version: \"1.0.0\",\n category: \"math\",\n target: \"js\",\n renderers: [],\n code: `\\\nvar PHI = (1 + Math.sqrt(5)) / 2;\nvar goldenRatio = PHI;\n\nfunction bezierPoint(a, b, c, d, t) {\n var t2 = t * t, t3 = t2 * t;\n var mt = 1 - t, mt2 = mt * mt, mt3 = mt2 * mt;\n return mt3 * a + 3 * mt2 * t * b + 3 * mt * t2 * c + t3 * d;\n}\n\nfunction catmullRom(p0, p1, p2, p3, t) {\n var t2 = t * t, t3 = t2 * t;\n return 0.5 * ((2 * p1) + (-p0 + p2) * t +\n (2 * p0 - 5 * p1 + 4 * p2 - p3) * t2 +\n (-p0 + 3 * p1 - 3 * p2 + p3) * t3);\n}\n\nfunction springDamper(current, target, velocity, stiffness, damping, dt) {\n var force = -stiffness * (current - target) - damping * velocity;\n velocity += force * dt;\n current += velocity * dt;\n return { value: current, velocity: velocity };\n}\n\nfunction exponentialDecay(value, target, rate, dt) {\n return target + (value - target) * Math.exp(-rate * dt);\n}\n`,\n exports: [\"bezierPoint\", \"catmullRom\", \"springDamper\", \"exponentialDecay\", \"goldenRatio\", \"PHI\"],\n dependencies: [\"math\"],\n description: \"Advanced interpolation and constants (Bezier, Catmull-Rom, spring, PHI).\",\n usage: `\\\n### math-advanced — Advanced Interpolation\n\n\\`\\`\\`js\nbezierPoint(0, 0.5, 0.5, 1, t); // cubic Bezier\ncatmullRom(p0, p1, p2, p3, t); // Catmull-Rom spline\nspringDamper(pos, target, vel, 100, 10, dt);\nexponentialDecay(current, target, 5, dt);\nPHI; // → 1.618...\n\\`\\`\\`\n`,\n};\n\nexport default mathAdvanced;\n","import type { ComponentEntry } from \"../../types.js\";\n\nconst easing: ComponentEntry = {\n name: \"easing\",\n version: \"1.0.0\",\n category: \"easing\",\n target: \"js\",\n renderers: [],\n code: `\\\nfunction easeInQuad(t) { return t * t; }\nfunction easeOutQuad(t) { return t * (2 - t); }\nfunction easeInOutQuad(t) { return t < 0.5 ? 2 * t * t : -1 + (4 - 2 * t) * t; }\nfunction easeInCubic(t) { return t * t * t; }\nfunction easeOutCubic(t) { var u = 1 - t; return 1 - u * u * u; }\nfunction easeInOutCubic(t) {\n return t < 0.5 ? 4 * t * t * t : 1 - Math.pow(-2 * t + 2, 3) / 2;\n}\nfunction easeInOutSine(t) { return -(Math.cos(Math.PI * t) - 1) / 2; }\nfunction easeInExpo(t) { return t === 0 ? 0 : Math.pow(2, 10 * t - 10); }\nfunction easeOutExpo(t) { return t === 1 ? 1 : 1 - Math.pow(2, -10 * t); }\nfunction easeOutElastic(t) {\n if (t === 0 || t === 1) return t;\n return Math.pow(2, -10 * t) * Math.sin((t * 10 - 0.75) * (2 * Math.PI / 3)) + 1;\n}\nfunction easeOutBounce(t) {\n if (t < 1 / 2.75) return 7.5625 * t * t;\n if (t < 2 / 2.75) { t -= 1.5 / 2.75; return 7.5625 * t * t + 0.75; }\n if (t < 2.5 / 2.75) { t -= 2.25 / 2.75; return 7.5625 * t * t + 0.9375; }\n t -= 2.625 / 2.75; return 7.5625 * t * t + 0.984375;\n}\nfunction spring(t, freq, decay) {\n freq = freq || 4; decay = decay || 4;\n return 1 - Math.exp(-decay * t) * Math.cos(freq * Math.PI * t);\n}\n`,\n exports: [\n \"easeInQuad\", \"easeOutQuad\", \"easeInOutQuad\",\n \"easeInCubic\", \"easeOutCubic\", \"easeInOutCubic\",\n \"easeInOutSine\", \"easeInExpo\", \"easeOutExpo\",\n \"easeOutElastic\", \"easeOutBounce\", \"spring\",\n ],\n dependencies: [],\n description: \"Easing functions for smooth animations (0→1 domain).\",\n usage: `\\\n### easing — Easing Functions\n\n\\`\\`\\`js\neaseInOutCubic(t); // smooth S-curve\neaseOutElastic(t); // springy overshoot\neaseOutBounce(t); // bouncing effect\nspring(t, 4, 4); // damped spring\n\\`\\`\\`\n`,\n};\n\nexport default easing;\n","import type { ComponentEntry } from \"../../types.js\";\n\nconst color: ComponentEntry = {\n name: \"color\",\n version: \"1.0.0\",\n category: \"color\",\n target: \"js\",\n renderers: [],\n code: `\\\nfunction hexToRgb(hex) {\n var n = parseInt(hex.charAt(0) === '#' ? hex.slice(1) : hex, 16);\n return [(n >> 16) & 255, (n >> 8) & 255, n & 255];\n}\n\nfunction rgbToHex(r, g, b) {\n return '#' + ((1 << 24) + (r << 16) + (g << 8) + b).toString(16).slice(1);\n}\n\nfunction hslToRgb(h, s, l) {\n h = h / 360; s = s / 100; l = l / 100;\n if (s === 0) { var v = Math.round(l * 255); return [v, v, v]; }\n function hue2rgb(p, q, t) {\n if (t < 0) t += 1; if (t > 1) t -= 1;\n if (t < 1/6) return p + (q - p) * 6 * t;\n if (t < 1/2) return q;\n if (t < 2/3) return p + (q - p) * (2/3 - t) * 6;\n return p;\n }\n var q = l < 0.5 ? l * (1 + s) : l + s - l * s;\n var p = 2 * l - q;\n return [\n Math.round(hue2rgb(p, q, h + 1/3) * 255),\n Math.round(hue2rgb(p, q, h) * 255),\n Math.round(hue2rgb(p, q, h - 1/3) * 255)\n ];\n}\n\nfunction rgbToHsl(r, g, b) {\n r /= 255; g /= 255; b /= 255;\n var max = Math.max(r, g, b), min = Math.min(r, g, b);\n var h = 0, s = 0, l = (max + min) / 2;\n if (max !== min) {\n var d = max - min;\n s = l > 0.5 ? d / (2 - max - min) : d / (max + min);\n if (max === r) h = ((g - b) / d + (g < b ? 6 : 0)) / 6;\n else if (max === g) h = ((b - r) / d + 2) / 6;\n else h = ((r - g) / d + 4) / 6;\n }\n return [Math.round(h * 360), Math.round(s * 100), Math.round(l * 100)];\n}\n\nfunction lerpColor(c1, c2, t) {\n var a = hexToRgb(c1), b = hexToRgb(c2);\n return rgbToHex(\n Math.round(a[0] + (b[0] - a[0]) * t),\n Math.round(a[1] + (b[1] - a[1]) * t),\n Math.round(a[2] + (b[2] - a[2]) * t)\n );\n}\n\nfunction contrastRatio(hex1, hex2) {\n function luminance(hex) {\n var rgb = hexToRgb(hex).map(function(c) {\n c = c / 255;\n return c <= 0.03928 ? c / 12.92 : Math.pow((c + 0.055) / 1.055, 2.4);\n });\n return 0.2126 * rgb[0] + 0.7152 * rgb[1] + 0.0722 * rgb[2];\n }\n var l1 = luminance(hex1), l2 = luminance(hex2);\n var lighter = Math.max(l1, l2), darker = Math.min(l1, l2);\n return (lighter + 0.05) / (darker + 0.05);\n}\n`,\n exports: [\"hexToRgb\", \"rgbToHex\", \"hslToRgb\", \"rgbToHsl\", \"lerpColor\", \"contrastRatio\"],\n dependencies: [],\n description: \"Color space conversion (hex, RGB, HSL) and utilities.\",\n usage: `\\\n### color — Color Space Conversion\n\n\\`\\`\\`js\nhexToRgb('#ff0000'); // → [255, 0, 0]\nrgbToHex(255, 128, 0); // → '#ff8000'\nhslToRgb(200, 80, 50); // → [r, g, b]\nlerpColor('#000', '#fff', 0.5);\ncontrastRatio('#000', '#fff'); // → 21\n\\`\\`\\`\n`,\n};\n\nexport default color;\n","import type { ComponentEntry } from \"../../types.js\";\n\nconst colorAdvanced: ComponentEntry = {\n name: \"color-advanced\",\n version: \"1.0.0\",\n category: \"color\",\n target: \"js\",\n renderers: [],\n code: `\\\nfunction rgbToOklab(r, g, b) {\n r /= 255; g /= 255; b /= 255;\n var lr = r > 0.04045 ? Math.pow((r + 0.055) / 1.055, 2.4) : r / 12.92;\n var lg = g > 0.04045 ? Math.pow((g + 0.055) / 1.055, 2.4) : g / 12.92;\n var lb = b > 0.04045 ? Math.pow((b + 0.055) / 1.055, 2.4) : b / 12.92;\n var l = Math.cbrt(0.4122214708 * lr + 0.5363325363 * lg + 0.0514459929 * lb);\n var m = Math.cbrt(0.2119034982 * lr + 0.6806995451 * lg + 0.1073969566 * lb);\n var s = Math.cbrt(0.0883024619 * lr + 0.2817188376 * lg + 0.6299787005 * lb);\n return [\n 0.2104542553 * l + 0.7936177850 * m - 0.0040720468 * s,\n 1.9779984951 * l - 2.4285922050 * m + 0.4505937099 * s,\n 0.0259040371 * l + 0.7827717662 * m - 0.8086757660 * s\n ];\n}\n\nfunction oklabToRgb(L, a, b) {\n var l = L + 0.3963377774 * a + 0.2158037573 * b;\n var m = L - 0.1055613458 * a - 0.0638541728 * b;\n var s = L - 0.0894841775 * a - 1.2914855480 * b;\n l = l * l * l; m = m * m * m; s = s * s * s;\n var r = +4.0767416621 * l - 3.3077115913 * m + 0.2309699292 * s;\n var g = -1.2684380046 * l + 2.6097574011 * m - 0.3413193965 * s;\n var bl = -0.0041960863 * l - 0.7034186147 * m + 1.7076147010 * s;\n function toSrgb(c) {\n c = c > 0.0031308 ? 1.055 * Math.pow(c, 1 / 2.4) - 0.055 : 12.92 * c;\n return Math.max(0, Math.min(255, Math.round(c * 255)));\n }\n return [toSrgb(r), toSrgb(g), toSrgb(bl)];\n}\n\nfunction rgbToOklch(r, g, b) {\n var lab = rgbToOklab(r, g, b);\n var C = Math.sqrt(lab[1] * lab[1] + lab[2] * lab[2]);\n var h = Math.atan2(lab[2], lab[1]) * 180 / Math.PI;\n if (h < 0) h += 360;\n return [lab[0], C, h];\n}\n\nfunction oklchToRgb(L, C, h) {\n var rad = h * Math.PI / 180;\n return oklabToRgb(L, C * Math.cos(rad), C * Math.sin(rad));\n}\n\nfunction lerpOklab(c1, c2, t) {\n var a = rgbToOklab(c1[0], c1[1], c1[2]);\n var b = rgbToOklab(c2[0], c2[1], c2[2]);\n return oklabToRgb(\n a[0] + (b[0] - a[0]) * t,\n a[1] + (b[1] - a[1]) * t,\n a[2] + (b[2] - a[2]) * t\n );\n}\n\nfunction palette(colors, t) {\n t = Math.max(0, Math.min(1, t)) * (colors.length - 1);\n var i = Math.floor(t);\n var f = t - i;\n if (i >= colors.length - 1) return colors[colors.length - 1];\n return lerpOklab(colors[i], colors[i + 1], f);\n}\n\nfunction complementary(r, g, b) {\n return [255 - r, 255 - g, 255 - b];\n}\n\nfunction triadic(h, s, l) {\n return [\n [h, s, l],\n [(h + 120) % 360, s, l],\n [(h + 240) % 360, s, l]\n ];\n}\n\nfunction analogous(h, s, l, angle) {\n angle = angle || 30;\n return [\n [(h - angle + 360) % 360, s, l],\n [h, s, l],\n [(h + angle) % 360, s, l]\n ];\n}\n`,\n exports: [\"oklabToRgb\", \"rgbToOklab\", \"oklchToRgb\", \"rgbToOklch\", \"lerpOklab\", \"palette\", \"complementary\", \"triadic\", \"analogous\"],\n dependencies: [\"color\"],\n description: \"Perceptual color spaces (OKLab, OKLCh) and color harmony.\",\n usage: `\\\n### color-advanced — Perceptual Color & Harmony\n\n\\`\\`\\`js\nvar lab = rgbToOklab(255, 128, 0);\nvar rgb = oklabToRgb(lab[0], lab[1], lab[2]);\nlerpOklab([255,0,0], [0,0,255], 0.5); // perceptually uniform blend\npalette([[255,0,0],[0,255,0],[0,0,255]], 0.5); // palette sampling\ntriadic(200, 80, 50); // three equidistant hues\n\\`\\`\\`\n`,\n};\n\nexport default colorAdvanced;\n","import type { ComponentEntry } from \"../../types.js\";\n\nconst vector: ComponentEntry = {\n name: \"vector\",\n version: \"1.0.0\",\n category: \"vector\",\n target: \"js\",\n renderers: [],\n code: `\\\nfunction vec2(x, y) { return [x, y]; }\nfunction vec3(x, y, z) { return [x, y, z]; }\n\nfunction add(a, b) {\n var r = new Array(a.length);\n for (var i = 0; i < a.length; i++) r[i] = a[i] + b[i];\n return r;\n}\n\nfunction sub(a, b) {\n var r = new Array(a.length);\n for (var i = 0; i < a.length; i++) r[i] = a[i] - b[i];\n return r;\n}\n\nfunction mul(a, s) {\n var r = new Array(a.length);\n for (var i = 0; i < a.length; i++) r[i] = a[i] * s;\n return r;\n}\n\nfunction div(a, s) {\n var r = new Array(a.length);\n for (var i = 0; i < a.length; i++) r[i] = a[i] / s;\n return r;\n}\n\nfunction dot(a, b) {\n var s = 0;\n for (var i = 0; i < a.length; i++) s += a[i] * b[i];\n return s;\n}\n\nfunction cross(a, b) {\n return [\n a[1] * b[2] - a[2] * b[1],\n a[2] * b[0] - a[0] * b[2],\n a[0] * b[1] - a[1] * b[0]\n ];\n}\n\nfunction length(a) {\n var s = 0;\n for (var i = 0; i < a.length; i++) s += a[i] * a[i];\n return Math.sqrt(s);\n}\n\nfunction normalize(a) {\n var len = length(a);\n return len === 0 ? a : div(a, len);\n}\n\nfunction distance(a, b) { return length(sub(a, b)); }\n\nfunction reflect(v, n) {\n var d = 2 * dot(v, n);\n return sub(v, mul(n, d));\n}\n\nfunction rotate2D(v, angle) {\n var c = Math.cos(angle), s = Math.sin(angle);\n return [v[0] * c - v[1] * s, v[0] * s + v[1] * c];\n}\n`,\n exports: [\"vec2\", \"vec3\", \"add\", \"sub\", \"mul\", \"div\", \"dot\", \"cross\", \"normalize\", \"length\", \"distance\", \"reflect\", \"rotate2D\"],\n dependencies: [],\n description: \"Lightweight vector math using plain arrays.\",\n usage: `\\\n### vector — Vector Math\n\n\\`\\`\\`js\nvar a = vec2(1, 0), b = vec2(0, 1);\nadd(a, b); // → [1, 1]\nnormalize(a); // → [1, 0]\ndistance(a, b); // → 1.414...\nrotate2D(a, Math.PI / 2);\n\\`\\`\\`\n`,\n};\n\nexport default vector;\n","import type { ComponentEntry } from \"../../types.js\";\n\nconst matrix: ComponentEntry = {\n name: \"matrix\",\n version: \"1.0.0\",\n category: \"vector\",\n target: \"js\",\n renderers: [],\n code: `\\\nfunction mat2(a, b, c, d) { return [a, b, c, d]; }\nfunction mat3(m00, m01, m02, m10, m11, m12, m20, m21, m22) {\n return [m00, m01, m02, m10, m11, m12, m20, m21, m22];\n}\nfunction mat4(m00,m01,m02,m03,m10,m11,m12,m13,m20,m21,m22,m23,m30,m31,m32,m33) {\n return [m00,m01,m02,m03,m10,m11,m12,m13,m20,m21,m22,m23,m30,m31,m32,m33];\n}\n\nfunction multiply(a, b, n) {\n var r = new Array(n * n);\n for (var i = 0; i < n; i++)\n for (var j = 0; j < n; j++) {\n var s = 0;\n for (var k = 0; k < n; k++) s += a[i * n + k] * b[k * n + j];\n r[i * n + j] = s;\n }\n return r;\n}\n\nfunction transpose(m, n) {\n var r = new Array(n * n);\n for (var i = 0; i < n; i++)\n for (var j = 0; j < n; j++) r[j * n + i] = m[i * n + j];\n return r;\n}\n\nfunction inverse(m) {\n var a=m[0],b=m[1],c=m[2],d=m[3],e=m[4],f=m[5],g=m[6],h=m[7],i=m[8],j=m[9],k=m[10],l=m[11],n=m[12],o=m[13],p=m[14],q=m[15];\n var kpol=k*q-l*p, jpom=j*q-l*o, jpon=j*p-k*o, ipol=i*q-l*n, ipon=i*p-k*n, iomn=i*o-j*n;\n var det = a*(f*kpol-g*jpom+h*jpon) - b*(e*kpol-g*ipol+h*ipon) + c*(e*jpom-f*ipol+h*iomn) - d*(e*jpon-f*ipon+g*iomn);\n if (det === 0) return null;\n var id = 1/det;\n return [\n (f*kpol-g*jpom+h*jpon)*id, -(b*kpol-c*jpom+d*jpon)*id, (b*(g*q-h*p)-c*(f*q-h*o)+d*(f*p-g*o))*id, -(b*(g*l-h*k)-c*(f*l-h*j)+d*(f*k-g*j))*id,\n -(e*kpol-g*ipol+h*ipon)*id, (a*kpol-c*ipol+d*ipon)*id, -(a*(g*q-h*p)-c*(e*q-h*n)+d*(e*p-g*n))*id, (a*(g*l-h*k)-c*(e*l-h*i)+d*(e*k-g*i))*id,\n (e*jpom-f*ipol+h*iomn)*id, -(a*jpom-b*ipol+d*iomn)*id, (a*(f*q-h*o)-b*(e*q-h*n)+d*(e*o-f*n))*id, -(a*(f*l-h*j)-b*(e*l-h*i)+d*(e*j-f*i))*id,\n -(e*jpon-f*ipon+g*iomn)*id, (a*jpon-b*ipon+c*iomn)*id, -(a*(f*p-g*o)-b*(e*p-g*n)+c*(e*o-f*n))*id, (a*(f*k-g*j)-b*(e*k-g*i)+c*(e*j-f*i))*id\n ];\n}\n\nfunction rotationMatrix(axis, angle) {\n var c = Math.cos(angle), s = Math.sin(angle), t = 1 - c;\n var x = axis[0], y = axis[1], z = axis[2];\n return [\n t*x*x+c, t*x*y-s*z, t*x*z+s*y, 0,\n t*x*y+s*z, t*y*y+c, t*y*z-s*x, 0,\n t*x*z-s*y, t*y*z+s*x, t*z*z+c, 0,\n 0, 0, 0, 1\n ];\n}\n\nfunction projectionMatrix(fov, aspect, near, far) {\n var f = 1 / Math.tan(fov / 2);\n var nf = 1 / (near - far);\n return [\n f/aspect, 0, 0, 0,\n 0, f, 0, 0,\n 0, 0, (far+near)*nf, -1,\n 0, 0, 2*far*near*nf, 0\n ];\n}\n`,\n exports: [\"mat2\", \"mat3\", \"mat4\", \"multiply\", \"inverse\", \"transpose\", \"rotationMatrix\", \"projectionMatrix\"],\n dependencies: [\"vector\"],\n description: \"Matrix math for 2D/3D transforms and projections.\",\n usage: `\\\n### matrix — Matrix Math\n\n\\`\\`\\`js\nvar rot = rotationMatrix([0,1,0], Math.PI/4);\nvar proj = projectionMatrix(Math.PI/3, 16/9, 0.1, 100);\nvar result = multiply(proj, rot, 4);\n\\`\\`\\`\n`,\n};\n\nexport default matrix;\n","import type { ComponentEntry } from \"../../types.js\";\n\nconst grid: ComponentEntry = {\n name: \"grid\",\n version: \"1.0.0\",\n category: \"grid\",\n target: \"js\",\n renderers: [],\n code: `\\\nfunction marchingSquares(field, cols, rows, threshold) {\n var segments = [];\n function val(x, y) { return field[y * cols + x] >= threshold ? 1 : 0; }\n function interp(a, b, va, vb) {\n var dv = vb - va;\n return dv === 0 ? 0.5 : (threshold - va) / dv;\n }\n for (var y = 0; y < rows - 1; y++) {\n for (var x = 0; x < cols - 1; x++) {\n var v00 = field[y * cols + x], v10 = field[y * cols + x + 1];\n var v01 = field[(y+1) * cols + x], v11 = field[(y+1) * cols + x + 1];\n var code = val(x,y) | (val(x+1,y)<<1) | (val(x,y+1)<<2) | (val(x+1,y+1)<<3);\n if (code === 0 || code === 15) continue;\n var top = [x + interp(v00, v10, v00, v10), y];\n var bottom = [x + interp(v01, v11, v01, v11), y + 1];\n var left = [x, y + interp(v00, v01, v00, v01)];\n var right = [x + 1, y + interp(v10, v11, v10, v11)];\n if (code===1||code===14) segments.push([top, left]);\n else if (code===2||code===13) segments.push([top, right]);\n else if (code===3||code===12) segments.push([left, right]);\n else if (code===4||code===11) segments.push([left, bottom]);\n else if (code===6||code===9) segments.push([top, bottom]);\n else if (code===7||code===8) segments.push([right, bottom]);\n else if (code===5) { segments.push([top, left]); segments.push([right, bottom]); }\n else if (code===10) { segments.push([top, right]); segments.push([left, bottom]); }\n }\n }\n return segments;\n}\n\nfunction floodFill(grid, cols, rows, startX, startY, fillVal) {\n var target = grid[startY * cols + startX];\n if (target === fillVal) return grid;\n var result = grid.slice();\n var stack = [[startX, startY]];\n while (stack.length > 0) {\n var p = stack.pop();\n var px = p[0], py = p[1];\n if (px < 0 || px >= cols || py < 0 || py >= rows) continue;\n if (result[py * cols + px] !== target) continue;\n result[py * cols + px] = fillVal;\n stack.push([px+1,py],[px-1,py],[px,py+1],[px,py-1]);\n }\n return result;\n}\n\nfunction bresenhamLine(x0, y0, x1, y1) {\n var points = [];\n var dx = Math.abs(x1 - x0), dy = Math.abs(y1 - y0);\n var sx = x0 < x1 ? 1 : -1, sy = y0 < y1 ? 1 : -1;\n var err = dx - dy;\n while (true) {\n points.push([x0, y0]);\n if (x0 === x1 && y0 === y1) break;\n var e2 = 2 * err;\n if (e2 > -dy) { err -= dy; x0 += sx; }\n if (e2 < dx) { err += dx; y0 += sy; }\n }\n return points;\n}\n\nfunction cellularAutomaton(grid, cols, rows, ruleFn) {\n var next = new Array(cols * rows);\n for (var y = 0; y < rows; y++) {\n for (var x = 0; x < cols; x++) {\n var neighbors = 0;\n for (var dy = -1; dy <= 1; dy++)\n for (var dx = -1; dx <= 1; dx++) {\n if (dx === 0 && dy === 0) continue;\n var nx = (x + dx + cols) % cols, ny = (y + dy + rows) % rows;\n neighbors += grid[ny * cols + nx] ? 1 : 0;\n }\n next[y * cols + x] = ruleFn(grid[y * cols + x], neighbors);\n }\n }\n return next;\n}\n`,\n exports: [\"marchingSquares\", \"floodFill\", \"bresenhamLine\", \"cellularAutomaton\"],\n dependencies: [],\n description: \"Grid/heightmap algorithms (marching squares, flood fill, Bresenham).\",\n usage: `\\\n### grid — Grid Algorithms\n\n\\`\\`\\`js\nvar segs = marchingSquares(heightmap, 100, 100, 0.5);\nvar filled = floodFill(grid, w, h, 0, 0, 1);\nvar line = bresenhamLine(0, 0, 10, 7);\nvar next = cellularAutomaton(grid, w, h, function(cell, n) {\n return n === 3 || (cell && n === 2) ? 1 : 0; // Game of Life\n});\n\\`\\`\\`\n`,\n};\n\nexport default grid;\n","import type { ComponentEntry } from \"../../types.js\";\n\nconst gridAdvanced: ComponentEntry = {\n name: \"grid-advanced\",\n version: \"1.0.0\",\n category: \"grid\",\n target: \"js\",\n renderers: [],\n code: `\\\nfunction marchingCubes(field, nx, ny, nz, threshold) {\n var vertices = [];\n function val(x, y, z) { return field[z * ny * nx + y * nx + x]; }\n function interp3(p1, p2, v1, v2) {\n if (Math.abs(v1 - v2) < 1e-6) return p1;\n var t = (threshold - v1) / (v2 - v1);\n return [p1[0]+(p2[0]-p1[0])*t, p1[1]+(p2[1]-p1[1])*t, p1[2]+(p2[2]-p1[2])*t];\n }\n for (var z = 0; z < nz-1; z++)\n for (var y = 0; y < ny-1; y++)\n for (var x = 0; x < nx-1; x++) {\n var v = [val(x,y,z),val(x+1,y,z),val(x+1,y+1,z),val(x,y+1,z),\n val(x,y,z+1),val(x+1,y,z+1),val(x+1,y+1,z+1),val(x,y+1,z+1)];\n var code = 0;\n for (var i = 0; i < 8; i++) if (v[i] >= threshold) code |= (1 << i);\n if (code === 0 || code === 255) continue;\n var corners = [[x,y,z],[x+1,y,z],[x+1,y+1,z],[x,y+1,z],[x,y,z+1],[x+1,y,z+1],[x+1,y+1,z+1],[x,y+1,z+1]];\n var edges = [[0,1],[1,2],[2,3],[3,0],[4,5],[5,6],[6,7],[7,4],[0,4],[1,5],[2,6],[3,7]];\n for (var i = 0; i < edges.length; i++) {\n var e = edges[i];\n if ((code & (1<<e[0])) !== (code & (1<<e[1])))\n vertices.push(interp3(corners[e[0]], corners[e[1]], v[e[0]], v[e[1]]));\n }\n }\n return vertices;\n}\n\nfunction diamondSquare(size, rng, roughness) {\n var n = size;\n var grid = new Float64Array(n * n);\n grid[0] = rng(); grid[n-1] = rng(); grid[(n-1)*n] = rng(); grid[(n-1)*n+n-1] = rng();\n var step = n - 1, scale = roughness;\n while (step > 1) {\n var half = step / 2;\n for (var y = 0; y < n-1; y += step)\n for (var x = 0; x < n-1; x += step) {\n var avg = (grid[y*n+x]+grid[y*n+x+step]+grid[(y+step)*n+x]+grid[(y+step)*n+x+step])/4;\n grid[(y+half)*n+x+half] = avg + (rng()-0.5)*scale;\n }\n for (var y = 0; y < n; y += half)\n for (var x = (y % step === 0 ? half : 0); x < n; x += step) {\n var sum = 0, cnt = 0;\n if (y-half>=0){sum+=grid[(y-half)*n+x];cnt++;}\n if (y+half<n){sum+=grid[(y+half)*n+x];cnt++;}\n if (x-half>=0){sum+=grid[y*n+x-half];cnt++;}\n if (x+half<n){sum+=grid[y*n+x+half];cnt++;}\n grid[y*n+x] = sum/cnt + (rng()-0.5)*scale;\n }\n step = half; scale *= 0.5;\n }\n return grid;\n}\n\nfunction waveCollapse(tileCount, cols, rows, adjacency, rng) {\n var grid = new Array(cols * rows);\n for (var i = 0; i < grid.length; i++) {\n grid[i] = new Array(tileCount);\n for (var t = 0; t < tileCount; t++) grid[i][t] = true;\n }\n function entropy(cell) {\n var c = 0;\n for (var t = 0; t < tileCount; t++) if (cell[t]) c++;\n return c;\n }\n function collapse() {\n var minE = tileCount + 1, idx = -1;\n for (var i = 0; i < grid.length; i++) {\n var e = entropy(grid[i]);\n if (e > 1 && e < minE) { minE = e; idx = i; }\n }\n if (idx === -1) return false;\n var options = [];\n for (var t = 0; t < tileCount; t++) if (grid[idx][t]) options.push(t);\n var pick = options[Math.floor(rng() * options.length)];\n for (var t = 0; t < tileCount; t++) grid[idx][t] = (t === pick);\n propagate(idx);\n return true;\n }\n function propagate(idx) {\n var stack = [idx];\n while (stack.length > 0) {\n var ci = stack.pop();\n var cx = ci % cols, cy = Math.floor(ci / cols);\n var dirs = [[1,0],[-1,0],[0,1],[0,-1]];\n for (var d = 0; d < 4; d++) {\n var nx = cx+dirs[d][0], ny = cy+dirs[d][1];\n if (nx<0||nx>=cols||ny<0||ny>=rows) continue;\n var ni = ny*cols+nx;\n var changed = false;\n for (var t = 0; t < tileCount; t++) {\n if (!grid[ni][t]) continue;\n var valid = false;\n for (var s = 0; s < tileCount; s++) {\n if (grid[ci][s] && adjacency[s] && adjacency[s][d] && adjacency[s][d].indexOf(t) >= 0) { valid = true; break; }\n }\n if (!valid) { grid[ni][t] = false; changed = true; }\n }\n if (changed) stack.push(ni);\n }\n }\n }\n while (collapse()) {}\n var result = new Array(cols * rows);\n for (var i = 0; i < grid.length; i++) {\n for (var t = 0; t < tileCount; t++) if (grid[i][t]) { result[i] = t; break; }\n }\n return result;\n}\n`,\n exports: [\"marchingCubes\", \"diamondSquare\", \"waveCollapse\"],\n dependencies: [\"prng\", \"grid\"],\n description: \"Advanced grid generation (marching cubes, diamond-square, WFC).\",\n usage: `\\\n### grid-advanced — Advanced Grid Generation\n\n\\`\\`\\`js\nvar terrain = diamondSquare(129, rng, 1.0);\nvar verts = marchingCubes(field, 32, 32, 32, 0.5);\nvar tiles = waveCollapse(4, 20, 20, adjacencyRules, rng);\n\\`\\`\\`\n`,\n};\n\nexport default gridAdvanced;\n","import type { ComponentEntry } from \"../../types.js\";\n\nconst particle: ComponentEntry = {\n name: \"particle\",\n version: \"1.0.0\",\n category: \"particle\",\n target: \"js\",\n renderers: [],\n code: `\\\nfunction createParticleSystem(maxParticles) {\n return {\n particles: [],\n maxParticles: maxParticles || 1000,\n time: 0\n };\n}\n\nfunction emitParticle(system, x, y, vx, vy, life) {\n if (system.particles.length >= system.maxParticles) return null;\n var p = { x: x, y: y, vx: vx || 0, vy: vy || 0, ax: 0, ay: 0, life: life || 1, maxLife: life || 1, age: 0 };\n system.particles.push(p);\n return p;\n}\n\nfunction updateParticles(system, dt) {\n dt = dt || 1/60;\n system.time += dt;\n for (var i = system.particles.length - 1; i >= 0; i--) {\n var p = system.particles[i];\n p.vx += p.ax * dt; p.vy += p.ay * dt;\n p.x += p.vx * dt; p.y += p.vy * dt;\n p.ax = 0; p.ay = 0;\n p.age += dt; p.life -= dt;\n if (p.life <= 0) system.particles.splice(i, 1);\n }\n return system;\n}\n\nfunction applyForce(particle, fx, fy) {\n particle.ax += fx;\n particle.ay += fy;\n}\n\nfunction particleAge(particle) {\n return particle.age / particle.maxLife;\n}\n`,\n exports: [\"createParticleSystem\", \"updateParticles\", \"emitParticle\", \"applyForce\", \"particleAge\"],\n dependencies: [\"vector\"],\n description: \"Renderer-agnostic particle system state management.\",\n usage: `\\\n### particle — Particle System\n\n\\`\\`\\`js\nvar sys = createParticleSystem(500);\nemitParticle(sys, x, y, vx, vy, 2.0);\nupdateParticles(sys, dt);\nsys.particles.forEach(function(p) {\n applyForce(p, 0, 9.8); // gravity\n var t = particleAge(p); // 0→1 normalized age\n});\n\\`\\`\\`\n`,\n};\n\nexport default particle;\n","import type { ComponentEntry } from \"../../types.js\";\n\nconst particleForces: ComponentEntry = {\n name: \"particle-forces\",\n version: \"1.0.0\",\n category: \"particle\",\n target: \"js\",\n renderers: [],\n code: `\\\nfunction gravityForce(p, gx, gy) {\n p.ax += gx || 0;\n p.ay += gy || 9.8;\n}\n\nfunction attractorForce(p, ax, ay, strength) {\n var dx = ax - p.x, dy = ay - p.y;\n var d = Math.sqrt(dx * dx + dy * dy) + 0.01;\n var f = strength / (d * d);\n p.ax += dx / d * f;\n p.ay += dy / d * f;\n}\n\nfunction vortexForce(p, cx, cy, strength) {\n var dx = p.x - cx, dy = p.y - cy;\n var d = Math.sqrt(dx * dx + dy * dy) + 0.01;\n var f = strength / d;\n p.ax += -dy / d * f;\n p.ay += dx / d * f;\n}\n\nfunction dragForce(p, coefficient) {\n coefficient = coefficient || 0.01;\n var speed = Math.sqrt(p.vx * p.vx + p.vy * p.vy);\n if (speed > 0) {\n var drag = coefficient * speed;\n p.ax -= p.vx / speed * drag;\n p.ay -= p.vy / speed * drag;\n }\n}\n\nfunction turbulenceForce(p, noiseFn, scale, strength) {\n var angle = noiseFn(p.x * scale, p.y * scale) * Math.PI * 4;\n p.ax += Math.cos(angle) * strength;\n p.ay += Math.sin(angle) * strength;\n}\n\nfunction boundaryForce(p, minX, minY, maxX, maxY, strength) {\n strength = strength || 10;\n var margin = 20;\n if (p.x < minX + margin) p.ax += strength * (1 - (p.x - minX) / margin);\n if (p.x > maxX - margin) p.ax -= strength * (1 - (maxX - p.x) / margin);\n if (p.y < minY + margin) p.ay += strength * (1 - (p.y - minY) / margin);\n if (p.y > maxY - margin) p.ay -= strength * (1 - (maxY - p.y) / margin);\n}\n`,\n exports: [\"gravityForce\", \"attractorForce\", \"vortexForce\", \"dragForce\", \"turbulenceForce\", \"boundaryForce\"],\n dependencies: [\"particle\", \"vector\"],\n description: \"Common particle force functions (gravity, attractor, vortex, drag).\",\n usage: `\\\n### particle-forces — Force Functions\n\n\\`\\`\\`js\nsys.particles.forEach(function(p) {\n gravityForce(p, 0, 9.8);\n attractorForce(p, cx, cy, 100);\n dragForce(p, 0.02);\n boundaryForce(p, 0, 0, width, height);\n});\n\\`\\`\\`\n`,\n};\n\nexport default particleForces;\n","import type { ComponentEntry } from \"../../types.js\";\n\nconst shape: ComponentEntry = {\n name: \"shape\",\n version: \"1.0.0\",\n category: \"geometry\",\n target: \"js\",\n renderers: [],\n code: `\\\nfunction regularPolygon(cx, cy, radius, sides) {\n var pts = [];\n for (var i = 0; i < sides; i++) {\n var a = (i / sides) * Math.PI * 2 - Math.PI / 2;\n pts.push([cx + Math.cos(a) * radius, cy + Math.sin(a) * radius]);\n }\n return pts;\n}\n\nfunction star(cx, cy, outerR, innerR, points) {\n var pts = [];\n for (var i = 0; i < points * 2; i++) {\n var a = (i / (points * 2)) * Math.PI * 2 - Math.PI / 2;\n var r = i % 2 === 0 ? outerR : innerR;\n pts.push([cx + Math.cos(a) * r, cy + Math.sin(a) * r]);\n }\n return pts;\n}\n\nfunction spiral(cx, cy, startR, endR, turns, segments) {\n var pts = [];\n for (var i = 0; i <= segments; i++) {\n var t = i / segments;\n var angle = t * turns * Math.PI * 2;\n var r = startR + (endR - startR) * t;\n pts.push([cx + Math.cos(angle) * r, cy + Math.sin(angle) * r]);\n }\n return pts;\n}\n\nfunction lissajous(cx, cy, a, b, kx, ky, delta, segments) {\n var pts = [];\n for (var i = 0; i <= segments; i++) {\n var t = (i / segments) * Math.PI * 2;\n pts.push([cx + a * Math.sin(kx * t + delta), cy + b * Math.sin(ky * t)]);\n }\n return pts;\n}\n\nfunction superellipse(cx, cy, rx, ry, n, segments) {\n var pts = [];\n for (var i = 0; i <= segments; i++) {\n var a = (i / segments) * Math.PI * 2;\n var ca = Math.cos(a), sa = Math.sin(a);\n var x = Math.pow(Math.abs(ca), 2/n) * rx * (ca >= 0 ? 1 : -1);\n var y = Math.pow(Math.abs(sa), 2/n) * ry * (sa >= 0 ? 1 : -1);\n pts.push([cx + x, cy + y]);\n }\n return pts;\n}\n\nfunction heart(cx, cy, size, segments) {\n var pts = [];\n for (var i = 0; i <= segments; i++) {\n var t = (i / segments) * Math.PI * 2;\n var x = 16 * Math.pow(Math.sin(t), 3);\n var y = -(13 * Math.cos(t) - 5 * Math.cos(2*t) - 2 * Math.cos(3*t) - Math.cos(4*t));\n pts.push([cx + x * size / 16, cy + y * size / 16]);\n }\n return pts;\n}\n`,\n exports: [\"regularPolygon\", \"star\", \"spiral\", \"lissajous\", \"superellipse\", \"heart\"],\n dependencies: [\"math\"],\n description: \"Parametric shape generators returning point arrays.\",\n usage: `\\\n### shape — Parametric Shapes\n\n\\`\\`\\`js\nregularPolygon(cx, cy, 50, 6); // hexagon\nstar(cx, cy, 50, 25, 5); // 5-point star\nspiral(cx, cy, 10, 100, 5, 200);\nheart(cx, cy, 40, 100);\n\\`\\`\\`\n`,\n};\n\nexport default shape;\n","import type { ComponentEntry } from \"../../types.js\";\n\nconst shapeAdvanced: ComponentEntry = {\n name: \"shape-advanced\",\n version: \"1.0.0\",\n category: \"geometry\",\n target: \"js\",\n renderers: [],\n code: `\\\nfunction chaikinSmooth(points, iterations) {\n iterations = iterations || 3;\n var pts = points;\n for (var iter = 0; iter < iterations; iter++) {\n var next = [];\n for (var i = 0; i < pts.length - 1; i++) {\n var a = pts[i], b = pts[i+1];\n next.push([a[0]*0.75 + b[0]*0.25, a[1]*0.75 + b[1]*0.25]);\n next.push([a[0]*0.25 + b[0]*0.75, a[1]*0.25 + b[1]*0.75]);\n }\n pts = next;\n }\n return pts;\n}\n\nfunction subdivideCurve(points, iterations) {\n iterations = iterations || 1;\n var pts = points;\n for (var iter = 0; iter < iterations; iter++) {\n var next = [pts[0]];\n for (var i = 0; i < pts.length - 1; i++) {\n var mid = [(pts[i][0]+pts[i+1][0])/2, (pts[i][1]+pts[i+1][1])/2];\n next.push(mid);\n next.push(pts[i+1]);\n }\n pts = next;\n }\n return pts;\n}\n\nfunction offsetPath(points, dist) {\n var result = [];\n for (var i = 0; i < points.length; i++) {\n var prev = points[(i-1+points.length)%points.length];\n var curr = points[i];\n var next = points[(i+1)%points.length];\n var dx1 = curr[0]-prev[0], dy1 = curr[1]-prev[1];\n var dx2 = next[0]-curr[0], dy2 = next[1]-curr[1];\n var len1 = Math.sqrt(dx1*dx1+dy1*dy1) || 1;\n var len2 = Math.sqrt(dx2*dx2+dy2*dy2) || 1;\n var nx = (-(dy1/len1 + dy2/len2))/2, ny = ((dx1/len1 + dx2/len2))/2;\n var nl = Math.sqrt(nx*nx+ny*ny) || 1;\n result.push([curr[0]+nx/nl*dist, curr[1]+ny/nl*dist]);\n }\n return result;\n}\n\nfunction convexHull(points) {\n var pts = points.slice().sort(function(a,b) { return a[0]-b[0] || a[1]-b[1]; });\n function cross(O,A,B) { return (A[0]-O[0])*(B[1]-O[1])-(A[1]-O[1])*(B[0]-O[0]); }\n var lower = [];\n for (var i = 0; i < pts.length; i++) {\n while (lower.length >= 2 && cross(lower[lower.length-2], lower[lower.length-1], pts[i]) <= 0) lower.pop();\n lower.push(pts[i]);\n }\n var upper = [];\n for (var i = pts.length - 1; i >= 0; i--) {\n while (upper.length >= 2 && cross(upper[upper.length-2], upper[upper.length-1], pts[i]) <= 0) upper.pop();\n upper.push(pts[i]);\n }\n return lower.slice(0, -1).concat(upper.slice(0, -1));\n}\n\nfunction delaunay(points) {\n var n = points.length;\n if (n < 3) return [];\n var ids = new Array(n);\n for (var i = 0; i < n; i++) ids[i] = i;\n ids.sort(function(a,b) { return points[a][0]-points[b][0] || points[a][1]-points[b][1]; });\n var triangles = [];\n function circumscribed(ax,ay,bx,by,cx,cy,px,py) {\n var dx=ax-px,dy=ay-py,ex=bx-px,ey=by-py,fx=cx-px,fy=cy-py;\n var ap=dx*dx+dy*dy,bp=ex*ex+ey*ey,cp=fx*fx+fy*fy;\n return dx*(ey*cp-bp*fy)-dy*(ex*cp-bp*fx)+ap*(ex*fy-ey*fx) > 0;\n }\n var st = [[-1e6,-1e6],[1e6,-1e6],[0,1e6]];\n triangles.push([n,n+1,n+2]);\n var all = points.concat(st);\n for (var i = 0; i < n; i++) {\n var pi = ids[i], px = all[pi][0], py = all[pi][1];\n var edges = [], bad = [];\n for (var j = 0; j < triangles.length; j++) {\n var t = triangles[j];\n if (circumscribed(all[t[0]][0],all[t[0]][1],all[t[1]][0],all[t[1]][1],all[t[2]][0],all[t[2]][1],px,py)) {\n bad.push(j);\n edges.push([t[0],t[1]],[t[1],t[2]],[t[2],t[0]]);\n }\n }\n for (var j = bad.length-1; j >= 0; j--) triangles.splice(bad[j],1);\n var unique = [];\n for (var j = 0; j < edges.length; j++) {\n var dup = false;\n for (var k = 0; k < edges.length; k++) {\n if (j !== k && edges[j][0]===edges[k][1] && edges[j][1]===edges[k][0]) { dup = true; break; }\n }\n if (!dup) unique.push(edges[j]);\n }\n for (var j = 0; j < unique.length; j++) triangles.push([unique[j][0], unique[j][1], pi]);\n }\n return triangles.filter(function(t) { return t[0] < n && t[1] < n && t[2] < n; });\n}\n\nfunction voronoi(points, width, height, resolution) {\n resolution = resolution || 1;\n var cols = Math.ceil(width/resolution), rows = Math.ceil(height/resolution);\n var cells = new Int32Array(cols * rows);\n for (var y = 0; y < rows; y++)\n for (var x = 0; x < cols; x++) {\n var px = x * resolution, py = y * resolution;\n var minD = Infinity, minI = 0;\n for (var i = 0; i < points.length; i++) {\n var dx = px - points[i][0], dy = py - points[i][1];\n var d = dx*dx + dy*dy;\n if (d < minD) { minD = d; minI = i; }\n }\n cells[y * cols + x] = minI;\n }\n return { cells: cells, cols: cols, rows: rows };\n}\n`,\n exports: [\"chaikinSmooth\", \"subdivideCurve\", \"offsetPath\", \"convexHull\", \"delaunay\", \"voronoi\"],\n dependencies: [\"vector\", \"shape\"],\n description: \"Computational geometry (Chaikin, convex hull, Delaunay, Voronoi).\",\n usage: `\\\n### shape-advanced — Computational Geometry\n\n\\`\\`\\`js\nvar smooth = chaikinSmooth(points, 3);\nvar hull = convexHull(points);\nvar tris = delaunay(points);\nvar v = voronoi(points, 800, 600);\n\\`\\`\\`\n`,\n};\n\nexport default shapeAdvanced;\n","import type { ComponentEntry } from \"../../types.js\";\n\nconst distribution: ComponentEntry = {\n name: \"distribution\",\n version: \"1.0.0\",\n category: \"distribution\",\n target: \"js\",\n renderers: [],\n code: `\\\nfunction poissonDisk(rng, width, height, minDist, maxAttempts) {\n maxAttempts = maxAttempts || 30;\n var cellSize = minDist / Math.SQRT2;\n var cols = Math.ceil(width / cellSize), rows = Math.ceil(height / cellSize);\n var grid = new Array(cols * rows).fill(-1);\n var points = [], active = [];\n function addPoint(x, y) {\n var i = points.length;\n points.push([x, y]);\n active.push(i);\n var gx = Math.floor(x / cellSize), gy = Math.floor(y / cellSize);\n grid[gy * cols + gx] = i;\n }\n addPoint(rng() * width, rng() * height);\n while (active.length > 0) {\n var ri = Math.floor(rng() * active.length);\n var pi = active[ri], p = points[pi];\n var found = false;\n for (var attempt = 0; attempt < maxAttempts; attempt++) {\n var angle = rng() * Math.PI * 2;\n var dist = minDist + rng() * minDist;\n var nx = p[0] + Math.cos(angle) * dist, ny = p[1] + Math.sin(angle) * dist;\n if (nx < 0 || nx >= width || ny < 0 || ny >= height) continue;\n var gx = Math.floor(nx / cellSize), gy = Math.floor(ny / cellSize);\n var ok = true;\n for (var dy = -2; dy <= 2 && ok; dy++)\n for (var dx = -2; dx <= 2 && ok; dx++) {\n var cx = gx + dx, cy = gy + dy;\n if (cx < 0 || cx >= cols || cy < 0 || cy >= rows) continue;\n var ci = grid[cy * cols + cx];\n if (ci >= 0) {\n var cp = points[ci];\n var d2 = (nx-cp[0])*(nx-cp[0]) + (ny-cp[1])*(ny-cp[1]);\n if (d2 < minDist * minDist) ok = false;\n }\n }\n if (ok) { addPoint(nx, ny); found = true; break; }\n }\n if (!found) active.splice(ri, 1);\n }\n return points;\n}\n\nfunction jitteredGrid(rng, width, height, cellSize, jitter) {\n jitter = jitter || 0.5;\n var pts = [];\n for (var y = cellSize/2; y < height; y += cellSize)\n for (var x = cellSize/2; x < width; x += cellSize)\n pts.push([x + (rng()-0.5)*cellSize*jitter, y + (rng()-0.5)*cellSize*jitter]);\n return pts;\n}\n\nfunction haltonSequence(n, base1, base2) {\n base1 = base1 || 2; base2 = base2 || 3;\n function halton(i, base) {\n var f = 1, r = 0;\n while (i > 0) { f /= base; r += f * (i % base); i = Math.floor(i / base); }\n return r;\n }\n var pts = [];\n for (var i = 0; i < n; i++) pts.push([halton(i+1, base1), halton(i+1, base2)]);\n return pts;\n}\n\nfunction uniformOnSphere(rng) {\n var u = rng(), v = rng();\n var theta = 2 * Math.PI * u;\n var phi = Math.acos(2 * v - 1);\n return [Math.sin(phi)*Math.cos(theta), Math.sin(phi)*Math.sin(theta), Math.cos(phi)];\n}\n\nfunction gaussianCluster(rng, cx, cy, stddev, count) {\n var pts = [];\n for (var i = 0; i < count; i++) {\n var u1 = rng(), u2 = rng();\n var r = Math.sqrt(-2 * Math.log(u1 || 1e-10));\n var theta = 2 * Math.PI * u2;\n pts.push([cx + r * Math.cos(theta) * stddev, cy + r * Math.sin(theta) * stddev]);\n }\n return pts;\n}\n`,\n exports: [\"poissonDisk\", \"jitteredGrid\", \"haltonSequence\", \"uniformOnSphere\", \"gaussianCluster\"],\n dependencies: [\"prng\"],\n description: \"Point distribution algorithms (Poisson disk, Halton, jittered grid).\",\n usage: `\\\n### distribution — Point Distributions\n\n\\`\\`\\`js\nvar pts = poissonDisk(rng, 800, 600, 20);\nvar grid = jitteredGrid(rng, 800, 600, 40, 0.5);\nvar halton = haltonSequence(100, 2, 3);\nvar sphere = uniformOnSphere(rng);\n\\`\\`\\`\n`,\n};\n\nexport default distribution;\n","import type { ComponentEntry } from \"../../types.js\";\n\nconst distributionAdvanced: ComponentEntry = {\n name: \"distribution-advanced\",\n version: \"1.0.0\",\n category: \"distribution\",\n target: \"js\",\n renderers: [],\n code: `\\\nfunction blueNoise(rng, width, height, count) {\n var pts = poissonDisk(rng, width, height, Math.sqrt(width * height / count));\n return pts.slice(0, count);\n}\n\nfunction lloydRelaxation(points, width, height, iterations) {\n var pts = points.map(function(p) { return [p[0], p[1]]; });\n for (var iter = 0; iter < iterations; iter++) {\n var v = voronoi(pts, width, height, 2);\n var sums = new Array(pts.length);\n var counts = new Array(pts.length);\n for (var i = 0; i < pts.length; i++) { sums[i] = [0, 0]; counts[i] = 0; }\n for (var y = 0; y < v.rows; y++)\n for (var x = 0; x < v.cols; x++) {\n var ci = v.cells[y * v.cols + x];\n sums[ci][0] += x * 2; sums[ci][1] += y * 2;\n counts[ci]++;\n }\n for (var i = 0; i < pts.length; i++) {\n if (counts[i] > 0) {\n pts[i] = [sums[i][0] / counts[i], sums[i][1] / counts[i]];\n }\n }\n }\n return pts;\n}\n\nfunction fibonacciSphere(n) {\n var pts = [];\n var goldenAngle = Math.PI * (3 - Math.sqrt(5));\n for (var i = 0; i < n; i++) {\n var y = 1 - (i / (n - 1)) * 2;\n var radius = Math.sqrt(1 - y * y);\n var theta = goldenAngle * i;\n pts.push([Math.cos(theta) * radius, y, Math.sin(theta) * radius]);\n }\n return pts;\n}\n\nfunction uniformOnDisk(rng, count) {\n var pts = [];\n for (var i = 0; i < count; i++) {\n var r = Math.sqrt(rng());\n var theta = rng() * Math.PI * 2;\n pts.push([r * Math.cos(theta), r * Math.sin(theta)]);\n }\n return pts;\n}\n\nfunction stratifiedSample(rng, width, height, nx, ny) {\n var pts = [];\n var cw = width / nx, ch = height / ny;\n for (var y = 0; y < ny; y++)\n for (var x = 0; x < nx; x++)\n pts.push([x * cw + rng() * cw, y * ch + rng() * ch]);\n return pts;\n}\n`,\n exports: [\"blueNoise\", \"lloydRelaxation\", \"fibonacciSphere\", \"uniformOnDisk\", \"stratifiedSample\"],\n dependencies: [\"prng\", \"distribution\"],\n description: \"Advanced spatial sampling (blue noise, Lloyd, Fibonacci sphere).\",\n usage: `\\\n### distribution-advanced — Advanced Sampling\n\n\\`\\`\\`js\nvar pts = blueNoise(rng, 800, 600, 200);\nvar relaxed = lloydRelaxation(pts, 800, 600, 5);\nvar sphere = fibonacciSphere(100);\nvar disk = uniformOnDisk(rng, 50);\n\\`\\`\\`\n`,\n};\n\nexport default distributionAdvanced;\n","import type { ComponentEntry } from \"../../types.js\";\n\nconst physicsSpring: ComponentEntry = {\n name: \"physics-spring\",\n version: \"1.0.0\",\n category: \"physics\",\n target: \"js\",\n renderers: [],\n code: `\\\nfunction createSpring(restLength, stiffness, damping) {\n return { restLength: restLength, stiffness: stiffness || 100, damping: damping || 5 };\n}\n\nfunction springSystem(points, springs) {\n return { points: points, springs: springs };\n}\n\nfunction springStep(system, dt) {\n dt = dt || 1/60;\n for (var i = 0; i < system.springs.length; i++) {\n var s = system.springs[i];\n var a = system.points[s.a], b = system.points[s.b];\n var dx = b.x - a.x, dy = b.y - a.y;\n var dist = Math.sqrt(dx * dx + dy * dy) || 0.001;\n var force = s.stiffness * (dist - s.restLength);\n var dvx = b.vx - a.vx, dvy = b.vy - a.vy;\n var dampF = s.damping * (dvx * dx + dvy * dy) / dist;\n var fx = (force + dampF) * dx / dist;\n var fy = (force + dampF) * dy / dist;\n a.vx += fx * dt; a.vy += fy * dt;\n b.vx -= fx * dt; b.vy -= fy * dt;\n }\n for (var i = 0; i < system.points.length; i++) {\n var p = system.points[i];\n if (p.fixed) continue;\n p.x += p.vx * dt; p.y += p.vy * dt;\n }\n}\n\nfunction dampedHarmonic(x, v, target, stiffness, damping, dt) {\n var force = -stiffness * (x - target) - damping * v;\n v += force * dt;\n x += v * dt;\n return { x: x, v: v };\n}\n`,\n exports: [\"springSystem\", \"springStep\", \"createSpring\", \"dampedHarmonic\"],\n dependencies: [\"vector\"],\n description: \"Spring-based physics simulation.\",\n usage: `\\\n### physics-spring — Spring Physics\n\n\\`\\`\\`js\nvar points = [{x:0,y:0,vx:0,vy:0,fixed:true}, {x:100,y:0,vx:0,vy:0}];\nvar springs = [{a:0, b:1, restLength:50, stiffness:100, damping:5}];\nvar sys = springSystem(points, springs);\nspringStep(sys, 1/60);\n\\`\\`\\`\n`,\n};\n\nexport default physicsSpring;\n","import type { ComponentEntry } from \"../../types.js\";\n\nconst physicsVerlet: ComponentEntry = {\n name: \"physics-verlet\",\n version: \"1.0.0\",\n category: \"physics\",\n target: \"js\",\n renderers: [],\n code: `\\\nfunction verletSystem(points) {\n return {\n points: points.map(function(p) {\n return { x: p.x, y: p.y, px: p.x, py: p.y, ax: 0, ay: 0, fixed: p.fixed || false };\n }),\n constraints: []\n };\n}\n\nfunction verletStep(system, dt) {\n dt = dt || 1/60;\n var dt2 = dt * dt;\n for (var i = 0; i < system.points.length; i++) {\n var p = system.points[i];\n if (p.fixed) continue;\n var nx = 2 * p.x - p.px + p.ax * dt2;\n var ny = 2 * p.y - p.py + p.ay * dt2;\n p.px = p.x; p.py = p.y;\n p.x = nx; p.y = ny;\n p.ax = 0; p.ay = 0;\n }\n solveConstraints(system, 3);\n}\n\nfunction addConstraint(system, a, b, restLength) {\n system.constraints.push({\n a: a, b: b,\n restLength: restLength !== undefined ? restLength :\n Math.sqrt(Math.pow(system.points[a].x - system.points[b].x, 2) + Math.pow(system.points[a].y - system.points[b].y, 2))\n });\n}\n\nfunction solveConstraints(system, iterations) {\n iterations = iterations || 3;\n for (var iter = 0; iter < iterations; iter++) {\n for (var i = 0; i < system.constraints.length; i++) {\n var c = system.constraints[i];\n var a = system.points[c.a], b = system.points[c.b];\n var dx = b.x - a.x, dy = b.y - a.y;\n var dist = Math.sqrt(dx * dx + dy * dy) || 0.001;\n var diff = (c.restLength - dist) / dist * 0.5;\n var ox = dx * diff, oy = dy * diff;\n if (!a.fixed) { a.x -= ox; a.y -= oy; }\n if (!b.fixed) { b.x += ox; b.y += oy; }\n }\n }\n}\n`,\n exports: [\"verletSystem\", \"verletStep\", \"addConstraint\", \"solveConstraints\"],\n dependencies: [\"vector\"],\n description: \"Verlet integration with distance constraints.\",\n usage: `\\\n### physics-verlet — Verlet Integration\n\n\\`\\`\\`js\nvar sys = verletSystem([{x:0,y:0,fixed:true},{x:50,y:0},{x:100,y:0}]);\naddConstraint(sys, 0, 1); addConstraint(sys, 1, 2);\nsys.points[2].ay = 98; // gravity\nverletStep(sys, 1/60);\n\\`\\`\\`\n`,\n};\n\nexport default physicsVerlet;\n","import type { ComponentEntry } from \"../../types.js\";\n\nconst physicsRk4: ComponentEntry = {\n name: \"physics-rk4\",\n version: \"1.0.0\",\n category: \"physics\",\n target: \"js\",\n renderers: [],\n code: `\\\nfunction rk4Step(state, derivsFn, dt) {\n var n = state.length;\n var k1 = derivsFn(state);\n var s2 = new Array(n);\n for (var i = 0; i < n; i++) s2[i] = state[i] + k1[i] * dt / 2;\n var k2 = derivsFn(s2);\n var s3 = new Array(n);\n for (var i = 0; i < n; i++) s3[i] = state[i] + k2[i] * dt / 2;\n var k3 = derivsFn(s3);\n var s4 = new Array(n);\n for (var i = 0; i < n; i++) s4[i] = state[i] + k3[i] * dt;\n var k4 = derivsFn(s4);\n var result = new Array(n);\n for (var i = 0; i < n; i++)\n result[i] = state[i] + (k1[i] + 2*k2[i] + 2*k3[i] + k4[i]) * dt / 6;\n return result;\n}\n\nfunction rk4System(initialState, derivsFn, dt, steps) {\n var state = initialState.slice();\n var trajectory = [state.slice()];\n for (var s = 0; s < steps; s++) {\n state = rk4Step(state, derivsFn, dt);\n trajectory.push(state.slice());\n }\n return trajectory;\n}\n\nfunction lorenzAttractor(sigma, rho, beta) {\n sigma = sigma || 10; rho = rho || 28; beta = beta || 8/3;\n return function(state) {\n return [\n sigma * (state[1] - state[0]),\n state[0] * (rho - state[2]) - state[1],\n state[0] * state[1] - beta * state[2]\n ];\n };\n}\n\nfunction phasePortrait(derivsFn, xRange, yRange, gridSize) {\n var arrows = [];\n var dx = (xRange[1] - xRange[0]) / gridSize;\n var dy = (yRange[1] - yRange[0]) / gridSize;\n for (var i = 0; i <= gridSize; i++) {\n for (var j = 0; j <= gridSize; j++) {\n var x = xRange[0] + i * dx, y = yRange[0] + j * dy;\n var d = derivsFn([x, y]);\n arrows.push({ x: x, y: y, dx: d[0], dy: d[1] });\n }\n }\n return arrows;\n}\n`,\n exports: [\"rk4Step\", \"rk4System\", \"lorenzAttractor\", \"phasePortrait\"],\n dependencies: [\"vector\"],\n description: \"Runge-Kutta integration and common ODEs (Lorenz attractor).\",\n usage: `\\\n### physics-rk4 — RK4 Integration\n\n\\`\\`\\`js\nvar lorenz = lorenzAttractor(10, 28, 8/3);\nvar traj = rk4System([1,1,1], lorenz, 0.01, 5000);\n\\`\\`\\`\n`,\n};\n\nexport default physicsRk4;\n","import type { ComponentEntry } from \"../../types.js\";\n\nconst flowField: ComponentEntry = {\n name: \"flow-field\",\n version: \"1.0.0\",\n category: \"pattern\",\n target: \"js\",\n renderers: [],\n code: `\\\nfunction createFlowField(cols, rows, angleFn) {\n var field = new Float64Array(cols * rows);\n for (var y = 0; y < rows; y++)\n for (var x = 0; x < cols; x++)\n field[y * cols + x] = angleFn(x, y);\n return { field: field, cols: cols, rows: rows };\n}\n\nfunction flowFromNoise(noiseFn, cols, rows, scale) {\n return createFlowField(cols, rows, function(x, y) {\n return noiseFn(x * scale, y * scale) * Math.PI * 4;\n });\n}\n\nfunction flowFromFunction(fn, cols, rows) {\n return createFlowField(cols, rows, fn);\n}\n\nfunction traceStreamline(field, startX, startY, cellSize, steps, stepSize) {\n stepSize = stepSize || 1;\n var pts = [[startX, startY]];\n var x = startX, y = startY;\n for (var i = 0; i < steps; i++) {\n var gx = Math.floor(x / cellSize), gy = Math.floor(y / cellSize);\n if (gx < 0 || gx >= field.cols || gy < 0 || gy >= field.rows) break;\n var angle = field.field[gy * field.cols + gx];\n x += Math.cos(angle) * stepSize;\n y += Math.sin(angle) * stepSize;\n pts.push([x, y]);\n }\n return pts;\n}\n`,\n exports: [\"createFlowField\", \"traceStreamline\", \"flowFromNoise\", \"flowFromFunction\"],\n dependencies: [\"noise-2d\", \"vector\"],\n description: \"Flow field generation and streamline tracing.\",\n usage: `\\\n### flow-field — Flow Fields\n\n\\`\\`\\`js\nvar field = flowFromNoise(perlin2D(rng), 80, 60, 0.03);\nvar line = traceStreamline(field, startX, startY, 10, 200, 1);\n\\`\\`\\`\n`,\n};\n\nexport default flowField;\n","import type { ComponentEntry } from \"../../types.js\";\n\nconst lSystem: ComponentEntry = {\n name: \"l-system\",\n version: \"1.0.0\",\n category: \"pattern\",\n target: \"js\",\n renderers: [],\n code: `\\\nfunction createLSystem(axiom, rules) {\n return { axiom: axiom, rules: rules, current: axiom };\n}\n\nfunction iterateLSystem(system, iterations) {\n var str = system.current;\n for (var iter = 0; iter < iterations; iter++) {\n var next = '';\n for (var i = 0; i < str.length; i++) {\n var ch = str[i];\n next += system.rules[ch] !== undefined ? system.rules[ch] : ch;\n }\n str = next;\n }\n system.current = str;\n return str;\n}\n\nfunction turtleInterpret(str, stepLength, angleDeg) {\n var x = 0, y = 0, angle = -90;\n var rad = angleDeg * Math.PI / 180;\n var path = [[x, y]];\n var stack = [];\n for (var i = 0; i < str.length; i++) {\n var ch = str[i];\n if (ch === 'F' || ch === 'G') {\n x += Math.cos(angle * Math.PI / 180) * stepLength;\n y += Math.sin(angle * Math.PI / 180) * stepLength;\n path.push([x, y]);\n } else if (ch === 'f') {\n x += Math.cos(angle * Math.PI / 180) * stepLength;\n y += Math.sin(angle * Math.PI / 180) * stepLength;\n path.push(null);\n path.push([x, y]);\n } else if (ch === '+') { angle += angleDeg; }\n else if (ch === '-') { angle -= angleDeg; }\n else if (ch === '[') { stack.push({ x: x, y: y, angle: angle }); }\n else if (ch === ']') {\n var s = stack.pop();\n x = s.x; y = s.y; angle = s.angle;\n path.push(null);\n path.push([x, y]);\n }\n }\n return path;\n}\n`,\n exports: [\"createLSystem\", \"iterateLSystem\", \"turtleInterpret\"],\n dependencies: [\"math\"],\n description: \"L-system grammar iteration and turtle graphics interpretation.\",\n usage: `\\\n### l-system — L-Systems\n\n\\`\\`\\`js\nvar sys = createLSystem('F', { 'F': 'F[+F]F[-F]F' });\nvar str = iterateLSystem(sys, 4);\nvar path = turtleInterpret(str, 5, 25.7);\n\\`\\`\\`\n`,\n};\n\nexport default lSystem;\n","import type { ComponentEntry } from \"../../types.js\";\n\nconst reactionDiffusion: ComponentEntry = {\n name: \"reaction-diffusion\",\n version: \"1.0.0\",\n category: \"pattern\",\n target: \"js\",\n renderers: [],\n code: `\\\nfunction createGrayScottGrid(cols, rows) {\n var a = new Float64Array(cols * rows).fill(1);\n var b = new Float64Array(cols * rows).fill(0);\n return { a: a, b: b, cols: cols, rows: rows };\n}\n\nfunction grayScottStep(grid, feed, kill, dA, dB, dt) {\n feed = feed || 0.037; kill = kill || 0.06;\n dA = dA || 1.0; dB = dB || 0.5; dt = dt || 1.0;\n var cols = grid.cols, rows = grid.rows;\n var a = grid.a, b = grid.b;\n var na = new Float64Array(cols * rows);\n var nb = new Float64Array(cols * rows);\n for (var y = 0; y < rows; y++) {\n for (var x = 0; x < cols; x++) {\n var i = y * cols + x;\n var up = ((y-1+rows)%rows)*cols+x, dn = ((y+1)%rows)*cols+x;\n var lt = y*cols+(x-1+cols)%cols, rt = y*cols+(x+1)%cols;\n var lapA = a[up]+a[dn]+a[lt]+a[rt]-4*a[i];\n var lapB = b[up]+b[dn]+b[lt]+b[rt]-4*b[i];\n var abb = a[i] * b[i] * b[i];\n na[i] = a[i] + (dA * lapA - abb + feed * (1 - a[i])) * dt;\n nb[i] = b[i] + (dB * lapB + abb - (kill + feed) * b[i]) * dt;\n }\n }\n grid.a = na; grid.b = nb;\n return grid;\n}\n\nfunction turingPattern(cols, rows, steps, feed, kill, rng) {\n var grid = createGrayScottGrid(cols, rows);\n var cx = cols/2, cy = rows/2, r = Math.min(cols, rows)/6;\n for (var y = Math.floor(cy-r); y <= Math.ceil(cy+r); y++)\n for (var x = Math.floor(cx-r); x <= Math.ceil(cx+r); x++)\n if ((x-cx)*(x-cx)+(y-cy)*(y-cy) < r*r) {\n var i = y * cols + x;\n grid.b[i] = 1;\n if (rng) { grid.a[i] += (rng()-0.5)*0.01; grid.b[i] += (rng()-0.5)*0.01; }\n }\n for (var s = 0; s < steps; s++) grayScottStep(grid, feed, kill);\n return grid;\n}\n`,\n exports: [\"grayScottStep\", \"createGrayScottGrid\", \"turingPattern\"],\n dependencies: [],\n description: \"Reaction-diffusion simulation (Gray-Scott model).\",\n usage: `\\\n### reaction-diffusion — Gray-Scott\n\n\\`\\`\\`js\nvar grid = createGrayScottGrid(200, 200);\n// seed center region with chemical B\nfor (var s = 0; s < 5000; s++) grayScottStep(grid, 0.037, 0.06);\n// grid.b contains the pattern\n\\`\\`\\`\n`,\n};\n\nexport default reactionDiffusion;\n","import type { ComponentEntry } from \"../../types.js\";\n\nconst dla: ComponentEntry = {\n name: \"dla\",\n version: \"1.0.0\",\n category: \"pattern\",\n target: \"js\",\n renderers: [],\n code: `\\\nfunction diffusionLimitedAggregation(rng, width, height, seedCount, walkerCount, stickiness) {\n stickiness = stickiness || 1;\n var grid = new Uint8Array(width * height);\n for (var i = 0; i < seedCount; i++) {\n var sx = Math.floor(width / 2 + (rng() - 0.5) * 10);\n var sy = Math.floor(height / 2 + (rng() - 0.5) * 10);\n if (sx >= 0 && sx < width && sy >= 0 && sy < height) grid[sy * width + sx] = 1;\n }\n var attached = [];\n for (var y = 0; y < height; y++)\n for (var x = 0; x < width; x++)\n if (grid[y * width + x]) attached.push([x, y]);\n\n for (var w = 0; w < walkerCount; w++) {\n var wx = Math.floor(rng() * width), wy = Math.floor(rng() * height);\n var stuck = false;\n for (var step = 0; step < 10000 && !stuck; step++) {\n wx += Math.round(rng() * 2 - 1);\n wy += Math.round(rng() * 2 - 1);\n if (wx < 0 || wx >= width || wy < 0 || wy >= height) {\n wx = Math.floor(rng() * width);\n wy = Math.floor(rng() * height);\n continue;\n }\n for (var dx = -1; dx <= 1 && !stuck; dx++)\n for (var dy = -1; dy <= 1 && !stuck; dy++) {\n var nx = wx + dx, ny = wy + dy;\n if (nx >= 0 && nx < width && ny >= 0 && ny < height && grid[ny * width + nx]) {\n if (rng() < stickiness) {\n grid[wy * width + wx] = 1;\n attached.push([wx, wy]);\n stuck = true;\n }\n }\n }\n }\n }\n return { grid: grid, points: attached, width: width, height: height };\n}\n\nfunction dlaStep(state, rng, walkers, stickiness) {\n walkers = walkers || 100;\n stickiness = stickiness || 1;\n var w = state.width, h = state.height, grid = state.grid;\n for (var i = 0; i < walkers; i++) {\n var wx = Math.floor(rng() * w), wy = Math.floor(rng() * h);\n for (var step = 0; step < 500; step++) {\n wx += Math.round(rng() * 2 - 1);\n wy += Math.round(rng() * 2 - 1);\n if (wx < 0 || wx >= w || wy < 0 || wy >= h) break;\n var hasN = false;\n for (var dx = -1; dx <= 1 && !hasN; dx++)\n for (var dy = -1; dy <= 1 && !hasN; dy++) {\n var nx = wx + dx, ny = wy + dy;\n if (nx >= 0 && nx < w && ny >= 0 && ny < h && grid[ny * w + nx]) hasN = true;\n }\n if (hasN && rng() < stickiness) {\n grid[wy * w + wx] = 1;\n state.points.push([wx, wy]);\n break;\n }\n }\n }\n return state;\n}\n`,\n exports: [\"diffusionLimitedAggregation\", \"dlaStep\"],\n dependencies: [\"prng\"],\n description: \"Diffusion-limited aggregation (DLA) pattern generation.\",\n usage: `\\\n### dla — Diffusion-Limited Aggregation\n\n\\`\\`\\`js\nvar state = diffusionLimitedAggregation(rng, 400, 400, 1, 5000, 0.8);\n// state.grid — occupancy grid\n// state.points — attached point coordinates\n\\`\\`\\`\n`,\n};\n\nexport default dla;\n","import type { ComponentEntry } from \"../../types.js\";\n\nconst boids: ComponentEntry = {\n name: \"boids\",\n version: \"1.0.0\",\n category: \"particle\",\n target: \"js\",\n renderers: [],\n code: `\\\nfunction createBoidSystem(count, rng, width, height) {\n var boids = [];\n for (var i = 0; i < count; i++) {\n var angle = rng() * Math.PI * 2;\n var speed = 1 + rng() * 2;\n boids.push({\n x: rng() * width, y: rng() * height,\n vx: Math.cos(angle) * speed, vy: Math.sin(angle) * speed\n });\n }\n return { boids: boids, width: width, height: height };\n}\n\nfunction separationForce(boid, neighbors, sepDist) {\n var sx = 0, sy = 0;\n for (var i = 0; i < neighbors.length; i++) {\n var dx = boid.x - neighbors[i].x, dy = boid.y - neighbors[i].y;\n var d = Math.sqrt(dx*dx + dy*dy);\n if (d > 0 && d < sepDist) { sx += dx / d; sy += dy / d; }\n }\n return [sx, sy];\n}\n\nfunction alignmentForce(boid, neighbors) {\n if (neighbors.length === 0) return [0, 0];\n var ax = 0, ay = 0;\n for (var i = 0; i < neighbors.length; i++) {\n ax += neighbors[i].vx; ay += neighbors[i].vy;\n }\n return [(ax / neighbors.length - boid.vx) * 0.1, (ay / neighbors.length - boid.vy) * 0.1];\n}\n\nfunction cohesionForce(boid, neighbors) {\n if (neighbors.length === 0) return [0, 0];\n var cx = 0, cy = 0;\n for (var i = 0; i < neighbors.length; i++) {\n cx += neighbors[i].x; cy += neighbors[i].y;\n }\n return [(cx / neighbors.length - boid.x) * 0.005, (cy / neighbors.length - boid.y) * 0.005];\n}\n\nfunction updateBoids(system, perception, sepDist, maxSpeed) {\n perception = perception || 50; sepDist = sepDist || 25; maxSpeed = maxSpeed || 4;\n for (var i = 0; i < system.boids.length; i++) {\n var b = system.boids[i];\n var neighbors = [];\n for (var j = 0; j < system.boids.length; j++) {\n if (i === j) continue;\n var dx = system.boids[j].x - b.x, dy = system.boids[j].y - b.y;\n if (dx*dx + dy*dy < perception * perception) neighbors.push(system.boids[j]);\n }\n var sep = separationForce(b, neighbors, sepDist);\n var ali = alignmentForce(b, neighbors);\n var coh = cohesionForce(b, neighbors);\n b.vx += sep[0] * 0.15 + ali[0] + coh[0];\n b.vy += sep[1] * 0.15 + ali[1] + coh[1];\n var spd = Math.sqrt(b.vx*b.vx + b.vy*b.vy);\n if (spd > maxSpeed) { b.vx = b.vx/spd*maxSpeed; b.vy = b.vy/spd*maxSpeed; }\n b.x += b.vx; b.y += b.vy;\n if (b.x < 0) b.x += system.width;\n if (b.x > system.width) b.x -= system.width;\n if (b.y < 0) b.y += system.height;\n if (b.y > system.height) b.y -= system.height;\n }\n}\n`,\n exports: [\"createBoidSystem\", \"updateBoids\", \"separationForce\", \"alignmentForce\", \"cohesionForce\"],\n dependencies: [\"vector\"],\n description: \"Boid flocking algorithm (separation, alignment, cohesion).\",\n usage: `\\\n### boids — Flocking Algorithm\n\n\\`\\`\\`js\nvar sys = createBoidSystem(200, rng, width, height);\nupdateBoids(sys, 50, 25, 4);\nsys.boids.forEach(function(b) { drawBoid(b); });\n\\`\\`\\`\n`,\n};\n\nexport default boids;\n","import type { ComponentEntry } from \"../../types.js\";\n\nconst wave: ComponentEntry = {\n name: \"wave\",\n version: \"1.0.0\",\n category: \"animation\",\n target: \"js\",\n renderers: [],\n code: `\\\nfunction sineWave(t, freq, amp, phase) {\n return (amp || 1) * Math.sin(2 * Math.PI * (freq || 1) * t + (phase || 0));\n}\n\nfunction squareWave(t, freq) {\n return Math.sin(2 * Math.PI * (freq || 1) * t) >= 0 ? 1 : -1;\n}\n\nfunction sawtoothWave(t, freq) {\n var p = t * (freq || 1);\n return 2 * (p - Math.floor(p + 0.5));\n}\n\nfunction triangleWave(t, freq) {\n var p = t * (freq || 1);\n return 4 * Math.abs(p - Math.floor(p + 0.75) + 0.25) - 1;\n}\n\nfunction waveSum(waveFns, t) {\n var sum = 0;\n for (var i = 0; i < waveFns.length; i++) sum += waveFns[i](t);\n return sum;\n}\n\nfunction standingWave(x, t, freq, wavelength) {\n return Math.sin(2 * Math.PI * x / (wavelength || 1)) * Math.cos(2 * Math.PI * (freq || 1) * t);\n}\n`,\n exports: [\"sineWave\", \"squareWave\", \"sawtoothWave\", \"triangleWave\", \"waveSum\", \"standingWave\"],\n dependencies: [\"math\"],\n description: \"Periodic wave functions (sine, square, sawtooth, triangle).\",\n usage: `\\\n### wave — Wave Functions\n\n\\`\\`\\`js\nsineWave(t, 2, 1, 0); // 2 Hz sine\nsquareWave(t, 1); // 1 Hz square\ntriangleWave(t, 0.5); // 0.5 Hz triangle\nstandingWave(x, t, 1, 100);\n\\`\\`\\`\n`,\n};\n\nexport default wave;\n","import type { ComponentEntry } from \"../../types.js\";\n\nconst animation: ComponentEntry = {\n name: \"animation\",\n version: \"1.0.0\",\n category: \"animation\",\n target: \"js\",\n renderers: [],\n code: `\\\nfunction pingPong(t) {\n t = t % 2;\n return t <= 1 ? t : 2 - t;\n}\n\nfunction loop(t, duration) {\n return (t % duration) / duration;\n}\n\nfunction oscillate(t, min, max, freq) {\n return min + (max - min) * 0.5 * (1 + Math.sin(2 * Math.PI * (freq || 1) * t));\n}\n\nfunction stagger(index, total, duration, offset) {\n offset = offset || 0.1;\n return Math.max(0, Math.min(1, (duration - index * offset) / (duration - (total-1) * offset)));\n}\n\nfunction timeline(t, keyframes) {\n for (var i = 0; i < keyframes.length - 1; i++) {\n var a = keyframes[i], b = keyframes[i+1];\n if (t >= a.t && t <= b.t) {\n var p = (t - a.t) / (b.t - a.t);\n if (b.ease) p = b.ease(p);\n return a.value + (b.value - a.value) * p;\n }\n }\n return keyframes[keyframes.length - 1].value;\n}\n\nfunction sequence(t, segments) {\n var totalDuration = 0;\n for (var i = 0; i < segments.length; i++) totalDuration += segments[i].duration;\n t = t % totalDuration;\n var elapsed = 0;\n for (var i = 0; i < segments.length; i++) {\n if (t < elapsed + segments[i].duration) {\n var local = (t - elapsed) / segments[i].duration;\n return segments[i].fn(local);\n }\n elapsed += segments[i].duration;\n }\n return segments[segments.length - 1].fn(1);\n}\n`,\n exports: [\"pingPong\", \"loop\", \"oscillate\", \"stagger\", \"timeline\", \"sequence\"],\n dependencies: [\"math\", \"easing\"],\n description: \"Animation timing utilities (ping-pong, stagger, timeline, sequence).\",\n usage: `\\\n### animation — Timing Utilities\n\n\\`\\`\\`js\npingPong(t); // 0→1→0→1...\nloop(t, 5); // repeats every 5 seconds\noscillate(t, 0, 100, 2); // bounces 0↔100 at 2 Hz\ntimeline(t, [\n { t: 0, value: 0 },\n { t: 1, value: 100, ease: easeInOutCubic },\n { t: 2, value: 50 }\n]);\n\\`\\`\\`\n`,\n};\n\nexport default animation;\n","import type { ComponentEntry } from \"../../types.js\";\n\nconst quadtree: ComponentEntry = {\n name: \"quadtree\",\n version: \"1.0.0\",\n category: \"data-structure\",\n target: \"js\",\n renderers: [],\n code: `\\\nfunction createQuadTree(x, y, w, h, capacity) {\n return { x: x, y: y, w: w, h: h, capacity: capacity || 4, points: [], children: null };\n}\n\nfunction insertPoint(qt, px, py, data) {\n if (px < qt.x || px >= qt.x + qt.w || py < qt.y || py >= qt.y + qt.h) return false;\n if (qt.points.length < qt.capacity && !qt.children) {\n qt.points.push({ x: px, y: py, data: data });\n return true;\n }\n if (!qt.children) {\n var hw = qt.w/2, hh = qt.h/2;\n qt.children = [\n createQuadTree(qt.x, qt.y, hw, hh, qt.capacity),\n createQuadTree(qt.x+hw, qt.y, hw, hh, qt.capacity),\n createQuadTree(qt.x, qt.y+hh, hw, hh, qt.capacity),\n createQuadTree(qt.x+hw, qt.y+hh, hw, hh, qt.capacity)\n ];\n for (var i = 0; i < qt.points.length; i++) {\n var p = qt.points[i];\n for (var c = 0; c < 4; c++) if (insertPoint(qt.children[c], p.x, p.y, p.data)) break;\n }\n qt.points = [];\n }\n for (var c = 0; c < 4; c++) if (insertPoint(qt.children[c], px, py, data)) return true;\n return false;\n}\n\nfunction queryRange(qt, rx, ry, rw, rh) {\n var found = [];\n if (qt.x + qt.w < rx || qt.x > rx + rw || qt.y + qt.h < ry || qt.y > ry + rh) return found;\n for (var i = 0; i < qt.points.length; i++) {\n var p = qt.points[i];\n if (p.x >= rx && p.x <= rx + rw && p.y >= ry && p.y <= ry + rh) found.push(p);\n }\n if (qt.children) {\n for (var c = 0; c < 4; c++) found = found.concat(queryRange(qt.children[c], rx, ry, rw, rh));\n }\n return found;\n}\n\nfunction queryRadius(qt, cx, cy, r) {\n var found = [];\n var r2 = r * r;\n function search(node) {\n if (cx - r > node.x + node.w || cx + r < node.x || cy - r > node.y + node.h || cy + r < node.y) return;\n for (var i = 0; i < node.points.length; i++) {\n var p = node.points[i];\n var dx = p.x - cx, dy = p.y - cy;\n if (dx*dx + dy*dy <= r2) found.push(p);\n }\n if (node.children) for (var c = 0; c < 4; c++) search(node.children[c]);\n }\n search(qt);\n return found;\n}\n`,\n exports: [\"createQuadTree\", \"insertPoint\", \"queryRange\", \"queryRadius\"],\n dependencies: [],\n description: \"Quadtree spatial index for efficient neighbor queries.\",\n usage: `\\\n### quadtree — Spatial Index\n\n\\`\\`\\`js\nvar qt = createQuadTree(0, 0, 800, 600, 8);\npoints.forEach(function(p) { insertPoint(qt, p.x, p.y, p); });\nvar nearby = queryRadius(qt, mouseX, mouseY, 50);\n\\`\\`\\`\n`,\n};\n\nexport default quadtree;\n","import type { ComponentEntry } from \"../../types.js\";\n\nconst spatialHash: ComponentEntry = {\n name: \"spatial-hash\",\n version: \"1.0.0\",\n category: \"data-structure\",\n target: \"js\",\n renderers: [],\n code: `\\\nfunction createSpatialHash(cellSize) {\n return { cellSize: cellSize, cells: {} };\n}\n\nfunction insertCell(hash, x, y, data) {\n var cx = Math.floor(x / hash.cellSize);\n var cy = Math.floor(y / hash.cellSize);\n var key = cx + ',' + cy;\n if (!hash.cells[key]) hash.cells[key] = [];\n hash.cells[key].push({ x: x, y: y, data: data });\n}\n\nfunction queryNearby(hash, x, y, radius) {\n var cs = hash.cellSize;\n var minCx = Math.floor((x - radius) / cs);\n var maxCx = Math.floor((x + radius) / cs);\n var minCy = Math.floor((y - radius) / cs);\n var maxCy = Math.floor((y + radius) / cs);\n var r2 = radius * radius;\n var results = [];\n for (var cy = minCy; cy <= maxCy; cy++) {\n for (var cx = minCx; cx <= maxCx; cx++) {\n var cell = hash.cells[cx + ',' + cy];\n if (!cell) continue;\n for (var i = 0; i < cell.length; i++) {\n var p = cell[i];\n var dx = p.x - x, dy = p.y - y;\n if (dx * dx + dy * dy <= r2) results.push(p);\n }\n }\n }\n return results;\n}\n`,\n exports: [\"createSpatialHash\", \"insertCell\", \"queryNearby\"],\n dependencies: [],\n description: \"Grid-based spatial hashing for fast neighbor lookups.\",\n usage: `\\\n### spatial-hash — Spatial Hashing\n\n\\`\\`\\`js\nvar hash = createSpatialHash(50);\npoints.forEach(function(p) { insertCell(hash, p.x, p.y, p); });\nvar nearby = queryNearby(hash, x, y, 100);\n\\`\\`\\`\n`,\n};\n\nexport default spatialHash;\n","import type { ComponentEntry } from \"../../types.js\";\n\nconst turtle: ComponentEntry = {\n name: \"turtle\",\n version: \"1.0.0\",\n category: \"geometry\",\n target: \"js\",\n renderers: [],\n code: `\\\nfunction createTurtle(x, y, angle) {\n return { x: x || 0, y: y || 0, angle: angle || 0, pen: true, path: [[x || 0, y || 0]] };\n}\n\nfunction forward(t, dist) {\n var rad = t.angle * Math.PI / 180;\n t.x += Math.cos(rad) * dist;\n t.y += Math.sin(rad) * dist;\n if (t.pen) t.path.push([t.x, t.y]);\n return t;\n}\n\nfunction turn(t, degrees) {\n t.angle += degrees;\n return t;\n}\n\nfunction penUp(t) {\n t.pen = false;\n return t;\n}\n\nfunction penDown(t) {\n t.pen = true;\n t.path.push(null);\n t.path.push([t.x, t.y]);\n return t;\n}\n\nfunction getPath(t) {\n return t.path;\n}\n`,\n exports: [\"createTurtle\", \"forward\", \"turn\", \"penUp\", \"penDown\", \"getPath\"],\n dependencies: [\"vector\"],\n description: \"Turtle graphics state machine for path generation.\",\n usage: `\\\n### turtle — Turtle Graphics\n\n\\`\\`\\`js\nvar t = createTurtle(400, 300, 0);\nfor (var i = 0; i < 360; i++) { forward(t, 2); turn(t, 1); }\nvar path = getPath(t); // circle-like path\n\\`\\`\\`\n`,\n};\n\nexport default turtle;\n","import type { ComponentEntry } from \"../../types.js\";\n\nconst svgPath: ComponentEntry = {\n name: \"svg-path\",\n version: \"1.0.0\",\n category: \"geometry\",\n target: \"js\",\n renderers: [],\n code: `\\\nfunction pathFromPoints(points, closed) {\n if (!points.length) return '';\n var d = 'M ' + points[0][0] + ' ' + points[0][1];\n for (var i = 1; i < points.length; i++) {\n if (points[i] === null) {\n if (i + 1 < points.length && points[i + 1]) {\n d += ' M ' + points[i + 1][0] + ' ' + points[i + 1][1];\n i++;\n }\n } else {\n d += ' L ' + points[i][0] + ' ' + points[i][1];\n }\n }\n if (closed) d += ' Z';\n return d;\n}\n\nfunction arcPath(cx, cy, r, startAngle, endAngle) {\n var x1 = cx + r * Math.cos(startAngle), y1 = cy + r * Math.sin(startAngle);\n var x2 = cx + r * Math.cos(endAngle), y2 = cy + r * Math.sin(endAngle);\n var largeArc = Math.abs(endAngle - startAngle) > Math.PI ? 1 : 0;\n return 'M ' + x1 + ' ' + y1 + ' A ' + r + ' ' + r + ' 0 ' + largeArc + ' 1 ' + x2 + ' ' + y2;\n}\n\nfunction bezierPath(points) {\n if (points.length < 4) return pathFromPoints(points);\n var d = 'M ' + points[0][0] + ' ' + points[0][1];\n for (var i = 1; i + 2 < points.length; i += 3) {\n d += ' C ' + points[i][0] + ' ' + points[i][1] + ', ' +\n points[i+1][0] + ' ' + points[i+1][1] + ', ' +\n points[i+2][0] + ' ' + points[i+2][1];\n }\n return d;\n}\n\nfunction closePath(d) { return d + ' Z'; }\n\nfunction pathToString(segments) {\n return segments.join(' ');\n}\n`,\n exports: [\"pathFromPoints\", \"arcPath\", \"bezierPath\", \"closePath\", \"pathToString\"],\n dependencies: [],\n description: \"SVG path string builders (points to path, arcs, bezier curves).\",\n usage: `\\\n### svg-path — SVG Path Builders\n\n\\`\\`\\`js\nvar d = pathFromPoints(points, true); // closed polygon\nvar arc = arcPath(100, 100, 50, 0, Math.PI);\nvar curve = bezierPath(controlPoints);\n\\`\\`\\`\n`,\n};\n\nexport default svgPath;\n","import type { ComponentEntry } from \"../../types.js\";\n\nconst canvasUtils: ComponentEntry = {\n name: \"canvas-utils\",\n version: \"1.0.0\",\n category: \"imaging\",\n target: \"js\",\n renderers: [],\n code: `\\\nfunction pixelAt(imageData, x, y) {\n var i = (y * imageData.width + x) * 4;\n return [imageData.data[i], imageData.data[i+1], imageData.data[i+2], imageData.data[i+3]];\n}\n\nfunction setPixelAt(imageData, x, y, r, g, b, a) {\n var i = (y * imageData.width + x) * 4;\n imageData.data[i] = r; imageData.data[i+1] = g;\n imageData.data[i+2] = b; imageData.data[i+3] = a !== undefined ? a : 255;\n}\n\nfunction forEachPixel(imageData, fn) {\n for (var y = 0; y < imageData.height; y++)\n for (var x = 0; x < imageData.width; x++) {\n var i = (y * imageData.width + x) * 4;\n fn(x, y, imageData.data[i], imageData.data[i+1], imageData.data[i+2], imageData.data[i+3], i);\n }\n}\n\nfunction convolve3x3(imageData, kernel) {\n var w = imageData.width, h = imageData.height;\n var src = new Uint8ClampedArray(imageData.data);\n for (var y = 1; y < h-1; y++)\n for (var x = 1; x < w-1; x++) {\n var r=0,g=0,b=0;\n for (var ky = -1; ky <= 1; ky++)\n for (var kx = -1; kx <= 1; kx++) {\n var i = ((y+ky)*w+(x+kx))*4;\n var k = kernel[(ky+1)*3+(kx+1)];\n r += src[i]*k; g += src[i+1]*k; b += src[i+2]*k;\n }\n var oi = (y*w+x)*4;\n imageData.data[oi] = Math.max(0,Math.min(255,r));\n imageData.data[oi+1] = Math.max(0,Math.min(255,g));\n imageData.data[oi+2] = Math.max(0,Math.min(255,b));\n }\n}\n\nfunction threshold(imageData, level) {\n for (var i = 0; i < imageData.data.length; i += 4) {\n var v = (imageData.data[i]*0.299 + imageData.data[i+1]*0.587 + imageData.data[i+2]*0.114) >= level ? 255 : 0;\n imageData.data[i] = imageData.data[i+1] = imageData.data[i+2] = v;\n }\n}\n\nfunction dither(imageData) {\n var w = imageData.width, h = imageData.height;\n var buf = new Float64Array(w * h);\n for (var i = 0; i < buf.length; i++)\n buf[i] = imageData.data[i*4]*0.299 + imageData.data[i*4+1]*0.587 + imageData.data[i*4+2]*0.114;\n for (var y = 0; y < h; y++)\n for (var x = 0; x < w; x++) {\n var old = buf[y*w+x];\n var nw = old < 128 ? 0 : 255;\n buf[y*w+x] = nw;\n var err = old - nw;\n if (x+1<w) buf[y*w+x+1] += err*7/16;\n if (y+1<h) {\n if (x>0) buf[(y+1)*w+x-1] += err*3/16;\n buf[(y+1)*w+x] += err*5/16;\n if (x+1<w) buf[(y+1)*w+x+1] += err/16;\n }\n }\n for (var i = 0; i < buf.length; i++) {\n var v = Math.max(0, Math.min(255, Math.round(buf[i])));\n imageData.data[i*4] = imageData.data[i*4+1] = imageData.data[i*4+2] = v;\n }\n}\n`,\n exports: [\"pixelAt\", \"setPixelAt\", \"forEachPixel\", \"convolve3x3\", \"threshold\", \"dither\"],\n dependencies: [],\n description: \"ImageData pixel manipulation (read, write, convolve, dither).\",\n usage: `\\\n### canvas-utils — Pixel Manipulation\n\n\\`\\`\\`js\nvar px = pixelAt(imageData, x, y); // [r, g, b, a]\nsetPixelAt(imageData, x, y, 255, 0, 0);\nconvolve3x3(imageData, [0,-1,0,-1,5,-1,0,-1,0]); // sharpen\nthreshold(imageData, 128);\ndither(imageData); // Floyd-Steinberg\n\\`\\`\\`\n`,\n};\n\nexport default canvasUtils;\n","export { default as glslNoise } from \"./noise.js\";\nexport { default as glslNoise3d } from \"./noise-3d.js\";\nexport { default as glslNoise4d } from \"./noise-4d.js\";\nexport { default as glslCurl } from \"./curl.js\";\nexport { default as glslSdf } from \"./sdf.js\";\nexport { default as glslSdf3d } from \"./sdf-3d.js\";\nexport { default as glslColor } from \"./color.js\";\nexport { default as glslPattern } from \"./pattern.js\";\nexport { default as glslTransform } from \"./transform.js\";\nexport { default as glslMath } from \"./math.js\";\nexport { default as glslEasing } from \"./easing.js\";\nexport { default as glslBlend } from \"./blend.js\";\nexport { default as glslLighting } from \"./lighting.js\";\nexport { default as glslRay } from \"./ray.js\";\nexport { default as glslPost } from \"./post.js\";\nexport { default as glslShape } from \"./shape.js\";\nexport { default as glslDomain } from \"./domain.js\";\nexport { default as glslGradient } from \"./gradient.js\";\n","import type { ComponentEntry } from \"../../types.js\";\n\nconst glslNoise: ComponentEntry = {\n name: \"glsl-noise\",\n version: \"1.0.0\",\n category: \"noise\",\n target: \"glsl\",\n renderers: [],\n code: `\\\nfloat hash(vec2 p) {\n return fract(sin(dot(p, vec2(127.1, 311.7))) * 43758.5453);\n}\n\nfloat noise(vec2 p) {\n vec2 i = floor(p);\n vec2 f = fract(p);\n f = f * f * (3.0 - 2.0 * f);\n float a = hash(i);\n float b = hash(i + vec2(1.0, 0.0));\n float c = hash(i + vec2(0.0, 1.0));\n float d = hash(i + vec2(1.0, 1.0));\n return mix(mix(a, b, f.x), mix(c, d, f.x), f.y);\n}\n\nfloat fbm(vec2 p, int octaves) {\n float val = 0.0, amp = 0.5;\n for (int i = 0; i < 8; i++) {\n if (i >= octaves) break;\n val += amp * noise(p);\n p *= 2.0;\n amp *= 0.5;\n }\n return val;\n}\n\nfloat voronoi(vec2 p) {\n vec2 n = floor(p);\n vec2 f = fract(p);\n float minDist = 1.0;\n for (int j = -1; j <= 1; j++) {\n for (int i = -1; i <= 1; i++) {\n vec2 g = vec2(float(i), float(j));\n vec2 o = vec2(hash(n + g), hash(n + g + vec2(37.0, 17.0)));\n vec2 diff = g + o - f;\n minDist = min(minDist, dot(diff, diff));\n }\n }\n return sqrt(minDist);\n}\n`,\n exports: [\"hash\", \"noise\", \"fbm\", \"voronoi\"],\n dependencies: [],\n description: \"Standard GLSL noise stack (hash, value noise, fBm, Voronoi).\",\n usage: `\\\n### glsl-noise — GLSL Noise\n\n\\`\\`\\`glsl\nfloat n = noise(uv * 10.0);\nfloat f = fbm(uv * 5.0, 6);\nfloat v = voronoi(uv * 8.0);\n\\`\\`\\`\n`,\n};\n\nexport default glslNoise;\n","import type { ComponentEntry } from \"../../types.js\";\n\nconst glslNoise3d: ComponentEntry = {\n name: \"glsl-noise-3d\",\n version: \"1.0.0\",\n category: \"noise\",\n target: \"glsl\",\n renderers: [],\n code: `\\\nfloat hash3(vec3 p) {\n p = fract(p * vec3(443.897, 441.423, 437.195));\n p += dot(p, p.yzx + 19.19);\n return fract((p.x + p.y) * p.z);\n}\n\nfloat noise3(vec3 p) {\n vec3 i = floor(p);\n vec3 f = fract(p);\n f = f * f * (3.0 - 2.0 * f);\n float a = hash3(i);\n float b = hash3(i + vec3(1.0, 0.0, 0.0));\n float c = hash3(i + vec3(0.0, 1.0, 0.0));\n float d = hash3(i + vec3(1.0, 1.0, 0.0));\n float e = hash3(i + vec3(0.0, 0.0, 1.0));\n float f2 = hash3(i + vec3(1.0, 0.0, 1.0));\n float g = hash3(i + vec3(0.0, 1.0, 1.0));\n float h = hash3(i + vec3(1.0, 1.0, 1.0));\n float x1 = mix(mix(a, b, f.x), mix(c, d, f.x), f.y);\n float x2 = mix(mix(e, f2, f.x), mix(g, h, f.x), f.y);\n return mix(x1, x2, f.z);\n}\n\nfloat fbm3(vec3 p, int octaves) {\n float val = 0.0, amp = 0.5;\n for (int i = 0; i < 8; i++) {\n if (i >= octaves) break;\n val += amp * noise3(p);\n p *= 2.0;\n amp *= 0.5;\n }\n return val;\n}\n`,\n exports: [\"hash3\", \"noise3\", \"fbm3\"],\n dependencies: [],\n description: \"3D GLSL noise (hash, value noise, fBm).\",\n usage: `\\\n### glsl-noise-3d — 3D Noise\n\n\\`\\`\\`glsl\nfloat n = noise3(vec3(uv * 5.0, u_time));\nfloat f = fbm3(vec3(uv * 3.0, u_time * 0.5), 6);\n\\`\\`\\`\n`,\n};\n\nexport default glslNoise3d;\n","import type { ComponentEntry } from \"../../types.js\";\n\nconst glslNoise4d: ComponentEntry = {\n name: \"glsl-noise-4d\",\n version: \"1.0.0\",\n category: \"noise\",\n target: \"glsl\",\n renderers: [],\n code: `\\\nfloat noise4(vec4 p) {\n vec4 i = floor(p);\n vec4 f = fract(p);\n f = f * f * (3.0 - 2.0 * f);\n float h1 = fract(sin(dot(i, vec4(127.1,311.7,269.5,183.3))) * 43758.5453);\n float h2 = fract(sin(dot(i + vec4(1,0,0,0), vec4(127.1,311.7,269.5,183.3))) * 43758.5453);\n float h3 = fract(sin(dot(i + vec4(0,1,0,0), vec4(127.1,311.7,269.5,183.3))) * 43758.5453);\n float h4 = fract(sin(dot(i + vec4(1,1,0,0), vec4(127.1,311.7,269.5,183.3))) * 43758.5453);\n float h5 = fract(sin(dot(i + vec4(0,0,1,0), vec4(127.1,311.7,269.5,183.3))) * 43758.5453);\n float h6 = fract(sin(dot(i + vec4(1,0,1,0), vec4(127.1,311.7,269.5,183.3))) * 43758.5453);\n float h7 = fract(sin(dot(i + vec4(0,1,1,0), vec4(127.1,311.7,269.5,183.3))) * 43758.5453);\n float h8 = fract(sin(dot(i + vec4(1,1,1,0), vec4(127.1,311.7,269.5,183.3))) * 43758.5453);\n float h9 = fract(sin(dot(i + vec4(0,0,0,1), vec4(127.1,311.7,269.5,183.3))) * 43758.5453);\n float h10 = fract(sin(dot(i + vec4(1,0,0,1), vec4(127.1,311.7,269.5,183.3))) * 43758.5453);\n float h11 = fract(sin(dot(i + vec4(0,1,0,1), vec4(127.1,311.7,269.5,183.3))) * 43758.5453);\n float h12 = fract(sin(dot(i + vec4(1,1,0,1), vec4(127.1,311.7,269.5,183.3))) * 43758.5453);\n float h13 = fract(sin(dot(i + vec4(0,0,1,1), vec4(127.1,311.7,269.5,183.3))) * 43758.5453);\n float h14 = fract(sin(dot(i + vec4(1,0,1,1), vec4(127.1,311.7,269.5,183.3))) * 43758.5453);\n float h15 = fract(sin(dot(i + vec4(0,1,1,1), vec4(127.1,311.7,269.5,183.3))) * 43758.5453);\n float h16 = fract(sin(dot(i + vec4(1,1,1,1), vec4(127.1,311.7,269.5,183.3))) * 43758.5453);\n float x1 = mix(mix(h1,h2,f.x), mix(h3,h4,f.x), f.y);\n float x2 = mix(mix(h5,h6,f.x), mix(h7,h8,f.x), f.y);\n float x3 = mix(mix(h9,h10,f.x), mix(h11,h12,f.x), f.y);\n float x4 = mix(mix(h13,h14,f.x), mix(h15,h16,f.x), f.y);\n return mix(mix(x1,x2,f.z), mix(x3,x4,f.z), f.w);\n}\n\nfloat fbm4(vec4 p, int octaves) {\n float val = 0.0, amp = 0.5;\n for (int i = 0; i < 8; i++) {\n if (i >= octaves) break;\n val += amp * noise4(p);\n p *= 2.0;\n amp *= 0.5;\n }\n return val;\n}\n`,\n exports: [\"noise4\", \"fbm4\"],\n dependencies: [],\n description: \"4D GLSL noise for loopable animations.\",\n usage: `\\\n### glsl-noise-4d — 4D Noise\n\n\\`\\`\\`glsl\nfloat n = noise4(vec4(uv * 5.0, cos(t) * r, sin(t) * r));\n\\`\\`\\`\n`,\n};\n\nexport default glslNoise4d;\n","import type { ComponentEntry } from \"../../types.js\";\n\nconst glslCurl: ComponentEntry = {\n name: \"glsl-curl\",\n version: \"1.0.0\",\n category: \"noise\",\n target: \"glsl\",\n renderers: [],\n code: `\\\nvec2 curlNoise(vec2 p) {\n float eps = 0.001;\n float n1 = noise(p + vec2(eps, 0.0));\n float n2 = noise(p - vec2(eps, 0.0));\n float n3 = noise(p + vec2(0.0, eps));\n float n4 = noise(p - vec2(0.0, eps));\n float dndx = (n1 - n2) / (2.0 * eps);\n float dndy = (n3 - n4) / (2.0 * eps);\n return vec2(dndy, -dndx);\n}\n`,\n exports: [\"curlNoise\"],\n dependencies: [\"glsl-noise\"],\n description: \"GLSL curl noise for divergence-free flow.\",\n usage: `\\\n### glsl-curl — Curl Noise\n\n\\`\\`\\`glsl\nvec2 flow = curlNoise(uv * 5.0);\n\\`\\`\\`\n`,\n};\n\nexport default glslCurl;\n","import type { ComponentEntry } from \"../../types.js\";\n\nconst glslSdf: ComponentEntry = {\n name: \"glsl-sdf\",\n version: \"1.0.0\",\n category: \"sdf\",\n target: \"glsl\",\n renderers: [],\n code: `\\\nfloat sdCircle(vec2 p, float r) {\n return length(p) - r;\n}\n\nfloat sdBox(vec2 p, vec2 b) {\n vec2 d = abs(p) - b;\n return length(max(d, 0.0)) + min(max(d.x, d.y), 0.0);\n}\n\nfloat sdLine(vec2 p, vec2 a, vec2 b) {\n vec2 pa = p - a, ba = b - a;\n float h = clamp(dot(pa, ba) / dot(ba, ba), 0.0, 1.0);\n return length(pa - ba * h);\n}\n\nfloat sdPolygon(vec2 p, vec2 v[8], int n) {\n float d = dot(p - v[0], p - v[0]);\n float s = 1.0;\n for (int i = 0, j = n - 1; i < 8; j = i, i++) {\n if (i >= n) break;\n vec2 e = v[j] - v[i];\n vec2 w = p - v[i];\n vec2 b = w - e * clamp(dot(w, e) / dot(e, e), 0.0, 1.0);\n d = min(d, dot(b, b));\n bvec3 cond = bvec3(p.y >= v[i].y, p.y < v[j].y, e.x * w.y > e.y * w.x);\n if (all(cond) || all(not(cond))) s *= -1.0;\n }\n return s * sqrt(d);\n}\n\nfloat sdRing(vec2 p, float r, float thickness) {\n return abs(length(p) - r) - thickness;\n}\n\nfloat opUnion(float d1, float d2) { return min(d1, d2); }\nfloat opSubtract(float d1, float d2) { return max(-d1, d2); }\nfloat opIntersect(float d1, float d2) { return max(d1, d2); }\nfloat opSmooth(float d1, float d2, float k) {\n float h = clamp(0.5 + 0.5 * (d2 - d1) / k, 0.0, 1.0);\n return mix(d2, d1, h) - k * h * (1.0 - h);\n}\n`,\n exports: [\"sdCircle\", \"sdBox\", \"sdLine\", \"sdPolygon\", \"sdRing\", \"opUnion\", \"opSubtract\", \"opIntersect\", \"opSmooth\"],\n dependencies: [],\n description: \"2D signed distance functions and CSG operations.\",\n usage: `\\\n### glsl-sdf — 2D SDF\n\n\\`\\`\\`glsl\nfloat d = sdCircle(uv - 0.5, 0.2);\nd = opSmooth(d, sdBox(uv - vec2(0.7), vec2(0.1)), 0.05);\nvec3 col = mix(vec3(1), vec3(0), smoothstep(0.0, 0.01, d));\n\\`\\`\\`\n`,\n};\n\nexport default glslSdf;\n","import type { ComponentEntry } from \"../../types.js\";\n\nconst glslSdf3d: ComponentEntry = {\n name: \"glsl-sdf-3d\",\n version: \"1.0.0\",\n category: \"sdf\",\n target: \"glsl\",\n renderers: [],\n code: `\\\nfloat sdSphere(vec3 p, float r) { return length(p) - r; }\n\nfloat sdBox3(vec3 p, vec3 b) {\n vec3 d = abs(p) - b;\n return length(max(d, 0.0)) + min(max(d.x, max(d.y, d.z)), 0.0);\n}\n\nfloat sdCylinder(vec3 p, float h, float r) {\n vec2 d = abs(vec2(length(p.xz), p.y)) - vec2(r, h);\n return min(max(d.x, d.y), 0.0) + length(max(d, 0.0));\n}\n\nfloat sdTorus(vec3 p, vec2 t) {\n vec2 q = vec2(length(p.xz) - t.x, p.y);\n return length(q) - t.y;\n}\n\nfloat opUnion3(float d1, float d2) { return min(d1, d2); }\nfloat opSmooth3(float d1, float d2, float k) {\n float h = clamp(0.5 + 0.5 * (d2 - d1) / k, 0.0, 1.0);\n return mix(d2, d1, h) - k * h * (1.0 - h);\n}\n\nvec3 opRepeat(vec3 p, vec3 c) {\n return mod(p + 0.5 * c, c) - 0.5 * c;\n}\n`,\n exports: [\"sdSphere\", \"sdBox3\", \"sdCylinder\", \"sdTorus\", \"opUnion3\", \"opSmooth3\", \"opRepeat\"],\n dependencies: [],\n description: \"3D SDF primitives (sphere, box, cylinder, torus) and operations.\",\n usage: `\\\n### glsl-sdf-3d — 3D SDF\n\n\\`\\`\\`glsl\nfloat d = sdSphere(p, 1.0);\nd = opSmooth3(d, sdBox3(p - vec3(1.5, 0, 0), vec3(0.5)), 0.2);\n\\`\\`\\`\n`,\n};\n\nexport default glslSdf3d;\n","import type { ComponentEntry } from \"../../types.js\";\n\nconst glslColor: ComponentEntry = {\n name: \"glsl-color\",\n version: \"1.0.0\",\n category: \"color\",\n target: \"glsl\",\n renderers: [],\n code: `\\\nvec3 rgb2hsv(vec3 c) {\n vec4 K = vec4(0.0, -1.0/3.0, 2.0/3.0, -1.0);\n vec4 p = mix(vec4(c.bg, K.wz), vec4(c.gb, K.xy), step(c.b, c.g));\n vec4 q = mix(vec4(p.xyw, c.r), vec4(c.r, p.yzx), step(p.x, c.r));\n float d = q.x - min(q.w, q.y);\n float e = 1.0e-10;\n return vec3(abs(q.z + (q.w - q.y) / (6.0 * d + e)), d / (q.x + e), q.x);\n}\n\nvec3 hsv2rgb(vec3 c) {\n vec4 K = vec4(1.0, 2.0/3.0, 1.0/3.0, 3.0);\n vec3 p = abs(fract(c.xxx + K.xyz) * 6.0 - K.www);\n return c.z * mix(K.xxx, clamp(p - K.xxx, 0.0, 1.0), c.y);\n}\n\nvec3 rgb2hsl(vec3 c) {\n float maxC = max(c.r, max(c.g, c.b));\n float minC = min(c.r, min(c.g, c.b));\n float l = (maxC + minC) * 0.5;\n if (maxC == minC) return vec3(0.0, 0.0, l);\n float d = maxC - minC;\n float s = l > 0.5 ? d / (2.0 - maxC - minC) : d / (maxC + minC);\n float h;\n if (maxC == c.r) h = (c.g - c.b) / d + (c.g < c.b ? 6.0 : 0.0);\n else if (maxC == c.g) h = (c.b - c.r) / d + 2.0;\n else h = (c.r - c.g) / d + 4.0;\n h /= 6.0;\n return vec3(h, s, l);\n}\n\nvec3 hsl2rgb(vec3 c) {\n if (c.y == 0.0) return vec3(c.z);\n float q = c.z < 0.5 ? c.z * (1.0 + c.y) : c.z + c.y - c.z * c.y;\n float p = 2.0 * c.z - q;\n vec3 t = vec3(c.x + 1.0/3.0, c.x, c.x - 1.0/3.0);\n t = fract(t);\n vec3 r;\n for (int i = 0; i < 3; i++) {\n float ti = i == 0 ? t.x : (i == 1 ? t.y : t.z);\n float v;\n if (ti < 1.0/6.0) v = p + (q - p) * 6.0 * ti;\n else if (ti < 0.5) v = q;\n else if (ti < 2.0/3.0) v = p + (q - p) * (2.0/3.0 - ti) * 6.0;\n else v = p;\n if (i == 0) r.x = v;\n else if (i == 1) r.y = v;\n else r.z = v;\n }\n return r;\n}\n\nvec3 rgb2oklab(vec3 c) {\n float l = 0.4122214708 * c.r + 0.5363325363 * c.g + 0.0514459929 * c.b;\n float m = 0.2119034982 * c.r + 0.6806995451 * c.g + 0.1073969566 * c.b;\n float s = 0.0883024619 * c.r + 0.2817188376 * c.g + 0.6299787005 * c.b;\n l = pow(l, 1.0/3.0); m = pow(m, 1.0/3.0); s = pow(s, 1.0/3.0);\n return vec3(\n 0.2104542553*l + 0.7936177850*m - 0.0040720468*s,\n 1.9779984951*l - 2.4285922050*m + 0.4505937099*s,\n 0.0259040371*l + 0.7827717662*m - 0.8086757660*s\n );\n}\n\nvec3 oklab2rgb(vec3 lab) {\n float l = lab.x + 0.3963377774*lab.y + 0.2158037573*lab.z;\n float m = lab.x - 0.1055613458*lab.y - 0.0638541728*lab.z;\n float s = lab.x - 0.0894841775*lab.y - 1.2914855480*lab.z;\n l=l*l*l; m=m*m*m; s=s*s*s;\n return vec3(\n 4.0767416621*l - 3.3077115913*m + 0.2309699292*s,\n -1.2684380046*l + 2.6097574011*m - 0.3413193965*s,\n -0.0041960863*l - 0.7034186147*m + 1.7076147010*s\n );\n}\n\nvec3 posterize(vec3 c, float levels) {\n return floor(c * levels + 0.5) / levels;\n}\n\nvec3 quantize(vec3 c, float steps) {\n return floor(c * steps) / steps;\n}\n`,\n exports: [\"rgb2hsv\", \"hsv2rgb\", \"rgb2hsl\", \"hsl2rgb\", \"rgb2oklab\", \"oklab2rgb\", \"posterize\", \"quantize\"],\n dependencies: [],\n description: \"GLSL color space conversions (HSV, HSL, OKLab) and quantization.\",\n usage: `\\\n### glsl-color — Color Spaces\n\n\\`\\`\\`glsl\nvec3 hsv = rgb2hsv(color);\nhsv.x += 0.1; // hue shift\ncolor = hsv2rgb(hsv);\ncolor = posterize(color, 4.0);\n\\`\\`\\`\n`,\n};\n\nexport default glslColor;\n","import type { ComponentEntry } from \"../../types.js\";\n\nconst glslPattern: ComponentEntry = {\n name: \"glsl-pattern\",\n version: \"1.0.0\",\n category: \"pattern\",\n target: \"glsl\",\n renderers: [],\n code: `\\\nfloat truchet(vec2 uv, float scale) {\n vec2 id = floor(uv * scale);\n vec2 f = fract(uv * scale);\n float r = hash(id);\n if (r > 0.5) f.x = 1.0 - f.x;\n float d1 = length(f) - 0.5;\n float d2 = length(f - 1.0) - 0.5;\n return min(abs(d1), abs(d2));\n}\n\nfloat checkerboard(vec2 uv, float scale) {\n vec2 c = floor(uv * scale);\n return mod(c.x + c.y, 2.0);\n}\n\nvec2 hexGrid(vec2 uv) {\n vec2 s = vec2(1.0, 1.7320508);\n vec2 a = mod(uv, s) - s * 0.5;\n vec2 b = mod(uv - s * 0.5, s) - s * 0.5;\n return dot(a, a) < dot(b, b) ? a : b;\n}\n\nfloat voronoiEdges(vec2 uv, float scale) {\n vec2 p = uv * scale;\n vec2 n = floor(p);\n vec2 f = fract(p);\n float md = 8.0;\n for (int j = -1; j <= 1; j++)\n for (int i = -1; i <= 1; i++) {\n vec2 g = vec2(float(i), float(j));\n vec2 o = vec2(hash(n + g), hash(n + g + vec2(37.0)));\n vec2 r = g + o - f;\n md = min(md, dot(r, r));\n }\n return sqrt(md);\n}\n\nfloat stripes(vec2 uv, float freq, float angle) {\n float c = cos(angle), s = sin(angle);\n float t = uv.x * c + uv.y * s;\n return 0.5 + 0.5 * sin(t * freq * 6.28318);\n}\n\nfloat dots(vec2 uv, float scale, float radius) {\n vec2 f = fract(uv * scale) - 0.5;\n return smoothstep(radius, radius - 0.01, length(f));\n}\n`,\n exports: [\"truchet\", \"checkerboard\", \"hexGrid\", \"voronoiEdges\", \"stripes\", \"dots\"],\n dependencies: [\"glsl-noise\"],\n description: \"Tiling and pattern functions (truchet, hex grid, stripes, dots).\",\n usage: `\\\n### glsl-pattern — Patterns\n\n\\`\\`\\`glsl\nfloat t = truchet(uv, 10.0);\nfloat c = checkerboard(uv, 8.0);\nfloat s = stripes(uv, 20.0, 0.785);\n\\`\\`\\`\n`,\n};\n\nexport default glslPattern;\n","import type { ComponentEntry } from \"../../types.js\";\n\nconst glslTransform: ComponentEntry = {\n name: \"glsl-transform\",\n version: \"1.0.0\",\n category: \"transform\",\n target: \"glsl\",\n renderers: [],\n code: `\\\nvec2 rotate2D(vec2 p, float angle) {\n float c = cos(angle), s = sin(angle);\n return vec2(p.x * c - p.y * s, p.x * s + p.y * c);\n}\n\nvec2 scale2D(vec2 p, vec2 s) { return p / s; }\nvec2 translate2D(vec2 p, vec2 t) { return p - t; }\n\nvec2 kaleidoscope(vec2 p, float segments) {\n float angle = atan(p.y, p.x);\n float r = length(p);\n float seg = 6.28318 / segments;\n angle = mod(angle, seg);\n if (angle > seg * 0.5) angle = seg - angle;\n return vec2(cos(angle), sin(angle)) * r;\n}\n\nvec2 polarCoords(vec2 p) {\n return vec2(length(p), atan(p.y, p.x));\n}\n\nvec2 fishEye(vec2 uv, float strength) {\n vec2 c = uv - 0.5;\n float r = length(c);\n float bind = sqrt(dot(vec2(0.5), vec2(0.5)));\n vec2 nuv = c / bind;\n nuv *= 1.0 - strength + strength * r;\n return nuv * bind + 0.5;\n}\n\nvec2 ripple(vec2 uv, vec2 center, float freq, float amp, float time) {\n vec2 d = uv - center;\n float r = length(d);\n float offset = sin(r * freq - time) * amp;\n return uv + normalize(d) * offset;\n}\n`,\n exports: [\"rotate2D\", \"scale2D\", \"translate2D\", \"kaleidoscope\", \"polarCoords\", \"fishEye\", \"ripple\"],\n dependencies: [],\n description: \"UV coordinate transformations (rotate, kaleidoscope, fisheye, ripple).\",\n usage: `\\\n### glsl-transform — UV Transforms\n\n\\`\\`\\`glsl\nvec2 p = rotate2D(uv - 0.5, u_time) + 0.5;\np = kaleidoscope(p - 0.5, 6.0);\np = fishEye(uv, 0.5);\n\\`\\`\\`\n`,\n};\n\nexport default glslTransform;\n","import type { ComponentEntry } from \"../../types.js\";\n\nconst glslMath: ComponentEntry = {\n name: \"glsl-math\",\n version: \"1.0.0\",\n category: \"math\",\n target: \"glsl\",\n renderers: [],\n code: `\\\nfloat remap(float value, float inMin, float inMax, float outMin, float outMax) {\n return outMin + (value - inMin) / (inMax - inMin) * (outMax - outMin);\n}\n\nfloat mod289(float x) { return x - floor(x * (1.0 / 289.0)) * 289.0; }\n\nfloat inverseLerp(float a, float b, float v) { return (v - a) / (b - a); }\n\nfloat smoothmin(float a, float b, float k) {\n float h = max(k - abs(a - b), 0.0) / k;\n return min(a, b) - h * h * h * k * (1.0 / 6.0);\n}\n\nfloat bias(float x, float b) {\n return x / ((1.0 / b - 2.0) * (1.0 - x) + 1.0);\n}\n\nfloat gain(float x, float g) {\n if (x < 0.5) return bias(x * 2.0, g) * 0.5;\n return bias(x * 2.0 - 1.0, 1.0 - g) * 0.5 + 0.5;\n}\n`,\n exports: [\"remap\", \"mod289\", \"inverseLerp\", \"smoothmin\", \"bias\", \"gain\"],\n dependencies: [],\n description: \"GLSL math utilities (remap, smoothmin, bias, gain).\",\n usage: `\\\n### glsl-math — GLSL Math\n\n\\`\\`\\`glsl\nfloat v = remap(x, 0.0, 1.0, -1.0, 1.0);\nfloat s = smoothmin(d1, d2, 0.1);\nfloat b = bias(x, 0.3);\n\\`\\`\\`\n`,\n};\n\nexport default glslMath;\n","import type { ComponentEntry } from \"../../types.js\";\n\nconst glslEasing: ComponentEntry = {\n name: \"glsl-easing\",\n version: \"1.0.0\",\n category: \"easing\",\n target: \"glsl\",\n renderers: [],\n code: `\\\nfloat easeInQuad(float t) { return t * t; }\nfloat easeOutQuad(float t) { return t * (2.0 - t); }\nfloat easeInOutCubic(float t) {\n return t < 0.5 ? 4.0 * t * t * t : 1.0 - pow(-2.0 * t + 2.0, 3.0) / 2.0;\n}\nfloat easeOutElastic(float t) {\n if (t == 0.0 || t == 1.0) return t;\n return pow(2.0, -10.0 * t) * sin((t * 10.0 - 0.75) * (6.28318 / 3.0)) + 1.0;\n}\nfloat easeOutBounce(float t) {\n if (t < 1.0 / 2.75) return 7.5625 * t * t;\n if (t < 2.0 / 2.75) { t -= 1.5 / 2.75; return 7.5625 * t * t + 0.75; }\n if (t < 2.5 / 2.75) { t -= 2.25 / 2.75; return 7.5625 * t * t + 0.9375; }\n t -= 2.625 / 2.75; return 7.5625 * t * t + 0.984375;\n}\n`,\n exports: [\"easeInQuad\", \"easeOutQuad\", \"easeInOutCubic\", \"easeOutElastic\", \"easeOutBounce\"],\n dependencies: [],\n description: \"Easing functions in GLSL.\",\n usage: `\\\n### glsl-easing — GLSL Easing\n\n\\`\\`\\`glsl\nfloat t = easeInOutCubic(progress);\nfloat e = easeOutElastic(progress);\n\\`\\`\\`\n`,\n};\n\nexport default glslEasing;\n","import type { ComponentEntry } from \"../../types.js\";\n\nconst glslBlend: ComponentEntry = {\n name: \"glsl-blend\",\n version: \"1.0.0\",\n category: \"color\",\n target: \"glsl\",\n renderers: [],\n code: `\\\nvec3 blendMultiply(vec3 base, vec3 blend) { return base * blend; }\nvec3 blendScreen(vec3 base, vec3 blend) { return 1.0 - (1.0 - base) * (1.0 - blend); }\nvec3 blendOverlay(vec3 base, vec3 blend) {\n return vec3(\n base.r < 0.5 ? 2.0 * base.r * blend.r : 1.0 - 2.0 * (1.0 - base.r) * (1.0 - blend.r),\n base.g < 0.5 ? 2.0 * base.g * blend.g : 1.0 - 2.0 * (1.0 - base.g) * (1.0 - blend.g),\n base.b < 0.5 ? 2.0 * base.b * blend.b : 1.0 - 2.0 * (1.0 - base.b) * (1.0 - blend.b)\n );\n}\nvec3 blendSoftLight(vec3 base, vec3 blend) {\n return mix(\n sqrt(base) * (2.0 * blend - 1.0) + 2.0 * base * (1.0 - blend),\n 2.0 * base * blend + base * base * (1.0 - 2.0 * blend),\n step(vec3(0.5), blend)\n );\n}\nvec3 blendAdd(vec3 base, vec3 blend) { return min(base + blend, vec3(1.0)); }\n`,\n exports: [\"blendMultiply\", \"blendScreen\", \"blendOverlay\", \"blendSoftLight\", \"blendAdd\"],\n dependencies: [],\n description: \"Photoshop-style blend modes in GLSL.\",\n usage: `\\\n### glsl-blend — Blend Modes\n\n\\`\\`\\`glsl\nvec3 result = blendOverlay(base, overlay);\nresult = blendScreen(result, glow);\n\\`\\`\\`\n`,\n};\n\nexport default glslBlend;\n","import type { ComponentEntry } from \"../../types.js\";\n\nconst glslLighting: ComponentEntry = {\n name: \"glsl-lighting\",\n version: \"1.0.0\",\n category: \"pattern\",\n target: \"glsl\",\n renderers: [],\n code: `\\\nfloat lambertian(vec3 normal, vec3 lightDir) {\n return max(dot(normalize(normal), normalize(lightDir)), 0.0);\n}\n\nfloat phong(vec3 normal, vec3 lightDir, vec3 viewDir, float shininess) {\n vec3 n = normalize(normal);\n vec3 l = normalize(lightDir);\n vec3 r = reflect(-l, n);\n float diff = max(dot(n, l), 0.0);\n float spec = pow(max(dot(normalize(viewDir), r), 0.0), shininess);\n return diff + spec;\n}\n\nvec3 normalFromHeight(sampler2D tex, vec2 uv, float strength) {\n float eps = 1.0 / 512.0;\n float h = texture2D(tex, uv).r;\n float hx = texture2D(tex, uv + vec2(eps, 0.0)).r;\n float hy = texture2D(tex, uv + vec2(0.0, eps)).r;\n return normalize(vec3((h - hx) * strength, (h - hy) * strength, 1.0));\n}\n\nfloat ambientOcclusion(vec2 uv, float radius, float intensity) {\n float ao = 0.0;\n for (int i = 0; i < 4; i++) {\n float angle = float(i) * 1.5708;\n vec2 offset = vec2(cos(angle), sin(angle)) * radius;\n ao += smoothstep(0.0, 1.0, length(offset));\n }\n return 1.0 - (ao / 4.0) * intensity;\n}\n`,\n exports: [\"phong\", \"lambertian\", \"normalFromHeight\", \"ambientOcclusion\"],\n dependencies: [],\n description: \"Basic GLSL lighting models (Phong, Lambertian, normal mapping).\",\n usage: `\\\n### glsl-lighting — Lighting\n\n\\`\\`\\`glsl\nfloat diff = lambertian(normal, lightPos - fragPos);\nfloat lit = phong(normal, lightDir, viewDir, 32.0);\nvec3 n = normalFromHeight(heightMap, uv, 2.0);\n\\`\\`\\`\n`,\n};\n\nexport default glslLighting;\n","import type { ComponentEntry } from \"../../types.js\";\n\nconst glslRay: ComponentEntry = {\n name: \"glsl-ray\",\n version: \"1.0.0\",\n category: \"sdf\",\n target: \"glsl\",\n renderers: [],\n code: `\\\nfloat rayMarch(vec3 ro, vec3 rd, float maxDist, int maxSteps) {\n float t = 0.0;\n for (int i = 0; i < 256; i++) {\n if (i >= maxSteps) break;\n vec3 p = ro + rd * t;\n float d = sdSphere(p, 1.0);\n if (d < 0.001 || t > maxDist) break;\n t += d;\n }\n return t;\n}\n\nvec3 estimateNormal(vec3 p) {\n float eps = 0.001;\n return normalize(vec3(\n sdSphere(p + vec3(eps,0,0), 1.0) - sdSphere(p - vec3(eps,0,0), 1.0),\n sdSphere(p + vec3(0,eps,0), 1.0) - sdSphere(p - vec3(0,eps,0), 1.0),\n sdSphere(p + vec3(0,0,eps), 1.0) - sdSphere(p - vec3(0,0,eps), 1.0)\n ));\n}\n\nfloat softShadow(vec3 ro, vec3 rd, float mint, float maxt, float k) {\n float res = 1.0;\n float t = mint;\n for (int i = 0; i < 64; i++) {\n float h = sdSphere(ro + rd * t, 1.0);\n res = min(res, k * h / t);\n t += clamp(h, 0.02, 0.1);\n if (h < 0.001 || t > maxt) break;\n }\n return clamp(res, 0.0, 1.0);\n}\n\nfloat ambientOcclusion3D(vec3 p, vec3 n) {\n float occ = 0.0;\n float sca = 1.0;\n for (int i = 0; i < 5; i++) {\n float h = 0.01 + 0.12 * float(i);\n float d = sdSphere(p + n * h, 1.0);\n occ += (h - d) * sca;\n sca *= 0.95;\n }\n return clamp(1.0 - 3.0 * occ, 0.0, 1.0);\n}\n`,\n exports: [\"rayMarch\", \"estimateNormal\", \"softShadow\", \"ambientOcclusion3D\"],\n dependencies: [\"glsl-sdf-3d\"],\n description: \"Raymarching utilities (march, normals, soft shadows, AO).\",\n usage: `\\\n### glsl-ray — Raymarching\n\n\\`\\`\\`glsl\nfloat t = rayMarch(ro, rd, 100.0, 128);\nif (t < 100.0) {\n vec3 p = ro + rd * t;\n vec3 n = estimateNormal(p);\n float shadow = softShadow(p, lightDir, 0.02, 10.0, 8.0);\n}\n\\`\\`\\`\n`,\n};\n\nexport default glslRay;\n","import type { ComponentEntry } from \"../../types.js\";\n\nconst glslPost: ComponentEntry = {\n name: \"glsl-post\",\n version: \"1.0.0\",\n category: \"imaging\",\n target: \"glsl\",\n renderers: [],\n code: `\\\nfloat vignette(vec2 uv, float intensity) {\n vec2 d = uv - 0.5;\n return 1.0 - dot(d, d) * intensity;\n}\n\nvec3 chromaticAberration(sampler2D tex, vec2 uv, float offset) {\n float r = texture2D(tex, uv + vec2(offset, 0.0)).r;\n float g = texture2D(tex, uv).g;\n float b = texture2D(tex, uv - vec2(offset, 0.0)).b;\n return vec3(r, g, b);\n}\n\nfloat filmGrain(vec2 uv, float time, float intensity) {\n return (hash(uv * 1000.0 + time) - 0.5) * intensity;\n}\n\nvec3 bloom(sampler2D tex, vec2 uv, float threshold, float intensity) {\n vec3 col = texture2D(tex, uv).rgb;\n vec3 bright = max(col - vec3(threshold), vec3(0.0));\n vec3 blur = vec3(0.0);\n for (int i = -2; i <= 2; i++)\n for (int j = -2; j <= 2; j++)\n blur += max(texture2D(tex, uv + vec2(float(i), float(j)) * 0.003).rgb - vec3(threshold), vec3(0.0));\n blur /= 25.0;\n return col + blur * intensity;\n}\n\nvec3 sharpen(sampler2D tex, vec2 uv, float strength) {\n vec2 px = vec2(1.0) / vec2(textureSize(tex, 0));\n vec3 col = texture2D(tex, uv).rgb * (1.0 + 4.0 * strength);\n col -= texture2D(tex, uv + vec2(px.x, 0.0)).rgb * strength;\n col -= texture2D(tex, uv - vec2(px.x, 0.0)).rgb * strength;\n col -= texture2D(tex, uv + vec2(0.0, px.y)).rgb * strength;\n col -= texture2D(tex, uv - vec2(0.0, px.y)).rgb * strength;\n return col;\n}\n`,\n exports: [\"vignette\", \"chromaticAberration\", \"filmGrain\", \"bloom\", \"sharpen\"],\n dependencies: [\"glsl-noise\"],\n description: \"Post-processing effects (vignette, chromatic aberration, grain, bloom).\",\n usage: `\\\n### glsl-post — Post Processing\n\n\\`\\`\\`glsl\ncolor *= vignette(uv, 2.0);\ncolor += filmGrain(uv, u_time, 0.05);\ncolor = bloom(tex, uv, 0.8, 1.5);\n\\`\\`\\`\n`,\n};\n\nexport default glslPost;\n","import type { ComponentEntry } from \"../../types.js\";\n\nconst glslShape: ComponentEntry = {\n name: \"glsl-shape\",\n version: \"1.0.0\",\n category: \"geometry\",\n target: \"glsl\",\n renderers: [],\n code: `\\\nfloat polygon(vec2 p, int sides, float radius) {\n float a = atan(p.y, p.x);\n float seg = 6.28318 / float(sides);\n float d = cos(floor(0.5 + a / seg) * seg - a) * length(p);\n return d - radius;\n}\n\nfloat star(vec2 p, int points, float outer, float inner) {\n float a = atan(p.y, p.x);\n float seg = 3.14159 / float(points);\n a = mod(a, 2.0 * seg) - seg;\n float r = length(p);\n float d1 = r * cos(a) - outer;\n float d2 = r * cos(a - seg) - inner;\n return max(d1, d2);\n}\n\nfloat roundedRect(vec2 p, vec2 size, float radius) {\n vec2 d = abs(p) - size + radius;\n return length(max(d, 0.0)) + min(max(d.x, d.y), 0.0) - radius;\n}\n\nfloat ring(vec2 p, float radius, float thickness) {\n return abs(length(p) - radius) - thickness;\n}\n\nfloat arc(vec2 p, float radius, float angle, float thickness) {\n float a = atan(p.y, p.x);\n float ha = angle * 0.5;\n float d = abs(length(p) - radius) - thickness;\n float angDist = abs(mod(a + 3.14159, 6.28318) - 3.14159);\n return max(d, angDist - ha);\n}\n\nfloat line(vec2 p, vec2 a, vec2 b, float thickness) {\n vec2 pa = p - a, ba = b - a;\n float h = clamp(dot(pa, ba) / dot(ba, ba), 0.0, 1.0);\n return length(pa - ba * h) - thickness;\n}\n`,\n exports: [\"polygon\", \"star\", \"roundedRect\", \"ring\", \"arc\", \"line\"],\n dependencies: [\"glsl-sdf\"],\n description: \"2D shape rendering via SDF (polygon, star, rounded rect, ring).\",\n usage: `\\\n### glsl-shape — 2D Shapes\n\n\\`\\`\\`glsl\nfloat d = polygon(uv - 0.5, 6, 0.3);\nd = min(d, star(uv - vec2(0.7, 0.5), 5, 0.2, 0.1));\nd = min(d, roundedRect(uv - vec2(0.3, 0.7), vec2(0.1), 0.02));\nvec3 col = mix(vec3(1), vec3(0), smoothstep(0.0, 0.01, d));\n\\`\\`\\`\n`,\n};\n\nexport default glslShape;\n","import type { ComponentEntry } from \"../../types.js\";\n\nconst glslDomain: ComponentEntry = {\n name: \"glsl-domain\",\n version: \"1.0.0\",\n category: \"transform\",\n target: \"glsl\",\n renderers: [],\n code: `\\\nvec2 domainWarp(vec2 p, float strength) {\n float n1 = noise(p);\n float n2 = noise(p + vec2(5.2, 1.3));\n return p + vec2(n1, n2) * strength;\n}\n\nvec2 domainRepeat(vec2 p, vec2 period) {\n return mod(p + period * 0.5, period) - period * 0.5;\n}\n\nvec2 domainTwist(vec2 p, float amount) {\n float angle = p.y * amount;\n float c = cos(angle), s = sin(angle);\n return vec2(p.x * c - p.y * s, p.x * s + p.y * c);\n}\n\nvec2 domainFold(vec2 p, vec2 axis) {\n float d = dot(p, normalize(axis));\n if (d < 0.0) p -= 2.0 * d * normalize(axis);\n return p;\n}\n`,\n exports: [\"domainWarp\", \"domainRepeat\", \"domainTwist\", \"domainFold\"],\n dependencies: [\"glsl-noise\"],\n description: \"Domain manipulation (warp, repeat, twist, fold).\",\n usage: `\\\n### glsl-domain — Domain Manipulation\n\n\\`\\`\\`glsl\nvec2 p = domainWarp(uv * 5.0, 0.3);\np = domainRepeat(p, vec2(2.0));\np = domainTwist(p, 1.5);\n\\`\\`\\`\n`,\n};\n\nexport default glslDomain;\n","import type { ComponentEntry } from \"../../types.js\";\n\nconst glslGradient: ComponentEntry = {\n name: \"glsl-gradient\",\n version: \"1.0.0\",\n category: \"color\",\n target: \"glsl\",\n renderers: [],\n code: `\\\nvec3 linearGradient(vec2 uv, vec3 c1, vec3 c2, float angle) {\n float c = cos(angle), s = sin(angle);\n float t = clamp(uv.x * c + uv.y * s, 0.0, 1.0);\n return mix(c1, c2, t);\n}\n\nvec3 radialGradient(vec2 uv, vec3 c1, vec3 c2, vec2 center, float radius) {\n float t = clamp(length(uv - center) / radius, 0.0, 1.0);\n return mix(c1, c2, t);\n}\n\nvec3 angularGradient(vec2 uv, vec3 c1, vec3 c2, vec2 center) {\n float angle = atan(uv.y - center.y, uv.x - center.x);\n float t = (angle + 3.14159) / 6.28318;\n return mix(c1, c2, t);\n}\n\nvec3 conicGradient(vec2 uv, vec3 colors[4], vec2 center) {\n float angle = atan(uv.y - center.y, uv.x - center.x);\n float t = (angle + 3.14159) / 6.28318;\n float segment = t * 4.0;\n int i = int(floor(segment));\n float f = fract(segment);\n if (i >= 3) return mix(colors[3], colors[0], f);\n return mix(colors[i], colors[i + 1], f);\n}\n\nvec3 paletteGradient(float t, vec3 a, vec3 b, vec3 c, vec3 d) {\n return a + b * cos(6.28318 * (c * t + d));\n}\n`,\n exports: [\"linearGradient\", \"radialGradient\", \"angularGradient\", \"conicGradient\", \"paletteGradient\"],\n dependencies: [],\n description: \"Gradient generation (linear, radial, angular, palette).\",\n usage: `\\\n### glsl-gradient — Gradients\n\n\\`\\`\\`glsl\nvec3 g = linearGradient(uv, vec3(1,0,0), vec3(0,0,1), 0.0);\nvec3 r = radialGradient(uv, vec3(1), vec3(0), vec2(0.5), 0.5);\n// Iq-style cosine palette\nvec3 p = paletteGradient(t, vec3(0.5), vec3(0.5), vec3(1), vec3(0,0.33,0.67));\n\\`\\`\\`\n`,\n};\n\nexport default glslGradient;\n","import type { ComponentEntry } from \"./types.js\";\nimport * as jsComponents from \"./components/js/index.js\";\nimport * as glslComponents from \"./components/glsl/index.js\";\n\n/** The complete component registry, keyed by bare name. */\nexport const COMPONENT_REGISTRY: Readonly<Record<string, ComponentEntry>> =\n Object.fromEntries(\n [...Object.values(jsComponents), ...Object.values(glslComponents)]\n .map((c) => [c.name, c])\n );\n","import type { RendererType } from \"@genart-dev/format\";\nimport type { ResolvedComponent } from \"./types.js\";\nimport { COMPONENT_REGISTRY } from \"./registry.js\";\n\n/** Maps renderer types to their target (\"js\" or \"glsl\"). */\nconst RENDERER_TARGET: Record<RendererType, \"js\" | \"glsl\"> = {\n p5: \"js\",\n three: \"js\",\n canvas2d: \"js\",\n svg: \"js\",\n glsl: \"glsl\",\n};\n\n/**\n * Resolve component names to injection-ready source.\n * - Validates names exist in registry\n * - Validates renderer compatibility\n * - Resolves transitive dependencies\n * - Topological sort (dependencies before dependents)\n * - Deduplicates\n * - Detects export name collisions\n *\n * @throws on: unknown component, renderer mismatch, circular dep, export collision.\n */\nexport function resolveComponents(\n components: Record<string, string>,\n renderer: RendererType,\n): ResolvedComponent[] {\n const target = RENDERER_TARGET[renderer];\n\n // Collect all required component names (including transitive deps)\n const allNames = new Set<string>();\n const stack = Object.keys(components);\n\n while (stack.length > 0) {\n const name = stack.pop()!;\n if (allNames.has(name)) continue;\n\n const entry = COMPONENT_REGISTRY[name];\n if (!entry) {\n throw new Error(`Unknown component: \"${name}\"`);\n }\n\n // Validate target compatibility\n if (entry.target !== target) {\n throw new Error(\n `Component \"${name}\" has target \"${entry.target}\" but renderer \"${renderer}\" requires target \"${target}\"`\n );\n }\n\n // Validate specific renderer compatibility (if restricted)\n if (entry.renderers.length > 0 && !entry.renderers.includes(renderer)) {\n throw new Error(\n `Component \"${name}\" is not compatible with renderer \"${renderer}\". Compatible: ${entry.renderers.join(\", \")}`\n );\n }\n\n allNames.add(name);\n\n // Add transitive dependencies\n for (const dep of entry.dependencies) {\n if (!allNames.has(dep)) {\n stack.push(dep);\n }\n }\n }\n\n // Detect circular dependencies and topologically sort\n const sorted: string[] = [];\n const visited = new Set<string>();\n const visiting = new Set<string>();\n\n function visit(name: string): void {\n if (visited.has(name)) return;\n if (visiting.has(name)) {\n throw new Error(`Circular dependency detected involving component \"${name}\"`);\n }\n\n visiting.add(name);\n const entry = COMPONENT_REGISTRY[name]!;\n for (const dep of entry.dependencies) {\n if (allNames.has(dep)) {\n visit(dep);\n }\n }\n visiting.delete(name);\n visited.add(name);\n sorted.push(name);\n }\n\n for (const name of allNames) {\n visit(name);\n }\n\n // Check for export name collisions\n const exportNames = new Map<string, string>();\n for (const name of sorted) {\n const entry = COMPONENT_REGISTRY[name]!;\n for (const exp of entry.exports) {\n const existing = exportNames.get(exp);\n if (existing) {\n throw new Error(\n `Export collision: \"${exp}\" is exported by both \"${existing}\" and \"${name}\"`\n );\n }\n exportNames.set(exp, name);\n }\n }\n\n // Build resolved components\n return sorted.map((name): ResolvedComponent => {\n const entry = COMPONENT_REGISTRY[name]!;\n return {\n name: entry.name,\n version: entry.version,\n code: entry.code,\n exports: entry.exports,\n };\n });\n}\n"],"mappings":"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","names":["color_default","curl_default","easing_default","math_default","noise_3d_default","noise_4d_default","shape_default","noise_3d_default","noise_4d_default","curl_default","color_default","math_default","easing_default","shape_default"]}
|
package/dist/index.d.cts
ADDED
|
@@ -0,0 +1,60 @@
|
|
|
1
|
+
import { RendererType } from '@genart-dev/format';
|
|
2
|
+
|
|
3
|
+
/** Target renderers for a component. */
|
|
4
|
+
type RendererTarget = "js" | "glsl";
|
|
5
|
+
/** Categories for browsing/filtering components. */
|
|
6
|
+
type ComponentCategory = "randomness" | "noise" | "math" | "easing" | "color" | "vector" | "geometry" | "grid" | "particle" | "physics" | "distribution" | "pattern" | "sdf" | "transform" | "animation" | "string" | "data-structure" | "imaging";
|
|
7
|
+
/**
|
|
8
|
+
* A single component entry in the registry.
|
|
9
|
+
* The `code` field is the raw source string prepended to algorithms.
|
|
10
|
+
*/
|
|
11
|
+
interface ComponentEntry {
|
|
12
|
+
/** Bare component name (e.g., "prng", "glsl-noise"). */
|
|
13
|
+
readonly name: string;
|
|
14
|
+
/** SemVer version. */
|
|
15
|
+
readonly version: string;
|
|
16
|
+
/** Browsing category. */
|
|
17
|
+
readonly category: ComponentCategory;
|
|
18
|
+
/** "js" for all JS renderers, "glsl" for the GLSL renderer. */
|
|
19
|
+
readonly target: RendererTarget;
|
|
20
|
+
/** Compatible renderer types. Empty array = all renderers of this target. */
|
|
21
|
+
readonly renderers: readonly RendererType[];
|
|
22
|
+
/** Source code string — prepended to the algorithm at compile time. */
|
|
23
|
+
readonly code: string;
|
|
24
|
+
/** Function/variable names this component exports. */
|
|
25
|
+
readonly exports: readonly string[];
|
|
26
|
+
/** Other component names this depends on (bare names). */
|
|
27
|
+
readonly dependencies: readonly string[];
|
|
28
|
+
/** One-line description (shown by list_components MCP tool). */
|
|
29
|
+
readonly description: string;
|
|
30
|
+
/** Multi-line usage docs with examples (markdown). */
|
|
31
|
+
readonly usage: string;
|
|
32
|
+
}
|
|
33
|
+
/**
|
|
34
|
+
* Resolved component ready for compilation injection.
|
|
35
|
+
* Returned by resolveComponents() — topologically sorted, deduplicated.
|
|
36
|
+
*/
|
|
37
|
+
interface ResolvedComponent {
|
|
38
|
+
readonly name: string;
|
|
39
|
+
readonly version: string;
|
|
40
|
+
readonly code: string;
|
|
41
|
+
readonly exports: readonly string[];
|
|
42
|
+
}
|
|
43
|
+
|
|
44
|
+
/** The complete component registry, keyed by bare name. */
|
|
45
|
+
declare const COMPONENT_REGISTRY: Readonly<Record<string, ComponentEntry>>;
|
|
46
|
+
|
|
47
|
+
/**
|
|
48
|
+
* Resolve component names to injection-ready source.
|
|
49
|
+
* - Validates names exist in registry
|
|
50
|
+
* - Validates renderer compatibility
|
|
51
|
+
* - Resolves transitive dependencies
|
|
52
|
+
* - Topological sort (dependencies before dependents)
|
|
53
|
+
* - Deduplicates
|
|
54
|
+
* - Detects export name collisions
|
|
55
|
+
*
|
|
56
|
+
* @throws on: unknown component, renderer mismatch, circular dep, export collision.
|
|
57
|
+
*/
|
|
58
|
+
declare function resolveComponents(components: Record<string, string>, renderer: RendererType): ResolvedComponent[];
|
|
59
|
+
|
|
60
|
+
export { COMPONENT_REGISTRY, type ComponentCategory, type ComponentEntry, type RendererTarget, type ResolvedComponent, resolveComponents };
|
package/dist/index.d.ts
ADDED
|
@@ -0,0 +1,60 @@
|
|
|
1
|
+
import { RendererType } from '@genart-dev/format';
|
|
2
|
+
|
|
3
|
+
/** Target renderers for a component. */
|
|
4
|
+
type RendererTarget = "js" | "glsl";
|
|
5
|
+
/** Categories for browsing/filtering components. */
|
|
6
|
+
type ComponentCategory = "randomness" | "noise" | "math" | "easing" | "color" | "vector" | "geometry" | "grid" | "particle" | "physics" | "distribution" | "pattern" | "sdf" | "transform" | "animation" | "string" | "data-structure" | "imaging";
|
|
7
|
+
/**
|
|
8
|
+
* A single component entry in the registry.
|
|
9
|
+
* The `code` field is the raw source string prepended to algorithms.
|
|
10
|
+
*/
|
|
11
|
+
interface ComponentEntry {
|
|
12
|
+
/** Bare component name (e.g., "prng", "glsl-noise"). */
|
|
13
|
+
readonly name: string;
|
|
14
|
+
/** SemVer version. */
|
|
15
|
+
readonly version: string;
|
|
16
|
+
/** Browsing category. */
|
|
17
|
+
readonly category: ComponentCategory;
|
|
18
|
+
/** "js" for all JS renderers, "glsl" for the GLSL renderer. */
|
|
19
|
+
readonly target: RendererTarget;
|
|
20
|
+
/** Compatible renderer types. Empty array = all renderers of this target. */
|
|
21
|
+
readonly renderers: readonly RendererType[];
|
|
22
|
+
/** Source code string — prepended to the algorithm at compile time. */
|
|
23
|
+
readonly code: string;
|
|
24
|
+
/** Function/variable names this component exports. */
|
|
25
|
+
readonly exports: readonly string[];
|
|
26
|
+
/** Other component names this depends on (bare names). */
|
|
27
|
+
readonly dependencies: readonly string[];
|
|
28
|
+
/** One-line description (shown by list_components MCP tool). */
|
|
29
|
+
readonly description: string;
|
|
30
|
+
/** Multi-line usage docs with examples (markdown). */
|
|
31
|
+
readonly usage: string;
|
|
32
|
+
}
|
|
33
|
+
/**
|
|
34
|
+
* Resolved component ready for compilation injection.
|
|
35
|
+
* Returned by resolveComponents() — topologically sorted, deduplicated.
|
|
36
|
+
*/
|
|
37
|
+
interface ResolvedComponent {
|
|
38
|
+
readonly name: string;
|
|
39
|
+
readonly version: string;
|
|
40
|
+
readonly code: string;
|
|
41
|
+
readonly exports: readonly string[];
|
|
42
|
+
}
|
|
43
|
+
|
|
44
|
+
/** The complete component registry, keyed by bare name. */
|
|
45
|
+
declare const COMPONENT_REGISTRY: Readonly<Record<string, ComponentEntry>>;
|
|
46
|
+
|
|
47
|
+
/**
|
|
48
|
+
* Resolve component names to injection-ready source.
|
|
49
|
+
* - Validates names exist in registry
|
|
50
|
+
* - Validates renderer compatibility
|
|
51
|
+
* - Resolves transitive dependencies
|
|
52
|
+
* - Topological sort (dependencies before dependents)
|
|
53
|
+
* - Deduplicates
|
|
54
|
+
* - Detects export name collisions
|
|
55
|
+
*
|
|
56
|
+
* @throws on: unknown component, renderer mismatch, circular dep, export collision.
|
|
57
|
+
*/
|
|
58
|
+
declare function resolveComponents(components: Record<string, string>, renderer: RendererType): ResolvedComponent[];
|
|
59
|
+
|
|
60
|
+
export { COMPONENT_REGISTRY, type ComponentCategory, type ComponentEntry, type RendererTarget, type ResolvedComponent, resolveComponents };
|