بوم شیدر
shaderپسزمینهپایهی همهی شیدرها با WebGL خام و بدون کتابخانه. شیدر خودتون را بنویسید و رنگها را از توکنهای تم بگیرید تا با عوض شدن تم بهروز بشن.
متن روی پسزمینه
در همهی تمها باید خوانا بمونه.
نصب
با CLI
اگر هنوز init نکردید، اول از راهنمای نصب پروژه را آماده کنید. بعد این دستور کامپوننت و وابستگیهاش را مینویسه.
$ npx vibefarsi add shaderنصب دستی
محتوای تب «کد» را در
components/backgrounds/shader.tsxبگذارید.$ npm i lucide-reactکپی کل فایلregistry json
استفاده
usage.tsx
1import { ShaderCanvas, GLSL_NOISE } from "@/components/backgrounds/shader"23const frag = /* glsl */ `4void main() {5 vec2 uv = gl_FragCoord.xy / u_resolution;6 float glow = smoothstep(0.7, 0.0, distance(uv, u_pointer));7 vec3 color = mix(u_color0, u_color1, uv.y);8 gl_FragColor = vec4(color, glow * 0.35);9}`1011<section className="relative overflow-hidden">12 <ShaderCanvas fragment={frag} colors={["--brand", "--foreground"]} pointer />13 <div className="relative">…</div>14</section>پراپها
| پراپ | نوع | پیشفرض | توضیح |
|---|---|---|---|
| fragment | string | - | بدنهی شیدر فرگمنت (GLSL ES 1.00) با یک main. هدر یونیفرمها خودکار اضافه میشه. |
| colors | string[] | ["--brand", "--foreground", "--background"] | متغیرهای CSS که به u_color0 تا u_color3 تبدیل میشن. |
| uniforms | Record<string, number | number[]> | - | یونیفرمهای دلخواه. عدد به float و آرایه به vec2 تا vec4 تبدیل میشه. |
| speed | number | 1 | ضریب u_time. |
| pointer | boolean | false | حرکت ماوس روی والد را به u_pointer و u_trail میفرسته. |
| dpr | number | Safari: min(round(dpr), 2); else min(dpr, 1.5) | مقیاس رندر. کمتر یعنی سبکتر. در سافاری عدد صحیح میمونه تا بوم تار نشه. |
نکتهها
- یونیفرمهای آماده اینها هستن: u_resolution، u_time، u_dpr، u_pointer، u_trail[8] و u_color0 تا u_color3. برای نویز و fbm، رشتهی GLSL_NOISE را به ابتدای شیدر اضافه کنید.
- بوم شفافه، پس آلفای خروجی را کم نگه دارید. بیرون از دید، حلقهی رندر میایسته و کانتکست آزاد میشه و با prefers-reduced-motion فقط یک فریم کشیده میشه.
- Chrome بیش از ۱۶ کانتکست WebGL فعال را نگه نمیداره، برای همین این کامپوننت با IntersectionObserver فقط برای بومهای در دید کانتکست میسازه.