@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.
Files changed (288) hide show
  1. package/dist/accordion.d.ts +24 -8
  2. package/dist/accordion.d.ts.map +1 -0
  3. package/dist/accordion.js +50 -73
  4. package/dist/accordion.js.map +1 -1
  5. package/dist/action-bar.d.ts +83 -0
  6. package/dist/action-bar.d.ts.map +1 -0
  7. package/dist/action-bar.js +264 -0
  8. package/dist/action-bar.js.map +1 -0
  9. package/dist/alert-dialog.d.ts +56 -21
  10. package/dist/alert-dialog.d.ts.map +1 -0
  11. package/dist/alert-dialog.js +75 -127
  12. package/dist/alert-dialog.js.map +1 -1
  13. package/dist/alert.d.ts +26 -11
  14. package/dist/alert.d.ts.map +1 -0
  15. package/dist/alert.js +37 -68
  16. package/dist/alert.js.map +1 -1
  17. package/dist/animate.d.ts +117 -75
  18. package/dist/animate.d.ts.map +1 -0
  19. package/dist/animate.js +259 -223
  20. package/dist/animate.js.map +1 -1
  21. package/dist/aspect-ratio.d.ts +11 -6
  22. package/dist/aspect-ratio.d.ts.map +1 -0
  23. package/dist/aspect-ratio.js +12 -14
  24. package/dist/aspect-ratio.js.map +1 -1
  25. package/dist/autocomplete.d.ts +91 -25
  26. package/dist/autocomplete.d.ts.map +1 -0
  27. package/dist/autocomplete.js +119 -181
  28. package/dist/autocomplete.js.map +1 -1
  29. package/dist/avatar.d.ts +32 -11
  30. package/dist/avatar.d.ts.map +1 -0
  31. package/dist/avatar.js +42 -89
  32. package/dist/avatar.js.map +1 -1
  33. package/dist/badge.d.ts +15 -8
  34. package/dist/badge.d.ts.map +1 -0
  35. package/dist/badge.js +34 -48
  36. package/dist/badge.js.map +1 -1
  37. package/dist/breadcrumb.d.ts +35 -11
  38. package/dist/breadcrumb.d.ts.map +1 -0
  39. package/dist/breadcrumb.js +60 -110
  40. package/dist/breadcrumb.js.map +1 -1
  41. package/dist/button-group.d.ts +26 -13
  42. package/dist/button-group.d.ts.map +1 -0
  43. package/dist/button-group.js +38 -76
  44. package/dist/button-group.js.map +1 -1
  45. package/dist/button.d.ts +17 -10
  46. package/dist/button.d.ts.map +1 -0
  47. package/dist/button.js +50 -3
  48. package/dist/button.js.map +1 -1
  49. package/dist/card.d.ts +35 -11
  50. package/dist/card.d.ts.map +1 -0
  51. package/dist/card.js +43 -82
  52. package/dist/card.js.map +1 -1
  53. package/dist/checkbox.d.ts +6 -4
  54. package/dist/checkbox.d.ts.map +1 -0
  55. package/dist/checkbox.js +21 -29
  56. package/dist/checkbox.js.map +1 -1
  57. package/dist/collapsible.d.ts +15 -7
  58. package/dist/collapsible.d.ts.map +1 -0
  59. package/dist/collapsible.js +19 -8
  60. package/dist/collapsible.js.map +1 -1
  61. package/dist/combobox.d.ts +83 -23
  62. package/dist/combobox.d.ts.map +1 -0
  63. package/dist/combobox.js +149 -247
  64. package/dist/combobox.js.map +1 -1
  65. package/dist/context-menu.d.ts +80 -26
  66. package/dist/context-menu.d.ts.map +1 -0
  67. package/dist/context-menu.js +108 -164
  68. package/dist/context-menu.js.map +1 -1
  69. package/dist/count.d.ts +45 -31
  70. package/dist/count.d.ts.map +1 -0
  71. package/dist/count.js +170 -165
  72. package/dist/count.js.map +1 -1
  73. package/dist/dialog.d.ts +61 -28
  74. package/dist/dialog.d.ts.map +1 -0
  75. package/dist/dialog.js +77 -120
  76. package/dist/dialog.js.map +1 -1
  77. package/dist/direction.d.ts +2 -1
  78. package/dist/direction.js +3 -3
  79. package/dist/drawer.d.ts +45 -15
  80. package/dist/drawer.d.ts.map +1 -0
  81. package/dist/drawer.js +93 -5
  82. package/dist/drawer.js.map +1 -1
  83. package/dist/encrypted-text.d.ts +25 -12
  84. package/dist/encrypted-text.d.ts.map +1 -0
  85. package/dist/encrypted-text.js +102 -134
  86. package/dist/encrypted-text.js.map +1 -1
  87. package/dist/field.d.ts +37 -21
  88. package/dist/field.d.ts.map +1 -0
  89. package/dist/field.js +52 -3
  90. package/dist/field.js.map +1 -1
  91. package/dist/film-grain-shader.d.ts +6 -0
  92. package/dist/film-grain-shader.d.ts.map +1 -0
  93. package/dist/film-grain-shader.js +88 -0
  94. package/dist/film-grain-shader.js.map +1 -0
  95. package/dist/film-grain-webgl.d.ts +20 -0
  96. package/dist/film-grain-webgl.d.ts.map +1 -0
  97. package/dist/film-grain-webgl.js +306 -0
  98. package/dist/film-grain-webgl.js.map +1 -0
  99. package/dist/film-grain.d.ts +21 -11
  100. package/dist/film-grain.d.ts.map +1 -0
  101. package/dist/film-grain.js +28 -420
  102. package/dist/film-grain.js.map +1 -1
  103. package/dist/form.d.ts +64 -49
  104. package/dist/form.d.ts.map +1 -0
  105. package/dist/form.js +112 -91
  106. package/dist/form.js.map +1 -1
  107. package/dist/gradient-reveal-text.d.ts +35 -22
  108. package/dist/gradient-reveal-text.d.ts.map +1 -0
  109. package/dist/gradient-reveal-text.js +238 -205
  110. package/dist/gradient-reveal-text.js.map +1 -1
  111. package/dist/hooks/use-mobile.d.ts +3 -1
  112. package/dist/hooks/use-mobile.d.ts.map +1 -0
  113. package/dist/hooks/use-mobile.js +28 -2
  114. package/dist/hooks/use-mobile.js.map +1 -1
  115. package/dist/infinite-scroll.d.ts +29 -15
  116. package/dist/infinite-scroll.d.ts.map +1 -0
  117. package/dist/infinite-scroll.js +69 -99
  118. package/dist/infinite-scroll.js.map +1 -1
  119. package/dist/input-group.d.ts +41 -18
  120. package/dist/input-group.d.ts.map +1 -0
  121. package/dist/input-group.js +80 -6
  122. package/dist/input-group.js.map +1 -1
  123. package/dist/input-otp.d.ts +26 -10
  124. package/dist/input-otp.d.ts.map +1 -0
  125. package/dist/input-otp.js +40 -70
  126. package/dist/input-otp.js.map +1 -1
  127. package/dist/input.d.ts +10 -4
  128. package/dist/input.d.ts.map +1 -0
  129. package/dist/input.js +16 -3
  130. package/dist/input.js.map +1 -1
  131. package/dist/item.d.ts +58 -23
  132. package/dist/item.d.ts.map +1 -0
  133. package/dist/item.js +102 -160
  134. package/dist/item.js.map +1 -1
  135. package/dist/kbd.d.ts +12 -4
  136. package/dist/kbd.d.ts.map +1 -0
  137. package/dist/kbd.js +15 -24
  138. package/dist/kbd.js.map +1 -1
  139. package/dist/label.d.ts +9 -4
  140. package/dist/label.d.ts.map +1 -0
  141. package/dist/label.js +12 -16
  142. package/dist/label.js.map +1 -1
  143. package/dist/lib/focus.d.ts +42 -0
  144. package/dist/lib/focus.d.ts.map +1 -0
  145. package/dist/lib/focus.js +21 -0
  146. package/dist/lib/focus.js.map +1 -0
  147. package/dist/lib/internal-icons.d.ts +32 -0
  148. package/dist/lib/internal-icons.d.ts.map +1 -0
  149. package/dist/lib/internal-icons.js +222 -0
  150. package/dist/lib/internal-icons.js.map +1 -0
  151. package/dist/lib/utils.d.ts +4 -2
  152. package/dist/lib/utils.d.ts.map +1 -0
  153. package/dist/lib/utils.js +12 -2
  154. package/dist/lib/utils.js.map +1 -1
  155. package/dist/masonry.d.ts +25 -11
  156. package/dist/masonry.d.ts.map +1 -0
  157. package/dist/masonry.js +188 -229
  158. package/dist/masonry.js.map +1 -1
  159. package/dist/menu.d.ts +84 -26
  160. package/dist/menu.d.ts.map +1 -0
  161. package/dist/menu.js +141 -4
  162. package/dist/menu.js.map +1 -1
  163. package/dist/menubar.d.ts +60 -22
  164. package/dist/menubar.d.ts.map +1 -0
  165. package/dist/menubar.js +80 -52
  166. package/dist/menubar.js.map +1 -1
  167. package/dist/pagination.d.ts +38 -17
  168. package/dist/pagination.d.ts.map +1 -0
  169. package/dist/pagination.js +68 -107
  170. package/dist/pagination.js.map +1 -1
  171. package/dist/popover.d.ts +56 -14
  172. package/dist/popover.d.ts.map +1 -0
  173. package/dist/popover.js +62 -87
  174. package/dist/popover.js.map +1 -1
  175. package/dist/preview-card.d.ts +28 -9
  176. package/dist/preview-card.d.ts.map +1 -0
  177. package/dist/preview-card.js +40 -60
  178. package/dist/preview-card.js.map +1 -1
  179. package/dist/progress.d.ts +28 -9
  180. package/dist/progress.d.ts.map +1 -0
  181. package/dist/progress.js +35 -60
  182. package/dist/progress.js.map +1 -1
  183. package/dist/radio-group.d.ts +14 -8
  184. package/dist/radio-group.d.ts.map +1 -0
  185. package/dist/radio-group.js +18 -22
  186. package/dist/radio-group.js.map +1 -1
  187. package/dist/radio.d.ts +14 -6
  188. package/dist/radio.d.ts.map +1 -0
  189. package/dist/radio.js +24 -3
  190. package/dist/radio.js.map +1 -1
  191. package/dist/scroll-area.d.ts +16 -6
  192. package/dist/scroll-area.d.ts.map +1 -0
  193. package/dist/scroll-area.js +34 -55
  194. package/dist/scroll-area.js.map +1 -1
  195. package/dist/select.d.ts +66 -18
  196. package/dist/select.d.ts.map +1 -0
  197. package/dist/select.js +105 -185
  198. package/dist/select.js.map +1 -1
  199. package/dist/separator.d.ts +11 -5
  200. package/dist/separator.d.ts.map +1 -0
  201. package/dist/separator.js +17 -3
  202. package/dist/separator.js.map +1 -1
  203. package/dist/sidebar.d.ts +172 -79
  204. package/dist/sidebar.d.ts.map +1 -0
  205. package/dist/sidebar.js +363 -585
  206. package/dist/sidebar.js.map +1 -1
  207. package/dist/skeleton.d.ts +8 -3
  208. package/dist/skeleton.d.ts.map +1 -0
  209. package/dist/skeleton.js +13 -3
  210. package/dist/skeleton.js.map +1 -1
  211. package/dist/slider.d.ts +16 -6
  212. package/dist/slider.d.ts.map +1 -0
  213. package/dist/slider.js +40 -67
  214. package/dist/slider.js.map +1 -1
  215. package/dist/spinner.d.ts +8 -3
  216. package/dist/spinner.d.ts.map +1 -0
  217. package/dist/spinner.js +15 -4
  218. package/dist/spinner.js.map +1 -1
  219. package/dist/switch.d.ts +12 -6
  220. package/dist/switch.d.ts.map +1 -0
  221. package/dist/switch.js +18 -25
  222. package/dist/switch.js.map +1 -1
  223. package/dist/table.d.ts +37 -11
  224. package/dist/table.d.ts.map +1 -0
  225. package/dist/table.js +51 -88
  226. package/dist/table.js.map +1 -1
  227. package/dist/tabs.d.ts +28 -12
  228. package/dist/tabs.d.ts.map +1 -0
  229. package/dist/tabs.js +40 -74
  230. package/dist/tabs.js.map +1 -1
  231. package/dist/textarea.d.ts +13 -6
  232. package/dist/textarea.d.ts.map +1 -0
  233. package/dist/textarea.js +19 -3
  234. package/dist/textarea.js.map +1 -1
  235. package/dist/toast.d.ts +63 -39
  236. package/dist/toast.d.ts.map +1 -0
  237. package/dist/toast.js +177 -215
  238. package/dist/toast.js.map +1 -1
  239. package/dist/toggle-group.d.ts +26 -12
  240. package/dist/toggle-group.d.ts.map +1 -0
  241. package/dist/toggle-group.js +49 -73
  242. package/dist/toggle-group.js.map +1 -1
  243. package/dist/toggle.d.ts +17 -10
  244. package/dist/toggle.d.ts.map +1 -0
  245. package/dist/toggle.js +38 -3
  246. package/dist/toggle.js.map +1 -1
  247. package/dist/tooltip.d.ts +35 -14
  248. package/dist/tooltip.d.ts.map +1 -0
  249. package/dist/tooltip.js +52 -3
  250. package/dist/tooltip.js.map +1 -1
  251. package/dist/typewriter.d.ts +44 -31
  252. package/dist/typewriter.d.ts.map +1 -0
  253. package/dist/typewriter.js +185 -185
  254. package/dist/typewriter.js.map +1 -1
  255. package/package.json +6 -6
  256. package/dist/chunk-45VQAWIM.js +0 -228
  257. package/dist/chunk-45VQAWIM.js.map +0 -1
  258. package/dist/chunk-6Y7LPQMO.js +0 -11
  259. package/dist/chunk-6Y7LPQMO.js.map +0 -1
  260. package/dist/chunk-76UQO56T.js +0 -19
  261. package/dist/chunk-76UQO56T.js.map +0 -1
  262. package/dist/chunk-7F4MPMLJ.js +0 -17
  263. package/dist/chunk-7F4MPMLJ.js.map +0 -1
  264. package/dist/chunk-BKTJYX4M.js +0 -143
  265. package/dist/chunk-BKTJYX4M.js.map +0 -1
  266. package/dist/chunk-D5XPEJ6T.js +0 -36
  267. package/dist/chunk-D5XPEJ6T.js.map +0 -1
  268. package/dist/chunk-DIGOLJIR.js +0 -105
  269. package/dist/chunk-DIGOLJIR.js.map +0 -1
  270. package/dist/chunk-IQ7YQ5XA.js +0 -141
  271. package/dist/chunk-IQ7YQ5XA.js.map +0 -1
  272. package/dist/chunk-NCHHHWTB.js +0 -85
  273. package/dist/chunk-NCHHHWTB.js.map +0 -1
  274. package/dist/chunk-OUFYQLVN.js +0 -56
  275. package/dist/chunk-OUFYQLVN.js.map +0 -1
  276. package/dist/chunk-QFSEK4M6.js +0 -22
  277. package/dist/chunk-QFSEK4M6.js.map +0 -1
  278. package/dist/chunk-QRW37LRP.js +0 -25
  279. package/dist/chunk-QRW37LRP.js.map +0 -1
  280. package/dist/chunk-RPQHL6C5.js +0 -26
  281. package/dist/chunk-RPQHL6C5.js.map +0 -1
  282. package/dist/chunk-V4ZX4YCP.js +0 -66
  283. package/dist/chunk-V4ZX4YCP.js.map +0 -1
  284. package/dist/chunk-YTSQQTSF.js +0 -44
  285. package/dist/chunk-YTSQQTSF.js.map +0 -1
  286. package/dist/chunk-ZZZH3JGW.js +0 -23
  287. package/dist/chunk-ZZZH3JGW.js.map +0 -1
  288. 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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"}
@@ -1,15 +1,25 @@
1
- import * as react_jsx_runtime from 'react/jsx-runtime';
2
- import * as React from 'react';
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
- density?: number;
6
- opacity?: number;
7
- blendMode?: React.CSSProperties["mixBlendMode"];
8
- fps?: number;
9
- color?: string;
10
- className?: string;
11
- style?: React.CSSProperties;
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({ density, opacity, blendMode, fps, color, className, style, }: FilmGrainProps): react_jsx_runtime.JSX.Element;
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"}