Communitygithub.com

Modals & Dialogs (YepAPI/skills)

Radix/shadcn Dialog, Bestätigungsdialoge, Sheets für Mobilgeräte, Fokus-Falle, Scroll-Sperre und Unterstützung für verschachtelte Dialoge.

Was ist skills)?

Diese Fähigkeit definiert klare Regeln und Muster für die Implementierung von Modals, Dialogen und Sheets mithilfe von Radix UI und shadcn-Komponenten. Sie legt den Fokus auf Barrierefreiheit, Benutzerfreundlichkeit und korrektes Verhalten auf verschiedenen Bildschirmgrößen. Radix übernimmt dabei automatisch die Fokus-Falle (Focus Trap), die Scroll-Sperre (Scroll Lock) sowie die Schließmechanismen über Escape-Taste, Klick außerhalb des Overlays und explizite Schaltflächen. Die Fähigkeit unterstützt zentral platzierte Dialoge für Bestätigungen (z. B. bei Löschaktionen) und empfiehlt für mobile Geräte die Verwendung von `<Sheet>` (Bottom Drawer) anstelle zentrierter Modals, um eine bessere Bedienung mit dem Daumen zu ermöglichen. Besonderes Augenmerk liegt auf der korrekten Handhabung von Formularen in Dialogen: Bei Validierungsfehlern bleibt der Dialog geöffnet und zeigt Inline-Fehler an, anstatt geschlossen zu werden. Entwickler erhalten konkrete Codebeispiele für Bestätigungsdialoge mit Ladezustand (Loading State) und mobile-freundliche Sheets.

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

In Ihrer bevorzugten KI fragen

Öffnet einen neuen Chat, in dem dieser Agent-Skill bereits geladen ist.

Dokumentation

Modals & Dialoge

Regeln

  • Verwende Radix Dialog oder shadcn <Dialog> – standardmäßig barrierefrei, mit Fokus-Falle und Scroll-Sperre
  • Bestätigungsdialoge für destruktive Aktionen: „Dieses Projekt löschen?“ mit Abbrechen (sekundär) und Löschen (destruktiv)
  • Sheets/Drawer für Mobilgeräte: <Sheet> von shadcn – gleitet von unten oder der Seite herein, bietet bessere Touch-Ziele als zentrierte Modals
  • Fokus-Falle: Radix übernimmt das automatisch – das erste fokussierbare Element erhält beim Öffnen den Fokus, beim Schließen wird der Fokus zurückgesetzt
  • Scroll-Sperre: Verhindert Body-Scroll, wenn das Modal geöffnet ist – Radix erledigt dies mit <Dialog.Overlay>
  • Schließen-Auslöser: Escape-Taste, Klick außerhalb des Overlays, explizite Schließen-Schaltfläche – alles von Radix bereitgestellt
  • Kontrollierter Zustand: open + onOpenChange Props – verlasse dich nicht auf den internen Zustand für Modals, die durch externe Ereignisse ausgelöst werden
  • Formulare in Dialogen: Absenden mit Enter, schließen bei Erfolg, Fehler inline anzeigen – nicht bei Validierungsfehlern schließen
  • Mobilgeräte: Verwende <Sheet> (unterer Drawer) anstelle eines zentrierten <Dialog> für Aktionen auf kleinen Bildschirmen

Muster

// Bestätigungsdialog mit 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">Projekt löschen</Button>
      </AlertDialogTrigger>
      <AlertDialogContent>
        <AlertDialogHeader>
          <AlertDialogTitle>Dieses Projekt löschen?</AlertDialogTitle>
          <AlertDialogDescription>
            Dies löscht das Projekt und alle zugehörigen Daten endgültig. Diese Aktion kann nicht rückgängig gemacht werden.
          </AlertDialogDescription>
        </AlertDialogHeader>
        <AlertDialogFooter>
          <AlertDialogCancel>Abbrechen</AlertDialogCancel>
          <AlertDialogAction
            onClick={async () => { setLoading(true); await onDelete(); setLoading(false); }}
            disabled={loading}
          >
            {loading ? "Löschen..." : "Löschen"}
          </AlertDialogAction>
        </AlertDialogFooter>
      </AlertDialogContent>
    </AlertDialog>
  );
}

// Sheet für mobilfreundliche Aktionen
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>Aktionen</SheetTitle></SheetHeader>
        <nav className="flex flex-col gap-2 py-4">
          <Button variant="ghost">Bearbeiten</Button>
          <Button variant="ghost">Teilen</Button>
          <Button variant="destructive">Löschen</Button>
        </nav>
      </SheetContent>
    </Sheet>
  );
}

Vermeiden

  • Eigene Modals mit position: fixed und manuellem Fokus-Management zu bauen – verwende Radix/shadcn Dialog
  • Fehlende Escape-Taste und Klick-außerhalb-zum-Schließen – Radix übernimmt beides, überschreibe es nicht
  • Zentrierte Modals auf Mobilgeräten für Aktionsmenüs – verwende untere Sheets/Drawer für bessere Daumenreichweite
  • Dialog bei Formularvalidierungsfehlern schließen – offen lassen, Inline-Fehler anzeigen, Benutzer korrigieren und erneut absenden lassen
  • Verschachtelte Dialoge ohne korrekte Stapelkontext – falls nötig, Radix' Unterstützung für verschachtelte Dialoge mit passendem z-index verwenden

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.

Verwandte Skills