پرتوپرتو

نصب و راه‌اندازی

راهنمای کامل نصب و پیکربندی دیزاین سیستم پرتو در پروژه Next.js

دو روش راه‌اندازی

روشمناسب برای
با Claude Codeوایب‌کدرها — پلاگین همه چیز را خودکار اعمال می‌کند
دستیتوسعه‌دهندگان فنی — کنترل کامل روی هر فایل

روش اول — با Claude Code (توصیه‌شده)

اگر Claude Code و پلاگین پرتو نصب دارید، نیاز به هیچ‌کدام از مراحل دستی زیر نیست:

# ۱. نصب پلاگین (یک بار، هر جای دیسک)
git clone https://github.com/dadenegarco/parto-ui.git ~/parto-ui
// ۲. فعال‌سازی — .claude/settings.json در ریشه پروژه
{ "plugins": ["/Users/your-username/parto-ui/claude-plugin"] }
# ۳. در Claude Code اجرا کنید
/parto:setup

این دستور پروژه را اسکن می‌کند و به‌صورت خودکار next.config.mjs، tailwind.config.ts، و layout.tsx را تنظیم می‌کند.

برای راهنمای کامل پلاگین → پلاگین Claude Code


روش دوم — نصب دستی

پیش‌نیازها

  • Node.js 18 یا بالاتر
  • pnpm (توصیه‌شده)
  • Next.js 14 یا بالاتر
  • React 18 یا بالاتر

نصب

pnpm add @parto-system-design/ui next-themes

راه‌اندازی در Next.js

۱. پیکربندی next.config.mjs

پکیج باید حتماً در transpilePackages قرار بگیرد، در غیر این صورت build شکست می‌خورد:

// next.config.mjs
/** @type {import('next').NextConfig} */
const nextConfig = {
  transpilePackages: ['@parto-system-design/ui'],
}

export default nextConfig

۲. وارد کردن CSS

استایل‌ها در یک فایل جداگانه توزیع می‌شوند. آن‌ها را در app/layout.tsx وارد کنید:

import '@parto-system-design/ui/styles.css'

۳. پیکربندی Tailwind

محتوای dist پکیج را به content در tailwind.config.ts اضافه کنید تا Tailwind کلاس‌های کتابخانه را purge نکند:

// tailwind.config.ts
import type { Config } from 'tailwindcss'

const config: Config = {
  darkMode: ['class', '[data-theme*="dark"]'],
  content: [
    './app/**/*.{ts,tsx}',
    './components/**/*.{ts,tsx}',
    './node_modules/@parto-system-design/ui/dist/**/*.{js,mjs}',
  ],
}

export default config

۴. تنظیم layout

// app/layout.tsx
import type { Metadata } from 'next'
import { ThemeProvider } from 'next-themes'
import '@parto-system-design/ui/styles.css'
import './globals.css'

export const metadata: Metadata = {
  title: 'اپلیکیشن من',
}

export default function RootLayout({ children }: { children: React.ReactNode }) {
  return (
    <html lang="fa" dir="rtl" suppressHydrationWarning>
      <body>
        <ThemeProvider attribute="class" defaultTheme="light" themes={['light', 'dark']}>
          {children}
        </ThemeProvider>
      </body>
    </html>
  )
}

استفاده اولیه

پس از راه‌اندازی، می‌توانید کامپوننت‌ها را import و استفاده کنید:

import { Button, Card, CardContent, CardHeader, CardTitle } from '@parto-system-design/ui'

export default function Page() {
  return (
    <Card>
      <CardHeader>
        <CardTitle>عنوان کارت</CardTitle>
      </CardHeader>
      <CardContent>
        <p className="text-light">محتوای کارت</p>
        <Button className="mt-4">اقدام کنید</Button>
      </CardContent>
    </Card>
  )
}

اضافه کردن تغییر تم

'use client'

import { useTheme } from 'next-themes'
import { Button } from '@parto-system-design/ui'

export function ThemeSwitcher() {
  const { theme, setTheme } = useTheme()

  return (
    <div className="flex gap-2">
      <Button variant={theme === 'light' ? 'default' : 'outline'} size="small" onClick={() => setTheme('light')}>
        روشن
      </Button>
      <Button variant={theme === 'dark' ? 'default' : 'outline'} size="small" onClick={() => setTheme('dark')}>
        تاریک
      </Button>
    </div>
  )
}

نکات مهم

نکتهتوضیح
transpilePackagesبدون این تنظیم Next.js پکیج را کامپایل نمی‌کند و build شکست می‌خورد
styles.cssاستایل‌ها جداگانه هستند — import را فراموش نکنید
suppressHydrationWarningروی <html> لازم است تا هیدراسیون تم بدون warning باشد
dir="rtl"برای کارکرد صحیح CSS Logical Properties الزامی است
lang="fa"برای screen readerها و موتورهای جستجو لازم است

راه‌اندازی در Vite (React)

پکیج پرتو با Vite نیز کار می‌کند. transpilePackages مخصوص Next.js است و برای Vite لازم نیست.

۱. نصب

pnpm add @parto-system-design/ui next-themes

۲. وارد کردن CSS

در src/main.tsx:

import '@parto-system-design/ui/styles.css'
import './index.css'

۳. پیکربندی Tailwind

// tailwind.config.ts
const config: Config = {
  darkMode: ['class', '[data-theme*="dark"]'],
  content: ['./src/**/*.{ts,tsx}', './node_modules/@parto-system-design/ui/dist/**/*.{js,mjs}'],
}

۴. تنظیم HTML و ThemeProvider

در index.html:

<html lang="fa" dir="rtl"></html>

در src/main.tsx یا src/App.tsx:

import { ThemeProvider } from 'next-themes'

function App() {
  return (
    <ThemeProvider attribute="class" defaultTheme="light" themes={['light', 'dark']}>
      {/* محتوای اپلیکیشن */}
    </ThemeProvider>
  )
}

نکته: Hydration warning در Vite/SPA وجود ندارد — suppressHydrationWarning نیاز نیست.


مشکلات رایج و راه‌حل

کامپوننت‌ها بدون استایل نمایش داده می‌شوند

علت: CSS import فراموش شده یا مسیر اشتباه است.

// ✅ درست — در app/layout.tsx
import '@parto-system-design/ui/styles.css'

// ❌ اشتباه — import از index.js نه styles
import '@parto-system-design/ui'

خطای build: SyntaxError: Cannot use import statement

علت: پکیج در transpilePackages نیست.

// next.config.mjs ✅
const nextConfig = {
  transpilePackages: ['@parto-system-design/ui'],
}

کلاس‌های Tailwind کار نمی‌کنند

علت: مسیر dist به content پیکربندی Tailwind اضافه نشده و Tailwind کلاس‌ها را purge کرده.

// tailwind.config.ts ✅
content: [
  // ...
  './node_modules/@parto-system-design/ui/dist/**/*.{js,mjs}',
]

تم پس از refresh به حالت پیش‌فرض برمی‌گردد

علت: suppressHydrationWarning روی <html> نیست یا attribute="class" در ThemeProvider جا افتاده.

// ✅ درست
<html lang="fa" dir="rtl" suppressHydrationWarning>
  <body>
    <ThemeProvider attribute="class" defaultTheme="light">

layout کامپوننت‌ها معکوس است (RTL کار نمی‌کند)

علت: dir="rtl" روی <html> نیست. CSS Logical Properties به این attribute نیاز دارند.

// ✅ لازم است
<html lang="fa" dir="rtl">

هشدار hydration mismatch در کنسول

علت: کامپوننت‌های تم-aware بین SSR و CSR تفاوت دارند. این طبیعی است و با suppressHydrationWarning برطرف می‌شود.

<html suppressHydrationWarning>  {/* این warning را حذف می‌کند */}