shadertown 0.3.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.
@@ -2346,18 +2346,17 @@ export declare const shaderRegistry: {
2346
2346
  readonly colorC: ColorControl;
2347
2347
  };
2348
2348
  };
2349
- readonly glass: {
2350
- readonly name: "Glass";
2351
- readonly tagline: "A refracting, frosted sheet over the layer behind it";
2352
- 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.";
2353
- readonly family: "optical";
2354
- readonly tags: readonly ["glass", "refraction", "overlay"];
2355
- readonly cost: "medium";
2356
- readonly defaultSource: "neon-grid";
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";
2357
2356
  readonly controls: {
2358
2357
  readonly speed: {
2359
- readonly default: 0.35;
2360
- readonly max: 2;
2358
+ readonly default: 1;
2359
+ readonly max: 2.5;
2361
2360
  readonly slot: "speed";
2362
2361
  readonly label: "Speed";
2363
2362
  readonly min: 0;
@@ -2366,22 +2365,13 @@ export declare const shaderRegistry: {
2366
2365
  };
2367
2366
  readonly scale: {
2368
2367
  readonly default: 1;
2368
+ readonly min: 0.4;
2369
+ readonly max: 2.5;
2369
2370
  readonly slot: "scale";
2370
2371
  readonly label: "Scale";
2371
- readonly min: 0.2;
2372
- readonly max: 3;
2373
2372
  readonly step: 0.01;
2374
2373
  readonly hint: "Zoom of the underlying field. Lower is bigger, softer shapes.";
2375
2374
  };
2376
- readonly intensity: {
2377
- readonly default: 1;
2378
- readonly slot: "intensity";
2379
- readonly label: "Strength";
2380
- readonly min: 0;
2381
- readonly max: 2.5;
2382
- readonly step: 0.01;
2383
- readonly hint: "Overall brightness of the effect before the post chain.";
2384
- };
2385
2375
  readonly grain: {
2386
2376
  readonly default: 0.02;
2387
2377
  readonly slot: "grain";
@@ -2392,7 +2382,7 @@ export declare const shaderRegistry: {
2392
2382
  readonly hint: "Per-pixel noise. A little hides banding on flat gradients.";
2393
2383
  };
2394
2384
  readonly vignette: {
2395
- readonly default: 0.2;
2385
+ readonly default: 0.3;
2396
2386
  readonly slot: "vignette";
2397
2387
  readonly label: "Vignette";
2398
2388
  readonly min: 0;
@@ -2400,50 +2390,50 @@ export declare const shaderRegistry: {
2400
2390
  readonly step: 0.01;
2401
2391
  readonly hint: "Darkening towards the edges of the frame.";
2402
2392
  };
2403
- readonly warp: {
2404
- readonly label: "Refraction";
2405
- readonly default: 0.8;
2406
- readonly max: 2.5;
2407
- readonly hint: "How far the sheet bends what is behind it.";
2408
- readonly slot: "warp";
2409
- readonly min: 0;
2410
- readonly step: 0.01;
2411
- };
2412
- readonly frost: {
2393
+ readonly follow: {
2413
2394
  readonly slot: "a";
2414
- readonly label: "Frost";
2395
+ readonly label: "Follow";
2415
2396
  readonly min: 0;
2416
2397
  readonly max: 1;
2417
2398
  readonly step: 0.01;
2418
- readonly default: 0.35;
2419
- readonly hint: "Blur radius. Past about 0.6 the layer below stops being readable.";
2399
+ readonly default: 0.85;
2400
+ readonly hint: "0 lets every eye wander on its own, 1 locks them all onto the pointer.";
2420
2401
  };
2421
- readonly dispersion: {
2402
+ readonly blink: {
2422
2403
  readonly slot: "b";
2423
- readonly label: "Dispersion";
2404
+ readonly label: "Blink";
2424
2405
  readonly min: 0;
2425
- readonly max: 1;
2406
+ readonly max: 3;
2426
2407
  readonly step: 0.01;
2427
- readonly default: 0.25;
2428
- readonly hint: "Colour fringing where the sheet is steepest, as in real glass.";
2408
+ readonly default: 1;
2409
+ readonly hint: "Blink rate. 0 stares, which is worse.";
2429
2410
  };
2430
- readonly edge: {
2411
+ readonly iris: {
2431
2412
  readonly slot: "c";
2432
- readonly label: "Edge light";
2433
- readonly min: 0;
2434
- readonly max: 2;
2413
+ readonly label: "Iris";
2414
+ readonly min: 0.4;
2415
+ readonly max: 1.6;
2435
2416
  readonly step: 0.01;
2436
- readonly default: 0.6;
2437
- readonly hint: "Highlight along the ridges. This is what makes it read as thick.";
2417
+ readonly default: 1;
2418
+ readonly hint: "Size of the iris inside the almond.";
2438
2419
  };
2439
- readonly tint: {
2420
+ readonly pupil: {
2440
2421
  readonly slot: "d";
2441
- readonly label: "Tint";
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";
2442
2432
  readonly min: 0;
2443
- readonly max: 1;
2433
+ readonly max: 2.5;
2444
2434
  readonly step: 0.01;
2445
- readonly default: 0.15;
2446
- readonly hint: "Pulls the whole sheet towards the palette. 0 leaves it colourless.";
2435
+ readonly default: 1;
2436
+ readonly hint: "Overall brightness of the effect before the post chain.";
2447
2437
  };
2448
2438
  readonly vibrancy: {
2449
2439
  readonly slot: "vibrancy";
@@ -2461,17 +2451,43 @@ export declare const shaderRegistry: {
2461
2451
  readonly colorC: ColorControl;
2462
2452
  };
2463
2453
  };
2464
- readonly lens: {
2465
- readonly name: "Lens";
2466
- readonly tagline: "Barrel distortion, colour fringing and soft corners";
2467
- 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.";
2468
- readonly family: "optical";
2469
- readonly tags: readonly ["camera", "distortion", "retro"];
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"];
2470
2460
  readonly cost: "medium";
2471
- readonly defaultSource: "neon-grid";
2472
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
+ };
2473
2489
  readonly vignette: {
2474
- readonly default: 0.15;
2490
+ readonly default: 0.4;
2475
2491
  readonly slot: "vignette";
2476
2492
  readonly label: "Vignette";
2477
2493
  readonly min: 0;
@@ -2480,49 +2496,49 @@ export declare const shaderRegistry: {
2480
2496
  readonly hint: "Darkening towards the edges of the frame.";
2481
2497
  };
2482
2498
  readonly warp: {
2483
- readonly label: "Distortion";
2484
- readonly min: -1;
2499
+ readonly label: "Wiggle";
2500
+ readonly min: 0;
2485
2501
  readonly max: 2;
2486
- readonly default: 0.5;
2487
- readonly hint: "Above zero bows outwards (barrel), below zero pulls inwards (pincushion).";
2502
+ readonly default: 0.8;
2503
+ readonly hint: "How hard a filament thrashes as it travels. 0 is spokes.";
2488
2504
  readonly slot: "warp";
2489
2505
  readonly step: 0.01;
2490
2506
  };
2491
- readonly softness: {
2507
+ readonly bolts: {
2492
2508
  readonly slot: "a";
2493
- readonly label: "Corner softness";
2494
- readonly min: 0;
2495
- readonly max: 1;
2496
- readonly step: 0.01;
2497
- readonly default: 0.35;
2498
- readonly hint: "How far off the focal plane the corners sit.";
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.";
2499
2515
  };
2500
- readonly fringing: {
2516
+ readonly glow: {
2501
2517
  readonly slot: "b";
2502
- readonly label: "Fringing";
2503
- readonly min: 0;
2504
- readonly max: 1;
2518
+ readonly label: "Glow";
2519
+ readonly min: 0.3;
2520
+ readonly max: 2;
2505
2521
  readonly step: 0.01;
2506
- readonly default: 0.4;
2507
- readonly hint: "How far apart the red and blue ends are bent.";
2522
+ readonly default: 1;
2523
+ readonly hint: "Width of the halo riding each filament.";
2508
2524
  };
2509
- readonly zoom: {
2525
+ readonly flicker: {
2510
2526
  readonly slot: "c";
2511
- readonly label: "Zoom";
2512
- readonly min: 0.5;
2513
- readonly max: 1.5;
2527
+ readonly label: "Flicker";
2528
+ readonly min: 0;
2529
+ readonly max: 2;
2514
2530
  readonly step: 0.01;
2515
2531
  readonly default: 1;
2516
- readonly hint: "Below 1 pulls back and shows the black outside the frame.";
2532
+ readonly hint: "How often the bolts re-roll their heading.";
2517
2533
  };
2518
- readonly falloff: {
2534
+ readonly haze: {
2519
2535
  readonly slot: "d";
2520
- readonly label: "Corner falloff";
2536
+ readonly label: "Haze";
2521
2537
  readonly min: 0;
2522
- readonly max: 1;
2538
+ readonly max: 2;
2523
2539
  readonly step: 0.01;
2524
- readonly default: 0.4;
2525
- readonly hint: "Light lost towards the corners, as distortion spreads it thinner.";
2540
+ readonly default: 0.8;
2541
+ readonly hint: "The gas glow filling the globe behind the filaments.";
2526
2542
  };
2527
2543
  readonly intensity: {
2528
2544
  readonly slot: "intensity";
@@ -2542,15 +2558,6 @@ export declare const shaderRegistry: {
2542
2558
  readonly default: 1;
2543
2559
  readonly hint: "Saturation. 0 is greyscale, 1 is as authored, 2 is punched.";
2544
2560
  };
2545
- readonly grain: {
2546
- readonly slot: "grain";
2547
- readonly label: "Grain";
2548
- readonly min: 0;
2549
- readonly max: 0.35;
2550
- readonly step: 0.005;
2551
- readonly default: 0.03;
2552
- readonly hint: "Per-pixel noise. A little hides banding on flat gradients.";
2553
- };
2554
2561
  };
2555
2562
  readonly colors: {
2556
2563
  readonly colorA: ColorControl;
@@ -2558,68 +2565,76 @@ export declare const shaderRegistry: {
2558
2565
  readonly colorC: ColorControl;
2559
2566
  };
2560
2567
  };
2561
- readonly bloom: {
2562
- readonly name: "Bloom";
2563
- readonly tagline: "Light bleeding out of the bright parts of the layer below";
2564
- 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.";
2565
- readonly family: "optical";
2566
- readonly tags: readonly ["glow", "light", "hero"];
2567
- readonly cost: "heavy";
2568
- readonly defaultSource: "starfield";
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";
2569
2575
  readonly controls: {
2570
- readonly vignette: {
2571
- readonly default: 0.1;
2572
- readonly slot: "vignette";
2573
- readonly label: "Vignette";
2576
+ readonly speed: {
2577
+ readonly default: 1;
2578
+ readonly max: 2.5;
2579
+ readonly slot: "speed";
2580
+ readonly label: "Speed";
2574
2581
  readonly min: 0;
2575
- readonly max: 1;
2576
2582
  readonly step: 0.01;
2577
- readonly hint: "Darkening towards the edges of the frame.";
2583
+ readonly hint: "Time multiplier. 0 freezes the shader on its current frame.";
2578
2584
  };
2579
- readonly warp: {
2580
- readonly label: "Streak";
2581
- readonly min: 0;
2582
- readonly max: 1;
2583
- readonly default: 0.15;
2584
- readonly hint: "Stretches the halo sideways. Small values read as a lens, large as a smear.";
2585
- readonly slot: "warp";
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";
2586
2591
  readonly step: 0.01;
2592
+ readonly hint: "Zoom of the underlying field. Lower is bigger, softer shapes.";
2587
2593
  };
2588
- readonly threshold: {
2589
- readonly slot: "a";
2590
- readonly label: "Threshold";
2594
+ readonly grain: {
2595
+ readonly default: 0.02;
2596
+ readonly slot: "grain";
2597
+ readonly label: "Grain";
2591
2598
  readonly min: 0;
2592
- readonly max: 1;
2593
- readonly step: 0.01;
2594
- readonly default: 0.55;
2595
- readonly hint: "How bright a pixel has to be before it blooms at all.";
2599
+ readonly max: 0.35;
2600
+ readonly step: 0.005;
2601
+ readonly hint: "Per-pixel noise. A little hides banding on flat gradients.";
2596
2602
  };
2597
- readonly radius: {
2598
- readonly slot: "b";
2599
- readonly label: "Radius";
2603
+ readonly vignette: {
2604
+ readonly default: 0.35;
2605
+ readonly slot: "vignette";
2606
+ readonly label: "Vignette";
2600
2607
  readonly min: 0;
2601
2608
  readonly max: 1;
2602
2609
  readonly step: 0.01;
2603
- readonly default: 0.5;
2604
- readonly hint: "How far the light carries. Wide radii need bright, sparse sources.";
2610
+ readonly hint: "Darkening towards the edges of the frame.";
2605
2611
  };
2606
- readonly amount: {
2607
- readonly slot: "c";
2608
- readonly label: "Amount";
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";
2609
2624
  readonly min: 0;
2610
2625
  readonly max: 3;
2611
2626
  readonly step: 0.01;
2612
- readonly default: 1.2;
2613
- readonly hint: "How much of the halo is added back on top.";
2627
+ readonly default: 1;
2628
+ readonly hint: "The phase sliding along the lines. 0 is a printed diagram.";
2614
2629
  };
2615
- readonly tint: {
2616
- readonly slot: "d";
2617
- readonly label: "Tint";
2618
- readonly min: 0;
2619
- readonly max: 1;
2620
- readonly step: 0.01;
2621
- readonly default: 0.3;
2622
- readonly hint: "Colours the halo from the palette. Real coatings are rarely neutral.";
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.";
2623
2638
  };
2624
2639
  readonly intensity: {
2625
2640
  readonly slot: "intensity";
@@ -2639,14 +2654,119 @@ export declare const shaderRegistry: {
2639
2654
  readonly default: 1;
2640
2655
  readonly hint: "Saturation. 0 is greyscale, 1 is as authored, 2 is punched.";
2641
2656
  };
2642
- readonly grain: {
2643
- readonly slot: "grain";
2644
- readonly label: "Grain";
2645
- readonly min: 0;
2646
- readonly max: 0.35;
2647
- readonly step: 0.005;
2648
- readonly default: 0.03;
2649
- readonly hint: "Per-pixel noise. A little hides banding on flat gradients.";
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.";
2650
2770
  };
2651
2771
  };
2652
2772
  readonly colors: {
@@ -2655,26 +2775,969 @@ export declare const shaderRegistry: {
2655
2775
  readonly colorC: ColorControl;
2656
2776
  };
2657
2777
  };
2658
- readonly shockwave: {
2659
- readonly name: "Shockwave";
2660
- readonly tagline: "Expanding rings that shove the layer aside as they pass";
2661
- 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.";
2662
- readonly family: "distortion";
2663
- readonly tags: readonly ["impact", "pulse", "interactive"];
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"];
2664
2889
  readonly cost: "medium";
2665
- readonly defaultSource: "truchet";
2666
2890
  readonly controls: {
2667
2891
  readonly speed: {
2668
2892
  readonly default: 0.8;
2893
+ readonly max: 2;
2669
2894
  readonly slot: "speed";
2670
2895
  readonly label: "Speed";
2671
2896
  readonly min: 0;
2672
- readonly max: 3;
2673
2897
  readonly step: 0.01;
2674
2898
  readonly hint: "Time multiplier. 0 freezes the shader on its current frame.";
2675
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;
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.";
3474
+ };
3475
+ readonly spin: {
3476
+ readonly slot: "c";
3477
+ readonly label: "Spin";
3478
+ readonly min: -1;
3479
+ readonly max: 1;
3480
+ readonly step: 0.01;
3481
+ readonly default: 0.15;
3482
+ readonly hint: "Steady rotation over time. Negative winds the other way.";
3483
+ };
3484
+ readonly smear: {
3485
+ readonly slot: "d";
3486
+ readonly label: "Smear";
3487
+ readonly min: 0;
3488
+ readonly max: 1;
3489
+ readonly step: 0.01;
3490
+ readonly default: 0.3;
3491
+ readonly hint: "Colour trailing along the direction of travel.";
3492
+ };
3493
+ readonly scale: {
3494
+ readonly slot: "scale";
3495
+ readonly label: "Scale";
3496
+ readonly min: 0.2;
3497
+ readonly max: 3;
3498
+ readonly step: 0.01;
3499
+ readonly default: 1;
3500
+ readonly hint: "Zoom of the underlying field. Lower is bigger, softer shapes.";
3501
+ };
3502
+ readonly intensity: {
3503
+ readonly slot: "intensity";
3504
+ readonly label: "Strength";
3505
+ readonly min: 0;
3506
+ readonly max: 2.5;
3507
+ readonly step: 0.01;
3508
+ readonly default: 1;
3509
+ readonly hint: "Overall brightness of the effect before the post chain.";
3510
+ };
3511
+ readonly vibrancy: {
3512
+ readonly slot: "vibrancy";
3513
+ readonly label: "Vibrancy";
3514
+ readonly min: 0;
3515
+ readonly max: 2;
3516
+ readonly step: 0.01;
3517
+ readonly default: 1;
3518
+ readonly hint: "Saturation. 0 is greyscale, 1 is as authored, 2 is punched.";
3519
+ };
3520
+ };
3521
+ readonly colors: {
3522
+ readonly colorA: ColorControl;
3523
+ readonly colorB: ColorControl;
3524
+ readonly colorC: ColorControl;
3525
+ };
3526
+ };
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";
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
+ };
3563
+ readonly vignette: {
3564
+ readonly default: 0.2;
3565
+ readonly slot: "vignette";
3566
+ readonly label: "Vignette";
3567
+ readonly min: 0;
3568
+ readonly max: 1;
3569
+ readonly step: 0.01;
3570
+ readonly hint: "Darkening towards the edges of the frame.";
3571
+ };
3572
+ readonly warp: {
3573
+ readonly label: "Strength";
3574
+ readonly min: 0;
3575
+ readonly max: 2;
3576
+ readonly default: 0.7;
3577
+ readonly hint: "How far the field pushes the layer.";
3578
+ readonly slot: "warp";
3579
+ readonly step: 0.01;
3580
+ };
3581
+ readonly turbulence: {
3582
+ readonly slot: "a";
3583
+ readonly label: "Turbulence";
3584
+ readonly min: 0;
3585
+ readonly max: 1;
3586
+ readonly step: 0.01;
3587
+ readonly default: 0.4;
3588
+ readonly hint: "0 is broad lazy currents, 1 is sharp filaments.";
3589
+ };
3590
+ readonly curl: {
3591
+ readonly slot: "b";
3592
+ readonly label: "Curl";
3593
+ readonly min: 0;
3594
+ readonly max: 1;
3595
+ readonly step: 0.01;
3596
+ readonly default: 0.75;
3597
+ readonly hint: "Turns the drift into circulation. 0 pulls everything one way.";
3598
+ };
3599
+ readonly smear: {
3600
+ readonly slot: "c";
3601
+ readonly label: "Smear";
3602
+ readonly min: 0;
3603
+ readonly max: 1;
3604
+ readonly step: 0.01;
3605
+ readonly default: 0.35;
3606
+ readonly hint: "Blur along the flow, which is what reads as motion.";
3607
+ };
3608
+ readonly tint: {
3609
+ readonly slot: "d";
3610
+ readonly label: "Tint";
3611
+ readonly min: 0;
3612
+ readonly max: 1;
3613
+ readonly step: 0.01;
3614
+ readonly default: 0.2;
3615
+ readonly hint: "Colours the fast water from the palette.";
3616
+ };
3617
+ readonly intensity: {
3618
+ readonly slot: "intensity";
3619
+ readonly label: "Strength";
3620
+ readonly min: 0;
3621
+ readonly max: 2.5;
3622
+ readonly step: 0.01;
3623
+ readonly default: 1;
3624
+ readonly hint: "Overall brightness of the effect before the post chain.";
3625
+ };
3626
+ readonly vibrancy: {
3627
+ readonly slot: "vibrancy";
3628
+ readonly label: "Vibrancy";
3629
+ readonly min: 0;
3630
+ readonly max: 2;
3631
+ readonly step: 0.01;
3632
+ readonly default: 1;
3633
+ readonly hint: "Saturation. 0 is greyscale, 1 is as authored, 2 is punched.";
3634
+ };
3635
+ };
3636
+ readonly colors: {
3637
+ readonly colorA: ColorControl;
3638
+ readonly colorB: ColorControl;
3639
+ readonly colorC: ColorControl;
3640
+ };
3641
+ };
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";
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
+ };
3660
+ readonly vignette: {
3661
+ readonly default: 0.2;
3662
+ readonly slot: "vignette";
3663
+ readonly label: "Vignette";
3664
+ readonly min: 0;
3665
+ readonly max: 1;
3666
+ readonly step: 0.01;
3667
+ readonly hint: "Darkening towards the edges of the frame.";
3668
+ };
3669
+ readonly black: {
3670
+ readonly slot: "a";
3671
+ readonly label: "Black point";
3672
+ readonly min: 0;
3673
+ readonly max: 0.6;
3674
+ readonly step: 0.01;
3675
+ readonly default: 0.05;
3676
+ readonly hint: "Brightness that maps to the first colour. Raise it to crush shadows.";
3677
+ };
3678
+ readonly white: {
3679
+ readonly slot: "b";
3680
+ readonly label: "White point";
3681
+ readonly min: 0.4;
3682
+ readonly max: 1;
3683
+ readonly step: 0.01;
3684
+ readonly default: 0.9;
3685
+ readonly hint: "Brightness that maps to the last colour. Lower it to blow highlights.";
3686
+ };
3687
+ readonly contrast: {
3688
+ readonly slot: "c";
3689
+ readonly label: "Contrast";
3690
+ readonly min: 0.2;
3691
+ readonly max: 3;
3692
+ readonly step: 0.01;
3693
+ readonly default: 1.2;
3694
+ readonly hint: "Steepness of the ramp between the two points.";
3695
+ };
3696
+ readonly keep: {
3697
+ readonly slot: "d";
3698
+ readonly label: "Keep colour";
3699
+ readonly min: 0;
3700
+ readonly max: 1;
3701
+ readonly step: 0.01;
3702
+ readonly default: 0;
3703
+ readonly hint: "Mixes the original chroma back over the mapped tone.";
3704
+ };
3705
+ readonly intensity: {
3706
+ readonly slot: "intensity";
3707
+ readonly label: "Strength";
3708
+ readonly min: 0;
3709
+ readonly max: 2.5;
3710
+ readonly step: 0.01;
3711
+ readonly default: 1;
3712
+ readonly hint: "Overall brightness of the effect before the post chain.";
3713
+ };
3714
+ readonly vibrancy: {
3715
+ readonly slot: "vibrancy";
3716
+ readonly label: "Vibrancy";
3717
+ readonly min: 0;
3718
+ readonly max: 2;
3719
+ readonly step: 0.01;
3720
+ readonly default: 1;
3721
+ readonly hint: "Saturation. 0 is greyscale, 1 is as authored, 2 is punched.";
3722
+ };
3723
+ };
3724
+ readonly colors: {
3725
+ readonly colorA: ColorControl;
3726
+ readonly colorB: ColorControl;
3727
+ readonly colorC: ColorControl;
3728
+ };
3729
+ };
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: {
2676
3739
  readonly grain: {
2677
- readonly default: 0.02;
3740
+ readonly default: 0.01;
2678
3741
  readonly slot: "grain";
2679
3742
  readonly label: "Grain";
2680
3743
  readonly min: 0;
@@ -2683,7 +3746,7 @@ export declare const shaderRegistry: {
2683
3746
  readonly hint: "Per-pixel noise. A little hides banding on flat gradients.";
2684
3747
  };
2685
3748
  readonly vignette: {
2686
- readonly default: 0.15;
3749
+ readonly default: 0.2;
2687
3750
  readonly slot: "vignette";
2688
3751
  readonly label: "Vignette";
2689
3752
  readonly min: 0;
@@ -2691,59 +3754,41 @@ export declare const shaderRegistry: {
2691
3754
  readonly step: 0.01;
2692
3755
  readonly hint: "Darkening towards the edges of the frame.";
2693
3756
  };
2694
- readonly warp: {
2695
- readonly label: "Force";
2696
- readonly min: 0;
2697
- readonly max: 2;
2698
- readonly default: 0.9;
2699
- readonly hint: "How far the front shoves what it passes over.";
2700
- readonly slot: "warp";
2701
- readonly step: 0.01;
2702
- };
2703
- readonly reach: {
3757
+ readonly thickness: {
2704
3758
  readonly slot: "a";
2705
- readonly label: "Reach";
2706
- readonly min: 0.1;
2707
- readonly max: 2;
2708
- readonly step: 0.01;
2709
- readonly default: 1;
2710
- 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.";
2711
3765
  };
2712
- readonly width: {
3766
+ readonly threshold: {
2713
3767
  readonly slot: "b";
2714
- readonly label: "Width";
3768
+ readonly label: "Threshold";
2715
3769
  readonly min: 0;
2716
3770
  readonly max: 1;
2717
3771
  readonly step: 0.01;
2718
- readonly default: 0.35;
2719
- 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.";
2720
3774
  };
2721
- readonly decay: {
3775
+ readonly fill: {
2722
3776
  readonly slot: "c";
2723
- readonly label: "Decay";
2724
- readonly min: 0.1;
2725
- readonly max: 4;
3777
+ readonly label: "Fill";
3778
+ readonly min: 0;
3779
+ readonly max: 1;
2726
3780
  readonly step: 0.01;
2727
- readonly default: 1.5;
2728
- 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.";
2729
3783
  };
2730
- readonly fringing: {
3784
+ readonly glow: {
2731
3785
  readonly slot: "d";
2732
- readonly label: "Fringing";
3786
+ readonly label: "Glow";
2733
3787
  readonly min: 0;
2734
- readonly max: 1;
3788
+ readonly max: 2;
2735
3789
  readonly step: 0.01;
2736
3790
  readonly default: 0.4;
2737
- readonly hint: "Colour separation across the crest.";
2738
- };
2739
- readonly scale: {
2740
- readonly slot: "scale";
2741
- readonly label: "Scale";
2742
- readonly min: 0.2;
2743
- readonly max: 3;
2744
- readonly step: 0.01;
2745
- readonly default: 1;
2746
- 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.";
2747
3792
  };
2748
3793
  readonly intensity: {
2749
3794
  readonly slot: "intensity";
@@ -2770,26 +3815,17 @@ export declare const shaderRegistry: {
2770
3815
  readonly colorC: ColorControl;
2771
3816
  };
2772
3817
  };
2773
- readonly swirl: {
2774
- readonly name: "Swirl";
2775
- readonly tagline: "A vortex that winds the layer around a point";
2776
- 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.";
2777
- readonly family: "distortion";
2778
- 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"];
2779
3824
  readonly cost: "light";
2780
- readonly defaultSource: "voronoi";
3825
+ readonly defaultSource: "aurora";
2781
3826
  readonly controls: {
2782
- readonly speed: {
2783
- readonly default: 1;
2784
- readonly slot: "speed";
2785
- readonly label: "Speed";
2786
- readonly min: 0;
2787
- readonly max: 3;
2788
- readonly step: 0.01;
2789
- readonly hint: "Time multiplier. 0 freezes the shader on its current frame.";
2790
- };
2791
3827
  readonly grain: {
2792
- readonly default: 0.02;
3828
+ readonly default: 0;
2793
3829
  readonly slot: "grain";
2794
3830
  readonly label: "Grain";
2795
3831
  readonly min: 0;
@@ -2798,7 +3834,7 @@ export declare const shaderRegistry: {
2798
3834
  readonly hint: "Per-pixel noise. A little hides banding on flat gradients.";
2799
3835
  };
2800
3836
  readonly vignette: {
2801
- readonly default: 0.15;
3837
+ readonly default: 0.2;
2802
3838
  readonly slot: "vignette";
2803
3839
  readonly label: "Vignette";
2804
3840
  readonly min: 0;
@@ -2806,59 +3842,41 @@ export declare const shaderRegistry: {
2806
3842
  readonly step: 0.01;
2807
3843
  readonly hint: "Darkening towards the edges of the frame.";
2808
3844
  };
2809
- readonly warp: {
2810
- readonly label: "Twist";
2811
- readonly min: 0;
2812
- readonly max: 3;
2813
- readonly default: 1.2;
2814
- readonly hint: "Turns at the centre. Past about 2 the middle stops being readable.";
2815
- readonly slot: "warp";
2816
- readonly step: 0.01;
2817
- };
2818
- readonly radius: {
3845
+ readonly tiles: {
2819
3846
  readonly slot: "a";
2820
- readonly label: "Radius";
2821
- readonly min: 0.02;
2822
- readonly max: 1.2;
2823
- readonly step: 0.01;
2824
- readonly default: 0.55;
2825
- 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.";
2826
3853
  };
2827
- readonly falloff: {
3854
+ readonly roundness: {
2828
3855
  readonly slot: "b";
2829
- readonly label: "Falloff";
2830
- readonly min: 0.1;
2831
- readonly max: 5;
2832
- readonly step: 0.01;
2833
- readonly default: 1.6;
2834
- readonly hint: "Shape of the edge. Low is a wide whirlpool, high is a tight knot.";
2835
- };
2836
- readonly spin: {
2837
- readonly slot: "c";
2838
- readonly label: "Spin";
2839
- readonly min: -1;
3856
+ readonly label: "Roundness";
3857
+ readonly min: 0;
2840
3858
  readonly max: 1;
2841
3859
  readonly step: 0.01;
2842
- readonly default: 0.15;
2843
- 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.";
2844
3862
  };
2845
- readonly smear: {
2846
- readonly slot: "d";
2847
- readonly label: "Smear";
3863
+ readonly gap: {
3864
+ readonly slot: "c";
3865
+ readonly label: "Gap";
2848
3866
  readonly min: 0;
2849
- readonly max: 1;
3867
+ readonly max: 0.45;
2850
3868
  readonly step: 0.01;
2851
- readonly default: 0.3;
2852
- readonly hint: "Colour trailing along the direction of travel.";
3869
+ readonly default: 0.02;
3870
+ readonly hint: "Ground left showing between tiles.";
2853
3871
  };
2854
- readonly scale: {
2855
- readonly slot: "scale";
2856
- readonly label: "Scale";
2857
- readonly min: 0.2;
2858
- readonly max: 3;
2859
- readonly step: 0.01;
2860
- readonly default: 1;
2861
- 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.";
2862
3880
  };
2863
3881
  readonly intensity: {
2864
3882
  readonly slot: "intensity";
@@ -2885,17 +3903,17 @@ export declare const shaderRegistry: {
2885
3903
  readonly colorC: ColorControl;
2886
3904
  };
2887
3905
  };
2888
- readonly flow: {
2889
- readonly name: "Flow";
2890
- readonly tagline: "The layer pushed around by a slow, turbulent field";
2891
- 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.";
2892
- readonly family: "distortion";
2893
- readonly tags: readonly ["liquid", "organic", "ambient"];
2894
- readonly cost: "heavy";
2895
- 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";
2896
3914
  readonly controls: {
2897
3915
  readonly speed: {
2898
- readonly default: 0.5;
3916
+ readonly default: 0.6;
2899
3917
  readonly max: 2;
2900
3918
  readonly slot: "speed";
2901
3919
  readonly label: "Speed";
@@ -2931,49 +3949,49 @@ export declare const shaderRegistry: {
2931
3949
  readonly hint: "Darkening towards the edges of the frame.";
2932
3950
  };
2933
3951
  readonly warp: {
2934
- readonly label: "Strength";
3952
+ readonly label: "Edge glow";
2935
3953
  readonly min: 0;
2936
3954
  readonly max: 2;
2937
- readonly default: 0.7;
2938
- 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.";
2939
3957
  readonly slot: "warp";
2940
3958
  readonly step: 0.01;
2941
3959
  };
2942
- readonly turbulence: {
3960
+ readonly progress: {
2943
3961
  readonly slot: "a";
2944
- readonly label: "Turbulence";
3962
+ readonly label: "Progress";
2945
3963
  readonly min: 0;
2946
3964
  readonly max: 1;
2947
3965
  readonly step: 0.01;
2948
- readonly default: 0.4;
2949
- 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.";
2950
3968
  };
2951
- readonly curl: {
3969
+ readonly shape: {
2952
3970
  readonly slot: "b";
2953
- readonly label: "Curl";
3971
+ readonly label: "Shape";
2954
3972
  readonly min: 0;
2955
3973
  readonly max: 1;
2956
3974
  readonly step: 0.01;
2957
- readonly default: 0.75;
2958
- 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.";
2959
3977
  };
2960
- readonly smear: {
3978
+ readonly angle: {
2961
3979
  readonly slot: "c";
2962
- readonly label: "Smear";
3980
+ readonly label: "Angle";
2963
3981
  readonly min: 0;
2964
3982
  readonly max: 1;
2965
3983
  readonly step: 0.01;
2966
- readonly default: 0.35;
2967
- 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.";
2968
3986
  };
2969
- readonly tint: {
3987
+ readonly softness: {
2970
3988
  readonly slot: "d";
2971
- readonly label: "Tint";
2972
- readonly min: 0;
2973
- readonly max: 1;
2974
- readonly step: 0.01;
2975
- readonly default: 0.2;
2976
- 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.";
2977
3995
  };
2978
3996
  readonly intensity: {
2979
3997
  readonly slot: "intensity";
@@ -2990,25 +4008,43 @@ export declare const shaderRegistry: {
2990
4008
  readonly min: 0;
2991
4009
  readonly max: 2;
2992
4010
  readonly step: 0.01;
2993
- readonly default: 1;
2994
- 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.";
2995
4047
  };
2996
- };
2997
- readonly colors: {
2998
- readonly colorA: ColorControl;
2999
- readonly colorB: ColorControl;
3000
- readonly colorC: ColorControl;
3001
- };
3002
- };
3003
- readonly duotone: {
3004
- readonly name: "Duotone";
3005
- readonly tagline: "The layer's brightness read through your palette";
3006
- 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.";
3007
- readonly family: "image";
3008
- readonly tags: readonly ["colour", "poster", "brand"];
3009
- readonly cost: "light";
3010
- readonly defaultSource: "julia";
3011
- readonly controls: {
3012
4048
  readonly grain: {
3013
4049
  readonly default: 0.02;
3014
4050
  readonly slot: "grain";
@@ -3019,7 +4055,7 @@ export declare const shaderRegistry: {
3019
4055
  readonly hint: "Per-pixel noise. A little hides banding on flat gradients.";
3020
4056
  };
3021
4057
  readonly vignette: {
3022
- readonly default: 0.2;
4058
+ readonly default: 0.35;
3023
4059
  readonly slot: "vignette";
3024
4060
  readonly label: "Vignette";
3025
4061
  readonly min: 0;
@@ -3027,41 +4063,50 @@ export declare const shaderRegistry: {
3027
4063
  readonly step: 0.01;
3028
4064
  readonly hint: "Darkening towards the edges of the frame.";
3029
4065
  };
3030
- 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: {
3031
4076
  readonly slot: "a";
3032
- readonly label: "Black point";
3033
- readonly min: 0;
3034
- readonly max: 0.6;
4077
+ readonly label: "Threshold";
4078
+ readonly min: 0.05;
4079
+ readonly max: 0.95;
3035
4080
  readonly step: 0.01;
3036
- readonly default: 0.05;
3037
- 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.";
3038
4083
  };
3039
- readonly white: {
4084
+ readonly fill: {
3040
4085
  readonly slot: "b";
3041
- readonly label: "White point";
3042
- readonly min: 0.4;
3043
- readonly max: 1;
4086
+ readonly label: "Fill";
4087
+ readonly min: 0;
4088
+ readonly max: 2;
3044
4089
  readonly step: 0.01;
3045
- readonly default: 0.9;
3046
- 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.";
3047
4092
  };
3048
- readonly contrast: {
4093
+ readonly flicker: {
3049
4094
  readonly slot: "c";
3050
- readonly label: "Contrast";
3051
- readonly min: 0.2;
3052
- readonly max: 3;
4095
+ readonly label: "Flicker";
4096
+ readonly min: 0;
4097
+ readonly max: 1;
3053
4098
  readonly step: 0.01;
3054
- readonly default: 1.2;
3055
- 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.";
3056
4101
  };
3057
- readonly keep: {
4102
+ readonly boost: {
3058
4103
  readonly slot: "d";
3059
- readonly label: "Keep colour";
4104
+ readonly label: "Boost";
3060
4105
  readonly min: 0;
3061
- readonly max: 1;
4106
+ readonly max: 2;
3062
4107
  readonly step: 0.01;
3063
- readonly default: 0;
3064
- readonly hint: "Mixes the original chroma back over the mapped tone.";
4108
+ readonly default: 1;
4109
+ readonly hint: "Overall drive into the tube.";
3065
4110
  };
3066
4111
  readonly intensity: {
3067
4112
  readonly slot: "intensity";
@@ -3088,17 +4133,35 @@ export declare const shaderRegistry: {
3088
4133
  readonly colorC: ColorControl;
3089
4134
  };
3090
4135
  };
3091
- readonly edges: {
3092
- readonly name: "Edges";
3093
- readonly tagline: "The layer reduced to its outlines";
3094
- 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.";
3095
4140
  readonly family: "image";
3096
- readonly tags: readonly ["outline", "line art", "technical"];
3097
- readonly cost: "medium";
3098
- readonly defaultSource: "truchet";
4141
+ readonly tags: readonly ["text", "retro", "terminal"];
4142
+ readonly cost: "light";
4143
+ readonly defaultSource: "aurora";
3099
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
+ };
3100
4163
  readonly grain: {
3101
- readonly default: 0.01;
4164
+ readonly default: 0;
3102
4165
  readonly slot: "grain";
3103
4166
  readonly label: "Grain";
3104
4167
  readonly min: 0;
@@ -3107,7 +4170,7 @@ export declare const shaderRegistry: {
3107
4170
  readonly hint: "Per-pixel noise. A little hides banding on flat gradients.";
3108
4171
  };
3109
4172
  readonly vignette: {
3110
- readonly default: 0.2;
4173
+ readonly default: 0.3;
3111
4174
  readonly slot: "vignette";
3112
4175
  readonly label: "Vignette";
3113
4176
  readonly min: 0;
@@ -3115,41 +4178,41 @@ export declare const shaderRegistry: {
3115
4178
  readonly step: 0.01;
3116
4179
  readonly hint: "Darkening towards the edges of the frame.";
3117
4180
  };
3118
- readonly thickness: {
4181
+ readonly cells: {
3119
4182
  readonly slot: "a";
3120
- readonly label: "Thickness";
3121
- readonly min: 0.5;
3122
- readonly max: 6;
3123
- readonly step: 0.1;
3124
- readonly default: 1.5;
3125
- 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.";
3126
4189
  };
3127
- readonly threshold: {
4190
+ readonly contrast: {
3128
4191
  readonly slot: "b";
3129
- readonly label: "Threshold";
3130
- readonly min: 0;
3131
- readonly max: 1;
4192
+ readonly label: "Contrast";
4193
+ readonly min: 0.3;
4194
+ readonly max: 3;
3132
4195
  readonly step: 0.01;
3133
- readonly default: 0.15;
3134
- 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.";
3135
4198
  };
3136
- readonly fill: {
4199
+ readonly colorize: {
3137
4200
  readonly slot: "c";
3138
- readonly label: "Fill";
4201
+ readonly label: "Colorize";
3139
4202
  readonly min: 0;
3140
4203
  readonly max: 1;
3141
4204
  readonly step: 0.01;
3142
4205
  readonly default: 0;
3143
- readonly hint: "How much of the original shows under the lines.";
4206
+ readonly hint: "0 is phosphor, 1 keeps the source's own colours.";
3144
4207
  };
3145
- readonly glow: {
4208
+ readonly scan: {
3146
4209
  readonly slot: "d";
3147
- readonly label: "Glow";
4210
+ readonly label: "Scan";
3148
4211
  readonly min: 0;
3149
- readonly max: 2;
4212
+ readonly max: 1;
3150
4213
  readonly step: 0.01;
3151
4214
  readonly default: 0.4;
3152
- readonly hint: "Bleed off the line, which reads as ink rather than aliasing.";
4215
+ readonly hint: "Scanlines and a slow refresh bar.";
3153
4216
  };
3154
4217
  readonly intensity: {
3155
4218
  readonly slot: "intensity";
@@ -3176,17 +4239,35 @@ export declare const shaderRegistry: {
3176
4239
  readonly colorC: ColorControl;
3177
4240
  };
3178
4241
  };
3179
- readonly mosaic: {
3180
- readonly name: "Mosaic";
3181
- readonly tagline: "The layer rebuilt out of tiles";
3182
- 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.";
3183
- readonly family: "image";
3184
- readonly tags: readonly ["pixelate", "print", "retro"];
3185
- readonly cost: "light";
3186
- 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";
3187
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
+ };
3188
4269
  readonly grain: {
3189
- readonly default: 0;
4270
+ readonly default: 0.02;
3190
4271
  readonly slot: "grain";
3191
4272
  readonly label: "Grain";
3192
4273
  readonly min: 0;
@@ -3195,7 +4276,7 @@ export declare const shaderRegistry: {
3195
4276
  readonly hint: "Per-pixel noise. A little hides banding on flat gradients.";
3196
4277
  };
3197
4278
  readonly vignette: {
3198
- readonly default: 0.2;
4279
+ readonly default: 0.25;
3199
4280
  readonly slot: "vignette";
3200
4281
  readonly label: "Vignette";
3201
4282
  readonly min: 0;
@@ -3203,41 +4284,50 @@ export declare const shaderRegistry: {
3203
4284
  readonly step: 0.01;
3204
4285
  readonly hint: "Darkening towards the edges of the frame.";
3205
4286
  };
3206
- readonly tiles: {
3207
- readonly slot: "a";
3208
- readonly label: "Tiles";
3209
- readonly min: 4;
3210
- readonly max: 160;
3211
- readonly step: 1;
3212
- readonly default: 42;
3213
- 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;
3214
4295
  };
3215
- readonly roundness: {
3216
- readonly slot: "b";
3217
- readonly label: "Roundness";
4296
+ readonly progress: {
4297
+ readonly slot: "a";
4298
+ readonly label: "Progress";
3218
4299
  readonly min: 0;
3219
4300
  readonly max: 1;
3220
4301
  readonly step: 0.01;
3221
4302
  readonly default: 0;
3222
- 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.";
3223
4304
  };
3224
- 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: {
3225
4315
  readonly slot: "c";
3226
- readonly label: "Gap";
4316
+ readonly label: "Spin";
3227
4317
  readonly min: 0;
3228
- readonly max: 0.45;
4318
+ readonly max: 2;
3229
4319
  readonly step: 0.01;
3230
- readonly default: 0.02;
3231
- readonly hint: "Ground left showing between tiles.";
4320
+ readonly default: 0.8;
4321
+ readonly hint: "How much each shard rotates as it flies.";
3232
4322
  };
3233
- readonly steps: {
4323
+ readonly glint: {
3234
4324
  readonly slot: "d";
3235
- readonly label: "Colour steps";
3236
- readonly min: 2;
3237
- readonly max: 32;
3238
- readonly step: 1;
3239
- readonly default: 12;
3240
- 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.";
3241
4331
  };
3242
4332
  readonly intensity: {
3243
4333
  readonly slot: "intensity";
@@ -3264,17 +4354,17 @@ export declare const shaderRegistry: {
3264
4354
  readonly colorC: ColorControl;
3265
4355
  };
3266
4356
  };
3267
- readonly reveal: {
3268
- readonly name: "Reveal";
3269
- readonly tagline: "The layer wiped in over a colour ground";
3270
- 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.";
3271
- readonly family: "transition";
3272
- readonly tags: readonly ["wipe", "dissolve", "entrance"];
3273
- readonly cost: "light";
3274
- 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";
3275
4365
  readonly controls: {
3276
4366
  readonly speed: {
3277
- readonly default: 0.6;
4367
+ readonly default: 1;
3278
4368
  readonly max: 2;
3279
4369
  readonly slot: "speed";
3280
4370
  readonly label: "Speed";
@@ -3301,7 +4391,7 @@ export declare const shaderRegistry: {
3301
4391
  readonly hint: "Per-pixel noise. A little hides banding on flat gradients.";
3302
4392
  };
3303
4393
  readonly vignette: {
3304
- readonly default: 0.2;
4394
+ readonly default: 0.25;
3305
4395
  readonly slot: "vignette";
3306
4396
  readonly label: "Vignette";
3307
4397
  readonly min: 0;
@@ -3310,49 +4400,49 @@ export declare const shaderRegistry: {
3310
4400
  readonly hint: "Darkening towards the edges of the frame.";
3311
4401
  };
3312
4402
  readonly warp: {
3313
- readonly label: "Edge glow";
4403
+ readonly label: "Wobble";
3314
4404
  readonly min: 0;
3315
4405
  readonly max: 2;
3316
- readonly default: 0.6;
3317
- 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.";
3318
4408
  readonly slot: "warp";
3319
4409
  readonly step: 0.01;
3320
4410
  };
3321
- readonly progress: {
4411
+ readonly heat: {
3322
4412
  readonly slot: "a";
3323
- readonly label: "Progress";
4413
+ readonly label: "Heat";
3324
4414
  readonly min: 0;
3325
- readonly max: 1;
4415
+ readonly max: 2;
3326
4416
  readonly step: 0.01;
3327
- readonly default: 0;
3328
- 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.";
3329
4419
  };
3330
- readonly shape: {
4420
+ readonly drips: {
3331
4421
  readonly slot: "b";
3332
- readonly label: "Shape";
3333
- readonly min: 0;
3334
- readonly max: 1;
4422
+ readonly label: "Drips";
4423
+ readonly min: 0.2;
4424
+ readonly max: 3;
3335
4425
  readonly step: 0.01;
3336
- readonly default: 0.35;
3337
- 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.";
3338
4428
  };
3339
- readonly angle: {
4429
+ readonly streaks: {
3340
4430
  readonly slot: "c";
3341
- readonly label: "Angle";
4431
+ readonly label: "Streaks";
3342
4432
  readonly min: 0;
3343
4433
  readonly max: 1;
3344
4434
  readonly step: 0.01;
3345
- readonly default: 0;
3346
- 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.";
3347
4437
  };
3348
- readonly softness: {
4438
+ readonly torch: {
3349
4439
  readonly slot: "d";
3350
- readonly label: "Softness";
3351
- readonly min: 0.001;
3352
- readonly max: 0.4;
3353
- readonly step: 0.001;
3354
- readonly default: 0.08;
3355
- 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.";
3356
4446
  };
3357
4447
  readonly intensity: {
3358
4448
  readonly slot: "intensity";