💻 Développement

dev-responsive-design-helper

Conception responsive et mobile-first pour tout type de site ou app web.

⚡ Installation & lancement en 1 commande

Copiez-collez dans votre terminal : le skill s'installe dans ~/.claude/skills et Claude Code se lance directement dessus.

macOS / Linux
curl -fsSL https://raw.githubusercontent.com/khalilbenaz/claude-skills-collection/main/install.sh | sh -s -- dev-responsive-design-helper --launch
Windows (PowerShell)
iex "& { $(iwr -useb https://raw.githubusercontent.com/khalilbenaz/claude-skills-collection/main/install.ps1) } dev-responsive-design-helper -Launch"

🚀 Déjà installé ?

claude "/dev-responsive-design-helper"

Ou tapez /dev-responsive-design-helper dans une session Claude Code, ou décrivez simplement votre besoin — le skill se déclenche automatiquement via le skill-router.

🔑 Déclencheurs automatiques

Le skill s'active automatiquement quand votre demande contient :

responsivemobile firstmedia queriesbreakpointsadaptatifmobiletablettes'affiche mal sur mobile

📦 Installation manuelle

git clone https://github.com/khalilbenaz/claude-skills-collection.git cp -r claude-skills-collection/skills/dev-responsive-design-helper ~/.claude/skills/

Payload du plugin : skills/dev-responsive-design-helper · source éditable : dev-skills/responsive-design-helper

đź“– Manuel

Responsive Design Helper

Workflow en étapes

1. Diagnostic du problème

Avant de coder, identifier la cause :

Vérifier en priorité :

<!-- Obligatoire dans <head> — sans ça, mobile-first ne fonctionne pas -->
<meta name="viewport" content="width=device-width, initial-scale=1">

2. Choix de l'approche de layout

Cas d'usageApproche recommandée
Grille multi-colonnesCSS Grid + fr
Alignement 1D (nav, card row)Flexbox
Mise en page page entièreCSS Grid outer + Flexbox inner
Spacing/padding adaptatifclamp() sans media query
Composant avec breakpoint précisContainer Queries (2024+)

3. Mobile-first : structure de base

Toujours écrire le style mobile sans media query, puis enrichir avec min-width :

/* Mobile — base, aucun media query */
.card-grid {
  display: grid;
  grid-template-columns: 1fr;
  gap: 1rem;
  padding: 1rem;
}

/* Tablette portrait ≥ 640px */
@media (min-width: 40rem) {
  .card-grid {
    grid-template-columns: repeat(2, 1fr);
    gap: 1.5rem;
  }
}

/* Desktop ≥ 1024px */
@media (min-width: 64rem) {
  .card-grid {
    grid-template-columns: repeat(3, 1fr);
    padding: 2rem;
  }
}

Breakpoints de référence (contenu-first, pas device-first) :


4. Typographie fluide avec clamp()

:root {
  --text-sm:   clamp(0.875rem, 1.5vw, 1rem);
  --text-base: clamp(1rem,     2vw,   1.125rem);
  --text-lg:   clamp(1.125rem, 2.5vw, 1.5rem);
  --text-xl:   clamp(1.5rem,   4vw,   2.5rem);
  --text-hero: clamp(2rem,     6vw,   4rem);
}

body {
  font-size: var(--text-base);
  line-height: 1.6;
}

Règle absolue : minimum 1rem (16px) pour le corps de texte sur mobile — en dessous, iOS zoome automatiquement sur les inputs.


5. Images responsives

<!-- Image simple avec densité -->
<img
  src="photo-800.jpg"
  srcset="photo-400.jpg 400w, photo-800.jpg 800w, photo-1200.jpg 1200w"
  sizes="(max-width: 640px) 100vw, (max-width: 1024px) 50vw, 33vw"
  alt="Description"
  loading="lazy"
  decoding="async"
>

<!-- Art direction (cadrage différent selon taille) -->
<picture>
  <source media="(max-width: 639px)" srcset="hero-portrait.webp">
  <source media="(min-width: 640px)" srcset="hero-landscape.webp">
  <img src="hero-landscape.jpg" alt="Hero" loading="eager">
</picture>
/* Obligatoire pour toutes les images */
img, video, svg {
  max-width: 100%;
  height: auto;
}

6. Navigation adaptative

/* Mobile : bottom nav ou hamburger */
.nav-desktop { display: none; }
.nav-mobile  { display: flex; }

@media (min-width: 64rem) {
  .nav-desktop { display: flex; }
  .nav-mobile  { display: none; }
}

Zones tactiles — minimum 44×44px (Apple HIG) / 48×48dp (Google Material 3) :

.btn, a, button {
  min-height: 44px;
  min-width: 44px;
  padding: 0.75rem 1rem;
}

7. Container Queries (2024+ — support universel)

Préférer aux media queries pour les composants réutilisables :

.card-wrapper {
  container-type: inline-size;
  container-name: card;
}

/* Réagit à la taille du parent, pas du viewport */
@container card (min-width: 400px) {
  .card {
    display: grid;
    grid-template-columns: 1fr 2fr;
  }
}

8. Testing

# DevTools Chrome — ordre de test
1. Responsive Mode → glisser de 320px à 1440px progressivement
2. CPU throttling 4x + réseau "Slow 3G" → vérifier les Core Web Vitals
3. Onglet Lighthouse → Mobile audit
4. Outil "Accessibility" → vérifier les tailles de cibles tactiles

# Vrais appareils (obligatoire avant livraison)
- iOS Safari (comportements spécifiques : safe-area, 100vh, scroll)
- Android Chrome
- Samsung Internet si cible grand public

Pour l'encoche et la Dynamic Island :

.header {
  padding-top: env(safe-area-inset-top);
  padding-left: env(safe-area-inset-left);
  padding-right: env(safe-area-inset-right);
}

.footer {
  padding-bottom: env(safe-area-inset-bottom);
}

Anti-patterns / pièges courants

PiègeConséquenceCorrection
height: 100vh sur mobile SafariLayout cassé (barre d'adresse)Utiliser height: 100dvh
overflow-x: hidden sur bodyBloque position: stickyAppliquer sur un wrapper intermédiaire
Breakpoints en px dans le CSSIgnore le zoom navigateurUtiliser rem pour les breakpoints
user-scalable=no dans viewportInaccessible (WCAG 1.4.4)Supprimer cette propriété
hover comme seul indicateur d'étatInvisible sur tactileToujours doubler avec :focus-visible
Grid avec colonnes en px fixesOverflow sur petits écransUtiliser minmax(0, 1fr) ou auto-fill
Images sans width/height attrsLayout Shift (mauvais CLS)Toujours spécifier width et height

Garde-fous