From c36902dec7aedfe83b6e39c0258f01b5edceedd4 Mon Sep 17 00:00:00 2001 From: Bravemobin Date: Mon, 31 Mar 2025 13:17:42 +0330 Subject: [PATCH] Implement sidebar component with context management for state handling; add new UI elements including tooltip, skeleton, and sheet components; update package dependencies and enhance global styles for improved responsiveness. --- app/globals.css | 9 + app/layout.tsx | 13 +- bun.lockb | Bin 169832 -> 172150 bytes components/app-sidebar.tsx | 71 +++ components/header.tsx | 24 +- components/podcast-hero.tsx | 3 +- components/subscribe-section.tsx | 8 +- components/ui/sheet.tsx | 139 ++++++ components/ui/sidebar.tsx | 726 +++++++++++++++++++++++++++++++ components/ui/skeleton.tsx | 13 + components/ui/tooltip.tsx | 61 +++ hooks/use-mobile.ts | 19 + package.json | 4 +- 13 files changed, 1074 insertions(+), 16 deletions(-) create mode 100644 components/app-sidebar.tsx create mode 100644 components/ui/sheet.tsx create mode 100644 components/ui/sidebar.tsx create mode 100644 components/ui/skeleton.tsx create mode 100644 components/ui/tooltip.tsx create mode 100644 hooks/use-mobile.ts diff --git a/app/globals.css b/app/globals.css index e72e243..e76b955 100644 --- a/app/globals.css +++ b/app/globals.css @@ -184,3 +184,12 @@ body { linear-gradient(to right, #21c796, #0385ce, #0d40bf) border-box; border: 1px solid transparent; } + +@layer base { + * { + @apply border-border outline-ring/50; + } + body { + @apply bg-background text-foreground; + } +} diff --git a/app/layout.tsx b/app/layout.tsx index 5ee78e7..f17fff4 100644 --- a/app/layout.tsx +++ b/app/layout.tsx @@ -4,6 +4,8 @@ import type { Metadata } from "next"; import localFont from "next/font/local"; import "./globals.css"; import { ThemeProvider } from "@/components/theme-provider"; +import { SidebarProvider } from "@/components/ui/sidebar"; +import { AppSidebar } from "@/components/app-sidebar"; const Vazir = localFont({ src: [ @@ -40,9 +42,14 @@ export default function RootLayout({ enableSystem disableTransitionOnChange > -
-
{children}
- + + +
+
+
{children}
+ +
+
diff --git a/bun.lockb b/bun.lockb index 17fb56cd95e7dee8fc9b6395b8a89b76952b2b8d..c02195adf5d9e514217a0ff1ae55e79df30304ff 100644 GIT binary patch delta 34088 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 delta 32770 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 WrAJfMW$o>7^`5%cr-lg1 diff --git a/components/app-sidebar.tsx b/components/app-sidebar.tsx new file mode 100644 index 0000000..7813905 --- /dev/null +++ b/components/app-sidebar.tsx @@ -0,0 +1,71 @@ +import { Calendar, Home, Inbox, Search, Settings } from "lucide-react"; + +import { + Sidebar, + SidebarContent, + SidebarGroup, + SidebarGroupContent, + SidebarGroupLabel, + SidebarMenu, + SidebarMenuButton, + SidebarMenuItem, +} from "@/components/ui/sidebar"; +import { ModeToggle } from "./mode-toggle"; +import ToggleLanguage from "./toggle-language"; + +// Menu items. +const items = [ + { + title: "Home", + url: "#", + icon: Home, + }, + { + title: "Inbox", + url: "#", + icon: Inbox, + }, + { + title: "Calendar", + url: "#", + icon: Calendar, + }, + { + title: "Search", + url: "#", + icon: Search, + }, + { + title: "Settings", + url: "#", + icon: Settings, + }, +]; + +export function AppSidebar() { + return ( + + + + Application + + + + + {items.map((item) => ( + + + + + {item.title} + + + + ))} + + + + + + ); +} diff --git a/components/header.tsx b/components/header.tsx index 04ffe07..3b82081 100644 --- a/components/header.tsx +++ b/components/header.tsx @@ -8,10 +8,12 @@ import { useEffect, useState } from "react"; import { ModeToggle } from "./mode-toggle"; import ToggleLanguage from "./toggle-language"; import { Input } from "./ui/input"; +import { useSidebar } from "./ui/sidebar"; export default function Header() { const [isScrollingUp, setIsScrollingUp] = useState(true); // Track scroll direction const [prevScrollPos, setPrevScrollPos] = useState(0); + const { toggleSidebar } = useSidebar(); useEffect(() => { const handleScroll = () => { @@ -36,7 +38,7 @@ export default function Header() { }, [prevScrollPos]); return ( -
+
{/* Left Section */}
@@ -47,12 +49,15 @@ export default function Header() { - - +
+ + +
{/* Right Section */}
- +
diff --git a/components/podcast-hero.tsx b/components/podcast-hero.tsx index 7434762..e82d0e7 100644 --- a/components/podcast-hero.tsx +++ b/components/podcast-hero.tsx @@ -35,7 +35,8 @@ export function PodcastHero() {
-

+

هرگز یک قسمت را از دست ندهید

-

+

در خبرنامه ما مشترک شوید و از انتشار قسمت های جدید مطلع شوید منتشر شد.

@@ -25,9 +25,9 @@ export function SubscribeSection() { type="email" className="sm:min-w-[300px] bg-background border-2 h-10 py-4" /> - diff --git a/components/ui/sheet.tsx b/components/ui/sheet.tsx new file mode 100644 index 0000000..84649ad --- /dev/null +++ b/components/ui/sheet.tsx @@ -0,0 +1,139 @@ +"use client" + +import * as React from "react" +import * as SheetPrimitive from "@radix-ui/react-dialog" +import { XIcon } from "lucide-react" + +import { cn } from "@/lib/utils" + +function Sheet({ ...props }: React.ComponentProps) { + return +} + +function SheetTrigger({ + ...props +}: React.ComponentProps) { + return +} + +function SheetClose({ + ...props +}: React.ComponentProps) { + return +} + +function SheetPortal({ + ...props +}: React.ComponentProps) { + return +} + +function SheetOverlay({ + className, + ...props +}: React.ComponentProps) { + return ( + + ) +} + +function SheetContent({ + className, + children, + side = "right", + ...props +}: React.ComponentProps & { + side?: "top" | "right" | "bottom" | "left" +}) { + return ( + + + + {children} + + + Close + + + + ) +} + +function SheetHeader({ className, ...props }: React.ComponentProps<"div">) { + return ( +
+ ) +} + +function SheetFooter({ className, ...props }: React.ComponentProps<"div">) { + return ( +
+ ) +} + +function SheetTitle({ + className, + ...props +}: React.ComponentProps) { + return ( + + ) +} + +function SheetDescription({ + className, + ...props +}: React.ComponentProps) { + return ( + + ) +} + +export { + Sheet, + SheetTrigger, + SheetClose, + SheetContent, + SheetHeader, + SheetFooter, + SheetTitle, + SheetDescription, +} diff --git a/components/ui/sidebar.tsx b/components/ui/sidebar.tsx new file mode 100644 index 0000000..7ffbc07 --- /dev/null +++ b/components/ui/sidebar.tsx @@ -0,0 +1,726 @@ +"use client" + +import * as React from "react" +import { Slot } from "@radix-ui/react-slot" +import { VariantProps, cva } from "class-variance-authority" +import { PanelLeftIcon } from "lucide-react" + +import { useIsMobile } from "@/hooks/use-mobile" +import { cn } from "@/lib/utils" +import { Button } from "@/components/ui/button" +import { Input } from "@/components/ui/input" +import { Separator } from "@/components/ui/separator" +import { + Sheet, + SheetContent, + SheetDescription, + SheetHeader, + SheetTitle, +} from "@/components/ui/sheet" +import { Skeleton } from "@/components/ui/skeleton" +import { + Tooltip, + TooltipContent, + TooltipProvider, + TooltipTrigger, +} from "@/components/ui/tooltip" + +const SIDEBAR_COOKIE_NAME = "sidebar_state" +const SIDEBAR_COOKIE_MAX_AGE = 60 * 60 * 24 * 7 +const SIDEBAR_WIDTH = "16rem" +const SIDEBAR_WIDTH_MOBILE = "18rem" +const SIDEBAR_WIDTH_ICON = "3rem" +const SIDEBAR_KEYBOARD_SHORTCUT = "b" + +type SidebarContextProps = { + state: "expanded" | "collapsed" + open: boolean + setOpen: (open: boolean) => void + openMobile: boolean + setOpenMobile: (open: boolean) => void + isMobile: boolean + toggleSidebar: () => void +} + +const SidebarContext = React.createContext(null) + +function useSidebar() { + const context = React.useContext(SidebarContext) + if (!context) { + throw new Error("useSidebar must be used within a SidebarProvider.") + } + + return context +} + +function SidebarProvider({ + defaultOpen = true, + open: openProp, + onOpenChange: setOpenProp, + className, + style, + children, + ...props +}: React.ComponentProps<"div"> & { + defaultOpen?: boolean + open?: boolean + onOpenChange?: (open: boolean) => void +}) { + const isMobile = useIsMobile() + const [openMobile, setOpenMobile] = React.useState(false) + + // This is the internal state of the sidebar. + // We use openProp and setOpenProp for control from outside the component. + const [_open, _setOpen] = React.useState(defaultOpen) + const open = openProp ?? _open + const setOpen = React.useCallback( + (value: boolean | ((value: boolean) => boolean)) => { + const openState = typeof value === "function" ? value(open) : value + if (setOpenProp) { + setOpenProp(openState) + } else { + _setOpen(openState) + } + + // This sets the cookie to keep the sidebar state. + document.cookie = `${SIDEBAR_COOKIE_NAME}=${openState}; path=/; max-age=${SIDEBAR_COOKIE_MAX_AGE}` + }, + [setOpenProp, open] + ) + + // Helper to toggle the sidebar. + const toggleSidebar = React.useCallback(() => { + return isMobile ? setOpenMobile((open) => !open) : setOpen((open) => !open) + }, [isMobile, setOpen, setOpenMobile]) + + // Adds a keyboard shortcut to toggle the sidebar. + React.useEffect(() => { + const handleKeyDown = (event: KeyboardEvent) => { + if ( + event.key === SIDEBAR_KEYBOARD_SHORTCUT && + (event.metaKey || event.ctrlKey) + ) { + event.preventDefault() + toggleSidebar() + } + } + + window.addEventListener("keydown", handleKeyDown) + return () => window.removeEventListener("keydown", handleKeyDown) + }, [toggleSidebar]) + + // We add a state so that we can do data-state="expanded" or "collapsed". + // This makes it easier to style the sidebar with Tailwind classes. + const state = open ? "expanded" : "collapsed" + + const contextValue = React.useMemo( + () => ({ + state, + open, + setOpen, + isMobile, + openMobile, + setOpenMobile, + toggleSidebar, + }), + [state, open, setOpen, isMobile, openMobile, setOpenMobile, toggleSidebar] + ) + + return ( + + +
+ {children} +
+
+
+ ) +} + +function Sidebar({ + side = "left", + variant = "sidebar", + collapsible = "offcanvas", + className, + children, + ...props +}: React.ComponentProps<"div"> & { + side?: "left" | "right" + variant?: "sidebar" | "floating" | "inset" + collapsible?: "offcanvas" | "icon" | "none" +}) { + const { isMobile, state, openMobile, setOpenMobile } = useSidebar() + + if (collapsible === "none") { + return ( +
+ {children} +
+ ) + } + + if (isMobile) { + return ( + + + + Sidebar + Displays the mobile sidebar. + +
{children}
+
+
+ ) + } + + return ( +
+ {/* This is what handles the sidebar gap on desktop */} +
+ +
+ ) +} + +function SidebarTrigger({ + className, + onClick, + ...props +}: React.ComponentProps) { + const { toggleSidebar } = useSidebar() + + return ( + + ) +} + +function SidebarRail({ className, ...props }: React.ComponentProps<"button">) { + const { toggleSidebar } = useSidebar() + + return ( +