169 行
6.2 KiB
HTML
169 行
6.2 KiB
HTML
<!doctype html>
|
|
<html lang="zh-CN">
|
|
<head>
|
|
<meta charset="utf-8">
|
|
<meta name="viewport" content="width=device-width, initial-scale=1">
|
|
<title>Authorized Lab Dashboard</title>
|
|
<link rel="stylesheet" href="./assets/styles.css">
|
|
</head>
|
|
<body>
|
|
<div class="grid-bg" aria-hidden="true"></div>
|
|
<div class="dashboard-shell">
|
|
<header class="hero">
|
|
<div class="hero-glow hero-glow-left" aria-hidden="true"></div>
|
|
<div class="hero-glow hero-glow-right" aria-hidden="true"></div>
|
|
|
|
<div class="hero-top">
|
|
<div class="hero-copy">
|
|
<div class="hero-eyebrow">
|
|
<svg class="icon"><use href="./assets/icons.svg#spark"></use></svg>
|
|
<span>Authorized Lab Dashboard</span>
|
|
</div>
|
|
<h1>本地攻防实证工作台</h1>
|
|
<p>
|
|
Lovart 设计外壳已本地化并接入真实 run bundle 数据。页面只面向授权实验资产,
|
|
聚合 advisory、timeline、evidence、logs、sources、raw JSON 与失败原因。
|
|
</p>
|
|
</div>
|
|
|
|
<div class="hero-actions">
|
|
<button id="refreshDashboard" class="button button-primary" type="button">
|
|
<svg class="icon"><use href="./assets/icons.svg#refresh"></use></svg>
|
|
<span>Refresh</span>
|
|
</button>
|
|
<label class="toggle-card">
|
|
<span class="toggle-label">Auto Refresh</span>
|
|
<span class="toggle-switch">
|
|
<input id="autoRefresh" type="checkbox" checked>
|
|
<span class="toggle-slider"></span>
|
|
</span>
|
|
</label>
|
|
<div id="syncState" class="sync-state">
|
|
<svg class="icon icon-sync"><use href="./assets/icons.svg#sync"></use></svg>
|
|
<div>
|
|
<strong>Booting</strong>
|
|
<span>Loading generated JSON</span>
|
|
</div>
|
|
</div>
|
|
<div class="hero-links">
|
|
<a class="button button-secondary" href="./docs/project-features.html" target="_blank" rel="noreferrer">
|
|
<svg class="icon"><use href="./assets/icons.svg#docs"></use></svg>
|
|
<span>Feature Docs</span>
|
|
</a>
|
|
<a class="button button-secondary" href="./docs/frontend-dashboard-design.html" target="_blank" rel="noreferrer">
|
|
<svg class="icon"><use href="./assets/icons.svg#playbook"></use></svg>
|
|
<span>UI Spec</span>
|
|
</a>
|
|
<a class="button button-secondary" href="./legacy/index.html" target="_blank" rel="noreferrer">
|
|
<svg class="icon"><use href="./assets/icons.svg#legacy"></use></svg>
|
|
<span>Legacy UI</span>
|
|
</a>
|
|
</div>
|
|
</div>
|
|
</div>
|
|
|
|
<div id="metricCards" class="metrics-row"></div>
|
|
</header>
|
|
|
|
<main class="main-container">
|
|
<aside class="sidebar">
|
|
<section class="sidebar-section">
|
|
<div class="section-header">
|
|
<span>
|
|
<svg class="icon"><use href="./assets/icons.svg#filter"></use></svg>
|
|
Filters
|
|
</span>
|
|
<span id="runCount" class="section-badge">0 shown</span>
|
|
</div>
|
|
|
|
<div class="filter-group">
|
|
<label class="field">
|
|
<span>Search</span>
|
|
<div class="search-box">
|
|
<svg class="icon"><use href="./assets/icons.svg#search"></use></svg>
|
|
<input id="searchInput" type="text" placeholder="Search run id, advisory, title">
|
|
</div>
|
|
</label>
|
|
|
|
<label class="field">
|
|
<span>System</span>
|
|
<select id="systemFilter" class="filter-select">
|
|
<option value="">All systems</option>
|
|
</select>
|
|
</label>
|
|
|
|
<label class="field">
|
|
<span>Status</span>
|
|
<select id="statusFilter" class="filter-select">
|
|
<option value="">All statuses</option>
|
|
</select>
|
|
</label>
|
|
|
|
<label class="field">
|
|
<span>Profile</span>
|
|
<select id="profileFilter" class="filter-select">
|
|
<option value="">All profiles</option>
|
|
</select>
|
|
</label>
|
|
</div>
|
|
</section>
|
|
|
|
<section class="sidebar-section">
|
|
<div class="section-header">
|
|
<span>
|
|
<svg class="icon"><use href="./assets/icons.svg#systems"></use></svg>
|
|
Systems
|
|
</span>
|
|
</div>
|
|
<div id="systemStats" class="system-stats"></div>
|
|
</section>
|
|
|
|
<section class="sidebar-section">
|
|
<div class="section-header">
|
|
<span>
|
|
<svg class="icon"><use href="./assets/icons.svg#failure"></use></svg>
|
|
Recent Failures
|
|
</span>
|
|
</div>
|
|
<div id="recentFailures" class="failure-list"></div>
|
|
</section>
|
|
|
|
<section class="sidebar-section sidebar-section-fill">
|
|
<div class="section-header">
|
|
<span>
|
|
<svg class="icon"><use href="./assets/icons.svg#queue"></use></svg>
|
|
Run Queue
|
|
</span>
|
|
</div>
|
|
<div id="runQueue" class="run-list"></div>
|
|
</section>
|
|
</aside>
|
|
|
|
<section id="detailWorkspace" class="workspace">
|
|
<div class="workspace-empty">
|
|
<svg class="icon icon-xl"><use href="./assets/icons.svg#shield"></use></svg>
|
|
<h2>Select a run</h2>
|
|
<p>Pick a run from the left queue to inspect timeline, evidence, logs, sources and raw JSON.</p>
|
|
</div>
|
|
</section>
|
|
</main>
|
|
|
|
<footer class="dashboard-footer">
|
|
<div class="footer-left">
|
|
<span class="footer-note">
|
|
<svg class="icon"><use href="./assets/icons.svg#source"></use></svg>
|
|
UI shell is vendorized from a local Lovart source copy, not an online runtime dependency.
|
|
</span>
|
|
</div>
|
|
<div class="footer-links">
|
|
<a href="./docs/design-source.html" target="_blank" rel="noreferrer">Design source</a>
|
|
<a href="./assets/design-source.json" target="_blank" rel="noreferrer">Manifest JSON</a>
|
|
<a href="./summary.json" target="_blank" rel="noreferrer">Summary JSON</a>
|
|
</div>
|
|
</footer>
|
|
</div>
|
|
|
|
<script src="./assets/app.js"></script>
|
|
</body>
|
|
</html>
|