应用壳层与工作区
Shell 和 Workspace 是 Pattern,不是 Theme。Theme 可以切换颜色,不能改变导航结构;同一产品区域也不能逐页更换 Shell。
稳定区域
Global Brand / ProductGlobal NavigationGlobal Search / CommandWorkspace SwitcherPage ContextUser / Notification / HelpContent ViewportOptional Contextual Utility全局能力进入 Shell,页面操作进入 Page Header 或局部工具栏。“新建案件”不得同时出现在顶栏、侧栏和页面标题区。
Side Shell
适合模块多、层级深、长时间停留的法律业务主工作台。
| 属性 | Compact | Comfortable |
|---|---|---|
| 展开宽度 | 240px | 256px |
| 折叠宽度 | 64px | 68px |
| Global bar | 56px | 64px |
| Workspace tabs | 36px | 40px |
| 一级菜单最小热区 | 40px | 44px |
- 默认展开,折叠属于用户偏好。
- 常驻菜单最多两级;第三层进入模块局部导航或 Command。
- 激活态使用表面差、字重和 2px 指示线,不只依赖颜色。
- 不再并排常驻第二个 240px 树形栏。
Side Shell 在同一受治理表面内分成 64px 模块轨道与当前模块面板:展开宽度可在 120–320px 拖拽调整,默认 176px(64+176=240,与 Header 磁吸网格对齐)。结果按 120ms 防抖写入本地偏好并经 WorkspacePreferencesProvider 同步——只改变个人呈现,不改变 URL、权限和菜单层级。键盘步进与双击复位尚未实现。

Top Shell
适合模块较少、跨模块切换频繁、门户型或以搜索为中心的产品。
- Primary bar 高度为 Compact 56px、Comfortable 64px。
- 当前模块 Secondary bar 高度为 Compact 40px、Comfortable 44px。
- 一级入口建议不超过 6 个,其余进入“更多”。
- Secondary Navigation、Workspace Tabs 和 Page Tabs 是不同层级,不得混用。
- 不能把品牌、全局搜索、十几个模块和所有工具挤在同一行。
- 宽度不足时以包含全部授权入口的模块菜单替换直接入口,不能只用
overflow: hidden裁掉链接。

导航所有权与磁吸 Tabs
| 类型 | 所有者 | Side Shell | Top Shell | 滚动行为 |
|---|---|---|---|---|
| 一级模块导航 | Shell | 模块轨道 | Primary bar | 固定 |
| 当前模块导航 | Shell | 二级面板 | Secondary bar | 固定 |
| Workspace Tabs | Workspace Manager | Global bar 下独立行 | Secondary bar 下独立行 | 仅 Managed Tabs |
| Local Tabs | 页面 | Page Header 后 | Page Header 后 | 到内容视口顶边后磁吸 |
例如 Identity 的“用户 / 组织 / 准入与授权 / 安全 / 应用凭据 / 租户治理”属于当前模块导航:Side 模式只在二级面板显示,Top 模式只在 40px Secondary bar 显示,页面标题区不再复制一遍。
真正的 Local Tabs,例如“账号邀请 / 账号申请 / 角色与权限 / 条件规则 / 功能开关 / 登录审计”,使用 WorkspaceLocalTabs 承载。向上滚动时,它们以单行吸附在 Shell 固定栏下方;Page Header 的标题与关键操作进入 Global bar,Local Tabs 不进入 Global bar。
- 同一层只允许一排 Local Tabs;不能上下堆叠两排同形 Tabs。
- 选中态同时使用字重、文字/表面差和 2px 指示线。
- 空间不足时单行横向滚动或进入溢出菜单,不换行、不出现纵向滚动条。
- Local Tabs 必须映射 URL 或稳定可恢复状态,并保留键盘与
aria-selected语义。
Global bar 工具
右侧能力顺序为 Search / Command(有 owner 时) → Notification → Help(有 owner 时) → Account。
Notification 不是装饰铃铛:它读取服务端收件箱和未读数,覆盖加载、空、错误、单条已读、全部已读,并只打开校验后的站内路径。Account 浮层承载当前用户、当前工作空间、账号安全与退出,不在顶栏常驻技术租户标识。
Search、Help、Theme、Density 等入口只有在路由、权限、状态和偏好 owner 已闭环时才出现。不要为了模仿其他产品放置无行为图标。
Single Route
- 一个浏览器 URL 对应一个主要工作面。
- 不显示空的 Workspace Tabs 行。
- 页面局部 Tabs 只切换当前资源内部内容,例如“概览 / 文档 / 时间线”。
- 适合门户、配置、Identity 和窄屏。
Managed Tabs
用于多案件、多客户对照。每个 Tab 必须由稳定 URL 与资源键标识。
实现必须处理:
- 同一资源重复打开时聚焦既有 Tab;
- 溢出、固定、排序、批量关闭;
- 未保存更改的关闭确认;
- 刷新和重新登录后的受控恢复;
- 无权限、已删除或跨租户资源的失效处理;
- 与浏览器 Back/Forward 的一致关系。
Workspace Tabs 不能替代页面局部 Tabs,也不能把每次跳转都永久堆成 Tab。
Profile 选择
| 场景 | 当前实现 |
|---|---|
| 法律桌面主工作台 | Side Shell + 管理标签区 + Density 默认 dense |
| 门户与搜索中心 | Top Shell(VITE_SHELL_PRESET=top)+ 单路由 |
| 登录、MFA、找回密码 | 由登录模板路由固定,不提供壳层切换 |
不存在 platform-* / identity-flow / touch-context 启动 Profile 常量——前端以四个环境变量取首屏安全默认值(见下节)。Managed Tabs 是冻结的 Pattern 合同,未作为运行时开关暴露。
产品在启动配置中选择 Profile。当前 Web 管理端可用 VITE_SHELL_PRESET=side|top 切换;非法值安全回退为 side。业务页面只继承,不自行判断。
当前配置与实现边界
以下变量只提供首屏安全默认值。用户登录后,WorkspacePreferencesProvider 会从类型化 Menu
端点读取允许的工作区偏好,并在设备间同步;业务页面不应再次读取这些环境变量。
# 只设置受生成契约允许的稳定 ID;非法 Shell 会回退为 side。VITE_BRAND_THEME=legal-navyVITE_DENSITY=denseVITE_SHELL_PRESET=sideSide/Top 切换、二级上下文面板与 Single Route 已在当前管理端落地。上表中的 Managed Tabs 仍是冻结的 Pattern 合同;溢出、脏状态确认和恢复矩阵尚未闭环,因此不能把普通 Local Tabs 或固定视图称为“Managed Tabs 已交付”。