diff --git a/src/components/Header.tsx b/src/components/Header.tsx new file mode 100644 index 0000000..a0c7ac1 --- /dev/null +++ b/src/components/Header.tsx @@ -0,0 +1,171 @@ +import { useState, useEffect } from "react"; +import { Link } from "react-router-dom"; +import { Button } from "@/components/ui/button"; +import { Badge } from "@/components/ui/badge"; +import { Input } from "@/components/ui/input"; +import { Label } from "@/components/ui/label"; +import { Sheet, SheetContent, SheetTrigger } from "@/components/ui/sheet"; +import { Dialog, DialogContent, DialogHeader, DialogTitle, DialogTrigger, DialogDescription } from "@/components/ui/dialog"; +import { Menu, Terminal, Star, Github } from "lucide-react"; +import { ThemeToggle } from "@/components/ThemeToggle"; +import { useAuth } from "@/hooks/use-tygarun"; +import { toast } from "sonner"; + +const navLinks = [ + { label: "Docs", to: "/docs" }, + { label: "API", to: "/docs" }, + { label: "Status", to: "/status" }, + { label: "Changelog", to: "/changelog" }, +]; + +function SignupDialog({ trigger }: { trigger: React.ReactNode }) { + const { signup, loading, isSignedIn } = useAuth(); + const [open, setOpen] = useState(false); + const [email, setEmail] = useState(""); + const [password, setPassword] = useState(""); + + const handleSignup = async (e: React.FormEvent) => { + e.preventDefault(); + try { + const res = await signup({ email, password }); + const key = res?.apiKey || res?.token; + toast.success(key ? "Account created. Your API key is ready." : "Account created."); + setOpen(false); + } catch { + toast.error("Could not create account. Please try again."); + } + }; + + return ( + + {trigger} + + + {isSignedIn ? "You are signed in" : "Create your account"} + Sign up to get your API key and start building. + +
+
+ + setEmail(e.target.value)} placeholder="you@example.com" /> +
+
+ + setPassword(e.target.value)} placeholder="••••••••" /> +
+ +
+
+
+ ); +} + +export default function Header() { + const [mobileOpen, setMobileOpen] = useState(false); + const [scrolled, setScrolled] = useState(false); + + useEffect(() => { + const onScroll = () => setScrolled(window.scrollY > 20); + window.addEventListener("scroll", onScroll); + return () => window.removeEventListener("scroll", onScroll); + }, []); + + return ( +
+
+ {/* Logo */} + +
+ +
+ + DevStack + + + + {/* Desktop Nav */} + + + {/* Right side */} +
+ + + + 4.2k + + + + + Get API Key + + } + /> +
+ + {/* Mobile Menu */} +
+ + + + + + +
+ setMobileOpen(false)}> +
+ +
+ DevStack + + + + Get API Key + + } + /> +
+
+
+
+
+
+ ); +}