@topmindspace/tms-skills 0.1.18 → 0.2.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +66 -0
- package/README.en.md +6 -3
- package/README.md +6 -3
- package/package.json +5 -2
- package/top-ppt-html/README.en.md +2 -2
- package/top-ppt-html/README.md +1 -1
- package/top-ppt-html/SKILL.md +4 -4
- package/top-ppt-html/assets/examples/2026-09-09-architecture-graphite-dark.html +24 -12
- package/top-ppt-html/assets/examples/2026-09-09-presentation-business-blue.html +24 -12
- package/top-ppt-html/assets/examples/2026-09-09-research-mckinsey.html +24 -12
- package/top-ppt-html/assets/examples/2026-09-26-topmind-tms-skills-showcase.html +94 -165
- package/top-ppt-html/assets/examples/2026-09-26-topmind-tms-skills-showcase.model.json +32 -38
- package/top-ppt-html/assets/pptx-export.js +3 -2
- package/top-ppt-html/assets/style-gallery.html +2 -1
- package/top-ppt-html/assets/templates/architecture.html +38 -15
- package/top-ppt-html/assets/templates/engine.css +20 -9
- package/top-ppt-html/assets/templates/presentation.html +38 -17
- package/top-ppt-html/assets/templates/research.html +44 -23
- package/top-ppt-html/package-lock.json +2 -2
- package/top-ppt-html/package.json +1 -1
- package/top-ppt-html/references/components-atoms.md +1 -1
- package/top-ppt-html/references/content-rules.md +17 -11
- package/top-ppt-html/references/failure-modes.md +6 -4
- package/top-ppt-html/references/high-fidelity.md +14 -1
- package/top-ppt-html/references/icons.md +2 -2
- package/top-ppt-html/references/layout-grammar.md +3 -1
- package/top-ppt-html/references/layouts-research.md +1 -1
- package/top-ppt-html/references/pptx-export.md +2 -2
- package/top-ppt-html/references/tech-design.md +2 -0
- package/top-ppt-html/scripts/build_icon_assets.js +92 -0
- package/top-ppt-html/scripts/build_pptx.js +125 -29
- package/top-ppt-html/scripts/extract_model.py +21 -1
- package/top-ppt-html/scripts/icon_lib.js +53 -0
- package/top-ppt-html/scripts/icon_raster.js +86 -0
- package/top-ppt-html/scripts/layout-constants.json +4 -1
- package/top-ppt-html/scripts/lib_layout_regions.js +3 -1
- package/top-ppt-html/scripts/model-schema.json +7 -3
- package/top-ppt-html/scripts/package_skill.py +1 -0
- package/top-ppt-html/scripts/render_from_model.py +125 -24
- package/top-ppt-html/scripts/scaffold_report.py +47 -24
- package/top-ppt-html/scripts/sync_runtime.py +2 -1
- package/top-ppt-html/scripts/validate_pptx.py +14 -3
- package/top-ppt-html/scripts/validate_report.py +1 -1
- package/topmind-cover/README.md +40 -0
- package/topmind-cover/SKILL.md +66 -0
- package/topmind-cover/package-lock.json +16 -0
- package/topmind-cover/package.json +16 -0
- package/topmind-cover/references/cover-styles.md +40 -0
- package/topmind-cover/scripts/audit_css.py +39 -0
- package/topmind-cover/scripts/audit_docs.py +58 -0
- package/topmind-cover/scripts/audit_skill.py +60 -0
- package/topmind-cover/scripts/audit_styles.py +54 -0
- package/topmind-cover/scripts/crop-cover.py +69 -0
- package/topmind-cover/scripts/negative_tests.py +71 -0
- package/topmind-cover/scripts/package_skill.py +188 -0
- package/topmind-wechat-post/README.md +49 -0
- package/topmind-wechat-post/SKILL.md +208 -0
- package/topmind-wechat-post/assets/themes/amber-review.json +35 -0
- package/topmind-wechat-post/assets/themes/graphite.json +35 -0
- package/topmind-wechat-post/assets/themes/minimal-ink.json +35 -0
- package/topmind-wechat-post/assets/themes/newsprint.json +35 -0
- package/topmind-wechat-post/assets/themes/tech-blue.json +35 -0
- package/topmind-wechat-post/package-lock.json +16 -0
- package/topmind-wechat-post/package.json +16 -0
- package/topmind-wechat-post/references/design.md +50 -0
- package/topmind-wechat-post/references/element-spec.md +162 -0
- package/topmind-wechat-post/references/known-pits.md +86 -0
- package/topmind-wechat-post/references/theme-map.md +139 -0
- package/topmind-wechat-post/references/typography-rules.md +62 -0
- package/topmind-wechat-post/references/wechat-constraints.md +106 -0
- package/topmind-wechat-post/references/workflow.md +102 -0
- package/topmind-wechat-post/references/writing-quality.md +129 -0
- package/topmind-wechat-post/scripts/audit_css.py +39 -0
- package/topmind-wechat-post/scripts/audit_docs.py +58 -0
- package/topmind-wechat-post/scripts/audit_skill.py +60 -0
- package/topmind-wechat-post/scripts/audit_styles.py +54 -0
- package/topmind-wechat-post/scripts/lint-wechat.py +446 -0
- package/topmind-wechat-post/scripts/md2wechat.py +1602 -0
- package/topmind-wechat-post/scripts/negative_tests.py +65 -0
- package/topmind-wechat-post/scripts/new-article.py +183 -0
- package/topmind-wechat-post/scripts/package_skill.py +188 -0
- package/topmind-wechat-post/scripts/push-to-topstream.py +226 -0
- package/topmind-wechat-post/scripts/scan_ai_flavor.py +464 -0
- package/topmind-wechat-post/scripts/sync-mapping.py +220 -0
- package/topmind-wechat-post/scripts/sync-status.py +187 -0
- package/topmind-x-article/README.md +40 -0
- package/topmind-x-article/SKILL.md +62 -0
- package/topmind-x-article/package-lock.json +16 -0
- package/topmind-x-article/package.json +16 -0
- package/topmind-x-article/references/publish-checklist.md +24 -0
- package/topmind-x-article/references/x-format.md +24 -0
- package/topmind-x-article/scripts/audit_css.py +39 -0
- package/topmind-x-article/scripts/audit_docs.py +58 -0
- package/topmind-x-article/scripts/audit_skill.py +60 -0
- package/topmind-x-article/scripts/audit_styles.py +54 -0
- package/topmind-x-article/scripts/md2x.py +121 -0
- package/topmind-x-article/scripts/negative_tests.py +74 -0
- package/topmind-x-article/scripts/package_skill.py +188 -0
package/CHANGELOG.md
CHANGED
|
@@ -1,3 +1,69 @@
|
|
|
1
|
+
## [0.2.0] - 2026-09-29
|
|
2
|
+
|
|
3
|
+
### 新增三个写作/配图技能
|
|
4
|
+
|
|
5
|
+
- **topmind-wechat-post `0.1.0`**:公众号文章全生命周期技能(由 topmind-wechat 适配改名)。
|
|
6
|
+
交付包 / 审校改写 / 质量三关(事实·逻辑·去 AI 味 ≥85)/ 状态同步 / 微信内联排版(`md2wechat --embed-images`)/ 发布清单。
|
|
7
|
+
适配点:frontmatter 去 topmind-pack 专有键(`degradation`/`action_category`/`entrypoint`),
|
|
8
|
+
跨 skill 引用改为通用表述,`writing-quality.md` 改用技能自带 `scan_ai_flavor.py`
|
|
9
|
+
(原引用本机 `~/.workbuddy` 路径),`md2wechat.py` 缺失输入改干净报错(原 Traceback)。
|
|
10
|
+
- **topmind-x-article `0.1.0`**:X 长文一键发布。`md2x.py` 把 Markdown 转可直接粘贴进
|
|
11
|
+
X Article 编辑器的纯文本(标题→纯文本行、加粗/斜体去标记、链接→`文字(url)`、
|
|
12
|
+
图片→`[图N]`+文末配图清单、表格→"项:值"列表);`references/publish-checklist.md`
|
|
13
|
+
沉淀实战经验(首评置顶补信息、图序核对、发布后抓回核对)。缺失输入干净报错。
|
|
14
|
+
- **topmind-cover `0.1.0`**:文章封面配图,X / 公众号共用。设计铁律(震撼·醒目·主题突出:
|
|
15
|
+
一图一主题、大标题 ≤10 字、四周 8% 留白)+ 5 套风格模板;
|
|
16
|
+
`crop-cover.py` 从 16:9 主图中央裁出公众号 900×383 版(X 用 1200×675),落盘命名规范。
|
|
17
|
+
缺失输入 / 非图片干净报错。
|
|
18
|
+
- 每个新技能带轻量 CI 门禁:`package_skill.py --check`(frontmatter/版本/引用完整性/禁用文件)、
|
|
19
|
+
`audit_skill.py` / `audit_docs.py` / `audit_styles.py` / `audit_css.py`、`negative_tests.py`
|
|
20
|
+
(异常输入不崩溃)。`ci_privacy_scan.py` 全仓通过。
|
|
21
|
+
|
|
22
|
+
## [0.1.19] - 2026-09-28
|
|
23
|
+
|
|
24
|
+
### 排版修复 · 大纲篇章化 · 参考资料去假 · 图标真导出 · PPTX 高保真增强
|
|
25
|
+
|
|
26
|
+
> 源起:2026-09-28 用户复盘五类问题(顶栏重叠 / 卡片不齐 / 大纲罗列页标题 / 参考资料占位 / PPTX 格式错乱),并要求「业界怎么解决的,不要闭门造车」。本次对照 Slidev `pptx-editable` / PptxGenJS / think-cell 混合通道模式系统整改。
|
|
27
|
+
|
|
28
|
+
#### A. HTML 排版硬伤
|
|
29
|
+
- **顶栏副标题压住右侧工具钮**:`.brand__txt` 此前无基础样式,flex `min-width:auto` 钉死整行文字宽,省略号永不触发。补 `min-width:0; overflow:hidden`,`.brand` / `.bar__in` / `.nav` 收缩链修复;≤1360px 自动收起副标题。
|
|
30
|
+
- **卡片高度不一致**:`.card` 改 flex 列 + 底对齐;`.g-quad` / `.g-half` / `.g-*--equal` 强制等高;`.g-half` 提升进 `engine.css` 并改 `align-items:stretch`(此前 research 专属且 `start` 违反「同构同高」契约);纯卡片栅格不再误用 `.a-start`。
|
|
31
|
+
|
|
32
|
+
#### B. 大纲 = 章节大纲(3–7 章),不是页目录
|
|
33
|
+
- **结构契约**:`agenda` 条目 = 章(篇/section),每章 1+ 页;页标题逐页出现,章标题只在 Agenda 出现一次。预算 3–7 章(含参考资料 +1 仍 ≤8)。
|
|
34
|
+
- **生成器**:`render_from_model` / `scaffold_report` 按 eyebrow `NN ·` 章前缀归并,删掉「agenda 条数 ≠ 页数就按页强制重建」逻辑;锚点落该章第一页。
|
|
35
|
+
- **schema / 阈值**:`model-schema` 加 `agendaMax=7` / `agendaHint`;`layout-constants.contentQuality.agenda` 加 `chapterMin/Max`;`agendaComfortMax` 16→8。
|
|
36
|
+
- **文档**:`content-rules` §Agenda 重写;`SKILL` 铁律 4;`components-atoms` / `failure-modes` F20 / `layout-grammar` 阈值同步。
|
|
37
|
+
- **样张**:showcase 大纲 12 条页标题 → 9 章(`05 · 图表工艺` 下 3 页只占 1 条)。
|
|
38
|
+
|
|
39
|
+
#### C. 参考资料只列真实来源(宁缺毋假)
|
|
40
|
+
- **冒烟枪**:`render_from_model.py:738` 对每个 `[n]` 生成 `「来源名称,时间;口径。」`;scaffold 写「来源 N(替换为真实来源名称)」。
|
|
41
|
+
- **新规则**:只列 `model.refs` 真实来源;**无真实来源整节省略**(连导航 `#refs` 入口一并摘掉,避免悬空锚点)。硬拦占位串(`来源名称` / `替换为真实来源` / `某行业报告`)。
|
|
42
|
+
- **模板**:三份模式模板参考节改为注释掉的真实样例 + 「无真实来源则删整节」说明;`example.com` 假条目清除。
|
|
43
|
+
- **文档**:`content-rules` §五 规则 4 重写;`SKILL` 铁律 10;`layouts-research` / `.ref-link` 示例改真实机构名。
|
|
44
|
+
|
|
45
|
+
#### D. 图标真导出(SVG→PNG,不再用 accent 方块替代)
|
|
46
|
+
- **新模块**:`scripts/icon_lib.js`(20 语义图标单源)· `scripts/build_icon_assets.js`(sharp 栅格化)· `scripts/icon-assets.json`(PNG 缓存,gitignore)· `scripts/icon_raster.js`。
|
|
47
|
+
- **链路**:模型 `cards[].icon` / HTML `data-icon` → `extract_model` 回填 → `build_pptx` 嵌 PNG。`objectName: icon:*`,`validate_pptx` 单独计数 `icon_pictures`,**不进** `pictures=0` 内容图门禁。缺 sharp/资产回落 accent 方块。
|
|
48
|
+
- **schema**:`cards[].icon` 字段 + 取值说明(`icon_lib.js` 键)。
|
|
49
|
+
|
|
50
|
+
#### E. PPTX 高保真增强(对照业界混合通道)
|
|
51
|
+
- **发射前叠印断言**:`assertNoOverlap` / `rectsOverlap` 在 `addShape` 前自检组合布局(图表∩inline 数据表等),计入 `OVERLAP_PREEMIT`。
|
|
52
|
+
- **表格行高自适应**:`addTable` 超容量压到 hardFloor / 整体缩放;表头独立 `headRowH`;`fit:'shrink'`。
|
|
53
|
+
- **`regionOf('bar')` 双偏移纠正**:`chartX/chartW` 此前被当偏移再加 `mx`,柱图右移 0.6in 与标题/表格不齐——改与 donut/table/hbar 同口径对齐版心。双引擎同步。
|
|
54
|
+
- **图例收进图高**:waffle / marimekko / slope 图例带含在 `h` 内,与 inline 数据表留间隙(几何铁律②)。
|
|
55
|
+
- **文本自动收缩**:标题 / 卡片 / 结论条 / 页脚统一 `fit:'shrink'`(PowerPoint 字体度量 ≠ 浏览器)。
|
|
56
|
+
|
|
57
|
+
#### F. 文档与工程
|
|
58
|
+
- `icons.md` / `pptx-export.md` / `high-fidelity.md`(新增「已落地的高保真增强」对照表)/ `failure-modes` F20 / `tech-design`(图标单源登记)/ `package_skill`(三模块进必收)。
|
|
59
|
+
- 业界调研纪要:`docs/industry-pptx-research.md`(Slidev pptx-editable / PptxGenJS / think-cell / Marp / reveal.js 路线对比与取舍)。
|
|
60
|
+
|
|
61
|
+
#### 回归
|
|
62
|
+
- 技能审计 ✓ · 文档审计 ✓ · 研究 HTML 94/0/0 ✓ · 展示 HTML 85/2/0 ✓ · 两份 PPTX `errors:[] warnings:[]` ✓ · 打包校验 106 文件 ✓。
|
|
63
|
+
|
|
64
|
+
### 红线未动
|
|
65
|
+
反截断、图表多样性地板、Mode A craft、runtime SHA 同版本门禁、中文「演示文稿」术语、整仓 npm 发版、motion=none、结论条无「So what」标签、无左侧 accent 装饰轨、双单源 + sync_runtime、strict 0/0 交付。
|
|
66
|
+
|
|
1
67
|
## [0.1.18] - 2026-09-28
|
|
2
68
|
|
|
3
69
|
### PPTX 导出质量整改 · 双通道几何收敛 + 门禁盲区补齐
|
package/README.en.md
CHANGED
|
@@ -76,9 +76,12 @@ See [top-ppt-html/README.md](./top-ppt-html/README.md) and [SKILL.md](./top-ppt-
|
|
|
76
76
|
|
|
77
77
|
| Skill | Version | What it does |
|
|
78
78
|
|-------|---------|--------------|
|
|
79
|
-
| [`top-ppt-html`](./top-ppt-html/) | **0.1.
|
|
79
|
+
| [`top-ppt-html`](./top-ppt-html/) | **0.1.19** | Formal business decks: paginated HTML + editable 16:9 PPTX; dual delivery · MD3-inspired density; 3 modes × 9 styles; strict 0/0 |
|
|
80
|
+
| [`topmind-wechat-post`](./topmind-wechat-post/) | **0.1.0** | WeChat article lifecycle: package, review, 3 quality gates, inline typography & publish checklist |
|
|
81
|
+
| [`topmind-x-article`](./topmind-x-article/) | **0.1.0** | X long-form one-click publish: Markdown → paste-ready plain text + cover + checklist |
|
|
82
|
+
| [`topmind-cover`](./topmind-cover/) | **0.1.0** | Cover art for X / WeChat: striking, theme-focused; size specs + style templates + crop tooling |
|
|
80
83
|
|
|
81
|
-
Installer [`@topmindspace/tms-skills`](https://www.npmjs.com/package/@topmindspace/tms-skills) is
|
|
84
|
+
Installer [`@topmindspace/tms-skills`](https://www.npmjs.com/package/@topmindspace/tms-skills) is **0.2.0** (whole-repo same-tag releases).
|
|
82
85
|
|
|
83
86
|
## Install
|
|
84
87
|
|
|
@@ -88,7 +91,7 @@ Installer [`@topmindspace/tms-skills`](https://www.npmjs.com/package/@topmindspa
|
|
|
88
91
|
npx @topmindspace/tms-skills list
|
|
89
92
|
npx @topmindspace/tms-skills install top-ppt-html
|
|
90
93
|
npx @topmindspace/tms-skills install top-ppt-html --to ./.claude/skills
|
|
91
|
-
npx @topmindspace/tms-skills@0.
|
|
94
|
+
npx @topmindspace/tms-skills@0.2.0 install top-ppt-html # pin
|
|
92
95
|
```
|
|
93
96
|
|
|
94
97
|
```bash
|
package/README.md
CHANGED
|
@@ -74,9 +74,12 @@
|
|
|
74
74
|
|
|
75
75
|
| 技能 | 版本 | 做什么 |
|
|
76
76
|
|------|------|--------|
|
|
77
|
-
| [`top-ppt-html`](./top-ppt-html/) | **0.1.
|
|
77
|
+
| [`top-ppt-html`](./top-ppt-html/) | **0.1.19** | 正式商务演示:HTML 可翻页 + 16:9 可编辑 PPTX;双交付 · MD3 密度克制;三模式 × 九风格;strict 0/0 |
|
|
78
|
+
| [`topmind-wechat-post`](./topmind-wechat-post/) | **0.1.0** | 公众号文章全生命周期:交付包、审校改写、质量三关、微信内联排版与发布清单 |
|
|
79
|
+
| [`topmind-x-article`](./topmind-x-article/) | **0.1.0** | X 长文一键发布:Markdown 原稿转可直接粘贴的纯文本 + 封面图 + 发布清单 |
|
|
80
|
+
| [`topmind-cover`](./topmind-cover/) | **0.1.0** | 文章封面配图(X / 公众号共用):震撼醒目主题突出,尺寸规范 + 风格模板 + 裁剪落盘 |
|
|
78
81
|
|
|
79
|
-
安装器 [`@topmindspace/tms-skills`](https://www.npmjs.com/package/@topmindspace/tms-skills)
|
|
82
|
+
安装器 [`@topmindspace/tms-skills`](https://www.npmjs.com/package/@topmindspace/tms-skills) 为 **0.2.0**(整仓同 tag 发版)。
|
|
80
83
|
|
|
81
84
|
## 安装
|
|
82
85
|
|
|
@@ -86,7 +89,7 @@
|
|
|
86
89
|
npx @topmindspace/tms-skills list
|
|
87
90
|
npx @topmindspace/tms-skills install top-ppt-html
|
|
88
91
|
npx @topmindspace/tms-skills install top-ppt-html --to ./.claude/skills
|
|
89
|
-
npx @topmindspace/tms-skills@0.1.
|
|
92
|
+
npx @topmindspace/tms-skills@0.1.19 install top-ppt-html # 钉版本
|
|
90
93
|
```
|
|
91
94
|
|
|
92
95
|
```bash
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@topmindspace/tms-skills",
|
|
3
|
-
"version": "0.
|
|
3
|
+
"version": "0.2.0",
|
|
4
4
|
"description": "TopMindspace 智能体技能 monorepo — 通过 npm / GitHub npx 安装技能(top-ppt-html:HTML+PPT 双交付,正式商务演示文稿)。",
|
|
5
5
|
"license": "MIT",
|
|
6
6
|
"author": "TopMindspace",
|
|
@@ -30,7 +30,10 @@
|
|
|
30
30
|
"README.en.md",
|
|
31
31
|
"LICENSE",
|
|
32
32
|
"CHANGELOG.md",
|
|
33
|
-
"top-ppt-html"
|
|
33
|
+
"top-ppt-html",
|
|
34
|
+
"topmind-cover",
|
|
35
|
+
"topmind-wechat-post",
|
|
36
|
+
"topmind-x-article"
|
|
34
37
|
],
|
|
35
38
|
"engines": {
|
|
36
39
|
"node": ">=18"
|
|
@@ -18,7 +18,7 @@ Plenty of PPT skills exist. This one is for **formal business presenting**: clea
|
|
|
18
18
|
</p>
|
|
19
19
|
|
|
20
20
|
- Skill id: `top-ppt-html`; brand: **TopPPT HTML**
|
|
21
|
-
- Version: **v0.1.
|
|
21
|
+
- Version: **v0.1.19** (same tag as `@topmindspace/tms-skills@0.1.19`)
|
|
22
22
|
- **Agent entry**: `SKILL.md` → `references/playbook.md` (L1) → L2 on demand
|
|
23
23
|
- **Human maintainers**: this README (install / commands / layout); do not treat it as the generation spec
|
|
24
24
|
|
|
@@ -73,7 +73,7 @@ Also: arrow-key paging; **Esc** closes modals. After style/theme change, re-run
|
|
|
73
73
|
|
|
74
74
|
```bash
|
|
75
75
|
npx @topmindspace/tms-skills install top-ppt-html
|
|
76
|
-
npx @topmindspace/tms-skills@0.1.
|
|
76
|
+
npx @topmindspace/tms-skills@0.1.19 install top-ppt-html
|
|
77
77
|
npx github:topmindspace/tms-skills install top-ppt-html
|
|
78
78
|
```
|
|
79
79
|
|
package/top-ppt-html/README.md
CHANGED
|
@@ -18,7 +18,7 @@
|
|
|
18
18
|
</p>
|
|
19
19
|
|
|
20
20
|
- 技能标识:`top-ppt-html`;品牌名:**TopPPT HTML**
|
|
21
|
-
- 版本:**v0.1.
|
|
21
|
+
- 版本:**v0.1.19**(与 `@topmindspace/tms-skills@0.1.19` 同 tag)
|
|
22
22
|
- **智能体入口**:`SKILL.md` → `references/playbook.md`(L1)→ L2 按需
|
|
23
23
|
- **人类维护者**:本 README(安装 / 命令 / 目录);勿把本文件当生成规范
|
|
24
24
|
|
package/top-ppt-html/SKILL.md
CHANGED
|
@@ -4,7 +4,7 @@ description: "Use when 用户要做报告、演示、汇报、PPT、slides、dec
|
|
|
4
4
|
license: MIT
|
|
5
5
|
compatibility: "Python 3 stdlib for HTML generation; Node >=18 + pptxgenjs for PPTX; optional playwright for browser regression / theme captures."
|
|
6
6
|
metadata:
|
|
7
|
-
version: "0.1.
|
|
7
|
+
version: "0.1.19"
|
|
8
8
|
author: TopMindspace
|
|
9
9
|
---
|
|
10
10
|
# TopPPT HTML
|
|
@@ -102,13 +102,13 @@ metadata:
|
|
|
102
102
|
1. **单文件零外链**——无 CDN/外部字体/外部图片,图形一律内联 SVG;`<img src>` 仅 `data:` 或相对路径且必带 `alt`(单图 ≤1.5MB、全篇 ≤8MB);无素材图不留空不省略,用配图占位(`components.md` §11c-3)。
|
|
103
103
|
2. **模式先定后写**——从对应模式模板起步;`data-mode` = `REPORT_MODEL.mode`,页面无模式切换;MD3 映射;PPTX 字号走三模式独立比例尺。
|
|
104
104
|
3. **亮暗双主题一致**——CSS 变量整块换肤 + header 切换 + 文件级记忆;`REPORT_MODEL.theme` 与页面一致,PPTX 同主题导出;强调带只用 accent 家族,**末页禁 `band--deep`**。
|
|
105
|
-
4. **每页一屏 + 高度稳定**——`section.band` ≥ 一屏;主内容不得溢出画布或压进结论条/注释带。放不下按「重构承载 → 拆页/分章 → 换布局形态 → 有限缩字号」(`containers.overflowRule
|
|
105
|
+
4. **每页一屏 + 高度稳定**——`section.band` ≥ 一屏;主内容不得溢出画布或压进结论条/注释带。放不下按「重构承载 → 拆页/分章 → 换布局形态 → 有限缩字号」(`containers.overflowRule`);**禁止**静默截断或为疏朗删结论条/证据。**大纲 = 3–7 章(每章 1+ 页),禁逐页标题罗列**(`outline-design.md` ⑤)。结论条 = MD3 tonal surface(无「So what」标签、**无左侧 accent 轨**);要点卡/关键列表按 `icons.md` 克制取用图标。
|
|
106
106
|
5. **PPT 式翻页 + 骨架固定**——`section.band` 即一页;方向键翻页、页码可点;Agenda 第二页(arch 内容页 ≤4 可省);页头只留 eyebrow + 标题 + 可选导语,页脚全文一个;页头页脚之外不加装饰。
|
|
107
107
|
6. **标题与字号**——主标题粗体;research=结论句(≥12 字);**presentation=主张/行动句**(禁话题标签);字号随模式,`clamp()`,图表不缩水。
|
|
108
108
|
7. **组合版式 + 细节保全**——默认一页 = 主件 + 从件 + 注释层(矩阵 playbook §四);先判定决策必需信息再定形态,**禁砍口径列/时间列/维度**;密度 L/M/H 禁连续 3 页同档;同一版式不连用超 2 页(扩展签名可 3 页)。
|
|
109
109
|
8. **列表优先 + 去 AI 味 + 图标克制**——大段文字转列表(research 双/三栏正文除外);`aiFlavor` 词表零命中;图标每屏 3–8 个(架构图为王可无)。
|
|
110
110
|
9. **图表够大 + 够多样 + 双通道**——尺寸 ≥ `charts.minSize`;`data-chart` 须在 `charts.registry`(36 种)登记;多样性下限与相邻不同型按 `charts.variety`(playbook §五);原生通道 `addChart` 双击可编辑数据,形状通道须按登记策略附数据表(口径注解见 tech-design §二)。
|
|
111
|
-
10. **引用与待核实**——外部数据 `[n]` +
|
|
111
|
+
10. **引用与待核实**——外部数据 `[n]` + 文末参考资料(来源+时间+口径)双向对齐;**只列真实来源,无则省略参考资料整节,禁占位条目**;research 关键图表 Exhibit N 连续编号 + 来源行;`.tbd` 强调色标注必须配图例(content-rules §五-b),单页 ≤12 处;只标色不解释即不合格。
|
|
112
112
|
11. **容器级门禁 + 语义字号**——溢出按**归属容器**判定,越过容器即失败(哪怕未越页);容器保留内边距,不得缩字号解决溢出;表格正文用 `body` 层级,`micro` 只给轴标签/单位/短标签;连续句不拆文本框。
|
|
113
113
|
12. **双单源 + 校验闭环**——schema 只改 `scripts/model-schema.json`,其余常量只改 `scripts/layout-constants.json`,改后必跑 `sync_runtime.py`(禁手改注入副本);**HTML strict 0/0 才交付**,带 PPTX 加验 `validate_pptx.py --strict --model=` 0/0;页面只提供「预览 PPTX」与提示词,不做文件导出。
|
|
114
114
|
|
|
@@ -132,7 +132,7 @@ metadata:
|
|
|
132
132
|
|
|
133
133
|
## 版本口径
|
|
134
134
|
|
|
135
|
-
包 semver(现 0.1.
|
|
135
|
+
包 semver(现 0.1.19)≠ schema 线(layout-constants / model-schema,现 `0.1`);patch 不抬 schema。
|
|
136
136
|
|
|
137
137
|
## 环境依赖
|
|
138
138
|
|
|
@@ -332,7 +332,13 @@ border-color:color-mix(in srgb,var(--accent-on) 20%,transparent);color:var(--acc
|
|
|
332
332
|
rows-2 / rows-3:等高行分区(纵向节奏,替代等高卡片堆叠) */
|
|
333
333
|
.g-211{grid-template-columns:minmax(0,2fr) minmax(0,1fr) minmax(0,1fr)}
|
|
334
334
|
.g-121{grid-template-columns:minmax(0,1fr) minmax(0,2fr) minmax(0,1fr)}
|
|
335
|
-
.g-quad{grid-template-columns:repeat(2,minmax(0,1fr));grid-auto-rows:minmax(
|
|
335
|
+
.g-quad{grid-template-columns:repeat(2,minmax(0,1fr));grid-auto-rows:minmax(min-content,1fr);align-items:stretch}
|
|
336
|
+
.g-half{grid-template-columns:minmax(0,1.05fr) minmax(0,1fr);align-items:stretch}
|
|
337
|
+
@media (max-width:1180px){.g-half{grid-template-columns:1fr}}
|
|
338
|
+
.g-2--equal,.g-3--equal,.g-4--equal{grid-auto-rows:minmax(min-content,1fr);align-items:stretch}
|
|
339
|
+
.grid.g-2>.card,.grid.g-3>.card,.grid.g-4>.card,
|
|
340
|
+
.grid.g-quad>.card,.grid.g-half>.card,.grid.g-2--equal>.card,
|
|
341
|
+
.grid.g-3--equal>.card,.grid.g-4--equal>.card{align-self:stretch}
|
|
336
342
|
.g-aside{grid-template-columns:minmax(0,1fr) minmax(200px,.36fr);align-items:start}
|
|
337
343
|
.g-aside__side{position:sticky;top:calc(var(--bar-h) + 16px)}
|
|
338
344
|
.g-mosaic{grid-template-columns:repeat(3,minmax(0,1fr));
|
|
@@ -348,7 +354,7 @@ grid-template-areas:"main main main" "s1 s2 s3"}
|
|
|
348
354
|
.kv--2col{grid-template-columns:auto minmax(0,1fr) auto minmax(0,1fr)}
|
|
349
355
|
/* ── 拼贴栅格 g-bento(Bento / 马赛克):4 列基准 + 跨列/跨行工具类 ──
|
|
350
356
|
.sp-2/.sp-3/.sp-4 跨列(span),.rw-2 跨行;窄屏自动降列并收敛 span。 */
|
|
351
|
-
.g-bento{grid-template-columns:repeat(4,minmax(0,1fr));grid-auto-rows:minmax(
|
|
357
|
+
.g-bento{grid-template-columns:repeat(4,minmax(0,1fr));grid-auto-rows:minmax(min-content,1fr)}
|
|
352
358
|
.sp-2{grid-column:span 2}.sp-3{grid-column:span 3}.sp-4{grid-column:span 4}
|
|
353
359
|
.rw-2{grid-row:span 2}
|
|
354
360
|
@media (max-width:1180px){.g-bento{grid-template-columns:repeat(2,minmax(0,1fr))}
|
|
@@ -383,19 +389,21 @@ background:color-mix(in srgb,var(--bg) 86%,transparent);
|
|
|
383
389
|
backdrop-filter:saturate(160%) blur(14px);-webkit-backdrop-filter:saturate(160%) blur(14px);
|
|
384
390
|
border-bottom:1px solid var(--border-soft);
|
|
385
391
|
transition:height var(--dur-medium) var(--ease-standard)}
|
|
386
|
-
.bar__in{height:100%;display:flex;align-items:center;justify-content:space-between;gap:var(--sp-4)}
|
|
387
|
-
.brand{display:flex;align-items:center;gap:var(--sp-3);min-width:0}
|
|
392
|
+
.bar__in{height:100%;display:flex;align-items:center;justify-content:space-between;gap:var(--sp-4);overflow:hidden}
|
|
393
|
+
.brand{display:flex;align-items:center;gap:var(--sp-3);min-width:0;flex:1 1 auto;overflow:hidden}
|
|
388
394
|
.brand__mark{width:34px;height:34px;flex:none;border-radius:10px;background:var(--accent);
|
|
389
395
|
color:var(--accent-on);display:grid;place-items:center;font-size:13px;font-weight:700}
|
|
396
|
+
.brand__txt{min-width:0;overflow:hidden;flex:1 1 auto}
|
|
390
397
|
.brand__title{font-size:var(--fs-sm);font-weight:600;color:var(--text);white-space:nowrap;
|
|
391
|
-
overflow:hidden;text-overflow:ellipsis}
|
|
398
|
+
overflow:hidden;text-overflow:ellipsis;max-width:100%}
|
|
392
399
|
.brand__sub{font-size:var(--fs-xs);color:var(--text-3);white-space:nowrap;overflow:hidden;
|
|
393
|
-
text-overflow:ellipsis}
|
|
394
|
-
.nav{display:flex;align-items:center;gap:var(--sp-1)}
|
|
400
|
+
text-overflow:ellipsis;max-width:100%}
|
|
401
|
+
.nav{display:flex;align-items:center;gap:var(--sp-1);flex:0 1 auto;min-width:0;overflow:hidden}
|
|
395
402
|
.nav a{padding:8px 14px;border-radius:var(--r-full);color:var(--text-2);text-decoration:none;
|
|
396
403
|
font-size:var(--fs-sm);font-weight:500;white-space:nowrap;transition:background-color var(--dur-short),color var(--dur-short)}
|
|
397
404
|
.nav a:hover{background:var(--surface-2);color:var(--text)}
|
|
398
405
|
@media (max-width:1180px){.nav{display:none}}
|
|
406
|
+
@media (max-width:1360px){.brand__sub{display:none}}
|
|
399
407
|
.iconbtn{width:40px;height:40px;flex:none;display:grid;place-items:center;
|
|
400
408
|
border:1px solid var(--border);border-radius:var(--r-full);background:transparent;
|
|
401
409
|
color:var(--text-2);cursor:pointer;transition:background-color var(--dur-short),color var(--dur-short)}
|
|
@@ -450,12 +458,15 @@ transition:background-color var(--dur-short),box-shadow var(--dur-short),transfo
|
|
|
450
458
|
.btn--ghost{background:transparent;color:var(--text);border-color:var(--border)}
|
|
451
459
|
.btn--onDark{background:var(--surface);color:var(--text)}
|
|
452
460
|
.card{background:var(--surface);border:1px solid var(--border-soft);border-radius:var(--r-lg);
|
|
453
|
-
padding:clamp(20px,2vw,30px);transition:border-color var(--dur-short),box-shadow var(--dur-short),background-color var(--dur-medium)
|
|
461
|
+
padding:clamp(20px,2vw,30px);transition:border-color var(--dur-short),box-shadow var(--dur-short),background-color var(--dur-medium);
|
|
462
|
+
display:flex;flex-direction:column;min-width:0}
|
|
454
463
|
.card:hover{border-color:var(--border);box-shadow:var(--shadow-1)}
|
|
455
464
|
.card--flat{background:var(--surface-1);border-color:transparent}
|
|
456
465
|
.card--flat:hover{background:var(--surface-2)}
|
|
457
466
|
.card--accent{background:var(--accent-soft);border-color:transparent}
|
|
458
|
-
.card__hd{display:flex;align-items:center;gap:var(--sp-3);margin-bottom:var(--sp-3)}
|
|
467
|
+
.card__hd{display:flex;align-items:center;gap:var(--sp-3);margin-bottom:var(--sp-3);flex:none}
|
|
468
|
+
.card>.ul,.card>.t-body,.card>.t-sm{flex:1 1 auto}
|
|
469
|
+
.card>.so-what,.card>.tbd-legend,.card>.flagbar{flex:none;margin-top:auto}
|
|
459
470
|
.card__ico{width:34px;height:34px;flex:none;border-radius:10px;background:var(--accent-soft);
|
|
460
471
|
color:var(--accent-text);display:grid;place-items:center;font-size:15px;font-weight:600}
|
|
461
472
|
.card__ico svg{width:18px;height:18px}
|
|
@@ -1994,7 +2005,7 @@ window.REPORT_MODEL = {
|
|
|
1994
2005
|
|
|
1995
2006
|
/* __TOPPPT_RUNTIME_START__ */
|
|
1996
2007
|
/* ══ PPTX 导出运行时(assets/pptx-export.js 的内联副本 · 由 scripts/sync_runtime.py 注入,禁止手改) ══ */
|
|
1997
|
-
/* __TOPPPT_RUNTIME_SHA__:
|
|
2008
|
+
/* __TOPPPT_RUNTIME_SHA__:af6e25f25fd2e116 */
|
|
1998
2009
|
/* ═══════════════════════════════════════════════════════════════════════════
|
|
1999
2010
|
* TopPPT HTML· 浏览器端 PPTX 预览运行时
|
|
2000
2011
|
* 零依赖、随报告单文件分发;OOXML 序列化器(仅供预览,页面不导出文件)。
|
|
@@ -2118,7 +2129,8 @@ function regionOf(pageType, slotId, opts) {
|
|
|
2118
2129
|
if (type === 'bar' && slot === 'primary') {
|
|
2119
2130
|
var by = P.chartY || 2.95;
|
|
2120
2131
|
var bb = opts.bottom != null ? opts.bottom : bottomDefault;
|
|
2121
|
-
|
|
2132
|
+
/* chartX/chartW 历史误用已纠正:与 donut/table/hbar/exhibit 同口径,图表盒对齐版心 (MX, CW) */
|
|
2133
|
+
return { x: MX, y: by, w: CW, h: Math.max(1.2, bb - by) };
|
|
2122
2134
|
}
|
|
2123
2135
|
if (type === 'bar' && slot === 'hbar') {
|
|
2124
2136
|
var y0 = P.hbarY0 || 2.6;
|
|
@@ -2230,7 +2242,7 @@ function regionOf(pageType, slotId, opts) {
|
|
|
2230
2242
|
/* __TOPPPT_SCHEMA_START__ */
|
|
2231
2243
|
/* ── 由 scripts/sync_runtime.py 从 scripts/model-schema.json 注入 · 禁止手改 ── */
|
|
2232
2244
|
/* DSL schema 单源:浏览器端 validateModel 与 scripts/extract_model.py 消费同一份定义 */
|
|
2233
|
-
var MODEL_SCHEMA = {"version":"0.1","modes":["presentation","research","architecture"],"model":{"required":["title","sections:array","closing.title","closing.points:array"],"optional":["mode","style","theme","subtitle","meta","agenda:array"],"agendaMin":{"presentation":3,"research":3,"architecture":0},"sectionsMin":1,"sectionsRecommended":3,"agendaComfortMax":
|
|
2245
|
+
var MODEL_SCHEMA = {"version":"0.1","modes":["presentation","research","architecture"],"model":{"required":["title","sections:array","closing.title","closing.points:array"],"optional":["mode","style","theme","subtitle","meta","agenda:array"],"agendaMin":{"presentation":3,"research":3,"architecture":0},"agendaMax":7,"agendaMaxWithRefs":8,"agendaHint":"agenda 条目 = 章(篇/section),3–7 条;每章可含多页(sections[] 按页建模)。禁止把逐页标题当大纲。sections[].eyebrow 的 `NN ·` 前缀 = 章键,须与某条 agenda 对应;跳转锚点 = 该章第一页。含「参考资料」条目时 +1 仍 ≤8。","sectionsMin":1,"sectionsRecommended":3,"agendaComfortMax":8},"commonSectionFields":["eyebrow","title","lead","soWhat","footnote","flags","image","exhibitNo","layoutPreset"],"mutualExclusionHint":"verdict 与 soWhat 互斥:二者共用 annotation 结论条槽位,同页双填必叠印。comparison 页填 verdict 时不要再填 soWhat(渲染器已自动二选一,但模型侧应只给一个)。","flagsHint":"flags = 待核实/待二次修改条目字符串数组(如 '2027 增速 xx%(口径未定)');渲染为 accent 强调色标注行,提示用户核对。","imageHint":"image = 素材图片/配图占位对象。三选一必填:src(用户图,data: 内联或相对路径,零外链铁律禁 http(s))|items(多图版式:grid/compare/wall,元素 {src?, alt?, caption?, placeholder?})|placeholder:true(无图时出配图占位,原生形状渲染、pictures 不增)。其余可选:layout(full/half/bleed/grid/compare/wall,见 layout-constants.json imageSpec.layouts)、fit(cover 默认 / contain)、caption、alt、hint、ratio。","imageLayoutHint":"layout 与 HTML 版式对应:full=版心全宽图|half=左图右注(points 为右栏注解)|bleed=通栏出血|grid=多图网格(items 2/3/4/6 张)|compare=双图 A/B 对比(items 2 张)|wall=Logo 墙(items 3–12 张小图)。占位符标签文本由双引擎按 imageSpec 拼同一串,保证 A/B 通道逐页文本一致。","chartTypes":["bar","hbar","stack","stackline","line","dualline","area","donut","multidonut","pie","radar","scatter","bubble","waterfall","gauge","pareto","funnel","gantt","vsbar","progress","sparkline","slope","dumbbell","lollipop","dotplot","bulletchart","waffle","radialbar","rose","candlestick"],"chartTypesHint":"chart.type 可取值 = 本表(30 类:16 原生 + 14 形状还原)。其余 6 类复杂信息图(sankey/treemap/boxplot/network/marimekko/streamgraph)是**专属页型**而非 chart.type——它们要按列/段/节点等结构化载荷表达,故走 sections[].type。不变量:charts.registry.types == chartTypes ∪ 上述 6 类页型(sync_runtime.py 校验)。","chartDataTable":{"enum":["notes","inline","appendix","off"],"default":"notes","rule":"非原生图表(registry.pptx=shape)的 dataTable 不得为 off;缺失时按 registry 默认值补齐。"},"pageTypes":{"points":{"label":"要点列表页","modes":["presentation","research","architecture"],"required":["points:array"],"optional":["metrics:array"]},"metrics":{"label":"指标带页(4–6 个核心数字)","modes":["presentation","research"],"required":["metrics:array"]},"kpi":{"label":"大数指标页(hero 大数字 + 支撑指标行)","modes":["presentation","research"],"required":["hero:array"],"optional":["metrics:array"]},"table":{"label":"对比表页","modes":["presentation","research","architecture"],"required":["table.head:array","table.rows:array"],"optional":["table.colW:array"]},"timeline":{"label":"时间线 / 路线页","modes":["presentation","research"],"required":["phases:array"]},"steps":{"label":"步骤条页(N 步横排 + 箭头,可分组)","modes":["presentation","research","architecture"],"required":["steps:array"],"optional":["groups:array","note"]},"bar":{"label":"图表页(chart.type 见 chartTypes;native 通道走原生数据图表,shape 通道走高保真形状还原 + 数据表)","modes":["presentation","research"],"required":["chart.labels:array","chart.values:array"],"optional":["chart.type","chart.series:array","chart.points:array","chart.max","chart.unit","chart.colors:array","chart.start:array","chart.target:array","chart.dataTable","note"]},"donut":{"label":"环形图页(原生 pie 楔形 + 图例)","modes":["presentation","research"],"required":["chart.labels:array","chart.values:array"],"optional":["chart.unit","chart.centerLabel","chart.colors:array","chart.dataTable","note"]},"heatmap":{"label":"热力矩阵页(行 × 列 + 强度色阶)","modes":["presentation","research"],"required":["rowHeads:array","colHeads:array","cells:array"],"optional":["unit","scaleLabel:array","note"]},"bullet":{"label":"达成对比页(实际 vs 目标条)","modes":["presentation","research"],"required":["items:array"],"optional":["unit","max","note"]},"pyramid":{"label":"金字塔页(层级递进,顶层最窄)","modes":["presentation","research","architecture"],"required":["levels:array"],"optional":["note"]},"image":{"label":"素材图片页(full/half/bleed/grid/compare/wall,效果与位置锁定;支持配图占位)","modes":["presentation","research","architecture"],"required":["anyof:image.src:str|image.items:array|image.placeholder"],"optional":["image.caption","image.alt","image.layout","image.fit","image.ratio","image.hint","points:array","note"]},"cards":{"label":"卡片网格页(cards 元素须为 {title, points:[[k,v]…], icon?},不接受元组)","modes":["presentation","research"],"required":["cards:array"],"optional":["columns"],"cardItemHint":"cards[] 元素:{title:str, points:[[k,v]…]|[{t,d}…]|[str…], icon?:str}。icon = 语义图标名(icon_lib.js 键:增长/下降/数据/图表/趋势/占比/表格/效率/成果/安全/权限/检查/风险/团队/流程/计划/智能/洞察/工具/清单),HTML 与 PPTX 同名真导出;缺省按标题语义自动挑选。"},"split":{"label":"双区组合页(left / right 各可为 要点|图表|表格|图片:type = points(默认)| table | image | 图表类型名;图表/表格字段直接挂在对应侧)","modes":["presentation","research"],"required":["anyof:left.points:array|left.type:str"],"optional":["left.cap","left.image","left.labels:array","left.values:array","left.series:array","left.points:array","left.max","left.unit","left.colors:array","left.dataTable","left.head:array","left.rows:array","left.colW:array","right.type","right.cap","right.image","right.labels:array","right.values:array","right.series:array","right.points:array","right.max","right.unit","right.colors:array","right.dataTable","right.head:array","right.rows:array","right.colW:array"]},"comparison":{"label":"对比页(左右双栏 + 可选结论条)","modes":["presentation","research"],"required":["left.title","left.points:array","right.title","right.points:array"],"optional":["verdict"]},"quote":{"label":"引用 / 金句页(深色全幅)","modes":["presentation","research"],"required":["quote","author"],"optional":["context"]},"diagram":{"label":"分层架构页(architecture 模式走全幅几何)","modes":["presentation","research","architecture"],"required":["layers:array"],"optional":["legend:array"]},"exhibit":{"label":"Exhibit 编号图表页(research R2)","modes":["research"],"required":["chart.labels:array","chart.values:array"],"optional":["exhibitNo","chart.type","chart.series:array","chart.points:array","chart.max","chart.unit","chart.colors:array","chart.dataTable","note"]},"twocol":{"label":"双栏论证页(research R1)","modes":["research"],"required":["paragraphs:array"]},"threecol":{"label":"三栏证据页(research R6)","modes":["research"],"required":["paragraphs:array"]},"halftable":{"label":"半表半图页(research R7)","modes":["research"],"required":["table.head:array","table.rows:array","chart.labels:array","chart.values:array"],"optional":["table.colW:array","chart.type","chart.series:array","chart.points:array","chart.max","chart.unit","chart.colors:array","chart.dataTable","note"]},"matrix":{"label":"矩阵图页(research R8)","modes":["research"],"required":["rowHeads:array","colHeads:array","cells:array"]},"lane":{"label":"泳道页(architecture A2)","modes":["architecture"],"required":["lanes:array"]},"sankey":{"label":"桑基图页(节点-流带,流向与流量)","modes":["research","architecture"],"required":["flows:array"],"optional":["unit","chart.dataTable","note"]},"treemap":{"label":"树图页(面积编码的层级构成)","modes":["research","architecture"],"required":["items:array"],"optional":["unit","chart.dataTable","note"]},"boxplot":{"label":"箱线图页(分布对比:min/q1/median/q3/max)","modes":["research","architecture"],"required":["groups:array"],"optional":["unit","chart.dataTable","note"]},"network":{"label":"关系网络页(节点-边拓扑)","modes":["research","architecture"],"required":["nodes:array","edges:array"],"optional":["chart.dataTable","note"]},"marimekko":{"label":"马赛克图页(列宽 × 列高双重编码)","modes":["research","architecture"],"required":["cols:array","cells:array"],"optional":["unit","chart.dataTable","note"]},"streamgraph":{"label":"流带图页(时间上的构成演变)","modes":["research","architecture"],"required":["series:array"],"optional":["labels:array","chart.dataTable","note"]}}};
|
|
2234
2246
|
/* __TOPPPT_SCHEMA_END__ */
|
|
2235
2247
|
|
|
2236
2248
|
var _mode = 'presentation'; /* 当前模式(slidesOf 里按 model.mode 设置) */
|
|
@@ -330,7 +330,13 @@ border-color:color-mix(in srgb,var(--accent-on) 20%,transparent);color:var(--acc
|
|
|
330
330
|
rows-2 / rows-3:等高行分区(纵向节奏,替代等高卡片堆叠) */
|
|
331
331
|
.g-211{grid-template-columns:minmax(0,2fr) minmax(0,1fr) minmax(0,1fr)}
|
|
332
332
|
.g-121{grid-template-columns:minmax(0,1fr) minmax(0,2fr) minmax(0,1fr)}
|
|
333
|
-
.g-quad{grid-template-columns:repeat(2,minmax(0,1fr));grid-auto-rows:minmax(
|
|
333
|
+
.g-quad{grid-template-columns:repeat(2,minmax(0,1fr));grid-auto-rows:minmax(min-content,1fr);align-items:stretch}
|
|
334
|
+
.g-half{grid-template-columns:minmax(0,1.05fr) minmax(0,1fr);align-items:stretch}
|
|
335
|
+
@media (max-width:1180px){.g-half{grid-template-columns:1fr}}
|
|
336
|
+
.g-2--equal,.g-3--equal,.g-4--equal{grid-auto-rows:minmax(min-content,1fr);align-items:stretch}
|
|
337
|
+
.grid.g-2>.card,.grid.g-3>.card,.grid.g-4>.card,
|
|
338
|
+
.grid.g-quad>.card,.grid.g-half>.card,.grid.g-2--equal>.card,
|
|
339
|
+
.grid.g-3--equal>.card,.grid.g-4--equal>.card{align-self:stretch}
|
|
334
340
|
.g-aside{grid-template-columns:minmax(0,1fr) minmax(200px,.36fr);align-items:start}
|
|
335
341
|
.g-aside__side{position:sticky;top:calc(var(--bar-h) + 16px)}
|
|
336
342
|
.g-mosaic{grid-template-columns:repeat(3,minmax(0,1fr));
|
|
@@ -346,7 +352,7 @@ grid-template-areas:"main main main" "s1 s2 s3"}
|
|
|
346
352
|
.kv--2col{grid-template-columns:auto minmax(0,1fr) auto minmax(0,1fr)}
|
|
347
353
|
/* ── 拼贴栅格 g-bento(Bento / 马赛克):4 列基准 + 跨列/跨行工具类 ──
|
|
348
354
|
.sp-2/.sp-3/.sp-4 跨列(span),.rw-2 跨行;窄屏自动降列并收敛 span。 */
|
|
349
|
-
.g-bento{grid-template-columns:repeat(4,minmax(0,1fr));grid-auto-rows:minmax(
|
|
355
|
+
.g-bento{grid-template-columns:repeat(4,minmax(0,1fr));grid-auto-rows:minmax(min-content,1fr)}
|
|
350
356
|
.sp-2{grid-column:span 2}.sp-3{grid-column:span 3}.sp-4{grid-column:span 4}
|
|
351
357
|
.rw-2{grid-row:span 2}
|
|
352
358
|
@media (max-width:1180px){.g-bento{grid-template-columns:repeat(2,minmax(0,1fr))}
|
|
@@ -381,19 +387,21 @@ background:color-mix(in srgb,var(--bg) 86%,transparent);
|
|
|
381
387
|
backdrop-filter:saturate(160%) blur(14px);-webkit-backdrop-filter:saturate(160%) blur(14px);
|
|
382
388
|
border-bottom:1px solid var(--border-soft);
|
|
383
389
|
transition:height var(--dur-medium) var(--ease-standard)}
|
|
384
|
-
.bar__in{height:100%;display:flex;align-items:center;justify-content:space-between;gap:var(--sp-4)}
|
|
385
|
-
.brand{display:flex;align-items:center;gap:var(--sp-3);min-width:0}
|
|
390
|
+
.bar__in{height:100%;display:flex;align-items:center;justify-content:space-between;gap:var(--sp-4);overflow:hidden}
|
|
391
|
+
.brand{display:flex;align-items:center;gap:var(--sp-3);min-width:0;flex:1 1 auto;overflow:hidden}
|
|
386
392
|
.brand__mark{width:34px;height:34px;flex:none;border-radius:10px;background:var(--accent);
|
|
387
393
|
color:var(--accent-on);display:grid;place-items:center;font-size:13px;font-weight:700}
|
|
394
|
+
.brand__txt{min-width:0;overflow:hidden;flex:1 1 auto}
|
|
388
395
|
.brand__title{font-size:var(--fs-sm);font-weight:600;color:var(--text);white-space:nowrap;
|
|
389
|
-
overflow:hidden;text-overflow:ellipsis}
|
|
396
|
+
overflow:hidden;text-overflow:ellipsis;max-width:100%}
|
|
390
397
|
.brand__sub{font-size:var(--fs-xs);color:var(--text-3);white-space:nowrap;overflow:hidden;
|
|
391
|
-
text-overflow:ellipsis}
|
|
392
|
-
.nav{display:flex;align-items:center;gap:var(--sp-1)}
|
|
398
|
+
text-overflow:ellipsis;max-width:100%}
|
|
399
|
+
.nav{display:flex;align-items:center;gap:var(--sp-1);flex:0 1 auto;min-width:0;overflow:hidden}
|
|
393
400
|
.nav a{padding:8px 14px;border-radius:var(--r-full);color:var(--text-2);text-decoration:none;
|
|
394
401
|
font-size:var(--fs-sm);font-weight:500;white-space:nowrap;transition:background-color var(--dur-short),color var(--dur-short)}
|
|
395
402
|
.nav a:hover{background:var(--surface-2);color:var(--text)}
|
|
396
403
|
@media (max-width:1180px){.nav{display:none}}
|
|
404
|
+
@media (max-width:1360px){.brand__sub{display:none}}
|
|
397
405
|
.iconbtn{width:40px;height:40px;flex:none;display:grid;place-items:center;
|
|
398
406
|
border:1px solid var(--border);border-radius:var(--r-full);background:transparent;
|
|
399
407
|
color:var(--text-2);cursor:pointer;transition:background-color var(--dur-short),color var(--dur-short)}
|
|
@@ -448,12 +456,15 @@ transition:background-color var(--dur-short),box-shadow var(--dur-short),transfo
|
|
|
448
456
|
.btn--ghost{background:transparent;color:var(--text);border-color:var(--border)}
|
|
449
457
|
.btn--onDark{background:var(--surface);color:var(--text)}
|
|
450
458
|
.card{background:var(--surface);border:1px solid var(--border-soft);border-radius:var(--r-lg);
|
|
451
|
-
padding:clamp(20px,2vw,30px);transition:border-color var(--dur-short),box-shadow var(--dur-short),background-color var(--dur-medium)
|
|
459
|
+
padding:clamp(20px,2vw,30px);transition:border-color var(--dur-short),box-shadow var(--dur-short),background-color var(--dur-medium);
|
|
460
|
+
display:flex;flex-direction:column;min-width:0}
|
|
452
461
|
.card:hover{border-color:var(--border);box-shadow:var(--shadow-1)}
|
|
453
462
|
.card--flat{background:var(--surface-1);border-color:transparent}
|
|
454
463
|
.card--flat:hover{background:var(--surface-2)}
|
|
455
464
|
.card--accent{background:var(--accent-soft);border-color:transparent}
|
|
456
|
-
.card__hd{display:flex;align-items:center;gap:var(--sp-3);margin-bottom:var(--sp-3)}
|
|
465
|
+
.card__hd{display:flex;align-items:center;gap:var(--sp-3);margin-bottom:var(--sp-3);flex:none}
|
|
466
|
+
.card>.ul,.card>.t-body,.card>.t-sm{flex:1 1 auto}
|
|
467
|
+
.card>.so-what,.card>.tbd-legend,.card>.flagbar{flex:none;margin-top:auto}
|
|
457
468
|
.card__ico{width:34px;height:34px;flex:none;border-radius:10px;background:var(--accent-soft);
|
|
458
469
|
color:var(--accent-text);display:grid;place-items:center;font-size:15px;font-weight:600}
|
|
459
470
|
.card__ico svg{width:18px;height:18px}
|
|
@@ -2392,7 +2403,7 @@ window.REPORT_MODEL = {
|
|
|
2392
2403
|
|
|
2393
2404
|
/* __TOPPPT_RUNTIME_START__ */
|
|
2394
2405
|
/* ══ PPTX 导出运行时(assets/pptx-export.js 的内联副本 · 由 scripts/sync_runtime.py 注入,禁止手改) ══ */
|
|
2395
|
-
/* __TOPPPT_RUNTIME_SHA__:
|
|
2406
|
+
/* __TOPPPT_RUNTIME_SHA__:af6e25f25fd2e116 */
|
|
2396
2407
|
/* ═══════════════════════════════════════════════════════════════════════════
|
|
2397
2408
|
* TopPPT HTML· 浏览器端 PPTX 预览运行时
|
|
2398
2409
|
* 零依赖、随报告单文件分发;OOXML 序列化器(仅供预览,页面不导出文件)。
|
|
@@ -2516,7 +2527,8 @@ function regionOf(pageType, slotId, opts) {
|
|
|
2516
2527
|
if (type === 'bar' && slot === 'primary') {
|
|
2517
2528
|
var by = P.chartY || 2.95;
|
|
2518
2529
|
var bb = opts.bottom != null ? opts.bottom : bottomDefault;
|
|
2519
|
-
|
|
2530
|
+
/* chartX/chartW 历史误用已纠正:与 donut/table/hbar/exhibit 同口径,图表盒对齐版心 (MX, CW) */
|
|
2531
|
+
return { x: MX, y: by, w: CW, h: Math.max(1.2, bb - by) };
|
|
2520
2532
|
}
|
|
2521
2533
|
if (type === 'bar' && slot === 'hbar') {
|
|
2522
2534
|
var y0 = P.hbarY0 || 2.6;
|
|
@@ -2628,7 +2640,7 @@ function regionOf(pageType, slotId, opts) {
|
|
|
2628
2640
|
/* __TOPPPT_SCHEMA_START__ */
|
|
2629
2641
|
/* ── 由 scripts/sync_runtime.py 从 scripts/model-schema.json 注入 · 禁止手改 ── */
|
|
2630
2642
|
/* DSL schema 单源:浏览器端 validateModel 与 scripts/extract_model.py 消费同一份定义 */
|
|
2631
|
-
var MODEL_SCHEMA = {"version":"0.1","modes":["presentation","research","architecture"],"model":{"required":["title","sections:array","closing.title","closing.points:array"],"optional":["mode","style","theme","subtitle","meta","agenda:array"],"agendaMin":{"presentation":3,"research":3,"architecture":0},"sectionsMin":1,"sectionsRecommended":3,"agendaComfortMax":
|
|
2643
|
+
var MODEL_SCHEMA = {"version":"0.1","modes":["presentation","research","architecture"],"model":{"required":["title","sections:array","closing.title","closing.points:array"],"optional":["mode","style","theme","subtitle","meta","agenda:array"],"agendaMin":{"presentation":3,"research":3,"architecture":0},"agendaMax":7,"agendaMaxWithRefs":8,"agendaHint":"agenda 条目 = 章(篇/section),3–7 条;每章可含多页(sections[] 按页建模)。禁止把逐页标题当大纲。sections[].eyebrow 的 `NN ·` 前缀 = 章键,须与某条 agenda 对应;跳转锚点 = 该章第一页。含「参考资料」条目时 +1 仍 ≤8。","sectionsMin":1,"sectionsRecommended":3,"agendaComfortMax":8},"commonSectionFields":["eyebrow","title","lead","soWhat","footnote","flags","image","exhibitNo","layoutPreset"],"mutualExclusionHint":"verdict 与 soWhat 互斥:二者共用 annotation 结论条槽位,同页双填必叠印。comparison 页填 verdict 时不要再填 soWhat(渲染器已自动二选一,但模型侧应只给一个)。","flagsHint":"flags = 待核实/待二次修改条目字符串数组(如 '2027 增速 xx%(口径未定)');渲染为 accent 强调色标注行,提示用户核对。","imageHint":"image = 素材图片/配图占位对象。三选一必填:src(用户图,data: 内联或相对路径,零外链铁律禁 http(s))|items(多图版式:grid/compare/wall,元素 {src?, alt?, caption?, placeholder?})|placeholder:true(无图时出配图占位,原生形状渲染、pictures 不增)。其余可选:layout(full/half/bleed/grid/compare/wall,见 layout-constants.json imageSpec.layouts)、fit(cover 默认 / contain)、caption、alt、hint、ratio。","imageLayoutHint":"layout 与 HTML 版式对应:full=版心全宽图|half=左图右注(points 为右栏注解)|bleed=通栏出血|grid=多图网格(items 2/3/4/6 张)|compare=双图 A/B 对比(items 2 张)|wall=Logo 墙(items 3–12 张小图)。占位符标签文本由双引擎按 imageSpec 拼同一串,保证 A/B 通道逐页文本一致。","chartTypes":["bar","hbar","stack","stackline","line","dualline","area","donut","multidonut","pie","radar","scatter","bubble","waterfall","gauge","pareto","funnel","gantt","vsbar","progress","sparkline","slope","dumbbell","lollipop","dotplot","bulletchart","waffle","radialbar","rose","candlestick"],"chartTypesHint":"chart.type 可取值 = 本表(30 类:16 原生 + 14 形状还原)。其余 6 类复杂信息图(sankey/treemap/boxplot/network/marimekko/streamgraph)是**专属页型**而非 chart.type——它们要按列/段/节点等结构化载荷表达,故走 sections[].type。不变量:charts.registry.types == chartTypes ∪ 上述 6 类页型(sync_runtime.py 校验)。","chartDataTable":{"enum":["notes","inline","appendix","off"],"default":"notes","rule":"非原生图表(registry.pptx=shape)的 dataTable 不得为 off;缺失时按 registry 默认值补齐。"},"pageTypes":{"points":{"label":"要点列表页","modes":["presentation","research","architecture"],"required":["points:array"],"optional":["metrics:array"]},"metrics":{"label":"指标带页(4–6 个核心数字)","modes":["presentation","research"],"required":["metrics:array"]},"kpi":{"label":"大数指标页(hero 大数字 + 支撑指标行)","modes":["presentation","research"],"required":["hero:array"],"optional":["metrics:array"]},"table":{"label":"对比表页","modes":["presentation","research","architecture"],"required":["table.head:array","table.rows:array"],"optional":["table.colW:array"]},"timeline":{"label":"时间线 / 路线页","modes":["presentation","research"],"required":["phases:array"]},"steps":{"label":"步骤条页(N 步横排 + 箭头,可分组)","modes":["presentation","research","architecture"],"required":["steps:array"],"optional":["groups:array","note"]},"bar":{"label":"图表页(chart.type 见 chartTypes;native 通道走原生数据图表,shape 通道走高保真形状还原 + 数据表)","modes":["presentation","research"],"required":["chart.labels:array","chart.values:array"],"optional":["chart.type","chart.series:array","chart.points:array","chart.max","chart.unit","chart.colors:array","chart.start:array","chart.target:array","chart.dataTable","note"]},"donut":{"label":"环形图页(原生 pie 楔形 + 图例)","modes":["presentation","research"],"required":["chart.labels:array","chart.values:array"],"optional":["chart.unit","chart.centerLabel","chart.colors:array","chart.dataTable","note"]},"heatmap":{"label":"热力矩阵页(行 × 列 + 强度色阶)","modes":["presentation","research"],"required":["rowHeads:array","colHeads:array","cells:array"],"optional":["unit","scaleLabel:array","note"]},"bullet":{"label":"达成对比页(实际 vs 目标条)","modes":["presentation","research"],"required":["items:array"],"optional":["unit","max","note"]},"pyramid":{"label":"金字塔页(层级递进,顶层最窄)","modes":["presentation","research","architecture"],"required":["levels:array"],"optional":["note"]},"image":{"label":"素材图片页(full/half/bleed/grid/compare/wall,效果与位置锁定;支持配图占位)","modes":["presentation","research","architecture"],"required":["anyof:image.src:str|image.items:array|image.placeholder"],"optional":["image.caption","image.alt","image.layout","image.fit","image.ratio","image.hint","points:array","note"]},"cards":{"label":"卡片网格页(cards 元素须为 {title, points:[[k,v]…], icon?},不接受元组)","modes":["presentation","research"],"required":["cards:array"],"optional":["columns"],"cardItemHint":"cards[] 元素:{title:str, points:[[k,v]…]|[{t,d}…]|[str…], icon?:str}。icon = 语义图标名(icon_lib.js 键:增长/下降/数据/图表/趋势/占比/表格/效率/成果/安全/权限/检查/风险/团队/流程/计划/智能/洞察/工具/清单),HTML 与 PPTX 同名真导出;缺省按标题语义自动挑选。"},"split":{"label":"双区组合页(left / right 各可为 要点|图表|表格|图片:type = points(默认)| table | image | 图表类型名;图表/表格字段直接挂在对应侧)","modes":["presentation","research"],"required":["anyof:left.points:array|left.type:str"],"optional":["left.cap","left.image","left.labels:array","left.values:array","left.series:array","left.points:array","left.max","left.unit","left.colors:array","left.dataTable","left.head:array","left.rows:array","left.colW:array","right.type","right.cap","right.image","right.labels:array","right.values:array","right.series:array","right.points:array","right.max","right.unit","right.colors:array","right.dataTable","right.head:array","right.rows:array","right.colW:array"]},"comparison":{"label":"对比页(左右双栏 + 可选结论条)","modes":["presentation","research"],"required":["left.title","left.points:array","right.title","right.points:array"],"optional":["verdict"]},"quote":{"label":"引用 / 金句页(深色全幅)","modes":["presentation","research"],"required":["quote","author"],"optional":["context"]},"diagram":{"label":"分层架构页(architecture 模式走全幅几何)","modes":["presentation","research","architecture"],"required":["layers:array"],"optional":["legend:array"]},"exhibit":{"label":"Exhibit 编号图表页(research R2)","modes":["research"],"required":["chart.labels:array","chart.values:array"],"optional":["exhibitNo","chart.type","chart.series:array","chart.points:array","chart.max","chart.unit","chart.colors:array","chart.dataTable","note"]},"twocol":{"label":"双栏论证页(research R1)","modes":["research"],"required":["paragraphs:array"]},"threecol":{"label":"三栏证据页(research R6)","modes":["research"],"required":["paragraphs:array"]},"halftable":{"label":"半表半图页(research R7)","modes":["research"],"required":["table.head:array","table.rows:array","chart.labels:array","chart.values:array"],"optional":["table.colW:array","chart.type","chart.series:array","chart.points:array","chart.max","chart.unit","chart.colors:array","chart.dataTable","note"]},"matrix":{"label":"矩阵图页(research R8)","modes":["research"],"required":["rowHeads:array","colHeads:array","cells:array"]},"lane":{"label":"泳道页(architecture A2)","modes":["architecture"],"required":["lanes:array"]},"sankey":{"label":"桑基图页(节点-流带,流向与流量)","modes":["research","architecture"],"required":["flows:array"],"optional":["unit","chart.dataTable","note"]},"treemap":{"label":"树图页(面积编码的层级构成)","modes":["research","architecture"],"required":["items:array"],"optional":["unit","chart.dataTable","note"]},"boxplot":{"label":"箱线图页(分布对比:min/q1/median/q3/max)","modes":["research","architecture"],"required":["groups:array"],"optional":["unit","chart.dataTable","note"]},"network":{"label":"关系网络页(节点-边拓扑)","modes":["research","architecture"],"required":["nodes:array","edges:array"],"optional":["chart.dataTable","note"]},"marimekko":{"label":"马赛克图页(列宽 × 列高双重编码)","modes":["research","architecture"],"required":["cols:array","cells:array"],"optional":["unit","chart.dataTable","note"]},"streamgraph":{"label":"流带图页(时间上的构成演变)","modes":["research","architecture"],"required":["series:array"],"optional":["labels:array","chart.dataTable","note"]}}};
|
|
2632
2644
|
/* __TOPPPT_SCHEMA_END__ */
|
|
2633
2645
|
|
|
2634
2646
|
var _mode = 'presentation'; /* 当前模式(slidesOf 里按 model.mode 设置) */
|