Vitral 0.2
Layout

Splitter

Painéis com uma divisória entre cada par que os redimensiona, arrastando ou pelo teclado, respeitando o mínimo de cada painel.

Importação

main.ts
import { Splitter } from '@vitral/vue';

Horizontal

Três painéis, cada um com min-size 10. Os painéis mostram o próprio tamanho, vindo do evento resize.

25%
50%
25%
resizeend: —
<script setup lang="ts">import { Splitter, SplitterPanel, type SplitterResizeEvent } from '@vitral/vue';import { ref } from 'vue'; const sizes = ref([25, 50, 25]);const ended = ref<number[] | null>(null);const show = (value: number | undefined) => `${Math.round(value ?? 0)}%`;const onResize = (event: SplitterResizeEvent) => (sizes.value = event.sizes);</script> <template>    <Splitter class="demo-splitter" @resize="onResize" @resizeend="ended = $event.sizes">        <SplitterPanel :size="25" :min-size="10"><div class="cell c1">{{ show(sizes[0]) }}</div></SplitterPanel>        <SplitterPanel :size="50" :min-size="10"><div class="cell c2">{{ show(sizes[1]) }}</div></SplitterPanel>        <SplitterPanel :size="25" :min-size="10"><div class="cell c3">{{ show(sizes[2]) }}</div></SplitterPanel>    </Splitter>    <small style="color: var(--vt-text-muted-color)">resizeend: {{ ended ? ended.map((s) => show(s)).join(' · ') : '—' }}</small></template> <style scoped>.demo-splitter {    width: 100%;    height: 12rem;} .cell {    --c: var(--vt-chart-1);    display: flex;    align-items: center;    justify-content: center;    height: 100%;    font-size: 0.8125rem;    font-weight: 600;    color: var(--vt-text-color);    background: color-mix(in srgb, var(--c) 14%, transparent);} .c1 {    --c: var(--vt-chart-1);}.c2 {    --c: var(--vt-chart-2);}.c3 {    --c: var(--vt-chart-3);}</style>

Vertical

layout="vertical" empilha os painéis; as setas passam a ser Up e Down.

top
bottom (min-size 20)
<script setup lang="ts">import { Splitter, SplitterPanel } from '@vitral/vue';</script> <template>    <Splitter class="demo-splitter" layout="vertical" :gutter-size="6">        <SplitterPanel :size="40"><div class="cell c4">top</div></SplitterPanel>        <SplitterPanel :min-size="20"><div class="cell c5">bottom (min-size 20)</div></SplitterPanel>    </Splitter></template> <style scoped>.demo-splitter {    width: 100%;    height: 18rem;} .cell {    --c: var(--vt-chart-1);    display: flex;    align-items: center;    justify-content: center;    height: 100%;    font-size: 0.8125rem;    font-weight: 600;    color: var(--vt-text-color);    background: color-mix(in srgb, var(--c) 14%, transparent);} .c4 {    --c: var(--vt-chart-4);}.c5 {    --c: var(--vt-chart-5);}</style>

Aninhado

Um splitter dentro de um painel o preenche: um explorador ao lado de um editor, sobre um terminal.

explorer
editor
terminal
<script setup lang="ts">import { Splitter, SplitterPanel } from '@vitral/vue';</script> <template>    <Splitter class="demo-splitter">        <SplitterPanel :size="28" :min-size="15"><div class="cell c2">explorer</div></SplitterPanel>        <SplitterPanel>            <Splitter layout="vertical">                <SplitterPanel :size="65"><div class="cell c1">editor</div></SplitterPanel>                <SplitterPanel><div class="cell c3">terminal</div></SplitterPanel>            </Splitter>        </SplitterPanel>    </Splitter></template> <style scoped>.demo-splitter {    width: 100%;    height: 18rem;} .cell {    --c: var(--vt-chart-1);    display: flex;    align-items: center;    justify-content: center;    height: 100%;    font-size: 0.8125rem;    font-weight: 600;    color: var(--vt-text-color);    background: color-mix(in srgb, var(--c) 14%, transparent);} .c1 {    --c: var(--vt-chart-1);}.c2 {    --c: var(--vt-chart-2);}.c3 {    --c: var(--vt-chart-3);}</style>

API

Lido de packages/vue/src/components/Splitter/types.ts, então diz o que o componente aceita de fato.

Props

NomeTipoDescrição
layout'horizontal' | 'vertical'`horizontal` (o padrão) põe os painéis lado a lado; `vertical` os empilha e precisa de uma altura.
gutterSizenumberEspessura do divisor em pixels. O padrão é o token `splitter.gutter.size`.
stepnumberPontos percentuais que uma seta move um divisor.
asstring | Component—

Mais pt, dt e unstyled de BaseProps; veja pass-through e modo sem estilo.

Emits

EventoPayloadDescrição
resizestartevent: SplitterResizeEvent—
resizeevent: SplitterResizeEvent—
resizeendevent: SplitterResizeEvent—

Slots

NomeProps do slotDescrição
default—`SplitterPanel`s; qualquer outra coisa é deixada de fora.