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
tabsTabItem[]undefinedOnglets à afficher (label, content, champs libres pour les slots)
modelValuenumber0Index de l’onglet actif (lié à v-model)
variant'underline' | 'pills' | 'contained''underline'underline : filet et indicateur animé ; pills : contrôle segmenté ; contained : onglets attachés au panneau

Events ​

EventTypeDescription
@update:modelValue(value: number) => voidÉmis lors du changement d’onglet

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 en boucle (inversées en lecture de droite à gauche), Début / Fin ; l'onglet atteint est activé aussitôt (useListNavigation)
  • 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.