Lewati ke konten

Dapat diubah ukuran

Panel terpisah yang dapat diseret untuk editor kode, pohon file, dan tata letak dasbor — dengan sentuhan gaya neobrutalis berupa garis tepi dan bayangan.

import {
  ResizableHandle,
  ResizablePanel,

Komponen resizable membagi sebuah area menjadi panel-panel yang dapat diseret pengguna untuk mengatur ulang proporsinya — horizontal maupun vertikal, dapat disarangkan, dengan pegangan yang bisa dioperasikan lewat keyboard. Kedua varian membungkus react-resizable-panels karya bvaughn, ditata dengan resep neobrutalis: garis tepi tebal, bayangan keras, dan tipografi tebal.

Cocok digunakan untuk:

  • Editor kode dan tata letak bergaya IDE — panel pohon berkas, editor, dan pratinjau yang ukurannya diatur sesuai selera pengguna.
  • Tampilan master–detail — kotak masuk dan utas, tabel dan inspektur rekaman, dengan pembatas di posisi yang diinginkan pengguna.
  • Dasbor dan konsol — biarkan panel log atau terminal mengambil tinggi dari tampilan utama tanpa modal.

Tentang

Komponen Resizable dibangun di atas react-resizable-panels oleh bvaughn.

Instalasi

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

Instal dependensi berikut:

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

Salin dan tempel kode berikut ke dalam proyek Anda.

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 }

Perbarui jalur impor agar sesuai dengan pengaturan proyek Anda.

Penggunaan

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

Komposisi

Gunakan komposisi berikut untuk membangun ResizablePanelGroup:

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

Contoh

Vertikal

Gunakan orientation="vertical" untuk pengubahan ukuran secara vertikal.

import {
  ResizableHandle,
  ResizablePanel,

Pegangan

Gunakan prop withHandle pada ResizableHandle untuk menampilkan pegangan yang terlihat.

import {
  ResizableHandle,
  ResizablePanel,

RTL

Untuk mengaktifkan dukungan RTL di Neobrutalism, lihat panduan konfigurasi RTL.

"use client"

import * as React from "react"

Aksesibilitas

Pegangannya mengikuti pola Window Splitter WAI-ARIA: react-resizable-panels merender setiap pegangan sebagai role="separator" yang dapat difokus, dengan aria-valuenow / aria-valuemin / aria-valuemax serta aria-controls yang menunjuk ke panel yang diubah ukurannya, sehingga pembaca layar mengumumkan posisi pembagian setiap kali berubah.

Interaksi keyboard:

TombolAksi
Tab / Shift + TabMemindahkan fokus ke / dari pegangan ubah ukuran
ArrowLeft / ArrowRightMengubah ukuran grup horizontal sebesar satu langkah
ArrowUp / ArrowDownMengubah ukuran grup vertikal sebesar satu langkah
HomeMenyusutkan panel di depan pegangan ke ukuran minimumnya
EndMembesarkan panel di depan pegangan ke ukuran maksimumnya
EnterMengalihkan panel yang dapat dilipat antara keadaan terlipat dan terbentang

Referensi API

Lihat dokumentasi react-resizable-panels.

Catatan Perubahan

2025-02-02 react-resizable-panels v4

Diperbarui ke react-resizable-panels v4. Lihat catatan rilis v4.0.0 untuk detail lengkap.

Jika Anda menggunakan primitif react-resizable-panels secara langsung, perhatikan perubahan berikut:

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