# LandorUI Full Context > LandorUI is a modern, responsive, and customizable UI component library to be used in Landor Estate projects. This file expands the Markdown pages listed in https://landorui.landorestate.com/llms.txt. Use https://landorui.landorestate.com/registry.json for the machine-readable shadcn registry index. --- URL: https://landorui.landorestate.com/docs.md Publish installable registry items with public docs from the same workspace. # Introduction Publish installable registry items with public docs from the same workspace. This registry publishes copy-and-paste components, blocks, hooks, files, themes, styles, fonts, bases, and universal items that can be installed with the shadcn CLI. Use the docs in this section to set up the registry, customize the site, and publish your own items. Registry docs live in `registry/docs`. Installable source lives in `registry/items`. You can update any of these files freely (or completely delete them!) --- URL: https://landorui.landorestate.com/docs/installation.md Install and run the registry template locally. # Installation Install and run the registry template locally. After forking the template, install dependencies with [Vite+](https://viteplus.dev/guide/) and start the local docs app. ```sh vp install vp dev ``` Open the local URL from Vite+ to preview your docs, registry catalog, and install pages. ## Customize the Registry Update `registry/config.ts` before publishing your fork. This file controls the public registry identity, namespace, description, homepage, repository URL, and generated install URLs. ## Add Registry Items Scaffold new installable items under `registry/items/**` with the starter script. ```sh bun --bun ./scripts/new.ts --type registry:ui --name example-card --description "A compact card component." ``` You can also run `bun --bun ./scripts/new.ts` for an interactive prompt. Use `--target` for `registry:page`, `registry:file`, custom alias installs such as `@ui/ai/prompt-input.tsx`, or targeted `registry:item` files. The scaffold creates the item source, `_registry.mdx` metadata and usage docs, and an optional `_preview.tsx` preview. Public documentation pages live directly in `registry/docs/`. ## Verify Changes Run the registry doctor after item changes, check the files you touched, and build before publishing. ```sh bun --bun ./scripts/doctor.ts vp check --fix vp build ``` --- URL: https://landorui.landorestate.com/docs/registry.md Scaffold and author installable registry items under registry/items. # Registry Scaffold and author installable registry items under registry/items. Registry items live under `registry/items/**` and can be installed by shadcn-compatible CLIs. Start new items with the scaffold command so the folder, `_registry.mdx`, source file, metadata, and generated registry JSON paths follow the template conventions. ```sh bun --bun ./scripts/new.ts --type registry:ui --name example-card --description "A compact card component." ``` Or, run the command without flags if you want an interactive prompt (recommended). ```sh bun --bun ./scripts/new.ts ``` [Make sure Bun is installed before running these scripts.](https://bun.com/) ## Item Types Choose the registry type from what the item installs: | Type | Use For | Folder | | -------------------- | ----------------------------------------- | ------------------------------ | | `registry:ui` | Shadcn-style UI components | `registry/items/components/**` | | `registry:component` | Components outside `components/ui` | `registry/items/components/**` | | `registry:block` | Larger composed UI patterns | `registry/items/blocks/**` | | `registry:hook` | React hooks | `registry/items/hooks/**` | | `registry:lib` | Utility or helper modules | `registry/items/lib/**` | | `registry:page` | App page files with explicit targets | `registry/items/pages/**` | | `registry:file` | Other files with explicit install targets | `registry/items/files/**` | | `registry:style` | Style-level CSS and dependency metadata | `registry/items/styles/**` | | `registry:theme` | Theme CSS variables | `registry/items/themes/**` | | `registry:font` | Font metadata | `registry/items/fonts/**` | | `registry:base` | Design system base configuration | `registry/items/bases/**` | | `registry:item` | Universal or metadata-only items | `registry/items/items/**` | The scaffold creates each item in its own folder: ```text registry/items/components/example-card/ _registry.mdx _preview.tsx example-card.tsx ``` ## CLI Flags Use flags for agent-friendly and CI-friendly scaffolding: ```sh bun --bun ./scripts/new.ts --type registry:block --name stats-panel --description "A metrics panel with reusable sample data." bun --bun ./scripts/new.ts --type registry:ui --name prompt-input --description "An AI prompt input." --target @ui/ai/prompt-input.tsx bun --bun ./scripts/new.ts --type registry:page --name dashboard-page --description "A starter dashboard page." --target app/dashboard/page.tsx bun --bun ./scripts/new.ts --type registry:file --name chart-theme --description "Shared chart theme tokens." --target styles/chart-theme.css --file-extension css bun --bun ./scripts/new.ts --type registry:font --name font-inter --description "Inter font metadata." --font-family "'Inter Variable', sans-serif" --font-import Inter --font-variable=--font-sans ``` Supported flags: - `--type`: registry item type. Defaults to `registry:ui`. - `--name`: required kebab-case item name. - `--title`: optional public title. Defaults from the name. - `--description`: required public description. - `--target`: required for `registry:page` and `registry:file`; optional for source-backed items that need a custom install path, including shadcn target placeholders like `@ui/ai/prompt-input.tsx`. - `--file-extension`: for `registry:file` and targeted `registry:item`; defaults to `ts`. - `--font-family`, `--font-import`, `--font-variable`: required for noninteractive `registry:font` scaffolds. Use `bun --bun ./scripts/new.ts --help` to print the full usage. ## Authoring Use `_registry.mdx` for public metadata and usage docs. Put the optional named `Preview` export in `_preview.tsx`. Keep both files private to authoring; never list them in `files`. For one-file `registry:ui` items, the catalog infers `.tsx`. Hooks, libs, blocks, pages, target paths, and multi-file items should list `files` explicitly. Metadata-only styles, themes, fonts, bases, and universal items can omit `files`. List authored source files with paths relative to the item `_registry.mdx` file. The catalog automatically emits `files[].target` placeholders such as `@ui/.tsx`, `@components/.tsx`, `@hooks/.ts`, and `@lib/.ts` for file types that should install through the user's `components.json` aliases. Use explicit `target` values for `registry:page`, `registry:file`, and nested alias installs like `@ui/ai/prompt-input.tsx`; do not add `registry/items/**` prefixes or a separate `sourcePath` field. Use `localRegistryDependencies` for dependencies on other local registry items. After editing an item, run `vp check --fix` on touched files and `bun --bun ./scripts/doctor.ts`. Run `vp build` when registry docs, routes, JSON output, catalog loading, or source loading changed. --- URL: https://landorui.landorestate.com/docs/agents.md Give AI coding tools the right context for using and authoring this registry. # Agents Give AI coding tools the right context for using and authoring this registry. This template is designed to work well with coding agents and LLM-powered tools. It exposes Markdown-first routes for reading context, and it ships an installable Agent Skill for authoring registry items correctly. ## Install the Registry Skill Install the `_cn` registry authoring skill from the upstream template: ```sh npx skills add jakejarvis/_cn --skill shadcn-registry ``` Forks can install the same skill from their own repository: ```sh npx skills add / --skill shadcn-registry ``` After installing the skill, ask for registry work directly: - "add a button component to the registry" - "adapt this modal from my app into a reusable registry component" - "add a reusable hook to the registry" - "turn this dashboard section into a registry block" The skill covers all public registry item types, previews, usage docs, dependency metadata, and the scaffold command for creating new items non-interactively. ## Point Agents At Markdown The generated [`/llms.txt`](/llms.txt) route gives AI tools a compact map of the docs, registry catalog, and item pages. Use [`/llms-full.txt`](/llms-full.txt) when a tool needs expanded context with generated Markdown content inlined. Every docs page, the registry catalog, and each registry item also has a Markdown route: - [`/docs.md`](/docs.md) - [`/docs/agents.md`](/docs/agents.md) - [`/registry.md`](/registry.md) - [`/components/example-card.md`](/components/example-card.md) Inspired by [Fumadocs](https://www.fumadocs.dev/docs/headless/utils/negotiation), "human" permalinks support Markdown content negotiation too. AI clients can request `text/markdown`, `text/x-markdown`, or `text/plain` in the `Accept` header on pages like [`/docs`](/docs) or [`/components/example-card`](/components/example-card) and receive Markdown without changing URLs. ## Recommended Agent Workflow For registry authoring tasks, agents should: 1. Read `AGENTS.md`, this docs section, and `/llms.txt` or `/llms-full.txt` for project context. 2. Use the `shadcn-registry` skill when available. 3. Scaffold new items with `bun --bun ./scripts/new.ts --type --name --description ""`. 4. Add `--target` for `registry:page`, `registry:file`, custom alias installs like `@ui/ai/.tsx`, and targeted `registry:item` files; use `--file-extension` for `registry:file` and targeted `registry:item` files. 5. Edit the generated source, `_registry.mdx`, and `_preview.tsx` with usage docs, previews, and dependency metadata. 6. Run `vp check --fix` on touched files, `bun --bun ./scripts/doctor.ts`, and `vp build` before handoff when docs, routes, registry JSON, catalog loading, or source loading changed. --- URL: https://landorui.landorestate.com/docs/cli.md Install items from this registry with the shadcn CLI. # CLI Install items from this registry with the shadcn CLI. Install a registry item with the command shown on its docs page. ```sh npx shadcn@latest add https://underscore-cn.vercel.app/r/example-card.json ``` The command that's displayed uses the `homepage` value from `registry/config.ts` for the base URL. Human-facing item pages also work with the shadcn CLI through content negotiation. For example, a browser can view [`/components/example-card`](/components/example-card), while the CLI receives the installable item JSON from the same URL: ```sh npx shadcn@latest add https://underscore-cn.vercel.app/components/example-card ``` Use the package manager selector on item pages to switch between npm, pnpm, yarn, bun, vite+, and deno commands. --- URL: https://landorui.landorestate.com/docs/theming.md Customize the docs shell and published components with your own design tokens. # Theming Customize the docs shell and published components with your own design tokens. The docs app uses the local shadcn configuration in `components.json` and the global theme in `src/styles.css`. Published registry items are independent from the docs shell. Put installable component source in `registry/items/**`, and include any required CSS, dependencies, or registry dependencies in the item frontmatter. Use semantic tokens such as `background`, `foreground`, `primary`, `muted`, and `border` so installed components remain easy to customize. --- URL: https://landorui.landorestate.com/docs/changelog.md Track user-facing changes to this registry. # Changelog Track user-facing changes to this registry. Use this page to publish notable registry updates, new items, breaking changes, and migration notes. ## v1.0.1: April 21, 2026 - Fixed the pointer cursor when hovering `Button` components. --- URL: https://landorui.landorestate.com/components.md Installable UI primitives and components. # Components Installable UI primitives and components. - [Accordion](https://landorui.landorestate.com/components/accordion): A vertically stacked set of collapsible sections. - [Avatar](https://landorui.landorestate.com/components/avatar): An image element with a fallback for representing a user. - [Badge](https://landorui.landorestate.com/components/badge): A small label for status, counts, or categories. - [Breadcrumb](https://landorui.landorestate.com/components/breadcrumb): Navigation showing the current page's location hierarchy. - [Button](https://landorui.landorestate.com/components/button): A versatile button component with multiple variants and sizes. - [Card](https://landorui.landorestate.com/components/card): A flexible container for grouping related content. - [Carousel](https://landorui.landorestate.com/components/carousel): A slideshow for cycling through images or content. - [Chart](https://landorui.landorestate.com/components/chart): Composable chart components built on Recharts. - [Checkbox](https://landorui.landorestate.com/components/checkbox): A control that toggles between checked and unchecked. - [Collapsible](https://landorui.landorestate.com/components/collapsible): A section that expands and collapses its content. - [Combobox](https://landorui.landorestate.com/components/combobox): An autocomplete input with a filterable list of suggestions. - [Dialog](https://landorui.landorestate.com/components/dialog): A modal window overlaid on the page. - [Drawer](https://landorui.landorestate.com/components/drawer): A panel that slides in from the edge of the screen. - [Dropdown Menu](https://landorui.landorestate.com/components/dropdown-menu): A menu of actions triggered by a button. - [Example Card](https://landorui.landorestate.com/components/example-card): A compact card component that demonstrates shadcn registry dependencies. - [Fading Image](https://landorui.landorestate.com/components/fading-image): An image that fades in on load with a skeleton and error fallback. - [Field](https://landorui.landorestate.com/components/field): Form field wrapper with label, description, and error. - [Hover Card](https://landorui.landorestate.com/components/hover-card): A card revealed when hovering over a trigger. - [Input](https://landorui.landorestate.com/components/input): A text input field. - [Input Group](https://landorui.landorestate.com/components/input-group): Group inputs with addons, buttons, or icons. - [Input OTP](https://landorui.landorestate.com/components/input-otp): An accessible one-time-password input. - [Label](https://landorui.landorestate.com/components/label): An accessible label associated with a control. - [Popover](https://landorui.landorestate.com/components/popover): Floating content anchored to a trigger element. - [Progress](https://landorui.landorestate.com/components/progress): A bar showing completion progress of a task. - [Resizable](https://landorui.landorestate.com/components/resizable): Resizable panel groups with draggable handles. - [Scroll Area](https://landorui.landorestate.com/components/scroll-area): A scrollable region with custom scrollbars. - [Separator](https://landorui.landorestate.com/components/separator): A visual divider between content. - [Sheet](https://landorui.landorestate.com/components/sheet): A panel that slides in as an overlay. - [Sidebar](https://landorui.landorestate.com/components/sidebar): A composable, collapsible application sidebar. - [Skeleton](https://landorui.landorestate.com/components/skeleton): A placeholder shown while content loads. - [Slider](https://landorui.landorestate.com/components/slider): A control for selecting a value from a range. - [Sonner](https://landorui.landorestate.com/components/sonner): An opinionated toast notification component. - [Switch](https://landorui.landorestate.com/components/switch): A toggle control for on/off states. - [Textarea](https://landorui.landorestate.com/components/textarea): A multi-line text input field. - [Toggle](https://landorui.landorestate.com/components/toggle): A two-state button that can be on or off. - [Toggle Group](https://landorui.landorestate.com/components/toggle-group): A set of toggle buttons acting as a group. - [Tooltip](https://landorui.landorestate.com/components/tooltip): A popup with information on hover or focus. --- URL: https://landorui.landorestate.com/components/accordion.md A vertically stacked set of collapsible sections. # Accordion A vertically stacked set of collapsible sections. ## Installation ```bash npx shadcn@latest add https://landorui.landorestate.com/r/accordion.json ``` [Registry JSON](https://landorui.landorestate.com/r/accordion.json) ## Preview ```tsx import { Accordion, AccordionContent, AccordionItem, AccordionTrigger } from "@/components/ui/accordion"; export function Preview() { return ( Is it accessible? Yes. It adheres to the WAI-ARIA design pattern. ); } ``` ## Source ### ui/accordion.tsx ```tsx import { Accordion as AccordionPrimitive } from "@base-ui/react/accordion"; import { ChevronDownIcon, ChevronUpIcon } from "lucide-react"; import { cn } from "@/lib/utils"; function Accordion({ className, ...props }: AccordionPrimitive.Root.Props) { return ( ); } function AccordionItem({ className, ...props }: AccordionPrimitive.Item.Props) { return ( ); } function AccordionTrigger({ className, children, ...props }: AccordionPrimitive.Trigger.Props) { return ( {children} ); } function AccordionContent({ className, children, ...props }: AccordionPrimitive.Panel.Props) { return (
{children}
); } export { Accordion, AccordionItem, AccordionTrigger, AccordionContent }; ``` ## Usage A vertically stacked set of collapsible sections. ```tsx import { Accordion, AccordionContent, AccordionItem, AccordionTrigger, } from "@/components/ui/accordion"; ``` --- URL: https://landorui.landorestate.com/components/avatar.md An image element with a fallback for representing a user. # Avatar An image element with a fallback for representing a user. ## Installation ```bash npx shadcn@latest add https://landorui.landorestate.com/r/avatar.json ``` [Registry JSON](https://landorui.landorestate.com/r/avatar.json) ## Preview ```tsx import { Avatar, AvatarFallback, AvatarImage } from "@/components/ui/avatar"; export function Preview() { return ( CN ); } ``` ## Source ### ui/avatar.tsx ```tsx "use client"; import { Avatar as AvatarPrimitive } from "@base-ui/react/avatar"; import * as React from "react"; import { cn } from "@/lib/utils"; function Avatar({ className, size = "default", ...props }: AvatarPrimitive.Root.Props & { size?: "default" | "sm" | "lg"; }) { return ( ); } function AvatarImage({ className, ...props }: AvatarPrimitive.Image.Props) { return ( ); } function AvatarFallback({ className, ...props }: AvatarPrimitive.Fallback.Props) { return ( ); } function AvatarBadge({ className, ...props }: React.ComponentProps<"span">) { return ( svg]:hidden", "group-data-[size=default]/avatar:size-2.5 group-data-[size=default]/avatar:[&>svg]:size-2", "group-data-[size=lg]/avatar:size-3 group-data-[size=lg]/avatar:[&>svg]:size-2", className, )} {...props} /> ); } function AvatarGroup({ className, ...props }: React.ComponentProps<"div">) { return (
); } function AvatarGroupCount({ className, ...props }: React.ComponentProps<"div">) { return (
svg]:size-4 group-has-data-[size=lg]/avatar-group:[&>svg]:size-5 group-has-data-[size=sm]/avatar-group:[&>svg]:size-3", className, )} {...props} /> ); } export { Avatar, AvatarImage, AvatarFallback, AvatarGroup, AvatarGroupCount, AvatarBadge }; ``` ## Usage An image element with a fallback for representing a user. ```tsx import { Avatar, AvatarFallback, AvatarImage } from "@/components/ui/avatar"; ``` --- URL: https://landorui.landorestate.com/components/badge.md A small label for status, counts, or categories. # Badge A small label for status, counts, or categories. ## Installation ```bash npx shadcn@latest add https://landorui.landorestate.com/r/badge.json ``` [Registry JSON](https://landorui.landorestate.com/r/badge.json) ## Preview ```tsx import { Badge } from "@/components/ui/badge"; export function Preview() { return (
Default Secondary Outline Destructive
); } ``` ## Source ### ui/badge.tsx ```tsx import { mergeProps } from "@base-ui/react/merge-props"; import { useRender } from "@base-ui/react/use-render"; import { cva, type VariantProps } from "class-variance-authority"; import { cn } from "@/lib/utils"; const badgeVariants = cva( "group/badge inline-flex h-5 w-fit shrink-0 items-center justify-center gap-1 overflow-hidden rounded-4xl border border-transparent px-2 py-0.5 text-xs font-medium whitespace-nowrap transition-all focus-visible:border-ring focus-visible:ring-[3px] focus-visible:ring-ring/50 has-data-[icon=inline-end]:pr-1.5 has-data-[icon=inline-start]:pl-1.5 aria-invalid:border-destructive aria-invalid:ring-destructive/20 dark:aria-invalid:ring-destructive/40 [&>svg]:pointer-events-none [&>svg]:size-3!", { variants: { variant: { default: "bg-primary text-primary-foreground [a]:hover:bg-primary/80", secondary: "bg-secondary text-secondary-foreground [a]:hover:bg-secondary/80", destructive: "bg-destructive/10 text-destructive focus-visible:ring-destructive/20 dark:bg-destructive/20 dark:focus-visible:ring-destructive/40 [a]:hover:bg-destructive/20", outline: "border-border text-foreground [a]:hover:bg-muted [a]:hover:text-muted-foreground", ghost: "hover:bg-muted hover:text-muted-foreground dark:hover:bg-muted/50", link: "text-primary underline-offset-4 hover:underline", }, }, defaultVariants: { variant: "default", }, }, ); function Badge({ className, variant = "default", render, ...props }: useRender.ComponentProps<"span"> & VariantProps) { return useRender({ defaultTagName: "span", props: mergeProps<"span">( { className: cn(badgeVariants({ variant }), className), }, props, ), render, state: { slot: "badge", variant, }, }); } export { Badge, badgeVariants }; ``` ## Usage A small label for status, counts, or categories. ```tsx import { Badge } from "@/components/ui/badge"; ``` --- URL: https://landorui.landorestate.com/components/breadcrumb.md Navigation showing the current page's location hierarchy. # Breadcrumb Navigation showing the current page's location hierarchy. ## Installation ```bash npx shadcn@latest add https://landorui.landorestate.com/r/breadcrumb.json ``` [Registry JSON](https://landorui.landorestate.com/r/breadcrumb.json) ## Preview ```tsx import { Breadcrumb, BreadcrumbItem, BreadcrumbLink, BreadcrumbList, BreadcrumbPage, BreadcrumbSeparator, } from "@/components/ui/breadcrumb"; export function Preview() { return ( Home Components ); } ``` ## Source ### ui/breadcrumb.tsx ```tsx import { mergeProps } from "@base-ui/react/merge-props"; import { useRender } from "@base-ui/react/use-render"; import { ChevronRightIcon, MoreHorizontalIcon } from "lucide-react"; import * as React from "react"; import { cn } from "@/lib/utils"; function Breadcrumb({ className, ...props }: React.ComponentProps<"nav">) { return (