'use client'; import { useState, useEffect } from 'react'; import { createPortal } from 'react-dom'; import { FiList, FiChevronRight } from 'react-icons/fi'; 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, contentKey }: { children: React.ReactNode; hasToc?: boolean; contentKey?: string }) { const [isTocOpen, setIsTocOpen] = useState(hasToc); const [mounted, setMounted] = useState(false); useEffect(() => { setMounted(true); }, []); const tocButton = hasToc && mounted ? ( ) : null; return (
{/* Main Content Area */}
{children}
{/* Desktop Sidebar (TOC) */}
{/* Mobile TOC Overlay */} {isTocOpen && hasToc && (
setIsTocOpen(false)} />
)} {/* Toggle Button - Rendered via Portal */} {tocButton && createPortal(tocButton, document.body)}
); }