بخش‌بندِ کشسانRubber Segment

نوارِ بخش‌بندی با انگشتِ شیشه‌ایِ کشسان: موقعِ پریدن کش می‌آد، لنگر می‌ندازه و با مومنتوم به خونه‌ی تازه می‌لغزه.

محمدجواد

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

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

وابستگی‌ها

motion

نوع تعامل

با کلیک روی هر خونه، انگشتِ شیشه‌ای با فنر به اون خونه می‌پره و وسطِ راه کش می‌آد و لبه‌ی دنباله‌اش اسکواش می‌شه. با کشیدنِ انگشت روی نوار می‌شه خونه‌ها رو جابه‌جا کرد؛ رهاکردن با سرعت، مومنتوم می‌ده و نزدیک‌ترین خونه رو می‌نشونه. کلیدهای جهت هم کار می‌کنن — توی RTL `ArrowLeft` جلو می‌بره.

پراپ‌ها

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

items
Array<string | RubberSegmentItem>

گزینه‌ها؛ رشته یا شیءِ `{ value, label, icon }`.

value
string

حالتِ controlled؛ اگه بدی مالکیتِ مقدار با توئه.

defaultValue
string

مقدارِ اولیه توی حالتِ uncontrolled؛ اگه نیاد اولین گزینه.

onChange
(value: string, index: number) => void

با هر تغییرِ نشسته صدا زده می‌شه.

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

پس‌زمینه‌ی نوار.

thumbColor
stringپیش‌فرض: "#fafafa"

رنگِ انگشتِ شیشه‌ای.

نصب

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

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

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

npx shadcn@latest add @farsify/rubber-segment

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

نمونه

rubber-segment.tsxtsx
"use client";

import { useState } from "react";
import { RubberSegment } from "@/components/farsify/rubber-segment";

export function ViewSwitch() {
  const [view, setView] = useState("فهرست");

  return (
    <RubberSegment
      aria-label="نمای فایل‌ها"
      items={["فهرست", "تخته", "تقویم"]}
      value={view}
      onChange={setView}
    />
  );
}

// گزینه‌ها می‌توانند شیء باشند — برای آیکن یا مقدارِ جدا از برچسب
<RubberSegment
  items={[
    { value: "mobile", label: "موبایل" },
    { value: "tablet", label: "تبلت" },
    { value: "desktop", label: "دسکتاپ" },
  ]}
  defaultValue="tablet"
  size="lg"
/>

// بدونِ کشیدگی و بدونِ کشیدن؛ انتخاب فقط با کلیک
<RubberSegment items={["روز", "هفته", "ماه"]} stretch={0} draggable={false} />

نکته‌ها

  • برای فارسی، نوارِ سه‌چهار گزینه‌ای بهترین جاست؛ `equalSlots` رو روشن بذار تا خونه‌ها هم‌اندازه باشن و انگشت وسط نلرزه.
  • این کامپوننت نیازی به آینه‌سازیِ دستی نداره: جهتِ خوندنِ چیدمان از فلکسِ خودِ صفحه می‌آد و کلیدهای جهت هم بر اساسِ `direction` عوض می‌شن — توی RTL `ArrowLeft` جلو می‌بره.
  • اگه نشانگرها خیلی کم‌رنگن (پس‌زمینه‌ی روشن با نوارِ روشن)، `trackColor` رو یه پله تیره‌تر از سطح بذار، نه یه پله روشن‌تر؛ این تنها جاییه که کنتراستِ نوار به چشم می‌آد.
  • با `prefers-reduced-motion` پرشِ فنری به یه تغییرِ ساده تبدیل می‌شه؛ مومنتوم و کشیدگی هم خاموش می‌شن ولی انتخاب درست کار می‌کنه.

مجوز

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