mirror of
https://github.com/shadcn-ui/ui.git
synced 2026-06-26 22:26:05 +00:00
Compare commits
63 Commits
shadcn-ui@
...
shadcn-ui@
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
897376329b | ||
|
|
d3d52fc687 | ||
|
|
4d0864a5c2 | ||
|
|
e8f58932bd | ||
|
|
2f0dbca221 | ||
|
|
58d012e342 | ||
|
|
963114e118 | ||
|
|
0a4286500e | ||
|
|
ae845788f6 | ||
|
|
ccb2d695a7 | ||
|
|
b838ffe8cc | ||
|
|
7ce6c495bd | ||
|
|
c9ca64d2b9 | ||
|
|
4bb9e9de53 | ||
|
|
c21ecfb665 | ||
|
|
613ec3583f | ||
|
|
170d3c087c | ||
|
|
4b0fbe27fa | ||
|
|
c34193cd34 | ||
|
|
88fdc989e9 | ||
|
|
4506822389 | ||
|
|
33a5fc7966 | ||
|
|
33b77e2f31 | ||
|
|
e3769277d8 | ||
|
|
3992a7b19c | ||
|
|
52c23746bc | ||
|
|
f68976b667 | ||
|
|
7a1f80af2c | ||
|
|
646f715388 | ||
|
|
9441130f05 | ||
|
|
48e3a4a326 | ||
|
|
98078fbe01 | ||
|
|
8be9e5d966 | ||
|
|
a8b1ea7e55 | ||
|
|
3c9f7ca0e2 | ||
|
|
c598f19845 | ||
|
|
7962cee384 | ||
|
|
de3c34845b | ||
|
|
6a1354e52d | ||
|
|
1532a15894 | ||
|
|
8e5d080900 | ||
|
|
cf95943446 | ||
|
|
3210bed755 | ||
|
|
eaa91d43df | ||
|
|
8cf0c7f3ba | ||
|
|
da7729644c | ||
|
|
aca3ef97e3 | ||
|
|
c9fecd4cdf | ||
|
|
6cf598d47f | ||
|
|
91727ec460 | ||
|
|
5e172fc34f | ||
|
|
f461ab0910 | ||
|
|
26c8d0f662 | ||
|
|
ac5c727fc9 | ||
|
|
54b1f5b661 | ||
|
|
25a41cfe2a | ||
|
|
edc653c01e | ||
|
|
f78a4aaa28 | ||
|
|
b4dda36cc9 | ||
|
|
cbe0f1959c | ||
|
|
dbd3b8f066 | ||
|
|
7abb4019c3 | ||
|
|
b14081631f |
@@ -1,6 +1,6 @@
|
|||||||
{
|
{
|
||||||
"$schema": "https://unpkg.com/@changesets/config@2.3.0/schema.json",
|
"$schema": "https://unpkg.com/@changesets/config@2.3.0/schema.json",
|
||||||
"changelog": ["@changesets/changelog-github", { "repo": "shadcn/ui" }],
|
"changelog": ["@changesets/changelog-github", { "repo": "shadcn-ui/ui" }],
|
||||||
"commit": false,
|
"commit": false,
|
||||||
"fixed": [],
|
"fixed": [],
|
||||||
"linked": [],
|
"linked": [],
|
||||||
|
|||||||
2
.github/workflows/prerelease-comment.yml
vendored
2
.github/workflows/prerelease-comment.yml
vendored
@@ -10,7 +10,7 @@ on:
|
|||||||
jobs:
|
jobs:
|
||||||
comment:
|
comment:
|
||||||
if: |
|
if: |
|
||||||
github.repository_owner == 'shadcn' &&
|
github.repository_owner == 'shadcn-ui' &&
|
||||||
${{ github.event.workflow_run.conclusion == 'success' }}
|
${{ github.event.workflow_run.conclusion == 'success' }}
|
||||||
runs-on: ubuntu-latest
|
runs-on: ubuntu-latest
|
||||||
name: Write comment to the PR
|
name: Write comment to the PR
|
||||||
|
|||||||
2
.github/workflows/prerelease.yml
vendored
2
.github/workflows/prerelease.yml
vendored
@@ -10,7 +10,7 @@ on:
|
|||||||
jobs:
|
jobs:
|
||||||
prerelease:
|
prerelease:
|
||||||
if: |
|
if: |
|
||||||
github.repository_owner == 'shadcn' &&
|
github.repository_owner == 'shadcn-ui' &&
|
||||||
contains(github.event.pull_request.labels.*.name, '🚀 autorelease')
|
contains(github.event.pull_request.labels.*.name, '🚀 autorelease')
|
||||||
name: Build & Publish a beta release to NPM
|
name: Build & Publish a beta release to NPM
|
||||||
runs-on: ubuntu-latest
|
runs-on: ubuntu-latest
|
||||||
|
|||||||
2
.github/workflows/release.yml
vendored
2
.github/workflows/release.yml
vendored
@@ -9,7 +9,7 @@ on:
|
|||||||
|
|
||||||
jobs:
|
jobs:
|
||||||
release:
|
release:
|
||||||
if: ${{ github.repository_owner == 'shadcn' }}
|
if: ${{ github.repository_owner == 'shadcn-ui' }}
|
||||||
name: Create a PR for release workflow
|
name: Create a PR for release workflow
|
||||||
runs-on: ubuntu-latest
|
runs-on: ubuntu-latest
|
||||||
steps:
|
steps:
|
||||||
|
|||||||
162
CONTRIBUTING.md
Normal file
162
CONTRIBUTING.md
Normal file
@@ -0,0 +1,162 @@
|
|||||||
|
# Contributing
|
||||||
|
|
||||||
|
Thanks for your interest in contributing to ui.shadcn.com. We're happy to have you here.
|
||||||
|
|
||||||
|
Please take a moment to review this document before submitting your first pull request. We also strongly recommend that you check for open issues and pull requests to see if someone else is working on something similar.
|
||||||
|
|
||||||
|
If you need any help, feel free to reach out to [@shadcn](https://twitter.com/shadcn).
|
||||||
|
|
||||||
|
## About this repository
|
||||||
|
|
||||||
|
This repository is a monorepo.
|
||||||
|
|
||||||
|
- We use [pnpm](https://pnpm.io) and [`workspaces`](https://pnpm.io/workspaces) for development.
|
||||||
|
- We use [Turborepo](https://turbo.build/repo) as our build system.
|
||||||
|
- We use [changesets](https://github.com/changesets/changesets) for managing releases.
|
||||||
|
|
||||||
|
## Structure
|
||||||
|
|
||||||
|
This repository is structured as follows:
|
||||||
|
|
||||||
|
```
|
||||||
|
apps
|
||||||
|
└── www
|
||||||
|
├── app
|
||||||
|
├── components
|
||||||
|
├── content
|
||||||
|
└── registry
|
||||||
|
├── default
|
||||||
|
│ ├── example
|
||||||
|
│ └── ui
|
||||||
|
└── new-york
|
||||||
|
├── example
|
||||||
|
└── ui
|
||||||
|
packages
|
||||||
|
└── cli
|
||||||
|
```
|
||||||
|
|
||||||
|
| Path | Description |
|
||||||
|
| --------------------- | ---------------------------------------- |
|
||||||
|
| `apps/www/app` | The Next.js application for the website. |
|
||||||
|
| `apps/www/components` | The React components for the website. |
|
||||||
|
| `apps/www/content` | The content for the website. |
|
||||||
|
| `apps/www/registry` | The registry for the components. |
|
||||||
|
| `packages/cli` | The `shadcn-ui` package. |
|
||||||
|
|
||||||
|
## Development
|
||||||
|
|
||||||
|
### Start by cloning the repository:
|
||||||
|
|
||||||
|
```
|
||||||
|
git clone git@github.com:shadcn-ui/ui.git
|
||||||
|
```
|
||||||
|
|
||||||
|
### Install dependencies
|
||||||
|
|
||||||
|
```
|
||||||
|
pnpm install
|
||||||
|
```
|
||||||
|
|
||||||
|
### Run a workspace
|
||||||
|
|
||||||
|
You can use the `pnpm --filter=[WORKSPACE]` command to start the development process for a workspace.
|
||||||
|
|
||||||
|
#### Examples
|
||||||
|
|
||||||
|
1. To run the `ui.shadcn.com` website:
|
||||||
|
|
||||||
|
```
|
||||||
|
pnpm --filter=www dev
|
||||||
|
```
|
||||||
|
|
||||||
|
2. To run the `shadcn-ui` package:
|
||||||
|
|
||||||
|
```
|
||||||
|
pnpm --filter=shadcn-ui dev
|
||||||
|
```
|
||||||
|
|
||||||
|
## Documentation
|
||||||
|
|
||||||
|
The documentation for this project is located in the `www` workspace. You can run the documentation locally by running the following command:
|
||||||
|
|
||||||
|
```bash
|
||||||
|
pnpm --filter=www dev
|
||||||
|
```
|
||||||
|
|
||||||
|
Documentation is written using [MDX](https://mdxjs.com). You can find the documentation files in the `apps/www/content/docs` directory.
|
||||||
|
|
||||||
|
## Components
|
||||||
|
|
||||||
|
We use a registry system for developing components. You can find the source code for the components under `apps/www/registry`. The components are organized by styles.
|
||||||
|
|
||||||
|
```bash
|
||||||
|
apps
|
||||||
|
└── www
|
||||||
|
└── registry
|
||||||
|
├── default
|
||||||
|
│ ├── example
|
||||||
|
│ └── ui
|
||||||
|
└── new-york
|
||||||
|
├── example
|
||||||
|
└── ui
|
||||||
|
```
|
||||||
|
|
||||||
|
When adding or modifying components, please ensure that:
|
||||||
|
|
||||||
|
1. You make the changes for every style.
|
||||||
|
2. You update the documentation.
|
||||||
|
3. You run `pnpm build:registry` to update the registry.
|
||||||
|
|
||||||
|
## Commit Convention
|
||||||
|
|
||||||
|
Before you create a Pull Request, please check whether your commits comply with
|
||||||
|
the commit conventions used in this repository.
|
||||||
|
|
||||||
|
When you create a commit we kindly ask you to follow the convention
|
||||||
|
`category(scope or module): message` in your commit message while using one of
|
||||||
|
the following categories:
|
||||||
|
|
||||||
|
- `feat / feature`: all changes that introduce completely new code or new
|
||||||
|
features
|
||||||
|
- `fix`: changes that fix a bug (ideally you will additionally reference an
|
||||||
|
issue if present)
|
||||||
|
- `refactor`: any code related change that is not a fix nor a feature
|
||||||
|
- `docs`: changing existing or creating new documentation (i.e. README, docs for
|
||||||
|
usage of a lib or cli usage)
|
||||||
|
- `build`: all changes regarding the build of the software, changes to
|
||||||
|
dependencies or the addition of new dependencies
|
||||||
|
- `test`: all changes regarding tests (adding new tests or changing existing
|
||||||
|
ones)
|
||||||
|
- `ci`: all changes regarding the configuration of continuous integration (i.e.
|
||||||
|
github actions, ci system)
|
||||||
|
- `chore`: all changes to the repository that do not fit into any of the above
|
||||||
|
categories
|
||||||
|
|
||||||
|
e.g. `feat(components): add new prop to the avatar component`
|
||||||
|
|
||||||
|
|
||||||
|
If you are interested in the detailed specification you can visit
|
||||||
|
https://www.conventionalcommits.org/ or check out the
|
||||||
|
[Angular Commit Message Guidelines](https://github.com/angular/angular/blob/22b96b9/CONTRIBUTING.md#-commit-message-guidelines).
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
## Requests for new components
|
||||||
|
|
||||||
|
If you have a request for a new component, please open a discussion on GitHub. We'll be happy to help you out.
|
||||||
|
|
||||||
|
## CLI
|
||||||
|
|
||||||
|
The `shadcn-ui` package is a CLI for adding components to your project. You can find the documentation for the CLI [here](https://ui.shadcn.com/docs/cli).
|
||||||
|
|
||||||
|
Any changes to the CLI should be made in the `packages/cli` directory. If you can, it would be great if you could add tests for your changes.
|
||||||
|
|
||||||
|
## Testing
|
||||||
|
|
||||||
|
Tests are written using [Vitest](https://vitest.dev). You can run all the tests from the root of the repository.
|
||||||
|
|
||||||
|
```bash
|
||||||
|
pnpm test
|
||||||
|
```
|
||||||
|
|
||||||
|
Please ensure that the tests are passing when submitting a pull request. If you're adding new features, please include tests.
|
||||||
@@ -8,6 +8,10 @@ Accessible and customizable components that you can copy and paste into your app
|
|||||||
|
|
||||||
Visit http://ui.shadcn.com/docs to view the documentation.
|
Visit http://ui.shadcn.com/docs to view the documentation.
|
||||||
|
|
||||||
|
## Contributing
|
||||||
|
|
||||||
|
Please read the [contributing guide](/CONTRIBUTING.md).
|
||||||
|
|
||||||
## License
|
## License
|
||||||
|
|
||||||
Licensed under the [MIT license](https://github.com/shadcn/ui/blob/main/LICENSE.md).
|
Licensed under the [MIT license](https://github.com/shadcn/ui/blob/main/LICENSE.md).
|
||||||
|
|||||||
@@ -1006,6 +1006,13 @@ export const Index: Record<string, any> = {
|
|||||||
component: React.lazy(() => import("@/registry/default/example/mode-toggle")),
|
component: React.lazy(() => import("@/registry/default/example/mode-toggle")),
|
||||||
files: ["registry/default/example/mode-toggle.tsx"],
|
files: ["registry/default/example/mode-toggle.tsx"],
|
||||||
},
|
},
|
||||||
|
"cards": {
|
||||||
|
name: "cards",
|
||||||
|
type: "components:example",
|
||||||
|
registryDependencies: undefined,
|
||||||
|
component: React.lazy(() => import("@/registry/default/example/cards")),
|
||||||
|
files: ["registry/default/example/cards/cards.tsx"],
|
||||||
|
},
|
||||||
}, "new-york": {
|
}, "new-york": {
|
||||||
"accordion": {
|
"accordion": {
|
||||||
name: "accordion",
|
name: "accordion",
|
||||||
@@ -2008,5 +2015,12 @@ export const Index: Record<string, any> = {
|
|||||||
component: React.lazy(() => import("@/registry/new-york/example/mode-toggle")),
|
component: React.lazy(() => import("@/registry/new-york/example/mode-toggle")),
|
||||||
files: ["registry/new-york/example/mode-toggle.tsx"],
|
files: ["registry/new-york/example/mode-toggle.tsx"],
|
||||||
},
|
},
|
||||||
|
"cards": {
|
||||||
|
name: "cards",
|
||||||
|
type: "components:example",
|
||||||
|
registryDependencies: undefined,
|
||||||
|
component: React.lazy(() => import("@/registry/new-york/example/cards")),
|
||||||
|
files: ["registry/new-york/example/cards/cards.tsx"],
|
||||||
|
},
|
||||||
},
|
},
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -4,7 +4,7 @@ import { allDocs } from "contentlayer/generated"
|
|||||||
import "@/styles/mdx.css"
|
import "@/styles/mdx.css"
|
||||||
import type { Metadata } from "next"
|
import type { Metadata } from "next"
|
||||||
import Link from "next/link"
|
import Link from "next/link"
|
||||||
import { ChevronRight } from "lucide-react"
|
import { ChevronRightIcon } from "@radix-ui/react-icons"
|
||||||
import Balancer from "react-wrap-balancer"
|
import Balancer from "react-wrap-balancer"
|
||||||
|
|
||||||
import { siteConfig } from "@/config/site"
|
import { siteConfig } from "@/config/site"
|
||||||
@@ -16,7 +16,6 @@ import { DocsPager } from "@/components/pager"
|
|||||||
import { DashboardTableOfContents } from "@/components/toc"
|
import { DashboardTableOfContents } from "@/components/toc"
|
||||||
import { badgeVariants } from "@/registry/new-york/ui/badge"
|
import { badgeVariants } from "@/registry/new-york/ui/badge"
|
||||||
import { ScrollArea } from "@/registry/new-york/ui/scroll-area"
|
import { ScrollArea } from "@/registry/new-york/ui/scroll-area"
|
||||||
import { Separator } from "@/registry/new-york/ui/separator"
|
|
||||||
|
|
||||||
interface DocPageProps {
|
interface DocPageProps {
|
||||||
params: {
|
params: {
|
||||||
@@ -95,7 +94,7 @@ export default async function DocPage({ params }: DocPageProps) {
|
|||||||
<div className="overflow-hidden text-ellipsis whitespace-nowrap">
|
<div className="overflow-hidden text-ellipsis whitespace-nowrap">
|
||||||
Docs
|
Docs
|
||||||
</div>
|
</div>
|
||||||
<ChevronRight className="h-4 w-4" />
|
<ChevronRightIcon className="h-4 w-4" />
|
||||||
<div className="font-medium text-foreground">{doc.title}</div>
|
<div className="font-medium text-foreground">{doc.title}</div>
|
||||||
</div>
|
</div>
|
||||||
<div className="space-y-2">
|
<div className="space-y-2">
|
||||||
@@ -140,9 +139,11 @@ export default async function DocPage({ params }: DocPageProps) {
|
|||||||
</div>
|
</div>
|
||||||
{doc.toc && (
|
{doc.toc && (
|
||||||
<div className="hidden text-sm xl:block">
|
<div className="hidden text-sm xl:block">
|
||||||
<div className="sticky top-16 -mt-10 h-[calc(100vh-3.5rem)] overflow-hidden pt-6">
|
<div className="sticky top-16 -mt-10 pt-4">
|
||||||
<ScrollArea className="pb-10">
|
<ScrollArea className="pb-10">
|
||||||
<DashboardTableOfContents toc={toc} />
|
<div className="sticky top-16 -mt-10 h-[calc(100vh-3.5rem)] py-12">
|
||||||
|
<DashboardTableOfContents toc={toc} />
|
||||||
|
</div>
|
||||||
</ScrollArea>
|
</ScrollArea>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
|
|||||||
@@ -1,7 +1,6 @@
|
|||||||
import { Metadata } from "next"
|
import { Metadata } from "next"
|
||||||
import Image from "next/image"
|
import Image from "next/image"
|
||||||
import Link from "next/link"
|
import Link from "next/link"
|
||||||
import { Command } from "lucide-react"
|
|
||||||
|
|
||||||
import { cn } from "@/lib/utils"
|
import { cn } from "@/lib/utils"
|
||||||
import { buttonVariants } from "@/registry/new-york/ui/button"
|
import { buttonVariants } from "@/registry/new-york/ui/button"
|
||||||
@@ -44,7 +43,19 @@ export default function AuthenticationPage() {
|
|||||||
<div className="relative hidden h-full flex-col bg-muted p-10 text-white dark:border-r lg:flex">
|
<div className="relative hidden h-full flex-col bg-muted p-10 text-white dark:border-r lg:flex">
|
||||||
<div className="absolute inset-0 bg-zinc-900" />
|
<div className="absolute inset-0 bg-zinc-900" />
|
||||||
<div className="relative z-20 flex items-center text-lg font-medium">
|
<div className="relative z-20 flex items-center text-lg font-medium">
|
||||||
<Command className="mr-2 h-6 w-6" /> Acme Inc
|
<svg
|
||||||
|
xmlns="http://www.w3.org/2000/svg"
|
||||||
|
viewBox="0 0 24 24"
|
||||||
|
fill="none"
|
||||||
|
stroke="currentColor"
|
||||||
|
strokeWidth="2"
|
||||||
|
strokeLinecap="round"
|
||||||
|
strokeLinejoin="round"
|
||||||
|
className="mr-2 h-6 w-6"
|
||||||
|
>
|
||||||
|
<path d="M15 6v12a3 3 0 1 0 3-3H6a3 3 0 1 0 3 3V6a3 3 0 1 0-3 3h12a3 3 0 1 0-3-3" />
|
||||||
|
</svg>
|
||||||
|
Acme Inc
|
||||||
</div>
|
</div>
|
||||||
<div className="relative z-20 mt-auto">
|
<div className="relative z-20 mt-auto">
|
||||||
<blockquote className="space-y-2">
|
<blockquote className="space-y-2">
|
||||||
|
|||||||
@@ -1,4 +1,9 @@
|
|||||||
import { ChevronDown, Circle, Plus, Star } from "lucide-react"
|
import {
|
||||||
|
ChevronDownIcon,
|
||||||
|
CircleIcon,
|
||||||
|
PlusIcon,
|
||||||
|
StarIcon,
|
||||||
|
} from "@radix-ui/react-icons"
|
||||||
|
|
||||||
import { Button } from "@/registry/new-york/ui/button"
|
import { Button } from "@/registry/new-york/ui/button"
|
||||||
import {
|
import {
|
||||||
@@ -31,15 +36,15 @@ export function DemoGithub() {
|
|||||||
</CardDescription>
|
</CardDescription>
|
||||||
</div>
|
</div>
|
||||||
<div className="flex items-center space-x-1 rounded-md bg-secondary text-secondary-foreground">
|
<div className="flex items-center space-x-1 rounded-md bg-secondary text-secondary-foreground">
|
||||||
<Button variant="secondary" className="px-3">
|
<Button variant="secondary" className="px-3 shadow-none">
|
||||||
<Star className="mr-2 h-4 w-4" />
|
<StarIcon className="mr-2 h-4 w-4" />
|
||||||
Star
|
Star
|
||||||
</Button>
|
</Button>
|
||||||
<Separator orientation="vertical" className="h-[20px]" />
|
<Separator orientation="vertical" className="h-[20px]" />
|
||||||
<DropdownMenu>
|
<DropdownMenu>
|
||||||
<DropdownMenuTrigger asChild>
|
<DropdownMenuTrigger asChild>
|
||||||
<Button variant="secondary" className="px-2">
|
<Button variant="secondary" className="px-2 shadow-none">
|
||||||
<ChevronDown className="h-4 w-4 text-secondary-foreground" />
|
<ChevronDownIcon className="h-4 w-4 text-secondary-foreground" />
|
||||||
</Button>
|
</Button>
|
||||||
</DropdownMenuTrigger>
|
</DropdownMenuTrigger>
|
||||||
<DropdownMenuContent
|
<DropdownMenuContent
|
||||||
@@ -57,7 +62,7 @@ export function DemoGithub() {
|
|||||||
<DropdownMenuCheckboxItem>Inspiration</DropdownMenuCheckboxItem>
|
<DropdownMenuCheckboxItem>Inspiration</DropdownMenuCheckboxItem>
|
||||||
<DropdownMenuSeparator />
|
<DropdownMenuSeparator />
|
||||||
<DropdownMenuItem>
|
<DropdownMenuItem>
|
||||||
<Plus className="mr-2 h-4 w-4" /> Create List
|
<PlusIcon className="mr-2 h-4 w-4" /> Create List
|
||||||
</DropdownMenuItem>
|
</DropdownMenuItem>
|
||||||
</DropdownMenuContent>
|
</DropdownMenuContent>
|
||||||
</DropdownMenu>
|
</DropdownMenu>
|
||||||
@@ -66,11 +71,11 @@ export function DemoGithub() {
|
|||||||
<CardContent>
|
<CardContent>
|
||||||
<div className="flex space-x-4 text-sm text-muted-foreground">
|
<div className="flex space-x-4 text-sm text-muted-foreground">
|
||||||
<div className="flex items-center">
|
<div className="flex items-center">
|
||||||
<Circle className="mr-1 h-3 w-3 fill-sky-400 text-sky-400" />
|
<CircleIcon className="mr-1 h-3 w-3 fill-sky-400 text-sky-400" />
|
||||||
TypeScript
|
TypeScript
|
||||||
</div>
|
</div>
|
||||||
<div className="flex items-center">
|
<div className="flex items-center">
|
||||||
<Star className="mr-1 h-3 w-3" />
|
<StarIcon className="mr-1 h-3 w-3" />
|
||||||
20k
|
20k
|
||||||
</div>
|
</div>
|
||||||
<div>Updated April 2023</div>
|
<div>Updated April 2023</div>
|
||||||
|
|||||||
@@ -1,4 +1,4 @@
|
|||||||
import { AtSign, Bell, BellOff } from "lucide-react"
|
import { BellIcon, EyeNoneIcon, PersonIcon } from "@radix-ui/react-icons"
|
||||||
|
|
||||||
import {
|
import {
|
||||||
Card,
|
Card,
|
||||||
@@ -19,7 +19,7 @@ export function DemoNotifications() {
|
|||||||
</CardHeader>
|
</CardHeader>
|
||||||
<CardContent className="grid gap-1">
|
<CardContent className="grid gap-1">
|
||||||
<div className="-mx-2 flex items-start space-x-4 rounded-md p-2 transition-all hover:bg-accent hover:text-accent-foreground">
|
<div className="-mx-2 flex items-start space-x-4 rounded-md p-2 transition-all hover:bg-accent hover:text-accent-foreground">
|
||||||
<Bell className="mt-px h-5 w-5" />
|
<BellIcon className="mt-px h-5 w-5" />
|
||||||
<div className="space-y-1">
|
<div className="space-y-1">
|
||||||
<p className="text-sm font-medium leading-none">Everything</p>
|
<p className="text-sm font-medium leading-none">Everything</p>
|
||||||
<p className="text-sm text-muted-foreground">
|
<p className="text-sm text-muted-foreground">
|
||||||
@@ -28,7 +28,7 @@ export function DemoNotifications() {
|
|||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
<div className="-mx-2 flex items-start space-x-4 rounded-md bg-accent p-2 text-accent-foreground transition-all">
|
<div className="-mx-2 flex items-start space-x-4 rounded-md bg-accent p-2 text-accent-foreground transition-all">
|
||||||
<AtSign className="mt-px h-5 w-5" />
|
<PersonIcon className="mt-px h-5 w-5" />
|
||||||
<div className="space-y-1">
|
<div className="space-y-1">
|
||||||
<p className="text-sm font-medium leading-none">Available</p>
|
<p className="text-sm font-medium leading-none">Available</p>
|
||||||
<p className="text-sm text-muted-foreground">
|
<p className="text-sm text-muted-foreground">
|
||||||
@@ -37,7 +37,7 @@ export function DemoNotifications() {
|
|||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
<div className="-mx-2 flex items-start space-x-4 rounded-md p-2 transition-all hover:bg-accent hover:text-accent-foreground">
|
<div className="-mx-2 flex items-start space-x-4 rounded-md p-2 transition-all hover:bg-accent hover:text-accent-foreground">
|
||||||
<BellOff className="mt-px h-5 w-5" />
|
<EyeNoneIcon className="mt-px h-5 w-5" />
|
||||||
<div className="space-y-1">
|
<div className="space-y-1">
|
||||||
<p className="text-sm font-medium leading-none">Ignoring</p>
|
<p className="text-sm font-medium leading-none">Ignoring</p>
|
||||||
<p className="text-sm text-muted-foreground">
|
<p className="text-sm text-muted-foreground">
|
||||||
|
|||||||
@@ -1,5 +1,3 @@
|
|||||||
import { CreditCard } from "lucide-react"
|
|
||||||
|
|
||||||
import { Icons } from "@/components/icons"
|
import { Icons } from "@/components/icons"
|
||||||
import { Button } from "@/registry/new-york/ui/button"
|
import { Button } from "@/registry/new-york/ui/button"
|
||||||
import {
|
import {
|
||||||
@@ -32,30 +30,52 @@ export function DemoPaymentMethod() {
|
|||||||
</CardHeader>
|
</CardHeader>
|
||||||
<CardContent className="grid gap-6">
|
<CardContent className="grid gap-6">
|
||||||
<RadioGroup defaultValue="card" className="grid grid-cols-3 gap-4">
|
<RadioGroup defaultValue="card" className="grid grid-cols-3 gap-4">
|
||||||
<Label
|
<div>
|
||||||
htmlFor="card"
|
<RadioGroupItem value="card" id="card" className="peer sr-only" />
|
||||||
className="flex flex-col items-center justify-between rounded-md border-2 border-muted bg-popover p-4 hover:bg-accent hover:text-accent-foreground [&:has([data-state=checked])]:border-primary"
|
<Label
|
||||||
>
|
htmlFor="card"
|
||||||
<RadioGroupItem value="card" id="card" className="sr-only" />
|
className="flex flex-col items-center justify-between rounded-md border-2 border-muted bg-popover p-4 hover:bg-accent hover:text-accent-foreground peer-data-[state=checked]:border-primary [&:has([data-state=checked])]:border-primary"
|
||||||
<CreditCard className="mb-3 h-6 w-6" />
|
>
|
||||||
Card
|
<svg
|
||||||
</Label>
|
xmlns="http://www.w3.org/2000/svg"
|
||||||
<Label
|
viewBox="0 0 24 24"
|
||||||
htmlFor="paypal"
|
fill="none"
|
||||||
className="flex flex-col items-center justify-between rounded-md border-2 border-muted bg-popover p-4 hover:bg-accent hover:text-accent-foreground [&:has([data-state=checked])]:border-primary"
|
stroke="currentColor"
|
||||||
>
|
strokeLinecap="round"
|
||||||
<RadioGroupItem value="paypal" id="paypal" className="sr-only" />
|
strokeLinejoin="round"
|
||||||
<Icons.paypal className="mb-3 h-6 w-6" />
|
strokeWidth="2"
|
||||||
Paypal
|
className="mb-3 h-6 w-6"
|
||||||
</Label>
|
>
|
||||||
<Label
|
<rect width="20" height="14" x="2" y="5" rx="2" />
|
||||||
htmlFor="apple"
|
<path d="M2 10h20" />
|
||||||
className="flex flex-col items-center justify-between rounded-md border-2 border-muted bg-popover p-4 hover:bg-accent hover:text-accent-foreground [&:has([data-state=checked])]:border-primary"
|
</svg>
|
||||||
>
|
Card
|
||||||
<RadioGroupItem value="apple" id="apple" className="sr-only" />
|
</Label>
|
||||||
<Icons.apple className="mb-3 h-6 w-6" />
|
</div>
|
||||||
Apple
|
<div>
|
||||||
</Label>
|
<RadioGroupItem
|
||||||
|
value="paypal"
|
||||||
|
id="paypal"
|
||||||
|
className="peer sr-only"
|
||||||
|
/>
|
||||||
|
<Label
|
||||||
|
htmlFor="paypal"
|
||||||
|
className="flex flex-col items-center justify-between rounded-md border-2 border-muted bg-popover p-4 hover:bg-accent hover:text-accent-foreground peer-data-[state=checked]:border-primary [&:has([data-state=checked])]:border-primary"
|
||||||
|
>
|
||||||
|
<Icons.paypal className="mb-3 h-6 w-6" />
|
||||||
|
Paypal
|
||||||
|
</Label>
|
||||||
|
</div>
|
||||||
|
<div>
|
||||||
|
<RadioGroupItem value="apple" id="apple" className="peer sr-only" />
|
||||||
|
<Label
|
||||||
|
htmlFor="apple"
|
||||||
|
className="flex flex-col items-center justify-between rounded-md border-2 border-muted bg-popover p-4 hover:bg-accent hover:text-accent-foreground peer-data-[state=checked]:border-primary [&:has([data-state=checked])]:border-primary"
|
||||||
|
>
|
||||||
|
<Icons.apple className="mb-3 h-6 w-6" />
|
||||||
|
Apple
|
||||||
|
</Label>
|
||||||
|
</div>
|
||||||
</RadioGroup>
|
</RadioGroup>
|
||||||
<div className="grid gap-2">
|
<div className="grid gap-2">
|
||||||
<Label htmlFor="name">Name</Label>
|
<Label htmlFor="name">Name</Label>
|
||||||
|
|||||||
@@ -49,7 +49,10 @@ export function DemoReportAnIssue() {
|
|||||||
<div className="grid gap-2">
|
<div className="grid gap-2">
|
||||||
<Label htmlFor="security-level">Security Level</Label>
|
<Label htmlFor="security-level">Security Level</Label>
|
||||||
<Select defaultValue="2">
|
<Select defaultValue="2">
|
||||||
<SelectTrigger id="security-level">
|
<SelectTrigger
|
||||||
|
id="security-level"
|
||||||
|
className="line-clamp-1 w-[160px] truncate"
|
||||||
|
>
|
||||||
<SelectValue placeholder="Select level" />
|
<SelectValue placeholder="Select level" />
|
||||||
</SelectTrigger>
|
</SelectTrigger>
|
||||||
<SelectContent>
|
<SelectContent>
|
||||||
|
|||||||
@@ -1,4 +1,4 @@
|
|||||||
import { ChevronDown } from "lucide-react"
|
import { ChevronDownIcon } from "@radix-ui/react-icons"
|
||||||
|
|
||||||
import {
|
import {
|
||||||
Avatar,
|
Avatar,
|
||||||
@@ -52,7 +52,7 @@ export function DemoTeamMembers() {
|
|||||||
<PopoverTrigger asChild>
|
<PopoverTrigger asChild>
|
||||||
<Button variant="outline" className="ml-auto">
|
<Button variant="outline" className="ml-auto">
|
||||||
Owner{" "}
|
Owner{" "}
|
||||||
<ChevronDown className="ml-2 h-4 w-4 text-muted-foreground" />
|
<ChevronDownIcon className="ml-2 h-4 w-4 text-muted-foreground" />
|
||||||
</Button>
|
</Button>
|
||||||
</PopoverTrigger>
|
</PopoverTrigger>
|
||||||
<PopoverContent className="p-0" align="end">
|
<PopoverContent className="p-0" align="end">
|
||||||
@@ -106,7 +106,7 @@ export function DemoTeamMembers() {
|
|||||||
<PopoverTrigger asChild>
|
<PopoverTrigger asChild>
|
||||||
<Button variant="outline" className="ml-auto">
|
<Button variant="outline" className="ml-auto">
|
||||||
Member{" "}
|
Member{" "}
|
||||||
<ChevronDown className="ml-2 h-4 w-4 text-muted-foreground" />
|
<ChevronDownIcon className="ml-2 h-4 w-4 text-muted-foreground" />
|
||||||
</Button>
|
</Button>
|
||||||
</PopoverTrigger>
|
</PopoverTrigger>
|
||||||
<PopoverContent className="p-0" align="end">
|
<PopoverContent className="p-0" align="end">
|
||||||
|
|||||||
@@ -1,4 +1,5 @@
|
|||||||
import { Metadata } from "next"
|
import { Metadata } from "next"
|
||||||
|
import Image from "next/image"
|
||||||
|
|
||||||
import { cn } from "@/lib/utils"
|
import { cn } from "@/lib/utils"
|
||||||
|
|
||||||
@@ -11,8 +12,6 @@ import { DemoPaymentMethod } from "./components/payment-method"
|
|||||||
import { DemoReportAnIssue } from "./components/report-an-issue"
|
import { DemoReportAnIssue } from "./components/report-an-issue"
|
||||||
import { DemoShareDocument } from "./components/share-document"
|
import { DemoShareDocument } from "./components/share-document"
|
||||||
import { DemoTeamMembers } from "./components/team-members"
|
import { DemoTeamMembers } from "./components/team-members"
|
||||||
import "./styles.css"
|
|
||||||
import Image from "next/image"
|
|
||||||
|
|
||||||
export const metadata: Metadata = {
|
export const metadata: Metadata = {
|
||||||
title: "Cards",
|
title: "Cards",
|
||||||
@@ -76,7 +75,7 @@ export default function CardsPage() {
|
|||||||
<DemoNotifications />
|
<DemoNotifications />
|
||||||
</DemoContainer>
|
</DemoContainer>
|
||||||
</div>
|
</div>
|
||||||
<div className="col-span-2 grid items-start gap-6 lg:col-span-1 lg:grid-cols-2 xl:grid-cols-1">
|
<div className="col-span-2 grid items-start gap-6 lg:col-span-2 lg:grid-cols-2 xl:col-span-1 xl:grid-cols-1">
|
||||||
<DemoContainer>
|
<DemoContainer>
|
||||||
<DemoReportAnIssue />
|
<DemoReportAnIssue />
|
||||||
</DemoContainer>
|
</DemoContainer>
|
||||||
|
|||||||
@@ -1,63 +0,0 @@
|
|||||||
[data-section="cards"] {
|
|
||||||
--background: 0 0% 100%;
|
|
||||||
--foreground: 222.2 47.4% 11.2%;
|
|
||||||
|
|
||||||
--muted: 214 95% 93%;
|
|
||||||
--muted-foreground: 215.4 16.3% 46.9%;
|
|
||||||
|
|
||||||
--popover: 0 0% 100%;
|
|
||||||
--popover-foreground: 222.2 47.4% 11.2%;
|
|
||||||
|
|
||||||
--border: 214.3 31.8% 91.4%;
|
|
||||||
--input: 214.3 31.8% 91.4%;
|
|
||||||
|
|
||||||
--card: 0 0% 100%;
|
|
||||||
--card-foreground: 222.2 47.4% 11.2%;
|
|
||||||
|
|
||||||
--primary: 224 82% 56%;
|
|
||||||
--primary-foreground: 0 0% 100%;
|
|
||||||
|
|
||||||
--secondary: 210 40% 96.1%;
|
|
||||||
--secondary-foreground: 222.2 47.4% 11.2%;
|
|
||||||
|
|
||||||
--accent: 216 100% 97%;
|
|
||||||
--accent-foreground: 222.2 47.4% 11.2%;
|
|
||||||
|
|
||||||
--destructive: 0 100% 50%;
|
|
||||||
--destructive-foreground: 210 40% 98%;
|
|
||||||
|
|
||||||
--ring: 215 20.2% 65.1%;
|
|
||||||
|
|
||||||
--radius: 1.2rem;
|
|
||||||
}
|
|
||||||
|
|
||||||
.dark [data-section="cards"] {
|
|
||||||
--background: 224 71% 4%;
|
|
||||||
--foreground: 213 31% 91%;
|
|
||||||
|
|
||||||
--muted: 223 47% 11%;
|
|
||||||
--muted-foreground: 215.4 16.3% 56.9%;
|
|
||||||
|
|
||||||
--popover: 224 71% 4%;
|
|
||||||
--popover-foreground: 215 20.2% 65.1%;
|
|
||||||
|
|
||||||
--border: 216 34% 17%;
|
|
||||||
--input: 216 34% 17%;
|
|
||||||
|
|
||||||
--card: 224 71% 4%;
|
|
||||||
--card-foreground: 213 31% 91%;
|
|
||||||
|
|
||||||
--primary: 224 82% 56%;
|
|
||||||
--primary-foreground: 0 0% 100%;
|
|
||||||
|
|
||||||
--secondary: 210 40% 96.1%;
|
|
||||||
--secondary-foreground: 222.2 47.4% 11.2%;
|
|
||||||
|
|
||||||
--accent: 226 57% 21%;
|
|
||||||
--accent-foreground: 0 0% 100%;
|
|
||||||
|
|
||||||
--destructive: 0 63% 31%;
|
|
||||||
--destructive-foreground: 210 40% 98%;
|
|
||||||
|
|
||||||
--ring: 215 20.2% 65.1%;
|
|
||||||
}
|
|
||||||
@@ -1,8 +1,8 @@
|
|||||||
"use client"
|
"use client"
|
||||||
|
|
||||||
import * as React from "react"
|
import * as React from "react"
|
||||||
|
import { CalendarIcon } from "@radix-ui/react-icons"
|
||||||
import { addDays, format } from "date-fns"
|
import { addDays, format } from "date-fns"
|
||||||
import { Calendar as CalendarIcon } from "lucide-react"
|
|
||||||
import { DateRange } from "react-day-picker"
|
import { DateRange } from "react-day-picker"
|
||||||
|
|
||||||
import { cn } from "@/lib/utils"
|
import { cn } from "@/lib/utils"
|
||||||
|
|||||||
@@ -1,7 +1,11 @@
|
|||||||
"use client"
|
"use client"
|
||||||
|
|
||||||
import * as React from "react"
|
import * as React from "react"
|
||||||
import { Check, ChevronsUpDown, PlusCircle } from "lucide-react"
|
import {
|
||||||
|
CaretSortIcon,
|
||||||
|
CheckIcon,
|
||||||
|
PlusCircledIcon,
|
||||||
|
} from "@radix-ui/react-icons"
|
||||||
|
|
||||||
import { cn } from "@/lib/utils"
|
import { cn } from "@/lib/utils"
|
||||||
import {
|
import {
|
||||||
@@ -96,12 +100,11 @@ export default function TeamSwitcher({ className }: TeamSwitcherProps) {
|
|||||||
<AvatarImage
|
<AvatarImage
|
||||||
src={`https://avatar.vercel.sh/${selectedTeam.value}.png`}
|
src={`https://avatar.vercel.sh/${selectedTeam.value}.png`}
|
||||||
alt={selectedTeam.label}
|
alt={selectedTeam.label}
|
||||||
className="grayscale"
|
|
||||||
/>
|
/>
|
||||||
<AvatarFallback>SC</AvatarFallback>
|
<AvatarFallback>SC</AvatarFallback>
|
||||||
</Avatar>
|
</Avatar>
|
||||||
{selectedTeam.label}
|
{selectedTeam.label}
|
||||||
<ChevronsUpDown className="ml-auto h-4 w-4 shrink-0 opacity-50" />
|
<CaretSortIcon className="ml-auto h-4 w-4 shrink-0 opacity-50" />
|
||||||
</Button>
|
</Button>
|
||||||
</PopoverTrigger>
|
</PopoverTrigger>
|
||||||
<PopoverContent className="w-[200px] p-0">
|
<PopoverContent className="w-[200px] p-0">
|
||||||
@@ -129,7 +132,7 @@ export default function TeamSwitcher({ className }: TeamSwitcherProps) {
|
|||||||
<AvatarFallback>SC</AvatarFallback>
|
<AvatarFallback>SC</AvatarFallback>
|
||||||
</Avatar>
|
</Avatar>
|
||||||
{team.label}
|
{team.label}
|
||||||
<Check
|
<CheckIcon
|
||||||
className={cn(
|
className={cn(
|
||||||
"ml-auto h-4 w-4",
|
"ml-auto h-4 w-4",
|
||||||
selectedTeam.value === team.value
|
selectedTeam.value === team.value
|
||||||
@@ -152,7 +155,7 @@ export default function TeamSwitcher({ className }: TeamSwitcherProps) {
|
|||||||
setShowNewTeamDialog(true)
|
setShowNewTeamDialog(true)
|
||||||
}}
|
}}
|
||||||
>
|
>
|
||||||
<PlusCircle className="mr-2 h-5 w-5" />
|
<PlusCircledIcon className="mr-2 h-5 w-5" />
|
||||||
Create Team
|
Create Team
|
||||||
</CommandItem>
|
</CommandItem>
|
||||||
</DialogTrigger>
|
</DialogTrigger>
|
||||||
|
|||||||
@@ -1,5 +1,3 @@
|
|||||||
import { CreditCard, LogOut, PlusCircle, Settings, User } from "lucide-react"
|
|
||||||
|
|
||||||
import {
|
import {
|
||||||
Avatar,
|
Avatar,
|
||||||
AvatarFallback,
|
AvatarFallback,
|
||||||
@@ -40,29 +38,22 @@ export function UserNav() {
|
|||||||
<DropdownMenuSeparator />
|
<DropdownMenuSeparator />
|
||||||
<DropdownMenuGroup>
|
<DropdownMenuGroup>
|
||||||
<DropdownMenuItem>
|
<DropdownMenuItem>
|
||||||
<User className="mr-2 h-4 w-4" />
|
Profile
|
||||||
<span>Profile</span>
|
|
||||||
<DropdownMenuShortcut>⇧⌘P</DropdownMenuShortcut>
|
<DropdownMenuShortcut>⇧⌘P</DropdownMenuShortcut>
|
||||||
</DropdownMenuItem>
|
</DropdownMenuItem>
|
||||||
<DropdownMenuItem>
|
<DropdownMenuItem>
|
||||||
<CreditCard className="mr-2 h-4 w-4" />
|
Billing
|
||||||
<span>Billing</span>
|
|
||||||
<DropdownMenuShortcut>⌘B</DropdownMenuShortcut>
|
<DropdownMenuShortcut>⌘B</DropdownMenuShortcut>
|
||||||
</DropdownMenuItem>
|
</DropdownMenuItem>
|
||||||
<DropdownMenuItem>
|
<DropdownMenuItem>
|
||||||
<Settings className="mr-2 h-4 w-4" />
|
Settings
|
||||||
<span>Settings</span>
|
|
||||||
<DropdownMenuShortcut>⌘S</DropdownMenuShortcut>
|
<DropdownMenuShortcut>⌘S</DropdownMenuShortcut>
|
||||||
</DropdownMenuItem>
|
</DropdownMenuItem>
|
||||||
<DropdownMenuItem>
|
<DropdownMenuItem>New Team</DropdownMenuItem>
|
||||||
<PlusCircle className="mr-2 h-4 w-4" />
|
|
||||||
<span>New Team</span>
|
|
||||||
</DropdownMenuItem>
|
|
||||||
</DropdownMenuGroup>
|
</DropdownMenuGroup>
|
||||||
<DropdownMenuSeparator />
|
<DropdownMenuSeparator />
|
||||||
<DropdownMenuItem>
|
<DropdownMenuItem>
|
||||||
<LogOut className="mr-2 h-4 w-4" />
|
Log out
|
||||||
<span>Log out</span>
|
|
||||||
<DropdownMenuShortcut>⇧⌘Q</DropdownMenuShortcut>
|
<DropdownMenuShortcut>⇧⌘Q</DropdownMenuShortcut>
|
||||||
</DropdownMenuItem>
|
</DropdownMenuItem>
|
||||||
</DropdownMenuContent>
|
</DropdownMenuContent>
|
||||||
|
|||||||
@@ -1,6 +1,5 @@
|
|||||||
import { Metadata } from "next"
|
import { Metadata } from "next"
|
||||||
import Image from "next/image"
|
import Image from "next/image"
|
||||||
import { Activity, CreditCard, DollarSign, Download, Users } from "lucide-react"
|
|
||||||
|
|
||||||
import { Button } from "@/registry/new-york/ui/button"
|
import { Button } from "@/registry/new-york/ui/button"
|
||||||
import {
|
import {
|
||||||
@@ -26,7 +25,7 @@ import { UserNav } from "@/app/examples/dashboard/components/user-nav"
|
|||||||
|
|
||||||
export const metadata: Metadata = {
|
export const metadata: Metadata = {
|
||||||
title: "Dashboard",
|
title: "Dashboard",
|
||||||
description: "Example dashboard app using the components.",
|
description: "Example dashboard app built using the components.",
|
||||||
}
|
}
|
||||||
|
|
||||||
export default function DashboardPage() {
|
export default function DashboardPage() {
|
||||||
@@ -64,10 +63,7 @@ export default function DashboardPage() {
|
|||||||
<h2 className="text-3xl font-bold tracking-tight">Dashboard</h2>
|
<h2 className="text-3xl font-bold tracking-tight">Dashboard</h2>
|
||||||
<div className="flex items-center space-x-2">
|
<div className="flex items-center space-x-2">
|
||||||
<CalendarDateRangePicker />
|
<CalendarDateRangePicker />
|
||||||
<Button>
|
<Button>Download</Button>
|
||||||
<Download className="mr-2 h-4 w-4" />
|
|
||||||
Download
|
|
||||||
</Button>
|
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
<Tabs defaultValue="overview" className="space-y-4">
|
<Tabs defaultValue="overview" className="space-y-4">
|
||||||
@@ -90,7 +86,18 @@ export default function DashboardPage() {
|
|||||||
<CardTitle className="text-sm font-medium">
|
<CardTitle className="text-sm font-medium">
|
||||||
Total Revenue
|
Total Revenue
|
||||||
</CardTitle>
|
</CardTitle>
|
||||||
<DollarSign className="h-4 w-4 text-muted-foreground" />
|
<svg
|
||||||
|
xmlns="http://www.w3.org/2000/svg"
|
||||||
|
viewBox="0 0 24 24"
|
||||||
|
fill="none"
|
||||||
|
stroke="currentColor"
|
||||||
|
strokeLinecap="round"
|
||||||
|
strokeLinejoin="round"
|
||||||
|
strokeWidth="2"
|
||||||
|
className="h-4 w-4 text-muted-foreground"
|
||||||
|
>
|
||||||
|
<path d="M12 2v20M17 5H9.5a3.5 3.5 0 0 0 0 7h5a3.5 3.5 0 0 1 0 7H6" />
|
||||||
|
</svg>
|
||||||
</CardHeader>
|
</CardHeader>
|
||||||
<CardContent>
|
<CardContent>
|
||||||
<div className="text-2xl font-bold">$45,231.89</div>
|
<div className="text-2xl font-bold">$45,231.89</div>
|
||||||
@@ -104,7 +111,20 @@ export default function DashboardPage() {
|
|||||||
<CardTitle className="text-sm font-medium">
|
<CardTitle className="text-sm font-medium">
|
||||||
Subscriptions
|
Subscriptions
|
||||||
</CardTitle>
|
</CardTitle>
|
||||||
<Users className="h-4 w-4 text-muted-foreground" />
|
<svg
|
||||||
|
xmlns="http://www.w3.org/2000/svg"
|
||||||
|
viewBox="0 0 24 24"
|
||||||
|
fill="none"
|
||||||
|
stroke="currentColor"
|
||||||
|
strokeLinecap="round"
|
||||||
|
strokeLinejoin="round"
|
||||||
|
strokeWidth="2"
|
||||||
|
className="h-4 w-4 text-muted-foreground"
|
||||||
|
>
|
||||||
|
<path d="M16 21v-2a4 4 0 0 0-4-4H6a4 4 0 0 0-4 4v2" />
|
||||||
|
<circle cx="9" cy="7" r="4" />
|
||||||
|
<path d="M22 21v-2a4 4 0 0 0-3-3.87M16 3.13a4 4 0 0 1 0 7.75" />
|
||||||
|
</svg>
|
||||||
</CardHeader>
|
</CardHeader>
|
||||||
<CardContent>
|
<CardContent>
|
||||||
<div className="text-2xl font-bold">+2350</div>
|
<div className="text-2xl font-bold">+2350</div>
|
||||||
@@ -116,7 +136,19 @@ export default function DashboardPage() {
|
|||||||
<Card>
|
<Card>
|
||||||
<CardHeader className="flex flex-row items-center justify-between space-y-0 pb-2">
|
<CardHeader className="flex flex-row items-center justify-between space-y-0 pb-2">
|
||||||
<CardTitle className="text-sm font-medium">Sales</CardTitle>
|
<CardTitle className="text-sm font-medium">Sales</CardTitle>
|
||||||
<CreditCard className="h-4 w-4 text-muted-foreground" />
|
<svg
|
||||||
|
xmlns="http://www.w3.org/2000/svg"
|
||||||
|
viewBox="0 0 24 24"
|
||||||
|
fill="none"
|
||||||
|
stroke="currentColor"
|
||||||
|
strokeLinecap="round"
|
||||||
|
strokeLinejoin="round"
|
||||||
|
strokeWidth="2"
|
||||||
|
className="h-4 w-4 text-muted-foreground"
|
||||||
|
>
|
||||||
|
<rect width="20" height="14" x="2" y="5" rx="2" />
|
||||||
|
<path d="M2 10h20" />
|
||||||
|
</svg>
|
||||||
</CardHeader>
|
</CardHeader>
|
||||||
<CardContent>
|
<CardContent>
|
||||||
<div className="text-2xl font-bold">+12,234</div>
|
<div className="text-2xl font-bold">+12,234</div>
|
||||||
@@ -130,7 +162,18 @@ export default function DashboardPage() {
|
|||||||
<CardTitle className="text-sm font-medium">
|
<CardTitle className="text-sm font-medium">
|
||||||
Active Now
|
Active Now
|
||||||
</CardTitle>
|
</CardTitle>
|
||||||
<Activity className="h-4 w-4 text-muted-foreground" />
|
<svg
|
||||||
|
xmlns="http://www.w3.org/2000/svg"
|
||||||
|
viewBox="0 0 24 24"
|
||||||
|
fill="none"
|
||||||
|
stroke="currentColor"
|
||||||
|
strokeLinecap="round"
|
||||||
|
strokeLinejoin="round"
|
||||||
|
strokeWidth="2"
|
||||||
|
className="h-4 w-4 text-muted-foreground"
|
||||||
|
>
|
||||||
|
<path d="M22 12h-4l-3 9L9 3l-3 9H2" />
|
||||||
|
</svg>
|
||||||
</CardHeader>
|
</CardHeader>
|
||||||
<CardContent>
|
<CardContent>
|
||||||
<div className="text-2xl font-bold">+573</div>
|
<div className="text-2xl font-bold">+573</div>
|
||||||
|
|||||||
@@ -1,8 +1,8 @@
|
|||||||
"use client"
|
"use client"
|
||||||
|
|
||||||
import { zodResolver } from "@hookform/resolvers/zod"
|
import { zodResolver } from "@hookform/resolvers/zod"
|
||||||
|
import { CalendarIcon, CaretSortIcon, CheckIcon } from "@radix-ui/react-icons"
|
||||||
import { format } from "date-fns"
|
import { format } from "date-fns"
|
||||||
import { CalendarIcon, Check, ChevronsUpDown } from "lucide-react"
|
|
||||||
import { useForm } from "react-hook-form"
|
import { useForm } from "react-hook-form"
|
||||||
import * as z from "zod"
|
import * as z from "zod"
|
||||||
|
|
||||||
@@ -173,7 +173,7 @@ export function AccountForm() {
|
|||||||
(language) => language.value === field.value
|
(language) => language.value === field.value
|
||||||
)?.label
|
)?.label
|
||||||
: "Select language"}
|
: "Select language"}
|
||||||
<ChevronsUpDown className="ml-2 h-4 w-4 shrink-0 opacity-50" />
|
<CaretSortIcon className="ml-2 h-4 w-4 shrink-0 opacity-50" />
|
||||||
</Button>
|
</Button>
|
||||||
</FormControl>
|
</FormControl>
|
||||||
</PopoverTrigger>
|
</PopoverTrigger>
|
||||||
@@ -184,13 +184,13 @@ export function AccountForm() {
|
|||||||
<CommandGroup>
|
<CommandGroup>
|
||||||
{languages.map((language) => (
|
{languages.map((language) => (
|
||||||
<CommandItem
|
<CommandItem
|
||||||
value={language.value}
|
value={language.label}
|
||||||
key={language.value}
|
key={language.value}
|
||||||
onSelect={(value) => {
|
onSelect={() => {
|
||||||
form.setValue("language", value)
|
form.setValue("language", language.value)
|
||||||
}}
|
}}
|
||||||
>
|
>
|
||||||
<Check
|
<CheckIcon
|
||||||
className={cn(
|
className={cn(
|
||||||
"mr-2 h-4 w-4",
|
"mr-2 h-4 w-4",
|
||||||
language.value === field.value
|
language.value === field.value
|
||||||
|
|||||||
@@ -1,7 +1,7 @@
|
|||||||
"use client"
|
"use client"
|
||||||
|
|
||||||
import { zodResolver } from "@hookform/resolvers/zod"
|
import { zodResolver } from "@hookform/resolvers/zod"
|
||||||
import { ChevronDown } from "lucide-react"
|
import { ChevronDownIcon } from "@radix-ui/react-icons"
|
||||||
import { useForm } from "react-hook-form"
|
import { useForm } from "react-hook-form"
|
||||||
import * as z from "zod"
|
import * as z from "zod"
|
||||||
|
|
||||||
@@ -76,7 +76,7 @@ export function AppearanceForm() {
|
|||||||
<option value="system">System</option>
|
<option value="system">System</option>
|
||||||
</select>
|
</select>
|
||||||
</FormControl>
|
</FormControl>
|
||||||
<ChevronDown className="absolute right-3 top-3 h-4 w-4 opacity-50" />
|
<ChevronDownIcon className="absolute right-3 top-2.5 h-4 w-4 opacity-50" />
|
||||||
</div>
|
</div>
|
||||||
<FormDescription>
|
<FormDescription>
|
||||||
Set the font you want to use in the dashboard.
|
Set the font you want to use in the dashboard.
|
||||||
|
|||||||
@@ -1,5 +1,4 @@
|
|||||||
import { Separator } from "@/registry/new-york/ui/separator"
|
import { Separator } from "@/registry/new-york/ui/separator"
|
||||||
import { AccountForm } from "@/app/examples/forms/account/account-form"
|
|
||||||
import { NotificationsForm } from "@/app/examples/forms/notifications/notifications-form"
|
import { NotificationsForm } from "@/app/examples/forms/notifications/notifications-form"
|
||||||
|
|
||||||
export default function SettingsNotificationsPage() {
|
export default function SettingsNotificationsPage() {
|
||||||
|
|||||||
@@ -1,6 +1,6 @@
|
|||||||
import { Metadata } from "next"
|
import { Metadata } from "next"
|
||||||
import Link from "next/link"
|
import Link from "next/link"
|
||||||
import { ChevronRight } from "lucide-react"
|
import { ArrowRightIcon } from "@radix-ui/react-icons"
|
||||||
|
|
||||||
import { cn } from "@/lib/utils"
|
import { cn } from "@/lib/utils"
|
||||||
import { ExamplesNav } from "@/components/examples-nav"
|
import { ExamplesNav } from "@/components/examples-nav"
|
||||||
@@ -35,7 +35,7 @@ export default function ExamplesLayout({ children }: ExamplesLayoutProps) {
|
|||||||
<span className="hidden sm:inline">
|
<span className="hidden sm:inline">
|
||||||
Introducing Style, a new CLI and more.
|
Introducing Style, a new CLI and more.
|
||||||
</span>
|
</span>
|
||||||
<ChevronRight className="ml-1 h-4 w-4" />
|
<ArrowRightIcon className="ml-1 h-4 w-4" />
|
||||||
</Link>
|
</Link>
|
||||||
<PageHeaderHeading className="hidden md:block">
|
<PageHeaderHeading className="hidden md:block">
|
||||||
Check out some examples.
|
Check out some examples.
|
||||||
|
|||||||
@@ -1,8 +1,7 @@
|
|||||||
import Image from "next/image"
|
import Image from "next/image"
|
||||||
import { ListMusic, PlusCircle } from "lucide-react"
|
import { PlusCircledIcon } from "@radix-ui/react-icons"
|
||||||
|
|
||||||
import { cn } from "@/lib/utils"
|
import { cn } from "@/lib/utils"
|
||||||
import { AspectRatio } from "@/registry/new-york/ui/aspect-ratio"
|
|
||||||
import {
|
import {
|
||||||
ContextMenu,
|
ContextMenu,
|
||||||
ContextMenuContent,
|
ContextMenuContent,
|
||||||
@@ -55,13 +54,25 @@ export function AlbumArtwork({
|
|||||||
<ContextMenuSubTrigger>Add to Playlist</ContextMenuSubTrigger>
|
<ContextMenuSubTrigger>Add to Playlist</ContextMenuSubTrigger>
|
||||||
<ContextMenuSubContent className="w-48">
|
<ContextMenuSubContent className="w-48">
|
||||||
<ContextMenuItem>
|
<ContextMenuItem>
|
||||||
<PlusCircle className="mr-2 h-4 w-4" />
|
<PlusCircledIcon className="mr-2 h-4 w-4" />
|
||||||
New Playlist
|
New Playlist
|
||||||
</ContextMenuItem>
|
</ContextMenuItem>
|
||||||
<ContextMenuSeparator />
|
<ContextMenuSeparator />
|
||||||
{playlists.map((playlist) => (
|
{playlists.map((playlist) => (
|
||||||
<ContextMenuItem key={playlist}>
|
<ContextMenuItem key={playlist}>
|
||||||
<ListMusic className="mr-2 h-4 w-4" /> {playlist}
|
<svg
|
||||||
|
xmlns="http://www.w3.org/2000/svg"
|
||||||
|
fill="none"
|
||||||
|
stroke="currentColor"
|
||||||
|
strokeLinecap="round"
|
||||||
|
strokeLinejoin="round"
|
||||||
|
strokeWidth="2"
|
||||||
|
className="mr-2 h-4 w-4"
|
||||||
|
viewBox="0 0 24 24"
|
||||||
|
>
|
||||||
|
<path d="M21 15V6M18.5 18a2.5 2.5 0 1 0 0-5 2.5 2.5 0 0 0 0 5ZM12 12H3M16 6H3M12 18H3" />
|
||||||
|
</svg>
|
||||||
|
{playlist}
|
||||||
</ContextMenuItem>
|
</ContextMenuItem>
|
||||||
))}
|
))}
|
||||||
</ContextMenuSubContent>
|
</ContextMenuSubContent>
|
||||||
|
|||||||
@@ -1,5 +1,3 @@
|
|||||||
import { Globe, Mic } from "lucide-react"
|
|
||||||
|
|
||||||
import {
|
import {
|
||||||
Menubar,
|
Menubar,
|
||||||
MenubarCheckboxItem,
|
MenubarCheckboxItem,
|
||||||
@@ -130,13 +128,37 @@ export function Menu() {
|
|||||||
<MenubarItem>
|
<MenubarItem>
|
||||||
Smart Dictation...{" "}
|
Smart Dictation...{" "}
|
||||||
<MenubarShortcut>
|
<MenubarShortcut>
|
||||||
<Mic className="h-4 w-4" />
|
<svg
|
||||||
|
xmlns="http://www.w3.org/2000/svg"
|
||||||
|
fill="none"
|
||||||
|
stroke="currentColor"
|
||||||
|
strokeLinecap="round"
|
||||||
|
strokeLinejoin="round"
|
||||||
|
strokeWidth="2"
|
||||||
|
className="h-4 w-4"
|
||||||
|
viewBox="0 0 24 24"
|
||||||
|
>
|
||||||
|
<path d="m12 8-9.04 9.06a2.82 2.82 0 1 0 3.98 3.98L16 12" />
|
||||||
|
<circle cx="17" cy="7" r="5" />
|
||||||
|
</svg>
|
||||||
</MenubarShortcut>
|
</MenubarShortcut>
|
||||||
</MenubarItem>
|
</MenubarItem>
|
||||||
<MenubarItem>
|
<MenubarItem>
|
||||||
Emoji & Symbols{" "}
|
Emoji & Symbols{" "}
|
||||||
<MenubarShortcut>
|
<MenubarShortcut>
|
||||||
<Globe className="h-4 w-4" />
|
<svg
|
||||||
|
xmlns="http://www.w3.org/2000/svg"
|
||||||
|
fill="none"
|
||||||
|
stroke="currentColor"
|
||||||
|
strokeLinecap="round"
|
||||||
|
strokeLinejoin="round"
|
||||||
|
strokeWidth="2"
|
||||||
|
className="h-4 w-4"
|
||||||
|
viewBox="0 0 24 24"
|
||||||
|
>
|
||||||
|
<circle cx="12" cy="12" r="10" />
|
||||||
|
<path d="M2 12h20M12 2a15.3 15.3 0 0 1 4 10 15.3 15.3 0 0 1-4 10 15.3 15.3 0 0 1-4-10 15.3 15.3 0 0 1 4-10z" />
|
||||||
|
</svg>
|
||||||
</MenubarShortcut>
|
</MenubarShortcut>
|
||||||
</MenubarItem>
|
</MenubarItem>
|
||||||
</MenubarContent>
|
</MenubarContent>
|
||||||
|
|||||||
@@ -1,5 +1,3 @@
|
|||||||
import { Plus, Podcast } from "lucide-react"
|
|
||||||
|
|
||||||
import { Button } from "@/registry/new-york/ui/button"
|
import { Button } from "@/registry/new-york/ui/button"
|
||||||
import {
|
import {
|
||||||
Dialog,
|
Dialog,
|
||||||
@@ -17,7 +15,21 @@ export function PodcastEmptyPlaceholder() {
|
|||||||
return (
|
return (
|
||||||
<div className="flex h-[450px] shrink-0 items-center justify-center rounded-md border border-dashed">
|
<div className="flex h-[450px] shrink-0 items-center justify-center rounded-md border border-dashed">
|
||||||
<div className="mx-auto flex max-w-[420px] flex-col items-center justify-center text-center">
|
<div className="mx-auto flex max-w-[420px] flex-col items-center justify-center text-center">
|
||||||
<Podcast className="h-10 w-10 text-muted-foreground" />
|
<svg
|
||||||
|
xmlns="http://www.w3.org/2000/svg"
|
||||||
|
fill="none"
|
||||||
|
stroke="currentColor"
|
||||||
|
strokeLinecap="round"
|
||||||
|
strokeLinejoin="round"
|
||||||
|
strokeWidth="2"
|
||||||
|
className="h-10 w-10 text-muted-foreground"
|
||||||
|
viewBox="0 0 24 24"
|
||||||
|
>
|
||||||
|
<circle cx="12" cy="11" r="1" />
|
||||||
|
<path d="M11 17a1 1 0 0 1 2 0c0 .5-.34 3-.5 4.5a.5.5 0 0 1-1 0c-.16-1.5-.5-4-.5-4.5ZM8 14a5 5 0 1 1 8 0" />
|
||||||
|
<path d="M17 18.5a9 9 0 1 0-10 0" />
|
||||||
|
</svg>
|
||||||
|
|
||||||
<h3 className="mt-4 text-lg font-semibold">No episodes added</h3>
|
<h3 className="mt-4 text-lg font-semibold">No episodes added</h3>
|
||||||
<p className="mb-4 mt-2 text-sm text-muted-foreground">
|
<p className="mb-4 mt-2 text-sm text-muted-foreground">
|
||||||
You have not added any podcasts. Add one below.
|
You have not added any podcasts. Add one below.
|
||||||
@@ -25,7 +37,6 @@ export function PodcastEmptyPlaceholder() {
|
|||||||
<Dialog>
|
<Dialog>
|
||||||
<DialogTrigger>
|
<DialogTrigger>
|
||||||
<Button size="sm" className="relative">
|
<Button size="sm" className="relative">
|
||||||
<Plus className="mr-2 h-4 w-4" />
|
|
||||||
Add Podcast
|
Add Podcast
|
||||||
</Button>
|
</Button>
|
||||||
</DialogTrigger>
|
</DialogTrigger>
|
||||||
|
|||||||
@@ -1,15 +1,3 @@
|
|||||||
import {
|
|
||||||
LayoutGrid,
|
|
||||||
Library,
|
|
||||||
ListMusic,
|
|
||||||
Mic2,
|
|
||||||
Music,
|
|
||||||
Music2,
|
|
||||||
PlayCircle,
|
|
||||||
Radio,
|
|
||||||
User,
|
|
||||||
} from "lucide-react"
|
|
||||||
|
|
||||||
import { cn } from "@/lib/utils"
|
import { cn } from "@/lib/utils"
|
||||||
import { Button } from "@/registry/new-york/ui/button"
|
import { Button } from "@/registry/new-york/ui/button"
|
||||||
import { ScrollArea } from "@/registry/new-york/ui/scroll-area"
|
import { ScrollArea } from "@/registry/new-york/ui/scroll-area"
|
||||||
@@ -30,15 +18,56 @@ export function Sidebar({ className, playlists }: SidebarProps) {
|
|||||||
</h2>
|
</h2>
|
||||||
<div className="space-y-1">
|
<div className="space-y-1">
|
||||||
<Button variant="secondary" className="w-full justify-start">
|
<Button variant="secondary" className="w-full justify-start">
|
||||||
<PlayCircle className="mr-2 h-4 w-4" />
|
<svg
|
||||||
|
xmlns="http://www.w3.org/2000/svg"
|
||||||
|
viewBox="0 0 24 24"
|
||||||
|
fill="none"
|
||||||
|
stroke="currentColor"
|
||||||
|
strokeWidth="2"
|
||||||
|
strokeLinecap="round"
|
||||||
|
strokeLinejoin="round"
|
||||||
|
className="mr-2 h-4 w-4"
|
||||||
|
>
|
||||||
|
<circle cx="12" cy="12" r="10" />
|
||||||
|
<polygon points="10 8 16 12 10 16 10 8" />
|
||||||
|
</svg>
|
||||||
Listen Now
|
Listen Now
|
||||||
</Button>
|
</Button>
|
||||||
<Button variant="ghost" className="w-full justify-start">
|
<Button variant="ghost" className="w-full justify-start">
|
||||||
<LayoutGrid className="mr-2 h-4 w-4" />
|
<svg
|
||||||
|
xmlns="http://www.w3.org/2000/svg"
|
||||||
|
viewBox="0 0 24 24"
|
||||||
|
fill="none"
|
||||||
|
stroke="currentColor"
|
||||||
|
strokeWidth="2"
|
||||||
|
strokeLinecap="round"
|
||||||
|
strokeLinejoin="round"
|
||||||
|
className="mr-2 h-4 w-4"
|
||||||
|
>
|
||||||
|
<rect width="7" height="7" x="3" y="3" rx="1" />
|
||||||
|
<rect width="7" height="7" x="14" y="3" rx="1" />
|
||||||
|
<rect width="7" height="7" x="14" y="14" rx="1" />
|
||||||
|
<rect width="7" height="7" x="3" y="14" rx="1" />
|
||||||
|
</svg>
|
||||||
Browse
|
Browse
|
||||||
</Button>
|
</Button>
|
||||||
<Button variant="ghost" className="w-full justify-start">
|
<Button variant="ghost" className="w-full justify-start">
|
||||||
<Radio className="mr-2 h-4 w-4" />
|
<svg
|
||||||
|
xmlns="http://www.w3.org/2000/svg"
|
||||||
|
viewBox="0 0 24 24"
|
||||||
|
fill="none"
|
||||||
|
stroke="currentColor"
|
||||||
|
strokeWidth="2"
|
||||||
|
strokeLinecap="round"
|
||||||
|
strokeLinejoin="round"
|
||||||
|
className="mr-2 h-4 w-4"
|
||||||
|
>
|
||||||
|
<path d="M4.9 19.1C1 15.2 1 8.8 4.9 4.9" />
|
||||||
|
<path d="M7.8 16.2c-2.3-2.3-2.3-6.1 0-8.5" />
|
||||||
|
<circle cx="12" cy="12" r="2" />
|
||||||
|
<path d="M16.2 7.8c2.3 2.3 2.3 6.1 0 8.5" />
|
||||||
|
<path d="M19.1 4.9C23 8.8 23 15.1 19.1 19" />
|
||||||
|
</svg>
|
||||||
Radio
|
Radio
|
||||||
</Button>
|
</Button>
|
||||||
</div>
|
</div>
|
||||||
@@ -49,23 +78,88 @@ export function Sidebar({ className, playlists }: SidebarProps) {
|
|||||||
</h2>
|
</h2>
|
||||||
<div className="space-y-1">
|
<div className="space-y-1">
|
||||||
<Button variant="ghost" className="w-full justify-start">
|
<Button variant="ghost" className="w-full justify-start">
|
||||||
<ListMusic className="mr-2 h-4 w-4" />
|
<svg
|
||||||
|
xmlns="http://www.w3.org/2000/svg"
|
||||||
|
viewBox="0 0 24 24"
|
||||||
|
fill="none"
|
||||||
|
stroke="currentColor"
|
||||||
|
strokeWidth="2"
|
||||||
|
strokeLinecap="round"
|
||||||
|
strokeLinejoin="round"
|
||||||
|
className="mr-2 h-4 w-4"
|
||||||
|
>
|
||||||
|
<path d="M21 15V6" />
|
||||||
|
<path d="M18.5 18a2.5 2.5 0 1 0 0-5 2.5 2.5 0 0 0 0 5Z" />
|
||||||
|
<path d="M12 12H3" />
|
||||||
|
<path d="M16 6H3" />
|
||||||
|
<path d="M12 18H3" />
|
||||||
|
</svg>
|
||||||
Playlists
|
Playlists
|
||||||
</Button>
|
</Button>
|
||||||
<Button variant="ghost" className="w-full justify-start">
|
<Button variant="ghost" className="w-full justify-start">
|
||||||
<Music2 className="mr-2 h-4 w-4" />
|
<svg
|
||||||
|
xmlns="http://www.w3.org/2000/svg"
|
||||||
|
viewBox="0 0 24 24"
|
||||||
|
fill="none"
|
||||||
|
stroke="currentColor"
|
||||||
|
strokeWidth="2"
|
||||||
|
strokeLinecap="round"
|
||||||
|
strokeLinejoin="round"
|
||||||
|
className="mr-2 h-4 w-4"
|
||||||
|
>
|
||||||
|
<circle cx="8" cy="18" r="4" />
|
||||||
|
<path d="M12 18V2l7 4" />
|
||||||
|
</svg>
|
||||||
Songs
|
Songs
|
||||||
</Button>
|
</Button>
|
||||||
<Button variant="ghost" className="w-full justify-start">
|
<Button variant="ghost" className="w-full justify-start">
|
||||||
<User className="mr-2 h-4 w-4" />
|
<svg
|
||||||
|
xmlns="http://www.w3.org/2000/svg"
|
||||||
|
viewBox="0 0 24 24"
|
||||||
|
fill="none"
|
||||||
|
stroke="currentColor"
|
||||||
|
strokeWidth="2"
|
||||||
|
strokeLinecap="round"
|
||||||
|
strokeLinejoin="round"
|
||||||
|
className="mr-2 h-4 w-4"
|
||||||
|
>
|
||||||
|
<path d="M19 21v-2a4 4 0 0 0-4-4H9a4 4 0 0 0-4 4v2" />
|
||||||
|
<circle cx="12" cy="7" r="4" />
|
||||||
|
</svg>
|
||||||
Made for You
|
Made for You
|
||||||
</Button>
|
</Button>
|
||||||
<Button variant="ghost" className="w-full justify-start">
|
<Button variant="ghost" className="w-full justify-start">
|
||||||
<Mic2 className="mr-2 h-4 w-4" />
|
<svg
|
||||||
|
xmlns="http://www.w3.org/2000/svg"
|
||||||
|
viewBox="0 0 24 24"
|
||||||
|
fill="none"
|
||||||
|
stroke="currentColor"
|
||||||
|
strokeWidth="2"
|
||||||
|
strokeLinecap="round"
|
||||||
|
strokeLinejoin="round"
|
||||||
|
className="mr-2 h-4 w-4"
|
||||||
|
>
|
||||||
|
<path d="m12 8-9.04 9.06a2.82 2.82 0 1 0 3.98 3.98L16 12" />
|
||||||
|
<circle cx="17" cy="7" r="5" />
|
||||||
|
</svg>
|
||||||
Artists
|
Artists
|
||||||
</Button>
|
</Button>
|
||||||
<Button variant="ghost" className="w-full justify-start">
|
<Button variant="ghost" className="w-full justify-start">
|
||||||
<Library className="mr-2 h-4 w-4" />
|
<svg
|
||||||
|
xmlns="http://www.w3.org/2000/svg"
|
||||||
|
viewBox="0 0 24 24"
|
||||||
|
fill="none"
|
||||||
|
stroke="currentColor"
|
||||||
|
strokeWidth="2"
|
||||||
|
strokeLinecap="round"
|
||||||
|
strokeLinejoin="round"
|
||||||
|
className="mr-2 h-4 w-4"
|
||||||
|
>
|
||||||
|
<path d="m16 6 4 14" />
|
||||||
|
<path d="M12 6v14" />
|
||||||
|
<path d="M8 8v12" />
|
||||||
|
<path d="M4 4v16" />
|
||||||
|
</svg>
|
||||||
Albums
|
Albums
|
||||||
</Button>
|
</Button>
|
||||||
</div>
|
</div>
|
||||||
@@ -82,7 +176,22 @@ export function Sidebar({ className, playlists }: SidebarProps) {
|
|||||||
variant="ghost"
|
variant="ghost"
|
||||||
className="w-full justify-start font-normal"
|
className="w-full justify-start font-normal"
|
||||||
>
|
>
|
||||||
<ListMusic className="mr-2 h-4 w-4" />
|
<svg
|
||||||
|
xmlns="http://www.w3.org/2000/svg"
|
||||||
|
viewBox="0 0 24 24"
|
||||||
|
fill="none"
|
||||||
|
stroke="currentColor"
|
||||||
|
strokeWidth="2"
|
||||||
|
strokeLinecap="round"
|
||||||
|
strokeLinejoin="round"
|
||||||
|
className="mr-2 h-4 w-4"
|
||||||
|
>
|
||||||
|
<path d="M21 15V6" />
|
||||||
|
<path d="M18.5 18a2.5 2.5 0 1 0 0-5 2.5 2.5 0 0 0 0 5Z" />
|
||||||
|
<path d="M12 12H3" />
|
||||||
|
<path d="M16 6H3" />
|
||||||
|
<path d="M12 18H3" />
|
||||||
|
</svg>
|
||||||
{playlist}
|
{playlist}
|
||||||
</Button>
|
</Button>
|
||||||
))}
|
))}
|
||||||
|
|||||||
@@ -1,5 +1,8 @@
|
|||||||
import { Metadata } from "next"
|
import { Metadata } from "next"
|
||||||
|
import Image from "next/image"
|
||||||
|
import { PlusCircledIcon } from "@radix-ui/react-icons"
|
||||||
|
|
||||||
|
import { Button } from "@/registry/new-york/ui/button"
|
||||||
import { ScrollArea, ScrollBar } from "@/registry/new-york/ui/scroll-area"
|
import { ScrollArea, ScrollBar } from "@/registry/new-york/ui/scroll-area"
|
||||||
import { Separator } from "@/registry/new-york/ui/separator"
|
import { Separator } from "@/registry/new-york/ui/separator"
|
||||||
import {
|
import {
|
||||||
@@ -15,11 +18,6 @@ import { PodcastEmptyPlaceholder } from "./components/podcast-empty-placeholder"
|
|||||||
import { Sidebar } from "./components/sidebar"
|
import { Sidebar } from "./components/sidebar"
|
||||||
import { listenNowAlbums, madeForYouAlbums } from "./data/albums"
|
import { listenNowAlbums, madeForYouAlbums } from "./data/albums"
|
||||||
import { playlists } from "./data/playlists"
|
import { playlists } from "./data/playlists"
|
||||||
import "./styles.css"
|
|
||||||
import Image from "next/image"
|
|
||||||
import { PlusCircle } from "lucide-react"
|
|
||||||
|
|
||||||
import { Button } from "@/registry/new-york/ui/button"
|
|
||||||
|
|
||||||
export const metadata: Metadata = {
|
export const metadata: Metadata = {
|
||||||
title: "Music App",
|
title: "Music App",
|
||||||
@@ -66,7 +64,7 @@ export default function MusicPage() {
|
|||||||
</TabsList>
|
</TabsList>
|
||||||
<div className="ml-auto mr-4">
|
<div className="ml-auto mr-4">
|
||||||
<Button>
|
<Button>
|
||||||
<PlusCircle className="mr-2 h-4 w-4" />
|
<PlusCircledIcon className="mr-2 h-4 w-4" />
|
||||||
Add music
|
Add music
|
||||||
</Button>
|
</Button>
|
||||||
</div>
|
</div>
|
||||||
|
|||||||
@@ -1,65 +0,0 @@
|
|||||||
[data-section="music"] {
|
|
||||||
--background: 0 0% 100%;
|
|
||||||
--foreground: 222.2 47.4% 11.2%;
|
|
||||||
|
|
||||||
--muted: 243 5% 96%;
|
|
||||||
--muted-foreground: 215.4 16.3% 46.9%;
|
|
||||||
|
|
||||||
--popover: 0 0% 100%;
|
|
||||||
--popover-foreground: 222.2 47.4% 11.2%;
|
|
||||||
|
|
||||||
--border: 214.3 31.8% 91.4%;
|
|
||||||
--input: 214.3 31.8% 91.4%;
|
|
||||||
|
|
||||||
--card: 0 0% 100%;
|
|
||||||
--card-foreground: 222.2 47.4% 11.2%;
|
|
||||||
|
|
||||||
--primary: 349 89% 60%;
|
|
||||||
--primary-foreground: 0 0% 100%;
|
|
||||||
|
|
||||||
--secondary: 243 11% 4%;
|
|
||||||
--secondary-foreground: 0 0% 98%;
|
|
||||||
|
|
||||||
--accent: 243 11% 4%;
|
|
||||||
--accent-foreground: 0 0% 100%;
|
|
||||||
|
|
||||||
--destructive: 0 100% 50%;
|
|
||||||
--destructive-foreground: 210 40% 98%;
|
|
||||||
|
|
||||||
--ring: 349 89% 60%;
|
|
||||||
|
|
||||||
--radius: 0.5rem;
|
|
||||||
}
|
|
||||||
|
|
||||||
.dark [data-section="music"] {
|
|
||||||
--background: 224 71% 4%;
|
|
||||||
--foreground: 213 31% 91%;
|
|
||||||
|
|
||||||
--muted: 223 47% 11%;
|
|
||||||
--muted-foreground: 215.4 16.3% 56.9%;
|
|
||||||
|
|
||||||
--accent: 216 34% 17%;
|
|
||||||
--accent-foreground: 210 40% 98%;
|
|
||||||
|
|
||||||
--popover: 224 71% 4%;
|
|
||||||
--popover-foreground: 215 20.2% 65.1%;
|
|
||||||
|
|
||||||
--border: 216 34% 17%;
|
|
||||||
--input: 216 34% 17%;
|
|
||||||
|
|
||||||
--card: 224 71% 4%;
|
|
||||||
--card-foreground: 213 31% 91%;
|
|
||||||
|
|
||||||
--primary: 349 89% 60%;
|
|
||||||
--primary-foreground: 0 0% 100%;
|
|
||||||
|
|
||||||
--secondary: 222.2 47.4% 11.2%;
|
|
||||||
--secondary-foreground: 210 40% 98%;
|
|
||||||
|
|
||||||
--destructive: 0 63% 31%;
|
|
||||||
--destructive-foreground: 210 40% 98%;
|
|
||||||
|
|
||||||
--ring: 216 34% 17%;
|
|
||||||
|
|
||||||
--radius: 0.5rem;
|
|
||||||
}
|
|
||||||
@@ -1,153 +0,0 @@
|
|||||||
import {
|
|
||||||
AlertTriangle,
|
|
||||||
ArrowRight,
|
|
||||||
Check,
|
|
||||||
ChevronLeft,
|
|
||||||
ChevronRight,
|
|
||||||
ClipboardCheck,
|
|
||||||
Copy,
|
|
||||||
CreditCard,
|
|
||||||
Fingerprint,
|
|
||||||
HelpCircle,
|
|
||||||
Laptop,
|
|
||||||
Loader2,
|
|
||||||
LucideProps,
|
|
||||||
Moon,
|
|
||||||
MoreVertical,
|
|
||||||
Plus,
|
|
||||||
Settings,
|
|
||||||
SunMedium,
|
|
||||||
Trash,
|
|
||||||
Twitter,
|
|
||||||
User,
|
|
||||||
X,
|
|
||||||
type Icon as LucideIcon,
|
|
||||||
} from "lucide-react"
|
|
||||||
|
|
||||||
export type Icon = LucideIcon
|
|
||||||
|
|
||||||
export const Icons = {
|
|
||||||
logo: Fingerprint,
|
|
||||||
close: X,
|
|
||||||
spinner: Loader2,
|
|
||||||
chevronLeft: ChevronLeft,
|
|
||||||
chevronRight: ChevronRight,
|
|
||||||
trash: Trash,
|
|
||||||
settings: Settings,
|
|
||||||
billing: CreditCard,
|
|
||||||
ellipsis: MoreVertical,
|
|
||||||
add: Plus,
|
|
||||||
warning: AlertTriangle,
|
|
||||||
user: User,
|
|
||||||
arrowRight: ArrowRight,
|
|
||||||
help: HelpCircle,
|
|
||||||
twitter: Twitter,
|
|
||||||
check: Check,
|
|
||||||
copy: Copy,
|
|
||||||
copyDone: ClipboardCheck,
|
|
||||||
sun: SunMedium,
|
|
||||||
moon: Moon,
|
|
||||||
laptop: Laptop,
|
|
||||||
gitHub: (props: LucideProps) => (
|
|
||||||
<svg viewBox="0 0 438.549 438.549" {...props}>
|
|
||||||
<path
|
|
||||||
fill="currentColor"
|
|
||||||
d="M409.132 114.573c-19.608-33.596-46.205-60.194-79.798-79.8-33.598-19.607-70.277-29.408-110.063-29.408-39.781 0-76.472 9.804-110.063 29.408-33.596 19.605-60.192 46.204-79.8 79.8C9.803 148.168 0 184.854 0 224.63c0 47.78 13.94 90.745 41.827 128.906 27.884 38.164 63.906 64.572 108.063 79.227 5.14.954 8.945.283 11.419-1.996 2.475-2.282 3.711-5.14 3.711-8.562 0-.571-.049-5.708-.144-15.417a2549.81 2549.81 0 01-.144-25.406l-6.567 1.136c-4.187.767-9.469 1.092-15.846 1-6.374-.089-12.991-.757-19.842-1.999-6.854-1.231-13.229-4.086-19.13-8.559-5.898-4.473-10.085-10.328-12.56-17.556l-2.855-6.57c-1.903-4.374-4.899-9.233-8.992-14.559-4.093-5.331-8.232-8.945-12.419-10.848l-1.999-1.431c-1.332-.951-2.568-2.098-3.711-3.429-1.142-1.331-1.997-2.663-2.568-3.997-.572-1.335-.098-2.43 1.427-3.289 1.525-.859 4.281-1.276 8.28-1.276l5.708.853c3.807.763 8.516 3.042 14.133 6.851 5.614 3.806 10.229 8.754 13.846 14.842 4.38 7.806 9.657 13.754 15.846 17.847 6.184 4.093 12.419 6.136 18.699 6.136 6.28 0 11.704-.476 16.274-1.423 4.565-.952 8.848-2.383 12.847-4.285 1.713-12.758 6.377-22.559 13.988-29.41-10.848-1.14-20.601-2.857-29.264-5.14-8.658-2.286-17.605-5.996-26.835-11.14-9.235-5.137-16.896-11.516-22.985-19.126-6.09-7.614-11.088-17.61-14.987-29.979-3.901-12.374-5.852-26.648-5.852-42.826 0-23.035 7.52-42.637 22.557-58.817-7.044-17.318-6.379-36.732 1.997-58.24 5.52-1.715 13.706-.428 24.554 3.853 10.85 4.283 18.794 7.952 23.84 10.994 5.046 3.041 9.089 5.618 12.135 7.708 17.705-4.947 35.976-7.421 54.818-7.421s37.117 2.474 54.823 7.421l10.849-6.849c7.419-4.57 16.18-8.758 26.262-12.565 10.088-3.805 17.802-4.853 23.134-3.138 8.562 21.509 9.325 40.922 2.279 58.24 15.036 16.18 22.559 35.787 22.559 58.817 0 16.178-1.958 30.497-5.853 42.966-3.9 12.471-8.941 22.457-15.125 29.979-6.191 7.521-13.901 13.85-23.131 18.986-9.232 5.14-18.182 8.85-26.84 11.136-8.662 2.286-18.415 4.004-29.263 5.146 9.894 8.562 14.842 22.077 14.842 40.539v60.237c0 3.422 1.19 6.279 3.572 8.562 2.379 2.279 6.136 2.95 11.276 1.995 44.163-14.653 80.185-41.062 108.068-79.226 27.88-38.161 41.825-81.126 41.825-128.906-.01-39.771-9.818-76.454-29.414-110.049z"
|
|
||||||
></path>
|
|
||||||
</svg>
|
|
||||||
),
|
|
||||||
completeMode: ({ ...props }: LucideProps) => (
|
|
||||||
<svg
|
|
||||||
xmlns="http://www.w3.org/2000/svg"
|
|
||||||
viewBox="0 0 20 20"
|
|
||||||
fill="none"
|
|
||||||
{...props}
|
|
||||||
>
|
|
||||||
<rect x="4" y="3" width="12" height="2" rx="1" fill="currentColor"></rect>
|
|
||||||
<rect x="4" y="7" width="12" height="2" rx="1" fill="currentColor"></rect>
|
|
||||||
<rect x="4" y="11" width="3" height="2" rx="1" fill="currentColor"></rect>
|
|
||||||
<rect x="4" y="15" width="3" height="2" rx="1" fill="currentColor"></rect>
|
|
||||||
<rect
|
|
||||||
x="8.5"
|
|
||||||
y="11"
|
|
||||||
width="3"
|
|
||||||
height="2"
|
|
||||||
rx="1"
|
|
||||||
fill="currentColor"
|
|
||||||
></rect>
|
|
||||||
<rect
|
|
||||||
x="8.5"
|
|
||||||
y="15"
|
|
||||||
width="3"
|
|
||||||
height="2"
|
|
||||||
rx="1"
|
|
||||||
fill="currentColor"
|
|
||||||
></rect>
|
|
||||||
<rect
|
|
||||||
x="13"
|
|
||||||
y="11"
|
|
||||||
width="3"
|
|
||||||
height="2"
|
|
||||||
rx="1"
|
|
||||||
fill="currentColor"
|
|
||||||
></rect>
|
|
||||||
</svg>
|
|
||||||
),
|
|
||||||
insertMode: ({ ...props }: LucideProps) => (
|
|
||||||
<svg
|
|
||||||
xmlns="http://www.w3.org/2000/svg"
|
|
||||||
viewBox="0 0 20 20"
|
|
||||||
fill="none"
|
|
||||||
{...props}
|
|
||||||
>
|
|
||||||
<path
|
|
||||||
fillRule="evenodd"
|
|
||||||
clipRule="evenodd"
|
|
||||||
d="M14.491 7.769a.888.888 0 0 1 .287.648.888.888 0 0 1-.287.648l-3.916 3.667a1.013 1.013 0 0 1-.692.268c-.26 0-.509-.097-.692-.268L5.275 9.065A.886.886 0 0 1 5 8.42a.889.889 0 0 1 .287-.64c.181-.17.427-.267.683-.269.257-.002.504.09.69.258L8.903 9.87V3.917c0-.243.103-.477.287-.649.183-.171.432-.268.692-.268.26 0 .509.097.692.268a.888.888 0 0 1 .287.649V9.87l2.245-2.102c.183-.172.432-.269.692-.269.26 0 .508.097.692.269Z"
|
|
||||||
fill="currentColor"
|
|
||||||
></path>
|
|
||||||
<rect x="4" y="15" width="3" height="2" rx="1" fill="currentColor"></rect>
|
|
||||||
<rect
|
|
||||||
x="8.5"
|
|
||||||
y="15"
|
|
||||||
width="3"
|
|
||||||
height="2"
|
|
||||||
rx="1"
|
|
||||||
fill="currentColor"
|
|
||||||
></rect>
|
|
||||||
<rect
|
|
||||||
x="13"
|
|
||||||
y="15"
|
|
||||||
width="3"
|
|
||||||
height="2"
|
|
||||||
rx="1"
|
|
||||||
fill="currentColor"
|
|
||||||
></rect>
|
|
||||||
</svg>
|
|
||||||
),
|
|
||||||
editMode: ({ ...props }: LucideProps) => (
|
|
||||||
<svg
|
|
||||||
xmlns="http://www.w3.org/2000/svg"
|
|
||||||
viewBox="0 0 20 20"
|
|
||||||
fill="none"
|
|
||||||
{...props}
|
|
||||||
>
|
|
||||||
<rect x="4" y="3" width="12" height="2" rx="1" fill="currentColor"></rect>
|
|
||||||
<rect x="4" y="7" width="12" height="2" rx="1" fill="currentColor"></rect>
|
|
||||||
<rect x="4" y="11" width="3" height="2" rx="1" fill="currentColor"></rect>
|
|
||||||
<rect x="4" y="15" width="4" height="2" rx="1" fill="currentColor"></rect>
|
|
||||||
<rect
|
|
||||||
x="8.5"
|
|
||||||
y="11"
|
|
||||||
width="3"
|
|
||||||
height="2"
|
|
||||||
rx="1"
|
|
||||||
fill="currentColor"
|
|
||||||
></rect>
|
|
||||||
<path
|
|
||||||
d="M17.154 11.346a1.182 1.182 0 0 0-1.671 0L11 15.829V17.5h1.671l4.483-4.483a1.182 1.182 0 0 0 0-1.671Z"
|
|
||||||
fill="currentColor"
|
|
||||||
></path>
|
|
||||||
</svg>
|
|
||||||
),
|
|
||||||
}
|
|
||||||
@@ -1,8 +1,8 @@
|
|||||||
"use client"
|
"use client"
|
||||||
|
|
||||||
import * as React from "react"
|
import * as React from "react"
|
||||||
|
import { CaretSortIcon, CheckIcon } from "@radix-ui/react-icons"
|
||||||
import { PopoverProps } from "@radix-ui/react-popover"
|
import { PopoverProps } from "@radix-ui/react-popover"
|
||||||
import { Check, ChevronsUpDown } from "lucide-react"
|
|
||||||
|
|
||||||
import { cn } from "@/lib/utils"
|
import { cn } from "@/lib/utils"
|
||||||
import { useMutationObserver } from "@/hooks/use-mutation-observer"
|
import { useMutationObserver } from "@/hooks/use-mutation-observer"
|
||||||
@@ -64,7 +64,7 @@ export function ModelSelector({ models, types, ...props }: ModelSelectorProps) {
|
|||||||
className="w-full justify-between"
|
className="w-full justify-between"
|
||||||
>
|
>
|
||||||
{selectedModel ? selectedModel.name : "Select a model..."}
|
{selectedModel ? selectedModel.name : "Select a model..."}
|
||||||
<ChevronsUpDown className="ml-2 h-4 w-4 shrink-0 opacity-50" />
|
<CaretSortIcon className="ml-2 h-4 w-4 shrink-0 opacity-50" />
|
||||||
</Button>
|
</Button>
|
||||||
</PopoverTrigger>
|
</PopoverTrigger>
|
||||||
<PopoverContent align="end" className="w-[250px] p-0">
|
<PopoverContent align="end" className="w-[250px] p-0">
|
||||||
@@ -152,7 +152,7 @@ function ModelItem({ model, isSelected, onSelect, onPeek }: ModelItemProps) {
|
|||||||
className="aria-selected:bg-primary aria-selected:text-primary-foreground"
|
className="aria-selected:bg-primary aria-selected:text-primary-foreground"
|
||||||
>
|
>
|
||||||
{model.name}
|
{model.name}
|
||||||
<Check
|
<CheckIcon
|
||||||
className={cn(
|
className={cn(
|
||||||
"ml-auto h-4 w-4",
|
"ml-auto h-4 w-4",
|
||||||
isSelected ? "opacity-100" : "opacity-0"
|
isSelected ? "opacity-100" : "opacity-0"
|
||||||
|
|||||||
@@ -2,7 +2,7 @@
|
|||||||
|
|
||||||
import * as React from "react"
|
import * as React from "react"
|
||||||
import { Dialog } from "@radix-ui/react-dialog"
|
import { Dialog } from "@radix-ui/react-dialog"
|
||||||
import { Flag, MoreHorizontal, Trash } from "lucide-react"
|
import { DotsHorizontalIcon } from "@radix-ui/react-icons"
|
||||||
|
|
||||||
import {
|
import {
|
||||||
AlertDialog,
|
AlertDialog,
|
||||||
@@ -42,12 +42,11 @@ export function PresetActions() {
|
|||||||
<DropdownMenuTrigger asChild>
|
<DropdownMenuTrigger asChild>
|
||||||
<Button variant="secondary">
|
<Button variant="secondary">
|
||||||
<span className="sr-only">Actions</span>
|
<span className="sr-only">Actions</span>
|
||||||
<MoreHorizontal className="h-4 w-4" />
|
<DotsHorizontalIcon className="h-4 w-4" />
|
||||||
</Button>
|
</Button>
|
||||||
</DropdownMenuTrigger>
|
</DropdownMenuTrigger>
|
||||||
<DropdownMenuContent align="end">
|
<DropdownMenuContent align="end">
|
||||||
<DropdownMenuItem onSelect={() => setIsOpen(true)}>
|
<DropdownMenuItem onSelect={() => setIsOpen(true)}>
|
||||||
<Flag className="mr-2 h-4 w-4" />
|
|
||||||
Content filter preferences
|
Content filter preferences
|
||||||
</DropdownMenuItem>
|
</DropdownMenuItem>
|
||||||
<DropdownMenuSeparator />
|
<DropdownMenuSeparator />
|
||||||
@@ -55,7 +54,6 @@ export function PresetActions() {
|
|||||||
onSelect={() => setShowDeleteDialog(true)}
|
onSelect={() => setShowDeleteDialog(true)}
|
||||||
className="text-red-600"
|
className="text-red-600"
|
||||||
>
|
>
|
||||||
<Trash className="mr-2 h-4 w-4" />
|
|
||||||
Delete preset
|
Delete preset
|
||||||
</DropdownMenuItem>
|
</DropdownMenuItem>
|
||||||
</DropdownMenuContent>
|
</DropdownMenuContent>
|
||||||
|
|||||||
@@ -2,8 +2,8 @@
|
|||||||
|
|
||||||
import * as React from "react"
|
import * as React from "react"
|
||||||
import { useRouter } from "next/navigation"
|
import { useRouter } from "next/navigation"
|
||||||
|
import { CaretSortIcon, CheckIcon } from "@radix-ui/react-icons"
|
||||||
import { PopoverProps } from "@radix-ui/react-popover"
|
import { PopoverProps } from "@radix-ui/react-popover"
|
||||||
import { Check, ChevronsUpDown } from "lucide-react"
|
|
||||||
|
|
||||||
import { cn } from "@/lib/utils"
|
import { cn } from "@/lib/utils"
|
||||||
import { Button } from "@/registry/new-york/ui/button"
|
import { Button } from "@/registry/new-york/ui/button"
|
||||||
@@ -42,7 +42,7 @@ export function PresetSelector({ presets, ...props }: PresetSelectorProps) {
|
|||||||
className="flex-1 justify-between md:max-w-[200px] lg:max-w-[300px]"
|
className="flex-1 justify-between md:max-w-[200px] lg:max-w-[300px]"
|
||||||
>
|
>
|
||||||
{selectedPreset ? selectedPreset.name : "Load a preset..."}
|
{selectedPreset ? selectedPreset.name : "Load a preset..."}
|
||||||
<ChevronsUpDown className="ml-2 h-4 w-4 shrink-0 opacity-50" />
|
<CaretSortIcon className="ml-2 h-4 w-4 shrink-0 opacity-50" />
|
||||||
</Button>
|
</Button>
|
||||||
</PopoverTrigger>
|
</PopoverTrigger>
|
||||||
<PopoverContent className="w-[300px] p-0">
|
<PopoverContent className="w-[300px] p-0">
|
||||||
@@ -59,7 +59,7 @@ export function PresetSelector({ presets, ...props }: PresetSelectorProps) {
|
|||||||
}}
|
}}
|
||||||
>
|
>
|
||||||
{preset.name}
|
{preset.name}
|
||||||
<Check
|
<CheckIcon
|
||||||
className={cn(
|
className={cn(
|
||||||
"ml-auto h-4 w-4",
|
"ml-auto h-4 w-4",
|
||||||
selectedPreset?.id === preset.id
|
selectedPreset?.id === preset.id
|
||||||
|
|||||||
@@ -1,4 +1,4 @@
|
|||||||
import { Copy } from "lucide-react"
|
import { CopyIcon } from "@radix-ui/react-icons"
|
||||||
|
|
||||||
import { Button } from "@/registry/new-york/ui/button"
|
import { Button } from "@/registry/new-york/ui/button"
|
||||||
import { Input } from "@/registry/new-york/ui/input"
|
import { Input } from "@/registry/new-york/ui/input"
|
||||||
@@ -37,7 +37,7 @@ export function PresetShare() {
|
|||||||
</div>
|
</div>
|
||||||
<Button type="submit" size="sm" className="px-3">
|
<Button type="submit" size="sm" className="px-3">
|
||||||
<span className="sr-only">Copy</span>
|
<span className="sr-only">Copy</span>
|
||||||
<Copy className="h-4 w-4" />
|
<CopyIcon className="h-4 w-4" />
|
||||||
</Button>
|
</Button>
|
||||||
</div>
|
</div>
|
||||||
</PopoverContent>
|
</PopoverContent>
|
||||||
|
|||||||
@@ -1,5 +1,6 @@
|
|||||||
import { Metadata } from "next"
|
import { Metadata } from "next"
|
||||||
import { History } from "lucide-react"
|
import Image from "next/image"
|
||||||
|
import { CounterClockwiseClockIcon } from "@radix-ui/react-icons"
|
||||||
|
|
||||||
import { Button } from "@/registry/new-york/ui/button"
|
import { Button } from "@/registry/new-york/ui/button"
|
||||||
import {
|
import {
|
||||||
@@ -18,7 +19,6 @@ import {
|
|||||||
import { Textarea } from "@/registry/new-york/ui/textarea"
|
import { Textarea } from "@/registry/new-york/ui/textarea"
|
||||||
|
|
||||||
import { CodeViewer } from "./components/code-viewer"
|
import { CodeViewer } from "./components/code-viewer"
|
||||||
import { Icons } from "./components/icons"
|
|
||||||
import { MaxLengthSelector } from "./components/maxlength-selector"
|
import { MaxLengthSelector } from "./components/maxlength-selector"
|
||||||
import { ModelSelector } from "./components/model-selector"
|
import { ModelSelector } from "./components/model-selector"
|
||||||
import { PresetActions } from "./components/preset-actions"
|
import { PresetActions } from "./components/preset-actions"
|
||||||
@@ -29,8 +29,6 @@ import { TemperatureSelector } from "./components/temperature-selector"
|
|||||||
import { TopPSelector } from "./components/top-p-selector"
|
import { TopPSelector } from "./components/top-p-selector"
|
||||||
import { models, types } from "./data/models"
|
import { models, types } from "./data/models"
|
||||||
import { presets } from "./data/presets"
|
import { presets } from "./data/presets"
|
||||||
import "./styles.css"
|
|
||||||
import Image from "next/image"
|
|
||||||
|
|
||||||
export const metadata: Metadata = {
|
export const metadata: Metadata = {
|
||||||
title: "Playground",
|
title: "Playground",
|
||||||
@@ -91,15 +89,163 @@ export default function PlaygroundPage() {
|
|||||||
<TabsList className="grid grid-cols-3">
|
<TabsList className="grid grid-cols-3">
|
||||||
<TabsTrigger value="complete">
|
<TabsTrigger value="complete">
|
||||||
<span className="sr-only">Complete</span>
|
<span className="sr-only">Complete</span>
|
||||||
<Icons.completeMode className="h-5 w-5" />
|
<svg
|
||||||
|
xmlns="http://www.w3.org/2000/svg"
|
||||||
|
viewBox="0 0 20 20"
|
||||||
|
fill="none"
|
||||||
|
className="h-5 w-5"
|
||||||
|
>
|
||||||
|
<rect
|
||||||
|
x="4"
|
||||||
|
y="3"
|
||||||
|
width="12"
|
||||||
|
height="2"
|
||||||
|
rx="1"
|
||||||
|
fill="currentColor"
|
||||||
|
></rect>
|
||||||
|
<rect
|
||||||
|
x="4"
|
||||||
|
y="7"
|
||||||
|
width="12"
|
||||||
|
height="2"
|
||||||
|
rx="1"
|
||||||
|
fill="currentColor"
|
||||||
|
></rect>
|
||||||
|
<rect
|
||||||
|
x="4"
|
||||||
|
y="11"
|
||||||
|
width="3"
|
||||||
|
height="2"
|
||||||
|
rx="1"
|
||||||
|
fill="currentColor"
|
||||||
|
></rect>
|
||||||
|
<rect
|
||||||
|
x="4"
|
||||||
|
y="15"
|
||||||
|
width="3"
|
||||||
|
height="2"
|
||||||
|
rx="1"
|
||||||
|
fill="currentColor"
|
||||||
|
></rect>
|
||||||
|
<rect
|
||||||
|
x="8.5"
|
||||||
|
y="11"
|
||||||
|
width="3"
|
||||||
|
height="2"
|
||||||
|
rx="1"
|
||||||
|
fill="currentColor"
|
||||||
|
></rect>
|
||||||
|
<rect
|
||||||
|
x="8.5"
|
||||||
|
y="15"
|
||||||
|
width="3"
|
||||||
|
height="2"
|
||||||
|
rx="1"
|
||||||
|
fill="currentColor"
|
||||||
|
></rect>
|
||||||
|
<rect
|
||||||
|
x="13"
|
||||||
|
y="11"
|
||||||
|
width="3"
|
||||||
|
height="2"
|
||||||
|
rx="1"
|
||||||
|
fill="currentColor"
|
||||||
|
></rect>
|
||||||
|
</svg>
|
||||||
</TabsTrigger>
|
</TabsTrigger>
|
||||||
<TabsTrigger value="insert">
|
<TabsTrigger value="insert">
|
||||||
<span className="sr-only">Insert</span>
|
<span className="sr-only">Insert</span>
|
||||||
<Icons.insertMode className="h-5 w-5" />
|
<svg
|
||||||
|
xmlns="http://www.w3.org/2000/svg"
|
||||||
|
viewBox="0 0 20 20"
|
||||||
|
fill="none"
|
||||||
|
className="h-5 w-5"
|
||||||
|
>
|
||||||
|
<path
|
||||||
|
fillRule="evenodd"
|
||||||
|
clipRule="evenodd"
|
||||||
|
d="M14.491 7.769a.888.888 0 0 1 .287.648.888.888 0 0 1-.287.648l-3.916 3.667a1.013 1.013 0 0 1-.692.268c-.26 0-.509-.097-.692-.268L5.275 9.065A.886.886 0 0 1 5 8.42a.889.889 0 0 1 .287-.64c.181-.17.427-.267.683-.269.257-.002.504.09.69.258L8.903 9.87V3.917c0-.243.103-.477.287-.649.183-.171.432-.268.692-.268.26 0 .509.097.692.268a.888.888 0 0 1 .287.649V9.87l2.245-2.102c.183-.172.432-.269.692-.269.26 0 .508.097.692.269Z"
|
||||||
|
fill="currentColor"
|
||||||
|
></path>
|
||||||
|
<rect
|
||||||
|
x="4"
|
||||||
|
y="15"
|
||||||
|
width="3"
|
||||||
|
height="2"
|
||||||
|
rx="1"
|
||||||
|
fill="currentColor"
|
||||||
|
></rect>
|
||||||
|
<rect
|
||||||
|
x="8.5"
|
||||||
|
y="15"
|
||||||
|
width="3"
|
||||||
|
height="2"
|
||||||
|
rx="1"
|
||||||
|
fill="currentColor"
|
||||||
|
></rect>
|
||||||
|
<rect
|
||||||
|
x="13"
|
||||||
|
y="15"
|
||||||
|
width="3"
|
||||||
|
height="2"
|
||||||
|
rx="1"
|
||||||
|
fill="currentColor"
|
||||||
|
></rect>
|
||||||
|
</svg>
|
||||||
</TabsTrigger>
|
</TabsTrigger>
|
||||||
<TabsTrigger value="edit">
|
<TabsTrigger value="edit">
|
||||||
<span className="sr-only">Edit</span>
|
<span className="sr-only">Edit</span>
|
||||||
<Icons.editMode className="h-5 w-5" />
|
<svg
|
||||||
|
xmlns="http://www.w3.org/2000/svg"
|
||||||
|
viewBox="0 0 20 20"
|
||||||
|
fill="none"
|
||||||
|
className="h-5 w-5"
|
||||||
|
>
|
||||||
|
<rect
|
||||||
|
x="4"
|
||||||
|
y="3"
|
||||||
|
width="12"
|
||||||
|
height="2"
|
||||||
|
rx="1"
|
||||||
|
fill="currentColor"
|
||||||
|
></rect>
|
||||||
|
<rect
|
||||||
|
x="4"
|
||||||
|
y="7"
|
||||||
|
width="12"
|
||||||
|
height="2"
|
||||||
|
rx="1"
|
||||||
|
fill="currentColor"
|
||||||
|
></rect>
|
||||||
|
<rect
|
||||||
|
x="4"
|
||||||
|
y="11"
|
||||||
|
width="3"
|
||||||
|
height="2"
|
||||||
|
rx="1"
|
||||||
|
fill="currentColor"
|
||||||
|
></rect>
|
||||||
|
<rect
|
||||||
|
x="4"
|
||||||
|
y="15"
|
||||||
|
width="4"
|
||||||
|
height="2"
|
||||||
|
rx="1"
|
||||||
|
fill="currentColor"
|
||||||
|
></rect>
|
||||||
|
<rect
|
||||||
|
x="8.5"
|
||||||
|
y="11"
|
||||||
|
width="3"
|
||||||
|
height="2"
|
||||||
|
rx="1"
|
||||||
|
fill="currentColor"
|
||||||
|
></rect>
|
||||||
|
<path
|
||||||
|
d="M17.154 11.346a1.182 1.182 0 0 0-1.671 0L11 15.829V17.5h1.671l4.483-4.483a1.182 1.182 0 0 0 0-1.671Z"
|
||||||
|
fill="currentColor"
|
||||||
|
></path>
|
||||||
|
</svg>
|
||||||
</TabsTrigger>
|
</TabsTrigger>
|
||||||
</TabsList>
|
</TabsList>
|
||||||
</div>
|
</div>
|
||||||
@@ -119,7 +265,7 @@ export default function PlaygroundPage() {
|
|||||||
<Button>Submit</Button>
|
<Button>Submit</Button>
|
||||||
<Button variant="secondary">
|
<Button variant="secondary">
|
||||||
<span className="sr-only">Show history</span>
|
<span className="sr-only">Show history</span>
|
||||||
<History className="h-4 w-4" />
|
<CounterClockwiseClockIcon className="h-4 w-4" />
|
||||||
</Button>
|
</Button>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
@@ -137,7 +283,7 @@ export default function PlaygroundPage() {
|
|||||||
<Button>Submit</Button>
|
<Button>Submit</Button>
|
||||||
<Button variant="secondary">
|
<Button variant="secondary">
|
||||||
<span className="sr-only">Show history</span>
|
<span className="sr-only">Show history</span>
|
||||||
<History className="h-4 w-4" />
|
<CounterClockwiseClockIcon className="h-4 w-4" />
|
||||||
</Button>
|
</Button>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
@@ -168,7 +314,7 @@ export default function PlaygroundPage() {
|
|||||||
<Button>Submit</Button>
|
<Button>Submit</Button>
|
||||||
<Button variant="secondary">
|
<Button variant="secondary">
|
||||||
<span className="sr-only">Show history</span>
|
<span className="sr-only">Show history</span>
|
||||||
<History className="h-4 w-4" />
|
<CounterClockwiseClockIcon className="h-4 w-4" />
|
||||||
</Button>
|
</Button>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
|
|||||||
@@ -1,65 +0,0 @@
|
|||||||
[data-section="playground"] {
|
|
||||||
--background: 0 0% 100%;
|
|
||||||
--foreground: 222.2 47.4% 11.2%;
|
|
||||||
|
|
||||||
--muted: 154 79% 96%;
|
|
||||||
--muted-foreground: 215.4 16.3% 46.9%;
|
|
||||||
|
|
||||||
--popover: 0 0% 100%;
|
|
||||||
--popover-foreground: 222.2 47.4% 11.2%;
|
|
||||||
|
|
||||||
--border: 214.3 31.8% 91.4%;
|
|
||||||
--input: 214.3 31.8% 91.4%;
|
|
||||||
|
|
||||||
--card: 0 0% 100%;
|
|
||||||
--card-foreground: 222.2 47.4% 11.2%;
|
|
||||||
|
|
||||||
--primary: 143 72% 29%;
|
|
||||||
--primary-foreground: 141 75% 97%;
|
|
||||||
|
|
||||||
--secondary: 145 80% 10%;
|
|
||||||
--secondary-foreground: 141 75% 97%;
|
|
||||||
|
|
||||||
--accent: 154 79% 96%;
|
|
||||||
--accent-foreground: 222.2 47.4% 11.2%;
|
|
||||||
|
|
||||||
--destructive: 0 100% 50%;
|
|
||||||
--destructive-foreground: 210 40% 98%;
|
|
||||||
|
|
||||||
--ring: 158 64% 52%;
|
|
||||||
|
|
||||||
--radius: 0rem;
|
|
||||||
}
|
|
||||||
|
|
||||||
.dark [data-section="playground"] {
|
|
||||||
--background: 224 71% 4%;
|
|
||||||
--foreground: 213 31% 91%;
|
|
||||||
|
|
||||||
--muted: 223 47% 11%;
|
|
||||||
--muted-foreground: 215.4 16.3% 56.9%;
|
|
||||||
|
|
||||||
--popover: 224 71% 4%;
|
|
||||||
--popover-foreground: 215 20.2% 65.1%;
|
|
||||||
|
|
||||||
--border: 216 34% 17%;
|
|
||||||
--input: 216 34% 17%;
|
|
||||||
|
|
||||||
--card: 224 71% 4%;
|
|
||||||
--card-foreground: 213 31% 91%;
|
|
||||||
|
|
||||||
--primary: 143 72% 29%;
|
|
||||||
--primary-foreground: 141 75% 97%;
|
|
||||||
|
|
||||||
--secondary: 145 80% 10%;
|
|
||||||
--secondary-foreground: 141 75% 97%;
|
|
||||||
|
|
||||||
--accent: 154 79% 96%;
|
|
||||||
--accent-foreground: 222.2 47.4% 11.2%;
|
|
||||||
|
|
||||||
--destructive: 0 100% 50%;
|
|
||||||
--destructive-foreground: 210 40% 98%;
|
|
||||||
|
|
||||||
--ring: 158 64% 52%;
|
|
||||||
|
|
||||||
--radius: 0rem;
|
|
||||||
}
|
|
||||||
@@ -1,5 +1,10 @@
|
|||||||
|
import {
|
||||||
|
ArrowDownIcon,
|
||||||
|
ArrowUpIcon,
|
||||||
|
CaretSortIcon,
|
||||||
|
EyeNoneIcon,
|
||||||
|
} from "@radix-ui/react-icons"
|
||||||
import { Column } from "@tanstack/react-table"
|
import { Column } from "@tanstack/react-table"
|
||||||
import { ChevronsUpDown, EyeOff, SortAsc, SortDesc } from "lucide-react"
|
|
||||||
|
|
||||||
import { cn } from "@/lib/utils"
|
import { cn } from "@/lib/utils"
|
||||||
import { Button } from "@/registry/new-york/ui/button"
|
import { Button } from "@/registry/new-york/ui/button"
|
||||||
@@ -37,26 +42,26 @@ export function DataTableColumnHeader<TData, TValue>({
|
|||||||
>
|
>
|
||||||
<span>{title}</span>
|
<span>{title}</span>
|
||||||
{column.getIsSorted() === "desc" ? (
|
{column.getIsSorted() === "desc" ? (
|
||||||
<SortDesc className="ml-2 h-4 w-4" />
|
<ArrowDownIcon className="ml-2 h-4 w-4" />
|
||||||
) : column.getIsSorted() === "asc" ? (
|
) : column.getIsSorted() === "asc" ? (
|
||||||
<SortAsc className="ml-2 h-4 w-4" />
|
<ArrowUpIcon className="ml-2 h-4 w-4" />
|
||||||
) : (
|
) : (
|
||||||
<ChevronsUpDown className="ml-2 h-4 w-4" />
|
<CaretSortIcon className="ml-2 h-4 w-4" />
|
||||||
)}
|
)}
|
||||||
</Button>
|
</Button>
|
||||||
</DropdownMenuTrigger>
|
</DropdownMenuTrigger>
|
||||||
<DropdownMenuContent align="start">
|
<DropdownMenuContent align="start">
|
||||||
<DropdownMenuItem onClick={() => column.toggleSorting(false)}>
|
<DropdownMenuItem onClick={() => column.toggleSorting(false)}>
|
||||||
<SortAsc className="mr-2 h-3.5 w-3.5 text-muted-foreground/70" />
|
<ArrowUpIcon className="mr-2 h-3.5 w-3.5 text-muted-foreground/70" />
|
||||||
Asc
|
Asc
|
||||||
</DropdownMenuItem>
|
</DropdownMenuItem>
|
||||||
<DropdownMenuItem onClick={() => column.toggleSorting(true)}>
|
<DropdownMenuItem onClick={() => column.toggleSorting(true)}>
|
||||||
<SortDesc className="mr-2 h-3.5 w-3.5 text-muted-foreground/70" />
|
<ArrowDownIcon className="mr-2 h-3.5 w-3.5 text-muted-foreground/70" />
|
||||||
Desc
|
Desc
|
||||||
</DropdownMenuItem>
|
</DropdownMenuItem>
|
||||||
<DropdownMenuSeparator />
|
<DropdownMenuSeparator />
|
||||||
<DropdownMenuItem onClick={() => column.toggleVisibility(false)}>
|
<DropdownMenuItem onClick={() => column.toggleVisibility(false)}>
|
||||||
<EyeOff className="mr-2 h-3.5 w-3.5 text-muted-foreground/70" />
|
<EyeNoneIcon className="mr-2 h-3.5 w-3.5 text-muted-foreground/70" />
|
||||||
Hide
|
Hide
|
||||||
</DropdownMenuItem>
|
</DropdownMenuItem>
|
||||||
</DropdownMenuContent>
|
</DropdownMenuContent>
|
||||||
|
|||||||
@@ -1,6 +1,6 @@
|
|||||||
import * as React from "react"
|
import * as React from "react"
|
||||||
|
import { CheckIcon, PlusCircledIcon } from "@radix-ui/react-icons"
|
||||||
import { Column } from "@tanstack/react-table"
|
import { Column } from "@tanstack/react-table"
|
||||||
import { Check, LucideIcon, PlusCircle } from "lucide-react"
|
|
||||||
|
|
||||||
import { cn } from "@/lib/utils"
|
import { cn } from "@/lib/utils"
|
||||||
import { Badge } from "@/registry/new-york/ui/badge"
|
import { Badge } from "@/registry/new-york/ui/badge"
|
||||||
@@ -21,13 +21,13 @@ import {
|
|||||||
} from "@/registry/new-york/ui/popover"
|
} from "@/registry/new-york/ui/popover"
|
||||||
import { Separator } from "@/registry/new-york/ui/separator"
|
import { Separator } from "@/registry/new-york/ui/separator"
|
||||||
|
|
||||||
interface DataTableFacetedFilter<TData, TValue> {
|
interface DataTableFacetedFilterProps<TData, TValue> {
|
||||||
column?: Column<TData, TValue>
|
column?: Column<TData, TValue>
|
||||||
title?: string
|
title?: string
|
||||||
options: {
|
options: {
|
||||||
label: string
|
label: string
|
||||||
value: string
|
value: string
|
||||||
icon?: LucideIcon
|
icon?: React.ComponentType<{ className?: string }>
|
||||||
}[]
|
}[]
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -35,7 +35,7 @@ export function DataTableFacetedFilter<TData, TValue>({
|
|||||||
column,
|
column,
|
||||||
title,
|
title,
|
||||||
options,
|
options,
|
||||||
}: DataTableFacetedFilter<TData, TValue>) {
|
}: DataTableFacetedFilterProps<TData, TValue>) {
|
||||||
const facets = column?.getFacetedUniqueValues()
|
const facets = column?.getFacetedUniqueValues()
|
||||||
const selectedValues = new Set(column?.getFilterValue() as string[])
|
const selectedValues = new Set(column?.getFilterValue() as string[])
|
||||||
|
|
||||||
@@ -43,7 +43,7 @@ export function DataTableFacetedFilter<TData, TValue>({
|
|||||||
<Popover>
|
<Popover>
|
||||||
<PopoverTrigger asChild>
|
<PopoverTrigger asChild>
|
||||||
<Button variant="outline" size="sm" className="h-8 border-dashed">
|
<Button variant="outline" size="sm" className="h-8 border-dashed">
|
||||||
<PlusCircle className="mr-2 h-4 w-4" />
|
<PlusCircledIcon className="mr-2 h-4 w-4" />
|
||||||
{title}
|
{title}
|
||||||
{selectedValues?.size > 0 && (
|
{selectedValues?.size > 0 && (
|
||||||
<>
|
<>
|
||||||
@@ -111,7 +111,7 @@ export function DataTableFacetedFilter<TData, TValue>({
|
|||||||
: "opacity-50 [&_svg]:invisible"
|
: "opacity-50 [&_svg]:invisible"
|
||||||
)}
|
)}
|
||||||
>
|
>
|
||||||
<Check className={cn("h-4 w-4")} />
|
<CheckIcon className={cn("h-4 w-4")} />
|
||||||
</div>
|
</div>
|
||||||
{option.icon && (
|
{option.icon && (
|
||||||
<option.icon className="mr-2 h-4 w-4 text-muted-foreground" />
|
<option.icon className="mr-2 h-4 w-4 text-muted-foreground" />
|
||||||
|
|||||||
@@ -1,10 +1,10 @@
|
|||||||
import { Table } from "@tanstack/react-table"
|
|
||||||
import {
|
import {
|
||||||
ChevronLeft,
|
ChevronLeftIcon,
|
||||||
ChevronRight,
|
ChevronRightIcon,
|
||||||
ChevronsLeft,
|
DoubleArrowLeftIcon,
|
||||||
ChevronsRight,
|
DoubleArrowRightIcon,
|
||||||
} from "lucide-react"
|
} from "@radix-ui/react-icons"
|
||||||
|
import { Table } from "@tanstack/react-table"
|
||||||
|
|
||||||
import { Button } from "@/registry/new-york/ui/button"
|
import { Button } from "@/registry/new-york/ui/button"
|
||||||
import {
|
import {
|
||||||
@@ -61,7 +61,7 @@ export function DataTablePagination<TData>({
|
|||||||
disabled={!table.getCanPreviousPage()}
|
disabled={!table.getCanPreviousPage()}
|
||||||
>
|
>
|
||||||
<span className="sr-only">Go to first page</span>
|
<span className="sr-only">Go to first page</span>
|
||||||
<ChevronsLeft className="h-4 w-4" />
|
<DoubleArrowLeftIcon className="h-4 w-4" />
|
||||||
</Button>
|
</Button>
|
||||||
<Button
|
<Button
|
||||||
variant="outline"
|
variant="outline"
|
||||||
@@ -70,7 +70,7 @@ export function DataTablePagination<TData>({
|
|||||||
disabled={!table.getCanPreviousPage()}
|
disabled={!table.getCanPreviousPage()}
|
||||||
>
|
>
|
||||||
<span className="sr-only">Go to previous page</span>
|
<span className="sr-only">Go to previous page</span>
|
||||||
<ChevronLeft className="h-4 w-4" />
|
<ChevronLeftIcon className="h-4 w-4" />
|
||||||
</Button>
|
</Button>
|
||||||
<Button
|
<Button
|
||||||
variant="outline"
|
variant="outline"
|
||||||
@@ -79,7 +79,7 @@ export function DataTablePagination<TData>({
|
|||||||
disabled={!table.getCanNextPage()}
|
disabled={!table.getCanNextPage()}
|
||||||
>
|
>
|
||||||
<span className="sr-only">Go to next page</span>
|
<span className="sr-only">Go to next page</span>
|
||||||
<ChevronRight className="h-4 w-4" />
|
<ChevronRightIcon className="h-4 w-4" />
|
||||||
</Button>
|
</Button>
|
||||||
<Button
|
<Button
|
||||||
variant="outline"
|
variant="outline"
|
||||||
@@ -88,7 +88,7 @@ export function DataTablePagination<TData>({
|
|||||||
disabled={!table.getCanNextPage()}
|
disabled={!table.getCanNextPage()}
|
||||||
>
|
>
|
||||||
<span className="sr-only">Go to last page</span>
|
<span className="sr-only">Go to last page</span>
|
||||||
<ChevronsRight className="h-4 w-4" />
|
<DoubleArrowRightIcon className="h-4 w-4" />
|
||||||
</Button>
|
</Button>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
|
|||||||
@@ -1,7 +1,7 @@
|
|||||||
"use client"
|
"use client"
|
||||||
|
|
||||||
|
import { DotsHorizontalIcon } from "@radix-ui/react-icons"
|
||||||
import { Row } from "@tanstack/react-table"
|
import { Row } from "@tanstack/react-table"
|
||||||
import { Copy, MoreHorizontal, Pen, Star, Tags, Trash } from "lucide-react"
|
|
||||||
|
|
||||||
import { Button } from "@/registry/new-york/ui/button"
|
import { Button } from "@/registry/new-york/ui/button"
|
||||||
import {
|
import {
|
||||||
@@ -37,29 +37,17 @@ export function DataTableRowActions<TData>({
|
|||||||
variant="ghost"
|
variant="ghost"
|
||||||
className="flex h-8 w-8 p-0 data-[state=open]:bg-muted"
|
className="flex h-8 w-8 p-0 data-[state=open]:bg-muted"
|
||||||
>
|
>
|
||||||
<MoreHorizontal className="h-4 w-4" />
|
<DotsHorizontalIcon className="h-4 w-4" />
|
||||||
<span className="sr-only">Open menu</span>
|
<span className="sr-only">Open menu</span>
|
||||||
</Button>
|
</Button>
|
||||||
</DropdownMenuTrigger>
|
</DropdownMenuTrigger>
|
||||||
<DropdownMenuContent align="end" className="w-[160px]">
|
<DropdownMenuContent align="end" className="w-[160px]">
|
||||||
<DropdownMenuItem>
|
<DropdownMenuItem>Edit</DropdownMenuItem>
|
||||||
<Pen className="mr-2 h-3.5 w-3.5 text-muted-foreground/70" />
|
<DropdownMenuItem>Make a copy</DropdownMenuItem>
|
||||||
Edit
|
<DropdownMenuItem>Favorite</DropdownMenuItem>
|
||||||
</DropdownMenuItem>
|
|
||||||
<DropdownMenuItem>
|
|
||||||
<Copy className="mr-2 h-3.5 w-3.5 text-muted-foreground/70" />
|
|
||||||
Make a copy
|
|
||||||
</DropdownMenuItem>
|
|
||||||
<DropdownMenuItem>
|
|
||||||
<Star className="mr-2 h-3.5 w-3.5 text-muted-foreground/70" />
|
|
||||||
Favorite
|
|
||||||
</DropdownMenuItem>
|
|
||||||
<DropdownMenuSeparator />
|
<DropdownMenuSeparator />
|
||||||
<DropdownMenuSub>
|
<DropdownMenuSub>
|
||||||
<DropdownMenuSubTrigger>
|
<DropdownMenuSubTrigger>Labels</DropdownMenuSubTrigger>
|
||||||
<Tags className="mr-2 h-3.5 w-3.5 text-muted-foreground/70" />
|
|
||||||
Labels
|
|
||||||
</DropdownMenuSubTrigger>
|
|
||||||
<DropdownMenuSubContent>
|
<DropdownMenuSubContent>
|
||||||
<DropdownMenuRadioGroup value={task.label}>
|
<DropdownMenuRadioGroup value={task.label}>
|
||||||
{labels.map((label) => (
|
{labels.map((label) => (
|
||||||
@@ -72,7 +60,6 @@ export function DataTableRowActions<TData>({
|
|||||||
</DropdownMenuSub>
|
</DropdownMenuSub>
|
||||||
<DropdownMenuSeparator />
|
<DropdownMenuSeparator />
|
||||||
<DropdownMenuItem>
|
<DropdownMenuItem>
|
||||||
<Trash className="mr-2 h-3.5 w-3.5 text-muted-foreground/70" />
|
|
||||||
Delete
|
Delete
|
||||||
<DropdownMenuShortcut>⌘⌫</DropdownMenuShortcut>
|
<DropdownMenuShortcut>⌘⌫</DropdownMenuShortcut>
|
||||||
</DropdownMenuItem>
|
</DropdownMenuItem>
|
||||||
|
|||||||
@@ -1,7 +1,7 @@
|
|||||||
"use client"
|
"use client"
|
||||||
|
|
||||||
|
import { Cross2Icon } from "@radix-ui/react-icons"
|
||||||
import { Table } from "@tanstack/react-table"
|
import { Table } from "@tanstack/react-table"
|
||||||
import { X } from "lucide-react"
|
|
||||||
|
|
||||||
import { Button } from "@/registry/new-york/ui/button"
|
import { Button } from "@/registry/new-york/ui/button"
|
||||||
import { Input } from "@/registry/new-york/ui/input"
|
import { Input } from "@/registry/new-york/ui/input"
|
||||||
@@ -51,7 +51,7 @@ export function DataTableToolbar<TData>({
|
|||||||
className="h-8 px-2 lg:px-3"
|
className="h-8 px-2 lg:px-3"
|
||||||
>
|
>
|
||||||
Reset
|
Reset
|
||||||
<X className="ml-2 h-4 w-4" />
|
<Cross2Icon className="ml-2 h-4 w-4" />
|
||||||
</Button>
|
</Button>
|
||||||
)}
|
)}
|
||||||
</div>
|
</div>
|
||||||
|
|||||||
@@ -1,8 +1,8 @@
|
|||||||
"use client"
|
"use client"
|
||||||
|
|
||||||
import { DropdownMenuTrigger } from "@radix-ui/react-dropdown-menu"
|
import { DropdownMenuTrigger } from "@radix-ui/react-dropdown-menu"
|
||||||
|
import { MixerHorizontalIcon } from "@radix-ui/react-icons"
|
||||||
import { Table } from "@tanstack/react-table"
|
import { Table } from "@tanstack/react-table"
|
||||||
import { SlidersHorizontal } from "lucide-react"
|
|
||||||
|
|
||||||
import { Button } from "@/registry/new-york/ui/button"
|
import { Button } from "@/registry/new-york/ui/button"
|
||||||
import {
|
import {
|
||||||
@@ -28,7 +28,7 @@ export function DataTableViewOptions<TData>({
|
|||||||
size="sm"
|
size="sm"
|
||||||
className="ml-auto hidden h-8 lg:flex"
|
className="ml-auto hidden h-8 lg:flex"
|
||||||
>
|
>
|
||||||
<SlidersHorizontal className="mr-2 h-4 w-4" />
|
<MixerHorizontalIcon className="mr-2 h-4 w-4" />
|
||||||
View
|
View
|
||||||
</Button>
|
</Button>
|
||||||
</DropdownMenuTrigger>
|
</DropdownMenuTrigger>
|
||||||
|
|||||||
@@ -1,5 +1,3 @@
|
|||||||
import { CreditCard, LogOut, PlusCircle, Settings, User } from "lucide-react"
|
|
||||||
|
|
||||||
import {
|
import {
|
||||||
Avatar,
|
Avatar,
|
||||||
AvatarFallback,
|
AvatarFallback,
|
||||||
@@ -40,29 +38,22 @@ export function UserNav() {
|
|||||||
<DropdownMenuSeparator />
|
<DropdownMenuSeparator />
|
||||||
<DropdownMenuGroup>
|
<DropdownMenuGroup>
|
||||||
<DropdownMenuItem>
|
<DropdownMenuItem>
|
||||||
<User className="mr-2 h-4 w-4" />
|
Profile
|
||||||
<span>Profile</span>
|
|
||||||
<DropdownMenuShortcut>⇧⌘P</DropdownMenuShortcut>
|
<DropdownMenuShortcut>⇧⌘P</DropdownMenuShortcut>
|
||||||
</DropdownMenuItem>
|
</DropdownMenuItem>
|
||||||
<DropdownMenuItem>
|
<DropdownMenuItem>
|
||||||
<CreditCard className="mr-2 h-4 w-4" />
|
Billing
|
||||||
<span>Billing</span>
|
|
||||||
<DropdownMenuShortcut>⌘B</DropdownMenuShortcut>
|
<DropdownMenuShortcut>⌘B</DropdownMenuShortcut>
|
||||||
</DropdownMenuItem>
|
</DropdownMenuItem>
|
||||||
<DropdownMenuItem>
|
<DropdownMenuItem>
|
||||||
<Settings className="mr-2 h-4 w-4" />
|
Settings
|
||||||
<span>Settings</span>
|
|
||||||
<DropdownMenuShortcut>⌘S</DropdownMenuShortcut>
|
<DropdownMenuShortcut>⌘S</DropdownMenuShortcut>
|
||||||
</DropdownMenuItem>
|
</DropdownMenuItem>
|
||||||
<DropdownMenuItem>
|
<DropdownMenuItem>New Team</DropdownMenuItem>
|
||||||
<PlusCircle className="mr-2 h-4 w-4" />
|
|
||||||
<span>New Team</span>
|
|
||||||
</DropdownMenuItem>
|
|
||||||
</DropdownMenuGroup>
|
</DropdownMenuGroup>
|
||||||
<DropdownMenuSeparator />
|
<DropdownMenuSeparator />
|
||||||
<DropdownMenuItem>
|
<DropdownMenuItem>
|
||||||
<LogOut className="mr-2 h-4 w-4" />
|
Log out
|
||||||
<span>Log out</span>
|
|
||||||
<DropdownMenuShortcut>⇧⌘Q</DropdownMenuShortcut>
|
<DropdownMenuShortcut>⇧⌘Q</DropdownMenuShortcut>
|
||||||
</DropdownMenuItem>
|
</DropdownMenuItem>
|
||||||
</DropdownMenuContent>
|
</DropdownMenuContent>
|
||||||
|
|||||||
@@ -1,13 +1,13 @@
|
|||||||
import {
|
import {
|
||||||
ArrowDownToLine,
|
ArrowDownIcon,
|
||||||
ArrowRightToLine,
|
ArrowRightIcon,
|
||||||
ArrowUpCircle,
|
ArrowUpIcon,
|
||||||
ArrowUpToLine,
|
CheckCircledIcon,
|
||||||
CheckCircle2,
|
CircleIcon,
|
||||||
Circle,
|
CrossCircledIcon,
|
||||||
HelpCircle,
|
QuestionMarkCircledIcon,
|
||||||
XCircle,
|
StopwatchIcon,
|
||||||
} from "lucide-react"
|
} from "@radix-ui/react-icons"
|
||||||
|
|
||||||
export const labels = [
|
export const labels = [
|
||||||
{
|
{
|
||||||
@@ -28,27 +28,27 @@ export const statuses = [
|
|||||||
{
|
{
|
||||||
value: "backlog",
|
value: "backlog",
|
||||||
label: "Backlog",
|
label: "Backlog",
|
||||||
icon: HelpCircle,
|
icon: QuestionMarkCircledIcon,
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
value: "todo",
|
value: "todo",
|
||||||
label: "Todo",
|
label: "Todo",
|
||||||
icon: Circle,
|
icon: CircleIcon,
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
value: "in progress",
|
value: "in progress",
|
||||||
label: "In Progress",
|
label: "In Progress",
|
||||||
icon: ArrowUpCircle,
|
icon: StopwatchIcon,
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
value: "done",
|
value: "done",
|
||||||
label: "Done",
|
label: "Done",
|
||||||
icon: CheckCircle2,
|
icon: CheckCircledIcon,
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
value: "canceled",
|
value: "canceled",
|
||||||
label: "Canceled",
|
label: "Canceled",
|
||||||
icon: XCircle,
|
icon: CrossCircledIcon,
|
||||||
},
|
},
|
||||||
]
|
]
|
||||||
|
|
||||||
@@ -56,16 +56,16 @@ export const priorities = [
|
|||||||
{
|
{
|
||||||
label: "Low",
|
label: "Low",
|
||||||
value: "low",
|
value: "low",
|
||||||
icon: ArrowDownToLine,
|
icon: ArrowDownIcon,
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
label: "Medium",
|
label: "Medium",
|
||||||
value: "medium",
|
value: "medium",
|
||||||
icon: ArrowRightToLine,
|
icon: ArrowRightIcon,
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
label: "High",
|
label: "High",
|
||||||
value: "high",
|
value: "high",
|
||||||
icon: ArrowUpToLine,
|
icon: ArrowUpIcon,
|
||||||
},
|
},
|
||||||
]
|
]
|
||||||
|
|||||||
@@ -9,6 +9,7 @@ import { ThemeProvider } from "@/components/providers"
|
|||||||
import { SiteFooter } from "@/components/site-footer"
|
import { SiteFooter } from "@/components/site-footer"
|
||||||
import { SiteHeader } from "@/components/site-header"
|
import { SiteHeader } from "@/components/site-header"
|
||||||
import { TailwindIndicator } from "@/components/tailwind-indicator"
|
import { TailwindIndicator } from "@/components/tailwind-indicator"
|
||||||
|
import { ThemeSwitcher } from "@/components/theme-switcher"
|
||||||
import { Toaster as DefaultToaster } from "@/registry/default/ui/toaster"
|
import { Toaster as DefaultToaster } from "@/registry/default/ui/toaster"
|
||||||
import { Toaster as NewYorkToaster } from "@/registry/new-york/ui/toaster"
|
import { Toaster as NewYorkToaster } from "@/registry/new-york/ui/toaster"
|
||||||
|
|
||||||
@@ -82,7 +83,12 @@ export default function RootLayout({ children }: RootLayoutProps) {
|
|||||||
fontSans.variable
|
fontSans.variable
|
||||||
)}
|
)}
|
||||||
>
|
>
|
||||||
<ThemeProvider attribute="class" defaultTheme="system" enableSystem>
|
<ThemeProvider
|
||||||
|
attribute="class"
|
||||||
|
defaultTheme="system"
|
||||||
|
enableSystem
|
||||||
|
disableTransitionOnChange
|
||||||
|
>
|
||||||
<div className="relative flex min-h-screen flex-col">
|
<div className="relative flex min-h-screen flex-col">
|
||||||
<SiteHeader />
|
<SiteHeader />
|
||||||
<div className="flex-1">{children}</div>
|
<div className="flex-1">{children}</div>
|
||||||
@@ -90,6 +96,7 @@ export default function RootLayout({ children }: RootLayoutProps) {
|
|||||||
</div>
|
</div>
|
||||||
<TailwindIndicator />
|
<TailwindIndicator />
|
||||||
</ThemeProvider>
|
</ThemeProvider>
|
||||||
|
<ThemeSwitcher />
|
||||||
<Analytics />
|
<Analytics />
|
||||||
<NewYorkToaster />
|
<NewYorkToaster />
|
||||||
<DefaultToaster />
|
<DefaultToaster />
|
||||||
|
|||||||
@@ -1,6 +1,6 @@
|
|||||||
import Image from "next/image"
|
import Image from "next/image"
|
||||||
import Link from "next/link"
|
import Link from "next/link"
|
||||||
import { ChevronRight } from "lucide-react"
|
import { ArrowRightIcon } from "@radix-ui/react-icons"
|
||||||
|
|
||||||
import { siteConfig } from "@/config/site"
|
import { siteConfig } from "@/config/site"
|
||||||
import { cn } from "@/lib/utils"
|
import { cn } from "@/lib/utils"
|
||||||
@@ -28,7 +28,7 @@ export default function IndexPage() {
|
|||||||
<span className="hidden sm:inline">
|
<span className="hidden sm:inline">
|
||||||
Introducing Style, a new CLI and more.
|
Introducing Style, a new CLI and more.
|
||||||
</span>
|
</span>
|
||||||
<ChevronRight className="ml-1 h-4 w-4" />
|
<ArrowRightIcon className="ml-1 h-4 w-4" />
|
||||||
</Link>
|
</Link>
|
||||||
<PageHeaderHeading>Build your component library.</PageHeaderHeading>
|
<PageHeaderHeading>Build your component library.</PageHeaderHeading>
|
||||||
<PageHeaderDescription>
|
<PageHeaderDescription>
|
||||||
|
|||||||
38
apps/www/app/themes/page.tsx
Normal file
38
apps/www/app/themes/page.tsx
Normal file
@@ -0,0 +1,38 @@
|
|||||||
|
import { Metadata } from "next"
|
||||||
|
|
||||||
|
import "public/registry/themes.css"
|
||||||
|
import {
|
||||||
|
PageHeader,
|
||||||
|
PageHeaderDescription,
|
||||||
|
PageHeaderHeading,
|
||||||
|
} from "@/components/page-header"
|
||||||
|
import { ThemeCustomizer } from "@/components/theme-customizer"
|
||||||
|
import { ThemeWrapper } from "@/components/theme-wrapper"
|
||||||
|
import { ThemesTabs } from "@/app/themes/tabs"
|
||||||
|
|
||||||
|
export const metadata: Metadata = {
|
||||||
|
title: "Themes",
|
||||||
|
description: "Hand-picked themes that you can copy and paste into your apps.",
|
||||||
|
}
|
||||||
|
|
||||||
|
export default function ThemesPage() {
|
||||||
|
return (
|
||||||
|
<div className="container">
|
||||||
|
<ThemeWrapper
|
||||||
|
defaultTheme="zinc"
|
||||||
|
className="relative flex flex-col items-start md:flex-row md:items-center"
|
||||||
|
>
|
||||||
|
<PageHeader className="relative pb-4 md:pb-8 lg:pb-12">
|
||||||
|
<PageHeaderHeading>Make it yours.</PageHeaderHeading>
|
||||||
|
<PageHeaderDescription>
|
||||||
|
Hand-picked themes that you can copy and paste into your apps.
|
||||||
|
</PageHeaderDescription>
|
||||||
|
</PageHeader>
|
||||||
|
<div className="px-4 pb-8 md:ml-auto md:pb-0">
|
||||||
|
<ThemeCustomizer />
|
||||||
|
</div>
|
||||||
|
</ThemeWrapper>
|
||||||
|
<ThemesTabs />
|
||||||
|
</div>
|
||||||
|
)
|
||||||
|
}
|
||||||
73
apps/www/app/themes/tabs.tsx
Normal file
73
apps/www/app/themes/tabs.tsx
Normal file
@@ -0,0 +1,73 @@
|
|||||||
|
"use client"
|
||||||
|
|
||||||
|
import * as React from "react"
|
||||||
|
|
||||||
|
import { useConfig } from "@/hooks/use-config"
|
||||||
|
import { ThemeWrapper } from "@/components/theme-wrapper"
|
||||||
|
import CardsDefault from "@/registry/default/example/cards"
|
||||||
|
import { Skeleton } from "@/registry/default/ui/skeleton"
|
||||||
|
import CardsNewYork from "@/registry/new-york/example/cards"
|
||||||
|
|
||||||
|
export function ThemesTabs() {
|
||||||
|
const [mounted, setMounted] = React.useState(false)
|
||||||
|
const [config] = useConfig()
|
||||||
|
|
||||||
|
React.useEffect(() => {
|
||||||
|
setMounted(true)
|
||||||
|
}, [])
|
||||||
|
|
||||||
|
return (
|
||||||
|
<div className="space-y-8">
|
||||||
|
{!mounted ? (
|
||||||
|
<div className="md:grids-col-2 grid md:gap-4 lg:grid-cols-10 xl:gap-6">
|
||||||
|
<div className="space-y-4 lg:col-span-4 xl:col-span-6 xl:space-y-6">
|
||||||
|
<Skeleton className="h-[218px] w-full" />
|
||||||
|
<div className="grid gap-1 sm:grid-cols-[260px_1fr] md:hidden">
|
||||||
|
<Skeleton className="h-[218px] w-full" />
|
||||||
|
<div className="pt-3 sm:pl-2 sm:pt-0 xl:pl-4">
|
||||||
|
<Skeleton className="h-[218px] w-full" />
|
||||||
|
</div>
|
||||||
|
<div className="pt-3 sm:col-span-2 xl:pt-4">
|
||||||
|
<Skeleton className="h-[218px] w-full" />
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
<div className="grid gap-6 md:grid-cols-2 lg:grid-cols-1 xl:grid-cols-2">
|
||||||
|
<div className="space-y-4 xl:space-y-6">
|
||||||
|
<Skeleton className="h-[218px] w-full" />
|
||||||
|
<Skeleton className="h-[218px] w-full" />
|
||||||
|
<Skeleton className="h-[218px] w-full" />
|
||||||
|
</div>
|
||||||
|
<div className="space-y-4 xl:space-y-6">
|
||||||
|
<Skeleton className="h-[218px] w-full" />
|
||||||
|
<Skeleton className="h-[218px] w-full" />
|
||||||
|
<div className="hidden xl:block">
|
||||||
|
<Skeleton className="h-[218px] w-full" />
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
<div className="space-y-4 lg:col-span-6 xl:col-span-4 xl:space-y-6">
|
||||||
|
<div className="hidden gap-1 sm:grid-cols-[260px_1fr] md:grid">
|
||||||
|
<Skeleton className="h-[218px] w-full" />
|
||||||
|
<div className="pt-3 sm:pl-2 sm:pt-0 xl:pl-4">
|
||||||
|
<Skeleton className="h-[218px] w-full" />
|
||||||
|
</div>
|
||||||
|
<div className="pt-3 sm:col-span-2 xl:pt-4">
|
||||||
|
<Skeleton className="h-[218px] w-full" />
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
<div className="hidden md:block">
|
||||||
|
<Skeleton className="h-[218px] w-full" />
|
||||||
|
</div>
|
||||||
|
<Skeleton className="h-[218px] w-full" />
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
) : (
|
||||||
|
<ThemeWrapper>
|
||||||
|
{config.style === "new-york" && <CardsNewYork />}
|
||||||
|
{config.style === "default" && <CardsDefault />}
|
||||||
|
</ThemeWrapper>
|
||||||
|
)}
|
||||||
|
</div>
|
||||||
|
)
|
||||||
|
}
|
||||||
@@ -1,4 +1,3 @@
|
|||||||
import { cn } from "@/lib/utils"
|
|
||||||
import {
|
import {
|
||||||
Alert,
|
Alert,
|
||||||
AlertDescription,
|
AlertDescription,
|
||||||
|
|||||||
@@ -3,7 +3,13 @@
|
|||||||
import * as React from "react"
|
import * as React from "react"
|
||||||
import { useRouter } from "next/navigation"
|
import { useRouter } from "next/navigation"
|
||||||
import { DialogProps } from "@radix-ui/react-alert-dialog"
|
import { DialogProps } from "@radix-ui/react-alert-dialog"
|
||||||
import { Circle, File, Laptop, Moon, SunMedium } from "lucide-react"
|
import {
|
||||||
|
CircleIcon,
|
||||||
|
FileIcon,
|
||||||
|
LaptopIcon,
|
||||||
|
MoonIcon,
|
||||||
|
SunIcon,
|
||||||
|
} from "@radix-ui/react-icons"
|
||||||
import { useTheme } from "next-themes"
|
import { useTheme } from "next-themes"
|
||||||
|
|
||||||
import { docsConfig } from "@/config/docs"
|
import { docsConfig } from "@/config/docs"
|
||||||
@@ -72,7 +78,7 @@ export function CommandMenu({ ...props }: DialogProps) {
|
|||||||
runCommand(() => router.push(navItem.href as string))
|
runCommand(() => router.push(navItem.href as string))
|
||||||
}}
|
}}
|
||||||
>
|
>
|
||||||
<File className="mr-2 h-4 w-4" />
|
<FileIcon className="mr-2 h-4 w-4" />
|
||||||
{navItem.title}
|
{navItem.title}
|
||||||
</CommandItem>
|
</CommandItem>
|
||||||
))}
|
))}
|
||||||
@@ -88,7 +94,7 @@ export function CommandMenu({ ...props }: DialogProps) {
|
|||||||
}}
|
}}
|
||||||
>
|
>
|
||||||
<div className="mr-2 flex h-4 w-4 items-center justify-center">
|
<div className="mr-2 flex h-4 w-4 items-center justify-center">
|
||||||
<Circle className="h-3 w-3" />
|
<CircleIcon className="h-3 w-3" />
|
||||||
</div>
|
</div>
|
||||||
{navItem.title}
|
{navItem.title}
|
||||||
</CommandItem>
|
</CommandItem>
|
||||||
@@ -98,15 +104,15 @@ export function CommandMenu({ ...props }: DialogProps) {
|
|||||||
<CommandSeparator />
|
<CommandSeparator />
|
||||||
<CommandGroup heading="Theme">
|
<CommandGroup heading="Theme">
|
||||||
<CommandItem onSelect={() => runCommand(() => setTheme("light"))}>
|
<CommandItem onSelect={() => runCommand(() => setTheme("light"))}>
|
||||||
<SunMedium className="mr-2 h-4 w-4" />
|
<SunIcon className="mr-2 h-4 w-4" />
|
||||||
Light
|
Light
|
||||||
</CommandItem>
|
</CommandItem>
|
||||||
<CommandItem onSelect={() => runCommand(() => setTheme("dark"))}>
|
<CommandItem onSelect={() => runCommand(() => setTheme("dark"))}>
|
||||||
<Moon className="mr-2 h-4 w-4" />
|
<MoonIcon className="mr-2 h-4 w-4" />
|
||||||
Dark
|
Dark
|
||||||
</CommandItem>
|
</CommandItem>
|
||||||
<CommandItem onSelect={() => runCommand(() => setTheme("system"))}>
|
<CommandItem onSelect={() => runCommand(() => setTheme("system"))}>
|
||||||
<Laptop className="mr-2 h-4 w-4" />
|
<LaptopIcon className="mr-2 h-4 w-4" />
|
||||||
System
|
System
|
||||||
</CommandItem>
|
</CommandItem>
|
||||||
</CommandGroup>
|
</CommandGroup>
|
||||||
|
|||||||
@@ -2,11 +2,11 @@
|
|||||||
|
|
||||||
import * as React from "react"
|
import * as React from "react"
|
||||||
import { Index } from "@/__registry__"
|
import { Index } from "@/__registry__"
|
||||||
import { Loader2 } from "lucide-react"
|
|
||||||
|
|
||||||
import { cn } from "@/lib/utils"
|
import { cn } from "@/lib/utils"
|
||||||
import { useConfig } from "@/hooks/use-config"
|
import { useConfig } from "@/hooks/use-config"
|
||||||
import { CopyButton, CopyWithClassNames } from "@/components/copy-button"
|
import { CopyButton, CopyWithClassNames } from "@/components/copy-button"
|
||||||
|
import { Icons } from "@/components/icons"
|
||||||
import { StyleSwitcher } from "@/components/style-switcher"
|
import { StyleSwitcher } from "@/components/style-switcher"
|
||||||
import { ThemeWrapper } from "@/components/theme-wrapper"
|
import { ThemeWrapper } from "@/components/theme-wrapper"
|
||||||
import {
|
import {
|
||||||
@@ -102,7 +102,7 @@ export function ComponentPreview({
|
|||||||
codeString && <CopyButton value={codeString} />
|
codeString && <CopyButton value={codeString} />
|
||||||
)}
|
)}
|
||||||
</div>
|
</div>
|
||||||
<ThemeWrapper>
|
<ThemeWrapper defaultTheme="zinc">
|
||||||
<div
|
<div
|
||||||
className={cn(
|
className={cn(
|
||||||
"preview flex min-h-[350px] w-full justify-center p-10",
|
"preview flex min-h-[350px] w-full justify-center p-10",
|
||||||
@@ -116,7 +116,7 @@ export function ComponentPreview({
|
|||||||
<React.Suspense
|
<React.Suspense
|
||||||
fallback={
|
fallback={
|
||||||
<div className="flex items-center text-sm text-muted-foreground">
|
<div className="flex items-center text-sm text-muted-foreground">
|
||||||
<Loader2 className="mr-2 h-4 w-4 animate-spin" />
|
<Icons.spinner className="mr-2 h-4 w-4 animate-spin" />
|
||||||
Loading...
|
Loading...
|
||||||
</div>
|
</div>
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -2,11 +2,11 @@
|
|||||||
|
|
||||||
import * as React from "react"
|
import * as React from "react"
|
||||||
import { DropdownMenuTriggerProps } from "@radix-ui/react-dropdown-menu"
|
import { DropdownMenuTriggerProps } from "@radix-ui/react-dropdown-menu"
|
||||||
|
import { CheckIcon, CopyIcon } from "@radix-ui/react-icons"
|
||||||
import { NpmCommands } from "types/unist"
|
import { NpmCommands } from "types/unist"
|
||||||
|
|
||||||
import { Event, trackEvent } from "@/lib/events"
|
import { Event, trackEvent } from "@/lib/events"
|
||||||
import { cn } from "@/lib/utils"
|
import { cn } from "@/lib/utils"
|
||||||
import { Icons } from "@/components/icons"
|
|
||||||
import { Button } from "@/registry/new-york/ui/button"
|
import { Button } from "@/registry/new-york/ui/button"
|
||||||
import {
|
import {
|
||||||
DropdownMenu,
|
DropdownMenu,
|
||||||
@@ -21,7 +21,7 @@ interface CopyButtonProps extends React.HTMLAttributes<HTMLButtonElement> {
|
|||||||
event?: Event["name"]
|
event?: Event["name"]
|
||||||
}
|
}
|
||||||
|
|
||||||
async function copyToClipboardWithMeta(value: string, event?: Event) {
|
export async function copyToClipboardWithMeta(value: string, event?: Event) {
|
||||||
navigator.clipboard.writeText(value)
|
navigator.clipboard.writeText(value)
|
||||||
if (event) {
|
if (event) {
|
||||||
trackEvent(event)
|
trackEvent(event)
|
||||||
@@ -69,9 +69,9 @@ export function CopyButton({
|
|||||||
>
|
>
|
||||||
<span className="sr-only">Copy</span>
|
<span className="sr-only">Copy</span>
|
||||||
{hasCopied ? (
|
{hasCopied ? (
|
||||||
<Icons.check className="h-3 w-3" />
|
<CheckIcon className="h-3 w-3" />
|
||||||
) : (
|
) : (
|
||||||
<Icons.copy className="h-3 w-3" />
|
<CopyIcon className="h-3 w-3" />
|
||||||
)}
|
)}
|
||||||
</Button>
|
</Button>
|
||||||
)
|
)
|
||||||
@@ -114,21 +114,19 @@ export function CopyWithClassNames({
|
|||||||
)}
|
)}
|
||||||
>
|
>
|
||||||
{hasCopied ? (
|
{hasCopied ? (
|
||||||
<Icons.check className="h-3 w-3" />
|
<CheckIcon className="h-3 w-3" />
|
||||||
) : (
|
) : (
|
||||||
<Icons.copy className="h-3 w-3" />
|
<CopyIcon className="h-3 w-3" />
|
||||||
)}
|
)}
|
||||||
<span className="sr-only">Copy</span>
|
<span className="sr-only">Copy</span>
|
||||||
</Button>
|
</Button>
|
||||||
</DropdownMenuTrigger>
|
</DropdownMenuTrigger>
|
||||||
<DropdownMenuContent align="end">
|
<DropdownMenuContent align="end">
|
||||||
<DropdownMenuItem onClick={() => copyToClipboard(value)}>
|
<DropdownMenuItem onClick={() => copyToClipboard(value)}>
|
||||||
<Icons.react className="mr-2 h-4 w-4" />
|
Component
|
||||||
<span>Component</span>
|
|
||||||
</DropdownMenuItem>
|
</DropdownMenuItem>
|
||||||
<DropdownMenuItem onClick={() => copyToClipboard(classNames)}>
|
<DropdownMenuItem onClick={() => copyToClipboard(classNames)}>
|
||||||
<Icons.tailwind className="mr-2 h-4 w-4" />
|
Classname
|
||||||
<span>Classname</span>
|
|
||||||
</DropdownMenuItem>
|
</DropdownMenuItem>
|
||||||
</DropdownMenuContent>
|
</DropdownMenuContent>
|
||||||
</DropdownMenu>
|
</DropdownMenu>
|
||||||
@@ -178,9 +176,9 @@ export function CopyNpmCommandButton({
|
|||||||
)}
|
)}
|
||||||
>
|
>
|
||||||
{hasCopied ? (
|
{hasCopied ? (
|
||||||
<Icons.check className="h-3 w-3" />
|
<CheckIcon className="h-3 w-3" />
|
||||||
) : (
|
) : (
|
||||||
<Icons.copy className="h-3 w-3" />
|
<CopyIcon className="h-3 w-3" />
|
||||||
)}
|
)}
|
||||||
<span className="sr-only">Copy</span>
|
<span className="sr-only">Copy</span>
|
||||||
</Button>
|
</Button>
|
||||||
|
|||||||
31
apps/www/components/drawer.tsx
Normal file
31
apps/www/components/drawer.tsx
Normal file
@@ -0,0 +1,31 @@
|
|||||||
|
"use client"
|
||||||
|
|
||||||
|
import { forwardRef } from "react"
|
||||||
|
import { Drawer as DrawerPrimitive } from "vaul"
|
||||||
|
|
||||||
|
import { cn } from "@/lib/utils"
|
||||||
|
|
||||||
|
const DrawerTrigger = DrawerPrimitive.Trigger
|
||||||
|
|
||||||
|
const DrawerContent = forwardRef<
|
||||||
|
React.ElementRef<typeof DrawerPrimitive.Content>,
|
||||||
|
React.ComponentPropsWithoutRef<typeof DrawerPrimitive.Content>
|
||||||
|
>(({ className, children, ...props }, ref) => (
|
||||||
|
<DrawerPrimitive.Portal>
|
||||||
|
<DrawerPrimitive.Overlay className="fixed inset-0 z-50 bg-zinc-950/60" />
|
||||||
|
<DrawerPrimitive.Content
|
||||||
|
ref={ref}
|
||||||
|
className={cn(
|
||||||
|
"fixed inset-x-0 bottom-0 z-50 mt-24 h-[96%] rounded-t-[10px] bg-background",
|
||||||
|
className
|
||||||
|
)}
|
||||||
|
{...props}
|
||||||
|
>
|
||||||
|
<div className="absolute left-1/2 top-3 h-2 w-[100px] translate-x-[-50%] rounded-full bg-muted" />
|
||||||
|
{children}
|
||||||
|
</DrawerPrimitive.Content>
|
||||||
|
</DrawerPrimitive.Portal>
|
||||||
|
))
|
||||||
|
DrawerContent.displayName = "DrawerContent"
|
||||||
|
|
||||||
|
export { DrawerTrigger, DrawerContent }
|
||||||
@@ -2,7 +2,7 @@
|
|||||||
|
|
||||||
import Link from "next/link"
|
import Link from "next/link"
|
||||||
import { usePathname } from "next/navigation"
|
import { usePathname } from "next/navigation"
|
||||||
import { ArrowRight } from "lucide-react"
|
import { ArrowRightIcon } from "@radix-ui/react-icons"
|
||||||
|
|
||||||
import { cn } from "@/lib/utils"
|
import { cn } from "@/lib/utils"
|
||||||
import { ScrollArea, ScrollBar } from "@/registry/new-york/ui/scroll-area"
|
import { ScrollArea, ScrollBar } from "@/registry/new-york/ui/scroll-area"
|
||||||
@@ -97,7 +97,7 @@ export function ExampleCodeLink({ pathname }: ExampleCodeLinkProps) {
|
|||||||
className="absolute right-0 top-0 hidden items-center rounded-[0.5rem] text-sm font-medium md:flex"
|
className="absolute right-0 top-0 hidden items-center rounded-[0.5rem] text-sm font-medium md:flex"
|
||||||
>
|
>
|
||||||
View code
|
View code
|
||||||
<ArrowRight className="ml-1 h-4 w-4" />
|
<ArrowRightIcon className="ml-1 h-4 w-4" />
|
||||||
</Link>
|
</Link>
|
||||||
)
|
)
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -1,36 +1,7 @@
|
|||||||
import {
|
type IconProps = React.HTMLAttributes<SVGElement>
|
||||||
AlertTriangle,
|
|
||||||
ArrowRight,
|
|
||||||
Check,
|
|
||||||
ChevronLeft,
|
|
||||||
ChevronRight,
|
|
||||||
ClipboardCheck,
|
|
||||||
Copy,
|
|
||||||
CreditCard,
|
|
||||||
File,
|
|
||||||
FileText,
|
|
||||||
HelpCircle,
|
|
||||||
Image,
|
|
||||||
Laptop,
|
|
||||||
Loader2,
|
|
||||||
LucideProps,
|
|
||||||
Moon,
|
|
||||||
MoreVertical,
|
|
||||||
Pizza,
|
|
||||||
Plus,
|
|
||||||
Settings,
|
|
||||||
SunMedium,
|
|
||||||
Trash,
|
|
||||||
Twitter,
|
|
||||||
User,
|
|
||||||
X,
|
|
||||||
type Icon as LucideIcon,
|
|
||||||
} from "lucide-react"
|
|
||||||
|
|
||||||
export type Icon = LucideIcon
|
|
||||||
|
|
||||||
export const Icons = {
|
export const Icons = {
|
||||||
logo: (props: LucideProps) => (
|
logo: (props: IconProps) => (
|
||||||
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 256 256" {...props}>
|
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 256 256" {...props}>
|
||||||
<rect width="256" height="256" fill="none" />
|
<rect width="256" height="256" fill="none" />
|
||||||
<line
|
<line
|
||||||
@@ -57,31 +28,12 @@ export const Icons = {
|
|||||||
/>
|
/>
|
||||||
</svg>
|
</svg>
|
||||||
),
|
),
|
||||||
close: X,
|
twitter: (props: IconProps) => (
|
||||||
spinner: Loader2,
|
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24" {...props}>
|
||||||
chevronLeft: ChevronLeft,
|
<path d="M21.543 7.104c.015.211.015.423.015.636 0 6.507-4.954 14.01-14.01 14.01v-.003A13.94 13.94 0 0 1 0 19.539a9.88 9.88 0 0 0 7.287-2.041 4.93 4.93 0 0 1-4.6-3.42 4.916 4.916 0 0 0 2.223-.084A4.926 4.926 0 0 1 .96 9.167v-.062a4.887 4.887 0 0 0 2.235.616A4.928 4.928 0 0 1 1.67 3.148a13.98 13.98 0 0 0 10.15 5.144 4.929 4.929 0 0 1 8.39-4.49 9.868 9.868 0 0 0 3.128-1.196 4.941 4.941 0 0 1-2.165 2.724A9.828 9.828 0 0 0 24 4.555a10.019 10.019 0 0 1-2.457 2.549z" />
|
||||||
chevronRight: ChevronRight,
|
</svg>
|
||||||
trash: Trash,
|
),
|
||||||
post: FileText,
|
gitHub: (props: IconProps) => (
|
||||||
page: File,
|
|
||||||
media: Image,
|
|
||||||
settings: Settings,
|
|
||||||
billing: CreditCard,
|
|
||||||
ellipsis: MoreVertical,
|
|
||||||
add: Plus,
|
|
||||||
warning: AlertTriangle,
|
|
||||||
user: User,
|
|
||||||
arrowRight: ArrowRight,
|
|
||||||
help: HelpCircle,
|
|
||||||
pizza: Pizza,
|
|
||||||
twitter: Twitter,
|
|
||||||
check: Check,
|
|
||||||
copy: Copy,
|
|
||||||
copyDone: ClipboardCheck,
|
|
||||||
sun: SunMedium,
|
|
||||||
moon: Moon,
|
|
||||||
laptop: Laptop,
|
|
||||||
gitHub: (props: LucideProps) => (
|
|
||||||
<svg viewBox="0 0 438.549 438.549" {...props}>
|
<svg viewBox="0 0 438.549 438.549" {...props}>
|
||||||
<path
|
<path
|
||||||
fill="currentColor"
|
fill="currentColor"
|
||||||
@@ -89,7 +41,7 @@ export const Icons = {
|
|||||||
></path>
|
></path>
|
||||||
</svg>
|
</svg>
|
||||||
),
|
),
|
||||||
radix: (props: LucideProps) => (
|
radix: (props: IconProps) => (
|
||||||
<svg viewBox="0 0 25 25" fill="none" {...props}>
|
<svg viewBox="0 0 25 25" fill="none" {...props}>
|
||||||
<path
|
<path
|
||||||
d="M12 25C7.58173 25 4 21.4183 4 17C4 12.5817 7.58173 9 12 9V25Z"
|
d="M12 25C7.58173 25 4 21.4183 4 17C4 12.5817 7.58173 9 12 9V25Z"
|
||||||
@@ -102,12 +54,12 @@ export const Icons = {
|
|||||||
></path>
|
></path>
|
||||||
</svg>
|
</svg>
|
||||||
),
|
),
|
||||||
aria: (props: LucideProps) => (
|
aria: (props: IconProps) => (
|
||||||
<svg role="img" viewBox="0 0 24 24" fill="currentColor" {...props}>
|
<svg role="img" viewBox="0 0 24 24" fill="currentColor" {...props}>
|
||||||
<path d="M13.966 22.624l-1.69-4.281H8.122l3.892-9.144 5.662 13.425zM8.884 1.376H0v21.248zm15.116 0h-8.884L24 22.624Z" />
|
<path d="M13.966 22.624l-1.69-4.281H8.122l3.892-9.144 5.662 13.425zM8.884 1.376H0v21.248zm15.116 0h-8.884L24 22.624Z" />
|
||||||
</svg>
|
</svg>
|
||||||
),
|
),
|
||||||
npm: (props: LucideProps) => (
|
npm: (props: IconProps) => (
|
||||||
<svg viewBox="0 0 24 24" {...props}>
|
<svg viewBox="0 0 24 24" {...props}>
|
||||||
<path
|
<path
|
||||||
d="M1.763 0C.786 0 0 .786 0 1.763v20.474C0 23.214.786 24 1.763 24h20.474c.977 0 1.763-.786 1.763-1.763V1.763C24 .786 23.214 0 22.237 0zM5.13 5.323l13.837.019-.009 13.836h-3.464l.01-10.382h-3.456L12.04 19.17H5.113z"
|
d="M1.763 0C.786 0 0 .786 0 1.763v20.474C0 23.214.786 24 1.763 24h20.474c.977 0 1.763-.786 1.763-1.763V1.763C24 .786 23.214 0 22.237 0zM5.13 5.323l13.837.019-.009 13.836h-3.464l.01-10.382h-3.456L12.04 19.17H5.113z"
|
||||||
@@ -115,7 +67,7 @@ export const Icons = {
|
|||||||
/>
|
/>
|
||||||
</svg>
|
</svg>
|
||||||
),
|
),
|
||||||
yarn: (props: LucideProps) => (
|
yarn: (props: IconProps) => (
|
||||||
<svg viewBox="0 0 24 24" {...props}>
|
<svg viewBox="0 0 24 24" {...props}>
|
||||||
<path
|
<path
|
||||||
d="M12 0C5.375 0 0 5.375 0 12s5.375 12 12 12 12-5.375 12-12S18.625 0 12 0zm.768 4.105c.183 0 .363.053.525.157.125.083.287.185.755 1.154.31-.088.468-.042.551-.019.204.056.366.19.463.375.477.917.542 2.553.334 3.605-.241 1.232-.755 2.029-1.131 2.576.324.329.778.899 1.117 1.825.278.774.31 1.478.273 2.015a5.51 5.51 0 0 0 .602-.329c.593-.366 1.487-.917 2.553-.931.714-.009 1.269.445 1.353 1.103a1.23 1.23 0 0 1-.945 1.362c-.649.158-.95.278-1.821.843-1.232.797-2.539 1.242-3.012 1.39a1.686 1.686 0 0 1-.704.343c-.737.181-3.266.315-3.466.315h-.046c-.783 0-1.214-.241-1.45-.491-.658.329-1.51.19-2.122-.134a1.078 1.078 0 0 1-.58-1.153 1.243 1.243 0 0 1-.153-.195c-.162-.25-.528-.936-.454-1.946.056-.723.556-1.367.88-1.71a5.522 5.522 0 0 1 .408-2.256c.306-.727.885-1.348 1.32-1.737-.32-.537-.644-1.367-.329-2.21.227-.602.412-.936.82-1.08h-.005c.199-.074.389-.153.486-.259a3.418 3.418 0 0 1 2.298-1.103c.037-.093.079-.185.125-.283.31-.658.639-1.029 1.024-1.168a.94.94 0 0 1 .328-.06zm.006.7c-.507.016-1.001 1.519-1.001 1.519s-1.27-.204-2.266.871c-.199.218-.468.334-.746.44-.079.028-.176.023-.417.672-.371.991.625 2.094.625 2.094s-1.186.839-1.626 1.881c-.486 1.144-.338 2.261-.338 2.261s-.843.732-.899 1.487c-.051.663.139 1.2.343 1.515.227.343.51.176.51.176s-.561.653-.037.931c.477.25 1.283.394 1.71-.037.31-.31.371-1.001.486-1.283.028-.065.12.111.209.199.097.093.264.195.264.195s-.755.324-.445 1.066c.102.246.468.403 1.066.398.222-.005 2.664-.139 3.313-.296.375-.088.505-.283.505-.283s1.566-.431 2.998-1.357c.917-.598 1.293-.76 2.034-.936.612-.148.57-1.098-.241-1.084-.839.009-1.575.44-2.196.825-1.163.718-1.742.672-1.742.672l-.018-.032c-.079-.13.371-1.293-.134-2.678-.547-1.515-1.413-1.881-1.344-1.997.297-.5 1.038-1.297 1.334-2.78.176-.899.13-2.377-.269-3.151-.074-.144-.732.241-.732.241s-.616-1.371-.788-1.483a.271.271 0 0 0-.157-.046z"
|
d="M12 0C5.375 0 0 5.375 0 12s5.375 12 12 12 12-5.375 12-12S18.625 0 12 0zm.768 4.105c.183 0 .363.053.525.157.125.083.287.185.755 1.154.31-.088.468-.042.551-.019.204.056.366.19.463.375.477.917.542 2.553.334 3.605-.241 1.232-.755 2.029-1.131 2.576.324.329.778.899 1.117 1.825.278.774.31 1.478.273 2.015a5.51 5.51 0 0 0 .602-.329c.593-.366 1.487-.917 2.553-.931.714-.009 1.269.445 1.353 1.103a1.23 1.23 0 0 1-.945 1.362c-.649.158-.95.278-1.821.843-1.232.797-2.539 1.242-3.012 1.39a1.686 1.686 0 0 1-.704.343c-.737.181-3.266.315-3.466.315h-.046c-.783 0-1.214-.241-1.45-.491-.658.329-1.51.19-2.122-.134a1.078 1.078 0 0 1-.58-1.153 1.243 1.243 0 0 1-.153-.195c-.162-.25-.528-.936-.454-1.946.056-.723.556-1.367.88-1.71a5.522 5.522 0 0 1 .408-2.256c.306-.727.885-1.348 1.32-1.737-.32-.537-.644-1.367-.329-2.21.227-.602.412-.936.82-1.08h-.005c.199-.074.389-.153.486-.259a3.418 3.418 0 0 1 2.298-1.103c.037-.093.079-.185.125-.283.31-.658.639-1.029 1.024-1.168a.94.94 0 0 1 .328-.06zm.006.7c-.507.016-1.001 1.519-1.001 1.519s-1.27-.204-2.266.871c-.199.218-.468.334-.746.44-.079.028-.176.023-.417.672-.371.991.625 2.094.625 2.094s-1.186.839-1.626 1.881c-.486 1.144-.338 2.261-.338 2.261s-.843.732-.899 1.487c-.051.663.139 1.2.343 1.515.227.343.51.176.51.176s-.561.653-.037.931c.477.25 1.283.394 1.71-.037.31-.31.371-1.001.486-1.283.028-.065.12.111.209.199.097.093.264.195.264.195s-.755.324-.445 1.066c.102.246.468.403 1.066.398.222-.005 2.664-.139 3.313-.296.375-.088.505-.283.505-.283s1.566-.431 2.998-1.357c.917-.598 1.293-.76 2.034-.936.612-.148.57-1.098-.241-1.084-.839.009-1.575.44-2.196.825-1.163.718-1.742.672-1.742.672l-.018-.032c-.079-.13.371-1.293-.134-2.678-.547-1.515-1.413-1.881-1.344-1.997.297-.5 1.038-1.297 1.334-2.78.176-.899.13-2.377-.269-3.151-.074-.144-.732.241-.732.241s-.616-1.371-.788-1.483a.271.271 0 0 0-.157-.046z"
|
||||||
@@ -123,7 +75,7 @@ export const Icons = {
|
|||||||
/>
|
/>
|
||||||
</svg>
|
</svg>
|
||||||
),
|
),
|
||||||
pnpm: (props: LucideProps) => (
|
pnpm: (props: IconProps) => (
|
||||||
<svg viewBox="0 0 24 24" {...props}>
|
<svg viewBox="0 0 24 24" {...props}>
|
||||||
<path
|
<path
|
||||||
d="M0 0v7.5h7.5V0zm8.25 0v7.5h7.498V0zm8.25 0v7.5H24V0zM8.25 8.25v7.5h7.498v-7.5zm8.25 0v7.5H24v-7.5zM0 16.5V24h7.5v-7.5zm8.25 0V24h7.498v-7.5zm8.25 0V24H24v-7.5z"
|
d="M0 0v7.5h7.5V0zm8.25 0v7.5h7.498V0zm8.25 0v7.5H24V0zM8.25 8.25v7.5h7.498v-7.5zm8.25 0v7.5H24v-7.5zM0 16.5V24h7.5v-7.5zm8.25 0V24h7.498v-7.5zm8.25 0V24H24v-7.5z"
|
||||||
@@ -131,7 +83,7 @@ export const Icons = {
|
|||||||
/>
|
/>
|
||||||
</svg>
|
</svg>
|
||||||
),
|
),
|
||||||
react: (props: LucideProps) => (
|
react: (props: IconProps) => (
|
||||||
<svg viewBox="0 0 24 24" {...props}>
|
<svg viewBox="0 0 24 24" {...props}>
|
||||||
<path
|
<path
|
||||||
d="M14.23 12.004a2.236 2.236 0 0 1-2.235 2.236 2.236 2.236 0 0 1-2.236-2.236 2.236 2.236 0 0 1 2.235-2.236 2.236 2.236 0 0 1 2.236 2.236zm2.648-10.69c-1.346 0-3.107.96-4.888 2.622-1.78-1.653-3.542-2.602-4.887-2.602-.41 0-.783.093-1.106.278-1.375.793-1.683 3.264-.973 6.365C1.98 8.917 0 10.42 0 12.004c0 1.59 1.99 3.097 5.043 4.03-.704 3.113-.39 5.588.988 6.38.32.187.69.275 1.102.275 1.345 0 3.107-.96 4.888-2.624 1.78 1.654 3.542 2.603 4.887 2.603.41 0 .783-.09 1.106-.275 1.374-.792 1.683-3.263.973-6.365C22.02 15.096 24 13.59 24 12.004c0-1.59-1.99-3.097-5.043-4.032.704-3.11.39-5.587-.988-6.38-.318-.184-.688-.277-1.092-.278zm-.005 1.09v.006c.225 0 .406.044.558.127.666.382.955 1.835.73 3.704-.054.46-.142.945-.25 1.44-.96-.236-2.006-.417-3.107-.534-.66-.905-1.345-1.727-2.035-2.447 1.592-1.48 3.087-2.292 4.105-2.295zm-9.77.02c1.012 0 2.514.808 4.11 2.28-.686.72-1.37 1.537-2.02 2.442-1.107.117-2.154.298-3.113.538-.112-.49-.195-.964-.254-1.42-.23-1.868.054-3.32.714-3.707.19-.09.4-.127.563-.132zm4.882 3.05c.455.468.91.992 1.36 1.564-.44-.02-.89-.034-1.345-.034-.46 0-.915.01-1.36.034.44-.572.895-1.096 1.345-1.565zM12 8.1c.74 0 1.477.034 2.202.093.406.582.802 1.203 1.183 1.86.372.64.71 1.29 1.018 1.946-.308.655-.646 1.31-1.013 1.95-.38.66-.773 1.288-1.18 1.87-.728.063-1.466.098-2.21.098-.74 0-1.477-.035-2.202-.093-.406-.582-.802-1.204-1.183-1.86-.372-.64-.71-1.29-1.018-1.946.303-.657.646-1.313 1.013-1.954.38-.66.773-1.286 1.18-1.868.728-.064 1.466-.098 2.21-.098zm-3.635.254c-.24.377-.48.763-.704 1.16-.225.39-.435.782-.635 1.174-.265-.656-.49-1.31-.676-1.947.64-.15 1.315-.283 2.015-.386zm7.26 0c.695.103 1.365.23 2.006.387-.18.632-.405 1.282-.66 1.933-.2-.39-.41-.783-.64-1.174-.225-.392-.465-.774-.705-1.146zm3.063.675c.484.15.944.317 1.375.498 1.732.74 2.852 1.708 2.852 2.476-.005.768-1.125 1.74-2.857 2.475-.42.18-.88.342-1.355.493-.28-.958-.646-1.956-1.1-2.98.45-1.017.81-2.01 1.085-2.964zm-13.395.004c.278.96.645 1.957 1.1 2.98-.45 1.017-.812 2.01-1.086 2.964-.484-.15-.944-.318-1.37-.5-1.732-.737-2.852-1.706-2.852-2.474 0-.768 1.12-1.742 2.852-2.476.42-.18.88-.342 1.356-.494zm11.678 4.28c.265.657.49 1.312.676 1.948-.64.157-1.316.29-2.016.39.24-.375.48-.762.705-1.158.225-.39.435-.788.636-1.18zm-9.945.02c.2.392.41.783.64 1.175.23.39.465.772.705 1.143-.695-.102-1.365-.23-2.006-.386.18-.63.406-1.282.66-1.933zM17.92 16.32c.112.493.2.968.254 1.423.23 1.868-.054 3.32-.714 3.708-.147.09-.338.128-.563.128-1.012 0-2.514-.807-4.11-2.28.686-.72 1.37-1.536 2.02-2.44 1.107-.118 2.154-.3 3.113-.54zm-11.83.01c.96.234 2.006.415 3.107.532.66.905 1.345 1.727 2.035 2.446-1.595 1.483-3.092 2.295-4.11 2.295-.22-.005-.406-.05-.553-.132-.666-.38-.955-1.834-.73-3.703.054-.46.142-.944.25-1.438zm4.56.64c.44.02.89.034 1.345.034.46 0 .915-.01 1.36-.034-.44.572-.895 1.095-1.345 1.565-.455-.47-.91-.993-1.36-1.565z"
|
d="M14.23 12.004a2.236 2.236 0 0 1-2.235 2.236 2.236 2.236 0 0 1-2.236-2.236 2.236 2.236 0 0 1 2.235-2.236 2.236 2.236 0 0 1 2.236 2.236zm2.648-10.69c-1.346 0-3.107.96-4.888 2.622-1.78-1.653-3.542-2.602-4.887-2.602-.41 0-.783.093-1.106.278-1.375.793-1.683 3.264-.973 6.365C1.98 8.917 0 10.42 0 12.004c0 1.59 1.99 3.097 5.043 4.03-.704 3.113-.39 5.588.988 6.38.32.187.69.275 1.102.275 1.345 0 3.107-.96 4.888-2.624 1.78 1.654 3.542 2.603 4.887 2.603.41 0 .783-.09 1.106-.275 1.374-.792 1.683-3.263.973-6.365C22.02 15.096 24 13.59 24 12.004c0-1.59-1.99-3.097-5.043-4.032.704-3.11.39-5.587-.988-6.38-.318-.184-.688-.277-1.092-.278zm-.005 1.09v.006c.225 0 .406.044.558.127.666.382.955 1.835.73 3.704-.054.46-.142.945-.25 1.44-.96-.236-2.006-.417-3.107-.534-.66-.905-1.345-1.727-2.035-2.447 1.592-1.48 3.087-2.292 4.105-2.295zm-9.77.02c1.012 0 2.514.808 4.11 2.28-.686.72-1.37 1.537-2.02 2.442-1.107.117-2.154.298-3.113.538-.112-.49-.195-.964-.254-1.42-.23-1.868.054-3.32.714-3.707.19-.09.4-.127.563-.132zm4.882 3.05c.455.468.91.992 1.36 1.564-.44-.02-.89-.034-1.345-.034-.46 0-.915.01-1.36.034.44-.572.895-1.096 1.345-1.565zM12 8.1c.74 0 1.477.034 2.202.093.406.582.802 1.203 1.183 1.86.372.64.71 1.29 1.018 1.946-.308.655-.646 1.31-1.013 1.95-.38.66-.773 1.288-1.18 1.87-.728.063-1.466.098-2.21.098-.74 0-1.477-.035-2.202-.093-.406-.582-.802-1.204-1.183-1.86-.372-.64-.71-1.29-1.018-1.946.303-.657.646-1.313 1.013-1.954.38-.66.773-1.286 1.18-1.868.728-.064 1.466-.098 2.21-.098zm-3.635.254c-.24.377-.48.763-.704 1.16-.225.39-.435.782-.635 1.174-.265-.656-.49-1.31-.676-1.947.64-.15 1.315-.283 2.015-.386zm7.26 0c.695.103 1.365.23 2.006.387-.18.632-.405 1.282-.66 1.933-.2-.39-.41-.783-.64-1.174-.225-.392-.465-.774-.705-1.146zm3.063.675c.484.15.944.317 1.375.498 1.732.74 2.852 1.708 2.852 2.476-.005.768-1.125 1.74-2.857 2.475-.42.18-.88.342-1.355.493-.28-.958-.646-1.956-1.1-2.98.45-1.017.81-2.01 1.085-2.964zm-13.395.004c.278.96.645 1.957 1.1 2.98-.45 1.017-.812 2.01-1.086 2.964-.484-.15-.944-.318-1.37-.5-1.732-.737-2.852-1.706-2.852-2.474 0-.768 1.12-1.742 2.852-2.476.42-.18.88-.342 1.356-.494zm11.678 4.28c.265.657.49 1.312.676 1.948-.64.157-1.316.29-2.016.39.24-.375.48-.762.705-1.158.225-.39.435-.788.636-1.18zm-9.945.02c.2.392.41.783.64 1.175.23.39.465.772.705 1.143-.695-.102-1.365-.23-2.006-.386.18-.63.406-1.282.66-1.933zM17.92 16.32c.112.493.2.968.254 1.423.23 1.868-.054 3.32-.714 3.708-.147.09-.338.128-.563.128-1.012 0-2.514-.807-4.11-2.28.686-.72 1.37-1.536 2.02-2.44 1.107-.118 2.154-.3 3.113-.54zm-11.83.01c.96.234 2.006.415 3.107.532.66.905 1.345 1.727 2.035 2.446-1.595 1.483-3.092 2.295-4.11 2.295-.22-.005-.406-.05-.553-.132-.666-.38-.955-1.834-.73-3.703.054-.46.142-.944.25-1.438zm4.56.64c.44.02.89.034 1.345.034.46 0 .915-.01 1.36-.034-.44.572-.895 1.095-1.345 1.565-.455-.47-.91-.993-1.36-1.565z"
|
||||||
@@ -139,7 +91,7 @@ export const Icons = {
|
|||||||
/>
|
/>
|
||||||
</svg>
|
</svg>
|
||||||
),
|
),
|
||||||
tailwind: (props: LucideProps) => (
|
tailwind: (props: IconProps) => (
|
||||||
<svg viewBox="0 0 24 24" {...props}>
|
<svg viewBox="0 0 24 24" {...props}>
|
||||||
<path
|
<path
|
||||||
d="M12.001,4.8c-3.2,0-5.2,1.6-6,4.8c1.2-1.6,2.6-2.2,4.2-1.8c0.913,0.228,1.565,0.89,2.288,1.624 C13.666,10.618,15.027,12,18.001,12c3.2,0,5.2-1.6,6-4.8c-1.2,1.6-2.6,2.2-4.2,1.8c-0.913-0.228-1.565-0.89-2.288-1.624 C16.337,6.182,14.976,4.8,12.001,4.8z M6.001,12c-3.2,0-5.2,1.6-6,4.8c1.2-1.6,2.6-2.2,4.2-1.8c0.913,0.228,1.565,0.89,2.288,1.624 c1.177,1.194,2.538,2.576,5.512,2.576c3.2,0,5.2-1.6,6-4.8c-1.2,1.6-2.6,2.2-4.2,1.8c-0.913-0.228-1.565-0.89-2.288-1.624 C10.337,13.382,8.976,12,6.001,12z"
|
d="M12.001,4.8c-3.2,0-5.2,1.6-6,4.8c1.2-1.6,2.6-2.2,4.2-1.8c0.913,0.228,1.565,0.89,2.288,1.624 C13.666,10.618,15.027,12,18.001,12c3.2,0,5.2-1.6,6-4.8c-1.2,1.6-2.6,2.2-4.2,1.8c-0.913-0.228-1.565-0.89-2.288-1.624 C16.337,6.182,14.976,4.8,12.001,4.8z M6.001,12c-3.2,0-5.2,1.6-6,4.8c1.2-1.6,2.6-2.2,4.2-1.8c0.913,0.228,1.565,0.89,2.288,1.624 c1.177,1.194,2.538,2.576,5.512,2.576c3.2,0,5.2-1.6,6-4.8c-1.2,1.6-2.6,2.2-4.2,1.8c-0.913-0.228-1.565-0.89-2.288-1.624 C10.337,13.382,8.976,12,6.001,12z"
|
||||||
@@ -147,7 +99,7 @@ export const Icons = {
|
|||||||
/>
|
/>
|
||||||
</svg>
|
</svg>
|
||||||
),
|
),
|
||||||
google: (props: LucideProps) => (
|
google: (props: IconProps) => (
|
||||||
<svg role="img" viewBox="0 0 24 24" {...props}>
|
<svg role="img" viewBox="0 0 24 24" {...props}>
|
||||||
<path
|
<path
|
||||||
fill="currentColor"
|
fill="currentColor"
|
||||||
@@ -155,7 +107,7 @@ export const Icons = {
|
|||||||
/>
|
/>
|
||||||
</svg>
|
</svg>
|
||||||
),
|
),
|
||||||
apple: (props: LucideProps) => (
|
apple: (props: IconProps) => (
|
||||||
<svg role="img" viewBox="0 0 24 24" {...props}>
|
<svg role="img" viewBox="0 0 24 24" {...props}>
|
||||||
<path
|
<path
|
||||||
d="M12.152 6.896c-.948 0-2.415-1.078-3.96-1.04-2.04.027-3.91 1.183-4.961 3.014-2.117 3.675-.546 9.103 1.519 12.09 1.013 1.454 2.208 3.09 3.792 3.039 1.52-.065 2.09-.987 3.935-.987 1.831 0 2.35.987 3.96.948 1.637-.026 2.676-1.48 3.676-2.948 1.156-1.688 1.636-3.325 1.662-3.415-.039-.013-3.182-1.221-3.22-4.857-.026-3.04 2.48-4.494 2.597-4.559-1.429-2.09-3.623-2.324-4.39-2.376-2-.156-3.675 1.09-4.61 1.09zM15.53 3.83c.843-1.012 1.4-2.427 1.245-3.83-1.207.052-2.662.805-3.532 1.818-.78.896-1.454 2.338-1.273 3.714 1.338.104 2.715-.688 3.559-1.701"
|
d="M12.152 6.896c-.948 0-2.415-1.078-3.96-1.04-2.04.027-3.91 1.183-4.961 3.014-2.117 3.675-.546 9.103 1.519 12.09 1.013 1.454 2.208 3.09 3.792 3.039 1.52-.065 2.09-.987 3.935-.987 1.831 0 2.35.987 3.96.948 1.637-.026 2.676-1.48 3.676-2.948 1.156-1.688 1.636-3.325 1.662-3.415-.039-.013-3.182-1.221-3.22-4.857-.026-3.04 2.48-4.494 2.597-4.559-1.429-2.09-3.623-2.324-4.39-2.376-2-.156-3.675 1.09-4.61 1.09zM15.53 3.83c.843-1.012 1.4-2.427 1.245-3.83-1.207.052-2.662.805-3.532 1.818-.78.896-1.454 2.338-1.273 3.714 1.338.104 2.715-.688 3.559-1.701"
|
||||||
@@ -163,7 +115,7 @@ export const Icons = {
|
|||||||
/>
|
/>
|
||||||
</svg>
|
</svg>
|
||||||
),
|
),
|
||||||
paypal: (props: LucideProps) => (
|
paypal: (props: IconProps) => (
|
||||||
<svg role="img" viewBox="0 0 24 24" {...props}>
|
<svg role="img" viewBox="0 0 24 24" {...props}>
|
||||||
<path
|
<path
|
||||||
d="M7.076 21.337H2.47a.641.641 0 0 1-.633-.74L4.944.901C5.026.382 5.474 0 5.998 0h7.46c2.57 0 4.578.543 5.69 1.81 1.01 1.15 1.304 2.42 1.012 4.287-.023.143-.047.288-.077.437-.983 5.05-4.349 6.797-8.647 6.797h-2.19c-.524 0-.968.382-1.05.9l-1.12 7.106zm14.146-14.42a3.35 3.35 0 0 0-.607-.541c-.013.076-.026.175-.041.254-.93 4.778-4.005 7.201-9.138 7.201h-2.19a.563.563 0 0 0-.556.479l-1.187 7.527h-.506l-.24 1.516a.56.56 0 0 0 .554.647h3.882c.46 0 .85-.334.922-.788.06-.26.76-4.852.816-5.09a.932.932 0 0 1 .923-.788h.58c3.76 0 6.705-1.528 7.565-5.946.36-1.847.174-3.388-.777-4.471z"
|
d="M7.076 21.337H2.47a.641.641 0 0 1-.633-.74L4.944.901C5.026.382 5.474 0 5.998 0h7.46c2.57 0 4.578.543 5.69 1.81 1.01 1.15 1.304 2.42 1.012 4.287-.023.143-.047.288-.077.437-.983 5.05-4.349 6.797-8.647 6.797h-2.19c-.524 0-.968.382-1.05.9l-1.12 7.106zm14.146-14.42a3.35 3.35 0 0 0-.607-.541c-.013.076-.026.175-.041.254-.93 4.778-4.005 7.201-9.138 7.201h-2.19a.563.563 0 0 0-.556.479l-1.187 7.527h-.506l-.24 1.516a.56.56 0 0 0 .554.647h3.882c.46 0 .85-.334.922-.788.06-.26.76-4.852.816-5.09a.932.932 0 0 1 .923-.788h.58c3.76 0 6.705-1.528 7.565-5.946.36-1.847.174-3.388-.777-4.471z"
|
||||||
@@ -171,4 +123,20 @@ export const Icons = {
|
|||||||
/>
|
/>
|
||||||
</svg>
|
</svg>
|
||||||
),
|
),
|
||||||
|
spinner: (props: IconProps) => (
|
||||||
|
<svg
|
||||||
|
xmlns="http://www.w3.org/2000/svg"
|
||||||
|
width="24"
|
||||||
|
height="24"
|
||||||
|
viewBox="0 0 24 24"
|
||||||
|
fill="none"
|
||||||
|
stroke="currentColor"
|
||||||
|
strokeWidth="2"
|
||||||
|
strokeLinecap="round"
|
||||||
|
strokeLinejoin="round"
|
||||||
|
{...props}
|
||||||
|
>
|
||||||
|
<path d="M21 12a9 9 0 1 1-6.219-8.56" />
|
||||||
|
</svg>
|
||||||
|
),
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -7,6 +7,7 @@ import { usePathname } from "next/navigation"
|
|||||||
import { siteConfig } from "@/config/site"
|
import { siteConfig } from "@/config/site"
|
||||||
import { cn } from "@/lib/utils"
|
import { cn } from "@/lib/utils"
|
||||||
import { Icons } from "@/components/icons"
|
import { Icons } from "@/components/icons"
|
||||||
|
import { Badge } from "@/registry/new-york/ui/badge"
|
||||||
|
|
||||||
export function MainNav() {
|
export function MainNav() {
|
||||||
const pathname = usePathname()
|
const pathname = usePathname()
|
||||||
@@ -40,6 +41,17 @@ export function MainNav() {
|
|||||||
>
|
>
|
||||||
Components
|
Components
|
||||||
</Link>
|
</Link>
|
||||||
|
<Link
|
||||||
|
href="/themes"
|
||||||
|
className={cn(
|
||||||
|
"transition-colors hover:text-foreground/80",
|
||||||
|
pathname?.startsWith("/themes")
|
||||||
|
? "text-foreground"
|
||||||
|
: "text-foreground/60"
|
||||||
|
)}
|
||||||
|
>
|
||||||
|
Themes
|
||||||
|
</Link>
|
||||||
<Link
|
<Link
|
||||||
href="/examples"
|
href="/examples"
|
||||||
className={cn(
|
className={cn(
|
||||||
|
|||||||
@@ -2,7 +2,7 @@
|
|||||||
|
|
||||||
import * as React from "react"
|
import * as React from "react"
|
||||||
import Image from "next/image"
|
import Image from "next/image"
|
||||||
import Link, { LinkProps } from "next/link"
|
import Link from "next/link"
|
||||||
import { useMDXComponent } from "next-contentlayer/hooks"
|
import { useMDXComponent } from "next-contentlayer/hooks"
|
||||||
import { NpmCommands } from "types/unist"
|
import { NpmCommands } from "types/unist"
|
||||||
|
|
||||||
@@ -292,6 +292,12 @@ const components = {
|
|||||||
}: React.ComponentProps<typeof FrameworkDocs>) => (
|
}: React.ComponentProps<typeof FrameworkDocs>) => (
|
||||||
<FrameworkDocs className={cn(className)} {...props} />
|
<FrameworkDocs className={cn(className)} {...props} />
|
||||||
),
|
),
|
||||||
|
Link: ({ className, ...props }: React.ComponentProps<typeof Link>) => (
|
||||||
|
<Link
|
||||||
|
className={cn("font-medium underline underline-offset-4", className)}
|
||||||
|
{...props}
|
||||||
|
/>
|
||||||
|
),
|
||||||
LinkedCard: ({ className, ...props }: React.ComponentProps<typeof Link>) => (
|
LinkedCard: ({ className, ...props }: React.ComponentProps<typeof Link>) => (
|
||||||
<Link
|
<Link
|
||||||
className={cn(
|
className={cn(
|
||||||
|
|||||||
@@ -3,7 +3,7 @@
|
|||||||
import * as React from "react"
|
import * as React from "react"
|
||||||
import Link, { LinkProps } from "next/link"
|
import Link, { LinkProps } from "next/link"
|
||||||
import { useRouter } from "next/navigation"
|
import { useRouter } from "next/navigation"
|
||||||
import { SidebarOpen } from "lucide-react"
|
import { ViewVerticalIcon } from "@radix-ui/react-icons"
|
||||||
|
|
||||||
import { docsConfig } from "@/config/docs"
|
import { docsConfig } from "@/config/docs"
|
||||||
import { siteConfig } from "@/config/site"
|
import { siteConfig } from "@/config/site"
|
||||||
@@ -23,7 +23,7 @@ export function MobileNav() {
|
|||||||
variant="ghost"
|
variant="ghost"
|
||||||
className="mr-2 px-0 text-base hover:bg-transparent focus-visible:bg-transparent focus-visible:ring-0 focus-visible:ring-offset-0 md:hidden"
|
className="mr-2 px-0 text-base hover:bg-transparent focus-visible:bg-transparent focus-visible:ring-0 focus-visible:ring-offset-0 md:hidden"
|
||||||
>
|
>
|
||||||
<SidebarOpen className="h-6 w-6" />
|
<ViewVerticalIcon className="h-5 w-5" />
|
||||||
<span className="sr-only">Toggle Menu</span>
|
<span className="sr-only">Toggle Menu</span>
|
||||||
</Button>
|
</Button>
|
||||||
</SheetTrigger>
|
</SheetTrigger>
|
||||||
|
|||||||
@@ -1,9 +1,9 @@
|
|||||||
"use client"
|
"use client"
|
||||||
|
|
||||||
import * as React from "react"
|
import * as React from "react"
|
||||||
|
import { MoonIcon, SunIcon } from "@radix-ui/react-icons"
|
||||||
import { useTheme } from "next-themes"
|
import { useTheme } from "next-themes"
|
||||||
|
|
||||||
import { Icons } from "@/components/icons"
|
|
||||||
import { Button } from "@/registry/new-york/ui/button"
|
import { Button } from "@/registry/new-york/ui/button"
|
||||||
import {
|
import {
|
||||||
DropdownMenu,
|
DropdownMenu,
|
||||||
@@ -19,23 +19,20 @@ export function ModeToggle() {
|
|||||||
<DropdownMenu>
|
<DropdownMenu>
|
||||||
<DropdownMenuTrigger asChild>
|
<DropdownMenuTrigger asChild>
|
||||||
<Button variant="ghost" className="w-9 px-0">
|
<Button variant="ghost" className="w-9 px-0">
|
||||||
<Icons.sun className="h-[1.2rem] w-[1.2rem] rotate-0 scale-100 transition-all dark:-rotate-90 dark:scale-0" />
|
<SunIcon className="h-[1.2rem] w-[1.2rem] rotate-0 scale-100 transition-all dark:-rotate-90 dark:scale-0" />
|
||||||
<Icons.moon className="absolute h-[1.2rem] w-[1.2rem] rotate-90 scale-0 transition-all dark:rotate-0 dark:scale-100" />
|
<MoonIcon className="absolute h-[1.2rem] w-[1.2rem] rotate-90 scale-0 transition-all dark:rotate-0 dark:scale-100" />
|
||||||
<span className="sr-only">Toggle theme</span>
|
<span className="sr-only">Toggle theme</span>
|
||||||
</Button>
|
</Button>
|
||||||
</DropdownMenuTrigger>
|
</DropdownMenuTrigger>
|
||||||
<DropdownMenuContent align="end">
|
<DropdownMenuContent align="end">
|
||||||
<DropdownMenuItem onClick={() => setTheme("light")}>
|
<DropdownMenuItem onClick={() => setTheme("light")}>
|
||||||
<Icons.sun className="mr-2 h-4 w-4" />
|
Light
|
||||||
<span>Light</span>
|
|
||||||
</DropdownMenuItem>
|
</DropdownMenuItem>
|
||||||
<DropdownMenuItem onClick={() => setTheme("dark")}>
|
<DropdownMenuItem onClick={() => setTheme("dark")}>
|
||||||
<Icons.moon className="mr-2 h-4 w-4" />
|
Dark
|
||||||
<span>Dark</span>
|
|
||||||
</DropdownMenuItem>
|
</DropdownMenuItem>
|
||||||
<DropdownMenuItem onClick={() => setTheme("system")}>
|
<DropdownMenuItem onClick={() => setTheme("system")}>
|
||||||
<Icons.laptop className="mr-2 h-4 w-4" />
|
System
|
||||||
<span>System</span>
|
|
||||||
</DropdownMenuItem>
|
</DropdownMenuItem>
|
||||||
</DropdownMenuContent>
|
</DropdownMenuContent>
|
||||||
</DropdownMenu>
|
</DropdownMenu>
|
||||||
|
|||||||
@@ -1,10 +1,10 @@
|
|||||||
import Link from "next/link"
|
import Link from "next/link"
|
||||||
|
import { ChevronLeftIcon, ChevronRightIcon } from "@radix-ui/react-icons"
|
||||||
import { Doc } from "contentlayer/generated"
|
import { Doc } from "contentlayer/generated"
|
||||||
import { NavItem, NavItemWithChildren } from "types/nav"
|
import { NavItem, NavItemWithChildren } from "types/nav"
|
||||||
|
|
||||||
import { docsConfig } from "@/config/docs"
|
import { docsConfig } from "@/config/docs"
|
||||||
import { cn } from "@/lib/utils"
|
import { cn } from "@/lib/utils"
|
||||||
import { Icons } from "@/components/icons"
|
|
||||||
import { buttonVariants } from "@/registry/new-york/ui/button"
|
import { buttonVariants } from "@/registry/new-york/ui/button"
|
||||||
|
|
||||||
interface DocsPagerProps {
|
interface DocsPagerProps {
|
||||||
@@ -25,7 +25,7 @@ export function DocsPager({ doc }: DocsPagerProps) {
|
|||||||
href={pager.prev.href}
|
href={pager.prev.href}
|
||||||
className={buttonVariants({ variant: "outline" })}
|
className={buttonVariants({ variant: "outline" })}
|
||||||
>
|
>
|
||||||
<Icons.chevronLeft className="mr-2 h-4 w-4" />
|
<ChevronLeftIcon className="mr-2 h-4 w-4" />
|
||||||
{pager.prev.title}
|
{pager.prev.title}
|
||||||
</Link>
|
</Link>
|
||||||
)}
|
)}
|
||||||
@@ -35,7 +35,7 @@ export function DocsPager({ doc }: DocsPagerProps) {
|
|||||||
className={cn(buttonVariants({ variant: "outline" }), "ml-auto")}
|
className={cn(buttonVariants({ variant: "outline" }), "ml-auto")}
|
||||||
>
|
>
|
||||||
{pager.next.title}
|
{pager.next.title}
|
||||||
<Icons.chevronRight className="ml-2 h-4 w-4" />
|
<ChevronRightIcon className="ml-2 h-4 w-4" />
|
||||||
</Link>
|
</Link>
|
||||||
)}
|
)}
|
||||||
</div>
|
</div>
|
||||||
|
|||||||
@@ -11,7 +11,7 @@ import { buttonVariants } from "@/registry/new-york/ui/button"
|
|||||||
|
|
||||||
export function SiteHeader() {
|
export function SiteHeader() {
|
||||||
return (
|
return (
|
||||||
<header className="supports-backdrop-blur:bg-background/60 sticky top-0 z-40 w-full border-b bg-background/95 backdrop-blur">
|
<header className="supports-backdrop-blur:bg-background/60 sticky top-0 z-50 w-full border-b bg-background/95 backdrop-blur">
|
||||||
<div className="container flex h-14 items-center">
|
<div className="container flex h-14 items-center">
|
||||||
<MainNav />
|
<MainNav />
|
||||||
<MobileNav />
|
<MobileNav />
|
||||||
|
|||||||
52
apps/www/components/theme-component.tsx
Normal file
52
apps/www/components/theme-component.tsx
Normal file
@@ -0,0 +1,52 @@
|
|||||||
|
"use client"
|
||||||
|
|
||||||
|
import * as React from "react"
|
||||||
|
import { Index } from "@/__registry__"
|
||||||
|
|
||||||
|
import { cn } from "@/lib/utils"
|
||||||
|
import { useConfig } from "@/hooks/use-config"
|
||||||
|
import { Icons } from "@/components/icons"
|
||||||
|
|
||||||
|
interface ThemeComponentProps extends React.HTMLAttributes<HTMLDivElement> {
|
||||||
|
name: string
|
||||||
|
extractClassname?: boolean
|
||||||
|
extractedClassNames?: string
|
||||||
|
align?: "center" | "start" | "end"
|
||||||
|
}
|
||||||
|
|
||||||
|
export function ThemeComponent({ name, ...props }: ThemeComponentProps) {
|
||||||
|
const [config] = useConfig()
|
||||||
|
|
||||||
|
const Preview = React.useMemo(() => {
|
||||||
|
const Component = Index[config.style][name]?.component
|
||||||
|
|
||||||
|
if (!Component) {
|
||||||
|
return (
|
||||||
|
<p className="text-sm text-muted-foreground">
|
||||||
|
Component{" "}
|
||||||
|
<code className="relative rounded bg-muted px-[0.3rem] py-[0.2rem] font-mono text-sm">
|
||||||
|
{name}
|
||||||
|
</code>{" "}
|
||||||
|
not found in registry.
|
||||||
|
</p>
|
||||||
|
)
|
||||||
|
}
|
||||||
|
|
||||||
|
return <Component />
|
||||||
|
}, [name, config.style])
|
||||||
|
|
||||||
|
return (
|
||||||
|
<div className={cn("relative")} {...props}>
|
||||||
|
<React.Suspense
|
||||||
|
fallback={
|
||||||
|
<div className="flex items-center text-sm text-muted-foreground">
|
||||||
|
<Icons.spinner className="mr-2 h-4 w-4 animate-spin" />
|
||||||
|
Loading...
|
||||||
|
</div>
|
||||||
|
}
|
||||||
|
>
|
||||||
|
{Preview}
|
||||||
|
</React.Suspense>
|
||||||
|
</div>
|
||||||
|
)
|
||||||
|
}
|
||||||
629
apps/www/components/theme-customizer.tsx
Normal file
629
apps/www/components/theme-customizer.tsx
Normal file
@@ -0,0 +1,629 @@
|
|||||||
|
"use client"
|
||||||
|
|
||||||
|
import * as React from "react"
|
||||||
|
import {
|
||||||
|
CheckIcon,
|
||||||
|
CopyIcon,
|
||||||
|
InfoCircledIcon,
|
||||||
|
MoonIcon,
|
||||||
|
ResetIcon,
|
||||||
|
SunIcon,
|
||||||
|
} from "@radix-ui/react-icons"
|
||||||
|
import template from "lodash.template"
|
||||||
|
import { Paintbrush } from "lucide-react"
|
||||||
|
import { useTheme } from "next-themes"
|
||||||
|
|
||||||
|
import { cn } from "@/lib/utils"
|
||||||
|
import { useConfig } from "@/hooks/use-config"
|
||||||
|
import { copyToClipboardWithMeta } from "@/components/copy-button"
|
||||||
|
import { DrawerContent, DrawerTrigger } from "@/components/drawer"
|
||||||
|
import { ThemeWrapper } from "@/components/theme-wrapper"
|
||||||
|
import { Button } from "@/registry/new-york/ui/button"
|
||||||
|
import {
|
||||||
|
Dialog,
|
||||||
|
DialogContent,
|
||||||
|
DialogDescription,
|
||||||
|
DialogHeader,
|
||||||
|
DialogTitle,
|
||||||
|
DialogTrigger,
|
||||||
|
} from "@/registry/new-york/ui/dialog"
|
||||||
|
import { Label } from "@/registry/new-york/ui/label"
|
||||||
|
import {
|
||||||
|
Popover,
|
||||||
|
PopoverContent,
|
||||||
|
PopoverTrigger,
|
||||||
|
} from "@/registry/new-york/ui/popover"
|
||||||
|
import { Skeleton } from "@/registry/new-york/ui/skeleton"
|
||||||
|
import { Theme, themes } from "@/registry/themes"
|
||||||
|
|
||||||
|
import "@/styles/mdx.css"
|
||||||
|
import { Drawer } from "vaul"
|
||||||
|
|
||||||
|
import {
|
||||||
|
Tooltip,
|
||||||
|
TooltipContent,
|
||||||
|
TooltipTrigger,
|
||||||
|
} from "@/registry/new-york/ui/tooltip"
|
||||||
|
|
||||||
|
export function ThemeCustomizer() {
|
||||||
|
const [config, setConfig] = useConfig()
|
||||||
|
const { resolvedTheme: mode } = useTheme()
|
||||||
|
const [mounted, setMounted] = React.useState(false)
|
||||||
|
|
||||||
|
React.useEffect(() => {
|
||||||
|
setMounted(true)
|
||||||
|
}, [])
|
||||||
|
|
||||||
|
return (
|
||||||
|
<div className="flex items-center space-x-2">
|
||||||
|
<Drawer.Root>
|
||||||
|
<DrawerTrigger asChild>
|
||||||
|
<Button variant="outline" className="md:hidden">
|
||||||
|
<Paintbrush className="mr-2 h-4 w-4" />
|
||||||
|
Customize
|
||||||
|
</Button>
|
||||||
|
</DrawerTrigger>
|
||||||
|
<DrawerContent className="h-[85%] p-6 pt-10">
|
||||||
|
<Customizer />
|
||||||
|
</DrawerContent>
|
||||||
|
</Drawer.Root>
|
||||||
|
<div className="hidden md:flex">
|
||||||
|
<div className="mr-2 hidden items-center space-x-0.5 lg:flex">
|
||||||
|
{mounted ? (
|
||||||
|
<>
|
||||||
|
{["zinc", "rose", "blue", "green", "orange"].map((color) => {
|
||||||
|
const theme = themes.find((theme) => theme.name === color)
|
||||||
|
const isActive = config.theme === color
|
||||||
|
|
||||||
|
if (!theme) {
|
||||||
|
return null
|
||||||
|
}
|
||||||
|
|
||||||
|
return (
|
||||||
|
<Tooltip key={theme.name}>
|
||||||
|
<TooltipTrigger asChild>
|
||||||
|
<button
|
||||||
|
onClick={() =>
|
||||||
|
setConfig({
|
||||||
|
...config,
|
||||||
|
theme: theme.name,
|
||||||
|
})
|
||||||
|
}
|
||||||
|
className={cn(
|
||||||
|
"flex h-9 w-9 items-center justify-center rounded-full border-2 text-xs",
|
||||||
|
isActive
|
||||||
|
? "border-[--theme-primary]"
|
||||||
|
: "border-transparent"
|
||||||
|
)}
|
||||||
|
style={
|
||||||
|
{
|
||||||
|
"--theme-primary": `hsl(${
|
||||||
|
theme?.activeColor[
|
||||||
|
mode === "dark" ? "dark" : "light"
|
||||||
|
]
|
||||||
|
})`,
|
||||||
|
} as React.CSSProperties
|
||||||
|
}
|
||||||
|
>
|
||||||
|
<span
|
||||||
|
className={cn(
|
||||||
|
"flex h-6 w-6 items-center justify-center rounded-full bg-[--theme-primary]"
|
||||||
|
)}
|
||||||
|
>
|
||||||
|
{isActive && (
|
||||||
|
<CheckIcon className="h-4 w-4 text-white" />
|
||||||
|
)}
|
||||||
|
</span>
|
||||||
|
<span className="sr-only">{theme.label}</span>
|
||||||
|
</button>
|
||||||
|
</TooltipTrigger>
|
||||||
|
<TooltipContent
|
||||||
|
align="center"
|
||||||
|
className="rounded-[0.5rem] bg-zinc-900 text-zinc-50"
|
||||||
|
>
|
||||||
|
{theme.label}
|
||||||
|
</TooltipContent>
|
||||||
|
</Tooltip>
|
||||||
|
)
|
||||||
|
})}
|
||||||
|
</>
|
||||||
|
) : (
|
||||||
|
<div className="mr-1 flex items-center space-x-3">
|
||||||
|
<Skeleton className="h-6 w-6 rounded-full" />
|
||||||
|
<Skeleton className="h-6 w-6 rounded-full" />
|
||||||
|
<Skeleton className="h-6 w-6 rounded-full" />
|
||||||
|
<Skeleton className="h-6 w-6 rounded-full" />
|
||||||
|
<Skeleton className="h-6 w-6 rounded-full" />
|
||||||
|
</div>
|
||||||
|
)}
|
||||||
|
</div>
|
||||||
|
<Popover>
|
||||||
|
<PopoverTrigger asChild>
|
||||||
|
<Button variant="outline">
|
||||||
|
<Paintbrush className="mr-2 h-4 w-4" />
|
||||||
|
Customize
|
||||||
|
</Button>
|
||||||
|
</PopoverTrigger>
|
||||||
|
<PopoverContent
|
||||||
|
align="end"
|
||||||
|
className="z-40 w-[340px] rounded-[0.5rem] bg-white p-6 dark:bg-zinc-950"
|
||||||
|
>
|
||||||
|
<Customizer />
|
||||||
|
</PopoverContent>
|
||||||
|
</Popover>
|
||||||
|
</div>
|
||||||
|
<CopyCodeButton />
|
||||||
|
</div>
|
||||||
|
)
|
||||||
|
}
|
||||||
|
|
||||||
|
function Customizer() {
|
||||||
|
const [mounted, setMounted] = React.useState(false)
|
||||||
|
const { setTheme: setMode, resolvedTheme: mode } = useTheme()
|
||||||
|
const [config, setConfig] = useConfig()
|
||||||
|
|
||||||
|
React.useEffect(() => {
|
||||||
|
setMounted(true)
|
||||||
|
}, [])
|
||||||
|
|
||||||
|
return (
|
||||||
|
<ThemeWrapper
|
||||||
|
defaultTheme="zinc"
|
||||||
|
className="flex flex-col space-y-4 md:space-y-6"
|
||||||
|
>
|
||||||
|
<div className="flex items-start">
|
||||||
|
<div className="space-y-1 pr-2">
|
||||||
|
<div className="font-semibold leading-none tracking-tight">
|
||||||
|
Customize
|
||||||
|
</div>
|
||||||
|
<div className="text-xs text-muted-foreground">
|
||||||
|
Pick a style and color for your components.
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
<Button
|
||||||
|
variant="ghost"
|
||||||
|
size="icon"
|
||||||
|
className="ml-auto rounded-[0.5rem]"
|
||||||
|
onClick={() => {
|
||||||
|
setConfig({
|
||||||
|
...config,
|
||||||
|
theme: "zinc",
|
||||||
|
radius: 0.5,
|
||||||
|
})
|
||||||
|
}}
|
||||||
|
>
|
||||||
|
<ResetIcon />
|
||||||
|
<span className="sr-only">Reset</span>
|
||||||
|
</Button>
|
||||||
|
</div>
|
||||||
|
<div className="flex flex-1 flex-col space-y-4 md:space-y-6">
|
||||||
|
<div className="space-y-1.5">
|
||||||
|
<div className="flex w-full items-center">
|
||||||
|
<Label className="text-xs">Style</Label>
|
||||||
|
<Popover>
|
||||||
|
<PopoverTrigger>
|
||||||
|
<InfoCircledIcon className="ml-1 h-3 w-3" />
|
||||||
|
<span className="sr-only">About styles</span>
|
||||||
|
</PopoverTrigger>
|
||||||
|
<PopoverContent
|
||||||
|
className="space-y-3 rounded-[0.5rem] text-sm"
|
||||||
|
side="right"
|
||||||
|
align="start"
|
||||||
|
alignOffset={-20}
|
||||||
|
>
|
||||||
|
<p className="font-medium">
|
||||||
|
What is the difference between the New York and Default style?
|
||||||
|
</p>
|
||||||
|
<p>
|
||||||
|
A style comes with its own set of components, animations,
|
||||||
|
icons and more.
|
||||||
|
</p>
|
||||||
|
<p>
|
||||||
|
The <span className="font-medium">Default</span> style has
|
||||||
|
larger inputs, uses lucide-react for icons and
|
||||||
|
tailwindcss-animate for animations.
|
||||||
|
</p>
|
||||||
|
<p>
|
||||||
|
The <span className="font-medium">New York</span> style ships
|
||||||
|
with smaller buttons and cards with shadows. It uses icons
|
||||||
|
from Radix Icons.
|
||||||
|
</p>
|
||||||
|
</PopoverContent>
|
||||||
|
</Popover>
|
||||||
|
</div>
|
||||||
|
<div className="grid grid-cols-3 gap-2">
|
||||||
|
<Button
|
||||||
|
variant={"outline"}
|
||||||
|
size="sm"
|
||||||
|
onClick={() => setConfig({ ...config, style: "default" })}
|
||||||
|
className={cn(
|
||||||
|
config.style === "default" && "border-2 border-primary"
|
||||||
|
)}
|
||||||
|
>
|
||||||
|
Default
|
||||||
|
</Button>
|
||||||
|
<Button
|
||||||
|
variant={"outline"}
|
||||||
|
size="sm"
|
||||||
|
onClick={() => setConfig({ ...config, style: "new-york" })}
|
||||||
|
className={cn(
|
||||||
|
config.style === "new-york" && "border-2 border-primary"
|
||||||
|
)}
|
||||||
|
>
|
||||||
|
New York
|
||||||
|
</Button>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
<div className="space-y-1.5">
|
||||||
|
<Label className="text-xs">Color</Label>
|
||||||
|
<div className="grid grid-cols-3 gap-2">
|
||||||
|
{themes.map((theme) => {
|
||||||
|
const isActive = config.theme === theme.name
|
||||||
|
|
||||||
|
return mounted ? (
|
||||||
|
<Button
|
||||||
|
variant={"outline"}
|
||||||
|
size="sm"
|
||||||
|
key={theme.name}
|
||||||
|
onClick={() => {
|
||||||
|
setConfig({
|
||||||
|
...config,
|
||||||
|
theme: theme.name,
|
||||||
|
})
|
||||||
|
}}
|
||||||
|
className={cn(
|
||||||
|
"justify-start",
|
||||||
|
isActive && "border-2 border-primary"
|
||||||
|
)}
|
||||||
|
style={
|
||||||
|
{
|
||||||
|
"--theme-primary": `hsl(${
|
||||||
|
theme?.activeColor[mode === "dark" ? "dark" : "light"]
|
||||||
|
})`,
|
||||||
|
} as React.CSSProperties
|
||||||
|
}
|
||||||
|
>
|
||||||
|
<span
|
||||||
|
className={cn(
|
||||||
|
"mr-1 flex h-5 w-5 shrink-0 -translate-x-1 items-center justify-center rounded-full bg-[--theme-primary]"
|
||||||
|
)}
|
||||||
|
>
|
||||||
|
{isActive && <CheckIcon className="h-4 w-4 text-white" />}
|
||||||
|
</span>
|
||||||
|
{theme.label}
|
||||||
|
</Button>
|
||||||
|
) : (
|
||||||
|
<Skeleton className="h-8 w-full" key={theme.name} />
|
||||||
|
)
|
||||||
|
})}
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
<div className="space-y-1.5">
|
||||||
|
<Label className="text-xs">Radius</Label>
|
||||||
|
<div className="grid grid-cols-5 gap-2">
|
||||||
|
{["0", "0.3", "0.5", "0.75", "1.0"].map((value) => {
|
||||||
|
return (
|
||||||
|
<Button
|
||||||
|
variant={"outline"}
|
||||||
|
size="sm"
|
||||||
|
key={value}
|
||||||
|
onClick={() => {
|
||||||
|
setConfig({
|
||||||
|
...config,
|
||||||
|
radius: parseFloat(value),
|
||||||
|
})
|
||||||
|
}}
|
||||||
|
className={cn(
|
||||||
|
config.radius === parseFloat(value) &&
|
||||||
|
"border-2 border-primary"
|
||||||
|
)}
|
||||||
|
>
|
||||||
|
{value}
|
||||||
|
</Button>
|
||||||
|
)
|
||||||
|
})}
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
<div className="space-y-1.5">
|
||||||
|
<Label className="text-xs">Mode</Label>
|
||||||
|
<div className="grid grid-cols-3 gap-2">
|
||||||
|
{mounted ? (
|
||||||
|
<>
|
||||||
|
<Button
|
||||||
|
variant={"outline"}
|
||||||
|
size="sm"
|
||||||
|
onClick={() => setMode("light")}
|
||||||
|
className={cn(mode === "light" && "border-2 border-primary")}
|
||||||
|
>
|
||||||
|
<SunIcon className="mr-1 -translate-x-1" />
|
||||||
|
Light
|
||||||
|
</Button>
|
||||||
|
<Button
|
||||||
|
variant={"outline"}
|
||||||
|
size="sm"
|
||||||
|
onClick={() => setMode("dark")}
|
||||||
|
className={cn(mode === "dark" && "border-2 border-primary")}
|
||||||
|
>
|
||||||
|
<MoonIcon className="mr-1 -translate-x-1" />
|
||||||
|
Dark
|
||||||
|
</Button>
|
||||||
|
</>
|
||||||
|
) : (
|
||||||
|
<>
|
||||||
|
<Skeleton className="h-8 w-full" />
|
||||||
|
<Skeleton className="h-8 w-full" />
|
||||||
|
</>
|
||||||
|
)}
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</ThemeWrapper>
|
||||||
|
)
|
||||||
|
}
|
||||||
|
|
||||||
|
function CopyCodeButton() {
|
||||||
|
const [config] = useConfig()
|
||||||
|
const activeTheme = themes.find((theme) => theme.name === config.theme)
|
||||||
|
const [hasCopied, setHasCopied] = React.useState(false)
|
||||||
|
|
||||||
|
React.useEffect(() => {
|
||||||
|
setTimeout(() => {
|
||||||
|
setHasCopied(false)
|
||||||
|
}, 2000)
|
||||||
|
}, [hasCopied])
|
||||||
|
|
||||||
|
return (
|
||||||
|
<>
|
||||||
|
{activeTheme && (
|
||||||
|
<Button
|
||||||
|
onClick={() => {
|
||||||
|
copyToClipboardWithMeta(getThemeCode(activeTheme, config.radius), {
|
||||||
|
name: "copy_theme_code",
|
||||||
|
properties: {
|
||||||
|
theme: activeTheme.name,
|
||||||
|
radius: config.radius,
|
||||||
|
},
|
||||||
|
})
|
||||||
|
setHasCopied(true)
|
||||||
|
}}
|
||||||
|
className="md:hidden"
|
||||||
|
>
|
||||||
|
{hasCopied ? (
|
||||||
|
<CheckIcon className="mr-2 h-4 w-4" />
|
||||||
|
) : (
|
||||||
|
<CopyIcon className="mr-2 h-4 w-4" />
|
||||||
|
)}
|
||||||
|
Copy
|
||||||
|
</Button>
|
||||||
|
)}
|
||||||
|
<Dialog>
|
||||||
|
<DialogTrigger asChild>
|
||||||
|
<Button className="hidden md:flex">Copy code</Button>
|
||||||
|
</DialogTrigger>
|
||||||
|
<DialogContent className="max-w-2xl outline-none">
|
||||||
|
<DialogHeader>
|
||||||
|
<DialogTitle>Theme</DialogTitle>
|
||||||
|
<DialogDescription>
|
||||||
|
Copy and paste the following code into your CSS file.
|
||||||
|
</DialogDescription>
|
||||||
|
</DialogHeader>
|
||||||
|
<ThemeWrapper defaultTheme="zinc" className="relative">
|
||||||
|
<CustomizerCode />
|
||||||
|
{activeTheme && (
|
||||||
|
<Button
|
||||||
|
size="sm"
|
||||||
|
onClick={() => {
|
||||||
|
copyToClipboardWithMeta(
|
||||||
|
getThemeCode(activeTheme, config.radius),
|
||||||
|
{
|
||||||
|
name: "copy_theme_code",
|
||||||
|
properties: {
|
||||||
|
theme: activeTheme.name,
|
||||||
|
radius: config.radius,
|
||||||
|
},
|
||||||
|
}
|
||||||
|
)
|
||||||
|
setHasCopied(true)
|
||||||
|
}}
|
||||||
|
className="absolute right-4 top-4 bg-muted text-muted-foreground hover:bg-muted hover:text-muted-foreground"
|
||||||
|
>
|
||||||
|
{hasCopied ? (
|
||||||
|
<CheckIcon className="mr-2 h-4 w-4" />
|
||||||
|
) : (
|
||||||
|
<CopyIcon className="mr-2 h-4 w-4" />
|
||||||
|
)}
|
||||||
|
Copy
|
||||||
|
</Button>
|
||||||
|
)}
|
||||||
|
</ThemeWrapper>
|
||||||
|
</DialogContent>
|
||||||
|
</Dialog>
|
||||||
|
</>
|
||||||
|
)
|
||||||
|
}
|
||||||
|
|
||||||
|
function CustomizerCode() {
|
||||||
|
const [config] = useConfig()
|
||||||
|
const activeTheme = themes.find((theme) => theme.name === config.theme)
|
||||||
|
|
||||||
|
return (
|
||||||
|
<ThemeWrapper defaultTheme="zinc" className="relative space-y-4">
|
||||||
|
<div data-rehype-pretty-code-fragment="">
|
||||||
|
<pre className="max-h-[450px] overflow-x-auto rounded-lg border bg-zinc-950 py-4 dark:bg-zinc-900">
|
||||||
|
<code className="relative rounded bg-muted px-[0.3rem] py-[0.2rem] font-mono text-sm">
|
||||||
|
<span className="line text-white">@layer base {</span>
|
||||||
|
<span className="line text-white"> :root {</span>
|
||||||
|
<span className="line text-white">
|
||||||
|
--background:{" "}
|
||||||
|
{activeTheme?.cssVars.light["background"]};
|
||||||
|
</span>
|
||||||
|
<span className="line text-white">
|
||||||
|
--foreground:{" "}
|
||||||
|
{activeTheme?.cssVars.light["foreground"]};
|
||||||
|
</span>
|
||||||
|
{[
|
||||||
|
"card",
|
||||||
|
"popover",
|
||||||
|
"primary",
|
||||||
|
"secondary",
|
||||||
|
"muted",
|
||||||
|
"accent",
|
||||||
|
"destructive",
|
||||||
|
].map((prefix) => (
|
||||||
|
<>
|
||||||
|
<span className="line text-white">
|
||||||
|
--{prefix}:{" "}
|
||||||
|
{
|
||||||
|
activeTheme?.cssVars.light[
|
||||||
|
prefix as keyof typeof activeTheme.cssVars.light
|
||||||
|
]
|
||||||
|
}
|
||||||
|
;
|
||||||
|
</span>
|
||||||
|
<span className="line text-white">
|
||||||
|
--{prefix}-foreground:{" "}
|
||||||
|
{
|
||||||
|
activeTheme?.cssVars.light[
|
||||||
|
`${prefix}-foreground` as keyof typeof activeTheme.cssVars.light
|
||||||
|
]
|
||||||
|
}
|
||||||
|
;
|
||||||
|
</span>
|
||||||
|
</>
|
||||||
|
))}
|
||||||
|
<span className="line text-white">
|
||||||
|
--border:{" "}
|
||||||
|
{activeTheme?.cssVars.light["border"]};
|
||||||
|
</span>
|
||||||
|
<span className="line text-white">
|
||||||
|
--input:{" "}
|
||||||
|
{activeTheme?.cssVars.light["input"]};
|
||||||
|
</span>
|
||||||
|
<span className="line text-white">
|
||||||
|
--ring:{" "}
|
||||||
|
{activeTheme?.cssVars.light["ring"]};
|
||||||
|
</span>
|
||||||
|
<span className="line text-white">
|
||||||
|
--radius: {config.radius}rem;
|
||||||
|
</span>
|
||||||
|
<span className="line text-white"> }</span>
|
||||||
|
<span className="line text-white"> </span>
|
||||||
|
<span className="line text-white"> .dark {</span>
|
||||||
|
<span className="line text-white">
|
||||||
|
--background:{" "}
|
||||||
|
{activeTheme?.cssVars.dark["background"]};
|
||||||
|
</span>
|
||||||
|
<span className="line text-white">
|
||||||
|
--foreground:{" "}
|
||||||
|
{activeTheme?.cssVars.dark["foreground"]};
|
||||||
|
</span>
|
||||||
|
{[
|
||||||
|
"card",
|
||||||
|
"popover",
|
||||||
|
"primary",
|
||||||
|
"secondary",
|
||||||
|
"muted",
|
||||||
|
"accent",
|
||||||
|
"destructive",
|
||||||
|
].map((prefix) => (
|
||||||
|
<>
|
||||||
|
<span className="line text-white">
|
||||||
|
--{prefix}:{" "}
|
||||||
|
{
|
||||||
|
activeTheme?.cssVars.dark[
|
||||||
|
prefix as keyof typeof activeTheme.cssVars.dark
|
||||||
|
]
|
||||||
|
}
|
||||||
|
;
|
||||||
|
</span>
|
||||||
|
<span className="line text-white">
|
||||||
|
--{prefix}-foreground:{" "}
|
||||||
|
{
|
||||||
|
activeTheme?.cssVars.dark[
|
||||||
|
`${prefix}-foreground` as keyof typeof activeTheme.cssVars.dark
|
||||||
|
]
|
||||||
|
}
|
||||||
|
;
|
||||||
|
</span>
|
||||||
|
</>
|
||||||
|
))}
|
||||||
|
<span className="line text-white">
|
||||||
|
--border:{" "}
|
||||||
|
{activeTheme?.cssVars.dark["border"]};
|
||||||
|
</span>
|
||||||
|
<span className="line text-white">
|
||||||
|
--input:{" "}
|
||||||
|
{activeTheme?.cssVars.dark["input"]};
|
||||||
|
</span>
|
||||||
|
<span className="line text-white">
|
||||||
|
--ring:{" "}
|
||||||
|
{activeTheme?.cssVars.dark["ring"]};
|
||||||
|
</span>
|
||||||
|
<span className="line text-white"> }</span>
|
||||||
|
<span className="line text-white">}</span>
|
||||||
|
</code>
|
||||||
|
</pre>
|
||||||
|
</div>
|
||||||
|
</ThemeWrapper>
|
||||||
|
)
|
||||||
|
}
|
||||||
|
|
||||||
|
function getThemeCode(theme: Theme, radius: number) {
|
||||||
|
if (!theme) {
|
||||||
|
return ""
|
||||||
|
}
|
||||||
|
|
||||||
|
return template(BASE_STYLES_WITH_VARIABLES)({
|
||||||
|
colors: theme.cssVars,
|
||||||
|
radius,
|
||||||
|
})
|
||||||
|
}
|
||||||
|
|
||||||
|
const BASE_STYLES_WITH_VARIABLES = `
|
||||||
|
@layer base {
|
||||||
|
:root {
|
||||||
|
--background: <%- colors.light["background"] %>;
|
||||||
|
--foreground: <%- colors.light["foreground"] %>;
|
||||||
|
--card: <%- colors.light["card"] %>;
|
||||||
|
--card-foreground: <%- colors.light["card-foreground"] %>;
|
||||||
|
--popover: <%- colors.light["popover"] %>;
|
||||||
|
--popover-foreground: <%- colors.light["popover-foreground"] %>;
|
||||||
|
--primary: <%- colors.light["primary"] %>;
|
||||||
|
--primary-foreground: <%- colors.light["primary-foreground"] %>;
|
||||||
|
--secondary: <%- colors.light["secondary"] %>;
|
||||||
|
--secondary-foreground: <%- colors.light["secondary-foreground"] %>;
|
||||||
|
--muted: <%- colors.light["muted"] %>;
|
||||||
|
--muted-foreground: <%- colors.light["muted-foreground"] %>;
|
||||||
|
--accent: <%- colors.light["accent"] %>;
|
||||||
|
--accent-foreground: <%- colors.light["accent-foreground"] %>;
|
||||||
|
--destructive: <%- colors.light["destructive"] %>;
|
||||||
|
--destructive-foreground: <%- colors.light["destructive-foreground"] %>;
|
||||||
|
--border: <%- colors.light["border"] %>;
|
||||||
|
--input: <%- colors.light["input"] %>;
|
||||||
|
--ring: <%- colors.light["ring"] %>;
|
||||||
|
--radius: <%- radius %>rem;
|
||||||
|
}
|
||||||
|
|
||||||
|
.dark {
|
||||||
|
--background: <%- colors.dark["background"] %>;
|
||||||
|
--foreground: <%- colors.dark["foreground"] %>;
|
||||||
|
--card: <%- colors.dark["card"] %>;
|
||||||
|
--card-foreground: <%- colors.dark["card-foreground"] %>;
|
||||||
|
--popover: <%- colors.dark["popover"] %>;
|
||||||
|
--popover-foreground: <%- colors.dark["popover-foreground"] %>;
|
||||||
|
--primary: <%- colors.dark["primary"] %>;
|
||||||
|
--primary-foreground: <%- colors.dark["primary-foreground"] %>;
|
||||||
|
--secondary: <%- colors.dark["secondary"] %>;
|
||||||
|
--secondary-foreground: <%- colors.dark["secondary-foreground"] %>;
|
||||||
|
--muted: <%- colors.dark["muted"] %>;
|
||||||
|
--muted-foreground: <%- colors.dark["muted-foreground"] %>;
|
||||||
|
--accent: <%- colors.dark["accent"] %>;
|
||||||
|
--accent-foreground: <%- colors.dark["accent-foreground"] %>;
|
||||||
|
--destructive: <%- colors.dark["destructive"] %>;
|
||||||
|
--destructive-foreground: <%- colors.dark["destructive-foreground"] %>;
|
||||||
|
--border: <%- colors.dark["border"] %>;
|
||||||
|
--input: <%- colors.dark["input"] %>;
|
||||||
|
--ring: <%- colors.dark["ring"] %>;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
`
|
||||||
26
apps/www/components/theme-switcher.tsx
Normal file
26
apps/www/components/theme-switcher.tsx
Normal file
@@ -0,0 +1,26 @@
|
|||||||
|
"use client"
|
||||||
|
|
||||||
|
import * as React from "react"
|
||||||
|
import { useSelectedLayoutSegment } from "next/navigation"
|
||||||
|
|
||||||
|
import { useConfig } from "@/hooks/use-config"
|
||||||
|
|
||||||
|
export function ThemeSwitcher() {
|
||||||
|
const [config] = useConfig()
|
||||||
|
const segment = useSelectedLayoutSegment()
|
||||||
|
|
||||||
|
React.useEffect(() => {
|
||||||
|
document.body.classList.forEach((className) => {
|
||||||
|
if (className.match(/^theme.*/)) {
|
||||||
|
document.body.classList.remove(className)
|
||||||
|
}
|
||||||
|
})
|
||||||
|
|
||||||
|
const theme = segment === "themes" ? config.theme : null
|
||||||
|
if (theme) {
|
||||||
|
return document.body.classList.add(`theme-${theme}`)
|
||||||
|
}
|
||||||
|
}, [segment, config])
|
||||||
|
|
||||||
|
return null
|
||||||
|
}
|
||||||
@@ -3,8 +3,31 @@
|
|||||||
import { cn } from "@/lib/utils"
|
import { cn } from "@/lib/utils"
|
||||||
import { useConfig } from "@/hooks/use-config"
|
import { useConfig } from "@/hooks/use-config"
|
||||||
|
|
||||||
export function ThemeWrapper({ children }: React.ComponentProps<"div">) {
|
interface ThemeWrapperProps extends React.ComponentProps<"div"> {
|
||||||
|
defaultTheme?: string
|
||||||
|
}
|
||||||
|
|
||||||
|
export function ThemeWrapper({
|
||||||
|
defaultTheme,
|
||||||
|
children,
|
||||||
|
className,
|
||||||
|
}: ThemeWrapperProps) {
|
||||||
const [config] = useConfig()
|
const [config] = useConfig()
|
||||||
|
|
||||||
return <div className={cn(`theme-${config.theme}`, "w-full")}>{children}</div>
|
return (
|
||||||
|
<div
|
||||||
|
className={cn(
|
||||||
|
`theme-${defaultTheme || config.theme}`,
|
||||||
|
"w-full",
|
||||||
|
className
|
||||||
|
)}
|
||||||
|
style={
|
||||||
|
{
|
||||||
|
"--radius": `${defaultTheme ? 0.5 : config.radius}rem`,
|
||||||
|
} as React.CSSProperties
|
||||||
|
}
|
||||||
|
>
|
||||||
|
{children}
|
||||||
|
</div>
|
||||||
|
)
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -15,6 +15,10 @@ export const docsConfig: DocsConfig = {
|
|||||||
title: "Components",
|
title: "Components",
|
||||||
href: "/docs/components/accordion",
|
href: "/docs/components/accordion",
|
||||||
},
|
},
|
||||||
|
{
|
||||||
|
title: "Themes",
|
||||||
|
href: "/themes",
|
||||||
|
},
|
||||||
{
|
{
|
||||||
title: "Examples",
|
title: "Examples",
|
||||||
href: "/examples",
|
href: "/examples",
|
||||||
@@ -48,6 +52,11 @@ export const docsConfig: DocsConfig = {
|
|||||||
href: "/docs/installation",
|
href: "/docs/installation",
|
||||||
items: [],
|
items: [],
|
||||||
},
|
},
|
||||||
|
{
|
||||||
|
title: "components.json",
|
||||||
|
href: "/docs/components-json",
|
||||||
|
items: [],
|
||||||
|
},
|
||||||
{
|
{
|
||||||
title: "Theming",
|
title: "Theming",
|
||||||
href: "/docs/theming",
|
href: "/docs/theming",
|
||||||
@@ -78,6 +87,11 @@ export const docsConfig: DocsConfig = {
|
|||||||
href: "/docs/changelog",
|
href: "/docs/changelog",
|
||||||
items: [],
|
items: [],
|
||||||
},
|
},
|
||||||
|
{
|
||||||
|
title: "About",
|
||||||
|
href: "/docs/about",
|
||||||
|
items: [],
|
||||||
|
},
|
||||||
],
|
],
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
@@ -98,6 +112,21 @@ export const docsConfig: DocsConfig = {
|
|||||||
href: "/docs/installation/remix",
|
href: "/docs/installation/remix",
|
||||||
items: [],
|
items: [],
|
||||||
},
|
},
|
||||||
|
{
|
||||||
|
title: "Gatsby",
|
||||||
|
href: "/docs/installation/gatsby",
|
||||||
|
items: [],
|
||||||
|
},
|
||||||
|
{
|
||||||
|
title: "Astro",
|
||||||
|
href: "/docs/installation/astro",
|
||||||
|
items: [],
|
||||||
|
},
|
||||||
|
{
|
||||||
|
title: "Laravel",
|
||||||
|
href: "/docs/installation/laravel",
|
||||||
|
items: [],
|
||||||
|
},
|
||||||
{
|
{
|
||||||
title: "Manual",
|
title: "Manual",
|
||||||
href: "/docs/installation/manual",
|
href: "/docs/installation/manual",
|
||||||
@@ -105,6 +134,21 @@ export const docsConfig: DocsConfig = {
|
|||||||
},
|
},
|
||||||
],
|
],
|
||||||
},
|
},
|
||||||
|
{
|
||||||
|
title: "Dark Mode",
|
||||||
|
items: [
|
||||||
|
{
|
||||||
|
title: "Next.js",
|
||||||
|
href: "/docs/dark-mode/next",
|
||||||
|
items: [],
|
||||||
|
},
|
||||||
|
{
|
||||||
|
title: "Vite",
|
||||||
|
href: "/docs/dark-mode/vite",
|
||||||
|
items: [],
|
||||||
|
},
|
||||||
|
],
|
||||||
|
},
|
||||||
{
|
{
|
||||||
title: "Components",
|
title: "Components",
|
||||||
items: [
|
items: [
|
||||||
|
|||||||
@@ -6,7 +6,7 @@ export const siteConfig = {
|
|||||||
"Beautifully designed components built with Radix UI and Tailwind CSS.",
|
"Beautifully designed components built with Radix UI and Tailwind CSS.",
|
||||||
links: {
|
links: {
|
||||||
twitter: "https://twitter.com/shadcn",
|
twitter: "https://twitter.com/shadcn",
|
||||||
github: "https://github.com/shadcn/ui",
|
github: "https://github.com/shadcn-ui/ui",
|
||||||
},
|
},
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
20
apps/www/content/docs/about.mdx
Normal file
20
apps/www/content/docs/about.mdx
Normal file
@@ -0,0 +1,20 @@
|
|||||||
|
---
|
||||||
|
title: About
|
||||||
|
description: Powered by amazing open source projects.
|
||||||
|
---
|
||||||
|
|
||||||
|
## About
|
||||||
|
|
||||||
|
[ui.shadcn.com](https://ui.shadcn.com) is a project by [shadcn](https://shadcn.com).
|
||||||
|
|
||||||
|
## Credits
|
||||||
|
|
||||||
|
- [Radix UI](https://radix-ui.com) - For the primitives.
|
||||||
|
- [Vercel](https://vercel.com) - Where I host all my projects.
|
||||||
|
- [Shu Ding](https://shud.in) - The typography style is adapted from his work on Nextra.
|
||||||
|
- [Cal](https://cal.com) - Where I copied the styles for the first component: the `Button`.
|
||||||
|
- [cmdk](https://cmdk.paco.me) - For the `<Command />` component.
|
||||||
|
|
||||||
|
## License
|
||||||
|
|
||||||
|
MIT © [shadcn](https://shadcn.com)
|
||||||
@@ -4,6 +4,48 @@ description: Latest updates and announcements.
|
|||||||
toc: false
|
toc: false
|
||||||
---
|
---
|
||||||
|
|
||||||
|
## July 2023 - JavaScript
|
||||||
|
|
||||||
|
This project and the components are written in TypeScript. **We recommend using TypeScript for your project as well**.
|
||||||
|
|
||||||
|
However we provide a JavaScript version of the components, available via the [cli](/docs/cli).
|
||||||
|
|
||||||
|
```txt
|
||||||
|
Would you like to use TypeScript (recommended)? no
|
||||||
|
```
|
||||||
|
|
||||||
|
To opt-out of TypeScript, you can use the `tsx` flag in your `components.json` file.
|
||||||
|
|
||||||
|
```json {10} title="components.json"
|
||||||
|
{
|
||||||
|
"style": "default",
|
||||||
|
"tailwind": {
|
||||||
|
"config": "tailwind.config.js",
|
||||||
|
"css": "src/app/globals.css",
|
||||||
|
"baseColor": "zinc",
|
||||||
|
"cssVariables": true
|
||||||
|
},
|
||||||
|
"rsc": false,
|
||||||
|
"tsx": false,
|
||||||
|
"aliases": {
|
||||||
|
"utils": "~/lib/utils",
|
||||||
|
"components": "~/components"
|
||||||
|
}
|
||||||
|
}
|
||||||
|
```
|
||||||
|
|
||||||
|
To configure import aliases, you can use the following `jsconfig.json`:
|
||||||
|
|
||||||
|
```json {4} title="jsconfig.json"
|
||||||
|
{
|
||||||
|
"compilerOptions": {
|
||||||
|
"paths": {
|
||||||
|
"@/*": ["./*"]
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
```
|
||||||
|
|
||||||
## June 2023 - New CLI, Styles and more
|
## June 2023 - New CLI, Styles and more
|
||||||
|
|
||||||
I have a lot of updates to share with you today:
|
I have a lot of updates to share with you today:
|
||||||
|
|||||||
@@ -16,6 +16,7 @@ npx shadcn-ui@latest init
|
|||||||
You will be asked a few questions to configure `components.json`:
|
You will be asked a few questions to configure `components.json`:
|
||||||
|
|
||||||
```txt showLineNumbers
|
```txt showLineNumbers
|
||||||
|
Would you like to use TypeScript (recommended)? no/yes
|
||||||
Which style would you like to use? › Default
|
Which style would you like to use? › Default
|
||||||
Which color would you like to use as base color? › Slate
|
Which color would you like to use as base color? › Slate
|
||||||
Where is your global CSS file? › › app/globals.css
|
Where is your global CSS file? › › app/globals.css
|
||||||
@@ -50,7 +51,8 @@ npx shadcn-ui@latest add [component]
|
|||||||
You will be presented with a list of components to choose from:
|
You will be presented with a list of components to choose from:
|
||||||
|
|
||||||
```txt
|
```txt
|
||||||
Which components would you like to add? › Space to select. Return to submit.
|
Which components would you like to add? › Space to select. A to toggle all.
|
||||||
|
Enter to submit.
|
||||||
|
|
||||||
◯ accordion
|
◯ accordion
|
||||||
◯ alert
|
◯ alert
|
||||||
|
|||||||
163
apps/www/content/docs/components-json.mdx
Normal file
163
apps/www/content/docs/components-json.mdx
Normal file
@@ -0,0 +1,163 @@
|
|||||||
|
---
|
||||||
|
title: components.json
|
||||||
|
description: Configuration for your project.
|
||||||
|
---
|
||||||
|
|
||||||
|
The `components.json` file holds configuration for your project.
|
||||||
|
|
||||||
|
We use it to understand how your project is set up and how to generate components customized for your project.
|
||||||
|
|
||||||
|
<Callout className="mt-6">
|
||||||
|
Note: The `components.json` file is optional and **only required if you're
|
||||||
|
using the CLI** to add components to your project. If you're using the copy
|
||||||
|
and paste method, you don't need this file.
|
||||||
|
</Callout>
|
||||||
|
|
||||||
|
You can create a `components.json` file in your project by running the following command:
|
||||||
|
|
||||||
|
```bash
|
||||||
|
npx shadcn-ui@latest init
|
||||||
|
```
|
||||||
|
|
||||||
|
See the <Link href="/docs/cli">CLI section</Link> for more information.
|
||||||
|
|
||||||
|
## $schema
|
||||||
|
|
||||||
|
You can see the JSON Schema for `components.json` [here](https://ui.shadcn.com/schema.json).
|
||||||
|
|
||||||
|
```json title="components.json"
|
||||||
|
{
|
||||||
|
"$schema": "https://ui.shadcn.com/schema.json"
|
||||||
|
}
|
||||||
|
```
|
||||||
|
|
||||||
|
## style
|
||||||
|
|
||||||
|
The style for your components. **This cannot be changed after initialization.**
|
||||||
|
|
||||||
|
```json title="components.json"
|
||||||
|
{
|
||||||
|
"style": "default" | "new-york"
|
||||||
|
}
|
||||||
|
```
|
||||||
|
|
||||||
|
<ComponentPreview name="card-with-form" />
|
||||||
|
|
||||||
|
## tailwind
|
||||||
|
|
||||||
|
Configuration to help the CLI understand how Tailwind CSS is set up in your project.
|
||||||
|
|
||||||
|
See the <Link href="/docs/installation">installation section</Link> for how to set up Tailwind CSS.
|
||||||
|
|
||||||
|
### tailwind.config
|
||||||
|
|
||||||
|
Path to where your `tailwind.config.js` file is located.
|
||||||
|
|
||||||
|
```json title="components.json"
|
||||||
|
{
|
||||||
|
"tailwind": {
|
||||||
|
"config": "tailwind.config.js" | "tailwind.config.ts"
|
||||||
|
}
|
||||||
|
}
|
||||||
|
```
|
||||||
|
|
||||||
|
### tailwind.css
|
||||||
|
|
||||||
|
Path to the CSS file that imports Tailwind CSS into your project.
|
||||||
|
|
||||||
|
```json title="components.json"
|
||||||
|
{
|
||||||
|
"tailwind": {
|
||||||
|
"css": "styles/global.css"
|
||||||
|
}
|
||||||
|
}
|
||||||
|
```
|
||||||
|
|
||||||
|
### tailwind.baseColor
|
||||||
|
|
||||||
|
This is used to generate the default color palette for your components. **This cannot be changed after initialization.**
|
||||||
|
|
||||||
|
```json title="components.json"
|
||||||
|
{
|
||||||
|
"tailwind": {
|
||||||
|
"baseColor": "gray" | "neutral" | "slate" | "stone" | "zinc"
|
||||||
|
}
|
||||||
|
}
|
||||||
|
```
|
||||||
|
|
||||||
|
### tailwind.cssVariables
|
||||||
|
|
||||||
|
You can choose between using CSS variables or Tailwind CSS utility classes for theming.
|
||||||
|
|
||||||
|
To use utility classes for theming set `tailwind.cssVariables` to `false`. For CSS variables, set `tailwind.cssVariables` to `true`.
|
||||||
|
|
||||||
|
```json title="components.json"
|
||||||
|
{
|
||||||
|
"tailwind": {
|
||||||
|
"cssVariables": `true` | `false`
|
||||||
|
}
|
||||||
|
}
|
||||||
|
```
|
||||||
|
|
||||||
|
For more information, see the <Link href="/docs/theming">theming docs</Link>.
|
||||||
|
|
||||||
|
**This cannot be changed after initialization.** To switch between CSS variables and utility classes, you'll have to delete and re-install your components.
|
||||||
|
|
||||||
|
## rsc
|
||||||
|
|
||||||
|
Whether or not to enable support for React Server Components.
|
||||||
|
|
||||||
|
The CLI automatically adds a `use client` directive to client components when set to `true`.
|
||||||
|
|
||||||
|
```json title="components.json"
|
||||||
|
{
|
||||||
|
"rsc": `true` | `false`
|
||||||
|
}
|
||||||
|
```
|
||||||
|
|
||||||
|
## tsx
|
||||||
|
|
||||||
|
Choose between TypeScript or JavaScript components.
|
||||||
|
|
||||||
|
Setting this option to `false` allows components to be added as JavaScript with the `.jsx` file extension.
|
||||||
|
|
||||||
|
```json title="components.json"
|
||||||
|
{
|
||||||
|
"tsx": `true` | `false`
|
||||||
|
}
|
||||||
|
```
|
||||||
|
|
||||||
|
## aliases
|
||||||
|
|
||||||
|
The CLI uses these values and the `paths` config from your `tsconfig.json` or `jsconfig.json` file to place generated components in the correct location.
|
||||||
|
|
||||||
|
Path aliases have to be set up in your `tsconfig.json` or `jsconfig.json` file.
|
||||||
|
|
||||||
|
<Callout className="mt-6">
|
||||||
|
**Important:** If you're using the `src` directory, make sure it is included
|
||||||
|
under `paths` in your `tsconfig.json` or `jsconfig.json` file.
|
||||||
|
</Callout>
|
||||||
|
|
||||||
|
### aliases.utils
|
||||||
|
|
||||||
|
Import alias for your utility functions.
|
||||||
|
|
||||||
|
```json title="components.json"
|
||||||
|
{
|
||||||
|
"aliases": {
|
||||||
|
"utils": "@/lib/utils"
|
||||||
|
}
|
||||||
|
}
|
||||||
|
```
|
||||||
|
|
||||||
|
### aliases.components
|
||||||
|
|
||||||
|
Import alias for your components.
|
||||||
|
|
||||||
|
```json title="components.json"
|
||||||
|
{
|
||||||
|
"aliases": {
|
||||||
|
"components": "@/components"
|
||||||
|
}
|
||||||
|
}
|
||||||
|
```
|
||||||
@@ -67,6 +67,12 @@ module.exports = {
|
|||||||
|
|
||||||
<Steps>
|
<Steps>
|
||||||
|
|
||||||
|
<Step>Install the following dependencies:</Step>
|
||||||
|
|
||||||
|
```bash
|
||||||
|
npm install @radix-ui/react-accordion
|
||||||
|
```
|
||||||
|
|
||||||
<Step>Copy and paste the following code into your project.</Step>
|
<Step>Copy and paste the following code into your project.</Step>
|
||||||
|
|
||||||
<ComponentSource name="accordion" />
|
<ComponentSource name="accordion" />
|
||||||
|
|||||||
@@ -30,6 +30,12 @@ npx shadcn-ui@latest add alert-dialog
|
|||||||
|
|
||||||
<Steps>
|
<Steps>
|
||||||
|
|
||||||
|
<Step>Install the following dependencies:</Step>
|
||||||
|
|
||||||
|
```bash
|
||||||
|
npm install @radix-ui/react-alert-dialog
|
||||||
|
```
|
||||||
|
|
||||||
<Step>Copy and paste the following code into your project.</Step>
|
<Step>Copy and paste the following code into your project.</Step>
|
||||||
|
|
||||||
<ComponentSource name="alert-dialog" />
|
<ComponentSource name="alert-dialog" />
|
||||||
|
|||||||
@@ -29,6 +29,12 @@ npx shadcn-ui@latest add aspect-ratio
|
|||||||
|
|
||||||
<Steps>
|
<Steps>
|
||||||
|
|
||||||
|
<Step>Install the following dependencies:</Step>
|
||||||
|
|
||||||
|
```bash
|
||||||
|
npm install @radix-ui/react-aspect-ratio
|
||||||
|
```
|
||||||
|
|
||||||
<Step>Copy and paste the following code into your project.</Step>
|
<Step>Copy and paste the following code into your project.</Step>
|
||||||
|
|
||||||
<ComponentSource name="aspect-ratio" />
|
<ComponentSource name="aspect-ratio" />
|
||||||
@@ -52,11 +58,7 @@ import { AspectRatio } from "@/components/ui/aspect-ratio"
|
|||||||
```tsx
|
```tsx
|
||||||
<div className="w-[450px]">
|
<div className="w-[450px]">
|
||||||
<AspectRatio ratio={16 / 9}>
|
<AspectRatio ratio={16 / 9}>
|
||||||
<Image
|
<Image src="..." alt="Image" className="rounded-md object-cover" />
|
||||||
src="..."
|
|
||||||
alt=Image""
|
|
||||||
className="rounded-md object-cover"
|
|
||||||
/>
|
|
||||||
</AspectRatio>
|
</AspectRatio>
|
||||||
</div>
|
</div>
|
||||||
```
|
```
|
||||||
|
|||||||
@@ -29,6 +29,12 @@ npx shadcn-ui@latest add avatar
|
|||||||
|
|
||||||
<Steps>
|
<Steps>
|
||||||
|
|
||||||
|
<Step>Install the following dependencies:</Step>
|
||||||
|
|
||||||
|
```bash
|
||||||
|
npm install @radix-ui/react-avatar
|
||||||
|
```
|
||||||
|
|
||||||
<Step>Copy and paste the following code into your project.</Step>
|
<Step>Copy and paste the following code into your project.</Step>
|
||||||
|
|
||||||
<ComponentSource name="avatar" />
|
<ComponentSource name="avatar" />
|
||||||
|
|||||||
@@ -27,6 +27,12 @@ npx shadcn-ui@latest add button
|
|||||||
|
|
||||||
<Steps>
|
<Steps>
|
||||||
|
|
||||||
|
<Step>Install the following dependencies:</Step>
|
||||||
|
|
||||||
|
```bash
|
||||||
|
npm install @radix-ui/react-slot
|
||||||
|
```
|
||||||
|
|
||||||
<Step>Copy and paste the following code into your project.</Step>
|
<Step>Copy and paste the following code into your project.</Step>
|
||||||
|
|
||||||
<ComponentSource name="button" />
|
<ComponentSource name="button" />
|
||||||
|
|||||||
@@ -30,6 +30,16 @@ npx shadcn-ui@latest add calendar
|
|||||||
|
|
||||||
<Steps>
|
<Steps>
|
||||||
|
|
||||||
|
<Step>Install the following dependencies:</Step>
|
||||||
|
|
||||||
|
```bash
|
||||||
|
npm install react-day-picker date-fns
|
||||||
|
```
|
||||||
|
|
||||||
|
<Step>Add the `Button` component to your project.</Step>
|
||||||
|
|
||||||
|
The `Calendar` component uses the `Button` component. Make sure you have it installed in your project.
|
||||||
|
|
||||||
<Step>Copy and paste the following code into your project.</Step>
|
<Step>Copy and paste the following code into your project.</Step>
|
||||||
|
|
||||||
<ComponentSource name="calendar" />
|
<ComponentSource name="calendar" />
|
||||||
|
|||||||
@@ -29,6 +29,12 @@ npx shadcn-ui@latest add checkbox
|
|||||||
|
|
||||||
<Steps>
|
<Steps>
|
||||||
|
|
||||||
|
<Step>Install the following dependencies:</Step>
|
||||||
|
|
||||||
|
```bash
|
||||||
|
npm install @radix-ui/react-checkbox
|
||||||
|
```
|
||||||
|
|
||||||
<Step>Copy and paste the following code into your project.</Step>
|
<Step>Copy and paste the following code into your project.</Step>
|
||||||
|
|
||||||
<ComponentSource name="checkbox" />
|
<ComponentSource name="checkbox" />
|
||||||
|
|||||||
@@ -30,6 +30,12 @@ npx shadcn-ui@latest add collapsible
|
|||||||
|
|
||||||
<Steps>
|
<Steps>
|
||||||
|
|
||||||
|
<Step>Install the following dependencies:</Step>
|
||||||
|
|
||||||
|
```bash
|
||||||
|
npm install @radix-ui/react-collapsible
|
||||||
|
```
|
||||||
|
|
||||||
<Step>Copy and paste the following code into your project.</Step>
|
<Step>Copy and paste the following code into your project.</Step>
|
||||||
|
|
||||||
<ComponentSource name="collapsible" />
|
<ComponentSource name="collapsible" />
|
||||||
|
|||||||
@@ -34,6 +34,12 @@ npx shadcn-ui@latest add command
|
|||||||
|
|
||||||
<Steps>
|
<Steps>
|
||||||
|
|
||||||
|
<Step>Install the following dependencies:</Step>
|
||||||
|
|
||||||
|
```bash
|
||||||
|
npm install cmdk
|
||||||
|
```
|
||||||
|
|
||||||
<Step>Copy and paste the following code into your project.</Step>
|
<Step>Copy and paste the following code into your project.</Step>
|
||||||
|
|
||||||
<ComponentSource name="command" />
|
<ComponentSource name="command" />
|
||||||
@@ -50,6 +56,7 @@ npx shadcn-ui@latest add command
|
|||||||
|
|
||||||
```tsx
|
```tsx
|
||||||
import {
|
import {
|
||||||
|
Command,
|
||||||
CommandDialog,
|
CommandDialog,
|
||||||
CommandEmpty,
|
CommandEmpty,
|
||||||
CommandGroup,
|
CommandGroup,
|
||||||
@@ -95,7 +102,8 @@ export function CommandMenu() {
|
|||||||
|
|
||||||
React.useEffect(() => {
|
React.useEffect(() => {
|
||||||
const down = (e: KeyboardEvent) => {
|
const down = (e: KeyboardEvent) => {
|
||||||
if (e.key === "k" && e.metaKey) {
|
if (e.key === "k" && (e.metaKey || e.ctrlKey)) {
|
||||||
|
e.preventDefault()
|
||||||
setOpen((open) => !open)
|
setOpen((open) => !open)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -29,6 +29,12 @@ npx shadcn-ui@latest add context-menu
|
|||||||
|
|
||||||
<Steps>
|
<Steps>
|
||||||
|
|
||||||
|
<Step>Install the following dependencies:</Step>
|
||||||
|
|
||||||
|
```bash
|
||||||
|
npm install @radix-ui/react-context-menu
|
||||||
|
```
|
||||||
|
|
||||||
<Step>Copy and paste the following code into your project.</Step>
|
<Step>Copy and paste the following code into your project.</Step>
|
||||||
|
|
||||||
<ComponentSource name="context-menu" />
|
<ComponentSource name="context-menu" />
|
||||||
|
|||||||
@@ -30,6 +30,12 @@ npx shadcn-ui@latest add dialog
|
|||||||
|
|
||||||
<Steps>
|
<Steps>
|
||||||
|
|
||||||
|
<Step>Install the following dependencies:</Step>
|
||||||
|
|
||||||
|
```bash
|
||||||
|
npm install @radix-ui/react-dialog
|
||||||
|
```
|
||||||
|
|
||||||
<Step>Copy and paste the following code into your project.</Step>
|
<Step>Copy and paste the following code into your project.</Step>
|
||||||
|
|
||||||
<ComponentSource name="dialog" />
|
<ComponentSource name="dialog" />
|
||||||
|
|||||||
@@ -30,6 +30,12 @@ npx shadcn-ui@latest add dropdown-menu
|
|||||||
|
|
||||||
<Steps>
|
<Steps>
|
||||||
|
|
||||||
|
<Step>Install the following dependencies:</Step>
|
||||||
|
|
||||||
|
```bash
|
||||||
|
npm install @radix-ui/react-dropdown-menu
|
||||||
|
```
|
||||||
|
|
||||||
<Step>Copy and paste the following code into your project.</Step>
|
<Step>Copy and paste the following code into your project.</Step>
|
||||||
|
|
||||||
<ComponentSource name="dropdown-menu" />
|
<ComponentSource name="dropdown-menu" />
|
||||||
|
|||||||
@@ -73,6 +73,14 @@ const form = useForm()
|
|||||||
|
|
||||||
## Installation
|
## Installation
|
||||||
|
|
||||||
|
<Tabs defaultValue="cli">
|
||||||
|
|
||||||
|
<TabsList>
|
||||||
|
<TabsTrigger value="cli">CLI</TabsTrigger>
|
||||||
|
<TabsTrigger value="manual">Manual</TabsTrigger>
|
||||||
|
</TabsList>
|
||||||
|
<TabsContent value="cli">
|
||||||
|
|
||||||
<Steps>
|
<Steps>
|
||||||
|
|
||||||
### Command
|
### Command
|
||||||
@@ -83,6 +91,30 @@ npx shadcn-ui@latest add form
|
|||||||
|
|
||||||
</Steps>
|
</Steps>
|
||||||
|
|
||||||
|
</TabsContent>
|
||||||
|
|
||||||
|
<TabsContent value="manual">
|
||||||
|
|
||||||
|
<Steps>
|
||||||
|
|
||||||
|
<Step>Install the following dependencies:</Step>
|
||||||
|
|
||||||
|
```bash
|
||||||
|
npm install @radix-ui/react-label @radix-ui/react-slot react-hook-form @hookform/resolvers zod
|
||||||
|
```
|
||||||
|
|
||||||
|
<Step>Copy and paste the following code into your project.</Step>
|
||||||
|
|
||||||
|
<ComponentSource name="form" />
|
||||||
|
|
||||||
|
<Step>Update the import paths to match your project setup.</Step>
|
||||||
|
|
||||||
|
</Steps>
|
||||||
|
|
||||||
|
</TabsContent>
|
||||||
|
|
||||||
|
</Tabs>
|
||||||
|
|
||||||
## Usage
|
## Usage
|
||||||
|
|
||||||
<Steps>
|
<Steps>
|
||||||
@@ -94,7 +126,6 @@ Define the shape of your form using a Zod schema. You can read more about using
|
|||||||
```tsx showLineNumbers {4,6-8}
|
```tsx showLineNumbers {4,6-8}
|
||||||
"use client"
|
"use client"
|
||||||
|
|
||||||
import Link from "next/link"
|
|
||||||
import * as z from "zod"
|
import * as z from "zod"
|
||||||
|
|
||||||
const formSchema = z.object({
|
const formSchema = z.object({
|
||||||
@@ -109,7 +140,6 @@ Use the `useForm` hook from `react-hook-form` to create a form.
|
|||||||
```tsx showLineNumbers {4,14-20,22-27}
|
```tsx showLineNumbers {4,14-20,22-27}
|
||||||
"use client"
|
"use client"
|
||||||
|
|
||||||
import Link from "next/link"
|
|
||||||
import { zodResolver } from "@hookform/resolvers/zod"
|
import { zodResolver } from "@hookform/resolvers/zod"
|
||||||
import * as z from "zod"
|
import * as z from "zod"
|
||||||
|
|
||||||
@@ -146,7 +176,6 @@ We can now use the `<Form />` components to build our form.
|
|||||||
```tsx showLineNumbers {7-17,28-50}
|
```tsx showLineNumbers {7-17,28-50}
|
||||||
"use client"
|
"use client"
|
||||||
|
|
||||||
import Link from "next/link"
|
|
||||||
import { zodResolver } from "@hookform/resolvers/zod"
|
import { zodResolver } from "@hookform/resolvers/zod"
|
||||||
import * as z from "zod"
|
import * as z from "zod"
|
||||||
|
|
||||||
|
|||||||
@@ -27,6 +27,12 @@ npx shadcn-ui@latest add hover-card
|
|||||||
|
|
||||||
<TabsContent value="manual">
|
<TabsContent value="manual">
|
||||||
|
|
||||||
|
<Step>Install the following dependencies:</Step>
|
||||||
|
|
||||||
|
```bash
|
||||||
|
npm install @radix-ui/react-hover-card
|
||||||
|
```
|
||||||
|
|
||||||
<Steps>
|
<Steps>
|
||||||
|
|
||||||
<Step>Copy and paste the following code into your project.</Step>
|
<Step>Copy and paste the following code into your project.</Step>
|
||||||
|
|||||||
@@ -29,6 +29,12 @@ npx shadcn-ui@latest add label
|
|||||||
|
|
||||||
<Steps>
|
<Steps>
|
||||||
|
|
||||||
|
<Step>Install the following dependencies:</Step>
|
||||||
|
|
||||||
|
```bash
|
||||||
|
npm install @radix-ui/react-label
|
||||||
|
```
|
||||||
|
|
||||||
<Step>Copy and paste the following code into your project.</Step>
|
<Step>Copy and paste the following code into your project.</Step>
|
||||||
|
|
||||||
<ComponentSource name="label" />
|
<ComponentSource name="label" />
|
||||||
|
|||||||
@@ -29,6 +29,12 @@ npx shadcn-ui@latest add menubar
|
|||||||
|
|
||||||
<Steps>
|
<Steps>
|
||||||
|
|
||||||
|
<Step>Install the following dependencies:</Step>
|
||||||
|
|
||||||
|
```bash
|
||||||
|
npm install @radix-ui/react-menubar
|
||||||
|
```
|
||||||
|
|
||||||
<Step>Copy and paste the following code into your project.</Step>
|
<Step>Copy and paste the following code into your project.</Step>
|
||||||
|
|
||||||
<ComponentSource name="menubar" />
|
<ComponentSource name="menubar" />
|
||||||
|
|||||||
@@ -29,6 +29,12 @@ npx shadcn-ui@latest add navigation-menu
|
|||||||
|
|
||||||
<Steps>
|
<Steps>
|
||||||
|
|
||||||
|
<Step>Install the following dependencies:</Step>
|
||||||
|
|
||||||
|
```bash
|
||||||
|
npm install @radix-ui/react-navigation-menu
|
||||||
|
```
|
||||||
|
|
||||||
<Step>Copy and paste the following code into your project.</Step>
|
<Step>Copy and paste the following code into your project.</Step>
|
||||||
|
|
||||||
<ComponentSource name="navigation-menu" />
|
<ComponentSource name="navigation-menu" />
|
||||||
|
|||||||
@@ -29,6 +29,12 @@ npx shadcn-ui@latest add popover
|
|||||||
|
|
||||||
<Steps>
|
<Steps>
|
||||||
|
|
||||||
|
<Step>Install the following dependencies:</Step>
|
||||||
|
|
||||||
|
```bash
|
||||||
|
npm install @radix-ui/react-popover
|
||||||
|
```
|
||||||
|
|
||||||
<Step>Copy and paste the following code into your project.</Step>
|
<Step>Copy and paste the following code into your project.</Step>
|
||||||
|
|
||||||
<ComponentSource name="popover" />
|
<ComponentSource name="popover" />
|
||||||
|
|||||||
@@ -29,6 +29,12 @@ npx shadcn-ui@latest add progress
|
|||||||
|
|
||||||
<Steps>
|
<Steps>
|
||||||
|
|
||||||
|
<Step>Install the following dependencies:</Step>
|
||||||
|
|
||||||
|
```bash
|
||||||
|
npm install @radix-ui/react-progress
|
||||||
|
```
|
||||||
|
|
||||||
<Step>Copy and paste the following code into your project.</Step>
|
<Step>Copy and paste the following code into your project.</Step>
|
||||||
|
|
||||||
<ComponentSource name="progress" />
|
<ComponentSource name="progress" />
|
||||||
|
|||||||
@@ -29,6 +29,12 @@ npx shadcn-ui@latest add radio-group
|
|||||||
|
|
||||||
<Steps>
|
<Steps>
|
||||||
|
|
||||||
|
<Step>Install the following dependencies:</Step>
|
||||||
|
|
||||||
|
```bash
|
||||||
|
npm install @radix-ui/react-radio-group
|
||||||
|
```
|
||||||
|
|
||||||
<Step>Copy and paste the following code into your project.</Step>
|
<Step>Copy and paste the following code into your project.</Step>
|
||||||
|
|
||||||
<ComponentSource name="radio-group" />
|
<ComponentSource name="radio-group" />
|
||||||
|
|||||||
@@ -29,6 +29,12 @@ npx shadcn-ui@latest add scroll-area
|
|||||||
|
|
||||||
<Steps>
|
<Steps>
|
||||||
|
|
||||||
|
<Step>Install the following dependencies:</Step>
|
||||||
|
|
||||||
|
```bash
|
||||||
|
npm install @radix-ui/react-scroll-area
|
||||||
|
```
|
||||||
|
|
||||||
<Step>Copy and paste the following code into your project.</Step>
|
<Step>Copy and paste the following code into your project.</Step>
|
||||||
|
|
||||||
<ComponentSource name="scroll-area" />
|
<ComponentSource name="scroll-area" />
|
||||||
|
|||||||
@@ -30,6 +30,12 @@ npx shadcn-ui@latest add select
|
|||||||
|
|
||||||
<Steps>
|
<Steps>
|
||||||
|
|
||||||
|
<Step>Install the following dependencies:</Step>
|
||||||
|
|
||||||
|
```bash
|
||||||
|
npm install @radix-ui/react-select
|
||||||
|
```
|
||||||
|
|
||||||
<Step>Copy and paste the following code into your project.</Step>
|
<Step>Copy and paste the following code into your project.</Step>
|
||||||
|
|
||||||
<ComponentSource name="select" />
|
<ComponentSource name="select" />
|
||||||
|
|||||||
@@ -28,6 +28,11 @@ npx shadcn-ui@latest add separator
|
|||||||
<TabsContent value="manual">
|
<TabsContent value="manual">
|
||||||
|
|
||||||
<Steps>
|
<Steps>
|
||||||
|
<Step>Install the following dependencies:</Step>
|
||||||
|
|
||||||
|
```bash
|
||||||
|
npm install @radix-ui/react-separator
|
||||||
|
```
|
||||||
|
|
||||||
<Step>Copy and paste the following code into your project.</Step>
|
<Step>Copy and paste the following code into your project.</Step>
|
||||||
|
|
||||||
|
|||||||
@@ -29,6 +29,12 @@ npx shadcn-ui@latest add sheet
|
|||||||
|
|
||||||
<Steps>
|
<Steps>
|
||||||
|
|
||||||
|
<Step>Install the following dependencies:</Step>
|
||||||
|
|
||||||
|
```bash
|
||||||
|
npm install @radix-ui/react-dialog
|
||||||
|
```
|
||||||
|
|
||||||
<Step>Copy and paste the following code into your project.</Step>
|
<Step>Copy and paste the following code into your project.</Step>
|
||||||
|
|
||||||
<ComponentSource name="sheet" />
|
<ComponentSource name="sheet" />
|
||||||
|
|||||||
@@ -29,6 +29,12 @@ npx shadcn-ui@latest add slider
|
|||||||
|
|
||||||
<Steps>
|
<Steps>
|
||||||
|
|
||||||
|
<Step>Install the following dependencies:</Step>
|
||||||
|
|
||||||
|
```bash
|
||||||
|
npm install @radix-ui/react-slider
|
||||||
|
```
|
||||||
|
|
||||||
<Step>Copy and paste the following code into your project.</Step>
|
<Step>Copy and paste the following code into your project.</Step>
|
||||||
|
|
||||||
<ComponentSource name="slider" />
|
<ComponentSource name="slider" />
|
||||||
|
|||||||
@@ -29,6 +29,12 @@ npx shadcn-ui@latest add switch
|
|||||||
|
|
||||||
<Steps>
|
<Steps>
|
||||||
|
|
||||||
|
<Step>Install the following dependencies:</Step>
|
||||||
|
|
||||||
|
```bash
|
||||||
|
npm install @radix-ui/react-switch
|
||||||
|
```
|
||||||
|
|
||||||
<Step>Copy and paste the following code into your project.</Step>
|
<Step>Copy and paste the following code into your project.</Step>
|
||||||
|
|
||||||
<ComponentSource name="switch" />
|
<ComponentSource name="switch" />
|
||||||
|
|||||||
@@ -29,6 +29,12 @@ npx shadcn-ui@latest add tabs
|
|||||||
|
|
||||||
<Steps>
|
<Steps>
|
||||||
|
|
||||||
|
<Step>Install the following dependencies:</Step>
|
||||||
|
|
||||||
|
```bash
|
||||||
|
npm install @radix-ui/react-tabs
|
||||||
|
```
|
||||||
|
|
||||||
<Step>Copy and paste the following code into your project.</Step>
|
<Step>Copy and paste the following code into your project.</Step>
|
||||||
|
|
||||||
<ComponentSource name="tabs" />
|
<ComponentSource name="tabs" />
|
||||||
|
|||||||
@@ -53,10 +53,26 @@ export default function RootLayout({ children }) {
|
|||||||
|
|
||||||
<Steps>
|
<Steps>
|
||||||
|
|
||||||
|
<Step>Install the following dependencies:</Step>
|
||||||
|
|
||||||
|
```bash
|
||||||
|
npm install @radix-ui/react-toast
|
||||||
|
```
|
||||||
|
|
||||||
<Step>Copy and paste the following code into your project.</Step>
|
<Step>Copy and paste the following code into your project.</Step>
|
||||||
|
|
||||||
|
`toast.tsx`
|
||||||
|
|
||||||
<ComponentSource name="toast" />
|
<ComponentSource name="toast" />
|
||||||
|
|
||||||
|
`toaster.tsx`
|
||||||
|
|
||||||
|
<ComponentSource name="toast" fileName="toaster" />
|
||||||
|
|
||||||
|
`use-toast.tsx`
|
||||||
|
|
||||||
|
<ComponentSource name="toast" fileName="use-toast" />
|
||||||
|
|
||||||
<Step>Update the import paths to match your project setup.</Step>
|
<Step>Update the import paths to match your project setup.</Step>
|
||||||
|
|
||||||
<Step>Add the Toaster component</Step>
|
<Step>Add the Toaster component</Step>
|
||||||
|
|||||||
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user