Theme toggle

This commit is contained in:
2025-02-21 12:02:04 +01:00
parent 030488a451
commit 2bae543492
2 changed files with 40 additions and 57 deletions
+13 -57
View File
@@ -1,16 +1,7 @@
'use client'; 'use client';
import * as React from 'react'; import * as React from 'react';
import { Menu } from 'lucide-react';
import { Button } from '@/components/ui/button';
import { usePathname } from 'next/navigation'; import { usePathname } from 'next/navigation';
import {
Sheet,
SheetContent,
SheetFooter,
SheetTitle,
SheetTrigger,
} from '@/components/ui/sheet';
import { import {
SidebarContent, SidebarContent,
@@ -27,6 +18,7 @@ import {
import { Calendar, LayoutDashboardIcon, Settings } from 'lucide-react'; import { Calendar, LayoutDashboardIcon, Settings } from 'lucide-react';
import Link from 'next/link'; import Link from 'next/link';
import useSmallScreen from '@/hooks/is-small'; import useSmallScreen from '@/hooks/is-small';
import ThemeToggle from './themeToggle';
// Menu items. // Menu items.
const items = [ const items = [
@@ -50,58 +42,15 @@ const footer = [
}, },
]; ];
export function HamburgerMenu() {
const [open, setOpen] = React.useState(false);
const pathname = usePathname();
return (
<Sheet open={open} onOpenChange={setOpen}>
<SheetTitle className="hidden">Menu</SheetTitle>
<SheetTrigger asChild>
<Button variant="ghost" size="icon" className="md:hidden">
<Menu className="h-10 w-5" />
<span className="sr-only">Toggle menu</span>
</Button>
</SheetTrigger>
<SheetContent side="left" className="w-28 flex flex-col">
{items.map((item, i) => (
<div key={i} className="w-16 mx-auto">
<Link href={item.url}>
{pathname === item.url ? (
<item.icon className="!size-full p-2 bg-foreground text-background rounded-2xl" />
) : (
<item.icon className="!size-full p-2 hover:bg-foreground hover:text-background rounded-2xl" />
)}
</Link>
</div>
))}
<div className="flex-grow" />
<SheetFooter className="mt-auto">
{footer.map((item, i) => (
<Link href={item.url} key={i}>
{pathname === item.url ? (
<item.icon className="!size-full p-2 bg-foreground text-background rounded-2xl" />
) : (
<item.icon className="!size-full p-2 hover:bg-foreground hover:text-background rounded-2xl" />
)}
</Link>
))}
</SheetFooter>
</SheetContent>
</Sheet>
);
}
export default function App({ children }: { children?: any }) { export default function App({ children }: { children?: any }) {
const isSmall = useSmallScreen(); const isSmall = useSmallScreen();
const pathname = usePathname(); const pathname = usePathname();
return isSmall ? ( return isSmall ? (
<div className="flex flex-col"> <div className="flex flex-col relative">
<div className="flex flex-row w-max mx-auto gap-2 items-center"> <div className="flex flex-row justify-center gap-2 items-center relative mt-2">
<div className="flex flex-row w-max gap-2"> {/* Navigation Items */}
<div className="flex flex-row gap-2">
{items.map((item, i) => ( {items.map((item, i) => (
<div key={i} className="w-12 mx-auto"> <div key={i} className="w-12 mx-auto">
<Link href={item.url}> <Link href={item.url}>
@@ -115,7 +64,8 @@ export default function App({ children }: { children?: any }) {
))} ))}
</div> </div>
<div className="flex flex-row w-max gap-2"> {/* Footer Items */}
<div className="flex flex-row gap-2">
{footer.map((item, i) => ( {footer.map((item, i) => (
<div key={i} className="w-12 mx-auto"> <div key={i} className="w-12 mx-auto">
<Link href={item.url}> <Link href={item.url}>
@@ -128,7 +78,12 @@ export default function App({ children }: { children?: any }) {
</div> </div>
))} ))}
</div> </div>
<div className="absolute right-0 mr-4">
<ThemeToggle />
</div> </div>
</div>
{children} {children}
</div> </div>
) : ( ) : (
@@ -177,6 +132,7 @@ export default function App({ children }: { children?: any }) {
</Link> </Link>
</SidebarMenuItem> </SidebarMenuItem>
))} ))}
<ThemeToggle className="mx-auto" />
</SidebarMenu> </SidebarMenu>
</SidebarFooter> </SidebarFooter>
</Sidebar> </Sidebar>
+27
View File
@@ -0,0 +1,27 @@
'use client';
import { useTheme } from 'next-themes';
import { useEffect } from 'react';
import { Button } from './ui/button';
import { Lightbulb } from 'lucide-react';
export default function ThemeToggle(
props: React.DetailedHTMLProps<
React.HTMLAttributes<HTMLSpanElement>,
HTMLSpanElement
>
) {
const { setTheme, theme } = useTheme();
return (
<span {...props}>
<Button
className="p-3"
variant="ghost"
onClick={() => setTheme(theme === 'light' ? 'dark' : 'light')}
>
<Lightbulb />
</Button>
</span>
);
}