Skip to content

Tabs

Le composant Tabs (onglets), personnalisable et réactif, permet de gérer facilement des ensembles d’onglets accessibles.
Il prend en charge le clavier, les labels personnalisés, les icônes et le rendu dynamique via slots. Respect des normes WAI-ARIA.

Utilisation simple

Utilisation simple

vue
<script setup>
import { ref } from 'vue'
import Tabs from '@/components/Tabs.vue'

const tabs = ref([
  { label: 'Accueil', content: 'Bienvenue sur la page d’accueil.' },
  { label: 'Profil', content: 'Votre espace personnel.' },
  { label: 'Paramètres', content: 'Réglez vos préférences.' }
])
</script>

<template>
  <SuTabs :tabs="tabs" />
</template>

Utilisation avancée (avec slots)

contenu avané en utlisant des slots

vue
<SuTabs :tabs="tabs">
  <template #tab="{ tab }">
    <div style="display: flex; gap: 8px; align-items: center;">
      <Icon :name="tab.icon" />
      <span>{{ tab.label }}</span>
      <Badge v-if="tab.badge" :count="tab.badge" />
    </div>
  </template>
  <template #panel="{ tab }">
    <article>
      <h2>{{ tab.title }}</h2>
      <p>{{ tab.description }}</p>
      <component :is="tab.component" />
    </article>
  </template>
</SuTabs>

API

Props

PropTypeDefaultDescription
modelValuestring | numberundefinedOnglet actif (lié à v-model)
variant'underline' | 'border' | 'pills''underline'Style visuel des onglets
size'sm' | 'md' | 'lg''md'Taille des onglets
align'start' | 'center' | 'end''start'Alignement horizontal
orientation'horizontal' | 'vertical''horizontal'Orientation des onglets
lazybooleanfalseRendu différé du contenu inactif
disabledbooleanfalseDésactive tous les onglets

Events

EventTypeDescription
@update:modelValue(value: string | number) => voidÉmis lors du changement d’onglet
@change(value: string | number) => voidÉmis après le changement d’onglet
@focus(event: FocusEvent) => voidÉmis quand un onglet reçoit le focus

Accessibilité

Le composant Tabs respecte les recommandations WAI-ARIA et WCAG 2.1 AA :

  • Rôles ARIA : tablist, tab, tabpanel
  • Navigation clavier : flèches gauche/droite (ou haut/bas si vertical)
  • Focus visible et conforme
  • Support complet du mode RTL
  • Compatible lecteurs d’écran
  • États ARIA (aria-selected, aria-controls, aria-disabled)

Exemples d’usage avancés

Tabs dynamiques

vue
<script setup>
import { ref } from 'vue'

const tabs = ref([
  { label: 'Vue', content: 'Contenu Vue.js' },
  { label: 'React', content: 'Contenu React' },
  { label: 'Angular', content: 'Contenu Angular' }
])
</script>

<template>
  <SuTabs>
    <SuTab v-for="tab in tabs" :key="tab.label" :label="tab.label">
      {{ tab.content }}
    </SuTab>
  </SuTabs>
</template>

Publié sous licence MIT.