منوی درختیBranched Menu

یه منوی تودرتو که بخش‌هاش مثل شاخه‌های درخت باز و بسته می‌شن و خطِ مسیر تا گزینه‌ی انتخاب‌شده کشیده می‌شه.

محمدجواد

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

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

وابستگی‌ها

بدون وابستگی

نوع تعامل

روی عنوانِ هر بخش بزن تا شاخه‌هاش باز یا بسته بشن؛ هر فرزندی که انتخاب شه، خطِ رنگی از تنه تا همون گزینه کشیده می‌شه و نشانگرِ کنارِ عنوان به سمتش می‌لغزه. دکمه‌های بخش `aria-expanded` دارن و فرزندهای بسته از مسیرِ tab بیرون‌ان، پس با صفحه‌کلید و صفحه‌خوان هم درست کار می‌کنه.

پراپ‌ها

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

items
BranchedMenuItem[]پیش‌فرض: DEFAULT_ITEMS

بخش‌ها. هر بخش یه `label` و یه فهرستِ فرزند داره (`value`، `label`، `icon`)، یا خودش یه برگ با `value`ـه.

defaultOpen
number | number[]پیش‌فرض: 0

کدوم بخش‌ها اول باز باشن. عددِ منفی یعنی هیچ‌کدوم.

defaultActive
stringپیش‌فرض: ""

مقدارِ انتخاب‌شده‌ی اولیه. خالی بذار تا اولین فرزندِ بخشِ باز انتخاب شه.

onSelect
(value, item) => void

وقتی یه فرزند یا برگ انتخاب می‌شه صدا زده می‌شه.

onToggle
(index, open) => void

وقتی بخشی باز یا بسته می‌شه صدا زده می‌شه.

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

رنگِ جوهر. خطوط و متنِ بی‌حالت، آمیزه‌هایی از همین رنگ‌ان.

نصب

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

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

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

npx shadcn@latest add @farsify/branched-menu

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

نمونه

branched-menu.tsxtsx
"use client";

import BranchedMenu from "@/components/farsify/branched-menu";

export function DocsNav() {
  return (
    <BranchedMenu
      defaultOpen={[0, 1]}
      defaultActive="quick"
      accentColor="var(--color-brand)"
      items={[
        {
          label: "شروع کار",
          children: [
            { value: "install", label: "نصب" },
            { value: "quick", label: "شروع سریع" },
            { value: "config", label: "پیکربندی" },
          ],
        },
        {
          label: "کامپوننت‌ها",
          children: [
            { value: "buttons", label: "دکمه‌ها" },
            { value: "forms", label: "فرم‌ها" },
          ],
        },
      ]}
      onSelect={(value) => console.log(value)}
    />
  );
}

// بخشِ تک‌برگ — بدون فرزند، خودش یک گزینه است
<BranchedMenu
  items={[
    { label: "راهنما", value: "help" },
    { label: "درباره", value: "about" },
  ]}
  defaultActive="about"
/>

نکته‌ها

  • رنگ‌ها رو با متغیرِ CSS هم می‌تونی بدی: `accentColor="var(--color-brand)"` تا خطِ فعال با برندِ سایتت یکی شه.
  • برای منوی کنارِ صفحه `defaultOpen` رو آرایه بده تا چند بخش هم‌زمان باز باشن.
  • iconِ هر فرزند یه عنصرِ Reactـه (`icon`)، پس آیکن‌های پروژه‌ی خودت رو مستقیم بده — وابستگیِ بیرونی نداره.

مجوز

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