// 左导航条目数据 + 激活判定(纯逻辑,供桌面静态侧栏 / 移动抽屉共用,UX §5.1/§3.1)。 // 组件只负责渲染;条目与高亮规则在此集中,避免侧栏与抽屉漂移。 export type ActiveNav = | "write" | "outline" | "foreshadow" | "review" | "style" | "codex" | "rules" | "skills" | "toolbox" | "chains"; export interface NavItem { href: string; label: string; // 项目级入口的激活键(与 activeNav 比对高亮);全局项无 key。 key?: ActiveNav; } export const GLOBAL_NAV_ITEMS: readonly NavItem[] = [ { href: "/", label: "作品库" }, { href: "/settings/providers", label: "设置" }, ]; // 项目内页展开的项目级入口(UX §3.1)。 export function projectNavItems(projectId: string): NavItem[] { return [ { href: `/projects/${projectId}/write`, label: "写作", key: "write" }, { href: `/projects/${projectId}/outline`, label: "大纲", key: "outline" }, { href: `/projects/${projectId}/foreshadow`, label: "伏笔", key: "foreshadow", }, { href: `/projects/${projectId}/review`, label: "审稿", key: "review" }, { href: `/projects/${projectId}/chains`, label: "多章链", key: "chains" }, { href: `/projects/${projectId}/style`, label: "文风", key: "style" }, { href: `/projects/${projectId}/codex`, label: "设定库", key: "codex" }, { href: `/projects/${projectId}/toolbox`, label: "工具箱", key: "toolbox" }, { href: `/projects/${projectId}/rules`, label: "规则", key: "rules" }, { href: `/projects/${projectId}/skills`, label: "技能库", key: "skills" }, ]; } export interface NavActiveContext { pathname: string; activeNav?: ActiveNav; } // 全局项按精确路径匹配;项目项按 activeNav 键匹配(或路径相等兜底)。 export function isNavItemActive(item: NavItem, ctx: NavActiveContext): boolean { if (item.key !== undefined) { return item.key === ctx.activeNav || ctx.pathname === item.href; } return ctx.pathname === item.href; }