İçeriğe atla

Yeniden boyutlandırılabilir

Kod düzenleyiciler, dosya ağaçları ve kontrol paneli düzenleri için sürüklenebilir bölünmüş paneller — neobrütalist tarzda kenarlık ve gölge efektleriyle.

import {
  ResizableHandle,
  ResizablePanel,

Resizable bileşeni bir alanı, kullanıcının sürükleyerek yeniden oranladığı panellere böler — yatay veya dikey, iç içe kullanılabilir ve klavyeyle çalıştırılabilen tutamaçlara sahiptir. Her iki varyant da bvaughn tarafından geliştirilen react-resizable-panels kütüphanesini sarar ve neobrütalist reçeteye göre stillendirilmiştir: kalın kenarlıklar, keskin gölgeler ve iddialı tipografi.

Şu durumlarda tercih edin:

  • Kod editörleri ve IDE tarzı düzenler — kullanıcıların istedikleri gibi boyutlandırdığı dosya ağacı, editör ve önizleme bölmeleri.
  • Ana–detay görünümleri — gelen kutusu ile yazışma, tablo ile kayıt inceleyici; ayırıcı tam kullanıcının istediği yerde durur.
  • Gösterge panelleri ve konsollar — bir log bölmesinin veya terminalin, modal açmadan ana görünümden yükseklik almasına izin verin.

Hakkında

Resizable bileşeni, bvaughn tarafından geliştirilen react-resizable-panels üzerine kuruludur.

Kurulum

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

Aşağıdaki bağımlılıkları yükleyin:

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

Aşağıdaki kodu kopyalayıp projenize yapıştırın.

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 }

İçe aktarma yollarını proje kurulumunuza göre güncelleyin.

Kullanım

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

Kompozisyon

Bir ResizablePanelGroup oluşturmak için aşağıdaki kompozisyonu kullanın:

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

Örnekler

Dikey

Dikey yeniden boyutlandırma için orientation="vertical" kullanın.

import {
  ResizableHandle,
  ResizablePanel,

Tutamaç

Görünür bir tutamaç göstermek için ResizableHandle üzerinde withHandle prop'unu kullanın.

import {
  ResizableHandle,
  ResizablePanel,

RTL

Neobrutalism'de RTL desteğini etkinleştirmek için RTL yapılandırma kılavuzuna bakın.

"use client"

import * as React from "react"

Erişilebilirlik

Tutamaç, WAI-ARIA Window Splitter desenini izler: react-resizable-panels her tutamacı, aria-valuenow / aria-valuemin / aria-valuemax öznitelikleri ve yeniden boyutlandırdığı paneli işaret eden aria-controls ile odaklanabilir bir role="separator" öğesi olarak işler; böylece ekran okuyucular bölme konumunu değiştikçe duyurur.

Klavye etkileşimleri:

TuşEylem
Tab / Shift + TabOdağı bir yeniden boyutlandırma tutamacına taşır / tutamaçtan uzaklaştırır
ArrowLeft / ArrowRightYatay bir grubu bir adım yeniden boyutlandırır
ArrowUp / ArrowDownDikey bir grubu bir adım yeniden boyutlandırır
HomeTutamaçtan önceki paneli en küçük boyutuna küçültür
EndTutamaçtan önceki paneli en büyük boyutuna büyütür
EnterDaraltılabilir bir paneli daraltılmış ve genişletilmiş durumlar arasında değiştirir

API Referansı

react-resizable-panels belgelerine bakın.

Değişiklik Günlüğü

2025-02-02 react-resizable-panels v4

react-resizable-panels v4'e güncellendi. Tüm ayrıntılar için v4.0.0 sürüm notlarına bakın.

react-resizable-panels ilkellerini doğrudan kullanıyorsanız, aşağıdaki değişiklikleri göz önünde bulundurun:

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