@fxshelf/glyph-rain 0.1.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/LICENSE +21 -0
- package/README.md +51 -0
- package/dist/glyph-rain.iife.js +865 -0
- package/dist/glyph-rain.iife.js.map +1 -0
- package/dist/index.cjs +825 -0
- package/dist/index.cjs.map +1 -0
- package/dist/index.d.cts +77 -0
- package/dist/index.d.ts +77 -0
- package/dist/index.js +819 -0
- package/dist/index.js.map +1 -0
- package/docs//344/275/277/347/224/250/350/257/264/346/230/216.md +45 -0
- package/docs//345/212/250/346/225/210/350/257/264/346/230/216-/344/270/223/344/270/232.md +18 -0
- package/docs//345/212/250/346/225/210/350/257/264/346/230/216-/345/244/247/347/231/275/350/257/235.md +7 -0
- package/package.json +85 -0
- package/src/core/atlas.ts +28 -0
- package/src/core/createGlyphRain.ts +514 -0
- package/src/core/shaders.ts +208 -0
- package/src/core/supports.ts +13 -0
- package/src/core/types.ts +95 -0
- package/src/react/GlyphRain.tsx +126 -0
- package/src/react/index.ts +10 -0
- package/src/vue/GlyphRain.vue +181 -0
- package/src/vue/index.ts +1 -0
- package/src/vue-shim.d.ts +5 -0
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/index.ts","../src/browser/react.ts","../src/core/atlas.ts","../src/core/shaders.ts","../src/core/supports.ts","../src/core/types.ts","../src/core/createGlyphRain.ts","../src/browser/jsx-runtime.ts","../src/react/GlyphRain.tsx"],"sourcesContent":["export {\n GlyphRain,\n createGlyphRain,\n supportsHtmlInCanvas,\n DEFAULT_CHARSET,\n DEFAULTS,\n type GlyphRainProps,\n type GlyphRainElements,\n type GlyphRainInstance,\n type GlyphRainOptions,\n} from './react'\n","// Browser (<script>) build only.\n// Reads React from the global scope — the host page must load a UMD build\n// of React first (e.g. react@18.3.x; React 19 ships no UMD build).\nimport type * as ReactModule from 'react'\n\ntype ReactGlobal = typeof ReactModule\n\nconst globalReact = (globalThis as { React?: ReactGlobal }).React\n\nif (!globalReact) {\n throw new Error(\n '[glyph-rain] browser build: global \"React\" not found. ' +\n 'Load a UMD build of React (react@18.3.x) before glyph-rain.',\n )\n}\n\nexport const Fragment = globalReact.Fragment\nexport const createElement = globalReact.createElement\nexport const useEffect = globalReact.useEffect\nexport const useRef = globalReact.useRef\nexport const useState = globalReact.useState\nexport const useSyncExternalStore = globalReact.useSyncExternalStore\n","export function buildAtlas(charset: string): {\n canvas: HTMLCanvasElement\n count: number\n grid: number\n} {\n const glyphs = Array.from(new Set(Array.from(charset))).filter(\n (g) => g.trim().length > 0,\n )\n if (glyphs.length === 0) glyphs.push('0', '1')\n const count = glyphs.length\n const grid = Math.max(Math.ceil(Math.sqrt(count)), 1)\n const cellPx = 64\n const canvas = document.createElement('canvas')\n canvas.width = grid * cellPx\n canvas.height = grid * cellPx\n const ctx = canvas.getContext('2d')!\n ctx.clearRect(0, 0, canvas.width, canvas.height)\n ctx.fillStyle = '#ffffff'\n ctx.textAlign = 'center'\n ctx.textBaseline = 'middle'\n ctx.font = `600 ${Math.round(cellPx * 0.72)}px ui-monospace, SFMono-Regular, Menlo, monospace`\n for (let i = 0; i < count; i++) {\n const x = ((i % grid) + 0.5) * cellPx\n const y = (Math.floor(i / grid) + 0.5) * cellPx\n ctx.fillText(glyphs[i]!, x, y)\n }\n return { canvas, count, grid }\n}\n","export const VERT = `#version 300 es\nprecision highp float;\nlayout(location = 0) in vec2 aPos;\nout vec2 vUv;\nvoid main () {\n vUv = aPos * 0.5 + 0.5;\n gl_Position = vec4(aPos, 0.0, 1.0);\n}`\n\nexport const FRAG = `#version 300 es\nprecision highp float;\nin vec2 vUv;\nout vec4 outColor;\nuniform sampler2D uContent;\nuniform sampler2D uAtlas;\nuniform sampler2D uWake;\nuniform vec2 uResolution;\nuniform float uTime;\nuniform float uCell;\nuniform float uGlyphCount;\nuniform float uAtlasGrid;\nuniform vec3 uColor;\nuniform vec3 uHeadColor;\nuniform float uSpeed;\nuniform float uSpeedVar;\nuniform float uDensity;\nuniform float uTrail;\nuniform float uGlow;\nuniform float uMutate;\nuniform float uFlicker;\nuniform float uLayers;\nuniform float uDim;\nuniform float uLight;\nuniform float uLightRadius;\nuniform float uLightHeight;\nuniform float uRelief;\nuniform float uStir;\nuniform float uScroll;\nuniform float uPageLum;\nuniform float uHasContent;\n\nfloat hash11(float p) {\n p = fract(p * 0.1031);\n p *= p + 33.33;\n p *= p + p;\n return fract(p);\n}\n\nfloat hash21(vec2 p) {\n vec3 q = fract(vec3(p.xyx) * 0.1031);\n q += dot(q, q.yzx + 33.33);\n return fract((q.x + q.y) * q.z);\n}\n\nfloat glyphMask(vec2 px, float cell, float seed) {\n vec2 id = floor(px / cell);\n vec2 f = fract(px / cell);\n f = f * 0.74 + 0.13;\n f.x = 1.0 - f.x;\n float tick = floor(uTime * uMutate * 1.6 + hash21(id + seed) * 9.0);\n float idx = floor(\n hash21(id * 1.71 + vec2(seed + tick * 7.31, tick * 0.613)) * uGlyphCount\n );\n float gx = mod(idx, uAtlasGrid);\n float gy = floor(idx / uAtlasGrid);\n vec2 auv = (vec2(gx, gy) + f) / uAtlasGrid;\n return texture(uAtlas, auv).a;\n}\n\nfloat colSpeed(float col, float seed) {\n float variance = mix(0.35, 1.0, hash11(col * 0.37 + seed + 3.1));\n return uSpeed * mix(1.0, variance, uSpeedVar) * 0.5;\n}\n\nfloat colOffset(float col, float seed) {\n return hash11(col * 1.713 + seed) * 9.0;\n}\n\nvec2 wakeAt(float xpx) {\n float u = clamp(xpx / max(uResolution.x, 1.0), 0.0, 1.0);\n return texture(uWake, vec2(u, 0.5)).rg;\n}\n\nfloat lum(vec3 c) {\n return dot(c, vec3(0.299, 0.587, 0.114));\n}\n\nvoid main () {\n vec2 frag = vec2(gl_FragCoord.x, uResolution.y - gl_FragCoord.y + uScroll);\n vec2 cuv = vec2(vUv.x, 1.0 - vUv.y);\n float yn = 1.0 - frag.y / uResolution.y;\n\n const float scales[3] = float[3](1.0, 1.5, 2.2);\n const float weights[3] = float[3](1.0, 0.45, 0.22);\n const float seeds[3] = float[3](0.0, 19.7, 41.3);\n\n float g = 0.0;\n float headG = 0.0;\n for (int l = 0; l < 3; l++) {\n if (float(l) >= uLayers) break;\n float cell = uCell * scales[l];\n float col = floor(frag.x / cell);\n float sp = colSpeed(col, seeds[l]);\n float off = colOffset(col, seeds[l]);\n vec2 wk = uStir > 0.0 ? wakeAt((col + 0.5) * cell) : vec2(0.0);\n float exc = uStir * wk.y;\n float T = uTime * sp + off + sp * wk.x;\n float phase = fract(yn + T);\n float cyc = floor(yn + T);\n float gate = step(hash21(vec2(col, cyc) + seeds[l]), uDensity);\n float b = clamp(uTrail / (phase * 22.0), 0.0, 1.3) - 0.04;\n if (b <= 0.0 || gate < 0.5) continue;\n float flick = 1.0 + uFlicker * 0.6 *\n sin(uTime * 14.0 + hash21(vec2(col, cyc)) * 40.0 + phase * 30.0);\n float m = glyphMask(frag, cell, seeds[l] + cyc * 0.173);\n float cellYn = cell / uResolution.y;\n float head = 1.0 - smoothstep(0.0, cellYn * 1.2, phase);\n g += m * b * flick * weights[l] * (1.0 + head * uGlow * 1.4) *\n (1.0 + exc * 1.6);\n headG += m * head * weights[l] * uGlow * (1.0 + exc * 1.1);\n }\n g = max(g, 0.0);\n\n if (uHasContent < 0.5) {\n vec3 rainCol = mix(uColor, uHeadColor, clamp(headG, 0.0, 1.0));\n float a = clamp(g, 0.0, 1.0);\n outColor = vec4(rainCol * a, a);\n return;\n }\n\n vec2 e = vec2(3.0, 0.0) / uResolution;\n vec4 content = texture(uContent, cuv);\n float lC = lum(content.rgb);\n float lX1 = lum(texture(uContent, clamp(cuv - e.xy, 0.0, 1.0)).rgb);\n float lX2 = lum(texture(uContent, clamp(cuv + e.xy, 0.0, 1.0)).rgb);\n float lY1 = lum(texture(uContent, clamp(cuv - e.yx, 0.0, 1.0)).rgb);\n float lY2 = lum(texture(uContent, clamp(cuv + e.yx, 0.0, 1.0)).rgb);\n vec3 N = normalize(vec3(\n -(lX2 - lX1) * uRelief * 4.0,\n -(lY2 - lY1) * uRelief * 4.0,\n 1.0\n ));\n float reliefMix = clamp(uRelief, 0.0, 1.0);\n vec2 e2 = vec2(30.0, 0.0) / uResolution;\n float bgL = (lC\n + lum(texture(uContent, clamp(cuv - e2.xy, 0.0, 1.0)).rgb)\n + lum(texture(uContent, clamp(cuv + e2.xy, 0.0, 1.0)).rgb)\n + lum(texture(uContent, clamp(cuv - e2.yx, 0.0, 1.0)).rgb)\n + lum(texture(uContent, clamp(cuv + e2.yx, 0.0, 1.0)).rgb)) * 0.2;\n float bright = smoothstep(0.55, 0.8, uPageLum) * smoothstep(0.2, 0.45, bgL);\n\n float lightSum = 0.0;\n float sigma2 = uLightRadius * uLightRadius * 0.5;\n float reach = uLightRadius * 1.6;\n float stride = max(1.0, ceil((uLightRadius * 1.7) / (uCell * 12.0)));\n float baseCol = floor(floor(frag.x / uCell) / stride);\n for (int o = -12; o <= 12; o++) {\n float c = (baseCol + float(o)) * stride;\n if (c < 0.0) continue;\n float dx = (c + 0.5) * uCell - frag.x;\n float wx = 1.0 - smoothstep(reach * 0.7, reach, abs(dx));\n if (wx <= 0.0) continue;\n float sp = colSpeed(c, 0.0);\n float off = colOffset(c, 0.0);\n vec2 wk = uStir > 0.0 ? wakeAt((c + 0.5) * uCell) : vec2(0.0);\n float lampBoost = 1.0 + uStir * wk.y * 1.4;\n float T = uTime * sp + off + sp * wk.x;\n float s = 1.0 - frag.y / uResolution.y + T;\n float k0 = floor(s);\n for (int h = 0; h < 2; h++) {\n float k = k0 + float(h);\n float gate = step(hash21(vec2(c, k)), uDensity);\n if (gate < 0.5) continue;\n float lamp = 0.6 + 0.4 * hash11(c * 3.97 + k * 0.713);\n float headDocY = (1.0 - (k - T)) * uResolution.y;\n vec3 dv = vec3(dx, headDocY - frag.y, uLightHeight);\n float d2 = dot(dv, dv);\n float att = exp(-d2 / sigma2);\n vec3 L = dv * inversesqrt(max(d2, 1.0));\n float dif = mix(1.0, 0.25 + 0.75 * max(dot(N, L), 0.0), reliefMix);\n lightSum += att * dif * wx * lamp * lampBoost;\n }\n }\n float ls = lightSum * uLight * (0.6 + 0.4 * uGlow);\n float lit = 2.2 * ls / (ls + 1.1);\n\n float dimEff = uDim * (1.0 - bright);\n float shade = mix(\n clamp(1.0 - dimEff, 0.0, 1.0),\n 1.0,\n smoothstep(0.0, 1.0, lit)\n );\n vec3 col = content.rgb * shade;\n col += uColor * lit * 0.14 * (1.0 - lC * 0.75) * (1.0 - bright);\n col += uColor * clamp(lit - 1.0, 0.0, 1.0) * 0.1 * (1.0 - bright);\n\n vec3 glyphCol = mix(uColor, uColor * 0.24 + vec3(0.02), lC * (1.0 - bright));\n glyphCol = mix(glyphCol, uHeadColor, clamp(headG, 0.0, 1.0));\n glyphCol = mix(glyphCol, vec3(1.0), bright * clamp(headG - 0.6, 0.0, 0.4));\n float gA = clamp(g, 0.0, 1.0);\n float knock = gA * mix(mix(0.3, 0.88, lC), 1.0, bright);\n float paint = min(g, 1.5) * mix(1.0, mix(0.92, 1.0, bright), lC);\n col = col * (1.0 - knock) + glyphCol * paint;\n\n float alpha = max(content.a, gA);\n col = clamp(col, vec3(0.0), vec3(alpha));\n outColor = vec4(col, alpha);\n}`\n","import type { ElementImageContext, PaintableCanvas } from './types'\n\n/** True when Chrome's experimental html-in-canvas APIs are available. */\nexport function supportsHtmlInCanvas(): boolean {\n if (typeof document === 'undefined') return false\n const probe = document.createElement('canvas') as PaintableCanvas\n const ctx = probe.getContext('2d') as ElementImageContext | null\n return Boolean(\n ctx &&\n typeof ctx.drawElementImage === 'function' &&\n typeof probe.requestPaint === 'function',\n )\n}\n","export type GlyphRainOptions = {\n /** Characters used for the falling glyphs. Deduplicated into a glyph atlas. */\n charset?: string\n /** Size of one glyph cell in CSS pixels (8 to 64). */\n cell?: number\n /** Rain color as [r, g, b] in 0-1 range. */\n color?: [number, number, number]\n /** Color of the bright head glyph as [r, g, b] in 0-1 range. */\n headColor?: [number, number, number]\n /** Fall speed in screen heights per second (0.05 to 3). */\n speed?: number\n /** Per-column speed variation (0 to 1). */\n speedVariance?: number\n /** Fraction of drops that spawn each cycle (0 to 1). */\n density?: number\n /** Length multiplier for the fading trails (0.2 to 3). */\n trail?: number\n /** Brightness of the drop heads and the light they cast (0 to 3). */\n glow?: number\n /** How fast glyphs mutate into other characters (0 to 4). */\n mutate?: number\n /** Random brightness flicker of the streaks (0 to 1). */\n flicker?: number\n /** Parallax rain layers behind the front one (1 to 3). */\n layers?: number\n /** How much the unlit page dims (0 to 1). 0 keeps it fully readable. */\n dim?: number\n /** Strength of the light the drops shine onto the page (0 to 3). */\n light?: number\n /** Radius of each drop's light pool in CSS pixels (20 to 600). */\n lightRadius?: number\n /** How high above the page the lights float, in CSS pixels. Higher is softer. */\n lightHeight?: number\n /** Embossed 3D shading of the page under the lights (0 to 2). */\n relief?: number\n /** How strongly the cursor stirs the rain as it passes (0 to 1). 0 disables it. */\n stir?: number\n /** How far the stirring reaches to either side of the cursor, in CSS pixels. */\n stirRadius?: number\n /** Seconds the stirred wake takes to settle back to its own rhythm. */\n settle?: number\n}\n\nexport type GlyphRainElements = {\n /** Canvas with layoutsubtree that hosts the HTML content. */\n source: HTMLCanvasElement\n /** The element inside the source canvas that gets captured. */\n content: HTMLElement\n /** Canvas the WebGL effect renders to. */\n output: HTMLCanvasElement\n}\n\nexport type GlyphRainInstance = {\n /** Update effect options live. */\n setOptions: (options: GlyphRainOptions) => void\n /** Re-read canvas size. Call when the element is resized. */\n resize: () => void\n /** Stop the loop and release all GPU resources. */\n destroy: () => void\n}\n\nexport const DEFAULT_CHARSET =\n 'アイウエオカキクケコサシスセソタチツテトナニヌネノハヒフヘホマミムメモヤユヨラリルレロワン0123456789Z*+-<>¦=:.'\n\nexport const DEFAULTS: Required<GlyphRainOptions> = {\n charset: DEFAULT_CHARSET,\n cell: 15,\n color: [0.267, 0.455, 1],\n headColor: [0.169, 0.416, 1],\n speed: 0.2,\n speedVariance: 0.5,\n density: 0.15,\n trail: 0.65,\n glow: 1.75,\n mutate: 0,\n flicker: 0,\n layers: 2,\n dim: 0.5,\n light: 2.8,\n lightRadius: 240,\n lightHeight: 172,\n relief: 0.05,\n stir: 0.7,\n stirRadius: 260,\n settle: 0.9,\n}\n\nexport type PaintableCanvas = HTMLCanvasElement & {\n onpaint?: (() => void) | null\n requestPaint?: () => void\n}\n\nexport type ElementImageContext = CanvasRenderingContext2D & {\n drawElementImage?: (element: Element, x: number, y: number) => void\n}\n","import { buildAtlas } from './atlas'\nimport { FRAG, VERT } from './shaders'\nimport { supportsHtmlInCanvas } from './supports'\nimport {\n DEFAULTS,\n type ElementImageContext,\n type GlyphRainElements,\n type GlyphRainInstance,\n type GlyphRainOptions,\n type PaintableCanvas,\n} from './types'\n\nexport function createGlyphRain(\n elements: GlyphRainElements,\n options: GlyphRainOptions = {},\n): GlyphRainInstance | null {\n const config = { ...DEFAULTS, ...options }\n const { source, content, output } = elements\n\n const maybeGl = output.getContext('webgl2', {\n alpha: true,\n depth: false,\n stencil: false,\n antialias: false,\n premultipliedAlpha: true,\n })\n if (!maybeGl || maybeGl.isContextLost()) return null\n const gl: WebGL2RenderingContext = maybeGl\n\n const sourceCtx = source.getContext('2d') as ElementImageContext | null\n const paintable = source as PaintableCanvas\n const htmlInCanvas = Boolean(\n sourceCtx &&\n typeof sourceCtx.drawElementImage === 'function' &&\n typeof paintable.requestPaint === 'function',\n )\n\n let contentDirty = false\n let pageLum = 0\n let wake = () => {}\n\n function readPageLum(): number {\n try {\n const probe = document.createElement('canvas')\n probe.width = probe.height = 1\n const pctx = probe.getContext('2d', { willReadFrequently: true })\n if (!pctx) return 0\n let el: Element | null = content\n while (el instanceof Element) {\n const bgColor = getComputedStyle(el).backgroundColor\n if (bgColor && bgColor !== 'transparent') {\n pctx.clearRect(0, 0, 1, 1)\n pctx.fillStyle = bgColor\n pctx.fillRect(0, 0, 1, 1)\n const d = pctx.getImageData(0, 0, 1, 1).data\n if (d[3]! > 128) {\n return (0.2126 * d[0]! + 0.7152 * d[1]! + 0.0722 * d[2]!) / 255\n }\n }\n el = el.parentElement\n }\n } catch {\n /* ignore */\n }\n return 0\n }\n\n if (htmlInCanvas) {\n paintable.onpaint = () => {\n try {\n sourceCtx!.reset()\n sourceCtx!.drawElementImage!(content, 0, 0)\n contentDirty = true\n wake()\n } catch {\n /* ignore */\n }\n }\n }\n\n function compile(type: number, text: string): WebGLShader {\n const shader = gl.createShader(type)!\n gl.shaderSource(shader, text)\n gl.compileShader(shader)\n if (!gl.getShaderParameter(shader, gl.COMPILE_STATUS)) {\n console.error('GlyphRain shader error:', gl.getShaderInfoLog(shader))\n }\n return shader\n }\n\n const vertexShader = compile(gl.VERTEX_SHADER, VERT)\n const fragmentShader = compile(gl.FRAGMENT_SHADER, FRAG)\n const program = gl.createProgram()!\n gl.attachShader(program, vertexShader)\n gl.attachShader(program, fragmentShader)\n gl.linkProgram(program)\n\n const uniforms: Record<string, WebGLUniformLocation> = {}\n const uniformCount = gl.getProgramParameter(program, gl.ACTIVE_UNIFORMS)\n for (let i = 0; i < uniformCount; i++) {\n const info = gl.getActiveUniform(program, i)!\n uniforms[info.name] = gl.getUniformLocation(program, info.name)!\n }\n\n const quad = gl.createBuffer()\n gl.bindBuffer(gl.ARRAY_BUFFER, quad)\n gl.bufferData(\n gl.ARRAY_BUFFER,\n new Float32Array([-1, -1, 1, -1, -1, 1, 1, 1]),\n gl.STATIC_DRAW,\n )\n gl.enableVertexAttribArray(0)\n gl.vertexAttribPointer(0, 2, gl.FLOAT, false, 0, 0)\n\n const contentTexture = gl.createTexture()!\n gl.bindTexture(gl.TEXTURE_2D, contentTexture)\n gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MIN_FILTER, gl.LINEAR)\n gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MAG_FILTER, gl.LINEAR)\n gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_WRAP_S, gl.CLAMP_TO_EDGE)\n gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_WRAP_T, gl.CLAMP_TO_EDGE)\n gl.texImage2D(\n gl.TEXTURE_2D,\n 0,\n gl.RGBA,\n 1,\n 1,\n 0,\n gl.RGBA,\n gl.UNSIGNED_BYTE,\n new Uint8Array([0, 0, 0, 0]),\n )\n\n const atlasTexture = gl.createTexture()!\n let atlasCount = 1\n let atlasGrid = 1\n let atlasCharset = ''\n\n function syncAtlas() {\n if (config.charset === atlasCharset) return\n atlasCharset = config.charset\n const atlas = buildAtlas(config.charset)\n atlasCount = atlas.count\n atlasGrid = atlas.grid\n gl.bindTexture(gl.TEXTURE_2D, atlasTexture)\n gl.texParameteri(\n gl.TEXTURE_2D,\n gl.TEXTURE_MIN_FILTER,\n gl.LINEAR_MIPMAP_LINEAR,\n )\n gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MAG_FILTER, gl.LINEAR)\n gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_WRAP_S, gl.CLAMP_TO_EDGE)\n gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_WRAP_T, gl.CLAMP_TO_EDGE)\n gl.texImage2D(\n gl.TEXTURE_2D,\n 0,\n gl.RGBA,\n gl.RGBA,\n gl.UNSIGNED_BYTE,\n atlas.canvas,\n )\n gl.generateMipmap(gl.TEXTURE_2D)\n }\n\n syncAtlas()\n\n let dpr = 1\n\n function syncCanvasSize() {\n dpr = Math.min(window.devicePixelRatio || 1, 2)\n const width = Math.max(1, Math.round(output.clientWidth * dpr))\n const height = Math.max(1, Math.round(output.clientHeight * dpr))\n if (output.width !== width || output.height !== height) {\n output.width = width\n output.height = height\n }\n if (htmlInCanvas) {\n const cssWidth = Math.max(1, Math.round(source.clientWidth))\n const cssHeight = Math.max(1, Math.round(source.clientHeight))\n if (\n source.width !== cssWidth * dpr ||\n source.height !== cssHeight * dpr\n ) {\n source.width = cssWidth * dpr\n source.height = cssHeight * dpr\n }\n paintable.requestPaint!()\n }\n }\n\n syncCanvasSize()\n\n function uploadContent() {\n if (!htmlInCanvas || !contentDirty) return\n contentDirty = false\n pageLum = readPageLum()\n gl.bindTexture(gl.TEXTURE_2D, contentTexture)\n gl.texImage2D(\n gl.TEXTURE_2D,\n 0,\n gl.RGBA,\n gl.RGBA,\n gl.UNSIGNED_BYTE,\n source,\n )\n sourceCtx!.clearRect(0, 0, source.width, source.height)\n }\n\n let time = 7.3\n\n const WAKE_RES = 256\n const wakeCharge = new Float32Array(WAKE_RES)\n const wakeField = new Float32Array(WAKE_RES * 2)\n let wakeLive = false\n let wakeTouched = false\n let pointerX = 0\n let tracking = false\n\n const wakeTexture = gl.createTexture()!\n gl.bindTexture(gl.TEXTURE_2D, wakeTexture)\n gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MIN_FILTER, gl.NEAREST)\n gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MAG_FILTER, gl.NEAREST)\n gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_WRAP_S, gl.CLAMP_TO_EDGE)\n gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_WRAP_T, gl.CLAMP_TO_EDGE)\n gl.texImage2D(\n gl.TEXTURE_2D,\n 0,\n gl.RG32F,\n WAKE_RES,\n 1,\n 0,\n gl.RG,\n gl.FLOAT,\n wakeField,\n )\n\n function stirAmount(): number {\n return Math.min(Math.max(config.stir, 0), 1)\n }\n\n function wakeSpan(): number {\n const width = Math.max(output.clientWidth, 1)\n const px = Math.min(Math.max(config.stirRadius, 8), 2000)\n return Math.max(px / width, 1 / WAKE_RES)\n }\n\n function stepWake(delta: number) {\n const stir = stirAmount()\n const settleT = Math.min(Math.max(config.settle, 0.05), 8)\n const decay = Math.exp(-delta / settleT)\n const span = wakeSpan()\n const drive = stir > 0.001 && !reducedMotion\n const track = drive && tracking\n let live = false\n for (let i = 0; i < WAKE_RES; i++) {\n let charge = wakeCharge[i]! * decay\n if (track) {\n const d = Math.abs((i + 0.5) / WAKE_RES - pointerX) / span\n if (d < 1) {\n const t = 1 - d\n const target = t * t * (3 - 2 * t)\n if (target > charge) charge = target\n }\n }\n if (charge < 1e-4) charge = 0\n wakeCharge[i] = charge\n if (charge > 0) {\n live = true\n if (drive) {\n wakeField[i * 2]! += delta * stir * 2.2 * charge\n wakeTouched = true\n }\n }\n wakeField[i * 2 + 1] = charge\n }\n if (!live && !wakeLive) return\n wakeLive = live\n gl.bindTexture(gl.TEXTURE_2D, wakeTexture)\n gl.texSubImage2D(\n gl.TEXTURE_2D,\n 0,\n 0,\n 0,\n WAKE_RES,\n 1,\n gl.RG,\n gl.FLOAT,\n wakeField,\n )\n }\n\n function render() {\n uploadContent()\n gl.useProgram(program)\n gl.activeTexture(gl.TEXTURE0)\n gl.bindTexture(gl.TEXTURE_2D, contentTexture)\n gl.uniform1i(uniforms.uContent!, 0)\n gl.activeTexture(gl.TEXTURE1)\n gl.bindTexture(gl.TEXTURE_2D, atlasTexture)\n gl.uniform1i(uniforms.uAtlas!, 1)\n gl.activeTexture(gl.TEXTURE2)\n gl.bindTexture(gl.TEXTURE_2D, wakeTexture)\n gl.uniform1i(uniforms.uWake!, 2)\n gl.uniform2f(uniforms.uResolution!, output.width, output.height)\n gl.uniform1f(uniforms.uTime!, time)\n gl.uniform1f(uniforms.uCell!, Math.min(Math.max(config.cell, 8), 64) * dpr)\n gl.uniform1f(uniforms.uGlyphCount!, atlasCount)\n gl.uniform1f(uniforms.uAtlasGrid!, atlasGrid)\n gl.uniform3f(\n uniforms.uColor!,\n config.color[0],\n config.color[1],\n config.color[2],\n )\n gl.uniform3f(\n uniforms.uHeadColor!,\n config.headColor[0],\n config.headColor[1],\n config.headColor[2],\n )\n gl.uniform1f(uniforms.uSpeed!, Math.min(Math.max(config.speed, 0.05), 3))\n gl.uniform1f(\n uniforms.uSpeedVar!,\n Math.min(Math.max(config.speedVariance, 0), 1),\n )\n gl.uniform1f(uniforms.uDensity!, Math.min(Math.max(config.density, 0), 1))\n gl.uniform1f(uniforms.uTrail!, Math.min(Math.max(config.trail, 0.2), 3))\n gl.uniform1f(uniforms.uGlow!, Math.min(Math.max(config.glow, 0), 3))\n gl.uniform1f(uniforms.uMutate!, Math.min(Math.max(config.mutate, 0), 4))\n gl.uniform1f(uniforms.uFlicker!, Math.min(Math.max(config.flicker, 0), 1))\n gl.uniform1f(\n uniforms.uLayers!,\n Math.round(Math.min(Math.max(config.layers, 1), 3)),\n )\n gl.uniform1f(uniforms.uDim!, Math.min(Math.max(config.dim, 0), 1))\n gl.uniform1f(uniforms.uLight!, Math.min(Math.max(config.light, 0), 3))\n gl.uniform1f(\n uniforms.uLightRadius!,\n Math.min(Math.max(config.lightRadius, 20), 600) * dpr,\n )\n gl.uniform1f(uniforms.uLightHeight!, Math.max(config.lightHeight, 4) * dpr)\n gl.uniform1f(uniforms.uRelief!, Math.min(Math.max(config.relief, 0), 2))\n gl.uniform1f(uniforms.uStir!, wakeTouched ? stirAmount() : 0)\n gl.uniform1f(uniforms.uScroll!, content.scrollTop * dpr)\n gl.uniform1f(uniforms.uPageLum!, pageLum)\n gl.uniform1f(uniforms.uHasContent!, htmlInCanvas ? 1 : 0)\n gl.bindFramebuffer(gl.FRAMEBUFFER, null)\n gl.viewport(0, 0, output.width, output.height)\n gl.drawArrays(gl.TRIANGLE_STRIP, 0, 4)\n }\n\n let raf = 0\n let lastTime = performance.now()\n let destroyed = false\n let running = false\n let visible = true\n\n const motionQuery = window.matchMedia('(prefers-reduced-motion: reduce)')\n let reducedMotion = motionQuery.matches\n\n function frame(now: number) {\n if (destroyed) return\n if (!visible) {\n running = false\n return\n }\n const delta = Math.min((now - lastTime) / 1000, 1 / 30)\n lastTime = now\n if (!reducedMotion) time += delta\n stepWake(delta)\n render()\n if (reducedMotion && !contentDirty) {\n running = false\n return\n }\n raf = requestAnimationFrame(frame)\n }\n\n function start() {\n if (destroyed || running || !visible) return\n running = true\n lastTime = performance.now()\n raf = requestAnimationFrame(frame)\n }\n\n wake = start\n start()\n\n function onMotionChange() {\n reducedMotion = motionQuery.matches\n if (reducedMotion) {\n tracking = false\n wakeCharge.fill(0)\n for (let i = 0; i < WAKE_RES; i++) wakeField[i * 2 + 1] = 0\n wakeLive = true\n }\n start()\n }\n motionQuery.addEventListener('change', onMotionChange)\n content.addEventListener('scroll', start, { passive: true })\n\n const pointerHost = output.parentElement ?? output\n\n function pointerNorm(event: PointerEvent): number {\n const box = output.getBoundingClientRect()\n if (box.width < 1) return -1\n return (event.clientX - box.left) / box.width\n }\n\n function onPointerMove(event: PointerEvent) {\n if (reducedMotion) return\n const x = pointerNorm(event)\n if (x < 0) return\n pointerX = x\n tracking = true\n start()\n }\n\n function onPointerLeave() {\n tracking = false\n }\n\n function onPointerDown(event: PointerEvent) {\n if (reducedMotion || stirAmount() <= 0.001) return\n const x = pointerNorm(event)\n if (x < 0) return\n pointerX = x\n tracking = true\n const span = wakeSpan() * 1.8\n for (let i = 0; i < WAKE_RES; i++) {\n const d = Math.abs((i + 0.5) / WAKE_RES - x) / span\n if (d >= 1) continue\n const t = 1 - d\n const burst = t * t * (3 - 2 * t)\n if (burst > wakeCharge[i]!) wakeCharge[i] = burst\n }\n start()\n }\n\n pointerHost.addEventListener('pointermove', onPointerMove, { passive: true })\n pointerHost.addEventListener('pointerleave', onPointerLeave, { passive: true })\n pointerHost.addEventListener('pointercancel', onPointerLeave, { passive: true })\n pointerHost.addEventListener('pointerdown', onPointerDown, { passive: true })\n\n const observer = new ResizeObserver(() => {\n syncCanvasSize()\n start()\n })\n observer.observe(output)\n observer.observe(content)\n\n const intersection = new IntersectionObserver((entries) => {\n visible = entries[entries.length - 1]?.isIntersecting ?? true\n if (visible) start()\n })\n intersection.observe(output)\n\n return {\n setOptions(next) {\n let changed = false\n for (const [key, value] of Object.entries(next)) {\n const prev = config[key as keyof typeof config]\n if (Array.isArray(value) && Array.isArray(prev)) {\n if (\n value.length !== prev.length ||\n value.some((item, i) => item !== prev[i])\n ) {\n changed = true\n break\n }\n } else if (prev !== value) {\n changed = true\n break\n }\n }\n Object.assign(config, next)\n if (!changed) return\n syncAtlas()\n syncCanvasSize()\n start()\n },\n resize() {\n syncCanvasSize()\n start()\n },\n destroy() {\n destroyed = true\n cancelAnimationFrame(raf)\n observer.disconnect()\n intersection.disconnect()\n motionQuery.removeEventListener('change', onMotionChange)\n content.removeEventListener('scroll', start)\n pointerHost.removeEventListener('pointermove', onPointerMove)\n pointerHost.removeEventListener('pointerleave', onPointerLeave)\n pointerHost.removeEventListener('pointercancel', onPointerLeave)\n pointerHost.removeEventListener('pointerdown', onPointerDown)\n gl.deleteTexture(contentTexture)\n gl.deleteTexture(atlasTexture)\n gl.deleteTexture(wakeTexture)\n gl.deleteProgram(program)\n gl.deleteShader(vertexShader)\n gl.deleteShader(fragmentShader)\n gl.deleteBuffer(quad)\n if (htmlInCanvas) paintable.onpaint = null\n },\n }\n}\n\nexport { supportsHtmlInCanvas }\nexport type {\n GlyphRainElements,\n GlyphRainInstance,\n GlyphRainOptions,\n} from './types'\nexport { DEFAULT_CHARSET, DEFAULTS } from './types'\n","import { createElement, Fragment } from './react'\nimport type { ElementType, Key, ReactElement } from 'react'\n\nexport { Fragment }\n\ntype CreateElement = (type: ElementType, props?: unknown) => ReactElement\n\nexport function jsx(\n type: ElementType,\n props: unknown,\n key?: Key,\n): ReactElement {\n const create = createElement as unknown as CreateElement\n return key === undefined\n ? create(type, props)\n : create(type, { ...(props as Record<string, unknown>), key })\n}\n\nexport const jsxs = jsx\n","'use client'\n\nimport {\n useEffect,\n useRef,\n useState,\n useSyncExternalStore,\n type CSSProperties,\n type ReactNode,\n} from 'react'\nimport {\n createGlyphRain,\n supportsHtmlInCanvas,\n type GlyphRainInstance,\n type GlyphRainOptions,\n} from '../core/createGlyphRain'\n\nexport type GlyphRainProps = GlyphRainOptions & {\n children: ReactNode\n className?: string\n style?: CSSProperties\n}\n\nconst emptySubscribe = () => () => {}\n\nexport function GlyphRain({\n children,\n className,\n style,\n ...options\n}: GlyphRainProps) {\n const sourceRef = useRef<HTMLCanvasElement>(null)\n const contentRef = useRef<HTMLDivElement>(null)\n const outputRef = useRef<HTMLCanvasElement>(null)\n const instanceRef = useRef<GlyphRainInstance | null>(null)\n const [initialOptions] = useState(options)\n const [failed, setFailed] = useState(false)\n\n const supported = useSyncExternalStore(\n emptySubscribe,\n supportsHtmlInCanvas,\n () => false,\n )\n const native = supported && !failed\n\n useEffect(() => {\n const source = sourceRef.current\n const content = contentRef.current\n const output = outputRef.current\n if (!source || !content || !output) return\n instanceRef.current = createGlyphRain(\n { source, content, output },\n initialOptions,\n )\n if (native && !instanceRef.current) setFailed(true)\n return () => {\n instanceRef.current?.destroy()\n instanceRef.current = null\n }\n }, [initialOptions, native])\n\n useEffect(() => {\n instanceRef.current?.setOptions(options)\n })\n\n return (\n <div className={className} style={{ position: 'relative', ...style }}>\n <canvas\n ref={sourceRef}\n // @ts-expect-error experimental html-in-canvas attribute\n layoutsubtree=\"true\"\n suppressHydrationWarning\n style={\n native\n ? {\n position: 'absolute',\n inset: 0,\n width: '100%',\n height: '100%',\n }\n : { display: 'none' }\n }\n >\n {native ? (\n <div\n ref={contentRef}\n style={{\n position: 'relative',\n width: '100%',\n height: '100%',\n overflow: 'auto',\n }}\n >\n {children}\n </div>\n ) : null}\n </canvas>\n {!native ? (\n <div\n ref={contentRef}\n style={{\n position: 'relative',\n width: '100%',\n height: '100%',\n overflow: 'auto',\n }}\n >\n {children}\n </div>\n ) : null}\n <canvas\n ref={outputRef}\n aria-hidden\n style={{\n position: 'absolute',\n inset: 0,\n width: '100%',\n height: '100%',\n pointerEvents: 'none',\n }}\n />\n </div>\n )\n}\n\nexport default GlyphRain\n"],"mappings":"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","names":[]}
|