组件 SHALL 从注入的 tree 数据结构渲染三级菜单树。结构为 key > label > children > key > label > children。每个节点 SHALL 包含 id、name、可选 type 字段。当节点包含非空 children 时,SHALL 渲染为 SubMenu;否则为叶子项。
当用户展开一个节点时,组件 SHALL 关闭之前展开的节点。全局最多同时只有一个展开分支。
当视口宽度低于 lg 断点时(移动端),侧边栏 SHALL 进入固定模式,以 position: fixed 悬浮覆盖在内容之上。当菜单展开时 SHALL 显示背景遮罩,点击遮罩 SHALL 触发收起。PC 端不启用覆盖模式。
在固定模式下,当用户点击叶子项时,组件 SHALL 先触发收起(onSetMenuCollapse(true)),然后在约 300ms 延迟后调用 onClickMenuItem,以避免动画闪烁。
当用户点击叶子菜单项时,组件 SHALL 调用 onClickMenuItem,传入完整的菜单项对象,至少包含 id、name、path、pageName 字段。
组件 SHALL 支持 onSetMenuCollapse 的两种调用模式:boolean 参数(设置精确折叠状态)和无参调用(切换)。宿主应用 SHALL 处理这两种模式。
当注入的 tree 为空或 undefined 时,组件 SHALL 渲染标题区域和空菜单区域,且不抛出错误。
当 curActivePaneKey 与菜单节点的 id 或 key 匹配时,该节点 SHALL 显示选中样式。当叶子项被选中时,其所属 SubMenu SHALL 显示子树选中样式。
当 panesOnShelf 中的某个条目的 key 与叶子节点的 id 匹配时,该叶子 SHALL 显示"已打开"指示器样式。