# VLLNT UI - Full Reference > One-fetch, complete agent context for the VLLNT UI registry. 225 components, install via shadcn CLI against /r/.json. Site: https://ui.vllnt.ai ## Install ```bash pnpm dlx shadcn@latest add https://ui.vllnt.ai/r/.json # Or with npm: npx shadcn@latest add https://ui.vllnt.ai/r/.json ``` ## Get Started Source: https://ui.vllnt.ai/ # Install any component in one line Pick a component, copy its install command, run it. The CLI fetches the source from `ui.vllnt.ai/r/.json` and writes it directly into your repo — you own the code. ## Install (pick your package manager) ```bash # pnpm pnpm dlx shadcn@latest add https://ui.vllnt.ai/r/button.json # npm npx shadcn@latest add https://ui.vllnt.ai/r/button.json # yarn yarn dlx shadcn@latest add https://ui.vllnt.ai/r/button.json # bun bunx --bun shadcn@latest add https://ui.vllnt.ai/r/button.json ``` Replace `button.json` with any component name from the [registry](/components). ## No CLI to install There is no `@vllnt/cli`. The shadcn CLI already speaks the registry format — running it against `ui.vllnt.ai/r/.json` is the supported install path. Same UX, less to maintain. ## Usage after install ```tsx import { Button } from "@/components/ui/button"; export function MyComponent() { return ; } ``` The CLI installs source files into your project under `components/ui/` (configurable via `components.json`), so updates are explicit — re-run the install command when you want a newer version. ## Why this works for agents Every component is also exposed as a machine-readable JSON descriptor. AI coding agents can read them directly: - `https://ui.vllnt.ai/r/registry.json` — index of all 225 components - `https://ui.vllnt.ai/r/.json` — one component - `https://ui.vllnt.ai/llms.txt` — concise index per the [llmstxt.org](https://llmstxt.org) spec - `https://ui.vllnt.ai/llms-full.txt` — full agent context in one fetch ## Next steps - Browse [all 225 components](/components) - Read the [philosophy](/philosophy) behind the library - Read the [docs](/docs) ## Documentation Source: https://ui.vllnt.ai/docs # Getting Started Welcome to VLLNT UI. This is a component registry built with shadcn/ui. ## Installation Install components using the shadcn CLI: ```bash pnpm dlx shadcn@latest add https://ui.vllnt.ai/r/[component-name].json ``` ## Usage Import components from `@vllnt/ui`: ```tsx import { Button } from '@vllnt/ui' export function MyComponent() { return } ``` ## Philosophy Source: https://ui.vllnt.ai/philosophy # Philosophy VLLNT UI is built on a set of core principles that guide every design decision and implementation choice. ## Minimalist Design Less is more. Every component is designed with simplicity at its core. We believe that good design should be invisible—it should work seamlessly without drawing unnecessary attention to itself. Our components are: - Clean and uncluttered - Focused on essential functionality - Free from decorative elements - Purposeful in every detail ## Dark Mode First Dark mode isn't an afterthought—it's the primary design direction. Every component is crafted with dark backgrounds in mind, ensuring optimal readability and visual comfort. Light mode is available, but dark mode is where VLLNT UI truly shines. - Designed for low-light environments - Reduced eye strain - Modern aesthetic - Professional appearance ## No Emoji Style We maintain a professional, text-based approach. Emojis and decorative icons are kept to a minimum, ensuring our components remain timeless and universally applicable. - Text-first communication - Professional tone - Universal compatibility - Clean typography ## Fast Components Performance is not negotiable. Every component is optimized for speed and efficiency: - Lightweight implementations - Minimal dependencies - Optimized rendering - Fast load times ## Technical Excellence Beyond aesthetics, VLLNT UI prioritizes: - **Type Safety**: Built with TypeScript for reliability - **Accessibility**: WCAG compliant components - **Customization**: Easy to extend and modify - **Modern Standards**: Built on latest web technologies ## Getting Started All components follow these principles. When you use VLLNT UI, you're not just adding components—you're adopting a philosophy of clean, fast, and purposeful design. ## Design Guide Source: https://ui.vllnt.ai/design Tokens: https://ui.vllnt.ai/r/design.json # DESIGN.md > Single source of truth for VLLNT UI's brand and design conventions. > Humans read this file. Agents read it too — every UI suggestion must follow it. This is the **canonical** brand & design guideline for the library. The full machine-readable token set lives in `packages/design/tokens.json`, is documented in `packages/design/README.md`, and is mirrored publicly at `/r/design.json`. The site rendering at `/design` reads this file directly. --- ## 1. Brand | Attribute | Value | |-----------|-------| | Name | **VLLNT UI** (always two words, both capitalised) | | Voice | Direct. No marketing fluff. Short sentences. | | Mission | Agent-first React components — copy-paste, you own them. | | Tone | Confident, technical, honest about tradeoffs. | **Voice rules** - Sentence case for headings, button labels, tooltips. Title Case only for proper nouns. - Avoid superlatives ("the best", "blazingly fast"). State facts. - Avoid em-dash chains. One per sentence max. - Use `…` (ellipsis glyph), not `...`. - No emoji in shipped UI. Lucide icons handle anything visual. **Banned phrases** - "Click here" - "Submit" as a button label (use the verb of the action) - "Loading…" without a context noun ("Loading components…") - "Sign up to learn more" --- ## 2. Logo `VLLNT UI` set in the system font stack at the brand weight. There is no standalone wordmark file; the type itself is the mark. **Clear space** — at minimum, height of the cap-height of the logotype. **Min size** — 14px equivalent. Below that, omit "UI" and show only "VLLNT". **Misuse** — never stretch, recolor, italicise, or add a tagline beneath. --- ## 3. Color Tokens live as CSS variables in `packages/ui/themes/default.css`. Components **always** consume tokens — never raw hex. The token set is versioned with the library. Machine clients use `packages/design/tokens.json`. The JSON schema is documented in `packages/design/tokens.schema.json` and groups tokens by color, typography, spacing, radius, elevation, motion, and iconography. ### Semantic tokens (consumer-facing) | Token | Light role | Dark role | |-------|------------|-----------| | `--background` | Surface | Surface | | `--foreground` | Primary text | Primary text | | `--muted` | Subtle surface | Subtle surface | | `--muted-foreground` | Secondary text | Secondary text | | `--border` | Hairline divider | Hairline divider | | `--ring` | Focus ring | Focus ring | | `--accent` / `--accent-foreground` | Active / hover surface | Same | | `--destructive` / `--destructive-foreground` | Danger surface / text | Same | ### Anti-patterns - **Never** use `bg-black` / `text-white` / `bg-white`. Use `bg-background` / `bg-foreground` / `text-foreground` so dark mode works. - **Never** use `bg-gray-500` / Tailwind palette literals. Pick a semantic token. - **Pure black** (`#000`) is banned for backgrounds — use `--background`. ### Contrast WCAG **AA** minimum. Body text against any surface ≥ **4.5:1**, large text ≥ **3:1**, non-text UI ≥ **3:1**. The default theme passes; new themes must verify before merging. --- ## 4. Typography | Token | Size | Weight | Line height | |-------|------|--------|-------------| | Display (H1) | 3rem (48px) | 600 (semibold) | 1.1 | | H2 | 2rem (32px) | 600 | 1.2 | | H3 | 1.5rem (24px) | 600 | 1.25 | | H4 | 1.25rem (20px) | 600 | 1.3 | | Body large | 1.125rem (18px) | 400 | 1.6 | | Body | 1rem (16px) | 400 | 1.6 | | Body small | 0.875rem (14px) | 400 | 1.5 | | Caption | 0.75rem (12px) | 500 | 1.4 | | Code | inherit | 400 mono | 1.5 | **Rules** - Headings use `font-semibold` (600), **never** `font-bold` (700+) at display sizes — letter shapes crush. - Code uses the system mono stack via `font-mono`. - Tabular numerals for data tables, charts, transactions: `font-variant-numeric: tabular-nums`. --- ## 5. Spacing 4-pt scale. Tailwind classes map 1:1. | Token | Value | Use | |-------|-------|-----| | `space-1` | 4px | Icon padding | | `space-2` | 8px | Tight stack, inline gap | | `space-3` | 12px | Comfortable inline gap | | `space-4` | 16px | Default block stack | | `space-6` | 24px | Section break | | `space-8` | 32px | Major section | | `space-12` | 48px | Page section | | `space-16` | 64px | Hero / landing block | **Rules** - Stay on the scale. Never `gap-[7px]` etc. - One axis at a time on flex children — use `gap-y-N` or `gap-x-N`, not `gap-N` when only one axis is needed. --- ## 6. Radius | Token | Value | |-------|-------| | `radius-none` | 0 | | `radius-sm` | 4px | | `radius-md` | 8px (default) | | `radius-lg` | 12px | | `radius-full` | 9999px | Cards, popovers, dialogs use `radius-md`. Pills, avatars use `radius-full`. Long surfaces (panels, sheets) use `radius-lg`. --- ## 7. Elevation Use sparingly. Most components are flat with `border` + `bg-background`. | Token | Value | |-------|-------| | `shadow-none` | none | | `shadow-sm` | `0 1px 2px rgba(0,0,0,0.05)` | | `shadow-md` | `0 4px 6px -1px rgba(0,0,0,0.1)` | | `shadow-lg` | `0 10px 15px -3px rgba(0,0,0,0.1)` (popovers, dialogs) | No coloured shadows. No multi-layered glow effects. --- ## 8. Motion **Principles** 1. **Purposeful** — every animation must explain a state change. No decoration. 2. **Fast** — under 200ms unless the motion communicates distance or volume. 3. **Subtle** — translate < 8px, scale ±2%. No bounces (`spring` easings strip fidelity at small distances). | Token | Duration | Easing | Use | |-------|----------|--------|-----| | `duration-fast` | 100ms | `ease-out` | Micro-interactions (button press) | | `duration-base` | 200ms | `ease-out` | Open / close, hover, focus | | `duration-slow` | 300ms | `ease-in-out` | Layout shifts, modal entry | `prefers-reduced-motion` — when `reduce`, durations collapse to 1ms or motion is skipped entirely. **Banned** - Bounce easings (`cubic-bezier(0.68, -0.55, 0.265, 1.55)`). - Auto-playing entrance animations on initial page load (jarring). - `animation: spin` on anything except a true loading spinner. --- ## 9. Iconography - **Library**: `lucide-react` (only). Match its line-art aesthetic. - **Default size**: 16px (`h-4 w-4`). - **Stroke**: 2px (lucide default). - **Color**: inherits `currentColor`. Don't hardcode. - **Spacing**: 8px (`gap-2`) between icon and adjacent text. --- ## 10. Component patterns | Use | Pattern | |-----|---------| | Inline action | `Button` | | Single binary choice | `Switch` | | One of N | `Select` (≤ 8 options) or `Combobox` (> 8 / searchable) | | Many of N | `MultiSelect` | | Free text | `Input` (single line) or `Textarea` | | Confirmation | `AlertDialog` (destructive) or `Dialog` (informational) | | Side panel | `Sheet` | | Hover help | `Tooltip` (≤ 80 chars) | | Stepper / wizard | `Stepper` + `MultiStepForm` | | Tabular data | `DataTable` | | Hierarchical data | `TreeView` | | Status chip | `Badge` | | Notification (transient) | `Toast` | | Notification (persistent) | `Banner` | | Empty state | `EmptyState` | **Anti-patterns** - `
` — always use `Button` for click semantics. - Tooltips on disabled buttons — wrap in a `` with `aria-disabled` instead, since browsers swallow events on `disabled` elements. - Modal-on-modal — restructure the flow. - Polymorphic children + items props on the same component — pick one. --- ## 11. Accessibility (WCAG AA minimum) - Every interactive element is keyboard-reachable. - Focus rings visible (`--ring` token), never `outline-none` without a replacement. - Form inputs always labelled (`