# 06: 驾驶舱自有静态资产与视觉占位 **What to build:** 建立驾驶舱自有静态资产目录、基础视觉 token 和占位图、图标、状态标签。正式设计资源后续可直接替换,不改变信息架构。 Blocked by: 01 Status: resolved Labels: ready-for-agent > 请勿据标签重复接单:本票已完成并有走查记录,`Labels` 保留只是为了让面板不把它退化成 `needs-triage`。 - [x] 驾驶舱静态资源使用自有目录,不依赖插件静态资源目录。 - [x] 建立颜色、间距、字号、层级等基础 token。 - [x] 提供地图占位、面板占位、图标和状态标签。 - [x] 视觉资源可替换,不影响模式与面板结构。 - [x] 有资源引用走查记录。 ## 进度:100% ## 交付物 `public/cockpit/README.md` 资产目录说明:现在只有临时影像 `aerial.webp`(维护者提供、**无地理配准**,真底图归票 21);写清引用方式必须走 `import.meta.env.BASE_URL` 拼接(`publicPath: './'` 与 qiankun 注入路径下都要能取到,不许硬编码 `/cockpit/...`)与正式资源替换约定。 `src/modules/cockpit/styles/tokens.css` 唯一 token 来源,挂在 `.cockpit-shell` 上而**不是** `:root`:`--cyan / --text / --font / --muted` 这类名字太通用,挂根元素会顺着全局样式漏进宿主应用与 `src/plugins` 的插件样式。含五类:底色/面板、主色与语义色(`--lv1..--lv4` + `--neutral`)、文字、字体、字号 `--fs-*`、间距 `--space-*`、层级 `--z-*`、阴影。组件内的装饰性渐变/辉光仍是散落的 `rgba`(不属主题色),已在文件头注明。 `src/modules/cockpit/domain/icons.js` + `src/modules/cockpit/components/CockpitIcon.vue` 6 个内联 SVG 占位图标(`brand / layers / points / event / resource / blank`),`currentColor` 跟随文字色;未知图标渲染为空而不抛错——图标属视觉资源,缺失不该打断骨架渲染。数据与渲染分开,将来换图片或图标字体只改数据文件。 `src/modules/cockpit/domain/statusTones.js` + `src/modules/cockpit/components/StatusTag.vue` 色键 `lv1..lv4 + neutral`(与 ADR 0008 事件四级同调色板);标签是**色块 + 文字**而不是纯色点,因为 ADR 0006 要求状态不能只靠颜色区分;未知色键退回中性灰。文件里只定义「视觉可用的色键」,不定义业务映射(「报警 → lv1」这类判定归点位状态票),避免业务规则藏进样式。 `src/modules/cockpit/components/PanelPlaceholder.vue` 面板体占位(虚框 + 图标 + `面板占位 · ` + 数据源提示),`data-panel-id` 便于后续走查定位。正式面板内容落地时只替换外壳插槽,标题与结构(`panelCatalog.js`)不动。 外壳改动 品牌位改用 `CockpitIcon`;面板体改用 `PanelPlaceholder`;`--u` 与主题色从内联样式迁到 tokens.css;地图图例的 1–4 级硬编码色块改用 `StatusTag`,顺手删掉重复的 `.map-holo__chip.c1..c4`(语义色第二次声明的地方);顶栏高度与所在网格轨道对齐(52 设计像素,此前 56 高却有 52 的轨道)。 ## 验收证据 `node .scratch/cockpit-shell-panel-layout/verify/t06-assets.mjs` → 15/15 通过(A 资产 2 · B token 4 · C 占位/图标/标签 5 · D 结构 2 · E 引用走查 1)。 - A2 反向扫描:`src/modules/cockpit/**`、`src/pages/cockpit/**` 全文无 `public/plugins`、`/plugins/xxx`、`PLS`、`FES_APP_PLSNAME` 命中。 - B2 五类 token 齐全;B3 断言语义色只在 tokens.css 声明一次,组件里再写一份即失败。 - C3 图标为纯标记(`viewBox` 合法、`inner` 非空、不含 ` vh=950`。页面顶部有 TvT 演示菜单「📀 预览演示 / 📜 源码地址 / 📚 说明文档」,而这些菜单只存在于 `.fes.predev.js` 与 `.fes.predev.one.js`(`layout.navigation: 'top'` + `isFixedHeader: true`)。Fes 布局 `src/.fes/plugin-layout/views/BaseLayout.vue` 走 `'top'` 分支渲染 54px 固定页头,把内容区顶到 `top: 54px`,外壳再按 `100vh` 铺就被挤出容器底部。 - 绿的那次(本次):`pageHeaderH: 0`、外壳 `y=0 h=950`、`main.bottom=938 ≤ 950`。服务跑的是 `.fes.js` 环境(`layout.navigation: null`),`BaseLayout.vue` 落到最后的 `