Actions
Buttons, chips, toggles and keys.
v0.8 · open source · MIT
178 React and Tailwind components you copy into your repo and keep. One token file, real dark mode, motion that earns its place.
178 components · 4 peer dependencies · 0 kb of runtime
Shipping 0.2
On track178 components · 15 docs pages
October 2026
Navigate
Components
Draft published
Your changelog is live on the preview URL.
New comment
Maya left a note on the pricing section.
Theme synced
Dark tokens were updated.
Components
178
12 new
Runtime
0 kb
Copy-owned
Weekly digest
LiveSent every Monday at 9:00.
Tokens synced
Hero
One line, one CTA, live pieces underneath — the same pattern this page uses.
01The library
Every preview below is the real component, live. Poke at them, then open a section to see the rest.
02Your files
Every component is one self-contained file. This is the actual source on the right, not a screenshot of it.
"use client";
import * as React from "react";
import { cn } from "@/lib/utils";
/** macOS-style dock: icons magnify smoothly with distance from the cursor. */
export function Dock({
items,
className,
}: {
items: { id: string; label: string; icon: React.ReactNode; onSelect?: () => void }[];
className?: string;
}) {
const refs = React.useRef<(HTMLButtonElement | null)[]>([]);
const magnify = (clientX: number) => {
refs.current.forEach((el) => {
if (!el) return;
const r = el.getBoundingClientRect();
const d = Math.abs(clientX - (r.left + r.width / 2));
const scale = 1 + 0.7 * Math.exp(-((d / 70) ** 2));
el.style.transform = `scale(${scale}) translateY(${(scale - 1) * -14}px)`;
});
};
const reset = () =>
refs.current.forEach((el) => {
if (el) el.style.transform = "";
});
return (
<div
role="toolbar"
className={cn(
"inline-flex items-end gap-2 rounded-xl border border-line bg-surface/80 px-3 py-2.5 shadow-lift backdrop-blur-md",
className,
)}
onMouseMove={(e) => magnify(e.clientX)}
onMouseLeave={reset}
>
{items.map((item, i) => (
<button
key={item.id}
ref={(el) => {
refs.current[i] = el;
}}
// …03Agent-ready
An MCP server, a CLI with JSON output, an llms.txt brief and a registry with generated API tables. Agents search, read and add components without scraping a page.
# give your agent the library
claude mcp add vibeui -- node ./vibeui/mcp/server.mjs
# or drive the CLI yourself
npx @agents-npm-packages/vibeui search "date picker" --json
npx @agents-npm-packages/vibeui add calendar --dir ./src/components/ui