Communitygithub.com

Modales & Dialogues (YepAPI/skills)

Boîtes de dialogue, fenêtres de confirmation, panneaux mobiles avec Radix/shadcn — focus, verrouillage du défilement et dialogues imbriqués.

Qu'est-ce que skills) ?

Cette compétence fournit un ensemble de règles et de patterns pour implémenter des modales et dialogues accessibles et modernes dans une application React utilisant Radix UI ou shadcn/ui. Elle couvre l'utilisation correcte de `<Dialog>` pour les fenêtres centrées, `AlertDialog` pour les confirmations d'actions destructrices, et `<Sheet>` pour les panneaux coulissants adaptés aux mobiles. La compétence met l'accent sur l'accessibilité avec le piégeage automatique du focus, le verrouillage du défilement et la gestion des touches Échap. Elle recommande d'utiliser les composants Radix plutôt que de construire des modales personnalisées, d'éviter de fermer les dialogues en cas d'échec de validation de formulaire, et de préférer les panneaux inférieurs (`<Sheet>`) aux modales centrées sur petits écrans pour une meilleure ergonomie tactile. Des exemples de code concrets en TypeScript/React sont fournis pour chaque pattern.

Compatible avec~Claude Code~Codex CLI~Cursor
npx skills add https://github.com/YepAPI/skills/tree/HEAD/skills/modals-dialogs

Demander à votre IA préférée

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

Documentation

Modales & Dialogues

Règles

  • Utiliser Radix Dialog ou shadcn <Dialog> — accessible, piégeage du focus, verrouillage du défilement par défaut
  • Dialogues de confirmation pour les actions destructrices : « Supprimer ce projet ? » avec les boutons Annuler (secondaire) et Supprimer (destructeur)
  • Panneaux / tiroirs pour mobile : <Sheet> de shadcn — glisse depuis le bas ou le côté, meilleure cible tactile que les modales centrées
  • Piège de focus : Radix le gère automatiquement — le premier élément focusable reçoit le focus à l'ouverture, le focus revient à la fermeture
  • Verrouillage du défilement : empêcher le défilement du corps lorsque la modale est ouverte — Radix le gère avec <Dialog.Overlay>
  • Déclencheurs de fermeture : touche Échap, clic en dehors de l'overlay, bouton de fermeture explicite — tous fournis par Radix
  • État contrôlé : propriétés open + onOpenChange — ne pas se fier à l'état interne pour les modales déclenchées par des événements externes
  • Formulaires dans les dialogues : soumettre avec Entrée, fermer en cas de succès, afficher les erreurs en ligne — ne pas fermer en cas d'échec de validation
  • Mobile : utiliser <Sheet> (tiroir inférieur) plutôt qu'un <Dialog> centré pour les actions sur petits écrans

Patterns

// Dialogue de confirmation avec shadcn
import {
  AlertDialog, AlertDialogAction, AlertDialogCancel, AlertDialogContent,
  AlertDialogDescription, AlertDialogFooter, AlertDialogHeader,
  AlertDialogTitle, AlertDialogTrigger,
} from "@/components/ui/alert-dialog";

function DeleteButton({ onDelete }: { onDelete: () => Promise<void> }) {
  const [loading, setLoading] = useState(false);
  return (
    <AlertDialog>
      <AlertDialogTrigger asChild>
        <Button variant="destructive">Supprimer le projet</Button>
      </AlertDialogTrigger>
      <AlertDialogContent>
        <AlertDialogHeader>
          <AlertDialogTitle>Supprimer ce projet ?</AlertDialogTitle>
          <AlertDialogDescription>
            Cette action supprimera définitivement le projet et toutes ses données. Elle est irréversible.
          </AlertDialogDescription>
        </AlertDialogHeader>
        <AlertDialogFooter>
          <AlertDialogCancel>Annuler</AlertDialogCancel>
          <AlertDialogAction
            onClick={async () => { setLoading(true); await onDelete(); setLoading(false); }}
            disabled={loading}
          >
            {loading ? "Suppression..." : "Supprimer"}
          </AlertDialogAction>
        </AlertDialogFooter>
      </AlertDialogContent>
    </AlertDialog>
  );
}

// Panneau pour actions mobile-friendly
import { Sheet, SheetContent, SheetHeader, SheetTitle, SheetTrigger } from "@/components/ui/sheet";

function MobileMenu() {
  return (
    <Sheet>
      <SheetTrigger asChild><Button variant="ghost" size="icon"><MenuIcon /></Button></SheetTrigger>
      <SheetContent side="bottom">
        <SheetHeader><SheetTitle>Actions</SheetTitle></SheetHeader>
        <nav className="flex flex-col gap-2 py-4">
          <Button variant="ghost">Modifier</Button>
          <Button variant="ghost">Partager</Button>
          <Button variant="destructive">Supprimer</Button>
        </nav>
      </SheetContent>
    </Sheet>
  );
}

À Éviter

  • Construire des modales personnalisées avec position: fixed et gestion manuelle du focus — utiliser Radix/shadcn Dialog
  • Oublier la touche Échap et le clic en dehors pour fermer — Radix gère les deux, ne pas les surcharger
  • Modales centrées sur mobile pour les menus d'action — utiliser un Sheet/Drawer inférieur pour une meilleure accessibilité au pouce
  • Fermer le dialogue en cas d'échec de validation de formulaire — le laisser ouvert, afficher les erreurs en ligne, laisser l'utilisateur corriger et resoumettre
  • Dialogues imbriqués sans contexte d'empilement approprié — si nécessaire, utiliser le support imbriqué de Radix avec un z-index correct

Individual skills in this repo

This repo contains 20 individual skills — each has its own dedicated page.

YepAPI/skills

WCAG 2.1 AA — semantic HTML, keyboard navigation, screen readers.

YepAPI/skills

Experiment setup, variant splitting, statistical significance, and feature flag integration.

YepAPI/skills

CRUD generators, data tables, user management, role-based access, and bulk operations.

YepAPI/skills

Monitor what ChatGPT and Gemini say about your brand using YepAPI.

YepAPI/skills

Queue workers with BullMQ/Inngest/Trigger.dev, job retries, dead letter queues, concurrency.

YepAPI/skills

Commander.js, interactive prompts with Clack, spinners, colors, config files, exit codes, and npm publishing.

YepAPI/skills

cmdk integration, Cmd+K trigger, fuzzy search, grouped actions, keyboard navigation, and dynamic action registration.

YepAPI/skills

Content planning with trend and sentiment data from YepAPI.

YepAPI/skills

Content calendar, keyword-driven planning, and content briefs.

YepAPI/skills

Theme switching with CSS variables, system preference detection, next-themes, and persistence.

YepAPI/skills

Threaded comments, @mentions, reactions, moderation queue, optimistic UI, and cursor pagination.

YepAPI/skills

Competitive analysis between domains using YepAPI.

YepAPI/skills

Layout grids, KPI cards, data tables with sorting/filtering, sidebar navigation, and responsive breakpoints.

YepAPI/skills

Data encryption — TLS everywhere, AES-256-GCM for PII, bcrypt passwords, encrypted backups.

YepAPI/skills

Chart patterns with Recharts/Nivo/D3, responsive containers, color scales, and accessibility.

YepAPI/skills

Drizzle schema definition, push vs migrate, type-safe queries, relations, transactions, and prepared statements.

YepAPI/skills

Upload handling, resize/compress, CDN delivery, blur placeholders, and next/image patterns.

YepAPI/skills

Local business and Google Maps research using YepAPI.

YepAPI/skills

Cursor-based pagination, IntersectionObserver, virtualized lists with @tanstack/react-virtual, and scroll position restoration.

YepAPI/skills

Chat UI components, streaming responses with AI SDK, context window management, and RAG patterns.

Skills associés