본문으로 건너뛰기

Panes

하나의 박스를 여러 영역으로 나누고 그 사이마다 끌 수 있는 바를 둡니다. 파일 목록 옆의 편집기, 폼 옆의 미리보기처럼 비율을 읽는 사람이 정하는 분할에 씁니다.

tsx
import { Pane, Panes } from 'neba';

<Panes>
  <Pane defaultSize="240px" minSize="160px">
    Files
  </Pane>
  <Pane>Editor</Pane>
</Panes>;

Panes는 자신이 놓인 박스를 채우므로, 그 박스에 높이를 주어야 합니다.

Props

Panes

Prop타입기본값설명
orientation공통'horizontal' | 'vertical''horizontal'pane들이 놓이는 방향. horizontal은 좌우로 늘어놓고 그 사이에 세로 바를, vertical은 위아래로 쌓고 가로 바를 둡니다
resizablebooleantruepane 사이의 바를 끌 수 있는지. 컨트롤이 아니라 레이아웃으로 쓸 분할이라면 끕니다
size공통'xs' | 'sm' | 'md' | 'lg' | 'xl''md'바의 두께이자 포인터가 맞춰야 할 과녁의 폭. 보이는 것은 1px 선이지만 잡을 수 있는 폭은 그보다 넓습니다
color공통'primary' | 'secondary' | 'success' | 'warning' | 'danger' | 'info''primary'바가 켜질 때의 색 계열. Panes는 시트를 그리지 않으므로 색은 선과 포커스 링에만 나타납니다
onResize(sizes: number[]) => void끄는 동안 모든 pane의 비율(%)을 알려줍니다
onResizeEnd(sizes: number[]) => void바를 놓았을 때 같은 모양으로 한 번
childrenReactNodePane들. 크기 제약은 자식의 props에서 읽으므로 직접 자식이 Pane이어야 합니다. 무언가로 감싼 Pane은 최소 크기가 없는 pane이 됩니다

나머지 <div> 속성은 그대로 전달됩니다. 직접 자식은 Pane이어야 합니다. 크기 제약을 그 props에서 읽기 때문입니다. 공용 축은 prop 규약에 있습니다.

Pane

Prop타입기본값설명
defaultSizenumber | string처음 차지할 몫. 숫자는 퍼센트, 문자열은 길이(240px, 15rem, 20%)입니다. 값을 주지 않은 pane들은 남은 자리를 똑같이 나눠 갖습니다
minSizenumber | string0얼마까지 줄일 수 있는지. 이웃 pane의 최대치이기도 합니다
maxSizenumber | string얼마까지 키울 수 있는지. 생략하면 제한이 없습니다
childrenReactNodepane 안에 들어가는 것. Pane 자체는 시트를 그리지 않으므로, 표면이 필요하면 안에 Box나 Card를 넣습니다

나머지 <div> 속성은 그대로 전달됩니다.

예시

orientation

horizontal은 pane들을 좌우로 늘어놓고 그 사이에 세로 바를, vertical은 위아래로 쌓고 가로 바를 둡니다. 바는 언제나 pane들이 놓인 축을 가로지릅니다.

defaultSize · minSize · maxSize

셋 다 숫자(퍼센트로 읽습니다)나 CSS 길이('240px', '15rem', '20%')를 받습니다. defaultSize가 없는 pane들은 남은 자리를 똑같이 나눠 갖습니다. 어떤 pane의 minSize는 이웃 pane의 최대치이기도 하므로, 끌기는 먼저 닿는 한계에서 멈춥니다.

onResize는 바가 움직이는 동안 모든 pane의 비율(%)을 알려주고, onResizeEnd는 바를 놓았을 때 한 번 호출됩니다.

중첩

Pane 안의 Panes는 분할 안의 분할이며, 세 영역짜리 레이아웃은 이렇게 만듭니다. 안쪽에는 반대 orientation을 주세요.

tsx
<Panes>
  <Pane defaultSize="240px">Files</Pane>
  <Pane>
    <Panes orientation="vertical">
      <Pane defaultSize={70}>Editor</Pane>
      <Pane>Terminal</Pane>
    </Panes>
  </Pane>
</Panes>

resizable

resizable={false}는 바를 pane 사이의 선으로만 남깁니다. 그려지기는 하지만 끌 수 없고 tab 순서에서도 빠집니다.

접근성

  • 각 바는 separator이며, 앞에 있는 pane의 비율(%)을 aria-valuenow로 실어 나릅니다.
  • 바는 focus를 받습니다. 세로 바는 ArrowLeft·ArrowRight로, 가로 바는 ArrowUp·ArrowDown으로 움직입니다.
  • aria-orientation은 pane이 아니라 바를 설명합니다. 좌우로 놓인 pane 사이의 세로 바는 vertical입니다.
  • RTL에서도 끌기는 포인터가 간 방향으로 경계를 옮깁니다.

Released under the MIT License