del: lightrays

This commit is contained in:
ssbg04 committed 2026-09-03 23:33:14 +08:00
1 parent 83aef0ec24
commit fc0e320532
1 file changed
-23
-23
View File
@@ -1,23 +0,0 @@
{
"$schema": "https://ui.shadcn.com/schema/registry-item.json",
"name": "LightRays-TS-CSS",
"title": "LightRays",
"description": "Volumetric light rays/beams with customizable direction.",
"type": "registry:component",
"files": [
{
"type": "registry:component",
"path": "LightRays/LightRays.css",
"content": ".light-rays-container {\n width: 100%;\n height: 100%;\n position: relative;\n pointer-events: none;\n z-index: 3;\n overflow: hidden;\n}\n"
},
{
"type": "registry:component",
"path": "LightRays/LightRays.tsx",
"content": "import { useRef, useEffect, useState } from 'react';\nimport { Renderer, Program, Triangle, Mesh } from 'ogl';\nimport './LightRays.css';\n\nexport type RaysOrigin =\n | 'top-center'\n | 'top-left'\n | 'top-right'\n | 'right'\n | 'left'\n | 'bottom-center'\n | 'bottom-right'\n | 'bottom-left';\n\ninterface LightRaysProps {\n raysOrigin?: RaysOrigin;\n raysColor?: string;\n raysSpeed?: number;\n lightSpread?: number;\n rayLength?: number;\n pulsating?: boolean;\n fadeDistance?: number;\n saturation?: number;\n followMouse?: boolean;\n mouseInfluence?: number;\n noiseAmount?: number;\n distortion?: number;\n className?: string;\n}\n\nconst DEFAULT_COLOR = '#ffffff';\n\nconst hexToRgb = (hex: string): [number, number, number] => {\n const m = /^#?([a-f\\d]{2})([a-f\\d]{2})([a-f\\d]{2})$/i.exec(hex);\n return m ? [parseInt(m[1], 16) / 255, parseInt(m[2], 16) / 255, parseInt(m[3], 16) / 255] : [1, 1, 1];\n};\n\nconst getAnchorAndDir = (\n origin: RaysOrigin,\n w: number,\n h: number\n): { anchor: [number, number]; dir: [number, number] } => {\n const outside = 0.2;\n switch (origin) {\n case 'top-left':\n return { anchor: [0, -outside * h], dir: [0, 1] };\n case 'top-right':\n return { anchor: [w, -outside * h], dir: [0, 1] };\n case 'left':\n return { anchor: [-outside * w, 0.5 * h], dir: [1, 0] };\n case 'right':\n return { anchor: [(1 + outside) * w, 0.5 * h], dir: [-1, 0] };\n case 'bottom-left':\n return { anchor: [0, (1 + outside) * h], dir: [0, -1] };\n case 'bottom-center':\n return { anchor: [0.5 * w, (1 + outside) * h], dir: [0, -1] };\n case 'bottom-right':\n return { anchor: [w, (1 + outside) * h], dir: [0, -1] };\n default: // \"top-center\"\n return { anchor: [0.5 * w, -outside * h], dir: [0, 1] };\n }\n};\n\ntype Vec2 = [number, number];\ntype Vec3 = [number, number, number];\n\ninterface Uniforms {\n iTime: { value: number };\n iResolution: { value: Vec2 };\n rayPos: { value: Vec2 };\n rayDir: { value: Vec2 };\n raysColor: { value: Vec3 };\n raysSpeed: { value: number };\n lightSpread: { value: number };\n rayLength: { value: number };\n pulsating: { value: number };\n fadeDistance: { value: number };\n saturation: { value: number };\n mousePos: { value: Vec2 };\n mouseInfluence: { value: number };\n noiseAmount: { value: number };\n distortion: { value: number };\n}\n\nconst LightRays: React.FC<LightRaysProps> = ({\n raysOrigin = 'top-center',\n raysColor = DEFAULT_COLOR,\n raysSpeed = 1,\n lightSpread = 1,\n rayLength = 2,\n pulsating = false,\n fadeDistance = 1.0,\n saturation = 1.0,\n followMouse = true,\n mouseInfluence = 0.1,\n noiseAmount = 0.0,\n distortion = 0.0,\n className = ''\n}) => {\n const containerRef = useRef<HTMLDivElement>(null);\n const uniformsRef = useRef<Uniforms | null>(null);\n const rendererRef = useRef<Renderer | null>(null);\n const mouseRef = useRef({ x: 0.5, y: 0.5 });\n const smoothMouseRef = useRef({ x: 0.5, y: 0.5 });\n const animationIdRef = useRef<number | null>(null);\n const meshRef = useRef<Mesh | null>(null);\n const cleanupFunctionRef = useRef<(() => void) | null>(null);\n const [isVisible, setIsVisible] = useState(false);\n const observerRef = useRef<IntersectionObserver | null>(null);\n\n useEffect(() => {\n if (!containerRef.current) return;\n\n observerRef.current = new IntersectionObserver(\n entries => {\n const entry = entries[0];\n setIsVisible(entry.isIntersecting);\n },\n { threshold: 0.1 }\n );\n\n observerRef.current.observe(containerRef.current);\n\n return () => {\n if (observerRef.current) {\n observerRef.current.disconnect();\n observerRef.current = null;\n }\n };\n }, []);\n\n useEffect(() => {\n if (!isVisible || !containerRef.current) return;\n\n if (cleanupFunctionRef.current) {\n cleanupFunctionRef.current();\n cleanupFunctionRef.current = null;\n }\n\n const initializeWebGL = async () => {\n if (!containerRef.current) return;\n\n await new Promise(resolve => setTimeout(resolve, 10));\n\n if (!containerRef.current) return;\n\n const renderer = new Renderer({\n dpr: Math.min(window.devicePixelRatio, 2),\n alpha: true\n });\n rendererRef.current = renderer;\n\n const gl = renderer.gl;\n gl.canvas.style.width = '100%';\n gl.canvas.style.height = '100%';\n\n while (containerRef.current.firstChild) {\n containerRef.current.removeChild(containerRef.current.firstChild);\n }\n containerRef.current.appendChild(gl.canvas);\n\n const vert = `\nattribute vec2 position;\nvarying vec2 vUv;\nvoid main() {\n vUv = position * 0.5 + 0.5;\n gl_Position = vec4(position, 0.0, 1.0);\n}`;\n\n const frag = `precision highp float;\n\nuniform float iTime;\nuniform vec2 iResolution;\n\nuniform vec2 rayPos;\nuniform vec2 rayDir;\nLine truncated
}
],
"registryDependencies": [],
"dependencies": [
"ogl@^1.0.11"
]
}