Vitral 0.2
Mídia

Galleria

Imagens com miniaturas, indicadores, rotação e modo de tela cheia.

Importação

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

Miniaturas

1 de 8
Photograph 1
Photograph 1
<script setup lang="ts">import { Galleria } from '@vitral/vue';import { ref } from 'vue'; const photos = [1011, 1012, 1013, 1014, 1015, 1016, 1018, 1019].map((id, i) => ({ id, alt: `Photograph ${i + 1}` }));const index = ref(0);</script> <template>    <Galleria v-model:active-index="index" :value="photos" :num-visible="5" show-item-navigators aria-label="Photographs" style="max-width: 40rem">        <template #item="{ item }">            <img width="800" height="450" :src="`https://picsum.photos/id/${(item as { id: number }).id}/800/450`" :alt="(item as { alt: string }).alt" style="display: block; width: 100%; height: auto" />        </template>        <template #thumbnail="{ item }">            <img width="120" height="80" :src="`https://picsum.photos/id/${(item as { id: number }).id}/120/80`" alt="" style="display: block; width: 100%; height: auto" />        </template>        <template #caption="{ item }">{{ (item as { alt: string }).alt }}</template>    </Galleria></template>

Transições

Como uma imagem dá lugar à próxima, pelo nome. Os presets são definidos uma vez e compartilhados com o Carousel, e todos param sob prefers-reduced-motion.

1 de 8
Photograph 1
<script setup lang="ts">import { Galleria, SelectButton, StackPanel, transitionPresets, type TransitionPreset } from '@vitral/vue';import { ref } from 'vue'; const photos = [1011, 1012, 1013, 1014, 1015, 1016, 1018, 1019].map((id, i) => ({ id, alt: `Photograph ${i + 1}` }));const shown = ref(0);const preset = ref<TransitionPreset>('fade');const presetOptions = transitionPresets.map((value) => ({ label: value[0]!.toUpperCase() + value.slice(1), value }));</script> <template>    <StackPanel spacing="0.75rem" style="flex: 1 1 100%; min-width: 0">        <SelectButton v-model="preset" :options="presetOptions" option-label="label" option-value="value" size="small" :allow-empty="false" aria-label="Transition" />        <Galleria            v-model:active-index="shown"            :value="photos"            :transition="preset"            :num-visible="5"            show-item-navigators            aria-label="Photographs, with a transition"            style="max-width: 40rem"        >            <template #item="{ item }">                <img :src="`https://picsum.photos/id/${(item as { id: number }).id}/800/450`" :alt="(item as { alt: string }).alt" width="800" height="450" style="display: block; width: 100%; height: auto" />            </template>            <template #thumbnail="{ item }">                <img :src="`https://picsum.photos/id/${(item as { id: number }).id}/120/80`" alt="" width="120" height="80" style="display: block; width: 100%; height: auto" />            </template>        </Galleria>    </StackPanel></template>

Indicadores e rotação

1 de 8
Photograph 1
<script setup lang="ts">import { Galleria } from '@vitral/vue'; const photos = [1011, 1012, 1013, 1014, 1015, 1016, 1018, 1019].map((id, i) => ({ id, alt: `Photograph ${i + 1}` }));</script> <template>    <Galleria :value="photos" :show-thumbnails="false" show-indicators auto-play :transition-interval="3000" aria-label="Photographs, rotating" style="max-width: 32rem">        <template #item="{ item }">            <img width="640" height="360" :src="`https://picsum.photos/id/${(item as { id: number }).id}/640/360`" :alt="(item as { alt: string }).alt" style="display: block; width: 100%; height: auto" />        </template>    </Galleria></template>

Tela cheia

<script setup lang="ts">import { Button, Galleria } from '@vitral/vue';import { ref } from 'vue'; const photos = [1011, 1012, 1013, 1014, 1015, 1016, 1018, 1019].map((id, i) => ({ id, alt: `Photograph ${i + 1}` }));const visible = ref(false);const index = ref(0);</script> <template>    <Button label="Open gallery" icon="image" @click="visible = true" />    <Galleria v-model:visible="visible" v-model:active-index="index" :value="photos" full-screen show-item-navigators circular aria-label="Photographs, full screen">        <template #item="{ item }">            <img width="1200" height="675" :src="`https://picsum.photos/id/${(item as { id: number }).id}/1200/675`" :alt="(item as { alt: string }).alt" style="display: block; width: 100%; height: auto" />        </template>        <template #thumbnail="{ item }">            <img width="120" height="80" :src="`https://picsum.photos/id/${(item as { id: number }).id}/120/80`" alt="" style="display: block; width: 100%; height: auto" />        </template>    </Galleria></template>

API

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

Props

NomeTipoDescrição
valueany[]—
numVisiblenumberMiniaturas mostradas de uma vez. O padrão é 3.
fullScreenbooleanMostra num modal sobre a página, aberto com `v-model:visible`.
showThumbnailsbooleanO padrão é true.
thumbnailsPosition'bottom' | 'top' | 'left' | 'right'—
showItemNavigatorsbooleanBotões de anterior e próximo sobre o item.
showThumbnailNavigatorsbooleanBotões de anterior e próximo ao lado das miniaturas. O padrão é true.
showIndicatorsbooleanPontos abaixo do item.
circularbooleanDá a volta: o último item é seguido pelo primeiro. Ligado por padrão — uma galeria que para de repente no fim faz o leitor voltar por tudo o que acabou de ver para chegar à outra ponta.
autoPlaybooleanPassa pelos itens sozinha; vem com um botão de pausa.
transitionIntervalnumberMilissegundos entre itens durante a reprodução. O padrão é 4000.
transitionTransitionPresetComo um item dá lugar ao próximo: `'fade'`, `'slide'`, `'push'`, `'cover'`, `'zoom'`, `'flip'`, ou `'none'`, que é o padrão — uma galeria navegada depressa fica melhor trocando na hora.
ariaLabelstringDá nome à galeria.

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

Emits

EventoPayloadDescrição
update:activeIndexindex: number—
update:visiblevisible: boolean—

Slots

NomeProps do slotDescrição
item(props: { item: unknown; index: number })—
thumbnail(props: { item: unknown; index: number })—
caption(props: { item: unknown; index: number })—
indicator(props: { index: number; active: boolean })—
header——
footer——