diff --git a/.github/DISCUSSION_TEMPLATE/blocks-request.yml b/.github/DISCUSSION_TEMPLATE/blocks-request.yml
new file mode 100644
index 00000000000..d23ca304a3e
--- /dev/null
+++ b/.github/DISCUSSION_TEMPLATE/blocks-request.yml
@@ -0,0 +1,25 @@
+title: "[blocks]: "
+labels: ["Blocks Request"]
+body:
+ - type: markdown
+ attributes:
+ value: |
+ ### Thanks for taking the time to create a block request! Please search open/closed requests before submitting, as the block or a similar one may have already been requested.
+
+ - type: textarea
+ id: block-description
+ attributes:
+ label: Description
+ description: Tell us about your block request
+ placeholder: "A dashboard for an e-commerce website showing sales, orders, and customers..."
+ validations:
+ required: true
+
+ - type: input
+ id: block-example-url
+ attributes:
+ label: Example
+ description: Link to an example of the block
+ placeholder: ex. https://example.com
+ validations:
+ required: false
diff --git a/.github/ISSUE_TEMPLATE/bug_report.yml b/.github/ISSUE_TEMPLATE/bug_report.yml
new file mode 100644
index 00000000000..52219469df4
--- /dev/null
+++ b/.github/ISSUE_TEMPLATE/bug_report.yml
@@ -0,0 +1,85 @@
+name: "Bug report"
+description: Report an issue
+title: '[bug]: '
+labels: ["bug"]
+body:
+ - type: markdown
+ attributes:
+ value: |
+ ### Thanks for taking the time to create a bug report. Please search open/closed issues before submitting, as the issue may have already been reported/addressed.
+
+ - type: markdown
+ attributes:
+ value: |
+ #### If you aren't sure this is a bug or not, please open a discussion instead:
+ - [Discussions](https://github.com/shadcn-ui/ui/discussions/new?category=general)
+
+ - type: textarea
+ id: bug-description
+ attributes:
+ label: Describe the bug
+ description: A clear and concise description of what the bug is. If you intend to submit a PR for this issue, tell us how in the description. Thanks!
+ placeholder: Bug description
+ validations:
+ required: true
+
+ - type: input
+ id: components-affected
+ attributes:
+ label: Affected component/components
+ description: Which shadcn/ui components are affected?
+ placeholder: ex. Button, Checkbox...
+ validations:
+ required: true
+
+ - type: textarea
+ id: reproduction
+ attributes:
+ label: How to reproduce
+ description: A step-by-step description of how to reproduce the bug.
+ placeholder: |
+ 1. Go to '...'
+ 2. Click on '....'
+ 3. See error
+ validations:
+ required: true
+
+ - type: input
+ id: codesandbox-stackblitz
+ attributes:
+ label: Codesandbox/StackBlitz link
+ description: |
+ A link to a CodeSandbox or StackBlitz that includes a minimal reproduction of the problem. In rare cases when not applicable, you can link to a GitHub repository that we can easily run to recreate the issue. If a report is vague and does not have a reproduction, it will be closed without warning.
+
+ > [!CAUTION]
+ > If you skip this step, this issue might be **labeled** with `please add a reproduction` and **closed**.
+ validations:
+ required: false
+
+ - type: textarea
+ id: logs
+ attributes:
+ label: Logs
+ description: "Please include browser console and server logs around the time this bug occurred. Optional if provided reproduction. Please try not to insert an image but copy paste the log text."
+ render: bash
+
+ - type: textarea
+ id: system-info
+ attributes:
+ label: System Info
+ description: Information about browsers, system or binaries that's relevant.
+ render: bash
+ placeholder: System, Binaries, Browsers
+ validations:
+ required: true
+
+ - type: checkboxes
+ id: terms
+ attributes:
+ label: Before submitting
+ description: By submitting this issue, you agree to follow our [Contributing Guidelines](https://github.com/shadcn-ui/ui/blob/main/CONTRIBUTING.md).
+ options:
+ - label: I've made research efforts and searched the documentation
+ required: true
+ - label: I've searched for existing issues
+ required: true
diff --git a/.github/ISSUE_TEMPLATE/config.yml b/.github/ISSUE_TEMPLATE/config.yml
new file mode 100644
index 00000000000..c5942150437
--- /dev/null
+++ b/.github/ISSUE_TEMPLATE/config.yml
@@ -0,0 +1,5 @@
+blank_issues_enabled: false
+contact_links:
+ - name: Get Help
+ url: https://github.com/shadcn-ui/ui/discussions/new?category=general
+ about: If you can't get something to work the way you expect, open a question in our discussion forums.
\ No newline at end of file
diff --git a/.github/ISSUE_TEMPLATE/feature_request.yml b/.github/ISSUE_TEMPLATE/feature_request.yml
new file mode 100644
index 00000000000..0640a75dcdf
--- /dev/null
+++ b/.github/ISSUE_TEMPLATE/feature_request.yml
@@ -0,0 +1,55 @@
+name: "Feature request"
+description: Create a feature request for shadcn/ui
+title: '[feat]: '
+labels: ['area: request']
+body:
+ - type: markdown
+ attributes:
+ value: |
+ ### Thanks for taking the time to create a feature request! Please search open/closed issues before submitting, as the issue may have already been reported/addressed.
+
+ - type: markdown
+ attributes:
+ value: |
+ #### If you aren't sure this is a bug or not, please open a discussion instead:
+ - [Discussions](https://github.com/shadcn-ui/ui/discussions/new?category=general)
+
+ - type: textarea
+ id: feature-description
+ attributes:
+ label: Feature description
+ description: Tell us about your feature request
+ placeholder: 'I think this feature would be great because...'
+ value: 'Describe your feature request...'
+ validations:
+ required: true
+
+ - type: input
+ id: components-affected
+ attributes:
+ label: Affected component/components
+ description: Is this feature request relevant to any of the already existing components?
+ placeholder: ex. Button, Checkbox...
+ validations:
+ required: false
+
+ - type: textarea
+ id: context
+ attributes:
+ label: Additional Context
+ description: Add any other context about the feature here.
+ placeholder: ex. screenshots, Stack Overflow links, forum links, etc.
+ value: 'Additional details here...'
+ validations:
+ required: false
+
+ - type: checkboxes
+ id: terms
+ attributes:
+ label: Before submitting
+ description: By submitting this issue, you agree to follow our [Contributing Guidelines](https://github.com/shadcn-ui/ui/blob/main/CONTRIBUTING.md).
+ options:
+ - label: I've made research efforts and searched the documentation
+ required: true
+ - label: I've searched for existing issues and PRs
+ required: true
diff --git a/.github/workflows/issue-stale.yml b/.github/workflows/issue-stale.yml
index e509e0c0586..e34856dad69 100644
--- a/.github/workflows/issue-stale.yml
+++ b/.github/workflows/issue-stale.yml
@@ -17,8 +17,9 @@ jobs:
with:
repo-token: ${{ secrets.STALE_TOKEN }}
close-issue-message: "This issue has been automatically closed because it received no activity for a while. If you think it was closed by accident, please leave a comment. Thank you."
- days-before-issue-close: 1
+ days-before-issue-close: 7
days-before-issue-stale: 15
+ stale-pr-label: "stale?"
days-before-pr-close: -1
days-before-pr-stale: -1
exempt-issue-labels: "roadmap,next,bug"
diff --git a/.nvmrc b/.nvmrc
index 7950a445767..8c60e1e54f3 100644
--- a/.nvmrc
+++ b/.nvmrc
@@ -1 +1 @@
-v18.17.0
+v20.5.1
diff --git a/apps/www/__registry__/default/block/authentication-01.tsx b/apps/www/__registry__/default/block/authentication-01.tsx
new file mode 100644
index 00000000000..ad62585fa44
--- /dev/null
+++ b/apps/www/__registry__/default/block/authentication-01.tsx
@@ -0,0 +1,45 @@
+import { Button } from "@/registry/default/ui/button"
+import {
+ Card,
+ CardContent,
+ CardDescription,
+ CardFooter,
+ CardHeader,
+ CardTitle,
+} from "@/registry/default/ui/card"
+import { Input } from "@/registry/default/ui/input"
+import { Label } from "@/registry/default/ui/label"
+
+export const description =
+ "A simple login form with email and password. The submit button says 'Sign in'."
+
+export const iframeHeight = "600px"
+
+export const containerClassName =
+ "w-full h-screen flex items-center justify-center px-4"
+
+export default function LoginForm() {
+ return (
+
+
+ Login
+
+ Enter your email below to login to your account.
+
+
+
+
+ Email
+
+
+
+ Password
+
+
+
+
+ Sign in
+
+
+ )
+}
diff --git a/apps/www/__registry__/default/block/authentication-02.tsx b/apps/www/__registry__/default/block/authentication-02.tsx
new file mode 100644
index 00000000000..b4ccaddd92b
--- /dev/null
+++ b/apps/www/__registry__/default/block/authentication-02.tsx
@@ -0,0 +1,67 @@
+import Link from "next/link"
+
+import { Button } from "@/registry/default/ui/button"
+import {
+ Card,
+ CardContent,
+ CardDescription,
+ CardHeader,
+ CardTitle,
+} from "@/registry/default/ui/card"
+import { Input } from "@/registry/default/ui/input"
+import { Label } from "@/registry/default/ui/label"
+
+export const description =
+ "A login form with email and password. There's an option to login with Google and a link to sign up if you don't have an account."
+
+export const iframeHeight = "600px"
+
+export const containerClassName =
+ "w-full h-screen flex items-center justify-center px-4"
+
+export default function LoginForm() {
+ return (
+
+
+ Login
+
+ Enter your email below to login to your account
+
+
+
+
+
+ Email
+
+
+
+
+ Password
+
+ Forgot your password?
+
+
+
+
+
+ Login
+
+
+ Login with Google
+
+
+
+ Don't have an account?{" "}
+
+ Sign up
+
+
+
+
+ )
+}
diff --git a/apps/www/__registry__/default/block/authentication-03.tsx b/apps/www/__registry__/default/block/authentication-03.tsx
new file mode 100644
index 00000000000..65e7c939a7a
--- /dev/null
+++ b/apps/www/__registry__/default/block/authentication-03.tsx
@@ -0,0 +1,72 @@
+import Link from "next/link"
+
+import { Button } from "@/registry/default/ui/button"
+import {
+ Card,
+ CardContent,
+ CardDescription,
+ CardHeader,
+ CardTitle,
+} from "@/registry/default/ui/card"
+import { Input } from "@/registry/default/ui/input"
+import { Label } from "@/registry/default/ui/label"
+
+export const description =
+ "A sign up form with first name, last name, email and password inside a card. There's an option to sign up with GitHub and a link to login if you already have an account"
+
+export const iframeHeight = "600px"
+
+export const containerClassName =
+ "w-full h-screen flex items-center justify-center px-4"
+
+export default function LoginForm() {
+ return (
+
+
+ Sign Up
+
+ Enter your information to create an account
+
+
+
+
+
+
+ Email
+
+
+
+ Password
+
+
+
+ Create an account
+
+
+ Sign up with GitHub
+
+
+
+ Already have an account?{" "}
+
+ Sign in
+
+
+
+
+ )
+}
diff --git a/apps/www/__registry__/default/block/authentication-04.tsx b/apps/www/__registry__/default/block/authentication-04.tsx
new file mode 100644
index 00000000000..1ccce939230
--- /dev/null
+++ b/apps/www/__registry__/default/block/authentication-04.tsx
@@ -0,0 +1,74 @@
+import Image from "next/image"
+import Link from "next/link"
+
+import { Button } from "@/registry/default/ui/button"
+import { Input } from "@/registry/default/ui/input"
+import { Label } from "@/registry/default/ui/label"
+
+export const description =
+ "A login page with two columns. The first column has the login form with email and password. There's a Forgot your passwork link and a link to sign up if you do not have an account. The second column has a cover image."
+
+export const iframeHeight = "800px"
+
+export const containerClassName = "w-full h-full p-4 lg:p-0"
+
+export default function Dashboard() {
+ return (
+
+
+
+
+
Login
+
+ Enter your email below to login to your account
+
+
+
+
+ Email
+
+
+
+
+ Password
+
+ Forgot your password?
+
+
+
+
+
+ Login
+
+
+ Login with Google
+
+
+
+ Don't have an account?{" "}
+
+ Sign up
+
+
+
+
+
+
+
+
+ )
+}
diff --git a/apps/www/__registry__/default/block/dashboard-01.tsx b/apps/www/__registry__/default/block/dashboard-01.tsx
new file mode 100644
index 00000000000..74bc72a8cde
--- /dev/null
+++ b/apps/www/__registry__/default/block/dashboard-01.tsx
@@ -0,0 +1,455 @@
+import Link from "next/link"
+import {
+ Activity,
+ ArrowUpRight,
+ CircleUser,
+ CreditCard,
+ DollarSign,
+ Menu,
+ Package2,
+ Search,
+ Users,
+} from "lucide-react"
+
+import {
+ Avatar,
+ AvatarFallback,
+ AvatarImage,
+} from "@/registry/default/ui/avatar"
+import { Badge } from "@/registry/default/ui/badge"
+import { Button } from "@/registry/default/ui/button"
+import {
+ Card,
+ CardContent,
+ CardDescription,
+ CardHeader,
+ CardTitle,
+} from "@/registry/default/ui/card"
+import {
+ DropdownMenu,
+ DropdownMenuContent,
+ DropdownMenuItem,
+ DropdownMenuLabel,
+ DropdownMenuSeparator,
+ DropdownMenuTrigger,
+} from "@/registry/default/ui/dropdown-menu"
+import { Input } from "@/registry/default/ui/input"
+import { Sheet, SheetContent, SheetTrigger } from "@/registry/default/ui/sheet"
+import {
+ Table,
+ TableBody,
+ TableCell,
+ TableHead,
+ TableHeader,
+ TableRow,
+} from "@/registry/default/ui/table"
+
+export const description =
+ "An application shell with a header and main content area. The header has a navbar, a search input and and a user nav dropdown. The user nav is toggled by a button with an avatar image."
+
+export const iframeHeight = "825px"
+
+export const containerClassName = "w-full h-full"
+
+export default function Dashboard() {
+ return (
+
+
+
+
+
+ Acme Inc
+
+
+ Dashboard
+
+
+ Orders
+
+
+ Products
+
+
+ Customers
+
+
+ Analytics
+
+
+
+
+
+
+ Toggle navigation menu
+
+
+
+
+
+
+ Acme Inc
+
+
+ Dashboard
+
+
+ Orders
+
+
+ Products
+
+
+ Customers
+
+
+ Analytics
+
+
+
+
+
+
+
+
+
+
+ Toggle user menu
+
+
+
+ My Account
+
+ Settings
+ Support
+
+ Logout
+
+
+
+
+
+
+
+
+
+ Total Revenue
+
+
+
+
+ $45,231.89
+
+ +20.1% from last month
+
+
+
+
+
+
+ Subscriptions
+
+
+
+
+ +2350
+
+ +180.1% from last month
+
+
+
+
+
+ Sales
+
+
+
+ +12,234
+
+ +19% from last month
+
+
+
+
+
+ Active Now
+
+
+
+ +573
+
+ +201 since last hour
+
+
+
+
+
+
+
+
+ Transactions
+
+ Recent transactions from your store.
+
+
+
+
+ View All
+
+
+
+
+
+
+
+
+ Customer
+
+ Type
+
+
+ Status
+
+
+ Date
+
+ Amount
+
+
+
+
+
+ Liam Johnson
+
+ liam@example.com
+
+
+
+ Sale
+
+
+
+ Approved
+
+
+
+ 2023-06-23
+
+ $250.00
+
+
+
+ Olivia Smith
+
+ olivia@example.com
+
+
+
+ Refund
+
+
+
+ Declined
+
+
+
+ 2023-06-24
+
+ $150.00
+
+
+
+ Noah Williams
+
+ noah@example.com
+
+
+
+ Subscription
+
+
+
+ Approved
+
+
+
+ 2023-06-25
+
+ $350.00
+
+
+
+ Emma Brown
+
+ emma@example.com
+
+
+
+ Sale
+
+
+
+ Approved
+
+
+
+ 2023-06-26
+
+ $450.00
+
+
+
+ Liam Johnson
+
+ liam@example.com
+
+
+
+ Sale
+
+
+
+ Approved
+
+
+
+ 2023-06-27
+
+ $550.00
+
+
+
+
+
+
+
+ Recent Sales
+
+
+
+
+
+ OM
+
+
+
+ Olivia Martin
+
+
+ olivia.martin@email.com
+
+
+
+$1,999.00
+
+
+
+
+ JL
+
+
+
+ Jackson Lee
+
+
+ jackson.lee@email.com
+
+
+
+$39.00
+
+
+
+
+ IN
+
+
+
+ Isabella Nguyen
+
+
+ isabella.nguyen@email.com
+
+
+
+$299.00
+
+
+
+
+ WK
+
+
+
+ William Kim
+
+
+ will@email.com
+
+
+
+$99.00
+
+
+
+
+ SD
+
+
+
+ Sofia Davis
+
+
+ sofia.davis@email.com
+
+
+
+$39.00
+
+
+
+
+
+
+ )
+}
diff --git a/apps/www/__registry__/default/block/dashboard-02.tsx b/apps/www/__registry__/default/block/dashboard-02.tsx
new file mode 100644
index 00000000000..10e217352a4
--- /dev/null
+++ b/apps/www/__registry__/default/block/dashboard-02.tsx
@@ -0,0 +1,247 @@
+import Link from "next/link"
+import {
+ Bell,
+ CircleUser,
+ Home,
+ LineChart,
+ Menu,
+ Package,
+ Package2,
+ Search,
+ ShoppingCart,
+ Users,
+} from "lucide-react"
+
+import { Badge } from "@/registry/default/ui/badge"
+import { Button } from "@/registry/default/ui/button"
+import {
+ Card,
+ CardContent,
+ CardDescription,
+ CardHeader,
+ CardTitle,
+} from "@/registry/default/ui/card"
+import {
+ DropdownMenu,
+ DropdownMenuContent,
+ DropdownMenuItem,
+ DropdownMenuLabel,
+ DropdownMenuSeparator,
+ DropdownMenuTrigger,
+} from "@/registry/default/ui/dropdown-menu"
+import { Input } from "@/registry/default/ui/input"
+import { Sheet, SheetContent, SheetTrigger } from "@/registry/default/ui/sheet"
+
+export const description =
+ "A products dashboard with a sidebar navigation and a main content area. The dashboard has a header with a search input and a user menu. The sidebar has a logo, navigation links, and a card with a call to action. The main content area shows an empty state with a call to action."
+
+export const iframeHeight = "800px"
+
+export const containerClassName = "w-full h-full"
+
+export default function Dashboard() {
+ return (
+
+
+
+
+
+
+
Acme Inc
+
+
+
+ Toggle notifications
+
+
+
+
+
+
+ Dashboard
+
+
+
+ Orders
+
+ 6
+
+
+
+
+ Products{" "}
+
+
+
+ Customers
+
+
+
+ Analytics
+
+
+
+
+
+
+ Upgrade to Pro
+
+ Unlock all features and get unlimited access to our support
+ team.
+
+
+
+
+ Upgrade
+
+
+
+
+
+
+
+
+
+
+
+
+ Toggle navigation menu
+
+
+
+
+
+
+ Acme Inc
+
+
+
+ Dashboard
+
+
+
+ Orders
+
+ 6
+
+
+
+
+ Products
+
+
+
+ Customers
+
+
+
+ Analytics
+
+
+
+
+
+ Upgrade to Pro
+
+ Unlock all features and get unlimited access to our
+ support team.
+
+
+
+
+ Upgrade
+
+
+
+
+
+
+
+
+
+
+
+ Toggle user menu
+
+
+
+ My Account
+
+ Settings
+ Support
+
+ Logout
+
+
+
+
+
+
Inventory
+
+
+
+
+ You have no products
+
+
+ You can start selling as soon as you add a product.
+
+
Add Product
+
+
+
+
+
+ )
+}
diff --git a/apps/www/__registry__/default/block/dashboard-03.tsx b/apps/www/__registry__/default/block/dashboard-03.tsx
new file mode 100644
index 00000000000..ea89e0e67a9
--- /dev/null
+++ b/apps/www/__registry__/default/block/dashboard-03.tsx
@@ -0,0 +1,464 @@
+import {
+ Bird,
+ Book,
+ Bot,
+ Code2,
+ CornerDownLeft,
+ LifeBuoy,
+ Mic,
+ Paperclip,
+ Rabbit,
+ Settings,
+ Settings2,
+ Share,
+ SquareTerminal,
+ SquareUser,
+ Triangle,
+ Turtle,
+} from "lucide-react"
+
+import { Badge } from "@/registry/default/ui/badge"
+import { Button } from "@/registry/default/ui/button"
+import {
+ Drawer,
+ DrawerContent,
+ DrawerDescription,
+ DrawerHeader,
+ DrawerTitle,
+ DrawerTrigger,
+} from "@/registry/default/ui/drawer"
+import { Input } from "@/registry/default/ui/input"
+import { Label } from "@/registry/default/ui/label"
+import {
+ Select,
+ SelectContent,
+ SelectItem,
+ SelectTrigger,
+ SelectValue,
+} from "@/registry/default/ui/select"
+import { Textarea } from "@/registry/default/ui/textarea"
+import {
+ Tooltip,
+ TooltipContent,
+ TooltipTrigger,
+} from "@/registry/default/ui/tooltip"
+
+export const description =
+ "An AI playground with a sidebar navigation and a main content area. The playground has a header with a settings drawer and a share button. The sidebar has navigation links and a user menu. The main content area shows a form to configure the model and messages."
+
+export const iframeHeight = "740px"
+
+export const containerClassName = "w-full h-full"
+
+export default function Dashboard() {
+ return (
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ Playground
+
+
+
+
+
+
+
+
+
+ Models
+
+
+
+
+
+
+
+
+
+ API
+
+
+
+
+
+
+
+
+
+ Documentation
+
+
+
+
+
+
+
+
+
+ Settings
+
+
+
+
+
+
+
+
+
+
+
+ Help
+
+
+
+
+
+
+
+
+
+ Account
+
+
+
+
+
+
+ Playground
+
+
+
+
+ Settings
+
+
+
+
+ Configuration
+
+ Configure the settings for the model and messages.
+
+
+
+
+
+
+
+ Share
+
+
+
+
+
+
+
+ Settings
+
+
+
Model
+
+
+
+
+
+
+
+
+
+
+ Neural{" "}
+
+ Genesis
+
+
+
+ Our fastest model for general use cases.
+
+
+
+
+
+
+
+
+
+ Neural{" "}
+
+ Explorer
+
+
+
+ Performance and speed for efficiency.
+
+
+
+
+
+
+
+
+
+ Neural{" "}
+
+ Quantum
+
+
+
+ The most powerful model for complex computations.
+
+
+
+
+
+
+
+
+ Temperature
+
+
+
+
+
+
+ Messages
+
+
+ Role
+
+
+
+
+
+ System
+ User
+ Assistant
+
+
+
+
+ Content
+
+
+
+
+
+
+
+ Output
+
+
+
+
+ Message
+
+
+
+
+
+
+
+ Attach file
+
+
+ Attach File
+
+
+
+
+
+ Use Microphone
+
+
+ Use Microphone
+
+
+ Send Message
+
+
+
+
+
+
+
+
+ )
+}
diff --git a/apps/www/__registry__/default/block/dashboard-04.tsx b/apps/www/__registry__/default/block/dashboard-04.tsx
new file mode 100644
index 00000000000..991a45cc950
--- /dev/null
+++ b/apps/www/__registry__/default/block/dashboard-04.tsx
@@ -0,0 +1,223 @@
+import Link from "next/link"
+import { CircleUser, Menu, Package2, Search } from "lucide-react"
+
+import { Button } from "@/registry/default/ui/button"
+import {
+ Card,
+ CardContent,
+ CardDescription,
+ CardFooter,
+ CardHeader,
+ CardTitle,
+} from "@/registry/default/ui/card"
+import { Checkbox } from "@/registry/default/ui/checkbox"
+import {
+ DropdownMenu,
+ DropdownMenuContent,
+ DropdownMenuItem,
+ DropdownMenuLabel,
+ DropdownMenuSeparator,
+ DropdownMenuTrigger,
+} from "@/registry/default/ui/dropdown-menu"
+import { Input } from "@/registry/default/ui/input"
+import { Sheet, SheetContent, SheetTrigger } from "@/registry/default/ui/sheet"
+
+export const description =
+ "A settings page. The settings page has a sidebar navigation and a main content area. The main content area has a form to update the store name and a form to update the plugins directory. The sidebar navigation has links to general, security, integrations, support, organizations, and advanced settings."
+
+export const iframeHeight = "780px"
+
+export const containerClassName = "w-full h-full"
+
+export default function Dashboard() {
+ return (
+
+
+
+
+
+ Acme Inc
+
+
+ Dashboard
+
+
+ Orders
+
+
+ Products
+
+
+ Customers
+
+
+ Settings
+
+
+
+
+
+
+ Toggle navigation menu
+
+
+
+
+
+
+ Acme Inc
+
+
+ Dashboard
+
+
+ Orders
+
+
+ Products
+
+
+ Customers
+
+
+ Settings
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ Toggle user menu
+
+
+
+ My Account
+
+ Settings
+ Support
+
+ Logout
+
+
+
+
+
+
+
Settings
+
+
+
+
+ General
+
+ Security
+ Integrations
+ Support
+ Organizations
+ Advanced
+
+
+
+
+
+ )
+}
diff --git a/apps/www/__registry__/default/block/dashboard-05.tsx b/apps/www/__registry__/default/block/dashboard-05.tsx
new file mode 100644
index 00000000000..f94522d7f17
--- /dev/null
+++ b/apps/www/__registry__/default/block/dashboard-05.tsx
@@ -0,0 +1,720 @@
+import Image from "next/image"
+import Link from "next/link"
+import {
+ ChevronLeft,
+ ChevronRight,
+ Copy,
+ CreditCard,
+ File,
+ Home,
+ LineChart,
+ ListFilter,
+ MoreVertical,
+ Package,
+ Package2,
+ PanelLeft,
+ Search,
+ Settings,
+ ShoppingCart,
+ Truck,
+ Users2,
+} from "lucide-react"
+
+import { Badge } from "@/registry/default/ui/badge"
+import {
+ Breadcrumb,
+ BreadcrumbItem,
+ BreadcrumbLink,
+ BreadcrumbList,
+ BreadcrumbPage,
+ BreadcrumbSeparator,
+} from "@/registry/default/ui/breadcrumb"
+import { Button } from "@/registry/default/ui/button"
+import {
+ Card,
+ CardContent,
+ CardDescription,
+ CardFooter,
+ CardHeader,
+ CardTitle,
+} from "@/registry/default/ui/card"
+import {
+ DropdownMenu,
+ DropdownMenuCheckboxItem,
+ DropdownMenuContent,
+ DropdownMenuItem,
+ DropdownMenuLabel,
+ DropdownMenuSeparator,
+ DropdownMenuTrigger,
+} from "@/registry/default/ui/dropdown-menu"
+import { Input } from "@/registry/default/ui/input"
+import {
+ Pagination,
+ PaginationContent,
+ PaginationItem,
+} from "@/registry/default/ui/pagination"
+import { Progress } from "@/registry/default/ui/progress"
+import { Separator } from "@/registry/default/ui/separator"
+import { Sheet, SheetContent, SheetTrigger } from "@/registry/default/ui/sheet"
+import {
+ Table,
+ TableBody,
+ TableCell,
+ TableHead,
+ TableHeader,
+ TableRow,
+} from "@/registry/default/ui/table"
+import {
+ Tabs,
+ TabsContent,
+ TabsList,
+ TabsTrigger,
+} from "@/registry/default/ui/tabs"
+import {
+ Tooltip,
+ TooltipContent,
+ TooltipTrigger,
+} from "@/registry/default/ui/tooltip"
+
+export const description =
+ "An orders dashboard with a sidebar navigation. The sidebar has icon navigation. The content area has a breadcrumb and search in the header. The main area has a list of recent orders with a filter and export button. The main area also has a detailed view of a single order with order details, shipping information, billing information, customer information, and payment information."
+
+export const iframeHeight = "1112px"
+
+export const containerClassName = "w-full h-full"
+
+export default function Dashboard() {
+ return (
+
+
+
+
+
+ Acme Inc
+
+
+
+
+
+ Dashboard
+
+
+ Dashboard
+
+
+
+
+
+ Orders
+
+
+ Orders
+
+
+
+
+
+ Products
+
+
+ Products
+
+
+
+
+
+ Customers
+
+
+ Customers
+
+
+
+
+
+ Analytics
+
+
+ Analytics
+
+
+
+
+
+
+
+ Settings
+
+
+ Settings
+
+
+
+
+
+
+
+
+
+
+ Your Orders
+
+ Introducing Our Dynamic Orders Dashboard for Seamless
+ Management and Insightful Analysis.
+
+
+
+ Create New Order
+
+
+
+
+ This Week
+ $1,329
+
+
+
+ +25% from last week
+
+
+
+
+
+
+
+
+ This Month
+ $5,329
+
+
+
+ +10% from last month
+
+
+
+
+
+
+
+
+
+
+ Week
+ Month
+ Year
+
+
+
+
+
+
+ Filter
+
+
+
+ Filter by
+
+
+ Fulfilled
+
+
+ Declined
+
+
+ Refunded
+
+
+
+
+
+ Export
+
+
+
+
+
+
+ Orders
+
+ Recent orders from your store.
+
+
+
+
+
+
+ Customer
+
+ Type
+
+
+ Status
+
+
+ Date
+
+ Amount
+
+
+
+
+
+ Liam Johnson
+
+ liam@example.com
+
+
+
+ Sale
+
+
+
+ Fulfilled
+
+
+
+ 2023-06-23
+
+ $250.00
+
+
+
+ Olivia Smith
+
+ olivia@example.com
+
+
+
+ Refund
+
+
+
+ Declined
+
+
+
+ 2023-06-24
+
+ $150.00
+
+
+
+ Noah Williams
+
+ noah@example.com
+
+
+
+ Subscription
+
+
+
+ Fulfilled
+
+
+
+ 2023-06-25
+
+ $350.00
+
+
+
+ Emma Brown
+
+ emma@example.com
+
+
+
+ Sale
+
+
+
+ Fulfilled
+
+
+
+ 2023-06-26
+
+ $450.00
+
+
+
+ Liam Johnson
+
+ liam@example.com
+
+
+
+ Sale
+
+
+
+ Fulfilled
+
+
+
+ 2023-06-23
+
+ $250.00
+
+
+
+ Liam Johnson
+
+ liam@example.com
+
+
+
+ Sale
+
+
+
+ Fulfilled
+
+
+
+ 2023-06-23
+
+ $250.00
+
+
+
+ Olivia Smith
+
+ olivia@example.com
+
+
+
+ Refund
+
+
+
+ Declined
+
+
+
+ 2023-06-24
+
+ $150.00
+
+
+
+ Emma Brown
+
+ emma@example.com
+
+
+
+ Sale
+
+
+
+ Fulfilled
+
+
+
+ 2023-06-26
+
+ $450.00
+
+
+
+
+
+
+
+
+
+
+
+
+
+ Order Oe31b70H
+
+
+ Copy Order ID
+
+
+ Date: November 23, 2023
+
+
+
+
+
+ Track Order
+
+
+
+
+
+
+ More
+
+
+
+ Edit
+ Export
+
+ Trash
+
+
+
+
+
+
+
Order Details
+
+
+
+ Glimmer Lamps x 2
+
+ $250.00
+
+
+
+ Aqua Filters x 1
+
+ $49.00
+
+
+
+
+
+ Subtotal
+ $299.00
+
+
+ Shipping
+ $5.00
+
+
+ Tax
+ $25.00
+
+
+ Total
+ $329.00
+
+
+
+
+
+
+
Shipping Information
+
+ Liam Johnson
+ 1234 Main St.
+ Anytown, CA 12345
+
+
+
+
Billing Information
+
+ Same as shipping address
+
+
+
+
+
+
Customer Information
+
+
+
Customer
+ Liam Johnson
+
+
+
+
+
+
+
+
Payment Information
+
+
+
+
+ Visa
+
+ **** **** **** 4532
+
+
+
+
+
+
+ Updated November 23, 2023
+
+
+
+
+
+
+ Previous Order
+
+
+
+
+
+ Next Order
+
+
+
+
+
+
+
+
+
+
+ )
+}
diff --git a/apps/www/__registry__/default/block/dashboard-06.tsx b/apps/www/__registry__/default/block/dashboard-06.tsx
new file mode 100644
index 00000000000..737d90c0427
--- /dev/null
+++ b/apps/www/__registry__/default/block/dashboard-06.tsx
@@ -0,0 +1,637 @@
+import Image from "next/image"
+import Link from "next/link"
+import {
+ File,
+ Home,
+ LineChart,
+ ListFilter,
+ MoreHorizontal,
+ Package,
+ Package2,
+ PanelLeft,
+ PlusCircle,
+ Search,
+ Settings,
+ ShoppingCart,
+ Users2,
+} from "lucide-react"
+
+import { Badge } from "@/registry/default/ui/badge"
+import {
+ Breadcrumb,
+ BreadcrumbItem,
+ BreadcrumbLink,
+ BreadcrumbList,
+ BreadcrumbPage,
+ BreadcrumbSeparator,
+} from "@/registry/default/ui/breadcrumb"
+import { Button } from "@/registry/default/ui/button"
+import {
+ Card,
+ CardContent,
+ CardDescription,
+ CardFooter,
+ CardHeader,
+ CardTitle,
+} from "@/registry/default/ui/card"
+import {
+ DropdownMenu,
+ DropdownMenuCheckboxItem,
+ DropdownMenuContent,
+ DropdownMenuItem,
+ DropdownMenuLabel,
+ DropdownMenuSeparator,
+ DropdownMenuTrigger,
+} from "@/registry/default/ui/dropdown-menu"
+import { Input } from "@/registry/default/ui/input"
+import { Sheet, SheetContent, SheetTrigger } from "@/registry/default/ui/sheet"
+import {
+ Table,
+ TableBody,
+ TableCell,
+ TableHead,
+ TableHeader,
+ TableRow,
+} from "@/registry/default/ui/table"
+import {
+ Tabs,
+ TabsContent,
+ TabsList,
+ TabsTrigger,
+} from "@/registry/default/ui/tabs"
+import {
+ Tooltip,
+ TooltipContent,
+ TooltipTrigger,
+} from "@/registry/default/ui/tooltip"
+
+export const description =
+ "An products dashboard with a sidebar navigation. The sidebar has icon navigation. The content area has a breadcrumb and search in the header. It displays a list of products in a table with actions."
+
+export const iframeHeight = "938px"
+
+export const containerClassName = "w-full h-full"
+
+export default function Dashboard() {
+ return (
+
+
+
+
+
+ Acme Inc
+
+
+
+
+
+ Dashboard
+
+
+ Dashboard
+
+
+
+
+
+ Orders
+
+
+ Orders
+
+
+
+
+
+ Products
+
+
+ Products
+
+
+
+
+
+ Customers
+
+
+ Customers
+
+
+
+
+
+ Analytics
+
+
+ Analytics
+
+
+
+
+
+
+
+ Settings
+
+
+ Settings
+
+
+
+
+
+
+
+
+
+ All
+ Active
+ Draft
+
+ Archived
+
+
+
+
+
+
+
+
+ Filter
+
+
+
+
+ Filter by
+
+
+ Active
+
+ Draft
+
+ Archived
+
+
+
+
+
+
+ Export
+
+
+
+
+
+ Add Product
+
+
+
+
+
+
+
+ Products
+
+ Manage your products and view their sales performance.
+
+
+
+
+
+
+
+ Image
+
+ Name
+ Status
+
+ Price
+
+
+ Total Sales
+
+
+ Created at
+
+
+ Actions
+
+
+
+
+
+
+
+
+
+ Laser Lemonade Machine
+
+
+ Draft
+
+
+ $499.99
+
+
+ 25
+
+
+ 2023-07-12 10:42 AM
+
+
+
+
+
+
+ Toggle menu
+
+
+
+ Actions
+ Edit
+ Delete
+
+
+
+
+
+
+
+
+
+ Hypernova Headphones
+
+
+ Active
+
+
+ $129.99
+
+
+ 100
+
+
+ 2023-10-18 03:21 PM
+
+
+
+
+
+
+ Toggle menu
+
+
+
+ Actions
+ Edit
+ Delete
+
+
+
+
+
+
+
+
+
+ AeroGlow Desk Lamp
+
+
+ Active
+
+
+ $39.99
+
+
+ 50
+
+
+ 2023-11-29 08:15 AM
+
+
+
+
+
+
+ Toggle menu
+
+
+
+ Actions
+ Edit
+ Delete
+
+
+
+
+
+
+
+
+
+ TechTonic Energy Drink
+
+
+ Draft
+
+
+ $2.99
+
+
+ 0
+
+
+ 2023-12-25 11:59 PM
+
+
+
+
+
+
+ Toggle menu
+
+
+
+ Actions
+ Edit
+ Delete
+
+
+
+
+
+
+
+
+
+ Gamer Gear Pro Controller
+
+
+ Active
+
+
+ $59.99
+
+
+ 75
+
+
+ 2024-01-01 12:00 AM
+
+
+
+
+
+
+ Toggle menu
+
+
+
+ Actions
+ Edit
+ Delete
+
+
+
+
+
+
+
+
+
+ Luminous VR Headset
+
+
+ Active
+
+
+ $199.99
+
+
+ 30
+
+
+ 2024-02-14 02:14 PM
+
+
+
+
+
+
+ Toggle menu
+
+
+
+ Actions
+ Edit
+ Delete
+
+
+
+
+
+
+
+
+
+ Showing 1-10 of 32 {" "}
+ products
+
+
+
+
+
+
+
+
+ )
+}
diff --git a/apps/www/__registry__/default/block/dashboard-07.tsx b/apps/www/__registry__/default/block/dashboard-07.tsx
new file mode 100644
index 00000000000..5c78dee0561
--- /dev/null
+++ b/apps/www/__registry__/default/block/dashboard-07.tsx
@@ -0,0 +1,610 @@
+import Image from "next/image"
+import Link from "next/link"
+import {
+ ChevronLeft,
+ Home,
+ LineChart,
+ Package,
+ Package2,
+ PanelLeft,
+ PlusCircle,
+ Search,
+ Settings,
+ ShoppingCart,
+ Upload,
+ Users2,
+} from "lucide-react"
+
+import { Badge } from "@/registry/default/ui/badge"
+import {
+ Breadcrumb,
+ BreadcrumbItem,
+ BreadcrumbLink,
+ BreadcrumbList,
+ BreadcrumbPage,
+ BreadcrumbSeparator,
+} from "@/registry/default/ui/breadcrumb"
+import { Button } from "@/registry/default/ui/button"
+import {
+ Card,
+ CardContent,
+ CardDescription,
+ CardFooter,
+ CardHeader,
+ CardTitle,
+} from "@/registry/default/ui/card"
+import {
+ DropdownMenu,
+ DropdownMenuContent,
+ DropdownMenuItem,
+ DropdownMenuLabel,
+ DropdownMenuSeparator,
+ DropdownMenuTrigger,
+} from "@/registry/default/ui/dropdown-menu"
+import { Input } from "@/registry/default/ui/input"
+import { Label } from "@/registry/default/ui/label"
+import {
+ Select,
+ SelectContent,
+ SelectItem,
+ SelectTrigger,
+ SelectValue,
+} from "@/registry/default/ui/select"
+import { Sheet, SheetContent, SheetTrigger } from "@/registry/default/ui/sheet"
+import {
+ Table,
+ TableBody,
+ TableCell,
+ TableHead,
+ TableHeader,
+ TableRow,
+} from "@/registry/default/ui/table"
+import { Textarea } from "@/registry/default/ui/textarea"
+import {
+ ToggleGroup,
+ ToggleGroupItem,
+} from "@/registry/default/ui/toggle-group"
+import {
+ Tooltip,
+ TooltipContent,
+ TooltipTrigger,
+} from "@/registry/default/ui/tooltip"
+
+export const description =
+ "A product edit page. The product edit page has a form to edit the product details, stock, product category, product status, and product images. The product edit page has a sidebar navigation and a main content area. The main content area has a form to edit the product details, stock, product category, product status, and product images. The sidebar navigation has links to product details, stock, product category, product status, and product images."
+
+export const iframeHeight = "1200px"
+
+export const containerClassName = "w-full h-full"
+
+export default function Dashboard() {
+ return (
+
+
+
+
+
+ Acme Inc
+
+
+
+
+
+ Dashboard
+
+
+ Dashboard
+
+
+
+
+
+ Orders
+
+
+ Orders
+
+
+
+
+
+ Products
+
+
+ Products
+
+
+
+
+
+ Customers
+
+
+ Customers
+
+
+
+
+
+ Analytics
+
+
+ Analytics
+
+
+
+
+
+
+
+ Settings
+
+
+ Settings
+
+
+
+
+
+
+
+
+
+
+ Back
+
+
+ Pro Controller
+
+
+ In stock
+
+
+
+ Discard
+
+ Save Product
+
+
+
+
+
+
+ Product Details
+
+ Lipsum dolor sit amet, consectetur adipiscing elit
+
+
+
+
+
+ Name
+
+
+
+ Description
+
+
+
+
+
+
+
+ Stock
+
+ Lipsum dolor sit amet, consectetur adipiscing elit
+
+
+
+
+
+
+
+
+ Add Variant
+
+
+
+
+
+ Product Category
+
+
+
+
+ Category
+
+
+
+
+
+ Clothing
+
+ Electronics
+
+
+ Accessories
+
+
+
+
+
+
+ Subcategory (optional)
+
+
+
+
+
+
+ T-Shirts
+ Hoodies
+
+ Sweatshirts
+
+
+
+
+
+
+
+
+
+
+
+ Product Status
+
+
+
+
+ Status
+
+
+
+
+
+ Draft
+ Active
+ Archived
+
+
+
+
+
+
+
+
+ Product Images
+
+ Lipsum dolor sit amet, consectetur adipiscing elit
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ Upload
+
+
+
+
+
+
+
+ Archive Product
+
+ Lipsum dolor sit amet, consectetur adipiscing elit.
+
+
+
+
+
+ Archive Product
+
+
+
+
+
+
+
+ Discard
+
+ Save Product
+
+
+
+
+
+ )
+}
diff --git a/apps/www/__registry__/default/example/accordion-demo.tsx b/apps/www/__registry__/default/example/accordion-demo.tsx
new file mode 100644
index 00000000000..cc5ee7d2250
--- /dev/null
+++ b/apps/www/__registry__/default/example/accordion-demo.tsx
@@ -0,0 +1,33 @@
+import {
+ Accordion,
+ AccordionContent,
+ AccordionItem,
+ AccordionTrigger,
+} from "@/registry/default/ui/accordion"
+
+export default function AccordionDemo() {
+ return (
+
+
+ Is it accessible?
+
+ Yes. It adheres to the WAI-ARIA design pattern.
+
+
+
+ Is it styled?
+
+ Yes. It comes with default styles that matches the other
+ components' aesthetic.
+
+
+
+ Is it animated?
+
+ Yes. It's animated by default, but you can disable it if you
+ prefer.
+
+
+
+ )
+}
diff --git a/apps/www/__registry__/default/example/alert-demo.tsx b/apps/www/__registry__/default/example/alert-demo.tsx
new file mode 100644
index 00000000000..a26c71fcfd1
--- /dev/null
+++ b/apps/www/__registry__/default/example/alert-demo.tsx
@@ -0,0 +1,19 @@
+import { Terminal } from "lucide-react"
+
+import {
+ Alert,
+ AlertDescription,
+ AlertTitle,
+} from "@/registry/default/ui/alert"
+
+export default function AlertDemo() {
+ return (
+
+
+ Heads up!
+
+ You can add components to your app using the cli.
+
+
+ )
+}
diff --git a/apps/www/__registry__/default/example/alert-destructive.tsx b/apps/www/__registry__/default/example/alert-destructive.tsx
new file mode 100644
index 00000000000..a72c26b8f88
--- /dev/null
+++ b/apps/www/__registry__/default/example/alert-destructive.tsx
@@ -0,0 +1,19 @@
+import { AlertCircle } from "lucide-react"
+
+import {
+ Alert,
+ AlertDescription,
+ AlertTitle,
+} from "@/registry/default/ui/alert"
+
+export default function AlertDestructive() {
+ return (
+
+
+ Error
+
+ Your session has expired. Please log in again.
+
+
+ )
+}
diff --git a/apps/www/__registry__/default/example/alert-dialog-demo.tsx b/apps/www/__registry__/default/example/alert-dialog-demo.tsx
new file mode 100644
index 00000000000..2e087b3f85f
--- /dev/null
+++ b/apps/www/__registry__/default/example/alert-dialog-demo.tsx
@@ -0,0 +1,35 @@
+import {
+ AlertDialog,
+ AlertDialogAction,
+ AlertDialogCancel,
+ AlertDialogContent,
+ AlertDialogDescription,
+ AlertDialogFooter,
+ AlertDialogHeader,
+ AlertDialogTitle,
+ AlertDialogTrigger,
+} from "@/registry/default/ui/alert-dialog"
+import { Button } from "@/registry/default/ui/button"
+
+export default function AlertDialogDemo() {
+ return (
+
+
+ Show Dialog
+
+
+
+ Are you absolutely sure?
+
+ This action cannot be undone. This will permanently delete your
+ account and remove your data from our servers.
+
+
+
+ Cancel
+ Continue
+
+
+
+ )
+}
diff --git a/apps/www/__registry__/default/example/aspect-ratio-demo.tsx b/apps/www/__registry__/default/example/aspect-ratio-demo.tsx
new file mode 100644
index 00000000000..174a4860992
--- /dev/null
+++ b/apps/www/__registry__/default/example/aspect-ratio-demo.tsx
@@ -0,0 +1,16 @@
+import Image from "next/image"
+
+import { AspectRatio } from "@/registry/default/ui/aspect-ratio"
+
+export default function AspectRatioDemo() {
+ return (
+
+
+
+ )
+}
diff --git a/apps/www/__registry__/default/example/avatar-demo.tsx b/apps/www/__registry__/default/example/avatar-demo.tsx
new file mode 100644
index 00000000000..596d8691fbe
--- /dev/null
+++ b/apps/www/__registry__/default/example/avatar-demo.tsx
@@ -0,0 +1,14 @@
+import {
+ Avatar,
+ AvatarFallback,
+ AvatarImage,
+} from "@/registry/default/ui/avatar"
+
+export default function AvatarDemo() {
+ return (
+
+
+ CN
+
+ )
+}
diff --git a/apps/www/__registry__/default/example/badge-demo.tsx b/apps/www/__registry__/default/example/badge-demo.tsx
new file mode 100644
index 00000000000..0636e41a185
--- /dev/null
+++ b/apps/www/__registry__/default/example/badge-demo.tsx
@@ -0,0 +1,5 @@
+import { Badge } from "@/registry/default/ui/badge"
+
+export default function BadgeDemo() {
+ return Badge
+}
diff --git a/apps/www/__registry__/default/example/badge-destructive.tsx b/apps/www/__registry__/default/example/badge-destructive.tsx
new file mode 100644
index 00000000000..d0a2f4c72de
--- /dev/null
+++ b/apps/www/__registry__/default/example/badge-destructive.tsx
@@ -0,0 +1,5 @@
+import { Badge } from "@/registry/default/ui/badge"
+
+export default function BadgeDestructive() {
+ return Destructive
+}
diff --git a/apps/www/__registry__/default/example/badge-outline.tsx b/apps/www/__registry__/default/example/badge-outline.tsx
new file mode 100644
index 00000000000..2744bc3e3a1
--- /dev/null
+++ b/apps/www/__registry__/default/example/badge-outline.tsx
@@ -0,0 +1,5 @@
+import { Badge } from "@/registry/default/ui/badge"
+
+export default function BadgeOutline() {
+ return Outline
+}
diff --git a/apps/www/__registry__/default/example/badge-secondary.tsx b/apps/www/__registry__/default/example/badge-secondary.tsx
new file mode 100644
index 00000000000..a6f4f0903fd
--- /dev/null
+++ b/apps/www/__registry__/default/example/badge-secondary.tsx
@@ -0,0 +1,5 @@
+import { Badge } from "@/registry/default/ui/badge"
+
+export default function BadgeSecondary() {
+ return Secondary
+}
diff --git a/apps/www/__registry__/default/example/breadcrumb-demo.tsx b/apps/www/__registry__/default/example/breadcrumb-demo.tsx
new file mode 100644
index 00000000000..df146fd858b
--- /dev/null
+++ b/apps/www/__registry__/default/example/breadcrumb-demo.tsx
@@ -0,0 +1,49 @@
+import {
+ Breadcrumb,
+ BreadcrumbEllipsis,
+ BreadcrumbItem,
+ BreadcrumbLink,
+ BreadcrumbList,
+ BreadcrumbPage,
+ BreadcrumbSeparator,
+} from "@/registry/default/ui/breadcrumb"
+import {
+ DropdownMenu,
+ DropdownMenuContent,
+ DropdownMenuItem,
+ DropdownMenuTrigger,
+} from "@/registry/default/ui/dropdown-menu"
+
+export default function BreadcrumbDemo() {
+ return (
+
+
+
+ Home
+
+
+
+
+
+
+ Toggle menu
+
+
+ Documentation
+ Themes
+ GitHub
+
+
+
+
+
+ Components
+
+
+
+ Breadcrumb
+
+
+
+ )
+}
diff --git a/apps/www/__registry__/default/example/breadcrumb-dropdown.tsx b/apps/www/__registry__/default/example/breadcrumb-dropdown.tsx
new file mode 100644
index 00000000000..3970695c178
--- /dev/null
+++ b/apps/www/__registry__/default/example/breadcrumb-dropdown.tsx
@@ -0,0 +1,50 @@
+import { ChevronDown, Slash } from "lucide-react"
+
+import {
+ Breadcrumb,
+ BreadcrumbItem,
+ BreadcrumbLink,
+ BreadcrumbList,
+ BreadcrumbPage,
+ BreadcrumbSeparator,
+} from "@/registry/default/ui/breadcrumb"
+import {
+ DropdownMenu,
+ DropdownMenuContent,
+ DropdownMenuItem,
+ DropdownMenuTrigger,
+} from "@/registry/default/ui/dropdown-menu"
+
+export default function BreadcrumbWithDropdown() {
+ return (
+
+
+
+ Home
+
+
+
+
+
+
+
+ Components
+
+
+
+ Documentation
+ Themes
+ GitHub
+
+
+
+
+
+
+
+ Breadcrumb
+
+
+
+ )
+}
diff --git a/apps/www/__registry__/default/example/breadcrumb-ellipsis.tsx b/apps/www/__registry__/default/example/breadcrumb-ellipsis.tsx
new file mode 100644
index 00000000000..2ef9a46e072
--- /dev/null
+++ b/apps/www/__registry__/default/example/breadcrumb-ellipsis.tsx
@@ -0,0 +1,39 @@
+import Link from "next/link"
+
+import {
+ Breadcrumb,
+ BreadcrumbEllipsis,
+ BreadcrumbItem,
+ BreadcrumbLink,
+ BreadcrumbList,
+ BreadcrumbPage,
+ BreadcrumbSeparator,
+} from "@/registry/default/ui/breadcrumb"
+
+export default function BreadcrumbCollapsed() {
+ return (
+
+
+
+
+ Home
+
+
+
+
+
+
+
+
+
+ Components
+
+
+
+
+ Breadcrumb
+
+
+
+ )
+}
diff --git a/apps/www/__registry__/default/example/breadcrumb-link.tsx b/apps/www/__registry__/default/example/breadcrumb-link.tsx
new file mode 100644
index 00000000000..8b7bb3f020c
--- /dev/null
+++ b/apps/www/__registry__/default/example/breadcrumb-link.tsx
@@ -0,0 +1,34 @@
+import Link from "next/link"
+
+import {
+ Breadcrumb,
+ BreadcrumbItem,
+ BreadcrumbLink,
+ BreadcrumbList,
+ BreadcrumbPage,
+ BreadcrumbSeparator,
+} from "@/registry/default/ui/breadcrumb"
+
+export default function BreadcrumbWithCustomSeparator() {
+ return (
+
+
+
+
+ Home
+
+
+
+
+
+ Components
+
+
+
+
+ Breadcrumb
+
+
+
+ )
+}
diff --git a/apps/www/__registry__/default/example/breadcrumb-responsive.tsx b/apps/www/__registry__/default/example/breadcrumb-responsive.tsx
new file mode 100644
index 00000000000..ae0acaf8670
--- /dev/null
+++ b/apps/www/__registry__/default/example/breadcrumb-responsive.tsx
@@ -0,0 +1,133 @@
+"use client"
+
+import * as React from "react"
+import Link from "next/link"
+
+import { useMediaQuery } from "@/hooks/use-media-query"
+import {
+ Breadcrumb,
+ BreadcrumbEllipsis,
+ BreadcrumbItem,
+ BreadcrumbLink,
+ BreadcrumbList,
+ BreadcrumbPage,
+ BreadcrumbSeparator,
+} from "@/registry/default/ui/breadcrumb"
+import { Button } from "@/registry/default/ui/button"
+import {
+ Drawer,
+ DrawerClose,
+ DrawerContent,
+ DrawerDescription,
+ DrawerFooter,
+ DrawerHeader,
+ DrawerTitle,
+ DrawerTrigger,
+} from "@/registry/default/ui/drawer"
+import {
+ DropdownMenu,
+ DropdownMenuContent,
+ DropdownMenuItem,
+ DropdownMenuTrigger,
+} from "@/registry/default/ui/dropdown-menu"
+
+const items = [
+ { href: "#", label: "Home" },
+ { href: "#", label: "Documentation" },
+ { href: "#", label: "Building Your Application" },
+ { href: "#", label: "Data Fetching" },
+ { label: "Caching and Revalidating" },
+]
+
+const ITEMS_TO_DISPLAY = 3
+
+export default function BreadcrumbResponsive() {
+ const [open, setOpen] = React.useState(false)
+ const isDesktop = useMediaQuery("(min-width: 768px)")
+
+ return (
+
+
+
+ {items[0].label}
+
+
+ {items.length > ITEMS_TO_DISPLAY ? (
+ <>
+
+ {isDesktop ? (
+
+
+
+
+
+ {items.slice(1, -2).map((item, index) => (
+
+
+ {item.label}
+
+
+ ))}
+
+
+ ) : (
+
+
+
+
+
+
+ Navigate to
+
+ Select a page to navigate to.
+
+
+
+ {items.slice(1, -2).map((item, index) => (
+
+ {item.label}
+
+ ))}
+
+
+
+ Close
+
+
+
+
+ )}
+
+
+ >
+ ) : null}
+ {items.slice(-ITEMS_TO_DISPLAY + 1).map((item, index) => (
+
+ {item.href ? (
+ <>
+
+ {item.label}
+
+
+ >
+ ) : (
+
+ {item.label}
+
+ )}
+
+ ))}
+
+
+ )
+}
diff --git a/apps/www/__registry__/default/example/breadcrumb-separator.tsx b/apps/www/__registry__/default/example/breadcrumb-separator.tsx
new file mode 100644
index 00000000000..83e309112d1
--- /dev/null
+++ b/apps/www/__registry__/default/example/breadcrumb-separator.tsx
@@ -0,0 +1,34 @@
+import { Slash } from "lucide-react"
+
+import {
+ Breadcrumb,
+ BreadcrumbItem,
+ BreadcrumbLink,
+ BreadcrumbList,
+ BreadcrumbPage,
+ BreadcrumbSeparator,
+} from "@/registry/default/ui/breadcrumb"
+
+export default function BreadcrumbWithCustomSeparator() {
+ return (
+
+
+
+ Home
+
+
+
+
+
+ Components
+
+
+
+
+
+ Breadcrumb
+
+
+
+ )
+}
diff --git a/apps/www/__registry__/default/example/button-as-child.tsx b/apps/www/__registry__/default/example/button-as-child.tsx
new file mode 100644
index 00000000000..edb19e11568
--- /dev/null
+++ b/apps/www/__registry__/default/example/button-as-child.tsx
@@ -0,0 +1,11 @@
+import Link from "next/link"
+
+import { Button } from "@/registry/default/ui/button"
+
+export default function ButtonAsChild() {
+ return (
+
+ Login
+
+ )
+}
diff --git a/apps/www/__registry__/default/example/button-demo.tsx b/apps/www/__registry__/default/example/button-demo.tsx
new file mode 100644
index 00000000000..0dc1d9095ea
--- /dev/null
+++ b/apps/www/__registry__/default/example/button-demo.tsx
@@ -0,0 +1,5 @@
+import { Button } from "@/registry/default/ui/button"
+
+export default function ButtonDemo() {
+ return Button
+}
diff --git a/apps/www/__registry__/default/example/button-destructive.tsx b/apps/www/__registry__/default/example/button-destructive.tsx
new file mode 100644
index 00000000000..07d3e1b1281
--- /dev/null
+++ b/apps/www/__registry__/default/example/button-destructive.tsx
@@ -0,0 +1,5 @@
+import { Button } from "@/registry/default/ui/button"
+
+export default function ButtonDestructive() {
+ return Destructive
+}
diff --git a/apps/www/__registry__/default/example/button-ghost.tsx b/apps/www/__registry__/default/example/button-ghost.tsx
new file mode 100644
index 00000000000..fe458c79b23
--- /dev/null
+++ b/apps/www/__registry__/default/example/button-ghost.tsx
@@ -0,0 +1,5 @@
+import { Button } from "@/registry/default/ui/button"
+
+export default function ButtonGhost() {
+ return Ghost
+}
diff --git a/apps/www/__registry__/default/example/button-icon.tsx b/apps/www/__registry__/default/example/button-icon.tsx
new file mode 100644
index 00000000000..1e790f85d4f
--- /dev/null
+++ b/apps/www/__registry__/default/example/button-icon.tsx
@@ -0,0 +1,11 @@
+import { ChevronRight } from "lucide-react"
+
+import { Button } from "@/registry/default/ui/button"
+
+export default function ButtonIcon() {
+ return (
+
+
+
+ )
+}
diff --git a/apps/www/__registry__/default/example/button-link.tsx b/apps/www/__registry__/default/example/button-link.tsx
new file mode 100644
index 00000000000..1fad5bc0f0f
--- /dev/null
+++ b/apps/www/__registry__/default/example/button-link.tsx
@@ -0,0 +1,5 @@
+import { Button } from "@/registry/default/ui/button"
+
+export default function ButtonLink() {
+ return Link
+}
diff --git a/apps/www/__registry__/default/example/button-loading.tsx b/apps/www/__registry__/default/example/button-loading.tsx
new file mode 100644
index 00000000000..bdce9478b02
--- /dev/null
+++ b/apps/www/__registry__/default/example/button-loading.tsx
@@ -0,0 +1,12 @@
+import { Loader2 } from "lucide-react"
+
+import { Button } from "@/registry/default/ui/button"
+
+export default function ButtonLoading() {
+ return (
+
+
+ Please wait
+
+ )
+}
diff --git a/apps/www/__registry__/default/example/button-outline.tsx b/apps/www/__registry__/default/example/button-outline.tsx
new file mode 100644
index 00000000000..bfb7c8453bf
--- /dev/null
+++ b/apps/www/__registry__/default/example/button-outline.tsx
@@ -0,0 +1,5 @@
+import { Button } from "@/registry/default/ui/button"
+
+export default function ButtonOutline() {
+ return Outline
+}
diff --git a/apps/www/__registry__/default/example/button-secondary.tsx b/apps/www/__registry__/default/example/button-secondary.tsx
new file mode 100644
index 00000000000..4f3c7f91275
--- /dev/null
+++ b/apps/www/__registry__/default/example/button-secondary.tsx
@@ -0,0 +1,5 @@
+import { Button } from "@/registry/default/ui/button"
+
+export default function ButtonSecondary() {
+ return Secondary
+}
diff --git a/apps/www/__registry__/default/example/button-with-icon.tsx b/apps/www/__registry__/default/example/button-with-icon.tsx
new file mode 100644
index 00000000000..fd4e39671d1
--- /dev/null
+++ b/apps/www/__registry__/default/example/button-with-icon.tsx
@@ -0,0 +1,11 @@
+import { Mail } from "lucide-react"
+
+import { Button } from "@/registry/default/ui/button"
+
+export default function ButtonWithIcon() {
+ return (
+
+ Login with Email
+
+ )
+}
diff --git a/apps/www/__registry__/default/example/calendar-demo.tsx b/apps/www/__registry__/default/example/calendar-demo.tsx
new file mode 100644
index 00000000000..dec175ac7e8
--- /dev/null
+++ b/apps/www/__registry__/default/example/calendar-demo.tsx
@@ -0,0 +1,18 @@
+"use client"
+
+import * as React from "react"
+
+import { Calendar } from "@/registry/default/ui/calendar"
+
+export default function CalendarDemo() {
+ const [date, setDate] = React.useState(new Date())
+
+ return (
+
+ )
+}
diff --git a/apps/www/__registry__/default/example/calendar-form.tsx b/apps/www/__registry__/default/example/calendar-form.tsx
new file mode 100644
index 00000000000..3fec57d8313
--- /dev/null
+++ b/apps/www/__registry__/default/example/calendar-form.tsx
@@ -0,0 +1,101 @@
+"use client"
+
+import { zodResolver } from "@hookform/resolvers/zod"
+import { format } from "date-fns"
+import { CalendarIcon } from "lucide-react"
+import { useForm } from "react-hook-form"
+import { z } from "zod"
+
+import { cn } from "@/lib/utils"
+import { Button } from "@/registry/default/ui/button"
+import { Calendar } from "@/registry/default/ui/calendar"
+import {
+ Form,
+ FormControl,
+ FormDescription,
+ FormField,
+ FormItem,
+ FormLabel,
+ FormMessage,
+} from "@/registry/default/ui/form"
+import {
+ Popover,
+ PopoverContent,
+ PopoverTrigger,
+} from "@/registry/default/ui/popover"
+import { toast } from "@/registry/default/ui/use-toast"
+
+const FormSchema = z.object({
+ dob: z.date({
+ required_error: "A date of birth is required.",
+ }),
+})
+
+export default function CalendarForm() {
+ const form = useForm>({
+ resolver: zodResolver(FormSchema),
+ })
+
+ function onSubmit(data: z.infer) {
+ toast({
+ title: "You submitted the following values:",
+ description: (
+
+ {JSON.stringify(data, null, 2)}
+
+ ),
+ })
+ }
+
+ return (
+
+
+ (
+
+ Date of birth
+
+
+
+
+ {field.value ? (
+ format(field.value, "PPP")
+ ) : (
+ Pick a date
+ )}
+
+
+
+
+
+
+ date > new Date() || date < new Date("1900-01-01")
+ }
+ initialFocus
+ />
+
+
+
+ Your date of birth is used to calculate your age.
+
+
+
+ )}
+ />
+ Submit
+
+
+ )
+}
diff --git a/apps/www/__registry__/default/example/card-demo.tsx b/apps/www/__registry__/default/example/card-demo.tsx
new file mode 100644
index 00000000000..136f42ab848
--- /dev/null
+++ b/apps/www/__registry__/default/example/card-demo.tsx
@@ -0,0 +1,78 @@
+import { BellRing, Check } from "lucide-react"
+
+import { cn } from "@/lib/utils"
+import { Button } from "@/registry/default/ui/button"
+import {
+ Card,
+ CardContent,
+ CardDescription,
+ CardFooter,
+ CardHeader,
+ CardTitle,
+} from "@/registry/default/ui/card"
+import { Switch } from "@/registry/default/ui/switch"
+
+const notifications = [
+ {
+ title: "Your call has been confirmed.",
+ description: "1 hour ago",
+ },
+ {
+ title: "You have a new message!",
+ description: "1 hour ago",
+ },
+ {
+ title: "Your subscription is expiring soon!",
+ description: "2 hours ago",
+ },
+]
+
+type CardProps = React.ComponentProps
+
+export default function CardDemo({ className, ...props }: CardProps) {
+ return (
+
+
+ Notifications
+ You have 3 unread messages.
+
+
+
+
+
+
+ Push Notifications
+
+
+ Send notifications to device.
+
+
+
+
+
+ {notifications.map((notification, index) => (
+
+
+
+
+ {notification.title}
+
+
+ {notification.description}
+
+
+
+ ))}
+
+
+
+
+ Mark all as read
+
+
+
+ )
+}
diff --git a/apps/www/__registry__/default/example/card-with-form.tsx b/apps/www/__registry__/default/example/card-with-form.tsx
new file mode 100644
index 00000000000..31c960e4f68
--- /dev/null
+++ b/apps/www/__registry__/default/example/card-with-form.tsx
@@ -0,0 +1,59 @@
+import * as React from "react"
+
+import { Button } from "@/registry/default/ui/button"
+import {
+ Card,
+ CardContent,
+ CardDescription,
+ CardFooter,
+ CardHeader,
+ CardTitle,
+} from "@/registry/default/ui/card"
+import { Input } from "@/registry/default/ui/input"
+import { Label } from "@/registry/default/ui/label"
+import {
+ Select,
+ SelectContent,
+ SelectItem,
+ SelectTrigger,
+ SelectValue,
+} from "@/registry/default/ui/select"
+
+export default function CardWithForm() {
+ return (
+
+
+ Create project
+ Deploy your new project in one-click.
+
+
+
+
+
+ Name
+
+
+
+ Framework
+
+
+
+
+
+ Next.js
+ SvelteKit
+ Astro
+ Nuxt.js
+
+
+
+
+
+
+
+ Cancel
+ Deploy
+
+
+ )
+}
diff --git a/apps/www/__registry__/default/example/carousel-api.tsx b/apps/www/__registry__/default/example/carousel-api.tsx
new file mode 100644
index 00000000000..9b8ac3837ce
--- /dev/null
+++ b/apps/www/__registry__/default/example/carousel-api.tsx
@@ -0,0 +1,54 @@
+import * as React from "react"
+
+import { Card, CardContent } from "@/registry/default/ui/card"
+import {
+ Carousel,
+ CarouselContent,
+ CarouselItem,
+ CarouselNext,
+ CarouselPrevious,
+ type CarouselApi,
+} from "@/registry/default/ui/carousel"
+
+export default function CarouselDApiDemo() {
+ const [api, setApi] = React.useState()
+ const [current, setCurrent] = React.useState(0)
+ const [count, setCount] = React.useState(0)
+
+ React.useEffect(() => {
+ if (!api) {
+ return
+ }
+
+ setCount(api.scrollSnapList().length)
+ setCurrent(api.selectedScrollSnap() + 1)
+
+ api.on("select", () => {
+ console.log("current")
+ setCurrent(api.selectedScrollSnap() + 1)
+ })
+ }, [api])
+
+ return (
+
+
+
+ {Array.from({ length: 5 }).map((_, index) => (
+
+
+
+ {index + 1}
+
+
+
+ ))}
+
+
+
+
+
+ Slide {current} of {count}
+
+
+ )
+}
diff --git a/apps/www/__registry__/default/example/carousel-demo.tsx b/apps/www/__registry__/default/example/carousel-demo.tsx
new file mode 100644
index 00000000000..9efd3d27be8
--- /dev/null
+++ b/apps/www/__registry__/default/example/carousel-demo.tsx
@@ -0,0 +1,32 @@
+import * as React from "react"
+
+import { Card, CardContent } from "@/registry/default/ui/card"
+import {
+ Carousel,
+ CarouselContent,
+ CarouselItem,
+ CarouselNext,
+ CarouselPrevious,
+} from "@/registry/default/ui/carousel"
+
+export default function CarouselDemo() {
+ return (
+
+
+ {Array.from({ length: 5 }).map((_, index) => (
+
+
+
+
+ {index + 1}
+
+
+
+
+ ))}
+
+
+
+
+ )
+}
diff --git a/apps/www/__registry__/default/example/carousel-orientation.tsx b/apps/www/__registry__/default/example/carousel-orientation.tsx
new file mode 100644
index 00000000000..863e8688249
--- /dev/null
+++ b/apps/www/__registry__/default/example/carousel-orientation.tsx
@@ -0,0 +1,38 @@
+import * as React from "react"
+
+import { Card, CardContent } from "@/registry/default/ui/card"
+import {
+ Carousel,
+ CarouselContent,
+ CarouselItem,
+ CarouselNext,
+ CarouselPrevious,
+} from "@/registry/default/ui/carousel"
+
+export default function CarouselOrientation() {
+ return (
+
+
+ {Array.from({ length: 5 }).map((_, index) => (
+
+
+
+
+ {index + 1}
+
+
+
+
+ ))}
+
+
+
+
+ )
+}
diff --git a/apps/www/__registry__/default/example/carousel-plugin.tsx b/apps/www/__registry__/default/example/carousel-plugin.tsx
new file mode 100644
index 00000000000..93db22c15f5
--- /dev/null
+++ b/apps/www/__registry__/default/example/carousel-plugin.tsx
@@ -0,0 +1,42 @@
+import * as React from "react"
+import Autoplay from "embla-carousel-autoplay"
+
+import { Card, CardContent } from "@/registry/default/ui/card"
+import {
+ Carousel,
+ CarouselContent,
+ CarouselItem,
+ CarouselNext,
+ CarouselPrevious,
+} from "@/registry/default/ui/carousel"
+
+export default function CarouselPlugin() {
+ const plugin = React.useRef(
+ Autoplay({ delay: 2000, stopOnInteraction: true })
+ )
+
+ return (
+
+
+ {Array.from({ length: 5 }).map((_, index) => (
+
+
+
+
+ {index + 1}
+
+
+
+
+ ))}
+
+
+
+
+ )
+}
diff --git a/apps/www/__registry__/default/example/carousel-size.tsx b/apps/www/__registry__/default/example/carousel-size.tsx
new file mode 100644
index 00000000000..41e00c8a462
--- /dev/null
+++ b/apps/www/__registry__/default/example/carousel-size.tsx
@@ -0,0 +1,37 @@
+import * as React from "react"
+
+import { Card, CardContent } from "@/registry/default/ui/card"
+import {
+ Carousel,
+ CarouselContent,
+ CarouselItem,
+ CarouselNext,
+ CarouselPrevious,
+} from "@/registry/default/ui/carousel"
+
+export default function CarouselSize() {
+ return (
+
+
+ {Array.from({ length: 5 }).map((_, index) => (
+
+
+
+
+ {index + 1}
+
+
+
+
+ ))}
+
+
+
+
+ )
+}
diff --git a/apps/www/__registry__/default/example/carousel-spacing.tsx b/apps/www/__registry__/default/example/carousel-spacing.tsx
new file mode 100644
index 00000000000..c1357e0f21c
--- /dev/null
+++ b/apps/www/__registry__/default/example/carousel-spacing.tsx
@@ -0,0 +1,32 @@
+import * as React from "react"
+
+import { Card, CardContent } from "@/registry/default/ui/card"
+import {
+ Carousel,
+ CarouselContent,
+ CarouselItem,
+ CarouselNext,
+ CarouselPrevious,
+} from "@/registry/default/ui/carousel"
+
+export default function CarouselSpacing() {
+ return (
+
+
+ {Array.from({ length: 5 }).map((_, index) => (
+
+
+
+
+ {index + 1}
+
+
+
+
+ ))}
+
+
+
+
+ )
+}
diff --git a/apps/www/__registry__/default/example/checkbox-demo.tsx b/apps/www/__registry__/default/example/checkbox-demo.tsx
new file mode 100644
index 00000000000..11c520e3744
--- /dev/null
+++ b/apps/www/__registry__/default/example/checkbox-demo.tsx
@@ -0,0 +1,17 @@
+"use client"
+
+import { Checkbox } from "@/registry/default/ui/checkbox"
+
+export default function CheckboxDemo() {
+ return (
+
+
+
+ Accept terms and conditions
+
+
+ )
+}
diff --git a/apps/www/__registry__/default/example/checkbox-disabled.tsx b/apps/www/__registry__/default/example/checkbox-disabled.tsx
new file mode 100644
index 00000000000..00780c9da74
--- /dev/null
+++ b/apps/www/__registry__/default/example/checkbox-disabled.tsx
@@ -0,0 +1,15 @@
+import { Checkbox } from "@/registry/default/ui/checkbox"
+
+export default function CheckboxDisabled() {
+ return (
+
+
+
+ Accept terms and conditions
+
+
+ )
+}
diff --git a/apps/www/__registry__/default/example/checkbox-form-multiple.tsx b/apps/www/__registry__/default/example/checkbox-form-multiple.tsx
new file mode 100644
index 00000000000..b89ba5d12e5
--- /dev/null
+++ b/apps/www/__registry__/default/example/checkbox-form-multiple.tsx
@@ -0,0 +1,127 @@
+"use client"
+
+import { zodResolver } from "@hookform/resolvers/zod"
+import { useForm } from "react-hook-form"
+import { z } from "zod"
+
+import { Button } from "@/registry/default/ui/button"
+import { Checkbox } from "@/registry/default/ui/checkbox"
+import {
+ Form,
+ FormControl,
+ FormDescription,
+ FormField,
+ FormItem,
+ FormLabel,
+ FormMessage,
+} from "@/registry/default/ui/form"
+import { toast } from "@/registry/default/ui/use-toast"
+
+const items = [
+ {
+ id: "recents",
+ label: "Recents",
+ },
+ {
+ id: "home",
+ label: "Home",
+ },
+ {
+ id: "applications",
+ label: "Applications",
+ },
+ {
+ id: "desktop",
+ label: "Desktop",
+ },
+ {
+ id: "downloads",
+ label: "Downloads",
+ },
+ {
+ id: "documents",
+ label: "Documents",
+ },
+] as const
+
+const FormSchema = z.object({
+ items: z.array(z.string()).refine((value) => value.some((item) => item), {
+ message: "You have to select at least one item.",
+ }),
+})
+
+export default function CheckboxReactHookFormMultiple() {
+ const form = useForm>({
+ resolver: zodResolver(FormSchema),
+ defaultValues: {
+ items: ["recents", "home"],
+ },
+ })
+
+ function onSubmit(data: z.infer) {
+ toast({
+ title: "You submitted the following values:",
+ description: (
+
+ {JSON.stringify(data, null, 2)}
+
+ ),
+ })
+ }
+
+ return (
+
+
+ (
+
+
+ Sidebar
+
+ Select the items you want to display in the sidebar.
+
+
+ {items.map((item) => (
+ {
+ return (
+
+
+ {
+ return checked
+ ? field.onChange([...field.value, item.id])
+ : field.onChange(
+ field.value?.filter(
+ (value) => value !== item.id
+ )
+ )
+ }}
+ />
+
+
+ {item.label}
+
+
+ )
+ }}
+ />
+ ))}
+
+
+ )}
+ />
+ Submit
+
+
+ )
+}
diff --git a/apps/www/__registry__/default/example/checkbox-form-single.tsx b/apps/www/__registry__/default/example/checkbox-form-single.tsx
new file mode 100644
index 00000000000..95f0b7f8f48
--- /dev/null
+++ b/apps/www/__registry__/default/example/checkbox-form-single.tsx
@@ -0,0 +1,73 @@
+"use client"
+
+import Link from "next/link"
+import { zodResolver } from "@hookform/resolvers/zod"
+import { useForm } from "react-hook-form"
+import { z } from "zod"
+
+import { Button } from "@/registry/default/ui/button"
+import { Checkbox } from "@/registry/default/ui/checkbox"
+import {
+ Form,
+ FormControl,
+ FormDescription,
+ FormField,
+ FormItem,
+ FormLabel,
+} from "@/registry/default/ui/form"
+import { toast } from "@/registry/default/ui/use-toast"
+
+const FormSchema = z.object({
+ mobile: z.boolean().default(false).optional(),
+})
+
+export default function CheckboxReactHookFormSingle() {
+ const form = useForm>({
+ resolver: zodResolver(FormSchema),
+ defaultValues: {
+ mobile: true,
+ },
+ })
+
+ function onSubmit(data: z.infer) {
+ toast({
+ title: "You submitted the following values:",
+ description: (
+
+ {JSON.stringify(data, null, 2)}
+
+ ),
+ })
+ }
+
+ return (
+
+
+ (
+
+
+
+
+
+
+ Use different settings for my mobile devices
+
+
+ You can manage your mobile notifications in the{" "}
+ mobile settings page.
+
+
+
+ )}
+ />
+ Submit
+
+
+ )
+}
diff --git a/apps/www/__registry__/default/example/checkbox-with-text.tsx b/apps/www/__registry__/default/example/checkbox-with-text.tsx
new file mode 100644
index 00000000000..4b9479e4aa2
--- /dev/null
+++ b/apps/www/__registry__/default/example/checkbox-with-text.tsx
@@ -0,0 +1,22 @@
+"use client"
+
+import { Checkbox } from "@/registry/default/ui/checkbox"
+
+export default function CheckboxWithText() {
+ return (
+
+
+
+
+ Accept terms and conditions
+
+
+ You agree to our Terms of Service and Privacy Policy.
+
+
+
+ )
+}
diff --git a/apps/www/__registry__/default/example/collapsible-demo.tsx b/apps/www/__registry__/default/example/collapsible-demo.tsx
new file mode 100644
index 00000000000..345d54adc67
--- /dev/null
+++ b/apps/www/__registry__/default/example/collapsible-demo.tsx
@@ -0,0 +1,46 @@
+"use client"
+
+import * as React from "react"
+import { ChevronsUpDown, Plus, X } from "lucide-react"
+
+import { Button } from "@/registry/default/ui/button"
+import {
+ Collapsible,
+ CollapsibleContent,
+ CollapsibleTrigger,
+} from "@/registry/default/ui/collapsible"
+
+export default function CollapsibleDemo() {
+ const [isOpen, setIsOpen] = React.useState(false)
+
+ return (
+
+
+
+ @peduarte starred 3 repositories
+
+
+
+
+ Toggle
+
+
+
+
+ @radix-ui/primitives
+
+
+
+ @radix-ui/colors
+
+
+ @stitches/react
+
+
+
+ )
+}
diff --git a/apps/www/__registry__/default/example/combobox-demo.tsx b/apps/www/__registry__/default/example/combobox-demo.tsx
new file mode 100644
index 00000000000..b16ad8fd7b5
--- /dev/null
+++ b/apps/www/__registry__/default/example/combobox-demo.tsx
@@ -0,0 +1,91 @@
+"use client"
+
+import * as React from "react"
+import { Check, ChevronsUpDown } from "lucide-react"
+
+import { cn } from "@/lib/utils"
+import { Button } from "@/registry/default/ui/button"
+import {
+ Command,
+ CommandEmpty,
+ CommandGroup,
+ CommandInput,
+ CommandItem,
+} from "@/registry/default/ui/command"
+import {
+ Popover,
+ PopoverContent,
+ PopoverTrigger,
+} from "@/registry/default/ui/popover"
+
+const frameworks = [
+ {
+ value: "next.js",
+ label: "Next.js",
+ },
+ {
+ value: "sveltekit",
+ label: "SvelteKit",
+ },
+ {
+ value: "nuxt.js",
+ label: "Nuxt.js",
+ },
+ {
+ value: "remix",
+ label: "Remix",
+ },
+ {
+ value: "astro",
+ label: "Astro",
+ },
+]
+
+export default function ComboboxDemo() {
+ const [open, setOpen] = React.useState(false)
+ const [value, setValue] = React.useState("")
+
+ return (
+
+
+
+ {value
+ ? frameworks.find((framework) => framework.value === value)?.label
+ : "Select framework..."}
+
+
+
+
+
+
+ No framework found.
+
+ {frameworks.map((framework) => (
+ {
+ setValue(currentValue === value ? "" : currentValue)
+ setOpen(false)
+ }}
+ >
+
+ {framework.label}
+
+ ))}
+
+
+
+
+ )
+}
diff --git a/apps/www/__registry__/default/example/combobox-dropdown-menu.tsx b/apps/www/__registry__/default/example/combobox-dropdown-menu.tsx
new file mode 100644
index 00000000000..de1a35afba8
--- /dev/null
+++ b/apps/www/__registry__/default/example/combobox-dropdown-menu.tsx
@@ -0,0 +1,111 @@
+"use client"
+
+import * as React from "react"
+import { Calendar, MoreHorizontal, Tags, Trash, User } from "lucide-react"
+
+import { Button } from "@/registry/default/ui/button"
+import {
+ Command,
+ CommandEmpty,
+ CommandGroup,
+ CommandInput,
+ CommandItem,
+ CommandList,
+} from "@/registry/default/ui/command"
+import {
+ DropdownMenu,
+ DropdownMenuContent,
+ DropdownMenuGroup,
+ DropdownMenuItem,
+ DropdownMenuLabel,
+ DropdownMenuSeparator,
+ DropdownMenuShortcut,
+ DropdownMenuSub,
+ DropdownMenuSubContent,
+ DropdownMenuSubTrigger,
+ DropdownMenuTrigger,
+} from "@/registry/default/ui/dropdown-menu"
+
+const labels = [
+ "feature",
+ "bug",
+ "enhancement",
+ "documentation",
+ "design",
+ "question",
+ "maintenance",
+]
+
+export default function ComboboxDropdownMenu() {
+ const [label, setLabel] = React.useState("feature")
+ const [open, setOpen] = React.useState(false)
+
+ return (
+
+
+
+ {label}
+
+ Create a new project
+
+
+
+
+
+
+
+
+ Actions
+
+
+
+ Assign to...
+
+
+
+ Set due date...
+
+
+
+
+
+ Apply label
+
+
+
+
+
+ No label found.
+
+ {labels.map((label) => (
+ {
+ setLabel(value)
+ setOpen(false)
+ }}
+ >
+ {label}
+
+ ))}
+
+
+
+
+
+
+
+
+ Delete
+ ⌘⌫
+
+
+
+
+
+ )
+}
diff --git a/apps/www/__registry__/default/example/combobox-form.tsx b/apps/www/__registry__/default/example/combobox-form.tsx
new file mode 100644
index 00000000000..24f9b00c742
--- /dev/null
+++ b/apps/www/__registry__/default/example/combobox-form.tsx
@@ -0,0 +1,135 @@
+"use client"
+
+import { zodResolver } from "@hookform/resolvers/zod"
+import { Check, ChevronsUpDown } from "lucide-react"
+import { useForm } from "react-hook-form"
+import { z } from "zod"
+
+import { cn } from "@/lib/utils"
+import { Button } from "@/registry/default/ui/button"
+import {
+ Command,
+ CommandEmpty,
+ CommandGroup,
+ CommandInput,
+ CommandItem,
+} from "@/registry/default/ui/command"
+import {
+ Form,
+ FormControl,
+ FormDescription,
+ FormField,
+ FormItem,
+ FormLabel,
+ FormMessage,
+} from "@/registry/default/ui/form"
+import {
+ Popover,
+ PopoverContent,
+ PopoverTrigger,
+} from "@/registry/default/ui/popover"
+import { toast } from "@/registry/default/ui/use-toast"
+
+const languages = [
+ { label: "English", value: "en" },
+ { label: "French", value: "fr" },
+ { label: "German", value: "de" },
+ { label: "Spanish", value: "es" },
+ { label: "Portuguese", value: "pt" },
+ { label: "Russian", value: "ru" },
+ { label: "Japanese", value: "ja" },
+ { label: "Korean", value: "ko" },
+ { label: "Chinese", value: "zh" },
+] as const
+
+const FormSchema = z.object({
+ language: z.string({
+ required_error: "Please select a language.",
+ }),
+})
+
+export default function ComboboxForm() {
+ const form = useForm>({
+ resolver: zodResolver(FormSchema),
+ })
+
+ function onSubmit(data: z.infer) {
+ toast({
+ title: "You submitted the following values:",
+ description: (
+
+ {JSON.stringify(data, null, 2)}
+
+ ),
+ })
+ }
+
+ return (
+
+
+ (
+
+ Language
+
+
+
+
+ {field.value
+ ? languages.find(
+ (language) => language.value === field.value
+ )?.label
+ : "Select language"}
+
+
+
+
+
+
+
+ No language found.
+
+ {languages.map((language) => (
+ {
+ form.setValue("language", language.value)
+ }}
+ >
+
+ {language.label}
+
+ ))}
+
+
+
+
+
+ This is the language that will be used in the dashboard.
+
+
+
+ )}
+ />
+ Submit
+
+
+ )
+}
diff --git a/apps/www/__registry__/default/example/combobox-popover.tsx b/apps/www/__registry__/default/example/combobox-popover.tsx
new file mode 100644
index 00000000000..aacb34dc51e
--- /dev/null
+++ b/apps/www/__registry__/default/example/combobox-popover.tsx
@@ -0,0 +1,125 @@
+"use client"
+
+import * as React from "react"
+import {
+ ArrowUpCircle,
+ CheckCircle2,
+ Circle,
+ HelpCircle,
+ LucideIcon,
+ XCircle,
+} from "lucide-react"
+
+import { cn } from "@/lib/utils"
+import { Button } from "@/registry/default/ui/button"
+import {
+ Command,
+ CommandEmpty,
+ CommandGroup,
+ CommandInput,
+ CommandItem,
+ CommandList,
+} from "@/registry/default/ui/command"
+import {
+ Popover,
+ PopoverContent,
+ PopoverTrigger,
+} from "@/registry/default/ui/popover"
+
+type Status = {
+ value: string
+ label: string
+ icon: LucideIcon
+}
+
+const statuses: Status[] = [
+ {
+ value: "backlog",
+ label: "Backlog",
+ icon: HelpCircle,
+ },
+ {
+ value: "todo",
+ label: "Todo",
+ icon: Circle,
+ },
+ {
+ value: "in progress",
+ label: "In Progress",
+ icon: ArrowUpCircle,
+ },
+ {
+ value: "done",
+ label: "Done",
+ icon: CheckCircle2,
+ },
+ {
+ value: "canceled",
+ label: "Canceled",
+ icon: XCircle,
+ },
+]
+
+export default function ComboboxPopover() {
+ const [open, setOpen] = React.useState(false)
+ const [selectedStatus, setSelectedStatus] = React.useState(
+ null
+ )
+
+ return (
+
+
Status
+
+
+
+ {selectedStatus ? (
+ <>
+
+ {selectedStatus.label}
+ >
+ ) : (
+ <>+ Set status>
+ )}
+
+
+
+
+
+
+ No results found.
+
+ {statuses.map((status) => (
+ {
+ setSelectedStatus(
+ statuses.find((priority) => priority.value === value) ||
+ null
+ )
+ setOpen(false)
+ }}
+ >
+
+ {status.label}
+
+ ))}
+
+
+
+
+
+
+ )
+}
diff --git a/apps/www/__registry__/default/example/combobox-responsive.tsx b/apps/www/__registry__/default/example/combobox-responsive.tsx
new file mode 100644
index 00000000000..176e4abf909
--- /dev/null
+++ b/apps/www/__registry__/default/example/combobox-responsive.tsx
@@ -0,0 +1,123 @@
+"use client"
+
+import * as React from "react"
+
+import { useMediaQuery } from "@/hooks/use-media-query"
+import { Button } from "@/registry/default/ui/button"
+import {
+ Command,
+ CommandEmpty,
+ CommandGroup,
+ CommandInput,
+ CommandItem,
+ CommandList,
+} from "@/registry/default/ui/command"
+import {
+ Drawer,
+ DrawerContent,
+ DrawerTrigger,
+} from "@/registry/default/ui/drawer"
+import {
+ Popover,
+ PopoverContent,
+ PopoverTrigger,
+} from "@/registry/default/ui/popover"
+
+type Status = {
+ value: string
+ label: string
+}
+
+const statuses: Status[] = [
+ {
+ value: "backlog",
+ label: "Backlog",
+ },
+ {
+ value: "todo",
+ label: "Todo",
+ },
+ {
+ value: "in progress",
+ label: "In Progress",
+ },
+ {
+ value: "done",
+ label: "Done",
+ },
+ {
+ value: "canceled",
+ label: "Canceled",
+ },
+]
+
+export default function ComboBoxResponsive() {
+ const [open, setOpen] = React.useState(false)
+ const isDesktop = useMediaQuery("(min-width: 768px)")
+ const [selectedStatus, setSelectedStatus] = React.useState(
+ null
+ )
+
+ if (isDesktop) {
+ return (
+
+
+
+ {selectedStatus ? <>{selectedStatus.label}> : <>+ Set status>}
+
+
+
+
+
+
+ )
+ }
+
+ return (
+
+
+
+ {selectedStatus ? <>{selectedStatus.label}> : <>+ Set status>}
+
+
+
+
+
+
+
+
+ )
+}
+
+function StatusList({
+ setOpen,
+ setSelectedStatus,
+}: {
+ setOpen: (open: boolean) => void
+ setSelectedStatus: (status: Status | null) => void
+}) {
+ return (
+
+
+
+ No results found.
+
+ {statuses.map((status) => (
+ {
+ setSelectedStatus(
+ statuses.find((priority) => priority.value === value) || null
+ )
+ setOpen(false)
+ }}
+ >
+ {status.label}
+
+ ))}
+
+
+
+ )
+}
diff --git a/apps/www/__registry__/default/example/command-demo.tsx b/apps/www/__registry__/default/example/command-demo.tsx
new file mode 100644
index 00000000000..b1d7fde68dd
--- /dev/null
+++ b/apps/www/__registry__/default/example/command-demo.tsx
@@ -0,0 +1,62 @@
+import {
+ Calculator,
+ Calendar,
+ CreditCard,
+ Settings,
+ Smile,
+ User,
+} from "lucide-react"
+
+import {
+ Command,
+ CommandEmpty,
+ CommandGroup,
+ CommandInput,
+ CommandItem,
+ CommandList,
+ CommandSeparator,
+ CommandShortcut,
+} from "@/registry/default/ui/command"
+
+export default function CommandDemo() {
+ return (
+
+
+
+ No results found.
+
+
+
+ Calendar
+
+
+
+ Search Emoji
+
+
+
+ Calculator
+
+
+
+
+
+
+ Profile
+ ⌘P
+
+
+
+ Billing
+ ⌘B
+
+
+
+ Settings
+ ⌘S
+
+
+
+
+ )
+}
diff --git a/apps/www/__registry__/default/example/command-dialog.tsx b/apps/www/__registry__/default/example/command-dialog.tsx
new file mode 100644
index 00000000000..64c35c7166e
--- /dev/null
+++ b/apps/www/__registry__/default/example/command-dialog.tsx
@@ -0,0 +1,87 @@
+"use client"
+
+import * as React from "react"
+import {
+ Calculator,
+ Calendar,
+ CreditCard,
+ Settings,
+ Smile,
+ User,
+} from "lucide-react"
+
+import {
+ CommandDialog,
+ CommandEmpty,
+ CommandGroup,
+ CommandInput,
+ CommandItem,
+ CommandList,
+ CommandSeparator,
+ CommandShortcut,
+} from "@/registry/default/ui/command"
+
+export default function CommandDialogDemo() {
+ const [open, setOpen] = React.useState(false)
+
+ React.useEffect(() => {
+ const down = (e: KeyboardEvent) => {
+ if (e.key === "j" && (e.metaKey || e.ctrlKey)) {
+ e.preventDefault()
+ setOpen((open) => !open)
+ }
+ }
+
+ document.addEventListener("keydown", down)
+ return () => document.removeEventListener("keydown", down)
+ }, [])
+
+ return (
+ <>
+
+ Press{" "}
+
+ ⌘ J
+
+
+
+
+
+ No results found.
+
+
+
+ Calendar
+
+
+
+ Search Emoji
+
+
+
+ Calculator
+
+
+
+
+
+
+ Profile
+ ⌘P
+
+
+
+ Billing
+ ⌘B
+
+
+
+ Settings
+ ⌘S
+
+
+
+
+ >
+ )
+}
diff --git a/apps/www/__registry__/default/example/context-menu-demo.tsx b/apps/www/__registry__/default/example/context-menu-demo.tsx
new file mode 100644
index 00000000000..b2a13653e80
--- /dev/null
+++ b/apps/www/__registry__/default/example/context-menu-demo.tsx
@@ -0,0 +1,67 @@
+import {
+ ContextMenu,
+ ContextMenuCheckboxItem,
+ ContextMenuContent,
+ ContextMenuItem,
+ ContextMenuLabel,
+ ContextMenuRadioGroup,
+ ContextMenuRadioItem,
+ ContextMenuSeparator,
+ ContextMenuShortcut,
+ ContextMenuSub,
+ ContextMenuSubContent,
+ ContextMenuSubTrigger,
+ ContextMenuTrigger,
+} from "@/registry/default/ui/context-menu"
+
+export default function ContextMenuDemo() {
+ return (
+
+
+ Right click here
+
+
+
+ Back
+ ⌘[
+
+
+ Forward
+ ⌘]
+
+
+ Reload
+ ⌘R
+
+
+ More Tools
+
+
+ Save Page As...
+ ⇧⌘S
+
+ Create Shortcut...
+ Name Window...
+
+ Developer Tools
+
+
+
+
+ Show Bookmarks Bar
+ ⌘⇧B
+
+ Show Full URLs
+
+
+ People
+
+
+ Pedro Duarte
+
+ Colm Tuite
+
+
+
+ )
+}
diff --git a/apps/www/__registry__/default/example/data-table-demo.tsx b/apps/www/__registry__/default/example/data-table-demo.tsx
new file mode 100644
index 00000000000..f5fd232617a
--- /dev/null
+++ b/apps/www/__registry__/default/example/data-table-demo.tsx
@@ -0,0 +1,312 @@
+"use client"
+
+import * as React from "react"
+import {
+ ColumnDef,
+ ColumnFiltersState,
+ SortingState,
+ VisibilityState,
+ flexRender,
+ getCoreRowModel,
+ getFilteredRowModel,
+ getPaginationRowModel,
+ getSortedRowModel,
+ useReactTable,
+} from "@tanstack/react-table"
+import { ArrowUpDown, ChevronDown, MoreHorizontal } from "lucide-react"
+
+import { Button } from "@/registry/default/ui/button"
+import { Checkbox } from "@/registry/default/ui/checkbox"
+import {
+ DropdownMenu,
+ DropdownMenuCheckboxItem,
+ DropdownMenuContent,
+ DropdownMenuItem,
+ DropdownMenuLabel,
+ DropdownMenuSeparator,
+ DropdownMenuTrigger,
+} from "@/registry/default/ui/dropdown-menu"
+import { Input } from "@/registry/default/ui/input"
+import {
+ Table,
+ TableBody,
+ TableCell,
+ TableHead,
+ TableHeader,
+ TableRow,
+} from "@/registry/default/ui/table"
+
+const data: Payment[] = [
+ {
+ id: "m5gr84i9",
+ amount: 316,
+ status: "success",
+ email: "ken99@yahoo.com",
+ },
+ {
+ id: "3u1reuv4",
+ amount: 242,
+ status: "success",
+ email: "Abe45@gmail.com",
+ },
+ {
+ id: "derv1ws0",
+ amount: 837,
+ status: "processing",
+ email: "Monserrat44@gmail.com",
+ },
+ {
+ id: "5kma53ae",
+ amount: 874,
+ status: "success",
+ email: "Silas22@gmail.com",
+ },
+ {
+ id: "bhqecj4p",
+ amount: 721,
+ status: "failed",
+ email: "carmella@hotmail.com",
+ },
+]
+
+export type Payment = {
+ id: string
+ amount: number
+ status: "pending" | "processing" | "success" | "failed"
+ email: string
+}
+
+export const columns: ColumnDef[] = [
+ {
+ id: "select",
+ header: ({ table }) => (
+ table.toggleAllPageRowsSelected(!!value)}
+ aria-label="Select all"
+ />
+ ),
+ cell: ({ row }) => (
+ row.toggleSelected(!!value)}
+ aria-label="Select row"
+ />
+ ),
+ enableSorting: false,
+ enableHiding: false,
+ },
+ {
+ accessorKey: "status",
+ header: "Status",
+ cell: ({ row }) => (
+ {row.getValue("status")}
+ ),
+ },
+ {
+ accessorKey: "email",
+ header: ({ column }) => {
+ return (
+ column.toggleSorting(column.getIsSorted() === "asc")}
+ >
+ Email
+
+
+ )
+ },
+ cell: ({ row }) => {row.getValue("email")}
,
+ },
+ {
+ accessorKey: "amount",
+ header: () => Amount
,
+ cell: ({ row }) => {
+ const amount = parseFloat(row.getValue("amount"))
+
+ // Format the amount as a dollar amount
+ const formatted = new Intl.NumberFormat("en-US", {
+ style: "currency",
+ currency: "USD",
+ }).format(amount)
+
+ return {formatted}
+ },
+ },
+ {
+ id: "actions",
+ enableHiding: false,
+ cell: ({ row }) => {
+ const payment = row.original
+
+ return (
+
+
+
+ Open menu
+
+
+
+
+ Actions
+ navigator.clipboard.writeText(payment.id)}
+ >
+ Copy payment ID
+
+
+ View customer
+ View payment details
+
+
+ )
+ },
+ },
+]
+
+export default function DataTableDemo() {
+ const [sorting, setSorting] = React.useState([])
+ const [columnFilters, setColumnFilters] = React.useState(
+ []
+ )
+ const [columnVisibility, setColumnVisibility] =
+ React.useState({})
+ const [rowSelection, setRowSelection] = React.useState({})
+
+ const table = useReactTable({
+ data,
+ columns,
+ onSortingChange: setSorting,
+ onColumnFiltersChange: setColumnFilters,
+ getCoreRowModel: getCoreRowModel(),
+ getPaginationRowModel: getPaginationRowModel(),
+ getSortedRowModel: getSortedRowModel(),
+ getFilteredRowModel: getFilteredRowModel(),
+ onColumnVisibilityChange: setColumnVisibility,
+ onRowSelectionChange: setRowSelection,
+ state: {
+ sorting,
+ columnFilters,
+ columnVisibility,
+ rowSelection,
+ },
+ })
+
+ return (
+
+
+
+ table.getColumn("email")?.setFilterValue(event.target.value)
+ }
+ className="max-w-sm"
+ />
+
+
+
+ Columns
+
+
+
+ {table
+ .getAllColumns()
+ .filter((column) => column.getCanHide())
+ .map((column) => {
+ return (
+
+ column.toggleVisibility(!!value)
+ }
+ >
+ {column.id}
+
+ )
+ })}
+
+
+
+
+
+
+ {table.getHeaderGroups().map((headerGroup) => (
+
+ {headerGroup.headers.map((header) => {
+ return (
+
+ {header.isPlaceholder
+ ? null
+ : flexRender(
+ header.column.columnDef.header,
+ header.getContext()
+ )}
+
+ )
+ })}
+
+ ))}
+
+
+ {table.getRowModel().rows?.length ? (
+ table.getRowModel().rows.map((row) => (
+
+ {row.getVisibleCells().map((cell) => (
+
+ {flexRender(
+ cell.column.columnDef.cell,
+ cell.getContext()
+ )}
+
+ ))}
+
+ ))
+ ) : (
+
+
+ No results.
+
+
+ )}
+
+
+
+
+
+ {table.getFilteredSelectedRowModel().rows.length} of{" "}
+ {table.getFilteredRowModel().rows.length} row(s) selected.
+
+
+ table.previousPage()}
+ disabled={!table.getCanPreviousPage()}
+ >
+ Previous
+
+ table.nextPage()}
+ disabled={!table.getCanNextPage()}
+ >
+ Next
+
+
+
+
+ )
+}
diff --git a/apps/www/__registry__/default/example/date-picker-demo.tsx b/apps/www/__registry__/default/example/date-picker-demo.tsx
new file mode 100644
index 00000000000..d34cbe67763
--- /dev/null
+++ b/apps/www/__registry__/default/example/date-picker-demo.tsx
@@ -0,0 +1,43 @@
+"use client"
+
+import * as React from "react"
+import { format } from "date-fns"
+import { Calendar as CalendarIcon } from "lucide-react"
+
+import { cn } from "@/lib/utils"
+import { Button } from "@/registry/default/ui/button"
+import { Calendar } from "@/registry/default/ui/calendar"
+import {
+ Popover,
+ PopoverContent,
+ PopoverTrigger,
+} from "@/registry/default/ui/popover"
+
+export default function DatePickerDemo() {
+ const [date, setDate] = React.useState()
+
+ return (
+
+
+
+
+ {date ? format(date, "PPP") : Pick a date }
+
+
+
+
+
+
+ )
+}
diff --git a/apps/www/__registry__/default/example/date-picker-form.tsx b/apps/www/__registry__/default/example/date-picker-form.tsx
new file mode 100644
index 00000000000..c54442546ee
--- /dev/null
+++ b/apps/www/__registry__/default/example/date-picker-form.tsx
@@ -0,0 +1,101 @@
+"use client"
+
+import { zodResolver } from "@hookform/resolvers/zod"
+import { format } from "date-fns"
+import { CalendarIcon } from "lucide-react"
+import { useForm } from "react-hook-form"
+import { z } from "zod"
+
+import { cn } from "@/lib/utils"
+import { Button } from "@/registry/default/ui/button"
+import { Calendar } from "@/registry/default/ui/calendar"
+import {
+ Form,
+ FormControl,
+ FormDescription,
+ FormField,
+ FormItem,
+ FormLabel,
+ FormMessage,
+} from "@/registry/default/ui/form"
+import {
+ Popover,
+ PopoverContent,
+ PopoverTrigger,
+} from "@/registry/default/ui/popover"
+import { toast } from "@/registry/default/ui/use-toast"
+
+const FormSchema = z.object({
+ dob: z.date({
+ required_error: "A date of birth is required.",
+ }),
+})
+
+export default function DatePickerForm() {
+ const form = useForm>({
+ resolver: zodResolver(FormSchema),
+ })
+
+ function onSubmit(data: z.infer) {
+ toast({
+ title: "You submitted the following values:",
+ description: (
+
+ {JSON.stringify(data, null, 2)}
+
+ ),
+ })
+ }
+
+ return (
+
+
+ (
+
+ Date of birth
+
+
+
+
+ {field.value ? (
+ format(field.value, "PPP")
+ ) : (
+ Pick a date
+ )}
+
+
+
+
+
+
+ date > new Date() || date < new Date("1900-01-01")
+ }
+ initialFocus
+ />
+
+
+
+ Your date of birth is used to calculate your age.
+
+
+
+ )}
+ />
+ Submit
+
+
+ )
+}
diff --git a/apps/www/__registry__/default/example/date-picker-with-presets.tsx b/apps/www/__registry__/default/example/date-picker-with-presets.tsx
new file mode 100644
index 00000000000..1e5cd1605a2
--- /dev/null
+++ b/apps/www/__registry__/default/example/date-picker-with-presets.tsx
@@ -0,0 +1,62 @@
+"use client"
+
+import * as React from "react"
+import { addDays, format } from "date-fns"
+import { Calendar as CalendarIcon } from "lucide-react"
+
+import { cn } from "@/lib/utils"
+import { Button } from "@/registry/default/ui/button"
+import { Calendar } from "@/registry/default/ui/calendar"
+import {
+ Popover,
+ PopoverContent,
+ PopoverTrigger,
+} from "@/registry/default/ui/popover"
+import {
+ Select,
+ SelectContent,
+ SelectItem,
+ SelectTrigger,
+ SelectValue,
+} from "@/registry/default/ui/select"
+
+export default function DatePickerWithPresets() {
+ const [date, setDate] = React.useState()
+
+ return (
+
+
+
+
+ {date ? format(date, "PPP") : Pick a date }
+
+
+
+
+ setDate(addDays(new Date(), parseInt(value)))
+ }
+ >
+
+
+
+
+ Today
+ Tomorrow
+ In 3 days
+ In a week
+
+
+
+
+
+
+
+ )
+}
diff --git a/apps/www/__registry__/default/example/date-picker-with-range.tsx b/apps/www/__registry__/default/example/date-picker-with-range.tsx
new file mode 100644
index 00000000000..4d88bcf0834
--- /dev/null
+++ b/apps/www/__registry__/default/example/date-picker-with-range.tsx
@@ -0,0 +1,65 @@
+"use client"
+
+import * as React from "react"
+import { addDays, format } from "date-fns"
+import { Calendar as CalendarIcon } from "lucide-react"
+import { DateRange } from "react-day-picker"
+
+import { cn } from "@/lib/utils"
+import { Button } from "@/registry/default/ui/button"
+import { Calendar } from "@/registry/default/ui/calendar"
+import {
+ Popover,
+ PopoverContent,
+ PopoverTrigger,
+} from "@/registry/default/ui/popover"
+
+export default function DatePickerWithRange({
+ className,
+}: React.HTMLAttributes) {
+ const [date, setDate] = React.useState({
+ from: new Date(2022, 0, 20),
+ to: addDays(new Date(2022, 0, 20), 20),
+ })
+
+ return (
+
+
+
+
+
+ {date?.from ? (
+ date.to ? (
+ <>
+ {format(date.from, "LLL dd, y")} -{" "}
+ {format(date.to, "LLL dd, y")}
+ >
+ ) : (
+ format(date.from, "LLL dd, y")
+ )
+ ) : (
+ Pick a date
+ )}
+
+
+
+
+
+
+
+ )
+}
diff --git a/apps/www/__registry__/default/example/dialog-close-button.tsx b/apps/www/__registry__/default/example/dialog-close-button.tsx
new file mode 100644
index 00000000000..826d0661328
--- /dev/null
+++ b/apps/www/__registry__/default/example/dialog-close-button.tsx
@@ -0,0 +1,56 @@
+import { Copy } from "lucide-react"
+
+import { Button } from "@/registry/default/ui/button"
+import {
+ Dialog,
+ DialogClose,
+ DialogContent,
+ DialogDescription,
+ DialogFooter,
+ DialogHeader,
+ DialogTitle,
+ DialogTrigger,
+} from "@/registry/default/ui/dialog"
+import { Input } from "@/registry/default/ui/input"
+import { Label } from "@/registry/default/ui/label"
+
+export default function DialogCloseButton() {
+ return (
+
+
+ Share
+
+
+
+ Share link
+
+ Anyone who has this link will be able to view this.
+
+
+
+
+
+ Link
+
+
+
+
+ Copy
+
+
+
+
+
+
+ Close
+
+
+
+
+
+ )
+}
diff --git a/apps/www/__registry__/default/example/dialog-demo.tsx b/apps/www/__registry__/default/example/dialog-demo.tsx
new file mode 100644
index 00000000000..31bde7637f3
--- /dev/null
+++ b/apps/www/__registry__/default/example/dialog-demo.tsx
@@ -0,0 +1,55 @@
+import { Button } from "@/registry/default/ui/button"
+import {
+ Dialog,
+ DialogContent,
+ DialogDescription,
+ DialogFooter,
+ DialogHeader,
+ DialogTitle,
+ DialogTrigger,
+} from "@/registry/default/ui/dialog"
+import { Input } from "@/registry/default/ui/input"
+import { Label } from "@/registry/default/ui/label"
+
+export default function DialogDemo() {
+ return (
+
+
+ Edit Profile
+
+
+
+ Edit profile
+
+ Make changes to your profile here. Click save when you're done.
+
+
+
+
+ Save changes
+
+
+
+ )
+}
diff --git a/apps/www/__registry__/default/example/drawer-demo.tsx b/apps/www/__registry__/default/example/drawer-demo.tsx
new file mode 100644
index 00000000000..2c2038474f2
--- /dev/null
+++ b/apps/www/__registry__/default/example/drawer-demo.tsx
@@ -0,0 +1,134 @@
+import * as React from "react"
+import { Minus, Plus } from "lucide-react"
+import { Bar, BarChart, ResponsiveContainer } from "recharts"
+
+import { Button } from "@/registry/default/ui/button"
+import {
+ Drawer,
+ DrawerClose,
+ DrawerContent,
+ DrawerDescription,
+ DrawerFooter,
+ DrawerHeader,
+ DrawerTitle,
+ DrawerTrigger,
+} from "@/registry/default/ui/drawer"
+
+const data = [
+ {
+ goal: 400,
+ },
+ {
+ goal: 300,
+ },
+ {
+ goal: 200,
+ },
+ {
+ goal: 300,
+ },
+ {
+ goal: 200,
+ },
+ {
+ goal: 278,
+ },
+ {
+ goal: 189,
+ },
+ {
+ goal: 239,
+ },
+ {
+ goal: 300,
+ },
+ {
+ goal: 200,
+ },
+ {
+ goal: 278,
+ },
+ {
+ goal: 189,
+ },
+ {
+ goal: 349,
+ },
+]
+
+export default function DrawerDemo() {
+ const [goal, setGoal] = React.useState(350)
+
+ function onClick(adjustment: number) {
+ setGoal(Math.max(200, Math.min(400, goal + adjustment)))
+ }
+
+ return (
+
+
+ Open Drawer
+
+
+
+
+ Move Goal
+ Set your daily activity goal.
+
+
+
+
onClick(-10)}
+ disabled={goal <= 200}
+ >
+
+ Decrease
+
+
+
+ {goal}
+
+
+ Calories/day
+
+
+
onClick(10)}
+ disabled={goal >= 400}
+ >
+
+ Increase
+
+
+
+
+
+
+
+
+
+
+
+ Submit
+
+ Cancel
+
+
+
+
+
+ )
+}
diff --git a/apps/www/__registry__/default/example/drawer-dialog.tsx b/apps/www/__registry__/default/example/drawer-dialog.tsx
new file mode 100644
index 00000000000..75a6e3186e9
--- /dev/null
+++ b/apps/www/__registry__/default/example/drawer-dialog.tsx
@@ -0,0 +1,87 @@
+import * as React from "react"
+
+import { cn } from "@/lib/utils"
+import { useMediaQuery } from "@/hooks/use-media-query"
+import { Button } from "@/registry/default/ui/button"
+import {
+ Dialog,
+ DialogContent,
+ DialogDescription,
+ DialogHeader,
+ DialogTitle,
+ DialogTrigger,
+} from "@/registry/default/ui/dialog"
+import {
+ Drawer,
+ DrawerClose,
+ DrawerContent,
+ DrawerDescription,
+ DrawerFooter,
+ DrawerHeader,
+ DrawerTitle,
+ DrawerTrigger,
+} from "@/registry/default/ui/drawer"
+import { Input } from "@/registry/default/ui/input"
+import { Label } from "@/registry/default/ui/label"
+
+export default function DrawerDialogDemo() {
+ const [open, setOpen] = React.useState(false)
+ const isDesktop = useMediaQuery("(min-width: 768px)")
+
+ if (isDesktop) {
+ return (
+
+
+ Edit Profile
+
+
+
+ Edit profile
+
+ Make changes to your profile here. Click save when you're done.
+
+
+
+
+
+ )
+ }
+
+ return (
+
+
+ Edit Profile
+
+
+
+ Edit profile
+
+ Make changes to your profile here. Click save when you're done.
+
+
+
+
+
+ Cancel
+
+
+
+
+ )
+}
+
+function ProfileForm({ className }: React.ComponentProps<"form">) {
+ return (
+
+
+ Email
+
+
+
+ Username
+
+
+ Save changes
+
+ )
+}
diff --git a/apps/www/__registry__/default/example/dropdown-menu-checkboxes.tsx b/apps/www/__registry__/default/example/dropdown-menu-checkboxes.tsx
new file mode 100644
index 00000000000..efc43534354
--- /dev/null
+++ b/apps/www/__registry__/default/example/dropdown-menu-checkboxes.tsx
@@ -0,0 +1,53 @@
+"use client"
+
+import * as React from "react"
+import { DropdownMenuCheckboxItemProps } from "@radix-ui/react-dropdown-menu"
+
+import { Button } from "@/registry/default/ui/button"
+import {
+ DropdownMenu,
+ DropdownMenuCheckboxItem,
+ DropdownMenuContent,
+ DropdownMenuLabel,
+ DropdownMenuSeparator,
+ DropdownMenuTrigger,
+} from "@/registry/default/ui/dropdown-menu"
+
+type Checked = DropdownMenuCheckboxItemProps["checked"]
+
+export default function DropdownMenuCheckboxes() {
+ const [showStatusBar, setShowStatusBar] = React.useState(true)
+ const [showActivityBar, setShowActivityBar] = React.useState(false)
+ const [showPanel, setShowPanel] = React.useState(false)
+
+ return (
+
+
+ Open
+
+
+ Appearance
+
+
+ Status Bar
+
+
+ Activity Bar
+
+
+ Panel
+
+
+
+ )
+}
diff --git a/apps/www/__registry__/default/example/dropdown-menu-demo.tsx b/apps/www/__registry__/default/example/dropdown-menu-demo.tsx
new file mode 100644
index 00000000000..79b0895942a
--- /dev/null
+++ b/apps/www/__registry__/default/example/dropdown-menu-demo.tsx
@@ -0,0 +1,122 @@
+import {
+ Cloud,
+ CreditCard,
+ Github,
+ Keyboard,
+ LifeBuoy,
+ LogOut,
+ Mail,
+ MessageSquare,
+ Plus,
+ PlusCircle,
+ Settings,
+ User,
+ UserPlus,
+ Users,
+} from "lucide-react"
+
+import { Button } from "@/registry/default/ui/button"
+import {
+ DropdownMenu,
+ DropdownMenuContent,
+ DropdownMenuGroup,
+ DropdownMenuItem,
+ DropdownMenuLabel,
+ DropdownMenuPortal,
+ DropdownMenuSeparator,
+ DropdownMenuShortcut,
+ DropdownMenuSub,
+ DropdownMenuSubContent,
+ DropdownMenuSubTrigger,
+ DropdownMenuTrigger,
+} from "@/registry/default/ui/dropdown-menu"
+
+export default function DropdownMenuDemo() {
+ return (
+
+
+ Open
+
+
+ My Account
+
+
+
+
+ Profile
+ ⇧⌘P
+
+
+
+ Billing
+ ⌘B
+
+
+
+ Settings
+ ⌘S
+
+
+
+ Keyboard shortcuts
+ ⌘K
+
+
+
+
+
+
+ Team
+
+
+
+
+ Invite users
+
+
+
+
+
+ Email
+
+
+
+ Message
+
+
+
+
+ More...
+
+
+
+
+
+
+ New Team
+ ⌘+T
+
+
+
+
+
+ GitHub
+
+
+
+ Support
+
+
+
+ API
+
+
+
+
+ Log out
+ ⇧⌘Q
+
+
+
+ )
+}
diff --git a/apps/www/__registry__/default/example/dropdown-menu-radio-group.tsx b/apps/www/__registry__/default/example/dropdown-menu-radio-group.tsx
new file mode 100644
index 00000000000..2c06e7b131d
--- /dev/null
+++ b/apps/www/__registry__/default/example/dropdown-menu-radio-group.tsx
@@ -0,0 +1,35 @@
+"use client"
+
+import * as React from "react"
+
+import { Button } from "@/registry/default/ui/button"
+import {
+ DropdownMenu,
+ DropdownMenuContent,
+ DropdownMenuLabel,
+ DropdownMenuRadioGroup,
+ DropdownMenuRadioItem,
+ DropdownMenuSeparator,
+ DropdownMenuTrigger,
+} from "@/registry/default/ui/dropdown-menu"
+
+export default function DropdownMenuRadioGroupDemo() {
+ const [position, setPosition] = React.useState("bottom")
+
+ return (
+
+
+ Open
+
+
+ Panel Position
+
+
+ Top
+ Bottom
+ Right
+
+
+
+ )
+}
diff --git a/apps/www/__registry__/default/example/hover-card-demo.tsx b/apps/www/__registry__/default/example/hover-card-demo.tsx
new file mode 100644
index 00000000000..03acab7bf23
--- /dev/null
+++ b/apps/www/__registry__/default/example/hover-card-demo.tsx
@@ -0,0 +1,43 @@
+import { CalendarDays } from "lucide-react"
+
+import {
+ Avatar,
+ AvatarFallback,
+ AvatarImage,
+} from "@/registry/default/ui/avatar"
+import { Button } from "@/registry/default/ui/button"
+import {
+ HoverCard,
+ HoverCardContent,
+ HoverCardTrigger,
+} from "@/registry/default/ui/hover-card"
+
+export default function HoverCardDemo() {
+ return (
+
+
+ @nextjs
+
+
+
+
+
+ VC
+
+
+
@nextjs
+
+ The React Framework – created and maintained by @vercel.
+
+
+ {" "}
+
+ Joined December 2021
+
+
+
+
+
+
+ )
+}
diff --git a/apps/www/__registry__/default/example/input-demo.tsx b/apps/www/__registry__/default/example/input-demo.tsx
new file mode 100644
index 00000000000..126407be9c2
--- /dev/null
+++ b/apps/www/__registry__/default/example/input-demo.tsx
@@ -0,0 +1,5 @@
+import { Input } from "@/registry/default/ui/input"
+
+export default function InputDemo() {
+ return
+}
diff --git a/apps/www/__registry__/default/example/input-disabled.tsx b/apps/www/__registry__/default/example/input-disabled.tsx
new file mode 100644
index 00000000000..602f02c6100
--- /dev/null
+++ b/apps/www/__registry__/default/example/input-disabled.tsx
@@ -0,0 +1,5 @@
+import { Input } from "@/registry/default/ui/input"
+
+export default function InputDisabled() {
+ return
+}
diff --git a/apps/www/__registry__/default/example/input-file.tsx b/apps/www/__registry__/default/example/input-file.tsx
new file mode 100644
index 00000000000..b07b4013749
--- /dev/null
+++ b/apps/www/__registry__/default/example/input-file.tsx
@@ -0,0 +1,11 @@
+import { Input } from "@/registry/default/ui/input"
+import { Label } from "@/registry/default/ui/label"
+
+export default function InputFile() {
+ return (
+
+ Picture
+
+
+ )
+}
diff --git a/apps/www/__registry__/default/example/input-form.tsx b/apps/www/__registry__/default/example/input-form.tsx
new file mode 100644
index 00000000000..da69bbfb996
--- /dev/null
+++ b/apps/www/__registry__/default/example/input-form.tsx
@@ -0,0 +1,68 @@
+"use client"
+
+import { zodResolver } from "@hookform/resolvers/zod"
+import { useForm } from "react-hook-form"
+import { z } from "zod"
+
+import { Button } from "@/registry/default/ui/button"
+import {
+ Form,
+ FormControl,
+ FormDescription,
+ FormField,
+ FormItem,
+ FormLabel,
+ FormMessage,
+} from "@/registry/default/ui/form"
+import { Input } from "@/registry/default/ui/input"
+import { toast } from "@/registry/default/ui/use-toast"
+
+const FormSchema = z.object({
+ username: z.string().min(2, {
+ message: "Username must be at least 2 characters.",
+ }),
+})
+
+export default function InputForm() {
+ const form = useForm>({
+ resolver: zodResolver(FormSchema),
+ defaultValues: {
+ username: "",
+ },
+ })
+
+ function onSubmit(data: z.infer) {
+ toast({
+ title: "You submitted the following values:",
+ description: (
+
+ {JSON.stringify(data, null, 2)}
+
+ ),
+ })
+ }
+
+ return (
+
+
+ (
+
+ Username
+
+
+
+
+ This is your public display name.
+
+
+
+ )}
+ />
+ Submit
+
+
+ )
+}
diff --git a/apps/www/__registry__/default/example/input-otp-controlled.tsx b/apps/www/__registry__/default/example/input-otp-controlled.tsx
new file mode 100644
index 00000000000..c5f95cfbfca
--- /dev/null
+++ b/apps/www/__registry__/default/example/input-otp-controlled.tsx
@@ -0,0 +1,39 @@
+"use client"
+
+import * as React from "react"
+
+import {
+ InputOTP,
+ InputOTPGroup,
+ InputOTPSlot,
+} from "@/registry/default/ui/input-otp"
+
+export default function InputOTPControlled() {
+ const [value, setValue] = React.useState("")
+
+ return (
+
+
setValue(value)}
+ >
+
+
+
+
+
+
+
+
+
+
+ {value === "" ? (
+ <>Enter your one-time password.>
+ ) : (
+ <>You entered: {value}>
+ )}
+
+
+ )
+}
diff --git a/apps/www/__registry__/default/example/input-otp-demo.tsx b/apps/www/__registry__/default/example/input-otp-demo.tsx
new file mode 100644
index 00000000000..ec19b7db0fa
--- /dev/null
+++ b/apps/www/__registry__/default/example/input-otp-demo.tsx
@@ -0,0 +1,24 @@
+import {
+ InputOTP,
+ InputOTPGroup,
+ InputOTPSeparator,
+ InputOTPSlot,
+} from "@/registry/default/ui/input-otp"
+
+export default function InputOTPDemo() {
+ return (
+
+
+
+
+
+
+
+
+
+
+
+
+
+ )
+}
diff --git a/apps/www/__registry__/default/example/input-otp-form.tsx b/apps/www/__registry__/default/example/input-otp-form.tsx
new file mode 100644
index 00000000000..cc6922f52df
--- /dev/null
+++ b/apps/www/__registry__/default/example/input-otp-form.tsx
@@ -0,0 +1,82 @@
+"use client"
+
+import { zodResolver } from "@hookform/resolvers/zod"
+import { useForm } from "react-hook-form"
+import { z } from "zod"
+
+import { Button } from "@/registry/default/ui/button"
+import {
+ Form,
+ FormControl,
+ FormDescription,
+ FormField,
+ FormItem,
+ FormLabel,
+ FormMessage,
+} from "@/registry/default/ui/form"
+import {
+ InputOTP,
+ InputOTPGroup,
+ InputOTPSlot,
+} from "@/registry/default/ui/input-otp"
+import { toast } from "@/registry/default/ui/use-toast"
+
+const FormSchema = z.object({
+ pin: z.string().min(6, {
+ message: "Your one-time password must be 6 characters.",
+ }),
+})
+
+export default function InputOTPForm() {
+ const form = useForm>({
+ resolver: zodResolver(FormSchema),
+ defaultValues: {
+ pin: "",
+ },
+ })
+
+ function onSubmit(data: z.infer) {
+ toast({
+ title: "You submitted the following values:",
+ description: (
+
+ {JSON.stringify(data, null, 2)}
+
+ ),
+ })
+ }
+
+ return (
+
+
+ (
+
+ One-Time Password
+
+
+
+
+
+
+
+
+
+
+
+
+
+ Please enter the one-time password sent to your phone.
+
+
+
+ )}
+ />
+
+ Submit
+
+
+ )
+}
diff --git a/apps/www/__registry__/default/example/input-otp-pattern.tsx b/apps/www/__registry__/default/example/input-otp-pattern.tsx
new file mode 100644
index 00000000000..87d711b0ecd
--- /dev/null
+++ b/apps/www/__registry__/default/example/input-otp-pattern.tsx
@@ -0,0 +1,22 @@
+import { REGEXP_ONLY_DIGITS_AND_CHARS } from "input-otp"
+
+import {
+ InputOTP,
+ InputOTPGroup,
+ InputOTPSlot,
+} from "@/registry/default/ui/input-otp"
+
+export default function InputOTPPattern() {
+ return (
+
+
+
+
+
+
+
+
+
+
+ )
+}
diff --git a/apps/www/__registry__/default/example/input-otp-separator.tsx b/apps/www/__registry__/default/example/input-otp-separator.tsx
new file mode 100644
index 00000000000..e6e5a2a6fa2
--- /dev/null
+++ b/apps/www/__registry__/default/example/input-otp-separator.tsx
@@ -0,0 +1,29 @@
+import React from "react"
+
+import {
+ InputOTP,
+ InputOTPGroup,
+ InputOTPSeparator,
+ InputOTPSlot,
+} from "@/registry/default/ui/input-otp"
+
+export default function InputOTPWithSeparator() {
+ return (
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ )
+}
diff --git a/apps/www/__registry__/default/example/input-with-button.tsx b/apps/www/__registry__/default/example/input-with-button.tsx
new file mode 100644
index 00000000000..2bfe0429343
--- /dev/null
+++ b/apps/www/__registry__/default/example/input-with-button.tsx
@@ -0,0 +1,11 @@
+import { Button } from "@/registry/default/ui/button"
+import { Input } from "@/registry/default/ui/input"
+
+export default function InputWithButton() {
+ return (
+
+
+ Subscribe
+
+ )
+}
diff --git a/apps/www/__registry__/default/example/input-with-label.tsx b/apps/www/__registry__/default/example/input-with-label.tsx
new file mode 100644
index 00000000000..d4b92d23aa7
--- /dev/null
+++ b/apps/www/__registry__/default/example/input-with-label.tsx
@@ -0,0 +1,11 @@
+import { Input } from "@/registry/default/ui/input"
+import { Label } from "@/registry/default/ui/label"
+
+export default function InputWithLabel() {
+ return (
+
+ Email
+
+
+ )
+}
diff --git a/apps/www/__registry__/default/example/input-with-text.tsx b/apps/www/__registry__/default/example/input-with-text.tsx
new file mode 100644
index 00000000000..43f9a1e8cdc
--- /dev/null
+++ b/apps/www/__registry__/default/example/input-with-text.tsx
@@ -0,0 +1,12 @@
+import { Input } from "@/registry/default/ui/input"
+import { Label } from "@/registry/default/ui/label"
+
+export default function InputWithText() {
+ return (
+
+
Email
+
+
Enter your email address.
+
+ )
+}
diff --git a/apps/www/__registry__/default/example/label-demo.tsx b/apps/www/__registry__/default/example/label-demo.tsx
new file mode 100644
index 00000000000..5fdfd063eb9
--- /dev/null
+++ b/apps/www/__registry__/default/example/label-demo.tsx
@@ -0,0 +1,13 @@
+import { Checkbox } from "@/registry/default/ui/checkbox"
+import { Label } from "@/registry/default/ui/label"
+
+export default function LabelDemo() {
+ return (
+
+
+
+ Accept terms and conditions
+
+
+ )
+}
diff --git a/apps/www/__registry__/default/example/menubar-demo.tsx b/apps/www/__registry__/default/example/menubar-demo.tsx
new file mode 100644
index 00000000000..adf5c73903a
--- /dev/null
+++ b/apps/www/__registry__/default/example/menubar-demo.tsx
@@ -0,0 +1,107 @@
+import {
+ Menubar,
+ MenubarCheckboxItem,
+ MenubarContent,
+ MenubarItem,
+ MenubarMenu,
+ MenubarRadioGroup,
+ MenubarRadioItem,
+ MenubarSeparator,
+ MenubarShortcut,
+ MenubarSub,
+ MenubarSubContent,
+ MenubarSubTrigger,
+ MenubarTrigger,
+} from "@/registry/default/ui/menubar"
+
+export default function MenubarDemo() {
+ return (
+
+
+ File
+
+
+ New Tab ⌘T
+
+
+ New Window ⌘N
+
+ New Incognito Window
+
+
+ Share
+
+ Email link
+ Messages
+ Notes
+
+
+
+
+ Print... ⌘P
+
+
+
+
+ Edit
+
+
+ Undo ⌘Z
+
+
+ Redo ⇧⌘Z
+
+
+
+ Find
+
+ Search the web
+
+ Find...
+ Find Next
+ Find Previous
+
+
+
+ Cut
+ Copy
+ Paste
+
+
+
+ View
+
+ Always Show Bookmarks Bar
+
+ Always Show Full URLs
+
+
+
+ Reload ⌘R
+
+
+ Force Reload ⇧⌘R
+
+
+ Toggle Fullscreen
+
+ Hide Sidebar
+
+
+
+ Profiles
+
+
+ Andy
+ Benoit
+ Luis
+
+
+ Edit...
+
+ Add Profile...
+
+
+
+ )
+}
diff --git a/apps/www/__registry__/default/example/mode-toggle.tsx b/apps/www/__registry__/default/example/mode-toggle.tsx
new file mode 100644
index 00000000000..c6f338d16e5
--- /dev/null
+++ b/apps/www/__registry__/default/example/mode-toggle.tsx
@@ -0,0 +1,40 @@
+"use client"
+
+import * as React from "react"
+import { Moon, Sun } from "lucide-react"
+import { useTheme } from "next-themes"
+
+import { Button } from "@/registry/default/ui/button"
+import {
+ DropdownMenu,
+ DropdownMenuContent,
+ DropdownMenuItem,
+ DropdownMenuTrigger,
+} from "@/registry/default/ui/dropdown-menu"
+
+export default function ModeToggle() {
+ const { setTheme } = useTheme()
+
+ return (
+
+
+
+
+
+ Toggle theme
+
+
+
+ setTheme("light")}>
+ Light
+
+ setTheme("dark")}>
+ Dark
+
+ setTheme("system")}>
+ System
+
+
+
+ )
+}
diff --git a/apps/www/__registry__/default/example/navigation-menu-demo.tsx b/apps/www/__registry__/default/example/navigation-menu-demo.tsx
new file mode 100644
index 00000000000..4fea056f361
--- /dev/null
+++ b/apps/www/__registry__/default/example/navigation-menu-demo.tsx
@@ -0,0 +1,146 @@
+"use client"
+
+import * as React from "react"
+import Link from "next/link"
+
+import { cn } from "@/lib/utils"
+import { Icons } from "@/components/icons"
+import {
+ NavigationMenu,
+ NavigationMenuContent,
+ NavigationMenuItem,
+ NavigationMenuLink,
+ NavigationMenuList,
+ NavigationMenuTrigger,
+ navigationMenuTriggerStyle,
+} from "@/registry/default/ui/navigation-menu"
+
+const components: { title: string; href: string; description: string }[] = [
+ {
+ title: "Alert Dialog",
+ href: "/docs/primitives/alert-dialog",
+ description:
+ "A modal dialog that interrupts the user with important content and expects a response.",
+ },
+ {
+ title: "Hover Card",
+ href: "/docs/primitives/hover-card",
+ description:
+ "For sighted users to preview content available behind a link.",
+ },
+ {
+ title: "Progress",
+ href: "/docs/primitives/progress",
+ description:
+ "Displays an indicator showing the completion progress of a task, typically displayed as a progress bar.",
+ },
+ {
+ title: "Scroll-area",
+ href: "/docs/primitives/scroll-area",
+ description: "Visually or semantically separates content.",
+ },
+ {
+ title: "Tabs",
+ href: "/docs/primitives/tabs",
+ description:
+ "A set of layered sections of content—known as tab panels—that are displayed one at a time.",
+ },
+ {
+ title: "Tooltip",
+ href: "/docs/primitives/tooltip",
+ description:
+ "A popup that displays information related to an element when the element receives keyboard focus or the mouse hovers over it.",
+ },
+]
+
+export default function NavigationMenuDemo() {
+ return (
+
+
+
+ Getting started
+
+
+
+
+
+ Components
+
+
+ {components.map((component) => (
+
+ {component.description}
+
+ ))}
+
+
+
+
+
+
+ Documentation
+
+
+
+
+
+ )
+}
+
+const ListItem = React.forwardRef<
+ React.ElementRef<"a">,
+ React.ComponentPropsWithoutRef<"a">
+>(({ className, title, children, ...props }, ref) => {
+ return (
+
+
+
+ {title}
+
+ {children}
+
+
+
+
+ )
+})
+ListItem.displayName = "ListItem"
diff --git a/apps/www/__registry__/default/example/pagination-demo.tsx b/apps/www/__registry__/default/example/pagination-demo.tsx
new file mode 100644
index 00000000000..739c8181da0
--- /dev/null
+++ b/apps/www/__registry__/default/example/pagination-demo.tsx
@@ -0,0 +1,38 @@
+import {
+ Pagination,
+ PaginationContent,
+ PaginationEllipsis,
+ PaginationItem,
+ PaginationLink,
+ PaginationNext,
+ PaginationPrevious,
+} from "@/registry/default/ui/pagination"
+
+export default function PaginationDemo() {
+ return (
+
+
+
+
+
+
+ 1
+
+
+
+ 2
+
+
+
+ 3
+
+
+
+
+
+
+
+
+
+ )
+}
diff --git a/apps/www/__registry__/default/example/popover-demo.tsx b/apps/www/__registry__/default/example/popover-demo.tsx
new file mode 100644
index 00000000000..a4fc06d7f73
--- /dev/null
+++ b/apps/www/__registry__/default/example/popover-demo.tsx
@@ -0,0 +1,62 @@
+import { Button } from "@/registry/default/ui/button"
+import { Input } from "@/registry/default/ui/input"
+import { Label } from "@/registry/default/ui/label"
+import {
+ Popover,
+ PopoverContent,
+ PopoverTrigger,
+} from "@/registry/default/ui/popover"
+
+export default function PopoverDemo() {
+ return (
+
+
+ Open popover
+
+
+
+
+
Dimensions
+
+ Set the dimensions for the layer.
+
+
+
+
+
+
+ )
+}
diff --git a/apps/www/__registry__/default/example/progress-demo.tsx b/apps/www/__registry__/default/example/progress-demo.tsx
new file mode 100644
index 00000000000..997e2d5fb87
--- /dev/null
+++ b/apps/www/__registry__/default/example/progress-demo.tsx
@@ -0,0 +1,16 @@
+"use client"
+
+import * as React from "react"
+
+import { Progress } from "@/registry/default/ui/progress"
+
+export default function ProgressDemo() {
+ const [progress, setProgress] = React.useState(13)
+
+ React.useEffect(() => {
+ const timer = setTimeout(() => setProgress(66), 500)
+ return () => clearTimeout(timer)
+ }, [])
+
+ return
+}
diff --git a/apps/www/__registry__/default/example/radio-group-demo.tsx b/apps/www/__registry__/default/example/radio-group-demo.tsx
new file mode 100644
index 00000000000..8b0d24650ec
--- /dev/null
+++ b/apps/www/__registry__/default/example/radio-group-demo.tsx
@@ -0,0 +1,21 @@
+import { Label } from "@/registry/default/ui/label"
+import { RadioGroup, RadioGroupItem } from "@/registry/default/ui/radio-group"
+
+export default function RadioGroupDemo() {
+ return (
+
+
+
+ Default
+
+
+
+ Comfortable
+
+
+
+ Compact
+
+
+ )
+}
diff --git a/apps/www/__registry__/default/example/radio-group-form.tsx b/apps/www/__registry__/default/example/radio-group-form.tsx
new file mode 100644
index 00000000000..5d35613e643
--- /dev/null
+++ b/apps/www/__registry__/default/example/radio-group-form.tsx
@@ -0,0 +1,88 @@
+"use client"
+
+import { zodResolver } from "@hookform/resolvers/zod"
+import { useForm } from "react-hook-form"
+import { z } from "zod"
+
+import { Button } from "@/registry/default/ui/button"
+import {
+ Form,
+ FormControl,
+ FormField,
+ FormItem,
+ FormLabel,
+ FormMessage,
+} from "@/registry/default/ui/form"
+import { RadioGroup, RadioGroupItem } from "@/registry/default/ui/radio-group"
+import { toast } from "@/registry/default/ui/use-toast"
+
+const FormSchema = z.object({
+ type: z.enum(["all", "mentions", "none"], {
+ required_error: "You need to select a notification type.",
+ }),
+})
+
+export default function RadioGroupForm() {
+ const form = useForm>({
+ resolver: zodResolver(FormSchema),
+ })
+
+ function onSubmit(data: z.infer) {
+ toast({
+ title: "You submitted the following values:",
+ description: (
+
+ {JSON.stringify(data, null, 2)}
+
+ ),
+ })
+ }
+
+ return (
+
+
+ (
+
+ Notify me about...
+
+
+
+
+
+
+
+ All new messages
+
+
+
+
+
+
+
+ Direct messages and mentions
+
+
+
+
+
+
+ Nothing
+
+
+
+
+
+ )}
+ />
+ Submit
+
+
+ )
+}
diff --git a/apps/www/__registry__/default/example/resizable-demo-with-handle.tsx b/apps/www/__registry__/default/example/resizable-demo-with-handle.tsx
new file mode 100644
index 00000000000..af9c5973d3f
--- /dev/null
+++ b/apps/www/__registry__/default/example/resizable-demo-with-handle.tsx
@@ -0,0 +1,36 @@
+import {
+ ResizableHandle,
+ ResizablePanel,
+ ResizablePanelGroup,
+} from "@/registry/default/ui/resizable"
+
+export default function ResizableDemo() {
+ return (
+
+
+
+ One
+
+
+
+
+
+
+
+ Two
+
+
+
+
+
+ Three
+
+
+
+
+
+ )
+}
diff --git a/apps/www/__registry__/default/example/resizable-demo.tsx b/apps/www/__registry__/default/example/resizable-demo.tsx
new file mode 100644
index 00000000000..8429c3d4d86
--- /dev/null
+++ b/apps/www/__registry__/default/example/resizable-demo.tsx
@@ -0,0 +1,36 @@
+import {
+ ResizableHandle,
+ ResizablePanel,
+ ResizablePanelGroup,
+} from "@/registry/default/ui/resizable"
+
+export default function ResizableDemo() {
+ return (
+
+
+
+ One
+
+
+
+
+
+
+
+ Two
+
+
+
+
+
+ Three
+
+
+
+
+
+ )
+}
diff --git a/apps/www/__registry__/default/example/resizable-handle.tsx b/apps/www/__registry__/default/example/resizable-handle.tsx
new file mode 100644
index 00000000000..eeba94f6c53
--- /dev/null
+++ b/apps/www/__registry__/default/example/resizable-handle.tsx
@@ -0,0 +1,26 @@
+import {
+ ResizableHandle,
+ ResizablePanel,
+ ResizablePanelGroup,
+} from "@/registry/default/ui/resizable"
+
+export default function ResizableDemo() {
+ return (
+
+
+
+ Sidebar
+
+
+
+
+
+ Content
+
+
+
+ )
+}
diff --git a/apps/www/__registry__/default/example/resizable-vertical.tsx b/apps/www/__registry__/default/example/resizable-vertical.tsx
new file mode 100644
index 00000000000..2e9e4c44300
--- /dev/null
+++ b/apps/www/__registry__/default/example/resizable-vertical.tsx
@@ -0,0 +1,26 @@
+import {
+ ResizableHandle,
+ ResizablePanel,
+ ResizablePanelGroup,
+} from "@/registry/default/ui/resizable"
+
+export default function ResizableDemo() {
+ return (
+
+
+
+ Header
+
+
+
+
+
+ Content
+
+
+
+ )
+}
diff --git a/apps/www/__registry__/default/example/scroll-area-demo.tsx b/apps/www/__registry__/default/example/scroll-area-demo.tsx
new file mode 100644
index 00000000000..fff8dc58632
--- /dev/null
+++ b/apps/www/__registry__/default/example/scroll-area-demo.tsx
@@ -0,0 +1,26 @@
+import * as React from "react"
+
+import { ScrollArea } from "@/registry/default/ui/scroll-area"
+import { Separator } from "@/registry/default/ui/separator"
+
+const tags = Array.from({ length: 50 }).map(
+ (_, i, a) => `v1.2.0-beta.${a.length - i}`
+)
+
+export default function ScrollAreaDemo() {
+ return (
+
+
+
Tags
+ {tags.map((tag) => (
+ <>
+
+ {tag}
+
+
+ >
+ ))}
+
+
+ )
+}
diff --git a/apps/www/__registry__/default/example/scroll-area-horizontal-demo.tsx b/apps/www/__registry__/default/example/scroll-area-horizontal-demo.tsx
new file mode 100644
index 00000000000..fad6de53485
--- /dev/null
+++ b/apps/www/__registry__/default/example/scroll-area-horizontal-demo.tsx
@@ -0,0 +1,53 @@
+import * as React from "react"
+import Image from "next/image"
+
+import { ScrollArea, ScrollBar } from "@/registry/default/ui/scroll-area"
+
+export interface Artwork {
+ artist: string
+ art: string
+}
+
+export const works: Artwork[] = [
+ {
+ artist: "Ornella Binni",
+ art: "https://images.unsplash.com/photo-1465869185982-5a1a7522cbcb?auto=format&fit=crop&w=300&q=80",
+ },
+ {
+ artist: "Tom Byrom",
+ art: "https://images.unsplash.com/photo-1548516173-3cabfa4607e9?auto=format&fit=crop&w=300&q=80",
+ },
+ {
+ artist: "Vladimir Malyavko",
+ art: "https://images.unsplash.com/photo-1494337480532-3725c85fd2ab?auto=format&fit=crop&w=300&q=80",
+ },
+]
+
+export default function ScrollAreaHorizontalDemo() {
+ return (
+
+
+ {works.map((artwork) => (
+
+
+
+
+
+ Photo by{" "}
+
+ {artwork.artist}
+
+
+
+ ))}
+
+
+
+ )
+}
diff --git a/apps/www/__registry__/default/example/select-demo.tsx b/apps/www/__registry__/default/example/select-demo.tsx
new file mode 100644
index 00000000000..6430740fb18
--- /dev/null
+++ b/apps/www/__registry__/default/example/select-demo.tsx
@@ -0,0 +1,31 @@
+import * as React from "react"
+
+import {
+ Select,
+ SelectContent,
+ SelectGroup,
+ SelectItem,
+ SelectLabel,
+ SelectTrigger,
+ SelectValue,
+} from "@/registry/default/ui/select"
+
+export default function SelectDemo() {
+ return (
+
+
+
+
+
+
+ Fruits
+ Apple
+ Banana
+ Blueberry
+ Grapes
+ Pineapple
+
+
+
+ )
+}
diff --git a/apps/www/__registry__/default/example/select-form.tsx b/apps/www/__registry__/default/example/select-form.tsx
new file mode 100644
index 00000000000..ee66c876a73
--- /dev/null
+++ b/apps/www/__registry__/default/example/select-form.tsx
@@ -0,0 +1,84 @@
+"use client"
+
+import Link from "next/link"
+import { zodResolver } from "@hookform/resolvers/zod"
+import { useForm } from "react-hook-form"
+import { z } from "zod"
+
+import { Button } from "@/registry/default/ui/button"
+import {
+ Form,
+ FormControl,
+ FormDescription,
+ FormField,
+ FormItem,
+ FormLabel,
+ FormMessage,
+} from "@/registry/default/ui/form"
+import {
+ Select,
+ SelectContent,
+ SelectItem,
+ SelectTrigger,
+ SelectValue,
+} from "@/registry/default/ui/select"
+import { toast } from "@/registry/default/ui/use-toast"
+
+const FormSchema = z.object({
+ email: z
+ .string({
+ required_error: "Please select an email to display.",
+ })
+ .email(),
+})
+
+export default function SelectForm() {
+ const form = useForm>({
+ resolver: zodResolver(FormSchema),
+ })
+
+ function onSubmit(data: z.infer) {
+ toast({
+ title: "You submitted the following values:",
+ description: (
+
+ {JSON.stringify(data, null, 2)}
+
+ ),
+ })
+ }
+
+ return (
+
+
+ (
+
+ Email
+
+
+
+
+
+
+
+ m@example.com
+ m@google.com
+ m@support.com
+
+
+
+ You can manage email addresses in your{" "}
+ email settings.
+
+
+
+ )}
+ />
+ Submit
+
+
+ )
+}
diff --git a/apps/www/__registry__/default/example/select-scrollable.tsx b/apps/www/__registry__/default/example/select-scrollable.tsx
new file mode 100644
index 00000000000..44ed74c15f5
--- /dev/null
+++ b/apps/www/__registry__/default/example/select-scrollable.tsx
@@ -0,0 +1,75 @@
+import * as React from "react"
+
+import {
+ Select,
+ SelectContent,
+ SelectGroup,
+ SelectItem,
+ SelectLabel,
+ SelectTrigger,
+ SelectValue,
+} from "@/registry/default/ui/select"
+
+export default function SelectScrollable() {
+ return (
+
+
+
+
+
+
+ North America
+ Eastern Standard Time (EST)
+ Central Standard Time (CST)
+ Mountain Standard Time (MST)
+ Pacific Standard Time (PST)
+ Alaska Standard Time (AKST)
+ Hawaii Standard Time (HST)
+
+
+ Europe & Africa
+ Greenwich Mean Time (GMT)
+ Central European Time (CET)
+ Eastern European Time (EET)
+
+ Western European Summer Time (WEST)
+
+ Central Africa Time (CAT)
+ East Africa Time (EAT)
+
+
+ Asia
+ Moscow Time (MSK)
+ India Standard Time (IST)
+ China Standard Time (CST)
+ Japan Standard Time (JST)
+ Korea Standard Time (KST)
+
+ Indonesia Central Standard Time (WITA)
+
+
+
+ Australia & Pacific
+
+ Australian Western Standard Time (AWST)
+
+
+ Australian Central Standard Time (ACST)
+
+
+ Australian Eastern Standard Time (AEST)
+
+ New Zealand Standard Time (NZST)
+ Fiji Time (FJT)
+
+
+ South America
+ Argentina Time (ART)
+ Bolivia Time (BOT)
+ Brasilia Time (BRT)
+ Chile Standard Time (CLT)
+
+
+
+ )
+}
diff --git a/apps/www/__registry__/default/example/separator-demo.tsx b/apps/www/__registry__/default/example/separator-demo.tsx
new file mode 100644
index 00000000000..8d7f86f7016
--- /dev/null
+++ b/apps/www/__registry__/default/example/separator-demo.tsx
@@ -0,0 +1,22 @@
+import { Separator } from "@/registry/default/ui/separator"
+
+export default function SeparatorDemo() {
+ return (
+
+
+
Radix Primitives
+
+ An open-source UI component library.
+
+
+
+
+
Blog
+
+
Docs
+
+
Source
+
+
+ )
+}
diff --git a/apps/www/__registry__/default/example/sheet-demo.tsx b/apps/www/__registry__/default/example/sheet-demo.tsx
new file mode 100644
index 00000000000..75943eed771
--- /dev/null
+++ b/apps/www/__registry__/default/example/sheet-demo.tsx
@@ -0,0 +1,50 @@
+import { Button } from "@/registry/default/ui/button"
+import { Input } from "@/registry/default/ui/input"
+import { Label } from "@/registry/default/ui/label"
+import {
+ Sheet,
+ SheetClose,
+ SheetContent,
+ SheetDescription,
+ SheetFooter,
+ SheetHeader,
+ SheetTitle,
+ SheetTrigger,
+} from "@/registry/default/ui/sheet"
+
+export default function SheetDemo() {
+ return (
+
+
+ Open
+
+
+
+ Edit profile
+
+ Make changes to your profile here. Click save when you're done.
+
+
+
+
+
+ Save changes
+
+
+
+
+ )
+}
diff --git a/apps/www/__registry__/default/example/sheet-side.tsx b/apps/www/__registry__/default/example/sheet-side.tsx
new file mode 100644
index 00000000000..b672e1a993f
--- /dev/null
+++ b/apps/www/__registry__/default/example/sheet-side.tsx
@@ -0,0 +1,60 @@
+"use client"
+
+import { Button } from "@/registry/new-york/ui/button"
+import { Input } from "@/registry/new-york/ui/input"
+import { Label } from "@/registry/new-york/ui/label"
+import {
+ Sheet,
+ SheetClose,
+ SheetContent,
+ SheetDescription,
+ SheetFooter,
+ SheetHeader,
+ SheetTitle,
+ SheetTrigger,
+} from "@/registry/new-york/ui/sheet"
+
+const SHEET_SIDES = ["top", "right", "bottom", "left"] as const
+
+type SheetSide = (typeof SHEET_SIDES)[number]
+
+export default function SheetSide() {
+ return (
+
+ {SHEET_SIDES.map((side) => (
+
+
+ {side}
+
+
+
+ Edit profile
+
+ Make changes to your profile here. Click save when you're done.
+
+
+
+
+
+ Save changes
+
+
+
+
+ ))}
+
+ )
+}
diff --git a/apps/www/__registry__/default/example/skeleton-card.tsx b/apps/www/__registry__/default/example/skeleton-card.tsx
new file mode 100644
index 00000000000..6b43b850419
--- /dev/null
+++ b/apps/www/__registry__/default/example/skeleton-card.tsx
@@ -0,0 +1,13 @@
+import { Skeleton } from "@/registry/default/ui/skeleton"
+
+export default function SkeletonCard() {
+ return (
+
+ )
+}
diff --git a/apps/www/__registry__/default/example/skeleton-demo.tsx b/apps/www/__registry__/default/example/skeleton-demo.tsx
new file mode 100644
index 00000000000..af83a48325f
--- /dev/null
+++ b/apps/www/__registry__/default/example/skeleton-demo.tsx
@@ -0,0 +1,13 @@
+import { Skeleton } from "@/registry/default/ui/skeleton"
+
+export default function SkeletonDemo() {
+ return (
+
+ )
+}
diff --git a/apps/www/__registry__/default/example/slider-demo.tsx b/apps/www/__registry__/default/example/slider-demo.tsx
new file mode 100644
index 00000000000..af66d9e9e4c
--- /dev/null
+++ b/apps/www/__registry__/default/example/slider-demo.tsx
@@ -0,0 +1,16 @@
+import { cn } from "@/lib/utils"
+import { Slider } from "@/registry/default/ui/slider"
+
+type SliderProps = React.ComponentProps
+
+export default function SliderDemo({ className, ...props }: SliderProps) {
+ return (
+
+ )
+}
diff --git a/apps/www/__registry__/default/example/sonner-demo.tsx b/apps/www/__registry__/default/example/sonner-demo.tsx
new file mode 100644
index 00000000000..1f61bdf185f
--- /dev/null
+++ b/apps/www/__registry__/default/example/sonner-demo.tsx
@@ -0,0 +1,22 @@
+import { toast } from "sonner"
+
+import { Button } from "@/registry/default/ui/button"
+
+export default function SonnerDemo() {
+ return (
+
+ toast("Event has been created", {
+ description: "Sunday, December 03, 2023 at 9:00 AM",
+ action: {
+ label: "Undo",
+ onClick: () => console.log("Undo"),
+ },
+ })
+ }
+ >
+ Show Toast
+
+ )
+}
diff --git a/apps/www/__registry__/default/example/switch-demo.tsx b/apps/www/__registry__/default/example/switch-demo.tsx
new file mode 100644
index 00000000000..38034159b42
--- /dev/null
+++ b/apps/www/__registry__/default/example/switch-demo.tsx
@@ -0,0 +1,11 @@
+import { Label } from "@/registry/default/ui/label"
+import { Switch } from "@/registry/default/ui/switch"
+
+export default function SwitchDemo() {
+ return (
+
+
+ Airplane Mode
+
+ )
+}
diff --git a/apps/www/__registry__/default/example/switch-form.tsx b/apps/www/__registry__/default/example/switch-form.tsx
new file mode 100644
index 00000000000..2e61fada8e5
--- /dev/null
+++ b/apps/www/__registry__/default/example/switch-form.tsx
@@ -0,0 +1,99 @@
+"use client"
+
+import { zodResolver } from "@hookform/resolvers/zod"
+import { useForm } from "react-hook-form"
+import { z } from "zod"
+
+import { Button } from "@/registry/default/ui/button"
+import {
+ Form,
+ FormControl,
+ FormDescription,
+ FormField,
+ FormItem,
+ FormLabel,
+} from "@/registry/default/ui/form"
+import { Switch } from "@/registry/default/ui/switch"
+import { toast } from "@/registry/default/ui/use-toast"
+
+const FormSchema = z.object({
+ marketing_emails: z.boolean().default(false).optional(),
+ security_emails: z.boolean(),
+})
+
+export default function SwitchForm() {
+ const form = useForm>({
+ resolver: zodResolver(FormSchema),
+ defaultValues: {
+ security_emails: true,
+ },
+ })
+
+ function onSubmit(data: z.infer) {
+ toast({
+ title: "You submitted the following values:",
+ description: (
+
+ {JSON.stringify(data, null, 2)}
+
+ ),
+ })
+ }
+
+ return (
+
+
+
+
Email Notifications
+
+
(
+
+
+
+ Marketing emails
+
+
+ Receive emails about new products, features, and more.
+
+
+
+
+
+
+ )}
+ />
+ (
+
+
+ Security emails
+
+ Receive emails about your account security.
+
+
+
+
+
+
+ )}
+ />
+
+
+ Submit
+
+
+ )
+}
diff --git a/apps/www/__registry__/default/example/table-demo.tsx b/apps/www/__registry__/default/example/table-demo.tsx
new file mode 100644
index 00000000000..3b830de01d8
--- /dev/null
+++ b/apps/www/__registry__/default/example/table-demo.tsx
@@ -0,0 +1,87 @@
+import {
+ Table,
+ TableBody,
+ TableCaption,
+ TableCell,
+ TableFooter,
+ TableHead,
+ TableHeader,
+ TableRow,
+} from "@/registry/default/ui/table"
+
+const invoices = [
+ {
+ invoice: "INV001",
+ paymentStatus: "Paid",
+ totalAmount: "$250.00",
+ paymentMethod: "Credit Card",
+ },
+ {
+ invoice: "INV002",
+ paymentStatus: "Pending",
+ totalAmount: "$150.00",
+ paymentMethod: "PayPal",
+ },
+ {
+ invoice: "INV003",
+ paymentStatus: "Unpaid",
+ totalAmount: "$350.00",
+ paymentMethod: "Bank Transfer",
+ },
+ {
+ invoice: "INV004",
+ paymentStatus: "Paid",
+ totalAmount: "$450.00",
+ paymentMethod: "Credit Card",
+ },
+ {
+ invoice: "INV005",
+ paymentStatus: "Paid",
+ totalAmount: "$550.00",
+ paymentMethod: "PayPal",
+ },
+ {
+ invoice: "INV006",
+ paymentStatus: "Pending",
+ totalAmount: "$200.00",
+ paymentMethod: "Bank Transfer",
+ },
+ {
+ invoice: "INV007",
+ paymentStatus: "Unpaid",
+ totalAmount: "$300.00",
+ paymentMethod: "Credit Card",
+ },
+]
+
+export default function TableDemo() {
+ return (
+
+ A list of your recent invoices.
+
+
+ Invoice
+ Status
+ Method
+ Amount
+
+
+
+ {invoices.map((invoice) => (
+
+ {invoice.invoice}
+ {invoice.paymentStatus}
+ {invoice.paymentMethod}
+ {invoice.totalAmount}
+
+ ))}
+
+
+
+ Total
+ $2,500.00
+
+
+
+ )
+}
diff --git a/apps/www/__registry__/default/example/tabs-demo.tsx b/apps/www/__registry__/default/example/tabs-demo.tsx
new file mode 100644
index 00000000000..15198fd7b7d
--- /dev/null
+++ b/apps/www/__registry__/default/example/tabs-demo.tsx
@@ -0,0 +1,74 @@
+import { Button } from "@/registry/default/ui/button"
+import {
+ Card,
+ CardContent,
+ CardDescription,
+ CardFooter,
+ CardHeader,
+ CardTitle,
+} from "@/registry/default/ui/card"
+import { Input } from "@/registry/default/ui/input"
+import { Label } from "@/registry/default/ui/label"
+import {
+ Tabs,
+ TabsContent,
+ TabsList,
+ TabsTrigger,
+} from "@/registry/default/ui/tabs"
+
+export default function TabsDemo() {
+ return (
+
+
+ Account
+ Password
+
+
+
+
+ Account
+
+ Make changes to your account here. Click save when you're done.
+
+
+
+
+ Name
+
+
+
+ Username
+
+
+
+
+ Save changes
+
+
+
+
+
+
+ Password
+
+ Change your password here. After saving, you'll be logged out.
+
+
+
+
+ Current password
+
+
+
+ New password
+
+
+
+
+ Save password
+
+
+
+
+ )
+}
diff --git a/apps/www/__registry__/default/example/textarea-demo.tsx b/apps/www/__registry__/default/example/textarea-demo.tsx
new file mode 100644
index 00000000000..946a7a4b936
--- /dev/null
+++ b/apps/www/__registry__/default/example/textarea-demo.tsx
@@ -0,0 +1,5 @@
+import { Textarea } from "@/registry/default/ui/textarea"
+
+export default function TextareaDemo() {
+ return
+}
diff --git a/apps/www/__registry__/default/example/textarea-disabled.tsx b/apps/www/__registry__/default/example/textarea-disabled.tsx
new file mode 100644
index 00000000000..a7449153890
--- /dev/null
+++ b/apps/www/__registry__/default/example/textarea-disabled.tsx
@@ -0,0 +1,5 @@
+import { Textarea } from "@/registry/default/ui/textarea"
+
+export default function TextareaDisabled() {
+ return
+}
diff --git a/apps/www/__registry__/default/example/textarea-form.tsx b/apps/www/__registry__/default/example/textarea-form.tsx
new file mode 100644
index 00000000000..3e2f148ee72
--- /dev/null
+++ b/apps/www/__registry__/default/example/textarea-form.tsx
@@ -0,0 +1,74 @@
+"use client"
+
+import { zodResolver } from "@hookform/resolvers/zod"
+import { useForm } from "react-hook-form"
+import { z } from "zod"
+
+import { Button } from "@/registry/default/ui/button"
+import {
+ Form,
+ FormControl,
+ FormDescription,
+ FormField,
+ FormItem,
+ FormLabel,
+ FormMessage,
+} from "@/registry/default/ui/form"
+import { Textarea } from "@/registry/default/ui/textarea"
+import { toast } from "@/registry/default/ui/use-toast"
+
+const FormSchema = z.object({
+ bio: z
+ .string()
+ .min(10, {
+ message: "Bio must be at least 10 characters.",
+ })
+ .max(160, {
+ message: "Bio must not be longer than 30 characters.",
+ }),
+})
+
+export default function TextareaForm() {
+ const form = useForm>({
+ resolver: zodResolver(FormSchema),
+ })
+
+ function onSubmit(data: z.infer) {
+ toast({
+ title: "You submitted the following values:",
+ description: (
+
+ {JSON.stringify(data, null, 2)}
+
+ ),
+ })
+ }
+
+ return (
+
+
+ (
+
+ Bio
+
+
+
+
+ You can @mention other users and organizations.
+
+
+
+ )}
+ />
+ Submit
+
+
+ )
+}
diff --git a/apps/www/__registry__/default/example/textarea-with-button.tsx b/apps/www/__registry__/default/example/textarea-with-button.tsx
new file mode 100644
index 00000000000..9ab32cb99d3
--- /dev/null
+++ b/apps/www/__registry__/default/example/textarea-with-button.tsx
@@ -0,0 +1,11 @@
+import { Button } from "@/registry/default/ui/button"
+import { Textarea } from "@/registry/default/ui/textarea"
+
+export default function TextareaWithButton() {
+ return (
+
+
+ Send message
+
+ )
+}
diff --git a/apps/www/__registry__/default/example/textarea-with-label.tsx b/apps/www/__registry__/default/example/textarea-with-label.tsx
new file mode 100644
index 00000000000..3fa321e99af
--- /dev/null
+++ b/apps/www/__registry__/default/example/textarea-with-label.tsx
@@ -0,0 +1,11 @@
+import { Label } from "@/registry/default/ui/label"
+import { Textarea } from "@/registry/default/ui/textarea"
+
+export default function TextareaWithLabel() {
+ return (
+
+ Your message
+
+
+ )
+}
diff --git a/apps/www/__registry__/default/example/textarea-with-text.tsx b/apps/www/__registry__/default/example/textarea-with-text.tsx
new file mode 100644
index 00000000000..55f97be210e
--- /dev/null
+++ b/apps/www/__registry__/default/example/textarea-with-text.tsx
@@ -0,0 +1,14 @@
+import { Label } from "@/registry/default/ui/label"
+import { Textarea } from "@/registry/default/ui/textarea"
+
+export default function TextareaWithText() {
+ return (
+
+
Your Message
+
+
+ Your message will be copied to the support team.
+
+
+ )
+}
diff --git a/apps/www/__registry__/default/example/toast-demo.tsx b/apps/www/__registry__/default/example/toast-demo.tsx
new file mode 100644
index 00000000000..00a26f0cc72
--- /dev/null
+++ b/apps/www/__registry__/default/example/toast-demo.tsx
@@ -0,0 +1,26 @@
+"use client"
+
+import { Button } from "@/registry/default/ui/button"
+import { ToastAction } from "@/registry/default/ui/toast"
+import { useToast } from "@/registry/default/ui/use-toast"
+
+export default function ToastDemo() {
+ const { toast } = useToast()
+
+ return (
+ {
+ toast({
+ title: "Scheduled: Catch up ",
+ description: "Friday, February 10, 2023 at 5:57 PM",
+ action: (
+ Undo
+ ),
+ })
+ }}
+ >
+ Add to calendar
+
+ )
+}
diff --git a/apps/www/__registry__/default/example/toast-destructive.tsx b/apps/www/__registry__/default/example/toast-destructive.tsx
new file mode 100644
index 00000000000..e132851d0a4
--- /dev/null
+++ b/apps/www/__registry__/default/example/toast-destructive.tsx
@@ -0,0 +1,25 @@
+"use client"
+
+import { Button } from "@/registry/default/ui/button"
+import { ToastAction } from "@/registry/default/ui/toast"
+import { useToast } from "@/registry/default/ui/use-toast"
+
+export default function ToastDestructive() {
+ const { toast } = useToast()
+
+ return (
+ {
+ toast({
+ variant: "destructive",
+ title: "Uh oh! Something went wrong.",
+ description: "There was a problem with your request.",
+ action: Try again ,
+ })
+ }}
+ >
+ Show Toast
+
+ )
+}
diff --git a/apps/www/__registry__/default/example/toast-simple.tsx b/apps/www/__registry__/default/example/toast-simple.tsx
new file mode 100644
index 00000000000..0e8bb6adbc5
--- /dev/null
+++ b/apps/www/__registry__/default/example/toast-simple.tsx
@@ -0,0 +1,21 @@
+"use client"
+
+import { Button } from "@/registry/default/ui/button"
+import { useToast } from "@/registry/default/ui/use-toast"
+
+export default function ToastSimple() {
+ const { toast } = useToast()
+
+ return (
+ {
+ toast({
+ description: "Your message has been sent.",
+ })
+ }}
+ >
+ Show Toast
+
+ )
+}
diff --git a/apps/www/__registry__/default/example/toast-with-action.tsx b/apps/www/__registry__/default/example/toast-with-action.tsx
new file mode 100644
index 00000000000..aadb46400fd
--- /dev/null
+++ b/apps/www/__registry__/default/example/toast-with-action.tsx
@@ -0,0 +1,24 @@
+"use client"
+
+import { Button } from "@/registry/default/ui/button"
+import { ToastAction } from "@/registry/default/ui/toast"
+import { useToast } from "@/registry/default/ui/use-toast"
+
+export default function ToastWithAction() {
+ const { toast } = useToast()
+
+ return (
+ {
+ toast({
+ title: "Uh oh! Something went wrong.",
+ description: "There was a problem with your request.",
+ action: Try again ,
+ })
+ }}
+ >
+ Show Toast
+
+ )
+}
diff --git a/apps/www/__registry__/default/example/toast-with-title.tsx b/apps/www/__registry__/default/example/toast-with-title.tsx
new file mode 100644
index 00000000000..97ea67aa3eb
--- /dev/null
+++ b/apps/www/__registry__/default/example/toast-with-title.tsx
@@ -0,0 +1,22 @@
+"use client"
+
+import { Button } from "@/registry/default/ui/button"
+import { useToast } from "@/registry/default/ui/use-toast"
+
+export default function ToastWithTitle() {
+ const { toast } = useToast()
+
+ return (
+ {
+ toast({
+ title: "Uh oh! Something went wrong.",
+ description: "There was a problem with your request.",
+ })
+ }}
+ >
+ Show Toast
+
+ )
+}
diff --git a/apps/www/__registry__/default/example/toggle-demo.tsx b/apps/www/__registry__/default/example/toggle-demo.tsx
new file mode 100644
index 00000000000..a2a61ab437e
--- /dev/null
+++ b/apps/www/__registry__/default/example/toggle-demo.tsx
@@ -0,0 +1,11 @@
+import { Bold } from "lucide-react"
+
+import { Toggle } from "@/registry/default/ui/toggle"
+
+export default function ToggleDemo() {
+ return (
+
+
+
+ )
+}
diff --git a/apps/www/__registry__/default/example/toggle-disabled.tsx b/apps/www/__registry__/default/example/toggle-disabled.tsx
new file mode 100644
index 00000000000..10ba5fb4523
--- /dev/null
+++ b/apps/www/__registry__/default/example/toggle-disabled.tsx
@@ -0,0 +1,11 @@
+import { Underline } from "lucide-react"
+
+import { Toggle } from "@/registry/default/ui/toggle"
+
+export default function ToggleDisabled() {
+ return (
+
+
+
+ )
+}
diff --git a/apps/www/__registry__/default/example/toggle-group-demo.tsx b/apps/www/__registry__/default/example/toggle-group-demo.tsx
new file mode 100644
index 00000000000..be3a2712c64
--- /dev/null
+++ b/apps/www/__registry__/default/example/toggle-group-demo.tsx
@@ -0,0 +1,22 @@
+import { Bold, Italic, Underline } from "lucide-react"
+
+import {
+ ToggleGroup,
+ ToggleGroupItem,
+} from "@/registry/default/ui/toggle-group"
+
+export default function ToggleGroupDemo() {
+ return (
+
+
+
+
+
+
+
+
+
+
+
+ )
+}
diff --git a/apps/www/__registry__/default/example/toggle-group-disabled.tsx b/apps/www/__registry__/default/example/toggle-group-disabled.tsx
new file mode 100644
index 00000000000..35e49ee3d77
--- /dev/null
+++ b/apps/www/__registry__/default/example/toggle-group-disabled.tsx
@@ -0,0 +1,22 @@
+import { Bold, Italic, Underline } from "lucide-react"
+
+import {
+ ToggleGroup,
+ ToggleGroupItem,
+} from "@/registry/default/ui/toggle-group"
+
+export default function ToggleGroupDemo() {
+ return (
+
+
+
+
+
+
+
+
+
+
+
+ )
+}
diff --git a/apps/www/__registry__/default/example/toggle-group-lg.tsx b/apps/www/__registry__/default/example/toggle-group-lg.tsx
new file mode 100644
index 00000000000..539a769e676
--- /dev/null
+++ b/apps/www/__registry__/default/example/toggle-group-lg.tsx
@@ -0,0 +1,22 @@
+import { Bold, Italic, Underline } from "lucide-react"
+
+import {
+ ToggleGroup,
+ ToggleGroupItem,
+} from "@/registry/default/ui/toggle-group"
+
+export default function ToggleGroupDemo() {
+ return (
+
+
+
+
+
+
+
+
+
+
+
+ )
+}
diff --git a/apps/www/__registry__/default/example/toggle-group-outline.tsx b/apps/www/__registry__/default/example/toggle-group-outline.tsx
new file mode 100644
index 00000000000..a28bfc4d1d8
--- /dev/null
+++ b/apps/www/__registry__/default/example/toggle-group-outline.tsx
@@ -0,0 +1,22 @@
+import { Bold, Italic, Underline } from "lucide-react"
+
+import {
+ ToggleGroup,
+ ToggleGroupItem,
+} from "@/registry/default/ui/toggle-group"
+
+export default function ToggleGroupDemo() {
+ return (
+
+
+
+
+
+
+
+
+
+
+
+ )
+}
diff --git a/apps/www/__registry__/default/example/toggle-group-single.tsx b/apps/www/__registry__/default/example/toggle-group-single.tsx
new file mode 100644
index 00000000000..467e42e8dc8
--- /dev/null
+++ b/apps/www/__registry__/default/example/toggle-group-single.tsx
@@ -0,0 +1,22 @@
+import { Bold, Italic, Underline } from "lucide-react"
+
+import {
+ ToggleGroup,
+ ToggleGroupItem,
+} from "@/registry/default/ui/toggle-group"
+
+export default function ToggleGroupDemo() {
+ return (
+
+
+
+
+
+
+
+
+
+
+
+ )
+}
diff --git a/apps/www/__registry__/default/example/toggle-group-sm.tsx b/apps/www/__registry__/default/example/toggle-group-sm.tsx
new file mode 100644
index 00000000000..d46a8bce166
--- /dev/null
+++ b/apps/www/__registry__/default/example/toggle-group-sm.tsx
@@ -0,0 +1,22 @@
+import { Bold, Italic, Underline } from "lucide-react"
+
+import {
+ ToggleGroup,
+ ToggleGroupItem,
+} from "@/registry/default/ui/toggle-group"
+
+export default function ToggleGroupDemo() {
+ return (
+
+
+
+
+
+
+
+
+
+
+
+ )
+}
diff --git a/apps/www/__registry__/default/example/toggle-lg.tsx b/apps/www/__registry__/default/example/toggle-lg.tsx
new file mode 100644
index 00000000000..0fd79e00a19
--- /dev/null
+++ b/apps/www/__registry__/default/example/toggle-lg.tsx
@@ -0,0 +1,11 @@
+import { Italic } from "lucide-react"
+
+import { Toggle } from "@/registry/default/ui/toggle"
+
+export default function ToggleLg() {
+ return (
+
+
+
+ )
+}
diff --git a/apps/www/__registry__/default/example/toggle-outline.tsx b/apps/www/__registry__/default/example/toggle-outline.tsx
new file mode 100644
index 00000000000..0448e0f2d90
--- /dev/null
+++ b/apps/www/__registry__/default/example/toggle-outline.tsx
@@ -0,0 +1,11 @@
+import { Italic } from "lucide-react"
+
+import { Toggle } from "@/registry/default/ui/toggle"
+
+export default function ToggleOutline() {
+ return (
+
+
+
+ )
+}
diff --git a/apps/www/__registry__/default/example/toggle-sm.tsx b/apps/www/__registry__/default/example/toggle-sm.tsx
new file mode 100644
index 00000000000..55ec5e2997a
--- /dev/null
+++ b/apps/www/__registry__/default/example/toggle-sm.tsx
@@ -0,0 +1,11 @@
+import { Italic } from "lucide-react"
+
+import { Toggle } from "@/registry/default/ui/toggle"
+
+export default function ToggleSm() {
+ return (
+
+
+
+ )
+}
diff --git a/apps/www/__registry__/default/example/toggle-with-text.tsx b/apps/www/__registry__/default/example/toggle-with-text.tsx
new file mode 100644
index 00000000000..dcca4113851
--- /dev/null
+++ b/apps/www/__registry__/default/example/toggle-with-text.tsx
@@ -0,0 +1,12 @@
+import { Italic } from "lucide-react"
+
+import { Toggle } from "@/registry/default/ui/toggle"
+
+export default function ToggleWithText() {
+ return (
+
+
+ Italic
+
+ )
+}
diff --git a/apps/www/__registry__/default/example/tooltip-demo.tsx b/apps/www/__registry__/default/example/tooltip-demo.tsx
new file mode 100644
index 00000000000..6635ee06fb8
--- /dev/null
+++ b/apps/www/__registry__/default/example/tooltip-demo.tsx
@@ -0,0 +1,22 @@
+import { Button } from "@/registry/default/ui/button"
+import {
+ Tooltip,
+ TooltipContent,
+ TooltipProvider,
+ TooltipTrigger,
+} from "@/registry/default/ui/tooltip"
+
+export default function TooltipDemo() {
+ return (
+
+
+
+ Hover
+
+
+ Add to library
+
+
+
+ )
+}
diff --git a/apps/www/__registry__/default/example/typography-blockquote.tsx b/apps/www/__registry__/default/example/typography-blockquote.tsx
new file mode 100644
index 00000000000..21712995c0f
--- /dev/null
+++ b/apps/www/__registry__/default/example/typography-blockquote.tsx
@@ -0,0 +1,8 @@
+export default function TypographyBlockquote() {
+ return (
+
+ "After all," he said, "everyone enjoys a good joke, so it's only fair that
+ they should pay for the privilege."
+
+ )
+}
diff --git a/apps/www/__registry__/default/example/typography-demo.tsx b/apps/www/__registry__/default/example/typography-demo.tsx
new file mode 100644
index 00000000000..dfc6deebd50
--- /dev/null
+++ b/apps/www/__registry__/default/example/typography-demo.tsx
@@ -0,0 +1,119 @@
+export default function TypographyDemo() {
+ return (
+
+
+ The Joke Tax Chronicles
+
+
+ Once upon a time, in a far-off land, there was a very lazy king who
+ spent all day lounging on his throne. One day, his advisors came to him
+ with a problem: the kingdom was running out of money.
+
+
+ The King's Plan
+
+
+ The king thought long and hard, and finally came up with{" "}
+
+ a brilliant plan
+
+ : he would tax the jokes in the kingdom.
+
+
+ "After all," he said, "everyone enjoys a good joke, so it's only fair
+ that they should pay for the privilege."
+
+
+ The Joke Tax
+
+
+ The king's subjects were not amused. They grumbled and complained, but
+ the king was firm:
+
+
+ 1st level of puns: 5 gold coins
+ 2nd level of jokes: 10 gold coins
+ 3rd level of one-liners : 20 gold coins
+
+
+ As a result, people stopped telling jokes, and the kingdom fell into a
+ gloom. But there was one person who refused to let the king's
+ foolishness get him down: a court jester named Jokester.
+
+
+ Jokester's Revolt
+
+
+ Jokester began sneaking into the castle in the middle of the night and
+ leaving jokes all over the place: under the king's pillow, in his soup,
+ even in the royal toilet. The king was furious, but he couldn't seem to
+ stop Jokester.
+
+
+ And then, one day, the people of the kingdom discovered that the jokes
+ left by Jokester were so funny that they couldn't help but laugh. And
+ once they started laughing, they couldn't stop.
+
+
+ The People's Rebellion
+
+
+ The people of the kingdom, feeling uplifted by the laughter, started to
+ tell jokes and puns again, and soon the entire kingdom was in on the
+ joke.
+
+
+
+
+
+
+ King's Treasury
+
+
+ People's happiness
+
+
+
+
+
+
+ Empty
+
+
+ Overflowing
+
+
+
+
+ Modest
+
+
+ Satisfied
+
+
+
+
+ Full
+
+
+ Ecstatic
+
+
+
+
+
+
+ The king, seeing how much happier his subjects were, realized the error
+ of his ways and repealed the joke tax. Jokester was declared a hero, and
+ the kingdom lived happily ever after.
+
+
+ The moral of the story is: never underestimate the power of a good laugh
+ and always be careful of bad ideas.
+
+
+ )
+}
diff --git a/apps/www/__registry__/default/example/typography-h1.tsx b/apps/www/__registry__/default/example/typography-h1.tsx
new file mode 100644
index 00000000000..0ee8f5dd4b7
--- /dev/null
+++ b/apps/www/__registry__/default/example/typography-h1.tsx
@@ -0,0 +1,7 @@
+export default function TypographyH1() {
+ return (
+
+ Taxing Laughter: The Joke Tax Chronicles
+
+ )
+}
diff --git a/apps/www/__registry__/default/example/typography-h2.tsx b/apps/www/__registry__/default/example/typography-h2.tsx
new file mode 100644
index 00000000000..ea794416542
--- /dev/null
+++ b/apps/www/__registry__/default/example/typography-h2.tsx
@@ -0,0 +1,7 @@
+export default function TypographyH2() {
+ return (
+
+ The People of the Kingdom
+
+ )
+}
diff --git a/apps/www/__registry__/default/example/typography-h3.tsx b/apps/www/__registry__/default/example/typography-h3.tsx
new file mode 100644
index 00000000000..4e8a1859cf5
--- /dev/null
+++ b/apps/www/__registry__/default/example/typography-h3.tsx
@@ -0,0 +1,7 @@
+export default function TypographyH3() {
+ return (
+
+ The Joke Tax
+
+ )
+}
diff --git a/apps/www/__registry__/default/example/typography-h4.tsx b/apps/www/__registry__/default/example/typography-h4.tsx
new file mode 100644
index 00000000000..583516625ea
--- /dev/null
+++ b/apps/www/__registry__/default/example/typography-h4.tsx
@@ -0,0 +1,7 @@
+export default function TypographyH4() {
+ return (
+
+ People stopped telling jokes
+
+ )
+}
diff --git a/apps/www/__registry__/default/example/typography-inline-code.tsx b/apps/www/__registry__/default/example/typography-inline-code.tsx
new file mode 100644
index 00000000000..fbbc96ba688
--- /dev/null
+++ b/apps/www/__registry__/default/example/typography-inline-code.tsx
@@ -0,0 +1,7 @@
+export default function TypographyInlineCode() {
+ return (
+
+ @radix-ui/react-alert-dialog
+
+ )
+}
diff --git a/apps/www/__registry__/default/example/typography-large.tsx b/apps/www/__registry__/default/example/typography-large.tsx
new file mode 100644
index 00000000000..944f4478d38
--- /dev/null
+++ b/apps/www/__registry__/default/example/typography-large.tsx
@@ -0,0 +1,3 @@
+export default function TypographyLarge() {
+ return Are you absolutely sure?
+}
diff --git a/apps/www/__registry__/default/example/typography-lead.tsx b/apps/www/__registry__/default/example/typography-lead.tsx
new file mode 100644
index 00000000000..aac39ea29ed
--- /dev/null
+++ b/apps/www/__registry__/default/example/typography-lead.tsx
@@ -0,0 +1,8 @@
+export default function TypographyLead() {
+ return (
+
+ A modal dialog that interrupts the user with important content and expects
+ a response.
+
+ )
+}
diff --git a/apps/www/__registry__/default/example/typography-list.tsx b/apps/www/__registry__/default/example/typography-list.tsx
new file mode 100644
index 00000000000..a814f661f0b
--- /dev/null
+++ b/apps/www/__registry__/default/example/typography-list.tsx
@@ -0,0 +1,9 @@
+export default function TypographyList() {
+ return (
+
+ 1st level of puns: 5 gold coins
+ 2nd level of jokes: 10 gold coins
+ 3rd level of one-liners : 20 gold coins
+
+ )
+}
diff --git a/apps/www/__registry__/default/example/typography-muted.tsx b/apps/www/__registry__/default/example/typography-muted.tsx
new file mode 100644
index 00000000000..545dcfc74f1
--- /dev/null
+++ b/apps/www/__registry__/default/example/typography-muted.tsx
@@ -0,0 +1,5 @@
+export default function TypographyMuted() {
+ return (
+ Enter your email address.
+ )
+}
diff --git a/apps/www/__registry__/default/example/typography-p.tsx b/apps/www/__registry__/default/example/typography-p.tsx
new file mode 100644
index 00000000000..88fd4795485
--- /dev/null
+++ b/apps/www/__registry__/default/example/typography-p.tsx
@@ -0,0 +1,8 @@
+export default function TypographyP() {
+ return (
+
+ The king, seeing how much happier his subjects were, realized the error of
+ his ways and repealed the joke tax.
+
+ )
+}
diff --git a/apps/www/__registry__/default/example/typography-small.tsx b/apps/www/__registry__/default/example/typography-small.tsx
new file mode 100644
index 00000000000..822019d1df0
--- /dev/null
+++ b/apps/www/__registry__/default/example/typography-small.tsx
@@ -0,0 +1,5 @@
+export default function TypographySmall() {
+ return (
+ Email address
+ )
+}
diff --git a/apps/www/__registry__/default/example/typography-table.tsx b/apps/www/__registry__/default/example/typography-table.tsx
new file mode 100644
index 00000000000..0698c475194
--- /dev/null
+++ b/apps/www/__registry__/default/example/typography-table.tsx
@@ -0,0 +1,44 @@
+export default function TypographyTable() {
+ return (
+
+
+
+
+
+ King's Treasury
+
+
+ People's happiness
+
+
+
+
+
+
+ Empty
+
+
+ Overflowing
+
+
+
+
+ Modest
+
+
+ Satisfied
+
+
+
+
+ Full
+
+
+ Ecstatic
+
+
+
+
+
+ )
+}
diff --git a/apps/www/__registry__/default/ui/accordion.tsx b/apps/www/__registry__/default/ui/accordion.tsx
new file mode 100644
index 00000000000..24c788c2c44
--- /dev/null
+++ b/apps/www/__registry__/default/ui/accordion.tsx
@@ -0,0 +1,58 @@
+"use client"
+
+import * as React from "react"
+import * as AccordionPrimitive from "@radix-ui/react-accordion"
+import { ChevronDown } from "lucide-react"
+
+import { cn } from "@/lib/utils"
+
+const Accordion = AccordionPrimitive.Root
+
+const AccordionItem = React.forwardRef<
+ React.ElementRef,
+ React.ComponentPropsWithoutRef
+>(({ className, ...props }, ref) => (
+
+))
+AccordionItem.displayName = "AccordionItem"
+
+const AccordionTrigger = React.forwardRef<
+ React.ElementRef,
+ React.ComponentPropsWithoutRef
+>(({ className, children, ...props }, ref) => (
+
+ svg]:rotate-180",
+ className
+ )}
+ {...props}
+ >
+ {children}
+
+
+
+))
+AccordionTrigger.displayName = AccordionPrimitive.Trigger.displayName
+
+const AccordionContent = React.forwardRef<
+ React.ElementRef,
+ React.ComponentPropsWithoutRef
+>(({ className, children, ...props }, ref) => (
+
+ {children}
+
+))
+
+AccordionContent.displayName = AccordionPrimitive.Content.displayName
+
+export { Accordion, AccordionItem, AccordionTrigger, AccordionContent }
diff --git a/apps/www/__registry__/default/ui/alert-dialog.tsx b/apps/www/__registry__/default/ui/alert-dialog.tsx
new file mode 100644
index 00000000000..1b6f99493c9
--- /dev/null
+++ b/apps/www/__registry__/default/ui/alert-dialog.tsx
@@ -0,0 +1,141 @@
+"use client"
+
+import * as React from "react"
+import * as AlertDialogPrimitive from "@radix-ui/react-alert-dialog"
+
+import { cn } from "@/lib/utils"
+import { buttonVariants } from "@/registry/default/ui/button"
+
+const AlertDialog = AlertDialogPrimitive.Root
+
+const AlertDialogTrigger = AlertDialogPrimitive.Trigger
+
+const AlertDialogPortal = AlertDialogPrimitive.Portal
+
+const AlertDialogOverlay = React.forwardRef<
+ React.ElementRef,
+ React.ComponentPropsWithoutRef
+>(({ className, ...props }, ref) => (
+
+))
+AlertDialogOverlay.displayName = AlertDialogPrimitive.Overlay.displayName
+
+const AlertDialogContent = React.forwardRef<
+ React.ElementRef,
+ React.ComponentPropsWithoutRef
+>(({ className, ...props }, ref) => (
+
+
+
+
+))
+AlertDialogContent.displayName = AlertDialogPrimitive.Content.displayName
+
+const AlertDialogHeader = ({
+ className,
+ ...props
+}: React.HTMLAttributes) => (
+
+)
+AlertDialogHeader.displayName = "AlertDialogHeader"
+
+const AlertDialogFooter = ({
+ className,
+ ...props
+}: React.HTMLAttributes) => (
+
+)
+AlertDialogFooter.displayName = "AlertDialogFooter"
+
+const AlertDialogTitle = React.forwardRef<
+ React.ElementRef,
+ React.ComponentPropsWithoutRef
+>(({ className, ...props }, ref) => (
+
+))
+AlertDialogTitle.displayName = AlertDialogPrimitive.Title.displayName
+
+const AlertDialogDescription = React.forwardRef<
+ React.ElementRef,
+ React.ComponentPropsWithoutRef
+>(({ className, ...props }, ref) => (
+
+))
+AlertDialogDescription.displayName =
+ AlertDialogPrimitive.Description.displayName
+
+const AlertDialogAction = React.forwardRef<
+ React.ElementRef,
+ React.ComponentPropsWithoutRef
+>(({ className, ...props }, ref) => (
+
+))
+AlertDialogAction.displayName = AlertDialogPrimitive.Action.displayName
+
+const AlertDialogCancel = React.forwardRef<
+ React.ElementRef,
+ React.ComponentPropsWithoutRef
+>(({ className, ...props }, ref) => (
+
+))
+AlertDialogCancel.displayName = AlertDialogPrimitive.Cancel.displayName
+
+export {
+ AlertDialog,
+ AlertDialogPortal,
+ AlertDialogOverlay,
+ AlertDialogTrigger,
+ AlertDialogContent,
+ AlertDialogHeader,
+ AlertDialogFooter,
+ AlertDialogTitle,
+ AlertDialogDescription,
+ AlertDialogAction,
+ AlertDialogCancel,
+}
diff --git a/apps/www/__registry__/default/ui/alert.tsx b/apps/www/__registry__/default/ui/alert.tsx
new file mode 100644
index 00000000000..41fa7e0561a
--- /dev/null
+++ b/apps/www/__registry__/default/ui/alert.tsx
@@ -0,0 +1,59 @@
+import * as React from "react"
+import { cva, type VariantProps } from "class-variance-authority"
+
+import { cn } from "@/lib/utils"
+
+const alertVariants = cva(
+ "relative w-full rounded-lg border p-4 [&>svg~*]:pl-7 [&>svg+div]:translate-y-[-3px] [&>svg]:absolute [&>svg]:left-4 [&>svg]:top-4 [&>svg]:text-foreground",
+ {
+ variants: {
+ variant: {
+ default: "bg-background text-foreground",
+ destructive:
+ "border-destructive/50 text-destructive dark:border-destructive [&>svg]:text-destructive",
+ },
+ },
+ defaultVariants: {
+ variant: "default",
+ },
+ }
+)
+
+const Alert = React.forwardRef<
+ HTMLDivElement,
+ React.HTMLAttributes & VariantProps
+>(({ className, variant, ...props }, ref) => (
+
+))
+Alert.displayName = "Alert"
+
+const AlertTitle = React.forwardRef<
+ HTMLParagraphElement,
+ React.HTMLAttributes
+>(({ className, ...props }, ref) => (
+
+))
+AlertTitle.displayName = "AlertTitle"
+
+const AlertDescription = React.forwardRef<
+ HTMLParagraphElement,
+ React.HTMLAttributes
+>(({ className, ...props }, ref) => (
+
+))
+AlertDescription.displayName = "AlertDescription"
+
+export { Alert, AlertTitle, AlertDescription }
diff --git a/apps/www/__registry__/default/ui/aspect-ratio.tsx b/apps/www/__registry__/default/ui/aspect-ratio.tsx
new file mode 100644
index 00000000000..d6a5226f5e9
--- /dev/null
+++ b/apps/www/__registry__/default/ui/aspect-ratio.tsx
@@ -0,0 +1,7 @@
+"use client"
+
+import * as AspectRatioPrimitive from "@radix-ui/react-aspect-ratio"
+
+const AspectRatio = AspectRatioPrimitive.Root
+
+export { AspectRatio }
diff --git a/apps/www/__registry__/default/ui/avatar.tsx b/apps/www/__registry__/default/ui/avatar.tsx
new file mode 100644
index 00000000000..51e507ba9d0
--- /dev/null
+++ b/apps/www/__registry__/default/ui/avatar.tsx
@@ -0,0 +1,50 @@
+"use client"
+
+import * as React from "react"
+import * as AvatarPrimitive from "@radix-ui/react-avatar"
+
+import { cn } from "@/lib/utils"
+
+const Avatar = React.forwardRef<
+ React.ElementRef,
+ React.ComponentPropsWithoutRef
+>(({ className, ...props }, ref) => (
+
+))
+Avatar.displayName = AvatarPrimitive.Root.displayName
+
+const AvatarImage = React.forwardRef<
+ React.ElementRef,
+ React.ComponentPropsWithoutRef
+>(({ className, ...props }, ref) => (
+
+))
+AvatarImage.displayName = AvatarPrimitive.Image.displayName
+
+const AvatarFallback = React.forwardRef<
+ React.ElementRef,
+ React.ComponentPropsWithoutRef
+>(({ className, ...props }, ref) => (
+
+))
+AvatarFallback.displayName = AvatarPrimitive.Fallback.displayName
+
+export { Avatar, AvatarImage, AvatarFallback }
diff --git a/apps/www/__registry__/default/ui/badge.tsx b/apps/www/__registry__/default/ui/badge.tsx
new file mode 100644
index 00000000000..f000e3ef517
--- /dev/null
+++ b/apps/www/__registry__/default/ui/badge.tsx
@@ -0,0 +1,36 @@
+import * as React from "react"
+import { cva, type VariantProps } from "class-variance-authority"
+
+import { cn } from "@/lib/utils"
+
+const badgeVariants = cva(
+ "inline-flex items-center rounded-full border px-2.5 py-0.5 text-xs font-semibold transition-colors focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2",
+ {
+ variants: {
+ variant: {
+ default:
+ "border-transparent bg-primary text-primary-foreground hover:bg-primary/80",
+ secondary:
+ "border-transparent bg-secondary text-secondary-foreground hover:bg-secondary/80",
+ destructive:
+ "border-transparent bg-destructive text-destructive-foreground hover:bg-destructive/80",
+ outline: "text-foreground",
+ },
+ },
+ defaultVariants: {
+ variant: "default",
+ },
+ }
+)
+
+export interface BadgeProps
+ extends React.HTMLAttributes,
+ VariantProps {}
+
+function Badge({ className, variant, ...props }: BadgeProps) {
+ return (
+
+ )
+}
+
+export { Badge, badgeVariants }
diff --git a/apps/www/__registry__/default/ui/breadcrumb.tsx b/apps/www/__registry__/default/ui/breadcrumb.tsx
new file mode 100644
index 00000000000..71a5c325cdc
--- /dev/null
+++ b/apps/www/__registry__/default/ui/breadcrumb.tsx
@@ -0,0 +1,115 @@
+import * as React from "react"
+import { Slot } from "@radix-ui/react-slot"
+import { ChevronRight, MoreHorizontal } from "lucide-react"
+
+import { cn } from "@/lib/utils"
+
+const Breadcrumb = React.forwardRef<
+ HTMLElement,
+ React.ComponentPropsWithoutRef<"nav"> & {
+ separator?: React.ReactNode
+ }
+>(({ ...props }, ref) => )
+Breadcrumb.displayName = "Breadcrumb"
+
+const BreadcrumbList = React.forwardRef<
+ HTMLOListElement,
+ React.ComponentPropsWithoutRef<"ol">
+>(({ className, ...props }, ref) => (
+
+))
+BreadcrumbList.displayName = "BreadcrumbList"
+
+const BreadcrumbItem = React.forwardRef<
+ HTMLLIElement,
+ React.ComponentPropsWithoutRef<"li">
+>(({ className, ...props }, ref) => (
+
+))
+BreadcrumbItem.displayName = "BreadcrumbItem"
+
+const BreadcrumbLink = React.forwardRef<
+ HTMLAnchorElement,
+ React.ComponentPropsWithoutRef<"a"> & {
+ asChild?: boolean
+ }
+>(({ asChild, className, ...props }, ref) => {
+ const Comp = asChild ? Slot : "a"
+
+ return (
+
+ )
+})
+BreadcrumbLink.displayName = "BreadcrumbLink"
+
+const BreadcrumbPage = React.forwardRef<
+ HTMLSpanElement,
+ React.ComponentPropsWithoutRef<"span">
+>(({ className, ...props }, ref) => (
+
+))
+BreadcrumbPage.displayName = "BreadcrumbPage"
+
+const BreadcrumbSeparator = ({
+ children,
+ className,
+ ...props
+}: React.ComponentProps<"li">) => (
+ svg]:size-3.5", className)}
+ {...props}
+ >
+ {children ?? }
+
+)
+BreadcrumbSeparator.displayName = "BreadcrumbSeparator"
+
+const BreadcrumbEllipsis = ({
+ className,
+ ...props
+}: React.ComponentProps<"span">) => (
+
+
+ More
+
+)
+BreadcrumbEllipsis.displayName = "BreadcrumbElipssis"
+
+export {
+ Breadcrumb,
+ BreadcrumbList,
+ BreadcrumbItem,
+ BreadcrumbLink,
+ BreadcrumbPage,
+ BreadcrumbSeparator,
+ BreadcrumbEllipsis,
+}
diff --git a/apps/www/__registry__/default/ui/button.tsx b/apps/www/__registry__/default/ui/button.tsx
new file mode 100644
index 00000000000..0ba4277355f
--- /dev/null
+++ b/apps/www/__registry__/default/ui/button.tsx
@@ -0,0 +1,56 @@
+import * as React from "react"
+import { Slot } from "@radix-ui/react-slot"
+import { cva, type VariantProps } from "class-variance-authority"
+
+import { cn } from "@/lib/utils"
+
+const buttonVariants = cva(
+ "inline-flex items-center justify-center whitespace-nowrap rounded-md text-sm font-medium ring-offset-background transition-colors focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring focus-visible:ring-offset-2 disabled:pointer-events-none disabled:opacity-50",
+ {
+ variants: {
+ variant: {
+ default: "bg-primary text-primary-foreground hover:bg-primary/90",
+ destructive:
+ "bg-destructive text-destructive-foreground hover:bg-destructive/90",
+ outline:
+ "border border-input bg-background hover:bg-accent hover:text-accent-foreground",
+ secondary:
+ "bg-secondary text-secondary-foreground hover:bg-secondary/80",
+ ghost: "hover:bg-accent hover:text-accent-foreground",
+ link: "text-primary underline-offset-4 hover:underline",
+ },
+ size: {
+ default: "h-10 px-4 py-2",
+ sm: "h-9 rounded-md px-3",
+ lg: "h-11 rounded-md px-8",
+ icon: "h-10 w-10",
+ },
+ },
+ defaultVariants: {
+ variant: "default",
+ size: "default",
+ },
+ }
+)
+
+export interface ButtonProps
+ extends React.ButtonHTMLAttributes,
+ VariantProps {
+ asChild?: boolean
+}
+
+const Button = React.forwardRef(
+ ({ className, variant, size, asChild = false, ...props }, ref) => {
+ const Comp = asChild ? Slot : "button"
+ return (
+
+ )
+ }
+)
+Button.displayName = "Button"
+
+export { Button, buttonVariants }
diff --git a/apps/www/__registry__/default/ui/calendar.tsx b/apps/www/__registry__/default/ui/calendar.tsx
new file mode 100644
index 00000000000..e04fe19511f
--- /dev/null
+++ b/apps/www/__registry__/default/ui/calendar.tsx
@@ -0,0 +1,66 @@
+"use client"
+
+import * as React from "react"
+import { ChevronLeft, ChevronRight } from "lucide-react"
+import { DayPicker } from "react-day-picker"
+
+import { cn } from "@/lib/utils"
+import { buttonVariants } from "@/registry/default/ui/button"
+
+export type CalendarProps = React.ComponentProps
+
+function Calendar({
+ className,
+ classNames,
+ showOutsideDays = true,
+ ...props
+}: CalendarProps) {
+ return (
+ ,
+ IconRight: ({ ...props }) => ,
+ }}
+ {...props}
+ />
+ )
+}
+Calendar.displayName = "Calendar"
+
+export { Calendar }
diff --git a/apps/www/__registry__/default/ui/card.tsx b/apps/www/__registry__/default/ui/card.tsx
new file mode 100644
index 00000000000..afa13ecfa3b
--- /dev/null
+++ b/apps/www/__registry__/default/ui/card.tsx
@@ -0,0 +1,79 @@
+import * as React from "react"
+
+import { cn } from "@/lib/utils"
+
+const Card = React.forwardRef<
+ HTMLDivElement,
+ React.HTMLAttributes
+>(({ className, ...props }, ref) => (
+
+))
+Card.displayName = "Card"
+
+const CardHeader = React.forwardRef<
+ HTMLDivElement,
+ React.HTMLAttributes
+>(({ className, ...props }, ref) => (
+
+))
+CardHeader.displayName = "CardHeader"
+
+const CardTitle = React.forwardRef<
+ HTMLParagraphElement,
+ React.HTMLAttributes
+>(({ className, ...props }, ref) => (
+
+))
+CardTitle.displayName = "CardTitle"
+
+const CardDescription = React.forwardRef<
+ HTMLParagraphElement,
+ React.HTMLAttributes
+>(({ className, ...props }, ref) => (
+
+))
+CardDescription.displayName = "CardDescription"
+
+const CardContent = React.forwardRef<
+ HTMLDivElement,
+ React.HTMLAttributes
+>(({ className, ...props }, ref) => (
+
+))
+CardContent.displayName = "CardContent"
+
+const CardFooter = React.forwardRef<
+ HTMLDivElement,
+ React.HTMLAttributes
+>(({ className, ...props }, ref) => (
+
+))
+CardFooter.displayName = "CardFooter"
+
+export { Card, CardHeader, CardFooter, CardTitle, CardDescription, CardContent }
diff --git a/apps/www/__registry__/default/ui/carousel.tsx b/apps/www/__registry__/default/ui/carousel.tsx
new file mode 100644
index 00000000000..45311bfadf9
--- /dev/null
+++ b/apps/www/__registry__/default/ui/carousel.tsx
@@ -0,0 +1,262 @@
+"use client"
+
+import * as React from "react"
+import useEmblaCarousel, {
+ type UseEmblaCarouselType,
+} from "embla-carousel-react"
+import { ArrowLeft, ArrowRight } from "lucide-react"
+
+import { cn } from "@/lib/utils"
+import { Button } from "@/registry/default/ui/button"
+
+type CarouselApi = UseEmblaCarouselType[1]
+type UseCarouselParameters = Parameters
+type CarouselOptions = UseCarouselParameters[0]
+type CarouselPlugin = UseCarouselParameters[1]
+
+type CarouselProps = {
+ opts?: CarouselOptions
+ plugins?: CarouselPlugin
+ orientation?: "horizontal" | "vertical"
+ setApi?: (api: CarouselApi) => void
+}
+
+type CarouselContextProps = {
+ carouselRef: ReturnType[0]
+ api: ReturnType[1]
+ scrollPrev: () => void
+ scrollNext: () => void
+ canScrollPrev: boolean
+ canScrollNext: boolean
+} & CarouselProps
+
+const CarouselContext = React.createContext(null)
+
+function useCarousel() {
+ const context = React.useContext(CarouselContext)
+
+ if (!context) {
+ throw new Error("useCarousel must be used within a ")
+ }
+
+ return context
+}
+
+const Carousel = React.forwardRef<
+ HTMLDivElement,
+ React.HTMLAttributes & CarouselProps
+>(
+ (
+ {
+ orientation = "horizontal",
+ opts,
+ setApi,
+ plugins,
+ className,
+ children,
+ ...props
+ },
+ ref
+ ) => {
+ const [carouselRef, api] = useEmblaCarousel(
+ {
+ ...opts,
+ axis: orientation === "horizontal" ? "x" : "y",
+ },
+ plugins
+ )
+ const [canScrollPrev, setCanScrollPrev] = React.useState(false)
+ const [canScrollNext, setCanScrollNext] = React.useState(false)
+
+ const onSelect = React.useCallback((api: CarouselApi) => {
+ if (!api) {
+ return
+ }
+
+ setCanScrollPrev(api.canScrollPrev())
+ setCanScrollNext(api.canScrollNext())
+ }, [])
+
+ const scrollPrev = React.useCallback(() => {
+ api?.scrollPrev()
+ }, [api])
+
+ const scrollNext = React.useCallback(() => {
+ api?.scrollNext()
+ }, [api])
+
+ const handleKeyDown = React.useCallback(
+ (event: React.KeyboardEvent) => {
+ if (event.key === "ArrowLeft") {
+ event.preventDefault()
+ scrollPrev()
+ } else if (event.key === "ArrowRight") {
+ event.preventDefault()
+ scrollNext()
+ }
+ },
+ [scrollPrev, scrollNext]
+ )
+
+ React.useEffect(() => {
+ if (!api || !setApi) {
+ return
+ }
+
+ setApi(api)
+ }, [api, setApi])
+
+ React.useEffect(() => {
+ if (!api) {
+ return
+ }
+
+ onSelect(api)
+ api.on("reInit", onSelect)
+ api.on("select", onSelect)
+
+ return () => {
+ api?.off("select", onSelect)
+ }
+ }, [api, onSelect])
+
+ return (
+
+
+ {children}
+
+
+ )
+ }
+)
+Carousel.displayName = "Carousel"
+
+const CarouselContent = React.forwardRef<
+ HTMLDivElement,
+ React.HTMLAttributes
+>(({ className, ...props }, ref) => {
+ const { carouselRef, orientation } = useCarousel()
+
+ return (
+
+ )
+})
+CarouselContent.displayName = "CarouselContent"
+
+const CarouselItem = React.forwardRef<
+ HTMLDivElement,
+ React.HTMLAttributes
+>(({ className, ...props }, ref) => {
+ const { orientation } = useCarousel()
+
+ return (
+
+ )
+})
+CarouselItem.displayName = "CarouselItem"
+
+const CarouselPrevious = React.forwardRef<
+ HTMLButtonElement,
+ React.ComponentProps
+>(({ className, variant = "outline", size = "icon", ...props }, ref) => {
+ const { orientation, scrollPrev, canScrollPrev } = useCarousel()
+
+ return (
+
+
+ Previous slide
+
+ )
+})
+CarouselPrevious.displayName = "CarouselPrevious"
+
+const CarouselNext = React.forwardRef<
+ HTMLButtonElement,
+ React.ComponentProps
+>(({ className, variant = "outline", size = "icon", ...props }, ref) => {
+ const { orientation, scrollNext, canScrollNext } = useCarousel()
+
+ return (
+
+
+ Next slide
+
+ )
+})
+CarouselNext.displayName = "CarouselNext"
+
+export {
+ type CarouselApi,
+ Carousel,
+ CarouselContent,
+ CarouselItem,
+ CarouselPrevious,
+ CarouselNext,
+}
diff --git a/apps/www/__registry__/default/ui/checkbox.tsx b/apps/www/__registry__/default/ui/checkbox.tsx
new file mode 100644
index 00000000000..df61a138815
--- /dev/null
+++ b/apps/www/__registry__/default/ui/checkbox.tsx
@@ -0,0 +1,30 @@
+"use client"
+
+import * as React from "react"
+import * as CheckboxPrimitive from "@radix-ui/react-checkbox"
+import { Check } from "lucide-react"
+
+import { cn } from "@/lib/utils"
+
+const Checkbox = React.forwardRef<
+ React.ElementRef,
+ React.ComponentPropsWithoutRef
+>(({ className, ...props }, ref) => (
+
+
+
+
+
+))
+Checkbox.displayName = CheckboxPrimitive.Root.displayName
+
+export { Checkbox }
diff --git a/apps/www/__registry__/default/ui/collapsible.tsx b/apps/www/__registry__/default/ui/collapsible.tsx
new file mode 100644
index 00000000000..9fa48946afd
--- /dev/null
+++ b/apps/www/__registry__/default/ui/collapsible.tsx
@@ -0,0 +1,11 @@
+"use client"
+
+import * as CollapsiblePrimitive from "@radix-ui/react-collapsible"
+
+const Collapsible = CollapsiblePrimitive.Root
+
+const CollapsibleTrigger = CollapsiblePrimitive.CollapsibleTrigger
+
+const CollapsibleContent = CollapsiblePrimitive.CollapsibleContent
+
+export { Collapsible, CollapsibleTrigger, CollapsibleContent }
diff --git a/apps/www/__registry__/default/ui/command.tsx b/apps/www/__registry__/default/ui/command.tsx
new file mode 100644
index 00000000000..40f34c13c6a
--- /dev/null
+++ b/apps/www/__registry__/default/ui/command.tsx
@@ -0,0 +1,155 @@
+"use client"
+
+import * as React from "react"
+import { type DialogProps } from "@radix-ui/react-dialog"
+import { Command as CommandPrimitive } from "cmdk"
+import { Search } from "lucide-react"
+
+import { cn } from "@/lib/utils"
+import { Dialog, DialogContent } from "@/registry/default/ui/dialog"
+
+const Command = React.forwardRef<
+ React.ElementRef,
+ React.ComponentPropsWithoutRef
+>(({ className, ...props }, ref) => (
+
+))
+Command.displayName = CommandPrimitive.displayName
+
+interface CommandDialogProps extends DialogProps {}
+
+const CommandDialog = ({ children, ...props }: CommandDialogProps) => {
+ return (
+
+
+
+ {children}
+
+
+
+ )
+}
+
+const CommandInput = React.forwardRef<
+ React.ElementRef,
+ React.ComponentPropsWithoutRef
+>(({ className, ...props }, ref) => (
+
+
+
+
+))
+
+CommandInput.displayName = CommandPrimitive.Input.displayName
+
+const CommandList = React.forwardRef<
+ React.ElementRef,
+ React.ComponentPropsWithoutRef
+>(({ className, ...props }, ref) => (
+
+))
+
+CommandList.displayName = CommandPrimitive.List.displayName
+
+const CommandEmpty = React.forwardRef<
+ React.ElementRef,
+ React.ComponentPropsWithoutRef
+>((props, ref) => (
+
+))
+
+CommandEmpty.displayName = CommandPrimitive.Empty.displayName
+
+const CommandGroup = React.forwardRef<
+ React.ElementRef,
+ React.ComponentPropsWithoutRef
+>(({ className, ...props }, ref) => (
+
+))
+
+CommandGroup.displayName = CommandPrimitive.Group.displayName
+
+const CommandSeparator = React.forwardRef<
+ React.ElementRef,
+ React.ComponentPropsWithoutRef
+>(({ className, ...props }, ref) => (
+
+))
+CommandSeparator.displayName = CommandPrimitive.Separator.displayName
+
+const CommandItem = React.forwardRef<
+ React.ElementRef,
+ React.ComponentPropsWithoutRef
+>(({ className, ...props }, ref) => (
+
+))
+
+CommandItem.displayName = CommandPrimitive.Item.displayName
+
+const CommandShortcut = ({
+ className,
+ ...props
+}: React.HTMLAttributes) => {
+ return (
+
+ )
+}
+CommandShortcut.displayName = "CommandShortcut"
+
+export {
+ Command,
+ CommandDialog,
+ CommandInput,
+ CommandList,
+ CommandEmpty,
+ CommandGroup,
+ CommandItem,
+ CommandShortcut,
+ CommandSeparator,
+}
diff --git a/apps/www/__registry__/default/ui/context-menu.tsx b/apps/www/__registry__/default/ui/context-menu.tsx
new file mode 100644
index 00000000000..93ef37ba98d
--- /dev/null
+++ b/apps/www/__registry__/default/ui/context-menu.tsx
@@ -0,0 +1,200 @@
+"use client"
+
+import * as React from "react"
+import * as ContextMenuPrimitive from "@radix-ui/react-context-menu"
+import { Check, ChevronRight, Circle } from "lucide-react"
+
+import { cn } from "@/lib/utils"
+
+const ContextMenu = ContextMenuPrimitive.Root
+
+const ContextMenuTrigger = ContextMenuPrimitive.Trigger
+
+const ContextMenuGroup = ContextMenuPrimitive.Group
+
+const ContextMenuPortal = ContextMenuPrimitive.Portal
+
+const ContextMenuSub = ContextMenuPrimitive.Sub
+
+const ContextMenuRadioGroup = ContextMenuPrimitive.RadioGroup
+
+const ContextMenuSubTrigger = React.forwardRef<
+ React.ElementRef,
+ React.ComponentPropsWithoutRef & {
+ inset?: boolean
+ }
+>(({ className, inset, children, ...props }, ref) => (
+
+ {children}
+
+
+))
+ContextMenuSubTrigger.displayName = ContextMenuPrimitive.SubTrigger.displayName
+
+const ContextMenuSubContent = React.forwardRef<
+ React.ElementRef,
+ React.ComponentPropsWithoutRef
+>(({ className, ...props }, ref) => (
+
+))
+ContextMenuSubContent.displayName = ContextMenuPrimitive.SubContent.displayName
+
+const ContextMenuContent = React.forwardRef<
+ React.ElementRef,
+ React.ComponentPropsWithoutRef
+>(({ className, ...props }, ref) => (
+
+
+
+))
+ContextMenuContent.displayName = ContextMenuPrimitive.Content.displayName
+
+const ContextMenuItem = React.forwardRef<
+ React.ElementRef,
+ React.ComponentPropsWithoutRef & {
+ inset?: boolean
+ }
+>(({ className, inset, ...props }, ref) => (
+
+))
+ContextMenuItem.displayName = ContextMenuPrimitive.Item.displayName
+
+const ContextMenuCheckboxItem = React.forwardRef<
+ React.ElementRef,
+ React.ComponentPropsWithoutRef
+>(({ className, children, checked, ...props }, ref) => (
+
+
+
+
+
+
+ {children}
+
+))
+ContextMenuCheckboxItem.displayName =
+ ContextMenuPrimitive.CheckboxItem.displayName
+
+const ContextMenuRadioItem = React.forwardRef<
+ React.ElementRef,
+ React.ComponentPropsWithoutRef
+>(({ className, children, ...props }, ref) => (
+
+
+
+
+
+
+ {children}
+
+))
+ContextMenuRadioItem.displayName = ContextMenuPrimitive.RadioItem.displayName
+
+const ContextMenuLabel = React.forwardRef<
+ React.ElementRef,
+ React.ComponentPropsWithoutRef & {
+ inset?: boolean
+ }
+>(({ className, inset, ...props }, ref) => (
+
+))
+ContextMenuLabel.displayName = ContextMenuPrimitive.Label.displayName
+
+const ContextMenuSeparator = React.forwardRef<
+ React.ElementRef,
+ React.ComponentPropsWithoutRef
+>(({ className, ...props }, ref) => (
+
+))
+ContextMenuSeparator.displayName = ContextMenuPrimitive.Separator.displayName
+
+const ContextMenuShortcut = ({
+ className,
+ ...props
+}: React.HTMLAttributes) => {
+ return (
+
+ )
+}
+ContextMenuShortcut.displayName = "ContextMenuShortcut"
+
+export {
+ ContextMenu,
+ ContextMenuTrigger,
+ ContextMenuContent,
+ ContextMenuItem,
+ ContextMenuCheckboxItem,
+ ContextMenuRadioItem,
+ ContextMenuLabel,
+ ContextMenuSeparator,
+ ContextMenuShortcut,
+ ContextMenuGroup,
+ ContextMenuPortal,
+ ContextMenuSub,
+ ContextMenuSubContent,
+ ContextMenuSubTrigger,
+ ContextMenuRadioGroup,
+}
diff --git a/apps/www/__registry__/default/ui/dialog.tsx b/apps/www/__registry__/default/ui/dialog.tsx
new file mode 100644
index 00000000000..01ff19c7e45
--- /dev/null
+++ b/apps/www/__registry__/default/ui/dialog.tsx
@@ -0,0 +1,122 @@
+"use client"
+
+import * as React from "react"
+import * as DialogPrimitive from "@radix-ui/react-dialog"
+import { X } from "lucide-react"
+
+import { cn } from "@/lib/utils"
+
+const Dialog = DialogPrimitive.Root
+
+const DialogTrigger = DialogPrimitive.Trigger
+
+const DialogPortal = DialogPrimitive.Portal
+
+const DialogClose = DialogPrimitive.Close
+
+const DialogOverlay = React.forwardRef<
+ React.ElementRef,
+ React.ComponentPropsWithoutRef
+>(({ className, ...props }, ref) => (
+
+))
+DialogOverlay.displayName = DialogPrimitive.Overlay.displayName
+
+const DialogContent = React.forwardRef<
+ React.ElementRef,
+ React.ComponentPropsWithoutRef
+>(({ className, children, ...props }, ref) => (
+
+
+
+ {children}
+
+
+ Close
+
+
+
+))
+DialogContent.displayName = DialogPrimitive.Content.displayName
+
+const DialogHeader = ({
+ className,
+ ...props
+}: React.HTMLAttributes) => (
+
+)
+DialogHeader.displayName = "DialogHeader"
+
+const DialogFooter = ({
+ className,
+ ...props
+}: React.HTMLAttributes) => (
+
+)
+DialogFooter.displayName = "DialogFooter"
+
+const DialogTitle = React.forwardRef<
+ React.ElementRef,
+ React.ComponentPropsWithoutRef
+>(({ className, ...props }, ref) => (
+
+))
+DialogTitle.displayName = DialogPrimitive.Title.displayName
+
+const DialogDescription = React.forwardRef<
+ React.ElementRef,
+ React.ComponentPropsWithoutRef
+>(({ className, ...props }, ref) => (
+
+))
+DialogDescription.displayName = DialogPrimitive.Description.displayName
+
+export {
+ Dialog,
+ DialogPortal,
+ DialogOverlay,
+ DialogClose,
+ DialogTrigger,
+ DialogContent,
+ DialogHeader,
+ DialogFooter,
+ DialogTitle,
+ DialogDescription,
+}
diff --git a/apps/www/__registry__/default/ui/drawer.tsx b/apps/www/__registry__/default/ui/drawer.tsx
new file mode 100644
index 00000000000..6a0ef53dde8
--- /dev/null
+++ b/apps/www/__registry__/default/ui/drawer.tsx
@@ -0,0 +1,118 @@
+"use client"
+
+import * as React from "react"
+import { Drawer as DrawerPrimitive } from "vaul"
+
+import { cn } from "@/lib/utils"
+
+const Drawer = ({
+ shouldScaleBackground = true,
+ ...props
+}: React.ComponentProps) => (
+
+)
+Drawer.displayName = "Drawer"
+
+const DrawerTrigger = DrawerPrimitive.Trigger
+
+const DrawerPortal = DrawerPrimitive.Portal
+
+const DrawerClose = DrawerPrimitive.Close
+
+const DrawerOverlay = React.forwardRef<
+ React.ElementRef,
+ React.ComponentPropsWithoutRef
+>(({ className, ...props }, ref) => (
+
+))
+DrawerOverlay.displayName = DrawerPrimitive.Overlay.displayName
+
+const DrawerContent = React.forwardRef<
+ React.ElementRef,
+ React.ComponentPropsWithoutRef
+>(({ className, children, ...props }, ref) => (
+
+
+
+
+ {children}
+
+
+))
+DrawerContent.displayName = "DrawerContent"
+
+const DrawerHeader = ({
+ className,
+ ...props
+}: React.HTMLAttributes) => (
+
+)
+DrawerHeader.displayName = "DrawerHeader"
+
+const DrawerFooter = ({
+ className,
+ ...props
+}: React.HTMLAttributes) => (
+
+)
+DrawerFooter.displayName = "DrawerFooter"
+
+const DrawerTitle = React.forwardRef<
+ React.ElementRef,
+ React.ComponentPropsWithoutRef
+>(({ className, ...props }, ref) => (
+
+))
+DrawerTitle.displayName = DrawerPrimitive.Title.displayName
+
+const DrawerDescription = React.forwardRef<
+ React.ElementRef,
+ React.ComponentPropsWithoutRef
+>(({ className, ...props }, ref) => (
+
+))
+DrawerDescription.displayName = DrawerPrimitive.Description.displayName
+
+export {
+ Drawer,
+ DrawerPortal,
+ DrawerOverlay,
+ DrawerTrigger,
+ DrawerClose,
+ DrawerContent,
+ DrawerHeader,
+ DrawerFooter,
+ DrawerTitle,
+ DrawerDescription,
+}
diff --git a/apps/www/__registry__/default/ui/dropdown-menu.tsx b/apps/www/__registry__/default/ui/dropdown-menu.tsx
new file mode 100644
index 00000000000..f69a0d64caf
--- /dev/null
+++ b/apps/www/__registry__/default/ui/dropdown-menu.tsx
@@ -0,0 +1,200 @@
+"use client"
+
+import * as React from "react"
+import * as DropdownMenuPrimitive from "@radix-ui/react-dropdown-menu"
+import { Check, ChevronRight, Circle } from "lucide-react"
+
+import { cn } from "@/lib/utils"
+
+const DropdownMenu = DropdownMenuPrimitive.Root
+
+const DropdownMenuTrigger = DropdownMenuPrimitive.Trigger
+
+const DropdownMenuGroup = DropdownMenuPrimitive.Group
+
+const DropdownMenuPortal = DropdownMenuPrimitive.Portal
+
+const DropdownMenuSub = DropdownMenuPrimitive.Sub
+
+const DropdownMenuRadioGroup = DropdownMenuPrimitive.RadioGroup
+
+const DropdownMenuSubTrigger = React.forwardRef<
+ React.ElementRef,
+ React.ComponentPropsWithoutRef & {
+ inset?: boolean
+ }
+>(({ className, inset, children, ...props }, ref) => (
+
+ {children}
+
+
+))
+DropdownMenuSubTrigger.displayName =
+ DropdownMenuPrimitive.SubTrigger.displayName
+
+const DropdownMenuSubContent = React.forwardRef<
+ React.ElementRef,
+ React.ComponentPropsWithoutRef
+>(({ className, ...props }, ref) => (
+
+))
+DropdownMenuSubContent.displayName =
+ DropdownMenuPrimitive.SubContent.displayName
+
+const DropdownMenuContent = React.forwardRef<
+ React.ElementRef,
+ React.ComponentPropsWithoutRef
+>(({ className, sideOffset = 4, ...props }, ref) => (
+
+
+
+))
+DropdownMenuContent.displayName = DropdownMenuPrimitive.Content.displayName
+
+const DropdownMenuItem = React.forwardRef<
+ React.ElementRef,
+ React.ComponentPropsWithoutRef & {
+ inset?: boolean
+ }
+>(({ className, inset, ...props }, ref) => (
+
+))
+DropdownMenuItem.displayName = DropdownMenuPrimitive.Item.displayName
+
+const DropdownMenuCheckboxItem = React.forwardRef<
+ React.ElementRef,
+ React.ComponentPropsWithoutRef
+>(({ className, children, checked, ...props }, ref) => (
+
+
+
+
+
+
+ {children}
+
+))
+DropdownMenuCheckboxItem.displayName =
+ DropdownMenuPrimitive.CheckboxItem.displayName
+
+const DropdownMenuRadioItem = React.forwardRef<
+ React.ElementRef,
+ React.ComponentPropsWithoutRef
+>(({ className, children, ...props }, ref) => (
+
+
+
+
+
+
+ {children}
+
+))
+DropdownMenuRadioItem.displayName = DropdownMenuPrimitive.RadioItem.displayName
+
+const DropdownMenuLabel = React.forwardRef<
+ React.ElementRef,
+ React.ComponentPropsWithoutRef & {
+ inset?: boolean
+ }
+>(({ className, inset, ...props }, ref) => (
+
+))
+DropdownMenuLabel.displayName = DropdownMenuPrimitive.Label.displayName
+
+const DropdownMenuSeparator = React.forwardRef<
+ React.ElementRef,
+ React.ComponentPropsWithoutRef
+>(({ className, ...props }, ref) => (
+
+))
+DropdownMenuSeparator.displayName = DropdownMenuPrimitive.Separator.displayName
+
+const DropdownMenuShortcut = ({
+ className,
+ ...props
+}: React.HTMLAttributes) => {
+ return (
+
+ )
+}
+DropdownMenuShortcut.displayName = "DropdownMenuShortcut"
+
+export {
+ DropdownMenu,
+ DropdownMenuTrigger,
+ DropdownMenuContent,
+ DropdownMenuItem,
+ DropdownMenuCheckboxItem,
+ DropdownMenuRadioItem,
+ DropdownMenuLabel,
+ DropdownMenuSeparator,
+ DropdownMenuShortcut,
+ DropdownMenuGroup,
+ DropdownMenuPortal,
+ DropdownMenuSub,
+ DropdownMenuSubContent,
+ DropdownMenuSubTrigger,
+ DropdownMenuRadioGroup,
+}
diff --git a/apps/www/__registry__/default/ui/form.tsx b/apps/www/__registry__/default/ui/form.tsx
new file mode 100644
index 00000000000..d394ccc1a2d
--- /dev/null
+++ b/apps/www/__registry__/default/ui/form.tsx
@@ -0,0 +1,176 @@
+import * as React from "react"
+import * as LabelPrimitive from "@radix-ui/react-label"
+import { Slot } from "@radix-ui/react-slot"
+import {
+ Controller,
+ ControllerProps,
+ FieldPath,
+ FieldValues,
+ FormProvider,
+ useFormContext,
+} from "react-hook-form"
+
+import { cn } from "@/lib/utils"
+import { Label } from "@/registry/default/ui/label"
+
+const Form = FormProvider
+
+type FormFieldContextValue<
+ TFieldValues extends FieldValues = FieldValues,
+ TName extends FieldPath = FieldPath
+> = {
+ name: TName
+}
+
+const FormFieldContext = React.createContext(
+ {} as FormFieldContextValue
+)
+
+const FormField = <
+ TFieldValues extends FieldValues = FieldValues,
+ TName extends FieldPath = FieldPath
+>({
+ ...props
+}: ControllerProps) => {
+ return (
+
+
+
+ )
+}
+
+const useFormField = () => {
+ const fieldContext = React.useContext(FormFieldContext)
+ const itemContext = React.useContext(FormItemContext)
+ const { getFieldState, formState } = useFormContext()
+
+ const fieldState = getFieldState(fieldContext.name, formState)
+
+ if (!fieldContext) {
+ throw new Error("useFormField should be used within ")
+ }
+
+ const { id } = itemContext
+
+ return {
+ id,
+ name: fieldContext.name,
+ formItemId: `${id}-form-item`,
+ formDescriptionId: `${id}-form-item-description`,
+ formMessageId: `${id}-form-item-message`,
+ ...fieldState,
+ }
+}
+
+type FormItemContextValue = {
+ id: string
+}
+
+const FormItemContext = React.createContext(
+ {} as FormItemContextValue
+)
+
+const FormItem = React.forwardRef<
+ HTMLDivElement,
+ React.HTMLAttributes
+>(({ className, ...props }, ref) => {
+ const id = React.useId()
+
+ return (
+
+
+
+ )
+})
+FormItem.displayName = "FormItem"
+
+const FormLabel = React.forwardRef<
+ React.ElementRef,
+ React.ComponentPropsWithoutRef
+>(({ className, ...props }, ref) => {
+ const { error, formItemId } = useFormField()
+
+ return (
+
+ )
+})
+FormLabel.displayName = "FormLabel"
+
+const FormControl = React.forwardRef<
+ React.ElementRef,
+ React.ComponentPropsWithoutRef
+>(({ ...props }, ref) => {
+ const { error, formItemId, formDescriptionId, formMessageId } = useFormField()
+
+ return (
+
+ )
+})
+FormControl.displayName = "FormControl"
+
+const FormDescription = React.forwardRef<
+ HTMLParagraphElement,
+ React.HTMLAttributes
+>(({ className, ...props }, ref) => {
+ const { formDescriptionId } = useFormField()
+
+ return (
+
+ )
+})
+FormDescription.displayName = "FormDescription"
+
+const FormMessage = React.forwardRef<
+ HTMLParagraphElement,
+ React.HTMLAttributes
+>(({ className, children, ...props }, ref) => {
+ const { error, formMessageId } = useFormField()
+ const body = error ? String(error?.message) : children
+
+ if (!body) {
+ return null
+ }
+
+ return (
+
+ {body}
+
+ )
+})
+FormMessage.displayName = "FormMessage"
+
+export {
+ useFormField,
+ Form,
+ FormItem,
+ FormLabel,
+ FormControl,
+ FormDescription,
+ FormMessage,
+ FormField,
+}
diff --git a/apps/www/__registry__/default/ui/hover-card.tsx b/apps/www/__registry__/default/ui/hover-card.tsx
new file mode 100644
index 00000000000..e54d91cf81f
--- /dev/null
+++ b/apps/www/__registry__/default/ui/hover-card.tsx
@@ -0,0 +1,29 @@
+"use client"
+
+import * as React from "react"
+import * as HoverCardPrimitive from "@radix-ui/react-hover-card"
+
+import { cn } from "@/lib/utils"
+
+const HoverCard = HoverCardPrimitive.Root
+
+const HoverCardTrigger = HoverCardPrimitive.Trigger
+
+const HoverCardContent = React.forwardRef<
+ React.ElementRef,
+ React.ComponentPropsWithoutRef
+>(({ className, align = "center", sideOffset = 4, ...props }, ref) => (
+
+))
+HoverCardContent.displayName = HoverCardPrimitive.Content.displayName
+
+export { HoverCard, HoverCardTrigger, HoverCardContent }
diff --git a/apps/www/__registry__/default/ui/input-otp.tsx b/apps/www/__registry__/default/ui/input-otp.tsx
new file mode 100644
index 00000000000..f66fcfa0ddb
--- /dev/null
+++ b/apps/www/__registry__/default/ui/input-otp.tsx
@@ -0,0 +1,71 @@
+"use client"
+
+import * as React from "react"
+import { OTPInput, OTPInputContext } from "input-otp"
+import { Dot } from "lucide-react"
+
+import { cn } from "@/lib/utils"
+
+const InputOTP = React.forwardRef<
+ React.ElementRef,
+ React.ComponentPropsWithoutRef
+>(({ className, containerClassName, ...props }, ref) => (
+
+))
+InputOTP.displayName = "InputOTP"
+
+const InputOTPGroup = React.forwardRef<
+ React.ElementRef<"div">,
+ React.ComponentPropsWithoutRef<"div">
+>(({ className, ...props }, ref) => (
+
+))
+InputOTPGroup.displayName = "InputOTPGroup"
+
+const InputOTPSlot = React.forwardRef<
+ React.ElementRef<"div">,
+ React.ComponentPropsWithoutRef<"div"> & { index: number }
+>(({ index, className, ...props }, ref) => {
+ const inputOTPContext = React.useContext(OTPInputContext)
+ const { char, hasFakeCaret, isActive } = inputOTPContext.slots[index]
+
+ return (
+
+ {char}
+ {hasFakeCaret && (
+
+ )}
+
+ )
+})
+InputOTPSlot.displayName = "InputOTPSlot"
+
+const InputOTPSeparator = React.forwardRef<
+ React.ElementRef<"div">,
+ React.ComponentPropsWithoutRef<"div">
+>(({ ...props }, ref) => (
+
+
+
+))
+InputOTPSeparator.displayName = "InputOTPSeparator"
+
+export { InputOTP, InputOTPGroup, InputOTPSlot, InputOTPSeparator }
diff --git a/apps/www/__registry__/default/ui/input.tsx b/apps/www/__registry__/default/ui/input.tsx
new file mode 100644
index 00000000000..677d05fd6c1
--- /dev/null
+++ b/apps/www/__registry__/default/ui/input.tsx
@@ -0,0 +1,25 @@
+import * as React from "react"
+
+import { cn } from "@/lib/utils"
+
+export interface InputProps
+ extends React.InputHTMLAttributes {}
+
+const Input = React.forwardRef(
+ ({ className, type, ...props }, ref) => {
+ return (
+
+ )
+ }
+)
+Input.displayName = "Input"
+
+export { Input }
diff --git a/apps/www/__registry__/default/ui/label.tsx b/apps/www/__registry__/default/ui/label.tsx
new file mode 100644
index 00000000000..534182176bf
--- /dev/null
+++ b/apps/www/__registry__/default/ui/label.tsx
@@ -0,0 +1,26 @@
+"use client"
+
+import * as React from "react"
+import * as LabelPrimitive from "@radix-ui/react-label"
+import { cva, type VariantProps } from "class-variance-authority"
+
+import { cn } from "@/lib/utils"
+
+const labelVariants = cva(
+ "text-sm font-medium leading-none peer-disabled:cursor-not-allowed peer-disabled:opacity-70"
+)
+
+const Label = React.forwardRef<
+ React.ElementRef,
+ React.ComponentPropsWithoutRef &
+ VariantProps
+>(({ className, ...props }, ref) => (
+
+))
+Label.displayName = LabelPrimitive.Root.displayName
+
+export { Label }
diff --git a/apps/www/__registry__/default/ui/menubar.tsx b/apps/www/__registry__/default/ui/menubar.tsx
new file mode 100644
index 00000000000..5586fa9b21f
--- /dev/null
+++ b/apps/www/__registry__/default/ui/menubar.tsx
@@ -0,0 +1,236 @@
+"use client"
+
+import * as React from "react"
+import * as MenubarPrimitive from "@radix-ui/react-menubar"
+import { Check, ChevronRight, Circle } from "lucide-react"
+
+import { cn } from "@/lib/utils"
+
+const MenubarMenu = MenubarPrimitive.Menu
+
+const MenubarGroup = MenubarPrimitive.Group
+
+const MenubarPortal = MenubarPrimitive.Portal
+
+const MenubarSub = MenubarPrimitive.Sub
+
+const MenubarRadioGroup = MenubarPrimitive.RadioGroup
+
+const Menubar = React.forwardRef<
+ React.ElementRef,
+ React.ComponentPropsWithoutRef
+>(({ className, ...props }, ref) => (
+
+))
+Menubar.displayName = MenubarPrimitive.Root.displayName
+
+const MenubarTrigger = React.forwardRef<
+ React.ElementRef,
+ React.ComponentPropsWithoutRef
+>(({ className, ...props }, ref) => (
+
+))
+MenubarTrigger.displayName = MenubarPrimitive.Trigger.displayName
+
+const MenubarSubTrigger = React.forwardRef<
+ React.ElementRef,
+ React.ComponentPropsWithoutRef & {
+ inset?: boolean
+ }
+>(({ className, inset, children, ...props }, ref) => (
+
+ {children}
+
+
+))
+MenubarSubTrigger.displayName = MenubarPrimitive.SubTrigger.displayName
+
+const MenubarSubContent = React.forwardRef<
+ React.ElementRef,
+ React.ComponentPropsWithoutRef
+>(({ className, ...props }, ref) => (
+
+))
+MenubarSubContent.displayName = MenubarPrimitive.SubContent.displayName
+
+const MenubarContent = React.forwardRef<
+ React.ElementRef,
+ React.ComponentPropsWithoutRef
+>(
+ (
+ { className, align = "start", alignOffset = -4, sideOffset = 8, ...props },
+ ref
+ ) => (
+
+
+
+ )
+)
+MenubarContent.displayName = MenubarPrimitive.Content.displayName
+
+const MenubarItem = React.forwardRef<
+ React.ElementRef,
+ React.ComponentPropsWithoutRef & {
+ inset?: boolean
+ }
+>(({ className, inset, ...props }, ref) => (
+
+))
+MenubarItem.displayName = MenubarPrimitive.Item.displayName
+
+const MenubarCheckboxItem = React.forwardRef<
+ React.ElementRef,
+ React.ComponentPropsWithoutRef
+>(({ className, children, checked, ...props }, ref) => (
+
+
+
+
+
+
+ {children}
+
+))
+MenubarCheckboxItem.displayName = MenubarPrimitive.CheckboxItem.displayName
+
+const MenubarRadioItem = React.forwardRef<
+ React.ElementRef,
+ React.ComponentPropsWithoutRef
+>(({ className, children, ...props }, ref) => (
+
+
+
+
+
+
+ {children}
+
+))
+MenubarRadioItem.displayName = MenubarPrimitive.RadioItem.displayName
+
+const MenubarLabel = React.forwardRef<
+ React.ElementRef,
+ React.ComponentPropsWithoutRef & {
+ inset?: boolean
+ }
+>(({ className, inset, ...props }, ref) => (
+
+))
+MenubarLabel.displayName = MenubarPrimitive.Label.displayName
+
+const MenubarSeparator = React.forwardRef<
+ React.ElementRef,
+ React.ComponentPropsWithoutRef
+>(({ className, ...props }, ref) => (
+
+))
+MenubarSeparator.displayName = MenubarPrimitive.Separator.displayName
+
+const MenubarShortcut = ({
+ className,
+ ...props
+}: React.HTMLAttributes) => {
+ return (
+
+ )
+}
+MenubarShortcut.displayname = "MenubarShortcut"
+
+export {
+ Menubar,
+ MenubarMenu,
+ MenubarTrigger,
+ MenubarContent,
+ MenubarItem,
+ MenubarSeparator,
+ MenubarLabel,
+ MenubarCheckboxItem,
+ MenubarRadioGroup,
+ MenubarRadioItem,
+ MenubarPortal,
+ MenubarSubContent,
+ MenubarSubTrigger,
+ MenubarGroup,
+ MenubarSub,
+ MenubarShortcut,
+}
diff --git a/apps/www/__registry__/default/ui/navigation-menu.tsx b/apps/www/__registry__/default/ui/navigation-menu.tsx
new file mode 100644
index 00000000000..1419f56695b
--- /dev/null
+++ b/apps/www/__registry__/default/ui/navigation-menu.tsx
@@ -0,0 +1,128 @@
+import * as React from "react"
+import * as NavigationMenuPrimitive from "@radix-ui/react-navigation-menu"
+import { cva } from "class-variance-authority"
+import { ChevronDown } from "lucide-react"
+
+import { cn } from "@/lib/utils"
+
+const NavigationMenu = React.forwardRef<
+ React.ElementRef,
+ React.ComponentPropsWithoutRef
+>(({ className, children, ...props }, ref) => (
+
+ {children}
+
+
+))
+NavigationMenu.displayName = NavigationMenuPrimitive.Root.displayName
+
+const NavigationMenuList = React.forwardRef<
+ React.ElementRef,
+ React.ComponentPropsWithoutRef
+>(({ className, ...props }, ref) => (
+
+))
+NavigationMenuList.displayName = NavigationMenuPrimitive.List.displayName
+
+const NavigationMenuItem = NavigationMenuPrimitive.Item
+
+const navigationMenuTriggerStyle = cva(
+ "group inline-flex h-10 w-max items-center justify-center rounded-md bg-background px-4 py-2 text-sm font-medium transition-colors hover:bg-accent hover:text-accent-foreground focus:bg-accent focus:text-accent-foreground focus:outline-none disabled:pointer-events-none disabled:opacity-50 data-[active]:bg-accent/50 data-[state=open]:bg-accent/50"
+)
+
+const NavigationMenuTrigger = React.forwardRef<
+ React.ElementRef,
+ React.ComponentPropsWithoutRef
+>(({ className, children, ...props }, ref) => (
+
+ {children}{" "}
+
+
+))
+NavigationMenuTrigger.displayName = NavigationMenuPrimitive.Trigger.displayName
+
+const NavigationMenuContent = React.forwardRef<
+ React.ElementRef,
+ React.ComponentPropsWithoutRef
+>(({ className, ...props }, ref) => (
+
+))
+NavigationMenuContent.displayName = NavigationMenuPrimitive.Content.displayName
+
+const NavigationMenuLink = NavigationMenuPrimitive.Link
+
+const NavigationMenuViewport = React.forwardRef<
+ React.ElementRef,
+ React.ComponentPropsWithoutRef
+>(({ className, ...props }, ref) => (
+
+
+
+))
+NavigationMenuViewport.displayName =
+ NavigationMenuPrimitive.Viewport.displayName
+
+const NavigationMenuIndicator = React.forwardRef<
+ React.ElementRef,
+ React.ComponentPropsWithoutRef
+>(({ className, ...props }, ref) => (
+
+
+
+))
+NavigationMenuIndicator.displayName =
+ NavigationMenuPrimitive.Indicator.displayName
+
+export {
+ navigationMenuTriggerStyle,
+ NavigationMenu,
+ NavigationMenuList,
+ NavigationMenuItem,
+ NavigationMenuContent,
+ NavigationMenuTrigger,
+ NavigationMenuLink,
+ NavigationMenuIndicator,
+ NavigationMenuViewport,
+}
diff --git a/apps/www/__registry__/default/ui/pagination.tsx b/apps/www/__registry__/default/ui/pagination.tsx
new file mode 100644
index 00000000000..ea2d4df8143
--- /dev/null
+++ b/apps/www/__registry__/default/ui/pagination.tsx
@@ -0,0 +1,117 @@
+import * as React from "react"
+import { ChevronLeft, ChevronRight, MoreHorizontal } from "lucide-react"
+
+import { cn } from "@/lib/utils"
+import { ButtonProps, buttonVariants } from "@/registry/default/ui/button"
+
+const Pagination = ({ className, ...props }: React.ComponentProps<"nav">) => (
+
+)
+Pagination.displayName = "Pagination"
+
+const PaginationContent = React.forwardRef<
+ HTMLUListElement,
+ React.ComponentProps<"ul">
+>(({ className, ...props }, ref) => (
+
+))
+PaginationContent.displayName = "PaginationContent"
+
+const PaginationItem = React.forwardRef<
+ HTMLLIElement,
+ React.ComponentProps<"li">
+>(({ className, ...props }, ref) => (
+
+))
+PaginationItem.displayName = "PaginationItem"
+
+type PaginationLinkProps = {
+ isActive?: boolean
+} & Pick &
+ React.ComponentProps<"a">
+
+const PaginationLink = ({
+ className,
+ isActive,
+ size = "icon",
+ ...props
+}: PaginationLinkProps) => (
+
+)
+PaginationLink.displayName = "PaginationLink"
+
+const PaginationPrevious = ({
+ className,
+ ...props
+}: React.ComponentProps) => (
+
+
+ Previous
+
+)
+PaginationPrevious.displayName = "PaginationPrevious"
+
+const PaginationNext = ({
+ className,
+ ...props
+}: React.ComponentProps) => (
+
+ Next
+
+
+)
+PaginationNext.displayName = "PaginationNext"
+
+const PaginationEllipsis = ({
+ className,
+ ...props
+}: React.ComponentProps<"span">) => (
+
+
+ More pages
+
+)
+PaginationEllipsis.displayName = "PaginationEllipsis"
+
+export {
+ Pagination,
+ PaginationContent,
+ PaginationEllipsis,
+ PaginationItem,
+ PaginationLink,
+ PaginationNext,
+ PaginationPrevious,
+}
diff --git a/apps/www/__registry__/default/ui/popover.tsx b/apps/www/__registry__/default/ui/popover.tsx
new file mode 100644
index 00000000000..a0ec48beee4
--- /dev/null
+++ b/apps/www/__registry__/default/ui/popover.tsx
@@ -0,0 +1,31 @@
+"use client"
+
+import * as React from "react"
+import * as PopoverPrimitive from "@radix-ui/react-popover"
+
+import { cn } from "@/lib/utils"
+
+const Popover = PopoverPrimitive.Root
+
+const PopoverTrigger = PopoverPrimitive.Trigger
+
+const PopoverContent = React.forwardRef<
+ React.ElementRef,
+ React.ComponentPropsWithoutRef
+>(({ className, align = "center", sideOffset = 4, ...props }, ref) => (
+
+
+
+))
+PopoverContent.displayName = PopoverPrimitive.Content.displayName
+
+export { Popover, PopoverTrigger, PopoverContent }
diff --git a/apps/www/__registry__/default/ui/progress.tsx b/apps/www/__registry__/default/ui/progress.tsx
new file mode 100644
index 00000000000..5c87ea48656
--- /dev/null
+++ b/apps/www/__registry__/default/ui/progress.tsx
@@ -0,0 +1,28 @@
+"use client"
+
+import * as React from "react"
+import * as ProgressPrimitive from "@radix-ui/react-progress"
+
+import { cn } from "@/lib/utils"
+
+const Progress = React.forwardRef<
+ React.ElementRef,
+ React.ComponentPropsWithoutRef
+>(({ className, value, ...props }, ref) => (
+
+
+
+))
+Progress.displayName = ProgressPrimitive.Root.displayName
+
+export { Progress }
diff --git a/apps/www/__registry__/default/ui/radio-group.tsx b/apps/www/__registry__/default/ui/radio-group.tsx
new file mode 100644
index 00000000000..e9bde179362
--- /dev/null
+++ b/apps/www/__registry__/default/ui/radio-group.tsx
@@ -0,0 +1,44 @@
+"use client"
+
+import * as React from "react"
+import * as RadioGroupPrimitive from "@radix-ui/react-radio-group"
+import { Circle } from "lucide-react"
+
+import { cn } from "@/lib/utils"
+
+const RadioGroup = React.forwardRef<
+ React.ElementRef,
+ React.ComponentPropsWithoutRef
+>(({ className, ...props }, ref) => {
+ return (
+
+ )
+})
+RadioGroup.displayName = RadioGroupPrimitive.Root.displayName
+
+const RadioGroupItem = React.forwardRef<
+ React.ElementRef,
+ React.ComponentPropsWithoutRef
+>(({ className, ...props }, ref) => {
+ return (
+
+
+
+
+
+ )
+})
+RadioGroupItem.displayName = RadioGroupPrimitive.Item.displayName
+
+export { RadioGroup, RadioGroupItem }
diff --git a/apps/www/__registry__/default/ui/resizable.tsx b/apps/www/__registry__/default/ui/resizable.tsx
new file mode 100644
index 00000000000..f4bc5586b67
--- /dev/null
+++ b/apps/www/__registry__/default/ui/resizable.tsx
@@ -0,0 +1,45 @@
+"use client"
+
+import { GripVertical } from "lucide-react"
+import * as ResizablePrimitive from "react-resizable-panels"
+
+import { cn } from "@/lib/utils"
+
+const ResizablePanelGroup = ({
+ className,
+ ...props
+}: React.ComponentProps) => (
+
+)
+
+const ResizablePanel = ResizablePrimitive.Panel
+
+const ResizableHandle = ({
+ withHandle,
+ className,
+ ...props
+}: React.ComponentProps & {
+ withHandle?: boolean
+}) => (
+ div]:rotate-90",
+ className
+ )}
+ {...props}
+ >
+ {withHandle && (
+
+
+
+ )}
+
+)
+
+export { ResizablePanelGroup, ResizablePanel, ResizableHandle }
diff --git a/apps/www/__registry__/default/ui/scroll-area.tsx b/apps/www/__registry__/default/ui/scroll-area.tsx
new file mode 100644
index 00000000000..0b4a48d87fa
--- /dev/null
+++ b/apps/www/__registry__/default/ui/scroll-area.tsx
@@ -0,0 +1,48 @@
+"use client"
+
+import * as React from "react"
+import * as ScrollAreaPrimitive from "@radix-ui/react-scroll-area"
+
+import { cn } from "@/lib/utils"
+
+const ScrollArea = React.forwardRef<
+ React.ElementRef,
+ React.ComponentPropsWithoutRef
+>(({ className, children, ...props }, ref) => (
+
+
+ {children}
+
+
+
+
+))
+ScrollArea.displayName = ScrollAreaPrimitive.Root.displayName
+
+const ScrollBar = React.forwardRef<
+ React.ElementRef,
+ React.ComponentPropsWithoutRef
+>(({ className, orientation = "vertical", ...props }, ref) => (
+
+
+
+))
+ScrollBar.displayName = ScrollAreaPrimitive.ScrollAreaScrollbar.displayName
+
+export { ScrollArea, ScrollBar }
diff --git a/apps/www/__registry__/default/ui/select.tsx b/apps/www/__registry__/default/ui/select.tsx
new file mode 100644
index 00000000000..cbe5a36b695
--- /dev/null
+++ b/apps/www/__registry__/default/ui/select.tsx
@@ -0,0 +1,160 @@
+"use client"
+
+import * as React from "react"
+import * as SelectPrimitive from "@radix-ui/react-select"
+import { Check, ChevronDown, ChevronUp } from "lucide-react"
+
+import { cn } from "@/lib/utils"
+
+const Select = SelectPrimitive.Root
+
+const SelectGroup = SelectPrimitive.Group
+
+const SelectValue = SelectPrimitive.Value
+
+const SelectTrigger = React.forwardRef<
+ React.ElementRef,
+ React.ComponentPropsWithoutRef
+>(({ className, children, ...props }, ref) => (
+ span]:line-clamp-1",
+ className
+ )}
+ {...props}
+ >
+ {children}
+
+
+
+
+))
+SelectTrigger.displayName = SelectPrimitive.Trigger.displayName
+
+const SelectScrollUpButton = React.forwardRef<
+ React.ElementRef,
+ React.ComponentPropsWithoutRef
+>(({ className, ...props }, ref) => (
+
+
+
+))
+SelectScrollUpButton.displayName = SelectPrimitive.ScrollUpButton.displayName
+
+const SelectScrollDownButton = React.forwardRef<
+ React.ElementRef,
+ React.ComponentPropsWithoutRef
+>(({ className, ...props }, ref) => (
+
+
+
+))
+SelectScrollDownButton.displayName =
+ SelectPrimitive.ScrollDownButton.displayName
+
+const SelectContent = React.forwardRef<
+ React.ElementRef,
+ React.ComponentPropsWithoutRef
+>(({ className, children, position = "popper", ...props }, ref) => (
+
+
+
+
+ {children}
+
+
+
+
+))
+SelectContent.displayName = SelectPrimitive.Content.displayName
+
+const SelectLabel = React.forwardRef<
+ React.ElementRef,
+ React.ComponentPropsWithoutRef
+>(({ className, ...props }, ref) => (
+
+))
+SelectLabel.displayName = SelectPrimitive.Label.displayName
+
+const SelectItem = React.forwardRef<
+ React.ElementRef,
+ React.ComponentPropsWithoutRef
+>(({ className, children, ...props }, ref) => (
+
+