Skip to main content
skill Claude Code CX Codex Cursor GitHub Copilot

pick-ui-library — Claude Code skill: what it does, how to install

A skill that maps a frontend task to one library from Emil Kowalski's curated list: toasts, charts, OTP fields, virtualization, drag and drop. Runs only when you call it.

Install into Claude Code · Skills CLI (Vercel) All methods and platforms ↓
npx skills add emilkowalski/skills --skill pick-ui-library -a claude-code
Open on GitHub

What pick-ui-library does

The skill turns a vague frontend task into one package choice. Ask for toasts and it hands you Sonner; ask about a ⌘K palette and you get cmdk. OTP inputs, long lists, drag and drop, state, class names and dark mode each have a single entry here. Charts split two ways: Liveline when points arrive live and the chart scrolls with time, recharts for everything else.

There is no code to run, only a table of task-to-library matches and a few mismatches worth catching. The agent reads package.json before answering. An already installed pick wins; a competitor gets flagged but not ripped out without permission. Ask for something off-list and the skill says so before recommending from general knowledge.

It stays quiet until you invoke it. disable-model-invocation: true in the frontmatter means a request for a toast component will not wake it up on its own. Worth installing if you want one answer instead of a shortlist. If your team already has its own preferences, expect friction, because these picks are taste, not consensus.

What it helps with

  • pick a toast library instead of hand-rolling notifications
  • wire up an OTP input without writing the focus handling yourself
  • decide whether a live chart needs a streaming library
  • replace a raw 1,000-row list render with virtualization
  • choose between clsx and cva for a component with variants

Example prompts for the agent

  • I need toasts, what should I use?
  • pick a library for virtualization and wire it up
  • what should I use for drag and drop?

How to install pick-ui-library

1Skills CLI (Vercel)

npx skills add emilkowalski/skills --skill pick-ui-library -a claude-code

2Manually: put the files in place

~/.claude/skills/pick-ui-library/SKILL.md

Copy the whole skill folder; for one project use .claude/skills/pick-ui-library/

From the same set15

The whole set →
emil-design-eng emilkowalski This skill guides UI polish, component details, and animation choices. Use it when an interface works but its states and transitions need closer review. Claude Code CX Codex Cursor +1 385,500installs review-animations emilkowalski Reviews UI animation and motion code against Emil Kowalski's design standards. Flags slow easings, non-GPU properties, and unnecessary transitions. Claude Code CX Codex Cursor +1 254,100installs apple-design emilkowalski Translates Apple's fluid interface principles from WWDC talks into web code with Pointer Events and spring physics. Essential for gesture-driven sheets, drags, and sliders. Claude Code CX Codex Cursor +1 242,100installs animation-vocabulary emilkowalski This skill maps a vague web animation description to the right term. Use it when you need wording for an AI prompt or a designer. Claude Code CX Codex Cursor +1 236,900installs improve-animations emilkowalski Surveys motion and animation code across your project, then generates self-contained fix plans. It spots janky keyframes and poor easing without altering source files. Claude Code CX Codex Cursor +1 222,000installs find-animation-opportunities emilkowalski Scans a codebase or UI for motion that would clarify states and interactions, while rejecting decoration that gets in the way. It is read-only. Claude Code CX Codex Cursor +1 206,800installs prototype emilkowalski The skill builds several genuinely different versions of one piece of UI and puts them behind a visual picker, so you flip through them live and keep the one that feels right. Claude Code CX Codex Cursor +1 172,400installs animate emilkowalski Builds UI animations from scratch following Emil Kowalski's motion philosophy. Use it when adding motion, transitions, or component interactions. Claude Code CX Codex Cursor +1 170,400installs

Similar

turborepo vercel Configures Turborepo monorepos and troubleshoots task pipelines. Useful when editing turbo.json, setting up caching, or fixing CI builds. Claude Code CX Codex Cursor +1 84,600installs vercel-react-view-transitions vercel This skill guides React View Transition API work for route changes, shared elements, component enter and exit, and list reordering. It fits UI state changes without a third-party animation library. Claude Code CX Codex Cursor +1 166,700installs frontend-design official anthropics This skill guides intentional visual design for new interfaces and redesigns. Use it when a generic generated UI is not enough. Claude Code Claude.ai 1,025,790installs design-taste-frontend Leonxlnx This skill directs the design of public pages and work screens, then checks the result in a browser through screenshots. Use it when an interface feels generic or unfinished. Claude Code CX Codex Cursor +1 673,100installs prototype Matt Pocock Creates throwaway prototypes for checking state logic or exploring UI before committing the decision to the main codebase. Claude Code 986,201installs hyperframes heygen-com Instructs coding agents on creating, validating, and rendering HTML-based videos using the HyperFrames framework and CLI. Claude Code CX Codex Cursor +1 1,200,000installs hyperframes-cli heygen-com Controls HyperFrames video workflows from the CLI: audits layouts and contrast, edits timeline clips, captures snapshots, and renders locally or in cloud runtimes. Claude Code CX Codex Cursor +1 1,200,000installs webapp-testing official anthropics This skill tests local web apps with Playwright, helping agents debug UI behavior, capture screenshots, and inspect browser logs. Claude Code Claude.ai 186,758installs

Questions about pick-ui-library

How do I install pick-ui-library in Claude Code?

Run npx skills add emilkowalski/skills --skill pick-ui-library -a claude-code. The skill file lands at ~/.claude/skills/pick-ui-library/SKILL.md.

What does pick-ui-library do?

It matches a frontend task to one library from a curated list, then installs and wires it up if you ask. It checks package.json first, so you do not end up with two packages doing the same job.

Does pick-ui-library run on its own?

No. The frontmatter sets disable-model-invocation: true, so it only works when you invoke it explicitly.

Source text

SKILL.md · MIT
---
name: pick-ui-library
description: Pick the right library for a given frontend task from a curated, opinionated list — numbers, OTP inputs, charts, command menus, virtualization, drag and drop, toasts, state, styling, and more. Only runs when explicitly invoked; it does not trigger on its own.
disable-model-invocation: true
---

# Picking The Right Library

## Initial Response

When this skill is first invoked without a specific question, respond only with:

> I'm ready to pick the right library for your task, my picks come from Emil Kowalski's curated list.

Do not provide any other information until the user asks a question.

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

| Task | Library |
| --- | --- |
| Unstyled, accessible UI components (dialogs, popovers, menus, selects…) | [base-ui](https://base-ui.com) |
| Command menus (⌘K palettes) | [cmdk](https://cmdk.paco.me) |
| Toasts / notifications | [Sonner](https://sonner.emilkowal.ski) |
| One-time password / verification code inputs | [input-otp](https://input-otp.rodz.dev) |
| Customizable GUIs / control panels | [Leva](https://github.com/pmndrs/leva) — [dialkit](https://joshpuckett.me/dialkit) is an alternative |

### Motion & visuals

| Task | Library |
| --- | --- |
| General-purpose animation (springs, layout animations, enter/exit) | [motion](https://motion.dev) (Framer Motion) |
| Animating numbers (counters, prices, stats) | [NumberFlow](https://number-flow.barvian.me) |
| Animated text components | [torph](https://torph.lochie.me/) |
| 3D globes | [Cobe](https://cobe.vercel.app) |
| Dynamic OG images (HTML/CSS → SVG/PNG) | [Satori](https://github.com/vercel/satori) |
| Syntax highlighting | [shiki](https://shiki.style) |

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

| Task | Library |
| --- | --- |
| Real-time / streaming charts | [Liveline](https://github.com/benjitaylor/liveline) |
| General charts (static or interactive dashboards) | [recharts](https://recharts.org) |

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

### Interaction & performance

| Task | Library |
| --- | --- |
| Drag and drop | [dnd kit](https://dndkit.com) |
| Virtualization (long lists, large tables) | [Virtuoso](https://virtuoso.dev) |

### State & styling

| Task | Library |
| --- | --- |
| State management | [zustand](https://zustand.docs.pmnd.rs) |
| Constructing `className` strings conditionally | [clsx](https://github.com/lukeed/clsx) |
| Type-safe, variant-driven styling for Tailwind | [cva](https://cva.style) |
| Theme switching / dark mode (no flash on load) | [next-themes](https://github.com/pacocoursey/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).

© emilkowalski · MIT · emilkowalski/skills

See also

Project sponsors

Companies that keep this analytics open
Gold sponsor

Impressions, clicks and code copies — open statistics. We keep the numbers public for the same reason NeBlask itself is public. Become a sponsor