cube-tui 0.1.9

Terminal UI timer and session manager for speedcubing, with optional web dashboard and BLE (GAN) timer support.
import { Moon, Sun } from "lucide-react";
import { useEffect, useState } from "react";
import type { History } from "../types/types";
import { CubeLogo } from "./CubeLogo.tsx";
import { ImportButton } from "./ImportButton.tsx";

interface HeaderProps {
	showImport?: boolean;
	setSessions?: (sessions: History[]) => void;
}

export function Header({ showImport = false, setSessions }: HeaderProps) {
	const [darkMode, setDarkMode] = useState(() =>
		document.documentElement.classList.contains("dark"),
	);

	useEffect(() => {
		const root = document.documentElement;
		if (darkMode) {
			root.classList.add("dark");
			localStorage.setItem("theme", "dark");
		} else {
			root.classList.remove("dark");
			localStorage.setItem("theme", "light");
		}
	}, [darkMode]);

	return (
		<header className="sticky top-0 z-50 w-full border-b border-border bg-header-bg backdrop-blur-xl transition-colors duration-300">
			<div className="max-w-6xl mx-auto px-4 sm:px-6 h-14 flex items-center justify-between">
				<div className="flex items-center gap-2.5">
					<CubeLogo size={24} />
					<span className="font-sans font-medium text-sm tracking-tight text-ink transition-colors duration-300">
						cube<span className="text-accent">tui</span>
					</span>
				</div>

				<div className="flex items-center gap-2">
					{showImport && setSessions && (
						<ImportButton onImport={setSessions} compact={true} />
					)}
					<button
						type="button"
						onClick={() => setDarkMode((prev) => !prev)}
						aria-label="Toggle theme"
						role="switch"
						aria-checked={darkMode}
						data-theme={darkMode ? "dark" : "light"}
						className="theme-toggle relative flex items-center gap-1.5 rounded-full px-1 py-1 border transition-all duration-300 focus:outline-none focus-visible:ring-2 focus-visible:ring-accent"
					>
						<span className="theme-toggle-thumb absolute top-1 bottom-1 rounded-full transition-all duration-300" />

						<span className="theme-toggle-moon relative z-10 flex items-center justify-center w-1/2 transition-colors duration-300">
							<Moon size={12} strokeWidth={2} />
						</span>

						<span className="theme-toggle-sun relative z-10 flex items-center justify-center w-1/2 transition-colors duration-300">
							<Sun size={12} strokeWidth={2} />
						</span>
					</button>
				</div>
			</div>
		</header>
	);
}