آیکن‌های شیشه‌ایGlass Icons

گریدِ آیکن‌های شیشه‌ای که رنگِ پشتشون رو خم می‌کنن؛ برای داک‌ها، گریدِ اپ‌ها و لینک‌های شبکه‌های اجتماعی.

محمدجواد

ساخته شده توسط محمدجواد

سازنده فارسی‌فای، بچه دولوپر

وابستگی‌ها

بدون وابستگی

نوع تعامل

با هاور، شیشه با فنر بلند می‌شه یا می‌ره تو، کارتِ رنگیِ پشتش با نشانگر آروم جابه‌جا می‌شه و لبه‌ی شیشه نور می‌گیره؛ کلیک هم فشار می‌ده. با Tab هم فوکوس می‌گیره و همون حالتِ هاور رو نشون می‌ده. `prefers-reduced-motion` همه‌ی این‌ها رو بی‌درنگ می‌کنه.

پراپ‌ها

گزینه‌هایی که می‌تونی به کامپوننت بدی؛ ستاره‌دارها اجباری‌اند.

items
GlassIconsItem[]پیش‌فرض: []

آیکن‌ها. هر آیتم `icon` و `label` و `color` می‌گیره و اختیاری `href` و `target` و `onClick` و `id` و `className` هم داره. `color` یا اسمِ گرادیانتِ آماده‌ست (blue، purple، red، indigo، orange، green، teal، pink، graphite، silver) یا هر رنگ/گرادیانتِ CSS.

size
numberپیش‌فرض: 82

پهنا و بلندیِ هر آیکن بر حسبِ px.

gap
numberپیش‌فرض: 66

فاصله‌ی آیکن‌ها از هم بر حسبِ px.

columns
numberپیش‌فرض: 3

چند آیکن در هر ردیف. جا نشه ردیف می‌شکنه و به ستون‌های کمتر می‌ره.

roundness
numberپیش‌فرض: 0.6

گردیِ گوشه؛ از ۰ مربع تا ۱ دایره.

refraction
numberپیش‌فرض: 0.8

شکستِ نور در لبه‌ی شیشه — چیزی که پشتشه رو محیطِ لبه خم می‌کنه. فقط توی مرورگرهای کرومی کار می‌کنه؛ بقیه به blur معمولی می‌رن.

نصب

۱. این آدرس رو یک‌بار توی components.json بذار تا shadcn مخزن فارسی‌فای رو بشناسه.

components.jsonjson
{
  "registries": {
    "@farsify": "https://farsify.ir/r/{name}.json"
  }
}

۲. بعد با دستورِ زیر کامپوننت رو نصب کن.

npx shadcn@latest add @farsify/glass-icons

پیش‌نیاز: Tailwind CSS v4 و صفحهٔ راست‌به‌چپ dir="rtl".

نمونه

glass-icons.tsxtsx
"use client";

import { Cloud, Folder, Github, Heart } from "lucide-react";
import GlassIcons from "@/components/farsify/glass-icons";

/** داکِ اپ‌ها — رنگ می‌تونه اسمِ گرادیانتِ آماده یا هر گرادیانتِ CSS باشه */
export function AppDock() {
  return (
    <GlassIcons
      items={[
        { icon: <Folder size={24} strokeWidth={1.8} />, color: "blue", label: "فایل‌ها" },
        { icon: <Heart size={24} strokeWidth={1.8} />, color: "red", label: "سلامت" },
        { icon: <Cloud size={24} strokeWidth={1.8} />, color: "indigo", label: "آب‌وهوا" },
      ]}
      size={82}
      gap={66}
    />
  );
}

// داکِ شبکه‌های اجتماعی — آیکن‌ها می‌تونن لینک واقعی هم باشن
<GlassIcons
  items={[
    {
      icon: <Github size={24} strokeWidth={1.8} />,
      color: "linear-gradient(135deg, #4a4752, #1d1b22)",
      label: "GitHub",
      href: "https://github.com",
      target: "_blank",
    },
  ]}
  size={56}
  gap={22}
  columns={6}
  roundness={1}
  plate="circle"
  spread={0.12}
/>

// شیشه‌ی کاملِ شفاف — چیزی که پشتِ کامپوننت باشه خم می‌شه
<GlassIcons
  plate="none"
  refraction={0.9}
  dispersion={0.6}
  frost={0.15}
  tintOpacity={0.06}
  items={items}
/>

// داکِ فشرده با برچسبِ همیشگی
<GlassIcons
  size={60}
  gap={16}
  columns={6}
  roundness={0.42}
  plate="offset"
  spread={0.35}
  hover="float"
  labels="always"
  items={dockItems}
/>

نکته‌ها

  • هیچ وابستگی‌ای نداره — فنرها با rAFِ خام و شیدر با WebGL2ِ خام نوشته شده؛ جایی که WebGL2 نباشه خودش به نسخه‌ی DOM برمی‌گرده.
  • شکستِ نورِ واقعی (شیشه‌ی مایع) فقط توی کروم و اِج دیده می‌شه؛ سافاری و فایرفاکس همون صحنه رو با blur و نقشه‌ی درخشش نشون می‌دن.
  • برای شیشه‌ی کاملِ شفاف، `plate` رو `none` بذار — اون‌وقت چیزی که پشتِ کامپوننت باشه (عکس، گرادیانت، کارت) خم می‌شه و معنی‌دار می‌شه؛ روی پس‌زمینه‌ی تخت هیچی دیده نمی‌شه.
  • برای داک، `columns` رو زیاد و `gap` رو کم بذار — پریستِ `dock` توی دمو همین کارو می‌کنه.
  • هندسه (کج‌شدنِ کارت، جهتِ بیرون‌زدگی) عمداً آینه نشده؛ توی راست‌به‌چپ فقط متن‌ها فارسی می‌شن و فیزیکِ حرکت همون می‌مونه.

مجوز

کد بعد از نصب مالِ خودته؛ هر تغییری خواستی بده و توی پروژه‌ی خودت نگهش دار. برای پروژه‌های شخصی و تجاری آزاده، حتی اگه کدت بسته باشه. فقط اسم و لینک فارسی‌فای رو یه جا توی پروژه نگه دار.