Retour au catalogue

Developer SDK Showcase

Vitrine SDK multi-langage avec onglets de code, badges de version et boutons d'installation par ecosysteme.

developermedium Both Responsive a11y
minimaldarksaasuniversalcentered
Theme

Créer une section vitrine SDK multi-langage en React

Une vitrine SDK multi-langage en React stocke l'ID du langage actif en state, affiche les onglets comme des boutons, et permute le panneau de code avec AnimatePresence mode='wait' de Framer Motion pour que les extraits sortant et entrant ne se chevauchent pas. Chaque panneau montre la commande d'installation, un bloc de code scrollable et un bouton de copie qui se réinitialise après 2 secondes.

  • Stack : React 18, Framer Motion 11, lucide-react, environ 385 lignes, aucune bibliothèque de coloration syntaxique.
  • Le retour visuel de copie utilise un setTimeout de 2 secondes qui réinitialise l'état copiedField ; le même handler couvre la commande d'installation et le bloc de code.
  • Transitions d'onglets : AnimatePresence mode='wait' avec entrée en décalage y (y:16→0) et sortie en décalage y (y:0→-8), 350ms, ease personnalisé [0.16,1,0.3,1].
  • Accessible : la commande d'installation et le bloc de code ont chacun leur propre bouton de copie ; aucune action icône-seule n't est utilisée sans libellé.
  • Entièrement responsive via flexWrap sur la rangée d'onglets et la barre d'installation ; le bloc de code défile horizontalement sur les viewports étroits.

Le SDK Showcase est une section qui permet aux visiteurs de basculer entre des exemples de code par langage, JavaScript, Python, Go, Ruby, dans un panneau animé unique. Il gère la commande d'installation, un bloc de code copiable, un badge de version et un lien direct vers la documentation du langage, sans recourir à une bibliothèque de coloration syntaxique. Le résultat est un bloc léger et sensible au thème qui s'intègre à n'importe quelle landing page de produit développeur.

Anatomie

La section est divisée en trois zones. Un en-tête centré contient un badge optionnel, un titre et un sous-titre. En dessous, une rangée horizontale de boutons en forme de pilule affiche chaque langage avec un point coloré, son nom et une chaîne de version en monospace. L'onglet actif déclenche une carte animée qui possède elle-même trois sous-zones : une barre d'installation en haut (icône terminal, commande d'installation, boutons Copier et Docs), un bloc de code au milieu (pre monospace, bouton de copie flottant) et un pied de carte qui répète le nom du langage, le badge de version et rend un bouton CTA Installer.

Comment ça marche

Le changement de langage repose sur deux éléments de state : activeId (quel onglet est sélectionné) et copiedField (quel bouton de copie est dans son état 'copié'). Quand un onglet est cliqué, activeId se met à jour et AnimatePresence intercepte le panneau sortant, l'anime vers la sortie (opacity 0, y -8), puis monte le nouveau panneau (opacity 0, y 16 → 1, y 0). Le handler de copie appelle navigator.clipboard.writeText, assigne à copiedField une clé de chaîne ('install' ou 'code'), puis programme un setTimeout pour la réinitialiser. La constante d'ease [0.16, 1, 0.3, 1] est un cubic-bezier personnalisé qui donne aux transitions un ressenti rapide-à-la-sortie-lent-à-l'arrivée sans nécessiter un preset nommé.

Comment le coder en React

  1. Définir la structure de données des langages

    Crée une interface SdkLanguage avec id, name, version, installCmd, code, un docsUrl optionnel et une chaîne color pour le point. Passe-la en prop avec des valeurs par défaut sensées pour que le composant fonctionne immédiatement. Garde les extraits de code comme template literals dans le tableau de données par défaut.

    interface SdkLanguage {
      id: string;
      name: string;
      version: string;
      installCmd: string;
      code: string;
      docsUrl?: string;
      color: string;
    }
  2. Connecter le state des onglets et la logique de copie

    Initialise activeId avec l'id du premier langage et copiedField à null. Le callback handleCopy écrit dans le presse-papier, assigne à copiedField une clé de chaîne, et la réinitialise après 2000ms. Enveloppe-le dans useCallback pour éviter de le reconstruire à chaque rendu.

    const [activeId, setActiveId] = useState(languages[0]?.id ?? "");
    const [copiedField, setCopiedField] = useState<string | null>(null);
    
    const handleCopy = useCallback((text: string, field: string) => {
      navigator.clipboard.writeText(text).catch(() => {});
      setCopiedField(field);
      setTimeout(() => setCopiedField(null), 2000);
    }, []);
  3. Animer le changement de panneau avec AnimatePresence

    Enveloppe le panneau actif dans AnimatePresence avec mode='wait'. Utilise l'id du langage comme key pour que React démonte l'ancien panneau avant de monter le nouveau. Définis initial à opacity:0, y:16, animate à opacity:1, y:0 et exit à opacity:0, y:-8 pour un glissement et fondu propre.

    <AnimatePresence mode="wait">
      {active && (
        <motion.div
          key={active.id}
          initial={{ opacity: 0, y: 16 }}
          animate={{ opacity: 1, y: 0 }}
          exit={{ opacity: 0, y: -8 }}
          transition={{ duration: 0.35, ease: [0.16, 1, 0.3, 1] }}
        >
          {/* install bar + code block + footer */}
        </motion.div>
      )}
    </AnimatePresence>
  4. Construire la barre d'installation et le bloc de code

    La barre d'installation est une rangée flex : une icône Terminal et la installCmd dans un élément code monospace à gauche, et les boutons Copier et Docs optionnel à droite. Le bloc de code est une balise pre dans un div padded avec overflowX:auto et un bouton de copie flottant en haut à droite. Utilise des propriétés CSS personnalisées pour toutes les couleurs afin qu'il s'adapte à n'importe quel preset de thème.

Quand l'utiliser

Utilise cette section sur toute landing page de produit développeur où tu distribues des SDKs pour plusieurs langages et dois le prouver visuellement. Elle fonctionne bien dans un bloc 'Démarrez en 2 minutes', juste avant une section tarifs ou un CTA. Évite-la quand ton produit ne supporte qu'un seul langage ; un simple bloc de code avec bouton de copie est plus lisible. Sur mobile la rangée d'onglets se replie et le bloc de code défile horizontalement, ce qui convient pour la lecture mais n'est pas idéal pour l'onboarding, envisage une vue mobile simplifiée si les conversions y sont importantes.

Utilisé par

  • Stripe, La référence API de Stripe utilise des onglets de langage (curl, Ruby, Python, PHP, Node, Go, .NET, Java) pour montrer la même requête dans chaque SDK, avec copie en un clic sur chaque extrait.
  • Twilio, La documentation Twilio propose un sélecteur de langage persistant en haut des exemples de code, conservant le langage choisi d'une page à l'autre pour que les développeurs restent dans leur stack.
  • Algolia, Les pages de documentation Algolia affichent des extraits d'installation multi-langage avec des onglets pour JavaScript, PHP, Python, Ruby, Go et d'autres, chacun avec un bouton de copie et un badge de version.
  • Resend, La section de démarrage de Resend montre les commandes d'installation SDK pour Node, Python, Ruby, PHP, Go et Rust dans un bloc de code à onglets, le même pattern, appliqué à l'onboarding d'une API email.

FAQ

Pourquoi utiliser AnimatePresence mode='wait' plutôt qu'un rendu conditionnel simple ?

mode='wait' garantit que l'animation de sortie du panneau sortant se termine avant que le panneau entrant soit monté. Sans lui, les deux panneaux sont brièvement dans le DOM en même temps et la transition ressemble à un glitch de superposition plutôt qu'à un échange délibéré.

Puis-je ajouter de la coloration syntaxique sans casser l'animation ?

Oui. Remplace le contenu de la balise pre par la sortie d'une bibliothèque comme shiki ou prism-react-renderer. Le wrapper AnimatePresence est autour du panneau entier, pas du pre, donc l'animation n'est pas affectée. Assure-toi simplement que la sortie colorisée est stable entre les rendus pour éviter le scintillement.

Que se passe-t-il si navigator.clipboard n'est pas disponible ?

La fonction handleCopy appelle .catch(() => {}) pour avaler silencieusement l'erreur, donc l'interface ne plante pas. Si tu as besoin d'un fallback visible, remplace le catch par une mise à jour de state qui affiche un tooltip 'Copie échouée'.

Comment conserver le langage sélectionné entre les navigations de page ?

Remonte l'état activeId hors du composant et synchronise-le avec localStorage ou un paramètre de query URL. Au montage, lis la valeur stockée et initialise useState avec elle plutôt que de défaut sur languages[0].id.

"use client";

import { useState, useCallback } from "react";
import { motion, AnimatePresence } from "framer-motion";
import { Copy, Check, Terminal, Download, ExternalLink } from "lucide-react";
import React from "react";

interface SdkLanguage {
  id: string;
  name: string;
  version: string;
  installCmd: string;
  code: string;
  docsUrl?: string;
  color: string;
}

interface DeveloperSdkShowcaseProps {
  title?: string;
  subtitle?: string;
  badge?: string;
  languages?: SdkLanguage[];

Code complet réservé à Pro

Code source intégral, export multi-framework et playground.

Passer en Pro, 9,99€/mois

Avis

Composant onglets SDK multi-langage React, Code + Tutoriel