{% extends 'base.html.twig' %} {% block title %}Tabs - Design System - Bubul{% endblock %} {% block body %}
{# ===== HEADER ===== #}
Molécules /

Tabs

Système d'onglets pour organiser le contenu

{# ===== COMPOSITION ===== #}

Composition

Icon + Badge + JS = Tabs
{# ===== USAGE ===== #}

Usage

{% verbatim %}{% include '_molecules/tabs/tabs.html.twig' with {
    id: 'my-tabs',
    tabs: [
        { id: 'general', label: 'Général', icon: 'settings' },
        { id: 'security', label: 'Sécurité', icon: 'shield' },
        { id: 'notifications', label: 'Notifications', icon: 'bell', badge: '3' }
    ],
    active: 'general'
} %}{% endverbatim %}

Fichier : templates/_molecules/tabs/tabs.html.twig

{# ===== EXEMPLE SIMPLE ===== #}

Exemple simple

{% include '_molecules/tabs/tabs.html.twig' with { id: 'demo-simple', tabs: [ { id: 'tab1', label: 'Premier onglet' }, { id: 'tab2', label: 'Deuxième onglet' }, { id: 'tab3', label: 'Troisième onglet' } ], active: 'tab1' } %}

Contenu du premier onglet. Lorem ipsum dolor sit amet.

{# ===== AVEC ICÔNES ET BADGES ===== #}

Avec icônes et badges

{% include '_molecules/tabs/tabs.html.twig' with { id: 'demo-icons', tabs: [ { id: 'inbox', label: 'Inbox', icon: 'inbox', badge: '12' }, { id: 'sent', label: 'Envoyés', icon: 'send' }, { id: 'drafts', label: 'Brouillons', icon: 'edit', badge: '3' }, { id: 'trash', label: 'Corbeille', icon: 'trash' } ], active: 'inbox' } %}

12 nouveaux messages dans votre boîte de réception.

{# ===== VARIANTES ===== #}

Variantes

Paramètre : variant

Default (underline border)

{% include '_molecules/tabs/tabs.html.twig' with { id: 'demo-default', tabs: [ { id: 'overview', label: 'Aperçu' }, { id: 'analytics', label: 'Analytiques' }, { id: 'reports', label: 'Rapports' } ], variant: 'default', active: 'overview' } %}

Pills

{% include '_molecules/tabs/tabs.html.twig' with { id: 'demo-pills', tabs: [ { id: 'overview', label: 'Aperçu' }, { id: 'analytics', label: 'Analytiques' }, { id: 'reports', label: 'Rapports' } ], variant: 'pills', active: 'overview' } %}

Underline (sans bordure)

{% include '_molecules/tabs/tabs.html.twig' with { id: 'demo-underline', tabs: [ { id: 'overview', label: 'Aperçu' }, { id: 'analytics', label: 'Analytiques' }, { id: 'reports', label: 'Rapports' } ], variant: 'underline', active: 'overview' } %}

Settings (style page paramètres)

{% include '_molecules/tabs/tabs.html.twig' with { id: 'demo-settings', tabs: [ { id: 'account', label: 'Compte', icon: 'user' }, { id: 'moodia', label: 'Moodia', icon: 'book' }, { id: 'serenia', label: 'Serenia', icon: 'chat' }, { id: 'developer', label: 'Développeur', icon: 'settings', right: true }, { id: 'slidia', label: 'Slidia', icon: 'presentation-graph' }, ], variant: 'settings', active: 'account' } %}

Icônes en grayscale par défaut, colorées au hover/actif. Scale 1.1 au hover. Dernier tab aligné à droite avec right: true.

{# ===== TAILLES ===== #}

Tailles

Paramètre : size

Small (sm)

{% include '_molecules/tabs/tabs.html.twig' with { id: 'demo-sm', tabs: [ { id: 'all', label: 'Tous' }, { id: 'active', label: 'Actifs' }, { id: 'archived', label: 'Archivés' } ], size: 'sm', active: 'all' } %}

Medium (md) - défaut

{% include '_molecules/tabs/tabs.html.twig' with { id: 'demo-md', tabs: [ { id: 'all', label: 'Tous' }, { id: 'active', label: 'Actifs' }, { id: 'archived', label: 'Archivés' } ], size: 'md', active: 'all' } %}

Large (lg)

{% include '_molecules/tabs/tabs.html.twig' with { id: 'demo-lg', tabs: [ { id: 'all', label: 'Tous' }, { id: 'active', label: 'Actifs' }, { id: 'archived', label: 'Archivés' } ], size: 'lg', active: 'all' } %}
{# ===== FULL WIDTH ===== #}

Pleine largeur

Paramètre : fullWidth: true

{% include '_molecules/tabs/tabs.html.twig' with { id: 'demo-full', tabs: [ { id: 'daily', label: 'Jour' }, { id: 'weekly', label: 'Semaine' }, { id: 'monthly', label: 'Mois' }, { id: 'yearly', label: 'Année' } ], variant: 'pills', fullWidth: true, active: 'weekly' } %}
{# ===== ONGLET DÉSACTIVÉ ===== #}

Onglet désactivé

Paramètre par onglet : disabled: true

{% include '_molecules/tabs/tabs.html.twig' with { id: 'demo-disabled', tabs: [ { id: 'basic', label: 'Basique', icon: 'star' }, { id: 'pro', label: 'Pro', icon: 'crown' }, { id: 'enterprise', label: 'Entreprise', icon: 'building', disabled: true } ], active: 'basic' } %}

L'onglet "Entreprise" est désactivé (fonctionnalité non disponible).

{# ===== PARAMÈTRES ===== #}

Paramètres

Paramètre Type Défaut Description
tabsarray(requis)Liste des onglets
tabs[].idstring(requis)Identifiant unique
tabs[].labelstring(requis)Texte de l'onglet
tabs[].iconstringnullNom de l'icône
tabs[].badgestringnullBadge (compteur)
tabs[].disabledboolfalseDésactive l'onglet
tabs[].rightboolfalseAligne l'onglet à droite
activestringpremierID de l'onglet actif
variantstringdefaultdefault, pills, underline, settings
sizestringmdsm, md, lg
fullWidthboolfalseOnglets en pleine largeur
idstringautoID du conteneur
classstring''Classes additionnelles
{# ===== API JAVASCRIPT ===== #}

API JavaScript

// Changer d'onglet programmatiquement
switchTab('my-tabs', 'settings');

// Écouter les changements d'onglet
document.getElementById('my-tabs').addEventListener('tabChange', (e) => {
    console.log('Onglet actif:', e.detail.tabId);
});

Les panels avec data-tab-panel-for sont automatiquement masqués/affichés.

{% endblock %}