feat: add dark mode toggle to navigation

- Add ThemeToggle component to desktop AppHeader navbar
- Add ThemeToggle to mobile MobileMenu with label
- Reorganize social links in mobile menu for cleaner layout
- Toggle uses existing ThemeToggle component with sun/moon icons

Closes #4

🤖 Generated with [Claude Code](https://claude.com/claude-code)

Co-Authored-By: Claude <noreply@anthropic.com>
This commit is contained in:
Ajax Davis 2026-01-07 14:05:03 +10:00
parent bc1eb57e2a
commit a4cfea5cc3
2 changed files with 17 additions and 9 deletions

View file

@ -7,6 +7,7 @@ import { Icon } from '@tpmjs/ui/Icon/Icon';
import Link from 'next/link'; import Link from 'next/link';
import { useState } from 'react'; import { useState } from 'react';
import { MobileMenu } from './MobileMenu'; import { MobileMenu } from './MobileMenu';
import { ThemeToggle } from './ThemeToggle';
/** /**
* Shared application header used across all pages * Shared application header used across all pages
@ -117,6 +118,7 @@ export function AppHeader(): React.ReactElement {
> >
<Icon icon="github" size="md" /> <Icon icon="github" size="md" />
</a> </a>
<ThemeToggle />
{session ? ( {session ? (
<Link href="/dashboard"> <Link href="/dashboard">
<Button <Button

View file

@ -4,6 +4,7 @@ import { Button } from '@tpmjs/ui/Button/Button';
import { Icon } from '@tpmjs/ui/Icon/Icon'; import { Icon } from '@tpmjs/ui/Icon/Icon';
import Link from 'next/link'; import Link from 'next/link';
import { useEffect } from 'react'; import { useEffect } from 'react';
import { ThemeToggle } from './ThemeToggle';
interface MobileMenuProps { interface MobileMenuProps {
isOpen: boolean; isOpen: boolean;
@ -125,23 +126,28 @@ export function MobileMenu({
{/* Divider */} {/* Divider */}
<div className="my-4 border-t border-border" /> <div className="my-4 border-t border-border" />
{/* Social links */} {/* Social links and theme toggle */}
<ul className="space-y-1"> <div className="flex items-center justify-between px-3 py-3">
{socialLinks.map((link) => ( <div className="flex items-center gap-4">
<li key={link.href}> {socialLinks.map((link) => (
<a <a
key={link.href}
href={link.href} href={link.href}
target="_blank" target="_blank"
rel="noopener noreferrer" rel="noopener noreferrer"
className="flex items-center gap-3 px-3 py-3 text-foreground hover:bg-surface rounded-md transition-colors" className="text-foreground hover:text-foreground-secondary transition-colors"
onClick={onClose} onClick={onClose}
aria-label={link.label}
> >
<Icon icon={link.icon} size="md" /> <Icon icon={link.icon} size="md" />
{link.label}
</a> </a>
</li> ))}
))} </div>
</ul> <div className="flex items-center gap-2">
<span className="text-sm text-foreground-secondary">Theme</span>
<ThemeToggle />
</div>
</div>
{/* Divider */} {/* Divider */}
<div className="my-4 border-t border-border" /> <div className="my-4 border-t border-border" />