MeDo

Générateur d'Onglets IA.

Décrivez vos panneaux et MeDo génère un composant d'onglets complet — rôles ARIA corrects, navigation aux flèches, indicateur actif animé, gestion du débordement sur mobile et un onglet actif synchronisé à l'URL qui survit à un rechargement.

Onglets
Onglets

Les onglets sont une décision de routage déguisée en décision de style

Un jeu d'onglets ne masque pas seulement du contenu, il découpe une page en plusieurs vues qui partagent une seule URL. Dès que quelqu'un veut partager l'onglet Tarifs, y renvoyer depuis un article d'aide ou recharger sans perdre sa place, le composant a besoin d'un vrai état qui vit en dehors de React. Les équipes le découvrent généralement après la mise en production, puis greffent une gestion de query string qui se bat avec l'animation et le rendu initial. Décider d'emblée que l'onglet actif dérive de l'URL plutôt que d'un état local simplifie tout le composant : le déclencheur devient une action de type lien, les liens profonds fonctionnent gratuitement et le rendu serveur produit le bon panneau dès la première peinture. Cela change aussi la façon d'écrire le balisage, et c'est pourquoi il est bien moins coûteux de le générer ainsi que de l'adapter après coup.

6 modèles

Modèles de Onglets que vous pouvez générer

Chaque modèle est un vrai prompt, pas une capture d'écran. Copiez-le dans n'importe quel éditeur IA, ou exécutez-le dans MeDo pour récupérer du code React + Tailwind.

BasicUnderline

Underlined Tab Row With a Sliding Indicator

The default that reads as tabs without any explanation. Reach for it when the panels are static content and you want the indicator to do the signalling rather than a border box.

Create a tabs component with four triggers using the ARIA tabs pattern: role="tablist" on the container, role="tab" with aria-selected and aria-controls on each trigger, and role="tabpanel" with aria-labelledby on each panel. Use roving tabindex so only the selected tab has tabindex 0 and Tab moves out of the group entirely rather than through it. Left and Right arrows move focus and wrap at both ends, Home and End jump to the first and last tab, and activation is automatic because the panels are static text. Triggers are 40px tall with 15px medium labels, muted grey when inactive and near-black when active. Measure the active trigger and slide a 2px underline using translateX and scaleX over 200ms — never animate left or width.

Tester dans MeDo
SegmentedPill Segmented

Segmented Control With a Sliding Pill

Two or three mutually exclusive options that belong on one control, like monthly versus annual. Do not use it past four tabs — the track stops fitting on a phone and equal widths force truncation.

Create a segmented-control tabs component: one rounded 36px-tall track with a light grey background and 2px inner padding, holding three equal-width triggers. The active trigger is a white pill with a soft shadow that moves between positions with translateX over 180ms, so the label text never reflows mid-transition. Keep the full ARIA tabs roles and roving tabindex — Left and Right arrows move focus with wrapping, Home and End jump to the ends, and activation is automatic. Give every trigger the same explicit min-width so switching from a short label to a long one does not resize the track. Under prefers-reduced-motion, cross-fade the pill background instead of sliding it.

Tester dans MeDo
Deep linkableURL-Synced

Tabs Backed by a Query Parameter

The active tab lives in the URL, so support can link to one panel and a reload keeps your place. Worth doing before launch, because retrofitting it means rewriting the initial render.

Create a tabs component whose active tab is derived from a ?tab= query parameter rather than local state, so the first server render already paints the correct panel with no post-hydration flash. Read the parameter, validate it against the known tab ids, and fall back to the first tab when the value is unrecognised. On selection, write the new value with a replace-style navigation so the back button is not filled with tab switches, and preserve every other query parameter already on the URL. Keep the ARIA tabs wiring intact: roving tabindex, Left and Right arrows with wrapping, Home and End, and manual activation on Enter or Space.

Tester dans MeDo
OverflowScrollable

Horizontally Scrolling Tablist

What happens when seven labels meet a 390px viewport. The part teams forget is scrolling the newly focused tab into view — arrow keys otherwise move focus to a tab nobody can see.

Create a tabs component that handles overflow by scrolling rather than wrapping or clipping. Under 640px the tablist scrolls horizontally with momentum, the scrollbar is hidden, and a gradient fade appears on either edge only while content remains in that direction. When Left or Right arrow moves the roving tabindex, call scrollIntoView with inline nearest on the newly focused trigger so keyboard focus is never off screen, and do the same for Home and End. Use scroll-snap-align on each trigger so a flick settles on a label boundary instead of mid-word. Keep the full ARIA roles and aria-controls wiring, and recompute the indicator position on scroll and on resize.

Tester dans MeDo
PerformanceLazy Panels

Tabs With Deferred Panel Mounting

Only the active panel mounts, so opening Settings does not fetch invoices nobody asked for. The catch is state loss, so name the panels that must survive a switch.

Create a tabs component that mounts only the active panel and keeps every inactive panel out of the DOM entirely, so charts, video players and data fetches for unseen tabs never run. Use manual activation — arrow keys move the roving tabindex and only Enter or Space commits the change — because automatic activation would fire a request for every tab a keyboard user passes through. Accept a keepMounted list of tab ids whose panels stay in the DOM hidden with the hidden attribute instead, for panels holding half-filled forms or scroll position. Show a skeleton inside a newly mounted panel while its data resolves, and keep the panel container height stable so the page below does not jump.

Tester dans MeDo
SidebarVertical

Vertical Tabs for Settings Screens

A left rail of labels beside one panel. The one thing that changes beyond layout is the arrow axis — Up and Down, not Left and Right, and aria-orientation has to say so.

Create a vertical tabs component for a settings screen: a 200px left rail of triggers with a single panel to its right. Set aria-orientation="vertical" on the tablist and bind Arrow Up and Arrow Down to move the roving tabindex with wrapping, since Left and Right are wrong on this axis; keep Home and End for the ends. Triggers are left-aligned rows, 36px tall, with a 2px indicator on the left edge that translates vertically over 200ms. Below 768px collapse the rail into a horizontal scrolling tablist above the panel and switch the arrow bindings and aria-orientation to match. Use manual activation, and give the panel tabindex="-1" so a programmatic focus move after selection is possible.

Tester dans MeDo

Comment personnaliser votre Onglets

Choisissez délibérément l'activation automatique ou manuelle

L'activation automatique change de panneau au fur et à mesure que les flèches déplacent le focus : rapide, mais inutilisable quand les panneaux sont coûteux à rendre ou chargent des données. L'activation manuelle déplace d'abord le focus et n'active qu'avec Entrée ou Espace. Précisez laquelle vous voulez, car le code clavier diffère.

Animez l'indicateur avec transform, pas avec width

Demandez un soulignement qui mesure le déclencheur actif et glisse avec translateX et scaleX. Animer left et width sollicite le layout à chaque image, tremble aux frontières sous-pixel et casse totalement dès que la tablist peut défiler.

Décidez ce qui se passe quand les onglets débordent

Quatre libellés courts tiennent sur un téléphone ; sept non. Choisissez un comportement et énoncez-le : une tablist à défilement horizontal avec fondu sur le bord, un passage à la ligne sur une deuxième rangée, ou un repli en select natif sous un breakpoint. Sans précision, les onglets générés se contentent généralement de rogner.

Dites si les panneaux inactifs restent montés

Démonter les panneaux inactifs garde le DOM léger et évite de faire tourner des graphiques ou des lecteurs vidéo que personne ne voit, mais cela jette aussi la position de défilement et les champs de formulaire à moitié remplis. Mentionnez quels panneaux portent de l'état pour que ceux-là soient plutôt masqués en CSS.

Qui utilise le composant Onglets

Page de tarifs

Facturation mensuelle et annuelle en deux onglets au-dessus d'une seule grille de prix, avec le choix inscrit dans l'URL pour que les commerciaux puissent renvoyer directement vers les tarifs annuels et que la remise annuelle soit visible au premier chargement.

Documentation produit

Exemples de code répartis par langage — curl, Node, Python, Go — où sélectionner un langage une fois s'applique à tous les groupes d'onglets de la page et est mémorisé lors de la visite suivante.

Tableau de bord ou outil d'administration

Un écran de réglages avec les onglets Profil, Équipe, Facturation et Clés API où chaque panneau est monté paresseusement, si bien qu'ouvrir les réglages ne récupère pas des factures que personne n'a demandées.

Page produit e-commerce

Description, Caractéristiques et Avis en onglets sous la galerie, avec le nombre d'avis dans le libellé du déclencheur et la description rendue aussi dans le corps de page, pour que le texte essentiel ne soit pas accessible uniquement derrière un onglet.

Modèles de Onglets pour différents sites web

Le même composant onglets, adapté au type de site sur lequel il est publié.

01 / 06

SaaS Pricing Page Tabs

Monthly and annual billing as a two-tab segmented control above one price grid. Sync the choice to the URL so a sales email can open annual pricing directly — a pricing page where the discount is one unshareable click away is losing the conversation before it starts.

Styles et variantes de Onglets

Choisissez la variante qui correspond au reste de la page, puis générez-la.

01 / 06

Underlined Tabs

A muted label row with a 2px indicator sliding beneath the active trigger. The most legible default because the underline gives the eye a single moving object to track. Animate it with translateX and scaleX — animating left and width thrashes layout every frame and jitters on subpixel boundaries.

Onglets en React, Next.js, Vue et Svelte

React, Next.js, Vue 3, SvelteKit, Astro ou HTML simple — le même onglets, six façons de l'intégrer.

01 / 06

React Tabs

Keep the selected id in one piece of state and derive tabindex from it — that is the whole roving tabindex mechanism. Hold refs to the triggers so the arrow handler can focus the next one directly.

src/components/Tabs.tsx

const [active, setActive] = useState(tabs[0].id)

<div role="tablist" onKeyDown={onArrowKeys}>
  {tabs.map((t) => (
    <button
      key={t.id}
      role="tab"
      aria-selected={t.id === active}
      aria-controls={`panel-${t.id}`}
      tabIndex={t.id === active ? 0 : -1}
      onClick={() => setActive(t.id)}
    >
      {t.label}
    </button>
  ))}
</div>

Comment ajouter votre Onglets à un projet

Quatre étapes, du choix d'un modèle de onglets à sa mise en production.

01~30s

Pick a Tabs Template

Choose by constraint, not by looks: segmented for two or three alternatives, scrollable once labels overflow a phone, vertical for a long settings rail, lazy when a panel fetches data.

02~10s

Copy the Prompt

Take the prompt into MeDo, Lovable, Bolt, v0 or Cursor, then edit two things — your real tab labels, and whether activation is automatic or manual. That second choice changes the keyboard code, so decide it before you generate.

03~1min

Generate and Refine

You get React + Tailwind back with a live preview. Follow up in plain English — "sync the active tab to ?tab=", "collapse to a select under 640px", "keep the chart panel mounted" — rather than editing the keydown handler by hand.

04~2min

Wire the Panels and Ship

Replace the placeholder panels with your real content and check three things with the keyboard only: Tab enters and leaves the group in one stop, arrows move within it, and a reload on a deep link opens the right panel.

Questions fréquentes à propos de Onglets

Comment générer un composant d'onglets accessible avec l'IA ?

Décrivez les libellés d'onglets et le comportement souhaité dans un seul prompt, en précisant si l'activation est automatique ou manuelle. MeDo génère les rôles tablist, tab et tabpanel avec le câblage aria-controls et aria-labelledby correspondant, plus un roving tabindex pour que les flèches circulent entre les onglets et que Tab sorte entièrement du groupe.

Quelle est la différence entre activation automatique et manuelle des onglets ?

Avec l'activation automatique, déplacer le focus avec une flèche affiche immédiatement ce panneau, ce qui convient à du contenu statique peu coûteux. Avec l'activation manuelle, les flèches ne déplacent que le focus et l'utilisateur confirme avec Entrée ou Espace. Utilisez le mode manuel dès qu'un panneau charge des données, rend un graphique ou est lent, car l'activation automatique déclencherait une requête pour chaque onglet traversé au clavier.

Puis-je créer un lien direct vers un onglet précis ?

Oui, si l'onglet actif est stocké dans l'URL plutôt que dans l'état du composant. Demandez un paramètre de requête comme ?tab=pricing qui alimente le rendu initial et se met à jour avec une navigation de type replace, afin que le bouton retour ne soit pas rempli de changements d'onglets. Évitez un fragment de hash pour cela, car le navigateur tentera aussi de défiler jusqu'à un élément portant cet id.

Le contenu masqué dans les onglets inactifs nuit-il au SEO ?

Les moteurs de recherche indexent le texte présent dans le HTML même lorsqu'un panneau est visuellement masqué : le contenu en onglets n'est donc pas invisible. Il est généralement pondéré comme secondaire par rapport au contenu vu immédiatement, et les panneaux rendus seulement après un clic peuvent ne pas être explorés du tout. Gardez votre titre principal, votre proposition de valeur et vos mots-clés cibles dans la partie toujours visible de la page et réservez les onglets aux détails complémentaires.

Comment les onglets doivent-ils se comporter sur mobile ?

Choisissez une seule stratégie plutôt que de laisser les libellés rétrécir. Une tablist défilant horizontalement avec un fondu sur le bord qui déborde fonctionne bien jusqu'à environ six libellés courts ; au-delà, le repli en select natif offre une meilleure cible tactile et évite les onglets cachés. Indiquez à MeDo le breakpoint et la stratégie et il générera les deux mises en page depuis un seul composant.

Faut-il utiliser des onglets ou un accordéon ?

Utilisez des onglets quand les panneaux sont des alternatives que l'utilisateur compare une à la fois, comme des périodes de facturation ou des langages de code, et quand les libellés sont assez courts pour tenir sur une ligne. Utilisez un accordéon quand les sections sont des éléments indépendants que l'on peut vouloir ouvrir simultanément, quand les libellés sont des questions complètes, ou quand le contenu est assez long pour qu'un empilement vertical se lise mieux — une liste de FAQ est le cas canonique de l'accordéon, pas des onglets.