feat(panel, PANEL_ENHANCE_PLAN 批1-B): 前端五页——首页仪表盘/音频电平/电源/进程服务/系统补强/网络健壮性/PIN 卡
- 新增 #/home 默认路由:单请求 /api/overview + 5s 节拍(电平 1s 子节拍独立), 卡片:设备信息(boot/默认启动)/电量/音频(rms·peak dBFS 双条电平表 -60..0)/WiFi+DNS/ 在跑App与服务健康/存储/性能小条;任一源 available:false 该卡显示「—」。 - 音频页:rms(青绿)+peak(黄) 双条电平表 + deci-dB 数值 + 近30采样 sparkline,轮询提速 1s;无流占位。 - 新增 #/power:电池卡 + 功耗估算卡(est_mw + confidence 徽标 estimated/derived/measured) + 子系统分解堆叠条(screen/wifi/bt/audio/cpu/baseline mW+占比)。 - 新增 #/proc:svcd 服务表(restart 计數>=3 高亮/来源 board|tf) + ams App 表(crashes/launches/last_kind), 行点开经 /api/files 列 MeowOS/logs/<pkg>/ 读最新 stdout_*.log 尾部(崩溃尾巴);全只读,无 restart/kill。 - 系统页补强:电池行、当前运行模式(后端已有 boot.mode/current 则显示) vs 默认启动并列(不一致高亮)、 重启原因/升级状态(后端未暴露时显示「—」)。 - 网络页健壮性(281 缺陷):status 瞬态失败不再整页踢「不可用」占位,改顶部内联错误条 + 5s 自动重试, 数据区保留上次成功内容。 - 设置页 PIN 卡:显示已设/未设/锁定状态,「修改 PIN」(旧+新双输入)与「清空 PIN」(旧 PIN 确认), 走 /api/auth/login 校验旧 PIN + PUT /api/settings/panel.pin。 - 首页置顶导航新增「首页」,默认路由 #/ 或 #/home;侧栏新增「电源」「进程·服务」入口。 验证:headless Chromium --dump-dom 静态样例数据(参照 281),9 页 JS 0 错误, 双主题(md3/miuix × dark/light)通过;proc stdout 尾部支持 5s 重渲染后重开。 仅改 patch_v2/meowpanel/web/。
This commit is contained in:
1 parent
d12164305d
commit
7ba0fde3e6
3 files changed
+768
-34
No files matched your search
@@ -381,3 +381,83 @@ input[type=range]{ width:100%; accent-color:var(--primary); }
|
||||
.topbar{ padding:0 10px; gap:8px; }
|
||||
.seg-btn{ padding:6px 9px; }
|
||||
}
|
||||
|
||||
/* ================= 批1-B:首页仪表盘 / 电平表 / 电源 / 进程 / PIN / 网络横幅 ================= */
|
||||
|
||||
/* 首页卡片网格 */
|
||||
.home-grid{ display:grid; grid-template-columns:repeat(auto-fill,minmax(320px,1fr)); gap:16px; }
|
||||
.home-grid .card{ margin-bottom:0; }
|
||||
.home-sub{ color:var(--on-surface-variant); font-size:12px; margin-top:4px; }
|
||||
.home-dash{ font-size:20px; font-weight:700; }
|
||||
.home-unit{ font-size:12px; font-weight:400; color:var(--on-surface-variant); margin-left:4px; }
|
||||
.home-bigval{ font-size:30px; font-weight:700; line-height:1.1; }
|
||||
.home-bigunit{ font-size:14px; font-weight:400; color:var(--on-surface-variant); margin-left:4px; }
|
||||
.home-chip{ display:inline-block; padding:1px 8px; border-radius:999px; font-size:11px; vertical-align:middle; }
|
||||
.home-chip.ok{ background:rgba(76,175,80,.18); color:var(--success); }
|
||||
.home-chip.warn{ background:rgba(255,179,0,.18); color:var(--warning); }
|
||||
.home-chip.bad{ background:rgba(207,102,121,.18); color:var(--error); }
|
||||
.home-chip.mut{ background:var(--surface-variant); color:var(--on-surface-variant); }
|
||||
.home-card-grid{ display:grid; grid-template-columns:1fr 1fr; gap:6px 16px; }
|
||||
.home-kv{ display:flex; justify-content:space-between; gap:10px; font-size:13px; padding:3px 0; }
|
||||
.home-kv .k{ color:var(--on-surface-variant); }
|
||||
.home-kv .v{ text-align:right; overflow:hidden; text-overflow:ellipsis; white-space:nowrap; }
|
||||
.dash-strip{ display:flex; align-items:center; gap:8px; margin-top:8px; }
|
||||
|
||||
/* 电平表(rms 青绿 / peak 黄,刻度 -60..0 dBFS) */
|
||||
.lvl{ margin-top:8px; }
|
||||
.lvl-row{ display:flex; align-items:center; gap:10px; margin-bottom:8px; }
|
||||
.lvl-lbl{ width:44px; color:var(--on-surface-variant); font-size:12px; font-weight:600; }
|
||||
.lvl-meter{ flex:1; height:14px; border-radius:99px; background:var(--surface-dim); overflow:hidden; border:var(--outline-w) solid var(--outline-variant); }
|
||||
.lvl-fill{ height:100%; border-radius:99px; transition:width .18s ease; }
|
||||
.lvl-fill.rms{ background:#00bfa5; }
|
||||
.lvl-fill.peak{ background:#ffb300; }
|
||||
.lvl-val{ width:58px; text-align:right; font-family:var(--mono); font-size:12px; color:var(--on-surface-variant); }
|
||||
.lvl-scale{ display:flex; justify-content:space-between; color:var(--on-surface-variant); font-size:10px; padding:2px 68px 0 54px; }
|
||||
.lvl-spark{ display:block; width:100%; height:46px; margin-top:8px; }
|
||||
.lvl-spark .grid{ stroke:var(--outline-variant); stroke-width:1; }
|
||||
.lvl-note{ color:var(--on-surface-variant); font-size:12px; margin-top:6px; }
|
||||
|
||||
/* 置信度徽标(measured/derived/estimated) */
|
||||
.conf-badge{ display:inline-flex; align-items:center; gap:5px; padding:3px 12px; border-radius:999px; font-size:12px; font-weight:600; }
|
||||
.conf-badge.measured{ background:rgba(76,175,80,.18); color:var(--success); }
|
||||
.conf-badge.derived{ background:rgba(74,139,245,.18); color:var(--primary); }
|
||||
.conf-badge.estimated{ background:rgba(255,179,0,.18); color:var(--warning); }
|
||||
.conf-badge.none{ background:var(--surface-variant); color:var(--on-surface-variant); }
|
||||
|
||||
/* 子系统分解堆叠条 */
|
||||
.stack{ display:flex; height:24px; border-radius:99px; overflow:hidden; background:var(--surface-dim); border:var(--outline-w) solid var(--outline-variant); margin-top:10px; }
|
||||
.stack > span{ height:100%; }
|
||||
.stack-legend{ display:flex; flex-wrap:wrap; gap:8px 16px; margin-top:12px; font-size:12px; }
|
||||
.stack-legend .sw{ display:inline-block; width:12px; height:12px; border-radius:3px; margin-right:5px; vertical-align:middle; }
|
||||
.stack-legend .seg{ display:inline-flex; align-items:center; }
|
||||
.up-strip{ display:flex; align-items:center; gap:10px; }
|
||||
|
||||
/* 电池展示 */
|
||||
.batt{ display:flex; align-items:center; gap:14px; }
|
||||
.batt-icon{ position:relative; width:40px; height:20px; border:2px solid var(--on-surface-variant); border-radius:4px; overflow:hidden; flex:0 0 40px; }
|
||||
.batt-icon::after{ content:""; position:absolute; right:-5px; top:5px; width:3px; height:8px; background:var(--on-surface-variant); border-radius:0 2px 2px 0; }
|
||||
.batt-icon .lvl-fill{ background:var(--success); }
|
||||
.batt-icon .lvl-fill.warn{ background:var(--warning); }
|
||||
.batt-icon .lvl-fill.bad{ background:var(--error); }
|
||||
.batt-icon .lvl-fill.charge{ background:var(--primary); }
|
||||
|
||||
/* 进程/服务页高亮与行内日志 */
|
||||
.restart-hi{ color:var(--error); font-weight:700; }
|
||||
.crash-hi{ color:var(--error); font-weight:700; }
|
||||
.proc-row{ cursor:pointer; }
|
||||
.proc-tail{ margin-top:8px; }
|
||||
.proc-badge{ display:inline-block; padding:1px 7px; border-radius:999px; font-size:11px; font-family:var(--mono); background:var(--surface-variant); color:var(--on-surface-variant); margin-right:4px; }
|
||||
.proc-badge.board{ background:rgba(74,139,245,.18); color:var(--primary); }
|
||||
.proc-badge.tf{ background:rgba(255,179,0,.18); color:var(--warning); }
|
||||
|
||||
/* 网络页内联错误横幅(不再整页踢「不可用」占位) */
|
||||
.page-banner{ display:flex; align-items:center; gap:12px; padding:10px 14px; border-radius:var(--radius-m); background:rgba(207,102,121,.13); color:var(--error); margin-bottom:14px; border:var(--outline-w) solid var(--outline-variant); font-size:13px; }
|
||||
.page-banner .ico{ font-size:16px; }
|
||||
.page-banner button{ margin-left:auto; }
|
||||
|
||||
/* 设置页 PIN 卡 */
|
||||
.pin-status{ font-size:13px; }
|
||||
.pin-status .dot{ display:inline-block; width:10px; height:10px; border-radius:50%; margin-right:6px; vertical-align:middle; }
|
||||
.pin-status .dot.set{ background:var(--success); }
|
||||
.pin-status .dot.unset{ background:var(--warning); }
|
||||
.pin-status .dot.locked{ background:var(--error); }
|
||||
Reference in new issue
Block a user