执行 ROADMAP 的 S1-P4,按规划的三阶段走,本次完成 A 与 B。 阶段 A · 预计算 scenarios(验证「构建期预计算 + 运行时回退」链路) - tools/precompute.mjs:与 app.js 的 extractScenarios 逻辑完全一致, 构建期算出结果写进 data.components[].scenarios - app.js 加快速路径:优先读 c.scenarios,缺失时回退运行时解析 - 浏览器实测:预计算值与运行时提取值**完全一致**(逐字节比对) - 实测收益有限:仅 4 个组件有 ≥2 场景(场景卡片本就少见), 但链路验证通过,为阶段 C 的 API 预计算铺路 阶段 B · css 源码分离(零风险,css 不参与任何解析) - css 从 data.js 移到 site/sources/<slug>/css.txt(79 个文件) - data.js 里改为 sourcesRef.css 引用,data.json 保持完整(For Agents 承诺) - data.js: 1058 KB → 942 KB(−116 KB) - app.js 新增 srcOf(c, kind) / hasSrc(c, kind): · srcOf 同步返回已有源码,缺失时触发后台 fetch 并缓存 · __aaSrcReady 回调在加载完成后填充代码区 - 修正回调时机 bug:原实现捕获构建时的 current(初始 tab), 导致用户后续切换的 tab 收不到通知。改为回调内实时比对当前 tab 关于 P4 的实测修正(已登记 ROADMAP 规划修正记录) - 规划估计「拆 sources → ~110KB」。实测 css 仅占 119KB/888KB, 且 html/vue2/vue3/jsx 共 765KB 被**渲染期同步消费** (extractComponentAPI 读 vue3/vue2/jsx,extractScenarios 读 html) - 故需分阶段:A+B 先减 116KB,阶段 C 需先预计算 API 表才能分离其余 4 端 新增构建链(两步,不可省第二步) - npm run build:site = build-site.ps1 + precompute.mjs - build-site.ps1 会把 data.js 重写回全量,precompute 才做瘦身 - 已写入 AGENTS.md 的铁律章节(含「只跑第一步会怎样」的后果说明) 验证 - 回归 100%:1003/1003,79 页全通过,N/A 35 - 浏览器实测:展开代码区 → CSS tab → 2121 字符正常显示, Network 出现 sources/button/css.txt 请求 - 预计算 vs 运行时场景提取结果逐字节一致
35 lines
2.6 KiB
Plaintext
35 lines
2.6 KiB
Plaintext
/* Aurora Admin SideMenu 样式 — 对齐 组件7.txt SideMenu:多级、图标、徽章、选中态#F0F5FF+左指示条、折叠 */
|
|
|
|
.aa-sidemenu { width: 220px; background: var(--au-color-card-bg); border-right: 1px solid var(--au-color-border); font-family: var(--font-family, -apple-system, "PingFang SC", "Microsoft YaHei", sans-serif); color: var(--au-color-text-body); user-select: none; }
|
|
.aa-sidemenu.collapsed { width: 56px; }
|
|
|
|
.aa-menu-item { position: relative; display: flex; align-items: center; gap: 8px; height: 44px; padding: 0 16px; cursor: pointer; font-size: 14px; color: var(--au-color-text-body); transition: background .15s, color .15s; }
|
|
.aa-menu-item:hover { background: var(--au-color-page-bg); }
|
|
.aa-menu-item.is-active { background: var(--au-color-brand-bg); color: var(--au-color-brand); font-weight: 500; }
|
|
.aa-menu-item.is-active::before { content: ''; position: absolute; left: 0; top: 0; bottom: 0; width: 3px; background: var(--au-color-brand); }
|
|
.aa-menu-item.is-disabled { color: var(--au-color-text-disabled); cursor: not-allowed; }
|
|
.aa-menu-item.is-disabled:hover { background: none; }
|
|
|
|
.aa-menu-icon { width: 16px; text-align: center; flex-shrink: 0; font-size: 15px; }
|
|
.aa-menu-label { flex: 1; overflow: hidden; text-overflow: ellipsis; white-space: nowrap; }
|
|
.aa-menu-badge { background: var(--au-color-error); color: var(--au-color-text-inverse); font-size: 11px; min-width: 16px; height: 16px; border-radius: 8px; padding: 0 5px; display: inline-flex; align-items: center; justify-content: center; }
|
|
.aa-menu-arrow { color: var(--au-color-text-secondary); font-size: 12px; transition: transform .15s; }
|
|
.aa-menu-item.is-open > .aa-menu-arrow { transform: rotate(90deg); }
|
|
|
|
.aa-menu-children { background: var(--au-color-table-header-bg); }
|
|
.aa-menu-children .aa-menu-item { height: 40px; padding-left: 40px; font-size: 13px; }
|
|
.aa-menu-children .aa-menu-item.is-active::before { display: none; }
|
|
|
|
/* 折叠模式 */
|
|
.aa-sidemenu.collapsed .aa-menu-label,
|
|
.aa-sidemenu.collapsed .aa-menu-badge,
|
|
.aa-sidemenu.collapsed .aa-menu-arrow { display: none; }
|
|
.aa-sidemenu.collapsed .aa-menu-item { justify-content: center; padding: 0; }
|
|
.aa-sidemenu.collapsed .aa-menu-children { display: none; }
|
|
|
|
/* 折叠态悬浮浮层 */
|
|
.aa-menu-pop { position: absolute; left: 56px; top: 0; min-width: 180px; background: var(--au-color-card-bg); border: 1px solid var(--au-color-border); border-radius: 6px; box-shadow: 0 4px 12px rgba(0,0,0,0.12); padding: 4px 0; z-index: 200; }
|
|
.aa-menu-pop-title { padding: 6px 16px; font-size: 12px; color: var(--au-color-text-secondary); }
|
|
.aa-menu-pop .aa-menu-item { padding: 0 16px; }
|
|
.aa-menu-pop .aa-menu-item::before { display: none; }
|