shadertown 0.2.0 → 0.4.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.
@@ -1917,17 +1917,16 @@ export declare const shaderRegistry: {
1917
1917
  readonly colorC: ColorControl;
1918
1918
  };
1919
1919
  };
1920
- readonly glass: {
1921
- readonly name: "Glass";
1922
- readonly tagline: "A refracting, frosted sheet over the layer behind it";
1923
- readonly description: "A drifting height field read as a surface: its slope bends the layer underneath, spreads the red and blue ends apart, and catches light along the steep ground. Frost blurs along an axis the height rotates, so the sheet grains up instead of banding. Point it at an image, a video, or another shadertown shader.";
1924
- readonly family: "optical";
1925
- readonly tags: readonly ["glass", "refraction", "overlay"];
1926
- readonly cost: "medium";
1927
- readonly defaultSource: "neon-grid";
1920
+ readonly radiance: {
1921
+ readonly name: "Radiance";
1922
+ readonly tagline: "Lamps in a dark room, traced to whatever they light";
1923
+ readonly description: "Global illumination taken the short way round. There is no light pass and no probe grid to merge: the room is a handful of signed distances, so every pixel fans rays into it and marches each one back to its source. That buys a true shadow — hard where a lamp is small, soft where it is near, and cast by bars that turn every frame. The pointer is the brightest lamp in the room, so moving it moves every shadow.";
1924
+ readonly family: "spatial";
1925
+ readonly tags: readonly ["light", "shadow", "dark", "pointer"];
1926
+ readonly cost: "heavy";
1928
1927
  readonly controls: {
1929
1928
  readonly speed: {
1930
- readonly default: 0.35;
1929
+ readonly default: 0.7;
1931
1930
  readonly max: 2;
1932
1931
  readonly slot: "speed";
1933
1932
  readonly label: "Speed";
@@ -1945,7 +1944,112 @@ export declare const shaderRegistry: {
1945
1944
  readonly hint: "Zoom of the underlying field. Lower is bigger, softer shapes.";
1946
1945
  };
1947
1946
  readonly intensity: {
1947
+ readonly default: 1.1;
1948
+ readonly slot: "intensity";
1949
+ readonly label: "Strength";
1950
+ readonly min: 0;
1951
+ readonly max: 2.5;
1952
+ readonly step: 0.01;
1953
+ readonly hint: "Overall brightness of the effect before the post chain.";
1954
+ };
1955
+ readonly grain: {
1956
+ readonly default: 0.02;
1957
+ readonly slot: "grain";
1958
+ readonly label: "Grain";
1959
+ readonly min: 0;
1960
+ readonly max: 0.35;
1961
+ readonly step: 0.005;
1962
+ readonly hint: "Per-pixel noise. A little hides banding on flat gradients.";
1963
+ };
1964
+ readonly vignette: {
1965
+ readonly default: 0.4;
1966
+ readonly slot: "vignette";
1967
+ readonly label: "Vignette";
1968
+ readonly min: 0;
1969
+ readonly max: 1;
1970
+ readonly step: 0.01;
1971
+ readonly hint: "Darkening towards the edges of the frame.";
1972
+ };
1973
+ readonly rays: {
1974
+ readonly slot: "a";
1975
+ readonly label: "Rays";
1976
+ readonly min: 3;
1977
+ readonly max: 48;
1978
+ readonly step: 1;
1979
+ readonly default: 24;
1980
+ readonly hint: "Directions each pixel samples. Low is streaky and cheap; high is smooth and is what costs.";
1981
+ };
1982
+ readonly reach: {
1983
+ readonly slot: "b";
1984
+ readonly label: "Reach";
1985
+ readonly min: 0.05;
1986
+ readonly max: 1.5;
1987
+ readonly step: 0.01;
1988
+ readonly default: 0.42;
1989
+ readonly hint: "How far a lamp throws before the inverse square eats it.";
1990
+ };
1991
+ readonly walls: {
1992
+ readonly slot: "c";
1993
+ readonly label: "Walls";
1994
+ readonly min: 0;
1995
+ readonly max: 2;
1996
+ readonly step: 0.01;
1997
+ readonly default: 1;
1998
+ readonly hint: "Size of the bars that block light. 0 removes them and the shadows with them.";
1999
+ };
2000
+ readonly skylight: {
2001
+ readonly slot: "d";
2002
+ readonly label: "Skylight";
2003
+ readonly min: 0;
2004
+ readonly max: 0.5;
2005
+ readonly step: 0.005;
2006
+ readonly default: 0.06;
2007
+ readonly hint: "Ambient floor, so the bars read as objects in a room rather than holes cut out of it.";
2008
+ };
2009
+ readonly vibrancy: {
2010
+ readonly slot: "vibrancy";
2011
+ readonly label: "Vibrancy";
2012
+ readonly min: 0;
2013
+ readonly max: 2;
2014
+ readonly step: 0.01;
2015
+ readonly default: 1;
2016
+ readonly hint: "Saturation. 0 is greyscale, 1 is as authored, 2 is punched.";
2017
+ };
2018
+ };
2019
+ readonly colors: {
2020
+ readonly colorA: ColorControl;
2021
+ readonly colorB: ColorControl;
2022
+ readonly colorC: ColorControl;
2023
+ };
2024
+ };
2025
+ readonly lumen: {
2026
+ readonly name: "Lumen";
2027
+ readonly tagline: "A lattice of dots, each one a lamp and a wall at once";
2028
+ readonly description: "Every dot gives light and blocks it, so the field shadows itself. The lattice is what makes that affordable: all the dots are the same size, so the nearest one to any point is simply the nearest lattice node and the distance to the whole field is exact rather than estimated. A ray crosses a dozen cells in a few steps, which is why the shadows run the width of the frame. A wave decides which dots are lit; the dark ones stay in the picture as grey, and keep casting.";
2029
+ readonly family: "geometric";
2030
+ readonly tags: readonly ["light", "grid", "loader", "dark"];
2031
+ readonly cost: "heavy";
2032
+ readonly controls: {
2033
+ readonly speed: {
2034
+ readonly default: 0.6;
2035
+ readonly max: 2;
2036
+ readonly slot: "speed";
2037
+ readonly label: "Speed";
2038
+ readonly min: 0;
2039
+ readonly step: 0.01;
2040
+ readonly hint: "Time multiplier. 0 freezes the shader on its current frame.";
2041
+ };
2042
+ readonly scale: {
1948
2043
  readonly default: 1;
2044
+ readonly min: 0.3;
2045
+ readonly max: 2.5;
2046
+ readonly slot: "scale";
2047
+ readonly label: "Scale";
2048
+ readonly step: 0.01;
2049
+ readonly hint: "Zoom of the underlying field. Lower is bigger, softer shapes.";
2050
+ };
2051
+ readonly intensity: {
2052
+ readonly default: 1.1;
1949
2053
  readonly slot: "intensity";
1950
2054
  readonly label: "Strength";
1951
2055
  readonly min: 0;
@@ -1963,7 +2067,7 @@ export declare const shaderRegistry: {
1963
2067
  readonly hint: "Per-pixel noise. A little hides banding on flat gradients.";
1964
2068
  };
1965
2069
  readonly vignette: {
1966
- readonly default: 0.2;
2070
+ readonly default: 0.45;
1967
2071
  readonly slot: "vignette";
1968
2072
  readonly label: "Vignette";
1969
2073
  readonly min: 0;
@@ -1971,50 +2075,1438 @@ export declare const shaderRegistry: {
1971
2075
  readonly step: 0.01;
1972
2076
  readonly hint: "Darkening towards the edges of the frame.";
1973
2077
  };
1974
- readonly warp: {
1975
- readonly label: "Refraction";
2078
+ readonly rays: {
2079
+ readonly slot: "a";
2080
+ readonly label: "Rays";
2081
+ readonly min: 3;
2082
+ readonly max: 40;
2083
+ readonly step: 1;
2084
+ readonly default: 20;
2085
+ readonly hint: "Directions each pixel samples. Low is streaky and cheap; high is smooth and is what costs.";
2086
+ };
2087
+ readonly dot: {
2088
+ readonly slot: "b";
2089
+ readonly label: "Dot size";
2090
+ readonly min: 0.02;
2091
+ readonly max: 0.45;
2092
+ readonly step: 0.005;
2093
+ readonly default: 0.16;
2094
+ readonly hint: "Radius of a dot, in cells. Big dots shadow more of the lattice than they light.";
2095
+ };
2096
+ readonly lit: {
2097
+ readonly slot: "c";
2098
+ readonly label: "Lit";
2099
+ readonly min: 0;
2100
+ readonly max: 1;
2101
+ readonly step: 0.01;
2102
+ readonly default: 0.35;
2103
+ readonly hint: "Share of the lattice that is emitting at any moment.";
2104
+ };
2105
+ readonly reach: {
2106
+ readonly slot: "d";
2107
+ readonly label: "Reach";
2108
+ readonly min: 0.3;
2109
+ readonly max: 8;
2110
+ readonly step: 0.05;
2111
+ readonly default: 1.6;
2112
+ readonly hint: "How many cells a dot throws across before the inverse square eats it.";
2113
+ };
2114
+ readonly vibrancy: {
2115
+ readonly slot: "vibrancy";
2116
+ readonly label: "Vibrancy";
2117
+ readonly min: 0;
2118
+ readonly max: 2;
2119
+ readonly step: 0.01;
2120
+ readonly default: 1;
2121
+ readonly hint: "Saturation. 0 is greyscale, 1 is as authored, 2 is punched.";
2122
+ };
2123
+ };
2124
+ readonly colors: {
2125
+ readonly colorA: ColorControl;
2126
+ readonly colorB: ColorControl;
2127
+ readonly colorC: ColorControl;
2128
+ };
2129
+ };
2130
+ readonly beacon: {
2131
+ readonly name: "Beacon";
2132
+ readonly tagline: "A triangle of LEDs on a floor that catches what they throw";
2133
+ readonly description: "The glow is computed, never blurred. Each edge contributes an exponential falloff off the line itself and a second off the emitter nearest along it, both analytic, so the halo keeps its shape at any zoom and the LEDs stay round at any pixel density. The floor is the same light field read at the mirrored point, widened with depth — a reflection for the price of a second lookup. Give two edges different colours and the plate picks up both.";
2134
+ readonly family: "geometric";
2135
+ readonly tags: readonly ["hero", "neon", "dark", "pointer"];
2136
+ readonly cost: "light";
2137
+ readonly controls: {
2138
+ readonly speed: {
1976
2139
  readonly default: 0.8;
1977
2140
  readonly max: 2.5;
1978
- readonly hint: "How far the sheet bends what is behind it.";
1979
- readonly slot: "warp";
2141
+ readonly slot: "speed";
2142
+ readonly label: "Speed";
2143
+ readonly min: 0;
2144
+ readonly step: 0.01;
2145
+ readonly hint: "Time multiplier. 0 freezes the shader on its current frame.";
2146
+ };
2147
+ readonly scale: {
2148
+ readonly default: 1;
2149
+ readonly min: 0.3;
2150
+ readonly max: 2;
2151
+ readonly slot: "scale";
2152
+ readonly label: "Scale";
2153
+ readonly step: 0.01;
2154
+ readonly hint: "Zoom of the underlying field. Lower is bigger, softer shapes.";
2155
+ };
2156
+ readonly intensity: {
2157
+ readonly default: 1;
2158
+ readonly slot: "intensity";
2159
+ readonly label: "Strength";
2160
+ readonly min: 0;
2161
+ readonly max: 2.5;
2162
+ readonly step: 0.01;
2163
+ readonly hint: "Overall brightness of the effect before the post chain.";
2164
+ };
2165
+ readonly grain: {
2166
+ readonly default: 0.02;
2167
+ readonly slot: "grain";
2168
+ readonly label: "Grain";
2169
+ readonly min: 0;
2170
+ readonly max: 0.35;
2171
+ readonly step: 0.005;
2172
+ readonly hint: "Per-pixel noise. A little hides banding on flat gradients.";
2173
+ };
2174
+ readonly vignette: {
2175
+ readonly default: 0.35;
2176
+ readonly slot: "vignette";
2177
+ readonly label: "Vignette";
2178
+ readonly min: 0;
2179
+ readonly max: 1;
2180
+ readonly step: 0.01;
2181
+ readonly hint: "Darkening towards the edges of the frame.";
2182
+ };
2183
+ readonly leds: {
2184
+ readonly slot: "a";
2185
+ readonly label: "LEDs";
2186
+ readonly min: 2;
2187
+ readonly max: 40;
2188
+ readonly step: 1;
2189
+ readonly default: 13;
2190
+ readonly hint: "Emitters per edge. Few reads as a marquee, many as a strip.";
2191
+ };
2192
+ readonly bleed: {
2193
+ readonly slot: "b";
2194
+ readonly label: "Bleed";
2195
+ readonly min: 0.004;
2196
+ readonly max: 0.2;
2197
+ readonly step: 0.002;
2198
+ readonly default: 0.04;
2199
+ readonly hint: "How far light carries off an edge. Small is a hard point, large is a wash.";
2200
+ };
2201
+ readonly reflection: {
2202
+ readonly slot: "c";
2203
+ readonly label: "Reflection";
2204
+ readonly min: 0;
2205
+ readonly max: 1;
2206
+ readonly step: 0.01;
2207
+ readonly default: 0.6;
2208
+ readonly hint: "How much of the triangle the floor gives back.";
2209
+ };
2210
+ readonly chase: {
2211
+ readonly slot: "d";
2212
+ readonly label: "Chase";
2213
+ readonly min: 0;
2214
+ readonly max: 1;
2215
+ readonly step: 0.01;
2216
+ readonly default: 0.7;
2217
+ readonly hint: "0 holds every LED steady, 1 runs a pulse around the perimeter.";
2218
+ };
2219
+ readonly vibrancy: {
2220
+ readonly slot: "vibrancy";
2221
+ readonly label: "Vibrancy";
2222
+ readonly min: 0;
2223
+ readonly max: 2;
2224
+ readonly step: 0.01;
2225
+ readonly default: 1;
2226
+ readonly hint: "Saturation. 0 is greyscale, 1 is as authored, 2 is punched.";
2227
+ };
2228
+ };
2229
+ readonly colors: {
2230
+ readonly colorA: ColorControl;
2231
+ readonly colorB: ColorControl;
2232
+ readonly colorC: ColorControl;
2233
+ };
2234
+ };
2235
+ readonly orb: {
2236
+ readonly name: "Orb";
2237
+ readonly tagline: "A liquid blob suspended in a sphere of glass";
2238
+ readonly description: "The glass is analytic and the blob is marched, which is the only way this fits in one pass: a sphere is two roots of a quadratic, so entry, exit and both normals are exact and the ray only has to be stepped between them. The body inside is lobes melted together with a smooth minimum, which is what keeps it reading as one liquid thing rather than as balls in a bag. Nothing has a hard edge — the silhouette is antialiased off a field that stays smooth across the frame, and the blob off its own distance. The pointer turns the studio, so the highlights travel across the glass.";
2239
+ readonly family: "organic";
2240
+ readonly tags: readonly ["glass", "hero", "3d", "pointer"];
2241
+ readonly cost: "heavy";
2242
+ readonly controls: {
2243
+ readonly speed: {
2244
+ readonly default: 0.45;
2245
+ readonly max: 2;
2246
+ readonly slot: "speed";
2247
+ readonly label: "Speed";
2248
+ readonly min: 0;
2249
+ readonly step: 0.01;
2250
+ readonly hint: "Time multiplier. 0 freezes the shader on its current frame.";
2251
+ };
2252
+ readonly scale: {
2253
+ readonly default: 1;
2254
+ readonly min: 0.4;
2255
+ readonly max: 2;
2256
+ readonly slot: "scale";
2257
+ readonly label: "Scale";
2258
+ readonly step: 0.01;
2259
+ readonly hint: "Zoom of the underlying field. Lower is bigger, softer shapes.";
2260
+ };
2261
+ readonly intensity: {
2262
+ readonly default: 1;
2263
+ readonly slot: "intensity";
2264
+ readonly label: "Strength";
2265
+ readonly min: 0;
2266
+ readonly max: 2.5;
2267
+ readonly step: 0.01;
2268
+ readonly hint: "Overall brightness of the effect before the post chain.";
2269
+ };
2270
+ readonly grain: {
2271
+ readonly default: 0.015;
2272
+ readonly slot: "grain";
2273
+ readonly label: "Grain";
1980
2274
  readonly min: 0;
2275
+ readonly max: 0.35;
2276
+ readonly step: 0.005;
2277
+ readonly hint: "Per-pixel noise. A little hides banding on flat gradients.";
2278
+ };
2279
+ readonly vignette: {
2280
+ readonly default: 0.4;
2281
+ readonly slot: "vignette";
2282
+ readonly label: "Vignette";
2283
+ readonly min: 0;
2284
+ readonly max: 1;
2285
+ readonly step: 0.01;
2286
+ readonly hint: "Darkening towards the edges of the frame.";
2287
+ };
2288
+ readonly warp: {
2289
+ readonly label: "Refraction";
2290
+ readonly min: 0;
2291
+ readonly max: 2;
2292
+ readonly default: 0.75;
2293
+ readonly hint: "How hard the glass bends a ray. 0 is a clear shell, 2 is a heavy lens.";
2294
+ readonly slot: "warp";
2295
+ readonly step: 0.01;
2296
+ };
2297
+ readonly core: {
2298
+ readonly slot: "a";
2299
+ readonly label: "Core";
2300
+ readonly min: 0;
2301
+ readonly max: 1;
2302
+ readonly step: 0.01;
2303
+ readonly default: 0.8;
2304
+ readonly hint: "0 is one round drop. 1 pulls the lobes apart and ripples the skin, so the body churns and pinches.";
2305
+ };
2306
+ readonly dispersion: {
2307
+ readonly slot: "b";
2308
+ readonly label: "Dispersion";
2309
+ readonly min: 0;
2310
+ readonly max: 1;
2311
+ readonly step: 0.01;
2312
+ readonly default: 0.45;
2313
+ readonly hint: "How far the red and blue ends part on the way out of the glass.";
2314
+ };
2315
+ readonly lobes: {
2316
+ readonly slot: "c";
2317
+ readonly label: "Lobes";
2318
+ readonly min: 1;
2319
+ readonly max: 8;
2320
+ readonly step: 1;
2321
+ readonly default: 5;
2322
+ readonly hint: "Bodies melted into the blob. Each one costs a distance every step of the march.";
2323
+ };
2324
+ readonly studio: {
2325
+ readonly slot: "d";
2326
+ readonly label: "Studio";
2327
+ readonly min: 0;
2328
+ readonly max: 2;
2329
+ readonly step: 0.01;
2330
+ readonly default: 1;
2331
+ readonly hint: "Strength of the two softboxes the glass reflects.";
2332
+ };
2333
+ readonly vibrancy: {
2334
+ readonly slot: "vibrancy";
2335
+ readonly label: "Vibrancy";
2336
+ readonly min: 0;
2337
+ readonly max: 2;
2338
+ readonly step: 0.01;
2339
+ readonly default: 1;
2340
+ readonly hint: "Saturation. 0 is greyscale, 1 is as authored, 2 is punched.";
2341
+ };
2342
+ };
2343
+ readonly colors: {
2344
+ readonly colorA: ColorControl;
2345
+ readonly colorB: ColorControl;
2346
+ readonly colorC: ColorControl;
2347
+ };
2348
+ };
2349
+ readonly eyes: {
2350
+ readonly name: "Eyes";
2351
+ readonly tagline: "A wall of eyes that look where the pointer goes";
2352
+ readonly description: "Each cell is one eye: an almond of sclera, an iris that travels toward the cursor, a lid that blinks on its own clock. The gaze is the interactive part — move the pointer and the whole wall follows it — but the idle frame carries itself: with no pointer the eyes wander, each on its own phase, so a card is never a grid of dead centres.";
2353
+ readonly family: "geometric";
2354
+ readonly tags: readonly ["interactive", "pointer", "playful"];
2355
+ readonly cost: "light";
2356
+ readonly controls: {
2357
+ readonly speed: {
2358
+ readonly default: 1;
2359
+ readonly max: 2.5;
2360
+ readonly slot: "speed";
2361
+ readonly label: "Speed";
2362
+ readonly min: 0;
2363
+ readonly step: 0.01;
2364
+ readonly hint: "Time multiplier. 0 freezes the shader on its current frame.";
2365
+ };
2366
+ readonly scale: {
2367
+ readonly default: 1;
2368
+ readonly min: 0.4;
2369
+ readonly max: 2.5;
2370
+ readonly slot: "scale";
2371
+ readonly label: "Scale";
2372
+ readonly step: 0.01;
2373
+ readonly hint: "Zoom of the underlying field. Lower is bigger, softer shapes.";
2374
+ };
2375
+ readonly grain: {
2376
+ readonly default: 0.02;
2377
+ readonly slot: "grain";
2378
+ readonly label: "Grain";
2379
+ readonly min: 0;
2380
+ readonly max: 0.35;
2381
+ readonly step: 0.005;
2382
+ readonly hint: "Per-pixel noise. A little hides banding on flat gradients.";
2383
+ };
2384
+ readonly vignette: {
2385
+ readonly default: 0.3;
2386
+ readonly slot: "vignette";
2387
+ readonly label: "Vignette";
2388
+ readonly min: 0;
2389
+ readonly max: 1;
2390
+ readonly step: 0.01;
2391
+ readonly hint: "Darkening towards the edges of the frame.";
2392
+ };
2393
+ readonly follow: {
2394
+ readonly slot: "a";
2395
+ readonly label: "Follow";
2396
+ readonly min: 0;
2397
+ readonly max: 1;
2398
+ readonly step: 0.01;
2399
+ readonly default: 0.85;
2400
+ readonly hint: "0 lets every eye wander on its own, 1 locks them all onto the pointer.";
2401
+ };
2402
+ readonly blink: {
2403
+ readonly slot: "b";
2404
+ readonly label: "Blink";
2405
+ readonly min: 0;
2406
+ readonly max: 3;
2407
+ readonly step: 0.01;
2408
+ readonly default: 1;
2409
+ readonly hint: "Blink rate. 0 stares, which is worse.";
2410
+ };
2411
+ readonly iris: {
2412
+ readonly slot: "c";
2413
+ readonly label: "Iris";
2414
+ readonly min: 0.4;
2415
+ readonly max: 1.6;
2416
+ readonly step: 0.01;
2417
+ readonly default: 1;
2418
+ readonly hint: "Size of the iris inside the almond.";
2419
+ };
2420
+ readonly pupil: {
2421
+ readonly slot: "d";
2422
+ readonly label: "Pupil";
2423
+ readonly min: 0.15;
2424
+ readonly max: 0.9;
2425
+ readonly step: 0.01;
2426
+ readonly default: 0.45;
2427
+ readonly hint: "Pupil as a share of the iris. Big is dark-adapted, or alarmed.";
2428
+ };
2429
+ readonly intensity: {
2430
+ readonly slot: "intensity";
2431
+ readonly label: "Strength";
2432
+ readonly min: 0;
2433
+ readonly max: 2.5;
2434
+ readonly step: 0.01;
2435
+ readonly default: 1;
2436
+ readonly hint: "Overall brightness of the effect before the post chain.";
2437
+ };
2438
+ readonly vibrancy: {
2439
+ readonly slot: "vibrancy";
2440
+ readonly label: "Vibrancy";
2441
+ readonly min: 0;
2442
+ readonly max: 2;
2443
+ readonly step: 0.01;
2444
+ readonly default: 1;
2445
+ readonly hint: "Saturation. 0 is greyscale, 1 is as authored, 2 is punched.";
2446
+ };
2447
+ };
2448
+ readonly colors: {
2449
+ readonly colorA: ColorControl;
2450
+ readonly colorB: ColorControl;
2451
+ readonly colorC: ColorControl;
2452
+ };
2453
+ };
2454
+ readonly tesla: {
2455
+ readonly name: "Tesla";
2456
+ readonly tagline: "A plasma globe whose filament reaches for your finger";
2457
+ readonly description: "The bolts are analytic: each one is a base angle plus a noise wiggle that grows with radius, so a pixel's distance to a filament is its angular error times its radius — no marching, no segments. Bolts re-roll their heading on a coarse clock, which is the jump that reads as electricity. One bolt always seeks the pointer, clamped to the inside of the glass, exactly what the real toy does when a hand touches the dome.";
2458
+ readonly family: "organic";
2459
+ readonly tags: readonly ["interactive", "pointer", "dark", "hero"];
2460
+ readonly cost: "medium";
2461
+ readonly controls: {
2462
+ readonly speed: {
2463
+ readonly default: 1;
2464
+ readonly max: 2.5;
2465
+ readonly slot: "speed";
2466
+ readonly label: "Speed";
2467
+ readonly min: 0;
2468
+ readonly step: 0.01;
2469
+ readonly hint: "Time multiplier. 0 freezes the shader on its current frame.";
2470
+ };
2471
+ readonly scale: {
2472
+ readonly default: 1;
2473
+ readonly min: 0.4;
2474
+ readonly max: 2;
2475
+ readonly slot: "scale";
2476
+ readonly label: "Scale";
2477
+ readonly step: 0.01;
2478
+ readonly hint: "Zoom of the underlying field. Lower is bigger, softer shapes.";
2479
+ };
2480
+ readonly grain: {
2481
+ readonly default: 0.02;
2482
+ readonly slot: "grain";
2483
+ readonly label: "Grain";
2484
+ readonly min: 0;
2485
+ readonly max: 0.35;
2486
+ readonly step: 0.005;
2487
+ readonly hint: "Per-pixel noise. A little hides banding on flat gradients.";
2488
+ };
2489
+ readonly vignette: {
2490
+ readonly default: 0.4;
2491
+ readonly slot: "vignette";
2492
+ readonly label: "Vignette";
2493
+ readonly min: 0;
2494
+ readonly max: 1;
2495
+ readonly step: 0.01;
2496
+ readonly hint: "Darkening towards the edges of the frame.";
2497
+ };
2498
+ readonly warp: {
2499
+ readonly label: "Wiggle";
2500
+ readonly min: 0;
2501
+ readonly max: 2;
2502
+ readonly default: 0.8;
2503
+ readonly hint: "How hard a filament thrashes as it travels. 0 is spokes.";
2504
+ readonly slot: "warp";
2505
+ readonly step: 0.01;
2506
+ };
2507
+ readonly bolts: {
2508
+ readonly slot: "a";
2509
+ readonly label: "Bolts";
2510
+ readonly min: 2;
2511
+ readonly max: 8;
2512
+ readonly step: 1;
2513
+ readonly default: 5;
2514
+ readonly hint: "Free-roaming filaments, not counting the one that seeks the pointer.";
2515
+ };
2516
+ readonly glow: {
2517
+ readonly slot: "b";
2518
+ readonly label: "Glow";
2519
+ readonly min: 0.3;
2520
+ readonly max: 2;
2521
+ readonly step: 0.01;
2522
+ readonly default: 1;
2523
+ readonly hint: "Width of the halo riding each filament.";
2524
+ };
2525
+ readonly flicker: {
2526
+ readonly slot: "c";
2527
+ readonly label: "Flicker";
2528
+ readonly min: 0;
2529
+ readonly max: 2;
2530
+ readonly step: 0.01;
2531
+ readonly default: 1;
2532
+ readonly hint: "How often the bolts re-roll their heading.";
2533
+ };
2534
+ readonly haze: {
2535
+ readonly slot: "d";
2536
+ readonly label: "Haze";
2537
+ readonly min: 0;
2538
+ readonly max: 2;
2539
+ readonly step: 0.01;
2540
+ readonly default: 0.8;
2541
+ readonly hint: "The gas glow filling the globe behind the filaments.";
2542
+ };
2543
+ readonly intensity: {
2544
+ readonly slot: "intensity";
2545
+ readonly label: "Strength";
2546
+ readonly min: 0;
2547
+ readonly max: 2.5;
2548
+ readonly step: 0.01;
2549
+ readonly default: 1;
2550
+ readonly hint: "Overall brightness of the effect before the post chain.";
2551
+ };
2552
+ readonly vibrancy: {
2553
+ readonly slot: "vibrancy";
2554
+ readonly label: "Vibrancy";
2555
+ readonly min: 0;
2556
+ readonly max: 2;
2557
+ readonly step: 0.01;
2558
+ readonly default: 1;
2559
+ readonly hint: "Saturation. 0 is greyscale, 1 is as authored, 2 is punched.";
2560
+ };
2561
+ };
2562
+ readonly colors: {
2563
+ readonly colorA: ColorControl;
2564
+ readonly colorB: ColorControl;
2565
+ readonly colorC: ColorControl;
2566
+ };
2567
+ };
2568
+ readonly magnet: {
2569
+ readonly name: "Magnet";
2570
+ readonly tagline: "Field lines of three charges, one riding the pointer";
2571
+ readonly description: "Nothing here is traced. The stream function of a point charge is its angle and its potential is the log of its distance, so field lines are level sets of one sum and equipotentials of the other — the whole plot is two sin() calls over closed forms, live at any resolution. The pointer carries the third charge; its slider steps by whole numbers because the picture's continuity across the branch cuts depends on the charges being integers.";
2572
+ readonly family: "geometric";
2573
+ readonly tags: readonly ["interactive", "pointer", "diagram"];
2574
+ readonly cost: "light";
2575
+ readonly controls: {
2576
+ readonly speed: {
2577
+ readonly default: 1;
2578
+ readonly max: 2.5;
2579
+ readonly slot: "speed";
2580
+ readonly label: "Speed";
2581
+ readonly min: 0;
2582
+ readonly step: 0.01;
2583
+ readonly hint: "Time multiplier. 0 freezes the shader on its current frame.";
2584
+ };
2585
+ readonly scale: {
2586
+ readonly default: 1;
2587
+ readonly min: 0.4;
2588
+ readonly max: 2.5;
2589
+ readonly slot: "scale";
2590
+ readonly label: "Scale";
2591
+ readonly step: 0.01;
2592
+ readonly hint: "Zoom of the underlying field. Lower is bigger, softer shapes.";
2593
+ };
2594
+ readonly grain: {
2595
+ readonly default: 0.02;
2596
+ readonly slot: "grain";
2597
+ readonly label: "Grain";
2598
+ readonly min: 0;
2599
+ readonly max: 0.35;
2600
+ readonly step: 0.005;
2601
+ readonly hint: "Per-pixel noise. A little hides banding on flat gradients.";
2602
+ };
2603
+ readonly vignette: {
2604
+ readonly default: 0.35;
2605
+ readonly slot: "vignette";
2606
+ readonly label: "Vignette";
2607
+ readonly min: 0;
2608
+ readonly max: 1;
2609
+ readonly step: 0.01;
2610
+ readonly hint: "Darkening towards the edges of the frame.";
2611
+ };
2612
+ readonly lines: {
2613
+ readonly slot: "a";
2614
+ readonly label: "Lines";
2615
+ readonly min: 4;
2616
+ readonly max: 48;
2617
+ readonly step: 1;
2618
+ readonly default: 14;
2619
+ readonly hint: "Field lines leaving each unit of charge.";
2620
+ };
2621
+ readonly flow: {
2622
+ readonly slot: "b";
2623
+ readonly label: "Flow";
2624
+ readonly min: 0;
2625
+ readonly max: 3;
2626
+ readonly step: 0.01;
2627
+ readonly default: 1;
2628
+ readonly hint: "The phase sliding along the lines. 0 is a printed diagram.";
2629
+ };
2630
+ readonly charge: {
2631
+ readonly slot: "c";
2632
+ readonly label: "Charge";
2633
+ readonly min: -2;
2634
+ readonly max: 2;
2635
+ readonly step: 1;
2636
+ readonly default: 1;
2637
+ readonly hint: "The pointer's charge. Whole numbers only — the picture tears otherwise. 0 removes it.";
2638
+ };
2639
+ readonly intensity: {
2640
+ readonly slot: "intensity";
2641
+ readonly label: "Strength";
2642
+ readonly min: 0;
2643
+ readonly max: 2.5;
2644
+ readonly step: 0.01;
2645
+ readonly default: 1;
2646
+ readonly hint: "Overall brightness of the effect before the post chain.";
2647
+ };
2648
+ readonly vibrancy: {
2649
+ readonly slot: "vibrancy";
2650
+ readonly label: "Vibrancy";
2651
+ readonly min: 0;
2652
+ readonly max: 2;
2653
+ readonly step: 0.01;
2654
+ readonly default: 1;
2655
+ readonly hint: "Saturation. 0 is greyscale, 1 is as authored, 2 is punched.";
2656
+ };
2657
+ };
2658
+ readonly colors: {
2659
+ readonly colorA: ColorControl;
2660
+ readonly colorB: ColorControl;
2661
+ readonly colorC: ColorControl;
2662
+ };
2663
+ };
2664
+ readonly torch: {
2665
+ readonly name: "Torch";
2666
+ readonly tagline: "A light in your hand, moving over rock in the dark";
2667
+ readonly description: "The wall is a heightfield and the lamp is the pointer, so the shading is honest: the fbm that draws the rock is differentiated for a normal, and crevices light up and go dark as the torch passes over them — which is what makes the surface read as carved rather than printed. The flame gutters on two noise rates, a slow breathe under a fast sputter, and dust motes drift through the beam because lit air is the only air you can see.";
2668
+ readonly family: "spatial";
2669
+ readonly tags: readonly ["interactive", "pointer", "dark"];
2670
+ readonly cost: "medium";
2671
+ readonly controls: {
2672
+ readonly speed: {
2673
+ readonly default: 1;
2674
+ readonly max: 2;
2675
+ readonly slot: "speed";
2676
+ readonly label: "Speed";
2677
+ readonly min: 0;
2678
+ readonly step: 0.01;
2679
+ readonly hint: "Time multiplier. 0 freezes the shader on its current frame.";
2680
+ };
2681
+ readonly scale: {
2682
+ readonly default: 1;
2683
+ readonly min: 0.4;
2684
+ readonly max: 2.5;
2685
+ readonly slot: "scale";
2686
+ readonly label: "Scale";
2687
+ readonly step: 0.01;
2688
+ readonly hint: "Zoom of the underlying field. Lower is bigger, softer shapes.";
2689
+ };
2690
+ readonly grain: {
2691
+ readonly default: 0.03;
2692
+ readonly slot: "grain";
2693
+ readonly label: "Grain";
2694
+ readonly min: 0;
2695
+ readonly max: 0.35;
2696
+ readonly step: 0.005;
2697
+ readonly hint: "Per-pixel noise. A little hides banding on flat gradients.";
2698
+ };
2699
+ readonly vignette: {
2700
+ readonly default: 0.5;
2701
+ readonly slot: "vignette";
2702
+ readonly label: "Vignette";
2703
+ readonly min: 0;
2704
+ readonly max: 1;
2705
+ readonly step: 0.01;
2706
+ readonly hint: "Darkening towards the edges of the frame.";
2707
+ };
2708
+ readonly warp: {
2709
+ readonly label: "Relief";
2710
+ readonly min: 0;
2711
+ readonly max: 2.5;
2712
+ readonly default: 1;
2713
+ readonly hint: "Steepness of the rock. It scales the slope, not the texture.";
2714
+ readonly slot: "warp";
2715
+ readonly step: 0.01;
2716
+ };
2717
+ readonly beam: {
2718
+ readonly slot: "a";
2719
+ readonly label: "Beam";
2720
+ readonly min: 0.15;
2721
+ readonly max: 1.5;
2722
+ readonly step: 0.01;
2723
+ readonly default: 0.7;
2724
+ readonly hint: "Radius of the pool of light around the pointer.";
2725
+ };
2726
+ readonly gutter: {
2727
+ readonly slot: "b";
2728
+ readonly label: "Gutter";
2729
+ readonly min: 0;
2730
+ readonly max: 2;
2731
+ readonly step: 0.01;
2732
+ readonly default: 1;
2733
+ readonly hint: "How much the flame wavers. 0 is an LED.";
2734
+ };
2735
+ readonly motes: {
2736
+ readonly slot: "c";
2737
+ readonly label: "Motes";
2738
+ readonly min: 0;
2739
+ readonly max: 2;
2740
+ readonly step: 0.01;
2741
+ readonly default: 0.8;
2742
+ readonly hint: "Dust drifting through the beam.";
2743
+ };
2744
+ readonly ambient: {
2745
+ readonly slot: "d";
2746
+ readonly label: "Ambient";
2747
+ readonly min: 0;
2748
+ readonly max: 1;
2749
+ readonly step: 0.01;
2750
+ readonly default: 0.35;
2751
+ readonly hint: "What little the dark still shows. 0 is a cave.";
2752
+ };
2753
+ readonly intensity: {
2754
+ readonly slot: "intensity";
2755
+ readonly label: "Strength";
2756
+ readonly min: 0;
2757
+ readonly max: 2.5;
2758
+ readonly step: 0.01;
2759
+ readonly default: 1;
2760
+ readonly hint: "Overall brightness of the effect before the post chain.";
2761
+ };
2762
+ readonly vibrancy: {
2763
+ readonly slot: "vibrancy";
2764
+ readonly label: "Vibrancy";
2765
+ readonly min: 0;
2766
+ readonly max: 2;
2767
+ readonly step: 0.01;
2768
+ readonly default: 1;
2769
+ readonly hint: "Saturation. 0 is greyscale, 1 is as authored, 2 is punched.";
2770
+ };
2771
+ };
2772
+ readonly colors: {
2773
+ readonly colorA: ColorControl;
2774
+ readonly colorB: ColorControl;
2775
+ readonly colorC: ColorControl;
2776
+ };
2777
+ };
2778
+ readonly parallax: {
2779
+ readonly name: "Parallax";
2780
+ readonly tagline: "Ridgelines in depth, and the pointer moves the camera";
2781
+ readonly description: "Five silhouettes, each a one-dimensional ridged fbm thresholded against the pixel's height. Depth is faked twice over: haze mixes each layer toward the sky, and the pointer pans each layer by its own factor — the near ridge slides furthest, which is the one cue that turns a flat stack into a landscape you are standing in. Time scrolls the world slowly on its own.";
2782
+ readonly family: "organic";
2783
+ readonly tags: readonly ["interactive", "pointer", "hero", "calm"];
2784
+ readonly cost: "medium";
2785
+ readonly controls: {
2786
+ readonly speed: {
2787
+ readonly default: 0.6;
2788
+ readonly max: 2;
2789
+ readonly slot: "speed";
2790
+ readonly label: "Speed";
2791
+ readonly min: 0;
2792
+ readonly step: 0.01;
2793
+ readonly hint: "Time multiplier. 0 freezes the shader on its current frame.";
2794
+ };
2795
+ readonly scale: {
2796
+ readonly default: 1;
2797
+ readonly min: 0.4;
2798
+ readonly max: 2.5;
2799
+ readonly slot: "scale";
2800
+ readonly label: "Scale";
2801
+ readonly step: 0.01;
2802
+ readonly hint: "Zoom of the underlying field. Lower is bigger, softer shapes.";
2803
+ };
2804
+ readonly grain: {
2805
+ readonly default: 0.03;
2806
+ readonly slot: "grain";
2807
+ readonly label: "Grain";
2808
+ readonly min: 0;
2809
+ readonly max: 0.35;
2810
+ readonly step: 0.005;
2811
+ readonly hint: "Per-pixel noise. A little hides banding on flat gradients.";
2812
+ };
2813
+ readonly vignette: {
2814
+ readonly default: 0.3;
2815
+ readonly slot: "vignette";
2816
+ readonly label: "Vignette";
2817
+ readonly min: 0;
2818
+ readonly max: 1;
2819
+ readonly step: 0.01;
2820
+ readonly hint: "Darkening towards the edges of the frame.";
2821
+ };
2822
+ readonly warp: {
2823
+ readonly label: "Jaggedness";
2824
+ readonly min: 0.2;
2825
+ readonly max: 2;
2826
+ readonly default: 1;
2827
+ readonly hint: "How sharp the ridgelines cut. Low rolls, high tears.";
2828
+ readonly slot: "warp";
2829
+ readonly step: 0.01;
2830
+ };
2831
+ readonly height: {
2832
+ readonly slot: "b";
2833
+ readonly label: "Height";
2834
+ readonly min: 0.3;
2835
+ readonly max: 2;
2836
+ readonly step: 0.01;
2837
+ readonly default: 1;
2838
+ readonly hint: "Amplitude of the mountains against the sky.";
2839
+ };
2840
+ readonly pan: {
2841
+ readonly slot: "c";
2842
+ readonly label: "Pan";
2843
+ readonly min: 0;
2844
+ readonly max: 2;
2845
+ readonly step: 0.01;
2846
+ readonly default: 1;
2847
+ readonly hint: "How far the pointer swings the camera.";
2848
+ };
2849
+ readonly sun: {
2850
+ readonly slot: "d";
2851
+ readonly label: "Sun";
2852
+ readonly min: 0;
2853
+ readonly max: 2;
2854
+ readonly step: 0.01;
2855
+ readonly default: 1;
2856
+ readonly hint: "The low sun and the rim light it puts on every ridge.";
2857
+ };
2858
+ readonly intensity: {
2859
+ readonly slot: "intensity";
2860
+ readonly label: "Strength";
2861
+ readonly min: 0;
2862
+ readonly max: 2.5;
2863
+ readonly step: 0.01;
2864
+ readonly default: 1;
2865
+ readonly hint: "Overall brightness of the effect before the post chain.";
2866
+ };
2867
+ readonly vibrancy: {
2868
+ readonly slot: "vibrancy";
2869
+ readonly label: "Vibrancy";
2870
+ readonly min: 0;
2871
+ readonly max: 2;
2872
+ readonly step: 0.01;
2873
+ readonly default: 1;
2874
+ readonly hint: "Saturation. 0 is greyscale, 1 is as authored, 2 is punched.";
2875
+ };
2876
+ };
2877
+ readonly colors: {
2878
+ readonly colorA: ColorControl;
2879
+ readonly colorB: ColorControl;
2880
+ readonly colorC: ColorControl;
2881
+ };
2882
+ };
2883
+ readonly gravity: {
2884
+ readonly name: "Gravity";
2885
+ readonly tagline: "A starfield lensed by a mass that rides the pointer";
2886
+ readonly description: "The lens is the physics, simplified once: a point mass deflects light by the square of its Einstein radius over the impact distance, so every sample is just read from a pushed position. That one line produces everything the picture is known for — stars smeared into arcs, the ring at the Einstein radius, doubled images inside it — and dragging the pointer drags the distortion across the sky.";
2887
+ readonly family: "spatial";
2888
+ readonly tags: readonly ["interactive", "pointer", "dark", "hero"];
2889
+ readonly cost: "medium";
2890
+ readonly controls: {
2891
+ readonly speed: {
2892
+ readonly default: 0.8;
2893
+ readonly max: 2;
2894
+ readonly slot: "speed";
2895
+ readonly label: "Speed";
2896
+ readonly min: 0;
2897
+ readonly step: 0.01;
2898
+ readonly hint: "Time multiplier. 0 freezes the shader on its current frame.";
2899
+ };
2900
+ readonly scale: {
2901
+ readonly default: 1;
2902
+ readonly min: 0.4;
2903
+ readonly max: 2.5;
2904
+ readonly slot: "scale";
2905
+ readonly label: "Scale";
2906
+ readonly step: 0.01;
2907
+ readonly hint: "Zoom of the underlying field. Lower is bigger, softer shapes.";
2908
+ };
2909
+ readonly grain: {
2910
+ readonly default: 0.02;
2911
+ readonly slot: "grain";
2912
+ readonly label: "Grain";
2913
+ readonly min: 0;
2914
+ readonly max: 0.35;
2915
+ readonly step: 0.005;
2916
+ readonly hint: "Per-pixel noise. A little hides banding on flat gradients.";
2917
+ };
2918
+ readonly vignette: {
2919
+ readonly default: 0.35;
2920
+ readonly slot: "vignette";
2921
+ readonly label: "Vignette";
2922
+ readonly min: 0;
2923
+ readonly max: 1;
2924
+ readonly step: 0.01;
2925
+ readonly hint: "Darkening towards the edges of the frame.";
2926
+ };
2927
+ readonly mass: {
2928
+ readonly slot: "a";
2929
+ readonly label: "Mass";
2930
+ readonly min: 0.1;
2931
+ readonly max: 2.5;
2932
+ readonly step: 0.01;
2933
+ readonly default: 1;
2934
+ readonly hint: "The Einstein radius. Everything else scales from it.";
2935
+ };
2936
+ readonly ring: {
2937
+ readonly slot: "b";
2938
+ readonly label: "Ring";
2939
+ readonly min: 0;
2940
+ readonly max: 2;
2941
+ readonly step: 0.01;
2942
+ readonly default: 0.9;
2943
+ readonly hint: "The photon ring, and the hot rim on the shadow's edge.";
2944
+ };
2945
+ readonly grid: {
2946
+ readonly slot: "c";
2947
+ readonly label: "Grid";
2948
+ readonly min: 0;
2949
+ readonly max: 1;
2950
+ readonly step: 0.01;
2951
+ readonly default: 0.25;
2952
+ readonly hint: "The spacetime grid, bent through the same lens. 0 hides it.";
2953
+ };
2954
+ readonly stars: {
2955
+ readonly slot: "d";
2956
+ readonly label: "Stars";
2957
+ readonly min: 0.2;
2958
+ readonly max: 1.6;
2959
+ readonly step: 0.01;
2960
+ readonly default: 1;
2961
+ readonly hint: "Density of the field behind the lens.";
2962
+ };
2963
+ readonly intensity: {
2964
+ readonly slot: "intensity";
2965
+ readonly label: "Strength";
2966
+ readonly min: 0;
2967
+ readonly max: 2.5;
2968
+ readonly step: 0.01;
2969
+ readonly default: 1;
2970
+ readonly hint: "Overall brightness of the effect before the post chain.";
2971
+ };
2972
+ readonly vibrancy: {
2973
+ readonly slot: "vibrancy";
2974
+ readonly label: "Vibrancy";
2975
+ readonly min: 0;
2976
+ readonly max: 2;
2977
+ readonly step: 0.01;
2978
+ readonly default: 1;
2979
+ readonly hint: "Saturation. 0 is greyscale, 1 is as authored, 2 is punched.";
2980
+ };
2981
+ };
2982
+ readonly colors: {
2983
+ readonly colorA: ColorControl;
2984
+ readonly colorB: ColorControl;
2985
+ readonly colorC: ColorControl;
2986
+ };
2987
+ };
2988
+ readonly glass: {
2989
+ readonly name: "Glass";
2990
+ readonly tagline: "A refracting, frosted sheet over the layer behind it";
2991
+ readonly description: "A drifting height field read as a surface: its slope bends the layer underneath, spreads the red and blue ends apart, and catches light along the steep ground. Frost blurs along an axis the height rotates, so the sheet grains up instead of banding. Point it at an image, a video, or another shadertown shader.";
2992
+ readonly family: "optical";
2993
+ readonly tags: readonly ["glass", "refraction", "overlay"];
2994
+ readonly cost: "medium";
2995
+ readonly defaultSource: "neon-grid";
2996
+ readonly controls: {
2997
+ readonly speed: {
2998
+ readonly default: 0.35;
2999
+ readonly max: 2;
3000
+ readonly slot: "speed";
3001
+ readonly label: "Speed";
3002
+ readonly min: 0;
3003
+ readonly step: 0.01;
3004
+ readonly hint: "Time multiplier. 0 freezes the shader on its current frame.";
3005
+ };
3006
+ readonly scale: {
3007
+ readonly default: 1;
3008
+ readonly slot: "scale";
3009
+ readonly label: "Scale";
3010
+ readonly min: 0.2;
3011
+ readonly max: 3;
3012
+ readonly step: 0.01;
3013
+ readonly hint: "Zoom of the underlying field. Lower is bigger, softer shapes.";
3014
+ };
3015
+ readonly intensity: {
3016
+ readonly default: 1;
3017
+ readonly slot: "intensity";
3018
+ readonly label: "Strength";
3019
+ readonly min: 0;
3020
+ readonly max: 2.5;
3021
+ readonly step: 0.01;
3022
+ readonly hint: "Overall brightness of the effect before the post chain.";
3023
+ };
3024
+ readonly grain: {
3025
+ readonly default: 0.02;
3026
+ readonly slot: "grain";
3027
+ readonly label: "Grain";
3028
+ readonly min: 0;
3029
+ readonly max: 0.35;
3030
+ readonly step: 0.005;
3031
+ readonly hint: "Per-pixel noise. A little hides banding on flat gradients.";
3032
+ };
3033
+ readonly vignette: {
3034
+ readonly default: 0.2;
3035
+ readonly slot: "vignette";
3036
+ readonly label: "Vignette";
3037
+ readonly min: 0;
3038
+ readonly max: 1;
3039
+ readonly step: 0.01;
3040
+ readonly hint: "Darkening towards the edges of the frame.";
3041
+ };
3042
+ readonly warp: {
3043
+ readonly label: "Refraction";
3044
+ readonly default: 0.8;
3045
+ readonly max: 2.5;
3046
+ readonly hint: "How far the sheet bends what is behind it.";
3047
+ readonly slot: "warp";
3048
+ readonly min: 0;
3049
+ readonly step: 0.01;
3050
+ };
3051
+ readonly frost: {
3052
+ readonly slot: "a";
3053
+ readonly label: "Frost";
3054
+ readonly min: 0;
3055
+ readonly max: 1;
3056
+ readonly step: 0.01;
3057
+ readonly default: 0.35;
3058
+ readonly hint: "Blur radius. Past about 0.6 the layer below stops being readable.";
3059
+ };
3060
+ readonly dispersion: {
3061
+ readonly slot: "b";
3062
+ readonly label: "Dispersion";
3063
+ readonly min: 0;
3064
+ readonly max: 1;
3065
+ readonly step: 0.01;
3066
+ readonly default: 0.25;
3067
+ readonly hint: "Colour fringing where the sheet is steepest, as in real glass.";
3068
+ };
3069
+ readonly edge: {
3070
+ readonly slot: "c";
3071
+ readonly label: "Edge light";
3072
+ readonly min: 0;
3073
+ readonly max: 2;
3074
+ readonly step: 0.01;
3075
+ readonly default: 0.6;
3076
+ readonly hint: "Highlight along the ridges. This is what makes it read as thick.";
3077
+ };
3078
+ readonly tint: {
3079
+ readonly slot: "d";
3080
+ readonly label: "Tint";
3081
+ readonly min: 0;
3082
+ readonly max: 1;
3083
+ readonly step: 0.01;
3084
+ readonly default: 0.15;
3085
+ readonly hint: "Pulls the whole sheet towards the palette. 0 leaves it colourless.";
3086
+ };
3087
+ readonly vibrancy: {
3088
+ readonly slot: "vibrancy";
3089
+ readonly label: "Vibrancy";
3090
+ readonly min: 0;
3091
+ readonly max: 2;
3092
+ readonly step: 0.01;
3093
+ readonly default: 1;
3094
+ readonly hint: "Saturation. 0 is greyscale, 1 is as authored, 2 is punched.";
3095
+ };
3096
+ };
3097
+ readonly colors: {
3098
+ readonly colorA: ColorControl;
3099
+ readonly colorB: ColorControl;
3100
+ readonly colorC: ColorControl;
3101
+ };
3102
+ };
3103
+ readonly lens: {
3104
+ readonly name: "Lens";
3105
+ readonly tagline: "Barrel distortion, colour fringing and soft corners";
3106
+ readonly description: "A camera lens rather than a filter: one radial distortion constant per colour channel, so straight lines bow outwards, the fringing is invisible in the middle and worst in the corners, and the corners lose both light and sharpness. Set distortion below zero for the pincushion a long lens gives you instead.";
3107
+ readonly family: "optical";
3108
+ readonly tags: readonly ["camera", "distortion", "retro"];
3109
+ readonly cost: "medium";
3110
+ readonly defaultSource: "neon-grid";
3111
+ readonly controls: {
3112
+ readonly vignette: {
3113
+ readonly default: 0.15;
3114
+ readonly slot: "vignette";
3115
+ readonly label: "Vignette";
3116
+ readonly min: 0;
3117
+ readonly max: 1;
3118
+ readonly step: 0.01;
3119
+ readonly hint: "Darkening towards the edges of the frame.";
3120
+ };
3121
+ readonly warp: {
3122
+ readonly label: "Distortion";
3123
+ readonly min: -1;
3124
+ readonly max: 2;
3125
+ readonly default: 0.5;
3126
+ readonly hint: "Above zero bows outwards (barrel), below zero pulls inwards (pincushion).";
3127
+ readonly slot: "warp";
3128
+ readonly step: 0.01;
3129
+ };
3130
+ readonly softness: {
3131
+ readonly slot: "a";
3132
+ readonly label: "Corner softness";
3133
+ readonly min: 0;
3134
+ readonly max: 1;
3135
+ readonly step: 0.01;
3136
+ readonly default: 0.35;
3137
+ readonly hint: "How far off the focal plane the corners sit.";
3138
+ };
3139
+ readonly fringing: {
3140
+ readonly slot: "b";
3141
+ readonly label: "Fringing";
3142
+ readonly min: 0;
3143
+ readonly max: 1;
3144
+ readonly step: 0.01;
3145
+ readonly default: 0.4;
3146
+ readonly hint: "How far apart the red and blue ends are bent.";
3147
+ };
3148
+ readonly zoom: {
3149
+ readonly slot: "c";
3150
+ readonly label: "Zoom";
3151
+ readonly min: 0.5;
3152
+ readonly max: 1.5;
3153
+ readonly step: 0.01;
3154
+ readonly default: 1;
3155
+ readonly hint: "Below 1 pulls back and shows the black outside the frame.";
3156
+ };
3157
+ readonly falloff: {
3158
+ readonly slot: "d";
3159
+ readonly label: "Corner falloff";
3160
+ readonly min: 0;
3161
+ readonly max: 1;
3162
+ readonly step: 0.01;
3163
+ readonly default: 0.4;
3164
+ readonly hint: "Light lost towards the corners, as distortion spreads it thinner.";
3165
+ };
3166
+ readonly intensity: {
3167
+ readonly slot: "intensity";
3168
+ readonly label: "Strength";
3169
+ readonly min: 0;
3170
+ readonly max: 2.5;
3171
+ readonly step: 0.01;
3172
+ readonly default: 1;
3173
+ readonly hint: "Overall brightness of the effect before the post chain.";
3174
+ };
3175
+ readonly vibrancy: {
3176
+ readonly slot: "vibrancy";
3177
+ readonly label: "Vibrancy";
3178
+ readonly min: 0;
3179
+ readonly max: 2;
3180
+ readonly step: 0.01;
3181
+ readonly default: 1;
3182
+ readonly hint: "Saturation. 0 is greyscale, 1 is as authored, 2 is punched.";
3183
+ };
3184
+ readonly grain: {
3185
+ readonly slot: "grain";
3186
+ readonly label: "Grain";
3187
+ readonly min: 0;
3188
+ readonly max: 0.35;
3189
+ readonly step: 0.005;
3190
+ readonly default: 0.03;
3191
+ readonly hint: "Per-pixel noise. A little hides banding on flat gradients.";
3192
+ };
3193
+ };
3194
+ readonly colors: {
3195
+ readonly colorA: ColorControl;
3196
+ readonly colorB: ColorControl;
3197
+ readonly colorC: ColorControl;
3198
+ };
3199
+ };
3200
+ readonly bloom: {
3201
+ readonly name: "Bloom";
3202
+ readonly tagline: "Light bleeding out of the bright parts of the layer below";
3203
+ readonly description: "A threshold picks out what is already bright, and a wide spiral spreads it. Each tap is thresholded on its own rather than blurring first, so a dark neighbour never dims a highlight. Streak stretches the spiral sideways into the flare an anamorphic lens puts on every point of light.";
3204
+ readonly family: "optical";
3205
+ readonly tags: readonly ["glow", "light", "hero"];
3206
+ readonly cost: "heavy";
3207
+ readonly defaultSource: "starfield";
3208
+ readonly controls: {
3209
+ readonly vignette: {
3210
+ readonly default: 0.1;
3211
+ readonly slot: "vignette";
3212
+ readonly label: "Vignette";
3213
+ readonly min: 0;
3214
+ readonly max: 1;
3215
+ readonly step: 0.01;
3216
+ readonly hint: "Darkening towards the edges of the frame.";
3217
+ };
3218
+ readonly warp: {
3219
+ readonly label: "Streak";
3220
+ readonly min: 0;
3221
+ readonly max: 1;
3222
+ readonly default: 0.15;
3223
+ readonly hint: "Stretches the halo sideways. Small values read as a lens, large as a smear.";
3224
+ readonly slot: "warp";
3225
+ readonly step: 0.01;
3226
+ };
3227
+ readonly threshold: {
3228
+ readonly slot: "a";
3229
+ readonly label: "Threshold";
3230
+ readonly min: 0;
3231
+ readonly max: 1;
3232
+ readonly step: 0.01;
3233
+ readonly default: 0.55;
3234
+ readonly hint: "How bright a pixel has to be before it blooms at all.";
3235
+ };
3236
+ readonly radius: {
3237
+ readonly slot: "b";
3238
+ readonly label: "Radius";
3239
+ readonly min: 0;
3240
+ readonly max: 1;
3241
+ readonly step: 0.01;
3242
+ readonly default: 0.5;
3243
+ readonly hint: "How far the light carries. Wide radii need bright, sparse sources.";
3244
+ };
3245
+ readonly amount: {
3246
+ readonly slot: "c";
3247
+ readonly label: "Amount";
3248
+ readonly min: 0;
3249
+ readonly max: 3;
3250
+ readonly step: 0.01;
3251
+ readonly default: 1.2;
3252
+ readonly hint: "How much of the halo is added back on top.";
3253
+ };
3254
+ readonly tint: {
3255
+ readonly slot: "d";
3256
+ readonly label: "Tint";
3257
+ readonly min: 0;
3258
+ readonly max: 1;
3259
+ readonly step: 0.01;
3260
+ readonly default: 0.3;
3261
+ readonly hint: "Colours the halo from the palette. Real coatings are rarely neutral.";
3262
+ };
3263
+ readonly intensity: {
3264
+ readonly slot: "intensity";
3265
+ readonly label: "Strength";
3266
+ readonly min: 0;
3267
+ readonly max: 2.5;
3268
+ readonly step: 0.01;
3269
+ readonly default: 1;
3270
+ readonly hint: "Overall brightness of the effect before the post chain.";
3271
+ };
3272
+ readonly vibrancy: {
3273
+ readonly slot: "vibrancy";
3274
+ readonly label: "Vibrancy";
3275
+ readonly min: 0;
3276
+ readonly max: 2;
3277
+ readonly step: 0.01;
3278
+ readonly default: 1;
3279
+ readonly hint: "Saturation. 0 is greyscale, 1 is as authored, 2 is punched.";
3280
+ };
3281
+ readonly grain: {
3282
+ readonly slot: "grain";
3283
+ readonly label: "Grain";
3284
+ readonly min: 0;
3285
+ readonly max: 0.35;
3286
+ readonly step: 0.005;
3287
+ readonly default: 0.03;
3288
+ readonly hint: "Per-pixel noise. A little hides banding on flat gradients.";
3289
+ };
3290
+ };
3291
+ readonly colors: {
3292
+ readonly colorA: ColorControl;
3293
+ readonly colorB: ColorControl;
3294
+ readonly colorC: ColorControl;
3295
+ };
3296
+ };
3297
+ readonly shockwave: {
3298
+ readonly name: "Shockwave";
3299
+ readonly tagline: "Expanding rings that shove the layer aside as they pass";
3300
+ readonly description: "Three gaussian bands, staggered in phase and spending their force as they grow. The displacement is signed by which side of the crest a pixel is on, so the front compresses ahead of itself and rarefies behind — which is what makes it read as a wave rather than a glowing ring. Turn pointer tracking on and it starts wherever the cursor is.";
3301
+ readonly family: "distortion";
3302
+ readonly tags: readonly ["impact", "pulse", "interactive"];
3303
+ readonly cost: "medium";
3304
+ readonly defaultSource: "truchet";
3305
+ readonly controls: {
3306
+ readonly speed: {
3307
+ readonly default: 0.8;
3308
+ readonly slot: "speed";
3309
+ readonly label: "Speed";
3310
+ readonly min: 0;
3311
+ readonly max: 3;
3312
+ readonly step: 0.01;
3313
+ readonly hint: "Time multiplier. 0 freezes the shader on its current frame.";
3314
+ };
3315
+ readonly grain: {
3316
+ readonly default: 0.02;
3317
+ readonly slot: "grain";
3318
+ readonly label: "Grain";
3319
+ readonly min: 0;
3320
+ readonly max: 0.35;
3321
+ readonly step: 0.005;
3322
+ readonly hint: "Per-pixel noise. A little hides banding on flat gradients.";
3323
+ };
3324
+ readonly vignette: {
3325
+ readonly default: 0.15;
3326
+ readonly slot: "vignette";
3327
+ readonly label: "Vignette";
3328
+ readonly min: 0;
3329
+ readonly max: 1;
3330
+ readonly step: 0.01;
3331
+ readonly hint: "Darkening towards the edges of the frame.";
3332
+ };
3333
+ readonly warp: {
3334
+ readonly label: "Force";
3335
+ readonly min: 0;
3336
+ readonly max: 2;
3337
+ readonly default: 0.9;
3338
+ readonly hint: "How far the front shoves what it passes over.";
3339
+ readonly slot: "warp";
3340
+ readonly step: 0.01;
3341
+ };
3342
+ readonly reach: {
3343
+ readonly slot: "a";
3344
+ readonly label: "Reach";
3345
+ readonly min: 0.1;
3346
+ readonly max: 2;
3347
+ readonly step: 0.01;
3348
+ readonly default: 1;
3349
+ readonly hint: "How far a ring travels before it is spent.";
3350
+ };
3351
+ readonly width: {
3352
+ readonly slot: "b";
3353
+ readonly label: "Width";
3354
+ readonly min: 0;
3355
+ readonly max: 1;
3356
+ readonly step: 0.01;
3357
+ readonly default: 0.35;
3358
+ readonly hint: "Thickness of the front. Thin is a crack, thick is a swell.";
3359
+ };
3360
+ readonly decay: {
3361
+ readonly slot: "c";
3362
+ readonly label: "Decay";
3363
+ readonly min: 0.1;
3364
+ readonly max: 4;
3365
+ readonly step: 0.01;
3366
+ readonly default: 1.5;
3367
+ readonly hint: "How quickly a ring loses force. High values die close to the centre.";
3368
+ };
3369
+ readonly fringing: {
3370
+ readonly slot: "d";
3371
+ readonly label: "Fringing";
3372
+ readonly min: 0;
3373
+ readonly max: 1;
3374
+ readonly step: 0.01;
3375
+ readonly default: 0.4;
3376
+ readonly hint: "Colour separation across the crest.";
3377
+ };
3378
+ readonly scale: {
3379
+ readonly slot: "scale";
3380
+ readonly label: "Scale";
3381
+ readonly min: 0.2;
3382
+ readonly max: 3;
3383
+ readonly step: 0.01;
3384
+ readonly default: 1;
3385
+ readonly hint: "Zoom of the underlying field. Lower is bigger, softer shapes.";
3386
+ };
3387
+ readonly intensity: {
3388
+ readonly slot: "intensity";
3389
+ readonly label: "Strength";
3390
+ readonly min: 0;
3391
+ readonly max: 2.5;
3392
+ readonly step: 0.01;
3393
+ readonly default: 1;
3394
+ readonly hint: "Overall brightness of the effect before the post chain.";
3395
+ };
3396
+ readonly vibrancy: {
3397
+ readonly slot: "vibrancy";
3398
+ readonly label: "Vibrancy";
3399
+ readonly min: 0;
3400
+ readonly max: 2;
3401
+ readonly step: 0.01;
3402
+ readonly default: 1;
3403
+ readonly hint: "Saturation. 0 is greyscale, 1 is as authored, 2 is punched.";
3404
+ };
3405
+ };
3406
+ readonly colors: {
3407
+ readonly colorA: ColorControl;
3408
+ readonly colorB: ColorControl;
3409
+ readonly colorC: ColorControl;
3410
+ };
3411
+ };
3412
+ readonly swirl: {
3413
+ readonly name: "Swirl";
3414
+ readonly tagline: "A vortex that winds the layer around a point";
3415
+ readonly description: "Rotation that falls off with distance, so the middle turns and the edges stay put. Falloff decides the whole character: near 1 it is a gentle whirlpool, near 4 a tight knot in still water. The colour channels wind by slightly different angles, which smears them along the direction of travel and sells the spin.";
3416
+ readonly family: "distortion";
3417
+ readonly tags: readonly ["vortex", "twist", "interactive"];
3418
+ readonly cost: "light";
3419
+ readonly defaultSource: "voronoi";
3420
+ readonly controls: {
3421
+ readonly speed: {
3422
+ readonly default: 1;
3423
+ readonly slot: "speed";
3424
+ readonly label: "Speed";
3425
+ readonly min: 0;
3426
+ readonly max: 3;
3427
+ readonly step: 0.01;
3428
+ readonly hint: "Time multiplier. 0 freezes the shader on its current frame.";
3429
+ };
3430
+ readonly grain: {
3431
+ readonly default: 0.02;
3432
+ readonly slot: "grain";
3433
+ readonly label: "Grain";
3434
+ readonly min: 0;
3435
+ readonly max: 0.35;
3436
+ readonly step: 0.005;
3437
+ readonly hint: "Per-pixel noise. A little hides banding on flat gradients.";
3438
+ };
3439
+ readonly vignette: {
3440
+ readonly default: 0.15;
3441
+ readonly slot: "vignette";
3442
+ readonly label: "Vignette";
3443
+ readonly min: 0;
3444
+ readonly max: 1;
3445
+ readonly step: 0.01;
3446
+ readonly hint: "Darkening towards the edges of the frame.";
3447
+ };
3448
+ readonly warp: {
3449
+ readonly label: "Twist";
3450
+ readonly min: 0;
3451
+ readonly max: 3;
3452
+ readonly default: 1.2;
3453
+ readonly hint: "Turns at the centre. Past about 2 the middle stops being readable.";
3454
+ readonly slot: "warp";
3455
+ readonly step: 0.01;
3456
+ };
3457
+ readonly radius: {
3458
+ readonly slot: "a";
3459
+ readonly label: "Radius";
3460
+ readonly min: 0.02;
3461
+ readonly max: 1.2;
3462
+ readonly step: 0.01;
3463
+ readonly default: 0.55;
3464
+ readonly hint: "How far the vortex reaches before the layer is untouched.";
3465
+ };
3466
+ readonly falloff: {
3467
+ readonly slot: "b";
3468
+ readonly label: "Falloff";
3469
+ readonly min: 0.1;
3470
+ readonly max: 5;
1981
3471
  readonly step: 0.01;
3472
+ readonly default: 1.6;
3473
+ readonly hint: "Shape of the edge. Low is a wide whirlpool, high is a tight knot.";
1982
3474
  };
1983
- readonly frost: {
1984
- readonly slot: "a";
1985
- readonly label: "Frost";
1986
- readonly min: 0;
3475
+ readonly spin: {
3476
+ readonly slot: "c";
3477
+ readonly label: "Spin";
3478
+ readonly min: -1;
1987
3479
  readonly max: 1;
1988
3480
  readonly step: 0.01;
1989
- readonly default: 0.35;
1990
- readonly hint: "Blur radius. Past about 0.6 the layer below stops being readable.";
3481
+ readonly default: 0.15;
3482
+ readonly hint: "Steady rotation over time. Negative winds the other way.";
1991
3483
  };
1992
- readonly dispersion: {
1993
- readonly slot: "b";
1994
- readonly label: "Dispersion";
3484
+ readonly smear: {
3485
+ readonly slot: "d";
3486
+ readonly label: "Smear";
1995
3487
  readonly min: 0;
1996
3488
  readonly max: 1;
1997
3489
  readonly step: 0.01;
1998
- readonly default: 0.25;
1999
- readonly hint: "Colour fringing where the sheet is steepest, as in real glass.";
3490
+ readonly default: 0.3;
3491
+ readonly hint: "Colour trailing along the direction of travel.";
2000
3492
  };
2001
- readonly edge: {
2002
- readonly slot: "c";
2003
- readonly label: "Edge light";
2004
- readonly min: 0;
2005
- readonly max: 2;
3493
+ readonly scale: {
3494
+ readonly slot: "scale";
3495
+ readonly label: "Scale";
3496
+ readonly min: 0.2;
3497
+ readonly max: 3;
2006
3498
  readonly step: 0.01;
2007
- readonly default: 0.6;
2008
- readonly hint: "Highlight along the ridges. This is what makes it read as thick.";
3499
+ readonly default: 1;
3500
+ readonly hint: "Zoom of the underlying field. Lower is bigger, softer shapes.";
2009
3501
  };
2010
- readonly tint: {
2011
- readonly slot: "d";
2012
- readonly label: "Tint";
3502
+ readonly intensity: {
3503
+ readonly slot: "intensity";
3504
+ readonly label: "Strength";
2013
3505
  readonly min: 0;
2014
- readonly max: 1;
3506
+ readonly max: 2.5;
2015
3507
  readonly step: 0.01;
2016
- readonly default: 0.15;
2017
- readonly hint: "Pulls the whole sheet towards the palette. 0 leaves it colourless.";
3508
+ readonly default: 1;
3509
+ readonly hint: "Overall brightness of the effect before the post chain.";
2018
3510
  };
2019
3511
  readonly vibrancy: {
2020
3512
  readonly slot: "vibrancy";
@@ -2032,17 +3524,44 @@ export declare const shaderRegistry: {
2032
3524
  readonly colorC: ColorControl;
2033
3525
  };
2034
3526
  };
2035
- readonly lens: {
2036
- readonly name: "Lens";
2037
- readonly tagline: "Barrel distortion, colour fringing and soft corners";
2038
- readonly description: "A camera lens rather than a filter: one radial distortion constant per colour channel, so straight lines bow outwards, the fringing is invisible in the middle and worst in the corners, and the corners lose both light and sharpness. Set distortion below zero for the pincushion a long lens gives you instead.";
2039
- readonly family: "optical";
2040
- readonly tags: readonly ["camera", "distortion", "retro"];
2041
- readonly cost: "medium";
2042
- readonly defaultSource: "neon-grid";
3527
+ readonly flow: {
3528
+ readonly name: "Flow";
3529
+ readonly tagline: "The layer pushed around by a slow, turbulent field";
3530
+ readonly description: "Two noise fields drive a displacement, then curl turns it from a drift into a circulation. Smearing runs along the flow rather than in a circle, so the result looks stirred instead of merely blurred. Turbulence trades broad lazy currents for stringy filaments.";
3531
+ readonly family: "distortion";
3532
+ readonly tags: readonly ["liquid", "organic", "ambient"];
3533
+ readonly cost: "heavy";
3534
+ readonly defaultSource: "halftone";
2043
3535
  readonly controls: {
3536
+ readonly speed: {
3537
+ readonly default: 0.5;
3538
+ readonly max: 2;
3539
+ readonly slot: "speed";
3540
+ readonly label: "Speed";
3541
+ readonly min: 0;
3542
+ readonly step: 0.01;
3543
+ readonly hint: "Time multiplier. 0 freezes the shader on its current frame.";
3544
+ };
3545
+ readonly scale: {
3546
+ readonly default: 1;
3547
+ readonly slot: "scale";
3548
+ readonly label: "Scale";
3549
+ readonly min: 0.2;
3550
+ readonly max: 3;
3551
+ readonly step: 0.01;
3552
+ readonly hint: "Zoom of the underlying field. Lower is bigger, softer shapes.";
3553
+ };
3554
+ readonly grain: {
3555
+ readonly default: 0.02;
3556
+ readonly slot: "grain";
3557
+ readonly label: "Grain";
3558
+ readonly min: 0;
3559
+ readonly max: 0.35;
3560
+ readonly step: 0.005;
3561
+ readonly hint: "Per-pixel noise. A little hides banding on flat gradients.";
3562
+ };
2044
3563
  readonly vignette: {
2045
- readonly default: 0.15;
3564
+ readonly default: 0.2;
2046
3565
  readonly slot: "vignette";
2047
3566
  readonly label: "Vignette";
2048
3567
  readonly min: 0;
@@ -2051,49 +3570,49 @@ export declare const shaderRegistry: {
2051
3570
  readonly hint: "Darkening towards the edges of the frame.";
2052
3571
  };
2053
3572
  readonly warp: {
2054
- readonly label: "Distortion";
2055
- readonly min: -1;
3573
+ readonly label: "Strength";
3574
+ readonly min: 0;
2056
3575
  readonly max: 2;
2057
- readonly default: 0.5;
2058
- readonly hint: "Above zero bows outwards (barrel), below zero pulls inwards (pincushion).";
3576
+ readonly default: 0.7;
3577
+ readonly hint: "How far the field pushes the layer.";
2059
3578
  readonly slot: "warp";
2060
3579
  readonly step: 0.01;
2061
3580
  };
2062
- readonly softness: {
3581
+ readonly turbulence: {
2063
3582
  readonly slot: "a";
2064
- readonly label: "Corner softness";
3583
+ readonly label: "Turbulence";
2065
3584
  readonly min: 0;
2066
3585
  readonly max: 1;
2067
3586
  readonly step: 0.01;
2068
- readonly default: 0.35;
2069
- readonly hint: "How far off the focal plane the corners sit.";
3587
+ readonly default: 0.4;
3588
+ readonly hint: "0 is broad lazy currents, 1 is sharp filaments.";
2070
3589
  };
2071
- readonly fringing: {
3590
+ readonly curl: {
2072
3591
  readonly slot: "b";
2073
- readonly label: "Fringing";
3592
+ readonly label: "Curl";
2074
3593
  readonly min: 0;
2075
3594
  readonly max: 1;
2076
3595
  readonly step: 0.01;
2077
- readonly default: 0.4;
2078
- readonly hint: "How far apart the red and blue ends are bent.";
3596
+ readonly default: 0.75;
3597
+ readonly hint: "Turns the drift into circulation. 0 pulls everything one way.";
2079
3598
  };
2080
- readonly zoom: {
3599
+ readonly smear: {
2081
3600
  readonly slot: "c";
2082
- readonly label: "Zoom";
2083
- readonly min: 0.5;
2084
- readonly max: 1.5;
3601
+ readonly label: "Smear";
3602
+ readonly min: 0;
3603
+ readonly max: 1;
2085
3604
  readonly step: 0.01;
2086
- readonly default: 1;
2087
- readonly hint: "Below 1 pulls back and shows the black outside the frame.";
3605
+ readonly default: 0.35;
3606
+ readonly hint: "Blur along the flow, which is what reads as motion.";
2088
3607
  };
2089
- readonly falloff: {
3608
+ readonly tint: {
2090
3609
  readonly slot: "d";
2091
- readonly label: "Corner falloff";
3610
+ readonly label: "Tint";
2092
3611
  readonly min: 0;
2093
3612
  readonly max: 1;
2094
3613
  readonly step: 0.01;
2095
- readonly default: 0.4;
2096
- readonly hint: "Light lost towards the corners, as distortion spreads it thinner.";
3614
+ readonly default: 0.2;
3615
+ readonly hint: "Colours the fast water from the palette.";
2097
3616
  };
2098
3617
  readonly intensity: {
2099
3618
  readonly slot: "intensity";
@@ -2113,15 +3632,6 @@ export declare const shaderRegistry: {
2113
3632
  readonly default: 1;
2114
3633
  readonly hint: "Saturation. 0 is greyscale, 1 is as authored, 2 is punched.";
2115
3634
  };
2116
- readonly grain: {
2117
- readonly slot: "grain";
2118
- readonly label: "Grain";
2119
- readonly min: 0;
2120
- readonly max: 0.35;
2121
- readonly step: 0.005;
2122
- readonly default: 0.03;
2123
- readonly hint: "Per-pixel noise. A little hides banding on flat gradients.";
2124
- };
2125
3635
  };
2126
3636
  readonly colors: {
2127
3637
  readonly colorA: ColorControl;
@@ -2129,17 +3639,26 @@ export declare const shaderRegistry: {
2129
3639
  readonly colorC: ColorControl;
2130
3640
  };
2131
3641
  };
2132
- readonly bloom: {
2133
- readonly name: "Bloom";
2134
- readonly tagline: "Light bleeding out of the bright parts of the layer below";
2135
- readonly description: "A threshold picks out what is already bright, and a wide spiral spreads it. Each tap is thresholded on its own rather than blurring first, so a dark neighbour never dims a highlight. Streak stretches the spiral sideways into the flare an anamorphic lens puts on every point of light.";
2136
- readonly family: "optical";
2137
- readonly tags: readonly ["glow", "light", "hero"];
2138
- readonly cost: "heavy";
2139
- readonly defaultSource: "starfield";
3642
+ readonly duotone: {
3643
+ readonly name: "Duotone";
3644
+ readonly tagline: "The layer's brightness read through your palette";
3645
+ readonly description: "Luminance is set between a black and a white point, then contrasted about the midpoint, then used to walk the three-stop palette. In that order: a hard contrast applied first would clip before the range is set. Keep colour mixes the original chroma back, for when a busy photograph should not become a flat poster.";
3646
+ readonly family: "image";
3647
+ readonly tags: readonly ["colour", "poster", "brand"];
3648
+ readonly cost: "light";
3649
+ readonly defaultSource: "julia";
2140
3650
  readonly controls: {
3651
+ readonly grain: {
3652
+ readonly default: 0.02;
3653
+ readonly slot: "grain";
3654
+ readonly label: "Grain";
3655
+ readonly min: 0;
3656
+ readonly max: 0.35;
3657
+ readonly step: 0.005;
3658
+ readonly hint: "Per-pixel noise. A little hides banding on flat gradients.";
3659
+ };
2141
3660
  readonly vignette: {
2142
- readonly default: 0.1;
3661
+ readonly default: 0.2;
2143
3662
  readonly slot: "vignette";
2144
3663
  readonly label: "Vignette";
2145
3664
  readonly min: 0;
@@ -2147,50 +3666,41 @@ export declare const shaderRegistry: {
2147
3666
  readonly step: 0.01;
2148
3667
  readonly hint: "Darkening towards the edges of the frame.";
2149
3668
  };
2150
- readonly warp: {
2151
- readonly label: "Streak";
2152
- readonly min: 0;
2153
- readonly max: 1;
2154
- readonly default: 0.15;
2155
- readonly hint: "Stretches the halo sideways. Small values read as a lens, large as a smear.";
2156
- readonly slot: "warp";
2157
- readonly step: 0.01;
2158
- };
2159
- readonly threshold: {
3669
+ readonly black: {
2160
3670
  readonly slot: "a";
2161
- readonly label: "Threshold";
3671
+ readonly label: "Black point";
2162
3672
  readonly min: 0;
2163
- readonly max: 1;
3673
+ readonly max: 0.6;
2164
3674
  readonly step: 0.01;
2165
- readonly default: 0.55;
2166
- readonly hint: "How bright a pixel has to be before it blooms at all.";
3675
+ readonly default: 0.05;
3676
+ readonly hint: "Brightness that maps to the first colour. Raise it to crush shadows.";
2167
3677
  };
2168
- readonly radius: {
3678
+ readonly white: {
2169
3679
  readonly slot: "b";
2170
- readonly label: "Radius";
2171
- readonly min: 0;
3680
+ readonly label: "White point";
3681
+ readonly min: 0.4;
2172
3682
  readonly max: 1;
2173
3683
  readonly step: 0.01;
2174
- readonly default: 0.5;
2175
- readonly hint: "How far the light carries. Wide radii need bright, sparse sources.";
3684
+ readonly default: 0.9;
3685
+ readonly hint: "Brightness that maps to the last colour. Lower it to blow highlights.";
2176
3686
  };
2177
- readonly amount: {
3687
+ readonly contrast: {
2178
3688
  readonly slot: "c";
2179
- readonly label: "Amount";
2180
- readonly min: 0;
3689
+ readonly label: "Contrast";
3690
+ readonly min: 0.2;
2181
3691
  readonly max: 3;
2182
3692
  readonly step: 0.01;
2183
3693
  readonly default: 1.2;
2184
- readonly hint: "How much of the halo is added back on top.";
3694
+ readonly hint: "Steepness of the ramp between the two points.";
2185
3695
  };
2186
- readonly tint: {
3696
+ readonly keep: {
2187
3697
  readonly slot: "d";
2188
- readonly label: "Tint";
3698
+ readonly label: "Keep colour";
2189
3699
  readonly min: 0;
2190
3700
  readonly max: 1;
2191
3701
  readonly step: 0.01;
2192
- readonly default: 0.3;
2193
- readonly hint: "Colours the halo from the palette. Real coatings are rarely neutral.";
3702
+ readonly default: 0;
3703
+ readonly hint: "Mixes the original chroma back over the mapped tone.";
2194
3704
  };
2195
3705
  readonly intensity: {
2196
3706
  readonly slot: "intensity";
@@ -2210,15 +3720,6 @@ export declare const shaderRegistry: {
2210
3720
  readonly default: 1;
2211
3721
  readonly hint: "Saturation. 0 is greyscale, 1 is as authored, 2 is punched.";
2212
3722
  };
2213
- readonly grain: {
2214
- readonly slot: "grain";
2215
- readonly label: "Grain";
2216
- readonly min: 0;
2217
- readonly max: 0.35;
2218
- readonly step: 0.005;
2219
- readonly default: 0.03;
2220
- readonly hint: "Per-pixel noise. A little hides banding on flat gradients.";
2221
- };
2222
3723
  };
2223
3724
  readonly colors: {
2224
3725
  readonly colorA: ColorControl;
@@ -2226,26 +3727,17 @@ export declare const shaderRegistry: {
2226
3727
  readonly colorC: ColorControl;
2227
3728
  };
2228
3729
  };
2229
- readonly shockwave: {
2230
- readonly name: "Shockwave";
2231
- readonly tagline: "Expanding rings that shove the layer aside as they pass";
2232
- readonly description: "Three gaussian bands, staggered in phase and spending their force as they grow. The displacement is signed by which side of the crest a pixel is on, so the front compresses ahead of itself and rarefies behind — which is what makes it read as a wave rather than a glowing ring. Turn pointer tracking on and it starts wherever the cursor is.";
2233
- readonly family: "distortion";
2234
- readonly tags: readonly ["impact", "pulse", "interactive"];
2235
- readonly cost: "medium";
2236
- readonly defaultSource: "truchet";
2237
- readonly controls: {
2238
- readonly speed: {
2239
- readonly default: 0.8;
2240
- readonly slot: "speed";
2241
- readonly label: "Speed";
2242
- readonly min: 0;
2243
- readonly max: 3;
2244
- readonly step: 0.01;
2245
- readonly hint: "Time multiplier. 0 freezes the shader on its current frame.";
2246
- };
3730
+ readonly edges: {
3731
+ readonly name: "Edges";
3732
+ readonly tagline: "The layer reduced to its outlines";
3733
+ readonly description: "A Sobel kernel over luminance, with the step widened past a single texel — a sub-texel step would just sample the same texel three times, and widening it is what turns a hairline into a drawn line. Fill decides how much of the original shows under the ink, from a clean line drawing to a traced photograph.";
3734
+ readonly family: "image";
3735
+ readonly tags: readonly ["outline", "line art", "technical"];
3736
+ readonly cost: "medium";
3737
+ readonly defaultSource: "truchet";
3738
+ readonly controls: {
2247
3739
  readonly grain: {
2248
- readonly default: 0.02;
3740
+ readonly default: 0.01;
2249
3741
  readonly slot: "grain";
2250
3742
  readonly label: "Grain";
2251
3743
  readonly min: 0;
@@ -2254,7 +3746,7 @@ export declare const shaderRegistry: {
2254
3746
  readonly hint: "Per-pixel noise. A little hides banding on flat gradients.";
2255
3747
  };
2256
3748
  readonly vignette: {
2257
- readonly default: 0.15;
3749
+ readonly default: 0.2;
2258
3750
  readonly slot: "vignette";
2259
3751
  readonly label: "Vignette";
2260
3752
  readonly min: 0;
@@ -2262,59 +3754,41 @@ export declare const shaderRegistry: {
2262
3754
  readonly step: 0.01;
2263
3755
  readonly hint: "Darkening towards the edges of the frame.";
2264
3756
  };
2265
- readonly warp: {
2266
- readonly label: "Force";
2267
- readonly min: 0;
2268
- readonly max: 2;
2269
- readonly default: 0.9;
2270
- readonly hint: "How far the front shoves what it passes over.";
2271
- readonly slot: "warp";
2272
- readonly step: 0.01;
2273
- };
2274
- readonly reach: {
3757
+ readonly thickness: {
2275
3758
  readonly slot: "a";
2276
- readonly label: "Reach";
2277
- readonly min: 0.1;
2278
- readonly max: 2;
2279
- readonly step: 0.01;
2280
- readonly default: 1;
2281
- readonly hint: "How far a ring travels before it is spent.";
3759
+ readonly label: "Thickness";
3760
+ readonly min: 0.5;
3761
+ readonly max: 6;
3762
+ readonly step: 0.1;
3763
+ readonly default: 1.5;
3764
+ readonly hint: "How far apart the kernel taps sit, in source texels.";
2282
3765
  };
2283
- readonly width: {
3766
+ readonly threshold: {
2284
3767
  readonly slot: "b";
2285
- readonly label: "Width";
3768
+ readonly label: "Threshold";
2286
3769
  readonly min: 0;
2287
3770
  readonly max: 1;
2288
3771
  readonly step: 0.01;
2289
- readonly default: 0.35;
2290
- readonly hint: "Thickness of the front. Thin is a crack, thick is a swell.";
3772
+ readonly default: 0.15;
3773
+ readonly hint: "How steep a gradient has to be to count as an edge.";
2291
3774
  };
2292
- readonly decay: {
3775
+ readonly fill: {
2293
3776
  readonly slot: "c";
2294
- readonly label: "Decay";
2295
- readonly min: 0.1;
2296
- readonly max: 4;
3777
+ readonly label: "Fill";
3778
+ readonly min: 0;
3779
+ readonly max: 1;
2297
3780
  readonly step: 0.01;
2298
- readonly default: 1.5;
2299
- readonly hint: "How quickly a ring loses force. High values die close to the centre.";
3781
+ readonly default: 0;
3782
+ readonly hint: "How much of the original shows under the lines.";
2300
3783
  };
2301
- readonly fringing: {
3784
+ readonly glow: {
2302
3785
  readonly slot: "d";
2303
- readonly label: "Fringing";
3786
+ readonly label: "Glow";
2304
3787
  readonly min: 0;
2305
- readonly max: 1;
3788
+ readonly max: 2;
2306
3789
  readonly step: 0.01;
2307
3790
  readonly default: 0.4;
2308
- readonly hint: "Colour separation across the crest.";
2309
- };
2310
- readonly scale: {
2311
- readonly slot: "scale";
2312
- readonly label: "Scale";
2313
- readonly min: 0.2;
2314
- readonly max: 3;
2315
- readonly step: 0.01;
2316
- readonly default: 1;
2317
- readonly hint: "Zoom of the underlying field. Lower is bigger, softer shapes.";
3791
+ readonly hint: "Bleed off the line, which reads as ink rather than aliasing.";
2318
3792
  };
2319
3793
  readonly intensity: {
2320
3794
  readonly slot: "intensity";
@@ -2341,26 +3815,17 @@ export declare const shaderRegistry: {
2341
3815
  readonly colorC: ColorControl;
2342
3816
  };
2343
3817
  };
2344
- readonly swirl: {
2345
- readonly name: "Swirl";
2346
- readonly tagline: "A vortex that winds the layer around a point";
2347
- readonly description: "Rotation that falls off with distance, so the middle turns and the edges stay put. Falloff decides the whole character: near 1 it is a gentle whirlpool, near 4 a tight knot in still water. The colour channels wind by slightly different angles, which smears them along the direction of travel and sells the spin.";
2348
- readonly family: "distortion";
2349
- readonly tags: readonly ["vortex", "twist", "interactive"];
3818
+ readonly mosaic: {
3819
+ readonly name: "Mosaic";
3820
+ readonly tagline: "The layer rebuilt out of tiles";
3821
+ readonly description: "One tap at each tile's centre, not an average of it — the hard colour is the point, and averaging would only reinvent a blur. Posterising after sampling is what makes it look assembled from a limited set rather than merely coarse. Roundness grows a dot whose size follows the tile's brightness, the way a printed screen does.";
3822
+ readonly family: "image";
3823
+ readonly tags: readonly ["pixelate", "print", "retro"];
2350
3824
  readonly cost: "light";
2351
- readonly defaultSource: "voronoi";
3825
+ readonly defaultSource: "aurora";
2352
3826
  readonly controls: {
2353
- readonly speed: {
2354
- readonly default: 1;
2355
- readonly slot: "speed";
2356
- readonly label: "Speed";
2357
- readonly min: 0;
2358
- readonly max: 3;
2359
- readonly step: 0.01;
2360
- readonly hint: "Time multiplier. 0 freezes the shader on its current frame.";
2361
- };
2362
3827
  readonly grain: {
2363
- readonly default: 0.02;
3828
+ readonly default: 0;
2364
3829
  readonly slot: "grain";
2365
3830
  readonly label: "Grain";
2366
3831
  readonly min: 0;
@@ -2369,7 +3834,7 @@ export declare const shaderRegistry: {
2369
3834
  readonly hint: "Per-pixel noise. A little hides banding on flat gradients.";
2370
3835
  };
2371
3836
  readonly vignette: {
2372
- readonly default: 0.15;
3837
+ readonly default: 0.2;
2373
3838
  readonly slot: "vignette";
2374
3839
  readonly label: "Vignette";
2375
3840
  readonly min: 0;
@@ -2377,59 +3842,41 @@ export declare const shaderRegistry: {
2377
3842
  readonly step: 0.01;
2378
3843
  readonly hint: "Darkening towards the edges of the frame.";
2379
3844
  };
2380
- readonly warp: {
2381
- readonly label: "Twist";
2382
- readonly min: 0;
2383
- readonly max: 3;
2384
- readonly default: 1.2;
2385
- readonly hint: "Turns at the centre. Past about 2 the middle stops being readable.";
2386
- readonly slot: "warp";
2387
- readonly step: 0.01;
2388
- };
2389
- readonly radius: {
3845
+ readonly tiles: {
2390
3846
  readonly slot: "a";
2391
- readonly label: "Radius";
2392
- readonly min: 0.02;
2393
- readonly max: 1.2;
2394
- readonly step: 0.01;
2395
- readonly default: 0.55;
2396
- readonly hint: "How far the vortex reaches before the layer is untouched.";
3847
+ readonly label: "Tiles";
3848
+ readonly min: 4;
3849
+ readonly max: 160;
3850
+ readonly step: 1;
3851
+ readonly default: 42;
3852
+ readonly hint: "Tiles across the short axis. They stay square on any canvas.";
2397
3853
  };
2398
- readonly falloff: {
3854
+ readonly roundness: {
2399
3855
  readonly slot: "b";
2400
- readonly label: "Falloff";
2401
- readonly min: 0.1;
2402
- readonly max: 5;
2403
- readonly step: 0.01;
2404
- readonly default: 1.6;
2405
- readonly hint: "Shape of the edge. Low is a wide whirlpool, high is a tight knot.";
2406
- };
2407
- readonly spin: {
2408
- readonly slot: "c";
2409
- readonly label: "Spin";
2410
- readonly min: -1;
3856
+ readonly label: "Roundness";
3857
+ readonly min: 0;
2411
3858
  readonly max: 1;
2412
3859
  readonly step: 0.01;
2413
- readonly default: 0.15;
2414
- readonly hint: "Steady rotation over time. Negative winds the other way.";
3860
+ readonly default: 0;
3861
+ readonly hint: "0 is a solid tile, 1 is a dot that shrinks as the tile darkens.";
2415
3862
  };
2416
- readonly smear: {
2417
- readonly slot: "d";
2418
- readonly label: "Smear";
3863
+ readonly gap: {
3864
+ readonly slot: "c";
3865
+ readonly label: "Gap";
2419
3866
  readonly min: 0;
2420
- readonly max: 1;
3867
+ readonly max: 0.45;
2421
3868
  readonly step: 0.01;
2422
- readonly default: 0.3;
2423
- readonly hint: "Colour trailing along the direction of travel.";
3869
+ readonly default: 0.02;
3870
+ readonly hint: "Ground left showing between tiles.";
2424
3871
  };
2425
- readonly scale: {
2426
- readonly slot: "scale";
2427
- readonly label: "Scale";
2428
- readonly min: 0.2;
2429
- readonly max: 3;
2430
- readonly step: 0.01;
2431
- readonly default: 1;
2432
- readonly hint: "Zoom of the underlying field. Lower is bigger, softer shapes.";
3872
+ readonly steps: {
3873
+ readonly slot: "d";
3874
+ readonly label: "Colour steps";
3875
+ readonly min: 2;
3876
+ readonly max: 32;
3877
+ readonly step: 1;
3878
+ readonly default: 12;
3879
+ readonly hint: "Levels each channel is quantised to. Low values band on purpose.";
2433
3880
  };
2434
3881
  readonly intensity: {
2435
3882
  readonly slot: "intensity";
@@ -2456,17 +3903,17 @@ export declare const shaderRegistry: {
2456
3903
  readonly colorC: ColorControl;
2457
3904
  };
2458
3905
  };
2459
- readonly flow: {
2460
- readonly name: "Flow";
2461
- readonly tagline: "The layer pushed around by a slow, turbulent field";
2462
- readonly description: "Two noise fields drive a displacement, then curl turns it from a drift into a circulation. Smearing runs along the flow rather than in a circle, so the result looks stirred instead of merely blurred. Turbulence trades broad lazy currents for stringy filaments.";
2463
- readonly family: "distortion";
2464
- readonly tags: readonly ["liquid", "organic", "ambient"];
2465
- readonly cost: "heavy";
2466
- readonly defaultSource: "halftone";
3906
+ readonly reveal: {
3907
+ readonly name: "Reveal";
3908
+ readonly tagline: "The layer wiped in over a colour ground";
3909
+ readonly description: "A threshold cutting through a field: noise dissolves, a rotated ramp wipes, and shape slides between the two. At speed 0 the progress control is a scrubber you can drive from your own code — bind it to a scroll position or a load event. Above 0 it loops on its own, which is what makes it worth looking at on a card.";
3910
+ readonly family: "transition";
3911
+ readonly tags: readonly ["wipe", "dissolve", "entrance"];
3912
+ readonly cost: "light";
3913
+ readonly defaultSource: "mesh-gradient";
2467
3914
  readonly controls: {
2468
3915
  readonly speed: {
2469
- readonly default: 0.5;
3916
+ readonly default: 0.6;
2470
3917
  readonly max: 2;
2471
3918
  readonly slot: "speed";
2472
3919
  readonly label: "Speed";
@@ -2502,49 +3949,49 @@ export declare const shaderRegistry: {
2502
3949
  readonly hint: "Darkening towards the edges of the frame.";
2503
3950
  };
2504
3951
  readonly warp: {
2505
- readonly label: "Strength";
3952
+ readonly label: "Edge glow";
2506
3953
  readonly min: 0;
2507
3954
  readonly max: 2;
2508
- readonly default: 0.7;
2509
- readonly hint: "How far the field pushes the layer.";
3955
+ readonly default: 0.6;
3956
+ readonly hint: "Light riding the boundary, the way a burn does.";
2510
3957
  readonly slot: "warp";
2511
3958
  readonly step: 0.01;
2512
3959
  };
2513
- readonly turbulence: {
3960
+ readonly progress: {
2514
3961
  readonly slot: "a";
2515
- readonly label: "Turbulence";
3962
+ readonly label: "Progress";
2516
3963
  readonly min: 0;
2517
3964
  readonly max: 1;
2518
3965
  readonly step: 0.01;
2519
- readonly default: 0.4;
2520
- readonly hint: "0 is broad lazy currents, 1 is sharp filaments.";
3966
+ readonly default: 0;
3967
+ readonly hint: "Position of the wipe. Set speed to 0 and drive this yourself.";
2521
3968
  };
2522
- readonly curl: {
3969
+ readonly shape: {
2523
3970
  readonly slot: "b";
2524
- readonly label: "Curl";
3971
+ readonly label: "Shape";
2525
3972
  readonly min: 0;
2526
3973
  readonly max: 1;
2527
3974
  readonly step: 0.01;
2528
- readonly default: 0.75;
2529
- readonly hint: "Turns the drift into circulation. 0 pulls everything one way.";
3975
+ readonly default: 0.35;
3976
+ readonly hint: "0 dissolves through noise, 1 wipes along a straight edge.";
2530
3977
  };
2531
- readonly smear: {
3978
+ readonly angle: {
2532
3979
  readonly slot: "c";
2533
- readonly label: "Smear";
3980
+ readonly label: "Angle";
2534
3981
  readonly min: 0;
2535
3982
  readonly max: 1;
2536
3983
  readonly step: 0.01;
2537
- readonly default: 0.35;
2538
- readonly hint: "Blur along the flow, which is what reads as motion.";
3984
+ readonly default: 0;
3985
+ readonly hint: "Direction of the wipe, as a full turn from 0 to 1.";
2539
3986
  };
2540
- readonly tint: {
3987
+ readonly softness: {
2541
3988
  readonly slot: "d";
2542
- readonly label: "Tint";
2543
- readonly min: 0;
2544
- readonly max: 1;
2545
- readonly step: 0.01;
2546
- readonly default: 0.2;
2547
- readonly hint: "Colours the fast water from the palette.";
3989
+ readonly label: "Softness";
3990
+ readonly min: 0.001;
3991
+ readonly max: 0.4;
3992
+ readonly step: 0.001;
3993
+ readonly default: 0.08;
3994
+ readonly hint: "Width of the boundary band. Small is a hard cut.";
2548
3995
  };
2549
3996
  readonly intensity: {
2550
3997
  readonly slot: "intensity";
@@ -2561,25 +4008,43 @@ export declare const shaderRegistry: {
2561
4008
  readonly min: 0;
2562
4009
  readonly max: 2;
2563
4010
  readonly step: 0.01;
2564
- readonly default: 1;
2565
- readonly hint: "Saturation. 0 is greyscale, 1 is as authored, 2 is punched.";
4011
+ readonly default: 1;
4012
+ readonly hint: "Saturation. 0 is greyscale, 1 is as authored, 2 is punched.";
4013
+ };
4014
+ };
4015
+ readonly colors: {
4016
+ readonly colorA: ColorControl;
4017
+ readonly colorB: ColorControl;
4018
+ readonly colorC: ColorControl;
4019
+ };
4020
+ };
4021
+ readonly "neon-sign": {
4022
+ readonly name: "Neon Sign";
4023
+ readonly tagline: "The layer's edges bent into glass tube and lit";
4024
+ readonly description: "The tube is the level set where the layer's luma crosses a threshold, which is why this works on anything but sings on text: a glyph's boundary is one clean crossing, and the band around it becomes the glass. The halo is the blurred luma itself rather than a blur of the tube, so the light lands where the ink is. Hand it `source={{ text: \"OPEN\" }}` and it is a sign.";
4025
+ readonly family: "optical";
4026
+ readonly tags: readonly ["text", "neon", "dark", "sign"];
4027
+ readonly cost: "heavy";
4028
+ readonly defaultSource: "truchet";
4029
+ readonly controls: {
4030
+ readonly speed: {
4031
+ readonly default: 1;
4032
+ readonly max: 2;
4033
+ readonly slot: "speed";
4034
+ readonly label: "Speed";
4035
+ readonly min: 0;
4036
+ readonly step: 0.01;
4037
+ readonly hint: "Time multiplier. 0 freezes the shader on its current frame.";
4038
+ };
4039
+ readonly scale: {
4040
+ readonly default: 1;
4041
+ readonly slot: "scale";
4042
+ readonly label: "Scale";
4043
+ readonly min: 0.2;
4044
+ readonly max: 3;
4045
+ readonly step: 0.01;
4046
+ readonly hint: "Zoom of the underlying field. Lower is bigger, softer shapes.";
2566
4047
  };
2567
- };
2568
- readonly colors: {
2569
- readonly colorA: ColorControl;
2570
- readonly colorB: ColorControl;
2571
- readonly colorC: ColorControl;
2572
- };
2573
- };
2574
- readonly duotone: {
2575
- readonly name: "Duotone";
2576
- readonly tagline: "The layer's brightness read through your palette";
2577
- readonly description: "Luminance is set between a black and a white point, then contrasted about the midpoint, then used to walk the three-stop palette. In that order: a hard contrast applied first would clip before the range is set. Keep colour mixes the original chroma back, for when a busy photograph should not become a flat poster.";
2578
- readonly family: "image";
2579
- readonly tags: readonly ["colour", "poster", "brand"];
2580
- readonly cost: "light";
2581
- readonly defaultSource: "julia";
2582
- readonly controls: {
2583
4048
  readonly grain: {
2584
4049
  readonly default: 0.02;
2585
4050
  readonly slot: "grain";
@@ -2590,7 +4055,7 @@ export declare const shaderRegistry: {
2590
4055
  readonly hint: "Per-pixel noise. A little hides banding on flat gradients.";
2591
4056
  };
2592
4057
  readonly vignette: {
2593
- readonly default: 0.2;
4058
+ readonly default: 0.35;
2594
4059
  readonly slot: "vignette";
2595
4060
  readonly label: "Vignette";
2596
4061
  readonly min: 0;
@@ -2598,41 +4063,50 @@ export declare const shaderRegistry: {
2598
4063
  readonly step: 0.01;
2599
4064
  readonly hint: "Darkening towards the edges of the frame.";
2600
4065
  };
2601
- readonly black: {
4066
+ readonly warp: {
4067
+ readonly label: "Glow";
4068
+ readonly min: 0.05;
4069
+ readonly max: 2;
4070
+ readonly default: 0.6;
4071
+ readonly hint: "How far the tube's light carries onto the wall.";
4072
+ readonly slot: "warp";
4073
+ readonly step: 0.01;
4074
+ };
4075
+ readonly threshold: {
2602
4076
  readonly slot: "a";
2603
- readonly label: "Black point";
2604
- readonly min: 0;
2605
- readonly max: 0.6;
4077
+ readonly label: "Threshold";
4078
+ readonly min: 0.05;
4079
+ readonly max: 0.95;
2606
4080
  readonly step: 0.01;
2607
- readonly default: 0.05;
2608
- readonly hint: "Brightness that maps to the first colour. Raise it to crush shadows.";
4081
+ readonly default: 0.45;
4082
+ readonly hint: "The luma level the tube is bent along.";
2609
4083
  };
2610
- readonly white: {
4084
+ readonly fill: {
2611
4085
  readonly slot: "b";
2612
- readonly label: "White point";
2613
- readonly min: 0.4;
2614
- readonly max: 1;
4086
+ readonly label: "Fill";
4087
+ readonly min: 0;
4088
+ readonly max: 2;
2615
4089
  readonly step: 0.01;
2616
- readonly default: 0.9;
2617
- readonly hint: "Brightness that maps to the last colour. Lower it to blow highlights.";
4090
+ readonly default: 0.8;
4091
+ readonly hint: "The dim glow inside the letterforms, behind the tube.";
2618
4092
  };
2619
- readonly contrast: {
4093
+ readonly flicker: {
2620
4094
  readonly slot: "c";
2621
- readonly label: "Contrast";
2622
- readonly min: 0.2;
2623
- readonly max: 3;
4095
+ readonly label: "Flicker";
4096
+ readonly min: 0;
4097
+ readonly max: 1;
2624
4098
  readonly step: 0.01;
2625
- readonly default: 1.2;
2626
- readonly hint: "Steepness of the ramp between the two points.";
4099
+ readonly default: 0.35;
4100
+ readonly hint: "Sputter. The dropouts arrive as events, not as noise.";
2627
4101
  };
2628
- readonly keep: {
4102
+ readonly boost: {
2629
4103
  readonly slot: "d";
2630
- readonly label: "Keep colour";
4104
+ readonly label: "Boost";
2631
4105
  readonly min: 0;
2632
- readonly max: 1;
4106
+ readonly max: 2;
2633
4107
  readonly step: 0.01;
2634
- readonly default: 0;
2635
- readonly hint: "Mixes the original chroma back over the mapped tone.";
4108
+ readonly default: 1;
4109
+ readonly hint: "Overall drive into the tube.";
2636
4110
  };
2637
4111
  readonly intensity: {
2638
4112
  readonly slot: "intensity";
@@ -2659,17 +4133,35 @@ export declare const shaderRegistry: {
2659
4133
  readonly colorC: ColorControl;
2660
4134
  };
2661
4135
  };
2662
- readonly edges: {
2663
- readonly name: "Edges";
2664
- readonly tagline: "The layer reduced to its outlines";
2665
- readonly description: "A Sobel kernel over luminance, with the step widened past a single texel — a sub-texel step would just sample the same texel three times, and widening it is what turns a hairline into a drawn line. Fill decides how much of the original shows under the ink, from a clean line drawing to a traced photograph.";
4136
+ readonly ascii: {
4137
+ readonly name: "ASCII";
4138
+ readonly tagline: "The layer redrawn as a density ramp of glyphs";
4139
+ readonly description: "Ten 3×5 bitmaps packed into ten integers, ordered by how much ink they carry, so brightness picks the character the way the classic ramp does. The font ships inside the shader — a vendored copy runs with no assets at all. Colorize slides between pure phosphor and the source's own colour pushed through the glyphs; scan adds the monitor the font implies.";
2666
4140
  readonly family: "image";
2667
- readonly tags: readonly ["outline", "line art", "technical"];
2668
- readonly cost: "medium";
2669
- readonly defaultSource: "truchet";
4141
+ readonly tags: readonly ["text", "retro", "terminal"];
4142
+ readonly cost: "light";
4143
+ readonly defaultSource: "aurora";
2670
4144
  readonly controls: {
4145
+ readonly speed: {
4146
+ readonly default: 1;
4147
+ readonly max: 2;
4148
+ readonly slot: "speed";
4149
+ readonly label: "Speed";
4150
+ readonly min: 0;
4151
+ readonly step: 0.01;
4152
+ readonly hint: "Time multiplier. 0 freezes the shader on its current frame.";
4153
+ };
4154
+ readonly scale: {
4155
+ readonly default: 1;
4156
+ readonly slot: "scale";
4157
+ readonly label: "Scale";
4158
+ readonly min: 0.2;
4159
+ readonly max: 3;
4160
+ readonly step: 0.01;
4161
+ readonly hint: "Zoom of the underlying field. Lower is bigger, softer shapes.";
4162
+ };
2671
4163
  readonly grain: {
2672
- readonly default: 0.01;
4164
+ readonly default: 0;
2673
4165
  readonly slot: "grain";
2674
4166
  readonly label: "Grain";
2675
4167
  readonly min: 0;
@@ -2678,7 +4170,7 @@ export declare const shaderRegistry: {
2678
4170
  readonly hint: "Per-pixel noise. A little hides banding on flat gradients.";
2679
4171
  };
2680
4172
  readonly vignette: {
2681
- readonly default: 0.2;
4173
+ readonly default: 0.3;
2682
4174
  readonly slot: "vignette";
2683
4175
  readonly label: "Vignette";
2684
4176
  readonly min: 0;
@@ -2686,41 +4178,41 @@ export declare const shaderRegistry: {
2686
4178
  readonly step: 0.01;
2687
4179
  readonly hint: "Darkening towards the edges of the frame.";
2688
4180
  };
2689
- readonly thickness: {
4181
+ readonly cells: {
2690
4182
  readonly slot: "a";
2691
- readonly label: "Thickness";
2692
- readonly min: 0.5;
2693
- readonly max: 6;
2694
- readonly step: 0.1;
2695
- readonly default: 1.5;
2696
- readonly hint: "How far apart the kernel taps sit, in source texels.";
4183
+ readonly label: "Cells";
4184
+ readonly min: 8;
4185
+ readonly max: 120;
4186
+ readonly step: 1;
4187
+ readonly default: 48;
4188
+ readonly hint: "Characters across the short axis.";
2697
4189
  };
2698
- readonly threshold: {
4190
+ readonly contrast: {
2699
4191
  readonly slot: "b";
2700
- readonly label: "Threshold";
2701
- readonly min: 0;
2702
- readonly max: 1;
4192
+ readonly label: "Contrast";
4193
+ readonly min: 0.3;
4194
+ readonly max: 3;
2703
4195
  readonly step: 0.01;
2704
- readonly default: 0.15;
2705
- readonly hint: "How steep a gradient has to be to count as an edge.";
4196
+ readonly default: 1;
4197
+ readonly hint: "Gamma on the luma before it picks a glyph.";
2706
4198
  };
2707
- readonly fill: {
4199
+ readonly colorize: {
2708
4200
  readonly slot: "c";
2709
- readonly label: "Fill";
4201
+ readonly label: "Colorize";
2710
4202
  readonly min: 0;
2711
4203
  readonly max: 1;
2712
4204
  readonly step: 0.01;
2713
4205
  readonly default: 0;
2714
- readonly hint: "How much of the original shows under the lines.";
4206
+ readonly hint: "0 is phosphor, 1 keeps the source's own colours.";
2715
4207
  };
2716
- readonly glow: {
4208
+ readonly scan: {
2717
4209
  readonly slot: "d";
2718
- readonly label: "Glow";
4210
+ readonly label: "Scan";
2719
4211
  readonly min: 0;
2720
- readonly max: 2;
4212
+ readonly max: 1;
2721
4213
  readonly step: 0.01;
2722
4214
  readonly default: 0.4;
2723
- readonly hint: "Bleed off the line, which reads as ink rather than aliasing.";
4215
+ readonly hint: "Scanlines and a slow refresh bar.";
2724
4216
  };
2725
4217
  readonly intensity: {
2726
4218
  readonly slot: "intensity";
@@ -2747,17 +4239,35 @@ export declare const shaderRegistry: {
2747
4239
  readonly colorC: ColorControl;
2748
4240
  };
2749
4241
  };
2750
- readonly mosaic: {
2751
- readonly name: "Mosaic";
2752
- readonly tagline: "The layer rebuilt out of tiles";
2753
- readonly description: "One tap at each tile's centre, not an average of it — the hard colour is the point, and averaging would only reinvent a blur. Posterising after sampling is what makes it look assembled from a limited set rather than merely coarse. Roundness grows a dot whose size follows the tile's brightness, the way a printed screen does.";
2754
- readonly family: "image";
2755
- readonly tags: readonly ["pixelate", "print", "retro"];
2756
- readonly cost: "light";
2757
- readonly defaultSource: "aurora";
4242
+ readonly shatter: {
4243
+ readonly name: "Shatter";
4244
+ readonly tagline: "The layer breaks into shards that fly from the pointer";
4245
+ readonly description: "A voronoi partition where the shards hold still and their contents move: each cell samples the source from a position swung back toward the impact point, so the picture inside every shard slides and rotates away from the cursor while the crack pattern stays fixed. At speed 0 the progress slider is a scrubber, same contract as reveal — bind it to a scroll position and the break happens under the reader's thumb.";
4246
+ readonly family: "distortion";
4247
+ readonly tags: readonly ["interactive", "pointer", "text", "transition"];
4248
+ readonly cost: "medium";
4249
+ readonly defaultSource: "kaleidoscope";
2758
4250
  readonly controls: {
4251
+ readonly speed: {
4252
+ readonly default: 0.6;
4253
+ readonly max: 2;
4254
+ readonly slot: "speed";
4255
+ readonly label: "Speed";
4256
+ readonly min: 0;
4257
+ readonly step: 0.01;
4258
+ readonly hint: "Time multiplier. 0 freezes the shader on its current frame.";
4259
+ };
4260
+ readonly scale: {
4261
+ readonly default: 1;
4262
+ readonly slot: "scale";
4263
+ readonly label: "Scale";
4264
+ readonly min: 0.2;
4265
+ readonly max: 3;
4266
+ readonly step: 0.01;
4267
+ readonly hint: "Zoom of the underlying field. Lower is bigger, softer shapes.";
4268
+ };
2759
4269
  readonly grain: {
2760
- readonly default: 0;
4270
+ readonly default: 0.02;
2761
4271
  readonly slot: "grain";
2762
4272
  readonly label: "Grain";
2763
4273
  readonly min: 0;
@@ -2766,7 +4276,7 @@ export declare const shaderRegistry: {
2766
4276
  readonly hint: "Per-pixel noise. A little hides banding on flat gradients.";
2767
4277
  };
2768
4278
  readonly vignette: {
2769
- readonly default: 0.2;
4279
+ readonly default: 0.25;
2770
4280
  readonly slot: "vignette";
2771
4281
  readonly label: "Vignette";
2772
4282
  readonly min: 0;
@@ -2774,41 +4284,50 @@ export declare const shaderRegistry: {
2774
4284
  readonly step: 0.01;
2775
4285
  readonly hint: "Darkening towards the edges of the frame.";
2776
4286
  };
2777
- readonly tiles: {
2778
- readonly slot: "a";
2779
- readonly label: "Tiles";
2780
- readonly min: 4;
2781
- readonly max: 160;
2782
- readonly step: 1;
2783
- readonly default: 42;
2784
- readonly hint: "Tiles across the short axis. They stay square on any canvas.";
4287
+ readonly warp: {
4288
+ readonly label: "Scatter";
4289
+ readonly min: 0;
4290
+ readonly max: 2;
4291
+ readonly default: 1;
4292
+ readonly hint: "How far the shards travel from the impact.";
4293
+ readonly slot: "warp";
4294
+ readonly step: 0.01;
2785
4295
  };
2786
- readonly roundness: {
2787
- readonly slot: "b";
2788
- readonly label: "Roundness";
4296
+ readonly progress: {
4297
+ readonly slot: "a";
4298
+ readonly label: "Progress";
2789
4299
  readonly min: 0;
2790
4300
  readonly max: 1;
2791
4301
  readonly step: 0.01;
2792
4302
  readonly default: 0;
2793
- readonly hint: "0 is a solid tile, 1 is a dot that shrinks as the tile darkens.";
4303
+ readonly hint: "Position of the break. Set speed to 0 and drive this yourself.";
2794
4304
  };
2795
- readonly gap: {
4305
+ readonly shards: {
4306
+ readonly slot: "b";
4307
+ readonly label: "Shards";
4308
+ readonly min: 2;
4309
+ readonly max: 24;
4310
+ readonly step: 1;
4311
+ readonly default: 8;
4312
+ readonly hint: "Density of the crack pattern.";
4313
+ };
4314
+ readonly spin: {
2796
4315
  readonly slot: "c";
2797
- readonly label: "Gap";
4316
+ readonly label: "Spin";
2798
4317
  readonly min: 0;
2799
- readonly max: 0.45;
4318
+ readonly max: 2;
2800
4319
  readonly step: 0.01;
2801
- readonly default: 0.02;
2802
- readonly hint: "Ground left showing between tiles.";
4320
+ readonly default: 0.8;
4321
+ readonly hint: "How much each shard rotates as it flies.";
2803
4322
  };
2804
- readonly steps: {
4323
+ readonly glint: {
2805
4324
  readonly slot: "d";
2806
- readonly label: "Colour steps";
2807
- readonly min: 2;
2808
- readonly max: 32;
2809
- readonly step: 1;
2810
- readonly default: 12;
2811
- readonly hint: "Levels each channel is quantised to. Low values band on purpose.";
4325
+ readonly label: "Glint";
4326
+ readonly min: 0;
4327
+ readonly max: 2;
4328
+ readonly step: 0.01;
4329
+ readonly default: 0.8;
4330
+ readonly hint: "Light catching the fresh crack edges.";
2812
4331
  };
2813
4332
  readonly intensity: {
2814
4333
  readonly slot: "intensity";
@@ -2835,17 +4354,17 @@ export declare const shaderRegistry: {
2835
4354
  readonly colorC: ColorControl;
2836
4355
  };
2837
4356
  };
2838
- readonly reveal: {
2839
- readonly name: "Reveal";
2840
- readonly tagline: "The layer wiped in over a colour ground";
2841
- readonly description: "A threshold cutting through a field: noise dissolves, a rotated ramp wipes, and shape slides between the two. At speed 0 the progress control is a scrubber you can drive from your own code — bind it to a scroll position or a load event. Above 0 it loops on its own, which is what makes it worth looking at on a card.";
2842
- readonly family: "transition";
2843
- readonly tags: readonly ["wipe", "dissolve", "entrance"];
2844
- readonly cost: "light";
2845
- readonly defaultSource: "mesh-gradient";
4357
+ readonly melt: {
4358
+ readonly name: "Melt";
4359
+ readonly tagline: "The layer runs downhill, and the pointer is the heat";
4360
+ readonly description: "A melting pixel shows what used to be above it, so the whole effect is sampling the source at a smaller y. How much smaller is a column-coherent noise — coherent down each column, varied across them — which is what makes drips instead of fog. The streak pass keeps the brightest tap of the climb, the way a run of paint carries its highlight down with it. The pointer is a blowtorch: hold it on text and the text sags.";
4361
+ readonly family: "distortion";
4362
+ readonly tags: readonly ["interactive", "pointer", "text"];
4363
+ readonly cost: "medium";
4364
+ readonly defaultSource: "neon-grid";
2846
4365
  readonly controls: {
2847
4366
  readonly speed: {
2848
- readonly default: 0.6;
4367
+ readonly default: 1;
2849
4368
  readonly max: 2;
2850
4369
  readonly slot: "speed";
2851
4370
  readonly label: "Speed";
@@ -2872,7 +4391,7 @@ export declare const shaderRegistry: {
2872
4391
  readonly hint: "Per-pixel noise. A little hides banding on flat gradients.";
2873
4392
  };
2874
4393
  readonly vignette: {
2875
- readonly default: 0.2;
4394
+ readonly default: 0.25;
2876
4395
  readonly slot: "vignette";
2877
4396
  readonly label: "Vignette";
2878
4397
  readonly min: 0;
@@ -2881,49 +4400,49 @@ export declare const shaderRegistry: {
2881
4400
  readonly hint: "Darkening towards the edges of the frame.";
2882
4401
  };
2883
4402
  readonly warp: {
2884
- readonly label: "Edge glow";
4403
+ readonly label: "Wobble";
2885
4404
  readonly min: 0;
2886
4405
  readonly max: 2;
2887
- readonly default: 0.6;
2888
- readonly hint: "Light riding the boundary, the way a burn does.";
4406
+ readonly default: 0.8;
4407
+ readonly hint: "Sideways sway in the runs, so no drip is perfectly plumb.";
2889
4408
  readonly slot: "warp";
2890
4409
  readonly step: 0.01;
2891
4410
  };
2892
- readonly progress: {
4411
+ readonly heat: {
2893
4412
  readonly slot: "a";
2894
- readonly label: "Progress";
4413
+ readonly label: "Heat";
2895
4414
  readonly min: 0;
2896
- readonly max: 1;
4415
+ readonly max: 2;
2897
4416
  readonly step: 0.01;
2898
- readonly default: 0;
2899
- readonly hint: "Position of the wipe. Set speed to 0 and drive this yourself.";
4417
+ readonly default: 0.8;
4418
+ readonly hint: "Overall melting. The pointer adds its own on top.";
2900
4419
  };
2901
- readonly shape: {
4420
+ readonly drips: {
2902
4421
  readonly slot: "b";
2903
- readonly label: "Shape";
2904
- readonly min: 0;
2905
- readonly max: 1;
4422
+ readonly label: "Drips";
4423
+ readonly min: 0.2;
4424
+ readonly max: 3;
2906
4425
  readonly step: 0.01;
2907
- readonly default: 0.35;
2908
- readonly hint: "0 dissolves through noise, 1 wipes along a straight edge.";
4426
+ readonly default: 1;
4427
+ readonly hint: "How many runs share the width of the frame.";
2909
4428
  };
2910
- readonly angle: {
4429
+ readonly streaks: {
2911
4430
  readonly slot: "c";
2912
- readonly label: "Angle";
4431
+ readonly label: "Streaks";
2913
4432
  readonly min: 0;
2914
4433
  readonly max: 1;
2915
4434
  readonly step: 0.01;
2916
- readonly default: 0;
2917
- readonly hint: "Direction of the wipe, as a full turn from 0 to 1.";
4435
+ readonly default: 0.7;
4436
+ readonly hint: "The bright smear a run drags down with it.";
2918
4437
  };
2919
- readonly softness: {
4438
+ readonly torch: {
2920
4439
  readonly slot: "d";
2921
- readonly label: "Softness";
2922
- readonly min: 0.001;
2923
- readonly max: 0.4;
2924
- readonly step: 0.001;
2925
- readonly default: 0.08;
2926
- readonly hint: "Width of the boundary band. Small is a hard cut.";
4440
+ readonly label: "Torch";
4441
+ readonly min: 0.05;
4442
+ readonly max: 0.8;
4443
+ readonly step: 0.01;
4444
+ readonly default: 0.25;
4445
+ readonly hint: "Radius of the pointer's heat.";
2927
4446
  };
2928
4447
  readonly intensity: {
2929
4448
  readonly slot: "intensity";