پرتوپرتو

ناوبری بخش‌ها (SectionNavigator)

ناوبری درون‌صفحه‌ای sticky برای صفحات طولانی با بخش‌های متعدد

معرفی

کامپوننت SectionNavigator یک ناوبری درون‌صفحه‌ای sticky ارائه می‌دهد که بخش فعلی را بر اساس موقعیت اسکرول برجسته می‌کند. مناسب برای صفحات تحلیلی، گزارش‌ها، و هر صفحه‌ی طولانی با بخش‌های مشخص.

چه زمانی استفاده کنیم:

  • برای صفحات طولانی با ۳ بخش یا بیشتر
  • در صفحات گزارش و تحلیل که کاربر نیاز به پرش سریع بین بخش‌ها دارد
  • وقتی می‌خواهید موقعیت فعلی کاربر در صفحه را نمایش دهید

چه زمانی استفاده نکنیم:

  • برای تعداد section های کم (کمتر از ۳) — از Tabs استفاده کنید
  • برای flow های ترتیبی — از Stepper استفاده کنید

استفاده

import { SectionNavigator } from '@parto-system-design/ui'
const sections = [
  { id: 'overview', label: 'خلاصه' },
  { id: 'engagement', label: 'تعامل' },
  { id: 'content', label: 'محتوا' },
]

<SectionNavigator sections={sections} />

حالت‌ها و انواع

در کنار محتوا

<div className="grid grid-cols-1 lg:grid-cols-[220px_1fr] gap-6">
  <aside className="hidden lg:block sticky top-20 h-fit">
    <SectionNavigator sections={sections} offset={80} />
  </aside>

  <div>
    <section id="overview">...</section>
    <section id="engagement">...</section>
    <section id="content">...</section>
  </div>
</div>

با آیکون

import { BarChart3, Users, FileText } from 'lucide-react'

const sections = [
  { id: 'stats', label: 'آمار', icon: <BarChart3 className="size-4" /> },
  { id: 'audience', label: 'مخاطبان', icon: <Users className="size-4" /> },
  { id: 'reports', label: 'گزارش‌ها', icon: <FileText className="size-4" /> },
]

<SectionNavigator sections={sections} />

Props

Prop

Type

SectionItem

interface SectionItem {
  id: string // باید با id عنصر HTML مطابقت داشته باشد
  label: string // متن نمایشی
  icon?: React.ReactNode // آیکون اختیاری
}

راهنمای استفاده

بکنید

  • offset را برابر با ارتفاع هدر sticky تنظیم کنید تا بخش فعال به درستی تشخیص داده شود - id هر section در HTML باید دقیقاً با id در آرایه sections مطابقت داشته باشد - از آیکون برای بخش‌هایی استفاده کنید که معنای بصری مشخصی دارند

نکنید

  • برای کمتر از ۳ بخش از SectionNavigator استفاده نکنید — از Tabs استفاده کنید - label ها را طولانی ننویسید — حداکثر ۲-۳ کلمه کافی است

دسترسی‌پذیری

  • دارای aria-label="ناوبری بخش‌ها" روی عنصر <nav>
  • بخش فعال با aria-current="true" مشخص می‌شود
  • با کیبورد قابل ناوبری

کامپوننت‌های مرتبط

  • Tabs — وقتی تعداد بخش‌ها کم است و محتوا باید جابجا شود، نه اسکرول
  • Stepper — وقتی بخش‌ها ترتیبی هستند و کاربر باید گام‌به‌گام پیش برود