ردیفِ کشوییSwipe Row

ردیفی که با کشیدن به کنار، کنش‌های پنهانش باز می‌شن؛ کشیدنِ کامل خودِ کنش رو اجرا می‌کنه.

محمدجواد

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

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

وابستگی‌ها

motion

نوع تعامل

ردیف رو به کنار بکش تا کنش‌ها از لبه بیرون بیان. اگه کم بکشی، با فنر برمی‌گرده؛ اگه از حدی بگذری، همون‌جا می‌مونه. تا انتها بکش و رها کن تا کنش مستقیم اجرا شه. با صفحه‌کلید هم کلیدهای جهت ردیف رو باز و بسته می‌کنن.

پراپ‌ها

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

children
ReactNode

محتوای خودِ ردیف.

actions
SwipeAction[]پیش‌فرض: [{ id: "delete", label: "حذف" }]

کنش‌هایی که با کشیدن بیرون می‌آن.

actionColor
stringپیش‌فرض: "#e5484d"

پس‌زمینه‌ی ناحیه‌ی کنش.

drawerColor
stringپیش‌فرض: "#3f3f46"

رنگِ کشو، زیرِ ردیف.

rowColor
stringپیش‌فرض: "#27272a"

رنگِ خودِ ردیف.

textColor
stringپیش‌فرض: "#f5f5f5"

رنگِ متنِ ردیف.

نصب

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

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

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

npx shadcn@latest add @farsify/swipe-row

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

نمونه

swipe-row.tsxtsx
"use client";

import { useEffect, useRef, useState } from "react";
import SwipeRow, { type SwipeAction } from "@/components/farsify/swipe-row";

const actions: SwipeAction[] = [
  { id: "delete", label: "حذف" },
  { id: "archive", label: "بایگانی", dismiss: true },
];

/** چند میلی‌ثانیه بعد ردیف برگردد. */
const RETURN_MS = 3000;

export function TaskList() {
  const [items, setItems] = useState(["بازبینی طرح", "پاسخ به ایمیل‌ها"]);
  const timers = useRef<ReturnType<typeof setTimeout>[]>([]);
  useEffect(() => () => timers.current.forEach(clearTimeout), []);

  const remove = (title: string, index: number) => {
    setItems((current) => current.filter((row) => row !== title));
    timers.current.push(
      setTimeout(() => {
        setItems((current) => {
          const next = [...current];
          next.splice(Math.min(index, next.length), 0, title);
          return next;
        });
      }, RETURN_MS),
    );
  };

  return (
    <div className="flex flex-col gap-2">
      {items.map((title, index) => (
        <SwipeRow
          key={title}
          label={title}
          actions={actions}
          onCommit={() => remove(title, index)}
        >
          <span>{title}</span>
        </SwipeRow>
      ))}
    </div>
  );
}

نکته‌ها

  • کنشِ اولِ فهرست، کنشِ اصلیه — همون که کشیدنِ کامل اجراش می‌کنه. بقیه بعد از اون چیده می‌شن.
  • با `dismiss` روی یه کنش، اون هم ردیف رو جمع می‌کنه؛ بدونِ اون، کشو فقط بسته می‌شه.
  • توی این پورت متن‌ها فارسی شدن و بقیه‌ی رفتار عیناً مرجع‌ه — از جمله پیش‌فرضِ `direction` که کشو رو از راست بیرون می‌آره.
  • `onCommit` بعد از پایانِ انیمیشنِ جمع‌شدن صدا زده می‌شه — اگه فهرست رو همون‌جا عوض کنی، کاربر پرش نمی‌بینه.

مجوز

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