جادهٔ مه
جادهٔ مه
فیوردِ آبی
فیوردِ آبی
کمپِ برفی
کمپِ برفی
آبشارِ جنگلی
آبشارِ جنگلی

دسته‌ی کارتCard Swap

دسته‌ی کارت‌های سه‌بعدی که با کشیدن، کلیک یا پخشِ خودکار عوض می‌شه: کارتِ روبه‌رو با جهش می‌پره، بقیه با فنرِ پنج‌محوره جابه‌جا می‌شن و هاله‌ی تاری عمق می‌سازه.

محمدجواد

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

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

وابستگی‌ها

بدون وابستگی

نوع تعامل

کارتِ روبه‌رو رو بکش و رها کن: مسیرِ پرتاب، جهتِ ورودِ کارتِ بعدی و کج‌شدگی‌اش رو تعیین می‌کنه. کلیک روی کارت‌های عقب اون‌ها رو به رو می‌آره و فلش‌ها/کلیدهای جهت هم عوض می‌کنن. موقعِ هاور، دسته کمی باز می‌شه و کارت‌های عقب تارتر دیده می‌شن. هندسه آینه نشده: پشته به راست‌وبالا باز می‌شه و کشیدن فیزیکِ انگشته؛ کلیدها منطقی‌ان (راست/پایین = بعدی).

پراپ‌ها

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

items
CardSwapItem[]

کارت‌ها؛ هرکدوم `title`، `image`، `icon` و `alt` داره. بدونِ اون‌ها چهار کارتِ نمونه می‌آد.

children
ReactNode

کارت‌های کاملاً سفارشی با `<Card>` — اگه بدی، `items` نادیده گرفته می‌شه.

width
numberپیش‌فرض: 460

عرضِ هر کارت، پیکسل.

height
numberپیش‌فرض: 340

ارتفاعِ هر کارت، پیکسل.

cardDistance
numberپیش‌فرض: 60

فاصله‌ی افقیِ پله‌های پشته.

verticalDistance
numberپیش‌فرض: 70

فاصله‌ی عمودیِ پله‌ها — کارت‌ها به بالا پله می‌شن.

نصب

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

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

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

npx shadcn@latest add @farsify/card-swap

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

نمونه

card-swap.tsxtsx
"use client";

import CardSwap, { Card } from "@/components/farsify/card-swap";

const decks = [
  { title: "جادهٔ مه", image: "/photos/mist.jpg" },
  { title: "فیوردِ آبی", image: "/photos/fjord.jpg" },
  { title: "کمپِ برفی", image: "/photos/camp.jpg" },
];

export function TravelDeck() {
  return <CardSwap items={decks} width={460} height={340} />;
}

// کارتِ سفارشی با <Card>
<CardSwap>
  <Card>
    <div className="grid h-full place-items-center text-2xl">هر چیزی</div>
  </Card>
  <Card>...</Card>
</CardSwap>

نکته‌ها

  • ریشه توی هر جعبه‌ای خودش رو جا می‌ده: `fit()` نسبتِ عرض/ارتفاعِ ظرف رو می‌سنجه و کلِ دسته رو مقیاس می‌کنه — توی کارتِ فهرست و بنتو بدونِ هیچ تنظیمی میزبانه.
  • مسیرِ کشیدن جهتِ ورودِ کارتِ بعدی رو می‌سازه: از پایین بکش تا کارتِ بعد از پایین بیاد — همون حسِ دسته‌ی کاغذِ واقعی.
  • `hoverSpread` رو صفر بده و `dim` رو بالا ببر تا دسته‌ی ساکت و عمیق شه؛ برای ویترینِ محصولات `hoverSpread` بالا و `skewAmount` منفی حسِ قفسه می‌ده.
  • پشته به راست‌وبالا باز می‌شه — عینِ مرجع و بدونِ آینه؛ عنوانِ روی کارت فارسی و RTL می‌نشینه. اگه روزی خواستی پشته به چپ باز شه، علامتِ `cardDistance` رو منفی کن نه این‌که کلِ موتور رو آینه کنی.
  • با `children` و `<Card>` هر محتوایی می‌سازی؛ `onCardClick` حتی برای کارت‌های عقب صدا زده می‌شه.

مجوز

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