ناوبری
الگوهای ناوبری پرتو — Sidebar، NavMenu، Breadcrumb، و اصول طراحی ناوبری
ناوبری خوب به کاربران کمک میکند بدانند کجا هستند، کجا میتوانند بروند، و چطور برگردند. این صفحه الگوها، کامپوننتها، و بهترین روشهای ناوبری در پرتو را توضیح میدهد.
نمونه بصری
مسیریاب — Breadcrumb
تبها — Tabs
معماری ناوبری
پرتو از سه سطح ناوبری استفاده میکند:
| سطح | کامپوننت | کاربرد |
|---|---|---|
| ناوبری اصلی | Sidebar | دسترسی به بخشهای اصلی اپلیکیشن |
| ناوبری محلی | NavMenu / Tabs | جابجایی بین view های یک بخش |
| ناوبری مکانی | Breadcrumb | نمایش موقعیت و مسیر برگشت |
Sidebar
ناوبری کناری برای دسترسی به بخشهای اصلی اپلیکیشن. در پرتو، سایدبار همیشه در سمت راست (start) صفحه قرار میگیرد.
import {
Sidebar,
SidebarGroup,
SidebarGroupLabel,
SidebarMenu,
SidebarMenuItem,
SidebarMenuButton,
} from '@parto-system-design/ui'
import { LayoutDashboard, Users, BarChart2, Settings } from 'lucide-react'
<Sidebar>
<SidebarGroup>
<SidebarGroupLabel>اصلی</SidebarGroupLabel>
<SidebarMenu>
<SidebarMenuItem>
<SidebarMenuButton href="/dashboard" isActive={pathname === '/dashboard'}>
<LayoutDashboard />
<span>داشبورد</span>
</SidebarMenuButton>
</SidebarMenuItem>
<SidebarMenuItem>
<SidebarMenuButton href="/influencers" isActive={pathname.startsWith('/influencers')}>
<Users />
<span>اینفلوئنسرها</span>
</SidebarMenuButton>
</SidebarMenuItem>
<SidebarMenuItem>
<SidebarMenuButton href="/analytics" isActive={pathname.startsWith('/analytics')}>
<BarChart2 />
<span>تحلیلها</span>
</SidebarMenuButton>
</SidebarMenuItem>
</SidebarMenu>
</SidebarGroup>
<SidebarGroup>
<SidebarGroupLabel>سیستم</SidebarGroupLabel>
<SidebarMenu>
<SidebarMenuItem>
<SidebarMenuButton href="/settings">
<Settings />
<span>تنظیمات</span>
</SidebarMenuButton>
</SidebarMenuItem>
</SidebarMenu>
</SidebarGroup>
</Sidebar>آیتم فعال
همیشه آیتم ناوبری فعال را مشخص کنید تا کاربر بداند کجا است:
<SidebarMenuButton
href="/influencers"
isActive={pathname.startsWith('/influencers')}
>
<Users />
<span>اینفلوئنسرها</span>
</SidebarMenuButton>NavMenu
برای ناوبری محلی — جابجایی بین view های مرتبط در یک بخش. معمولاً زیر PageHeader قرار میگیرد.
import { NavMenu, NavMenuItem } from '@parto-system-design/ui'
// پروفایل اینفلوئنسر — چند tab
<NavMenu>
<NavMenuItem href="/influencer/123/overview" isActive={tab === 'overview'}>
خلاصه
</NavMenuItem>
<NavMenuItem href="/influencer/123/posts" isActive={tab === 'posts'}>
پستها
</NavMenuItem>
<NavMenuItem href="/influencer/123/analytics" isActive={tab === 'analytics'}>
تحلیل
</NavMenuItem>
<NavMenuItem href="/influencer/123/campaigns" isActive={tab === 'campaigns'}>
کمپینها
</NavMenuItem>
</NavMenu>Breadcrumb
برای نمایش مسیر فعلی و امکان ناوبری به سطوح بالاتر. معمولاً در PageHeaderBreadcrumb قرار میگیرد.
import {
Breadcrumb,
BreadcrumbItem,
BreadcrumbLink,
BreadcrumbPage,
BreadcrumbSeparator,
} from '@parto-system-design/ui'
<Breadcrumb>
<BreadcrumbItem>
<BreadcrumbLink href="/campaigns">کمپینها</BreadcrumbLink>
</BreadcrumbItem>
<BreadcrumbSeparator />
<BreadcrumbItem>
<BreadcrumbLink href="/campaigns/summer-2024">تابستان ۱۴۰۳</BreadcrumbLink>
</BreadcrumbItem>
<BreadcrumbSeparator />
<BreadcrumbItem>
<BreadcrumbPage>اینفلوئنسرها</BreadcrumbPage>
</BreadcrumbItem>
</Breadcrumb>قوانین Breadcrumb
- صفحه فعلی (
BreadcrumbPage) لینک ندارد — کاربر هماکنون آنجاست - سطح اول (خانه) را فقط در صورت نیاز نمایش دهید — اگر صفحه در سطح عمیقتر از ۲ باشد
- بیش از ۳-۴ سطح نمایش ندهید — اگر عمق بیشتر بود، سطوح میانی را با
...کوتاه کنید
Dropdown Navigation
برای ناوبری ثانویه یا گزینههای کاربر در هدر:
import {
DropdownMenu,
DropdownMenuTrigger,
DropdownMenuContent,
DropdownMenuItem,
DropdownMenuSeparator,
} from '@parto-system-design/ui'
import { User, Settings, LogOut } from 'lucide-react'
<DropdownMenu>
<DropdownMenuTrigger asChild>
<Button variant="ghost" size="small">
<Avatar src={user.avatar} />
<span>{user.name}</span>
</Button>
</DropdownMenuTrigger>
<DropdownMenuContent align="end">
<DropdownMenuItem href="/profile">
<User className="me-2 h-4 w-4" />
پروفایل
</DropdownMenuItem>
<DropdownMenuItem href="/settings">
<Settings className="me-2 h-4 w-4" />
تنظیمات
</DropdownMenuItem>
<DropdownMenuSeparator />
<DropdownMenuItem onClick={handleLogout} className="text-destructive">
<LogOut className="me-2 h-4 w-4" />
خروج از حساب
</DropdownMenuItem>
</DropdownMenuContent>
</DropdownMenu>Pagination
برای ناوبری بین صفحات نتایج جستجو یا لیستهای طولانی:
import { Pagination, PaginationContent, PaginationItem, PaginationLink, PaginationNext, PaginationPrevious } from '@parto-system-design/ui'
<Pagination>
<PaginationContent>
<PaginationItem>
<PaginationPrevious href={`?page=${currentPage - 1}`} />
</PaginationItem>
{pages.map((page) => (
<PaginationItem key={page}>
<PaginationLink href={`?page=${page}`} isActive={page === currentPage}>
{page}
</PaginationLink>
</PaginationItem>
))}
<PaginationItem>
<PaginationNext href={`?page=${currentPage + 1}`} />
</PaginationItem>
</PaginationContent>
</Pagination>بهترین روشها
نمایش حالت فعال
همیشه آیتم فعال را مشخص کنید — کاربر باید بداند کجاست:
// با pathname از Next.js
const pathname = usePathname()
<SidebarMenuButton isActive={pathname === '/dashboard'}>
داشبورد
</SidebarMenuButton>آیکونها در ناوبری
آیکونها خوانایی ناوبری را بهبود میدهند — اما باید همیشه همراه متن باشند:
// درست — آیکون + متن
<SidebarMenuButton>
<LayoutDashboard aria-hidden="true" />
<span>داشبورد</span>
</SidebarMenuButton>
// نادرست — آیکون تنها (بدون متن، بدون aria-label)
<SidebarMenuButton>
<LayoutDashboard />
</SidebarMenuButton>ناوبری با صفحهکلید
Tab/Shift+Tab: جابجایی بین آیتمهای ناوبریEnter/Space: فعالسازی لینک↑ ↓: ناوبری در dropdown menuEscape: بستن dropdown
عمق ناوبری
از ساختار سهلایه استفاده کنید — بیشتر از آن گیجکننده است:
Sidebar (اصلی)
└── NavMenu / Tabs (محلی)
└── Breadcrumb (مکانی)