'use client'; import { useState } from 'react'; import { motion, AnimatePresence } from 'framer-motion'; import { FontAwesomeIcon } from '@fortawesome/react-fontawesome'; import { faListUl, faChevronRight, faChevronLeft } from '@fortawesome/free-solid-svg-icons'; import { PostToc } from './post-toc'; import { clsx, type ClassValue } from 'clsx'; import { twMerge } from 'tailwind-merge'; function cn(...inputs: ClassValue[]) { return twMerge(clsx(inputs)); } export function PostLayout({ children, hasToc = true }: { children: React.ReactNode; hasToc?: boolean }) { const [isTocOpen, setIsTocOpen] = useState(hasToc); return (
{/* Main Content Area */}
{children}
{/* Desktop Sidebar (TOC) */}
{/* Mobile TOC Overlay */} {isTocOpen && hasToc && (
setIsTocOpen(false)} />
)}
{/* Toggle Button (Glassmorphism Pill) */} {hasToc && ( setIsTocOpen(!isTocOpen)} className={cn( "fixed bottom-8 right-8 z-50 flex items-center gap-2 rounded-full border border-white/20 bg-white/80 px-4 py-2.5 shadow-lg backdrop-blur-md transition-all hover:bg-white hover:scale-105 dark:border-white/10 dark:bg-slate-900/80 dark:hover:bg-slate-900", "text-sm font-medium text-slate-600 dark:text-slate-300", "lg:right-20" // Adjust position for desktop )} whileTap={{ scale: 0.95 }} aria-label="Toggle Table of Contents" > {isTocOpen ? 'Hide' : 'Menu'} )}
); }