UNPKG

@fxshelf/starfield

Version:

Canvas 2D starfield tunnel for React and Vue — perspective fly-through, glitter flashes, additive trails. Zero animation-lib deps. Copy-as-source friendly.

1 lines • 26.7 kB
{"version":3,"sources":["../src/core/types.ts","../src/core/createStarfield.ts","../src/react/Starfield.tsx"],"names":["useRef","useState","useEffect","jsxs","jsx"],"mappings":"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","file":"index.cjs","sourcesContent":["export type StarfieldOptions = {\n /** Number of stars. Default `263`. */\n particleCount?: number\n /** Palette slot 1. Default `#ffffff`. */\n color1?: string\n /** Palette slot 2. Default `#ffffff`. */\n color2?: string\n /** Palette slot 3. Default `#ffffff`. */\n color3?: string\n /** Fly-toward speed multiplier. Default `1`. */\n speed?: number\n /** Radial spread (higher = wider field). Default `48`. */\n density?: number\n /** Base star size. Default `8`. */\n starSize?: number\n /** Perspective near clip (0–100 scale). Default `13`. */\n focalDepth?: number\n /** Lateral wobble. Default `0`. */\n turbulence?: number\n /** Overall brightness (0–100). Default `73`. */\n brightness?: number\n /** Twinkle intensity (0–10). Default `4`. */\n glitterIntensity?: number\n /** Trail persistence (0–100). Default `26`. */\n trailAmount?: number\n /** Fly away from camera instead of toward. Default `false`. */\n reverse?: boolean\n}\n\nexport type StarfieldInstance = {\n setOptions(partial: StarfieldOptions): void\n resize(): void\n destroy(): void\n}\n\nexport const DEFAULTS = {\n particleCount: 263,\n color1: '#ffffff',\n color2: '#ffffff',\n color3: '#ffffff',\n speed: 1,\n density: 48,\n starSize: 8,\n focalDepth: 13,\n turbulence: 0,\n brightness: 73,\n glitterIntensity: 4,\n trailAmount: 26,\n reverse: false,\n} as const satisfies Required<StarfieldOptions>\n","import { DEFAULTS, type StarfieldInstance, type StarfieldOptions } from './types'\n\ntype Star = {\n x: number\n y: number\n z: number\n px: number\n py: number\n seed: number\n vmul: number\n colorIdx: number\n flashUntil: number\n nextFlash: number\n}\n\ntype ParsedColor = [number, number, number, number]\n\nfunction parseColor(input: string | null | undefined): ParsedColor {\n if (!input) return [255, 255, 255, 1]\n const s = input.trim()\n if (s.charAt(0) === '#') {\n let hex = s.slice(1)\n if (hex.length === 3) {\n hex = hex\n .split('')\n .map((c) => c + c)\n .join('')\n }\n const num = parseInt(hex, 16)\n return [(num >> 16) & 255, (num >> 8) & 255, num & 255, 1]\n }\n const m = s.match(/rgba?\\(([^)]+)\\)/i)\n if (m?.[1]) {\n const parts = m[1].split(',').map((p) => parseFloat(p.trim()))\n return [parts[0] || 0, parts[1] || 0, parts[2] || 0, parts[3] == null ? 1 : parts[3]]\n }\n return [255, 255, 255, 1]\n}\n\ntype RuntimeConfig = {\n reverse: boolean\n density: number\n stepZ: number\n focalDepth: number\n starScale: number\n turbulence: number\n glitter: number\n brightness: number\n trail: number\n}\n\nfunction toRuntime(options: Required<StarfieldOptions>): RuntimeConfig {\n return {\n reverse: options.reverse,\n density: options.density,\n stepZ: options.speed * 0.0008,\n focalDepth: options.focalDepth / 100,\n starScale: options.starSize * 0.15,\n turbulence: options.turbulence * 0.2,\n glitter: options.glitterIntensity * 0.1,\n brightness: Math.min(1, options.brightness / 100),\n trail: options.trailAmount / 100,\n }\n}\n\n/**\n * Canvas 2D starfield tunnel: stars fly toward (or away from) the camera\n * with perspective projection, optional glitter flashes, and additive trails.\n */\nexport function createStarfield(\n canvas: HTMLCanvasElement,\n options: StarfieldOptions = {},\n): StarfieldInstance {\n let config: Required<StarfieldOptions> = { ...DEFAULTS, ...options }\n const maybeCtx = canvas.getContext('2d')\n if (!maybeCtx) {\n return {\n setOptions() {},\n resize() {},\n destroy() {},\n }\n }\n const ctx = maybeCtx\n\n const container = canvas.parentElement\n let w = 0\n let h = 0\n let dpr = 1\n let stars: Star[] = []\n let elapsed = 0\n let lastT = performance.now()\n let raf: number | null = null\n let destroyed = false\n\n const colorCache = {\n color1: '',\n color2: '',\n color3: '',\n parsed1: [255, 255, 255, 1] as ParsedColor,\n parsed2: [255, 255, 255, 1] as ParsedColor,\n parsed3: [255, 255, 255, 1] as ParsedColor,\n }\n\n function getCachedColors() {\n if (config.color1 !== colorCache.color1) {\n colorCache.color1 = config.color1\n colorCache.parsed1 = parseColor(config.color1)\n }\n if (config.color2 !== colorCache.color2) {\n colorCache.color2 = config.color2\n colorCache.parsed2 = parseColor(config.color2)\n }\n if (config.color3 !== colorCache.color3) {\n colorCache.color3 = config.color3\n colorCache.parsed3 = parseColor(config.color3)\n }\n return colorCache\n }\n\n function makeStar(): Star {\n return {\n x: 0,\n y: 0,\n z: 0,\n px: NaN,\n py: NaN,\n seed: 0,\n vmul: 1,\n colorIdx: 0,\n flashUntil: 0,\n nextFlash: 0,\n }\n }\n\n function resetStar(s: Star, initial = false) {\n const c = toRuntime(config)\n const angle = Math.random() * Math.PI * 2\n const radius = (0.2 + Math.random() * 0.8) * (c.density / 15)\n s.x = Math.cos(angle) * radius\n s.y = Math.sin(angle) * radius\n if (c.reverse) {\n s.z = initial ? c.focalDepth + Math.random() * (1 - c.focalDepth) : c.focalDepth\n } else {\n s.z = initial ? Math.random() : 1.0\n }\n s.px = NaN\n s.py = NaN\n s.seed = Math.random() * 1000\n s.vmul = 0.6 + Math.random() * 0.8\n s.colorIdx = Math.floor(Math.random() * 3)\n s.flashUntil = 0\n s.nextFlash = elapsed + 1 + Math.random() * 4 * (1 / Math.max(0.0001, c.glitter))\n }\n\n function syncCount() {\n const count = Math.max(1, Math.floor(config.particleCount))\n if (stars.length === count) return\n if (stars.length > count) {\n stars.length = count\n return\n }\n while (stars.length < count) {\n const s = makeStar()\n resetStar(s, true)\n stars.push(s)\n }\n }\n\n function resize() {\n if (destroyed) return\n const nextDpr = Math.min(window.devicePixelRatio || 1, 2)\n const rectW =\n container?.clientWidth || container?.getBoundingClientRect().width || canvas.clientWidth\n const rectH =\n container?.clientHeight || container?.getBoundingClientRect().height || canvas.clientHeight\n const nextW = Math.max(1, Math.floor(rectW) || 600)\n const nextH = Math.max(1, Math.floor(rectH) || 400)\n if (w === nextW && h === nextH && dpr === nextDpr) return\n w = nextW\n h = nextH\n dpr = nextDpr\n canvas.width = Math.floor(w * dpr)\n canvas.height = Math.floor(h * dpr)\n canvas.style.width = w + 'px'\n canvas.style.height = h + 'px'\n ctx.setTransform(dpr, 0, 0, dpr, 0, 0)\n ctx.clearRect(0, 0, w, h)\n }\n\n function drawFrame(deltaSec: number) {\n const c = toRuntime(config)\n syncCount()\n const colors = getCachedColors()\n const palette = [colors.parsed1, colors.parsed2, colors.parsed3]\n const rgbStrs = [\n 'rgb(' + palette[0]![0] + ', ' + palette[0]![1] + ', ' + palette[0]![2] + ')',\n 'rgb(' + palette[1]![0] + ', ' + palette[1]![1] + ', ' + palette[1]![2] + ')',\n 'rgb(' + palette[2]![0] + ', ' + palette[2]![1] + ', ' + palette[2]![2] + ')',\n ]\n const cx = w / 2\n const cy = h / 2\n const projScale = Math.min(w, h) * 0.9\n const dt = Math.max(0.001, Math.min(0.1, deltaSec)) * 60\n const keep = Math.pow(Math.min(0.98, Math.max(0, c.trail)), dt)\n const trailAlpha = Math.max(0.02, 1 - keep)\n ctx.globalAlpha = 1\n ctx.globalCompositeOperation = 'destination-out'\n ctx.fillStyle = 'rgba(0, 0, 0, ' + trailAlpha + ')'\n ctx.fillRect(0, 0, w, h)\n ctx.globalCompositeOperation = 'lighter'\n\n for (let i = 0; i < stars.length; i++) {\n const s = stars[i]!\n const vz = c.stepZ * s.vmul * dt\n if (c.reverse) {\n s.z += vz\n if (s.z >= 1.0) {\n resetStar(s)\n continue\n }\n } else {\n s.z -= vz\n if (s.z <= c.focalDepth) {\n resetStar(s)\n continue\n }\n }\n let tx = s.x\n let ty = s.y\n if (c.turbulence > 0) {\n const tVal = elapsed * 1.2 + s.seed\n const amp = c.turbulence * (1 - s.z) * 0.25\n tx += Math.sin(tVal + s.seed) * amp\n ty += Math.cos(tVal * 1.13 + s.seed * 0.7) * amp\n }\n const persp = c.focalDepth / Math.max(s.z, 0.0001)\n const sx = cx + tx * persp * projScale\n const sy = cy + ty * persp * projScale\n if (!c.reverse && (sx < -20 || sx > w + 20 || sy < -20 || sy > h + 20)) {\n resetStar(s)\n continue\n }\n let flashMult = 1\n if (c.glitter > 0) {\n if (elapsed >= s.nextFlash && s.flashUntil < elapsed) {\n s.flashUntil = elapsed + 0.04 + Math.random() * 0.07\n s.nextFlash = elapsed + 1 + Math.random() * 4 * (1 / Math.max(0.0001, c.glitter))\n }\n if (elapsed <= s.flashUntil) {\n flashMult = 1 + 2.5 * c.glitter\n }\n }\n const sizePersp = Math.min(2.5, (c.focalDepth / Math.max(s.z, 0.0001)) * 0.6)\n const baseR = Math.max(0.25, c.starScale * (0.4 + sizePersp))\n const maxR = 1 + c.starScale * 2.5\n const r = Math.min(baseR * flashMult, maxR)\n const lifeT = c.reverse ? s.z : 1 - s.z\n const fadeIn = c.reverse\n ? Math.min(1, (s.z - c.focalDepth) / (1 - c.focalDepth) / 0.12)\n : 1\n const a =\n Math.min(1, c.reverse ? 0.85 - lifeT * 0.6 : lifeT * 0.9 + 0.05) *\n fadeIn *\n c.brightness *\n (flashMult > 1 ? 1 : 0.85)\n const colStr = rgbStrs[s.colorIdx]!\n if (!Number.isNaN(s.px) && !Number.isNaN(s.py)) {\n ctx.globalAlpha = a * 0.5\n ctx.strokeStyle = colStr\n ctx.lineWidth = Math.max(0.4, r * 0.4)\n ctx.beginPath()\n ctx.moveTo(s.px, s.py)\n ctx.lineTo(sx, sy)\n ctx.stroke()\n }\n ctx.globalAlpha = a\n ctx.fillStyle = colStr\n ctx.fillRect(sx - r, sy - r, r * 2, r * 2)\n if (flashMult > 1) {\n const rf = Math.min(r * 1.4, maxR * 1.4)\n ctx.globalAlpha = a * 0.5\n ctx.fillRect(sx - rf, sy - rf, rf * 2, rf * 2)\n }\n s.px = sx\n s.py = sy\n }\n ctx.globalAlpha = 1\n ctx.globalCompositeOperation = 'source-over'\n elapsed += Math.min(0.1, Math.max(0, deltaSec))\n }\n\n function loop(t: number) {\n if (destroyed) return\n const deltaSec = (t - lastT) / 1000\n lastT = t\n drawFrame(deltaSec)\n raf = requestAnimationFrame(loop)\n }\n\n syncCount()\n resize()\n raf = requestAnimationFrame(loop)\n\n let resizeObserver: ResizeObserver | null = null\n if (container && typeof ResizeObserver !== 'undefined') {\n resizeObserver = new ResizeObserver(() => resize())\n resizeObserver.observe(container)\n }\n\n return {\n setOptions(partial) {\n config = { ...config, ...partial }\n syncCount()\n },\n resize,\n destroy() {\n destroyed = true\n if (raf != null) cancelAnimationFrame(raf)\n raf = null\n resizeObserver?.disconnect()\n resizeObserver = null\n stars = []\n },\n }\n}\n\nexport { DEFAULTS }\nexport type { StarfieldInstance, StarfieldOptions }\n","'use client'\n\nimport {\n useEffect,\n useRef,\n useState,\n type CSSProperties,\n type ReactNode,\n} from 'react'\nimport {\n createStarfield,\n type StarfieldInstance,\n type StarfieldOptions,\n} from '../core/createStarfield'\n\nexport type StarfieldProps = StarfieldOptions & {\n children?: ReactNode\n className?: string\n style?: CSSProperties\n /** Accessible label for the canvas. */\n ariaLabel?: string\n}\n\nexport function Starfield({\n children,\n className,\n style,\n ariaLabel = 'Starfield background',\n ...options\n}: StarfieldProps) {\n const canvasRef = useRef<HTMLCanvasElement>(null)\n const instanceRef = useRef<StarfieldInstance | null>(null)\n const [initialOptions] = useState(options)\n\n useEffect(() => {\n const canvas = canvasRef.current\n if (!canvas) return\n instanceRef.current = createStarfield(canvas, initialOptions)\n return () => {\n instanceRef.current?.destroy()\n instanceRef.current = null\n }\n }, [initialOptions])\n\n useEffect(() => {\n instanceRef.current?.setOptions(options)\n })\n\n return (\n <div\n className={className}\n style={{ position: 'relative', overflow: 'hidden', ...style }}\n >\n <canvas\n ref={canvasRef}\n aria-label={ariaLabel}\n style={{\n position: 'absolute',\n inset: 0,\n width: '100%',\n height: '100%',\n display: 'block',\n pointerEvents: 'none',\n }}\n />\n {children != null ? (\n <div style={{ position: 'relative', zIndex: 1, height: '100%' }}>\n {children}\n </div>\n ) : null}\n </div>\n )\n}\n\nexport default Starfield"]}