@waveso/ui 0.0.10 → 0.1.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/accordion.d.ts +24 -8
- package/dist/accordion.d.ts.map +1 -0
- package/dist/accordion.js +50 -73
- package/dist/accordion.js.map +1 -1
- package/dist/action-bar.d.ts +83 -0
- package/dist/action-bar.d.ts.map +1 -0
- package/dist/action-bar.js +264 -0
- package/dist/action-bar.js.map +1 -0
- package/dist/alert-dialog.d.ts +56 -21
- package/dist/alert-dialog.d.ts.map +1 -0
- package/dist/alert-dialog.js +75 -127
- package/dist/alert-dialog.js.map +1 -1
- package/dist/alert.d.ts +26 -11
- package/dist/alert.d.ts.map +1 -0
- package/dist/alert.js +37 -68
- package/dist/alert.js.map +1 -1
- package/dist/animate.d.ts +117 -75
- package/dist/animate.d.ts.map +1 -0
- package/dist/animate.js +259 -223
- package/dist/animate.js.map +1 -1
- package/dist/aspect-ratio.d.ts +11 -6
- package/dist/aspect-ratio.d.ts.map +1 -0
- package/dist/aspect-ratio.js +12 -14
- package/dist/aspect-ratio.js.map +1 -1
- package/dist/autocomplete.d.ts +91 -25
- package/dist/autocomplete.d.ts.map +1 -0
- package/dist/autocomplete.js +119 -181
- package/dist/autocomplete.js.map +1 -1
- package/dist/avatar.d.ts +32 -11
- package/dist/avatar.d.ts.map +1 -0
- package/dist/avatar.js +42 -89
- package/dist/avatar.js.map +1 -1
- package/dist/badge.d.ts +15 -8
- package/dist/badge.d.ts.map +1 -0
- package/dist/badge.js +34 -48
- package/dist/badge.js.map +1 -1
- package/dist/breadcrumb.d.ts +35 -11
- package/dist/breadcrumb.d.ts.map +1 -0
- package/dist/breadcrumb.js +60 -110
- package/dist/breadcrumb.js.map +1 -1
- package/dist/button-group.d.ts +26 -13
- package/dist/button-group.d.ts.map +1 -0
- package/dist/button-group.js +38 -76
- package/dist/button-group.js.map +1 -1
- package/dist/button.d.ts +17 -10
- package/dist/button.d.ts.map +1 -0
- package/dist/button.js +50 -3
- package/dist/button.js.map +1 -1
- package/dist/card.d.ts +35 -11
- package/dist/card.d.ts.map +1 -0
- package/dist/card.js +43 -82
- package/dist/card.js.map +1 -1
- package/dist/checkbox.d.ts +6 -4
- package/dist/checkbox.d.ts.map +1 -0
- package/dist/checkbox.js +21 -29
- package/dist/checkbox.js.map +1 -1
- package/dist/collapsible.d.ts +15 -7
- package/dist/collapsible.d.ts.map +1 -0
- package/dist/collapsible.js +19 -8
- package/dist/collapsible.js.map +1 -1
- package/dist/combobox.d.ts +83 -23
- package/dist/combobox.d.ts.map +1 -0
- package/dist/combobox.js +149 -247
- package/dist/combobox.js.map +1 -1
- package/dist/context-menu.d.ts +80 -26
- package/dist/context-menu.d.ts.map +1 -0
- package/dist/context-menu.js +108 -164
- package/dist/context-menu.js.map +1 -1
- package/dist/count.d.ts +45 -31
- package/dist/count.d.ts.map +1 -0
- package/dist/count.js +170 -165
- package/dist/count.js.map +1 -1
- package/dist/dialog.d.ts +61 -28
- package/dist/dialog.d.ts.map +1 -0
- package/dist/dialog.js +77 -120
- package/dist/dialog.js.map +1 -1
- package/dist/direction.d.ts +2 -1
- package/dist/direction.js +3 -3
- package/dist/drawer.d.ts +45 -15
- package/dist/drawer.d.ts.map +1 -0
- package/dist/drawer.js +93 -5
- package/dist/drawer.js.map +1 -1
- package/dist/encrypted-text.d.ts +25 -12
- package/dist/encrypted-text.d.ts.map +1 -0
- package/dist/encrypted-text.js +102 -134
- package/dist/encrypted-text.js.map +1 -1
- package/dist/field.d.ts +37 -21
- package/dist/field.d.ts.map +1 -0
- package/dist/field.js +52 -3
- package/dist/field.js.map +1 -1
- package/dist/film-grain-shader.d.ts +6 -0
- package/dist/film-grain-shader.d.ts.map +1 -0
- package/dist/film-grain-shader.js +88 -0
- package/dist/film-grain-shader.js.map +1 -0
- package/dist/film-grain-webgl.d.ts +20 -0
- package/dist/film-grain-webgl.d.ts.map +1 -0
- package/dist/film-grain-webgl.js +306 -0
- package/dist/film-grain-webgl.js.map +1 -0
- package/dist/film-grain.d.ts +21 -11
- package/dist/film-grain.d.ts.map +1 -0
- package/dist/film-grain.js +28 -420
- package/dist/film-grain.js.map +1 -1
- package/dist/form.d.ts +64 -49
- package/dist/form.d.ts.map +1 -0
- package/dist/form.js +112 -91
- package/dist/form.js.map +1 -1
- package/dist/gradient-reveal-text.d.ts +35 -22
- package/dist/gradient-reveal-text.d.ts.map +1 -0
- package/dist/gradient-reveal-text.js +238 -205
- package/dist/gradient-reveal-text.js.map +1 -1
- package/dist/hooks/use-mobile.d.ts +3 -1
- package/dist/hooks/use-mobile.d.ts.map +1 -0
- package/dist/hooks/use-mobile.js +28 -2
- package/dist/hooks/use-mobile.js.map +1 -1
- package/dist/infinite-scroll.d.ts +29 -15
- package/dist/infinite-scroll.d.ts.map +1 -0
- package/dist/infinite-scroll.js +69 -99
- package/dist/infinite-scroll.js.map +1 -1
- package/dist/input-group.d.ts +41 -18
- package/dist/input-group.d.ts.map +1 -0
- package/dist/input-group.js +80 -6
- package/dist/input-group.js.map +1 -1
- package/dist/input-otp.d.ts +26 -10
- package/dist/input-otp.d.ts.map +1 -0
- package/dist/input-otp.js +40 -70
- package/dist/input-otp.js.map +1 -1
- package/dist/input.d.ts +10 -4
- package/dist/input.d.ts.map +1 -0
- package/dist/input.js +16 -3
- package/dist/input.js.map +1 -1
- package/dist/item.d.ts +58 -23
- package/dist/item.d.ts.map +1 -0
- package/dist/item.js +102 -160
- package/dist/item.js.map +1 -1
- package/dist/kbd.d.ts +12 -4
- package/dist/kbd.d.ts.map +1 -0
- package/dist/kbd.js +15 -24
- package/dist/kbd.js.map +1 -1
- package/dist/label.d.ts +9 -4
- package/dist/label.d.ts.map +1 -0
- package/dist/label.js +12 -16
- package/dist/label.js.map +1 -1
- package/dist/lib/focus.d.ts +42 -0
- package/dist/lib/focus.d.ts.map +1 -0
- package/dist/lib/focus.js +21 -0
- package/dist/lib/focus.js.map +1 -0
- package/dist/lib/internal-icons.d.ts +32 -0
- package/dist/lib/internal-icons.d.ts.map +1 -0
- package/dist/lib/internal-icons.js +222 -0
- package/dist/lib/internal-icons.js.map +1 -0
- package/dist/lib/utils.d.ts +4 -2
- package/dist/lib/utils.d.ts.map +1 -0
- package/dist/lib/utils.js +12 -2
- package/dist/lib/utils.js.map +1 -1
- package/dist/masonry.d.ts +25 -11
- package/dist/masonry.d.ts.map +1 -0
- package/dist/masonry.js +188 -229
- package/dist/masonry.js.map +1 -1
- package/dist/menu.d.ts +84 -26
- package/dist/menu.d.ts.map +1 -0
- package/dist/menu.js +141 -4
- package/dist/menu.js.map +1 -1
- package/dist/menubar.d.ts +60 -22
- package/dist/menubar.d.ts.map +1 -0
- package/dist/menubar.js +80 -52
- package/dist/menubar.js.map +1 -1
- package/dist/pagination.d.ts +38 -17
- package/dist/pagination.d.ts.map +1 -0
- package/dist/pagination.js +68 -107
- package/dist/pagination.js.map +1 -1
- package/dist/popover.d.ts +56 -14
- package/dist/popover.d.ts.map +1 -0
- package/dist/popover.js +62 -87
- package/dist/popover.js.map +1 -1
- package/dist/preview-card.d.ts +28 -9
- package/dist/preview-card.d.ts.map +1 -0
- package/dist/preview-card.js +40 -60
- package/dist/preview-card.js.map +1 -1
- package/dist/progress.d.ts +28 -9
- package/dist/progress.d.ts.map +1 -0
- package/dist/progress.js +35 -60
- package/dist/progress.js.map +1 -1
- package/dist/radio-group.d.ts +14 -8
- package/dist/radio-group.d.ts.map +1 -0
- package/dist/radio-group.js +18 -22
- package/dist/radio-group.js.map +1 -1
- package/dist/radio.d.ts +14 -6
- package/dist/radio.d.ts.map +1 -0
- package/dist/radio.js +24 -3
- package/dist/radio.js.map +1 -1
- package/dist/scroll-area.d.ts +16 -6
- package/dist/scroll-area.d.ts.map +1 -0
- package/dist/scroll-area.js +34 -55
- package/dist/scroll-area.js.map +1 -1
- package/dist/select.d.ts +66 -18
- package/dist/select.d.ts.map +1 -0
- package/dist/select.js +105 -185
- package/dist/select.js.map +1 -1
- package/dist/separator.d.ts +11 -5
- package/dist/separator.d.ts.map +1 -0
- package/dist/separator.js +17 -3
- package/dist/separator.js.map +1 -1
- package/dist/sidebar.d.ts +172 -79
- package/dist/sidebar.d.ts.map +1 -0
- package/dist/sidebar.js +363 -585
- package/dist/sidebar.js.map +1 -1
- package/dist/skeleton.d.ts +8 -3
- package/dist/skeleton.d.ts.map +1 -0
- package/dist/skeleton.js +13 -3
- package/dist/skeleton.js.map +1 -1
- package/dist/slider.d.ts +16 -6
- package/dist/slider.d.ts.map +1 -0
- package/dist/slider.js +40 -67
- package/dist/slider.js.map +1 -1
- package/dist/spinner.d.ts +8 -3
- package/dist/spinner.d.ts.map +1 -0
- package/dist/spinner.js +15 -4
- package/dist/spinner.js.map +1 -1
- package/dist/switch.d.ts +12 -6
- package/dist/switch.d.ts.map +1 -0
- package/dist/switch.js +18 -25
- package/dist/switch.js.map +1 -1
- package/dist/table.d.ts +37 -11
- package/dist/table.d.ts.map +1 -0
- package/dist/table.js +51 -88
- package/dist/table.js.map +1 -1
- package/dist/tabs.d.ts +28 -12
- package/dist/tabs.d.ts.map +1 -0
- package/dist/tabs.js +40 -74
- package/dist/tabs.js.map +1 -1
- package/dist/textarea.d.ts +13 -6
- package/dist/textarea.d.ts.map +1 -0
- package/dist/textarea.js +19 -3
- package/dist/textarea.js.map +1 -1
- package/dist/toast.d.ts +63 -39
- package/dist/toast.d.ts.map +1 -0
- package/dist/toast.js +177 -215
- package/dist/toast.js.map +1 -1
- package/dist/toggle-group.d.ts +26 -12
- package/dist/toggle-group.d.ts.map +1 -0
- package/dist/toggle-group.js +49 -73
- package/dist/toggle-group.js.map +1 -1
- package/dist/toggle.d.ts +17 -10
- package/dist/toggle.d.ts.map +1 -0
- package/dist/toggle.js +38 -3
- package/dist/toggle.js.map +1 -1
- package/dist/tooltip.d.ts +35 -14
- package/dist/tooltip.d.ts.map +1 -0
- package/dist/tooltip.js +52 -3
- package/dist/tooltip.js.map +1 -1
- package/dist/typewriter.d.ts +44 -31
- package/dist/typewriter.d.ts.map +1 -0
- package/dist/typewriter.js +185 -185
- package/dist/typewriter.js.map +1 -1
- package/package.json +6 -6
- package/dist/chunk-45VQAWIM.js +0 -228
- package/dist/chunk-45VQAWIM.js.map +0 -1
- package/dist/chunk-6Y7LPQMO.js +0 -11
- package/dist/chunk-6Y7LPQMO.js.map +0 -1
- package/dist/chunk-76UQO56T.js +0 -19
- package/dist/chunk-76UQO56T.js.map +0 -1
- package/dist/chunk-7F4MPMLJ.js +0 -17
- package/dist/chunk-7F4MPMLJ.js.map +0 -1
- package/dist/chunk-BKTJYX4M.js +0 -143
- package/dist/chunk-BKTJYX4M.js.map +0 -1
- package/dist/chunk-D5XPEJ6T.js +0 -36
- package/dist/chunk-D5XPEJ6T.js.map +0 -1
- package/dist/chunk-DIGOLJIR.js +0 -105
- package/dist/chunk-DIGOLJIR.js.map +0 -1
- package/dist/chunk-IQ7YQ5XA.js +0 -141
- package/dist/chunk-IQ7YQ5XA.js.map +0 -1
- package/dist/chunk-NCHHHWTB.js +0 -85
- package/dist/chunk-NCHHHWTB.js.map +0 -1
- package/dist/chunk-OUFYQLVN.js +0 -56
- package/dist/chunk-OUFYQLVN.js.map +0 -1
- package/dist/chunk-QFSEK4M6.js +0 -22
- package/dist/chunk-QFSEK4M6.js.map +0 -1
- package/dist/chunk-QRW37LRP.js +0 -25
- package/dist/chunk-QRW37LRP.js.map +0 -1
- package/dist/chunk-RPQHL6C5.js +0 -26
- package/dist/chunk-RPQHL6C5.js.map +0 -1
- package/dist/chunk-V4ZX4YCP.js +0 -66
- package/dist/chunk-V4ZX4YCP.js.map +0 -1
- package/dist/chunk-YTSQQTSF.js +0 -44
- package/dist/chunk-YTSQQTSF.js.map +0 -1
- package/dist/chunk-ZZZH3JGW.js +0 -23
- package/dist/chunk-ZZZH3JGW.js.map +0 -1
- package/dist/direction.js.map +0 -1
|
@@ -0,0 +1,306 @@
|
|
|
1
|
+
import { fragmentShader, vertexShader } from "./film-grain-shader.js";
|
|
2
|
+
import { useEffect, useMemo, useRef } from "react";
|
|
3
|
+
//#region src/film-grain-webgl.ts
|
|
4
|
+
/** Parse hex color safely */
|
|
5
|
+
function parseHex(hex) {
|
|
6
|
+
if (!/^#([0-9a-f]{3,8})$/i.test(hex)) return [
|
|
7
|
+
255,
|
|
8
|
+
255,
|
|
9
|
+
255,
|
|
10
|
+
255
|
|
11
|
+
];
|
|
12
|
+
let h = hex.replace("#", "");
|
|
13
|
+
if (h.length === 3) h = h.split("").map((c) => c + c).join("");
|
|
14
|
+
if (h.length === 6) h += "ff";
|
|
15
|
+
const n = parseInt(h, 16);
|
|
16
|
+
return [
|
|
17
|
+
n >> 24 & 255,
|
|
18
|
+
n >> 16 & 255,
|
|
19
|
+
n >> 8 & 255,
|
|
20
|
+
n & 255
|
|
21
|
+
];
|
|
22
|
+
}
|
|
23
|
+
function initWebGL(gl) {
|
|
24
|
+
const createShader = (type, source) => {
|
|
25
|
+
const shader = gl.createShader(type);
|
|
26
|
+
if (!shader) return null;
|
|
27
|
+
gl.shaderSource(shader, source);
|
|
28
|
+
gl.compileShader(shader);
|
|
29
|
+
if (!gl.getShaderParameter(shader, gl.COMPILE_STATUS)) {
|
|
30
|
+
gl.deleteShader(shader);
|
|
31
|
+
return null;
|
|
32
|
+
}
|
|
33
|
+
return shader;
|
|
34
|
+
};
|
|
35
|
+
const vs = createShader(gl.VERTEX_SHADER, vertexShader);
|
|
36
|
+
const fs = createShader(gl.FRAGMENT_SHADER, fragmentShader);
|
|
37
|
+
if (!vs || !fs) return null;
|
|
38
|
+
const program = gl.createProgram();
|
|
39
|
+
if (!program) return null;
|
|
40
|
+
gl.attachShader(program, vs);
|
|
41
|
+
gl.attachShader(program, fs);
|
|
42
|
+
gl.linkProgram(program);
|
|
43
|
+
if (!gl.getProgramParameter(program, gl.LINK_STATUS)) {
|
|
44
|
+
gl.deleteProgram(program);
|
|
45
|
+
return null;
|
|
46
|
+
}
|
|
47
|
+
gl.useProgram(program);
|
|
48
|
+
const buffer = gl.createBuffer();
|
|
49
|
+
gl.bindBuffer(gl.ARRAY_BUFFER, buffer);
|
|
50
|
+
gl.bufferData(gl.ARRAY_BUFFER, new Float32Array([
|
|
51
|
+
-1,
|
|
52
|
+
-1,
|
|
53
|
+
1,
|
|
54
|
+
-1,
|
|
55
|
+
-1,
|
|
56
|
+
1,
|
|
57
|
+
1,
|
|
58
|
+
1
|
|
59
|
+
]), gl.STATIC_DRAW);
|
|
60
|
+
const position = gl.getAttribLocation(program, "position");
|
|
61
|
+
gl.enableVertexAttribArray(position);
|
|
62
|
+
gl.vertexAttribPointer(position, 2, gl.FLOAT, false, 0, 0);
|
|
63
|
+
return {
|
|
64
|
+
uTime: gl.getUniformLocation(program, "uTime"),
|
|
65
|
+
uResolution: gl.getUniformLocation(program, "uResolution"),
|
|
66
|
+
uDensity: gl.getUniformLocation(program, "uDensity"),
|
|
67
|
+
uOpacity: gl.getUniformLocation(program, "uOpacity"),
|
|
68
|
+
uFps: gl.getUniformLocation(program, "uFps"),
|
|
69
|
+
uColor: gl.getUniformLocation(program, "uColor"),
|
|
70
|
+
program,
|
|
71
|
+
vs,
|
|
72
|
+
fs,
|
|
73
|
+
buffer
|
|
74
|
+
};
|
|
75
|
+
}
|
|
76
|
+
/** Safe uniform setters */
|
|
77
|
+
function setUniform1f(gl, loc, val) {
|
|
78
|
+
if (loc) gl.uniform1f(loc, val);
|
|
79
|
+
}
|
|
80
|
+
function setUniform2f(gl, loc, x, y) {
|
|
81
|
+
if (loc) gl.uniform2f(loc, x, y);
|
|
82
|
+
}
|
|
83
|
+
function setUniform3f(gl, loc, x, y, z) {
|
|
84
|
+
if (loc) gl.uniform3f(loc, x, y, z);
|
|
85
|
+
}
|
|
86
|
+
function generateGrainTexture(width, height, density, color) {
|
|
87
|
+
const offscreen = document.createElement("canvas");
|
|
88
|
+
offscreen.width = width;
|
|
89
|
+
offscreen.height = height;
|
|
90
|
+
const ctx = offscreen.getContext("2d");
|
|
91
|
+
if (!ctx) return offscreen;
|
|
92
|
+
const [r, g, b, a] = parseHex(color);
|
|
93
|
+
const imageData = ctx.createImageData(width, height);
|
|
94
|
+
const pixels = new Uint32Array(imageData.data.buffer);
|
|
95
|
+
for (let i = 0; i < pixels.length; i++) if (Math.random() < density) pixels[i] = (Math.round(a * (.4 + Math.random() * .6)) << 24 | b << 16 | g << 8 | r) >>> 0;
|
|
96
|
+
ctx.putImageData(imageData, 0, 0);
|
|
97
|
+
return offscreen;
|
|
98
|
+
}
|
|
99
|
+
function useFilmGrain({ density, opacity, fps = 18, color = "#ffffff" }) {
|
|
100
|
+
const canvasRef = useRef(null);
|
|
101
|
+
const rafRef = useRef(0);
|
|
102
|
+
const visibleRef = useRef(true);
|
|
103
|
+
const grainTextureRef = useRef(null);
|
|
104
|
+
const resizeTimerRef = useRef(null);
|
|
105
|
+
const interval = useMemo(() => 1e3 / fps, [fps]);
|
|
106
|
+
useEffect(() => {
|
|
107
|
+
const canvas = canvasRef.current;
|
|
108
|
+
if (!canvas) return;
|
|
109
|
+
const container = canvas.parentElement;
|
|
110
|
+
if (!container) return;
|
|
111
|
+
const prefersReducedMotion = window.matchMedia("(prefers-reduced-motion: reduce)").matches;
|
|
112
|
+
const intersectionObs = new IntersectionObserver((entries) => {
|
|
113
|
+
const entry = entries[0];
|
|
114
|
+
if (entry) visibleRef.current = entry.isIntersecting;
|
|
115
|
+
}, { threshold: .01 });
|
|
116
|
+
intersectionObs.observe(container);
|
|
117
|
+
const getDimensions = () => {
|
|
118
|
+
const dpr = window.devicePixelRatio || 1;
|
|
119
|
+
return {
|
|
120
|
+
w: Math.round(canvas.clientWidth * dpr),
|
|
121
|
+
h: Math.round(canvas.clientHeight * dpr),
|
|
122
|
+
dpr
|
|
123
|
+
};
|
|
124
|
+
};
|
|
125
|
+
const gl = canvas.getContext("webgl") || canvas.getContext("experimental-webgl");
|
|
126
|
+
const uniforms = gl ? initWebGL(gl) : null;
|
|
127
|
+
if (gl && uniforms) {
|
|
128
|
+
let contextLost = false;
|
|
129
|
+
const [cr, cg, cb] = parseHex(color);
|
|
130
|
+
const setUniforms = () => {
|
|
131
|
+
setUniform1f(gl, uniforms.uDensity, density);
|
|
132
|
+
setUniform1f(gl, uniforms.uOpacity, opacity);
|
|
133
|
+
setUniform1f(gl, uniforms.uFps, fps);
|
|
134
|
+
setUniform3f(gl, uniforms.uColor, cr / 255, cg / 255, cb / 255);
|
|
135
|
+
};
|
|
136
|
+
const onContextLost = (e) => {
|
|
137
|
+
e.preventDefault();
|
|
138
|
+
contextLost = true;
|
|
139
|
+
cancelAnimationFrame(rafRef.current);
|
|
140
|
+
};
|
|
141
|
+
const onContextRestored = () => {
|
|
142
|
+
contextLost = false;
|
|
143
|
+
const newUniforms = initWebGL(gl);
|
|
144
|
+
if (newUniforms) {
|
|
145
|
+
uniforms.uTime = newUniforms.uTime;
|
|
146
|
+
uniforms.uResolution = newUniforms.uResolution;
|
|
147
|
+
uniforms.uDensity = newUniforms.uDensity;
|
|
148
|
+
uniforms.uOpacity = newUniforms.uOpacity;
|
|
149
|
+
uniforms.uFps = newUniforms.uFps;
|
|
150
|
+
uniforms.uColor = newUniforms.uColor;
|
|
151
|
+
uniforms.program = newUniforms.program;
|
|
152
|
+
uniforms.vs = newUniforms.vs;
|
|
153
|
+
uniforms.fs = newUniforms.fs;
|
|
154
|
+
uniforms.buffer = newUniforms.buffer;
|
|
155
|
+
resize();
|
|
156
|
+
setUniforms();
|
|
157
|
+
if (!prefersReducedMotion) rafRef.current = requestAnimationFrame(render);
|
|
158
|
+
}
|
|
159
|
+
};
|
|
160
|
+
canvas.addEventListener("webglcontextlost", onContextLost);
|
|
161
|
+
canvas.addEventListener("webglcontextrestored", onContextRestored);
|
|
162
|
+
const resize = () => {
|
|
163
|
+
const { w, h } = getDimensions();
|
|
164
|
+
if (w === 0 || h === 0) return;
|
|
165
|
+
canvas.width = w;
|
|
166
|
+
canvas.height = h;
|
|
167
|
+
gl.viewport(0, 0, w, h);
|
|
168
|
+
setUniform2f(gl, uniforms.uResolution, w, h);
|
|
169
|
+
};
|
|
170
|
+
resize();
|
|
171
|
+
setUniforms();
|
|
172
|
+
gl.clearColor(0, 0, 0, 0);
|
|
173
|
+
const start = performance.now();
|
|
174
|
+
let lastSeed = -1;
|
|
175
|
+
const render = (now) => {
|
|
176
|
+
if (contextLost) return;
|
|
177
|
+
if (!document.hidden && visibleRef.current && canvas.width > 0 && canvas.height > 0) {
|
|
178
|
+
const time = (now - start) / 1e3;
|
|
179
|
+
const seed = Math.floor(time * fps);
|
|
180
|
+
if (seed !== lastSeed) {
|
|
181
|
+
lastSeed = seed;
|
|
182
|
+
gl.clear(gl.COLOR_BUFFER_BIT);
|
|
183
|
+
setUniform1f(gl, uniforms.uTime, time);
|
|
184
|
+
gl.drawArrays(gl.TRIANGLE_STRIP, 0, 4);
|
|
185
|
+
}
|
|
186
|
+
}
|
|
187
|
+
rafRef.current = requestAnimationFrame(render);
|
|
188
|
+
};
|
|
189
|
+
if (prefersReducedMotion) {
|
|
190
|
+
setUniform1f(gl, uniforms.uTime, 0);
|
|
191
|
+
gl.clear(gl.COLOR_BUFFER_BIT);
|
|
192
|
+
gl.drawArrays(gl.TRIANGLE_STRIP, 0, 4);
|
|
193
|
+
} else rafRef.current = requestAnimationFrame(render);
|
|
194
|
+
const onResize = () => {
|
|
195
|
+
if (resizeTimerRef.current) clearTimeout(resizeTimerRef.current);
|
|
196
|
+
resizeTimerRef.current = setTimeout(resize, 150);
|
|
197
|
+
};
|
|
198
|
+
window.addEventListener("resize", onResize);
|
|
199
|
+
return () => {
|
|
200
|
+
cancelAnimationFrame(rafRef.current);
|
|
201
|
+
if (resizeTimerRef.current) clearTimeout(resizeTimerRef.current);
|
|
202
|
+
window.removeEventListener("resize", onResize);
|
|
203
|
+
canvas.removeEventListener("webglcontextlost", onContextLost);
|
|
204
|
+
canvas.removeEventListener("webglcontextrestored", onContextRestored);
|
|
205
|
+
intersectionObs.disconnect();
|
|
206
|
+
gl.deleteBuffer(uniforms.buffer);
|
|
207
|
+
gl.deleteShader(uniforms.vs);
|
|
208
|
+
gl.deleteShader(uniforms.fs);
|
|
209
|
+
gl.deleteProgram(uniforms.program);
|
|
210
|
+
};
|
|
211
|
+
}
|
|
212
|
+
const ctx = canvas.getContext("2d");
|
|
213
|
+
if (!ctx) {
|
|
214
|
+
intersectionObs.disconnect();
|
|
215
|
+
return;
|
|
216
|
+
}
|
|
217
|
+
const padFactor = .3;
|
|
218
|
+
const getPad = (w, h) => Math.round(Math.max(w, h) * padFactor);
|
|
219
|
+
const setup = () => {
|
|
220
|
+
const { w, h } = getDimensions();
|
|
221
|
+
if (w === 0 || h === 0) return {
|
|
222
|
+
w: 0,
|
|
223
|
+
h: 0,
|
|
224
|
+
pad: 0
|
|
225
|
+
};
|
|
226
|
+
const pad = getPad(w, h);
|
|
227
|
+
canvas.width = w;
|
|
228
|
+
canvas.height = h;
|
|
229
|
+
if (!grainTextureRef.current || grainTextureRef.current.width < w + pad || grainTextureRef.current.height < h + pad) grainTextureRef.current = generateGrainTexture(w + pad, h + pad, density, color);
|
|
230
|
+
return {
|
|
231
|
+
w,
|
|
232
|
+
h,
|
|
233
|
+
pad
|
|
234
|
+
};
|
|
235
|
+
};
|
|
236
|
+
let { w, h, pad } = setup();
|
|
237
|
+
let offsetX = 0;
|
|
238
|
+
let offsetY = 0;
|
|
239
|
+
const drawFrame = () => {
|
|
240
|
+
const grain = grainTextureRef.current;
|
|
241
|
+
if (!grain || w === 0 || h === 0) return;
|
|
242
|
+
const dpr = window.devicePixelRatio || 1;
|
|
243
|
+
ctx.clearRect(0, 0, w, h);
|
|
244
|
+
ctx.filter = `blur(${.3 * dpr}px)`;
|
|
245
|
+
offsetX = (offsetX + .7) % pad;
|
|
246
|
+
offsetY = (offsetY + .5) % pad;
|
|
247
|
+
ctx.drawImage(grain, -offsetX, -offsetY, w + pad, h + pad);
|
|
248
|
+
ctx.filter = "none";
|
|
249
|
+
};
|
|
250
|
+
if (prefersReducedMotion) {
|
|
251
|
+
drawFrame();
|
|
252
|
+
intersectionObs.disconnect();
|
|
253
|
+
grainTextureRef.current = null;
|
|
254
|
+
return;
|
|
255
|
+
}
|
|
256
|
+
let lastFrame = performance.now();
|
|
257
|
+
const tick = (now) => {
|
|
258
|
+
if (!document.hidden && visibleRef.current && w > 0 && h > 0) while (now - lastFrame >= interval) {
|
|
259
|
+
lastFrame += interval;
|
|
260
|
+
drawFrame();
|
|
261
|
+
}
|
|
262
|
+
rafRef.current = requestAnimationFrame(tick);
|
|
263
|
+
};
|
|
264
|
+
rafRef.current = requestAnimationFrame(tick);
|
|
265
|
+
const onResize = () => {
|
|
266
|
+
if (resizeTimerRef.current) clearTimeout(resizeTimerRef.current);
|
|
267
|
+
resizeTimerRef.current = setTimeout(() => {
|
|
268
|
+
const m = getDimensions();
|
|
269
|
+
const newPad = getPad(m.w, m.h);
|
|
270
|
+
if (grainTextureRef.current && grainTextureRef.current.width >= m.w + newPad && grainTextureRef.current.height >= m.h + newPad) {
|
|
271
|
+
w = m.w;
|
|
272
|
+
h = m.h;
|
|
273
|
+
pad = newPad;
|
|
274
|
+
canvas.width = w;
|
|
275
|
+
canvas.height = h;
|
|
276
|
+
return;
|
|
277
|
+
}
|
|
278
|
+
w = m.w;
|
|
279
|
+
h = m.h;
|
|
280
|
+
pad = newPad;
|
|
281
|
+
canvas.width = w;
|
|
282
|
+
canvas.height = h;
|
|
283
|
+
grainTextureRef.current = generateGrainTexture(w + pad, h + pad, density, color);
|
|
284
|
+
}, 150);
|
|
285
|
+
};
|
|
286
|
+
window.addEventListener("resize", onResize);
|
|
287
|
+
return () => {
|
|
288
|
+
cancelAnimationFrame(rafRef.current);
|
|
289
|
+
if (resizeTimerRef.current) clearTimeout(resizeTimerRef.current);
|
|
290
|
+
window.removeEventListener("resize", onResize);
|
|
291
|
+
intersectionObs.disconnect();
|
|
292
|
+
grainTextureRef.current = null;
|
|
293
|
+
};
|
|
294
|
+
}, [
|
|
295
|
+
density,
|
|
296
|
+
opacity,
|
|
297
|
+
fps,
|
|
298
|
+
interval,
|
|
299
|
+
color
|
|
300
|
+
]);
|
|
301
|
+
return canvasRef;
|
|
302
|
+
}
|
|
303
|
+
//#endregion
|
|
304
|
+
export { useFilmGrain };
|
|
305
|
+
|
|
306
|
+
//# sourceMappingURL=film-grain-webgl.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"film-grain-webgl.js","names":[],"sources":["../src/film-grain-webgl.ts"],"sourcesContent":["import { useEffect, useRef, useMemo } from \"react\"\nimport { vertexShader, fragmentShader } from \"./film-grain-shader\"\n\ninterface UseFilmGrainOptions {\n density: number\n opacity: number\n /** Target FPS for both WebGL and canvas fallback. Default 18 */\n fps?: number\n /** Hex color for canvas fallback grain. Default '#ffffff' */\n color?: string\n}\n\n/** Parse hex color safely */\nfunction parseHex(hex: string): [number, number, number, number] {\n if (!/^#([0-9a-f]{3,8})$/i.test(hex)) return [255, 255, 255, 255]\n let h = hex.replace(\"#\", \"\")\n if (h.length === 3) h = h.split(\"\").map((c) => c + c).join(\"\")\n if (h.length === 6) h += \"ff\"\n const n = parseInt(h, 16)\n return [(n >> 24) & 0xff, (n >> 16) & 0xff, (n >> 8) & 0xff, n & 0xff]\n}\n\n// ── WebGL renderer ──────────────────────────────────────────────────\n\ninterface WebGLUniforms {\n uTime: WebGLUniformLocation | null\n uResolution: WebGLUniformLocation | null\n uDensity: WebGLUniformLocation | null\n uOpacity: WebGLUniformLocation | null\n uFps: WebGLUniformLocation | null\n uColor: WebGLUniformLocation | null\n program: WebGLProgram\n vs: WebGLShader\n fs: WebGLShader\n buffer: WebGLBuffer | null\n}\n\nfunction initWebGL(gl: WebGLRenderingContext): WebGLUniforms | null {\n const createShader = (type: number, source: string) => {\n const shader = gl.createShader(type)\n if (!shader) return null\n gl.shaderSource(shader, source)\n gl.compileShader(shader)\n if (!gl.getShaderParameter(shader, gl.COMPILE_STATUS)) {\n gl.deleteShader(shader)\n return null\n }\n return shader\n }\n\n const vs = createShader(gl.VERTEX_SHADER, vertexShader)\n const fs = createShader(gl.FRAGMENT_SHADER, fragmentShader)\n if (!vs || !fs) return null\n\n const program = gl.createProgram()\n if (!program) return null\n\n gl.attachShader(program, vs)\n gl.attachShader(program, fs)\n gl.linkProgram(program)\n\n if (!gl.getProgramParameter(program, gl.LINK_STATUS)) {\n gl.deleteProgram(program)\n return null\n }\n\n gl.useProgram(program)\n\n const buffer = gl.createBuffer()\n gl.bindBuffer(gl.ARRAY_BUFFER, buffer)\n gl.bufferData(\n gl.ARRAY_BUFFER,\n new Float32Array([-1, -1, 1, -1, -1, 1, 1, 1]),\n gl.STATIC_DRAW\n )\n\n const position = gl.getAttribLocation(program, \"position\")\n gl.enableVertexAttribArray(position)\n gl.vertexAttribPointer(position, 2, gl.FLOAT, false, 0, 0)\n\n return {\n uTime: gl.getUniformLocation(program, \"uTime\"),\n uResolution: gl.getUniformLocation(program, \"uResolution\"),\n uDensity: gl.getUniformLocation(program, \"uDensity\"),\n uOpacity: gl.getUniformLocation(program, \"uOpacity\"),\n uFps: gl.getUniformLocation(program, \"uFps\"),\n uColor: gl.getUniformLocation(program, \"uColor\"),\n program,\n vs,\n fs,\n buffer,\n }\n}\n\n/** Safe uniform setters */\nfunction setUniform1f(\n gl: WebGLRenderingContext,\n loc: WebGLUniformLocation | null,\n val: number\n) {\n if (loc) gl.uniform1f(loc, val)\n}\n\nfunction setUniform2f(\n gl: WebGLRenderingContext,\n loc: WebGLUniformLocation | null,\n x: number,\n y: number\n) {\n if (loc) gl.uniform2f(loc, x, y)\n}\n\nfunction setUniform3f(\n gl: WebGLRenderingContext,\n loc: WebGLUniformLocation | null,\n x: number,\n y: number,\n z: number\n) {\n if (loc) gl.uniform3f(loc, x, y, z)\n}\n\n// ── Canvas 2D fallback renderer ─────────────────────────────────────\n\nfunction generateGrainTexture(\n width: number,\n height: number,\n density: number,\n color: string\n): HTMLCanvasElement {\n const offscreen = document.createElement(\"canvas\")\n offscreen.width = width\n offscreen.height = height\n const ctx = offscreen.getContext(\"2d\")\n if (!ctx) return offscreen\n\n const [r, g, b, a] = parseHex(color)\n const imageData = ctx.createImageData(width, height)\n const pixels = new Uint32Array(imageData.data.buffer)\n\n for (let i = 0; i < pixels.length; i++) {\n if (Math.random() < density) {\n const variation = Math.round(a * (0.4 + Math.random() * 0.6))\n pixels[i] = ((variation << 24) | (b << 16) | (g << 8) | r) >>> 0\n }\n }\n\n ctx.putImageData(imageData, 0, 0)\n return offscreen\n}\n\n// ── Hook ────────────────────────────────────────────────────────────\n\nexport function useFilmGrain({\n density,\n opacity,\n fps = 18,\n color = \"#ffffff\",\n}: UseFilmGrainOptions) {\n const canvasRef = useRef<HTMLCanvasElement | null>(null)\n const rafRef = useRef<number>(0)\n const visibleRef = useRef(true)\n const grainTextureRef = useRef<HTMLCanvasElement | null>(null)\n const resizeTimerRef = useRef<ReturnType<typeof setTimeout> | null>(null)\n\n const interval = useMemo(() => 1000 / fps, [fps])\n\n useEffect(() => {\n const canvas = canvasRef.current\n if (!canvas) return\n\n const container = canvas.parentElement\n if (!container) return\n\n const prefersReducedMotion = window.matchMedia(\n \"(prefers-reduced-motion: reduce)\"\n ).matches\n\n // Pause when offscreen\n const intersectionObs = new IntersectionObserver(\n (entries) => {\n const entry = entries[0]\n if (entry) visibleRef.current = entry.isIntersecting\n },\n { threshold: 0.01 }\n )\n intersectionObs.observe(container)\n\n const getDimensions = () => {\n const dpr = window.devicePixelRatio || 1\n return {\n w: Math.round(canvas.clientWidth * dpr),\n h: Math.round(canvas.clientHeight * dpr),\n dpr,\n }\n }\n\n // ── Try WebGL ──\n\n const gl =\n canvas.getContext(\"webgl\") ||\n (canvas.getContext(\"experimental-webgl\") as WebGLRenderingContext | null)\n const uniforms = gl ? initWebGL(gl) : null\n\n if (gl && uniforms) {\n let contextLost = false\n\n const [cr, cg, cb] = parseHex(color)\n const setUniforms = () => {\n setUniform1f(gl, uniforms.uDensity, density)\n setUniform1f(gl, uniforms.uOpacity, opacity)\n setUniform1f(gl, uniforms.uFps, fps)\n setUniform3f(gl, uniforms.uColor, cr / 255, cg / 255, cb / 255)\n }\n\n const onContextLost = (e: Event) => {\n e.preventDefault()\n contextLost = true\n cancelAnimationFrame(rafRef.current)\n }\n\n const onContextRestored = () => {\n contextLost = false\n const newUniforms = initWebGL(gl)\n if (newUniforms) {\n uniforms.uTime = newUniforms.uTime\n uniforms.uResolution = newUniforms.uResolution\n uniforms.uDensity = newUniforms.uDensity\n uniforms.uOpacity = newUniforms.uOpacity\n uniforms.uFps = newUniforms.uFps\n uniforms.uColor = newUniforms.uColor\n uniforms.program = newUniforms.program\n uniforms.vs = newUniforms.vs\n uniforms.fs = newUniforms.fs\n uniforms.buffer = newUniforms.buffer\n resize()\n setUniforms()\n if (!prefersReducedMotion)\n rafRef.current = requestAnimationFrame(render)\n }\n }\n\n canvas.addEventListener(\"webglcontextlost\", onContextLost)\n canvas.addEventListener(\"webglcontextrestored\", onContextRestored)\n\n const resize = () => {\n const { w, h } = getDimensions()\n if (w === 0 || h === 0) return\n canvas.width = w\n canvas.height = h\n gl.viewport(0, 0, w, h)\n setUniform2f(gl, uniforms.uResolution, w, h)\n }\n\n resize()\n setUniforms()\n\n gl.clearColor(0, 0, 0, 0)\n\n const start = performance.now()\n let lastSeed = -1\n\n const render = (now: number) => {\n if (contextLost) return\n\n if (\n !document.hidden &&\n visibleRef.current &&\n canvas.width > 0 &&\n canvas.height > 0\n ) {\n const time = (now - start) / 1000\n\n // Skip draw if grain seed hasn't changed\n const seed = Math.floor(time * fps)\n if (seed !== lastSeed) {\n lastSeed = seed\n gl.clear(gl.COLOR_BUFFER_BIT)\n setUniform1f(gl, uniforms.uTime, time)\n gl.drawArrays(gl.TRIANGLE_STRIP, 0, 4)\n }\n }\n\n rafRef.current = requestAnimationFrame(render)\n }\n\n if (prefersReducedMotion) {\n setUniform1f(gl, uniforms.uTime, 0)\n gl.clear(gl.COLOR_BUFFER_BIT)\n gl.drawArrays(gl.TRIANGLE_STRIP, 0, 4)\n } else {\n rafRef.current = requestAnimationFrame(render)\n }\n\n const onResize = () => {\n if (resizeTimerRef.current) clearTimeout(resizeTimerRef.current)\n resizeTimerRef.current = setTimeout(resize, 150)\n }\n\n window.addEventListener(\"resize\", onResize)\n\n return () => {\n cancelAnimationFrame(rafRef.current)\n if (resizeTimerRef.current) clearTimeout(resizeTimerRef.current)\n window.removeEventListener(\"resize\", onResize)\n canvas.removeEventListener(\"webglcontextlost\", onContextLost)\n canvas.removeEventListener(\"webglcontextrestored\", onContextRestored)\n intersectionObs.disconnect()\n\n gl.deleteBuffer(uniforms.buffer)\n gl.deleteShader(uniforms.vs)\n gl.deleteShader(uniforms.fs)\n gl.deleteProgram(uniforms.program)\n }\n }\n\n // ── Canvas 2D fallback ──\n\n const ctx = canvas.getContext(\"2d\")\n if (!ctx) {\n intersectionObs.disconnect()\n return\n }\n\n const padFactor = 0.3\n const getPad = (w: number, h: number) =>\n Math.round(Math.max(w, h) * padFactor)\n\n const setup = () => {\n const { w, h } = getDimensions()\n if (w === 0 || h === 0) return { w: 0, h: 0, pad: 0 }\n\n const pad = getPad(w, h)\n canvas.width = w\n canvas.height = h\n\n if (\n !grainTextureRef.current ||\n grainTextureRef.current.width < w + pad ||\n grainTextureRef.current.height < h + pad\n ) {\n grainTextureRef.current = generateGrainTexture(\n w + pad,\n h + pad,\n density,\n color\n )\n }\n\n return { w, h, pad }\n }\n\n let { w, h, pad } = setup()\n\n // Drifting offset for temporal coherence (not teleporting)\n let offsetX = 0\n let offsetY = 0\n\n const drawFrame = () => {\n const grain = grainTextureRef.current\n if (!grain || w === 0 || h === 0) return\n\n const dpr = window.devicePixelRatio || 1\n\n ctx.clearRect(0, 0, w, h)\n ctx.filter = `blur(${0.3 * dpr}px)`\n\n offsetX = (offsetX + 0.7) % pad\n offsetY = (offsetY + 0.5) % pad\n\n ctx.drawImage(grain, -offsetX, -offsetY, w + pad, h + pad)\n ctx.filter = \"none\"\n }\n\n if (prefersReducedMotion) {\n drawFrame()\n intersectionObs.disconnect()\n grainTextureRef.current = null\n return\n }\n\n let lastFrame = performance.now()\n\n const tick = (now: number) => {\n if (\n !document.hidden &&\n visibleRef.current &&\n w > 0 &&\n h > 0\n ) {\n while (now - lastFrame >= interval) {\n lastFrame += interval\n drawFrame()\n }\n }\n rafRef.current = requestAnimationFrame(tick)\n }\n\n rafRef.current = requestAnimationFrame(tick)\n\n const onResize = () => {\n if (resizeTimerRef.current) clearTimeout(resizeTimerRef.current)\n resizeTimerRef.current = setTimeout(() => {\n const m = getDimensions()\n const newPad = getPad(m.w, m.h)\n\n if (\n grainTextureRef.current &&\n grainTextureRef.current.width >= m.w + newPad &&\n grainTextureRef.current.height >= m.h + newPad\n ) {\n w = m.w\n h = m.h\n pad = newPad\n canvas.width = w\n canvas.height = h\n return\n }\n\n w = m.w\n h = m.h\n pad = newPad\n canvas.width = w\n canvas.height = h\n grainTextureRef.current = generateGrainTexture(\n w + pad,\n h + pad,\n density,\n color\n )\n }, 150)\n }\n\n window.addEventListener(\"resize\", onResize)\n\n return () => {\n cancelAnimationFrame(rafRef.current)\n if (resizeTimerRef.current) clearTimeout(resizeTimerRef.current)\n window.removeEventListener(\"resize\", onResize)\n intersectionObs.disconnect()\n grainTextureRef.current = null\n }\n }, [density, opacity, fps, interval, color])\n\n return canvasRef\n}\n"],"mappings":"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"}
|
package/dist/film-grain.d.ts
CHANGED
|
@@ -1,15 +1,25 @@
|
|
|
1
|
-
import * as
|
|
2
|
-
import * as
|
|
1
|
+
import * as React from "react";
|
|
2
|
+
import * as _$react_jsx_runtime0 from "react/jsx-runtime";
|
|
3
3
|
|
|
4
|
+
//#region src/film-grain.d.ts
|
|
4
5
|
interface FilmGrainProps {
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
6
|
+
density?: number;
|
|
7
|
+
opacity?: number;
|
|
8
|
+
blendMode?: React.CSSProperties["mixBlendMode"];
|
|
9
|
+
fps?: number;
|
|
10
|
+
color?: string;
|
|
11
|
+
className?: string;
|
|
12
|
+
style?: React.CSSProperties;
|
|
12
13
|
}
|
|
13
|
-
declare function FilmGrain({
|
|
14
|
-
|
|
14
|
+
declare function FilmGrain({
|
|
15
|
+
density,
|
|
16
|
+
opacity,
|
|
17
|
+
blendMode,
|
|
18
|
+
fps,
|
|
19
|
+
color,
|
|
20
|
+
className,
|
|
21
|
+
style
|
|
22
|
+
}: FilmGrainProps): _$react_jsx_runtime0.JSX.Element;
|
|
23
|
+
//#endregion
|
|
15
24
|
export { FilmGrain, type FilmGrainProps };
|
|
25
|
+
//# sourceMappingURL=film-grain.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"film-grain.d.ts","names":[],"sources":["../src/film-grain.tsx"],"mappings":";;;;UAKU,cAAA;EACR,OAAA;EACA,OAAA;EACA,SAAA,GAAY,KAAA,CAAM,aAAA;EAClB,GAAA;EACA,KAAA;EACA,SAAA;EACA,KAAA,GAAQ,KAAA,CAAM,aAAA;AAAA;AAAA,iBAGP,SAAA,CAAA;EACP,OAAA;EACA,OAAA;EACA,SAAA;EACA,GAAA;EACA,KAAA;EACA,SAAA;EACA;AAAA,GACC,cAAA,GAAc,oBAAA,CAAA,GAAA,CAAA,OAAA"}
|