From 764bfe2133ba6b44b11eb1672e1fea57672ebd64 Mon Sep 17 00:00:00 2001 From: rohansx Date: Thu, 7 Nov 2024 23:23:35 +0530 Subject: [PATCH] feat: initialize nextjs with shadcn ui --- .bolt/config.json | 3 + .bolt/ignore | 2 + .bolt/prompt | 11 + .eslintrc.json | 3 + .gitignore | 35 + app/globals.css | 82 + app/layout.tsx | 40 + app/page.tsx | 92 + bun.lockb | Bin 0 -> 115902 bytes components.json | 20 + components/navigation.tsx | 55 + components/theme-provider.tsx | 26 + components/ui/accordion.tsx | 58 + components/ui/alert-dialog.tsx | 141 + components/ui/alert.tsx | 59 + components/ui/aspect-ratio.tsx | 7 + components/ui/avatar.tsx | 50 + components/ui/badge.tsx | 36 + components/ui/breadcrumb.tsx | 115 + components/ui/button.tsx | 56 + components/ui/calendar.tsx | 66 + components/ui/card.tsx | 86 + components/ui/carousel.tsx | 262 ++ components/ui/chart.tsx | 365 ++ components/ui/checkbox.tsx | 30 + components/ui/collapsible.tsx | 11 + components/ui/command.tsx | 155 + components/ui/context-menu.tsx | 200 + components/ui/dialog.tsx | 122 + components/ui/drawer.tsx | 118 + components/ui/dropdown-menu.tsx | 200 + components/ui/form.tsx | 179 + components/ui/hover-card.tsx | 29 + components/ui/input-otp.tsx | 71 + components/ui/input.tsx | 25 + components/ui/label.tsx | 26 + components/ui/menubar.tsx | 236 + components/ui/navigation-menu.tsx | 128 + components/ui/pagination.tsx | 117 + components/ui/popover.tsx | 31 + components/ui/progress.tsx | 28 + components/ui/radio-group.tsx | 44 + components/ui/resizable.tsx | 45 + components/ui/scroll-area.tsx | 48 + components/ui/select.tsx | 160 + components/ui/separator.tsx | 31 + components/ui/sheet.tsx | 140 + components/ui/skeleton.tsx | 15 + components/ui/slider.tsx | 28 + components/ui/sonner.tsx | 31 + components/ui/switch.tsx | 29 + components/ui/table.tsx | 117 + components/ui/tabs.tsx | 55 + components/ui/textarea.tsx | 24 + components/ui/toast.tsx | 129 + components/ui/toaster.tsx | 35 + components/ui/toggle-group.tsx | 61 + components/ui/toggle.tsx | 45 + components/ui/tooltip.tsx | 30 + hooks/use-toast.ts | 191 + lib/utils.ts | 6 + next.config.js | 10 + package-lock.json | 7119 +++++++++++++++++++++++++++++ package.json | 61 + postcss.config.js | 6 + tailwind.config.ts | 90 + tsconfig.json | 27 + 67 files changed, 11953 insertions(+) create mode 100644 .bolt/config.json create mode 100644 .bolt/ignore create mode 100644 .bolt/prompt create mode 100644 .eslintrc.json create mode 100644 .gitignore create mode 100644 app/globals.css create mode 100644 app/layout.tsx create mode 100644 app/page.tsx create mode 100755 bun.lockb create mode 100644 components.json create mode 100644 components/navigation.tsx create mode 100644 components/theme-provider.tsx create mode 100644 components/ui/accordion.tsx create mode 100644 components/ui/alert-dialog.tsx create mode 100644 components/ui/alert.tsx create mode 100644 components/ui/aspect-ratio.tsx create mode 100644 components/ui/avatar.tsx create mode 100644 components/ui/badge.tsx create mode 100644 components/ui/breadcrumb.tsx create mode 100644 components/ui/button.tsx create mode 100644 components/ui/calendar.tsx create mode 100644 components/ui/card.tsx create mode 100644 components/ui/carousel.tsx create mode 100644 components/ui/chart.tsx create mode 100644 components/ui/checkbox.tsx create mode 100644 components/ui/collapsible.tsx create mode 100644 components/ui/command.tsx create mode 100644 components/ui/context-menu.tsx create mode 100644 components/ui/dialog.tsx create mode 100644 components/ui/drawer.tsx create mode 100644 components/ui/dropdown-menu.tsx create mode 100644 components/ui/form.tsx create mode 100644 components/ui/hover-card.tsx create mode 100644 components/ui/input-otp.tsx create mode 100644 components/ui/input.tsx create mode 100644 components/ui/label.tsx create mode 100644 components/ui/menubar.tsx create mode 100644 components/ui/navigation-menu.tsx create mode 100644 components/ui/pagination.tsx create mode 100644 components/ui/popover.tsx create mode 100644 components/ui/progress.tsx create mode 100644 components/ui/radio-group.tsx create mode 100644 components/ui/resizable.tsx create mode 100644 components/ui/scroll-area.tsx create mode 100644 components/ui/select.tsx create mode 100644 components/ui/separator.tsx create mode 100644 components/ui/sheet.tsx create mode 100644 components/ui/skeleton.tsx create mode 100644 components/ui/slider.tsx create mode 100644 components/ui/sonner.tsx create mode 100644 components/ui/switch.tsx create mode 100644 components/ui/table.tsx create mode 100644 components/ui/tabs.tsx create mode 100644 components/ui/textarea.tsx create mode 100644 components/ui/toast.tsx create mode 100644 components/ui/toaster.tsx create mode 100644 components/ui/toggle-group.tsx create mode 100644 components/ui/toggle.tsx create mode 100644 components/ui/tooltip.tsx create mode 100644 hooks/use-toast.ts create mode 100644 lib/utils.ts create mode 100644 next.config.js create mode 100644 package-lock.json create mode 100644 package.json create mode 100644 postcss.config.js create mode 100644 tailwind.config.ts create mode 100644 tsconfig.json diff --git a/.bolt/config.json b/.bolt/config.json new file mode 100644 index 0000000..f236591 --- /dev/null +++ b/.bolt/config.json @@ -0,0 +1,3 @@ +{ + "template": "nextjs-shadcn" +} diff --git a/.bolt/ignore b/.bolt/ignore new file mode 100644 index 0000000..bbe3a15 --- /dev/null +++ b/.bolt/ignore @@ -0,0 +1,2 @@ +components/ui/* +hooks/use-toast.ts diff --git a/.bolt/prompt b/.bolt/prompt new file mode 100644 index 0000000..3d0f7d3 --- /dev/null +++ b/.bolt/prompt @@ -0,0 +1,11 @@ +For all designs I ask you to make, have them be beautiful, not cookie cutter. Make webpages that are fully featured and worthy for production. + +When using client-side hooks (useState and useEffect) in a component that's being treated as a Server Component by Next.js, always add the "use client" directive at the top of the file. + +Do not write code that will trigger this error: "Warning: Extra attributes from the server: %s%s""class,style" + +By default, this template supports JSX syntax with Tailwind CSS classes, the shadcn/ui library, React hooks, and Lucide React for icons. Do not install other packages for UI themes, icons, etc unless absolutely necessary or I request them. + +Use icons from lucide-react for logos. + +Use stock photos from unsplash where appropriate, only valid URLs you know exist. diff --git a/.eslintrc.json b/.eslintrc.json new file mode 100644 index 0000000..bffb357 --- /dev/null +++ b/.eslintrc.json @@ -0,0 +1,3 @@ +{ + "extends": "next/core-web-vitals" +} diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..8f322f0 --- /dev/null +++ b/.gitignore @@ -0,0 +1,35 @@ +# See https://help.github.com/articles/ignoring-files/ for more about ignoring files. + +# dependencies +/node_modules +/.pnp +.pnp.js + +# testing +/coverage + +# next.js +/.next/ +/out/ + +# production +/build + +# misc +.DS_Store +*.pem + +# debug +npm-debug.log* +yarn-debug.log* +yarn-error.log* + +# local env files +.env*.local + +# vercel +.vercel + +# typescript +*.tsbuildinfo +next-env.d.ts diff --git a/app/globals.css b/app/globals.css new file mode 100644 index 0000000..20b1c1d --- /dev/null +++ b/app/globals.css @@ -0,0 +1,82 @@ +@tailwind base; +@tailwind components; +@tailwind utilities; + +:root { + --foreground-rgb: 0, 0, 0; + --background-start-rgb: 214, 219, 220; + --background-end-rgb: 255, 255, 255; +} + +@media (prefers-color-scheme: dark) { + :root { + --foreground-rgb: 255, 255, 255; + --background-start-rgb: 0, 0, 0; + --background-end-rgb: 0, 0, 0; + } +} + +@layer base { + :root { + --background: 0 0% 100%; + --foreground: 0 0% 3.9%; + --card: 0 0% 100%; + --card-foreground: 0 0% 3.9%; + --popover: 0 0% 100%; + --popover-foreground: 0 0% 3.9%; + --primary: 0 0% 9%; + --primary-foreground: 0 0% 98%; + --secondary: 0 0% 96.1%; + --secondary-foreground: 0 0% 9%; + --muted: 0 0% 96.1%; + --muted-foreground: 0 0% 45.1%; + --accent: 0 0% 96.1%; + --accent-foreground: 0 0% 9%; + --destructive: 0 84.2% 60.2%; + --destructive-foreground: 0 0% 98%; + --border: 0 0% 89.8%; + --input: 0 0% 89.8%; + --ring: 0 0% 3.9%; + --chart-1: 12 76% 61%; + --chart-2: 173 58% 39%; + --chart-3: 197 37% 24%; + --chart-4: 43 74% 66%; + --chart-5: 27 87% 67%; + --radius: 0.5rem; + } + .dark { + --background: 0 0% 3.9%; + --foreground: 0 0% 98%; + --card: 0 0% 3.9%; + --card-foreground: 0 0% 98%; + --popover: 0 0% 3.9%; + --popover-foreground: 0 0% 98%; + --primary: 0 0% 98%; + --primary-foreground: 0 0% 9%; + --secondary: 0 0% 14.9%; + --secondary-foreground: 0 0% 98%; + --muted: 0 0% 14.9%; + --muted-foreground: 0 0% 63.9%; + --accent: 0 0% 14.9%; + --accent-foreground: 0 0% 98%; + --destructive: 0 62.8% 30.6%; + --destructive-foreground: 0 0% 98%; + --border: 0 0% 14.9%; + --input: 0 0% 14.9%; + --ring: 0 0% 83.1%; + --chart-1: 220 70% 50%; + --chart-2: 160 60% 45%; + --chart-3: 30 80% 55%; + --chart-4: 280 65% 60%; + --chart-5: 340 75% 55%; + } +} + +@layer base { + * { + @apply border-border; + } + body { + @apply bg-background text-foreground; + } +} diff --git a/app/layout.tsx b/app/layout.tsx new file mode 100644 index 0000000..7d12453 --- /dev/null +++ b/app/layout.tsx @@ -0,0 +1,40 @@ +import './globals.css'; +import type { Metadata } from 'next'; +import { Inter } from 'next/font/google'; +import { ThemeProvider } from '@/components/theme-provider'; +import { Navigation } from '@/components/navigation'; +import { Toaster } from '@/components/ui/toaster'; + +const inter = Inter({ subsets: ['latin'] }); + +export const metadata: Metadata = { + title: 'SyncX - Modern Documentation Platform', + description: 'Open-source documentation platform for modern organizations', +}; + +export default function RootLayout({ + children, +}: { + children: React.ReactNode; +}) { + return ( + + + +
+ +
+ {children} +
+
+ +
+ + + ); +} \ No newline at end of file diff --git a/app/page.tsx b/app/page.tsx new file mode 100644 index 0000000..0a2b8b5 --- /dev/null +++ b/app/page.tsx @@ -0,0 +1,92 @@ +import { Button } from '@/components/ui/button'; +import { Card } from '@/components/ui/card'; +import { FileText, Users2, BookOpen, GitBranch } from 'lucide-react'; +import Link from 'next/link'; + +export default function Home() { + return ( +
+
+

Welcome to SyncX

+

+ Your team's central hub for documentation and knowledge sharing +

+
+ +
+ + +

Documents

+

+ Create and manage your team's documentation +

+ +
+ + + +

Teams

+

+ Collaborate with your team members +

+ +
+ + + +

Templates

+

+ Start with pre-built document templates +

+ +
+ + + +

Version Control

+

+ Track changes and manage versions +

+ +
+
+ +
+

Recent Activity

+
+ {/* Placeholder for recent activity - will be dynamic in the full implementation */} + +
+
+ +
+
+

API Documentation Updated

+

Updated by John Doe • 2 hours ago

+
+
+
+ +
+
+ +
+
+

New Team Member Added

+

Jane Smith joined Engineering • 5 hours ago

+
+
+
+
+
+
+ ); +} \ No newline at end of file diff --git a/bun.lockb b/bun.lockb new file mode 100755 index 0000000000000000000000000000000000000000..245c748923743fc81bfb1bcfd4b26f5e9f2ff2af GIT binary patch literal 115902 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

$bR;g*Fhda{@t2DOHRuQZ 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 B)dK(k literal 0 HcmV?d00001 diff --git a/components.json b/components.json new file mode 100644 index 0000000..c597462 --- /dev/null +++ b/components.json @@ -0,0 +1,20 @@ +{ + "$schema": "https://ui.shadcn.com/schema.json", + "style": "default", + "rsc": true, + "tsx": true, + "tailwind": { + "config": "tailwind.config.ts", + "css": "app/globals.css", + "baseColor": "neutral", + "cssVariables": true, + "prefix": "" + }, + "aliases": { + "components": "@/components", + "utils": "@/lib/utils", + "ui": "@/components/ui", + "lib": "@/lib", + "hooks": "@/hooks" + } +} diff --git a/components/navigation.tsx b/components/navigation.tsx new file mode 100644 index 0000000..e377bc0 --- /dev/null +++ b/components/navigation.tsx @@ -0,0 +1,55 @@ +import { BookOpen, FileText, Home, Search, Settings, Users2 } from 'lucide-react'; +import Link from 'next/link'; +import { Button } from '@/components/ui/button'; +import { Input } from '@/components/ui/input'; + +export function Navigation() { + return ( +

+
+ + + SyncX + +
+ +
+
+ + +
+
+ + +
+ ); +} \ No newline at end of file diff --git a/components/theme-provider.tsx b/components/theme-provider.tsx new file mode 100644 index 0000000..85b6ca9 --- /dev/null +++ b/components/theme-provider.tsx @@ -0,0 +1,26 @@ +import { createContext, useContext, useEffect, useState } from "react" +import { useTheme as useNextTheme } from "next-themes" + +type Theme = "dark" | "light" | "system" + +type ThemeProviderProps = { + children: React.ReactNode + defaultTheme?: Theme + storageKey?: string + enableSystem?: boolean + disableTransitionOnChange?: boolean + attribute?: string +} + +export function ThemeProvider({ + children, + defaultTheme = "system", + storageKey = "ui-theme", + ...props +}: ThemeProviderProps) { + return ( +
+ {children} +
+ ) +} \ No newline at end of file diff --git a/components/ui/accordion.tsx b/components/ui/accordion.tsx new file mode 100644 index 0000000..84bf2eb --- /dev/null +++ b/components/ui/accordion.tsx @@ -0,0 +1,58 @@ +'use client'; + +import * as React from 'react'; +import * as AccordionPrimitive from '@radix-ui/react-accordion'; +import { ChevronDown } from 'lucide-react'; + +import { cn } from '@/lib/utils'; + +const Accordion = AccordionPrimitive.Root; + +const AccordionItem = React.forwardRef< + React.ElementRef, + React.ComponentPropsWithoutRef +>(({ className, ...props }, ref) => ( + +)); +AccordionItem.displayName = 'AccordionItem'; + +const AccordionTrigger = React.forwardRef< + React.ElementRef, + React.ComponentPropsWithoutRef +>(({ className, children, ...props }, ref) => ( + + svg]:rotate-180', + className + )} + {...props} + > + {children} + + + +)); +AccordionTrigger.displayName = AccordionPrimitive.Trigger.displayName; + +const AccordionContent = React.forwardRef< + React.ElementRef, + React.ComponentPropsWithoutRef +>(({ className, children, ...props }, ref) => ( + +
{children}
+
+)); + +AccordionContent.displayName = AccordionPrimitive.Content.displayName; + +export { Accordion, AccordionItem, AccordionTrigger, AccordionContent }; diff --git a/components/ui/alert-dialog.tsx b/components/ui/alert-dialog.tsx new file mode 100644 index 0000000..5cba559 --- /dev/null +++ b/components/ui/alert-dialog.tsx @@ -0,0 +1,141 @@ +'use client'; + +import * as React from 'react'; +import * as AlertDialogPrimitive from '@radix-ui/react-alert-dialog'; + +import { cn } from '@/lib/utils'; +import { buttonVariants } from '@/components/ui/button'; + +const AlertDialog = AlertDialogPrimitive.Root; + +const AlertDialogTrigger = AlertDialogPrimitive.Trigger; + +const AlertDialogPortal = AlertDialogPrimitive.Portal; + +const AlertDialogOverlay = React.forwardRef< + React.ElementRef, + React.ComponentPropsWithoutRef +>(({ className, ...props }, ref) => ( + +)); +AlertDialogOverlay.displayName = AlertDialogPrimitive.Overlay.displayName; + +const AlertDialogContent = React.forwardRef< + React.ElementRef, + React.ComponentPropsWithoutRef +>(({ className, ...props }, ref) => ( + + + + +)); +AlertDialogContent.displayName = AlertDialogPrimitive.Content.displayName; + +const AlertDialogHeader = ({ + className, + ...props +}: React.HTMLAttributes) => ( +
+); +AlertDialogHeader.displayName = 'AlertDialogHeader'; + +const AlertDialogFooter = ({ + className, + ...props +}: React.HTMLAttributes) => ( +
+); +AlertDialogFooter.displayName = 'AlertDialogFooter'; + +const AlertDialogTitle = React.forwardRef< + React.ElementRef, + React.ComponentPropsWithoutRef +>(({ className, ...props }, ref) => ( + +)); +AlertDialogTitle.displayName = AlertDialogPrimitive.Title.displayName; + +const AlertDialogDescription = React.forwardRef< + React.ElementRef, + React.ComponentPropsWithoutRef +>(({ className, ...props }, ref) => ( + +)); +AlertDialogDescription.displayName = + AlertDialogPrimitive.Description.displayName; + +const AlertDialogAction = React.forwardRef< + React.ElementRef, + React.ComponentPropsWithoutRef +>(({ className, ...props }, ref) => ( + +)); +AlertDialogAction.displayName = AlertDialogPrimitive.Action.displayName; + +const AlertDialogCancel = React.forwardRef< + React.ElementRef, + React.ComponentPropsWithoutRef +>(({ className, ...props }, ref) => ( + +)); +AlertDialogCancel.displayName = AlertDialogPrimitive.Cancel.displayName; + +export { + AlertDialog, + AlertDialogPortal, + AlertDialogOverlay, + AlertDialogTrigger, + AlertDialogContent, + AlertDialogHeader, + AlertDialogFooter, + AlertDialogTitle, + AlertDialogDescription, + AlertDialogAction, + AlertDialogCancel, +}; diff --git a/components/ui/alert.tsx b/components/ui/alert.tsx new file mode 100644 index 0000000..d2b59cc --- /dev/null +++ b/components/ui/alert.tsx @@ -0,0 +1,59 @@ +import * as React from 'react'; +import { cva, type VariantProps } from 'class-variance-authority'; + +import { cn } from '@/lib/utils'; + +const alertVariants = cva( + 'relative w-full rounded-lg border p-4 [&>svg~*]:pl-7 [&>svg+div]:translate-y-[-3px] [&>svg]:absolute [&>svg]:left-4 [&>svg]:top-4 [&>svg]:text-foreground', + { + variants: { + variant: { + default: 'bg-background text-foreground', + destructive: + 'border-destructive/50 text-destructive dark:border-destructive [&>svg]:text-destructive', + }, + }, + defaultVariants: { + variant: 'default', + }, + } +); + +const Alert = React.forwardRef< + HTMLDivElement, + React.HTMLAttributes & VariantProps +>(({ className, variant, ...props }, ref) => ( +
+)); +Alert.displayName = 'Alert'; + +const AlertTitle = React.forwardRef< + HTMLParagraphElement, + React.HTMLAttributes +>(({ className, ...props }, ref) => ( +
+)); +AlertTitle.displayName = 'AlertTitle'; + +const AlertDescription = React.forwardRef< + HTMLParagraphElement, + React.HTMLAttributes +>(({ className, ...props }, ref) => ( +
+)); +AlertDescription.displayName = 'AlertDescription'; + +export { Alert, AlertTitle, AlertDescription }; diff --git a/components/ui/aspect-ratio.tsx b/components/ui/aspect-ratio.tsx new file mode 100644 index 0000000..aaabffb --- /dev/null +++ b/components/ui/aspect-ratio.tsx @@ -0,0 +1,7 @@ +'use client'; + +import * as AspectRatioPrimitive from '@radix-ui/react-aspect-ratio'; + +const AspectRatio = AspectRatioPrimitive.Root; + +export { AspectRatio }; diff --git a/components/ui/avatar.tsx b/components/ui/avatar.tsx new file mode 100644 index 0000000..1346957 --- /dev/null +++ b/components/ui/avatar.tsx @@ -0,0 +1,50 @@ +'use client'; + +import * as React from 'react'; +import * as AvatarPrimitive from '@radix-ui/react-avatar'; + +import { cn } from '@/lib/utils'; + +const Avatar = React.forwardRef< + React.ElementRef, + React.ComponentPropsWithoutRef +>(({ className, ...props }, ref) => ( + +)); +Avatar.displayName = AvatarPrimitive.Root.displayName; + +const AvatarImage = React.forwardRef< + React.ElementRef, + React.ComponentPropsWithoutRef +>(({ className, ...props }, ref) => ( + +)); +AvatarImage.displayName = AvatarPrimitive.Image.displayName; + +const AvatarFallback = React.forwardRef< + React.ElementRef, + React.ComponentPropsWithoutRef +>(({ className, ...props }, ref) => ( + +)); +AvatarFallback.displayName = AvatarPrimitive.Fallback.displayName; + +export { Avatar, AvatarImage, AvatarFallback }; diff --git a/components/ui/badge.tsx b/components/ui/badge.tsx new file mode 100644 index 0000000..2eb790a --- /dev/null +++ b/components/ui/badge.tsx @@ -0,0 +1,36 @@ +import * as React from 'react'; +import { cva, type VariantProps } from 'class-variance-authority'; + +import { cn } from '@/lib/utils'; + +const badgeVariants = cva( + 'inline-flex items-center rounded-full border px-2.5 py-0.5 text-xs font-semibold transition-colors focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2', + { + variants: { + variant: { + default: + 'border-transparent bg-primary text-primary-foreground hover:bg-primary/80', + secondary: + 'border-transparent bg-secondary text-secondary-foreground hover:bg-secondary/80', + destructive: + 'border-transparent bg-destructive text-destructive-foreground hover:bg-destructive/80', + outline: 'text-foreground', + }, + }, + defaultVariants: { + variant: 'default', + }, + } +); + +export interface BadgeProps + extends React.HTMLAttributes, + VariantProps {} + +function Badge({ className, variant, ...props }: BadgeProps) { + return ( +
+ ); +} + +export { Badge, badgeVariants }; diff --git a/components/ui/breadcrumb.tsx b/components/ui/breadcrumb.tsx new file mode 100644 index 0000000..8b62197 --- /dev/null +++ b/components/ui/breadcrumb.tsx @@ -0,0 +1,115 @@ +import * as React from 'react'; +import { Slot } from '@radix-ui/react-slot'; +import { ChevronRight, MoreHorizontal } from 'lucide-react'; + +import { cn } from '@/lib/utils'; + +const Breadcrumb = React.forwardRef< + HTMLElement, + React.ComponentPropsWithoutRef<'nav'> & { + separator?: React.ReactNode; + } +>(({ ...props }, ref) =>