shadertown 0.1.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/LICENSE +21 -0
- package/README.md +20 -0
- package/cli/cli.mjs +341 -0
- package/cli/shadertown.mjs +8 -0
- package/dist/config.d.ts +29 -0
- package/dist/config.d.ts.map +1 -0
- package/dist/config.js +8 -0
- package/dist/config.js.map +1 -0
- package/dist/export.d.ts +30 -0
- package/dist/export.d.ts.map +1 -0
- package/dist/export.js +234 -0
- package/dist/export.js.map +1 -0
- package/dist/generated/sources.d.ts +22 -0
- package/dist/generated/sources.d.ts.map +1 -0
- package/dist/generated/sources.js +24 -0
- package/dist/generated/sources.js.map +1 -0
- package/dist/index.d.ts +13 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +8 -0
- package/dist/index.js.map +1 -0
- package/dist/params.d.ts +24 -0
- package/dist/params.d.ts.map +1 -0
- package/dist/params.js +105 -0
- package/dist/params.js.map +1 -0
- package/dist/react.d.ts +41 -0
- package/dist/react.d.ts.map +1 -0
- package/dist/react.js +127 -0
- package/dist/react.js.map +1 -0
- package/dist/registry.d.ts +1930 -0
- package/dist/registry.d.ts.map +1 -0
- package/dist/registry.js +1067 -0
- package/dist/registry.js.map +1 -0
- package/dist/renderer.d.ts +31 -0
- package/dist/renderer.d.ts.map +1 -0
- package/dist/renderer.js +144 -0
- package/dist/renderer.js.map +1 -0
- package/dist/stage.d.ts +39 -0
- package/dist/stage.d.ts.map +1 -0
- package/dist/stage.js +79 -0
- package/dist/stage.js.map +1 -0
- package/dist/types.d.ts +71 -0
- package/dist/types.d.ts.map +1 -0
- package/dist/types.js +2 -0
- package/dist/types.js.map +1 -0
- package/package.json +85 -0
package/dist/react.js
ADDED
|
@@ -0,0 +1,127 @@
|
|
|
1
|
+
"use client";
|
|
2
|
+
import { Fragment as _Fragment, jsx as _jsx } from "react/jsx-runtime";
|
|
3
|
+
import { useCallback, useEffect, useLayoutEffect, useMemo, useRef, useState, } from "react";
|
|
4
|
+
import { createShaderRenderer } from "./renderer.js";
|
|
5
|
+
const useIsomorphicLayoutEffect = typeof window === "undefined" ? useEffect : useLayoutEffect;
|
|
6
|
+
function usePrefersReducedMotion() {
|
|
7
|
+
const [reduced, setReduced] = useState(false);
|
|
8
|
+
useEffect(() => {
|
|
9
|
+
const query = window.matchMedia("(prefers-reduced-motion: reduce)");
|
|
10
|
+
setReduced(query.matches);
|
|
11
|
+
const onChange = (event) => setReduced(event.matches);
|
|
12
|
+
query.addEventListener("change", onChange);
|
|
13
|
+
return () => query.removeEventListener("change", onChange);
|
|
14
|
+
}, []);
|
|
15
|
+
return reduced;
|
|
16
|
+
}
|
|
17
|
+
/**
|
|
18
|
+
* A canvas running one shadertown shader.
|
|
19
|
+
*
|
|
20
|
+
* The renderer is created once per mount; param changes are pushed through
|
|
21
|
+
* `setParams` rather than by remounting, so dragging a slider never recompiles
|
|
22
|
+
* a pipeline.
|
|
23
|
+
*/
|
|
24
|
+
export function ShaderCanvas({ preset, shader, params, quality, play, className, style, fallback, onStatusChange, trackPointer = false, startTime, "aria-hidden": ariaHidden = true, }) {
|
|
25
|
+
const canvasRef = useRef(null);
|
|
26
|
+
const rendererRef = useRef(null);
|
|
27
|
+
const [status, setStatus] = useState("pending");
|
|
28
|
+
const [hovered, setHovered] = useState(false);
|
|
29
|
+
const [visible, setVisible] = useState(false);
|
|
30
|
+
const reducedMotion = usePrefersReducedMotion();
|
|
31
|
+
const resolvedShader = (shader ?? preset?.shader);
|
|
32
|
+
const resolvedPlay = play ?? preset?.play ?? "visible";
|
|
33
|
+
const resolvedQuality = quality ?? preset?.quality;
|
|
34
|
+
// Merged params are compared by value so an inline object literal in JSX
|
|
35
|
+
// does not restart the renderer on every parent render.
|
|
36
|
+
const mergedParams = useMemo(() => ({ ...(preset?.params ?? {}), ...(params ?? {}) }),
|
|
37
|
+
// eslint-disable-next-line react-hooks/exhaustive-deps
|
|
38
|
+
[JSON.stringify(preset?.params ?? {}), JSON.stringify(params ?? {})]);
|
|
39
|
+
useIsomorphicLayoutEffect(() => {
|
|
40
|
+
const canvas = canvasRef.current;
|
|
41
|
+
if (!canvas || !resolvedShader)
|
|
42
|
+
return;
|
|
43
|
+
const renderer = createShaderRenderer(canvas, {
|
|
44
|
+
shader: resolvedShader,
|
|
45
|
+
params: mergedParams,
|
|
46
|
+
paused: true,
|
|
47
|
+
startTime,
|
|
48
|
+
dpr: resolvedQuality?.dpr,
|
|
49
|
+
fps: resolvedQuality?.fps,
|
|
50
|
+
onStatus: (next) => setStatus(next),
|
|
51
|
+
});
|
|
52
|
+
rendererRef.current = renderer;
|
|
53
|
+
return () => {
|
|
54
|
+
renderer.destroy();
|
|
55
|
+
rendererRef.current = null;
|
|
56
|
+
};
|
|
57
|
+
// eslint-disable-next-line react-hooks/exhaustive-deps
|
|
58
|
+
}, [resolvedShader]);
|
|
59
|
+
useEffect(() => {
|
|
60
|
+
rendererRef.current?.setParams(mergedParams);
|
|
61
|
+
}, [mergedParams]);
|
|
62
|
+
useEffect(() => {
|
|
63
|
+
onStatusChange?.(status);
|
|
64
|
+
}, [status, onStatusChange]);
|
|
65
|
+
// Visibility drives both `play="visible"` and the cost of off-screen cards.
|
|
66
|
+
useEffect(() => {
|
|
67
|
+
const canvas = canvasRef.current;
|
|
68
|
+
if (!canvas)
|
|
69
|
+
return;
|
|
70
|
+
const observer = new IntersectionObserver((entries) => setVisible(entries.some((entry) => entry.isIntersecting)), { rootMargin: "128px" });
|
|
71
|
+
observer.observe(canvas);
|
|
72
|
+
return () => observer.disconnect();
|
|
73
|
+
}, []);
|
|
74
|
+
const shouldAnimate = useMemo(() => {
|
|
75
|
+
if (reducedMotion)
|
|
76
|
+
return false;
|
|
77
|
+
switch (resolvedPlay) {
|
|
78
|
+
case "always":
|
|
79
|
+
return true;
|
|
80
|
+
case "visible":
|
|
81
|
+
return visible;
|
|
82
|
+
case "hover":
|
|
83
|
+
return visible && hovered;
|
|
84
|
+
case "never":
|
|
85
|
+
return false;
|
|
86
|
+
}
|
|
87
|
+
}, [reducedMotion, resolvedPlay, visible, hovered]);
|
|
88
|
+
useEffect(() => {
|
|
89
|
+
rendererRef.current?.setPaused(!shouldAnimate);
|
|
90
|
+
}, [shouldAnimate]);
|
|
91
|
+
const onPointerMove = useCallback((event) => {
|
|
92
|
+
if (!trackPointer)
|
|
93
|
+
return;
|
|
94
|
+
const rect = event.currentTarget.getBoundingClientRect();
|
|
95
|
+
rendererRef.current?.setPointer((event.clientX - rect.left) / Math.max(rect.width, 1), (event.clientY - rect.top) / Math.max(rect.height, 1));
|
|
96
|
+
}, [trackPointer]);
|
|
97
|
+
if (status === "unsupported" && fallback) {
|
|
98
|
+
return _jsx(_Fragment, { children: fallback });
|
|
99
|
+
}
|
|
100
|
+
return (_jsx("canvas", { ref: canvasRef, className: className, style: { display: "block", width: "100%", height: "100%", ...style }, "aria-hidden": ariaHidden, onPointerEnter: () => setHovered(true), onPointerLeave: () => setHovered(false), onPointerMove: onPointerMove }));
|
|
101
|
+
}
|
|
102
|
+
/**
|
|
103
|
+
* Imperative escape hatch: attach a renderer to a canvas you own.
|
|
104
|
+
* Returns the live renderer so you can drive it from animation code.
|
|
105
|
+
*/
|
|
106
|
+
export function useShaderRenderer(canvasRef, config) {
|
|
107
|
+
const [renderer, setRenderer] = useState(null);
|
|
108
|
+
useIsomorphicLayoutEffect(() => {
|
|
109
|
+
const canvas = canvasRef.current;
|
|
110
|
+
if (!canvas)
|
|
111
|
+
return;
|
|
112
|
+
const created = createShaderRenderer(canvas, {
|
|
113
|
+
shader: config.shader,
|
|
114
|
+
params: config.params,
|
|
115
|
+
dpr: config.quality?.dpr,
|
|
116
|
+
fps: config.quality?.fps,
|
|
117
|
+
});
|
|
118
|
+
setRenderer(created);
|
|
119
|
+
return () => {
|
|
120
|
+
created.destroy();
|
|
121
|
+
setRenderer(null);
|
|
122
|
+
};
|
|
123
|
+
// eslint-disable-next-line react-hooks/exhaustive-deps
|
|
124
|
+
}, [config.shader]);
|
|
125
|
+
return renderer;
|
|
126
|
+
}
|
|
127
|
+
//# sourceMappingURL=react.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"react.js","sourceRoot":"","sources":["../src/react.tsx"],"names":[],"mappings":"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"}
|