پرتوپرتو

ناوبری

الگوهای ناوبری پرتو — Sidebar، NavMenu، Breadcrumb، و اصول طراحی ناوبری

ناوبری خوب به کاربران کمک می‌کند بدانند کجا هستند، کجا می‌توانند بروند، و چطور برگردند. این صفحه الگوها، کامپوننت‌ها، و بهترین روش‌های ناوبری در پرتو را توضیح می‌دهد.


نمونه بصری

مسیریاب — Breadcrumb

تب‌ها — Tabs

محتوای ذکرها

معماری ناوبری

پرتو از سه سطح ناوبری استفاده می‌کند:

سطحکامپوننتکاربرد
ناوبری اصلیSidebarدسترسی به بخش‌های اصلی اپلیکیشن
ناوبری محلیNavMenu / Tabsجابجایی بین view های یک بخش
ناوبری مکانیBreadcrumbنمایش موقعیت و مسیر برگشت

ناوبری کناری برای دسترسی به بخش‌های اصلی اپلیکیشن. در پرتو، سایدبار همیشه در سمت راست (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>

برای ناوبری محلی — جابجایی بین 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>

برای نمایش مسیر فعلی و امکان ناوبری به سطوح بالاتر. معمولاً در 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) لینک ندارد — کاربر هم‌اکنون آنجاست
  • سطح اول (خانه) را فقط در صورت نیاز نمایش دهید — اگر صفحه در سطح عمیق‌تر از ۲ باشد
  • بیش از ۳-۴ سطح نمایش ندهید — اگر عمق بیشتر بود، سطوح میانی را با ... کوتاه کنید

برای ناوبری ثانویه یا گزینه‌های کاربر در هدر:

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 menu
  • Escape: بستن dropdown

عمق ناوبری

از ساختار سه‌لایه استفاده کنید — بیشتر از آن گیج‌کننده است:

Sidebar (اصلی)
  └── NavMenu / Tabs (محلی)
         └── Breadcrumb (مکانی)