پرش به محتوا

قابل تغییر اندازه

پنل‌های قابل‌کشیدن برای ویرایشگرهای کد، درخت‌های فایل و چیدمان‌های داشبورد — با جلوه‌ی نئوبروتالیستی مرزها و سایه‌ها.

import {
  ResizableHandle,
  ResizablePanel,

کامپوننت resizable یک ناحیه را به پنل‌هایی تقسیم می‌کند که کاربر با drag نسبت‌شان را عوض می‌کند — افقی یا عمودی، قابل‌تو در تو، با handle قابل‌عملکرد با صفحه‌کلید. هر دو variant کتابخانهٔ react-resizable-panels از bvaughn را می‌پیچند، با دستور پخت نئوبروتالیستی: حاشیه‌های ضخیم، سایه‌های سخت و تایپوگرافی پررنگ.

برای این موارد از آن استفاده کنید:

  • ویرایشگر کد و layout شبیه IDE — پنل درخت فایل، editor و preview که کاربر به سلیقه اندازه می‌دهد.
  • نمای master–detail — inbox و thread، جدول و inspector رکورد، با divider جایی که کاربر می‌خواهد.
  • داشبورد و console — بگذارید پنل log یا terminal ارتفاع را از نمای اصلی بگیرد بدون مدال.

درباره

کامپوننت Resizable بر پایهٔ react-resizable-panels ساختهٔ bvaughn بنا شده است.

نصب

pnpm dlx shadcn@latest add https://neobrutalism.com/r/base/resizable.json
npx shadcn@latest add https://neobrutalism.com/r/base/resizable.json
yarn dlx shadcn@latest add https://neobrutalism.com/r/base/resizable.json
bunx --bun shadcn@latest add https://neobrutalism.com/r/base/resizable.json

وابستگی‌های زیر را نصب کنید:

pnpm add react-resizable-panels
npm install react-resizable-panels
yarn add react-resizable-panels
bun add react-resizable-panels

کد زیر را کپی کرده و در پروژهٔ خود جای‌گذاری کنید.

components/ui/resizable.tsx
"use client"

import * as ResizablePrimitive from "react-resizable-panels"

import { cn } from "@/lib/utils"

function ResizablePanelGroup({
  className,
  ...props
}: ResizablePrimitive.GroupProps) {
  return (
    <ResizablePrimitive.Group
      data-slot="resizable-panel-group"
      className={cn(
        "flex h-full w-full aria-[orientation=vertical]:flex-col",
        className
      )}
      {...props}
    />
  )
}

function ResizablePanel({ ...props }: ResizablePrimitive.PanelProps) {
  return <ResizablePrimitive.Panel data-slot="resizable-panel" {...props} />
}

function ResizableHandle({
  withHandle,
  className,
  ...props
}: ResizablePrimitive.SeparatorProps & {
  withHandle?: boolean
}) {
  return (
    <ResizablePrimitive.Separator
      data-slot="resizable-handle"
      className={cn(
        "relative flex w-px items-center justify-center bg-border after:absolute after:inset-y-0 after:left-1/2 after:w-1 after:-translate-x-1/2 focus-visible:outline-2 focus-visible:outline-offset-2 focus-visible:outline-primary aria-[orientation=horizontal]:h-px aria-[orientation=horizontal]:w-full aria-[orientation=horizontal]:after:left-0 aria-[orientation=horizontal]:after:h-1 aria-[orientation=horizontal]:after:w-full aria-[orientation=horizontal]:after:translate-x-0 aria-[orientation=horizontal]:after:-translate-y-1/2 [&[aria-orientation=horizontal]>div]:rotate-90",
        className
      )}
      {...props}
    >
      {withHandle && (
        <div className="z-10 flex h-6 w-1 shrink-0 rounded-lg bg-border" />
      )}
    </ResizablePrimitive.Separator>
  )
}

export { ResizableHandle, ResizablePanel, ResizablePanelGroup }

مسیرهای import را مطابق با پیکربندی پروژهٔ خود به‌روزرسانی کنید.

استفاده

import {
  ResizableHandle,
  ResizablePanel,
  ResizablePanelGroup,
} from "@/components/ui/resizable"
<ResizablePanelGroup orientation="horizontal">
  <ResizablePanel>One</ResizablePanel>
  <ResizableHandle />
  <ResizablePanel>Two</ResizablePanel>
</ResizablePanelGroup>

ترکیب

برای ساخت یک ResizablePanelGroup، از ترکیب زیر استفاده کنید:

ResizablePanelGroup
├── ResizablePanel
├── ResizableHandle
└── ResizablePanel

نمونه‌ها

عمودی

برای تغییر اندازه به‌صورت عمودی، از orientation="vertical" استفاده کنید.

import {
  ResizableHandle,
  ResizablePanel,

دستگیره

برای نمایش یک دستگیرهٔ قابل‌مشاهده، از ویژگی withHandle روی ResizableHandle استفاده کنید.

import {
  ResizableHandle,
  ResizablePanel,

RTL

برای فعال‌سازی پشتیبانی RTL در Neobrutalism، راهنمای پیکربندی RTL را ببینید.

"use client"

import * as React from "react"

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

Handle از الگوی WAI-ARIA Window Splitter پیروی می‌کند: react-resizable-panels هر handle را به‌صورت role="separator" focusable با aria-valuenow / aria-valuemin / aria-valuemax و aria-controls اشاره‌کننده به پنلی که resize می‌کند رندر می‌کند تا صفحه‌خوان موقعیت split را هنگام تغییر اعلام کند.

تعاملات صفحه‌کلید:

کلیدعمل
Tab / Shift + Tabانتقال فوکوس به / از handle تغییر اندازه
ArrowLeft / ArrowRightتغییر اندازهٔ گروه افقی به‌اندازهٔ یک گام
ArrowUp / ArrowDownتغییر اندازهٔ گروه عمودی به‌اندازهٔ یک گام
Homeکوچک کردن پنل قبل از handle تا حداقل اندازه
Endبزرگ کردن پنل قبل از handle تا حداکثر اندازه
Entertoggle پنل collapsible بین جمع‌شده و باز

مرجع API

مستندات react-resizable-panels را ببینید.

تاریخچهٔ تغییرات

2025-02-02 react-resizable-panels v4

به react-resizable-panels v4 به‌روزرسانی شد. برای مشاهدهٔ جزئیات کامل، یادداشت‌های انتشار v4.0.0 را ببینید.

اگر مستقیماً از عناصر اولیهٔ react-resizable-panels استفاده می‌کنید، به تغییرات زیر توجه کنید:

v3v4
PanelGroupGroup
PanelResizeHandleSeparator
direction proporientation prop
defaultSize={50}defaultSize="50%"
onLayoutonLayoutChange
ImperativePanelHandlePanelImperativeHandle
ref prop on PanelpanelRef prop
data-panel-group-directionaria-orientation