کاروسلِ فنریCarousel

کاروسلِ موتوردار با پنج افکتِ جابه‌جایی (tilt، slide، scale، fade و cube)، کشیدنِ شتاب‌دار، autoplay با نوارِ پیشرفت و loop بی‌درز — برای متن، عکس یا هر محتوای دیگه.

محمدجواد

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

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

وابستگی‌ها

بدون وابستگی

نوع تعامل

کارت‌ها رو بکش و رها کن: سرعتِ انگشتت اندازه‌گیری می‌شه و کارت با فنر روی نزدیک‌ترین slide می‌نشینه. چرخِ افقیِ موس هم صفحه رو می‌گردونه و فلش‌ها/dotها/نوارها پرشِ مستقیم می‌دن. توی RTL موتور آینه شده: «بعدی» از سمتِ چپ می‌آد و نوارِ کارت‌ها دنبالِ انگشتت می‌ره. کلیدها منطقی‌ان: فلشِ راست همیشه «بعدی»ـه.

پراپ‌ها

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

items
CarouselEntry[]

کارت‌ها؛ یه رشته (آدرسِ عکس)، شیءِ CarouselItem یا هر ReactElement دلخواه.

baseWidth
number | stringپیش‌فرض: 300

بیشینه‌ی عرضِ کاروسل، پیکسل.

aspectRatio
numberپیش‌فرض: 1.25

نسبتِ عرض به ارتفاعِ کارت؛ ۰٫۵ تا ۴. برای story عمودی ۰٫۶۲ بده.

peek
numberپیش‌فرض: 0

چقدر از کارتِ بغلی از لبه دیده شه، پیکسل.

gap
numberپیش‌فرض: 16

فاصله‌ی بین کارت‌ها، پیکسل.

radius
numberپیش‌فرض: 12

شعاعِ گوشه‌ی کارت‌ها.

نصب

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

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

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

npx shadcn@latest add @farsify/carousel

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

نمونه

carousel.tsxtsx
"use client";

import Carousel from "@/components/farsify/carousel";

const photos = [
  { id: 1, image: "/photos/one.jpg", title: "دشتِ باز", description: "آسمانِ روشن." },
  { id: 2, image: "/photos/two.jpg", title: "برآمدنِ ماه", description: "زیرِ ماهِ کامل." },
];

export function PhotoStrip() {
  return <Carousel items={photos} baseWidth={640} peek={64} frame={false} effect="scale" loop autoplay indicator="bars" />;
}

// هر محتوایی: کامپوننتِ خودت به‌جای کارت
<Carousel items={[<MyCard key="a" />, <MyCard key="b" />]} />

// استوریِ عمودیِ مکعبی
<Carousel baseWidth={270} aspectRatio={0.62} effect="cube" loop autoplay />

نکته‌ها

  • موتور توی RTL آینه می‌شه، نه فقط ظاهر: جابه‌جایی‌ها و زاویه‌ی cube با علامتِ محورِ X برعکس می‌شن، کشیدن دنبالِ انگشتت می‌ره و سرعتِ پرتاب درست advance می‌کنه — علامت توی `settings.sign` یه‌جا جمع شده.
  • چرخِ موس عمداً علامتِ آینه نمی‌گیره: deltaX مثبت توی هر دو جهت یعنی «جلو رفتن» — همون حسِ طبیعیِ اسکرول.
  • برای ردیفِ گالری با همسایه‌ی نیمه‌پیدا: `frame={false}` + `peek={64}` + `effect="scale"` — ماسکِ محویِ لبه خودش ساخته می‌شه.
  • autoplay رو با نوارِ نشانگر جفت کن (`indicator="bars"`) تا کاربر بفهمه چند ثانیه تا slide بعدی مونده — الگوی storyها.
  • کارتِ گرد (`round`) عرض رو با نسبتِ تصویر گرد می‌کنه؛ برای متنِ کوتاهِ داخلش `compact` خودکار می‌شه و توضیح پنهان می‌شه.

مجوز

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