pick-ui-library

Escolha a biblioteca certa para uma determinada tarefa de frontend a partir de uma lista selecionada e opinativa — números, entradas OTP, gráficos, menus de comando, virtualização, arrastar e soltar, toasts, estado, estilização e mais. Só é executado quando invocado explicitamente; não é acionado por conta própria.

npx skills add https://github.com/emilkowalski/skills --skill pick-ui-library

Picking The Right Library

A lookup skill. When invoked with a task ("I need toasts", "what should I use for drag and drop?"), match the task to the curated list below and recommend the library. These are deliberate, taste-driven picks — don't substitute alternatives outside this list unless the user asks for one or the task genuinely isn't covered.

How to use this

  1. Identify the task, not the library the user named. "I need to show a dropdown" is a UI-primitives task (base-ui), even if they asked about something else.
  2. Check what's already installed. Look at package.json first. If the project already uses a listed library, use it. If it uses a competitor (e.g. react-window instead of Virtuoso), flag the recommendation but don't churn the dependency without being asked.
  3. Recommend one library, state what it's for in one sentence, and install/wire it up if that's part of the request. Don't present a menu of options when the list has a clear answer.
  4. If the task isn't covered by the list, say so explicitly and recommend from your own knowledge — but be clear you've left the curated list.

The list

UI components & primitives

TaskLibrary
Unstyled, accessible UI components (dialogs, popovers, menus, selects…)base-ui
Command menus (⌘K palettes)cmdk
Toasts / notificationsSonner
One-time password / verification code inputsinput-otp
Customizable GUIs / control panelsLevadialkit is an alternative

Motion & visuals

TaskLibrary
General-purpose animation (springs, layout animations, enter/exit)motion (Framer Motion)
Animating numbers (counters, prices, stats)NumberFlow
Animated text componentstorph
3D globesCobe
Dynamic OG images (HTML/CSS → SVG/PNG)Satori
Syntax highlightingshiki

Reach for motion when you need springs, layout animations, exit animations, or gesture-driven values. A simple hover or fade doesn't need it — plain CSS transitions are the right tool there.

Charts

TaskLibrary
Real-time / streaming chartsLiveline
General charts (static or interactive dashboards)recharts

The split: if data points arrive live and the chart scrolls with time, use Liveline. Everything else is recharts.

Interaction & performance

TaskLibrary
Drag and dropdnd kit
Virtualization (long lists, large tables)Virtuoso

State & styling

TaskLibrary
State managementzustand
Constructing className strings conditionallyclsx
Type-safe, variant-driven styling for Tailwindcva
Theme switching / dark mode (no flash on load)next-themes

The styling split: clsx for ad-hoc conditional classes; cva when a component has real variants (size, intent, state) that deserve a typed API. They compose — cva uses clsx-style inputs internally.

Common mismatches to catch

  • Toasts built by hand or with a modal library → Sonner exists for exactly this.
  • A <div>-based dropdown/dialog with manual focus handling → base-ui, which handles accessibility, focus trapping, and dismissal.
  • Animating a number by re-rendering text → NumberFlow handles digit transitions properly.
  • Rendering a 1,000+ row list directly → Virtuoso before reaching for pagination hacks.
  • A useState-per-component web of props for shared state → zustand.
  • Template-literal className ternaries three conditions deep → clsx (or cva if it's variant-shaped).

Mais skills de emilkowalski

find-animation-opportunities
emilkowalski
Pesquise em um codebase ou UI por lugares que não animam mas deveriam, e rejeite tudo o que não deveria. Somente leitura; propõe movimento com valores exatos, não o implementa. Use quando o usuário perguntar "o que poderia ser animado aqui?" ou quiser "deixar isso mais vivo". Para corrigir animações existentes, use improve-animations ou review-animations.
developmentdesigncreative
animate
emilkowalski
Construa uma animação do zero, tomando as decisões na ordem que determina se ela parece certa — se ela deve animar de fato, qual propósito, qual ferramenta, quais propriedades, qual curva e duração, como ela interrompe, como ela sai. Escreve a implementação. Use quando for pedido para animar algo, adicionar movimento, fazer um componente parecer vivo ou construir uma transição. Para criticar movimentos existentes, use review-animations; para auditar uma base de código inteira, use improve-animations.
prototype
emilkowalski
Crie múltiplas versões genuinamente diferentes de uma peça de UI que você descrever, renderizadas atrás de um seletor visual para que você possa alternar entre elas ao vivo e promover a que parecer mais adequada. Só é executado quando invocado explicitamente; não é acionado por conta própria.
developmentdesigncreative
ask-sonner
emilkowalski
Guia para Sonner, a biblioteca de toasts do React — instale e configure o Toaster, escolha a chamada toast() certa, toasts de promise e loading, atualização, dispensa e persistência de toasts, estilização, temas e ícones, posicionamento e múltiplos toasters. Use ao trabalhar com Sonner ou ao solucionar problemas — toasts que não aparecem, aparecem duas vezes, perdem os estilos, ignoram classes do Tailwind, ficam atrás de um modal ou não seguem o modo escuro.
emil-design-eng
emilkowalski
Esta habilidade codifica a filosofia de Emil Kowalski sobre polimento de UI, design de componentes, decisões de animação e os detalhes invisíveis que fazem o software parecer ótimo.
designdevelopmentcreative
review-animations
emilkowalski
Revisa o código de animação e movimento contra um alto padrão de qualidade derivado
animation-vocabulary
emilkowalski
Glossário de consulta reversa que transforma uma descrição vaga de uma animação web ou efeito de movimento em seu termo exato ("aquela coisa saltitante quando um popover abre" → Pop in; "o scroll elástico do iOS" → Rubber-banding). Use quando o usuário pergunta "como se chama quando…", ou descreve um efeito de movimento sem saber seu nome e quer a palavra certa para usar com uma IA ou designer. Serve para nomear um efeito, não para projetá-lo ou construí-lo.
creativedesignresearch
improve-animations
emilkowalski
Analisar o código de animação e movimento de uma base de código como um consultor sênior de motion, e então produzir uma auditoria priorizada e planos de implementação autocontidos para outros agentes (ou modelos mais baratos) executarem. Apenas leitura do código-fonte — planeja melhorias, não as aplica. Use quando o usuário pedir para "melhorar as animações", "auditar o movimento", "deixar este aplicativo com uma sensação melhor", ou quiser um roteiro de correções de animação em vez de uma revisão de uma única alteração.