更新: 74 个文件 - 2026-03-17 03:15:00

这个提交包含在:
hao
2026-03-17 03:15:00 -07:00
父节点 63d6100f54
当前提交 e7248b76c6
修改 74 个文件,包含 286 行新增132 行删除

查看文件

@@ -12,7 +12,7 @@
- 已实证(synthetic): `0`
- 阻塞数: `0`
- 待人工/缺浏览器证据: `0`
- 最近渲染时间: `2026-03-17T09:29:47+00:00`
- 最近渲染时间: `2026-03-17T09:39:17+00:00`
## 目标约束

查看文件

@@ -12,7 +12,7 @@
- 已实证(synthetic): `0`
- 阻塞数: `0`
- 待人工/缺浏览器证据: `0`
- 最近渲染时间: `2026-03-17T09:29:47+00:00`
- 最近渲染时间: `2026-03-17T09:39:17+00:00`
## 目标约束

查看文件

@@ -12,7 +12,7 @@
- 已实证(synthetic): `0`
- 阻塞数: `0`
- 待人工/缺浏览器证据: `0`
- 最近渲染时间: `2026-03-17T09:29:47+00:00`
- 最近渲染时间: `2026-03-17T09:39:17+00:00`
## 目标约束

查看文件

@@ -12,7 +12,7 @@
- 已实证(synthetic): `0`
- 阻塞数: `0`
- 待人工/缺浏览器证据: `0`
- 最近渲染时间: `2026-03-17T09:29:47+00:00`
- 最近渲染时间: `2026-03-17T09:39:17+00:00`
## 目标约束

查看文件

@@ -12,7 +12,7 @@
- 已实证(synthetic): `0`
- 阻塞数: `0`
- 待人工/缺浏览器证据: `0`
- 最近渲染时间: `2026-03-17T09:29:47+00:00`
- 最近渲染时间: `2026-03-17T09:39:17+00:00`
## 目标约束

查看文件

@@ -12,7 +12,7 @@
- 已实证(synthetic): `0`
- 阻塞数: `0`
- 待人工/缺浏览器证据: `0`
- 最近渲染时间: `2026-03-17T09:29:47+00:00`
- 最近渲染时间: `2026-03-17T09:39:17+00:00`
## 目标约束

查看文件

@@ -12,7 +12,7 @@
- 已实证(synthetic): `0`
- 阻塞数: `0`
- 待人工/缺浏览器证据: `0`
- 最近渲染时间: `2026-03-17T09:29:47+00:00`
- 最近渲染时间: `2026-03-17T09:39:17+00:00`
## 目标约束

查看文件

@@ -12,7 +12,7 @@
- 已实证(synthetic): `0`
- 阻塞数: `0`
- 待人工/缺浏览器证据: `0`
- 最近渲染时间: `2026-03-17T09:29:47+00:00`
- 最近渲染时间: `2026-03-17T09:39:17+00:00`
## 目标约束

查看文件

@@ -12,7 +12,7 @@
- 已实证(synthetic): `0`
- 阻塞数: `0`
- 待人工/缺浏览器证据: `0`
- 最近渲染时间: `2026-03-17T09:29:47+00:00`
- 最近渲染时间: `2026-03-17T09:39:17+00:00`
## 目标约束

查看文件

@@ -12,7 +12,7 @@
- 已实证(synthetic): `0`
- 阻塞数: `0`
- 待人工/缺浏览器证据: `0`
- 最近渲染时间: `2026-03-17T09:29:47+00:00`
- 最近渲染时间: `2026-03-17T09:39:17+00:00`
## 目标约束

查看文件

@@ -12,7 +12,7 @@
- 已实证(synthetic): `0`
- 阻塞数: `0`
- 待人工/缺浏览器证据: `0`
- 最近渲染时间: `2026-03-17T09:29:47+00:00`
- 最近渲染时间: `2026-03-17T09:39:17+00:00`
## 目标约束

查看文件

@@ -12,7 +12,7 @@
- 已实证(synthetic): `0`
- 阻塞数: `0`
- 待人工/缺浏览器证据: `0`
- 最近渲染时间: `2026-03-17T09:29:47+00:00`
- 最近渲染时间: `2026-03-17T09:39:17+00:00`
## 目标约束

查看文件

@@ -12,7 +12,7 @@
- 已实证(synthetic): `0`
- 阻塞数: `0`
- 待人工/缺浏览器证据: `0`
- 最近渲染时间: `2026-03-17T09:29:47+00:00`
- 最近渲染时间: `2026-03-17T09:39:17+00:00`
## 目标约束

查看文件

@@ -12,7 +12,7 @@
- 已实证(synthetic): `0`
- 阻塞数: `0`
- 待人工/缺浏览器证据: `0`
- 最近渲染时间: `2026-03-17T09:29:47+00:00`
- 最近渲染时间: `2026-03-17T09:39:17+00:00`
## 目标约束

查看文件

@@ -12,7 +12,7 @@
- 已实证(synthetic): `0`
- 阻塞数: `0`
- 待人工/缺浏览器证据: `0`
- 最近渲染时间: `2026-03-17T09:29:47+00:00`
- 最近渲染时间: `2026-03-17T09:39:17+00:00`
## 目标约束

查看文件

@@ -12,7 +12,7 @@
- 已实证(synthetic): `0`
- 阻塞数: `0`
- 待人工/缺浏览器证据: `0`
- 最近渲染时间: `2026-03-17T09:29:47+00:00`
- 最近渲染时间: `2026-03-17T09:39:17+00:00`
## 目标约束

查看文件

@@ -12,7 +12,7 @@
- 已实证(synthetic): `0`
- 阻塞数: `0`
- 待人工/缺浏览器证据: `0`
- 最近渲染时间: `2026-03-17T09:29:47+00:00`
- 最近渲染时间: `2026-03-17T09:39:17+00:00`
## 目标约束

查看文件

@@ -12,7 +12,7 @@
- 已实证(synthetic): `0`
- 阻塞数: `0`
- 待人工/缺浏览器证据: `0`
- 最近渲染时间: `2026-03-17T09:29:47+00:00`
- 最近渲染时间: `2026-03-17T09:39:17+00:00`
## 目标约束

查看文件

@@ -12,7 +12,7 @@
- 已实证(synthetic): `0`
- 阻塞数: `0`
- 待人工/缺浏览器证据: `0`
- 最近渲染时间: `2026-03-17T09:29:50+00:00`
- 最近渲染时间: `2026-03-17T09:39:19+00:00`
## 目标约束

查看文件

@@ -12,7 +12,7 @@
- 已实证(synthetic): `0`
- 阻塞数: `0`
- 待人工/缺浏览器证据: `0`
- 最近渲染时间: `2026-03-17T09:29:50+00:00`
- 最近渲染时间: `2026-03-17T09:39:20+00:00`
## 目标约束

查看文件

@@ -12,7 +12,7 @@
- 已实证(synthetic): `0`
- 阻塞数: `0`
- 待人工/缺浏览器证据: `0`
- 最近渲染时间: `2026-03-17T09:29:50+00:00`
- 最近渲染时间: `2026-03-17T09:39:19+00:00`
## 目标约束

查看文件

@@ -12,7 +12,7 @@
- 已实证(synthetic): `0`
- 阻塞数: `0`
- 待人工/缺浏览器证据: `0`
- 最近渲染时间: `2026-03-17T09:29:50+00:00`
- 最近渲染时间: `2026-03-17T09:39:20+00:00`
## 目标约束

查看文件

@@ -12,7 +12,7 @@
- 已实证(synthetic): `0`
- 阻塞数: `0`
- 待人工/缺浏览器证据: `0`
- 最近渲染时间: `2026-03-17T09:29:50+00:00`
- 最近渲染时间: `2026-03-17T09:39:20+00:00`
## 目标约束

查看文件

@@ -12,7 +12,7 @@
- 已实证(synthetic): `0`
- 阻塞数: `0`
- 待人工/缺浏览器证据: `0`
- 最近渲染时间: `2026-03-17T09:29:50+00:00`
- 最近渲染时间: `2026-03-17T09:39:20+00:00`
## 目标约束

查看文件

@@ -12,7 +12,7 @@
- 已实证(synthetic): `0`
- 阻塞数: `0`
- 待人工/缺浏览器证据: `0`
- 最近渲染时间: `2026-03-17T09:29:50+00:00`
- 最近渲染时间: `2026-03-17T09:39:19+00:00`
## 目标约束

查看文件

@@ -12,7 +12,7 @@
- 已实证(synthetic): `0`
- 阻塞数: `0`
- 待人工/缺浏览器证据: `0`
- 最近渲染时间: `2026-03-17T09:29:50+00:00`
- 最近渲染时间: `2026-03-17T09:39:19+00:00`
## 目标约束

查看文件

@@ -12,7 +12,7 @@
- 已实证(synthetic): `0`
- 阻塞数: `0`
- 待人工/缺浏览器证据: `0`
- 最近渲染时间: `2026-03-17T09:29:50+00:00`
- 最近渲染时间: `2026-03-17T09:39:20+00:00`
## 目标约束

查看文件

@@ -12,7 +12,7 @@
- 已实证(synthetic): `0`
- 阻塞数: `0`
- 待人工/缺浏览器证据: `0`
- 最近渲染时间: `2026-03-17T09:29:50+00:00`
- 最近渲染时间: `2026-03-17T09:39:20+00:00`
## 目标约束

查看文件

@@ -12,7 +12,7 @@
- 已实证(synthetic): `0`
- 阻塞数: `0`
- 待人工/缺浏览器证据: `0`
- 最近渲染时间: `2026-03-17T09:29:50+00:00`
- 最近渲染时间: `2026-03-17T09:39:19+00:00`
## 目标约束

查看文件

@@ -12,7 +12,7 @@
- 已实证(synthetic): `0`
- 阻塞数: `0`
- 待人工/缺浏览器证据: `0`
- 最近渲染时间: `2026-03-17T09:29:50+00:00`
- 最近渲染时间: `2026-03-17T09:39:19+00:00`
## 目标约束

查看文件

@@ -12,7 +12,7 @@
- 已实证(synthetic): `0`
- 阻塞数: `0`
- 待人工/缺浏览器证据: `0`
- 最近渲染时间: `2026-03-17T09:29:50+00:00`
- 最近渲染时间: `2026-03-17T09:39:20+00:00`
## 目标约束

查看文件

@@ -12,7 +12,7 @@
- 已实证(synthetic): `0`
- 阻塞数: `0`
- 待人工/缺浏览器证据: `0`
- 最近渲染时间: `2026-03-17T09:29:50+00:00`
- 最近渲染时间: `2026-03-17T09:39:19+00:00`
## 目标约束

查看文件

@@ -12,7 +12,7 @@
- 已实证(synthetic): `0`
- 阻塞数: `0`
- 待人工/缺浏览器证据: `26`
- 最近渲染时间: `2026-03-17T09:29:49+00:00`
- 最近渲染时间: `2026-03-17T09:39:18+00:00`
## 目标约束

查看文件

@@ -12,7 +12,7 @@
- 已实证(synthetic): `0`
- 阻塞数: `0`
- 待人工/缺浏览器证据: `0`
- 最近渲染时间: `2026-03-17T09:29:50+00:00`
- 最近渲染时间: `2026-03-17T09:39:19+00:00`
## 目标约束

查看文件

@@ -12,7 +12,7 @@
- 已实证(synthetic): `0`
- 阻塞数: `0`
- 待人工/缺浏览器证据: `0`
- 最近渲染时间: `2026-03-17T09:29:49+00:00`
- 最近渲染时间: `2026-03-17T09:39:18+00:00`
## 目标约束

查看文件

@@ -12,7 +12,7 @@
- 已实证(synthetic): `0`
- 阻塞数: `0`
- 待人工/缺浏览器证据: `0`
- 最近渲染时间: `2026-03-17T09:29:50+00:00`
- 最近渲染时间: `2026-03-17T09:39:20+00:00`
## 目标约束

查看文件

@@ -12,7 +12,7 @@
- 已实证(synthetic): `0`
- 阻塞数: `0`
- 待人工/缺浏览器证据: `0`
- 最近渲染时间: `2026-03-17T09:29:47+00:00`
- 最近渲染时间: `2026-03-17T09:39:17+00:00`
## 目标约束

查看文件

@@ -12,7 +12,7 @@
- 已实证(synthetic): `0`
- 阻塞数: `0`
- 待人工/缺浏览器证据: `0`
- 最近渲染时间: `2026-03-17T09:29:50+00:00`
- 最近渲染时间: `2026-03-17T09:39:20+00:00`
## 目标约束

查看文件

@@ -12,7 +12,7 @@
- 已实证(synthetic): `0`
- 阻塞数: `0`
- 待人工/缺浏览器证据: `0`
- 最近渲染时间: `2026-03-17T09:29:50+00:00`
- 最近渲染时间: `2026-03-17T09:39:20+00:00`
## 目标约束

查看文件

@@ -12,7 +12,7 @@
- 已实证(synthetic): `0`
- 阻塞数: `0`
- 待人工/缺浏览器证据: `0`
- 最近渲染时间: `2026-03-17T09:29:50+00:00`
- 最近渲染时间: `2026-03-17T09:39:20+00:00`
## 目标约束

查看文件

@@ -12,7 +12,7 @@
- 已实证(synthetic): `0`
- 阻塞数: `0`
- 待人工/缺浏览器证据: `0`
- 最近渲染时间: `2026-03-17T09:29:50+00:00`
- 最近渲染时间: `2026-03-17T09:39:19+00:00`
## 目标约束

查看文件

@@ -12,7 +12,7 @@
- 已实证(synthetic): `0`
- 阻塞数: `0`
- 待人工/缺浏览器证据: `0`
- 最近渲染时间: `2026-03-17T09:29:50+00:00`
- 最近渲染时间: `2026-03-17T09:39:20+00:00`
## 目标约束

查看文件

@@ -12,7 +12,7 @@
- 已实证(synthetic): `0`
- 阻塞数: `0`
- 待人工/缺浏览器证据: `14`
- 最近渲染时间: `2026-03-17T09:29:50+00:00`
- 最近渲染时间: `2026-03-17T09:39:20+00:00`
## 目标约束

查看文件

@@ -12,7 +12,7 @@
- 已实证(synthetic): `0`
- 阻塞数: `0`
- 待人工/缺浏览器证据: `12`
- 最近渲染时间: `2026-03-17T09:29:50+00:00`
- 最近渲染时间: `2026-03-17T09:39:19+00:00`
## 目标约束

查看文件

@@ -12,7 +12,7 @@
- 已实证(synthetic): `0`
- 阻塞数: `0`
- 待人工/缺浏览器证据: `0`
- 最近渲染时间: `2026-03-17T09:29:49+00:00`
- 最近渲染时间: `2026-03-17T09:39:18+00:00`
## 目标约束

查看文件

@@ -12,7 +12,7 @@
- 已实证(synthetic): `0`
- 阻塞数: `0`
- 待人工/缺浏览器证据: `0`
- 最近渲染时间: `2026-03-17T09:29:50+00:00`
- 最近渲染时间: `2026-03-17T09:39:20+00:00`
## 目标约束

查看文件

@@ -12,7 +12,7 @@
- 已实证(synthetic): `0`
- 阻塞数: `0`
- 待人工/缺浏览器证据: `0`
- 最近渲染时间: `2026-03-17T09:29:50+00:00`
- 最近渲染时间: `2026-03-17T09:39:20+00:00`
## 目标约束

查看文件

@@ -12,7 +12,7 @@
- 已实证(synthetic): `0`
- 阻塞数: `0`
- 待人工/缺浏览器证据: `0`
- 最近渲染时间: `2026-03-17T09:29:50+00:00`
- 最近渲染时间: `2026-03-17T09:39:20+00:00`
## 目标约束

查看文件

@@ -12,7 +12,7 @@
- 已实证(synthetic): `0`
- 阻塞数: `1`
- 待人工/缺浏览器证据: `36`
- 最近渲染时间: `2026-03-17T09:29:53+00:00`
- 最近渲染时间: `2026-03-17T09:39:22+00:00`
## 目标约束

查看文件

@@ -12,7 +12,7 @@
- 已实证(synthetic): `0`
- 阻塞数: `0`
- 待人工/缺浏览器证据: `0`
- 最近渲染时间: `2026-03-17T09:29:53+00:00`
- 最近渲染时间: `2026-03-17T09:39:22+00:00`
## 目标约束

查看文件

@@ -12,7 +12,7 @@
- 已实证(synthetic): `0`
- 阻塞数: `0`
- 待人工/缺浏览器证据: `0`
- 最近渲染时间: `2026-03-17T09:29:53+00:00`
- 最近渲染时间: `2026-03-17T09:39:22+00:00`
## 目标约束

查看文件

@@ -12,7 +12,7 @@
- 已实证(synthetic): `0`
- 阻塞数: `0`
- 待人工/缺浏览器证据: `0`
- 最近渲染时间: `2026-03-17T09:29:53+00:00`
- 最近渲染时间: `2026-03-17T09:39:22+00:00`
## 目标约束

查看文件

@@ -12,7 +12,7 @@
- 已实证(synthetic): `0`
- 阻塞数: `0`
- 待人工/缺浏览器证据: `0`
- 最近渲染时间: `2026-03-17T09:29:53+00:00`
- 最近渲染时间: `2026-03-17T09:39:22+00:00`
## 目标约束

查看文件

@@ -12,7 +12,7 @@
- 已实证(synthetic): `0`
- 阻塞数: `0`
- 待人工/缺浏览器证据: `0`
- 最近渲染时间: `2026-03-17T09:29:53+00:00`
- 最近渲染时间: `2026-03-17T09:39:22+00:00`
## 目标约束

查看文件

@@ -12,7 +12,7 @@
- 已实证(synthetic): `0`
- 阻塞数: `0`
- 待人工/缺浏览器证据: `0`
- 最近渲染时间: `2026-03-17T09:29:50+00:00`
- 最近渲染时间: `2026-03-17T09:39:20+00:00`
## 目标约束

查看文件

@@ -12,7 +12,7 @@
- 已实证(synthetic): `0`
- 阻塞数: `0`
- 待人工/缺浏览器证据: `0`
- 最近渲染时间: `2026-03-17T09:29:53+00:00`
- 最近渲染时间: `2026-03-17T09:39:22+00:00`
## 目标约束

查看文件

@@ -12,7 +12,7 @@
- 已实证(synthetic): `0`
- 阻塞数: `0`
- 待人工/缺浏览器证据: `0`
- 最近渲染时间: `2026-03-17T09:29:50+00:00`
- 最近渲染时间: `2026-03-17T09:39:20+00:00`
## 目标约束

查看文件

@@ -12,7 +12,7 @@
- 已实证(synthetic): `0`
- 阻塞数: `0`
- 待人工/缺浏览器证据: `0`
- 最近渲染时间: `2026-03-17T09:29:50+00:00`
- 最近渲染时间: `2026-03-17T09:39:20+00:00`
## 目标约束

查看文件

@@ -12,7 +12,7 @@
- 已实证(synthetic): `0`
- 阻塞数: `0`
- 待人工/缺浏览器证据: `0`
- 最近渲染时间: `2026-03-17T09:29:50+00:00`
- 最近渲染时间: `2026-03-17T09:39:20+00:00`
## 目标约束

查看文件

@@ -12,7 +12,7 @@
- 已实证(synthetic): `0`
- 阻塞数: `0`
- 待人工/缺浏览器证据: `0`
- 最近渲染时间: `2026-03-17T09:29:50+00:00`
- 最近渲染时间: `2026-03-17T09:39:20+00:00`
## 目标约束

查看文件

@@ -12,7 +12,7 @@
- 已实证(synthetic): `0`
- 阻塞数: `0`
- 待人工/缺浏览器证据: `0`
- 最近渲染时间: `2026-03-17T09:29:50+00:00`
- 最近渲染时间: `2026-03-17T09:39:20+00:00`
## 目标约束

查看文件

@@ -12,7 +12,7 @@
- 已实证(synthetic): `0`
- 阻塞数: `0`
- 待人工/缺浏览器证据: `0`
- 最近渲染时间: `2026-03-17T09:29:50+00:00`
- 最近渲染时间: `2026-03-17T09:39:20+00:00`
## 目标约束

查看文件

@@ -1,5 +1,5 @@
{
"generated_at": "2026-03-17T09:30:03+00:00",
"generated_at": "2026-03-17T09:39:33+00:00",
"title": "\u5f53\u524d\u67b6\u6784\u5e93",
"summary": "\u5de5\u4f5c\u53f0\u3001\u63a7\u5236\u9762\u3001\u6570\u636e\u5c42\u3001\u6388\u6743\u8fb9\u754c\u4e0e\u7cfb\u7edf\u8986\u76d6\u7684\u5f53\u524d\u771f\u503c\u89c6\u56fe\u3002",
"sections": [
@@ -49,7 +49,7 @@
},
{
"label": "\u751f\u6210\u65f6\u95f4",
"value": "2026-03-17T09:30:03+00:00"
"value": "2026-03-17T09:39:33+00:00"
}
],
"links": [

查看文件

@@ -20,10 +20,6 @@
<span>授权攻防实验工作台</span>
</div>
<h1>本地攻防实证工作台</h1>
<p>
Lovart 设计外壳已本地化并接入真实 run bundle 数据。页面只面向授权实验资产,
聚合漏洞条目、时间线、证据、日志、来源、原始 JSON、当前架构库与失败原因。
</p>
</div>
<div class="hero-actions">

查看文件

@@ -20,10 +20,6 @@
<span>授权攻防实验工作台</span>
</div>
<h1>本地攻防实证工作台</h1>
<p>
Lovart 设计外壳已本地化并接入真实 run bundle 数据。页面只面向授权实验资产,
聚合漏洞条目、时间线、证据、日志、来源、原始 JSON、当前架构库与失败原因。
</p>
</div>
<div class="hero-actions">

查看文件

@@ -87,7 +87,7 @@
<h1>当前架构库镜像</h1>
<div class="meta">工作台内置镜像页:当前架构库结构化数据镜像。</div>
<pre>{
&quot;generated_at&quot;: &quot;2026-03-17T09:30:03+00:00&quot;,
&quot;generated_at&quot;: &quot;2026-03-17T09:39:33+00:00&quot;,
&quot;title&quot;: &quot;当前架构库&quot;,
&quot;summary&quot;: &quot;工作台、控制面、数据层、授权边界与系统覆盖的当前真值视图。&quot;,
&quot;sections&quot;: [
@@ -137,7 +137,7 @@
},
{
&quot;label&quot;: &quot;生成时间&quot;,
&quot;value&quot;: &quot;2026-03-17T09:30:03+00:00&quot;
&quot;value&quot;: &quot;2026-03-17T09:39:33+00:00&quot;
}
],
&quot;links&quot;: [

查看文件

@@ -20,10 +20,6 @@
<span>授权攻防实验工作台</span>
</div>
<h1>本地攻防实证工作台</h1>
<p>
Lovart 设计外壳已本地化并接入真实 run bundle 数据。页面只面向授权实验资产,
聚合漏洞条目、时间线、证据、日志、来源、原始 JSON、当前架构库与失败原因。
</p>
</div>
<div class="hero-actions">

查看文件

@@ -1,5 +1,5 @@
{
"generated_at": "2026-03-17T09:30:03+00:00",
"generated_at": "2026-03-17T09:39:33+00:00",
"advisory_count": 89,
"run_count": 3,
"statuses": {

查看文件

@@ -20,10 +20,6 @@
<span>授权攻防实验工作台</span>
</div>
<h1>本地攻防实证工作台</h1>
<p>
Lovart 设计外壳已本地化并接入真实 run bundle 数据。页面只面向授权实验资产,
聚合漏洞条目、时间线、证据、日志、来源、原始 JSON、当前架构库与失败原因。
</p>
</div>
<div class="hero-actions">

查看文件

@@ -1,6 +1,6 @@
# 最新同步摘要
- 渲染时间: `2026-03-17T09:30:03+00:00`
- 渲染时间: `2026-03-17T09:39:33+00:00`
- 系统数量: `62`
- Advisory 数量: `89`
- 重点 Markdown 数量: `89`

查看文件

@@ -1,5 +1,5 @@
{
"generated_at": "2026-03-17T09:30:03+00:00",
"generated_at": "2026-03-17T09:39:33+00:00",
"system_count": 62,
"advisory_count": 89,
"markdown_count": 89,

查看文件

@@ -59,6 +59,23 @@ const DATA_HUB_ITEMS = [
{ title: "最新同步摘要", href: "/docs/coverage-matrix.html", description: "覆盖矩阵与本地生成态入口。", badge: "generated" }
];
const HERO_FOLD_STORAGE_KEY = "websafe.dashboard.heroFolded";
function readHeroFolded() {
try {
return window.localStorage.getItem(HERO_FOLD_STORAGE_KEY) === "1";
} catch (_error) {
return false;
}
}
function writeHeroFolded(value) {
try {
window.localStorage.setItem(HERO_FOLD_STORAGE_KEY, value ? "1" : "0");
} catch (_error) {
}
}
const state = {
routeSection: resolveRouteSection(),
summary: null,
@@ -72,6 +89,12 @@ const state = {
refreshHandle: null,
refreshMs: 5000,
autoRefresh: true,
heroFolded: readHeroFolded(),
syncStatus: {
kind: "boot",
title: "启动中",
detail: "正在载入本地生成数据"
},
filters: {
search: "",
status: "",
@@ -303,6 +326,7 @@ function renderMetrics() {
}
function renderSyncState(kind, title, detail) {
state.syncStatus = { kind, title, detail };
$("syncState").innerHTML = `
${icon("sync", "icon icon-sync")}
<div>
@@ -311,6 +335,7 @@ function renderSyncState(kind, title, detail) {
</div>
`;
$("syncState").dataset.kind = kind;
renderHeroChrome();
}
function renderSectionNav() {
@@ -1244,14 +1269,34 @@ function renderWorkspace() {
workspace.innerHTML = html;
}
function renderHeroChrome() {
const meta = sectionMeta();
const chip = $("heroSectionChip");
const title = $("heroSummaryTitle");
const detail = $("heroSummaryDetail");
const toggle = $("toggleHeroCollapse");
const toggleLabel = $("heroToggleLabel");
if (!chip || !title || !detail || !toggle || !toggleLabel) return;
chip.innerHTML = `${icon(meta.icon)}<span>${escapeHtml(meta.label)}</span>`;
title.textContent = state.heroFolded ? `${meta.label} · 顶部区域已折叠` : `${meta.label} · 顶部操作区`;
detail.textContent = state.heroFolded
? `${state.syncStatus.title} · ${state.syncStatus.detail}`
: `${meta.description} · ${state.syncStatus.detail}`;
toggleLabel.textContent = state.heroFolded ? "展开顶部" : "折叠顶部";
toggle.setAttribute("aria-expanded", String(!state.heroFolded));
}
function syncRouteChrome() {
const compactHero = state.routeSection !== "overview";
document.body.dataset.routeSection = state.routeSection;
document.body.classList.toggle("hero-compact", compactHero);
document.body.classList.toggle("hero-folded", state.heroFolded);
}
function renderAll() {
syncRouteChrome();
renderHeroChrome();
renderMetrics();
renderSectionNav();
renderTopMenus();
@@ -1285,6 +1330,14 @@ function clearFilters() {
function attachGlobalEvents() {
document.addEventListener("click", (event) => {
const heroToggle = event.target.closest("[data-hero-toggle]");
if (heroToggle) {
state.heroFolded = !state.heroFolded;
writeHeroFolded(state.heroFolded);
renderAll();
return;
}
const toggle = event.target.closest("[data-panel-toggle]");
if (toggle) {
const key = toggle.dataset.panelToggle;

查看文件

@@ -148,6 +148,72 @@ select {
line-height: 1.6;
}
.hero-collapse-bar {
position: relative;
display: flex;
align-items: center;
justify-content: space-between;
gap: 16px;
padding-bottom: 16px;
margin-bottom: 18px;
border-bottom: 1px solid rgba(148, 163, 184, 0.14);
}
.hero-collapse-summary {
display: grid;
gap: 8px;
min-width: 0;
}
.hero-summary-topline {
display: flex;
align-items: center;
flex-wrap: wrap;
gap: 10px;
}
.hero-section-chip {
display: inline-flex;
align-items: center;
gap: 8px;
min-height: 30px;
padding: 6px 12px;
border-radius: 999px;
border: 1px solid rgba(77, 141, 255, 0.28);
background: rgba(77, 141, 255, 0.12);
color: #dce7ff;
font-size: 0.82rem;
font-weight: 600;
}
.hero-summary-title {
display: block;
font-size: 1.02rem;
}
.hero-summary-detail {
color: var(--text-secondary);
line-height: 1.5;
font-size: 0.86rem;
}
.hero-collapse-button {
min-width: 128px;
}
.hero-collapse-icon {
transition: transform 0.2s ease;
}
.hero-foldable {
display: grid;
max-height: 2200px;
opacity: 1;
overflow: hidden;
transform: translateY(0);
transition: max-height 0.28s ease, opacity 0.22s ease, transform 0.22s ease;
}
.hero-actions {
position: relative;
display: grid;
@@ -329,6 +395,31 @@ body.hero-compact .hero-glow {
opacity: 0.55;
}
body.hero-folded .hero {
padding: 16px 18px;
}
body.hero-folded .hero-collapse-bar {
margin-bottom: 0;
padding-bottom: 0;
border-bottom-color: transparent;
}
body.hero-folded .hero-collapse-icon {
transform: rotate(-90deg);
}
body.hero-folded .hero-foldable {
max-height: 0;
opacity: 0;
transform: translateY(-10px);
pointer-events: none;
}
body.hero-folded .hero-glow {
opacity: 0.42;
}
.metrics-row {
position: relative;
display: grid;
@@ -1454,6 +1545,8 @@ body.hero-compact .hero-glow {
}
.hero-links,
.hero-collapse-bar,
.hero-summary-topline,
.route-note,
.detail-actions,
.tag-row,
@@ -1469,6 +1562,10 @@ body.hero-compact .hero-glow {
display: grid;
grid-template-columns: 1fr;
}
.hero-collapse-button {
width: 100%;
}
}
@media (max-width: 640px) {

查看文件

@@ -13,58 +13,78 @@
<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>授权攻防实验工作台</span>
</div>
<h1>本地攻防实证工作台</h1>
</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>立即刷新</span>
</button>
<label class="toggle-card">
<span class="toggle-label">自动刷新</span>
<span class="toggle-switch">
<input id="autoRefresh" type="checkbox" checked>
<span class="toggle-slider"></span>
<div class="hero-collapse-bar">
<div class="hero-collapse-summary">
<div class="hero-summary-topline">
<span id="heroSectionChip" class="hero-section-chip">
<svg class="icon"><use href="/assets/icons.svg#spark"></use></svg>
<span>总览</span>
</span>
</label>
<div id="syncState" class="sync-state">
<svg class="icon icon-sync"><use href="/assets/icons.svg#sync"></use></svg>
<div>
<strong>启动中</strong>
<span>正在载入本地生成数据</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>功能文档</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>前端设计</span>
</a>
<a class="button button-secondary" href="/docs/architecture-library.html" target="_blank" rel="noreferrer">
<svg class="icon"><use href="/assets/icons.svg#systems"></use></svg>
<span>架构镜像</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>旧版工作台</span>
</a>
<span class="hero-eyebrow">授权攻防实验工作台</span>
</div>
<strong id="heroSummaryTitle" class="hero-summary-title">总览 · 顶部操作区</strong>
<span id="heroSummaryDetail" class="hero-summary-detail">这里包含刷新、同步状态、指标卡、板块导航和顶部筛选。</span>
</div>
<button id="toggleHeroCollapse" class="button button-secondary hero-collapse-button" type="button" data-hero-toggle="1" aria-expanded="true">
<svg class="icon hero-collapse-icon"><use href="/assets/icons.svg#chevron"></use></svg>
<span id="heroToggleLabel">折叠顶部</span>
</button>
</div>
<div id="metricCards" class="metrics-row"></div>
<nav id="sectionNav" class="section-nav" aria-label="工作台板块导航"></nav>
<div id="topMenus" class="top-menus" aria-label="顶部筛选与分类菜单"></div>
<div class="hero-foldable">
<div class="hero-top">
<div class="hero-copy">
<div class="hero-eyebrow">
<svg class="icon"><use href="/assets/icons.svg#spark"></use></svg>
<span>授权攻防实验工作台</span>
</div>
<h1>本地攻防实证工作台</h1>
</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>立即刷新</span>
</button>
<label class="toggle-card">
<span class="toggle-label">自动刷新</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>启动中</strong>
<span>正在载入本地生成数据</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>功能文档</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>前端设计</span>
</a>
<a class="button button-secondary" href="/docs/architecture-library.html" target="_blank" rel="noreferrer">
<svg class="icon"><use href="/assets/icons.svg#systems"></use></svg>
<span>架构镜像</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>旧版工作台</span>
</a>
</div>
</div>
</div>
<div id="metricCards" class="metrics-row"></div>
<nav id="sectionNav" class="section-nav" aria-label="工作台板块导航"></nav>
<div id="topMenus" class="top-menus" aria-label="顶部筛选与分类菜单"></div>
</div>
</header>
<main class="main-container">