منوی ناوبری (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) |
|---|---|---|---|
value | string | undefined | مقدار آیتم فعال (کنترلشده) |
defaultValue | string | undefined | مقدار پیشفرض آیتم فعال |
onValueChange | (value: string) => void | undefined | تابع فراخوانی هنگام تغییر آیتم فعال |
dir | "ltr" | "rtl" | "rtl" | جهت متن برای پشتیبانی RTL |
orientation | "horizontal" | "vertical" | "horizontal" | جهت منوی ناوبری |
NavigationMenuTrigger
دکمهای که محتوا را باز و بسته میکند
| پراپ (Prop) | نوع (Type) | پیشفرض (Default) | توضیحات (Description) |
|---|---|---|---|
asChild | boolean | false | ترکیب با فرزند به عنوان trigger |
NavigationMenuContent
محتوای کشویی که هنگام باز شدن نمایش داده میشود
| پراپ (Prop) | نوع (Type) | پیشفرض (Default) | توضیحات (Description) |
|---|---|---|---|
className | string | undefined | کلاسهای CSS سفارشی |
dir | "ltr" | "rtl" | "rtl" | جهت متن محتوا |
forceMount | boolean | undefined | اجبار رندر برای کنترل انیمیشن |
NavigationMenuLink
لینک ناوبری با پشتیبانی asChild
| پراپ (Prop) | نوع (Type) | پیشفرض (Default) | توضیحات (Description) |
|---|---|---|---|
asChild | boolean | false | ترکیب با Link یا تگ a برای مسیریابی |
active | boolean | false | وضعیت فعال بودن لینک |
onSelect | (event: Event) => void | undefined | تابع فراخوانی هنگام انتخاب |
دسترسیپذیری (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}