منوی ناوبری (Navigation Menu)

مجموعه‌ای از لینک‌ها برای ناوبری وب‌سایت با محتوای کشویی و پشتیبانی کامل از RTL

نصب (Installation)

1npx @quark-lab/rad-ui add navigation-menu

نمونه‌ها (Examples)

استفاده پایه (Basic)

منوی ناوبری ساده با trigger و محتوای کشویی

مشاهده کد
1import {
2  NavigationMenu,
3  NavigationMenuContent,
4  NavigationMenuItem,
5  NavigationMenuList,
6  NavigationMenuTrigger,
7} from "@/components/ui/navigation-menu";
8
9export default function BasicExample() {
10  return (
11    <NavigationMenu>
12      <NavigationMenuList>
13        <NavigationMenuItem>
14          <NavigationMenuTrigger>شروع</NavigationMenuTrigger>
15          <NavigationMenuContent>
16            <ul className="w-96 p-4">
17              <li className="mb-2">
18                <div className="text-sm font-medium">مقدمه</div>
19                <div className="text-muted-foreground text-xs">
20                  کامپوننت‌های قابل استفاده مجدد با Tailwind CSS
21                </div>
22              </li>
23              <li className="mb-2">
24                <div className="text-sm font-medium">نصب</div>
25                <div className="text-muted-foreground text-xs">
26                  نحوه نصب وابستگی‌ها و ساختاردهی اپلیکیشن
27                </div>
28              </li>
29            </ul>
30          </NavigationMenuContent>
31        </NavigationMenuItem>
32        <NavigationMenuItem>
33          <NavigationMenuTrigger>کامپوننت‌ها</NavigationMenuTrigger>
34          <NavigationMenuContent>
35            <ul className="grid w-[400px] gap-2 p-4 md:grid-cols-2">
36              <li>
37                <div className="text-sm font-medium">دکمه</div>
38                <div className="text-muted-foreground text-xs">
39                  دکمه با انواع و اندازه‌های مختلف
40                </div>
41              </li>
42              <li>
43                <div className="text-sm font-medium">ورودی</div>
44                <div className="text-muted-foreground text-xs">
45                  فیلد ورودی متن
46                </div>
47              </li>
48            </ul>
49          </NavigationMenuContent>
50        </NavigationMenuItem>
51      </NavigationMenuList>
52    </NavigationMenu>
53  );
54}

لینک‌ها (With Links)

استفاده از NavigationMenuLink با asChild برای ترکیب با Next.js Link

مشاهده کد
1import Link from "next/link";
2import {
3  NavigationMenu,
4  NavigationMenuContent,
5  NavigationMenuItem,
6  NavigationMenuLink,
7  NavigationMenuList,
8  NavigationMenuTrigger,
9  navigationMenuTriggerStyle,
10} from "@/components/ui/navigation-menu";
11
12function ListItem({ href, title, children }) {
13  return (
14    <li>
15      <NavigationMenuLink asChild>
16        <Link href={href} className="block select-none space-y-1 rounded-md p-3...">
17          <div className="text-sm font-medium">{title}</div>
18          <div className="text-muted-foreground text-xs">{children}</div>
19        </Link>
20      </NavigationMenuLink>
21    </li>
22  );
23}
24
25export default function WithLinksExample() {
26  return (
27    <NavigationMenu>
28      <NavigationMenuList>
29        <NavigationMenuItem>
30          <NavigationMenuTrigger>شروع</NavigationMenuTrigger>
31          <NavigationMenuContent>
32            <ul className="w-96">
33              <ListItem href="/docs" title="مقدمه">
34                کامپوننت‌های قابل استفاده مجدد
35              </ListItem>
36              <ListItem href="/docs/installation" title="نصب">
37                نحوه نصب وابستگی‌ها
38              </ListItem>
39            </ul>
40          </NavigationMenuContent>
41        </NavigationMenuItem>
42        <NavigationMenuItem>
43          <NavigationMenuLink asChild className={navigationMenuTriggerStyle()}>
44            <Link href="/docs">مستندات</Link>
45          </NavigationMenuLink>
46        </NavigationMenuItem>
47      </NavigationMenuList>
48    </NavigationMenu>
49  );
50}

مرجع API (API Reference)

NavigationMenu

کامپوننت اصلی منوی ناوبری

پراپ (Prop)نوع (Type)پیش‌فرض (Default)توضیحات (Description)
valuestringundefinedمقدار آیتم فعال (کنترل‌شده)
defaultValuestringundefinedمقدار پیش‌فرض آیتم فعال
onValueChange(value: string) => voidundefinedتابع فراخوانی هنگام تغییر آیتم فعال
dir"ltr" | "rtl""rtl"جهت متن برای پشتیبانی RTL
orientation"horizontal" | "vertical""horizontal"جهت منوی ناوبری

NavigationMenuTrigger

دکمه‌ای که محتوا را باز و بسته می‌کند

پراپ (Prop)نوع (Type)پیش‌فرض (Default)توضیحات (Description)
asChildbooleanfalseترکیب با فرزند به عنوان trigger

NavigationMenuContent

محتوای کشویی که هنگام باز شدن نمایش داده می‌شود

پراپ (Prop)نوع (Type)پیش‌فرض (Default)توضیحات (Description)
classNamestringundefinedکلاس‌های CSS سفارشی
dir"ltr" | "rtl""rtl"جهت متن محتوا
forceMountbooleanundefinedاجبار رندر برای کنترل انیمیشن

NavigationMenuLink

لینک ناوبری با پشتیبانی asChild

پراپ (Prop)نوع (Type)پیش‌فرض (Default)توضیحات (Description)
asChildbooleanfalseترکیب با Link یا تگ a برای مسیریابی
activebooleanfalseوضعیت فعال بودن لینک
onSelect(event: Event) => voidundefinedتابع فراخوانی هنگام انتخاب

دسترسی‌پذیری (Accessibility)

کیبورد (Keyboard)

  • Space یا Enter - باز کردن محتوا
  • Arrow Down / Arrow Up - حرکت بین آیتم‌ها
  • Arrow Right / Arrow Left - حرکت به trigger بعدی/قبلی
  • Esc - بستن منو

نقش ARIA (ARIA Roles)

منوی ناوبری از نقش navigation پیروی می‌کند و برای ناوبری وب‌سایت طراحی شده است، نه منوی دستورات اپلیکیشن

بهترین شیوه‌ها (Best Practices)

استفاده از NavigationMenuLink

برای تمام لینک‌های ناوبری از NavigationMenuLink استفاده کنید و با asChild آن را با Next.js Link یا تگ a ترکیب کنید تا دسترسی‌پذیری و تعاملات کیبورد حفظ شود

تفاوت با Menubar

منوی ناوبری برای ناوبری وب‌سایت (لینک‌ها) طراحی شده است. Menubar برای منوهای دستورات اپلیکیشن (مانند فایل، ویرایش) مناسب است

پشتیبانی RTL

کامپوننت به صورت پیش‌فرض با dir="rtl" کار می‌کند. برای LTR می‌توانید dir="ltr" را به NavigationMenu پاس دهید

نحوه استفاده (Usage)

1import Link from "next/link";
2import {
3  NavigationMenu,
4  NavigationMenuContent,
5  NavigationMenuItem,
6  NavigationMenuLink,
7  NavigationMenuList,
8  NavigationMenuTrigger,
9  navigationMenuTriggerStyle,
10} from "@/components/ui/navigation-menu";
11
12export default function NavigationMenuExample() {
13  return (
14    <NavigationMenu>
15      <NavigationMenuList>
16        <NavigationMenuItem>
17          <NavigationMenuTrigger>شروع</NavigationMenuTrigger>
18          <NavigationMenuContent>
19            <ul className="w-96 p-4">
20              <li>
21                <NavigationMenuLink asChild>
22                  <Link
23                    href="/docs"
24                    className="block rounded-md p-3 hover:bg-accent"
25                  >
26                    <span className="font-medium">مقدمه</span>
27                    <p className="text-muted-foreground text-sm">
28                      کامپوننت‌های قابل استفاده مجدد
29                    </p>
30                  </Link>
31                </NavigationMenuLink>
32              </li>
33            </ul>
34          </NavigationMenuContent>
35        </NavigationMenuItem>
36        <NavigationMenuItem>
37          <NavigationMenuLink asChild className={navigationMenuTriggerStyle()}>
38            <Link href="/docs">مستندات</Link>
39          </NavigationMenuLink>
40        </NavigationMenuItem>
41      </NavigationMenuList>
42    </NavigationMenu>
43  );
44}