@elyri/motion 0.0.0-stage → 0.0.1
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 +70 -2
- package/dist/chunk-A7JCTGZO.js +230 -0
- package/dist/chunk-A7JCTGZO.js.map +1 -0
- package/dist/core.cjs +238 -0
- package/dist/core.cjs.map +1 -0
- package/dist/core.d.cts +77 -0
- package/dist/core.d.ts +77 -0
- package/dist/core.js +3 -0
- package/dist/core.js.map +1 -0
- package/dist/index.cjs +4288 -0
- package/dist/index.cjs.map +1 -0
- package/dist/index.css +1118 -0
- package/dist/index.css.map +1 -0
- package/dist/index.d.cts +532 -0
- package/dist/index.d.ts +532 -0
- package/dist/index.js +4029 -0
- package/dist/index.js.map +1 -0
- package/package.json +60 -3
- package/src/components/animations/CountUp/CountUp.css +4 -0
- package/src/components/animations/CountUp/CountUp.tsx +100 -0
- package/src/components/animations/CountUp/index.ts +2 -0
- package/src/components/animations/FadeIn/FadeIn.css +43 -0
- package/src/components/animations/FadeIn/FadeIn.tsx +72 -0
- package/src/components/animations/FadeIn/index.ts +2 -0
- package/src/components/animations/Magnetic/Magnetic.css +11 -0
- package/src/components/animations/Magnetic/Magnetic.tsx +107 -0
- package/src/components/animations/Magnetic/index.ts +2 -0
- package/src/components/animations/ScaleIn/ScaleIn.css +24 -0
- package/src/components/animations/ScaleIn/ScaleIn.tsx +65 -0
- package/src/components/animations/ScaleIn/index.ts +2 -0
- package/src/components/animations/Spotlight/Spotlight.css +93 -0
- package/src/components/animations/Spotlight/Spotlight.tsx +100 -0
- package/src/components/animations/Spotlight/index.ts +2 -0
- package/src/components/animations/Tilt/Tilt.css +35 -0
- package/src/components/animations/Tilt/Tilt.tsx +123 -0
- package/src/components/animations/Tilt/index.ts +2 -0
- package/src/components/animations/index.ts +12 -0
- package/src/components/backgrounds/Aurora/Aurora.css +33 -0
- package/src/components/backgrounds/Aurora/Aurora.tsx +147 -0
- package/src/components/backgrounds/Aurora/index.ts +2 -0
- package/src/components/backgrounds/Caustics/Caustics.css +34 -0
- package/src/components/backgrounds/Caustics/Caustics.tsx +142 -0
- package/src/components/backgrounds/Caustics/index.ts +2 -0
- package/src/components/backgrounds/Contours/Contours.css +42 -0
- package/src/components/backgrounds/Contours/Contours.tsx +147 -0
- package/src/components/backgrounds/Contours/index.ts +2 -0
- package/src/components/backgrounds/DotField/DotField.css +44 -0
- package/src/components/backgrounds/DotField/DotField.tsx +135 -0
- package/src/components/backgrounds/DotField/index.ts +2 -0
- package/src/components/backgrounds/DragonScales/DragonScales.css +44 -0
- package/src/components/backgrounds/DragonScales/DragonScales.tsx +250 -0
- package/src/components/backgrounds/DragonScales/index.ts +2 -0
- package/src/components/backgrounds/Filaments/Filaments.css +38 -0
- package/src/components/backgrounds/Filaments/Filaments.tsx +138 -0
- package/src/components/backgrounds/Filaments/index.ts +2 -0
- package/src/components/backgrounds/FlipTiles/FlipTiles.css +44 -0
- package/src/components/backgrounds/FlipTiles/FlipTiles.tsx +368 -0
- package/src/components/backgrounds/FlipTiles/index.ts +2 -0
- package/src/components/backgrounds/Halo/Halo.css +43 -0
- package/src/components/backgrounds/Halo/Halo.tsx +122 -0
- package/src/components/backgrounds/Halo/index.ts +2 -0
- package/src/components/backgrounds/MeshGradient/MeshGradient.css +43 -0
- package/src/components/backgrounds/MeshGradient/MeshGradient.tsx +195 -0
- package/src/components/backgrounds/MeshGradient/index.ts +2 -0
- package/src/components/backgrounds/PixelVortex/PixelVortex.css +44 -0
- package/src/components/backgrounds/PixelVortex/PixelVortex.tsx +278 -0
- package/src/components/backgrounds/PixelVortex/index.ts +2 -0
- package/src/components/backgrounds/Planet/Planet.css +39 -0
- package/src/components/backgrounds/Planet/Planet.tsx +736 -0
- package/src/components/backgrounds/Planet/index.ts +2 -0
- package/src/components/backgrounds/SilkWaves/SilkWaves.css +44 -0
- package/src/components/backgrounds/SilkWaves/SilkWaves.tsx +144 -0
- package/src/components/backgrounds/SilkWaves/index.ts +2 -0
- package/src/components/backgrounds/Velvet/Velvet.css +35 -0
- package/src/components/backgrounds/Velvet/Velvet.tsx +246 -0
- package/src/components/backgrounds/Velvet/index.ts +2 -0
- package/src/components/backgrounds/index.ts +26 -0
- package/src/components/index.ts +4 -0
- package/src/components/media/AsciiImage/AsciiImage.css +16 -0
- package/src/components/media/AsciiImage/AsciiImage.tsx +366 -0
- package/src/components/media/AsciiImage/index.ts +2 -0
- package/src/components/media/index.ts +2 -0
- package/src/components/text/GradientText/GradientText.css +32 -0
- package/src/components/text/GradientText/GradientText.tsx +27 -0
- package/src/components/text/GradientText/index.ts +2 -0
- package/src/components/text/Marquee/Marquee.css +91 -0
- package/src/components/text/Marquee/Marquee.tsx +130 -0
- package/src/components/text/Marquee/index.ts +2 -0
- package/src/components/text/ParticleText/ParticleText.css +16 -0
- package/src/components/text/ParticleText/ParticleText.tsx +279 -0
- package/src/components/text/ParticleText/index.ts +2 -0
- package/src/components/text/RotatingText/RotatingText.css +133 -0
- package/src/components/text/RotatingText/RotatingText.tsx +112 -0
- package/src/components/text/RotatingText/index.ts +2 -0
- package/src/components/text/ScrambleText/ScrambleText.css +48 -0
- package/src/components/text/ScrambleText/ScrambleText.tsx +141 -0
- package/src/components/text/ScrambleText/index.ts +2 -0
- package/src/components/text/ScrollMarquee/ScrollMarquee.css +33 -0
- package/src/components/text/ScrollMarquee/ScrollMarquee.tsx +110 -0
- package/src/components/text/ScrollMarquee/index.ts +2 -0
- package/src/components/text/ScrollReveal/ScrollReveal.css +51 -0
- package/src/components/text/ScrollReveal/ScrollReveal.tsx +186 -0
- package/src/components/text/ScrollReveal/index.ts +2 -0
- package/src/components/text/SplitReveal/SplitReveal.css +52 -0
- package/src/components/text/SplitReveal/SplitReveal.tsx +127 -0
- package/src/components/text/SplitReveal/index.ts +2 -0
- package/src/components/text/Typewriter/Typewriter.css +37 -0
- package/src/components/text/Typewriter/Typewriter.tsx +80 -0
- package/src/components/text/Typewriter/index.ts +2 -0
- package/src/components/text/WaveText/WaveText.css +28 -0
- package/src/components/text/WaveText/WaveText.tsx +52 -0
- package/src/components/text/WaveText/index.ts +2 -0
- package/src/components/text/index.ts +20 -0
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/components/animations/CountUp/CountUp.tsx","../src/components/animations/FadeIn/FadeIn.tsx","../src/components/animations/Magnetic/Magnetic.tsx","../src/components/animations/ScaleIn/ScaleIn.tsx","../src/components/animations/Spotlight/Spotlight.tsx","../src/components/animations/Tilt/Tilt.tsx","../src/components/backgrounds/Aurora/Aurora.tsx","../src/components/backgrounds/Caustics/Caustics.tsx","../src/components/backgrounds/Contours/Contours.tsx","../src/components/backgrounds/DotField/DotField.tsx","../src/components/backgrounds/DragonScales/DragonScales.tsx","../src/components/backgrounds/Filaments/Filaments.tsx","../src/components/backgrounds/FlipTiles/FlipTiles.tsx","../src/components/backgrounds/Halo/Halo.tsx","../src/components/backgrounds/MeshGradient/MeshGradient.tsx","../src/components/backgrounds/PixelVortex/PixelVortex.tsx","../src/components/backgrounds/Planet/Planet.tsx","../src/components/backgrounds/SilkWaves/SilkWaves.tsx","../src/components/backgrounds/Velvet/Velvet.tsx","../src/components/media/AsciiImage/AsciiImage.tsx","../src/components/text/GradientText/GradientText.tsx","../src/components/text/Marquee/Marquee.tsx","../src/components/text/ParticleText/ParticleText.tsx","../src/components/text/RotatingText/RotatingText.tsx","../src/components/text/ScrambleText/ScrambleText.tsx","../src/components/text/ScrollMarquee/ScrollMarquee.tsx","../src/components/text/ScrollReveal/ScrollReveal.tsx","../src/components/text/SplitReveal/SplitReveal.tsx","../src/components/text/Typewriter/Typewriter.tsx","../src/components/text/WaveText/WaveText.tsx"],"names":["useRef","useState","useEffect","easeOutCubic","jsx","jsxs","FRAGMENT_SHADER","DEFAULT_COLORS","style","DEFAULT_CHARACTERS","_","useMemo"],"mappings":"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A;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,CAAA;AAqIxB,IAAM,aAAA,GAAgB;AAAA;;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,CAAA;AAoKtB,IAAM,IAAA,GAAO;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;A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","file":"index.js","sourcesContent":["import { useEffect, useRef, useState } from 'react';\n\nimport { cn, usePrefersReducedMotion } from '../../../core';\n\nimport './CountUp.css';\n\nexport interface CountUpProps {\n className?: string;\n /** 目标数值 */\n to: number;\n /** 起始数值 */\n from?: number;\n /** 动画时长(毫秒) */\n duration?: number;\n /** 保留的小数位数 */\n decimals?: number;\n /** 是否使用千分位分隔符 */\n separator?: boolean;\n /** 数字前缀 */\n prefix?: string;\n /** 数字后缀 */\n suffix?: string;\n /** 是否只在首次进入视口时播放 */\n once?: boolean;\n}\n\nconst group = (value: string) => value.replace(/\\B(?=(\\d{3})+(?!\\d))/g, ',');\n\nconst easeOutCubic = (progress: number) => 1 - (1 - progress) ** 3;\n\n/** 数字滚动:进入视口时从起始值过渡到目标值 */\nexport function CountUp({\n className,\n to,\n from = 0,\n duration = 1200,\n decimals = 0,\n separator = false,\n prefix,\n suffix,\n once = true,\n}: CountUpProps) {\n const elementRef = useRef<HTMLSpanElement>(null);\n const prefersReducedMotion = usePrefersReducedMotion();\n const [value, setValue] = useState(from);\n const [isIntersecting, setIsIntersecting] = useState(false);\n\n useEffect(() => {\n const element = elementRef.current;\n if (!element || prefersReducedMotion) return;\n\n const observer = new IntersectionObserver(\n ([entry]) => {\n if (entry.isIntersecting) {\n setIsIntersecting(true);\n if (once) observer.disconnect();\n return;\n }\n\n if (!once) setIsIntersecting(false);\n },\n { threshold: 0.1 },\n );\n\n observer.observe(element);\n\n return () => observer.disconnect();\n }, [once, prefersReducedMotion]);\n\n useEffect(() => {\n if (!isIntersecting || prefersReducedMotion) return;\n\n let frame = 0;\n const startedAt = performance.now();\n\n const tick = (now: number) => {\n const progress = duration > 0 ? Math.min((now - startedAt) / duration, 1) : 1;\n setValue(from + (to - from) * easeOutCubic(progress));\n\n if (progress < 1) frame = requestAnimationFrame(tick);\n };\n\n frame = requestAnimationFrame(tick);\n\n return () => cancelAnimationFrame(frame);\n }, [isIntersecting, from, to, duration, prefersReducedMotion]);\n\n const fixed = (prefersReducedMotion ? to : value).toFixed(decimals);\n const [integer, fraction] = fixed.split('.');\n const grouped = separator ? group(integer) : integer;\n const display = fraction ? `${grouped}.${fraction}` : grouped;\n\n return (\n <span ref={elementRef} className={cn('elyri-count-up', className)}>\n {prefix}\n {display}\n {suffix}\n </span>\n );\n}\n","import { useEffect, useRef, useState } from 'react';\nimport type { CSSProperties, ReactNode } from 'react';\n\nimport { cn, usePrefersReducedMotion } from '../../../core';\n\nimport './FadeIn.css';\n\nexport type FadeInDirection = 'up' | 'down' | 'left' | 'right' | 'none';\n\nexport interface FadeInProps {\n children: ReactNode;\n className?: string;\n direction?: FadeInDirection;\n delay?: number;\n duration?: number;\n distance?: number;\n once?: boolean;\n}\n\nexport function FadeIn({\n children,\n className,\n direction = 'up',\n delay = 0,\n duration = 600,\n distance = 24,\n once = true,\n}: FadeInProps) {\n const elementRef = useRef<HTMLDivElement>(null);\n const prefersReducedMotion = usePrefersReducedMotion();\n const [isIntersecting, setIsIntersecting] = useState(false);\n\n useEffect(() => {\n const element = elementRef.current;\n if (!element || prefersReducedMotion) return;\n\n const observer = new IntersectionObserver(\n ([entry]) => {\n if (entry.isIntersecting) {\n setIsIntersecting(true);\n if (once) observer.disconnect();\n return;\n }\n\n if (!once) setIsIntersecting(false);\n },\n { threshold: 0.1 },\n );\n\n observer.observe(element);\n\n return () => observer.disconnect();\n }, [once, prefersReducedMotion]);\n\n const style = {\n '--elyri-fade-in-delay': `${delay}ms`,\n '--elyri-fade-in-duration': `${duration}ms`,\n '--elyri-fade-in-distance': `${distance}px`,\n } as CSSProperties;\n\n const isVisible = prefersReducedMotion || isIntersecting;\n\n return (\n <div\n ref={elementRef}\n className={cn('elyri-fade-in', `elyri-fade-in--${direction}`, isVisible && 'elyri-fade-in--visible', className)}\n style={style}\n >\n {children}\n </div>\n );\n}\n","import { useEffect, useRef } from 'react';\nimport type { ReactNode } from 'react';\n\nimport { cn, usePrefersReducedMotion } from '../../../core';\n\nimport './Magnetic.css';\n\nconst easeOutCubic = (progress: number) => 1 - (1 - progress) ** 3;\n\nexport interface MagneticProps {\n children: ReactNode;\n className?: string;\n /** 吸附强度(0-1),元素向指针偏移的距离比例 */\n strength?: number;\n /** 元素边缘向外扩展的触发范围(像素) */\n range?: number;\n /** 指针离开触发范围后的回正时长(毫秒) */\n resetDuration?: number;\n}\n\n/** 磁吸:指针靠近时元素被吸附偏移,离开后缓动回正 */\nexport function Magnetic({ children, className, strength = 0.35, range = 120, resetDuration = 400 }: MagneticProps) {\n const elementRef = useRef<HTMLDivElement>(null);\n const prefersReducedMotion = usePrefersReducedMotion();\n\n useEffect(() => {\n const element = elementRef.current;\n if (!element || prefersReducedMotion) return;\n\n let moveFrame = 0;\n let resetFrame = 0;\n let offset = { x: 0, y: 0 };\n let pointer: { x: number; y: number } | null = null;\n\n const setOffset = (x: number, y: number) => {\n offset = { x, y };\n element.style.setProperty('--elyri-magnetic-x', `${x}px`);\n element.style.setProperty('--elyri-magnetic-y', `${y}px`);\n };\n\n // 缓动补间回正,避免指针离开范围时位置瞬间归零\n const startReset = () => {\n if (resetFrame || (!offset.x && !offset.y)) return;\n\n const from = { ...offset };\n const startedAt = performance.now();\n\n const step = (now: number) => {\n const progress = Math.min((now - startedAt) / resetDuration, 1);\n const remaining = 1 - easeOutCubic(progress);\n\n setOffset(from.x * remaining, from.y * remaining);\n\n resetFrame = progress < 1 ? requestAnimationFrame(step) : 0;\n };\n\n resetFrame = requestAnimationFrame(step);\n };\n\n const handlePointerMove = (event: PointerEvent) => {\n pointer = { x: event.clientX, y: event.clientY };\n\n if (moveFrame) return;\n\n moveFrame = requestAnimationFrame(() => {\n moveFrame = 0;\n if (!pointer) return;\n\n const rect = element.getBoundingClientRect();\n const dx = pointer.x - (rect.left + rect.width / 2);\n const dy = pointer.y - (rect.top + rect.height / 2);\n const inside = Math.abs(dx) <= rect.width / 2 + range && Math.abs(dy) <= rect.height / 2 + range;\n\n if (inside) {\n // 指针回到触发范围时打断尚未结束的回正\n cancelAnimationFrame(resetFrame);\n resetFrame = 0;\n // 边缘衰减:边界处系数为 0,越靠近元素越大,避免进入范围瞬间位移跳变\n const overflowX = Math.max(0, Math.abs(dx) - rect.width / 2);\n const overflowY = Math.max(0, Math.abs(dy) - rect.height / 2);\n const proximity = 1 - Math.min(Math.max(overflowX, overflowY) / range, 1);\n setOffset(dx * strength * proximity, dy * strength * proximity);\n return;\n }\n\n startReset();\n });\n };\n\n window.addEventListener('pointermove', handlePointerMove, { passive: true });\n // 指针移出窗口时不再触发 pointermove,需要手动回正\n document.documentElement.addEventListener('pointerleave', startReset);\n\n return () => {\n window.removeEventListener('pointermove', handlePointerMove);\n document.documentElement.removeEventListener('pointerleave', startReset);\n cancelAnimationFrame(moveFrame);\n cancelAnimationFrame(resetFrame);\n };\n }, [prefersReducedMotion, range, strength, resetDuration]);\n\n return (\n <div ref={elementRef} className={cn('elyri-magnetic', className)}>\n {children}\n </div>\n );\n}\n","import { useEffect, useRef, useState } from 'react';\nimport type { CSSProperties, ReactNode } from 'react';\n\nimport { cn, usePrefersReducedMotion } from '../../../core';\n\nimport './ScaleIn.css';\n\nexport interface ScaleInProps {\n children: ReactNode;\n className?: string;\n /** 起始缩放比例 */\n from?: number;\n /** 延迟(毫秒) */\n delay?: number;\n /** 动画时长(毫秒) */\n duration?: number;\n /** 是否只在首次进入视口时触发 */\n once?: boolean;\n}\n\nexport function ScaleIn({ children, className, from = 0.9, delay = 0, duration = 600, once = true }: ScaleInProps) {\n const elementRef = useRef<HTMLDivElement>(null);\n const prefersReducedMotion = usePrefersReducedMotion();\n const [isIntersecting, setIsIntersecting] = useState(false);\n\n useEffect(() => {\n const element = elementRef.current;\n if (!element || prefersReducedMotion) return;\n\n const observer = new IntersectionObserver(\n ([entry]) => {\n if (entry.isIntersecting) {\n setIsIntersecting(true);\n if (once) observer.disconnect();\n return;\n }\n\n if (!once) setIsIntersecting(false);\n },\n { threshold: 0.1 },\n );\n\n observer.observe(element);\n\n return () => observer.disconnect();\n }, [once, prefersReducedMotion]);\n\n const style = {\n '--elyri-scale-in-from': from,\n '--elyri-scale-in-delay': `${delay}ms`,\n '--elyri-scale-in-duration': `${duration}ms`,\n } as CSSProperties;\n\n const isVisible = prefersReducedMotion || isIntersecting;\n\n return (\n <div\n ref={elementRef}\n className={cn('elyri-scale-in', isVisible && 'elyri-scale-in--visible', className)}\n style={style}\n >\n {children}\n </div>\n );\n}\n","import { useEffect, useRef } from 'react';\nimport type { CSSProperties, PointerEvent as ReactPointerEvent, ReactNode } from 'react';\n\nimport { cn } from '../../../core';\n\nimport './Spotlight.css';\n\nexport interface SpotlightProps {\n children: ReactNode;\n className?: string;\n /** 光斑颜色 */\n color?: string;\n /** 光斑半径(像素) */\n size?: number;\n /** 是否显示卡片内部跟随指针的径向光晕 */\n glow?: boolean;\n /** 是否显示指针附近的边框光晕 */\n borderGlow?: boolean;\n /** 卡片圆角(像素) */\n radius?: number;\n}\n\n/** 聚光卡片:指针位置泛起径向高光,可选择性地点亮边框;内部元素加 elyri-spotlight__item 可获得同款边框光晕 */\nexport function Spotlight({\n children,\n className,\n color = '#7c8cff',\n size = 240,\n glow = true,\n borderGlow = true,\n radius = 16,\n}: SpotlightProps) {\n const elementRef = useRef<HTMLDivElement>(null);\n const frameRef = useRef(0);\n const pointerRef = useRef<{ x: number; y: number } | null>(null);\n const itemsRef = useRef<HTMLElement[]>([]);\n\n useEffect(\n () => () => {\n cancelAnimationFrame(frameRef.current);\n },\n [],\n );\n\n const handlePointerMove = (event: ReactPointerEvent<HTMLDivElement>) => {\n pointerRef.current = { x: event.clientX, y: event.clientY };\n\n if (frameRef.current) return;\n\n frameRef.current = requestAnimationFrame(() => {\n frameRef.current = 0;\n\n const element = elementRef.current;\n const pointer = pointerRef.current;\n if (!element || !pointer) return;\n\n const rect = element.getBoundingClientRect();\n element.style.setProperty('--elyri-spotlight-x', `${pointer.x - rect.left}px`);\n element.style.setProperty('--elyri-spotlight-y', `${pointer.y - rect.top}px`);\n\n // 内部组件以自己的边框呈现光晕,需要相对自身的指针坐标\n for (const item of itemsRef.current) {\n const itemRect = item.getBoundingClientRect();\n item.style.setProperty('--elyri-spotlight-x', `${pointer.x - itemRect.left}px`);\n item.style.setProperty('--elyri-spotlight-y', `${pointer.y - itemRect.top}px`);\n }\n });\n };\n\n const handlePointerEnter = (event: ReactPointerEvent<HTMLDivElement>) => {\n // 悬停期间缓存内部光晕项,避免每帧查询 DOM\n itemsRef.current = Array.from(\n event.currentTarget.querySelectorAll<HTMLElement>('.elyri-spotlight__item'),\n );\n handlePointerMove(event);\n };\n\n const style = {\n '--elyri-spotlight-color': color,\n '--elyri-spotlight-size': `${size}px`,\n '--elyri-spotlight-radius': `${radius}px`,\n } as CSSProperties;\n\n return (\n <div\n ref={elementRef}\n className={cn(\n 'elyri-spotlight',\n glow && 'elyri-spotlight--glow',\n borderGlow && 'elyri-spotlight--border',\n className,\n )}\n style={style}\n onPointerEnter={handlePointerEnter}\n onPointerMove={handlePointerMove}\n >\n <div className=\"elyri-spotlight__content\">{children}</div>\n </div>\n );\n}\n","import { useEffect, useRef, useState } from 'react';\nimport type { CSSProperties, PointerEvent as ReactPointerEvent, ReactNode } from 'react';\n\nimport { cn, usePrefersReducedMotion } from '../../../core';\n\nimport './Tilt.css';\n\n/** 指针离开后回正所用的时长(毫秒) */\nconst RESET_DURATION = 400;\n\nconst easeOutCubic = (progress: number) => 1 - (1 - progress) ** 3;\n\nexport interface TiltProps {\n children: ReactNode;\n className?: string;\n /** 最大倾斜角度(度) */\n max?: number;\n /** 透视距离(像素) */\n perspective?: number;\n /** 是否显示跟随指针的高光 */\n glare?: boolean;\n}\n\n/** 指针跟随倾斜:根据指针在元素内的位置计算 3D 旋转 */\nexport function Tilt({ children, className, max = 10, perspective = 800, glare = true }: TiltProps) {\n const elementRef = useRef<HTMLDivElement>(null);\n const moveFrameRef = useRef(0);\n const resetFrameRef = useRef(0);\n const rotationRef = useRef({ x: 0, y: 0 });\n const pointerRef = useRef<{ x: number; y: number } | null>(null);\n const prefersReducedMotion = usePrefersReducedMotion();\n const [isActive, setIsActive] = useState(false);\n\n useEffect(\n () => () => {\n cancelAnimationFrame(moveFrameRef.current);\n cancelAnimationFrame(resetFrameRef.current);\n },\n [],\n );\n\n const setRotation = (x: number, y: number) => {\n rotationRef.current = { x, y };\n\n const element = elementRef.current;\n if (!element) return;\n\n element.style.setProperty('--elyri-tilt-rotate-x', `${x}deg`);\n element.style.setProperty('--elyri-tilt-rotate-y', `${y}deg`);\n };\n\n const handlePointerMove = (event: ReactPointerEvent<HTMLDivElement>) => {\n if (prefersReducedMotion) return;\n\n // 指针重新进入时打断尚未结束的回正\n cancelAnimationFrame(resetFrameRef.current);\n resetFrameRef.current = 0;\n\n pointerRef.current = { x: event.clientX, y: event.clientY };\n setIsActive(true);\n\n if (moveFrameRef.current) return;\n\n moveFrameRef.current = requestAnimationFrame(() => {\n moveFrameRef.current = 0;\n\n const element = elementRef.current;\n const pointer = pointerRef.current;\n if (!element || !pointer) return;\n\n const rect = element.getBoundingClientRect();\n if (!rect.width || !rect.height) return;\n\n const ratioX = (pointer.x - rect.left) / rect.width;\n const ratioY = (pointer.y - rect.top) / rect.height;\n\n setRotation((0.5 - ratioY) * 2 * max, (ratioX - 0.5) * 2 * max);\n element.style.setProperty('--elyri-tilt-glare-x', `${ratioX * 100}%`);\n element.style.setProperty('--elyri-tilt-glare-y', `${ratioY * 100}%`);\n });\n };\n\n const handlePointerEnd = () => {\n cancelAnimationFrame(moveFrameRef.current);\n moveFrameRef.current = 0;\n cancelAnimationFrame(resetFrameRef.current);\n resetFrameRef.current = 0;\n\n pointerRef.current = null;\n setIsActive(false);\n\n const from = { ...rotationRef.current };\n if (prefersReducedMotion || (!from.x && !from.y)) return;\n\n // 缓动补间回正,避免指针离开时角度瞬间归零\n const startedAt = performance.now();\n\n const step = (now: number) => {\n const progress = Math.min((now - startedAt) / RESET_DURATION, 1);\n const remaining = 1 - easeOutCubic(progress);\n\n setRotation(from.x * remaining, from.y * remaining);\n\n if (progress < 1) resetFrameRef.current = requestAnimationFrame(step);\n };\n\n resetFrameRef.current = requestAnimationFrame(step);\n };\n\n return (\n <div\n ref={elementRef}\n className={cn('elyri-tilt', isActive && 'elyri-tilt--active', className)}\n style={{ '--elyri-tilt-perspective': `${perspective}px` } as CSSProperties}\n onPointerMove={handlePointerMove}\n onPointerLeave={handlePointerEnd}\n onPointerCancel={handlePointerEnd}\n >\n {children}\n {glare && <span className=\"elyri-tilt__glare\" aria-hidden=\"true\" />}\n </div>\n );\n}\n","import type { CSSProperties, ReactNode } from 'react';\n\nimport { cn, hexToLinearRgb, useShaderCanvas } from '../../../core';\n\nimport './Aurora.css';\n\nexport interface AuroraProps {\n children?: ReactNode;\n className?: string;\n /** 三段渐变色:帘底、中段、帘顶(hex) */\n colors?: [string, string, string];\n /** 动画速度倍率 */\n speed?: number;\n /** 极光亮度倍率 */\n intensity?: number;\n /** 是否显示星空 */\n stars?: boolean;\n /** 指针附近的极光是否增亮 */\n interactive?: boolean;\n}\n\nconst DEFAULT_COLORS: [string, string, string] = ['#3cffb0', '#2a8cff', '#c04dff'];\n\n// 多层极光帘幕:每层是一条被 fbm 扭动的曲线,下缘锐利、向上柔和衰减,\n// 叠加沿水平方向的高频竖向光束,颜色随高度从帘底色过渡到帘顶色。\nconst FRAGMENT_SHADER = `\nprecision highp float;\n\nuniform vec2 uResolution;\nuniform float uTime;\nuniform vec2 uPointer;\nuniform vec3 uColor1;\nuniform vec3 uColor2;\nuniform vec3 uColor3;\nuniform float uIntensity;\nuniform float uStars;\n\nfloat hash(vec2 p) {\n p = fract(p * vec2(123.34, 456.21));\n p += dot(p, p + 45.32);\n return fract(p.x * p.y);\n}\n\nfloat noise(vec2 p) {\n vec2 i = floor(p);\n vec2 f = fract(p);\n vec2 u = f * f * (3.0 - 2.0 * f);\n return mix(\n mix(hash(i), hash(i + vec2(1.0, 0.0)), u.x),\n mix(hash(i + vec2(0.0, 1.0)), hash(i + vec2(1.0, 1.0)), u.x),\n u.y\n );\n}\n\nfloat fbm(vec2 p) {\n float v = 0.0;\n float a = 0.5;\n for (int i = 0; i < 4; i++) {\n v += a * noise(p);\n p = p * 2.03 + vec2(17.1, 9.2);\n a *= 0.5;\n }\n return v;\n}\n\nvec3 aces(vec3 x) {\n return clamp((x * (2.51 * x + 0.03)) / (x * (2.43 * x + 0.59) + 0.14), 0.0, 1.0);\n}\n\nvoid main() {\n vec2 uv = gl_FragCoord.xy / uResolution.y;\n vec2 pointer = vec2(uPointer.x, uResolution.y - uPointer.y) / uResolution.y;\n float t = uTime;\n\n // 夜空底色:地平线附近略带帘底色的微光\n vec3 color = mix(vec3(0.002, 0.004, 0.012), vec3(0.006, 0.01, 0.03), uv.y);\n color += uColor1 * 0.025 * exp(-uv.y * 5.0);\n\n // 星空\n vec2 grid = uv * 55.0;\n vec2 cell = floor(grid);\n float rnd = hash(cell);\n vec2 offset = vec2(hash(cell + 3.1), hash(cell + 7.7)) - 0.5;\n float starDist = length(fract(grid) - 0.5 - offset * 0.7);\n float twinkle = 0.6 + 0.4 * sin(t * (1.5 + rnd * 3.0) + rnd * 40.0);\n float star = step(0.93, rnd) * exp(-starDist * starDist * 180.0) * twinkle * smoothstep(0.1, 0.6, uv.y);\n color += vec3(0.8, 0.85, 1.0) * star * uStars;\n\n vec3 aurora = vec3(0.0);\n for (int i = 0; i < 4; i++) {\n float fi = float(i);\n float x = uv.x * (0.6 + fi * 0.15) + fi * 3.7;\n float curve = 0.42 + fi * 0.09 + (fbm(vec2(x * 1.2 - t * 0.05 * (1.0 + fi * 0.3), fi * 5.3 + t * 0.03)) - 0.5) * 0.45;\n float d = uv.y - curve;\n float body = d > 0.0 ? exp(-d * (3.5 + fi)) : exp(d * 40.0);\n float rays = fbm(vec2(x * 28.0 + curve * 6.0, t * 0.35 + fi));\n rays = 0.25 + 1.5 * rays * rays;\n float flow = 0.6 + 0.4 * sin(x * 3.0 - t * 0.4 + fi * 1.7);\n vec3 c = mix(uColor1, uColor2, smoothstep(0.0, 0.3, d));\n c = mix(c, uColor3, smoothstep(0.12, 0.55, d) * (0.55 + 0.45 * sin(fi * 2.1 + x * 0.8 + t * 0.1)));\n aurora += c * body * rays * flow * (0.5 - fi * 0.08);\n }\n\n vec2 dp = uv - pointer;\n aurora *= 1.0 + 0.7 * exp(-dot(dp, dp) * 6.0);\n color += aurora * uIntensity;\n\n vec2 vc = gl_FragCoord.xy / uResolution - 0.5;\n color *= 1.0 - dot(vc, vc) * 0.9;\n color = pow(aces(color * 1.2), vec3(1.0 / 2.2));\n color += (hash(gl_FragCoord.xy + fract(t)) - 0.5) / 255.0;\n\n gl_FragColor = vec4(color, 1.0);\n}\n`;\n\nexport function Aurora({\n children,\n className,\n colors = DEFAULT_COLORS,\n speed = 1,\n intensity = 1,\n stars = true,\n interactive = true,\n}: AuroraProps) {\n const [bottom = DEFAULT_COLORS[0], middle = DEFAULT_COLORS[1], top = DEFAULT_COLORS[2]] = colors;\n\n const canvasRef = useShaderCanvas({\n fragmentShader: FRAGMENT_SHADER,\n speed,\n interactive,\n onDraw: ({ gl, uniform }) => {\n gl.uniform3fv(uniform('uColor1'), hexToLinearRgb(bottom));\n gl.uniform3fv(uniform('uColor2'), hexToLinearRgb(middle));\n gl.uniform3fv(uniform('uColor3'), hexToLinearRgb(top));\n gl.uniform1f(uniform('uIntensity'), Math.max(0, intensity));\n gl.uniform1f(uniform('uStars'), stars ? 1 : 0);\n },\n });\n\n return (\n <div className={cn('elyri-aurora', className)} style={{ '--elyri-aurora-color': bottom } as CSSProperties}>\n <canvas ref={canvasRef} className=\"elyri-aurora__canvas\" aria-hidden=\"true\" />\n {children != null && <div className=\"elyri-aurora__content\">{children}</div>}\n </div>\n );\n}\n","import type { CSSProperties, ReactNode } from 'react';\n\nimport { cn, hexToLinearRgb, useShaderCanvas } from '../../../core';\n\nimport './Caustics.css';\n\nexport interface CausticsProps {\n children?: ReactNode;\n className?: string;\n /** 水体颜色(hex) */\n color?: string;\n /** 焦散光色(hex) */\n highlightColor?: string;\n /** 光纹密度倍率 */\n density?: number;\n /** 动画速度倍率 */\n speed?: number;\n /** 指针处是否荡开水波并聚光 */\n interactive?: boolean;\n}\n\n// 水下焦散:两层运动 Voronoi 的细胞边缘构成光网,交汇处叠加增亮;\n// RGB 三通道轻微错位模拟色散,再加顶部斜射的光束与随深度变暗的水体。\nconst FRAGMENT_SHADER = `\nprecision highp float;\n\nuniform vec2 uResolution;\nuniform float uTime;\nuniform vec2 uPointer;\nuniform vec3 uBase;\nuniform vec3 uHighlight;\nuniform float uDensity;\nuniform float uRipple;\n\nfloat hash(vec2 p) {\n p = fract(p * vec2(123.34, 456.21));\n p += dot(p, p + 45.32);\n return fract(p.x * p.y);\n}\n\nvec2 hash2(vec2 p) {\n p = vec2(dot(p, vec2(127.1, 311.7)), dot(p, vec2(269.5, 183.3)));\n return fract(sin(p) * 43758.5453);\n}\n\nfloat cellEdge(vec2 p, float t) {\n vec2 i = floor(p);\n vec2 f = fract(p);\n float f1 = 8.0;\n float f2 = 8.0;\n for (int y = -1; y <= 1; y++) {\n for (int x = -1; x <= 1; x++) {\n vec2 g = vec2(float(x), float(y));\n vec2 o = 0.5 + 0.4 * sin(t * 0.8 + 6.2831 * hash2(i + g));\n float d = length(g + o - f);\n if (d < f1) {\n f2 = f1;\n f1 = d;\n } else if (d < f2) {\n f2 = d;\n }\n }\n }\n return f2 - f1;\n}\n\nfloat caustic(vec2 p, float t) {\n p += 0.25 * vec2(sin(p.y * 1.3 + t * 0.7), cos(p.x * 1.1 - t * 0.6));\n float a = exp(-cellEdge(p, t) * 9.0);\n float b = exp(-cellEdge(p * 1.7 + vec2(3.1, 7.4), t * 1.3) * 9.0);\n return a * 0.7 + b * 0.45 + a * b * 1.5;\n}\n\nvec3 aces(vec3 x) {\n return clamp((x * (2.51 * x + 0.03)) / (x * (2.43 * x + 0.59) + 0.14), 0.0, 1.0);\n}\n\nvoid main() {\n vec2 frag = vec2(gl_FragCoord.x, uResolution.y - gl_FragCoord.y);\n float minRes = min(uResolution.x, uResolution.y);\n float t = uTime;\n vec2 p = frag / minRes * 4.0 * uDensity;\n\n // 指针处荡开的水波\n vec2 dp = (frag - uPointer) / minRes;\n float r = length(dp);\n p += dp / (r + 1e-4) * sin(r * 38.0 - t * 4.0) * 0.06 * exp(-r * 5.0) * uRipple;\n\n vec3 caus = vec3(\n caustic(p + vec2(0.014, 0.0), t),\n caustic(p, t),\n caustic(p - vec2(0.014, 0.0), t)\n );\n\n float depth = frag.y / uResolution.y;\n vec3 color = mix(uBase * 0.35, uBase * 0.025, depth);\n\n // 斜射光束\n float x = frag.x / minRes + depth * 0.35;\n float rays = (0.5 + 0.5 * sin(x * 9.0 + sin(x * 3.1 + t * 0.3) * 2.0 + t * 0.2)) * (0.5 + 0.5 * sin(x * 17.0 - t * 0.35));\n color += uHighlight * 0.12 * rays * rays * (1.0 - depth) * (1.0 - depth);\n\n float focus = 0.6 + 0.8 * exp(-dot(dp, dp) * 3.0) * uRipple;\n color += uHighlight * caus * 0.5 * mix(1.0, 0.3, depth) * focus;\n\n vec2 vc = frag / uResolution - 0.5;\n color *= 1.0 - dot(vc, vc) * 1.1;\n color = pow(aces(color * 1.2), vec3(1.0 / 2.2));\n color += (hash(frag + fract(t)) - 0.5) / 255.0;\n\n gl_FragColor = vec4(color, 1.0);\n}\n`;\n\nexport function Caustics({\n children,\n className,\n color = '#0a6fa8',\n highlightColor = '#c8fbff',\n density = 1,\n speed = 1,\n interactive = true,\n}: CausticsProps) {\n const canvasRef = useShaderCanvas({\n fragmentShader: FRAGMENT_SHADER,\n speed,\n interactive,\n onDraw: ({ gl, uniform }) => {\n gl.uniform3fv(uniform('uBase'), hexToLinearRgb(color));\n gl.uniform3fv(uniform('uHighlight'), hexToLinearRgb(highlightColor));\n gl.uniform1f(uniform('uDensity'), Math.max(0.2, density));\n gl.uniform1f(uniform('uRipple'), interactive ? 1 : 0);\n },\n });\n\n return (\n <div className={cn('elyri-caustics', className)} style={{ '--elyri-caustics-color': color } as CSSProperties}>\n <canvas ref={canvasRef} className=\"elyri-caustics__canvas\" aria-hidden=\"true\" />\n {children != null && <div className=\"elyri-caustics__content\">{children}</div>}\n </div>\n );\n}\n","import type { CSSProperties, ReactNode } from 'react';\n\nimport { cn, hexToLinearRgb, useColorScheme, useShaderCanvas } from '../../../core';\n\nimport './Contours.css';\n\nexport interface ContoursProps {\n children?: ReactNode;\n className?: string;\n /** 等高线颜色(hex) */\n color?: string;\n /** 指针附近等高线的强调色(hex) */\n highlightColor?: string;\n /** 等高线密度倍率 */\n density?: number;\n /** 动画速度倍率 */\n speed?: number;\n /** 指针处是否隆起一座小山 */\n interactive?: boolean;\n}\n\n// 等高线:域扭曲的分形噪声作为缓慢演化的地形,按固定高程间隔取等值线。\n// 用有限差分求像素级梯度,把「到最近等值线的高程差」换算成像素距离,\n// 从而得到处处等宽、抗锯齿的细线;每五条加粗一条计曲线,线过密处自动淡出防摩尔纹。\nconst FRAGMENT_SHADER = `\nprecision highp float;\n\nuniform vec2 uResolution;\nuniform float uTime;\nuniform vec2 uPointer;\nuniform vec3 uLine;\nuniform vec3 uHighlight;\nuniform vec3 uBg;\nuniform float uLevels;\nuniform float uDpr;\n\nconst float SCALE = 2.4;\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\nfloat noise(vec2 p) {\n vec2 i = floor(p);\n vec2 f = fract(p);\n vec2 u = f * f * f * (f * (f * 6.0 - 15.0) + 10.0);\n return mix(mix(hash(i), hash(i + vec2(1.0, 0.0)), u.x), mix(hash(i + vec2(0.0, 1.0)), hash(i + 1.0), u.x), u.y);\n}\n\nfloat fbm(vec2 p) {\n float v = 0.0;\n float a = 0.5;\n mat2 rot = mat2(0.8, -0.6, 0.6, 0.8);\n for (int i = 0; i < 3; i++) {\n v += a * noise(p);\n p = rot * p * 2.03 + 17.1;\n a *= 0.5;\n }\n return v;\n}\n\nfloat terrain(vec2 p, vec2 hill, float t) {\n vec2 warp = vec2(noise(p * 0.55 + vec2(t * 0.08, 3.1)), noise(p * 0.55 + vec2(7.7, -t * 0.07)));\n float h = fbm(p + warp * 1.3 + vec2(t * 0.035, -t * 0.025));\n vec2 d = p - hill;\n return h + 0.2 * exp(-dot(d, d) * 1.6);\n}\n\nvoid main() {\n vec2 frag = vec2(gl_FragCoord.x, uResolution.y - gl_FragCoord.y);\n float minRes = min(uResolution.x, uResolution.y);\n float px = SCALE / minRes;\n vec2 p = frag * px;\n vec2 hill = uPointer * px;\n float t = uTime;\n\n float h = terrain(p, hill, t);\n float hx = terrain(p + vec2(px, 0.0), hill, t);\n float hy = terrain(p + vec2(0.0, px), hill, t);\n\n float f = h * uLevels;\n float slope = max(length(vec2(hx - h, hy - h)) * uLevels, 1e-5);\n float fr = fract(f);\n float dist = min(fr, 1.0 - fr) / slope;\n\n float index = floor(f + 0.5);\n float major = 1.0 - step(0.5, abs(mod(index, 5.0)));\n float halfWidth = mix(0.5, 0.95, major) * uDpr;\n float line = 1.0 - smoothstep(halfWidth - 0.6, halfWidth + 0.6, dist);\n\n // 线间距小于数像素时淡出,避免陡坡处糊成一片\n line *= smoothstep(2.5 * uDpr, 6.0 * uDpr, 1.0 / slope);\n\n float radius = 240.0 * uDpr;\n vec2 dp = frag - uPointer;\n float near = exp(-dot(dp, dp) / (radius * radius));\n\n vec2 q = (frag - 0.5 * uResolution) / (0.5 * uResolution);\n float mask = mix(0.4, 1.0, 1.0 - smoothstep(0.45, 1.4, length(q)));\n\n float alpha = line * mix(0.32, 0.7, major) * (1.0 + 0.9 * near) * mask;\n vec3 lineColor = mix(uLine, uHighlight, clamp(near * 1.2, 0.0, 1.0));\n vec3 color = mix(uBg, lineColor, clamp(alpha, 0.0, 1.0));\n\n color = pow(color, vec3(1.0 / 2.2));\n color += (hash(frag + fract(t)) - 0.5) / 255.0;\n\n gl_FragColor = vec4(color, 1.0);\n}\n`;\n\nexport function Contours({\n children,\n className,\n color = '#8a90a6',\n highlightColor = '#f08a4b',\n density = 1,\n speed = 1,\n interactive = true,\n}: ContoursProps) {\n const scheme = useColorScheme();\n const canvasRef = useShaderCanvas({\n fragmentShader: FRAGMENT_SHADER,\n speed,\n interactive,\n onDraw: ({ gl, uniform, dpr }) => {\n gl.uniform3fv(uniform('uLine'), hexToLinearRgb(color));\n gl.uniform3fv(uniform('uHighlight'), hexToLinearRgb(highlightColor));\n gl.uniform3fv(uniform('uBg'), hexToLinearRgb(scheme === 'light' ? '#f9f9f7' : '#0a0b0f'));\n gl.uniform1f(uniform('uLevels'), 18 * Math.max(0.2, density));\n gl.uniform1f(uniform('uDpr'), dpr);\n },\n });\n\n return (\n <div\n className={cn('elyri-contours', className)}\n data-scheme={scheme}\n style={{ '--elyri-contours-color': color } as CSSProperties}\n >\n <canvas ref={canvasRef} className=\"elyri-contours__canvas\" aria-hidden=\"true\" />\n {children != null && <div className=\"elyri-contours__content\">{children}</div>}\n </div>\n );\n}\n","import type { CSSProperties, ReactNode } from 'react';\n\nimport { cn, hexToLinearRgb, useColorScheme, useShaderCanvas } from '../../../core';\n\nimport './DotField.css';\n\nexport interface DotFieldProps {\n children?: ReactNode;\n className?: string;\n /** 点的底色(hex) */\n color?: string;\n /** 波峰与指针附近的点所用的强调色(hex) */\n highlightColor?: string;\n /** 点阵间距(CSS 像素) */\n gap?: number;\n /** 动画速度倍率 */\n speed?: number;\n /** 指针附近的点是否被放大、推开 */\n interactive?: boolean;\n}\n\n// 呼吸点阵:规整网格上的细点,被两层缓慢漂移的噪声调制大小与亮度,\n// 像一阵阵微风掠过;指针处形成一片透镜,点被放大、向外轻推并染上强调色。\n// 每个像素检查 3×3 邻格,保证被推开的点不会被格子边界裁掉。\nconst FRAGMENT_SHADER = `\nprecision highp float;\n\nuniform vec2 uResolution;\nuniform float uTime;\nuniform vec2 uPointer;\nuniform vec3 uDot;\nuniform vec3 uHighlight;\nuniform vec3 uBg;\nuniform float uGap;\nuniform float uDpr;\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\nfloat noise(vec2 p) {\n vec2 i = floor(p);\n vec2 f = fract(p);\n vec2 u = f * f * f * (f * (f * 6.0 - 15.0) + 10.0);\n return mix(mix(hash(i), hash(i + vec2(1.0, 0.0)), u.x), mix(hash(i + vec2(0.0, 1.0)), hash(i + 1.0), u.x), u.y);\n}\n\nvoid main() {\n vec2 frag = vec2(gl_FragCoord.x, uResolution.y - gl_FragCoord.y);\n float gap = uGap * uDpr;\n float radius = 170.0 * uDpr;\n float t = uTime;\n vec2 cell = floor(frag / gap);\n\n float best = 0.0;\n float bestTint = 0.0;\n for (int j = -1; j <= 1; j++) {\n for (int i = -1; i <= 1; i++) {\n vec2 id = cell + vec2(float(i), float(j));\n vec2 center = (id + 0.5) * gap;\n\n vec2 away = center - uPointer;\n float d = length(away);\n float lens = exp(-d * d / (radius * radius));\n center += away / max(d, 1.0) * lens * gap * 0.32;\n\n // 两层噪声:大尺度的「风」+ 小尺度的细碎起伏\n float wave = noise(id * 0.075 + vec2(t * 0.11, -t * 0.07)) * 0.65\n + noise(id * 0.21 - vec2(t * 0.05, t * 0.09)) * 0.35;\n wave = smoothstep(0.3, 0.85, wave);\n\n float r = max(gap * (0.055 + 0.075 * wave + 0.1 * lens), 0.7 * uDpr);\n float cover = 1.0 - smoothstep(r - 0.8, r + 0.8, length(frag - center));\n float alpha = cover * clamp(0.22 + 0.5 * wave + 0.55 * lens, 0.0, 1.0);\n if (alpha > best) {\n best = alpha;\n bestTint = clamp(wave * wave * 0.55 + lens * 0.95, 0.0, 1.0);\n }\n }\n }\n\n // 四周渐隐,视线聚焦在中央\n vec2 q = (frag - 0.5 * uResolution) / (0.5 * uResolution);\n float mask = mix(0.18, 1.0, 1.0 - smoothstep(0.3, 1.3, length(q)));\n\n vec3 dotColor = mix(uDot, uHighlight, bestTint);\n vec3 color = mix(uBg, dotColor, best * mask);\n\n // 指针下方极淡的光晕\n float glow = exp(-dot(frag - uPointer, frag - uPointer) / (radius * radius * 2.5));\n color += uHighlight * glow * 0.035;\n\n color = pow(color, vec3(1.0 / 2.2));\n color += (hash(frag + fract(t)) - 0.5) / 255.0;\n\n gl_FragColor = vec4(color, 1.0);\n}\n`;\n\nexport function DotField({\n children,\n className,\n color = '#8a90a6',\n highlightColor = '#7c6cff',\n gap = 22,\n speed = 1,\n interactive = true,\n}: DotFieldProps) {\n const scheme = useColorScheme();\n const canvasRef = useShaderCanvas({\n fragmentShader: FRAGMENT_SHADER,\n speed,\n interactive,\n onDraw: ({ gl, uniform, dpr }) => {\n gl.uniform3fv(uniform('uDot'), hexToLinearRgb(color));\n gl.uniform3fv(uniform('uHighlight'), hexToLinearRgb(highlightColor));\n gl.uniform3fv(uniform('uBg'), hexToLinearRgb(scheme === 'light' ? '#fafafb' : '#0a0a0e'));\n gl.uniform1f(uniform('uGap'), Math.max(8, gap));\n gl.uniform1f(uniform('uDpr'), dpr);\n },\n });\n\n return (\n <div\n className={cn('elyri-dot-field', className)}\n data-scheme={scheme}\n style={{ '--elyri-dot-field-color': color, '--elyri-dot-field-gap': `${Math.max(8, gap)}px` } as CSSProperties}\n >\n <canvas ref={canvasRef} className=\"elyri-dot-field__canvas\" aria-hidden=\"true\" />\n {children != null && <div className=\"elyri-dot-field__content\">{children}</div>}\n </div>\n );\n}\n","import type { CSSProperties, ReactNode } from 'react';\n\nimport type { ColorScheme } from '../../../core';\nimport { cn, hexToLinearRgb, useColorScheme, useShaderCanvas } from '../../../core';\n\nimport './DragonScales.css';\n\nexport interface DragonScalesProps {\n children?: ReactNode;\n className?: string;\n /** 鳞片本体色(hex) */\n color?: string;\n /** 反光条与鳞缘高光色(hex) */\n highlightColor?: string;\n /** 单片鳞宽度(px) */\n scaleSize?: number;\n /** 动画速度倍率 */\n speed?: number;\n /** 鳞片开合幅度 0-1,0 为关闭 */\n flare?: number;\n /** 光源是否跟随指针 */\n interactive?: boolean;\n /** 强制明暗方案,默认跟随页面主题 */\n scheme?: ColorScheme;\n}\n\n// 鳞片为尖头鱼鳞形(vesica),侧向排列:鳞尖朝右,左侧鳞片压住右侧。\n// 表面是黑曜石般的高光釉面:窄倒角 + 平缓鼓面,反射一组线形灯带,\n// 灯带在曲面上被拉成贴着轮廓的弧形亮线,鳞缘再勾一道细亮边。\nconst FRAGMENT_SHADER = `\nprecision highp float;\n\nuniform vec2 uResolution;\nuniform float uTime;\nuniform vec2 uPointer;\nuniform float uScale;\nuniform vec3 uBase;\nuniform vec3 uHighlight;\nuniform float uFlare;\nuniform float uScheme;\n\nconst float R = 0.92;\nconst float D = 0.30;\nconst float B = 0.8697;\nconst float ROW = 0.5;\nconst float BEVEL = 0.075;\nconst float TAU = 6.28318;\n\nfloat hash(vec2 p) {\n p = fract(p * vec2(123.34, 456.21));\n p += dot(p, p + 45.32);\n return fract(p.x * p.y);\n}\n\nfloat sdScale(vec2 p) {\n p = abs(p);\n return ((p.y - B) * D > p.x * B) ? length(p - vec2(0.0, B)) : length(p - vec2(-D, 0.0)) - R;\n}\n\nfloat scaleHeight(vec2 q) {\n float inner = clamp(-sdScale(q) / BEVEL, 0.0, 1.0);\n float bevel = sqrt(1.0 - (1.0 - inner) * (1.0 - inner));\n vec2 d = vec2(q.x / 0.62, (q.y - 0.35) / 0.75);\n float dome = 0.14 * (1.0 - dot(d, d));\n float keel = 0.035 * exp(-q.x * q.x / 0.03) * smoothstep(-0.1, B, q.y);\n return bevel * (0.07 + dome + keel);\n}\n\n// 开合:一道波沿身体方向推进,经过的鳞片依次张开再合拢\nfloat openAmount(vec2 c) {\n return uFlare * smoothstep(0.15, 1.0, sin(c.y * 0.45 - uTime * 1.3 + c.x * 0.3));\n}\n\n// 张开时鳞片绕根部翘起,透视上表现为鳞尖伸长、略微变宽\nvec2 warp(vec2 q, float o) {\n return vec2(q.x / (1.0 + 0.05 * o), (q.y + 0.2) / (1.0 + 0.2 * o) - 0.2);\n}\n\nvec3 aces(vec3 x) {\n return clamp((x * (2.51 * x + 0.03)) / (x * (2.43 * x + 0.59) + 0.14), 0.0, 1.0);\n}\n\nvoid main() {\n vec2 frag = vec2(gl_FragCoord.x, uResolution.y - gl_FragCoord.y);\n // 形状空间的 y(鳞尖方向)对应屏幕 x,实现侧向排列\n vec2 p = frag.yx / uScale;\n float px = 1.0 / uScale;\n float t = uTime;\n\n // 从左到右查找第一片覆盖当前像素的鳞,并记录到压在上面的鳞片边缘的距离。\n // 阴影与缝隙散光按每片上方鳞分别计算后取最大值,避免在两片张开程度不同的鳞之间出现接缝\n float j0 = floor(p.y / ROW);\n vec2 center = vec2(0.0);\n vec2 cell = vec2(0.0);\n float sd = -1.0;\n float cover = 1.0;\n float shade = 0.0;\n float gap = 0.0;\n float open = 0.0;\n float above = 1.0;\n float aboveShade = 0.0;\n float aboveGap = 0.0;\n float found = 0.0;\n for (int dj = -2; dj <= 2; dj++) {\n float j = j0 + float(dj);\n float offset = mod(j, 2.0) * 0.5;\n float i0 = floor(p.x - offset + 0.5);\n float rowMin = 1.0;\n float rowShade = 0.0;\n float rowGap = 0.0;\n for (int di = -1; di <= 1; di++) {\n vec2 id = vec2(i0 + float(di), j);\n vec2 c = vec2(id.x + offset, j * ROW);\n float o = openAmount(c);\n float d = sdScale(warp(p - c, o));\n if (found < 0.5 && d < 0.0) {\n found = 1.0;\n center = c;\n cell = id;\n sd = d;\n open = o;\n cover = above;\n shade = aboveShade;\n gap = aboveGap;\n }\n rowMin = min(rowMin, d);\n // 上方鳞片张开时投下更宽的阴影,下方透出散射光\n rowShade = max(rowShade, 1.0 - smoothstep(0.0, 0.16 + 0.3 * o, d));\n rowGap = max(rowGap, (1.0 - smoothstep(0.0, 0.1 + 0.25 * o, d)) * o);\n }\n if (found < 0.5) {\n above = min(above, rowMin);\n aboveShade = max(aboveShade, rowShade);\n aboveGap = max(aboveGap, rowGap);\n }\n }\n\n vec2 q = warp(p - center, open);\n float seed = hash(cell);\n float seed2 = hash(cell + 17.31);\n\n float e = 0.006;\n vec2 grad = vec2(\n scaleHeight(q + vec2(e, 0.0)) - scaleHeight(q - vec2(e, 0.0)),\n scaleHeight(q + vec2(0.0, e)) - scaleHeight(q - vec2(0.0, e))\n ) / (2.0 * e);\n vec3 ns = normalize(vec3(-grad, 1.0));\n\n // 每片鳞各自略微倾斜,再叠一道沿身体方向滚动的起伏,让反光条在鳞间流动\n float wave = sin(center.y * 0.35 - t * 0.9 + sin(center.x * 0.2 + t * 0.25) * 1.2);\n ns = normalize(ns + vec3((seed - 0.5) * 0.22, (seed2 - 0.5) * 0.22 + wave * 0.1 - open * 0.45, 0.0));\n vec3 n = vec3(ns.y, ns.x, ns.z);\n\n float minRes = min(uResolution.x, uResolution.y);\n vec3 V = vec3(0.0, 0.0, 1.0);\n vec3 toLight = vec3(uPointer - frag, minRes * 0.6);\n float dist = length(toLight);\n vec3 L = toLight / dist;\n float atten = 1.0 / (1.0 + 1.5 * pow(dist / minRes, 2.0));\n float NdotH = max(dot(n, normalize(L + V)), 0.0);\n float NdotV = max(n.z, 0.0);\n float soft = pow(NdotH, 24.0) * atten;\n float ao = mix(0.04, 1.0, 1.0 - shade);\n float fres = 0.35 + 0.65 * pow(1.0 - NdotV, 2.0);\n\n // 线形灯带:主灯带穿过光源位置并缓慢转动,副灯带只落在朝向一侧的倒角上\n vec3 Rf = reflect(-V, n);\n vec2 toL = (uPointer - frag) / minRes;\n float a = 0.7 + 0.45 * sin(t * 0.17);\n vec2 dir = vec2(cos(a), sin(a));\n float s1 = dot(Rf.xy, dir) - dot(toL, dir) * 1.3 + 0.12 * sin(t * 0.5 + seed * TAU);\n float line1 = exp(-s1 * s1 / 0.0022);\n float band1 = exp(-s1 * s1 / 0.09);\n float s2 = dot(Rf.xy, vec2(-dir.y, dir.x)) - 0.85 - 0.15 * sin(t * 0.33);\n float line2 = exp(-s2 * s2 / 0.01);\n\n // 本体近黑,只在朝向光源的区域泛出一层柔和的底色,亮度主要来自反光条\n vec3 bloom = mix(uBase, uHighlight, 0.35);\n vec3 color = uBase * (0.006 + 0.5 * soft * mix(0.6, 1.1, seed)) * ao;\n color += bloom * band1 * 0.3 * atten * ao;\n color += uHighlight * line1 * 1.4 * fres * (0.3 + atten) * ao;\n color += uHighlight * line2 * 0.18 * fres * ao;\n\n // 双线鳞缘:上层鳞的边与被压住的下层鳞的边各一道细亮线,中间留一条暗缝\n float rimLight = (0.07 + 0.6 * soft + band1 * 0.9) * (1.0 + 1.2 * open);\n float r1 = (sd + 1.6 * px) / (1.4 * px);\n float r2 = (cover - 1.8 * px) / (1.4 * px);\n color += uHighlight * exp(-r1 * r1) * rimLight * 0.9;\n color += uHighlight * exp(-r2 * r2) * rimLight * 0.35;\n\n color += mix(uBase, uHighlight, 0.2) * gap * 0.35 * (0.3 + atten + band1);\n\n color += uHighlight * 0.03 * exp(-pow(length(frag - uPointer) / (minRes * 0.4), 2.0));\n\n vec2 vc = frag / uResolution - 0.5;\n float vig = dot(vc, vc);\n\n if (uScheme > 0.5) {\n // 浅色:先色调映射,再做亮暗镜像,保留色相 —— 黑曜石鳞面翻转成浅色鳞面,反光条转为深色鳞缘\n vec3 c = pow(aces(color * 1.3), vec3(1.0 / 2.2));\n float lum = dot(c, vec3(0.2126, 0.7152, 0.0722));\n color = clamp(c + (1.0 - 2.0 * lum), 0.0, 1.0) * (1.0 - vig * 0.35);\n } else {\n color *= 1.0 - vig * 1.5;\n color = pow(aces(color * 1.3), vec3(1.0 / 2.2));\n }\n\n color += (hash(frag + fract(t)) - 0.5) / 255.0;\n\n gl_FragColor = vec4(color, 1.0);\n}\n`;\n\nexport function DragonScales({\n children,\n className,\n color = '#7b3fe4',\n highlightColor = '#e7a6ff',\n scaleSize = 110,\n speed = 1,\n flare = 0,\n interactive = true,\n scheme: forcedScheme,\n}: DragonScalesProps) {\n const detectedScheme = useColorScheme();\n const scheme = forcedScheme ?? detectedScheme;\n const canvasRef = useShaderCanvas({\n fragmentShader: FRAGMENT_SHADER,\n speed,\n interactive,\n onDraw: ({ gl, uniform, dpr }) => {\n gl.uniform1f(uniform('uScale'), Math.max(8, scaleSize) * dpr);\n gl.uniform3fv(uniform('uBase'), hexToLinearRgb(color));\n gl.uniform3fv(uniform('uHighlight'), hexToLinearRgb(highlightColor));\n gl.uniform1f(uniform('uFlare'), Math.min(Math.max(flare, 0), 1));\n gl.uniform1f(uniform('uScheme'), scheme === 'light' ? 1 : 0);\n },\n });\n\n return (\n <div\n className={cn('elyri-dragon-scales', className)}\n data-scheme={scheme}\n style={{ '--elyri-dragon-scales-color': color } as CSSProperties}\n >\n <canvas ref={canvasRef} className=\"elyri-dragon-scales__canvas\" aria-hidden=\"true\" />\n {children != null && <div className=\"elyri-dragon-scales__content\">{children}</div>}\n </div>\n );\n}\n","import type { CSSProperties, ReactNode } from 'react';\n\nimport { cn, hexToLinearRgb, useColorScheme, useShaderCanvas } from '../../../core';\n\nimport './Filaments.css';\n\nexport interface FilamentsProps {\n children?: ReactNode;\n className?: string;\n /** 光丝主色(hex) */\n color?: string;\n /** 沿光丝渐变的第二种颜色(hex) */\n highlightColor?: string;\n /** 光丝振幅倍率 */\n amplitude?: number;\n /** 动画速度倍率 */\n speed?: number;\n /** 指针处的光丝是否被拨动、弯向指针 */\n interactive?: boolean;\n}\n\n// 光丝:七根发丝般的光线沿水平方向交织成一束缓慢起伏的波形,像被轻拨的琴弦;\n// 每根的振幅、频率与相位各不相同,光脉冲沿线流过,颜色沿横向在两色之间渐变。\n// 用解析曲线求有符号距离并按斜率修正,线宽处处一致;RGB 轻微错位带出色散边。\nconst FRAGMENT_SHADER = `\nprecision highp float;\n\nuniform vec2 uResolution;\nuniform float uTime;\nuniform vec2 uPointer;\nuniform vec3 uColor;\nuniform vec3 uHighlight;\nuniform vec3 uBg;\nuniform float uAmplitude;\nuniform float uDpr;\nuniform float uScheme;\n\nconst int COUNT = 7;\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 shade(vec3 bg, vec3 light) {\n if (uScheme > 0.5) {\n float amount = max(max(light.r, light.g), light.b);\n vec3 tint = light / max(amount, 1e-4);\n return bg * exp(-amount * 1.4 * (1.0 - tint * 0.82));\n }\n return bg + 1.0 - exp(-light);\n}\n\nfloat glow(float d, float w) {\n return exp(-d * d / (w * w)) + 0.22 * exp(-abs(d) / (w * 5.0)) + 0.035 * exp(-abs(d) / 0.05);\n}\n\nfloat threadY(float x, float fi, float t, vec2 m) {\n float ph = fi * 1.7;\n float env = exp(-x * x * 1.1);\n float pluck = exp(-pow((x - m.x) / 0.35, 2.0));\n float amp = (0.05 + 0.09 * pow(sin(fi * 1.3 + 0.5), 2.0)) * uAmplitude + pluck * 0.05;\n return env * (amp * sin(x * (2.1 + fi * 0.09) + t * (1.0 + 0.12 * fi) + ph) + 0.028 * uAmplitude * sin(x * 4.3 - t * 0.7 + ph * 2.0))\n + m.y * 0.22 * pluck;\n}\n\nvoid main() {\n vec2 frag = vec2(gl_FragCoord.x, uResolution.y - gl_FragCoord.y);\n float minRes = min(uResolution.x, uResolution.y);\n vec2 uv = (frag - 0.5 * uResolution) / minRes;\n vec2 m = (uPointer - 0.5 * uResolution) / minRes;\n float t = uTime * 0.35;\n float hx = 0.5 * uResolution.x / minRes;\n\n float w = 0.9 * uDpr / minRes;\n float shift = 1.6 * uDpr / minRes;\n float e = 0.002;\n float fade = smoothstep(hx * 1.02, hx * 0.3, abs(uv.x));\n\n vec3 light = vec3(0.0);\n for (int i = 0; i < COUNT; i++) {\n float fi = float(i);\n float y = threadY(uv.x, fi, t, m);\n float dy = (threadY(uv.x + e, fi, t, m) - y) / e;\n float s = (uv.y - y) / sqrt(1.0 + dy * dy);\n\n float ph = fi * 1.7;\n float pulse = pow(0.5 + 0.5 * sin(uv.x * 1.6 - t * 1.4 + ph * 2.3), 6.0);\n float energy = (0.22 + 1.1 * pulse) * fade * (0.6 + 0.4 * sin(fi * 2.1 + 1.0) * sin(fi * 2.1 + 1.0));\n vec3 tint = mix(uColor, uHighlight, 0.5 + 0.5 * sin(uv.x * 1.2 + ph + t * 0.3));\n\n vec3 g = vec3(glow(s - shift, w), glow(s, w), glow(s + shift, w));\n light += tint * g * energy;\n }\n\n vec3 color = pow(clamp(shade(uBg, light), 0.0, 1.0), vec3(1.0 / 2.2));\n color += (hash(frag + fract(t)) - 0.5) / 255.0;\n\n gl_FragColor = vec4(color, 1.0);\n}\n`;\n\nexport function Filaments({\n children,\n className,\n color = '#5b8cff',\n highlightColor = '#d46bff',\n amplitude = 1,\n speed = 1,\n interactive = true,\n}: FilamentsProps) {\n const scheme = useColorScheme();\n const canvasRef = useShaderCanvas({\n fragmentShader: FRAGMENT_SHADER,\n speed,\n interactive,\n onDraw: ({ gl, uniform, dpr }) => {\n gl.uniform3fv(uniform('uColor'), hexToLinearRgb(color));\n gl.uniform3fv(uniform('uHighlight'), hexToLinearRgb(highlightColor));\n gl.uniform3fv(uniform('uBg'), hexToLinearRgb(scheme === 'light' ? '#f7f7fa' : '#06060a'));\n gl.uniform1f(uniform('uAmplitude'), Math.max(0, amplitude));\n gl.uniform1f(uniform('uDpr'), dpr);\n gl.uniform1f(uniform('uScheme'), scheme === 'light' ? 1 : 0);\n },\n });\n\n return (\n <div\n className={cn('elyri-filaments', className)}\n data-scheme={scheme}\n style={{ '--elyri-filaments-color': color } as CSSProperties}\n >\n <canvas ref={canvasRef} className=\"elyri-filaments__canvas\" aria-hidden=\"true\" />\n {children != null && <div className=\"elyri-filaments__content\">{children}</div>}\n </div>\n );\n}\n","import type { CSSProperties, ReactNode } from 'react';\n\nimport { cn, hexToLinearRgb, useColorScheme, useShaderCanvas } from '../../../core';\n\nimport './FlipTiles.css';\n\nexport type FlipTilesPattern = 'wave' | 'ripple' | 'drift';\n\nexport interface FlipTilesProps {\n children?: ReactNode;\n className?: string;\n /** 立方体侧面的强调色(hex),翻滚时翻上来的就是这一面 */\n color?: string;\n /** 金属倒角与反光条的高光色(hex) */\n highlightColor?: string;\n /** 立方体间距(px),即单个立方体加缝隙的宽度 */\n tileSize?: number;\n /** 动画速度倍率 */\n speed?: number;\n /** 翻滚编排:成列扫过、中心涟漪或有机漂移 */\n pattern?: FlipTilesPattern;\n /** 指针处立方体升起(微凸)是否跟随指针 */\n interactive?: boolean;\n}\n\nconst PATTERNS: FlipTilesPattern[] = ['wave', 'ripple', 'drift'];\n\n// 立方体阵列:略带俯角的透视相机下,一片实心立方体整齐排布在深槽地面上。\n// 顶面与底面是黑曜石镜面(浅色主题为瓷白),四个侧面是强调色金属,每条棱都有一道高光倒角。\n// 编排波经过时立方体绕水平轴滚动 90° 把强调色侧面翻到顶上,停留片刻再滚一次回到黑曜石面;\n// 滚动走带轻微回弹的弹簧曲线,滚动途中立方体略微收缩、跃起以免碰到邻居,露出的槽底透出辉光。\n// 每个像素对周围 3×3 个立方体做射线求交,并向主光源投射阴影射线;远处渐隐进雾里。\nconst FRAGMENT_SHADER = `\nprecision highp float;\n\nuniform vec2 uResolution;\nuniform float uTime;\nuniform vec2 uPointer;\nuniform float uScale;\nuniform vec3 uColor;\nuniform vec3 uHighlight;\nuniform vec3 uFront;\nuniform vec3 uFloor;\nuniform float uPattern;\nuniform float uScheme;\nuniform float uSamples;\n\nconst float PI = 3.14159265;\nconst float HALF = 0.45;\nconst float BEVEL = 0.055;\nconst float FLOOR_Z = -0.45;\nconst float TILT = 0.42;\nconst vec3 KEY = vec3(-0.5, -0.42, 0.757);\n\nfloat hash(vec2 p) {\n p = fract(p * vec2(123.34, 456.21));\n p += dot(p, p + 45.32);\n return fract(p.x * p.y);\n}\n\nfloat noise(vec2 p) {\n vec2 i = floor(p);\n vec2 f = fract(p);\n f = f * f * (3.0 - 2.0 * f);\n return mix(\n mix(hash(i), hash(i + vec2(1.0, 0.0)), f.x),\n mix(hash(i + vec2(0.0, 1.0)), hash(i + vec2(1.0, 1.0)), f.x),\n f.y\n );\n}\n\n// 绕单位轴 k 旋转 a 弧度(Rodrigues)\nmat3 rotAxis(vec3 k, float a) {\n float s = sin(a);\n float c = cos(a);\n float oc = 1.0 - c;\n return mat3(\n oc * k.x * k.x + c, oc * k.x * k.y + k.z * s, oc * k.z * k.x - k.y * s,\n oc * k.x * k.y - k.z * s, oc * k.y * k.y + c, oc * k.y * k.z + k.x * s,\n oc * k.z * k.x + k.y * s, oc * k.y * k.z - k.x * s, oc * k.z * k.z + c\n );\n}\n\nmat3 transposeM(mat3 m) {\n return mat3(\n m[0][0], m[1][0], m[2][0],\n m[0][1], m[1][1], m[2][1],\n m[0][2], m[1][2], m[2][2]\n );\n}\n\n// 0→1 的欠阻尼弹簧:起步零速度,约 7% 的回弹后稳定\nfloat spring(float x) {\n x = clamp(x, 0.0, 1.0);\n float k = exp(-6.0 * x) * (cos(7.0 * x) + 6.0 / 7.0 * sin(7.0 * x));\n return 1.0 - k * (1.0 - smoothstep(0.8, 1.0, x));\n}\n\n// 单个立方体的姿态:滚动轴与角度、滚动时的收缩与跃起、指针处的升起\nvoid cubeAt(vec2 c, vec2 pw, out mat3 inv, out vec4 geo, out float open) {\n float h = hash(c);\n float h2 = hash(c + 17.31);\n vec3 axis;\n float f;\n if (uPattern < 0.5) {\n float a = 0.35 + 0.3 * sin(uTime * 0.045);\n axis = vec3(0.0, 1.0, 0.0);\n f = uTime * 0.15 - dot(c, vec2(cos(a), sin(a))) * 0.1 + h * 0.035;\n } else if (uPattern < 1.5) {\n axis = abs(c.x) >= abs(c.y) ? vec3(0.0, c.x < 0.0 ? -1.0 : 1.0, 0.0) : vec3(c.y < 0.0 ? 1.0 : -1.0, 0.0, 0.0);\n f = uTime * 0.14 - length(c) * 0.12 + h * 0.03;\n } else {\n axis = h2 < 0.5 ? vec3(0.0, 1.0, 0.0) : vec3(1.0, 0.0, 0.0);\n f = uTime * 0.07 + noise(c * 0.16 + vec2(uTime * 0.015, -uTime * 0.01)) * 2.2 + h * 0.05;\n }\n // 每个周期滚两次:先把强调色侧面翻上来,停留片刻,再滚回黑曜石面\n float fl = floor(f);\n float fr = f - fl;\n float roll = spring(fr / 0.2) + spring((fr - 0.26) / 0.2);\n float ang = PI * 0.5 * (2.0 * mod(fl, 2.0) + roll);\n open = abs(sin(2.0 * ang));\n\n // 转到 45° 时对角线最长,按投影宽度收缩,保证与邻居始终不相交\n float reach = HALF * (abs(cos(ang)) + abs(sin(ang)));\n float s = min(1.0, 0.49 / reach);\n vec2 toP = c - pw;\n float lift = 0.3 * exp(-dot(toP, toP) / 5.0);\n\n inv = rotAxis(axis, -ang);\n geo = vec4(c, lift + (1.0 - s) * 0.7, HALF * s);\n}\n\n// 射线与以原点为中心的立方体求交,返回最近交点距离(未命中为 -1)与局部法线\nfloat boxHit(vec3 ro, vec3 rd, float rad, out vec3 n) {\n rd = mix(rd, vec3(1e-6), step(abs(rd), vec3(1e-6)));\n vec3 m = 1.0 / rd;\n vec3 k = abs(m) * rad;\n vec3 t1 = -m * ro - k;\n vec3 t2 = -m * ro + k;\n float tN = max(max(t1.x, t1.y), t1.z);\n float tF = min(min(t2.x, t2.y), t2.z);\n n = vec3(0.0);\n if (tN > tF || tF < 0.0) return -1.0;\n n = -sign(rd) * step(t1.yzx, t1.xyz) * step(t1.zxy, t1.xyz);\n return tN;\n}\n\n// 环境光:只保留一层极弱的均匀补光,不再有扫过画面的灯带反光\nvec3 envLight(vec3 R) {\n return vec3(0.008 + 0.02 * smoothstep(-0.1, 0.4, R.z));\n}\n\nvec3 aces(vec3 x) {\n return clamp((x * (2.51 * x + 0.03)) / (x * (2.43 * x + 0.59) + 0.14), 0.0, 1.0);\n}\n\nvec2 sampleOffset(int s) {\n if (uSamples < 1.5) return vec2(0.0);\n if (uSamples < 2.5) return s == 0 ? vec2(-0.25) : vec2(0.25);\n if (s == 0) return vec2(-0.125, -0.375);\n if (s == 1) return vec2(0.375, -0.125);\n if (s == 2) return vec2(0.125, 0.375);\n return vec2(-0.375, 0.125);\n}\n\nvoid main() {\n vec2 frag = vec2(gl_FragCoord.x, uResolution.y - gl_FragCoord.y);\n vec2 center = 0.5 * uResolution;\n float halfW = 0.5 * max(uResolution.x, uResolution.y) / uScale;\n\n // 略带俯角的透视相机:屏幕向下对应世界 +y,相机从 +y 一侧斜看,能看到立方体朝向观者的侧面\n float D = halfW * 2.0;\n vec3 ro = vec3(0.0, D * sin(TILT), D * cos(TILT));\n vec3 fw = -normalize(ro);\n vec3 dn = vec3(0.0, cos(TILT), -sin(TILT));\n\n vec2 puv = (uPointer - center) / uScale;\n vec3 prd = normalize(fw * D + vec3(puv.x, 0.0, 0.0) + dn * puv.y);\n vec2 pw = (ro + prd * ((HALF - ro.z) / prd.z)).xy;\n\n vec2 cuv = (frag - center) / uScale;\n vec3 crd = normalize(fw * D + vec3(cuv.x, 0.0, 0.0) + dn * cuv.y);\n vec2 base = floor((ro + crd * (-ro.z / crd.z)).xy + 0.5);\n\n vec3 L = normalize(KEY);\n // 主光源的镜面高光颜色\n vec3 specCol = mix(vec3(1.0), uHighlight, 0.35);\n float amb = mix(0.03, 0.45, uScheme);\n\n // 周围 3×3 个立方体的姿态只算一次,供所有采样与阴影复用\n mat3 invs[9];\n vec4 geos[9];\n float opens[9];\n float seeds[9];\n vec3 localL[9];\n for (int k = 0; k < 9; k++) {\n int row = k / 3;\n vec2 c = base + vec2(float(k - row * 3) - 1.0, float(row) - 1.0);\n mat3 inv;\n vec4 geo;\n float open;\n cubeAt(c, pw, inv, geo, open);\n invs[k] = inv;\n geos[k] = geo;\n opens[k] = open;\n seeds[k] = hash(c + 5.17);\n // 光源方向是常量,提前转到各立方体局部空间,省去每次采样重复的矩阵乘法\n localL[k] = inv * L;\n }\n\n vec3 acc = vec3(0.0);\n for (int s = 0; s < 4; s++) {\n if (float(s) >= uSamples) break;\n vec2 uv = (frag + sampleOffset(s) - center) / uScale;\n vec3 rd = normalize(fw * D + vec3(uv.x, 0.0, 0.0) + dn * uv.y);\n\n float tMin = 1e9;\n int hitK = -1;\n vec3 hitN = vec3(0.0);\n vec3 hitP = vec3(0.0);\n mat3 hitInv = mat3(1.0);\n float hitSize = HALF;\n float hitSeed = 0.0;\n for (int k = 0; k < 9; k++) {\n vec3 lro = invs[k] * (ro - geos[k].xyz);\n vec3 lrd = invs[k] * rd;\n vec3 n;\n float t = boxHit(lro, lrd, geos[k].w, n);\n if (t > 0.0 && t < tMin) {\n tMin = t;\n hitK = k;\n hitN = n;\n hitP = lro + lrd * t;\n hitInv = invs[k];\n hitSize = geos[k].w;\n hitSeed = seeds[k];\n }\n }\n\n bool hit = hitK >= 0;\n float tFloor = (FLOOR_Z - ro.z) / rd.z;\n float tHit = hit ? tMin : tFloor;\n vec3 wp = ro + rd * tHit;\n\n // 立方体法线:棱边一圈向外倾斜,形成圆润的倒角;每块顶面极轻微错开,像手工铺贴\n vec3 n = vec3(0.0, 0.0, 1.0);\n float bevel = 0.0;\n if (hit) {\n vec3 b = (1.0 - smoothstep(0.0, BEVEL, hitSize - abs(hitP))) * (1.0 - abs(hitN));\n bevel = max(max(b.x, b.y), b.z);\n vec3 jitter = (vec3(hitSeed, fract(hitSeed * 7.13), fract(hitSeed * 3.71)) - 0.5) * 0.04 * (1.0 - abs(hitN));\n n = normalize(transposeM(hitInv) * normalize(hitN + sign(hitP) * b * 1.2 + jitter));\n }\n\n // 主光源的投影:向光源方向检测其余立方体,命中即提前退出\n float shadow = 1.0;\n vec3 sp = wp + n * 0.003;\n for (int k = 0; k < 9; k++) {\n if (k == hitK) continue;\n vec3 tmp;\n float ts = boxHit(invs[k] * (sp - geos[k].xyz), localL[k], geos[k].w, tmp);\n if (ts > 0.0) {\n shadow = 0.0;\n break;\n }\n }\n\n vec3 V = -rd;\n float diffK = max(dot(n, L), 0.0) * shadow;\n float NdHk = max(dot(n, normalize(L + V)), 0.0);\n\n vec3 color;\n if (hit) {\n float fres = pow(1.0 - max(dot(n, V), 0.0), 5.0);\n vec3 env = envLight(reflect(rd, n));\n\n vec3 edge = uHighlight * (0.03 + 0.4 * diffK)\n + mix(uHighlight, vec3(1.0), 0.3 + 0.7 * fres) * env * 1.4\n + specCol * pow(NdHk, 48.0) * shadow * 0.8;\n\n vec3 face;\n if (abs(hitN.z) > 0.5) {\n face = uFront * (amb + 0.55 * diffK)\n + env * (0.12 + 0.88 * fres) * mix(1.0, 0.45, uScheme)\n + specCol * pow(NdHk, 900.0) * shadow * 0.4;\n } else {\n face = uColor * (amb * 0.6 + 0.02 + 0.7 * diffK)\n + mix(uColor, vec3(1.0), fres) * env * 0.8\n + mix(uColor, specCol, 0.5) * (pow(NdHk, 40.0) * shadow * 0.5);\n }\n color = mix(face, edge, bevel * 0.5);\n } else {\n // 槽底:紧贴立方体处压暗,滚动中的立方体下方透出强调色辉光\n float ao = 1.0;\n float glow = 0.0;\n for (int k = 0; k < 9; k++) {\n vec2 dv = wp.xy - geos[k].xy;\n float d2 = dot(dv, dv);\n // 超过此距离 ao 已饱和、辉光已衰减到看不见,跳过以省算力\n if (d2 > 1.5) continue;\n vec2 q = abs(dv) - geos[k].w;\n ao *= mix(0.2, 1.0, smoothstep(0.0, 0.3, length(max(q, 0.0))));\n glow += opens[k] * exp(-d2 / 0.18);\n }\n color = uFloor * (amb + 0.45 * diffK) * ao\n + uColor * (glow * 0.5 * (0.4 + 0.6 * ao));\n }\n\n // 远处渐隐进雾里,拉开纵深\n float fog = smoothstep(D * 0.95, D * 1.5, tHit);\n color = mix(color, uFloor * mix(0.4, 0.9, uScheme), fog * 0.8);\n\n acc += aces(color * mix(1.3, 1.05, uScheme));\n }\n vec3 color = acc / uSamples;\n\n vec2 vc = frag / uResolution - 0.5;\n color *= 1.0 - dot(vc, vc) * mix(1.1, 0.3, uScheme);\n color = pow(color, vec3(1.0 / 2.2));\n color += (hash(frag + fract(uTime)) - 0.5) / 255.0;\n\n gl_FragColor = vec4(color, 1.0);\n}\n`;\n\nexport function FlipTiles({\n children,\n className,\n color = '#4f6bff',\n highlightColor = '#b8c4ff',\n tileSize = 72,\n speed = 1,\n pattern = 'wave',\n interactive = true,\n}: FlipTilesProps) {\n const scheme = useColorScheme();\n const canvasRef = useShaderCanvas({\n fragmentShader: FRAGMENT_SHADER,\n speed,\n interactive,\n // 每像素要跑 9 次立方体求交与阴影射线,属于重填充率着色器:内部按 1.5× 渲染,\n // 视觉上几乎无损,但相比 2× 能省下约 44% 的像素量\n maxDpr: 1.5,\n onDraw: ({ gl, uniform, dpr }) => {\n const light = scheme === 'light';\n gl.uniform1f(uniform('uScale'), Math.max(24, tileSize) * dpr);\n gl.uniform3fv(uniform('uColor'), hexToLinearRgb(color));\n gl.uniform3fv(uniform('uHighlight'), hexToLinearRgb(highlightColor));\n gl.uniform3fv(uniform('uFront'), hexToLinearRgb(light ? '#ececf1' : '#0c0c12'));\n gl.uniform3fv(uniform('uFloor'), hexToLinearRgb(light ? '#c6c6d0' : '#040406'));\n gl.uniform1f(uniform('uPattern'), Math.max(0, PATTERNS.indexOf(pattern)));\n gl.uniform1f(uniform('uScheme'), light ? 1 : 0);\n // 采样偏移只在单个像素内抖动,两次采样已足够压住立方体棱边的锯齿\n gl.uniform1f(uniform('uSamples'), 2);\n },\n });\n\n return (\n <div\n className={cn('elyri-flip-tiles', className)}\n data-scheme={scheme}\n style={{ '--elyri-flip-tiles-color': color } as CSSProperties}\n >\n <canvas ref={canvasRef} className=\"elyri-flip-tiles__canvas\" aria-hidden=\"true\" />\n {children != null && <div className=\"elyri-flip-tiles__content\">{children}</div>}\n </div>\n );\n}\n","import type { CSSProperties, ReactNode } from 'react';\n\nimport { cn, hexToLinearRgb, useColorScheme, useShaderCanvas } from '../../../core';\n\nimport './Halo.css';\n\nexport interface HaloProps {\n children?: ReactNode;\n className?: string;\n /** 光环的两种渐变色(hex),沿圆周缓慢流转 */\n colors?: [string, string];\n /** 光环半径,相对画面高度的倍率 */\n size?: number;\n /** 动画速度倍率 */\n speed?: number;\n /** 光环中心是否轻微偏向指针 */\n interactive?: boolean;\n}\n\nconst DEFAULT_COLORS: [string, string] = ['#8fb4ff', '#e7c6ff'];\n\n// 画面中央一圈极细的光环:半径随角度轻微起伏,两束高光沿圆周流动,\n// 外侧只有很淡的辉光,其余区域保持近黑,留白克制。\nconst FRAGMENT_SHADER = `\nprecision highp float;\n\nuniform vec2 uResolution;\nuniform float uTime;\nuniform vec2 uPointer;\nuniform vec3 uColor1;\nuniform vec3 uColor2;\nuniform float uSize;\nuniform float uInteractive;\nuniform vec3 uBg;\nuniform float uScheme;\n\nfloat hash(vec2 p) {\n p = fract(p * vec2(123.34, 456.21));\n p += dot(p, p + 45.32);\n return fract(p.x * p.y);\n}\n\n// 深色下光线叠加发亮;浅色下改为按色相吸收底色,像墨色细线落在纸面上\nvec3 shade(vec3 bg, vec3 light) {\n if (uScheme > 0.5) {\n float amount = max(max(light.r, light.g), light.b);\n vec3 tint = light / max(amount, 1e-4);\n return bg * exp(-amount * 1.6 * (1.0 - tint * 0.8));\n }\n return bg + 1.0 - exp(-light * 1.4);\n}\n\nvoid main() {\n vec2 res = uResolution;\n vec2 p = (gl_FragCoord.xy - 0.5 * res) / res.y;\n vec2 pointer = (vec2(uPointer.x, res.y - uPointer.y) - 0.5 * res) / res.y;\n p -= pointer * 0.06 * uInteractive;\n float t = uTime;\n\n float r = length(p);\n float a = atan(p.y, p.x);\n\n float radius = 0.3 * uSize;\n radius += 0.010 * sin(a * 3.0 + t * 0.5) + 0.006 * sin(a * 5.0 - t * 0.8);\n float d = abs(r - radius);\n\n float line = exp(-d * d * 60000.0);\n float glow = exp(-d * 22.0) * 0.28 + exp(-d * 6.0) * 0.05;\n\n // 两束高光沿圆周以不同速度流动\n float f1 = pow(0.5 + 0.5 * cos(a - t * 0.45), 6.0);\n float f2 = pow(0.5 + 0.5 * cos(a + 2.4 + t * 0.28), 10.0);\n float flow = 0.12 + f1 + 0.6 * f2;\n\n vec3 tint = mix(uColor1, uColor2, 0.5 + 0.5 * sin(a + t * 0.2));\n vec3 light = tint * (line * 1.1 + glow) * flow;\n // 圈内极淡的雾光\n light += uColor1 * 0.015 * exp(-r * r / (radius * radius) * 1.5);\n\n vec3 color = pow(clamp(shade(uBg, light), 0.0, 1.0), vec3(1.0 / 2.2));\n color += (hash(gl_FragCoord.xy + fract(t)) - 0.5) / 255.0;\n\n gl_FragColor = vec4(color, 1.0);\n}\n`;\n\nexport function Halo({\n children,\n className,\n colors = DEFAULT_COLORS,\n size = 1,\n speed = 1,\n interactive = true,\n}: HaloProps) {\n const [first = DEFAULT_COLORS[0], second = DEFAULT_COLORS[1]] = colors;\n const scheme = useColorScheme();\n\n const canvasRef = useShaderCanvas({\n fragmentShader: FRAGMENT_SHADER,\n speed,\n interactive,\n onDraw: ({ gl, uniform }) => {\n gl.uniform3fv(uniform('uColor1'), hexToLinearRgb(first));\n gl.uniform3fv(uniform('uColor2'), hexToLinearRgb(second));\n gl.uniform1f(uniform('uSize'), Math.max(0.1, size));\n gl.uniform1f(uniform('uInteractive'), interactive ? 1 : 0);\n gl.uniform3fv(uniform('uBg'), hexToLinearRgb(scheme === 'light' ? '#f8f8fa' : '#010102'));\n gl.uniform1f(uniform('uScheme'), scheme === 'light' ? 1 : 0);\n },\n });\n\n return (\n <div\n className={cn('elyri-halo', className)}\n data-scheme={scheme}\n style={{ '--elyri-halo-color': first } as CSSProperties}\n >\n <canvas ref={canvasRef} className=\"elyri-halo__canvas\" aria-hidden=\"true\" />\n {children != null && <div className=\"elyri-halo__content\">{children}</div>}\n </div>\n );\n}\n","import type { CSSProperties, ReactNode } from 'react';\n\nimport { cn, hexToLinearRgb, useColorScheme, useShaderCanvas } from '../../../core';\n\nimport './MeshGradient.css';\n\nexport interface MeshGradientProps {\n children?: ReactNode;\n className?: string;\n /** 自定义内联样式,可用于控制尺寸 */\n style?: CSSProperties;\n /** 四个色团的颜色(hex) */\n colors?: [string, string, string, string];\n /** 胶片颗粒强度,0 为关闭 */\n grain?: number;\n /** 动画速度倍率 */\n speed?: number;\n /** 指针处的色彩漩涡是否跟随指针 */\n interactive?: boolean;\n}\n\nconst DEFAULT_COLORS: [string, string, string, string] = ['#6e6af0', '#f472b6', '#fbbf77', '#38bdf8'];\n\n// 流光渐变:四个色团沿互不相关的缓慢轨迹漂移,定位坐标先经过两级\n// 分形噪声域扭曲(q → r),色团边界被拉成缓缓流淌、相互卷入的彩色丝带;\n// 颜色在 Oklab 空间混合(过渡不发灰)。沿流场等值线叠一层缎面光泽,\n// 暗部轻微压低,形成丝绸般的起伏与流光。指针处色彩被轻轻卷成漩涡。\nconst FRAGMENT_SHADER = `\nprecision highp float;\n\nuniform vec2 uResolution;\nuniform float uTime;\nuniform vec2 uPointer;\nuniform vec3 uColor0;\nuniform vec3 uColor1;\nuniform vec3 uColor2;\nuniform vec3 uColor3;\nuniform vec3 uBase;\nuniform float uGrain;\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 toOklab(vec3 c) {\n float l = 0.4122214708 * c.r + 0.5363325363 * c.g + 0.0514459929 * c.b;\n float m = 0.2119034982 * c.r + 0.6806995451 * c.g + 0.1073969566 * c.b;\n float s = 0.0883024619 * c.r + 0.2817188376 * c.g + 0.6299787005 * c.b;\n l = pow(max(l, 0.0), 1.0 / 3.0);\n m = pow(max(m, 0.0), 1.0 / 3.0);\n s = pow(max(s, 0.0), 1.0 / 3.0);\n return vec3(\n 0.2104542553 * l + 0.7936177850 * m - 0.0040720468 * s,\n 1.9779984951 * l - 2.4285922050 * m + 0.4505937099 * s,\n 0.0259040371 * l + 0.7827717662 * m - 0.8086757660 * s\n );\n}\n\nvec3 fromOklab(vec3 c) {\n float l = c.x + 0.3963377774 * c.y + 0.2158037573 * c.z;\n float m = c.x - 0.1055613458 * c.y - 0.0638541728 * c.z;\n float s = c.x - 0.0894841775 * c.y - 1.2914855480 * c.z;\n l = l * l * l;\n m = m * m * m;\n s = s * s * s;\n return vec3(\n 4.0767416621 * l - 3.3077115913 * m + 0.2309699292 * s,\n -1.2684380046 * l + 2.6097574011 * m - 0.3413193965 * s,\n -0.0041960863 * l - 0.7034186147 * m + 1.7076147010 * s\n );\n}\n\nfloat noise(vec2 p) {\n vec2 i = floor(p);\n vec2 f = fract(p);\n vec2 u = f * f * f * (f * (f * 6.0 - 15.0) + 10.0);\n return mix(mix(hash(i), hash(i + vec2(1.0, 0.0)), u.x), mix(hash(i + vec2(0.0, 1.0)), hash(i + 1.0), u.x), u.y);\n}\n\nfloat fbm(vec2 p) {\n float v = 0.0;\n float a = 0.5;\n mat2 rot = mat2(1.6, 1.2, -1.2, 1.6);\n for (int i = 0; i < 4; i++) {\n v += a * noise(p);\n p = rot * p + vec2(11.3, 7.9);\n a *= 0.5;\n }\n return v;\n}\n\nfloat blob(vec2 uv, vec2 center) {\n vec2 d = uv - center;\n return exp(-dot(d, d) * 3.2);\n}\n\nvoid main() {\n vec2 frag = vec2(gl_FragCoord.x, uResolution.y - gl_FragCoord.y);\n float minRes = min(uResolution.x, uResolution.y);\n vec2 half_ = 0.5 * uResolution / minRes;\n vec2 uv = (frag - 0.5 * uResolution) / minRes;\n vec2 pointer = (uPointer - 0.5 * uResolution) / minRes;\n float t = uTime * 0.1;\n\n // 指针漩涡:绕指针旋转采样坐标,越靠近转得越多,色彩被卷进去\n vec2 dm = uv - pointer;\n float swirl = exp(-dot(dm, dm) / 0.07);\n float angle = swirl * 1.1;\n uv = pointer + mat2(cos(angle), sin(angle), -sin(angle), cos(angle)) * dm * (1.0 - swirl * 0.12);\n\n // 两级域扭曲的流场:q 缓慢漂移,r 在 q 的基础上再扭一次,得到液体般的卷流\n vec2 p = uv * 1.5;\n vec2 q = vec2(fbm(p + vec2(0.0, t)), fbm(p + vec2(5.2, 1.3) - t * 0.8));\n vec2 r = vec2(fbm(p + 2.6 * q + vec2(1.7, 9.2) + t * 1.2), fbm(p + 2.6 * q + vec2(8.3, 2.8) - t));\n vec2 w = uv + (r - 0.5) * 0.9 + (q - 0.5) * 0.3;\n\n float tb = uTime * 0.12;\n vec2 p0 = half_ * vec2(-0.55 + 0.35 * sin(tb * 0.63), -0.45 + 0.35 * cos(tb * 0.51));\n vec2 p1 = half_ * vec2(0.55 + 0.30 * cos(tb * 0.57 + 1.0), -0.35 + 0.40 * sin(tb * 0.71 + 2.0));\n vec2 p2 = half_ * vec2(0.45 + 0.35 * sin(tb * 0.49 + 3.0), 0.50 + 0.30 * cos(tb * 0.61 + 1.5));\n vec2 p3 = half_ * vec2(-0.50 + 0.35 * cos(tb * 0.67 + 4.0), 0.45 + 0.35 * sin(tb * 0.53 + 0.5));\n\n float w0 = blob(w, p0);\n float w1 = blob(w, p1);\n float w2 = blob(w, p2);\n float w3 = blob(w, p3);\n float wb = 0.05;\n\n vec3 lab = (toOklab(uColor0) * w0 + toOklab(uColor1) * w1 + toOklab(uColor2) * w2 + toOklab(uColor3) * w3 + toOklab(uBase) * wb)\n / (w0 + w1 + w2 + w3 + wb);\n\n // 缎面流光:沿流场等值线的柔和亮带随时间滑过,谷底微暗,带出丝绸般的层次\n float band = sin((r.x * 1.4 - r.y + q.x * 0.6) * 11.0 + t * 3.0);\n float gloss = smoothstep(0.15, 1.0, band);\n lab.x += gloss * gloss * 0.06 - (1.0 - smoothstep(-1.0, 0.1, band)) * 0.025;\n lab.x += swirl * 0.025;\n // 高光处略降饱和,像光打在织物表面\n lab.yz *= 1.0 - gloss * gloss * 0.12;\n\n vec3 color = pow(clamp(fromOklab(lab), 0.0, 1.0), vec3(1.0 / 2.2));\n\n // 胶片颗粒 + 抖动,消除大面积渐变的色带\n float n = hash(frag + fract(uTime * 7.31) * 113.0) - 0.5;\n color += n * (uGrain * 0.07 + 1.0 / 255.0);\n\n gl_FragColor = vec4(color, 1.0);\n}\n`;\n\nexport function MeshGradient({\n children,\n className,\n style,\n colors = DEFAULT_COLORS,\n grain = 0.35,\n speed = 1,\n interactive = true,\n}: MeshGradientProps) {\n const scheme = useColorScheme();\n const [c0 = DEFAULT_COLORS[0], c1 = DEFAULT_COLORS[1], c2 = DEFAULT_COLORS[2], c3 = DEFAULT_COLORS[3]] = colors;\n const canvasRef = useShaderCanvas({\n fragmentShader: FRAGMENT_SHADER,\n speed,\n interactive,\n onDraw: ({ gl, uniform }) => {\n gl.uniform3fv(uniform('uColor0'), hexToLinearRgb(c0));\n gl.uniform3fv(uniform('uColor1'), hexToLinearRgb(c1));\n gl.uniform3fv(uniform('uColor2'), hexToLinearRgb(c2));\n gl.uniform3fv(uniform('uColor3'), hexToLinearRgb(c3));\n gl.uniform3fv(uniform('uBase'), hexToLinearRgb(scheme === 'light' ? '#f7f7fa' : '#0b0b12'));\n gl.uniform1f(uniform('uGrain'), Math.max(0, grain));\n },\n });\n\n return (\n <div\n className={cn('elyri-mesh-gradient', className)}\n data-scheme={scheme}\n style={\n {\n '--elyri-mesh-gradient-c0': c0,\n '--elyri-mesh-gradient-c1': c1,\n '--elyri-mesh-gradient-c2': c2,\n '--elyri-mesh-gradient-c3': c3,\n ...style,\n } as CSSProperties\n }\n >\n <canvas ref={canvasRef} className=\"elyri-mesh-gradient__canvas\" aria-hidden=\"true\" />\n {children != null && <div className=\"elyri-mesh-gradient__content\">{children}</div>}\n </div>\n );\n}\n","import { useEffect, useRef, useState } from 'react';\nimport type { CSSProperties, ReactNode } from 'react';\n\nimport { cn, hexToLinearRgb, useColorScheme, useShaderCanvas } from '../../../core';\n\nimport './PixelVortex.css';\n\nexport interface PixelVortexProps {\n children?: ReactNode;\n className?: string;\n /**\n * 在 LED 屏上播放的视频地址。跨域视频需服务端允许 CORS;服务端还需支持 Range 请求,\n * 否则大视频会整段下载而无法边下边播。未提供或加载失败时显示火焰流动效果。\n */\n videoSrc?: string;\n /** 火焰主色(hex) */\n color?: string;\n /** 最亮处的高光色(hex) */\n highlightColor?: string;\n /** 单颗灯珠尺寸(CSS 像素) */\n cellSize?: number;\n /** 是否显示拼接屏接缝(每 16×10 颗灯珠一块) */\n seams?: boolean;\n /** 接缝宽度(CSS 像素) */\n seamWidth?: number;\n /** 动画速度倍率 */\n speed?: number;\n /** 光晕中心是否跟随指针 */\n interactive?: boolean;\n}\n\n// LED 屏:按灯珠网格对画面降采样,每颗灯珠带亮度抖动与色阶量化,再叠加灯珠间隙与可选的拼接缝。\n// 画面来源为视频(cover 方式铺满),没有视频时为缓慢流动的火焰,亮区跟随指针;浅色主题下底板为浅色。\nconst FRAGMENT_SHADER = `\nprecision highp float;\n\nuniform vec2 uResolution;\nuniform float uTime;\nuniform vec2 uPointer;\nuniform vec3 uColor;\nuniform vec3 uHighlight;\nuniform float uCell;\nuniform float uFollow;\nuniform sampler2D uVideo;\nuniform float uHasVideo;\nuniform vec2 uVideoSize;\nuniform float uScheme;\nuniform float uSeam;\n\nfloat hash(vec2 p) {\n p = fract(p * vec2(123.34, 456.21));\n p += dot(p, p + 45.32);\n return fract(p.x * p.y);\n}\n\nfloat noise(vec2 p) {\n vec2 i = floor(p);\n vec2 f = fract(p);\n vec2 u = f * f * (3.0 - 2.0 * f);\n return mix(\n mix(hash(i), hash(i + vec2(1.0, 0.0)), u.x),\n mix(hash(i + vec2(0.0, 1.0)), hash(i + vec2(1.0, 1.0)), u.x),\n u.y\n );\n}\n\nfloat fbm(vec2 p) {\n float v = 0.0;\n float a = 0.5;\n mat2 m = mat2(1.6, 1.2, -1.2, 1.6);\n for (int i = 0; i < 5; i++) {\n v += a * noise(p);\n p = m * p;\n a *= 0.5;\n }\n return v;\n}\n\n// 火焰热度场:域扭曲的噪声缓慢上升,靠近焦点处更亮\nfloat heat(vec2 p, vec2 focus, float t) {\n vec2 q = vec2(\n fbm(p * 1.4 + vec2(0.0, t * 0.18)),\n fbm(p * 1.4 + vec2(5.2, 1.3) - t * 0.12)\n );\n float n = fbm(p * 2.0 + q * 1.7 + vec2(0.0, t * 0.3));\n vec2 d = p - focus;\n float glow = exp(-dot(d, d) * 1.6);\n return n * n * 1.8 * (0.3 + 0.9 * glow);\n}\n\nvec3 aces(vec3 x) {\n return clamp((x * (2.51 * x + 0.03)) / (x * (2.43 * x + 0.59) + 0.14), 0.0, 1.0);\n}\n\nvoid main() {\n vec2 frag = vec2(gl_FragCoord.x, uResolution.y - gl_FragCoord.y);\n float cell = max(uCell, 2.0);\n float minRes = min(uResolution.x, uResolution.y);\n float t = uTime;\n\n // 以灯珠中心采样,整颗灯珠同色\n vec2 id = floor(frag / cell);\n vec2 center = (id + 0.5) * cell;\n vec2 vc = frag / uResolution - 0.5;\n float grain = (0.86 + 0.2 * hash(id)) * (0.95 + 0.1 * hash(id + floor(t * 10.0) * vec2(7.13, 3.71)));\n vec3 color;\n\n if (uHasVideo > 0.5) {\n // cover 铺满:按宽高比裁切视频\n vec2 uv = center / uResolution - 0.5;\n float screenAspect = uResolution.x / uResolution.y;\n float videoAspect = uVideoSize.x / max(uVideoSize.y, 1.0);\n if (screenAspect > videoAspect) uv.y *= videoAspect / screenAspect;\n else uv.x *= screenAspect / videoAspect;\n color = texture2D(uVideo, uv + 0.5).rgb * grain * 1.1;\n // 深色压暗四角,浅色提亮四角\n color = mix(color * (1.0 - dot(vc, vc) * 0.6), mix(color, vec3(1.0), dot(vc, vc) * 0.8), uScheme);\n } else {\n vec2 p = (center - 0.5 * uResolution) / minRes;\n vec2 focus = mix(vec2(0.0, 0.1), (uPointer - 0.5 * uResolution) / minRes, 0.5 * uFollow);\n float h = heat(p, focus, t) * grain;\n color = uColor * h * 1.3 + uHighlight * pow(max(h - 0.55, 0.0), 2.0) * 2.2;\n color += uColor * 0.012;\n color *= 1.0 - dot(vc, vc) * 0.9;\n color = pow(aces(color), vec3(1.0 / 2.2));\n if (uScheme > 0.5) {\n // 浅色:亮暗镜像并保留色相 —— 深底亮焰翻转为浅底深焰\n float lum = dot(color, vec3(0.2126, 0.7152, 0.0722));\n color = clamp(color + (1.0 - 2.0 * lum), 0.0, 1.0);\n }\n }\n\n // 色阶量化,模拟 LED 驱动的有限灰度\n color = floor(color * 14.0 + hash(id + 3.1)) / 14.0;\n\n // 灯珠形状:方形发光点;间隙深色时保留少许漏光,浅色时为浅灰底板\n vec2 f = fract(frag / cell) - 0.5;\n float d = max(abs(f.x), abs(f.y));\n vec3 gap = mix(color * 0.2, mix(color, vec3(0.96), 0.7), uScheme);\n color = mix(gap, color, smoothstep(0.5, 0.28, d));\n\n // 拼接屏接缝:每 16×10 颗灯珠一块,接缝 + 缝下方的阴影\n if (uSeam > 0.0) {\n vec2 pp = mod(frag, vec2(16.0, 10.0) * cell);\n float seam = max(1.0 - smoothstep(uSeam - 1.0, uSeam + 1.0, pp.x), 1.0 - smoothstep(uSeam - 1.0, uSeam + 1.0, pp.y));\n float shade = max(1.0 - smoothstep(uSeam, uSeam + cell * 1.5, pp.x), 1.0 - smoothstep(uSeam, uSeam + cell * 1.5, pp.y));\n color *= 1.0 - mix(0.45, 0.15, uScheme) * shade;\n vec3 seamColor = mix(vec3(0.018, 0.016, 0.015), vec3(0.86, 0.855, 0.85), uScheme) + color * 0.06;\n color = mix(color, seamColor, seam);\n }\n\n gl_FragColor = vec4(color, 1.0);\n}\n`;\n\nexport function PixelVortex({\n children,\n className,\n videoSrc,\n color = '#ff4d12',\n highlightColor = '#ffd9b0',\n cellSize = 4,\n seams = false,\n seamWidth = 5,\n speed = 1,\n interactive = true,\n}: PixelVortexProps) {\n const scheme = useColorScheme();\n const [video, setVideo] = useState<HTMLVideoElement | null>(null);\n // 一旦出过帧就锁定为「有视频」:大视频中途缓冲时保留上一帧,不回退到火焰\n const [videoReady, setVideoReady] = useState(false);\n const textureRef = useRef<{ gl: WebGLRenderingContext; texture: WebGLTexture | null } | null>(null);\n\n // 视频不挂到 DOM 中,仅作为纹理来源;可以播放后才切换到视频画面。\n // 大视频依赖服务端支持 Range 请求做流式播放:边下边播,只缓冲播放位置附近的数据。\n useEffect(() => {\n if (!videoSrc) return;\n const el = document.createElement('video');\n el.crossOrigin = 'anonymous';\n el.muted = true;\n el.loop = true;\n el.playsInline = true;\n el.preload = 'auto';\n\n let disposed = false;\n const tryPlay = () => {\n // 页面不可见时暂停,避免大视频在后台持续缓冲\n if (disposed || document.hidden) return;\n el.play().catch(() => {});\n };\n const handleReady = () => {\n if (disposed) return;\n setVideo(el);\n setVideoReady(true);\n };\n const handleError = () => {\n if (disposed) return;\n setVideoReady(false);\n setVideo(null);\n };\n // 大视频会周期性卡顿而暂停,恢复可播/可见时继续自动播放\n const handlePause = () => tryPlay();\n const handleVisibility = () => {\n if (document.hidden) el.pause();\n else tryPlay();\n };\n\n el.addEventListener('loadeddata', handleReady);\n el.addEventListener('canplay', handleReady);\n el.addEventListener('error', handleError);\n el.addEventListener('pause', handlePause);\n document.addEventListener('visibilitychange', handleVisibility);\n el.src = videoSrc;\n tryPlay();\n\n return () => {\n disposed = true;\n el.removeEventListener('loadeddata', handleReady);\n el.removeEventListener('canplay', handleReady);\n el.removeEventListener('error', handleError);\n el.removeEventListener('pause', handlePause);\n document.removeEventListener('visibilitychange', handleVisibility);\n el.pause();\n el.removeAttribute('src');\n el.load();\n setVideoReady(false);\n setVideo(null);\n };\n }, [videoSrc]);\n\n const canvasRef = useShaderCanvas({\n fragmentShader: FRAGMENT_SHADER,\n speed,\n interactive,\n onDraw: ({ gl, uniform, dpr }) => {\n gl.uniform3fv(uniform('uColor'), hexToLinearRgb(color));\n gl.uniform3fv(uniform('uHighlight'), hexToLinearRgb(highlightColor));\n gl.uniform1f(uniform('uCell'), Math.max(2, cellSize) * dpr);\n gl.uniform1f(uniform('uFollow'), interactive ? 1 : 0);\n gl.uniform1f(uniform('uScheme'), scheme === 'light' ? 1 : 0);\n gl.uniform1f(uniform('uSeam'), seams ? Math.max(0.5, seamWidth) * dpr : 0);\n\n // 用锁定状态判断是否已切到视频;缓冲中 readyState 会掉,但画面保留上一帧\n const hasVideo = video != null && videoReady;\n gl.uniform1f(uniform('uHasVideo'), hasVideo ? 1 : 0);\n if (!hasVideo || !video) return;\n\n if (textureRef.current?.gl !== gl) {\n const texture = gl.createTexture();\n gl.bindTexture(gl.TEXTURE_2D, texture);\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.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MIN_FILTER, gl.LINEAR);\n gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MAG_FILTER, gl.LINEAR);\n textureRef.current = { gl, texture };\n }\n gl.activeTexture(gl.TEXTURE0);\n gl.bindTexture(gl.TEXTURE_2D, textureRef.current.texture);\n // 只在拿到当前帧时上传;缓冲中沿用上一帧纹理\n if (video.readyState >= video.HAVE_CURRENT_DATA && video.videoWidth > 0) {\n gl.texImage2D(gl.TEXTURE_2D, 0, gl.RGB, gl.RGB, gl.UNSIGNED_BYTE, video);\n }\n gl.uniform1i(uniform('uVideo'), 0);\n gl.uniform2f(uniform('uVideoSize'), video.videoWidth, video.videoHeight);\n },\n });\n\n return (\n <div\n className={cn('elyri-pixel-vortex', className)}\n data-scheme={scheme}\n style={{ '--elyri-pixel-vortex-color': color } as CSSProperties}\n >\n <canvas ref={canvasRef} className=\"elyri-pixel-vortex__canvas\" aria-hidden=\"true\" />\n {children != null && <div className=\"elyri-pixel-vortex__content\">{children}</div>}\n </div>\n );\n}\n","import type { CSSProperties, ReactNode } from 'react';\n\nimport { cn, hexToLinearRgb, useShaderCanvas } from '../../../core';\n\nimport './Planet.css';\n\nexport type PlanetKind = 'mars' | 'jupiter' | 'earth';\n\nexport interface PlanetProps {\n children?: ReactNode;\n className?: string;\n planet?: PlanetKind;\n color?: string;\n terrainColor?: string;\n atmosphereColor?: string;\n atmosphere?: number;\n craters?: number;\n cityLights?: boolean;\n stars?: number;\n horizon?: number;\n speed?: number;\n sun?: boolean;\n sunPosition?: { x: number; y: number };\n interactive?: boolean;\n}\n\nconst PLANET_PRESETS: Record<\n PlanetKind,\n { color: string; terrainColor: string; atmosphereColor: string; atmosphere: number }\n> = {\n mars: { color: '#c1532b', terrainColor: '#4e1e12', atmosphereColor: '#f2a57c', atmosphere: 0.6 },\n jupiter: { color: '#ecdcc0', terrainColor: '#a86a3a', atmosphereColor: '#d9cdb8', atmosphere: 0.3 },\n earth: { color: '#3f5a2a', terrainColor: '#0a2744', atmosphereColor: '#6fa8ff', atmosphere: 0.55 },\n};\n\nconst COMMON = `\nprecision highp float;\n\n#define PI 3.14159265\n#define HALF 8\n\nuniform vec2 uResolution;\nuniform float uTime;\nuniform vec2 uPointer;\nuniform vec3 uSurface;\nuniform vec3 uTerrain;\nuniform vec3 uAtmosphere;\nuniform float uDensity;\nuniform float uStars;\nuniform float uHorizon;\nuniform float uSun;\nuniform vec2 uSunPos;\nuniform float uSunFixed;\n\nconst float ALT = 0.15;\nconst float FL = 1.25;\nconst float H = 0.0045;\nconst float RT = 1.0 + 10.0 * H;\nconst float SUN_I = 5.0;\nconst float SUN_R = 0.012;\n\nfloat hash12(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\nfloat hash13(vec3 p) {\n p = fract(p * 0.1031);\n p += dot(p, p.zyx + 31.32);\n return fract((p.x + p.y) * p.z);\n}\n\nvec3 hash33(vec3 p) {\n p = fract(p * vec3(0.1031, 0.1030, 0.0973));\n p += dot(p, p.yxz + 33.33);\n return fract((p.xxy + p.yxx) * p.zyx);\n}\n\nfloat noise2(vec2 p) {\n vec2 i = floor(p);\n vec2 f = fract(p);\n vec2 u = f * f * (3.0 - 2.0 * f);\n return mix(\n mix(hash12(i), hash12(i + vec2(1.0, 0.0)), u.x),\n mix(hash12(i + vec2(0.0, 1.0)), hash12(i + vec2(1.0, 1.0)), u.x),\n u.y\n );\n}\n\nfloat noise3(vec3 x) {\n vec3 i = floor(x);\n vec3 f = fract(x);\n vec3 u = f * f * (3.0 - 2.0 * f);\n return mix(\n mix(mix(hash13(i), hash13(i + vec3(1, 0, 0)), u.x), mix(hash13(i + vec3(0, 1, 0)), hash13(i + vec3(1, 1, 0)), u.x), u.y),\n mix(mix(hash13(i + vec3(0, 0, 1)), hash13(i + vec3(1, 0, 1)), u.x), mix(hash13(i + vec3(0, 1, 1)), hash13(i + vec3(1, 1, 1)), u.x), u.y),\n u.z\n );\n}\n\nfloat lod(float freqTimesFootprint) {\n return 1.0 - smoothstep(0.25, 0.6, freqTimesFootprint);\n}\n\nfloat fbm3(vec3 p, float fp, int octaves) {\n float s = 0.0;\n float a = 0.5;\n float f = 1.0;\n for (int i = 0; i < 8; i++) {\n float w = lod(f * fp);\n if (i >= octaves || w <= 0.0) break;\n s += a * w * (noise3(p * f + float(i) * 7.13) - 0.5);\n a *= 0.55;\n f *= 2.02;\n }\n return s;\n}\n\nfloat chapman(float X, float h, float coschi) {\n float c = sqrt(X + h);\n if (coschi >= 0.0) return c / (c * coschi + 1.0) * exp(-h);\n float x0 = sqrt(1.0 - coschi * coschi) * (X + h);\n return 2.0 * sqrt(x0) * exp(min(X - x0, 40.0)) - c / (1.0 - c * coschi) * exp(-h);\n}\n\nvec3 stars(vec3 rd, float pixAngle) {\n vec2 a = vec2(atan(rd.x, -rd.z), asin(clamp(rd.y, -1.0, 1.0)));\n vec3 col = vec3(0.0);\n for (int layer = 0; layer < 2; layer++) {\n float scale = layer == 0 ? 70.0 : 190.0;\n float seed = float(layer) * 17.0;\n vec2 g = a * scale;\n vec2 cell = floor(g);\n if (hash12(cell + seed) > uStars * (layer == 0 ? 0.22 : 0.2)) continue;\n vec2 pos = 0.2 + 0.6 * vec2(hash12(cell + seed + 3.1), hash12(cell + seed + 7.7));\n float px = length(fract(g) - pos) / scale / pixAngle;\n float h = hash12(cell + seed + 5.3);\n float mag = layer == 0 ? 0.05 + 2.0 * pow(h, 8.0) : 0.015 + 0.05 * h;\n float tw = 0.7 + 0.3 * sin(uTime * (0.8 + 2.5 * h) + h * 40.0);\n vec3 tint = mix(vec3(0.62, 0.74, 1.0), vec3(1.0, 0.82, 0.64), hash12(cell + seed + 9.9));\n col += tint * mag * tw * exp(-px * px * 1.4);\n }\n vec2 q = a * vec2(2.2, 3.4);\n float neb = noise2(q) * 0.55 + noise2(q * 2.1 + 4.0) * 0.3 + noise2(q * 4.3 + 9.0) * 0.15;\n float band = exp(-pow((a.y + 0.35 * a.x + 0.05) * 2.6, 2.0));\n col += mix(vec3(0.05, 0.04, 0.12), vec3(0.1, 0.05, 0.07), neb) * smoothstep(0.35, 0.85, neb) * band * 0.12 * uStars;\n return col;\n}\n\nvec3 aces(vec3 x) {\n return clamp((x * (2.51 * x + 0.03)) / (x * (2.43 * x + 0.59) + 0.14), 0.0, 1.0);\n}\n`;\n\nconst RELIEF = `\nvec4 noised(vec3 x) {\n vec3 i = floor(x);\n vec3 w = fract(x);\n vec3 u = w * w * w * (w * (w * 6.0 - 15.0) + 10.0);\n vec3 du = 30.0 * w * w * (w * (w - 2.0) + 1.0);\n float a = hash13(i);\n float b = hash13(i + vec3(1, 0, 0));\n float c = hash13(i + vec3(0, 1, 0));\n float d = hash13(i + vec3(1, 1, 0));\n float e = hash13(i + vec3(0, 0, 1));\n float f = hash13(i + vec3(1, 0, 1));\n float g = hash13(i + vec3(0, 1, 1));\n float h = hash13(i + vec3(1, 1, 1));\n float k1 = b - a;\n float k2 = c - a;\n float k3 = e - a;\n float k4 = a - b - c + d;\n float k5 = a - c - e + g;\n float k6 = a - b - e + f;\n float k7 = -a + b + c - d + e - f - g + h;\n return vec4(\n a + k1 * u.x + k2 * u.y + k3 * u.z + k4 * u.x * u.y + k5 * u.y * u.z + k6 * u.z * u.x + k7 * u.x * u.y * u.z,\n du * vec3(\n k1 + k4 * u.y + k6 * u.z + k7 * u.y * u.z,\n k2 + k5 * u.z + k4 * u.x + k7 * u.z * u.x,\n k3 + k6 * u.x + k5 * u.y + k7 * u.x * u.y\n )\n );\n}\n\nvec4 terrain(vec3 p, float fp) {\n vec4 s = vec4(0.0);\n vec3 dsum = vec3(0.0);\n float a = 0.5;\n float f = 1.0;\n for (int i = 0; i < 10; i++) {\n float w = lod(f * fp);\n if (w <= 0.0) break;\n vec4 n = noised(p * f + float(i) * vec3(3.1, 7.7, 1.3));\n vec3 g = n.yzw * f;\n dsum += g * a;\n float k = a * w / (1.0 + 0.35 * dot(dsum, dsum));\n s.x += k * (n.x - 0.5);\n s.yzw += k * g;\n a *= 0.5;\n f *= 2.03;\n }\n return s;\n}\n`;\n\nconst MARS_SURFACE = `\nuniform float uCraters;\n\nconst float BUMP = 0.06;\n\nfloat craterProfile(float x) {\n return 0.8 * (smoothstep(0.0, 1.0, x) - 1.0) + 0.3 * exp(-10.0 * (x - 1.0) * (x - 1.0));\n}\n\nfloat craterLayer(vec3 p, float scale, float fp, float seed, inout vec3 grad) {\n vec3 g = p * scale + seed;\n vec3 cell = floor(g);\n vec3 r = hash33(cell + seed);\n if (r.x > 0.75 * uCraters) return 0.0;\n vec3 c = cell + 0.3 + 0.4 * hash33(cell * 1.7 + seed + 11.0);\n float R = mix(0.07, 0.18, r.y * r.y);\n vec3 d = g - c;\n float dist = length(d);\n float x = dist / R;\n if (x > 1.6) return 0.0;\n float w = 1.0 - smoothstep(0.1, 0.4, fp * scale / R);\n float depth = uCraters * mix(0.5, 1.0, r.z) * w;\n float dh = (craterProfile(x + 0.01) - craterProfile(x - 0.01)) / 0.02;\n grad += dh * d / max(dist, 1e-4) * depth * 0.8;\n return craterProfile(x) * w;\n}\n\nvec3 shadeSurface(vec3 n, float ndv, float pix, vec3 sun, vec3 beta, float X) {\n float fp = pix / max(sqrt(ndv), 0.12);\n\n float ang = -uTime * 0.01;\n float cs = cos(ang);\n float sn = sin(ang);\n mat3 spin = mat3(1.0, 0.0, 0.0, 0.0, cs, sn, 0.0, -sn, cs);\n vec3 q = spin * n;\n\n vec4 ter = terrain(q * 4.0 + 2.0, fp * 4.0);\n vec3 grad = ter.yzw * 4.0 * BUMP;\n float crater = 0.0;\n crater += craterLayer(q, 5.0, fp, 1.3, grad);\n crater += craterLayer(q, 11.0, fp, 7.9, grad);\n crater += craterLayer(q, 23.0, fp, 4.1, grad);\n crater += craterLayer(q, 47.0, fp, 9.6, grad);\n crater += craterLayer(q, 97.0, fp, 5.7, grad);\n crater += craterLayer(q, 199.0, fp, 2.2, grad);\n grad = grad * spin;\n grad -= dot(grad, n) * n;\n vec3 nb = normalize(n - grad);\n\n float big = fbm3(q * 1.7 + 4.0, fp * 1.7, 8);\n float mid = fbm3(q * 9.0 + 1.0, fp * 9.0, 8);\n float fine = fbm3(q * 70.0 + 3.0, fp * 70.0, 8);\n vec3 albedo = mix(uSurface, uTerrain, smoothstep(-0.12, 0.22, big + 0.35 * mid + 0.15 * fine));\n albedo *= 0.8 + 0.7 * (mid + 0.5) * 0.6 + 2.0 * ter.x + 0.5 * fine;\n albedo *= 1.0 + 0.3 * crater;\n albedo = max(albedo, 0.0);\n\n float ngl = dot(n, sun);\n float mu0 = max(dot(nb, sun), 0.0);\n float lsl = mu0 / (mu0 + ndv + 1e-3);\n float brdf = mix(mu0, lsl, 0.35) * smoothstep(-0.03, 0.08, ngl);\n vec3 sunT = exp(-beta * H * chapman(X, 0.0, ngl));\n vec3 sky = uAtmosphere * uDensity * 0.05 * smoothstep(-0.3, 0.4, ngl);\n return albedo * (SUN_I * 0.9 * sunT * brdf + sky + 0.004);\n}\n`;\n\nconst JUPITER_SURFACE = `\nconst vec3 AXIS = vec3(0.0, 0.2955, -0.9553);\nconst vec3 EAST0 = vec3(1.0, 0.0, 0.0);\nconst vec3 MERIDIAN0 = vec3(0.0, 0.9553, 0.2955);\nconst float FLOW_T = 24.0;\n\nvec3 spinAxis(vec3 p, float a) {\n float c = cos(a);\n float s = sin(a);\n return p * c + cross(AXIS, p) * s + AXIS * dot(AXIS, p) * (1.0 - c);\n}\n\nvec3 fromLatLon(float lat, float lon) {\n return cos(lat) * (cos(lon) * MERIDIAN0 + sin(lon) * EAST0) + sin(lat) * AXIS;\n}\n\nvec2 harmonic(float lat, float k, float a, float ph, float fpLat) {\n float w = a * lod(k * fpLat / (2.0 * PI));\n return w * vec2(sin(k * lat + ph), k * cos(k * lat + ph));\n}\n\nvec2 bandField(float lat, float fpLat) {\n return harmonic(lat, 61.0, 1.0, 0.9, fpLat)\n + harmonic(lat, 107.0, 0.55, 2.4, fpLat)\n + harmonic(lat, 211.0, 0.3, 4.1, fpLat)\n + harmonic(lat, 409.0, 0.16, 1.7, fpLat);\n}\n\nfloat jet(float lat) {\n return 0.00011 * (61.0 * cos(61.0 * lat + 0.9) + 0.55 * 107.0 * cos(107.0 * lat + 2.4));\n}\n\nvec2 cloudPhase(vec3 p, float lat, float t, float seed, float fp) {\n vec3 q = spinAxis(p, -jet(lat) * t);\n q += AXIS * dot(q, AXIS) * 2.0;\n q += seed * vec3(1.7, 9.2, 4.3);\n float wx = fbm3(q * 7.0, fp * 14.0, 5);\n float wy = fbm3(q * 7.0 + 5.2, fp * 14.0, 5);\n float detail = fbm3(q * 30.0 + vec3(wx, wy, wx - wy) * 9.0, fp * 60.0, 7);\n return vec2(wx, detail);\n}\n\nvec2 vortexFrame(vec3 p, float lat0, float lon0, vec2 radii) {\n vec3 c = fromLatLon(lat0, lon0);\n vec3 east = normalize(cross(AXIS, c));\n vec3 north = cross(c, east);\n vec3 d = p - c;\n return vec2(dot(d, east), dot(d, north)) / radii;\n}\n\nvec2 vortex(vec2 v, float spin, float seed, float fp) {\n float r = length(v);\n float ang = spin * uTime + 2.4 * (1.0 - smoothstep(0.0, 1.1, r));\n float c = cos(ang);\n float s = sin(ang);\n vec2 w = mat2(c, -s, s, c) * v;\n float tex = fbm3(vec3(w * 2.4, r * 6.0 + seed), fp * 6.0, 6);\n float mask = 1.0 - smoothstep(0.6, 1.0, r + tex * 0.5);\n return vec2(mask, tex);\n}\n\nfloat vortexPush(vec2 v, float radiusY) {\n float r = length(v);\n return v.y / max(r, 1e-3) * radiusY * 0.7 * (1.0 - smoothstep(0.9, 2.6, r)) * smoothstep(0.0, 0.9, r);\n}\n\nvec3 shadeSurface(vec3 n, float ndv, float pix, vec3 sun, vec3 beta, float X) {\n float fp = pix / max(sqrt(ndv), 0.12);\n float fpLat = pix / max(ndv, 0.03);\n\n float lat = asin(clamp(dot(n, AXIS), -1.0, 1.0));\n\n float cyc = uTime / FLOW_T;\n float phA = fract(cyc);\n float phB = fract(cyc + 0.5);\n float wA = 1.0 - abs(2.0 * phA - 1.0);\n vec2 A = cloudPhase(n, lat, phA * FLOW_T, mod(floor(cyc), 61.0), fp);\n vec2 B = cloudPhase(n, lat, phB * FLOW_T, mod(floor(cyc + 0.5), 61.0) + 0.5, fp);\n vec2 cl = (A * wA + B * (1.0 - wA)) / sqrt(wA * wA + (1.0 - wA) * (1.0 - wA));\n\n const vec2 GRS_R = vec2(0.05, 0.028);\n vec2 grs = vortexFrame(n, 0.6, -0.1 + 0.03 * sin(uTime * 0.021), GRS_R);\n float push = vortexPush(grs, GRS_R.y);\n const vec2 OVAL_R = vec2(0.013, 0.0085);\n vec2 ovals[5];\n for (int i = 0; i < 5; i++) {\n float fi = float(i);\n float lon = fi * 0.085 - 0.3 + 0.02 * sin(uTime * 0.017 + fi * 1.9);\n ovals[i] = vortexFrame(n, 0.545 + 0.003 * sin(fi * 2.3), lon, OVAL_R);\n push += vortexPush(ovals[i], OVAL_R.y);\n }\n\n float latB = lat + cl.x * 0.02 + push;\n vec2 band = bandField(latB, fpLat);\n float soft = 0.25 + abs(band.y) * fpLat;\n float belt = smoothstep(-soft, soft, band.x - 0.1);\n float edge = 1.0 - abs(2.0 * belt - 1.0);\n\n float hue = 0.5 + 0.5 * sin(latB * 17.0 + 1.7);\n vec3 beltCol = mix(uTerrain, uTerrain * vec3(1.25, 0.9, 0.62), hue);\n vec3 zoneCol = mix(uSurface, uSurface * vec3(1.0, 0.9, 0.72), 1.0 - hue);\n vec3 albedo = mix(zoneCol, beltCol, belt);\n albedo *= 1.0 + cl.y * (1.6 + 2.4 * edge) + 0.1 * band.x;\n float festoon = smoothstep(0.05, 0.2, cl.y) * edge;\n albedo = mix(albedo, albedo * vec3(0.5, 0.62, 0.78), festoon * 0.55);\n\n float rg = length(grs);\n vec2 gv = vortex(grs, 0.18, 3.0, fp / GRS_R.y);\n float collar = exp(-pow((rg - 1.1) / 0.22, 2.0));\n albedo = mix(albedo, zoneCol * (1.1 + cl.y), collar * 0.75);\n vec3 red = uTerrain * vec3(1.7, 0.66, 0.4);\n red *= (0.7 + 0.4 * smoothstep(0.0, 0.85, rg)) * (1.0 + 1.8 * gv.y);\n albedo = mix(albedo, red, gv.x);\n\n for (int i = 0; i < 5; i++) {\n float r = length(ovals[i]);\n if (r < 1.6) {\n vec2 o = vortex(ovals[i], -0.4, float(i) * 3.1, fp / OVAL_R.y);\n albedo *= 1.0 - 0.35 * exp(-pow((r - 1.0) / 0.18, 2.0));\n albedo = mix(albedo, uSurface * (1.08 + 1.4 * o.y) * (0.9 + 0.15 * smoothstep(0.0, 0.7, r)), o.x * 0.92);\n }\n }\n albedo = max(albedo, 0.0);\n\n float ngl = dot(n, sun);\n float mu0 = max(ngl, 0.0);\n float brdf = mu0 * smoothstep(-0.02, 0.1, ngl) + 0.015 * smoothstep(-0.12, 0.04, ngl);\n vec3 sunT = exp(-beta * H * chapman(X, 0.0, ngl));\n vec3 sky = uAtmosphere * uDensity * 0.05 * smoothstep(-0.3, 0.4, ngl);\n return albedo * (SUN_I * 0.9 * sunT * brdf + sky + 0.004);\n}\n`;\n\nconst EARTH_SURFACE = `\nuniform float uCityLights;\n\nconst float CLOUD_H = 0.0016;\nconst vec3 CITY_WARM = vec3(1.0, 0.5, 0.16);\nconst vec3 CITY_COOL = vec3(1.0, 0.86, 0.66);\n\nmat3 spinX(float a) {\n float c = cos(a);\n float s = sin(a);\n return mat3(1.0, 0.0, 0.0, 0.0, c, s, 0.0, -s, c);\n}\n\nvec3 cloudWarp(vec3 p, float fp) {\n vec3 s = p * 1.8 + vec3(0.0, 0.0, uTime * 0.0035);\n return vec3(fbm3(s + 1.3, fp * 1.8, 4), fbm3(s + 7.1, fp * 1.8, 4), fbm3(s + 4.4, fp * 1.8, 4));\n}\n\nfloat cloudCover(vec3 p, vec3 w, float fp) {\n float t = uTime * 0.006;\n float big = fbm3(p * 3.2 + w * 2.4 + vec3(t, 0.0, -t), fp * 3.2, 6);\n float puff = fbm3(p * 21.0 + w * 5.0 - vec3(0.0, t, t) * 3.0, fp * 21.0, 6);\n float c = big + 0.4 * puff * smoothstep(-0.15, 0.1, big);\n return smoothstep(0.03, 0.26, c + 0.02);\n}\n\n// 每个格子至多一座聚落,位置在格内完全随机;查 2x2x2 邻格避免被格子边界截断\nfloat settlements(vec3 q, float scale, float fp, float P, float seed) {\n vec3 g = q * scale + seed * 17.0;\n vec3 base = floor(g - 0.5);\n float f2 = fp * scale * fp * scale * 0.25;\n float sum = 0.0;\n for (int i = 0; i < 8; i++) {\n float fi = float(i);\n vec3 cell = base + vec3(mod(fi, 2.0), mod(floor(fi * 0.5), 2.0), floor(fi * 0.25));\n vec3 r = hash33(cell + seed);\n float w = smoothstep(r.x, r.x + 0.15, P);\n if (w <= 0.0) continue;\n vec3 d = g - cell - hash33(cell * 1.7 + seed + 5.0);\n d -= dot(d, q) * q;\n float s2 = mix(0.03, 0.14, r.y * r.y);\n s2 *= s2;\n float t2 = s2 + f2;\n sum += w * exp(-dot(d, d) / t2) * s2 / t2 * (0.5 + 0.5 * r.z);\n }\n return sum;\n}\n\nvec3 cityLights(vec3 q, float fp, float P) {\n float metro = settlements(q, 40.0, fp, P * 0.75, 1.0);\n float town = settlements(q, 170.0, fp, P * 0.45 + min(metro, 1.0) * 0.4, 2.0);\n float t = min(metro, 1.0);\n // 街区颗粒:市中心连成一片,越往郊区越破碎\n float grain = 0.6 * noise3(q * 1800.0) + 0.4 * noise3(q * 700.0 + 3.1);\n float lo = 0.72 - 0.55 * t;\n float mask = mix(0.2 + 0.6 * t, smoothstep(lo, lo + 0.2, grain), lod(fp * 1800.0));\n vec3 tint = mix(CITY_WARM, CITY_COOL, t * t * 0.8);\n return tint * metro * mask * 1.1 + CITY_WARM * min(town, 1.5) * 0.35;\n}\n\nvec3 shadeSurface(vec3 n, float ndv, float pix, vec3 sun, vec3 beta, float X) {\n float fp = pix / max(sqrt(ndv), 0.12);\n\n mat3 spin = spinX(-uTime * 0.008);\n vec3 q = spin * n;\n\n vec3 cw = vec3(fbm3(q * 1.2 + 3.7, fp * 1.2, 4), fbm3(q * 1.2 + 9.1, fp * 1.2, 4), fbm3(q * 1.2 + 5.3, fp * 1.2, 4));\n float cont = fbm3(q * 1.9 + cw * 1.4 + 0.7, fp * 1.9, 6);\n vec4 ter = terrain(q * 7.0 + 2.0, fp * 7.0);\n float e = cont + 0.3 * ter.x - 0.035;\n float aa = fp * 4.0 + 5e-4;\n float land = smoothstep(-aa, aa, e);\n float alt = max(e, 0.0);\n float mtn = smoothstep(0.02, 0.14, alt + 0.15 * ter.x);\n\n vec3 grad = ter.yzw * 7.0 * 0.022 * (0.35 + 2.0 * mtn) * land;\n grad = grad * spin;\n grad -= dot(grad, n) * n;\n vec3 nb = normalize(n - grad);\n\n float mid = fbm3(q * 14.0 + 1.0, fp * 14.0, 6);\n float dry = 0.0;\n float snow = 0.0;\n vec3 ground = uTerrain;\n if (land > 0.0) {\n float fine = fbm3(q * 60.0 + 3.0, fp * 60.0, 5);\n float moist = fbm3(q * 2.6 + 8.0, fp * 2.6, 6) + 0.15 * exp(-alt * 25.0);\n dry = 1.0 - smoothstep(-0.12, 0.02, moist + 0.25 * mid);\n float wet = smoothstep(-0.02, 0.12, moist + 0.2 * mid);\n vec3 grass = uSurface * vec3(1.9, 1.55, 1.0) + vec3(0.02, 0.012, 0.0);\n vec3 la = mix(grass, uSurface, wet);\n la = mix(la, vec3(0.36, 0.25, 0.13) * (0.85 + 0.4 * mid), dry);\n la = mix(la, vec3(0.1, 0.085, 0.07), mtn * 0.8);\n snow = smoothstep(0.17, 0.22, alt + 0.06 * fine + 0.04 * mid + 0.1 * abs(q.x));\n la = mix(la, vec3(0.8), snow);\n la *= max(0.85 + 0.5 * fine + 0.25 * mid, 0.2);\n ground = la;\n }\n float depth = max(-e, 0.0);\n vec3 ocean = mix(uTerrain, uTerrain * vec3(0.6, 2.4, 2.0) + vec3(0.0, 0.02, 0.02), exp(-depth * 60.0));\n ocean *= 0.9 + 0.4 * mid;\n vec3 albedo = mix(ocean, ground, land);\n\n float ngl = dot(n, sun);\n float mu0 = max(dot(nb, sun), 0.0);\n float lsl = mu0 / (mu0 + ndv + 1e-3);\n float day = smoothstep(-0.03, 0.08, ngl);\n float brdf = mix(mu0, lsl, 0.25) * day;\n vec3 sunT = exp(-beta * H * chapman(X, 0.0, ngl));\n vec3 sky = uAtmosphere * uDensity * 0.05 * smoothstep(-0.3, 0.4, ngl);\n\n mat3 cspin = spinX(-uTime * 0.0095);\n vec3 c = cspin * n;\n vec3 w = cloudWarp(c, fp);\n float cov = cloudCover(c, w, fp);\n vec3 sunTan = sun - ngl * n;\n sunTan = cspin * (sunTan * inversesqrt(max(dot(sunTan, sunTan), 1e-6)));\n float shade = 1.0;\n float relief = 1.0;\n if (ngl > -0.06) {\n float reach = CLOUD_H * sqrt(max(1.0 - ngl * ngl, 0.0)) / max(ngl, 0.05);\n shade = 1.0 - 0.75 * cloudCover(c + sunTan * reach, w, fp);\n relief = clamp(1.0 - 2.2 * (cloudCover(c + sunTan * 0.006, w, fp) - cov), 0.3, 1.25);\n }\n\n vec3 color = albedo * (SUN_I * 0.9 * sunT * brdf * shade + sky + 0.004);\n\n if (land < 1.0) {\n vec3 v = normalize(vec3(0.0, 1.0 + ALT, 0.0) - n);\n float wind = fbm3(q * vec3(10.0, 10.0, 34.0) + 4.2, fp * 34.0, 5);\n float alpha = mix(0.1, 0.3, smoothstep(-0.18, 0.18, wind));\n float a2 = alpha * alpha;\n vec3 hv = normalize(sun + v);\n float nh = max(dot(n, hv), 0.0);\n float nl = max(ngl, 0.0);\n float nv = max(dot(n, v), 1e-3);\n float dd = nh * nh * (a2 - 1.0) + 1.0;\n float k = alpha * 0.5;\n float G = nl / (nl * (1.0 - k) + k) * nv / (nv * (1.0 - k) + k);\n float F = 0.02 + 0.98 * pow(1.0 - max(dot(v, hv), 0.0), 5.0);\n float spec = a2 / (PI * dd * dd) * G * F / (4.0 * nv) * day;\n float Fv = 0.02 + 0.98 * pow(1.0 - nv, 5.0);\n vec3 skyRefl = uAtmosphere * uDensity * 0.35 * smoothstep(-0.2, 0.35, ngl) * Fv;\n color += (SUN_I * 0.9 * sunT * spec * shade + skyRefl) * (1.0 - land);\n }\n\n float night = (1.0 - smoothstep(-0.08, -0.01, ngl)) * uCityLights;\n vec3 lights = vec3(0.0);\n if (night > 0.0 && land > 0.0) {\n float pop = fbm3(q * 4.3 + 13.0, fp * 4.3, 5) + 0.35 * fbm3(q * 17.0 + 2.0, fp * 17.0, 4);\n float P = smoothstep(-0.02, 0.2, pop + 0.12 * exp(-alt * 22.0) - 0.25 * dry - 0.3 * mtn - 0.5 * snow);\n lights = cityLights(q, fp, P) * land * night;\n color += lights;\n }\n\n float ngc = ngl + 0.055;\n vec3 sunTc = exp(-beta * H * chapman(X, CLOUD_H / H, ngl));\n float cBrdf = mix(max(ngc, 0.0), ngc / (abs(ngc) + ndv + 1e-3), 0.3) * smoothstep(0.0, 0.1, ngc) * relief;\n vec3 cloud = vec3(0.78) * (SUN_I * 0.9 * sunTc * max(cBrdf, 0.0) + sky * 2.0 + 0.004);\n cloud += lights * 0.12;\n return mix(color, cloud, cov);\n}\n`;\n\nconst MAIN = `\nvoid main() {\n vec2 frag = gl_FragCoord.xy;\n vec2 uv = (frag - 0.5 * uResolution) / uResolution.y;\n vec2 ptr = uPointer / uResolution;\n float pixAngle = 1.0 / (uResolution.y * FL);\n\n float D = 1.0 + ALT;\n float dip = acos(1.0 / D);\n float yaw = (ptr.x - 0.5) * 0.04;\n float pitch = dip + atan((0.5 - uHorizon) / FL) + (ptr.y - 0.5) * 0.015;\n vec3 ro = vec3(0.0, D, 0.0);\n vec3 fw = vec3(sin(yaw) * cos(pitch), -sin(pitch), -cos(yaw) * cos(pitch));\n vec3 right = normalize(cross(fw, vec3(0.0, 1.0, 0.0)));\n vec3 up = cross(right, fw);\n vec3 rd = normalize(uv.x * right + uv.y * up + FL * fw);\n\n vec2 sunRef = mix(ptr, uSunPos, uSunFixed);\n float az = -0.85 + (sunRef.x - 0.5) * 1.2;\n float el = -0.24 - (sunRef.y - 0.5) * 0.3;\n vec3 sun = normalize(vec3(sin(az) * cos(el), sin(el), -cos(az) * cos(el)));\n\n vec3 beta = uAtmosphere * 7.0 * uDensity + 1e-4;\n float X = 1.0 / H;\n\n float b = dot(ro, rd);\n float tc = -b;\n float impact = sqrt(max(dot(ro, ro) - b * b, 0.0));\n float coverage = clamp(0.5 - (impact - 1.0) / (tc * pixAngle), 0.0, 1.0);\n float disc = b * b - dot(ro, ro) + 1.0;\n float tPlanet = disc > 0.0 ? -b - sqrt(disc) : tc;\n\n float mu = dot(rd, sun);\n float sunAng = sqrt(max(2.0 * (1.0 - mu), 0.0));\n vec3 space = stars(rd, pixAngle);\n space += vec3(1.0, 0.96, 0.9) * 60.0 * smoothstep(SUN_R, SUN_R * 0.75, sunAng) * uSun;\n\n vec3 background = space;\n if (coverage > 0.0) {\n vec3 n = normalize(ro + rd * tPlanet);\n float ndv = max(dot(n, -rd), 0.0);\n vec3 surface = shadeSurface(n, ndv, tPlanet * pixAngle, sun, beta, X);\n background = mix(space, surface, coverage);\n }\n\n vec3 inscatter = vec3(0.0);\n vec3 trans = vec3(1.0);\n float bA = b * b - dot(ro, ro) + RT * RT;\n if (bA > 0.0) {\n float t0 = max(-b - sqrt(bA), 0.0);\n float t1 = mix(-b + sqrt(bA), tPlanet, coverage);\n float tm = clamp(tc, t0, t1);\n float jitter = fract(52.9829189 * fract(dot(frag, vec2(0.06711056, 0.00583715))));\n float du = 1.0 / float(HALF);\n float od = 0.0;\n vec3 scat = vec3(0.0);\n for (int i = 0; i < 2 * HALF; i++) {\n bool near = i < HALF;\n float u = ((near ? float(HALF - 1 - i) : float(i - HALF)) + jitter) * du;\n float len = near ? tm - t0 : t1 - tm;\n float t = near ? tm - len * u * u : tm + len * u * u;\n vec3 p = ro + rd * t;\n float r = length(p);\n float h = max(r - 1.0, 0.0) / H;\n float dens = exp(-h) * 2.0 * u * len * du;\n float odSun = H * chapman(X, h, dot(p, sun) / r);\n scat += dens * exp(-beta * (od + 0.5 * dens + odSun));\n od += dens;\n }\n trans = exp(-beta * od);\n float g = 0.76;\n float phaseR = 3.0 / (16.0 * PI) * (1.0 + mu * mu);\n float phaseM = (1.0 - g * g) / (4.0 * PI * pow(1.0 + g * g - 2.0 * g * mu, 1.5));\n inscatter = SUN_I * 7.0 * beta * scat * mix(phaseR, phaseM, 0.4 - 0.25 * coverage);\n }\n\n vec3 color = inscatter + trans * background;\n\n vec3 toCenter = -normalize(ro);\n float sunCos = dot(sun, toCenter);\n float clearance = acos(clamp(sunCos, -1.0, 1.0)) - asin(1.0 / D);\n float sunImpact = D * sqrt(max(1.0 - sunCos * sunCos, 0.0));\n float hs = max(sunImpact - 1.0, 0.0) / H;\n vec3 sunTrans = sunCos > 0.0 ? exp(-beta * H * 2.0 * sqrt(X + hs) * exp(-hs)) : vec3(1.0);\n float sunVis = smoothstep(-SUN_R, SUN_R * 2.0, clearance);\n vec2 sunUv = vec2(dot(sun, right), dot(sun, up)) / max(dot(sun, fw), 1e-3) * FL;\n vec2 sd = uv - sunUv;\n float glow = 0.9 * exp(-sunAng * 30.0) + 0.1 * exp(-sunAng * 7.0) + 0.015 * exp(-sunAng * 2.0);\n float streak = exp(-abs(sd.y) * 110.0) * exp(-abs(sd.x) * 3.0) * 0.08 * step(0.0, dot(sun, fw));\n color += vec3(1.0, 0.93, 0.85) * sunTrans * sunVis * (glow + streak) * uSun;\n\n color *= 1.0 - 0.35 * dot(uv * vec2(0.6, 1.0), uv * vec2(0.6, 1.0));\n color = pow(aces(color * 0.9), vec3(1.0 / 2.2));\n color += (hash12(frag + fract(uTime)) - 0.5) / 255.0;\n\n gl_FragColor = vec4(color, 1.0);\n}\n`;\n\nconst SHADERS: Record<PlanetKind, string> = {\n mars: COMMON + RELIEF + MARS_SURFACE + MAIN,\n jupiter: COMMON + JUPITER_SURFACE + MAIN,\n earth: COMMON + RELIEF + EARTH_SURFACE + MAIN,\n};\n\nexport function Planet({\n children,\n className,\n planet = 'mars',\n color,\n terrainColor,\n atmosphereColor,\n atmosphere,\n craters = 0.6,\n cityLights = true,\n stars = 0.6,\n horizon = 0.62,\n speed = 1,\n sun = false,\n sunPosition,\n interactive = true,\n}: PlanetProps) {\n const preset = PLANET_PRESETS[planet] ?? PLANET_PRESETS.mars;\n const surfaceColor = color ?? preset.color;\n const darkColor = terrainColor ?? preset.terrainColor;\n const airColor = atmosphereColor ?? preset.atmosphereColor;\n const density = atmosphere ?? preset.atmosphere;\n\n const canvasRef = useShaderCanvas({\n fragmentShader: SHADERS[planet] ?? SHADERS.mars,\n speed,\n interactive,\n onDraw: ({ gl, uniform }) => {\n const clamp01 = (value: number) => Math.min(1, Math.max(0, value));\n gl.uniform3fv(uniform('uSurface'), hexToLinearRgb(surfaceColor));\n gl.uniform3fv(uniform('uTerrain'), hexToLinearRgb(darkColor));\n gl.uniform3fv(uniform('uAtmosphere'), hexToLinearRgb(airColor));\n gl.uniform1f(uniform('uDensity'), clamp01(density));\n gl.uniform1f(uniform('uCraters'), clamp01(craters));\n gl.uniform1f(uniform('uCityLights'), cityLights ? 1 : 0);\n gl.uniform1f(uniform('uStars'), clamp01(stars));\n gl.uniform1f(uniform('uHorizon'), Math.min(0.95, Math.max(0.05, horizon)));\n gl.uniform1f(uniform('uSun'), sun ? 1 : 0);\n gl.uniform2f(uniform('uSunPos'), clamp01(sunPosition?.x ?? 0.5), clamp01(sunPosition?.y ?? 0.5));\n gl.uniform1f(uniform('uSunFixed'), sunPosition ? 1 : 0);\n },\n });\n\n return (\n <div\n className={cn('elyri-planet', className)}\n data-planet={planet}\n style={\n {\n '--elyri-planet-color': surfaceColor,\n '--elyri-planet-atmosphere': airColor,\n '--elyri-planet-horizon': `${horizon * 100}%`,\n } as CSSProperties\n }\n >\n <canvas ref={canvasRef} className=\"elyri-planet__canvas\" aria-hidden=\"true\" />\n {children != null && <div className=\"elyri-planet__content\">{children}</div>}\n </div>\n );\n}\n","import type { CSSProperties, ReactNode } from 'react';\n\nimport { cn, hexToLinearRgb, useColorScheme, useShaderCanvas } from '../../../core';\n\nimport './SilkWaves.css';\n\nexport interface SilkWavesProps {\n children?: ReactNode;\n className?: string;\n /** 丝绸本体色(hex) */\n color?: string;\n /** 光泽高光色(hex) */\n highlightColor?: string;\n /** 褶皱密度倍率 */\n folds?: number;\n /** 动画速度倍率 */\n speed?: number;\n /** 光源是否跟随指针 */\n interactive?: boolean;\n}\n\n// 丝绸:多组正弦波经过域扭曲叠成连续起伏的高度场,\n// 用柔和漫反射 + 锐利高光 + 线形灯带反射模拟缎面光泽,褶皱谷底做遮蔽。\nconst FRAGMENT_SHADER = `\nprecision highp float;\n\nuniform vec2 uResolution;\nuniform float uTime;\nuniform vec2 uPointer;\nuniform vec3 uBase;\nuniform vec3 uHighlight;\nuniform float uFolds;\nuniform float uScheme;\n\nfloat hash(vec2 p) {\n p = fract(p * vec2(123.34, 456.21));\n p += dot(p, p + 45.32);\n return fract(p.x * p.y);\n}\n\nfloat silk(vec2 p, float t) {\n vec2 q = p;\n q.x += 0.55 * sin(q.y * 1.3 + t * 0.3);\n q.y += 0.45 * sin(q.x * 1.1 - t * 0.25);\n q.x += 0.2 * sin(q.y * 2.3 - t * 0.2);\n return sin(q.x * 1.6 + q.y * 0.9 + t * 0.2) * 0.5\n + sin(q.x * 0.7 - q.y * 1.9 - t * 0.15) * 0.35\n + sin((q.x + q.y) * 2.7 + t * 0.35) * 0.12;\n}\n\nvec3 aces(vec3 x) {\n return clamp((x * (2.51 * x + 0.03)) / (x * (2.43 * x + 0.59) + 0.14), 0.0, 1.0);\n}\n\nvoid main() {\n vec2 frag = vec2(gl_FragCoord.x, uResolution.y - gl_FragCoord.y);\n float minRes = min(uResolution.x, uResolution.y);\n vec2 p = frag / minRes * 2.6 * uFolds;\n float t = uTime;\n\n float e = 0.01;\n float h = silk(p, t);\n vec2 grad = vec2(silk(p + vec2(e, 0.0), t) - silk(p - vec2(e, 0.0), t), silk(p + vec2(0.0, e), t) - silk(p - vec2(0.0, e), t)) / (2.0 * e);\n vec3 n = normalize(vec3(-grad * 0.55, 1.0));\n\n vec3 V = vec3(0.0, 0.0, 1.0);\n vec3 toLight = vec3(uPointer - frag, minRes * 0.7);\n float dist = length(toLight);\n vec3 L = toLight / dist;\n vec3 H = normalize(L + V);\n float atten = 1.0 / (1.0 + 1.2 * pow(dist / minRes, 2.0));\n float NdotL = max(dot(n, L), 0.0);\n float NdotH = max(dot(n, H), 0.0);\n float NdotV = max(n.z, 0.0);\n float fres = pow(1.0 - NdotV, 3.0);\n\n // 褶皱谷底更暗\n float cavity = mix(0.35, 1.0, smoothstep(-1.0, 0.8, h));\n\n vec3 color = uBase * (0.015 + 0.45 * NdotL * NdotL * atten) * cavity;\n color += mix(uBase, uHighlight, 0.5) * pow(NdotH, 14.0) * 0.45 * atten * cavity;\n color += uHighlight * pow(NdotH, 90.0) * 1.1 * atten;\n\n // 线形灯带在褶皱上形成的缎面亮线\n vec3 Rf = reflect(-V, n);\n vec2 toL = (uPointer - frag) / minRes;\n float a = -0.5 + 0.3 * sin(t * 0.13);\n vec2 dir = vec2(cos(a), sin(a));\n float s = dot(Rf.xy, dir) - dot(toL, dir) * 1.1;\n color += uHighlight * (exp(-s * s / 0.004) * 0.9 + exp(-s * s / 0.08) * 0.12) * (0.4 + atten) * cavity;\n color += mix(uBase, uHighlight, 0.3) * fres * 0.25 * cavity;\n\n vec2 vc = frag / uResolution - 0.5;\n float vig = dot(vc, vc);\n\n if (uScheme > 0.5) {\n // 浅色:先色调映射,再做亮暗镜像,保留色相 —— 深底亮纹翻转为浅底深纹\n vec3 c = pow(aces(color * 1.1), vec3(1.0 / 2.2));\n float lum = dot(c, vec3(0.2126, 0.7152, 0.0722));\n color = clamp(c + (1.0 - 2.0 * lum), 0.0, 1.0) * (1.0 - vig * 0.35);\n } else {\n color *= 1.0 - vig * 1.2;\n color = pow(aces(color * 1.1), vec3(1.0 / 2.2));\n }\n\n color += (hash(frag + fract(t)) - 0.5) / 255.0;\n\n gl_FragColor = vec4(color, 1.0);\n}\n`;\n\nexport function SilkWaves({\n children,\n className,\n color = '#9a6424',\n highlightColor = '#ffe3b0',\n folds = 1,\n speed = 1,\n interactive = true,\n}: SilkWavesProps) {\n const scheme = useColorScheme();\n const canvasRef = useShaderCanvas({\n fragmentShader: FRAGMENT_SHADER,\n speed,\n interactive,\n onDraw: ({ gl, uniform }) => {\n gl.uniform3fv(uniform('uBase'), hexToLinearRgb(color));\n gl.uniform3fv(uniform('uHighlight'), hexToLinearRgb(highlightColor));\n gl.uniform1f(uniform('uFolds'), Math.max(0.2, folds));\n gl.uniform1f(uniform('uScheme'), scheme === 'light' ? 1 : 0);\n },\n });\n\n return (\n <div\n className={cn('elyri-silk-waves', className)}\n data-scheme={scheme}\n style={{ '--elyri-silk-waves-color': color } as CSSProperties}\n >\n <canvas ref={canvasRef} className=\"elyri-silk-waves__canvas\" aria-hidden=\"true\" />\n {children != null && <div className=\"elyri-silk-waves__content\">{children}</div>}\n </div>\n );\n}\n","import { useEffect, useRef } from 'react';\nimport type { CSSProperties, ReactNode } from 'react';\n\nimport { cn, hexToLinearRgb, useShaderCanvas } from '../../../core';\n\nimport './Velvet.css';\n\nexport interface VelvetProps {\n children?: ReactNode;\n className?: string;\n /** 丝绒本体色(hex) */\n color?: string;\n /** 绒面光晕色(hex) */\n sheenColor?: string;\n /** 褶皱密度倍率 */\n folds?: number;\n /** 绒毛质感强度,0 为光洁、1 为明显的毛绒颗粒 */\n fuzz?: number;\n /** 四周暗角强度,0 为无暗角 */\n vignette?: number;\n /** 动画速度倍率 */\n speed?: number;\n /** 光源是否跟随指针,指针划过是否留下渐消的压痕 */\n interactive?: boolean;\n}\n\n/** 压痕轨迹点数与消退时长 */\nconst TRAIL = 24;\nconst TRAIL_STEP_MS = 40;\nconst TRAIL_FADE_S = 1.6;\nconst trailData = new Float32Array(TRAIL * 3);\n\n// 丝绒:圆背窄谷的斜向垂坠褶皱缓慢摆动。用 Charlie 绒面分布着色——正对视线处吸光发暗,\n// 褶皱侧面因绒毛掠射散射而泛起柔光;绒光上叠加可调强度的像素级纤维亮点与碎绒明暗。\n// 指针轨迹以线段形式传入,被压倒的绒毛光晕消失、略显光亮,随时间回弹。\nconst FRAGMENT_SHADER = `\nprecision highp float;\n\n#define TRAIL ${TRAIL}\n#define PI 3.14159265\n\nuniform vec2 uResolution;\nuniform float uTime;\nuniform vec2 uPointer;\nuniform vec3 uBase;\nuniform vec3 uSheen;\nuniform float uFolds;\nuniform float uFuzz;\nuniform float uVignette;\nuniform vec3 uTrail[TRAIL];\n\nfloat hash(vec2 p) {\n p = fract(p * vec2(123.34, 456.21));\n p += dot(p, p + 45.32);\n return fract(p.x * p.y);\n}\n\nfloat noise(vec2 p) {\n vec2 i = floor(p);\n vec2 f = fract(p);\n vec2 u = f * f * (3.0 - 2.0 * f);\n return mix(\n mix(hash(i), hash(i + vec2(1.0, 0.0)), u.x),\n mix(hash(i + vec2(0.0, 1.0)), hash(i + vec2(1.0, 1.0)), u.x),\n u.y\n );\n}\n\n// 圆润的褶背 + 收紧的折痕:|sin| 在零点处形成 V 形谷,k 控制谷底锐度\nfloat fold(float s, float k) {\n return sqrt(s * s + k);\n}\n\nfloat drape(vec2 p, float t) {\n // 褶皱沿 x 分布、顺 y 垂下,并随高度缓慢摆动\n float sway = 0.28 * sin(p.y * 0.5 + t * 0.3) + 0.12 * sin(p.y * 1.15 - t * 0.23 + p.x * 0.3);\n float x = p.x + sway;\n float s1 = sin(x * 1.35 + 0.6 * sin(x * 0.37 + t * 0.08));\n float s2 = sin(x * 2.7 + p.y * 0.28 - t * 0.18 + 1.3);\n float h = 0.62 * fold(s1, 0.012) + 0.26 * fold(s2, 0.03);\n // 褶背上的斜向细皱\n h += 0.05 * sin(p.x * 4.0 - p.y * 5.5 + t * 0.25) * s1 * s1;\n h += 0.25 * noise(p * 0.5 + vec2(t * 0.04, -t * 0.03));\n return h;\n}\n\nfloat pressAt(vec2 frag, float minRes) {\n float s = 0.0;\n for (int i = 0; i < TRAIL - 1; i++) {\n vec3 a = uTrail[i];\n vec3 b = uTrail[i + 1];\n float w = min(a.z, b.z);\n if (w <= 0.0) continue;\n vec2 pa = frag - a.xy;\n vec2 ba = b.xy - a.xy;\n float k = clamp(dot(pa, ba) / max(dot(ba, ba), 1e-3), 0.0, 1.0);\n vec2 d = (pa - ba * k) / minRes;\n s = max(s, w * exp(-dot(d, d) * 600.0));\n }\n return s;\n}\n\nvec3 aces(vec3 x) {\n return clamp((x * (2.51 * x + 0.03)) / (x * (2.43 * x + 0.59) + 0.14), 0.0, 1.0);\n}\n\nvoid main() {\n vec2 frag = vec2(gl_FragCoord.x, uResolution.y - gl_FragCoord.y);\n float minRes = min(uResolution.x, uResolution.y);\n vec2 uv = frag / minRes;\n float t = uTime;\n\n // 斜向约 16° 的垂坠\n mat2 rot = mat2(0.96, 0.28, -0.28, 0.96);\n vec2 p = rot * uv * 2.2 * uFolds;\n\n // 中心差分求法线,步长足够小以保留折痕的锐利边缘\n float e = 0.004;\n vec2 ex = vec2(e, 0.0);\n vec2 ey = vec2(0.0, e);\n float h = drape(p, t);\n vec2 grad = vec2(drape(p + ex, t) - drape(p - ex, t), drape(p + ey, t) - drape(p - ey, t)) / (2.0 * e);\n // 梯度转回屏幕坐标系\n grad = grad * rot;\n vec3 n = normalize(vec3(-grad * 0.75, 1.0));\n float NdotV = max(n.z, 1e-3);\n\n float pressed = pressAt(frag, minRes);\n // 绒毛:像素级的纤维亮点,沿垂坠方向略拉长;大块碎绒明暗与之同步受 uFuzz 控制\n vec2 fp = rot * frag;\n float fiber = 0.55 * hash(floor(fp)) + 0.45 * hash(floor(vec2(fp.x * 0.5, fp.y * 0.2)) + 31.0);\n float nap = 1.0 + (noise(p * 0.9 + 3.1) - 0.5) * 0.7 * uFuzz;\n float fuzz = mix(1.0, 0.45 + 1.1 * fiber, uFuzz);\n float ao = mix(0.4, 1.0, smoothstep(0.1, 0.8, h));\n\n // 主光:左上方固定柔光,保证形体稳定可读;辅光:跟随指针的点光\n vec2 ptr = uPointer / minRes;\n vec2 toPtr = ptr - uv;\n vec3 lights[2];\n lights[0] = normalize(vec3(-0.45, -0.55, 0.7));\n lights[1] = normalize(vec3(toPtr, 0.55));\n float power[2];\n power[0] = 1.5;\n power[1] = 1.6 / (1.0 + 3.0 * dot(toPtr, toPtr));\n\n // Charlie 绒面分布:正对光处吸光,掠射角散射出柔光\n const float INV_A = 1.0 / 0.38;\n vec3 color = uBase * 0.03 * ao;\n for (int i = 0; i < 2; i++) {\n vec3 L = lights[i];\n vec3 H = normalize(L + vec3(0.0, 0.0, 1.0));\n float NdotL = max(dot(n, L), 0.0);\n float NdotH = max(dot(n, H), 0.0);\n float sin2 = max(1.0 - NdotH * NdotH, 0.0078125);\n float D = (2.0 + INV_A) * pow(sin2, INV_A * 0.5) / (2.0 * PI);\n float vis = 1.0 / (4.0 * (NdotL + NdotV - NdotL * NdotV) + 1e-3);\n vec3 diffuse = uBase * (0.08 + 0.55 * NdotL) * ao;\n vec3 sheen = uSheen * D * vis * NdotL * nap * mix(fuzz, 1.0, pressed) * (1.0 - 0.85 * pressed);\n // 压倒的绒毛:顺毛方向出现一点缎面般的光泽\n vec3 gloss = mix(uBase, uSheen, 0.6) * pow(NdotH, 40.0) * 0.35 * pressed;\n color += (diffuse * (1.0 - 0.3 * pressed) + sheen + gloss) * power[i];\n }\n\n vec2 vc = frag / uResolution - 0.5;\n color *= max(1.0 - dot(vc, vc) * 1.2 * uVignette, 0.0);\n color = pow(aces(color * 1.2), vec3(1.0 / 2.2));\n color += (hash(frag + fract(t)) - 0.5) / 255.0;\n\n gl_FragColor = vec4(color, 1.0);\n}\n`;\n\ninterface TrailPoint {\n x: number;\n y: number;\n t: number;\n}\n\nexport function Velvet({\n children,\n className,\n color = '#6a1230',\n sheenColor = '#ffb3c8',\n folds = 1,\n fuzz = 0.4,\n vignette = 0.5,\n speed = 1,\n interactive = true,\n}: VelvetProps) {\n const trailRef = useRef<TrailPoint[]>([]);\n\n const canvasRef = useShaderCanvas({\n fragmentShader: FRAGMENT_SHADER,\n speed,\n interactive,\n onDraw: ({ gl, uniform, dpr }) => {\n const now = performance.now();\n trailData.fill(0);\n trailRef.current.forEach((point, i) => {\n const life = Math.max(0, 1 - (now - point.t) / 1000 / TRAIL_FADE_S);\n trailData[i * 3] = point.x * dpr;\n trailData[i * 3 + 1] = point.y * dpr;\n trailData[i * 3 + 2] = life * life;\n });\n gl.uniform3fv(uniform('uBase'), hexToLinearRgb(color));\n gl.uniform3fv(uniform('uSheen'), hexToLinearRgb(sheenColor));\n gl.uniform1f(uniform('uFolds'), Math.max(0.2, folds));\n gl.uniform1f(uniform('uFuzz'), Math.min(1, Math.max(0, fuzz)));\n gl.uniform1f(uniform('uVignette'), Math.min(1, Math.max(0, vignette)));\n gl.uniform3fv(uniform('uTrail'), trailData);\n },\n });\n\n useEffect(() => {\n trailRef.current = [];\n if (!interactive) return;\n\n // 记录相对画布的轨迹:每 40ms 落一个点,期间只更新末端位置,保证笔触连贯\n const handlePointerMove = (event: PointerEvent) => {\n const rect = canvasRef.current?.getBoundingClientRect();\n if (!rect) return;\n const x = event.clientX - rect.left;\n const y = event.clientY - rect.top;\n const trail = trailRef.current;\n const now = performance.now();\n const last = trail[trail.length - 1];\n if (last && now - last.t < TRAIL_STEP_MS) {\n last.x = x;\n last.y = y;\n return;\n }\n trail.push({ x, y, t: now });\n if (trail.length > TRAIL) trail.shift();\n };\n\n window.addEventListener('pointermove', handlePointerMove, { passive: true });\n return () => window.removeEventListener('pointermove', handlePointerMove);\n }, [interactive, canvasRef]);\n\n return (\n <div className={cn('elyri-velvet', className)} style={{ '--elyri-velvet-color': color } as CSSProperties}>\n <canvas ref={canvasRef} className=\"elyri-velvet__canvas\" aria-hidden=\"true\" />\n {children != null && <div className=\"elyri-velvet__content\">{children}</div>}\n </div>\n );\n}\n","import { useEffect, useRef, useState } from 'react';\nimport type { CSSProperties } from 'react';\n\nimport { cn, useColorScheme, usePrefersReducedMotion } from '../../../core';\n\nimport './AsciiImage.css';\n\nexport interface AsciiImageProps {\n /** 图片地址。跨域图片需服务端允许 CORS,否则无法读取像素,会退回显示原图 */\n src: string;\n /** 替代文本,提供给读屏软件 */\n alt?: string;\n className?: string;\n /** 每行字符数,越大细节越多 */\n columns?: number;\n /** 字符梯度,从稀疏到密集排列 */\n characters?: string;\n /** 是否按原图像素着色 */\n colored?: boolean;\n /** 单色模式下的字符颜色,默认继承文字颜色;也可用 CSS 变量 --elyri-ascii-color 覆盖 */\n color?: string;\n /** 反转明暗映射(默认深色主题下亮处字符密集,浅色主题下暗处字符密集) */\n invert?: boolean;\n /** 进入视口时是否自上而下解码显现 */\n animated?: boolean;\n /** 显现动画时长(毫秒) */\n duration?: number;\n /** 是否有一道斜向高光周期性扫过 */\n shimmer?: boolean;\n /** 每帧随机闪烁的字符比例(0-1),0 为关闭 */\n flicker?: number;\n /** 指针附近的字符是否被推开、提亮并乱码 */\n interactive?: boolean;\n /** 指针影响半径(CSS 像素) */\n radius?: number;\n}\n\ninterface Cell {\n /** 字符格左上角坐标 */\n x: number;\n y: number;\n /** 字符在梯度中的下标 */\n glyph: number;\n r: number;\n g: number;\n b: number;\n /** 开始显现的进度阈值 */\n threshold: number;\n /** 沿高光扫过方向的归一化坐标 */\n diagonal: number;\n}\n\nconst DEFAULT_CHARACTERS = ' .:-=+*#%@';\n/** 解码时先显示乱码的进度窗口 */\nconst SCRAMBLE_WINDOW = 0.08;\n/** 持续动效的帧间隔,字符画无需满帧 */\nconst FRAME_INTERVAL = 1000 / 40;\n/** 高光扫过一次的周期(秒)与光带半宽 */\nconst SHIMMER_PERIOD = 4.5;\nconst SHIMMER_WIDTH = 0.07;\n\nexport function AsciiImage({\n src,\n alt = '',\n className,\n columns = 100,\n characters = DEFAULT_CHARACTERS,\n colored = false,\n color,\n invert = false,\n animated = true,\n duration = 1200,\n shimmer = true,\n flicker = 0.01,\n interactive = true,\n radius = 90,\n}: AsciiImageProps) {\n const rootRef = useRef<HTMLDivElement>(null);\n const canvasRef = useRef<HTMLCanvasElement>(null);\n const prefersReducedMotion = usePrefersReducedMotion();\n const scheme = useColorScheme();\n const [image, setImage] = useState<HTMLImageElement | null>(null);\n const [failed, setFailed] = useState(false);\n const [width, setWidth] = useState(0);\n const [inView, setInView] = useState(false);\n // 只播放一次显现动画,之后尺寸、参数或可见性变化直接进入持续动效\n const playedRef = useRef(false);\n\n useEffect(() => {\n let disposed = false;\n const img = new Image();\n img.crossOrigin = 'anonymous';\n img.decoding = 'async';\n img.onload = () => {\n if (disposed) return;\n // 跨域图片未开启 CORS 时画布被污染,无法读取像素,改为显示原图\n const probe = document.createElement('canvas').getContext('2d');\n try {\n probe?.drawImage(img, 0, 0, 1, 1);\n probe?.getImageData(0, 0, 1, 1);\n } catch {\n setFailed(true);\n return;\n }\n setFailed(false);\n setImage(img);\n };\n img.onerror = () => {\n if (!disposed) setFailed(true);\n };\n img.src = src;\n return () => {\n disposed = true;\n };\n }, [src]);\n\n useEffect(() => {\n const root = rootRef.current;\n if (!root) return;\n\n const resize = new ResizeObserver(([entry]) => setWidth(Math.round(entry.contentRect.width)));\n // 持续跟踪可见性,离屏时停止动效\n const intersection = new IntersectionObserver(([entry]) => setInView(entry.isIntersecting));\n resize.observe(root);\n intersection.observe(root);\n\n return () => {\n resize.disconnect();\n intersection.disconnect();\n };\n }, []);\n\n useEffect(() => {\n const root = rootRef.current;\n const canvas = canvasRef.current;\n const ctx = canvas?.getContext('2d');\n if (!root || !canvas || !ctx || !image || !width || !image.naturalWidth) return;\n\n const style = getComputedStyle(root);\n const ramp = Array.from(characters || DEFAULT_CHARACTERS);\n const cols = Math.min(400, Math.max(8, Math.round(columns)));\n const font = (size: number) => `${style.fontWeight} ${size}px ${style.fontFamily}`;\n\n // 按等宽字体实际字宽反推字号,让每行恰好铺满容器宽度;行高等于字号\n ctx.font = font(100);\n const cellW = width / cols;\n const fontSize = (cellW * 100) / ctx.measureText('M').width;\n const cellH = fontSize;\n const rows = Math.max(1, Math.round(((cols * image.naturalHeight) / image.naturalWidth) * (cellW / cellH)));\n const height = rows * cellH;\n\n // 把图片缩放到 cols × rows,每个像素对应一个字符格\n const sampler = document.createElement('canvas');\n sampler.width = cols;\n sampler.height = rows;\n const sctx = sampler.getContext('2d', { willReadFrequently: true });\n if (!sctx) return;\n sctx.imageSmoothingQuality = 'high';\n sctx.drawImage(image, 0, 0, cols, rows);\n\n let data: Uint8ClampedArray;\n try {\n data = sctx.getImageData(0, 0, cols, rows).data;\n } catch {\n // 加载时已校验过可读性,这里仅作兜底\n return;\n }\n\n // 深色主题下亮处字符密集,浅色主题下暗处字符密集,保证字符与背景形成对比\n const light = scheme === 'light';\n const flip = light !== invert;\n // 只保留非空白格:透明或最稀疏处始终留白,动效不会越出图形轮廓\n const cells: Cell[] = [];\n for (let i = 0; i < cols * rows; i++) {\n const r = data[i * 4];\n const g = data[i * 4 + 1];\n const b = data[i * 4 + 2];\n const a = data[i * 4 + 3] / 255;\n const lum = (0.2126 * r + 0.7152 * g + 0.0722 * b) / 255;\n const glyph = Math.min(ramp.length - 1, Math.floor((flip ? 1 - lum : lum) * a * ramp.length));\n if (!ramp[glyph].trim()) continue;\n const col = i % cols;\n const row = Math.floor(i / cols);\n cells.push({\n x: col * cellW,\n y: row * cellH,\n glyph,\n r,\n g,\n b,\n // 自上而下显现,并带少许随机错落\n threshold: (row / rows) * (1 - SCRAMBLE_WINDOW - 0.2) + Math.random() * 0.2,\n diagonal: (col / cols + row / rows) / 2,\n });\n }\n\n const dpr = Math.min(window.devicePixelRatio || 1, 2);\n canvas.width = Math.round(width * dpr);\n canvas.height = Math.round(height * dpr);\n canvas.style.height = `${height}px`;\n\n const noise = ramp.filter((char) => char.trim());\n const fill = style.getPropertyValue('--elyri-ascii-color').trim() || style.color;\n // 高光在深色主题下偏白,浅色主题下偏黑,始终朝着更醒目的方向\n const highlight = light ? 0 : 255;\n const lift = Math.min(3, ramp.length - 1);\n const flickerRate = Math.min(1, Math.max(0, flicker));\n const reach = Math.max(1, radius);\n const motion = !prefersReducedMotion;\n const lens = motion && interactive;\n const pointer = { x: 0, y: 0, strength: 0, target: 0, tx: 0, ty: 0 };\n\n const draw = (progress: number, time: number) => {\n ctx.setTransform(dpr, 0, 0, dpr, 0, 0);\n ctx.clearRect(0, 0, width, height);\n ctx.font = font(fontSize);\n ctx.textBaseline = 'top';\n ctx.fillStyle = fill;\n\n // 光带中心从左上外侧扫到右下外侧,之后留一段空档\n const band = motion && shimmer ? ((time / SHIMMER_PERIOD) % 1) * 1.8 - 0.4 : -10;\n\n for (const cell of cells) {\n let char = ramp[cell.glyph];\n if (progress < 1) {\n if (progress < cell.threshold) continue;\n // 刚进入显现窗口的格子先闪烁随机字符,再定格\n if (progress < cell.threshold + SCRAMBLE_WINDOW) char = noise[Math.floor(Math.random() * noise.length)];\n }\n\n const offset = (cell.diagonal - band) / SHIMMER_WIDTH;\n let boost = offset > -3 && offset < 3 ? Math.exp(-offset * offset) : 0;\n let x = cell.x;\n let y = cell.y;\n\n if (pointer.strength > 0.01) {\n const dx = x + cellW / 2 - pointer.x;\n const dy = y + cellH / 2 - pointer.y;\n const d = Math.hypot(dx, dy);\n if (d < reach) {\n const t = (1 - d / reach) * pointer.strength;\n // 指针处的字符被推开,形成一圈凸起的透镜\n const push = t * t * cellW * 2.2;\n if (d > 0.01) {\n x += (dx / d) * push;\n y += (dy / d) * push;\n }\n boost = Math.max(boost, t);\n if (Math.random() < t * 0.35) char = noise[Math.floor(Math.random() * noise.length)];\n }\n }\n\n if (boost > 0.05) char = ramp[Math.min(ramp.length - 1, cell.glyph + Math.round(boost * lift))];\n if (flickerRate && Math.random() < flickerRate) char = noise[Math.floor(Math.random() * noise.length)];\n\n ctx.globalAlpha = 0.82 + 0.18 * boost;\n if (colored) {\n const mix = boost * 0.6;\n ctx.fillStyle = `rgb(${cell.r + (highlight - cell.r) * mix},${cell.g + (highlight - cell.g) * mix},${cell.b + (highlight - cell.b) * mix})`;\n }\n ctx.fillText(char, x, y);\n }\n ctx.globalAlpha = 1;\n };\n\n // 减弱动态效果时只画静止成品\n if (!motion) {\n draw(1, 0);\n return;\n }\n const reveal = animated && !playedRef.current;\n // 未进入视口前:需要显现的保持空白,否则画出成品\n if (!inView) {\n draw(reveal ? 0 : 1, 0);\n return;\n }\n\n const continuous = shimmer || flickerRate > 0 || lens;\n const start = performance.now();\n let frame = 0;\n let last = 0;\n\n const tick = (now: number) => {\n frame = requestAnimationFrame(tick);\n if (now - last < FRAME_INTERVAL) return;\n const dt = last ? Math.min((now - last) / 1000, 0.1) : 0;\n last = now;\n\n const progress = reveal ? Math.min(1, (now - start) / Math.max(1, duration)) : 1;\n if (progress >= 1) playedRef.current = true;\n\n // 指针位置与强度都做平滑,进出时透镜渐显渐隐\n const ease = 1 - Math.exp(-dt * 12);\n pointer.x += (pointer.tx - pointer.x) * ease;\n pointer.y += (pointer.ty - pointer.y) * ease;\n pointer.strength += (pointer.target - pointer.strength) * (1 - Math.exp(-dt * 6));\n\n draw(progress, (now - start) / 1000);\n if (!continuous && progress >= 1) cancelAnimationFrame(frame);\n };\n frame = requestAnimationFrame(tick);\n\n const handlePointerMove = (event: PointerEvent) => {\n const rect = canvas.getBoundingClientRect();\n const x = event.clientX - rect.left;\n const y = event.clientY - rect.top;\n const inside = x >= -reach && y >= -reach && x <= rect.width + reach && y <= rect.height + reach;\n // 首次进入时直接跳到指针处,避免透镜从角落滑过来\n if (inside && pointer.target === 0 && pointer.strength < 0.01) {\n pointer.x = x;\n pointer.y = y;\n }\n pointer.tx = x;\n pointer.ty = y;\n pointer.target = inside ? 1 : 0;\n };\n const handlePointerLeave = () => {\n pointer.target = 0;\n };\n if (lens) {\n window.addEventListener('pointermove', handlePointerMove, { passive: true });\n document.documentElement.addEventListener('pointerleave', handlePointerLeave);\n }\n\n return () => {\n cancelAnimationFrame(frame);\n window.removeEventListener('pointermove', handlePointerMove);\n document.documentElement.removeEventListener('pointerleave', handlePointerLeave);\n };\n }, [\n image,\n width,\n columns,\n characters,\n colored,\n color,\n invert,\n scheme,\n animated,\n duration,\n shimmer,\n flicker,\n interactive,\n radius,\n inView,\n prefersReducedMotion,\n ]);\n\n const style = (color ? { '--elyri-ascii-color': color } : undefined) as CSSProperties | undefined;\n\n return (\n <div ref={rootRef} className={cn('elyri-ascii-image', className)} style={style}>\n {failed ? (\n <img className=\"elyri-ascii-image__fallback\" src={src} alt={alt} />\n ) : (\n <canvas\n ref={canvasRef}\n className=\"elyri-ascii-image__canvas\"\n role={alt ? 'img' : undefined}\n aria-label={alt || undefined}\n aria-hidden={alt ? undefined : true}\n />\n )}\n </div>\n );\n}\n","import type { CSSProperties, ReactNode } from 'react';\n\nimport { cn } from '../../../core';\n\nimport './GradientText.css';\n\nexport interface GradientTextProps {\n children: ReactNode;\n className?: string;\n colors?: string[];\n animated?: boolean;\n /** 流动动画速度倍率 */\n speed?: number;\n}\n\nexport function GradientText({ children, className, colors, animated = true, speed = 0.5 }: GradientTextProps) {\n const style = {\n ...(colors?.length ? { '--elyri-gradient-colors': colors.join(', ') } : null),\n '--elyri-gradient-speed': speed,\n } as CSSProperties;\n\n return (\n <span className={cn('elyri-gradient-text', animated && 'elyri-gradient-text--animated', className)} style={style}>\n {children}\n </span>\n );\n}\n","import { useEffect, useRef, useState } from 'react';\nimport type { CSSProperties, ReactNode } from 'react';\n\nimport { cn, usePrefersReducedMotion } from '../../../core';\n\nimport './Marquee.css';\n\nexport type MarqueeDirection = 'left' | 'right' | 'up' | 'down';\n\nexport interface MarqueeProps {\n /** 循环滚动的内容,任意节点,会被复制多份以形成无缝循环 */\n children: ReactNode;\n className?: string;\n /** 滚动方向 */\n direction?: MarqueeDirection;\n /** 跑完一轮所需的秒数,数值越大越慢 */\n duration?: number;\n /** 最少重复份数;实际份数会按容器尺寸自动补足,保证循环无缝 */\n repeat?: number;\n /** 每份内容之间的间距,单位 px */\n gap?: number;\n /** 是否无限重复播放,关闭时只播放一轮 */\n infinite?: boolean;\n /** 鼠标悬停时是否暂停 */\n pauseOnHover?: boolean;\n}\n\nexport function Marquee({\n children,\n className,\n direction = 'left',\n duration = 20,\n repeat = 2,\n gap = 0,\n infinite = true,\n pauseOnHover = true,\n}: MarqueeProps) {\n const rootRef = useRef<HTMLDivElement>(null);\n const trackRef = useRef<HTMLDivElement>(null);\n const [paused, setPaused] = useState(false);\n const prefersReducedMotion = usePrefersReducedMotion();\n const minCopies = Math.max(2, Math.floor(repeat));\n const [copies, setCopies] = useState(minCopies);\n const vertical = direction === 'up' || direction === 'down';\n const reverse = direction === 'right' || direction === 'down';\n\n // 份数不足时轨道会短于容器,循环到末尾会露白;按容器尺寸补足份数\n useEffect(() => {\n const root = rootRef.current;\n const track = trackRef.current;\n if (!root || !track) return;\n\n const measure = () => {\n const first = track.firstElementChild as HTMLElement | null;\n if (!first) return;\n\n const copySize = vertical ? first.offsetHeight : first.offsetWidth;\n const rootSize = vertical ? root.clientHeight : root.clientWidth;\n const trackSize = vertical ? track.offsetHeight : track.offsetWidth;\n if (!copySize) return;\n\n // 纵向未限制高度时容器与轨道等高、没有可视窗口,保持最小份数\n if (vertical && rootSize >= trackSize) {\n setCopies(minCopies);\n return;\n }\n\n // 轨道至少覆盖「容器 + 一份内容」,这样每一帧都有内容填满窗口\n setCopies(Math.max(minCopies, Math.ceil((rootSize + copySize) / copySize)));\n };\n\n const observer = new ResizeObserver(measure);\n observer.observe(root);\n if (track.firstElementChild) observer.observe(track.firstElementChild);\n return () => observer.disconnect();\n }, [vertical, minCopies]);\n\n // 离开视口或页面切到后台时暂停动画,避免无谓的合成开销与耗电\n useEffect(() => {\n const node = rootRef.current;\n if (!node || prefersReducedMotion) return;\n\n let inView = true;\n const sync = () => setPaused(!inView || document.hidden);\n\n const observer = new IntersectionObserver(([entry]) => {\n inView = entry.isIntersecting;\n sync();\n });\n observer.observe(node);\n document.addEventListener('visibilitychange', sync);\n\n return () => {\n observer.disconnect();\n document.removeEventListener('visibilitychange', sync);\n };\n }, [prefersReducedMotion]);\n\n return (\n <div\n ref={rootRef}\n className={cn(\n 'elyri-marquee',\n vertical && 'elyri-marquee--vertical',\n reverse && 'elyri-marquee--reverse',\n !infinite && 'elyri-marquee--once',\n paused && 'elyri-marquee--paused',\n pauseOnHover && 'elyri-marquee--pausable',\n prefersReducedMotion && 'elyri-marquee--static',\n className,\n )}\n style={\n {\n '--elyri-marquee-duration': `${duration}s`,\n '--elyri-marquee-repeat': copies,\n '--elyri-marquee-gap': `${gap}px`,\n } as CSSProperties\n }\n >\n <div ref={trackRef} className=\"elyri-marquee__track\">\n {Array.from({ length: copies }, (_, index) => (\n // 复制份仅用于视觉衔接,对辅助技术隐藏,避免重复朗读\n <div key={index} className=\"elyri-marquee__copy\" aria-hidden={index > 0 ? true : undefined}>\n {children}\n </div>\n ))}\n </div>\n </div>\n );\n}\n","import { useEffect, useRef, useState } from 'react';\nimport type { CSSProperties } from 'react';\n\nimport { cn, useColorScheme, usePrefersReducedMotion } from '../../../core';\n\nimport './ParticleText.css';\n\nexport interface ParticleTextProps {\n /** 由粒子组成的文本,仅支持纯字符串,可用 \\n 换行 */\n children: string;\n className?: string;\n /** 粒子颜色,默认继承文字颜色;也可用 CSS 变量 --elyri-particle-color 覆盖 */\n color?: string;\n /** 单个粒子边长(CSS 像素) */\n particleSize?: number;\n /** 采样间距(CSS 像素),越小粒子越密 */\n gap?: number;\n /** 指针排斥半径(CSS 像素),0 为关闭交互 */\n radius?: number;\n /** 排斥力度倍率 */\n force?: number;\n /** 首次进入视口时粒子是否从四周飞入聚合成字 */\n assemble?: boolean;\n}\n\ninterface Particle {\n x: number;\n y: number;\n vx: number;\n vy: number;\n tx: number;\n ty: number;\n /** 回弹刚度,每颗略有差异,聚合时先后到位更自然 */\n k: number;\n}\n\ntype Context2D = CanvasRenderingContext2D & { letterSpacing?: string };\n\nconst FRICTION = 0.86;\n\nexport function ParticleText({\n children,\n className,\n color,\n particleSize = 2,\n gap = 3,\n radius = 80,\n force = 1,\n assemble = true,\n}: ParticleTextProps) {\n const rootRef = useRef<HTMLSpanElement>(null);\n const canvasRef = useRef<HTMLCanvasElement>(null);\n const prefersReducedMotion = usePrefersReducedMotion();\n const scheme = useColorScheme();\n const [ready, setReady] = useState(false);\n\n // 跨重建保留粒子,字体加载、尺寸或文本变化时从当前位置流向新字形,而不是重新播放聚合\n const particlesRef = useRef<Particle[]>([]);\n const padRef = useRef(0);\n const optionsRef = useRef({ particleSize, force });\n const wakeRef = useRef<(() => void) | null>(null);\n\n useEffect(() => {\n optionsRef.current = { particleSize, force };\n wakeRef.current?.();\n }, [particleSize, force, color, scheme]);\n\n useEffect(() => {\n const root = rootRef.current;\n const canvas = canvasRef.current;\n const ctx = canvas?.getContext('2d');\n if (!root || !canvas || !ctx) return;\n\n const style = getComputedStyle(root);\n const interactive = radius > 0 && !prefersReducedMotion;\n const pointer = { x: 0, y: 0, active: false };\n let width = 0;\n let height = 0;\n let dpr = 1;\n let visible = false;\n let running = false;\n let frame = 0;\n let buildFrame = 0;\n let last = 0;\n let lastColor = '';\n\n const build = () => {\n const w = root.offsetWidth;\n const h = root.offsetHeight;\n if (!w || !h) return;\n\n // 画布四周留出排斥半径,被推开的粒子不会被裁掉\n const pad = Math.ceil(Math.max(radius, 0) + 16);\n dpr = Math.min(window.devicePixelRatio || 1, 2);\n width = w + pad * 2;\n height = h + pad * 2;\n canvas.width = Math.round(width * dpr);\n canvas.height = Math.round(height * dpr);\n canvas.style.width = `${width}px`;\n canvas.style.height = `${height}px`;\n canvas.style.left = canvas.style.top = `${-pad}px`;\n\n // 在离屏画布上按元素的实际字体绘制文字,再按间距采样不透明像素作为粒子目标点\n const sampler = document.createElement('canvas');\n sampler.width = Math.ceil(w);\n sampler.height = Math.ceil(h);\n const sctx = sampler.getContext('2d', { willReadFrequently: true }) as Context2D | null;\n if (!sctx) return;\n\n sctx.font = `${style.fontStyle} ${style.fontWeight} ${style.fontSize} ${style.fontFamily}`;\n if ('letterSpacing' in sctx) sctx.letterSpacing = style.letterSpacing === 'normal' ? '0px' : style.letterSpacing;\n const align = style.textAlign;\n const alignRight = align === 'right' || align === 'end';\n sctx.textAlign = align === 'center' ? 'center' : alignRight ? 'right' : 'left';\n const originX = align === 'center' ? w / 2 : alignRight ? w : 0;\n\n const lines = children.split('\\n');\n const lineHeight = h / lines.length;\n lines.forEach((line, index) => {\n const m = sctx.measureText(line);\n const ascent = m.fontBoundingBoxAscent ?? m.actualBoundingBoxAscent;\n const descent = m.fontBoundingBoxDescent ?? m.actualBoundingBoxDescent;\n sctx.fillText(line, originX, index * lineHeight + (lineHeight - ascent - descent) / 2 + ascent);\n });\n\n const data = sctx.getImageData(0, 0, sampler.width, sampler.height).data;\n const step = Math.max(1, gap);\n const targets: [number, number][] = [];\n for (let y = step / 2; y < sampler.height; y += step) {\n for (let x = step / 2; x < sampler.width; x += step) {\n if (data[(Math.floor(y) * sampler.width + Math.floor(x)) * 4 + 3] > 128) targets.push([x + pad, y + pad]);\n }\n }\n // 打乱顺序,文本变化时粒子交错流动而非整行平移\n for (let i = targets.length - 1; i > 0; i--) {\n const j = Math.floor(Math.random() * (i + 1));\n [targets[i], targets[j]] = [targets[j], targets[i]];\n }\n\n const prev = particlesRef.current;\n const shift = pad - padRef.current;\n const scatter = assemble && !prefersReducedMotion && prev.length === 0;\n particlesRef.current = targets.map(([tx, ty], index) => {\n const k = 0.03 + Math.random() * 0.04;\n if (prefersReducedMotion) return { x: tx, y: ty, vx: 0, vy: 0, tx, ty, k };\n const source = prev[index] ?? (prev.length ? prev[Math.floor(Math.random() * prev.length)] : null);\n if (source) return { x: source.x + shift, y: source.y + shift, vx: source.vx, vy: source.vy, tx, ty, k };\n if (scatter) return { x: Math.random() * width, y: Math.random() * height, vx: 0, vy: 0, tx, ty, k };\n return { x: tx, y: ty, vx: 0, vy: 0, tx, ty, k };\n });\n padRef.current = pad;\n lastColor = '';\n setReady(true);\n wake();\n };\n\n const tick = (now: number) => {\n const dt = Math.min((now - last) / 16.667, 3);\n last = now;\n const { particleSize: size, force: strength } = optionsRef.current;\n const damping = Math.pow(FRICTION, dt);\n const r2 = radius * radius;\n const push = Math.max(0, strength) * 3 * dt;\n let active = false;\n\n for (const p of particlesRef.current) {\n p.vx += (p.tx - p.x) * p.k * dt;\n p.vy += (p.ty - p.y) * p.k * dt;\n\n if (pointer.active) {\n const dx = p.x - pointer.x;\n const dy = p.y - pointer.y;\n const d2 = dx * dx + dy * dy;\n if (d2 < r2 && d2 > 0.01) {\n const d = Math.sqrt(d2);\n const f = (1 - d / radius) * push;\n p.vx += (dx / d) * f;\n p.vy += (dy / d) * f;\n }\n }\n\n p.vx *= damping;\n p.vy *= damping;\n p.x += p.vx * dt;\n p.y += p.vy * dt;\n if (!active && Math.abs(p.vx) + Math.abs(p.vy) + Math.abs(p.tx - p.x) + Math.abs(p.ty - p.y) > 0.05) {\n active = true;\n }\n }\n\n // 优先使用 color 属性写入的 CSS 变量,否则跟随文字颜色(主题切换时自动更新)\n const fill = style.getPropertyValue('--elyri-particle-color').trim() || style.color;\n if (fill !== lastColor) {\n lastColor = fill;\n active = true;\n }\n\n ctx.setTransform(dpr, 0, 0, dpr, 0, 0);\n ctx.clearRect(0, 0, width, height);\n ctx.fillStyle = fill;\n const half = size / 2;\n for (const p of particlesRef.current) ctx.fillRect(p.x - half, p.y - half, size, size);\n\n // 全部静止且指针不在附近时停帧,省电\n if (visible && (active || pointer.active)) {\n frame = requestAnimationFrame(tick);\n } else {\n running = false;\n }\n };\n\n function wake() {\n if (running || !visible) return;\n running = true;\n last = performance.now();\n frame = requestAnimationFrame(tick);\n }\n wakeRef.current = wake;\n\n const scheduleBuild = () => {\n cancelAnimationFrame(buildFrame);\n buildFrame = requestAnimationFrame(build);\n };\n\n const handlePointerMove = (event: PointerEvent) => {\n const rect = canvas.getBoundingClientRect();\n const x = event.clientX - rect.left;\n const y = event.clientY - rect.top;\n const inside = x >= 0 && y >= 0 && x <= rect.width && y <= rect.height;\n if (!inside && !pointer.active) return;\n pointer.x = x;\n pointer.y = y;\n pointer.active = inside;\n wake();\n };\n const handlePointerLeave = () => {\n pointer.active = false;\n };\n\n const intersection = new IntersectionObserver(([entry]) => {\n visible = entry.isIntersecting;\n if (visible) wake();\n });\n const resize = new ResizeObserver(scheduleBuild);\n intersection.observe(root);\n resize.observe(root);\n document.fonts?.addEventListener('loadingdone', scheduleBuild);\n if (interactive) {\n window.addEventListener('pointermove', handlePointerMove, { passive: true });\n document.documentElement.addEventListener('pointerleave', handlePointerLeave);\n }\n build();\n\n return () => {\n cancelAnimationFrame(frame);\n cancelAnimationFrame(buildFrame);\n intersection.disconnect();\n resize.disconnect();\n document.fonts?.removeEventListener('loadingdone', scheduleBuild);\n window.removeEventListener('pointermove', handlePointerMove);\n document.documentElement.removeEventListener('pointerleave', handlePointerLeave);\n wakeRef.current = null;\n };\n }, [children, gap, radius, assemble, prefersReducedMotion]);\n\n const style = (color ? { '--elyri-particle-color': color } : undefined) as CSSProperties | undefined;\n\n return (\n <span\n ref={rootRef}\n className={cn('elyri-particle-text', ready && 'elyri-particle-text--ready', className)}\n style={style}\n >\n {/* 真实文本负责排版尺寸与读屏,粒子就绪后才隐藏;服务端渲染与脚本未执行时仍可见 */}\n <span className=\"elyri-particle-text__label\">{children}</span>\n <canvas ref={canvasRef} className=\"elyri-particle-text__canvas\" aria-hidden=\"true\" />\n </span>\n );\n}\n","import { useEffect, useLayoutEffect, useRef, useState } from 'react';\nimport type { CSSProperties } from 'react';\n\nimport { cn, usePrefersReducedMotion } from '../../../core';\n\nimport './RotatingText.css';\n\n/** 相邻字符进出动画的间隔(毫秒) */\nconst CHAR_STAGGER = 30;\n\nexport interface RotatingTextProps {\n /** 轮播的词语列表,至少一个 */\n words: string[];\n className?: string;\n /** 每个词的停留时长(毫秒) */\n interval?: number;\n /** 单词翻转进出的动画时长(毫秒) */\n duration?: number;\n /** 切换效果:flip 为 3D 翻转字符;block 为圆角色块包裹文字,块宽随词伸缩 */\n variant?: 'flip' | 'block';\n}\n\n/** 词语轮换:多个词依次翻转切换,容器宽度随词宽平滑过渡 */\nexport function RotatingText({\n words,\n className,\n interval = 2500,\n duration = 500,\n variant = 'flip',\n}: RotatingTextProps) {\n const [index, setIndex] = useState(0);\n const [leaving, setLeaving] = useState<string | null>(null);\n const [width, setWidth] = useState<number>();\n const wordRef = useRef<HTMLSpanElement>(null);\n const prefersReducedMotion = usePrefersReducedMotion();\n\n // words 变化时在渲染期间直接重置,从头开始轮播\n const [prevWords, setPrevWords] = useState(words);\n if (prevWords !== words) {\n setPrevWords(words);\n setIndex(0);\n setLeaving(null);\n }\n\n const count = words.length;\n const current = words[index] ?? words[0] ?? '';\n\n useEffect(() => {\n if (count < 2) return;\n\n const timer = window.setInterval(() => {\n // 减弱动态效果时直接替换,不播离场动画\n setLeaving(prefersReducedMotion ? null : current);\n setIndex((value) => (value + 1) % count);\n }, interval);\n\n return () => window.clearInterval(timer);\n }, [count, current, interval, prefersReducedMotion]);\n\n // 离场词在动画结束后移除\n useEffect(() => {\n if (leaving == null) return;\n\n const timer = window.setTimeout(() => setLeaving(null), duration + CHAR_STAGGER * leaving.length);\n return () => window.clearTimeout(timer);\n }, [leaving, duration]);\n\n // 容器宽度跟随当前词宽,配合 CSS transition 平滑伸缩\n useLayoutEffect(() => {\n const word = wordRef.current;\n if (word) setWidth(word.offsetWidth);\n }, [current]);\n\n const style = {\n '--elyri-rotating-text-duration': `${duration}ms`,\n width: width != null ? `${width}px` : undefined,\n } as CSSProperties;\n\n const renderChars = (word: string) =>\n Array.from(word).map((char, charIndex) => (\n <span\n key={`${char}-${charIndex}`}\n className=\"elyri-rotating-text__char\"\n style={\n {\n '--elyri-rotating-text-index': charIndex,\n '--elyri-rotating-text-stagger': `${CHAR_STAGGER}ms`,\n } as CSSProperties\n }\n aria-hidden=\"true\"\n >\n {char === ' ' ? '\\u00A0' : char}\n </span>\n ));\n\n return (\n <span\n className={cn('elyri-rotating-text', variant !== 'flip' && `elyri-rotating-text--${variant}`, className)}\n style={style}\n aria-label={current}\n >\n <span ref={wordRef} className=\"elyri-rotating-text__word elyri-rotating-text__word--entering\">\n {renderChars(current)}\n </span>\n {leaving != null && (\n <span className=\"elyri-rotating-text__word elyri-rotating-text__word--leaving\" aria-hidden=\"true\">\n {renderChars(leaving)}\n </span>\n )}\n </span>\n );\n}\n","import { useEffect, useMemo, useRef, useState } from 'react';\nimport type { CSSProperties } from 'react';\n\nimport { cn, usePrefersReducedMotion } from '../../../core';\n\nimport './ScrambleText.css';\n\nexport type ScrambleTextTrigger = 'view' | 'hover';\n\nexport interface ScrambleTextProps {\n /** 需要解码显现的文本,仅支持纯字符串 */\n children: string;\n className?: string;\n /** 触发方式:进入视口或指针悬停 */\n trigger?: ScrambleTextTrigger;\n /** 乱码刷新间隔(毫秒) */\n speed?: number;\n /** 相邻字符依次定格的间隔(毫秒) */\n stagger?: number;\n /** 乱码字符池 */\n characters?: string;\n /** 乱码字符的强调色 */\n accentColor?: string;\n /** 乱码辉光强度倍率,0 为关闭,默认 1 */\n glow?: number;\n /** 视口模式下是否只在首次进入时触发 */\n once?: boolean;\n}\n\ninterface Frame {\n chars: string[];\n resolved: number;\n}\n\nconst DEFAULT_CHARACTERS = 'ABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789!<>-_\\\\/[]{}=+*^?#';\n\nconst isSpace = (char: string) => /\\s/.test(char);\n\nexport function ScrambleText({\n children,\n className,\n trigger = 'view',\n speed = 40,\n stagger = 60,\n characters = DEFAULT_CHARACTERS,\n accentColor,\n glow,\n once = true,\n}: ScrambleTextProps) {\n const elementRef = useRef<HTMLSpanElement>(null);\n const prefersReducedMotion = usePrefersReducedMotion();\n // 每次自增代表重新播放一轮解码\n const [runId, setRunId] = useState(0);\n const [frame, setFrame] = useState<Frame | null>(null);\n\n const chars = useMemo(() => Array.from(children), [children]);\n\n useEffect(() => {\n const element = elementRef.current;\n if (!element || prefersReducedMotion || trigger !== 'view') return;\n\n const observer = new IntersectionObserver(\n ([entry]) => {\n if (!entry.isIntersecting) return;\n setRunId((id) => id + 1);\n if (once) observer.disconnect();\n },\n { threshold: 0.1 },\n );\n\n observer.observe(element);\n\n return () => observer.disconnect();\n }, [trigger, once, prefersReducedMotion]);\n\n useEffect(() => {\n if (runId === 0 || prefersReducedMotion) return;\n\n const pool = Array.from(characters || DEFAULT_CHARACTERS);\n const start = performance.now();\n\n // 按经过时间决定已定格的字符数,其余位置刷新为随机字符;返回是否已全部定格\n const step = () => {\n const resolved = Math.floor((performance.now() - start) / stagger);\n\n if (resolved >= chars.length) {\n setFrame(null);\n return true;\n }\n\n setFrame({\n resolved,\n chars: chars.map((char, index) =>\n index < resolved || isSpace(char) ? char : pool[Math.floor(Math.random() * pool.length)],\n ),\n });\n return false;\n };\n\n if (step()) return;\n\n const timer = setInterval(() => {\n if (step()) clearInterval(timer);\n }, speed);\n\n return () => clearInterval(timer);\n }, [runId, chars, characters, speed, stagger, prefersReducedMotion]);\n\n const replay = () => {\n if (!frame && !prefersReducedMotion) setRunId((id) => id + 1);\n };\n\n const hoverHandlers = trigger === 'hover' ? { onPointerEnter: replay, onFocus: replay } : null;\n\n const style = {\n ...(accentColor ? { '--elyri-scramble-accent': accentColor } : null),\n ...(glow !== undefined ? { '--elyri-scramble-glow': Math.max(0, glow) } : null),\n } as CSSProperties;\n\n return (\n <span ref={elementRef} className={cn('elyri-scramble-text', className)} style={style} {...hoverHandlers}>\n <span className=\"elyri-scramble-text__sr\">{children}</span>\n <span aria-hidden=\"true\">\n {chars.map((char, index) => {\n const isScrambled = frame !== null && index >= frame.resolved && !isSpace(char);\n\n // 原字符始终参与排版以固定宽度,乱码绝对定位叠在其上,不会改变行宽导致换行\n return (\n <span\n key={index}\n className={cn('elyri-scramble-text__char', isScrambled && 'elyri-scramble-text__char--scrambled')}\n >\n {char}\n {isScrambled && <span className=\"elyri-scramble-text__glyph\">{frame.chars[index]}</span>}\n </span>\n );\n })}\n </span>\n </span>\n );\n}\n","import { useEffect, useRef } from 'react';\nimport type { CSSProperties } from 'react';\n\nimport { cn, usePrefersReducedMotion } from '../../../core';\n\nimport './ScrollMarquee.css';\n\nexport type ScrollMarqueeDirection = 'left' | 'right';\n\nexport interface ScrollMarqueeProps {\n /** 需要滚动的文本,仅支持纯字符串 */\n children: string;\n className?: string;\n /** 滚动方向 */\n direction?: ScrollMarqueeDirection;\n /** 页面每滚动 1px,文字横向移动的像素数 */\n speed?: number;\n /** 行数,相邻两行方向相反 */\n rows?: number;\n /** 内容重复份数,用于铺满并实现无缝循环 */\n repeat?: number;\n /** 是否无限循环,关闭时走满一份内容后停住 */\n infinite?: boolean;\n}\n\nexport function ScrollMarquee({\n children,\n className,\n direction = 'left',\n speed = 0.5,\n rows = 1,\n repeat = 6,\n infinite = true,\n}: ScrollMarqueeProps) {\n const rootRef = useRef<HTMLDivElement>(null);\n const firstCopyRef = useRef<HTMLSpanElement>(null);\n const prefersReducedMotion = usePrefersReducedMotion();\n\n useEffect(() => {\n const root = rootRef.current;\n if (!root || prefersReducedMotion) return;\n\n let frame = 0;\n\n const update = () => {\n frame = 0;\n\n // 单份内容的宽度即循环周期,按它取模即可无缝衔接\n const copyWidth = firstCopyRef.current?.offsetWidth ?? 0;\n if (!copyWidth) return;\n\n const offset = window.scrollY * speed;\n // 无限循环时按单份宽度取模,滚动中不断回绕;关闭时走满一份内容后停住\n const shift = infinite ? -(offset % copyWidth) : -Math.min(offset, copyWidth);\n root.style.setProperty('--elyri-scroll-marquee-shift', `${shift}px`);\n root.style.setProperty('--elyri-scroll-marquee-copy-width', `${copyWidth}px`);\n };\n\n const onScroll = () => {\n if (frame) return;\n frame = requestAnimationFrame(update);\n };\n\n update();\n window.addEventListener('scroll', onScroll, { passive: true });\n window.addEventListener('resize', onScroll);\n\n return () => {\n window.removeEventListener('scroll', onScroll);\n window.removeEventListener('resize', onScroll);\n if (frame) cancelAnimationFrame(frame);\n };\n }, [prefersReducedMotion, speed, rows, repeat, infinite]);\n\n const rowCount = Math.max(1, Math.floor(rows));\n const copyCount = Math.max(1, Math.floor(repeat));\n const baseDirection = direction === 'left' ? 1 : -1;\n\n return (\n <div ref={rootRef} className={cn('elyri-scroll-marquee', className)}>\n {Array.from({ length: rowCount }, (_, rowIndex) => {\n const dir = rowIndex % 2 === 0 ? baseDirection : -baseDirection;\n\n return (\n <div\n key={rowIndex}\n className=\"elyri-scroll-marquee__row\"\n style={\n {\n '--elyri-scroll-marquee-dir': dir,\n // 向右滚动时先整体左移一份内容宽度,避免左侧露白\n '--elyri-scroll-marquee-base': dir === 1 ? 0 : -1,\n } as CSSProperties\n }\n >\n {Array.from({ length: copyCount }, (_, copyIndex) => (\n <span\n key={copyIndex}\n ref={rowIndex === 0 && copyIndex === 0 ? firstCopyRef : undefined}\n className=\"elyri-scroll-marquee__copy\"\n >\n {children}\n </span>\n ))}\n </div>\n );\n })}\n </div>\n );\n}\n","import { useEffect, useMemo, useRef } from 'react';\nimport type { CSSProperties } from 'react';\n\nimport { cn, splitTextUnits, usePrefersReducedMotion } from '../../../core';\nimport type { SplitTextSegment } from '../../../core';\n\nimport './ScrollReveal.css';\n\nexport type ScrollRevealBy = 'char' | 'word';\n\n/**\n * 点亮线固定在视口该比例高度处(0.65 即屏幕下方 35% 始终留作未点亮区)。\n * 固定不动才能让明暗过渡一直在屏幕里可见;若让它随滚动漂移,中后段整屏都会落在线上方。\n */\nconst LEAD_RATIO = 0.65;\n\nexport interface ScrollRevealProps {\n /** 需要点亮的文本,仅支持纯字符串 */\n children: string;\n className?: string;\n /** 点亮单位:按单词或按字符 */\n by?: ScrollRevealBy;\n /** 滚动区域高度(像素),文本超出后可滚动 */\n height?: number;\n /** 未点亮时的不透明度,0 为完全不可见 */\n dimOpacity?: number;\n /** 未点亮时的模糊半径(像素),0 为不模糊 */\n blur?: number;\n}\n\nconst segmenter =\n typeof Intl !== 'undefined' && 'Segmenter' in Intl ? new Intl.Segmenter(undefined, { granularity: 'word' }) : null;\n\n/**\n * 按「词」切分文本。用 Intl.Segmenter 取词边界,中文、日文等没有空格的语言也能按词点亮;\n * 标点并入前一个词(没有前词时暂存到下一个词),空白保持原样输出。\n * 不支持 Intl.Segmenter 时退回按空白切分。\n */\nconst splitWords = (text: string): SplitTextSegment[] => {\n if (!segmenter) return splitTextUnits(text, 'word');\n\n const segments: SplitTextSegment[] = [];\n let index = 0;\n let wordPart = 0;\n let spacePart = 0;\n let pending = '';\n\n for (const { segment: value, isWordLike } of segmenter.segment(text)) {\n if (/^\\s+$/.test(value)) {\n segments.push({ kind: 'space', key: `space-${spacePart++}`, value });\n continue;\n }\n\n if (isWordLike) {\n segments.push({ kind: 'word', key: `word-${wordPart++}`, units: [{ char: pending + value, index: index++ }] });\n pending = '';\n continue;\n }\n\n const last = segments[segments.length - 1];\n if (!pending && last?.kind === 'word') {\n last.units[0].char += value;\n } else {\n pending += value;\n }\n }\n\n if (pending) {\n segments.push({ kind: 'word', key: `word-${wordPart}`, units: [{ char: pending, index }] });\n }\n\n return segments;\n};\n\n/** 滚动点亮:随容器滚动,文本从头至尾逐单元点亮 */\nexport function ScrollReveal({\n children,\n className,\n by = 'word',\n height = 280,\n dimOpacity = 0.15,\n blur = 0,\n}: ScrollRevealProps) {\n const rootRef = useRef<HTMLDivElement>(null);\n const contentRef = useRef<HTMLDivElement>(null);\n const prefersReducedMotion = usePrefersReducedMotion();\n\n const segments = useMemo(\n () => (by === 'word' ? splitWords(children) : splitTextUnits(children, 'char')),\n [children, by],\n );\n const count = useMemo(\n () => segments.reduce((total, segment) => (segment.kind === 'word' ? total + segment.units.length : total), 0),\n [segments],\n );\n\n useEffect(() => {\n const root = rootRef.current;\n const content = contentRef.current;\n // 减弱动态效果时保持 CSS 默认的全亮进度,不挂监听\n if (!root || !content || prefersReducedMotion) return;\n\n let frame = 0;\n\n const update = () => {\n frame = 0;\n\n // 文本自身高度即点亮线的行程终点\n const travel = content.offsetHeight;\n if (travel <= 0) return;\n\n const { clientHeight, scrollHeight, scrollTop } = root;\n const range = scrollHeight - clientHeight;\n if (range <= 0) {\n root.style.setProperty('--elyri-scroll-reveal-progress', '1');\n return;\n }\n\n // 点亮线默认固定在视口的 LEAD_RATIO 高度处,屏幕下方始终留出一段未点亮的文字,\n // 明暗过渡在任何滚动位置都看得见。\n const line = scrollTop + clientHeight * LEAD_RATIO;\n\n // 收尾:在最后一屏的滚动里把点亮线平滑推到文末,因此滚到底时正好全文点亮,\n // 也就不必在文末补白。\n const tailStart = Math.max(0, range - clientHeight);\n const tail = Math.min(1, Math.max(0, (scrollTop - tailStart) / clientHeight));\n // 像素取整会让滚到底时差出 1px,直接判为全文点亮,避免最后一个词只亮一半\n const head = scrollTop >= range - 1 ? travel : line + tail * (travel - range - clientHeight * LEAD_RATIO);\n\n root.style.setProperty('--elyri-scroll-reveal-progress', String(Math.min(1, Math.max(0, head / travel))));\n };\n\n const onScroll = () => {\n if (frame) return;\n frame = requestAnimationFrame(update);\n };\n\n update();\n root.addEventListener('scroll', onScroll, { passive: true });\n // 内容尺寸变化(字体加载、容器宽度变化)会改变行程长度,需要重新计算\n const observer = new ResizeObserver(onScroll);\n observer.observe(content);\n\n return () => {\n root.removeEventListener('scroll', onScroll);\n observer.disconnect();\n if (frame) cancelAnimationFrame(frame);\n };\n }, [prefersReducedMotion, count]);\n\n const style = {\n '--elyri-scroll-reveal-height': `${height}px`,\n '--elyri-scroll-reveal-dim': dimOpacity,\n '--elyri-scroll-reveal-blur': `${blur}px`,\n '--elyri-scroll-reveal-count': count,\n } as CSSProperties;\n\n return (\n <div\n ref={rootRef}\n className={cn('elyri-scroll-reveal', blur > 0 && 'elyri-scroll-reveal--blur', className)}\n style={style}\n >\n <div ref={contentRef} className=\"elyri-scroll-reveal__content\" aria-label={children}>\n {segments.map((segment) =>\n segment.kind === 'space' ? (\n segment.value\n ) : (\n <span key={segment.key} className=\"elyri-scroll-reveal__word\">\n {segment.units.map((unit) => (\n <span\n key={unit.index}\n className=\"elyri-scroll-reveal__unit\"\n style={{ '--elyri-scroll-reveal-index': unit.index } as CSSProperties}\n aria-hidden=\"true\"\n >\n {unit.char}\n </span>\n ))}\n </span>\n ),\n )}\n </div>\n </div>\n );\n}\n","import { useEffect, useMemo, useRef, useState } from 'react';\nimport type { CSSProperties } from 'react';\n\nimport { cn, usePrefersReducedMotion } from '../../../core';\n\nimport './SplitReveal.css';\n\nexport type SplitRevealBy = 'char' | 'word';\n\nexport interface SplitRevealProps {\n /** 需要浮现的文本,仅支持纯字符串 */\n children: string;\n className?: string;\n /** 拆分单位:按字符或按单词 */\n by?: SplitRevealBy;\n /** 起始延迟(毫秒) */\n delay?: number;\n /** 相邻单元之间的播放间隔(毫秒) */\n stagger?: number;\n /** 单个单元的动画时长(毫秒) */\n duration?: number;\n /** 位移距离(像素) */\n distance?: number;\n /** 是否只在首次进入视口时触发 */\n once?: boolean;\n}\n\ninterface Unit {\n char: string;\n index: number;\n}\n\ntype Segment = { kind: 'space'; key: string; value: string } | { kind: 'word'; key: string; units: Unit[] };\n\n/** 按空白切分文本,保留空白片段,并为每个动画单元分配全局序号 */\nconst splitText = (text: string, by: SplitRevealBy): Segment[] => {\n let index = 0;\n\n return text\n .split(/(\\s+)/)\n .filter(Boolean)\n .map((part, partIndex) => {\n if (/^\\s+$/.test(part)) return { kind: 'space' as const, key: `space-${partIndex}`, value: part };\n\n const units = by === 'char' ? Array.from(part) : [part];\n\n return {\n kind: 'word' as const,\n key: `word-${partIndex}`,\n units: units.map((char) => ({ char, index: index++ })),\n };\n });\n};\n\nexport function SplitReveal({\n children,\n className,\n by = 'char',\n delay = 0,\n stagger = 40,\n duration = 600,\n distance = 24,\n once = true,\n}: SplitRevealProps) {\n const elementRef = useRef<HTMLSpanElement>(null);\n const prefersReducedMotion = usePrefersReducedMotion();\n const [isIntersecting, setIsIntersecting] = useState(false);\n\n useEffect(() => {\n const element = elementRef.current;\n if (!element || prefersReducedMotion) return;\n\n const observer = new IntersectionObserver(\n ([entry]) => {\n if (entry.isIntersecting) {\n setIsIntersecting(true);\n if (once) observer.disconnect();\n return;\n }\n\n if (!once) setIsIntersecting(false);\n },\n { threshold: 0.1 },\n );\n\n observer.observe(element);\n\n return () => observer.disconnect();\n }, [once, prefersReducedMotion]);\n\n const segments = useMemo(() => splitText(children, by), [children, by]);\n\n const style = {\n '--elyri-split-reveal-delay': `${delay}ms`,\n '--elyri-split-reveal-stagger': `${stagger}ms`,\n '--elyri-split-reveal-duration': `${duration}ms`,\n '--elyri-split-reveal-distance': `${distance}px`,\n } as CSSProperties;\n\n const isVisible = prefersReducedMotion || isIntersecting;\n\n return (\n <span\n ref={elementRef}\n className={cn('elyri-split-reveal', isVisible && 'elyri-split-reveal--visible', className)}\n style={style}\n >\n {segments.map((segment) =>\n segment.kind === 'space' ? (\n segment.value\n ) : (\n <span key={segment.key} className=\"elyri-split-reveal__word\">\n {segment.units.map((unit) => (\n <span\n key={unit.index}\n className=\"elyri-split-reveal__unit\"\n style={{ '--elyri-split-reveal-index': unit.index } as CSSProperties}\n >\n {unit.char}\n </span>\n ))}\n </span>\n ),\n )}\n </span>\n );\n}\n","import { useEffect, useState } from 'react';\n\nimport { cn, usePrefersReducedMotion } from '../../../core';\n\nimport './Typewriter.css';\n\nexport interface TypewriterProps {\n /** 需要逐字输出的文本,仅支持纯字符串 */\n children: string;\n className?: string;\n /** 每个字符的输入间隔(毫秒) */\n speed?: number;\n /** 开始输入前的延迟(毫秒) */\n startDelay?: number;\n /** 输入完成后是否循环重播 */\n loop?: boolean;\n /** 循环重播前的停顿(毫秒) */\n loopDelay?: number;\n /** 是否显示闪烁光标 */\n cursor?: boolean;\n}\n\nexport function Typewriter({\n children,\n className,\n speed = 60,\n startDelay = 200,\n loop = false,\n loopDelay = 1200,\n cursor = true,\n}: TypewriterProps) {\n const text = children;\n const prefersReducedMotion = usePrefersReducedMotion();\n const [count, setCount] = useState(0);\n\n useEffect(() => {\n if (prefersReducedMotion || !text) return;\n\n let timer: ReturnType<typeof setTimeout>;\n let typed = 0;\n\n const typeNext = (wait: number) => {\n timer = setTimeout(() => {\n typed += 1;\n setCount(typed);\n\n if (typed < text.length) {\n typeNext(speed);\n return;\n }\n\n if (loop) {\n timer = setTimeout(() => {\n typed = 0;\n setCount(0);\n typeNext(speed);\n }, loopDelay);\n }\n }, wait);\n };\n\n // 起始延迟结束后归零并开始逐字输入\n timer = setTimeout(() => {\n typed = 0;\n setCount(0);\n typeNext(0);\n }, startDelay);\n\n return () => clearTimeout(timer);\n }, [text, speed, startDelay, loop, loopDelay, prefersReducedMotion]);\n\n const visible = prefersReducedMotion ? text : text.slice(0, count);\n\n return (\n <span className={cn('elyri-typewriter', className)}>\n <span className=\"elyri-typewriter__text\">{visible}</span>\n {cursor && <span className=\"elyri-typewriter__cursor\" aria-hidden=\"true\" />}\n </span>\n );\n}\n","import { useMemo } from 'react';\nimport type { CSSProperties } from 'react';\n\nimport { cn, splitTextUnits } from '../../../core';\n\nimport './WaveText.css';\n\nexport interface WaveTextProps {\n /** 需要起伏的文本,仅支持纯字符串 */\n children: string;\n className?: string;\n /** 振幅(像素) */\n amplitude?: number;\n /** 单个字符一次起伏的时长(毫秒) */\n speed?: number;\n /** 相邻字符的相位差(毫秒),越大波浪越稀疏 */\n stagger?: number;\n}\n\n/** 波浪文字:字符按正弦节奏依次上下起伏 */\nexport function WaveText({ children, className, amplitude = 6, speed = 1200, stagger = 60 }: WaveTextProps) {\n const segments = useMemo(() => splitTextUnits(children, 'char'), [children]);\n\n const style = {\n '--elyri-wave-text-amplitude': `${amplitude}px`,\n '--elyri-wave-text-speed': `${speed}ms`,\n '--elyri-wave-text-stagger': `${stagger}ms`,\n } as CSSProperties;\n\n return (\n <span className={cn('elyri-wave-text', className)} style={style} aria-label={children}>\n {segments.map((segment) =>\n segment.kind === 'space' ? (\n segment.value\n ) : (\n <span key={segment.key} className=\"elyri-wave-text__word\">\n {segment.units.map((unit) => (\n <span\n key={unit.index}\n className=\"elyri-wave-text__unit\"\n style={{ '--elyri-wave-text-index': unit.index } as CSSProperties}\n aria-hidden=\"true\"\n >\n {unit.char}\n </span>\n ))}\n </span>\n ),\n )}\n </span>\n );\n}\n"]}
|