"use client"; import { cn } from "@/lib/utils"; import Link, { LinkProps } from "next/link"; import React, { useState, createContext, useContext } from "react"; import { AnimatePresence, motion } from "framer-motion"; import { Menu, X } from "lucide-react"; interface Links { label: string; href: string; icon: React.JSX.Element | React.ReactNode; } interface SidebarContextProps { open: boolean; setOpen: React.Dispatch>; animate: boolean; } const SidebarContext = createContext( undefined ); export const useSidebar = () => { const context = useContext(SidebarContext); if (!context) { throw new Error("useSidebar must be used within a SidebarProvider"); } return context; }; export const SidebarProvider = ({ children, open: openProp, setOpen: setOpenProp, animate = true, }: { children?: React.ReactNode; open?: boolean; setOpen?: React.Dispatch>; animate?: boolean; }) => { const [openState, setOpenState] = useState(false); const open = openProp !== undefined ? openProp : openState; const setOpen = setOpenProp !== undefined ? setOpenProp : setOpenState; return ( {children} ); }; export const Sidebar = ({ children, open, setOpen, animate, }: { children?: React.ReactNode; open?: boolean; setOpen?: React.Dispatch>; animate?: boolean; }) => { return ( {children} ); }; export const SidebarBody = (props: React.ComponentProps<"div">) => { return ( <> ); }; export const DesktopSidebar = ({ className, children, ...props }: React.ComponentProps<"div">) => { return ( ); }; export const MobileSidebar = ({ className, children, ...props }: React.ComponentProps<"div">) => { const { open, setOpen } = useSidebar(); return ( <> {/* Mobile Header - Always visible */}
LinkScout
{/* Mobile Menu Overlay */} {open && ( <> {/* Backdrop */} setOpen(false)} /> {/* Sidebar Panel */} {/* Close button */} {/* Menu content */}
{children}
)}
); }; export const SidebarLink = ({ link, className, ...props }: { link: Links; className?: string; props?: LinkProps; }) => { const { open, setOpen } = useSidebar(); return ( { // Close mobile menu when clicking a link if (open) { setOpen(false); } }} className={cn( "flex items-center gap-3 group/sidebar py-3 px-3 rounded-lg transition-all duration-200 hover:bg-white/10 active:bg-white/20 md:hover:bg-white/5 md:hover:backdrop-blur-sm hover:border-orange-500/30 active:border-orange-500/50 border border-transparent text-orange-100/80 hover:text-orange-100", className )} {...props} >
{link.icon}
{link.label} ); };