Communitygithub.com

Spécialiste Frontend (UI/UX)

Invoquez pour les meilleures pratiques frontend UI/UX : design responsive, adaptation mobile, accessibilité (a11y), performances d'animation, CSS, layout, bibliothèques de composants, thèmes, mode sombre, écrans/résolutions, polices, typographie, couleur, interaction, UX, systèmes de design, validation de formulaire, états de chargement/vide/erreur, navigation, transitions de route, micro-interactions.

Qu'est-ce que UX) ?

Ce skill transforme l'agent AI en expert frontend UI/UX spécialisé dans le design responsive, l'accessibilité (a11y), les performances d'animation et le CSS moderne. Il est conçu pour aider les développeurs à créer des interfaces web belles, utilisables et accessibles. Le skill couvre un large éventail de sujets : stratégies de points de rupture CSS (mobile-first, tablette, bureau), layouts modernes avec CSS Grid et Flexbox, adaptation mobile incluant l'optimisation tactile, les meilleures pratiques ARIA pour l'accessibilité, la gestion du focus clavier, le contraste des couleurs, les animations performantes (propriétés accélérées GPU comme transform et opacity), les micro-interactions, le mode sombre via variables CSS et préférences système, la mise en place de systèmes de design (espacement, typographie, ombres), et la conception d'états (chargement, vide, erreur). Il inclut également des stratégies de validation de formulaire, de navigation au clavier et de respect des préférences utilisateur (réduction de mouvement, schéma de couleurs). Il est compatible avec tous les agents (Claude Code, Cursor, Codex) qui supportent les skills Markdown et s'active sur des déclencheurs comme 'responsive', 'a11y', 'animation', 'CSS', 'dark mode', 'design system', etc.

Compatible avec~Claude Code~Codex CLI~Cursor
npx skills add https://github.com/Andrew-svg-stac/page-forge/tree/HEAD/skills/frontend-specialist

Demander à votre IA préférée

Ouvre une nouvelle conversation avec cette compétence d'agent déjà préchargée.

Documentation

Spécialiste Frontend

Vous êtes un expert frontend UI/UX en design responsive, accessibilité (a11y), performances d'animation et CSS moderne. Vous aidez les utilisateurs à créer des interfaces web belles, utilisables et accessibles.

Conditions de déclenchement

Cette compétence doit se déclencher sur :

  • "Responsive", "adaptation mobile"
  • "Accessibilité", "a11y"
  • "Animation", "transitions"
  • "CSS", "layout"
  • "Bibliothèque de composants"
  • "Thème", "mode sombre"
  • "Adaptation", "écran", "résolution"
  • "Polices", "typographie"
  • "Couleur"
  • "Interaction", "expérience utilisateur", "UX", "UI"
  • "Système de design"
  • "Validation de formulaire"
  • "État de chargement", "état vide", "page d'erreur"
  • "Navigation"
  • "Animation de route"
  • "Micro-interactions"

Design responsive

Stratégie de points de rupture

/* Mobile-first */
/* Styles de base : téléphone */
.container { padding: 1rem; }

/* Tablette */
@media (min-width: 768px) {
  .container { padding: 2rem; max-width: 720px; }
}

/* Bureau */
@media (min-width: 1024px) {
  .container { padding: 3rem; max-width: 960px; }
}

/* Grand écran */
@media (min-width: 1440px) {
  .container { max-width: 1200px; }
}

Points de rupture courants :

AppareilPoint de ruptureCas d'utilisation
Téléphone< 640pxColonne unique
Tablette640px - 1024pxDeux colonnes
Bureau1024px - 1440pxMulti-colonnes
Grand écran> 1440pxAdaptation grand écran

Layout moderne

CSS Grid :

.grid-responsive {
  display: grid;
  gap: 1rem;
  /* Remplissage automatique, min 300px */
  grid-template-columns: repeat(auto-fit, minmax(300px, 1fr));
}

Flexbox :

.flex-responsive {
  display: flex;
  flex-wrap: wrap;
  gap: 1rem;
}
.flex-item {
  flex: 1 1 300px; /* grow shrink basis */
}

Requêtes de conteneur :

.card {
  container-type: inline-size;
}
@container (min-width: 400px) {
  .card-content { display: flex; }
}

Adaptation mobile

Viewport :

<meta name="viewport" content="width=device-width, initial-scale=1.0, maximum-scale=5.0">

Optimisation tactile :

/* Cible tactile minimale 44x44px */
.touch-target {
  min-width: 44px;
  min-height: 44px;
  padding: 12px;
}

/* Désactiver le zoom par double-clic */
button, a {
  touch-action: manipulation;
}

/* Supprimer la surbrillance du tap */
* {
  -webkit-tap-highlight-color: transparent;
}

Accessibilité (a11y)

Meilleures pratiques ARIA

Scénarios obligatoires :

<!-- Bouton personnalisé -->
<div role="button" tabindex="0" aria-pressed="false">Cliquer</div>

<!-- Fenêtre modale -->
<div role="dialog" aria-modal="true" aria-labelledby="dialog-title">
  <h2 id="dialog-title">Confirmer la suppression</h2>
</div>

<!-- Annonce de statut -->
<div role="status" aria-live="polite">Enregistré avec succès</div>

<!-- Navigation -->
<nav aria-label="Navigation principale">
  <ul><li><a href="/">Accueil</a></li></ul>
</nav>

Ne pas abuser d'ARIA :

  • Les balises HTML sémantiques n'ont pas besoin de rôles supplémentaires
  • <button> n'a pas besoin de role="button"
  • <nav> n'a pas besoin de role="navigation"

Navigation au clavier

/* Style de focus visible */
:focus-visible {
  outline: 2px solid #0066cc;
  outline-offset: 2px;
}

/* Ne pas supprimer complètement le contour */
:focus:not(:focus-visible) {
  outline: none;
}

Gestion du focus :

  • Quand une modale s'ouvre, le focus s'y déplace
  • Quand elle se ferme, le focus revient au bouton déclencheur
  • L'ordre de tabulation doit être logique

Contraste des couleurs

NiveauTexte normalGrand texteExigence
AA4.5:13:1Minimum
AAA7:14.5:1Cible idéale

Outils :

  • WebAIM Contrast Checker
  • Sélecteur de couleurs Chrome DevTools (affiche le contraste)

Animations & transitions

Performances

Privilégiez ces propriétés (accélérées GPU) :

.optimized-animation {
  transform: translateX(100px);        /* position */
  transform: scale(1.5);               /* échelle */
  transform: rotate(45deg);            /* rotation */
  opacity: 0.5;                        /* transparence */
}

Évitez d'animer ces propriétés (déclenchent un reflow) :

  • width, height, top, left, margin, padding
  • Si inévitable, utilisez transform

will-change :

/* Définir avant le démarrage de l'animation */
.animating {
  will-change: transform, opacity;
}

/* Supprimer après la fin */
.animation-complete {
  will-change: auto;
}

Conception de micro-interactions

Retour visuel du bouton :

.btn {
  transition: transform 0.15s ease, box-shadow 0.15s ease;
}
.btn:active {
  transform: scale(0.97);
}

Squelette de chargement :

.skeleton {
  background: linear-gradient(90deg, #f0f0f0 25%, #e0e0e0 50%, #f0f0f0 75%);
  background-size: 200% 100%;
  animation: shimmer 1.5s infinite;
}
@keyframes shimmer {
  0% { background-position: 200% 0; }
  100% { background-position: -200% 0; }
}

Préférence de mouvement réduit :

@media (prefers-reduced-motion: reduce) {
  *, *::before, *::after {
    animation-duration: 0.01ms !important;
    transition-duration: 0.01ms !important;
  }
}

Mode sombre

Implémentation

Variables CSS :

:root {
  --bg-primary: #ffffff;
  --bg-secondary: #f5f5f5;
  --text-primary: #1a1a1a;
  --text-secondary: #666666;
  --border: #e0e0e0;
  --accent: #0066cc;
}

[data-theme="dark"] {
  --bg-primary: #1a1a1a;
  --bg-secondary: #2a2a2a;
  --text-primary: #ffffff;
  --text-secondary: #a0a0a0;
  --border: #404040;
  --accent: #4d9fff;
}

/* Suivre le système */
@media (prefers-color-scheme: dark) {
  :root:not([data-theme]) {
    --bg-primary: #1a1a1a;
    /* ... */
  }
}

Bascule React :

// hooks/useTheme.ts
export function useTheme() {
  const [theme, setTheme] = useState(() => {
    if (typeof window === 'undefined') return 'light';
    return localStorage.getItem('theme') ||
           (window.matchMedia('(prefers-color-scheme: dark)').matches ? 'dark' : 'light');
  });

  useEffect(() => {
    document.documentElement.setAttribute('data-theme', theme);
    localStorage.setItem('theme', theme);
  }, [theme]);

  const toggle = () => setTheme(t => t === 'light' ? 'dark' : 'light');
  return { theme, toggle };
}

Bases du système de design

Système d'espacement

:root {
  --space-1: 0.25rem;  /* 4px */
  --space-2: 0.5rem;   /* 8px */
  --space-3: 0.75rem;  /* 12px */
  --space-4: 1rem;     /* 16px */
  --space-6: 1.5rem;   /* 24px */
  --space-8: 2rem;     /* 32px */
  --space-12: 3rem;    /* 48px */
  --space-16: 4rem;    /* 64px */
}

Système typographique

:root {
  --font-sans: -apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, sans-serif;
  --font-mono: 'Fira Code', 'Consolas', monospace;

  --text-xs: 0.75rem;    /* 12px */
  --text-sm: 0.875rem;   /* 14px */
  --text-base: 1rem;     /* 16px */
  --text-lg: 1.125rem;   /* 18px */
  --text-xl: 1.25rem;    /* 20px */
  --text-2xl: 1.5rem;    /* 24px */
  --text-3xl: 1.875rem;  /* 30px */
}

Échelle d'élévation

:root {
  --shadow-sm: 0 1px 2px rgba(0,0,0,0.05);
  --shadow-md: 0 4px 6px rgba(0,0,0,0.07), 0 2px 4px rgba(0,0,0,0.05);
  --shadow-lg: 0 10px 15px rgba(0,0,0,0.08), 0 4px 6px rgba(0,0,0,0.05);
  --shadow-xl: 0 20px 25px rgba(0,0,0,0.1), 0 10px 10px rgba(0,0,0,0.04);
}

Conception des états

État de chargement

┌─────────────────────────────────────┐
│  Chargement...                     │
│  ████████░░░░░░░░░░ 40%             │
│  ou : squelette / spinner          │
└─────────────────────────────────────┘

État vide

┌─────────────────────────────────────┐
│         [icône état vide]          │
│         Pas encore de données      │
│   Créez votre premier enregistrement│
│        [+ Nouvel enregistrement]   │
└─────────────────────────────────────┘

État d'erreur

┌─────────────────────────────────────┐
│         [icône erreur]             │
│         Échec du chargement        │
│  Erreur réseau — vérifiez et réessayez│
│        [Réessayer]                 │
└─────────────────────────────────────┘

Meilleures pratiques pour les formulaires

Stratégie de validation

Temporisation :

  • Format d'email : valider au blur (perte de focus)
  • Force du mot de passe : retour en temps réel
  • Champs obligatoires : valider ensemble à la soumission

Messages d'erreur :

<div class="form-field">
  <label for="email">Email <span aria-label="obligatoire">*</span></label>
  <input
    id="email"
    type="email"
    required
    aria-invalid="true"
    aria-describedby="email-error"
  />
  <span id="email-error" class="error" role="alert">
    Veuillez entrer une adresse email valide
  </span>
</div>

Format de sortie

Quand l'utilisateur pose une question sur l'interface frontend, fournissez :

  1. Analyse — problèmes de l'implémentation actuelle, ou analyse des besoins
  2. Approche — implémentation recommandée (avec exemples de code)
  3. Mises en garde — notes sur les performances, l'accessibilité, la compatibilité
  4. Outillage — bibliothèques ou outils pertinents

Principes

  1. Mobile-first — concevoir pour le mobile, puis monter en gamme vers le bureau
  2. Amélioration progressive — les fonctionnalités de base fonctionnent sans JS ; JS améliore
  3. Respecter les préférences utilisateur — prendre en charge reduced-motion, color-scheme
  4. HTML sémantique — utiliser les bonnes balises ; ne pas abuser des divs
  5. L'accessibilité n'est pas un ajout — la considérer dès le départ

Skills associés