在壳布局中提供**可折叠的纵向导航**:展示多级菜单树,标识当前选中项与已打开页签,在窄屏下以「全宽抽屉式」呈现并支持遮罩关闭。
Layout.Sider、Menu 内联/深色主题等以官方文档为准)。 实现目标:**React**,**antd@6**(自 v4.3 升级场景);SPEC 仅描述与壳子及自定义逻辑相关的约定。
items(二级及以下)。id(优先)或 key,在整棵树中用于选中、展开状态;比较时按字符串语义相等即可。name。type,用于图标映射;常见取值见 §2.3;未匹配时使用默认图标。items,则该节点为**可展开**的父节点;否则为**叶子**(可点击打开页)。tree 为准。id/key 对应,用于菜单选中高亮及「子树选中」样式。pane.key 与节点 id 一致则标记)。以下描述**静态路径骨架**的常见 JSON 形态,便于对齐字段语义(存放文件名与路径由项目自定)。
projectName(工程标识)、treePaths(分组数组)、hiddenPaths(**不在侧栏展示**的页面映射,供其它入口按 pageName 打开;侧栏可不渲染此项,但应知晓 id 可能为负数等特殊键,以免选中/标签逻辑异常)。treePaths 每一项(一级分组):id、name、items。items 内叶子(典型):id、name、pageName、path;可选 type(如 chart、setting 等)。若某节点再含非空嵌套 items,则为中间层,须按 §4.2 三级规则处理。forbid、show 在合并阶段已过滤);**侧栏只消费合并后的 tree**,不负责请求。forbid、show 等规则剔除不可见项(具体函数名与模块划分由项目自定)。type 缺省时常规范为 'normal'(与图标默认分支一致)。id、name、path、pageName),以便宿主增加标签、拼接构建版本等查询参数等与既有开页逻辑一致。collapsed。lg 量级一致)时,进入**固定(fixed)**布局模式:collapsed。onSetMenuCollapse(broken) 语义)。SubMenu 承载常规展示;若当前选中项落在该分组子树内,该分组须有**可区分的选中子树**样式(例如高亮父级)。onOpenChange 中实现**同级手风琴**——用户**新展开**某节点时,**同一父级下**已展开的**兄弟**节点须关闭;用户主动收起时以传入的 openKeys 为准。(非 antd 默认,须自实现。)openKeys 移除其**兄弟** key 再并入当前 key;关闭时仅移除该 key。展开/关闭后须在 DOM/动画稳定后**重新检测**是否需滚动条(允许短延迟,如 ~300–500ms)。scrollTop 双向同步;支持鼠标拖拽与触摸拖拽;拖拽期间由 React 状态标记**滚动拖拽中**(与 §5 动效、§4.5 遮罩一致)。本节描述**自研叠加层**(非 antd 默认 token 可完整表达)的视觉与动效契约;实现可用任意 class 命名,但须复现状态、时长与层级关系。
calc(100% - 顶区高度))。出现与布局
opacity: 0)且 pointer-events: none,避免挡操作。transition,并带 delay(与菜单展开/重排动画衔接,目标约 0.3s 延迟 + 0.2s 过渡量级)。overflow-y: scroll 承担;自绘滑块仅**视觉与拖拽**同步 scrollTop。滑块(thumb)
background / width / margin 变化带过渡(目标约 0.3s),hover 时**加宽、变色**(目标宽约 12px、更高对比浅色)。拖拽中(与 §4.4 scrollDraging 等状态对应)
SubMenu 标题在 active/open/子树选中等态下**背景提亮**(rgba 白低不透明度阶梯)。hover / selected 背景与右侧 Caret 箭头显隐、颜色变化带**短过渡**;**已打开**叶子的箭头常显,未打开则隐藏,逻辑见数据模型,样式与 §4 选中态一致。prefers-reduced-motion;迁移时建议评估:至少保证**键盘可达性**不与自定义滚动条 pointer-events 冲突。| 概念 | 说明 |
|---|---|
| 菜单树 | 见 §2.1~§2.4 |
| 标题 | 顶区展示文案(常与接口站点名同源;与静态配置里的 projectName 可能不同源) |
| 是否收起 | 宿主控制折叠 |
| 当前选中键 | 与节点 id/key 对齐;常见为**数值型菜单 id**(含 hiddenPaths 场景的负数 id) |
| 已打开页列表 | 用于叶子「已打开」样式;项上 key 与菜单项 id 一致 |
| 回调语义 | 时机 |
|---|---|
| 设置折叠 | 断点变化、用户点遮罩、叶子点击前(固定模式)等;参数可为 boolean(是否与断点「broken」对齐)或**无参**(切换/收起);宿主须兼容:**boolean 时设为对应折叠态,无参时按约定的切换语义处理**。 |
| 打开菜单项 | 用户点击叶子;载荷为 §2.5 菜单项对象;固定模式下在收起动画后再触发 |
侧栏通常与主区域**兄弟**排列:一侧为侧栏,另一侧为 Layout(顶栏、多标签内容区等)。折叠状态应由宿主**单一数据源**驱动,并与顶栏等共享同一套折叠回调。
建议输入/输出与下列概念对齐(prop 名可重命名,语义须一致):
| 侧栏侧(示例名) | 含义 |
|---|---|
title |
顶区标题 |
tree |
合并后的分组树 |
panesOnShelf |
已打开页签列表(用于「已打开」样式) |
collapsed |
是否收起 |
curActivePaneKey |
当前选中页键 |
onClickMenuItem |
打开/激活标签页 |
onSetMenuCollapse |
折叠:支持 boolean 与无参(见 §6.2) |
验收标准见 task.md。
| 日期 | 摘要 |
|---|---|
| 2026-04-07 | 初稿,抽象侧栏菜单行为契约 |
| 2026-04-07 | 目标栈明确为 React + antd@6;验收迁至 task.md |
| 2026-04-07 | 对齐静态路径配置、壳集成与宿主合并/回调语义;去除具体仓库路径 |
| 2026-04-07 | 新增 §5 自定义样式与动效(滚动条/遮罩/Logo);宿主契约顺延为 §6 |
| 2026-04-07 | 新增 §1.1 业务职能(整站主导航与壳布局中的角色) |