q5-react
Version:
> Minimal React wrapper for [q5](https://github.com/q5js/q5.js) — like p5, but faster ⚡
50 lines (49 loc) • 1.95 kB
JavaScript
import { jsx as m } from "react/jsx-runtime";
import { useRef as u, useMemo as w, useEffect as a } from "react";
import q from "q5";
const C = ({
size: e = 500,
draw: i,
sharedState: l,
children: v
}) => {
const s = u(null), n = u(null), f = u(l), o = u(i), r = w(() => e === "fullscreen" ? [window.innerWidth, window.innerHeight] : typeof e == "number" ? [e, e] : e, [e]);
return a(() => {
const c = document.createElement("style");
return c.textContent = ".q5-canvas-fullscreen{width:100vw;height:100vh;position:fixed;inset:0;z-index:9999;overflow:hidden}.q5-canvas{position:relative}.q5-canvas canvas,.q5-canvas-fullscreen canvas{position:absolute;inset:0}.q5-canvas .q5-canvas-overlay,.q5-canvas-fullscreen .q5-canvas-overlay{position:absolute;inset:0;z-index:10000;user-select:none;pointer-events:none}", document.head.appendChild(c), () => c.remove();
}, []), a(() => {
o.current = i;
}, [i]), a(() => {
f.current = l;
}, [l]), a(() => {
if (n.current && (n.current.remove(), n.current = null), !s.current) return;
const c = setTimeout(() => {
if (n.current || !s.current) return;
const h = (t) => {
t.setup = () => {
t.createCanvas(r[0], r[1]);
}, t.draw = () => {
var d;
(d = o.current) == null || d.call(o, t, f.current ?? {});
}, t.windowResized = () => {
e === "fullscreen" && t.resizeCanvas(t.windowWidth, t.windowHeight);
};
};
n.current = new q(h, s.current);
}, 0);
return () => {
clearTimeout(c), n.current && (n.current.remove(), n.current = null);
};
}, [e, r]), /* @__PURE__ */ m(
"div",
{
ref: s,
className: e === "fullscreen" ? "q5-canvas-fullscreen" : "q5-canvas",
style: { width: r[0], height: r[1] },
children: v && /* @__PURE__ */ m("div", { className: "q5-canvas-overlay", children: v })
}
);
};
export {
C as default
};