الانتقال إلى المحتوى

قابل لتغيير الحجم

أجزاء قابلة للسحب لمحررات الأكواد، وأشجار الملفات، وتصميمات لوحات التحكم — مع لمسة «النيوبروتاليزم» في الحواف والظلال.

import {
  ResizableHandle,
  ResizablePanel,

يقوم المكون القابل لتغيير الحجم بتقسيم منطقة ما إلى لوحات يقوم المستخدم بسحبها لتعديل أبعادها — أفقياً أو رأسياً، وقابلة للتداخل، مع مقابض يمكن التحكم فيها بواسطة لوحة المفاتيح. ويحيط كلا النوعين بـ react-resizable-panels بواسطة bvaughn، مع تصميم يتبع أسلوب «النيوبروتالية»: حدود سميكة، وظلال حادة، وخط عريض.

استخدمه عندما:

  • محررات الأكواد والتخطيطات على غرار بيئات التطوير المتكاملة (IDE) — شجرة الملفات، والمحرر، وألواح المعاينة التي يضبط المستخدم حجمها حسب رغبته.
  • طرق عرض «الرئيسي – التفصيلي» — صندوق الوارد والمواضيع، والجداول ومفتش السجلات، مع وجود الفاصل في المكان الذي يريده المستخدم.
  • لوحات المعلومات ووحدات التحكم — اسمح لجدار السجل أو المحطة الطرفية بأن تأخذ جزءًا من ارتفاع العرض الرئيسي دون الحاجة إلى نافذة منبثقة.

حول

مكوّن 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 {
  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"

إمكانية الوصول

يتبع المقبض نمط WAI-ARIA Window Splitter pattern: حيث يعرض react-resizable-panels كل مقبض على أنه عنصر role="separator" قابل للتركيز مع aria-valuenow / aria-valuemin / aria-valuemax و aria-controls تشير إلى اللوحة التي يتم تغيير حجمها، بحيث تعلن برامج قراءة الشاشة عن موضع التقسيم كلما تغير.

تفاعلات لوحة المفاتيح:

المفتاحالإجراء
Tab / Shift + Tabنقل التركيز إلى / بعيدًا عن مقبض تغيير الحجم
ArrowLeft / ArrowRightتغيير حجم مجموعة أفقية بمقدار خطوة واحدة
ArrowUp / ArrowDownتغيير حجم مجموعة رأسية بمقدار خطوة واحدة
Homeتقليص اللوحة الموجودة أمام مقبض التغيير إلى حجمها الأدنى
Endتوسيع اللوحة الموجودة أمام مقبض التغيير إلى حجمها الأقصى
Enterالتبديل بين حالة الطي والتوسيع للوحة القابلة للطي

مرجع API

راجع وثائق react-resizable-panels.

Changelog

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