"use client"; import { useEffect, useRef, type ReactNode } from "react"; interface DrawerProps { open: boolean; onClose: () => void; // 滑出方向:导航在左、本章助手在右。 side?: "left" | "right"; // 无障碍标签(role=dialog)。 label: string; children: ReactNode; } // 移动端侧滑抽屉((null); useEffect(() => { if (!open) return; const onKey = (e: KeyboardEvent): void => { if (e.key === "Escape") { e.preventDefault(); onClose(); } }; window.addEventListener("keydown", onKey); panelRef.current?.focus(); return () => window.removeEventListener("keydown", onKey); }, [open, onClose]); if (!open) return null; const sideClass = side === "left" ? "left-0 border-r" : "right-0 border-l"; return (
e.stopPropagation()} className={`absolute top-0 h-full w-64 max-w-[80vw] overflow-auto border-line bg-panel py-4 shadow-paper outline-none ${sideClass}`} > {children}
); }