Skip to content
bitzorcas
中EN

Reference

应用壳层与工作区

Design System 1.2 的 Side/Top Shell、导航所有权、磁吸 Local Tabs、全局工具与 Single Route/Managed Tabs 语义。

Last updated

应用壳层与工作区

Shell 和 Workspace 是 Pattern,不是 Theme。Theme 可以切换颜色,不能改变导航结构;同一产品区域也不能逐页更换 Shell。

稳定区域

Global Brand / Product
Global Navigation
Global Search / Command
Workspace Switcher
Page Context
User / Notification / Help
Content Viewport
Optional Contextual Utility

全局能力进入 Shell,页面操作进入 Page Header 或局部工具栏。“新建案件”不得同时出现在顶栏、侧栏和页面标题区。

Side Shell

适合模块多、层级深、长时间停留的法律业务主工作台。

属性CompactComfortable
展开宽度240px256px
折叠宽度64px68px
Global bar56px64px
Workspace tabs36px40px
一级菜单最小热区40px44px
  • 默认展开,折叠属于用户偏好。
  • 常驻菜单最多两级;第三层进入模块局部导航或 Command。
  • 激活态使用表面差、字重和 2px 指示线,不只依赖颜色。
  • 不再并排常驻第二个 240px 树形栏。

Side Shell 在同一受治理表面内分成 64px 模块轨道与当前模块面板:展开宽度可在 120–320px 拖拽调整,默认 176px(64+176=240,与 Header 磁吸网格对齐)。结果按 120ms 防抖写入本地偏好并经 WorkspacePreferencesProvider 同步——只改变个人呈现,不改变 URL、权限和菜单层级。键盘步进与双击复位尚未实现。

Side Shell 与 Managed Tabs

Top Shell

适合模块较少、跨模块切换频繁、门户型或以搜索为中心的产品。

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

Top Shell 与 Single Route

导航所有权与磁吸 Tabs

类型所有者Side ShellTop Shell滚动行为
一级模块导航Shell模块轨道Primary bar固定
当前模块导航Shell二级面板Secondary bar固定
Workspace TabsWorkspace ManagerGlobal 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 端点读取允许的工作区偏好,并在设备间同步;业务页面不应再次读取这些环境变量。

frontend/apps/app/.env.local
# 只设置受生成契约允许的稳定 ID;非法 Shell 会回退为 side。
VITE_BRAND_THEME=legal-navy
VITE_DENSITY=dense
VITE_SHELL_PRESET=side

Side/Top 切换、二级上下文面板与 Single Route 已在当前管理端落地。上表中的 Managed Tabs 仍是冻结的 Pattern 合同;溢出、脏状态确认和恢复矩阵尚未闭环,因此不能把普通 Local Tabs 或固定视图称为“Managed Tabs 已交付”。

100%

滚轮或按钮缩放 · 放大后拖动画面 · 双击切换 100% / 200%