Communitygithub.com

YepAPI/skills

Diálogos Radix/shadcn, diálogos de confirmação, folhas para dispositivos móveis, foco automático, bloqueio de rolagem e suporte a diálogos aninhados.

O que é skills?

Esta skill oferece um conjunto de regras e padrões para a implementação de modais e diálogos acessíveis e responsivos utilizando Radix UI e shadcn. Ela garante que modais sejam focados automaticamente, tenham bloqueio de rolagem do corpo da página e suportem fechamento via tecla Escape, clique fora do overlay ou botão de fechar. A skill também padroniza diálogos de confirmação para ações destrutivas, com botões de cancelar e confirmar, e recomenda o uso de componentes `Sheet` para ações em dispositivos móveis, substituindo modais centrados por painéis deslizantes que oferecem melhor alcance do polegar. Além disso, inclui exemplos práticos de código TypeScript com shadcn para diálogos de confirmação e menus móveis, evitando práticas como criação manual de modais, fechamento inadequado durante validação de formulários e falta de contexto de empilhamento para diálogos aninhados.

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

Perguntar na sua IA favorita

Abre um novo chat com esta habilidade de agente já pré-carregada.

Documentação

Modais e Diálogos

Regras

  • Use Radix Dialog ou shadcn <Dialog> — acessível, com foco automático e bloqueio de rolagem por padrão
  • Diálogos de confirmação para ações destrutivas: "Excluir este projeto?" com botões Cancelar (secundário) e Excluir (destrutivo)
  • Folhas/gavetas para dispositivos móveis: <Sheet> do shadcn — desliza de baixo ou lateralmente, com melhor alvo de toque do que modais centralizados
  • Foco automático: Radix gerencia automaticamente — o primeiro elemento focalizável recebe o foco ao abrir, retorna ao fechar
  • Bloqueio de rolagem: impede a rolagem do corpo quando o modal está aberto — Radix gerencia isso com <Dialog.Overlay>
  • Gatilhos de fechamento: tecla Escape, clique fora do overlay, botão de fechar explícito — todos fornecidos pelo Radix
  • Estado controlado: props open + onOpenChange — não dependa do estado interno para modais acionados por eventos externos
  • Formulários em diálogos: submeter com Enter, fechar ao sucesso, mostrar erros inline — não feche em caso de falha de validação
  • Dispositivos móveis: use <Sheet> (gaveta inferior) em vez de <Dialog> centralizado para ações em telas pequenas

Padrões

// Diálogo de confirmação com 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">Excluir projeto</Button>
      </AlertDialogTrigger>
      <AlertDialogContent>
        <AlertDialogHeader>
          <AlertDialogTitle>Excluir este projeto?</AlertDialogTitle>
          <AlertDialogDescription>
            Isso excluirá permanentemente o projeto e todos os seus dados. Esta ação não pode ser desfeita.
          </AlertDialogDescription>
        </AlertDialogHeader>
        <AlertDialogFooter>
          <AlertDialogCancel>Cancelar</AlertDialogCancel>
          <AlertDialogAction
            onClick={async () => { setLoading(true); await onDelete(); setLoading(false); }}
            disabled={loading}
          >
            {loading ? "Excluindo..." : "Excluir"}
          </AlertDialogAction>
        </AlertDialogFooter>
      </AlertDialogContent>
    </AlertDialog>
  );
}

// Folha para ações amigáveis em dispositivos móveis
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>Ações</SheetTitle></SheetHeader>
        <nav className="flex flex-col gap-2 py-4">
          <Button variant="ghost">Editar</Button>
          <Button variant="ghost">Compartilhar</Button>
          <Button variant="destructive">Excluir</Button>
        </nav>
      </SheetContent>
    </Sheet>
  );
}

Evitar

  • Construir modais personalizados com position: fixed e gerenciamento manual de foco — use Radix/shadcn Dialog
  • Faltar com a tecla Escape e fechamento ao clicar fora — Radix lida com ambos, não os sobrescreva
  • Modais centralizados em dispositivos móveis para menus de ação — use Sheet/Drawer inferior para melhor alcance do polegar
  • Fechar o diálogo ao falhar na validação do formulário — mantenha aberto, mostre erros inline, deixe o usuário corrigir e reenviar
  • Diálogos aninhados sem contexto de empilhamento adequado — se necessário, use o suporte a diálogos aninhados do Radix com z-index apropriado

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.

Habilidades Relacionadas