diff --git a/components.json b/components.json
new file mode 100644
index 0000000..299ea38
--- /dev/null
+++ b/components.json
@@ -0,0 +1,21 @@
+{
+ "$schema": "https://ui.shadcn.com/schema.json",
+ "style": "new-york",
+ "rsc": false,
+ "tsx": true,
+ "tailwind": {
+ "config": "tailwind.config.js",
+ "css": "src/index.css",
+ "baseColor": "slate",
+ "cssVariables": true,
+ "prefix": ""
+ },
+ "aliases": {
+ "components": "@/components",
+ "utils": "@/lib/utils",
+ "ui": "@/components/ui",
+ "lib": "@/lib",
+ "hooks": "@/hooks"
+ },
+ "iconLibrary": "lucide"
+}
\ No newline at end of file
diff --git a/index.html b/index.html
index e4b78ea..c634f51 100644
--- a/index.html
+++ b/index.html
@@ -2,11 +2,11 @@
-
+
- Vite + React + TS
+ Github Tracker | Track your GitHub
-
+
diff --git a/package.json b/package.json
index 5f47253..72c3bde 100644
--- a/package.json
+++ b/package.json
@@ -14,17 +14,29 @@
"@emotion/styled": "^11.11.0",
"@mui/icons-material": "^5.15.6",
"@mui/material": "^5.15.6",
+ "@radix-ui/react-dialog": "^1.1.2",
+ "@radix-ui/react-label": "^2.1.0",
+ "@radix-ui/react-separator": "^1.1.0",
+ "@radix-ui/react-slot": "^1.1.0",
+ "@tabler/icons-react": "^3.24.0",
"@vitejs/plugin-react": "^4.3.3",
"axios": "^1.7.7",
+ "class-variance-authority": "^0.7.1",
+ "clsx": "^2.1.1",
+ "lucide-react": "^0.465.0",
+ "next-themes": "^0.4.3",
"octokit": "^4.0.2",
"react": "^18.3.1",
"react-dom": "^18.3.1",
"react-hot-toast": "^2.4.1",
"react-icons": "^5.3.0",
- "react-router-dom": "^6.28.0"
+ "react-router-dom": "^6.28.0",
+ "tailwind-merge": "^2.5.5",
+ "tailwindcss-animate": "^1.0.7"
},
"devDependencies": {
"@eslint/js": "^9.13.0",
+ "@types/node": "^22.10.1",
"@types/react": "^18.3.12",
"@types/react-dom": "^18.3.1",
"@vitejs/plugin-react-swc": "^3.5.0",
diff --git a/public/favicon.ico b/public/favicon.ico
new file mode 100644
index 0000000..57c30ca
Binary files /dev/null and b/public/favicon.ico differ
diff --git a/public/hero.png b/public/hero.png
new file mode 100644
index 0000000..7e60d63
Binary files /dev/null and b/public/hero.png differ
diff --git a/public/hero2.png b/public/hero2.png
new file mode 100644
index 0000000..3fc333f
Binary files /dev/null and b/public/hero2.png differ
diff --git a/public/logo.png b/public/logo.png
new file mode 100644
index 0000000..77a7fac
Binary files /dev/null and b/public/logo.png differ
diff --git a/public/vite.svg b/public/vite.svg
deleted file mode 100644
index e7b8dfb..0000000
--- a/public/vite.svg
+++ /dev/null
@@ -1 +0,0 @@
-
\ No newline at end of file
diff --git a/src/App.css b/src/App.css
deleted file mode 100644
index b9d355d..0000000
--- a/src/App.css
+++ /dev/null
@@ -1,42 +0,0 @@
-#root {
- max-width: 1280px;
- margin: 0 auto;
- padding: 2rem;
- text-align: center;
-}
-
-.logo {
- height: 6em;
- padding: 1.5em;
- will-change: filter;
- transition: filter 300ms;
-}
-.logo:hover {
- filter: drop-shadow(0 0 2em #646cffaa);
-}
-.logo.react:hover {
- filter: drop-shadow(0 0 2em #61dafbaa);
-}
-
-@keyframes logo-spin {
- from {
- transform: rotate(0deg);
- }
- to {
- transform: rotate(360deg);
- }
-}
-
-@media (prefers-reduced-motion: no-preference) {
- a:nth-of-type(2) .logo {
- animation: logo-spin infinite 20s linear;
- }
-}
-
-.card {
- padding: 2em;
-}
-
-.read-the-docs {
- color: #888;
-}
diff --git a/src/App.tsx b/src/App.tsx
index 07d5f02..32bff70 100644
--- a/src/App.tsx
+++ b/src/App.tsx
@@ -1,9 +1,8 @@
-
-import Navbar from "./components/Navbar";
-import Footer from "./components/Footer";
import ScrollProgressBar from './components/ScrollProgressBar';
import Router from "./Routes/Router";
+import Header from "./components/Header";
+import Footer_ from "./components/footer2";
function App() {
return (
@@ -12,7 +11,7 @@ function App() {
{/* Navbar */}
-
+
{/* Main content */}
@@ -20,7 +19,7 @@ function App() {
{/* Footer */}
-
+
);
diff --git a/src/Routes/Router.tsx b/src/Routes/Router.tsx
index 5307a85..4ee76fd 100644
--- a/src/Routes/Router.tsx
+++ b/src/Routes/Router.tsx
@@ -1,15 +1,16 @@
-import { Navigate, Route, Routes } from "react-router-dom";
+import { Route, Routes } from "react-router-dom";
import Home from "../pages/Home/Home"; // Import the Home component
import About from "../pages/About/About"; // Import the About component
import Contact from "../pages/Contact/Contact"; // Import the Contact component
import Contributors from "../pages/Contributors/Contributors";
+import Landing from "../pages/home";
const Router = () => {
return (
{/* Redirect from root (/) to the home page */}
- } />
+ } />
} />
} />
} />
diff --git a/src/assets/react.svg b/src/assets/react.svg
deleted file mode 100644
index 6c87de9..0000000
--- a/src/assets/react.svg
+++ /dev/null
@@ -1 +0,0 @@
-
\ No newline at end of file
diff --git a/src/components/Header.tsx b/src/components/Header.tsx
new file mode 100644
index 0000000..2b70d17
--- /dev/null
+++ b/src/components/Header.tsx
@@ -0,0 +1,131 @@
+import { Link, useLocation } from "react-router-dom";
+import { Separator } from "./ui/separator";
+import { Button } from "./ui/button";
+import { Menu, Sun } from "lucide-react";
+import {
+ Sheet,
+ SheetContent,
+ SheetHeader,
+ SheetTitle,
+ SheetTrigger,
+} from "./ui/sheet";
+import { useEffect, useState } from "react";
+
+const Header = () => {
+ const [scrolled, setScrolled] = useState(false);
+ const location = useLocation();
+ const path = location.pathname;
+ useEffect(() => {
+ const handleScroll = () => {
+ if (window.scrollY > 0) {
+ setScrolled(true);
+ } else {
+ setScrolled(false);
+ }
+ };
+ window.addEventListener("scroll", handleScroll);
+ return () => window.removeEventListener("scroll", handleScroll);
+ });
+ return (
+
+
+
+
+ GitMonitor
+
+
+
+ {links.map((link, idx) => (
+
+
+ {link.label}
+
+ {idx !== links.length - 1 && (
+
+ )}
+
+ ))}
+
+
+
+
+
+
+
+
+ Menu
+
+
+ {links.map((link) => (
+
+ {link.label}
+
+ ))}
+
+
+
+
+
+
+
+
+
+ Login
+
+
+
+
+
+ );
+};
+
+export default Header;
+
+const links = [
+ {
+ label: "Home",
+ href: "/home",
+ },
+ {
+ label: "About",
+ href: "/about",
+ },
+ {
+ label: "Contact",
+ href: "/contact",
+ },
+ {
+ label: "Contributors",
+ href: "/contributors",
+ },
+];
diff --git a/src/components/ScrollProgressBar.tsx b/src/components/ScrollProgressBar.tsx
index bff96ef..e2336a9 100644
--- a/src/components/ScrollProgressBar.tsx
+++ b/src/components/ScrollProgressBar.tsx
@@ -1,4 +1,4 @@
-import React, { useEffect, useState } from "react";
+import { useEffect, useState } from "react";
const ScrollProgressBar = () => {
const [scrollWidth, setScrollWidth] = useState(0);
@@ -57,7 +57,7 @@ const ScrollProgressBar = () => {
left: 0,
width: `${scrollWidth}%`,
height: "5px", // Thicker line for scroll progress
- backgroundColor: "grey",
+ backgroundColor: "teal",
zIndex: 100,
transition: "width 0.2s ease",
}}
diff --git a/src/components/footer2.tsx b/src/components/footer2.tsx
new file mode 100644
index 0000000..9f99039
--- /dev/null
+++ b/src/components/footer2.tsx
@@ -0,0 +1,87 @@
+import { Link } from "react-router-dom";
+
+const Footer_ = () => {
+ return (
+
+ );
+};
+
+export default Footer_;
diff --git a/src/components/landing/hero.tsx b/src/components/landing/hero.tsx
new file mode 100644
index 0000000..f79d3ef
--- /dev/null
+++ b/src/components/landing/hero.tsx
@@ -0,0 +1,41 @@
+import { Link } from "react-router-dom";
+import { Button } from "../ui/button";
+
+const Hero = () => {
+ return (
+
+
+ Stay Ahead with GitMonitor {" "}
+ Your Ultimate GitHub Tracking Companion
+
+
+
+ Track repositories, monitor contributions, and analyze your projects—all
+ in one place.
+
+
+ Get Started for Free
+
+
+
+
+
+
+ );
+};
+
+export default Hero;
diff --git a/src/components/landing/main.tsx b/src/components/landing/main.tsx
new file mode 100644
index 0000000..650f152
--- /dev/null
+++ b/src/components/landing/main.tsx
@@ -0,0 +1,67 @@
+import { features, steps } from "@/lib/data";
+import { Card } from "../ui/card";
+
+const Main = () => {
+ return (
+
+
+ Why Choose GitMonitor ?
+
+
+ GitHub is where innovation happens, and Git
+ Monitor ensures you never miss a
+ beat. From monitoring your favorite repositories to gaining valuable
+ insights into contributions, Git
+ Monitor is your go-to solution for
+ everything GitHub.
+
+
+
+
+ {features.map((feature, index) => (
+
+
+
+
+ {feature.title}
+
+
{feature.description}
+
+
+ ))}
+
+
+
+
+
+
+
+
+ How It Works
+
+
+ {steps.map((step, index) => (
+
+
+ {index + 1}
+
+
+ {step.title}
+
+
{step.description}
+
+ ))}
+
+
+
+
+ );
+};
+
+export default Main;
diff --git a/src/components/ui/button.tsx b/src/components/ui/button.tsx
new file mode 100644
index 0000000..65d4fcd
--- /dev/null
+++ b/src/components/ui/button.tsx
@@ -0,0 +1,57 @@
+import * as React from "react"
+import { Slot } from "@radix-ui/react-slot"
+import { cva, type VariantProps } from "class-variance-authority"
+
+import { cn } from "@/lib/utils"
+
+const buttonVariants = cva(
+ "inline-flex items-center justify-center gap-2 whitespace-nowrap 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 [&_svg]:pointer-events-none [&_svg]:size-4 [&_svg]:shrink-0",
+ {
+ variants: {
+ variant: {
+ default:
+ "bg-primary text-primary-foreground shadow hover:bg-primary/90",
+ destructive:
+ "bg-destructive text-destructive-foreground shadow-sm hover:bg-destructive/90",
+ outline:
+ "border border-input bg-background shadow-sm hover:bg-accent hover:text-accent-foreground",
+ secondary:
+ "bg-secondary text-secondary-foreground shadow-sm hover:bg-secondary/80",
+ ghost: "hover:bg-accent hover:text-accent-foreground",
+ link: "text-primary underline-offset-4 hover:underline",
+ },
+ size: {
+ default: "h-9 px-4 py-2",
+ sm: "h-8 rounded-md px-3 text-xs",
+ lg: "h-10 rounded-md px-8",
+ icon: "h-9 w-9",
+ },
+ },
+ defaultVariants: {
+ variant: "default",
+ size: "default",
+ },
+ }
+)
+
+export interface ButtonProps
+ extends React.ButtonHTMLAttributes,
+ VariantProps {
+ asChild?: boolean
+}
+
+const Button = React.forwardRef(
+ ({ className, variant, size, asChild = false, ...props }, ref) => {
+ const Comp = asChild ? Slot : "button"
+ return (
+
+ )
+ }
+)
+Button.displayName = "Button"
+
+export { Button, buttonVariants }
diff --git a/src/components/ui/card.tsx b/src/components/ui/card.tsx
new file mode 100644
index 0000000..cabfbfc
--- /dev/null
+++ b/src/components/ui/card.tsx
@@ -0,0 +1,76 @@
+import * as React from "react"
+
+import { cn } from "@/lib/utils"
+
+const Card = React.forwardRef<
+ HTMLDivElement,
+ React.HTMLAttributes
+>(({ className, ...props }, ref) => (
+
+))
+Card.displayName = "Card"
+
+const CardHeader = React.forwardRef<
+ HTMLDivElement,
+ React.HTMLAttributes
+>(({ className, ...props }, ref) => (
+
+))
+CardHeader.displayName = "CardHeader"
+
+const CardTitle = React.forwardRef<
+ HTMLDivElement,
+ React.HTMLAttributes
+>(({ className, ...props }, ref) => (
+
+))
+CardTitle.displayName = "CardTitle"
+
+const CardDescription = React.forwardRef<
+ HTMLDivElement,
+ React.HTMLAttributes
+>(({ className, ...props }, ref) => (
+
+))
+CardDescription.displayName = "CardDescription"
+
+const CardContent = React.forwardRef<
+ HTMLDivElement,
+ React.HTMLAttributes
+>(({ className, ...props }, ref) => (
+
+))
+CardContent.displayName = "CardContent"
+
+const CardFooter = React.forwardRef<
+ HTMLDivElement,
+ React.HTMLAttributes
+>(({ className, ...props }, ref) => (
+
+))
+CardFooter.displayName = "CardFooter"
+
+export { Card, CardHeader, CardFooter, CardTitle, CardDescription, CardContent }
diff --git a/src/components/ui/input.tsx b/src/components/ui/input.tsx
new file mode 100644
index 0000000..69b64fb
--- /dev/null
+++ b/src/components/ui/input.tsx
@@ -0,0 +1,22 @@
+import * as React from "react"
+
+import { cn } from "@/lib/utils"
+
+const Input = React.forwardRef>(
+ ({ className, type, ...props }, ref) => {
+ return (
+
+ )
+ }
+)
+Input.displayName = "Input"
+
+export { Input }
diff --git a/src/components/ui/label.tsx b/src/components/ui/label.tsx
new file mode 100644
index 0000000..683faa7
--- /dev/null
+++ b/src/components/ui/label.tsx
@@ -0,0 +1,24 @@
+import * as React from "react"
+import * as LabelPrimitive from "@radix-ui/react-label"
+import { cva, type VariantProps } from "class-variance-authority"
+
+import { cn } from "@/lib/utils"
+
+const labelVariants = cva(
+ "text-sm font-medium leading-none peer-disabled:cursor-not-allowed peer-disabled:opacity-70"
+)
+
+const Label = React.forwardRef<
+ React.ElementRef,
+ React.ComponentPropsWithoutRef &
+ VariantProps
+>(({ className, ...props }, ref) => (
+
+))
+Label.displayName = LabelPrimitive.Root.displayName
+
+export { Label }
diff --git a/src/components/ui/separator.tsx b/src/components/ui/separator.tsx
new file mode 100644
index 0000000..6d7f122
--- /dev/null
+++ b/src/components/ui/separator.tsx
@@ -0,0 +1,29 @@
+import * as React from "react"
+import * as SeparatorPrimitive from "@radix-ui/react-separator"
+
+import { cn } from "@/lib/utils"
+
+const Separator = React.forwardRef<
+ React.ElementRef,
+ React.ComponentPropsWithoutRef
+>(
+ (
+ { className, orientation = "horizontal", decorative = true, ...props },
+ ref
+ ) => (
+
+ )
+)
+Separator.displayName = SeparatorPrimitive.Root.displayName
+
+export { Separator }
diff --git a/src/components/ui/sheet.tsx b/src/components/ui/sheet.tsx
new file mode 100644
index 0000000..02942db
--- /dev/null
+++ b/src/components/ui/sheet.tsx
@@ -0,0 +1,138 @@
+import * as React from "react"
+import * as SheetPrimitive from "@radix-ui/react-dialog"
+import { cva, type VariantProps } from "class-variance-authority"
+import { X } from "lucide-react"
+
+import { cn } from "@/lib/utils"
+
+const Sheet = SheetPrimitive.Root
+
+const SheetTrigger = SheetPrimitive.Trigger
+
+const SheetClose = SheetPrimitive.Close
+
+const SheetPortal = SheetPrimitive.Portal
+
+const SheetOverlay = React.forwardRef<
+ React.ElementRef,
+ React.ComponentPropsWithoutRef
+>(({ className, ...props }, ref) => (
+
+))
+SheetOverlay.displayName = SheetPrimitive.Overlay.displayName
+
+const sheetVariants = cva(
+ "fixed z-50 gap-4 bg-background p-6 shadow-lg transition ease-in-out data-[state=closed]:duration-300 data-[state=open]:duration-500 data-[state=open]:animate-in data-[state=closed]:animate-out",
+ {
+ variants: {
+ side: {
+ top: "inset-x-0 top-0 border-b data-[state=closed]:slide-out-to-top data-[state=open]:slide-in-from-top",
+ bottom:
+ "inset-x-0 bottom-0 border-t data-[state=closed]:slide-out-to-bottom data-[state=open]:slide-in-from-bottom",
+ left: "inset-y-0 left-0 h-full w-3/4 border-r data-[state=closed]:slide-out-to-left data-[state=open]:slide-in-from-left sm:max-w-sm",
+ right:
+ "inset-y-0 right-0 h-full w-3/4 border-l data-[state=closed]:slide-out-to-right data-[state=open]:slide-in-from-right sm:max-w-sm",
+ },
+ },
+ defaultVariants: {
+ side: "right",
+ },
+ }
+)
+
+interface SheetContentProps
+ extends React.ComponentPropsWithoutRef,
+ VariantProps {}
+
+const SheetContent = React.forwardRef<
+ React.ElementRef,
+ SheetContentProps
+>(({ side = "right", className, children, ...props }, ref) => (
+
+
+
+
+
+ Close
+
+ {children}
+
+
+))
+SheetContent.displayName = SheetPrimitive.Content.displayName
+
+const SheetHeader = ({
+ className,
+ ...props
+}: React.HTMLAttributes) => (
+
+)
+SheetHeader.displayName = "SheetHeader"
+
+const SheetFooter = ({
+ className,
+ ...props
+}: React.HTMLAttributes) => (
+
+)
+SheetFooter.displayName = "SheetFooter"
+
+const SheetTitle = React.forwardRef<
+ React.ElementRef,
+ React.ComponentPropsWithoutRef
+>(({ className, ...props }, ref) => (
+
+))
+SheetTitle.displayName = SheetPrimitive.Title.displayName
+
+const SheetDescription = React.forwardRef<
+ React.ElementRef,
+ React.ComponentPropsWithoutRef
+>(({ className, ...props }, ref) => (
+
+))
+SheetDescription.displayName = SheetPrimitive.Description.displayName
+
+export {
+ Sheet,
+ SheetPortal,
+ SheetOverlay,
+ SheetTrigger,
+ SheetClose,
+ SheetContent,
+ SheetHeader,
+ SheetFooter,
+ SheetTitle,
+ SheetDescription,
+}
diff --git a/src/index.css b/src/index.css
index bd6213e..8645a16 100644
--- a/src/index.css
+++ b/src/index.css
@@ -1,3 +1,78 @@
@tailwind base;
@tailwind components;
-@tailwind utilities;
\ No newline at end of file
+@tailwind utilities;
+
+body {
+ font-family: Arial, Helvetica, sans-serif;
+}
+
+@layer utilities {
+ .text-balance {
+ text-wrap: balance;
+ }
+}
+
+@layer base {
+ :root {
+ --background: 0 0% 100%;
+ --foreground: 222.2 84% 4.9%;
+ --card: 0 0% 100%;
+ --card-foreground: 222.2 84% 4.9%;
+ --popover: 0 0% 100%;
+ --popover-foreground: 222.2 84% 4.9%;
+ --primary: 222.2 47.4% 11.2%;
+ --primary-foreground: 210 40% 98%;
+ --secondary: 210 40% 96.1%;
+ --secondary-foreground: 222.2 47.4% 11.2%;
+ --muted: 210 40% 96.1%;
+ --muted-foreground: 215.4 16.3% 46.9%;
+ --accent: 210 40% 96.1%;
+ --accent-foreground: 222.2 47.4% 11.2%;
+ --destructive: 0 84.2% 60.2%;
+ --destructive-foreground: 210 40% 98%;
+ --border: 214.3 31.8% 91.4%;
+ --input: 214.3 31.8% 91.4%;
+ --ring: 222.2 84% 4.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: 222.2 84% 4.9%;
+ --foreground: 210 40% 98%;
+ --card: 222.2 84% 4.9%;
+ --card-foreground: 210 40% 98%;
+ --popover: 222.2 84% 4.9%;
+ --popover-foreground: 210 40% 98%;
+ --primary: 210 40% 98%;
+ --primary-foreground: 222.2 47.4% 11.2%;
+ --secondary: 217.2 32.6% 17.5%;
+ --secondary-foreground: 210 40% 98%;
+ --muted: 217.2 32.6% 17.5%;
+ --muted-foreground: 215 20.2% 65.1%;
+ --accent: 217.2 32.6% 17.5%;
+ --accent-foreground: 210 40% 98%;
+ --destructive: 0 62.8% 30.6%;
+ --destructive-foreground: 210 40% 98%;
+ --border: 217.2 32.6% 17.5%;
+ --input: 217.2 32.6% 17.5%;
+ --ring: 212.7 26.8% 83.9%;
+ --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;
+ }
+}
\ No newline at end of file
diff --git a/src/lib/data/index.tsx b/src/lib/data/index.tsx
new file mode 100644
index 0000000..5bfee2e
--- /dev/null
+++ b/src/lib/data/index.tsx
@@ -0,0 +1,51 @@
+import { AlertTriangle, Globe, LucideSearchCheck } from "lucide-react";
+import { FaBroadcastTower, FaMobileAlt } from "react-icons/fa";
+
+export const features = [
+ {
+ title: "Real-Time Tracking",
+ description:
+ "Stay updated on repository activities, new releases, and commits.",
+ icon: FaBroadcastTower,
+ },
+ {
+ title: "Comprehensive Analytics",
+ description: "Visualize contributions, stars, forks, and issues with ease.",
+ icon: LucideSearchCheck,
+ },
+ {
+ title: "Custom Alerts",
+ description:
+ "Get notified instantly about the updates you care about the most.",
+ icon: AlertTriangle,
+ },
+ {
+ title: "Collaboration Insights",
+ description: "Analyze team performance and contributions over time.",
+ icon: Globe,
+ },
+ {
+ title: "Mobile-Friendly Design",
+ description: "Track your projects anytime, anywhere.",
+ icon: FaMobileAlt,
+ },
+];
+
+export const steps = [
+ {
+ title: "Connect Your GitHub Account",
+ description: "Log in securely with GitHub OAuth.",
+ },
+ {
+ title: "Choose Repositories to Track",
+ description: "Select repositories or users you want to monitor.",
+ },
+ {
+ title: "Set Preferences",
+ description: "Customize alerts and analytics views.",
+ },
+ {
+ title: "Gain Insights",
+ description: "Dive deep into real-time updates and detailed analytics.",
+ },
+];
diff --git a/src/lib/utils.ts b/src/lib/utils.ts
new file mode 100644
index 0000000..bd0c391
--- /dev/null
+++ b/src/lib/utils.ts
@@ -0,0 +1,6 @@
+import { clsx, type ClassValue } from "clsx"
+import { twMerge } from "tailwind-merge"
+
+export function cn(...inputs: ClassValue[]) {
+ return twMerge(clsx(inputs))
+}
diff --git a/src/main.tsx b/src/main.tsx
index a9f043f..0ed76c5 100644
--- a/src/main.tsx
+++ b/src/main.tsx
@@ -7,7 +7,7 @@ import { BrowserRouter } from "react-router-dom";
createRoot(document.getElementById("root")!).render(
-
+
);
diff --git a/src/pages/home.tsx b/src/pages/home.tsx
new file mode 100644
index 0000000..28d41fd
--- /dev/null
+++ b/src/pages/home.tsx
@@ -0,0 +1,16 @@
+import Hero from "@/components/landing/hero"
+import Main from "@/components/landing/main"
+
+const Landing = () => {
+ return (
+
+ )
+}
+
+export default Landing
diff --git a/tailwind.config.js b/tailwind.config.js
index 9b2ed50..61f03fe 100644
--- a/tailwind.config.js
+++ b/tailwind.config.js
@@ -1,11 +1,88 @@
/** @type {import('tailwindcss').Config} */
module.exports = {
- content: [
- "./index.html", // For any HTML files in the root
- "./src/**/*.{js,jsx,ts,tsx}", // For all JS/JSX/TS/TSX files inside src folder
- ],
- theme: {
- extend: {},
- },
- plugins: [],
- }
+ darkMode: ["class"],
+ content: ["./index.html", "./src/**/*.{js,jsx,ts,tsx}"],
+ theme: {
+ extend: {
+ colors: {
+ background: 'hsl(var(--background))',
+ foreground: 'hsl(var(--foreground))',
+ card: {
+ DEFAULT: 'hsl(var(--card))',
+ foreground: 'hsl(var(--card-foreground))'
+ },
+ popover: {
+ DEFAULT: 'hsl(var(--popover))',
+ foreground: 'hsl(var(--popover-foreground))'
+ },
+ primary: {
+ DEFAULT: 'hsl(var(--primary))',
+ foreground: 'hsl(var(--primary-foreground))'
+ },
+ secondary: {
+ DEFAULT: 'hsl(var(--secondary))',
+ foreground: 'hsl(var(--secondary-foreground))'
+ },
+ muted: {
+ DEFAULT: 'hsl(var(--muted))',
+ foreground: 'hsl(var(--muted-foreground))'
+ },
+ accent: {
+ DEFAULT: 'hsl(var(--accent))',
+ foreground: 'hsl(var(--accent-foreground))'
+ },
+ destructive: {
+ DEFAULT: 'hsl(var(--destructive))',
+ foreground: 'hsl(var(--destructive-foreground))'
+ },
+ border: 'hsl(var(--border))',
+ input: 'hsl(var(--input))',
+ ring: 'hsl(var(--ring))',
+ chart: {
+ '1': 'hsl(var(--chart-1))',
+ '2': 'hsl(var(--chart-2))',
+ '3': 'hsl(var(--chart-3))',
+ '4': 'hsl(var(--chart-4))',
+ '5': 'hsl(var(--chart-5))'
+ }
+ },
+ borderRadius: {
+ lg: 'var(--radius)',
+ md: 'calc(var(--radius) - 2px)',
+ sm: 'calc(var(--radius) - 4px)'
+ },
+ animation: {
+ 'spin-slow': 'spin 3s linear infinite',
+ glow: 'glow 4s ease-in-out infinite alternate',
+ 'pulse-glow': 'pulse-glow 2s ease-in-out infinite'
+ },
+ keyframes: {
+ spin: {
+ '0%': {
+ transform: 'rotate(0deg)'
+ },
+ '100%': {
+ transform: 'rotate(360deg)'
+ }
+ },
+ glow: {
+ '0%': {
+ opacity: '0.2'
+ },
+ '100%': {
+ opacity: '0.6'
+ }
+ },
+ 'pulse-glow': {
+ '0%, 100%': {
+ opacity: '0.5'
+ },
+ '50%': {
+ opacity: '0.8'
+ }
+ }
+ }
+ }
+ },
+ plugins: [require("tailwindcss-animate")],
+};
diff --git a/tsconfig.app.json b/tsconfig.app.json
index f867de0..b6d4c6a 100644
--- a/tsconfig.app.json
+++ b/tsconfig.app.json
@@ -20,7 +20,11 @@
"noUnusedLocals": true,
"noUnusedParameters": true,
"noFallthroughCasesInSwitch": true,
- "noUncheckedSideEffectImports": true
+ "noUncheckedSideEffectImports": true,
+ "baseUrl": ".",
+ "paths": {
+ "@/*": ["./src/*"]
+ }
},
"include": ["src"]
}
diff --git a/tsconfig.json b/tsconfig.json
index 1ffef60..fec8c8e 100644
--- a/tsconfig.json
+++ b/tsconfig.json
@@ -3,5 +3,11 @@
"references": [
{ "path": "./tsconfig.app.json" },
{ "path": "./tsconfig.node.json" }
- ]
+ ],
+ "compilerOptions": {
+ "baseUrl": ".",
+ "paths": {
+ "@/*": ["./src/*"]
+ }
+ }
}
diff --git a/vite.config.ts b/vite.config.ts
index 8b0f57b..7f70b0a 100644
--- a/vite.config.ts
+++ b/vite.config.ts
@@ -1,7 +1,13 @@
import { defineConfig } from 'vite'
import react from '@vitejs/plugin-react'
+import path from "path"
// https://vite.dev/config/
export default defineConfig({
plugins: [react()],
+ resolve: {
+ alias: {
+ "@": path.resolve(__dirname, "./src"),
+ },
+ },
})