コンテンツ
リサイズ可能ResizableExperimental
キーボード操作にも対応した、リサイズ可能な分割パネルレイアウトです。
プレビュー
状態とバリエーション
水平分割
サイドバーとメイン領域のような左右分割に使います。
垂直分割
プレビューとログ、エディタとコンソールなど上下分割に使います。
入れ子
ファイル、エディタ、ターミナルのような複合ワークスペースを作ります。
3 カラム
ナビゲーション、本文、インスペクターのような横 3 分割を構成します。
折りたたみ可能
補助パネルを最小化できるレイアウトにします。
プロパティ
表は横にスクロールできます
| プロパティ | 型 | 初期値 | 説明 |
|---|---|---|---|
| direction | "vertical" | "horizontal" | - | 分割方向です。ResizablePanelGroup に指定します。 |
| defaultLayout | Record<string, number> | - | パネル ID ごとの初期比率です。ハンドルをダブルクリックした時のリセット先にも使います。 |
| groupRef | Ref<GroupImperativeHandle> | - | 現在の比率取得や setLayout によるレイアウト変更に使います。 |
| onLayoutChange / onLayoutChanged | (layout: Record<string, number>) => void | - | パネルサイズが変わる時、または変更完了時に呼び出されます。 |
| defaultSize | number | string | - | ResizablePanel の初期サイズです。割合で使う場合は "32%" のように単位を明示します。 |
| minSize / maxSize | number | string | - | ResizablePanel の最小/最大サイズです。割合指定では "20%" のように書きます。 |
| collapsible | boolean | - | パネルを折りたためるようにします。 |
| withHandle | boolean | - | ResizableHandle に視覚的なグリップを表示します。 |
使い方
import {
ResizableHandle,
ResizablePanel,
ResizablePanelGroup,
} from "@gunjo/ui";
export function ResizableWorkspace() {
return (
<div className="h-64 w-full max-w-2xl overflow-hidden rounded-lg border">
<ResizablePanelGroup direction="horizontal" defaultLayout={{
sidebar: 32,
canvas: 68,
}} className="h-full w-full">
<ResizablePanel id="sidebar" defaultSize="32%" minSize="20%">
<div className="flex h-full items-center justify-center p-4">サイドバー</div>
</ResizablePanel>
<ResizableHandle withHandle />
<ResizablePanel id="canvas" defaultSize="68%" minSize="40%">
<div className="flex h-full items-center justify-center p-4">キャンバス</div>
</ResizablePanel>
</ResizablePanelGroup>
</div>
);
}設計の判断
- 数字はピクセルではなく割合として読む。資料は「最小と最大の制約を必ず設ける」を核に挙げています。GUNJO は
defaultSizeとminSizeとmaxSizeに素の数字を渡したとき、それを割合として扱います。土台の react-resizable-panels は素の数字をピクセルとして読むので、maxSizeに55を渡すと「55px」になり、分割が黙って壊れていました(#133)。ピクセルで指定したいときは200pxのように文字列で渡します。 - 元に戻す手段を、保存より先に用意した。資料は「リサイズの結果を localStorage に保存する」を挙げています。GUNJO はまず戻せることを入れました。
ResizablePanelGroupにdefaultLayoutを渡しておくと、仕切りをダブルクリックで初期の配分に戻ります。保存そのものは部品に入れていません。どのキーで保存し、いつ捨てるかは画面ごとに違うためです。 - 線は1pxだが、掴める幅はもっと広い。見た目は1pxですが、
after:の疑似要素で前後に当たり判定を足してあるので、細い線を狙わなくても掴めます。withHandleを渡すと、掴む場所が分かるグリップも出ます。資料が求めるキーボード操作とroleの付与は、土台のライブラリが持ちます。
使用コンポーネント
関連コンポーネント
いつ・なぜ使うか(UIXHERO)
「いつ・なぜ使うか」の判断は、姉妹サイト UIXHERO の記事で解説しています。