react-video-ascii 1.2.0 → 1.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.
package/README.md CHANGED
@@ -1,6 +1,6 @@
1
1
  # react-video-ascii
2
2
 
3
- React component optimized for rendering videos as ASCII using WebGL2.
3
+ React component optimized for rendering videos and images as ASCII using WebGL2.
4
4
 
5
5
  <p align="center">
6
6
  <img width="1512" height="949" alt="demo" src="https://github.com/user-attachments/assets/2b41b0af-e864-430d-ade5-0249335d1aac" />
@@ -22,10 +22,20 @@ import { VideoAscii } from 'react-video-ascii';
22
22
  // Basic usage
23
23
  <VideoAscii src="/video.mp4" />
24
24
 
25
+ // Images work too (detected by extension, or force it with mediaType)
26
+ <VideoAscii src="/photo.jpg" />
27
+ <VideoAscii src="/api/photo?id=1" mediaType="image" />
28
+
25
29
  // Multiple videos (loop sequentially)
26
30
  const sources = ['/video1.mp4', '/video2.mp4'];
27
31
  <VideoAscii src={sources} />
28
32
 
33
+ // Sample an element you already loaded instead of a URL
34
+ // (swap between preloaded elements without any reload)
35
+ const [video, setVideo] = useState<HTMLVideoElement | null>(null);
36
+ <video ref={setVideo} src="/video.mp4" muted playsInline preload="auto" hidden />
37
+ <VideoAscii media={video} />
38
+
29
39
  // With options
30
40
  <VideoAscii
31
41
  src="/video.mp4"
@@ -61,12 +71,16 @@ const sources = ['/video1.mp4', '/video2.mp4'];
61
71
 
62
72
  > **Note 2:** The component fills its parent container. Control size via the parent element or the `className` prop.
63
73
 
74
+ > **Note 3:** With `media`, VideoAscii calls `play()` on a video when it starts sampling it and never pauses it; pausing, muting and loading are up to you. Changing `media` re-initialises the renderer but performs no network load.
75
+
64
76
  ## Props
65
77
 
66
78
  | Prop | Type | Default | Range | Description |
67
79
  |------|------|---------|-------|-------------|
68
- | `src` | `string \| string[]` | — | — | Video source URL(s). Multiple URLs play sequentially. |
69
- | `videoMode` | `boolean` | `false` | — | Show original video colors instead of ASCII. |
80
+ | `src` | `string \| string[]` | — | — | Video or image source URL(s). Multiple video URLs play sequentially. Required unless `media` is given. |
81
+ | `mediaType` | `'auto' \| 'video' \| 'image'` | `'auto'` | — | How to load `src`. `auto` treats common image extensions as images and everything else as video. |
82
+ | `media` | `HTMLVideoElement \| HTMLImageElement \| null` | — | — | A loaded element to sample instead of `src`. Pass `null` while it isn't ready. |
83
+ | `videoMode` | `boolean` | `false` | — | Show original video/image colors instead of ASCII. |
70
84
  | `numColsRaw` | `number` | `250` | `20–350` | Number of character columns. |
71
85
  | `brightnessRaw` | `number` | `1.0` | `0.0–2.0` | Brightness multiplier. |
72
86
  | `saturationRaw` | `number` | `1.0` | `0.0–2.0` | Saturation multiplier. |
@@ -1,3 +1,3 @@
1
1
  import { Props } from '../lib/ascii-props';
2
- declare function VideoAscii({ src, videoMode, numColsRaw, brightnessRaw, saturationRaw, bgOpacityRaw, revealEffect, chars, mouseEffect, clickEffect, charMode, className, cropFocus, maxDpr: maxDprRaw, }: Props): import("react/jsx-runtime").JSX.Element;
2
+ declare function VideoAscii({ src, mediaType, media: mediaProp, videoMode, numColsRaw, brightnessRaw, saturationRaw, bgOpacityRaw, revealEffect, chars, mouseEffect, clickEffect, charMode, className, cropFocus, maxDpr: maxDprRaw, }: Props): import("react/jsx-runtime").JSX.Element;
3
3
  export default VideoAscii;
package/dist/index.d.ts CHANGED
@@ -1,2 +1,2 @@
1
1
  export { default as VideoAscii } from './components/VideoAscii';
2
- export type { Props } from './lib/ascii-props';
2
+ export type { Props, SourceProps, ElementProps, MediaType } from './lib/ascii-props';
@@ -19,8 +19,9 @@ export interface RevealEffectOptions {
19
19
  type?: 'diagonal' | 'radial' | 'random';
20
20
  duration?: number;
21
21
  }
22
- export interface Props {
23
- src: string | string[];
22
+ export type MediaType = 'auto' | 'video' | 'image';
23
+ export declare function resolveMediaType(src: string | string[], mediaType: MediaType): 'video' | 'image';
24
+ interface BaseProps {
24
25
  videoMode?: boolean;
25
26
  numColsRaw?: number;
26
27
  brightnessRaw?: number;
@@ -35,6 +36,17 @@ export interface Props {
35
36
  cropFocus?: 'left' | 'center' | 'right';
36
37
  maxDpr?: number;
37
38
  }
39
+ export interface SourceProps extends BaseProps {
40
+ src: string | string[];
41
+ mediaType?: MediaType;
42
+ media?: undefined;
43
+ }
44
+ export interface ElementProps extends BaseProps {
45
+ media: HTMLVideoElement | HTMLImageElement | null;
46
+ src?: undefined;
47
+ mediaType?: undefined;
48
+ }
49
+ export type Props = SourceProps | ElementProps;
38
50
  export interface ParsedProps {
39
51
  numCols: number;
40
52
  brightness: number;
@@ -63,3 +75,4 @@ export interface ParsedProps {
63
75
  maxDpr: number;
64
76
  }
65
77
  export declare function parseProps(numColsRaw: number, brightnessRaw: number, saturationRaw: number, bgOpacityRaw: number, mouseEffect: boolean | MouseEffectOptions, clickEffect: boolean | ClickEffectOptions, revealEffect: boolean | RevealEffectOptions, maxDprRaw?: number): ParsedProps;
78
+ export {};
@@ -50,16 +50,21 @@ function a(e, t, n) {
50
50
  }
51
51
  //#endregion
52
52
  //#region src/lib/ascii-props.ts
53
- var o = " `.',-_:!;|\"~+^lr[](\\/L)>t<v=Tz?icf1{sIxY*jJno}CZyVwmSXRqM$O%#9&NW0Q@";
54
- function s(e, t, n, r, i, a, o, s) {
55
- let c = !!i, l = typeof i == "object" ? i : {}, u = l.style ?? "brighten", d = c && u !== "scatter", f = c && u === "scatter", p = l.scatterChars ?? "->o", m = l.trailLen ?? 15, h = l.trailDecay ?? 10, g = l.duration ?? 1, _ = l.radius ?? (u === "scatter" ? .05 : .08), v = l.brightness ?? 2, y = !!a, b = typeof a == "object" ? a : {}, x = b.style ?? "ripple", S = y && x !== "spread", C = y && x === "spread", w = b.brightness ?? 1.1, T = b.speed ?? 2, E = b.spreadExpandDuration ?? 1.5, D = b.spreadSpeed ?? 7.5, O = !!o, k = typeof o == "object" ? o : {}, A = k.type ?? "random", j = k.duration ?? .4, M = Math.max(20, Math.min(350, Math.round(e))), N = Math.max(0, Math.min(2, t)), P = Math.max(0, Math.min(2, n)), F = Math.max(0, Math.min(1, r));
53
+ var o = " `.',-_:!;|\"~+^lr[](\\/L)>t<v=Tz?icf1{sIxY*jJno}CZyVwmSXRqM$O%#9&NW0Q@", s = /\.(png|jpe?g|gif|webp|avif|bmp|svg)(?:[?#].*)?$/i;
54
+ function c(e, t) {
55
+ if (t !== "auto") return t;
56
+ let n = Array.isArray(e) ? e[0] : e;
57
+ return s.test(n) ? "image" : "video";
58
+ }
59
+ function l(e, t, n, r, i, a, o, s) {
60
+ let c = !!i, l = typeof i == "object" ? i : {}, u = l.style ?? "brighten", d = c && u !== "scatter", f = c && u === "scatter", p = l.scatterChars ?? "->o", m = l.trailLen ?? 15, h = l.trailDecay ?? 10, g = l.duration ?? 1, _ = l.radius ?? (u === "scatter" ? .05 : .08), v = l.brightness ?? 2, y = !!a, b = typeof a == "object" ? a : {}, x = b.style ?? "ripple", S = y && x !== "spread", C = y && x === "spread", w = b.brightness ?? 1.1, T = b.speed ?? 2, E = b.spreadExpandDuration ?? 1.5, D = b.spreadSpeed ?? 7.5, O = !!o, k = typeof o == "object" ? o : {}, A = k.type ?? "random", j = k.duration ?? .4, ee = Math.max(20, Math.min(350, Math.round(e))), M = Math.max(0, Math.min(2, t)), te = Math.max(0, Math.min(2, n)), ne = Math.max(0, Math.min(1, r));
56
61
  j = Math.max(.1, Math.min(4, j)), m = Math.max(0, Math.min(30, Math.round(m))), h = Math.max(1, Math.min(15, h)), g = Math.max(.1, Math.min(4, g)), _ = Math.max(.03, Math.min(.2, _)), v = Math.max(.2, Math.min(5, v)), w = Math.max(1.05, Math.min(2, w)), T = Math.max(.5, Math.min(4, T)), E = Math.max(.5, Math.min(5, E)), D = Math.max(.5, Math.min(10, D));
57
- let I = s === void 0 ? Infinity : Math.max(1, Math.min(4, s)), L;
58
- return L = O ? A === "diagonal" ? 1 : A === "radial" ? 2 : 3 : 0, {
59
- numCols: M,
60
- brightness: N,
61
- saturation: P,
62
- bgOpacity: F,
62
+ let N = s === void 0 ? Infinity : Math.max(1, Math.min(4, s)), P;
63
+ return P = O ? A === "diagonal" ? 1 : A === "radial" ? 2 : 3 : 0, {
64
+ numCols: ee,
65
+ brightness: M,
66
+ saturation: te,
67
+ bgOpacity: ne,
63
68
  mouseEnabled: c,
64
69
  mouseStyle: u,
65
70
  brightenEnabled: d,
@@ -79,30 +84,30 @@ function s(e, t, n, r, i, a, o, s) {
79
84
  revealEnabled: O,
80
85
  revealType: A,
81
86
  revealDuration: j,
82
- revealEffectFlag: L,
83
- maxDpr: I
87
+ revealEffectFlag: P,
88
+ maxDpr: N
84
89
  };
85
90
  }
86
91
  //#endregion
87
92
  //#region src/lib/webgl-utils.ts
88
- function c(e, t, n) {
93
+ function u(e, t, n) {
89
94
  let r = e.createShader(t);
90
95
  if (!r) throw Error("Failed to create shader");
91
96
  return e.shaderSource(r, n), e.compileShader(r), e.getShaderParameter(r, e.COMPILE_STATUS) ? r : (console.log(e.getShaderInfoLog(r)), e.deleteShader(r), null);
92
97
  }
93
- function l(e, t, n) {
98
+ function d(e, t, n) {
94
99
  let r = e.createProgram();
95
100
  return e.attachShader(r, t), e.attachShader(r, n), e.linkProgram(r), e.getProgramParameter(r, e.LINK_STATUS) ? r : (console.log(e.getProgramInfoLog(r)), e.deleteProgram(r), null);
96
101
  }
97
102
  //#endregion
98
103
  //#region src/shaders/vertex.glsl
99
- var u = "#version 300 es\n\nin vec2 a_position;\n\nvoid main() {\n gl_Position = vec4(a_position, 0.0, 1.0);\n}", d = "#version 300 es\n\nprecision highp float;\nprecision highp usampler2D;\n\nuniform int u_revealEffectFlag;\nuniform bool u_videoMode;\n\nuniform float u_revealProgress;\nuniform float u_brightness;\nuniform float u_saturation;\nuniform float u_bgOpacity;\n\nuniform bool u_mouseEffect;\n#define MOUSE_TRAIL_LEN 30 \nuniform vec2 u_mousePositions[MOUSE_TRAIL_LEN];\nuniform float u_mouseLifeFracs[MOUSE_TRAIL_LEN]; \nuniform float u_mouseRadius;\nuniform float u_mouseBrightness;\n\nuniform bool u_clickEffect;\n#define MAX_RIPPLES 10\nuniform vec2 u_ripplePositions[MAX_RIPPLES];\nuniform float u_rippleRadii[MAX_RIPPLES]; \nuniform float u_rippleBrightnesses[MAX_RIPPLES]; \n\nuniform bool u_scatterEffect;\nuniform usampler2D u_scatterStateTexture; \nuniform sampler2D u_scatterAtlas; \nuniform float u_scatterNumChars;\n\nuniform bool u_spreadEffect;\nuniform usampler2D u_spreadStateTexture;\n\nuniform bool u_shapeMatching;\n\nuniform sampler2D u_texture;\nuniform sampler2D u_atlas;\nuniform usampler2D u_fboTexture;\nuniform vec2 u_resolution;\nuniform vec2 u_cellsize;\nuniform float u_numChars;\nuniform vec2 u_gridSize;\nuniform vec2 u_cropOffset;\nuniform vec2 u_cropScale;\nuniform vec2 u_gridOffset;\n\nout vec4 fragColor;\n\nfloat hash(vec2 p) {\n vec3 p3 = fract(vec3(p.xyx) * 0.1031); \n p3 += dot(p3, p3.yzx + 33.33); \n return fract((p3.x + p3.y) * p3.z); \n}\n\nvec3 rgb2hsl(vec3 c) {\n float maxC = max(c.r, max(c.g, c.b));\n float minC = min(c.r, min(c.g, c.b));\n float l = (maxC + minC) * 0.5;\n float d = maxC - minC;\n float h = 0.0, s = 0.0;\n if (d > 0.0) {\n s = d / (1.0 - abs(2.0 * l - 1.0));\n if (maxC == c.r) h = mod((c.g - c.b) / d, 6.0) / 6.0;\n else if (maxC == c.g) h = ((c.b - c.r) / d + 2.0) / 6.0;\n else h = ((c.r - c.g) / d + 4.0) / 6.0;\n }\n return vec3(h, s, l);\n}\n\nvec3 hsl2rgb(vec3 c) {\n float h = c.x, s = c.y, l = c.z;\n float a = s * (1.0 - abs(2.0 * l - 1.0));\n vec3 rgb = clamp(abs(mod(h * 6.0 + vec3(0.0, 4.0, 2.0), 6.0) - 3.0) - 1.0, 0.0, 1.0);\n return l + a * (rgb - 0.5);\n}\n\nvoid main() {\n vec2 fragCoord = vec2(gl_FragCoord.x, u_resolution.y - gl_FragCoord.y); \n vec2 gridCoord = fragCoord - u_gridOffset;\n vec2 cellCoordF = floor(gridCoord / u_cellsize);\n bool inGrid = all(greaterThanEqual(cellCoordF, vec2(0.0))) && all(lessThan(cellCoordF, u_gridSize));\n vec2 cellCoord = clamp(cellCoordF, vec2(0.0), u_gridSize - 1.0);\n\n if (u_revealEffectFlag == 1) {\n \n float revealThreshold = (cellCoord.x + cellCoord.y) / (u_gridSize.x + u_gridSize.y - 2.0);\n if (revealThreshold > u_revealProgress) {\n fragColor = vec4(0.0, 0.0, 0.0, 1.0);\n return;\n }\n } else if (u_revealEffectFlag == 2) {\n float dist = length(cellCoord / u_gridSize - vec2(0.5));\n float revealThreshold = dist / 0.7071; \n if (revealThreshold > u_revealProgress) {\n fragColor = vec4(0.0, 0.0, 0.0, 1.0);\n return;\n }\n } else if (u_revealEffectFlag == 3) {\n float revealThreshold = hash(cellCoord);\n if (revealThreshold > u_revealProgress) {\n fragColor = vec4(0.0, 0.0, 0.0, 1.0);\n return;\n }\n }\n\n vec2 cellCenter = u_gridOffset + (cellCoord + 0.5) * u_cellsize; \n \n vec2 rawUV = u_videoMode ? (fragCoord / u_resolution) : (cellCenter / u_resolution);\n vec2 sampleUV = u_cropOffset + rawUV * u_cropScale;\n\n vec3 cellColor = texture(u_texture, sampleUV).rgb;\n float luminosity = dot(cellColor, vec3(0.299, 0.587, 0.114)); \n vec3 hsl = rgb2hsl(cellColor);\n hsl.z = clamp(hsl.z * u_brightness, 0.0, 1.0);\n hsl.y = clamp(hsl.y * u_saturation, 0.0, 1.0);\n cellColor = hsl2rgb(hsl);\n\n vec2 withinCellPos = fract(gridCoord / u_cellsize);\n\n \n float glyphMask = 0.0;\n if (!u_videoMode && inGrid) {\n uint charInd;\n if (u_shapeMatching) {\n charInd = texelFetch(u_fboTexture, ivec2(cellCoord), 0).r;\n } else {\n charInd = uint(floor(luminosity * (u_numChars - 1.0)));\n }\n float atlasU = (float(charInd) + withinCellPos.x) / u_numChars;\n float atlasV = withinCellPos.y;\n glyphMask = texture(u_atlas, vec2(atlasU, atlasV)).r;\n }\n\n vec3 bgColor = cellColor * u_bgOpacity;\n\n bool scatterHit = false;\n vec3 scatterColor = vec3(0.0);\n if (u_scatterEffect && inGrid) {\n uint state = texelFetch(u_scatterStateTexture, ivec2(cellCoord), 0).r;\n if (state > 0u) {\n int idx = int(state) - 1;\n float su = (float(idx) + withinCellPos.x) / u_scatterNumChars;\n float mask = texture(u_scatterAtlas, vec2(su, withinCellPos.y)).r;\n \n vec3 scatterBg = u_videoMode ? cellColor : bgColor;\n scatterColor = mix(scatterBg, vec3(1.0), mask);\n scatterHit = true;\n }\n }\n \n if (!scatterHit && u_spreadEffect && inGrid) { \n uint state = texelFetch(u_spreadStateTexture, ivec2(cellCoord), 0).r;\n if (state > 0u) {\n int idx = int(state) - 1;\n float su = (float(idx) + withinCellPos.x) / u_scatterNumChars;\n float mask = texture(u_scatterAtlas, vec2(su, withinCellPos.y)).r;\n vec3 scatterBg = u_videoMode ? cellColor : bgColor;\n scatterColor = mix(scatterBg, vec3(1.0), mask);\n scatterHit = true;\n }\n }\n\n vec3 finalColor;\n if (scatterHit) {\n finalColor = scatterColor;\n } else {\n finalColor = u_videoMode ? cellColor : mix(bgColor, cellColor, glyphMask);\n\n if (u_mouseEffect) {\n bool inside = false;\n for (int i = 0; i < MOUSE_TRAIL_LEN; i++) {\n if (u_mouseLifeFracs[i] <= 0.0) {\n continue;\n }\n float r = u_mouseRadius * u_mouseLifeFracs[i];\n if (distance(cellCenter, u_mousePositions[i]) < r) {\n inside = true;\n break;\n }\n }\n if (inside) {\n finalColor = clamp(finalColor * u_mouseBrightness, 0.0, 1.0);\n }\n }\n\n if (u_clickEffect) {\n float boost = 1.0;\n for (int i = 0; i < MAX_RIPPLES; i++) {\n if (u_rippleBrightnesses[i] <= 1.0) {\n continue;\n }\n if (distance(cellCenter, u_ripplePositions[i]) < u_rippleRadii[i]) {\n boost *= u_rippleBrightnesses[i];\n }\n }\n if (boost > 1.0) {\n finalColor = clamp(finalColor * boost, 0.0, 1.0);\n }\n }\n }\n\n fragColor = vec4(finalColor, 1.0);\n}", f = "#version 300 es\n\nprecision highp float;\nprecision highp usampler2D;\n\nuniform sampler2D u_texture;\nuniform vec2 u_resolution;\nuniform vec2 u_cellsize;\nuniform int u_circleN;\nuniform sampler2D u_charVectors;\nuniform int u_numCharsInt;\nuniform float u_shapeExponent;\nuniform vec2 u_cropOffset;\nuniform vec2 u_cropScale;\nuniform vec2 u_gridOffset;\n\nout uvec4 fragCharInd;\n\nvoid main() {\n \n ivec2 cellCoord = ivec2(floor(gl_FragCoord.xy));\n\n const vec2 CIRCLES[6] = vec2[6](\n vec2(0.25, 0.25), vec2(0.75, 0.25),\n vec2(0.25, 0.50), vec2(0.75, 0.50),\n vec2(0.25, 0.75), vec2(0.75, 0.75)\n );\n vec2 radiusUV = vec2(u_cellsize.x / 5.0) / u_resolution * u_cropScale; \n\n float sv[6];\n for (int ci = 0; ci < 6; ci++) {\n \n vec2 centerUV = u_cropOffset + (u_gridOffset + (vec2(cellCoord) + CIRCLES[ci]) * u_cellsize) / u_resolution * u_cropScale;\n float total = 0.0;\n int count = 0;\n for (int dx = -u_circleN; dx <= u_circleN; dx++) {\n for (int dy = -u_circleN; dy <= u_circleN; dy++) {\n if (dx*dx + dy*dy <= u_circleN*u_circleN) {\n vec2 sampleUV = centerUV + vec2(float(dx), float(dy)) * radiusUV / float(u_circleN);\n vec3 sc = texture(u_texture, sampleUV).rgb;\n total += dot(sc, vec3(0.299, 0.587, 0.114));\n count++;\n }\n }\n }\n \n sv[ci] = count > 0 ? total / float(count) : 0.0;\n }\n\n float maxVal = 0.0;\n for (int d = 0; d < 6; d++) maxVal = max(maxVal, sv[d]);\n if (maxVal > 0.0) {\n for (int d = 0; d < 6; d++) sv[d] = pow(sv[d] / maxVal, u_shapeExponent) * maxVal;\n }\n\n \n uint bestChar = 0u;\n float bestDist = 1e10;\n for (int i = 0; i < u_numCharsInt; i++) {\n vec4 r0 = texelFetch(u_charVectors, ivec2(i, 0), 0);\n vec4 r1 = texelFetch(u_charVectors, ivec2(i, 1), 0);\n float dist = 0.0;\n float diffs[6] = float[6](\n sv[0] - r0.r, sv[1] - r0.g, sv[2] - r0.b, sv[3] - r0.a,\n sv[4] - r1.r, sv[5] - r1.g\n );\n for (int d = 0; d < 6; d++) {\n dist += diffs[d] * diffs[d];\n }\n if (dist < bestDist) { \n bestDist = dist; bestChar = uint(i); \n }\n }\n\n fragCharInd = uvec4(bestChar, 0u, 0u, 0u);\n}";
104
+ var f = "#version 300 es\n\nin vec2 a_position;\n\nvoid main() {\n gl_Position = vec4(a_position, 0.0, 1.0);\n}", p = "#version 300 es\n\nprecision highp float;\nprecision highp usampler2D;\n\nuniform int u_revealEffectFlag;\nuniform bool u_videoMode;\n\nuniform float u_revealProgress;\nuniform float u_brightness;\nuniform float u_saturation;\nuniform float u_bgOpacity;\n\nuniform bool u_mouseEffect;\n#define MOUSE_TRAIL_LEN 30 \nuniform vec2 u_mousePositions[MOUSE_TRAIL_LEN];\nuniform float u_mouseLifeFracs[MOUSE_TRAIL_LEN]; \nuniform float u_mouseRadius;\nuniform float u_mouseBrightness;\n\nuniform bool u_clickEffect;\n#define MAX_RIPPLES 10\nuniform vec2 u_ripplePositions[MAX_RIPPLES];\nuniform float u_rippleRadii[MAX_RIPPLES]; \nuniform float u_rippleBrightnesses[MAX_RIPPLES]; \n\nuniform bool u_scatterEffect;\nuniform usampler2D u_scatterStateTexture; \nuniform sampler2D u_scatterAtlas; \nuniform float u_scatterNumChars;\n\nuniform bool u_spreadEffect;\nuniform usampler2D u_spreadStateTexture;\n\nuniform bool u_shapeMatching;\n\nuniform sampler2D u_texture;\nuniform sampler2D u_atlas;\nuniform usampler2D u_fboTexture;\nuniform vec2 u_resolution;\nuniform vec2 u_cellsize;\nuniform float u_numChars;\nuniform vec2 u_gridSize;\nuniform vec2 u_cropOffset;\nuniform vec2 u_cropScale;\nuniform vec2 u_gridOffset;\n\nout vec4 fragColor;\n\nfloat hash(vec2 p) {\n vec3 p3 = fract(vec3(p.xyx) * 0.1031); \n p3 += dot(p3, p3.yzx + 33.33); \n return fract((p3.x + p3.y) * p3.z); \n}\n\nvec3 rgb2hsl(vec3 c) {\n float maxC = max(c.r, max(c.g, c.b));\n float minC = min(c.r, min(c.g, c.b));\n float l = (maxC + minC) * 0.5;\n float d = maxC - minC;\n float h = 0.0, s = 0.0;\n if (d > 0.0) {\n s = d / (1.0 - abs(2.0 * l - 1.0));\n if (maxC == c.r) h = mod((c.g - c.b) / d, 6.0) / 6.0;\n else if (maxC == c.g) h = ((c.b - c.r) / d + 2.0) / 6.0;\n else h = ((c.r - c.g) / d + 4.0) / 6.0;\n }\n return vec3(h, s, l);\n}\n\nvec3 hsl2rgb(vec3 c) {\n float h = c.x, s = c.y, l = c.z;\n float a = s * (1.0 - abs(2.0 * l - 1.0));\n vec3 rgb = clamp(abs(mod(h * 6.0 + vec3(0.0, 4.0, 2.0), 6.0) - 3.0) - 1.0, 0.0, 1.0);\n return l + a * (rgb - 0.5);\n}\n\nvoid main() {\n vec2 fragCoord = vec2(gl_FragCoord.x, u_resolution.y - gl_FragCoord.y); \n vec2 gridCoord = fragCoord - u_gridOffset;\n vec2 cellCoordF = floor(gridCoord / u_cellsize);\n bool inGrid = all(greaterThanEqual(cellCoordF, vec2(0.0))) && all(lessThan(cellCoordF, u_gridSize));\n vec2 cellCoord = clamp(cellCoordF, vec2(0.0), u_gridSize - 1.0);\n\n if (u_revealEffectFlag == 1) {\n \n float revealThreshold = (cellCoord.x + cellCoord.y) / (u_gridSize.x + u_gridSize.y - 2.0);\n if (revealThreshold > u_revealProgress) {\n fragColor = vec4(0.0, 0.0, 0.0, 1.0);\n return;\n }\n } else if (u_revealEffectFlag == 2) {\n float dist = length(cellCoord / u_gridSize - vec2(0.5));\n float revealThreshold = dist / 0.7071; \n if (revealThreshold > u_revealProgress) {\n fragColor = vec4(0.0, 0.0, 0.0, 1.0);\n return;\n }\n } else if (u_revealEffectFlag == 3) {\n float revealThreshold = hash(cellCoord);\n if (revealThreshold > u_revealProgress) {\n fragColor = vec4(0.0, 0.0, 0.0, 1.0);\n return;\n }\n }\n\n vec2 cellCenter = u_gridOffset + (cellCoord + 0.5) * u_cellsize; \n \n vec2 rawUV = u_videoMode ? (fragCoord / u_resolution) : (cellCenter / u_resolution);\n vec2 sampleUV = u_cropOffset + rawUV * u_cropScale;\n\n vec3 cellColor = texture(u_texture, sampleUV).rgb;\n float luminosity = dot(cellColor, vec3(0.299, 0.587, 0.114)); \n vec3 hsl = rgb2hsl(cellColor);\n hsl.z = clamp(hsl.z * u_brightness, 0.0, 1.0);\n hsl.y = clamp(hsl.y * u_saturation, 0.0, 1.0);\n cellColor = hsl2rgb(hsl);\n\n vec2 withinCellPos = fract(gridCoord / u_cellsize);\n\n \n float glyphMask = 0.0;\n if (!u_videoMode && inGrid) {\n uint charInd;\n if (u_shapeMatching) {\n charInd = texelFetch(u_fboTexture, ivec2(cellCoord), 0).r;\n } else {\n charInd = uint(floor(luminosity * (u_numChars - 1.0)));\n }\n float atlasU = (float(charInd) + withinCellPos.x) / u_numChars;\n float atlasV = withinCellPos.y;\n glyphMask = texture(u_atlas, vec2(atlasU, atlasV)).r;\n }\n\n vec3 bgColor = cellColor * u_bgOpacity;\n\n bool scatterHit = false;\n vec3 scatterColor = vec3(0.0);\n if (u_scatterEffect && inGrid) {\n uint state = texelFetch(u_scatterStateTexture, ivec2(cellCoord), 0).r;\n if (state > 0u) {\n int idx = int(state) - 1;\n float su = (float(idx) + withinCellPos.x) / u_scatterNumChars;\n float mask = texture(u_scatterAtlas, vec2(su, withinCellPos.y)).r;\n \n vec3 scatterBg = u_videoMode ? cellColor : bgColor;\n scatterColor = mix(scatterBg, vec3(1.0), mask);\n scatterHit = true;\n }\n }\n \n if (!scatterHit && u_spreadEffect && inGrid) { \n uint state = texelFetch(u_spreadStateTexture, ivec2(cellCoord), 0).r;\n if (state > 0u) {\n int idx = int(state) - 1;\n float su = (float(idx) + withinCellPos.x) / u_scatterNumChars;\n float mask = texture(u_scatterAtlas, vec2(su, withinCellPos.y)).r;\n vec3 scatterBg = u_videoMode ? cellColor : bgColor;\n scatterColor = mix(scatterBg, vec3(1.0), mask);\n scatterHit = true;\n }\n }\n\n vec3 finalColor;\n if (scatterHit) {\n finalColor = scatterColor;\n } else {\n finalColor = u_videoMode ? cellColor : mix(bgColor, cellColor, glyphMask);\n\n if (u_mouseEffect) {\n bool inside = false;\n for (int i = 0; i < MOUSE_TRAIL_LEN; i++) {\n if (u_mouseLifeFracs[i] <= 0.0) {\n continue;\n }\n float r = u_mouseRadius * u_mouseLifeFracs[i];\n if (distance(cellCenter, u_mousePositions[i]) < r) {\n inside = true;\n break;\n }\n }\n if (inside) {\n finalColor = clamp(finalColor * u_mouseBrightness, 0.0, 1.0);\n }\n }\n\n if (u_clickEffect) {\n float boost = 1.0;\n for (int i = 0; i < MAX_RIPPLES; i++) {\n if (u_rippleBrightnesses[i] <= 1.0) {\n continue;\n }\n if (distance(cellCenter, u_ripplePositions[i]) < u_rippleRadii[i]) {\n boost *= u_rippleBrightnesses[i];\n }\n }\n if (boost > 1.0) {\n finalColor = clamp(finalColor * boost, 0.0, 1.0);\n }\n }\n }\n\n fragColor = vec4(finalColor, 1.0);\n}", m = "#version 300 es\n\nprecision highp float;\nprecision highp usampler2D;\n\nuniform sampler2D u_texture;\nuniform vec2 u_resolution;\nuniform vec2 u_cellsize;\nuniform int u_circleN;\nuniform sampler2D u_charVectors;\nuniform int u_numCharsInt;\nuniform float u_shapeExponent;\nuniform vec2 u_cropOffset;\nuniform vec2 u_cropScale;\nuniform vec2 u_gridOffset;\n\nout uvec4 fragCharInd;\n\nvoid main() {\n \n ivec2 cellCoord = ivec2(floor(gl_FragCoord.xy));\n\n const vec2 CIRCLES[6] = vec2[6](\n vec2(0.25, 0.25), vec2(0.75, 0.25),\n vec2(0.25, 0.50), vec2(0.75, 0.50),\n vec2(0.25, 0.75), vec2(0.75, 0.75)\n );\n vec2 radiusUV = vec2(u_cellsize.x / 5.0) / u_resolution * u_cropScale; \n\n float sv[6];\n for (int ci = 0; ci < 6; ci++) {\n \n vec2 centerUV = u_cropOffset + (u_gridOffset + (vec2(cellCoord) + CIRCLES[ci]) * u_cellsize) / u_resolution * u_cropScale;\n float total = 0.0;\n int count = 0;\n for (int dx = -u_circleN; dx <= u_circleN; dx++) {\n for (int dy = -u_circleN; dy <= u_circleN; dy++) {\n if (dx*dx + dy*dy <= u_circleN*u_circleN) {\n vec2 sampleUV = centerUV + vec2(float(dx), float(dy)) * radiusUV / float(u_circleN);\n vec3 sc = texture(u_texture, sampleUV).rgb;\n total += dot(sc, vec3(0.299, 0.587, 0.114));\n count++;\n }\n }\n }\n \n sv[ci] = count > 0 ? total / float(count) : 0.0;\n }\n\n float maxVal = 0.0;\n for (int d = 0; d < 6; d++) maxVal = max(maxVal, sv[d]);\n if (maxVal > 0.0) {\n for (int d = 0; d < 6; d++) sv[d] = pow(sv[d] / maxVal, u_shapeExponent) * maxVal;\n }\n\n \n uint bestChar = 0u;\n float bestDist = 1e10;\n for (int i = 0; i < u_numCharsInt; i++) {\n vec4 r0 = texelFetch(u_charVectors, ivec2(i, 0), 0);\n vec4 r1 = texelFetch(u_charVectors, ivec2(i, 1), 0);\n float dist = 0.0;\n float diffs[6] = float[6](\n sv[0] - r0.r, sv[1] - r0.g, sv[2] - r0.b, sv[3] - r0.a,\n sv[4] - r1.r, sv[5] - r1.g\n );\n for (int d = 0; d < 6; d++) {\n dist += diffs[d] * diffs[d];\n }\n if (dist < bestDist) { \n bestDist = dist; bestChar = uint(i); \n }\n }\n\n fragCharInd = uvec4(bestChar, 0u, 0u, 0u);\n}";
100
105
  //#endregion
101
106
  //#region src/lib/create-gl-resources.ts
102
- function p(e) {
103
- let t = c(e, e.VERTEX_SHADER, u), n = c(e, e.FRAGMENT_SHADER, d);
107
+ function h(e) {
108
+ let t = u(e, e.VERTEX_SHADER, f), n = u(e, e.FRAGMENT_SHADER, p);
104
109
  if (!t || !n) return null;
105
- let r = l(e, t, n);
110
+ let r = d(e, t, n);
106
111
  if (!r) return null;
107
112
  let i = new Float32Array([
108
113
  1,
@@ -123,17 +128,17 @@ function p(e) {
123
128
  e.vertexAttribPointer(o, 2, e.FLOAT, !1, 0, 0), e.enableVertexAttribArray(o), e.useProgram(r);
124
129
  let s = e.createTexture();
125
130
  e.activeTexture(e.TEXTURE0), e.bindTexture(e.TEXTURE_2D, s), e.texParameteri(e.TEXTURE_2D, e.TEXTURE_WRAP_S, e.CLAMP_TO_EDGE), e.texParameteri(e.TEXTURE_2D, e.TEXTURE_WRAP_T, e.CLAMP_TO_EDGE), e.texParameteri(e.TEXTURE_2D, e.TEXTURE_MIN_FILTER, e.LINEAR), e.texParameteri(e.TEXTURE_2D, e.TEXTURE_MAG_FILTER, e.LINEAR);
126
- let p = e.getUniformLocation(r, "u_texture");
127
- e.uniform1i(p, 0);
128
- let m = e.createTexture();
129
- e.activeTexture(e.TEXTURE1), e.bindTexture(e.TEXTURE_2D, m), e.texParameteri(e.TEXTURE_2D, e.TEXTURE_WRAP_S, e.CLAMP_TO_EDGE), e.texParameteri(e.TEXTURE_2D, e.TEXTURE_WRAP_T, e.CLAMP_TO_EDGE), e.texParameteri(e.TEXTURE_2D, e.TEXTURE_MIN_FILTER, e.NEAREST), e.texParameteri(e.TEXTURE_2D, e.TEXTURE_MAG_FILTER, e.NEAREST);
131
+ let c = e.getUniformLocation(r, "u_texture");
132
+ e.uniform1i(c, 0);
133
+ let l = e.createTexture();
134
+ e.activeTexture(e.TEXTURE1), e.bindTexture(e.TEXTURE_2D, l), e.texParameteri(e.TEXTURE_2D, e.TEXTURE_WRAP_S, e.CLAMP_TO_EDGE), e.texParameteri(e.TEXTURE_2D, e.TEXTURE_WRAP_T, e.CLAMP_TO_EDGE), e.texParameteri(e.TEXTURE_2D, e.TEXTURE_MIN_FILTER, e.NEAREST), e.texParameteri(e.TEXTURE_2D, e.TEXTURE_MAG_FILTER, e.NEAREST);
130
135
  let h = e.getUniformLocation(r, "u_atlas");
131
136
  e.uniform1i(h, 1);
132
137
  let g = e.createTexture();
133
138
  e.activeTexture(e.TEXTURE2), e.bindTexture(e.TEXTURE_2D, g), e.texParameteri(e.TEXTURE_2D, e.TEXTURE_WRAP_S, e.CLAMP_TO_EDGE), e.texParameteri(e.TEXTURE_2D, e.TEXTURE_WRAP_T, e.CLAMP_TO_EDGE), e.texParameteri(e.TEXTURE_2D, e.TEXTURE_MIN_FILTER, e.NEAREST), e.texParameteri(e.TEXTURE_2D, e.TEXTURE_MAG_FILTER, e.NEAREST);
134
- let _ = c(e, e.FRAGMENT_SHADER, f);
139
+ let _ = u(e, e.FRAGMENT_SHADER, m);
135
140
  if (!_) return null;
136
- let v = l(e, t, _);
141
+ let v = d(e, t, _);
137
142
  if (!v) return null;
138
143
  e.useProgram(v), e.uniform1i(e.getUniformLocation(v, "u_texture"), 0), e.uniform1i(e.getUniformLocation(v, "u_charVectors"), 2);
139
144
  let y = e.getUniformLocation(v, "u_resolution"), b = e.getUniformLocation(v, "u_cellsize"), x = e.getUniformLocation(v, "u_circleN"), S = e.getUniformLocation(v, "u_numCharsInt"), C = e.getUniformLocation(v, "u_shapeExponent"), w = e.getUniformLocation(v, "u_cropOffset"), T = e.getUniformLocation(v, "u_cropScale"), E = e.getUniformLocation(v, "u_gridOffset"), D = e.createTexture();
@@ -151,7 +156,7 @@ function p(e) {
151
156
  fragShader: n,
152
157
  pass1FragShader: _,
153
158
  texture: s,
154
- atlasTexture: m,
159
+ atlasTexture: l,
155
160
  charVectorsTexture: g,
156
161
  fboTexture: D,
157
162
  fbo: O,
@@ -196,7 +201,7 @@ function p(e) {
196
201
  }
197
202
  //#endregion
198
203
  //#region src/lib/scatter-effect.ts
199
- function m({ scatterEnabledRef: e, mouseRadiusRef: t, durationRef: n, scatterCharsRef: r }) {
204
+ function g({ scatterEnabledRef: e, mouseRadiusRef: t, durationRef: n, scatterCharsRef: r }) {
200
205
  let i = new Uint8Array(), a = new Float32Array(), o = new Float32Array(), s = new Uint8Array(), c = null, l = null, u = 0, d = 0, f = -1, p = () => Math.floor(Math.random() * r.current.length), m = 0, h = 0, g = 1, _ = 1, v = 0, y = 0, b = null;
201
206
  return {
202
207
  setup(e, t, n, r, f, p, x, S) {
@@ -254,7 +259,7 @@ function m({ scatterEnabledRef: e, mouseRadiusRef: t, durationRef: n, scatterCha
254
259
  }
255
260
  //#endregion
256
261
  //#region src/lib/brighten-effect.ts
257
- function h({ brightenEnabledRef: e, trailLenRef: t, durationRef: n, trailDecayRef: r }) {
262
+ function _({ brightenEnabledRef: e, trailLenRef: t, durationRef: n, trailDecayRef: r }) {
258
263
  let i = [];
259
264
  return {
260
265
  handleMouseMove(n, r, a) {
@@ -277,8 +282,8 @@ function h({ brightenEnabledRef: e, trailLenRef: t, durationRef: n, trailDecayRe
277
282
  }
278
283
  //#endregion
279
284
  //#region src/lib/click-effect.ts
280
- var g = 10;
281
- function _({ clickEnabledRef: e, clickSpeedRef: t, clickBrightnessRef: n, pixelScaleRef: r }) {
285
+ var v = 10;
286
+ function y({ clickEnabledRef: e, clickSpeedRef: t, clickBrightnessRef: n, pixelScaleRef: r }) {
282
287
  let i = [];
283
288
  return {
284
289
  handleClick(t, n) {
@@ -288,11 +293,11 @@ function _({ clickEnabledRef: e, clickSpeedRef: t, clickBrightnessRef: n, pixelS
288
293
  x: a,
289
294
  y: o,
290
295
  t: performance.now()
291
- }), i.length > g && i.shift();
296
+ }), i.length > v && i.shift();
292
297
  },
293
298
  tick(a, o, s, c, l) {
294
299
  if (!e.current) return;
295
- let u = performance.now(), d = Math.hypot(o.width, o.height), f = t.current * r.current, p = new Float32Array(g * 2), m = new Float32Array(g), h = new Float32Array(g);
300
+ let u = performance.now(), d = Math.hypot(o.width, o.height), f = t.current * r.current, p = new Float32Array(v * 2), m = new Float32Array(v), h = new Float32Array(v);
296
301
  for (; i.length > 0 && (u - i[0].t) * f >= d;) i.shift();
297
302
  for (let e = 0; e < i.length; e++) {
298
303
  let t = (u - i[e].t) * f, r = t / d, a = 1 + (n.current - 1) * (1 - r ** 2);
@@ -304,7 +309,7 @@ function _({ clickEnabledRef: e, clickSpeedRef: t, clickBrightnessRef: n, pixelS
304
309
  }
305
310
  //#endregion
306
311
  //#region src/lib/spread-effect.ts
307
- function v({ spreadEnabledRef: e, scatterCharsRef: t, spreadExpandDurationRef: n, spreadSpeedRef: r }) {
312
+ function b({ spreadEnabledRef: e, scatterCharsRef: t, spreadExpandDurationRef: n, spreadSpeedRef: r }) {
308
313
  let i = new Uint8Array(), a = new Uint8Array(), o = 0, s = 0, c = 1, l = 1, u = 0, d = 0, f = null, p = -1, m = -1, h = () => Math.floor(Math.random() * t.current.length), g = [
309
314
  [-1, 0],
310
315
  [1, 0],
@@ -357,7 +362,7 @@ function v({ spreadEnabledRef: e, scatterCharsRef: t, spreadExpandDurationRef: n
357
362
  }
358
363
  //#endregion
359
364
  //#region src/lib/device-pixel-size.ts
360
- function y(e, t) {
365
+ function x(e, t) {
361
366
  let n = 0, r = 0, i = !1, a = null, o = () => {
362
367
  let e = window.devicePixelRatio || 1;
363
368
  t({
@@ -394,23 +399,23 @@ function y(e, t) {
394
399
  }
395
400
  //#endregion
396
401
  //#region src/components/VideoAscii.tsx
397
- function b({ src: i, videoMode: c = !1, numColsRaw: l = 250, brightnessRaw: u = 1, saturationRaw: d = 1, bgOpacityRaw: f = .3, revealEffect: g = !1, chars: b = o, mouseEffect: x = !0, clickEffect: S = !0, charMode: C = "shape", className: w, cropFocus: T = "center", maxDpr: E }) {
398
- let D = t(null), O = t(null), k = t(null), A = t(null), j = t(null), { numCols: M, brightness: N, saturation: P, bgOpacity: F, mouseEnabled: I, mouseStyle: L, brightenEnabled: R, scatterEnabled: z, scatterChars: B, trailLen: V, trailDecay: H, duration: U, mouseRadius: ee, mouseBrightness: W, clickEnabled: G, clickBrightness: K, clickSpeed: q, spreadEnabled: J, spreadExpandDuration: Y, spreadSpeed: X, revealEnabled: te, revealDuration: ne, revealEffectFlag: re, maxDpr: ie } = s(l, u, d, f, x, S, g, E), ae = t(N), oe = t(P), se = t(F), ce = t(I), le = t(L), ue = t(R), de = t(z), fe = t(W), pe = t(ee), me = t(V), he = t(H), ge = t(U), Z = t(B), _e = t(G), ve = t(K), ye = t(q), be = t(J), xe = t(Y), Se = t(X), Ce = t(M), we = t(c), Te = t(T), Ee = t(0), De = t(0), Oe = t(ie), ke = t(1), Q = t(null), Ae = t(null);
402
+ function S({ src: i, mediaType: s = "auto", media: u, videoMode: d = !1, numColsRaw: f = 250, brightnessRaw: p = 1, saturationRaw: m = 1, bgOpacityRaw: v = .3, revealEffect: S = !1, chars: C = o, mouseEffect: w = !0, clickEffect: T = !0, charMode: E = "shape", className: D, cropFocus: O = "center", maxDpr: k }) {
403
+ let A = t(null), j = t(null), ee = t(null), M = t(null), te = t(null), ne = t(null), { numCols: N, brightness: P, saturation: F, bgOpacity: I, mouseEnabled: re, mouseStyle: L, brightenEnabled: R, scatterEnabled: z, scatterChars: B, trailLen: V, trailDecay: H, duration: ie, mouseRadius: U, mouseBrightness: W, clickEnabled: G, clickBrightness: K, clickSpeed: q, spreadEnabled: J, spreadExpandDuration: Y, spreadSpeed: X, revealEnabled: ae, revealDuration: oe, revealEffectFlag: se, maxDpr: Z } = l(f, p, m, v, w, T, S, k), ce = i === void 0, le = i !== void 0 && c(i, s) === "image", ue = t(P), de = t(F), fe = t(I), pe = t(re), me = t(L), he = t(R), ge = t(z), _e = t(W), ve = t(U), ye = t(V), be = t(H), xe = t(ie), Q = t(B), Se = t(G), Ce = t(K), we = t(q), Te = t(J), Ee = t(Y), De = t(X), Oe = t(N), ke = t(d), Ae = t(O), je = t(0), Me = t(0), Ne = t(Z), Pe = t(1), Fe = t(null), Ie = t(null);
399
404
  e(() => {
400
- ae.current = N, oe.current = P, se.current = F, ce.current = I, le.current = L, ue.current = R, de.current = z, fe.current = W, pe.current = ee, me.current = V, he.current = H, ge.current = U, Z.current !== B && $.current ? (Z.current = B, Me.current?.()) : Z.current = B, _e.current = G, ve.current = K, ye.current = q, be.current = J, xe.current = Y, Se.current = X, Ce.current = M, we.current = c;
405
+ ue.current = P, de.current = F, fe.current = I, pe.current = re, me.current = L, he.current = R, ge.current = z, _e.current = W, ve.current = U, ye.current = V, be.current = H, xe.current = ie, Q.current !== B && $.current ? (Q.current = B, Re.current?.()) : Q.current = B, Se.current = G, Ce.current = K, we.current = q, Te.current = J, Ee.current = Y, De.current = X, Oe.current = N, ke.current = d;
401
406
  }, [
402
- N,
403
407
  P,
404
408
  F,
405
409
  I,
410
+ re,
406
411
  L,
407
412
  R,
408
413
  z,
409
414
  W,
410
- ee,
415
+ U,
411
416
  V,
412
417
  H,
413
- U,
418
+ ie,
414
419
  B,
415
420
  G,
416
421
  K,
@@ -418,158 +423,174 @@ function b({ src: i, videoMode: c = !1, numColsRaw: l = 250, brightnessRaw: u =
418
423
  J,
419
424
  Y,
420
425
  X,
421
- M,
422
- c
426
+ N,
427
+ d
423
428
  ]);
424
- let je = t(null), Me = t(null), Ne = t(null), $ = t(!1);
425
- return e(() => {
426
- $.current && je.current?.(M);
427
- }, [M]), e(() => {
428
- Te.current = T, $.current && Ee.current > 0 && Ne.current?.(Ee.current, De.current);
429
- }, [T]), e(() => {
430
- Oe.current = ie, $.current && Q.current && Ae.current?.(Q.current);
431
- }, [ie]), e(() => {
429
+ let Le = t(null), Re = t(null), ze = t(null), $ = t(!1);
430
+ e(() => {
431
+ $.current && Le.current?.(N);
432
+ }, [N]), e(() => {
433
+ Ae.current = O, $.current && je.current > 0 && ze.current?.(je.current, Me.current);
434
+ }, [O]), e(() => {
435
+ Ne.current = Z, $.current && Fe.current && Ie.current?.(Fe.current);
436
+ }, [Z]), e(() => {
432
437
  $.current = !1;
433
- let e = [], t = 0, n = 0, r = 1, o = 1, s = 0, c = 0, l = 0, u = 0, d = D.current;
434
- if (!d) return;
435
- let f = O.current;
438
+ let e = [], t = 0, n = 0, r = 1, o = 1, s = 0, c = 0, l = 0, d = 0, f = A.current;
436
439
  if (!f) return;
437
- let g = d.getContext("webgl2");
438
- if (!g) return;
439
- g.pixelStorei(g.UNPACK_ALIGNMENT, 1);
440
- let x = p(g);
441
- if (!x) return;
442
- let { program: S, pass1Program: w } = x;
443
- A.current = x.atlasTexture, j.current = x.scatterAtlasTexture, g.uniform1i(x.shapeMatchingLoc, +(C === "shape")), g.uniform1i(x.revealEffectFlagLoc, re), g.uniform1f(x.revealProgressLoc, 0);
444
- let T = m({
445
- scatterEnabledRef: de,
446
- mouseRadiusRef: pe,
447
- durationRef: ge,
448
- scatterCharsRef: Z
449
- }), E = h({
450
- brightenEnabledRef: ue,
451
- trailLenRef: me,
452
- durationRef: ge,
453
- trailDecayRef: he
454
- }), M = _({
455
- clickEnabledRef: _e,
456
- clickSpeedRef: ye,
457
- clickBrightnessRef: ve,
458
- pixelScaleRef: ke
459
- }), N = v({
460
- spreadEnabledRef: be,
461
- scatterCharsRef: Z,
462
- spreadExpandDurationRef: xe,
463
- spreadSpeedRef: Se
464
- }), P, F = -1, I = -1, L = 0, R = Array.isArray(i) ? i : [i], z = R.length > 1, B = document.createElement("canvas"), V = B.getContext("2d"), H = (i) => {
465
- let f = l > 0 ? l : d.width, p = u > 0 ? u : d.height;
466
- r = Math.max(1, Math.floor(f / i));
440
+ let p = ce ? u : le ? ee.current : j.current;
441
+ if (!p) return;
442
+ let m = p instanceof HTMLVideoElement ? p : null, v = p instanceof HTMLImageElement ? p : null, S = () => p instanceof HTMLVideoElement ? {
443
+ width: p.videoWidth,
444
+ height: p.videoHeight
445
+ } : {
446
+ width: p.naturalWidth,
447
+ height: p.naturalHeight
448
+ }, w = f.getContext("webgl2");
449
+ if (!w) return;
450
+ w.pixelStorei(w.UNPACK_ALIGNMENT, 1);
451
+ let T = h(w);
452
+ if (!T) return;
453
+ let { program: D, pass1Program: O } = T;
454
+ te.current = T.atlasTexture, ne.current = T.scatterAtlasTexture, w.uniform1i(T.shapeMatchingLoc, +(E === "shape")), w.uniform1i(T.revealEffectFlagLoc, se), w.uniform1f(T.revealProgressLoc, 0);
455
+ let k = g({
456
+ scatterEnabledRef: ge,
457
+ mouseRadiusRef: ve,
458
+ durationRef: xe,
459
+ scatterCharsRef: Q
460
+ }), N = _({
461
+ brightenEnabledRef: he,
462
+ trailLenRef: ye,
463
+ durationRef: xe,
464
+ trailDecayRef: be
465
+ }), P = y({
466
+ clickEnabledRef: Se,
467
+ clickSpeedRef: we,
468
+ clickBrightnessRef: Ce,
469
+ pixelScaleRef: Pe
470
+ }), F = b({
471
+ spreadEnabledRef: Te,
472
+ scatterCharsRef: Q,
473
+ spreadExpandDurationRef: Ee,
474
+ spreadSpeedRef: De
475
+ }), I = 0, re = -1, L = -1, R = 0, z = Array.isArray(i) ? i : i === void 0 ? [] : [i], B = z.length > 1, V = document.createElement("canvas"), H = V.getContext("2d"), ie = (i) => {
476
+ let u = l > 0 ? l : f.width, p = d > 0 ? d : f.height;
477
+ r = Math.max(1, Math.floor(u / i));
467
478
  let m = r * 2;
468
- if (V.font = `${m}px monospace`, o = Math.max(1, Math.round(m * r / V.measureText("M").width)), t = Math.ceil(f / r), n = Math.ceil(p / o), s = Math.floor((f - t * r) / 2), c = Math.floor((p - n * o) / 2), g.viewport(0, 0, d.width, d.height), g.useProgram(S), g.uniform2f(x.resLoc, d.width, d.height), g.uniform2f(x.gridOffsetLoc, s, c), g.useProgram(w), g.uniform2f(x.p1ResLoc, d.width, d.height), g.uniform2f(x.p1GridOffsetLoc, s, c), g.useProgram(S), T.setup(g, t, n, r, o, s, c, x.scatterStateTexture), N.setup(g, t, n, r, o, s, c, x.spreadStateTexture), C === "shape") {
469
- e = a(b, r, o);
479
+ if (H.font = `${m}px monospace`, o = Math.max(1, Math.round(m * r / H.measureText("M").width)), t = Math.ceil(u / r), n = Math.ceil(p / o), s = Math.floor((u - t * r) / 2), c = Math.floor((p - n * o) / 2), w.viewport(0, 0, f.width, f.height), w.useProgram(D), w.uniform2f(T.resLoc, f.width, f.height), w.uniform2f(T.gridOffsetLoc, s, c), w.useProgram(O), w.uniform2f(T.p1ResLoc, f.width, f.height), w.uniform2f(T.p1GridOffsetLoc, s, c), w.useProgram(D), k.setup(w, t, n, r, o, s, c, T.scatterStateTexture), F.setup(w, t, n, r, o, s, c, T.spreadStateTexture), E === "shape") {
480
+ e = a(C, r, o);
470
481
  let i = e.length, s = new Float32Array(i * 8);
471
482
  for (let t = 0; t < i; t++) {
472
483
  let n = e[t].vector;
473
484
  s[t * 4 + 0] = n[0], s[t * 4 + 1] = n[1], s[t * 4 + 2] = n[2], s[t * 4 + 3] = n[3], s[i * 4 + t * 4 + 0] = n[4], s[i * 4 + t * 4 + 1] = n[5];
474
485
  }
475
- g.activeTexture(g.TEXTURE2), g.bindTexture(g.TEXTURE_2D, x.charVectorsTexture), g.texImage2D(g.TEXTURE_2D, 0, g.RGBA32F, i, 2, 0, g.RGBA, g.FLOAT, s), g.activeTexture(g.TEXTURE3), g.bindTexture(g.TEXTURE_2D, x.fboTexture), g.texImage2D(g.TEXTURE_2D, 0, g.R8UI, t, n, 0, g.RED_INTEGER, g.UNSIGNED_BYTE, null), g.bindFramebuffer(g.FRAMEBUFFER, x.fbo), g.framebufferTexture2D(g.FRAMEBUFFER, g.COLOR_ATTACHMENT0, g.TEXTURE_2D, x.fboTexture, 0), g.bindFramebuffer(g.FRAMEBUFFER, null);
486
+ w.activeTexture(w.TEXTURE2), w.bindTexture(w.TEXTURE_2D, T.charVectorsTexture), w.texImage2D(w.TEXTURE_2D, 0, w.RGBA32F, i, 2, 0, w.RGBA, w.FLOAT, s), w.activeTexture(w.TEXTURE3), w.bindTexture(w.TEXTURE_2D, T.fboTexture), w.texImage2D(w.TEXTURE_2D, 0, w.R8UI, t, n, 0, w.RED_INTEGER, w.UNSIGNED_BYTE, null), w.bindFramebuffer(w.FRAMEBUFFER, T.fbo), w.framebufferTexture2D(w.FRAMEBUFFER, w.COLOR_ATTACHMENT0, w.TEXTURE_2D, T.fboTexture, 0), w.bindFramebuffer(w.FRAMEBUFFER, null);
476
487
  let c = Math.max(1, Math.round(r / 5));
477
- g.useProgram(w), g.uniform2f(x.p1CellsizeLoc, r, o), g.uniform1i(x.p1CircleNLoc, c), g.uniform1i(x.p1NumCharsLoc, i), g.uniform1f(x.p1ExponentLoc, 2), g.useProgram(S);
488
+ w.useProgram(O), w.uniform2f(T.p1CellsizeLoc, r, o), w.uniform1i(T.p1CircleNLoc, c), w.uniform1i(T.p1NumCharsLoc, i), w.uniform1f(T.p1ExponentLoc, 2), w.useProgram(D);
478
489
  }
479
- g.uniform2f(x.gridSizeLoc, t, n), B.width = b.length * r, B.height = o, V.font = `${o}px monospace`, V.fillStyle = "black", V.fillRect(0, 0, b.length * r, o), V.fillStyle = "white", V.textBaseline = "top";
480
- for (let e = 0; e < b.length; e++) V.fillText(b[e], e * r, 0);
481
- g.activeTexture(g.TEXTURE1), g.bindTexture(g.TEXTURE_2D, A.current), g.texImage2D(g.TEXTURE_2D, 0, g.RGBA, g.RGBA, g.UNSIGNED_BYTE, B), g.uniform1f(x.numLoc, b.length), g.uniform2f(x.sizeLoc, r, o), U();
490
+ w.uniform2f(T.gridSizeLoc, t, n), V.width = C.length * r, V.height = o, H.font = `${o}px monospace`, H.fillStyle = "black", H.fillRect(0, 0, C.length * r, o), H.fillStyle = "white", H.textBaseline = "top";
491
+ for (let e = 0; e < C.length; e++) H.fillText(C[e], e * r, 0);
492
+ w.activeTexture(w.TEXTURE1), w.bindTexture(w.TEXTURE_2D, te.current), w.texImage2D(w.TEXTURE_2D, 0, w.RGBA, w.RGBA, w.UNSIGNED_BYTE, V), w.uniform1f(T.numLoc, C.length), w.uniform2f(T.sizeLoc, r, o), U();
482
493
  }, U = () => {
483
- let e = Z.current;
484
- B.width = e.length * r, B.height = o, V.fillStyle = "black", V.fillRect(0, 0, B.width, o), V.fillStyle = "white", V.textBaseline = "top", V.font = `${o}px monospace`;
485
- for (let t = 0; t < e.length; t++) V.fillText(e[t], t * r, 0);
486
- g.activeTexture(g.TEXTURE4), g.bindTexture(g.TEXTURE_2D, j.current), g.texImage2D(g.TEXTURE_2D, 0, g.RGBA, g.RGBA, g.UNSIGNED_BYTE, B), g.uniform1f(x.scatterNumCharsLoc, e.length), T.reset(g);
494
+ let e = Q.current;
495
+ V.width = e.length * r, V.height = o, H.fillStyle = "black", H.fillRect(0, 0, V.width, o), H.fillStyle = "white", H.textBaseline = "top", H.font = `${o}px monospace`;
496
+ for (let t = 0; t < e.length; t++) H.fillText(e[t], t * r, 0);
497
+ w.activeTexture(w.TEXTURE4), w.bindTexture(w.TEXTURE_2D, ne.current), w.texImage2D(w.TEXTURE_2D, 0, w.RGBA, w.RGBA, w.UNSIGNED_BYTE, V), w.uniform1f(T.scatterNumCharsLoc, e.length), k.reset(w);
487
498
  };
488
- je.current = H, Me.current = U;
489
- let ee = (e, t) => {
490
- l = Math.round(e), u = Math.round(t), Ee.current = l, De.current = u, d.width = l, d.height = u, H(Ce.current);
491
- let n = f.videoWidth / f.videoHeight, r = d.width / d.height, i = 1, a = 1, o = 0, s = 0;
492
- if (r > n) a = n / r, s = (1 - a) / 2;
499
+ Le.current = ie, Re.current = U;
500
+ let W = (e, t) => {
501
+ l = Math.round(e), d = Math.round(t), je.current = l, Me.current = d, f.width = l, f.height = d, ie(Oe.current);
502
+ let n = S(), r = n.width / n.height, i = f.width / f.height, a = 1, o = 1, s = 0, c = 0;
503
+ if (i > r) o = r / i, c = (1 - o) / 2;
493
504
  else {
494
- i = r / n;
495
- let e = Te.current, t = e === "left" ? .25 : e === "right" ? .75 : .5;
496
- o = Math.max(0, Math.min(1 - i, t - i / 2));
505
+ a = i / r;
506
+ let e = Ae.current, t = e === "left" ? .25 : e === "right" ? .75 : .5;
507
+ s = Math.max(0, Math.min(1 - a, t - a / 2));
497
508
  }
498
- g.uniform2f(x.cropOffsetLoc, o, s), g.uniform2f(x.cropScaleLoc, i, a), g.useProgram(w), g.uniform2f(x.p1CropOffsetLoc, o, s), g.uniform2f(x.p1CropScaleLoc, i, a), g.useProgram(S);
509
+ w.uniform2f(T.cropOffsetLoc, s, c), w.uniform2f(T.cropScaleLoc, a, o), w.useProgram(O), w.uniform2f(T.p1CropOffsetLoc, s, c), w.uniform2f(T.p1CropScaleLoc, a, o), w.useProgram(D);
499
510
  };
500
- Ne.current = ee;
501
- let W = (e) => {
502
- Q.current = e;
503
- let t = Math.min(1, Oe.current / (window.devicePixelRatio || 1)), n = Math.max(1, Math.round(e.width * t)), r = Math.max(1, Math.round(e.height * t));
504
- ke.current = e.cssWidth > 0 ? n / e.cssWidth : 1, ee(n, r);
505
- };
506
- Ae.current = W;
511
+ ze.current = W;
507
512
  let G = (e) => {
508
- if (!ce.current) return;
509
- let t = d.getBoundingClientRect(), n = (e.clientX - t.left) * (d.width / t.width), r = (e.clientY - t.top) * (d.height / t.height), i = performance.now();
510
- E.handleMouseMove(n, r, i), T.handleMouseMove(n, r, i);
513
+ Fe.current = e;
514
+ let t = Math.min(1, Ne.current / (window.devicePixelRatio || 1)), n = Math.max(1, Math.round(e.width * t)), r = Math.max(1, Math.round(e.height * t));
515
+ Pe.current = e.cssWidth > 0 ? n / e.cssWidth : 1, W(n, r);
516
+ };
517
+ Ie.current = G;
518
+ let K = (e) => {
519
+ if (!pe.current) return;
520
+ let t = f.getBoundingClientRect(), n = (e.clientX - t.left) * (f.width / t.width), r = (e.clientY - t.top) * (f.height / t.height), i = performance.now();
521
+ N.handleMouseMove(n, r, i), k.handleMouseMove(n, r, i);
511
522
  };
512
- d.addEventListener("mousemove", G);
513
- let K = () => T.handleMouseLeave();
514
- d.addEventListener("mouseleave", K);
515
- let q = (e) => {
516
- M.handleClick(e, d), N.handleClick(e, d);
523
+ f.addEventListener("mousemove", K);
524
+ let q = () => k.handleMouseLeave();
525
+ f.addEventListener("mouseleave", q);
526
+ let J = (e) => {
527
+ P.handleClick(e, f), F.handleClick(e, f);
517
528
  };
518
- d.addEventListener("click", q);
519
- let J = () => {
520
- if (g.uniform1i(x.videoModeLoc, +!!we.current), g.uniform1f(x.brightnessLoc, ae.current), g.uniform1f(x.saturationLoc, oe.current), g.uniform1f(x.bgOpacityLoc, se.current), g.uniform1i(x.mouseEffectFlagLoc, +!!ue.current), g.uniform1i(x.scatterEffectFlagLoc, +!!de.current), g.uniform1i(x.clickEffectFlagLoc, +!!_e.current), g.uniform1i(x.spreadEffectFlagLoc, +!!be.current), g.uniform1f(x.mouseBrightnessLoc, fe.current), g.uniform1f(x.mouseRadiusLoc, Math.min(d.width, d.height) * pe.current), te) {
521
- let e = I < 0 ? 0 : Math.min(1, (performance.now() - I) / (ne * 1e3));
522
- g.uniform1f(x.revealProgressLoc, e);
529
+ f.addEventListener("click", J);
530
+ let Y = () => {
531
+ if (w.uniform1i(T.videoModeLoc, +!!ke.current), w.uniform1f(T.brightnessLoc, ue.current), w.uniform1f(T.saturationLoc, de.current), w.uniform1f(T.bgOpacityLoc, fe.current), w.uniform1i(T.mouseEffectFlagLoc, +!!he.current), w.uniform1i(T.scatterEffectFlagLoc, +!!ge.current), w.uniform1i(T.clickEffectFlagLoc, +!!Se.current), w.uniform1i(T.spreadEffectFlagLoc, +!!Te.current), w.uniform1f(T.mouseBrightnessLoc, _e.current), w.uniform1f(T.mouseRadiusLoc, Math.min(f.width, f.height) * ve.current), ae) {
532
+ let e = L < 0 ? 0 : Math.min(1, (performance.now() - L) / (oe * 1e3));
533
+ w.uniform1f(T.revealProgressLoc, e);
523
534
  }
524
- $.current && f.currentTime != F && f.readyState >= 2 && (g.activeTexture(g.TEXTURE0), g.bindTexture(g.TEXTURE_2D, x.texture), g.texSubImage2D(g.TEXTURE_2D, 0, 0, 0, g.RGBA, g.UNSIGNED_BYTE, f), F = f.currentTime), E.tick(g, x.mousePositionsLoc, x.mouseLifeFracsLoc), T.tick(g, d), M.tick(g, d, x.ripplePositionsLoc, x.rippleRadiiLoc, x.rippleBrightnessesLoc), N.tick(g), C === "shape" && (g.bindFramebuffer(g.FRAMEBUFFER, x.fbo), g.viewport(0, 0, t, n), g.useProgram(w), g.drawArrays(g.TRIANGLES, 0, 6), g.bindFramebuffer(g.FRAMEBUFFER, null), g.viewport(0, 0, d.width, d.height), g.useProgram(S)), g.drawArrays(g.TRIANGLES, 0, 6), P = requestAnimationFrame(J);
525
- }, Y = () => {
526
- let e = k.current, t = Q.current;
527
- if (t && t.width > 0 && t.height > 0) W(t);
535
+ $.current && m && m.currentTime != re && m.readyState >= 2 && (w.activeTexture(w.TEXTURE0), w.bindTexture(w.TEXTURE_2D, T.texture), w.texSubImage2D(w.TEXTURE_2D, 0, 0, 0, w.RGBA, w.UNSIGNED_BYTE, m), re = m.currentTime), N.tick(w, T.mousePositionsLoc, T.mouseLifeFracsLoc), k.tick(w, f), P.tick(w, f, T.ripplePositionsLoc, T.rippleRadiiLoc, T.rippleBrightnessesLoc), F.tick(w), E === "shape" && (w.bindFramebuffer(w.FRAMEBUFFER, T.fbo), w.viewport(0, 0, t, n), w.useProgram(O), w.drawArrays(w.TRIANGLES, 0, 6), w.bindFramebuffer(w.FRAMEBUFFER, null), w.viewport(0, 0, f.width, f.height), w.useProgram(D)), w.drawArrays(w.TRIANGLES, 0, 6), I = requestAnimationFrame(Y);
536
+ }, X = () => {
537
+ let e = M.current, t = Fe.current;
538
+ if (t && t.width > 0 && t.height > 0) G(t);
528
539
  else {
529
- let t = window.devicePixelRatio || 1, n = e.clientWidth || f.videoWidth, r = e.clientHeight || f.videoHeight;
530
- W({
531
- width: Math.round(n * t),
532
- height: Math.round(r * t),
533
- cssWidth: n,
534
- cssHeight: r
540
+ let t = window.devicePixelRatio || 1, n = S(), r = e.clientWidth || n.width, i = e.clientHeight || n.height;
541
+ G({
542
+ width: Math.round(r * t),
543
+ height: Math.round(i * t),
544
+ cssWidth: r,
545
+ cssHeight: i
535
546
  });
536
547
  }
537
- g.activeTexture(g.TEXTURE0), g.bindTexture(g.TEXTURE_2D, x.texture), g.texImage2D(g.TEXTURE_2D, 0, g.RGBA, g.RGBA, g.UNSIGNED_BYTE, f), f.play(), I = performance.now(), $.current = !0, P = requestAnimationFrame(J);
538
- }, X = () => {
539
- L = (L + 1) % R.length, f.src = R[L], f.load(), f.addEventListener("canplay", () => f.play(), { once: !0 });
540
- }, ie = k.current ? y(k.current, (e) => {
541
- Q.current = e, $.current && e.width > 0 && e.height > 0 && W(e);
548
+ w.activeTexture(w.TEXTURE0), w.bindTexture(w.TEXTURE_2D, T.texture), w.texImage2D(w.TEXTURE_2D, 0, w.RGBA, w.RGBA, w.UNSIGNED_BYTE, p), m?.play(), L = performance.now(), $.current = !0, cancelAnimationFrame(I), I = requestAnimationFrame(Y);
549
+ }, Z = () => {
550
+ m && (R = (R + 1) % z.length, m.src = z[R], m.load(), m.addEventListener("canplay", () => m.play(), { once: !0 }));
551
+ }, me = M.current ? x(M.current, (e) => {
552
+ Fe.current = e, $.current && e.width > 0 && e.height > 0 && G(e);
542
553
  }) : () => {};
543
- return f.addEventListener("loadeddata", Y, { once: !0 }), z && f.addEventListener("ended", X), f.readyState >= 2 && f.currentSrc.endsWith(R[0]) ? Y() : f.currentSrc.endsWith(R[0]) || f.load(), () => {
544
- ie(), je.current = null, Me.current = null, Ne.current = null, Ae.current = null, $.current = !1, cancelAnimationFrame(P), f.removeEventListener("loadeddata", Y), z && f.removeEventListener("ended", X), d.removeEventListener("mousemove", G), d.removeEventListener("mouseleave", K), d.removeEventListener("click", q), g.deleteTexture(x.texture), g.deleteTexture(x.charVectorsTexture), g.deleteFramebuffer(x.fbo), g.deleteTexture(x.fboTexture), g.deleteBuffer(x.buffer), g.deleteShader(x.vertShader), g.deleteShader(x.fragShader), g.deleteShader(x.pass1FragShader), g.deleteProgram(S), g.deleteProgram(w), g.deleteTexture(A.current), g.deleteTexture(j.current), g.deleteTexture(x.scatterStateTexture), g.deleteTexture(x.spreadStateTexture);
554
+ return m ? (m.addEventListener("loadeddata", X, { once: !ce }), B && m.addEventListener("ended", Z), ce ? m.readyState >= 2 && X() : m.readyState >= 2 && m.currentSrc.endsWith(z[0]) ? X() : m.currentSrc.endsWith(z[0]) || m.load()) : v && (v.complete && v.naturalWidth > 0 ? X() : v.addEventListener("load", X, { once: !0 })), () => {
555
+ me(), Le.current = null, Re.current = null, ze.current = null, Ie.current = null, $.current = !1, cancelAnimationFrame(I), m ? (m.removeEventListener("loadeddata", X), B && m.removeEventListener("ended", Z)) : v?.removeEventListener("load", X), f.removeEventListener("mousemove", K), f.removeEventListener("mouseleave", q), f.removeEventListener("click", J), w.deleteTexture(T.texture), w.deleteTexture(T.charVectorsTexture), w.deleteFramebuffer(T.fbo), w.deleteTexture(T.fboTexture), w.deleteBuffer(T.buffer), w.deleteShader(T.vertShader), w.deleteShader(T.fragShader), w.deleteShader(T.pass1FragShader), w.deleteProgram(D), w.deleteProgram(O), w.deleteTexture(te.current), w.deleteTexture(ne.current), w.deleteTexture(T.scatterStateTexture), w.deleteTexture(T.spreadStateTexture);
545
556
  };
546
557
  }, [
547
558
  i,
559
+ u,
560
+ ce,
561
+ E,
548
562
  C,
549
- b,
550
- re,
551
- ne,
552
- te
553
- ]), /* @__PURE__ */ r("div", {
554
- ref: k,
555
- className: w,
563
+ se,
564
+ oe,
565
+ ae,
566
+ le
567
+ ]);
568
+ let Be = Array.isArray(i) ? i[0] : i;
569
+ return /* @__PURE__ */ r("div", {
570
+ ref: M,
571
+ className: D,
556
572
  style: {
557
573
  height: "100%",
558
574
  width: "100%"
559
575
  },
560
- children: [/* @__PURE__ */ n("video", {
561
- ref: O,
576
+ children: [ce ? null : le ? /* @__PURE__ */ n("img", {
577
+ ref: ee,
578
+ src: Be,
579
+ alt: "",
580
+ style: { display: "none" }
581
+ }) : /* @__PURE__ */ n("video", {
582
+ ref: j,
562
583
  muted: !0,
563
584
  playsInline: !0,
564
585
  autoPlay: !0,
565
586
  loop: !Array.isArray(i) || i.length === 1,
566
587
  style: { display: "none" },
567
588
  children: /* @__PURE__ */ n("source", {
568
- src: Array.isArray(i) ? i[0] : i,
589
+ src: Be,
569
590
  type: "video/mp4"
570
591
  })
571
592
  }), /* @__PURE__ */ n("canvas", {
572
- ref: D,
593
+ ref: A,
573
594
  style: {
574
595
  width: "100%",
575
596
  height: "100%",
@@ -579,4 +600,4 @@ function b({ src: i, videoMode: c = !1, numColsRaw: l = 250, brightnessRaw: u =
579
600
  });
580
601
  }
581
602
  //#endregion
582
- export { b as VideoAscii };
603
+ export { S as VideoAscii };
@@ -1,10 +1,10 @@
1
- (function(e,t){typeof exports==`object`&&typeof module<`u`?t(exports,require(`react`),require(`react/jsx-runtime`)):typeof define==`function`&&define.amd?define([`exports`,`react`,`react/jsx-runtime`],t):(e=typeof globalThis<`u`?globalThis:e||self,t(e.ReactVideoAscii={},e.React,e.ReactJSXRuntime))})(this,function(e,t,n){Object.defineProperty(e,Symbol.toStringTag,{value:`Module`});var r=[[.25,.25],[.75,.25],[.25,.5],[.75,.5],[.25,.75],[.75,.75]];function i(e,t,n){let i=[],a=document.createElement(`canvas`);a.width=t,a.height=n;let o=a.getContext(`2d`,{willReadFrequently:!0});if(!o)return[];o.font=`${n}px monospace`,o.textBaseline=`top`;let s=t/5;for(let a of e){o.fillStyle=`black`,o.fillRect(0,0,t,n),o.fillStyle=`white`,o.fillText(a,0,0);let e=o.getImageData(0,0,t,n),c=[];for(let[i,a]of r){let r=i*t,o=a*n,l=0,u=0;for(let n=Math.floor(r-s);n<=Math.ceil(r+s);n+=1)for(let i=Math.floor(o-s);i<=Math.ceil(o+s);i+=1){let a=r-n,c=o-i;if(a*a+c*c<=s*s){let r=(i*t+n)*4,a=e.data[r];l+=a/255,u++}}let d=u>0?l/u:0;c.push(d)}i.push({char:a,vector:c})}let c=[,,,,,,].fill(0);for(let{vector:e}of i)for(let t=0;t<6;++t)e[t]>c[t]&&(c[t]=e[t]);for(let{vector:e}of i)for(let t=0;t<6;++t)e[t]/=c[t];return i}var a=` \`.',-_:!;|"~+^lr[](\\/L)>t<v=Tz?icf1{sIxY*jJno}CZyVwmSXRqM$O%#9&NW0Q@`;function o(e,t,n,r,i,a,o,s){let c=!!i,l=typeof i==`object`?i:{},u=l.style??`brighten`,d=c&&u!==`scatter`,f=c&&u===`scatter`,p=l.scatterChars??`->o`,m=l.trailLen??15,h=l.trailDecay??10,g=l.duration??1,_=l.radius??(u===`scatter`?.05:.08),v=l.brightness??2,y=!!a,b=typeof a==`object`?a:{},x=b.style??`ripple`,S=y&&x!==`spread`,C=y&&x===`spread`,w=b.brightness??1.1,T=b.speed??2,E=b.spreadExpandDuration??1.5,D=b.spreadSpeed??7.5,O=!!o,k=typeof o==`object`?o:{},A=k.type??`random`,j=k.duration??.4,M=Math.max(20,Math.min(350,Math.round(e))),N=Math.max(0,Math.min(2,t)),P=Math.max(0,Math.min(2,n)),F=Math.max(0,Math.min(1,r));j=Math.max(.1,Math.min(4,j)),m=Math.max(0,Math.min(30,Math.round(m))),h=Math.max(1,Math.min(15,h)),g=Math.max(.1,Math.min(4,g)),_=Math.max(.03,Math.min(.2,_)),v=Math.max(.2,Math.min(5,v)),w=Math.max(1.05,Math.min(2,w)),T=Math.max(.5,Math.min(4,T)),E=Math.max(.5,Math.min(5,E)),D=Math.max(.5,Math.min(10,D));let I=s===void 0?1/0:Math.max(1,Math.min(4,s)),L;return L=O?A===`diagonal`?1:A===`radial`?2:3:0,{numCols:M,brightness:N,saturation:P,bgOpacity:F,mouseEnabled:c,mouseStyle:u,brightenEnabled:d,scatterEnabled:f,scatterChars:p,trailLen:m,trailDecay:h,duration:g,mouseRadius:_,mouseBrightness:v,clickEnabled:S,clickBrightness:w,clickSpeed:T,spreadEnabled:C,spreadExpandDuration:E,spreadSpeed:D,revealEnabled:O,revealType:A,revealDuration:j,revealEffectFlag:L,maxDpr:I}}function s(e,t,n){let r=e.createShader(t);if(!r)throw Error(`Failed to create shader`);return e.shaderSource(r,n),e.compileShader(r),e.getShaderParameter(r,e.COMPILE_STATUS)?r:(console.log(e.getShaderInfoLog(r)),e.deleteShader(r),null)}function c(e,t,n){let r=e.createProgram();return e.attachShader(r,t),e.attachShader(r,n),e.linkProgram(r),e.getProgramParameter(r,e.LINK_STATUS)?r:(console.log(e.getProgramInfoLog(r)),e.deleteProgram(r),null)}var l=`#version 300 es
1
+ (function(e,t){typeof exports==`object`&&typeof module<`u`?t(exports,require(`react`),require(`react/jsx-runtime`)):typeof define==`function`&&define.amd?define([`exports`,`react`,`react/jsx-runtime`],t):(e=typeof globalThis<`u`?globalThis:e||self,t(e.ReactVideoAscii={},e.React,e.ReactJSXRuntime))})(this,function(e,t,n){Object.defineProperty(e,Symbol.toStringTag,{value:`Module`});var r=[[.25,.25],[.75,.25],[.25,.5],[.75,.5],[.25,.75],[.75,.75]];function i(e,t,n){let i=[],a=document.createElement(`canvas`);a.width=t,a.height=n;let o=a.getContext(`2d`,{willReadFrequently:!0});if(!o)return[];o.font=`${n}px monospace`,o.textBaseline=`top`;let s=t/5;for(let a of e){o.fillStyle=`black`,o.fillRect(0,0,t,n),o.fillStyle=`white`,o.fillText(a,0,0);let e=o.getImageData(0,0,t,n),c=[];for(let[i,a]of r){let r=i*t,o=a*n,l=0,u=0;for(let n=Math.floor(r-s);n<=Math.ceil(r+s);n+=1)for(let i=Math.floor(o-s);i<=Math.ceil(o+s);i+=1){let a=r-n,c=o-i;if(a*a+c*c<=s*s){let r=(i*t+n)*4,a=e.data[r];l+=a/255,u++}}let d=u>0?l/u:0;c.push(d)}i.push({char:a,vector:c})}let c=[,,,,,,].fill(0);for(let{vector:e}of i)for(let t=0;t<6;++t)e[t]>c[t]&&(c[t]=e[t]);for(let{vector:e}of i)for(let t=0;t<6;++t)e[t]/=c[t];return i}var a=` \`.',-_:!;|"~+^lr[](\\/L)>t<v=Tz?icf1{sIxY*jJno}CZyVwmSXRqM$O%#9&NW0Q@`,o=/\.(png|jpe?g|gif|webp|avif|bmp|svg)(?:[?#].*)?$/i;function s(e,t){if(t!==`auto`)return t;let n=Array.isArray(e)?e[0]:e;return o.test(n)?`image`:`video`}function c(e,t,n,r,i,a,o,s){let c=!!i,l=typeof i==`object`?i:{},u=l.style??`brighten`,d=c&&u!==`scatter`,f=c&&u===`scatter`,p=l.scatterChars??`->o`,m=l.trailLen??15,h=l.trailDecay??10,g=l.duration??1,_=l.radius??(u===`scatter`?.05:.08),v=l.brightness??2,y=!!a,b=typeof a==`object`?a:{},x=b.style??`ripple`,S=y&&x!==`spread`,C=y&&x===`spread`,w=b.brightness??1.1,T=b.speed??2,E=b.spreadExpandDuration??1.5,D=b.spreadSpeed??7.5,ee=!!o,O=typeof o==`object`?o:{},k=O.type??`random`,A=O.duration??.4,te=Math.max(20,Math.min(350,Math.round(e))),ne=Math.max(0,Math.min(2,t)),j=Math.max(0,Math.min(2,n)),M=Math.max(0,Math.min(1,r));A=Math.max(.1,Math.min(4,A)),m=Math.max(0,Math.min(30,Math.round(m))),h=Math.max(1,Math.min(15,h)),g=Math.max(.1,Math.min(4,g)),_=Math.max(.03,Math.min(.2,_)),v=Math.max(.2,Math.min(5,v)),w=Math.max(1.05,Math.min(2,w)),T=Math.max(.5,Math.min(4,T)),E=Math.max(.5,Math.min(5,E)),D=Math.max(.5,Math.min(10,D));let N=s===void 0?1/0:Math.max(1,Math.min(4,s)),P;return P=ee?k===`diagonal`?1:k===`radial`?2:3:0,{numCols:te,brightness:ne,saturation:j,bgOpacity:M,mouseEnabled:c,mouseStyle:u,brightenEnabled:d,scatterEnabled:f,scatterChars:p,trailLen:m,trailDecay:h,duration:g,mouseRadius:_,mouseBrightness:v,clickEnabled:S,clickBrightness:w,clickSpeed:T,spreadEnabled:C,spreadExpandDuration:E,spreadSpeed:D,revealEnabled:ee,revealType:k,revealDuration:A,revealEffectFlag:P,maxDpr:N}}function l(e,t,n){let r=e.createShader(t);if(!r)throw Error(`Failed to create shader`);return e.shaderSource(r,n),e.compileShader(r),e.getShaderParameter(r,e.COMPILE_STATUS)?r:(console.log(e.getShaderInfoLog(r)),e.deleteShader(r),null)}function u(e,t,n){let r=e.createProgram();return e.attachShader(r,t),e.attachShader(r,n),e.linkProgram(r),e.getProgramParameter(r,e.LINK_STATUS)?r:(console.log(e.getProgramInfoLog(r)),e.deleteProgram(r),null)}var d=`#version 300 es
2
2
 
3
3
  in vec2 a_position;
4
4
 
5
5
  void main() {
6
6
  gl_Position = vec4(a_position, 0.0, 1.0);
7
- }`,u=`#version 300 es
7
+ }`,f=`#version 300 es
8
8
 
9
9
  precision highp float;
10
10
  precision highp usampler2D;
@@ -207,7 +207,7 @@ void main() {
207
207
  }
208
208
 
209
209
  fragColor = vec4(finalColor, 1.0);
210
- }`,d=`#version 300 es
210
+ }`,p=`#version 300 es
211
211
 
212
212
  precision highp float;
213
213
  precision highp usampler2D;
@@ -282,4 +282,4 @@ void main() {
282
282
  }
283
283
 
284
284
  fragCharInd = uvec4(bestChar, 0u, 0u, 0u);
285
- }`;function f(e){let t=s(e,e.VERTEX_SHADER,l),n=s(e,e.FRAGMENT_SHADER,u);if(!t||!n)return null;let r=c(e,t,n);if(!r)return null;let i=new Float32Array([1,1,-1,1,1,-1,-1,-1,-1,1,1,-1]),a=e.createBuffer();e.bindBuffer(e.ARRAY_BUFFER,a),e.bufferData(e.ARRAY_BUFFER,i,e.STATIC_DRAW);let o=e.getAttribLocation(r,`a_position`);e.vertexAttribPointer(o,2,e.FLOAT,!1,0,0),e.enableVertexAttribArray(o),e.useProgram(r);let f=e.createTexture();e.activeTexture(e.TEXTURE0),e.bindTexture(e.TEXTURE_2D,f),e.texParameteri(e.TEXTURE_2D,e.TEXTURE_WRAP_S,e.CLAMP_TO_EDGE),e.texParameteri(e.TEXTURE_2D,e.TEXTURE_WRAP_T,e.CLAMP_TO_EDGE),e.texParameteri(e.TEXTURE_2D,e.TEXTURE_MIN_FILTER,e.LINEAR),e.texParameteri(e.TEXTURE_2D,e.TEXTURE_MAG_FILTER,e.LINEAR);let p=e.getUniformLocation(r,`u_texture`);e.uniform1i(p,0);let m=e.createTexture();e.activeTexture(e.TEXTURE1),e.bindTexture(e.TEXTURE_2D,m),e.texParameteri(e.TEXTURE_2D,e.TEXTURE_WRAP_S,e.CLAMP_TO_EDGE),e.texParameteri(e.TEXTURE_2D,e.TEXTURE_WRAP_T,e.CLAMP_TO_EDGE),e.texParameteri(e.TEXTURE_2D,e.TEXTURE_MIN_FILTER,e.NEAREST),e.texParameteri(e.TEXTURE_2D,e.TEXTURE_MAG_FILTER,e.NEAREST);let h=e.getUniformLocation(r,`u_atlas`);e.uniform1i(h,1);let g=e.createTexture();e.activeTexture(e.TEXTURE2),e.bindTexture(e.TEXTURE_2D,g),e.texParameteri(e.TEXTURE_2D,e.TEXTURE_WRAP_S,e.CLAMP_TO_EDGE),e.texParameteri(e.TEXTURE_2D,e.TEXTURE_WRAP_T,e.CLAMP_TO_EDGE),e.texParameteri(e.TEXTURE_2D,e.TEXTURE_MIN_FILTER,e.NEAREST),e.texParameteri(e.TEXTURE_2D,e.TEXTURE_MAG_FILTER,e.NEAREST);let _=s(e,e.FRAGMENT_SHADER,d);if(!_)return null;let v=c(e,t,_);if(!v)return null;e.useProgram(v),e.uniform1i(e.getUniformLocation(v,`u_texture`),0),e.uniform1i(e.getUniformLocation(v,`u_charVectors`),2);let y=e.getUniformLocation(v,`u_resolution`),b=e.getUniformLocation(v,`u_cellsize`),x=e.getUniformLocation(v,`u_circleN`),S=e.getUniformLocation(v,`u_numCharsInt`),C=e.getUniformLocation(v,`u_shapeExponent`),w=e.getUniformLocation(v,`u_cropOffset`),T=e.getUniformLocation(v,`u_cropScale`),E=e.getUniformLocation(v,`u_gridOffset`),D=e.createTexture();e.activeTexture(e.TEXTURE3),e.bindTexture(e.TEXTURE_2D,D),e.texParameteri(e.TEXTURE_2D,e.TEXTURE_WRAP_S,e.CLAMP_TO_EDGE),e.texParameteri(e.TEXTURE_2D,e.TEXTURE_WRAP_T,e.CLAMP_TO_EDGE),e.texParameteri(e.TEXTURE_2D,e.TEXTURE_MIN_FILTER,e.NEAREST),e.texParameteri(e.TEXTURE_2D,e.TEXTURE_MAG_FILTER,e.NEAREST);let O=e.createFramebuffer(),k=e.createTexture();e.activeTexture(e.TEXTURE4),e.bindTexture(e.TEXTURE_2D,k),e.texParameteri(e.TEXTURE_2D,e.TEXTURE_WRAP_S,e.CLAMP_TO_EDGE),e.texParameteri(e.TEXTURE_2D,e.TEXTURE_WRAP_T,e.CLAMP_TO_EDGE),e.texParameteri(e.TEXTURE_2D,e.TEXTURE_MIN_FILTER,e.NEAREST),e.texParameteri(e.TEXTURE_2D,e.TEXTURE_MAG_FILTER,e.NEAREST);let A=e.createTexture();e.activeTexture(e.TEXTURE5),e.bindTexture(e.TEXTURE_2D,A),e.texParameteri(e.TEXTURE_2D,e.TEXTURE_WRAP_S,e.CLAMP_TO_EDGE),e.texParameteri(e.TEXTURE_2D,e.TEXTURE_WRAP_T,e.CLAMP_TO_EDGE),e.texParameteri(e.TEXTURE_2D,e.TEXTURE_MIN_FILTER,e.NEAREST),e.texParameteri(e.TEXTURE_2D,e.TEXTURE_MAG_FILTER,e.NEAREST);let j=e.createTexture();return e.activeTexture(e.TEXTURE6),e.bindTexture(e.TEXTURE_2D,j),e.texParameteri(e.TEXTURE_2D,e.TEXTURE_WRAP_S,e.CLAMP_TO_EDGE),e.texParameteri(e.TEXTURE_2D,e.TEXTURE_WRAP_T,e.CLAMP_TO_EDGE),e.texParameteri(e.TEXTURE_2D,e.TEXTURE_MIN_FILTER,e.NEAREST),e.texParameteri(e.TEXTURE_2D,e.TEXTURE_MAG_FILTER,e.NEAREST),e.useProgram(r),e.uniform1i(e.getUniformLocation(r,`u_fboTexture`),3),e.uniform1i(e.getUniformLocation(r,`u_scatterAtlas`),4),e.uniform1i(e.getUniformLocation(r,`u_scatterStateTexture`),5),e.uniform1i(e.getUniformLocation(r,`u_spreadStateTexture`),6),{program:r,pass1Program:v,buffer:a,vertShader:t,fragShader:n,pass1FragShader:_,texture:f,atlasTexture:m,charVectorsTexture:g,fboTexture:D,fbo:O,scatterAtlasTexture:k,scatterStateTexture:A,spreadStateTexture:j,p1ResLoc:y,p1CellsizeLoc:b,p1CircleNLoc:x,p1NumCharsLoc:S,p1ExponentLoc:C,p1CropOffsetLoc:w,p1CropScaleLoc:T,p1GridOffsetLoc:E,revealEffectFlagLoc:e.getUniformLocation(r,`u_revealEffectFlag`),mouseEffectFlagLoc:e.getUniformLocation(r,`u_mouseEffect`),clickEffectFlagLoc:e.getUniformLocation(r,`u_clickEffect`),shapeMatchingLoc:e.getUniformLocation(r,`u_shapeMatching`),revealProgressLoc:e.getUniformLocation(r,`u_revealProgress`),brightnessLoc:e.getUniformLocation(r,`u_brightness`),saturationLoc:e.getUniformLocation(r,`u_saturation`),bgOpacityLoc:e.getUniformLocation(r,`u_bgOpacity`),mouseBrightnessLoc:e.getUniformLocation(r,`u_mouseBrightness`),mousePositionsLoc:e.getUniformLocation(r,`u_mousePositions`),mouseLifeFracsLoc:e.getUniformLocation(r,`u_mouseLifeFracs`),mouseRadiusLoc:e.getUniformLocation(r,`u_mouseRadius`),ripplePositionsLoc:e.getUniformLocation(r,`u_ripplePositions`),rippleRadiiLoc:e.getUniformLocation(r,`u_rippleRadii`),rippleBrightnessesLoc:e.getUniformLocation(r,`u_rippleBrightnesses`),scatterEffectFlagLoc:e.getUniformLocation(r,`u_scatterEffect`),scatterNumCharsLoc:e.getUniformLocation(r,`u_scatterNumChars`),spreadEffectFlagLoc:e.getUniformLocation(r,`u_spreadEffect`),videoModeLoc:e.getUniformLocation(r,`u_videoMode`),resLoc:e.getUniformLocation(r,`u_resolution`),sizeLoc:e.getUniformLocation(r,`u_cellsize`),numLoc:e.getUniformLocation(r,`u_numChars`),gridSizeLoc:e.getUniformLocation(r,`u_gridSize`),cropOffsetLoc:e.getUniformLocation(r,`u_cropOffset`),cropScaleLoc:e.getUniformLocation(r,`u_cropScale`),gridOffsetLoc:e.getUniformLocation(r,`u_gridOffset`)}}function p({scatterEnabledRef:e,mouseRadiusRef:t,durationRef:n,scatterCharsRef:r}){let i=new Uint8Array,a=new Float32Array,o=new Float32Array,s=new Uint8Array,c=null,l=null,u=0,d=0,f=-1,p=()=>Math.floor(Math.random()*r.current.length),m=0,h=0,g=1,_=1,v=0,y=0,b=null;return{setup(e,t,n,r,f,p,x,S){m=t,h=n,g=r,_=f,v=p,y=x,b=S;let C=t*n;i=new Uint8Array(C),a=new Float32Array(C),o=new Float32Array(C),s=new Uint8Array(C),c=null,l=null,u=0,d=0,e.activeTexture(e.TEXTURE5),e.bindTexture(e.TEXTURE_2D,S),e.texImage2D(e.TEXTURE_2D,0,e.R8UI,t,n,0,e.RED_INTEGER,e.UNSIGNED_BYTE,i)},handleMouseMove(t,n,r){e.current&&(l=c,c={x:t,y:n,t:r})},handleMouseLeave(){c=null,l=null,u=0,d=0},reset(e){i.fill(0),b&&m>0&&(e.activeTexture(e.TEXTURE5),e.bindTexture(e.TEXTURE_2D,b),e.texSubImage2D(e.TEXTURE_2D,0,0,0,m,h,e.RED_INTEGER,e.UNSIGNED_BYTE,i))},tick(r,x){if(!e.current||m===0||h===0)return;let S=performance.now(),C=f<0?0:Math.min(.1,(S-f)/1e3);f=S;let w=Math.min(x.width,x.height)*t.current,T=!1;if(c&&S-c.t<80){if(l){let e=(c.t-l.t)/1e3;if(e>0&&e<.2){let t=(c.x-l.x)/e,n=(c.y-l.y)/e;u=u*.7+t*.3,d=d*.7+n*.3}}else u=0,d=0;Math.hypot(u,d)>g*2&&(T=!0)}else u*=.6,d*=.6;if(s.fill(0),T&&c&&w>0){let e=c.x,t=c.y,n=Math.max(0,Math.floor((e-v-w)/g)),r=Math.min(m-1,Math.floor((e-v+w)/g)),l=Math.max(0,Math.floor((t-y-w)/_)),u=Math.min(h-1,Math.floor((t-y+w)/_));for(let c=l;c<=u;c++)for(let l=n;l<=r;l++){let n=v+(l+.5)*g,r=y+(c+.5)*_;if(Math.hypot(n-e,r-t)>w)continue;let u=c*m+l;s[u]=1,i[u]===0&&(i[u]=1+p(),o[u]=.5+Math.random()*2),a[u]=1}}let E=n.current;if(C>0)for(let e=0;e<h;e++)for(let t=0;t<m;t++){let n=e*m+t;if(i[n]===0||s[n])continue;let r=t>0?i[n-1]!==0:!1,c=t<m-1?i[n+1]!==0:!1,l=e>0?i[n-m]!==0:!1,u=e<h-1?i[n+m]!==0:!1,d=(!r||!c||!l||!u?5:1)*o[n]/E;a[n]-=d*C,a[n]<=0&&(i[n]=0)}r.activeTexture(r.TEXTURE5),r.bindTexture(r.TEXTURE_2D,b),r.texSubImage2D(r.TEXTURE_2D,0,0,0,m,h,r.RED_INTEGER,r.UNSIGNED_BYTE,i)}}}function m({brightenEnabledRef:e,trailLenRef:t,durationRef:n,trailDecayRef:r}){let i=[];return{handleMouseMove(n,r,a){e.current&&(i.push({x:n,y:r,t:a}),i.length>t.current&&i.shift())},tick(a,o,s){if(!e.current)return;let c=performance.now(),l=new Float32Array(t.current*2),u=new Float32Array(t.current);for(let e=0;e<i.length;e++){let t=c-i[e].t,a=Math.max(0,1-t/(n.current*1e3))**r.current;l[e*2]=i[e].x,l[e*2+1]=i[e].y,u[e]=a}a.uniform2fv(o,l),a.uniform1fv(s,u)}}}var h=10;function g({clickEnabledRef:e,clickSpeedRef:t,clickBrightnessRef:n,pixelScaleRef:r}){let i=[];return{handleClick(t,n){if(!e.current)return;let r=n.getBoundingClientRect(),a=(t.clientX-r.left)*(n.width/r.width),o=(t.clientY-r.top)*(n.height/r.height);i.push({x:a,y:o,t:performance.now()}),i.length>h&&i.shift()},tick(a,o,s,c,l){if(!e.current)return;let u=performance.now(),d=Math.hypot(o.width,o.height),f=t.current*r.current,p=new Float32Array(h*2),m=new Float32Array(h),g=new Float32Array(h);for(;i.length>0&&(u-i[0].t)*f>=d;)i.shift();for(let e=0;e<i.length;e++){let t=(u-i[e].t)*f,r=t/d,a=1+(n.current-1)*(1-r**2);p[e*2]=i[e].x,p[e*2+1]=i[e].y,m[e]=t,g[e]=a}a.uniform2fv(s,p),a.uniform1fv(c,m),a.uniform1fv(l,g)}}}function _({spreadEnabledRef:e,scatterCharsRef:t,spreadExpandDurationRef:n,spreadSpeedRef:r}){let i=new Uint8Array,a=new Uint8Array,o=0,s=0,c=1,l=1,u=0,d=0,f=null,p=-1,m=-1,h=()=>Math.floor(Math.random()*t.current.length),g=[[-1,0],[1,0],[0,-1],[0,1]];return{setup(e,t,n,r,h,g,_,v){o=t,s=n,c=r,l=h,u=g,d=_,f=v;let y=t*n;i=new Uint8Array(y),a=new Uint8Array(y),m=-1,p=-1,e.activeTexture(e.TEXTURE6),e.bindTexture(e.TEXTURE_2D,v),e.texImage2D(e.TEXTURE_2D,0,e.R8UI,t,n,0,e.RED_INTEGER,e.UNSIGNED_BYTE,i)},handleClick(t,r){if(!e.current||o===0)return;let f=r.getBoundingClientRect(),p=(t.clientX-f.left)*(r.width/f.width),g=(t.clientY-f.top)*(r.height/f.height),_=Math.floor((p-u)/c),v=Math.floor((g-d)/l);if(_<0||_>=o||v<0||v>=s)return;let y=v*o+_;i[y]=1+h(),a[y]=1,m=performance.now()+n.current*1e3},tick(t){if(!e.current||o===0||s===0)return;let n=performance.now(),c=p<0?0:Math.min(.1,(n-p)/1e3);p=n;let l=m>0&&n<m;if(!l&&m>0){for(let e=0;e<i.length;e++)a[e]===1&&(a[e]=2);m=-1}if(c>0)for(let e=0;e<s;e++)for(let t=0;t<o;t++){let n=e*o+t;if(a[n]!==0){if(l&&a[n]===1)for(let[n,l]of g){let u=e+n,d=t+l;if(u<0||u>=s||d<0||d>=o)continue;let f=u*o+d;a[f]===0&&Math.random()<r.current*c&&(i[f]=1+h(),a[f]=1)}else if(a[n]===2)for(let[l,u]of g){let d=e+l,f=t+u;if(d<0||d>=s||f<0||f>=o||i[d*o+f]===0){Math.random()<r.current*c&&(i[n]=0,a[n]=0);break}}}}t.activeTexture(t.TEXTURE6),t.bindTexture(t.TEXTURE_2D,f),t.texSubImage2D(t.TEXTURE_2D,0,0,0,o,s,t.RED_INTEGER,t.UNSIGNED_BYTE,i)}}}function v(e,t){let n=0,r=0,i=!1,a=null,o=()=>{let e=window.devicePixelRatio||1;t({width:Math.round(n*e),height:Math.round(r*e),cssWidth:n,cssHeight:r})},s=()=>{a?.();let e=window.matchMedia(`(resolution: ${window.devicePixelRatio}dppx)`),t=()=>{i||(o(),s())};e.addEventListener(`change`,t,{once:!0}),a=()=>e.removeEventListener(`change`,t)},c=new ResizeObserver(e=>{let i=e[0],a=i.contentBoxSize?.[0];n=a?a.inlineSize:i.contentRect.width,r=a?a.blockSize:i.contentRect.height;let s=i.devicePixelContentBoxSize?.[0];s?t({width:s.inlineSize,height:s.blockSize,cssWidth:n,cssHeight:r}):o()});try{c.observe(e,{box:`device-pixel-content-box`})}catch{c.observe(e),s()}return()=>{i=!0,c.disconnect(),a?.()}}function y({src:e,videoMode:r=!1,numColsRaw:s=250,brightnessRaw:c=1,saturationRaw:l=1,bgOpacityRaw:u=.3,revealEffect:d=!1,chars:h=a,mouseEffect:y=!0,clickEffect:b=!0,charMode:x=`shape`,className:S,cropFocus:C=`center`,maxDpr:w}){let T=(0,t.useRef)(null),E=(0,t.useRef)(null),D=(0,t.useRef)(null),O=(0,t.useRef)(null),k=(0,t.useRef)(null),{numCols:A,brightness:j,saturation:M,bgOpacity:N,mouseEnabled:P,mouseStyle:F,brightenEnabled:I,scatterEnabled:L,scatterChars:R,trailLen:z,trailDecay:B,duration:V,mouseRadius:H,mouseBrightness:U,clickEnabled:W,clickBrightness:G,clickSpeed:K,spreadEnabled:q,spreadExpandDuration:J,spreadSpeed:Y,revealEnabled:ee,revealDuration:te,revealEffectFlag:ne,maxDpr:X}=o(s,c,l,u,y,b,d,w),re=(0,t.useRef)(j),ie=(0,t.useRef)(M),ae=(0,t.useRef)(N),oe=(0,t.useRef)(P),se=(0,t.useRef)(F),ce=(0,t.useRef)(I),le=(0,t.useRef)(L),ue=(0,t.useRef)(U),de=(0,t.useRef)(H),fe=(0,t.useRef)(z),pe=(0,t.useRef)(B),me=(0,t.useRef)(V),Z=(0,t.useRef)(R),he=(0,t.useRef)(W),ge=(0,t.useRef)(G),_e=(0,t.useRef)(K),ve=(0,t.useRef)(q),ye=(0,t.useRef)(J),be=(0,t.useRef)(Y),xe=(0,t.useRef)(A),Se=(0,t.useRef)(r),Ce=(0,t.useRef)(C),we=(0,t.useRef)(0),Te=(0,t.useRef)(0),Ee=(0,t.useRef)(X),De=(0,t.useRef)(1),Q=(0,t.useRef)(null),Oe=(0,t.useRef)(null);(0,t.useEffect)(()=>{re.current=j,ie.current=M,ae.current=N,oe.current=P,se.current=F,ce.current=I,le.current=L,ue.current=U,de.current=H,fe.current=z,pe.current=B,me.current=V,Z.current!==R&&$.current?(Z.current=R,Ae.current?.()):Z.current=R,he.current=W,ge.current=G,_e.current=K,ve.current=q,ye.current=J,be.current=Y,xe.current=A,Se.current=r},[j,M,N,P,F,I,L,U,H,z,B,V,R,W,G,K,q,J,Y,A,r]);let ke=(0,t.useRef)(null),Ae=(0,t.useRef)(null),je=(0,t.useRef)(null),$=(0,t.useRef)(!1);return(0,t.useEffect)(()=>{$.current&&ke.current?.(A)},[A]),(0,t.useEffect)(()=>{Ce.current=C,$.current&&we.current>0&&je.current?.(we.current,Te.current)},[C]),(0,t.useEffect)(()=>{Ee.current=X,$.current&&Q.current&&Oe.current?.(Q.current)},[X]),(0,t.useEffect)(()=>{$.current=!1;let t=[],n=0,r=0,a=1,o=1,s=0,c=0,l=0,u=0,d=T.current;if(!d)return;let y=E.current;if(!y)return;let b=d.getContext(`webgl2`);if(!b)return;b.pixelStorei(b.UNPACK_ALIGNMENT,1);let S=f(b);if(!S)return;let{program:C,pass1Program:w}=S;O.current=S.atlasTexture,k.current=S.scatterAtlasTexture,b.uniform1i(S.shapeMatchingLoc,+(x===`shape`)),b.uniform1i(S.revealEffectFlagLoc,ne),b.uniform1f(S.revealProgressLoc,0);let A=p({scatterEnabledRef:le,mouseRadiusRef:de,durationRef:me,scatterCharsRef:Z}),j=m({brightenEnabledRef:ce,trailLenRef:fe,durationRef:me,trailDecayRef:pe}),M=g({clickEnabledRef:he,clickSpeedRef:_e,clickBrightnessRef:ge,pixelScaleRef:De}),N=_({spreadEnabledRef:ve,scatterCharsRef:Z,spreadExpandDurationRef:ye,spreadSpeedRef:be}),P,F=-1,I=-1,L=0,R=Array.isArray(e)?e:[e],z=R.length>1,B=document.createElement(`canvas`),V=B.getContext(`2d`),H=e=>{let f=l>0?l:d.width,p=u>0?u:d.height;a=Math.max(1,Math.floor(f/e));let m=a*2;if(V.font=`${m}px monospace`,o=Math.max(1,Math.round(m*a/V.measureText(`M`).width)),n=Math.ceil(f/a),r=Math.ceil(p/o),s=Math.floor((f-n*a)/2),c=Math.floor((p-r*o)/2),b.viewport(0,0,d.width,d.height),b.useProgram(C),b.uniform2f(S.resLoc,d.width,d.height),b.uniform2f(S.gridOffsetLoc,s,c),b.useProgram(w),b.uniform2f(S.p1ResLoc,d.width,d.height),b.uniform2f(S.p1GridOffsetLoc,s,c),b.useProgram(C),A.setup(b,n,r,a,o,s,c,S.scatterStateTexture),N.setup(b,n,r,a,o,s,c,S.spreadStateTexture),x===`shape`){t=i(h,a,o);let e=t.length,s=new Float32Array(e*8);for(let n=0;n<e;n++){let r=t[n].vector;s[n*4+0]=r[0],s[n*4+1]=r[1],s[n*4+2]=r[2],s[n*4+3]=r[3],s[e*4+n*4+0]=r[4],s[e*4+n*4+1]=r[5]}b.activeTexture(b.TEXTURE2),b.bindTexture(b.TEXTURE_2D,S.charVectorsTexture),b.texImage2D(b.TEXTURE_2D,0,b.RGBA32F,e,2,0,b.RGBA,b.FLOAT,s),b.activeTexture(b.TEXTURE3),b.bindTexture(b.TEXTURE_2D,S.fboTexture),b.texImage2D(b.TEXTURE_2D,0,b.R8UI,n,r,0,b.RED_INTEGER,b.UNSIGNED_BYTE,null),b.bindFramebuffer(b.FRAMEBUFFER,S.fbo),b.framebufferTexture2D(b.FRAMEBUFFER,b.COLOR_ATTACHMENT0,b.TEXTURE_2D,S.fboTexture,0),b.bindFramebuffer(b.FRAMEBUFFER,null);let c=Math.max(1,Math.round(a/5));b.useProgram(w),b.uniform2f(S.p1CellsizeLoc,a,o),b.uniform1i(S.p1CircleNLoc,c),b.uniform1i(S.p1NumCharsLoc,e),b.uniform1f(S.p1ExponentLoc,2),b.useProgram(C)}b.uniform2f(S.gridSizeLoc,n,r),B.width=h.length*a,B.height=o,V.font=`${o}px monospace`,V.fillStyle=`black`,V.fillRect(0,0,h.length*a,o),V.fillStyle=`white`,V.textBaseline=`top`;for(let e=0;e<h.length;e++)V.fillText(h[e],e*a,0);b.activeTexture(b.TEXTURE1),b.bindTexture(b.TEXTURE_2D,O.current),b.texImage2D(b.TEXTURE_2D,0,b.RGBA,b.RGBA,b.UNSIGNED_BYTE,B),b.uniform1f(S.numLoc,h.length),b.uniform2f(S.sizeLoc,a,o),U()},U=()=>{let e=Z.current;B.width=e.length*a,B.height=o,V.fillStyle=`black`,V.fillRect(0,0,B.width,o),V.fillStyle=`white`,V.textBaseline=`top`,V.font=`${o}px monospace`;for(let t=0;t<e.length;t++)V.fillText(e[t],t*a,0);b.activeTexture(b.TEXTURE4),b.bindTexture(b.TEXTURE_2D,k.current),b.texImage2D(b.TEXTURE_2D,0,b.RGBA,b.RGBA,b.UNSIGNED_BYTE,B),b.uniform1f(S.scatterNumCharsLoc,e.length),A.reset(b)};ke.current=H,Ae.current=U;let W=(e,t)=>{l=Math.round(e),u=Math.round(t),we.current=l,Te.current=u,d.width=l,d.height=u,H(xe.current);let n=y.videoWidth/y.videoHeight,r=d.width/d.height,i=1,a=1,o=0,s=0;if(r>n)a=n/r,s=(1-a)/2;else{i=r/n;let e=Ce.current,t=e===`left`?.25:e===`right`?.75:.5;o=Math.max(0,Math.min(1-i,t-i/2))}b.uniform2f(S.cropOffsetLoc,o,s),b.uniform2f(S.cropScaleLoc,i,a),b.useProgram(w),b.uniform2f(S.p1CropOffsetLoc,o,s),b.uniform2f(S.p1CropScaleLoc,i,a),b.useProgram(C)};je.current=W;let G=e=>{Q.current=e;let t=Math.min(1,Ee.current/(window.devicePixelRatio||1)),n=Math.max(1,Math.round(e.width*t)),r=Math.max(1,Math.round(e.height*t));De.current=e.cssWidth>0?n/e.cssWidth:1,W(n,r)};Oe.current=G;let K=e=>{if(!oe.current)return;let t=d.getBoundingClientRect(),n=(e.clientX-t.left)*(d.width/t.width),r=(e.clientY-t.top)*(d.height/t.height),i=performance.now();j.handleMouseMove(n,r,i),A.handleMouseMove(n,r,i)};d.addEventListener(`mousemove`,K);let q=()=>A.handleMouseLeave();d.addEventListener(`mouseleave`,q);let J=e=>{M.handleClick(e,d),N.handleClick(e,d)};d.addEventListener(`click`,J);let Y=()=>{if(b.uniform1i(S.videoModeLoc,+!!Se.current),b.uniform1f(S.brightnessLoc,re.current),b.uniform1f(S.saturationLoc,ie.current),b.uniform1f(S.bgOpacityLoc,ae.current),b.uniform1i(S.mouseEffectFlagLoc,+!!ce.current),b.uniform1i(S.scatterEffectFlagLoc,+!!le.current),b.uniform1i(S.clickEffectFlagLoc,+!!he.current),b.uniform1i(S.spreadEffectFlagLoc,+!!ve.current),b.uniform1f(S.mouseBrightnessLoc,ue.current),b.uniform1f(S.mouseRadiusLoc,Math.min(d.width,d.height)*de.current),ee){let e=I<0?0:Math.min(1,(performance.now()-I)/(te*1e3));b.uniform1f(S.revealProgressLoc,e)}$.current&&y.currentTime!=F&&y.readyState>=2&&(b.activeTexture(b.TEXTURE0),b.bindTexture(b.TEXTURE_2D,S.texture),b.texSubImage2D(b.TEXTURE_2D,0,0,0,b.RGBA,b.UNSIGNED_BYTE,y),F=y.currentTime),j.tick(b,S.mousePositionsLoc,S.mouseLifeFracsLoc),A.tick(b,d),M.tick(b,d,S.ripplePositionsLoc,S.rippleRadiiLoc,S.rippleBrightnessesLoc),N.tick(b),x===`shape`&&(b.bindFramebuffer(b.FRAMEBUFFER,S.fbo),b.viewport(0,0,n,r),b.useProgram(w),b.drawArrays(b.TRIANGLES,0,6),b.bindFramebuffer(b.FRAMEBUFFER,null),b.viewport(0,0,d.width,d.height),b.useProgram(C)),b.drawArrays(b.TRIANGLES,0,6),P=requestAnimationFrame(Y)},X=()=>{let e=D.current,t=Q.current;if(t&&t.width>0&&t.height>0)G(t);else{let t=window.devicePixelRatio||1,n=e.clientWidth||y.videoWidth,r=e.clientHeight||y.videoHeight;G({width:Math.round(n*t),height:Math.round(r*t),cssWidth:n,cssHeight:r})}b.activeTexture(b.TEXTURE0),b.bindTexture(b.TEXTURE_2D,S.texture),b.texImage2D(b.TEXTURE_2D,0,b.RGBA,b.RGBA,b.UNSIGNED_BYTE,y),y.play(),I=performance.now(),$.current=!0,P=requestAnimationFrame(Y)},se=()=>{L=(L+1)%R.length,y.src=R[L],y.load(),y.addEventListener(`canplay`,()=>y.play(),{once:!0})},Me=D.current?v(D.current,e=>{Q.current=e,$.current&&e.width>0&&e.height>0&&G(e)}):()=>{};return y.addEventListener(`loadeddata`,X,{once:!0}),z&&y.addEventListener(`ended`,se),y.readyState>=2&&y.currentSrc.endsWith(R[0])?X():y.currentSrc.endsWith(R[0])||y.load(),()=>{Me(),ke.current=null,Ae.current=null,je.current=null,Oe.current=null,$.current=!1,cancelAnimationFrame(P),y.removeEventListener(`loadeddata`,X),z&&y.removeEventListener(`ended`,se),d.removeEventListener(`mousemove`,K),d.removeEventListener(`mouseleave`,q),d.removeEventListener(`click`,J),b.deleteTexture(S.texture),b.deleteTexture(S.charVectorsTexture),b.deleteFramebuffer(S.fbo),b.deleteTexture(S.fboTexture),b.deleteBuffer(S.buffer),b.deleteShader(S.vertShader),b.deleteShader(S.fragShader),b.deleteShader(S.pass1FragShader),b.deleteProgram(C),b.deleteProgram(w),b.deleteTexture(O.current),b.deleteTexture(k.current),b.deleteTexture(S.scatterStateTexture),b.deleteTexture(S.spreadStateTexture)}},[e,x,h,ne,te,ee]),(0,n.jsxs)(`div`,{ref:D,className:S,style:{height:`100%`,width:`100%`},children:[(0,n.jsx)(`video`,{ref:E,muted:!0,playsInline:!0,autoPlay:!0,loop:!Array.isArray(e)||e.length===1,style:{display:`none`},children:(0,n.jsx)(`source`,{src:Array.isArray(e)?e[0]:e,type:`video/mp4`})}),(0,n.jsx)(`canvas`,{ref:T,style:{width:`100%`,height:`100%`,display:`block`}})]})}e.VideoAscii=y});
285
+ }`;function m(e){let t=l(e,e.VERTEX_SHADER,d),n=l(e,e.FRAGMENT_SHADER,f);if(!t||!n)return null;let r=u(e,t,n);if(!r)return null;let i=new Float32Array([1,1,-1,1,1,-1,-1,-1,-1,1,1,-1]),a=e.createBuffer();e.bindBuffer(e.ARRAY_BUFFER,a),e.bufferData(e.ARRAY_BUFFER,i,e.STATIC_DRAW);let o=e.getAttribLocation(r,`a_position`);e.vertexAttribPointer(o,2,e.FLOAT,!1,0,0),e.enableVertexAttribArray(o),e.useProgram(r);let s=e.createTexture();e.activeTexture(e.TEXTURE0),e.bindTexture(e.TEXTURE_2D,s),e.texParameteri(e.TEXTURE_2D,e.TEXTURE_WRAP_S,e.CLAMP_TO_EDGE),e.texParameteri(e.TEXTURE_2D,e.TEXTURE_WRAP_T,e.CLAMP_TO_EDGE),e.texParameteri(e.TEXTURE_2D,e.TEXTURE_MIN_FILTER,e.LINEAR),e.texParameteri(e.TEXTURE_2D,e.TEXTURE_MAG_FILTER,e.LINEAR);let c=e.getUniformLocation(r,`u_texture`);e.uniform1i(c,0);let m=e.createTexture();e.activeTexture(e.TEXTURE1),e.bindTexture(e.TEXTURE_2D,m),e.texParameteri(e.TEXTURE_2D,e.TEXTURE_WRAP_S,e.CLAMP_TO_EDGE),e.texParameteri(e.TEXTURE_2D,e.TEXTURE_WRAP_T,e.CLAMP_TO_EDGE),e.texParameteri(e.TEXTURE_2D,e.TEXTURE_MIN_FILTER,e.NEAREST),e.texParameteri(e.TEXTURE_2D,e.TEXTURE_MAG_FILTER,e.NEAREST);let h=e.getUniformLocation(r,`u_atlas`);e.uniform1i(h,1);let g=e.createTexture();e.activeTexture(e.TEXTURE2),e.bindTexture(e.TEXTURE_2D,g),e.texParameteri(e.TEXTURE_2D,e.TEXTURE_WRAP_S,e.CLAMP_TO_EDGE),e.texParameteri(e.TEXTURE_2D,e.TEXTURE_WRAP_T,e.CLAMP_TO_EDGE),e.texParameteri(e.TEXTURE_2D,e.TEXTURE_MIN_FILTER,e.NEAREST),e.texParameteri(e.TEXTURE_2D,e.TEXTURE_MAG_FILTER,e.NEAREST);let _=l(e,e.FRAGMENT_SHADER,p);if(!_)return null;let v=u(e,t,_);if(!v)return null;e.useProgram(v),e.uniform1i(e.getUniformLocation(v,`u_texture`),0),e.uniform1i(e.getUniformLocation(v,`u_charVectors`),2);let y=e.getUniformLocation(v,`u_resolution`),b=e.getUniformLocation(v,`u_cellsize`),x=e.getUniformLocation(v,`u_circleN`),S=e.getUniformLocation(v,`u_numCharsInt`),C=e.getUniformLocation(v,`u_shapeExponent`),w=e.getUniformLocation(v,`u_cropOffset`),T=e.getUniformLocation(v,`u_cropScale`),E=e.getUniformLocation(v,`u_gridOffset`),D=e.createTexture();e.activeTexture(e.TEXTURE3),e.bindTexture(e.TEXTURE_2D,D),e.texParameteri(e.TEXTURE_2D,e.TEXTURE_WRAP_S,e.CLAMP_TO_EDGE),e.texParameteri(e.TEXTURE_2D,e.TEXTURE_WRAP_T,e.CLAMP_TO_EDGE),e.texParameteri(e.TEXTURE_2D,e.TEXTURE_MIN_FILTER,e.NEAREST),e.texParameteri(e.TEXTURE_2D,e.TEXTURE_MAG_FILTER,e.NEAREST);let ee=e.createFramebuffer(),O=e.createTexture();e.activeTexture(e.TEXTURE4),e.bindTexture(e.TEXTURE_2D,O),e.texParameteri(e.TEXTURE_2D,e.TEXTURE_WRAP_S,e.CLAMP_TO_EDGE),e.texParameteri(e.TEXTURE_2D,e.TEXTURE_WRAP_T,e.CLAMP_TO_EDGE),e.texParameteri(e.TEXTURE_2D,e.TEXTURE_MIN_FILTER,e.NEAREST),e.texParameteri(e.TEXTURE_2D,e.TEXTURE_MAG_FILTER,e.NEAREST);let k=e.createTexture();e.activeTexture(e.TEXTURE5),e.bindTexture(e.TEXTURE_2D,k),e.texParameteri(e.TEXTURE_2D,e.TEXTURE_WRAP_S,e.CLAMP_TO_EDGE),e.texParameteri(e.TEXTURE_2D,e.TEXTURE_WRAP_T,e.CLAMP_TO_EDGE),e.texParameteri(e.TEXTURE_2D,e.TEXTURE_MIN_FILTER,e.NEAREST),e.texParameteri(e.TEXTURE_2D,e.TEXTURE_MAG_FILTER,e.NEAREST);let A=e.createTexture();return e.activeTexture(e.TEXTURE6),e.bindTexture(e.TEXTURE_2D,A),e.texParameteri(e.TEXTURE_2D,e.TEXTURE_WRAP_S,e.CLAMP_TO_EDGE),e.texParameteri(e.TEXTURE_2D,e.TEXTURE_WRAP_T,e.CLAMP_TO_EDGE),e.texParameteri(e.TEXTURE_2D,e.TEXTURE_MIN_FILTER,e.NEAREST),e.texParameteri(e.TEXTURE_2D,e.TEXTURE_MAG_FILTER,e.NEAREST),e.useProgram(r),e.uniform1i(e.getUniformLocation(r,`u_fboTexture`),3),e.uniform1i(e.getUniformLocation(r,`u_scatterAtlas`),4),e.uniform1i(e.getUniformLocation(r,`u_scatterStateTexture`),5),e.uniform1i(e.getUniformLocation(r,`u_spreadStateTexture`),6),{program:r,pass1Program:v,buffer:a,vertShader:t,fragShader:n,pass1FragShader:_,texture:s,atlasTexture:m,charVectorsTexture:g,fboTexture:D,fbo:ee,scatterAtlasTexture:O,scatterStateTexture:k,spreadStateTexture:A,p1ResLoc:y,p1CellsizeLoc:b,p1CircleNLoc:x,p1NumCharsLoc:S,p1ExponentLoc:C,p1CropOffsetLoc:w,p1CropScaleLoc:T,p1GridOffsetLoc:E,revealEffectFlagLoc:e.getUniformLocation(r,`u_revealEffectFlag`),mouseEffectFlagLoc:e.getUniformLocation(r,`u_mouseEffect`),clickEffectFlagLoc:e.getUniformLocation(r,`u_clickEffect`),shapeMatchingLoc:e.getUniformLocation(r,`u_shapeMatching`),revealProgressLoc:e.getUniformLocation(r,`u_revealProgress`),brightnessLoc:e.getUniformLocation(r,`u_brightness`),saturationLoc:e.getUniformLocation(r,`u_saturation`),bgOpacityLoc:e.getUniformLocation(r,`u_bgOpacity`),mouseBrightnessLoc:e.getUniformLocation(r,`u_mouseBrightness`),mousePositionsLoc:e.getUniformLocation(r,`u_mousePositions`),mouseLifeFracsLoc:e.getUniformLocation(r,`u_mouseLifeFracs`),mouseRadiusLoc:e.getUniformLocation(r,`u_mouseRadius`),ripplePositionsLoc:e.getUniformLocation(r,`u_ripplePositions`),rippleRadiiLoc:e.getUniformLocation(r,`u_rippleRadii`),rippleBrightnessesLoc:e.getUniformLocation(r,`u_rippleBrightnesses`),scatterEffectFlagLoc:e.getUniformLocation(r,`u_scatterEffect`),scatterNumCharsLoc:e.getUniformLocation(r,`u_scatterNumChars`),spreadEffectFlagLoc:e.getUniformLocation(r,`u_spreadEffect`),videoModeLoc:e.getUniformLocation(r,`u_videoMode`),resLoc:e.getUniformLocation(r,`u_resolution`),sizeLoc:e.getUniformLocation(r,`u_cellsize`),numLoc:e.getUniformLocation(r,`u_numChars`),gridSizeLoc:e.getUniformLocation(r,`u_gridSize`),cropOffsetLoc:e.getUniformLocation(r,`u_cropOffset`),cropScaleLoc:e.getUniformLocation(r,`u_cropScale`),gridOffsetLoc:e.getUniformLocation(r,`u_gridOffset`)}}function h({scatterEnabledRef:e,mouseRadiusRef:t,durationRef:n,scatterCharsRef:r}){let i=new Uint8Array,a=new Float32Array,o=new Float32Array,s=new Uint8Array,c=null,l=null,u=0,d=0,f=-1,p=()=>Math.floor(Math.random()*r.current.length),m=0,h=0,g=1,_=1,v=0,y=0,b=null;return{setup(e,t,n,r,f,p,x,S){m=t,h=n,g=r,_=f,v=p,y=x,b=S;let C=t*n;i=new Uint8Array(C),a=new Float32Array(C),o=new Float32Array(C),s=new Uint8Array(C),c=null,l=null,u=0,d=0,e.activeTexture(e.TEXTURE5),e.bindTexture(e.TEXTURE_2D,S),e.texImage2D(e.TEXTURE_2D,0,e.R8UI,t,n,0,e.RED_INTEGER,e.UNSIGNED_BYTE,i)},handleMouseMove(t,n,r){e.current&&(l=c,c={x:t,y:n,t:r})},handleMouseLeave(){c=null,l=null,u=0,d=0},reset(e){i.fill(0),b&&m>0&&(e.activeTexture(e.TEXTURE5),e.bindTexture(e.TEXTURE_2D,b),e.texSubImage2D(e.TEXTURE_2D,0,0,0,m,h,e.RED_INTEGER,e.UNSIGNED_BYTE,i))},tick(r,x){if(!e.current||m===0||h===0)return;let S=performance.now(),C=f<0?0:Math.min(.1,(S-f)/1e3);f=S;let w=Math.min(x.width,x.height)*t.current,T=!1;if(c&&S-c.t<80){if(l){let e=(c.t-l.t)/1e3;if(e>0&&e<.2){let t=(c.x-l.x)/e,n=(c.y-l.y)/e;u=u*.7+t*.3,d=d*.7+n*.3}}else u=0,d=0;Math.hypot(u,d)>g*2&&(T=!0)}else u*=.6,d*=.6;if(s.fill(0),T&&c&&w>0){let e=c.x,t=c.y,n=Math.max(0,Math.floor((e-v-w)/g)),r=Math.min(m-1,Math.floor((e-v+w)/g)),l=Math.max(0,Math.floor((t-y-w)/_)),u=Math.min(h-1,Math.floor((t-y+w)/_));for(let c=l;c<=u;c++)for(let l=n;l<=r;l++){let n=v+(l+.5)*g,r=y+(c+.5)*_;if(Math.hypot(n-e,r-t)>w)continue;let u=c*m+l;s[u]=1,i[u]===0&&(i[u]=1+p(),o[u]=.5+Math.random()*2),a[u]=1}}let E=n.current;if(C>0)for(let e=0;e<h;e++)for(let t=0;t<m;t++){let n=e*m+t;if(i[n]===0||s[n])continue;let r=t>0?i[n-1]!==0:!1,c=t<m-1?i[n+1]!==0:!1,l=e>0?i[n-m]!==0:!1,u=e<h-1?i[n+m]!==0:!1,d=(!r||!c||!l||!u?5:1)*o[n]/E;a[n]-=d*C,a[n]<=0&&(i[n]=0)}r.activeTexture(r.TEXTURE5),r.bindTexture(r.TEXTURE_2D,b),r.texSubImage2D(r.TEXTURE_2D,0,0,0,m,h,r.RED_INTEGER,r.UNSIGNED_BYTE,i)}}}function g({brightenEnabledRef:e,trailLenRef:t,durationRef:n,trailDecayRef:r}){let i=[];return{handleMouseMove(n,r,a){e.current&&(i.push({x:n,y:r,t:a}),i.length>t.current&&i.shift())},tick(a,o,s){if(!e.current)return;let c=performance.now(),l=new Float32Array(t.current*2),u=new Float32Array(t.current);for(let e=0;e<i.length;e++){let t=c-i[e].t,a=Math.max(0,1-t/(n.current*1e3))**r.current;l[e*2]=i[e].x,l[e*2+1]=i[e].y,u[e]=a}a.uniform2fv(o,l),a.uniform1fv(s,u)}}}var _=10;function v({clickEnabledRef:e,clickSpeedRef:t,clickBrightnessRef:n,pixelScaleRef:r}){let i=[];return{handleClick(t,n){if(!e.current)return;let r=n.getBoundingClientRect(),a=(t.clientX-r.left)*(n.width/r.width),o=(t.clientY-r.top)*(n.height/r.height);i.push({x:a,y:o,t:performance.now()}),i.length>_&&i.shift()},tick(a,o,s,c,l){if(!e.current)return;let u=performance.now(),d=Math.hypot(o.width,o.height),f=t.current*r.current,p=new Float32Array(_*2),m=new Float32Array(_),h=new Float32Array(_);for(;i.length>0&&(u-i[0].t)*f>=d;)i.shift();for(let e=0;e<i.length;e++){let t=(u-i[e].t)*f,r=t/d,a=1+(n.current-1)*(1-r**2);p[e*2]=i[e].x,p[e*2+1]=i[e].y,m[e]=t,h[e]=a}a.uniform2fv(s,p),a.uniform1fv(c,m),a.uniform1fv(l,h)}}}function y({spreadEnabledRef:e,scatterCharsRef:t,spreadExpandDurationRef:n,spreadSpeedRef:r}){let i=new Uint8Array,a=new Uint8Array,o=0,s=0,c=1,l=1,u=0,d=0,f=null,p=-1,m=-1,h=()=>Math.floor(Math.random()*t.current.length),g=[[-1,0],[1,0],[0,-1],[0,1]];return{setup(e,t,n,r,h,g,_,v){o=t,s=n,c=r,l=h,u=g,d=_,f=v;let y=t*n;i=new Uint8Array(y),a=new Uint8Array(y),m=-1,p=-1,e.activeTexture(e.TEXTURE6),e.bindTexture(e.TEXTURE_2D,v),e.texImage2D(e.TEXTURE_2D,0,e.R8UI,t,n,0,e.RED_INTEGER,e.UNSIGNED_BYTE,i)},handleClick(t,r){if(!e.current||o===0)return;let f=r.getBoundingClientRect(),p=(t.clientX-f.left)*(r.width/f.width),g=(t.clientY-f.top)*(r.height/f.height),_=Math.floor((p-u)/c),v=Math.floor((g-d)/l);if(_<0||_>=o||v<0||v>=s)return;let y=v*o+_;i[y]=1+h(),a[y]=1,m=performance.now()+n.current*1e3},tick(t){if(!e.current||o===0||s===0)return;let n=performance.now(),c=p<0?0:Math.min(.1,(n-p)/1e3);p=n;let l=m>0&&n<m;if(!l&&m>0){for(let e=0;e<i.length;e++)a[e]===1&&(a[e]=2);m=-1}if(c>0)for(let e=0;e<s;e++)for(let t=0;t<o;t++){let n=e*o+t;if(a[n]!==0){if(l&&a[n]===1)for(let[n,l]of g){let u=e+n,d=t+l;if(u<0||u>=s||d<0||d>=o)continue;let f=u*o+d;a[f]===0&&Math.random()<r.current*c&&(i[f]=1+h(),a[f]=1)}else if(a[n]===2)for(let[l,u]of g){let d=e+l,f=t+u;if(d<0||d>=s||f<0||f>=o||i[d*o+f]===0){Math.random()<r.current*c&&(i[n]=0,a[n]=0);break}}}}t.activeTexture(t.TEXTURE6),t.bindTexture(t.TEXTURE_2D,f),t.texSubImage2D(t.TEXTURE_2D,0,0,0,o,s,t.RED_INTEGER,t.UNSIGNED_BYTE,i)}}}function b(e,t){let n=0,r=0,i=!1,a=null,o=()=>{let e=window.devicePixelRatio||1;t({width:Math.round(n*e),height:Math.round(r*e),cssWidth:n,cssHeight:r})},s=()=>{a?.();let e=window.matchMedia(`(resolution: ${window.devicePixelRatio}dppx)`),t=()=>{i||(o(),s())};e.addEventListener(`change`,t,{once:!0}),a=()=>e.removeEventListener(`change`,t)},c=new ResizeObserver(e=>{let i=e[0],a=i.contentBoxSize?.[0];n=a?a.inlineSize:i.contentRect.width,r=a?a.blockSize:i.contentRect.height;let s=i.devicePixelContentBoxSize?.[0];s?t({width:s.inlineSize,height:s.blockSize,cssWidth:n,cssHeight:r}):o()});try{c.observe(e,{box:`device-pixel-content-box`})}catch{c.observe(e),s()}return()=>{i=!0,c.disconnect(),a?.()}}function x({src:e,mediaType:r=`auto`,media:o,videoMode:l=!1,numColsRaw:u=250,brightnessRaw:d=1,saturationRaw:f=1,bgOpacityRaw:p=.3,revealEffect:_=!1,chars:x=a,mouseEffect:S=!0,clickEffect:C=!0,charMode:w=`shape`,className:T,cropFocus:E=`center`,maxDpr:D}){let ee=(0,t.useRef)(null),O=(0,t.useRef)(null),k=(0,t.useRef)(null),A=(0,t.useRef)(null),te=(0,t.useRef)(null),ne=(0,t.useRef)(null),{numCols:j,brightness:M,saturation:N,bgOpacity:P,mouseEnabled:F,mouseStyle:I,brightenEnabled:re,scatterEnabled:L,scatterChars:R,trailLen:z,trailDecay:B,duration:V,mouseRadius:H,mouseBrightness:ie,clickEnabled:U,clickBrightness:W,clickSpeed:G,spreadEnabled:K,spreadExpandDuration:q,spreadSpeed:J,revealEnabled:ae,revealDuration:oe,revealEffectFlag:se,maxDpr:Y}=c(u,d,f,p,S,C,_,D),X=e===void 0,ce=e!==void 0&&s(e,r)===`image`,le=(0,t.useRef)(M),ue=(0,t.useRef)(N),de=(0,t.useRef)(P),fe=(0,t.useRef)(F),Z=(0,t.useRef)(I),pe=(0,t.useRef)(re),me=(0,t.useRef)(L),he=(0,t.useRef)(ie),ge=(0,t.useRef)(H),_e=(0,t.useRef)(z),ve=(0,t.useRef)(B),ye=(0,t.useRef)(V),Q=(0,t.useRef)(R),be=(0,t.useRef)(U),xe=(0,t.useRef)(W),Se=(0,t.useRef)(G),Ce=(0,t.useRef)(K),we=(0,t.useRef)(q),Te=(0,t.useRef)(J),Ee=(0,t.useRef)(j),De=(0,t.useRef)(l),Oe=(0,t.useRef)(E),ke=(0,t.useRef)(0),Ae=(0,t.useRef)(0),je=(0,t.useRef)(Y),Me=(0,t.useRef)(1),Ne=(0,t.useRef)(null),Pe=(0,t.useRef)(null);(0,t.useEffect)(()=>{le.current=M,ue.current=N,de.current=P,fe.current=F,Z.current=I,pe.current=re,me.current=L,he.current=ie,ge.current=H,_e.current=z,ve.current=B,ye.current=V,Q.current!==R&&$.current?(Q.current=R,Ie.current?.()):Q.current=R,be.current=U,xe.current=W,Se.current=G,Ce.current=K,we.current=q,Te.current=J,Ee.current=j,De.current=l},[M,N,P,F,I,re,L,ie,H,z,B,V,R,U,W,G,K,q,J,j,l]);let Fe=(0,t.useRef)(null),Ie=(0,t.useRef)(null),Le=(0,t.useRef)(null),$=(0,t.useRef)(!1);(0,t.useEffect)(()=>{$.current&&Fe.current?.(j)},[j]),(0,t.useEffect)(()=>{Oe.current=E,$.current&&ke.current>0&&Le.current?.(ke.current,Ae.current)},[E]),(0,t.useEffect)(()=>{je.current=Y,$.current&&Ne.current&&Pe.current?.(Ne.current)},[Y]),(0,t.useEffect)(()=>{$.current=!1;let t=[],n=0,r=0,a=1,s=1,c=0,l=0,u=0,d=0,f=ee.current;if(!f)return;let p=X?o:ce?k.current:O.current;if(!p)return;let _=p instanceof HTMLVideoElement?p:null,S=p instanceof HTMLImageElement?p:null,C=()=>p instanceof HTMLVideoElement?{width:p.videoWidth,height:p.videoHeight}:{width:p.naturalWidth,height:p.naturalHeight},T=f.getContext(`webgl2`);if(!T)return;T.pixelStorei(T.UNPACK_ALIGNMENT,1);let E=m(T);if(!E)return;let{program:D,pass1Program:j}=E;te.current=E.atlasTexture,ne.current=E.scatterAtlasTexture,T.uniform1i(E.shapeMatchingLoc,+(w===`shape`)),T.uniform1i(E.revealEffectFlagLoc,se),T.uniform1f(E.revealProgressLoc,0);let M=h({scatterEnabledRef:me,mouseRadiusRef:ge,durationRef:ye,scatterCharsRef:Q}),N=g({brightenEnabledRef:pe,trailLenRef:_e,durationRef:ye,trailDecayRef:ve}),P=v({clickEnabledRef:be,clickSpeedRef:Se,clickBrightnessRef:xe,pixelScaleRef:Me}),F=y({spreadEnabledRef:Ce,scatterCharsRef:Q,spreadExpandDurationRef:we,spreadSpeedRef:Te}),I=0,re=-1,L=-1,R=0,z=Array.isArray(e)?e:e===void 0?[]:[e],B=z.length>1,V=document.createElement(`canvas`),H=V.getContext(`2d`),ie=e=>{let o=u>0?u:f.width,p=d>0?d:f.height;a=Math.max(1,Math.floor(o/e));let m=a*2;if(H.font=`${m}px monospace`,s=Math.max(1,Math.round(m*a/H.measureText(`M`).width)),n=Math.ceil(o/a),r=Math.ceil(p/s),c=Math.floor((o-n*a)/2),l=Math.floor((p-r*s)/2),T.viewport(0,0,f.width,f.height),T.useProgram(D),T.uniform2f(E.resLoc,f.width,f.height),T.uniform2f(E.gridOffsetLoc,c,l),T.useProgram(j),T.uniform2f(E.p1ResLoc,f.width,f.height),T.uniform2f(E.p1GridOffsetLoc,c,l),T.useProgram(D),M.setup(T,n,r,a,s,c,l,E.scatterStateTexture),F.setup(T,n,r,a,s,c,l,E.spreadStateTexture),w===`shape`){t=i(x,a,s);let e=t.length,o=new Float32Array(e*8);for(let n=0;n<e;n++){let r=t[n].vector;o[n*4+0]=r[0],o[n*4+1]=r[1],o[n*4+2]=r[2],o[n*4+3]=r[3],o[e*4+n*4+0]=r[4],o[e*4+n*4+1]=r[5]}T.activeTexture(T.TEXTURE2),T.bindTexture(T.TEXTURE_2D,E.charVectorsTexture),T.texImage2D(T.TEXTURE_2D,0,T.RGBA32F,e,2,0,T.RGBA,T.FLOAT,o),T.activeTexture(T.TEXTURE3),T.bindTexture(T.TEXTURE_2D,E.fboTexture),T.texImage2D(T.TEXTURE_2D,0,T.R8UI,n,r,0,T.RED_INTEGER,T.UNSIGNED_BYTE,null),T.bindFramebuffer(T.FRAMEBUFFER,E.fbo),T.framebufferTexture2D(T.FRAMEBUFFER,T.COLOR_ATTACHMENT0,T.TEXTURE_2D,E.fboTexture,0),T.bindFramebuffer(T.FRAMEBUFFER,null);let c=Math.max(1,Math.round(a/5));T.useProgram(j),T.uniform2f(E.p1CellsizeLoc,a,s),T.uniform1i(E.p1CircleNLoc,c),T.uniform1i(E.p1NumCharsLoc,e),T.uniform1f(E.p1ExponentLoc,2),T.useProgram(D)}T.uniform2f(E.gridSizeLoc,n,r),V.width=x.length*a,V.height=s,H.font=`${s}px monospace`,H.fillStyle=`black`,H.fillRect(0,0,x.length*a,s),H.fillStyle=`white`,H.textBaseline=`top`;for(let e=0;e<x.length;e++)H.fillText(x[e],e*a,0);T.activeTexture(T.TEXTURE1),T.bindTexture(T.TEXTURE_2D,te.current),T.texImage2D(T.TEXTURE_2D,0,T.RGBA,T.RGBA,T.UNSIGNED_BYTE,V),T.uniform1f(E.numLoc,x.length),T.uniform2f(E.sizeLoc,a,s),U()},U=()=>{let e=Q.current;V.width=e.length*a,V.height=s,H.fillStyle=`black`,H.fillRect(0,0,V.width,s),H.fillStyle=`white`,H.textBaseline=`top`,H.font=`${s}px monospace`;for(let t=0;t<e.length;t++)H.fillText(e[t],t*a,0);T.activeTexture(T.TEXTURE4),T.bindTexture(T.TEXTURE_2D,ne.current),T.texImage2D(T.TEXTURE_2D,0,T.RGBA,T.RGBA,T.UNSIGNED_BYTE,V),T.uniform1f(E.scatterNumCharsLoc,e.length),M.reset(T)};Fe.current=ie,Ie.current=U;let W=(e,t)=>{u=Math.round(e),d=Math.round(t),ke.current=u,Ae.current=d,f.width=u,f.height=d,ie(Ee.current);let n=C(),r=n.width/n.height,i=f.width/f.height,a=1,o=1,s=0,c=0;if(i>r)o=r/i,c=(1-o)/2;else{a=i/r;let e=Oe.current,t=e===`left`?.25:e===`right`?.75:.5;s=Math.max(0,Math.min(1-a,t-a/2))}T.uniform2f(E.cropOffsetLoc,s,c),T.uniform2f(E.cropScaleLoc,a,o),T.useProgram(j),T.uniform2f(E.p1CropOffsetLoc,s,c),T.uniform2f(E.p1CropScaleLoc,a,o),T.useProgram(D)};Le.current=W;let G=e=>{Ne.current=e;let t=Math.min(1,je.current/(window.devicePixelRatio||1)),n=Math.max(1,Math.round(e.width*t)),r=Math.max(1,Math.round(e.height*t));Me.current=e.cssWidth>0?n/e.cssWidth:1,W(n,r)};Pe.current=G;let K=e=>{if(!fe.current)return;let t=f.getBoundingClientRect(),n=(e.clientX-t.left)*(f.width/t.width),r=(e.clientY-t.top)*(f.height/t.height),i=performance.now();N.handleMouseMove(n,r,i),M.handleMouseMove(n,r,i)};f.addEventListener(`mousemove`,K);let q=()=>M.handleMouseLeave();f.addEventListener(`mouseleave`,q);let J=e=>{P.handleClick(e,f),F.handleClick(e,f)};f.addEventListener(`click`,J);let Y=()=>{if(T.uniform1i(E.videoModeLoc,+!!De.current),T.uniform1f(E.brightnessLoc,le.current),T.uniform1f(E.saturationLoc,ue.current),T.uniform1f(E.bgOpacityLoc,de.current),T.uniform1i(E.mouseEffectFlagLoc,+!!pe.current),T.uniform1i(E.scatterEffectFlagLoc,+!!me.current),T.uniform1i(E.clickEffectFlagLoc,+!!be.current),T.uniform1i(E.spreadEffectFlagLoc,+!!Ce.current),T.uniform1f(E.mouseBrightnessLoc,he.current),T.uniform1f(E.mouseRadiusLoc,Math.min(f.width,f.height)*ge.current),ae){let e=L<0?0:Math.min(1,(performance.now()-L)/(oe*1e3));T.uniform1f(E.revealProgressLoc,e)}$.current&&_&&_.currentTime!=re&&_.readyState>=2&&(T.activeTexture(T.TEXTURE0),T.bindTexture(T.TEXTURE_2D,E.texture),T.texSubImage2D(T.TEXTURE_2D,0,0,0,T.RGBA,T.UNSIGNED_BYTE,_),re=_.currentTime),N.tick(T,E.mousePositionsLoc,E.mouseLifeFracsLoc),M.tick(T,f),P.tick(T,f,E.ripplePositionsLoc,E.rippleRadiiLoc,E.rippleBrightnessesLoc),F.tick(T),w===`shape`&&(T.bindFramebuffer(T.FRAMEBUFFER,E.fbo),T.viewport(0,0,n,r),T.useProgram(j),T.drawArrays(T.TRIANGLES,0,6),T.bindFramebuffer(T.FRAMEBUFFER,null),T.viewport(0,0,f.width,f.height),T.useProgram(D)),T.drawArrays(T.TRIANGLES,0,6),I=requestAnimationFrame(Y)},Z=()=>{let e=A.current,t=Ne.current;if(t&&t.width>0&&t.height>0)G(t);else{let t=window.devicePixelRatio||1,n=C(),r=e.clientWidth||n.width,i=e.clientHeight||n.height;G({width:Math.round(r*t),height:Math.round(i*t),cssWidth:r,cssHeight:i})}T.activeTexture(T.TEXTURE0),T.bindTexture(T.TEXTURE_2D,E.texture),T.texImage2D(T.TEXTURE_2D,0,T.RGBA,T.RGBA,T.UNSIGNED_BYTE,p),_?.play(),L=performance.now(),$.current=!0,cancelAnimationFrame(I),I=requestAnimationFrame(Y)},Re=()=>{_&&(R=(R+1)%z.length,_.src=z[R],_.load(),_.addEventListener(`canplay`,()=>_.play(),{once:!0}))},ze=A.current?b(A.current,e=>{Ne.current=e,$.current&&e.width>0&&e.height>0&&G(e)}):()=>{};return _?(_.addEventListener(`loadeddata`,Z,{once:!X}),B&&_.addEventListener(`ended`,Re),X?_.readyState>=2&&Z():_.readyState>=2&&_.currentSrc.endsWith(z[0])?Z():_.currentSrc.endsWith(z[0])||_.load()):S&&(S.complete&&S.naturalWidth>0?Z():S.addEventListener(`load`,Z,{once:!0})),()=>{ze(),Fe.current=null,Ie.current=null,Le.current=null,Pe.current=null,$.current=!1,cancelAnimationFrame(I),_?(_.removeEventListener(`loadeddata`,Z),B&&_.removeEventListener(`ended`,Re)):S?.removeEventListener(`load`,Z),f.removeEventListener(`mousemove`,K),f.removeEventListener(`mouseleave`,q),f.removeEventListener(`click`,J),T.deleteTexture(E.texture),T.deleteTexture(E.charVectorsTexture),T.deleteFramebuffer(E.fbo),T.deleteTexture(E.fboTexture),T.deleteBuffer(E.buffer),T.deleteShader(E.vertShader),T.deleteShader(E.fragShader),T.deleteShader(E.pass1FragShader),T.deleteProgram(D),T.deleteProgram(j),T.deleteTexture(te.current),T.deleteTexture(ne.current),T.deleteTexture(E.scatterStateTexture),T.deleteTexture(E.spreadStateTexture)}},[e,o,X,w,x,se,oe,ae,ce]);let Re=Array.isArray(e)?e[0]:e;return(0,n.jsxs)(`div`,{ref:A,className:T,style:{height:`100%`,width:`100%`},children:[X?null:ce?(0,n.jsx)(`img`,{ref:k,src:Re,alt:``,style:{display:`none`}}):(0,n.jsx)(`video`,{ref:O,muted:!0,playsInline:!0,autoPlay:!0,loop:!Array.isArray(e)||e.length===1,style:{display:`none`},children:(0,n.jsx)(`source`,{src:Re,type:`video/mp4`})}),(0,n.jsx)(`canvas`,{ref:ee,style:{width:`100%`,height:`100%`,display:`block`}})]})}e.VideoAscii=x});
package/package.json CHANGED
@@ -1,8 +1,8 @@
1
1
  {
2
2
  "name": "react-video-ascii",
3
- "version": "1.2.0",
3
+ "version": "1.4.0",
4
4
  "type": "module",
5
- "description": "React component that renders videos as ASCII animations using WebGL2.",
5
+ "description": "React component that renders videos and images as ASCII animations using WebGL2.",
6
6
  "author": "Lucas Jin",
7
7
  "repository": {
8
8
  "type": "git",