├── .eslintrc.json ├── .gitignore ├── .vscode └── settings.json ├── CONTRIBUTING.md ├── LICENSE ├── README.md ├── app ├── favicon.ico ├── globals.css ├── layout.tsx └── page.tsx ├── components.json ├── components ├── card.tsx ├── header.tsx ├── icons.tsx ├── jumbotron.tsx ├── logo.tsx ├── provider.tsx └── ui │ ├── avatar.tsx │ ├── badge.tsx │ ├── button.tsx │ ├── card.tsx │ ├── context-menu.tsx │ ├── dialog.tsx │ ├── dropdown-menu.tsx │ ├── input.tsx │ ├── label.tsx │ ├── menubar.tsx │ ├── scroll-area.tsx │ ├── separator.tsx │ └── tabs.tsx ├── data └── projects.ts ├── lib ├── types.ts └── utils.ts ├── next.config.js ├── package-lock.json ├── package.json ├── postcss.config.js ├── public ├── 7-spirits.png ├── fonts │ ├── Inter-Black.ttf │ ├── Inter-Bold.ttf │ ├── Inter-ExtraBold.ttf │ ├── Inter-ExtraLight.ttf │ ├── Inter-Light.ttf │ ├── Inter-Medium.ttf │ ├── Inter-Regular.ttf │ ├── Inter-SemiBold.ttf │ └── Inter-Thin.ttf ├── logo.svg ├── next.svg ├── sample.png └── vercel.svg ├── tailwind.config.js └── tsconfig.json /.eslintrc.json: -------------------------------------------------------------------------------- 1 | { 2 | "extends": "next/core-web-vitals" 3 | } 4 | -------------------------------------------------------------------------------- /.gitignore: -------------------------------------------------------------------------------- 1 | # See https://help.github.com/articles/ignoring-files/ for more about ignoring files. 2 | 3 | # dependencies 4 | /node_modules 5 | /.pnp 6 | .pnp.js 7 | 8 | # testing 9 | /coverage 10 | 11 | # next.js 12 | /.next/ 13 | /out/ 14 | 15 | # production 16 | /build 17 | 18 | # misc 19 | .DS_Store 20 | *.pem 21 | 22 | # debug 23 | npm-debug.log* 24 | yarn-debug.log* 25 | yarn-error.log* 26 | 27 | # local env files 28 | .env*.local 29 | 30 | # vercel 31 | .vercel 32 | 33 | # typescript 34 | *.tsbuildinfo 35 | next-env.d.ts 36 | 37 | #amplify-do-not-edit-begin 38 | amplify/\#current-cloud-backend 39 | amplify/.config/local-* 40 | amplify/logs 41 | amplify/mock-data 42 | amplify/mock-api-resources 43 | amplify/backend/amplify-meta.json 44 | amplify/backend/.temp 45 | build/ 46 | dist/ 47 | node_modules/ 48 | aws-exports.js 49 | awsconfiguration.json 50 | amplifyconfiguration.json 51 | amplifyconfiguration.dart 52 | amplify-build-config.json 53 | amplify-gradle-config.json 54 | amplifytools.xcconfig 55 | .secret-* 56 | **.sample 57 | #amplify-do-not-edit-end 58 | -------------------------------------------------------------------------------- /.vscode/settings.json: -------------------------------------------------------------------------------- 1 | { 2 | "files.exclude": { 3 | "amplify/.config": true, 4 | "amplify/**/*-parameters.json": true, 5 | "amplify/**/amplify.state": true, 6 | "amplify/**/transform.conf.json": true, 7 | "amplify/#current-cloud-backend": true, 8 | "amplify/backend/amplify-meta.json": true, 9 | "amplify/backend/awscloudformation": true 10 | } 11 | } -------------------------------------------------------------------------------- /CONTRIBUTING.md: -------------------------------------------------------------------------------- 1 | # Contributing 2 | 3 | ## Adding your project 4 | 5 | 1. Fork this repository 6 | 2. Create your branch: `git checkout -b my-project-name` 7 | 3. Add your project to the list of projects in [projects.ts](./data/projects.ts) . Make sure you follow the format for the project type here in [types.ts](./lib/types.ts) 8 | 4. Commit your changes: `git commit -m 'Add my project'` 9 | 5. Push to the branch: `git push origin my-project-name` 10 | 11 | ## Normal contribution 12 | 13 | 1. Fork this repository 14 | 2. Create your branch: `git checkout -b my-new-feature` 15 | 3. Commit your changes: `git commit -m 'Add some feature'` 16 | 4. Push to the branch: `git push origin my-new-feature` 17 | -------------------------------------------------------------------------------- /LICENSE: -------------------------------------------------------------------------------- 1 | MIT License 2 | 3 | Copyright (c) 2023 Yeshua Messiah 4 | 5 | Permission is hereby granted, free of charge, to any person obtaining a copy 6 | of this software and associated documentation files (the "Software"), to deal 7 | in the Software without restriction, including without limitation the rights 8 | to use, copy, modify, merge, publish, distribute, sublicense, and/or sell 9 | copies of the Software, and to permit persons to whom the Software is 10 | furnished to do so, subject to the following conditions: 11 | 12 | The above copyright notice and this permission notice shall be included in all 13 | copies or substantial portions of the Software. 14 | 15 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 16 | IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 17 | FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 18 | AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 19 | LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, 20 | OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE 21 | SOFTWARE. 22 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # shadverse 2 | 3 | A collection of projects built with the awesome shadcn-ui component library 4 | 5 | ## How to add your project? 6 | 7 | Checkout [CONTRIBUTING.md](./CONTRIBUTING.md) to know more 8 | -------------------------------------------------------------------------------- /app/favicon.ico: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/lucky-chap/shadverse/bf04dff210e9ab56db6bdc9f670103fddb5bc686/app/favicon.ico -------------------------------------------------------------------------------- /app/globals.css: -------------------------------------------------------------------------------- 1 | @tailwind base; 2 | @tailwind components; 3 | @tailwind utilities; 4 | 5 | @layer base { 6 | :root { 7 | --background: 0 0% 100%; 8 | --foreground: 240 10% 3.9%; 9 | 10 | --muted: 240 4.8% 95.9%; 11 | --muted-foreground: 240 3.8% 46.1%; 12 | 13 | --popover: 0 0% 100%; 14 | --popover-foreground: 240 10% 3.9%; 15 | 16 | --card: 0 0% 100%; 17 | --card-foreground: 240 10% 3.9%; 18 | 19 | --border: 240 5.9% 90%; 20 | --input: 240 5.9% 90%; 21 | 22 | --primary: 240 5.9% 10%; 23 | --primary-foreground: 0 0% 98%; 24 | 25 | --secondary: 240 4.8% 95.9%; 26 | --secondary-foreground: 240 5.9% 10%; 27 | 28 | --accent: 240 4.8% 95.9%; 29 | --accent-foreground: 240 5.9% 10%; 30 | 31 | --destructive: 0 84.2% 60.2%; 32 | --destructive-foreground: 0 0% 98%; 33 | 34 | --ring: 240 5% 64.9%; 35 | 36 | --radius: 0.5rem; 37 | } 38 | 39 | .dark { 40 | --background: 240 10% 3.9%; 41 | --foreground: 0 0% 98%; 42 | 43 | --muted: 240 3.7% 15.9%; 44 | --muted-foreground: 240 5% 64.9%; 45 | 46 | --popover: 240 10% 3.9%; 47 | --popover-foreground: 0 0% 98%; 48 | 49 | --card: 240 10% 3.9%; 50 | --card-foreground: 0 0% 98%; 51 | 52 | --border: 240 3.7% 15.9%; 53 | --input: 240 3.7% 15.9%; 54 | 55 | --primary: 0 0% 98%; 56 | --primary-foreground: 240 5.9% 10%; 57 | 58 | --secondary: 240 3.7% 15.9%; 59 | --secondary-foreground: 0 0% 98%; 60 | 61 | --accent: 240 3.7% 15.9%; 62 | --accent-foreground: 0 0% 98%; 63 | 64 | --destructive: 0 62.8% 30.6%; 65 | --destructive-foreground: 0 85.7% 97.3%; 66 | 67 | --ring: 240 3.7% 15.9%; 68 | } 69 | } 70 | 71 | @layer base { 72 | * { 73 | @apply border-border; 74 | } 75 | 76 | body { 77 | @apply bg-background text-foreground; 78 | } 79 | } 80 | 81 | /* Custom Scrollbars */ 82 | ::-webkit-scrollbar { 83 | width: 10px; 84 | height: 6px; 85 | } 86 | 87 | ::-webkit-scrollbar-thumb { 88 | width: 6px; 89 | background: #0c0c0e; 90 | border-radius: 0px; 91 | } -------------------------------------------------------------------------------- /app/layout.tsx: -------------------------------------------------------------------------------- 1 | import { Provider } from "@/components/provider"; 2 | import "./globals.css"; 3 | import type { Metadata } from "next"; 4 | import localFont from "next/font/local"; 5 | import Header from "@/components/header"; 6 | 7 | const inter = localFont({ 8 | src: [ 9 | { 10 | path: "../public/fonts/Inter-Thin.ttf", 11 | weight: "100", 12 | style: "normal", 13 | }, 14 | { 15 | path: "../public/fonts/Inter-ExtraLight.ttf", 16 | weight: "200", 17 | style: "normal", 18 | }, 19 | { 20 | path: "../public/fonts/Inter-Light.ttf", 21 | weight: "300", 22 | style: "normal", 23 | }, 24 | { 25 | path: "../public/fonts/Inter-Regular.ttf", 26 | weight: "400", 27 | style: "normal", 28 | }, 29 | { 30 | path: "../public/fonts/Inter-Medium.ttf", 31 | weight: "500", 32 | style: "normal", 33 | }, 34 | { 35 | path: "../public/fonts/Inter-SemiBold.ttf", 36 | weight: "600", 37 | style: "normal", 38 | }, 39 | { 40 | path: "../public/fonts/Inter-Bold.ttf", 41 | weight: "700", 42 | style: "normal", 43 | }, 44 | { 45 | path: "../public/fonts/Inter-ExtraBold.ttf", 46 | weight: "800", 47 | style: "normal", 48 | }, 49 | { 50 | path: "../public/fonts/Inter-Black.ttf", 51 | weight: "900", 52 | style: "normal", 53 | }, 54 | ], 55 | }); 56 | 57 | export const metadata: Metadata = { 58 | title: "shadverse", 59 | description: 60 | "A collection of projects built with the awesome shadcn-ui component library", 61 | }; 62 | 63 | export default function RootLayout({ 64 | children, 65 | }: { 66 | children: React.ReactNode; 67 | }) { 68 | return ( 69 | 70 | 71 | 72 |
73 |
{children}
74 | 75 | 76 | 77 | ); 78 | } 79 | -------------------------------------------------------------------------------- /app/page.tsx: -------------------------------------------------------------------------------- 1 | import { Metadata } from "next"; 2 | import Jumbotron from "@/components/jumbotron"; 3 | import { Button } from "@/components/ui/button"; 4 | import { Input } from "@/components/ui/input"; 5 | import ProjectCard from "@/components/card"; 6 | 7 | import { projects } from "@/data/projects"; 8 | 9 | export const metadata: Metadata = { 10 | title: "shadverse", 11 | description: 12 | "A collection of projects built with the awesome shadcn-ui component library", 13 | }; 14 | export default function Home() { 15 | return ( 16 |
17 | 18 |
19 | 24 | 25 |
26 |
27 | {projects.map((project, i) => ( 28 | 29 | ))} 30 |
31 |
32 | ); 33 | } 34 | -------------------------------------------------------------------------------- /components.json: -------------------------------------------------------------------------------- 1 | { 2 | "$schema": "https://ui.shadcn.com/schema.json", 3 | "style": "new-york", 4 | "rsc": true, 5 | "tsx": true, 6 | "tailwind": { 7 | "config": "tailwind.config.js", 8 | "css": "app/globals.css", 9 | "baseColor": "zinc", 10 | "cssVariables": true 11 | }, 12 | "aliases": { 13 | "components": "@/components", 14 | "utils": "@/lib/utils" 15 | } 16 | } -------------------------------------------------------------------------------- /components/card.tsx: -------------------------------------------------------------------------------- 1 | "use client"; 2 | 3 | import { Link2Icon } from "@radix-ui/react-icons"; 4 | import GitHubButton from "react-github-btn"; 5 | 6 | import { Button } from "@/components/ui/button"; 7 | import { 8 | Card, 9 | CardContent, 10 | CardDescription, 11 | CardHeader, 12 | CardTitle, 13 | } from "@/components/ui/card"; 14 | import { IProject } from "@/lib/types"; 15 | 16 | export default function ProjectCard({ project }: { project: IProject }) { 17 | return ( 18 | 19 | 25 | 26 | 27 | 28 | 29 |
30 | {project.title} 31 | {project.description} 32 |
33 |
34 | 35 |
36 |
37 | {/* 38 | Dave Burk */} 39 | 45 | Stars 46 | 47 |
48 |
49 | {/* 50 | 20k */} 51 |
52 | 58 | Follow author 59 | 60 |
61 |
62 |
63 |
64 | 65 |
66 | {/* */} 67 | 68 |
69 |
70 |
71 | ); 72 | } 73 | -------------------------------------------------------------------------------- /components/header.tsx: -------------------------------------------------------------------------------- 1 | "use client"; 2 | 3 | import { useState, useEffect } from "react"; 4 | 5 | import Link from "next/link"; 6 | import { Button } from "@/components/ui/button"; 7 | 8 | import Logo from "./logo"; 9 | 10 | export default function Header() { 11 | const [top, setTop] = useState(true); 12 | 13 | const scrollHandler = () => { 14 | window.scrollY > 10 ? setTop(false) : setTop(true); 15 | }; 16 | 17 | useEffect(() => { 18 | scrollHandler(); 19 | window.addEventListener("scroll", scrollHandler); 20 | return () => window.removeEventListener("scroll", scrollHandler); 21 | }, [top]); 22 | 23 | return ( 24 |
29 |
30 |
31 |
32 | 33 |

34 | 35 | 36 | shadverse 37 | 38 |

39 | 40 |
41 | 42 | 57 |
58 |
59 |
60 | ); 61 | } 62 | -------------------------------------------------------------------------------- /components/icons.tsx: -------------------------------------------------------------------------------- 1 | import { 2 | AlertTriangle, 3 | ArrowRight, 4 | Banknote, 5 | Check, 6 | CheckCircle, 7 | ChevronLeft, 8 | ChevronRight, 9 | ClipboardCheck, 10 | Copy, 11 | CreditCard, 12 | DownloadCloud, 13 | Edit3, 14 | Eye, 15 | Facebook, 16 | File, 17 | FileText, 18 | Film, 19 | HeartHandshake, 20 | HelpCircle, 21 | Image, 22 | KeyRound, 23 | Laptop, 24 | Loader, 25 | Loader2, 26 | LogOut, 27 | LucideProps, 28 | Moon, 29 | Monitor, 30 | MoreVertical, 31 | Newspaper, 32 | Pizza, 33 | Plus, 34 | ScrollText, 35 | Search, 36 | Settings, 37 | Share2, 38 | SunMedium, 39 | Terminal, 40 | Trash, 41 | Twitter, 42 | Unlock, 43 | UploadCloud, 44 | User, 45 | Wallet, 46 | Waves, 47 | X, 48 | } from "lucide-react"; 49 | 50 | export const Icons = { 51 | logo: (props: LucideProps) => ( 52 | 61 | 62 | 63 | ), 64 | close: X, 65 | spinner: Loader, 66 | spinner2: Loader2, 67 | chevronLeft: ChevronLeft, 68 | chevronRight: ChevronRight, 69 | trash: Trash, 70 | post: FileText, 71 | page: File, 72 | media: Image, 73 | settings: Settings, 74 | billing: CreditCard, 75 | ellipsis: MoreVertical, 76 | search: Search, 77 | add: Plus, 78 | warning: AlertTriangle, 79 | user: User, 80 | arrowRight: ArrowRight, 81 | help: HelpCircle, 82 | pizza: Pizza, 83 | twitter: Twitter, 84 | check: Check, 85 | checkCircle: CheckCircle, 86 | copy: Copy, 87 | copyDone: ClipboardCheck, 88 | sun: SunMedium, 89 | moon: Moon, 90 | laptop: Laptop, 91 | wallet: Wallet, 92 | heartHandshake: HeartHandshake, 93 | terminal: Terminal, 94 | waves: Waves, 95 | facebook: Facebook, 96 | banknote: Banknote, 97 | monitor: Monitor, 98 | eye: Eye, 99 | newspaper: Newspaper, 100 | film: Film, 101 | edit3: Edit3, 102 | download: DownloadCloud, 103 | scrollText: ScrollText, 104 | key: KeyRound, 105 | upload: UploadCloud, 106 | share: Share2, 107 | logout: LogOut, 108 | unlock: Unlock, 109 | system: (props: LucideProps) => ( 110 | 111 | 116 | 117 | ), 118 | gitHub: (props: LucideProps) => ( 119 | 120 | 124 | 125 | ), 126 | radix: (props: LucideProps) => ( 127 | 128 | 132 | 133 | 137 | 138 | ), 139 | aria: (props: LucideProps) => ( 140 | 141 | 142 | 143 | ), 144 | npm: (props: LucideProps) => ( 145 | 146 | 150 | 151 | ), 152 | yarn: (props: LucideProps) => ( 153 | 154 | 158 | 159 | ), 160 | pnpm: (props: LucideProps) => ( 161 | 162 | 166 | 167 | ), 168 | react: (props: LucideProps) => ( 169 | 170 | 174 | 175 | ), 176 | tailwind: (props: LucideProps) => ( 177 | 178 | 182 | 183 | ), 184 | google: (props: LucideProps) => ( 185 | 186 | 190 | 191 | ), 192 | apple: (props: LucideProps) => ( 193 | 194 | 198 | 199 | ), 200 | paypal: (props: LucideProps) => ( 201 | 202 | 206 | 207 | ), 208 | }; 209 | -------------------------------------------------------------------------------- /components/jumbotron.tsx: -------------------------------------------------------------------------------- 1 | import React from "react"; 2 | import { Button } from "./ui/button"; 3 | 4 | export default function Jumbotron() { 5 | return ( 6 |
7 |
8 |

9 | Share and discover applications built with the awesome shadcn/ui 10 |

11 |

12 | Shadverse is a web app that curates a captivating collection of 13 | projects all crafted with the cutting-edge{" "} 14 | 15 | 20 | shadcn/ui 21 | 22 | {" "} 23 | component library 24 |

25 |
26 | 35 | 44 |
45 |
46 |
47 | ); 48 | } 49 | -------------------------------------------------------------------------------- /components/logo.tsx: -------------------------------------------------------------------------------- 1 | import React from "react"; 2 | 3 | export default function Logo() { 4 | return ( 5 | 12 | 18 | 19 | ); 20 | } 21 | -------------------------------------------------------------------------------- /components/provider.tsx: -------------------------------------------------------------------------------- 1 | "use client"; 2 | 3 | import * as React from "react"; 4 | import { ThemeProvider as NextThemesProvider } from "next-themes"; 5 | import { type ThemeProviderProps } from "next-themes/dist/types"; 6 | 7 | export function Provider({ children, ...props }: ThemeProviderProps) { 8 | return <>{children}; 9 | } 10 | -------------------------------------------------------------------------------- /components/ui/avatar.tsx: -------------------------------------------------------------------------------- 1 | "use client" 2 | 3 | import * as React from "react" 4 | import * as AvatarPrimitive from "@radix-ui/react-avatar" 5 | 6 | import { cn } from "@/lib/utils" 7 | 8 | const Avatar = React.forwardRef< 9 | React.ElementRef, 10 | React.ComponentPropsWithoutRef 11 | >(({ className, ...props }, ref) => ( 12 | 20 | )) 21 | Avatar.displayName = AvatarPrimitive.Root.displayName 22 | 23 | const AvatarImage = React.forwardRef< 24 | React.ElementRef, 25 | React.ComponentPropsWithoutRef 26 | >(({ className, ...props }, ref) => ( 27 | 32 | )) 33 | AvatarImage.displayName = AvatarPrimitive.Image.displayName 34 | 35 | const AvatarFallback = React.forwardRef< 36 | React.ElementRef, 37 | React.ComponentPropsWithoutRef 38 | >(({ className, ...props }, ref) => ( 39 | 47 | )) 48 | AvatarFallback.displayName = AvatarPrimitive.Fallback.displayName 49 | 50 | export { Avatar, AvatarImage, AvatarFallback } 51 | -------------------------------------------------------------------------------- /components/ui/badge.tsx: -------------------------------------------------------------------------------- 1 | import * as React from "react" 2 | import { cva, type VariantProps } from "class-variance-authority" 3 | 4 | import { cn } from "@/lib/utils" 5 | 6 | const badgeVariants = cva( 7 | "inline-flex items-center rounded-md border px-2.5 py-0.5 text-xs font-semibold transition-colors focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2", 8 | { 9 | variants: { 10 | variant: { 11 | default: 12 | "border-transparent bg-primary text-primary-foreground shadow hover:bg-primary/80", 13 | secondary: 14 | "border-transparent bg-secondary text-secondary-foreground hover:bg-secondary/80", 15 | destructive: 16 | "border-transparent bg-destructive text-destructive-foreground shadow hover:bg-destructive/80", 17 | outline: "text-foreground", 18 | }, 19 | }, 20 | defaultVariants: { 21 | variant: "default", 22 | }, 23 | } 24 | ) 25 | 26 | export interface BadgeProps 27 | extends React.HTMLAttributes, 28 | VariantProps {} 29 | 30 | function Badge({ className, variant, ...props }: BadgeProps) { 31 | return ( 32 |
33 | ) 34 | } 35 | 36 | export { Badge, badgeVariants } 37 | -------------------------------------------------------------------------------- /components/ui/button.tsx: -------------------------------------------------------------------------------- 1 | import * as React from "react" 2 | import { Slot } from "@radix-ui/react-slot" 3 | import { cva, type VariantProps } from "class-variance-authority" 4 | 5 | import { cn } from "@/lib/utils" 6 | 7 | const buttonVariants = cva( 8 | "inline-flex items-center justify-center rounded-md text-sm font-medium transition-colors focus-visible:outline-none focus-visible:ring-1 focus-visible:ring-ring disabled:pointer-events-none disabled:opacity-50", 9 | { 10 | variants: { 11 | variant: { 12 | default: 13 | "bg-primary text-primary-foreground shadow hover:bg-primary/90", 14 | destructive: 15 | "bg-destructive text-destructive-foreground shadow-sm hover:bg-destructive/90", 16 | outline: 17 | "border border-input bg-background shadow-sm hover:bg-accent hover:text-accent-foreground", 18 | secondary: 19 | "bg-secondary text-secondary-foreground shadow-sm hover:bg-secondary/80", 20 | ghost: "hover:bg-accent hover:text-accent-foreground", 21 | link: "text-primary underline-offset-4 hover:underline", 22 | }, 23 | size: { 24 | default: "h-9 px-4 py-2", 25 | sm: "h-8 rounded-md px-3 text-xs", 26 | lg: "h-10 rounded-md px-8", 27 | icon: "h-9 w-9", 28 | }, 29 | }, 30 | defaultVariants: { 31 | variant: "default", 32 | size: "default", 33 | }, 34 | } 35 | ) 36 | 37 | export interface ButtonProps 38 | extends React.ButtonHTMLAttributes, 39 | VariantProps { 40 | asChild?: boolean 41 | } 42 | 43 | const Button = React.forwardRef( 44 | ({ className, variant, size, asChild = false, ...props }, ref) => { 45 | const Comp = asChild ? Slot : "button" 46 | return ( 47 | 52 | ) 53 | } 54 | ) 55 | Button.displayName = "Button" 56 | 57 | export { Button, buttonVariants } 58 | -------------------------------------------------------------------------------- /components/ui/card.tsx: -------------------------------------------------------------------------------- 1 | import * as React from "react" 2 | 3 | import { cn } from "@/lib/utils" 4 | 5 | const Card = React.forwardRef< 6 | HTMLDivElement, 7 | React.HTMLAttributes 8 | >(({ className, ...props }, ref) => ( 9 |
17 | )) 18 | Card.displayName = "Card" 19 | 20 | const CardHeader = React.forwardRef< 21 | HTMLDivElement, 22 | React.HTMLAttributes 23 | >(({ className, ...props }, ref) => ( 24 |
29 | )) 30 | CardHeader.displayName = "CardHeader" 31 | 32 | const CardTitle = React.forwardRef< 33 | HTMLParagraphElement, 34 | React.HTMLAttributes 35 | >(({ className, ...props }, ref) => ( 36 |

41 | )) 42 | CardTitle.displayName = "CardTitle" 43 | 44 | const CardDescription = React.forwardRef< 45 | HTMLParagraphElement, 46 | React.HTMLAttributes 47 | >(({ className, ...props }, ref) => ( 48 |

53 | )) 54 | CardDescription.displayName = "CardDescription" 55 | 56 | const CardContent = React.forwardRef< 57 | HTMLDivElement, 58 | React.HTMLAttributes 59 | >(({ className, ...props }, ref) => ( 60 |

61 | )) 62 | CardContent.displayName = "CardContent" 63 | 64 | const CardFooter = React.forwardRef< 65 | HTMLDivElement, 66 | React.HTMLAttributes 67 | >(({ className, ...props }, ref) => ( 68 |
73 | )) 74 | CardFooter.displayName = "CardFooter" 75 | 76 | export { Card, CardHeader, CardFooter, CardTitle, CardDescription, CardContent } 77 | -------------------------------------------------------------------------------- /components/ui/context-menu.tsx: -------------------------------------------------------------------------------- 1 | "use client" 2 | 3 | import * as React from "react" 4 | import * as ContextMenuPrimitive from "@radix-ui/react-context-menu" 5 | import { 6 | CheckIcon, 7 | ChevronRightIcon, 8 | DotFilledIcon, 9 | } from "@radix-ui/react-icons" 10 | 11 | import { cn } from "@/lib/utils" 12 | 13 | const ContextMenu = ContextMenuPrimitive.Root 14 | 15 | const ContextMenuTrigger = ContextMenuPrimitive.Trigger 16 | 17 | const ContextMenuGroup = ContextMenuPrimitive.Group 18 | 19 | const ContextMenuPortal = ContextMenuPrimitive.Portal 20 | 21 | const ContextMenuSub = ContextMenuPrimitive.Sub 22 | 23 | const ContextMenuRadioGroup = ContextMenuPrimitive.RadioGroup 24 | 25 | const ContextMenuSubTrigger = React.forwardRef< 26 | React.ElementRef, 27 | React.ComponentPropsWithoutRef & { 28 | inset?: boolean 29 | } 30 | >(({ className, inset, children, ...props }, ref) => ( 31 | 40 | {children} 41 | 42 | 43 | )) 44 | ContextMenuSubTrigger.displayName = ContextMenuPrimitive.SubTrigger.displayName 45 | 46 | const ContextMenuSubContent = React.forwardRef< 47 | React.ElementRef, 48 | React.ComponentPropsWithoutRef 49 | >(({ className, ...props }, ref) => ( 50 | 58 | )) 59 | ContextMenuSubContent.displayName = ContextMenuPrimitive.SubContent.displayName 60 | 61 | const ContextMenuContent = React.forwardRef< 62 | React.ElementRef, 63 | React.ComponentPropsWithoutRef 64 | >(({ className, ...props }, ref) => ( 65 | 66 | 74 | 75 | )) 76 | ContextMenuContent.displayName = ContextMenuPrimitive.Content.displayName 77 | 78 | const ContextMenuItem = React.forwardRef< 79 | React.ElementRef, 80 | React.ComponentPropsWithoutRef & { 81 | inset?: boolean 82 | } 83 | >(({ className, inset, ...props }, ref) => ( 84 | 93 | )) 94 | ContextMenuItem.displayName = ContextMenuPrimitive.Item.displayName 95 | 96 | const ContextMenuCheckboxItem = React.forwardRef< 97 | React.ElementRef, 98 | React.ComponentPropsWithoutRef 99 | >(({ className, children, checked, ...props }, ref) => ( 100 | 109 | 110 | 111 | 112 | 113 | 114 | {children} 115 | 116 | )) 117 | ContextMenuCheckboxItem.displayName = 118 | ContextMenuPrimitive.CheckboxItem.displayName 119 | 120 | const ContextMenuRadioItem = React.forwardRef< 121 | React.ElementRef, 122 | React.ComponentPropsWithoutRef 123 | >(({ className, children, ...props }, ref) => ( 124 | 132 | 133 | 134 | 135 | 136 | 137 | {children} 138 | 139 | )) 140 | ContextMenuRadioItem.displayName = ContextMenuPrimitive.RadioItem.displayName 141 | 142 | const ContextMenuLabel = React.forwardRef< 143 | React.ElementRef, 144 | React.ComponentPropsWithoutRef & { 145 | inset?: boolean 146 | } 147 | >(({ className, inset, ...props }, ref) => ( 148 | 157 | )) 158 | ContextMenuLabel.displayName = ContextMenuPrimitive.Label.displayName 159 | 160 | const ContextMenuSeparator = React.forwardRef< 161 | React.ElementRef, 162 | React.ComponentPropsWithoutRef 163 | >(({ className, ...props }, ref) => ( 164 | 169 | )) 170 | ContextMenuSeparator.displayName = ContextMenuPrimitive.Separator.displayName 171 | 172 | const ContextMenuShortcut = ({ 173 | className, 174 | ...props 175 | }: React.HTMLAttributes) => { 176 | return ( 177 | 184 | ) 185 | } 186 | ContextMenuShortcut.displayName = "ContextMenuShortcut" 187 | 188 | export { 189 | ContextMenu, 190 | ContextMenuTrigger, 191 | ContextMenuContent, 192 | ContextMenuItem, 193 | ContextMenuCheckboxItem, 194 | ContextMenuRadioItem, 195 | ContextMenuLabel, 196 | ContextMenuSeparator, 197 | ContextMenuShortcut, 198 | ContextMenuGroup, 199 | ContextMenuPortal, 200 | ContextMenuSub, 201 | ContextMenuSubContent, 202 | ContextMenuSubTrigger, 203 | ContextMenuRadioGroup, 204 | } 205 | -------------------------------------------------------------------------------- /components/ui/dialog.tsx: -------------------------------------------------------------------------------- 1 | "use client" 2 | 3 | import * as React from "react" 4 | import * as DialogPrimitive from "@radix-ui/react-dialog" 5 | import { Cross2Icon } from "@radix-ui/react-icons" 6 | 7 | import { cn } from "@/lib/utils" 8 | 9 | const Dialog = DialogPrimitive.Root 10 | 11 | const DialogTrigger = DialogPrimitive.Trigger 12 | 13 | const DialogPortal = ({ 14 | className, 15 | ...props 16 | }: DialogPrimitive.DialogPortalProps) => ( 17 | 18 | ) 19 | DialogPortal.displayName = DialogPrimitive.Portal.displayName 20 | 21 | const DialogOverlay = React.forwardRef< 22 | React.ElementRef, 23 | React.ComponentPropsWithoutRef 24 | >(({ className, ...props }, ref) => ( 25 | 33 | )) 34 | DialogOverlay.displayName = DialogPrimitive.Overlay.displayName 35 | 36 | const DialogContent = React.forwardRef< 37 | React.ElementRef, 38 | React.ComponentPropsWithoutRef 39 | >(({ className, children, ...props }, ref) => ( 40 | 41 | 42 | 50 | {children} 51 | 52 | 53 | Close 54 | 55 | 56 | 57 | )) 58 | DialogContent.displayName = DialogPrimitive.Content.displayName 59 | 60 | const DialogHeader = ({ 61 | className, 62 | ...props 63 | }: React.HTMLAttributes) => ( 64 |
71 | ) 72 | DialogHeader.displayName = "DialogHeader" 73 | 74 | const DialogFooter = ({ 75 | className, 76 | ...props 77 | }: React.HTMLAttributes) => ( 78 |
85 | ) 86 | DialogFooter.displayName = "DialogFooter" 87 | 88 | const DialogTitle = React.forwardRef< 89 | React.ElementRef, 90 | React.ComponentPropsWithoutRef 91 | >(({ className, ...props }, ref) => ( 92 | 100 | )) 101 | DialogTitle.displayName = DialogPrimitive.Title.displayName 102 | 103 | const DialogDescription = React.forwardRef< 104 | React.ElementRef, 105 | React.ComponentPropsWithoutRef 106 | >(({ className, ...props }, ref) => ( 107 | 112 | )) 113 | DialogDescription.displayName = DialogPrimitive.Description.displayName 114 | 115 | export { 116 | Dialog, 117 | DialogTrigger, 118 | DialogContent, 119 | DialogHeader, 120 | DialogFooter, 121 | DialogTitle, 122 | DialogDescription, 123 | } 124 | -------------------------------------------------------------------------------- /components/ui/dropdown-menu.tsx: -------------------------------------------------------------------------------- 1 | "use client" 2 | 3 | import * as React from "react" 4 | import * as DropdownMenuPrimitive from "@radix-ui/react-dropdown-menu" 5 | import { 6 | CheckIcon, 7 | ChevronRightIcon, 8 | DotFilledIcon, 9 | } from "@radix-ui/react-icons" 10 | 11 | import { cn } from "@/lib/utils" 12 | 13 | const DropdownMenu = DropdownMenuPrimitive.Root 14 | 15 | const DropdownMenuTrigger = DropdownMenuPrimitive.Trigger 16 | 17 | const DropdownMenuGroup = DropdownMenuPrimitive.Group 18 | 19 | const DropdownMenuPortal = DropdownMenuPrimitive.Portal 20 | 21 | const DropdownMenuSub = DropdownMenuPrimitive.Sub 22 | 23 | const DropdownMenuRadioGroup = DropdownMenuPrimitive.RadioGroup 24 | 25 | const DropdownMenuSubTrigger = React.forwardRef< 26 | React.ElementRef, 27 | React.ComponentPropsWithoutRef & { 28 | inset?: boolean 29 | } 30 | >(({ className, inset, children, ...props }, ref) => ( 31 | 40 | {children} 41 | 42 | 43 | )) 44 | DropdownMenuSubTrigger.displayName = 45 | DropdownMenuPrimitive.SubTrigger.displayName 46 | 47 | const DropdownMenuSubContent = React.forwardRef< 48 | React.ElementRef, 49 | React.ComponentPropsWithoutRef 50 | >(({ className, ...props }, ref) => ( 51 | 59 | )) 60 | DropdownMenuSubContent.displayName = 61 | DropdownMenuPrimitive.SubContent.displayName 62 | 63 | const DropdownMenuContent = React.forwardRef< 64 | React.ElementRef, 65 | React.ComponentPropsWithoutRef 66 | >(({ className, sideOffset = 4, ...props }, ref) => ( 67 | 68 | 78 | 79 | )) 80 | DropdownMenuContent.displayName = DropdownMenuPrimitive.Content.displayName 81 | 82 | const DropdownMenuItem = React.forwardRef< 83 | React.ElementRef, 84 | React.ComponentPropsWithoutRef & { 85 | inset?: boolean 86 | } 87 | >(({ className, inset, ...props }, ref) => ( 88 | 97 | )) 98 | DropdownMenuItem.displayName = DropdownMenuPrimitive.Item.displayName 99 | 100 | const DropdownMenuCheckboxItem = React.forwardRef< 101 | React.ElementRef, 102 | React.ComponentPropsWithoutRef 103 | >(({ className, children, checked, ...props }, ref) => ( 104 | 113 | 114 | 115 | 116 | 117 | 118 | {children} 119 | 120 | )) 121 | DropdownMenuCheckboxItem.displayName = 122 | DropdownMenuPrimitive.CheckboxItem.displayName 123 | 124 | const DropdownMenuRadioItem = React.forwardRef< 125 | React.ElementRef, 126 | React.ComponentPropsWithoutRef 127 | >(({ className, children, ...props }, ref) => ( 128 | 136 | 137 | 138 | 139 | 140 | 141 | {children} 142 | 143 | )) 144 | DropdownMenuRadioItem.displayName = DropdownMenuPrimitive.RadioItem.displayName 145 | 146 | const DropdownMenuLabel = React.forwardRef< 147 | React.ElementRef, 148 | React.ComponentPropsWithoutRef & { 149 | inset?: boolean 150 | } 151 | >(({ className, inset, ...props }, ref) => ( 152 | 161 | )) 162 | DropdownMenuLabel.displayName = DropdownMenuPrimitive.Label.displayName 163 | 164 | const DropdownMenuSeparator = React.forwardRef< 165 | React.ElementRef, 166 | React.ComponentPropsWithoutRef 167 | >(({ className, ...props }, ref) => ( 168 | 173 | )) 174 | DropdownMenuSeparator.displayName = DropdownMenuPrimitive.Separator.displayName 175 | 176 | const DropdownMenuShortcut = ({ 177 | className, 178 | ...props 179 | }: React.HTMLAttributes) => { 180 | return ( 181 | 185 | ) 186 | } 187 | DropdownMenuShortcut.displayName = "DropdownMenuShortcut" 188 | 189 | export { 190 | DropdownMenu, 191 | DropdownMenuTrigger, 192 | DropdownMenuContent, 193 | DropdownMenuItem, 194 | DropdownMenuCheckboxItem, 195 | DropdownMenuRadioItem, 196 | DropdownMenuLabel, 197 | DropdownMenuSeparator, 198 | DropdownMenuShortcut, 199 | DropdownMenuGroup, 200 | DropdownMenuPortal, 201 | DropdownMenuSub, 202 | DropdownMenuSubContent, 203 | DropdownMenuSubTrigger, 204 | DropdownMenuRadioGroup, 205 | } 206 | -------------------------------------------------------------------------------- /components/ui/input.tsx: -------------------------------------------------------------------------------- 1 | import * as React from "react" 2 | 3 | import { cn } from "@/lib/utils" 4 | 5 | export interface InputProps 6 | extends React.InputHTMLAttributes {} 7 | 8 | const Input = React.forwardRef( 9 | ({ className, type, ...props }, ref) => { 10 | return ( 11 | 20 | ) 21 | } 22 | ) 23 | Input.displayName = "Input" 24 | 25 | export { Input } 26 | -------------------------------------------------------------------------------- /components/ui/label.tsx: -------------------------------------------------------------------------------- 1 | "use client" 2 | 3 | import * as React from "react" 4 | import * as LabelPrimitive from "@radix-ui/react-label" 5 | import { cva, type VariantProps } from "class-variance-authority" 6 | 7 | import { cn } from "@/lib/utils" 8 | 9 | const labelVariants = cva( 10 | "text-sm font-medium leading-none peer-disabled:cursor-not-allowed peer-disabled:opacity-70" 11 | ) 12 | 13 | const Label = React.forwardRef< 14 | React.ElementRef, 15 | React.ComponentPropsWithoutRef & 16 | VariantProps 17 | >(({ className, ...props }, ref) => ( 18 | 23 | )) 24 | Label.displayName = LabelPrimitive.Root.displayName 25 | 26 | export { Label } 27 | -------------------------------------------------------------------------------- /components/ui/menubar.tsx: -------------------------------------------------------------------------------- 1 | "use client" 2 | 3 | import * as React from "react" 4 | import { 5 | CheckIcon, 6 | ChevronRightIcon, 7 | DotFilledIcon, 8 | } from "@radix-ui/react-icons" 9 | import * as MenubarPrimitive from "@radix-ui/react-menubar" 10 | 11 | import { cn } from "@/lib/utils" 12 | 13 | const MenubarMenu = MenubarPrimitive.Menu 14 | 15 | const MenubarGroup = MenubarPrimitive.Group 16 | 17 | const MenubarPortal = MenubarPrimitive.Portal 18 | 19 | const MenubarSub = MenubarPrimitive.Sub 20 | 21 | const MenubarRadioGroup = MenubarPrimitive.RadioGroup 22 | 23 | const Menubar = React.forwardRef< 24 | React.ElementRef, 25 | React.ComponentPropsWithoutRef 26 | >(({ className, ...props }, ref) => ( 27 | 35 | )) 36 | Menubar.displayName = MenubarPrimitive.Root.displayName 37 | 38 | const MenubarTrigger = React.forwardRef< 39 | React.ElementRef, 40 | React.ComponentPropsWithoutRef 41 | >(({ className, ...props }, ref) => ( 42 | 50 | )) 51 | MenubarTrigger.displayName = MenubarPrimitive.Trigger.displayName 52 | 53 | const MenubarSubTrigger = React.forwardRef< 54 | React.ElementRef, 55 | React.ComponentPropsWithoutRef & { 56 | inset?: boolean 57 | } 58 | >(({ className, inset, children, ...props }, ref) => ( 59 | 68 | {children} 69 | 70 | 71 | )) 72 | MenubarSubTrigger.displayName = MenubarPrimitive.SubTrigger.displayName 73 | 74 | const MenubarSubContent = React.forwardRef< 75 | React.ElementRef, 76 | React.ComponentPropsWithoutRef 77 | >(({ className, ...props }, ref) => ( 78 | 86 | )) 87 | MenubarSubContent.displayName = MenubarPrimitive.SubContent.displayName 88 | 89 | const MenubarContent = React.forwardRef< 90 | React.ElementRef, 91 | React.ComponentPropsWithoutRef 92 | >( 93 | ( 94 | { className, align = "start", alignOffset = -4, sideOffset = 8, ...props }, 95 | ref 96 | ) => ( 97 | 98 | 109 | 110 | ) 111 | ) 112 | MenubarContent.displayName = MenubarPrimitive.Content.displayName 113 | 114 | const MenubarItem = React.forwardRef< 115 | React.ElementRef, 116 | React.ComponentPropsWithoutRef & { 117 | inset?: boolean 118 | } 119 | >(({ className, inset, ...props }, ref) => ( 120 | 129 | )) 130 | MenubarItem.displayName = MenubarPrimitive.Item.displayName 131 | 132 | const MenubarCheckboxItem = React.forwardRef< 133 | React.ElementRef, 134 | React.ComponentPropsWithoutRef 135 | >(({ className, children, checked, ...props }, ref) => ( 136 | 145 | 146 | 147 | 148 | 149 | 150 | {children} 151 | 152 | )) 153 | MenubarCheckboxItem.displayName = MenubarPrimitive.CheckboxItem.displayName 154 | 155 | const MenubarRadioItem = React.forwardRef< 156 | React.ElementRef, 157 | React.ComponentPropsWithoutRef 158 | >(({ className, children, ...props }, ref) => ( 159 | 167 | 168 | 169 | 170 | 171 | 172 | {children} 173 | 174 | )) 175 | MenubarRadioItem.displayName = MenubarPrimitive.RadioItem.displayName 176 | 177 | const MenubarLabel = React.forwardRef< 178 | React.ElementRef, 179 | React.ComponentPropsWithoutRef & { 180 | inset?: boolean 181 | } 182 | >(({ className, inset, ...props }, ref) => ( 183 | 192 | )) 193 | MenubarLabel.displayName = MenubarPrimitive.Label.displayName 194 | 195 | const MenubarSeparator = React.forwardRef< 196 | React.ElementRef, 197 | React.ComponentPropsWithoutRef 198 | >(({ className, ...props }, ref) => ( 199 | 204 | )) 205 | MenubarSeparator.displayName = MenubarPrimitive.Separator.displayName 206 | 207 | const MenubarShortcut = ({ 208 | className, 209 | ...props 210 | }: React.HTMLAttributes) => { 211 | return ( 212 | 219 | ) 220 | } 221 | MenubarShortcut.displayname = "MenubarShortcut" 222 | 223 | export { 224 | Menubar, 225 | MenubarMenu, 226 | MenubarTrigger, 227 | MenubarContent, 228 | MenubarItem, 229 | MenubarSeparator, 230 | MenubarLabel, 231 | MenubarCheckboxItem, 232 | MenubarRadioGroup, 233 | MenubarRadioItem, 234 | MenubarPortal, 235 | MenubarSubContent, 236 | MenubarSubTrigger, 237 | MenubarGroup, 238 | MenubarSub, 239 | MenubarShortcut, 240 | } 241 | -------------------------------------------------------------------------------- /components/ui/scroll-area.tsx: -------------------------------------------------------------------------------- 1 | "use client" 2 | 3 | import * as React from "react" 4 | import * as ScrollAreaPrimitive from "@radix-ui/react-scroll-area" 5 | 6 | import { cn } from "@/lib/utils" 7 | 8 | const ScrollArea = React.forwardRef< 9 | React.ElementRef, 10 | React.ComponentPropsWithoutRef 11 | >(({ className, children, ...props }, ref) => ( 12 | 17 | 18 | {children} 19 | 20 | 21 | 22 | 23 | )) 24 | ScrollArea.displayName = ScrollAreaPrimitive.Root.displayName 25 | 26 | const ScrollBar = React.forwardRef< 27 | React.ElementRef, 28 | React.ComponentPropsWithoutRef 29 | >(({ className, orientation = "vertical", ...props }, ref) => ( 30 | 43 | 44 | 45 | )) 46 | ScrollBar.displayName = ScrollAreaPrimitive.ScrollAreaScrollbar.displayName 47 | 48 | export { ScrollArea, ScrollBar } 49 | -------------------------------------------------------------------------------- /components/ui/separator.tsx: -------------------------------------------------------------------------------- 1 | "use client" 2 | 3 | import * as React from "react" 4 | import * as SeparatorPrimitive from "@radix-ui/react-separator" 5 | 6 | import { cn } from "@/lib/utils" 7 | 8 | const Separator = React.forwardRef< 9 | React.ElementRef, 10 | React.ComponentPropsWithoutRef 11 | >( 12 | ( 13 | { className, orientation = "horizontal", decorative = true, ...props }, 14 | ref 15 | ) => ( 16 | 27 | ) 28 | ) 29 | Separator.displayName = SeparatorPrimitive.Root.displayName 30 | 31 | export { Separator } 32 | -------------------------------------------------------------------------------- /components/ui/tabs.tsx: -------------------------------------------------------------------------------- 1 | "use client" 2 | 3 | import * as React from "react" 4 | import * as TabsPrimitive from "@radix-ui/react-tabs" 5 | 6 | import { cn } from "@/lib/utils" 7 | 8 | const Tabs = TabsPrimitive.Root 9 | 10 | const TabsList = React.forwardRef< 11 | React.ElementRef, 12 | React.ComponentPropsWithoutRef 13 | >(({ className, ...props }, ref) => ( 14 | 22 | )) 23 | TabsList.displayName = TabsPrimitive.List.displayName 24 | 25 | const TabsTrigger = React.forwardRef< 26 | React.ElementRef, 27 | React.ComponentPropsWithoutRef 28 | >(({ className, ...props }, ref) => ( 29 | 37 | )) 38 | TabsTrigger.displayName = TabsPrimitive.Trigger.displayName 39 | 40 | const TabsContent = React.forwardRef< 41 | React.ElementRef, 42 | React.ComponentPropsWithoutRef 43 | >(({ className, ...props }, ref) => ( 44 | 52 | )) 53 | TabsContent.displayName = TabsPrimitive.Content.displayName 54 | 55 | export { Tabs, TabsList, TabsTrigger, TabsContent } 56 | -------------------------------------------------------------------------------- /data/projects.ts: -------------------------------------------------------------------------------- 1 | import type { IProject } from "@/lib/types"; 2 | 3 | export const projects: IProject[] = [ 4 | { 5 | title: "shadcn/ui", 6 | description: 7 | "Beautifully designed components that you can copy and paste into your apps. Accessible. Customizable. Open Source.", 8 | authorGithub: "https://github.com/shadcn-ui", 9 | projectRepo: "https://github.com/shadcn-ui/ui", 10 | projectLink: "https://ui.shadcn.com/", 11 | }, 12 | { 13 | title: "shadverse", 14 | description: 15 | "Share and discover applications built with the awesome shadcn/ui", 16 | authorGithub: "https://github.com/lucky-chap", 17 | projectRepo: "https://github.com/lucky-chap/shadverse", 18 | projectLink: "https://shadverse.vercel.app/", 19 | }, 20 | ]; 21 | -------------------------------------------------------------------------------- /lib/types.ts: -------------------------------------------------------------------------------- 1 | export interface IProject { 2 | title: string; 3 | description: string; 4 | authorGithub: string; 5 | projectRepo: string; 6 | projectLink?: string; 7 | } 8 | -------------------------------------------------------------------------------- /lib/utils.ts: -------------------------------------------------------------------------------- 1 | import { type ClassValue, clsx } from "clsx" 2 | import { twMerge } from "tailwind-merge" 3 | 4 | export function cn(...inputs: ClassValue[]) { 5 | return twMerge(clsx(inputs)) 6 | } 7 | -------------------------------------------------------------------------------- /next.config.js: -------------------------------------------------------------------------------- 1 | /** @type {import('next').NextConfig} */ 2 | const nextConfig = { 3 | images: { 4 | remotePatterns: [ 5 | { 6 | protocol: "https", 7 | hostname: "*", 8 | port: "", 9 | }, 10 | ], 11 | }, 12 | }; 13 | 14 | module.exports = nextConfig; 15 | -------------------------------------------------------------------------------- /package.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "awesome-shadcn-ui", 3 | "version": "0.1.0", 4 | "private": true, 5 | "scripts": { 6 | "dev": "next dev", 7 | "build": "next build", 8 | "start": "next start", 9 | "lint": "next lint" 10 | }, 11 | "dependencies": { 12 | "@radix-ui/react-avatar": "^1.0.3", 13 | "@radix-ui/react-context-menu": "^2.1.4", 14 | "@radix-ui/react-dialog": "^1.0.4", 15 | "@radix-ui/react-dropdown-menu": "^2.0.5", 16 | "@radix-ui/react-icons": "^1.3.0", 17 | "@radix-ui/react-label": "^2.0.2", 18 | "@radix-ui/react-menubar": "^1.0.3", 19 | "@radix-ui/react-scroll-area": "^1.0.4", 20 | "@radix-ui/react-separator": "^1.0.3", 21 | "@radix-ui/react-slot": "^1.0.2", 22 | "@radix-ui/react-tabs": "^1.0.4", 23 | "@types/node": "20.4.4", 24 | "@types/react": "18.2.15", 25 | "@types/react-dom": "18.2.7", 26 | "autoprefixer": "10.4.14", 27 | "class-variance-authority": "^0.7.0", 28 | "clsx": "^2.0.0", 29 | "eslint": "8.45.0", 30 | "eslint-config-next": "13.4.12", 31 | "lucide-react": "^0.244.0", 32 | "next": "13.4.12", 33 | "next-themes": "^0.2.1", 34 | "postcss": "8.4.27", 35 | "react": "18.2.0", 36 | "react-dom": "18.2.0", 37 | "react-github-btn": "^1.4.0", 38 | "tailwind-merge": "^1.14.0", 39 | "tailwindcss": "3.3.3", 40 | "tailwindcss-animate": "^1.0.6", 41 | "typescript": "5.1.6" 42 | }, 43 | "devDependencies": { 44 | "@types/react-responsive-masonry": "^2.1.0", 45 | "prettier-plugin-tailwindcss": "^0.4.1" 46 | } 47 | } 48 | -------------------------------------------------------------------------------- /postcss.config.js: -------------------------------------------------------------------------------- 1 | module.exports = { 2 | plugins: { 3 | tailwindcss: {}, 4 | autoprefixer: {}, 5 | }, 6 | } 7 | -------------------------------------------------------------------------------- /public/7-spirits.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/lucky-chap/shadverse/bf04dff210e9ab56db6bdc9f670103fddb5bc686/public/7-spirits.png -------------------------------------------------------------------------------- /public/fonts/Inter-Black.ttf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/lucky-chap/shadverse/bf04dff210e9ab56db6bdc9f670103fddb5bc686/public/fonts/Inter-Black.ttf -------------------------------------------------------------------------------- /public/fonts/Inter-Bold.ttf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/lucky-chap/shadverse/bf04dff210e9ab56db6bdc9f670103fddb5bc686/public/fonts/Inter-Bold.ttf -------------------------------------------------------------------------------- /public/fonts/Inter-ExtraBold.ttf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/lucky-chap/shadverse/bf04dff210e9ab56db6bdc9f670103fddb5bc686/public/fonts/Inter-ExtraBold.ttf -------------------------------------------------------------------------------- /public/fonts/Inter-ExtraLight.ttf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/lucky-chap/shadverse/bf04dff210e9ab56db6bdc9f670103fddb5bc686/public/fonts/Inter-ExtraLight.ttf -------------------------------------------------------------------------------- /public/fonts/Inter-Light.ttf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/lucky-chap/shadverse/bf04dff210e9ab56db6bdc9f670103fddb5bc686/public/fonts/Inter-Light.ttf -------------------------------------------------------------------------------- /public/fonts/Inter-Medium.ttf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/lucky-chap/shadverse/bf04dff210e9ab56db6bdc9f670103fddb5bc686/public/fonts/Inter-Medium.ttf -------------------------------------------------------------------------------- /public/fonts/Inter-Regular.ttf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/lucky-chap/shadverse/bf04dff210e9ab56db6bdc9f670103fddb5bc686/public/fonts/Inter-Regular.ttf -------------------------------------------------------------------------------- /public/fonts/Inter-SemiBold.ttf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/lucky-chap/shadverse/bf04dff210e9ab56db6bdc9f670103fddb5bc686/public/fonts/Inter-SemiBold.ttf -------------------------------------------------------------------------------- /public/fonts/Inter-Thin.ttf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/lucky-chap/shadverse/bf04dff210e9ab56db6bdc9f670103fddb5bc686/public/fonts/Inter-Thin.ttf -------------------------------------------------------------------------------- /public/logo.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | -------------------------------------------------------------------------------- /public/next.svg: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /public/sample.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/lucky-chap/shadverse/bf04dff210e9ab56db6bdc9f670103fddb5bc686/public/sample.png -------------------------------------------------------------------------------- /public/vercel.svg: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /tailwind.config.js: -------------------------------------------------------------------------------- 1 | /** @type {import('tailwindcss').Config} */ 2 | module.exports = { 3 | darkMode: ["class"], 4 | content: [ 5 | './pages/**/*.{ts,tsx}', 6 | './components/**/*.{ts,tsx}', 7 | './app/**/*.{ts,tsx}', 8 | './src/**/*.{ts,tsx}', 9 | ], 10 | theme: { 11 | container: { 12 | center: true, 13 | padding: "2rem", 14 | screens: { 15 | "2xl": "1400px", 16 | }, 17 | }, 18 | extend: { 19 | colors: { 20 | border: "hsl(var(--border))", 21 | input: "hsl(var(--input))", 22 | ring: "hsl(var(--ring))", 23 | background: "hsl(var(--background))", 24 | foreground: "hsl(var(--foreground))", 25 | primary: { 26 | DEFAULT: "hsl(var(--primary))", 27 | foreground: "hsl(var(--primary-foreground))", 28 | }, 29 | secondary: { 30 | DEFAULT: "hsl(var(--secondary))", 31 | foreground: "hsl(var(--secondary-foreground))", 32 | }, 33 | destructive: { 34 | DEFAULT: "hsl(var(--destructive))", 35 | foreground: "hsl(var(--destructive-foreground))", 36 | }, 37 | muted: { 38 | DEFAULT: "hsl(var(--muted))", 39 | foreground: "hsl(var(--muted-foreground))", 40 | }, 41 | accent: { 42 | DEFAULT: "hsl(var(--accent))", 43 | foreground: "hsl(var(--accent-foreground))", 44 | }, 45 | popover: { 46 | DEFAULT: "hsl(var(--popover))", 47 | foreground: "hsl(var(--popover-foreground))", 48 | }, 49 | card: { 50 | DEFAULT: "hsl(var(--card))", 51 | foreground: "hsl(var(--card-foreground))", 52 | }, 53 | }, 54 | borderRadius: { 55 | lg: "var(--radius)", 56 | md: "calc(var(--radius) - 2px)", 57 | sm: "calc(var(--radius) - 4px)", 58 | }, 59 | keyframes: { 60 | "accordion-down": { 61 | from: { height: 0 }, 62 | to: { height: "var(--radix-accordion-content-height)" }, 63 | }, 64 | "accordion-up": { 65 | from: { height: "var(--radix-accordion-content-height)" }, 66 | to: { height: 0 }, 67 | }, 68 | }, 69 | animation: { 70 | "accordion-down": "accordion-down 0.2s ease-out", 71 | "accordion-up": "accordion-up 0.2s ease-out", 72 | }, 73 | }, 74 | }, 75 | plugins: [require("tailwindcss-animate")], 76 | } -------------------------------------------------------------------------------- /tsconfig.json: -------------------------------------------------------------------------------- 1 | { 2 | "compilerOptions": { 3 | "target": "es5", 4 | "lib": ["dom", "dom.iterable", "esnext"], 5 | "allowJs": true, 6 | "skipLibCheck": true, 7 | "strict": true, 8 | "forceConsistentCasingInFileNames": true, 9 | "noEmit": true, 10 | "esModuleInterop": true, 11 | "module": "esnext", 12 | "moduleResolution": "bundler", 13 | "resolveJsonModule": true, 14 | "isolatedModules": true, 15 | "jsx": "preserve", 16 | "incremental": true, 17 | "plugins": [ 18 | { 19 | "name": "next" 20 | } 21 | ], 22 | "paths": { 23 | "@/*": ["./*"] 24 | } 25 | }, 26 | "include": ["next-env.d.ts", "**/*.ts", "**/*.tsx", ".next/types/**/*.ts"], 27 | "exclude": ["node_modules"] 28 | } 29 | --------------------------------------------------------------------------------