skill-forge-hub 1.0.3 → 1.0.5

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.
Files changed (95) hide show
  1. package/CHANGELOG.md +27 -0
  2. package/README.md +82 -150
  3. package/annual-report/SKILL.md +27 -7
  4. package/annual-report/resources/data-collection.md +22 -5
  5. package/annual-report/resources/disk-and-html.md +6 -6
  6. package/annual-report/resources/reference.html +77 -45
  7. package/annual-report/resources/usage-guide.md +10 -2
  8. package/annual-report/user-config.md +16 -4
  9. package/article-to-html/.preserve +3 -0
  10. package/article-to-html/SKILL.md +26 -7
  11. package/article-to-html/design-system.md +9 -3
  12. package/article-to-html/resources/reference.html +631 -0
  13. package/article-to-html/resources/usage-guide.md +9 -1
  14. package/article-to-html/user-config.md +6 -3
  15. package/cli.js +58 -26
  16. package/daily-report/SKILL.md +27 -7
  17. package/daily-report/resources/content-rules.md +2 -2
  18. package/daily-report/resources/data-collection.md +26 -23
  19. package/daily-report/resources/disk-and-html.md +2 -2
  20. package/daily-report/resources/reference.html +24 -3
  21. package/daily-report/resources/usage-guide.md +10 -2
  22. package/daily-report/user-config.md +16 -4
  23. package/deck-stage/SKILL.md +15 -4
  24. package/deck-stage/resources/cover-template.html +3 -3
  25. package/deck-stage/resources/data-schema.md +11 -1
  26. package/deck-stage/resources/pptx-builder.js +1 -1
  27. package/deck-stage/resources/usage-guide.md +9 -2
  28. package/deck-stage/user-config.md +1 -1
  29. package/docs/architecture.md +89 -0
  30. package/docs/images/article-to-html.png +0 -0
  31. package/docs/images/daily-report.png +0 -0
  32. package/docs/images/deck-stage.png +0 -0
  33. package/docs/images/magic-deck.png +0 -0
  34. package/docs/images/meeting-minutes.png +0 -0
  35. package/docs/images/prompt-pouch.png +0 -0
  36. package/docs/install.md +71 -0
  37. package/magic-deck/SKILL.md +23 -8
  38. package/magic-deck/resources/content-guide.md +5 -4
  39. package/magic-deck/resources/deck-spec.md +18 -11
  40. package/magic-deck/resources/reference.html +110 -32
  41. package/magic-deck/resources/usage-guide.md +10 -2
  42. package/magic-deck/user-config.md +4 -4
  43. package/meeting-minutes/SKILL.md +51 -0
  44. package/meeting-minutes/resources/content-rules.md +57 -0
  45. package/meeting-minutes/resources/disk-and-html.md +26 -0
  46. package/meeting-minutes/resources/meeting-type-dictionary.md +24 -0
  47. package/meeting-minutes/resources/reference.html +436 -0
  48. package/meeting-minutes/resources/usage-guide.md +63 -0
  49. package/meeting-minutes/user-config.md +56 -0
  50. package/meta-forge/SKILL.md +6 -6
  51. package/meta-forge/resources/forge-rules.md +61 -9
  52. package/meta-forge/resources/usage-guide.md +7 -3
  53. package/meta-forge/user-config.md +1 -1
  54. package/monthly-report/SKILL.md +62 -0
  55. package/monthly-report/resources/content-rules.md +40 -0
  56. package/monthly-report/resources/data-collection.md +44 -0
  57. package/monthly-report/resources/date-parsing.md +18 -0
  58. package/monthly-report/resources/disk-and-html.md +29 -0
  59. package/monthly-report/resources/industry-dictionary.md +21 -0
  60. package/monthly-report/resources/reference.html +531 -0
  61. package/monthly-report/resources/usage-guide.md +75 -0
  62. package/monthly-report/user-config.md +53 -0
  63. package/package.json +9 -2
  64. package/prompt-pouch/SKILL.md +17 -2
  65. package/prompt-pouch/resources/data-format.md +1 -1
  66. package/prompt-pouch/resources/reference.html +56 -24
  67. package/prompt-pouch/resources/usage-guide.md +10 -3
  68. package/prompt-pouch/user-config.md +1 -1
  69. package/quarterly-report/SKILL.md +63 -0
  70. package/quarterly-report/resources/content-rules.md +42 -0
  71. package/quarterly-report/resources/data-collection.md +46 -0
  72. package/quarterly-report/resources/date-parsing.md +19 -0
  73. package/quarterly-report/resources/disk-and-html.md +22 -0
  74. package/quarterly-report/resources/industry-dictionary.md +21 -0
  75. package/quarterly-report/resources/reference.html +509 -0
  76. package/quarterly-report/resources/usage-guide.md +76 -0
  77. package/quarterly-report/user-config.md +53 -0
  78. package/spec-doc2spec/SKILL.md +21 -22
  79. package/spec-doc2spec/resources/checklist.md +7 -0
  80. package/spec-doc2spec/resources/images.md +14 -5
  81. package/spec-doc2spec/resources/structure.md +19 -10
  82. package/spec-doc2spec/resources/usage-guide.md +10 -8
  83. package/spec-doc2spec/user-config.md +2 -2
  84. package/spec-spec2doc/SKILL.md +4 -4
  85. package/spec-spec2doc/resources/checklist.md +6 -0
  86. package/spec-spec2doc/resources/pdf-path.md +1 -0
  87. package/spec-spec2doc/resources/usage-guide.md +2 -2
  88. package/template/SKILL.md +1 -1
  89. package/weekly-report/SKILL.md +27 -7
  90. package/weekly-report/resources/content-rules.md +2 -2
  91. package/weekly-report/resources/data-collection.md +26 -23
  92. package/weekly-report/resources/disk-and-html.md +3 -3
  93. package/weekly-report/resources/reference.html +132 -120
  94. package/weekly-report/resources/usage-guide.md +10 -2
  95. package/weekly-report/user-config.md +16 -4
@@ -1,6 +1,6 @@
1
1
  # magic-deck HTML 幻灯片完整规范
2
2
 
3
- > ⛔ **Reference 铁律(最高优先)**:本目录 `reference.html` 是定稿骨架源码(默认 classic 模板 + 十六套版式模板 + 十七主题 + 全部组件 + 播放引擎 + 单页主题 + 模板预览/撤销重做/右侧边栏双 Tab(页面管理 + 动画工具))。生成 HTML 时必须先 Read `resources/reference.html` 与本文件两份,以 reference.html 为骨架逐处替换内容;两者冲突时**以 reference.html 为准**。修改本 skill 的 HTML 效果时,必须同步更新 `resources/reference.html` 与本文档的对应描述,禁止只改一处。
3
+ > ⛔ **Reference 铁律(最高优先)**:本目录 `reference.html` 是定稿骨架源码(默认 classic 模板 + 十七套版式模板 + 十七主题 + 全部组件 + 播放引擎 + 单页主题 + 模板预览/撤销重做/右侧边栏双 Tab(页面管理 + 动画工具))。生成 HTML 时必须先 Read `resources/reference.html` 与本文件两份,以 reference.html 为骨架逐处替换内容;两者冲突时**以 reference.html 为准**。修改本 skill 的 HTML 效果时,必须同步更新 `resources/reference.html` 与本文档的对应描述,禁止只改一处。
4
4
 
5
5
  生成单文件 HTML 幻灯片(HTML 形态、PPT 体验),所有实现细节以本文为准。
6
6
 
@@ -178,18 +178,19 @@
178
178
  ```
179
179
  主题切换(全局):`document.documentElement.setAttribute('data-theme', name)`,面板色点同步 .on 点亮。
180
180
 
181
- 主题面板(「🎨 主题」打开 `#themeMask`):`.theme-panel` 460px 宽,头部标题 + 范围 radio 胶囊(全部页面/仅本页,切换时 label.sel 高亮 + 重渲染点亮)+ `.theme-grid` 4 列 `.th-item`(`.th-dot` 色点内联 style 取 THEMES 色值 + 主题名,当前主题 .on 高亮)+ 底部「✕ 关闭」;**即点即换**——点 `.th-item` pushUndo → 按范围 setGlobalTheme/setSlideTheme → renderThemeDots 重渲染点亮 → buildThumbs,面板保持打开可连点对比;Esc/点遮罩/✕ 关闭;与模板/选页复制/选页截图/新页面板互斥打开。范围=仅本页时点亮按 `slides[cur]` 的 data-theme,否则按根 data-theme。
181
+ 主题面板(「🎨 主题」打开 `#themeMask`):`.theme-panel` 460px 宽,头部标题 + 范围 radio 胶囊(全部页面/仅本页,切换时 label.sel 高亮 + 重渲染点亮)+ `.theme-grid` 4 列 `.th-item`(`.th-dot` 色点内联 style 取 THEMES 色值 + 主题名,当前主题 .on 高亮)+ 底部「✕ 关闭」;**即点即换**——点 `.th-item` pushUndo → 按范围 setGlobalTheme/setSlideTheme → saveThemeState 写 localStorage(键 `md-deck:<deck-id>-theme`,JSON:global 全局主题 + slides 本页主题按页码索引;键名带页内嵌 deck-id 命名空间,多份演示稿互不串台、改名/移动目录记忆不丢)→ renderThemeDots 重渲染点亮 → buildThumbs,面板保持打开可连点对比;Esc/点遮罩/✕ 关闭;与模板/选页复制/选页截图/新页面板互斥打开。范围=仅本页时点亮按 `slides[cur]` 的 data-theme,否则按根 data-theme。
182
182
 
183
183
  ### 2.1 单页主题(整份或单页自由换肤)
184
184
 
185
185
  - 主题面板范围 radio 默认「全部页面」:点色点改全局;选「仅本页」后点色点只改当前页 `slides[cur].setAttribute('data-theme', name)`;全局切换时 JS 遍历 slides 移除所有 slide 级 data-theme
186
+ - 主题记忆:初始化无 `?theme` 参数时读 `md-deck:<deck-id>-theme` 恢复(global 合法则 setGlobalTheme、slides 按页码索引逐页 setAttribute;非法 JSON / 未知主题名静默忽略,失败静默);`?theme` URL 参数优先于记忆;本页主题按页码索引记忆,删页 / 排序后可能错位,重新点选即可
186
187
  - CSS 变量就近解析天然支持:`[data-theme="xxx"]` 属性选择器写在 slide 上即覆盖该页全部 var();`.slide` 必须自带背景 `background:var(--bg)`(页背景跟随主题,全局 .bg-glow/.bg-grid 作为舞台外围氛围层)
187
188
  - 单页主题的 slide 上保留 data-theme 属性持久生效;截图(§7)克隆 slide 时该属性自然入图,无需特殊处理
188
189
  - 生成时按 user-config 的 THEME 给 documentElement 设默认主题,单页差异化主题由用户放映时点选
189
190
 
190
- ## 2.2 模板库(十六套版式骨架,运行时即点即换,与主题正交:模板管版式结构、主题管配色)
191
+ ## 2.2 模板库(十七套版式骨架,运行时即点即换,与主题正交:模板管版式结构、主题管配色)
191
192
 
192
- 十六套模板随放映随时切换——工具栏「🎨 模板」打开模板应用面板,选模板卡(每卡带 mini 结构示意图)+ 应用范围(全部页面/仅本页/选择页面);点「👁 预览本页」先把当前页临时套上看效果(可连续换卡即时换预览、再点「还原本页」或取消自动还原,预览不落 data-template),点应用才生效。**标题自动映射**:模板的固定标题位自动吃进页面里对应的标题(语义节点)。
193
+ 十七套模板随放映随时切换——工具栏「🎨 模板」打开模板应用面板,选模板卡(每卡带 mini 结构示意图)+ 应用范围(全部页面/仅本页/选择页面);点「👁 预览本页」先把当前页临时套上看效果(可连续换卡即时换预览、再点「还原本页」或取消自动还原,预览不落 data-template),点应用才生效。**标题自动映射**:模板的固定标题位自动吃进页面里对应的标题(语义节点)。
193
194
 
194
195
  ### 语义节点约定(标题自动映射的根基)
195
196
 
@@ -266,6 +267,10 @@
266
267
  - slide 挂 `[data-template="dark"]` 即整页反色:--bg 深黑、--text 浅灰、--accent 蓝/绿(GitHub Dark 系),浅色主题下同样全黑
267
268
  - CSS:`[data-template="dark"]{ --bg:#0d1117; … }` 八变量全套覆盖
268
269
 
270
+ ### T17 stats 统计图表(纯 CSS,无包装器)
271
+ - 数据看板风:`.s-head` 底部 2px accent 双线、标题 30px;`.bignum` 去边框改顶部 3px accent 横条、数字放大 56px;`.chart-card` 加 accent 描边框架
272
+ - CSS:`[data-template="stats"]` 看板风
273
+
269
274
  ### T16 nature 自然清新(纯 CSS,无包装器)
270
275
  - 有机圆角:卡片/标签/目录条目不对称圆角(24/8 交替)、hover 轻旋 -0.6deg;色点改旋转叶片形
271
276
  - CSS:`[data-template="nature"]` 圆润形状语言
@@ -295,16 +300,16 @@
295
300
 
296
301
  模板不再只限生成时定版式:user-config 的 `TEMPLATE` 是生成默认(AI 每页写语义结构 + 对应 slide 挂 data-template),用户放映时随时在模板面板切换(全部/仅本页/勾选页);`?tpl=xxx` URL 参数全局应用(headless 截图用)。
297
302
 
298
- ## 2.3 领域/业务成套模板(面板「💼 领域」Tab,二十一套一键生成整套页面)
303
+ ## 2.3 领域/业务成套模板(面板「💼 领域」Tab,二十二套一键生成整套页面)
299
304
 
300
- 模板面板头部双 Tab:「🎨 版式」(16 版式应用全部/仅本页/勾选页,原逻辑)与「💼 领域」(21 套成套模板)。领域 Tab 隐藏范围选择与「预览本页」,tplDo 变「生成成套页面(N 页)」并带两段确认(profArmed:第一击变「⚠ 确认:整份替换为「xx」(可撤销)」,第二击才执行)。
305
+ 模板面板头部双 Tab:「🎨 版式」(17 版式应用全部/仅本页/勾选页,原逻辑)与「💼 领域」(22 套成套模板)。领域 Tab 隐藏范围选择与「预览本页」,tplDo 变「生成成套页面(N 页)」并带两段确认(profArmed:第一击变「⚠ 确认:整份替换为「xx」(可撤销)」,第二击才执行)。
301
306
 
302
- - **PROF 数据**:`PROF_CATS` 六分类(教育学术 / 职场商务 / 企业运营 / 专业领域 / 党政政务 / 生活场景);`PROF` 21 套,每套 `{ id, cat, name, ds, main, pages[] }`,main 指向 16 版式之一,卡片迷你预览取 `tplById(main).mini`
307
+ - **PROF 数据**:`PROF_CATS` 六分类(教育学术 / 职场商务 / 企业运营 / 专业领域 / 党政政务 / 生活场景);`PROF` 22 套,每套 `{ id, cat, name, ds, main, pages[] }`,main 指向 16 版式之一,卡片迷你预览取 `tplById(main).mini`
303
308
  - **P 生成器**(8 函数,产物=语义骨架页字符串,页内结构与演示页一致:s-head/grid/card/points/bignum):`cover(标题,副题)`(class="slide cover" 特殊页)/ `toc(标题,条目[])`(toc-item data-goto=2+i 自动指向内容页)/ `points(title,tag,tpl,pts[])` / `cards(title,tag,tpl,{h,en,p}[])`(按 2/3/4+ 张选 grid2/3/4)/ `nums(title,tag,tpl,{b,s}[])`(grid4 bignum)/ `chartHtml(kind,spec)`(bars 最高值归一化 --h;line 300×158 均布取点;pie C=351.86 段 stroke-dasharray+rotate 按占比累加;ring CC=389.56 不写 transform——CSS 已预置 rotate(-90deg))/ `chart(title,tag,tpl,kind,spec,noteH,notes[])`(grid2 图表卡+要点卡)/ `end()`(class="slide endpage")
304
309
  - **applyProf 引擎**:pushUndo → deck.innerHTML = pages.join('') → refreshSlides → 非 classic 非特殊页逐页 applyTpl 跑包装器 → buildThumbs → 关面板 → cur=0 go(0) → 按钮反馈「✓ 已套用「xx」」
305
310
  - **图表页保护**:applyTpl 在 setAttribute 之后先判 `s.querySelector('[data-anim-chart]')`——含图表卡的页直接 return,跳过 timeline/keynote/magazine/steps/poster 等重排包装器(它们会替换容器或清空整页吞掉图表);图表页保持 grid2 语义结构 + 模板配色,图表动画照常触发。运行时手动切换版式同样受保护
306
311
  - **演示页 15 联动**:21 张 .prof-demo 紧凑卡(7 列 × 3 行,data-prof + data-anim 错落),deck 点击委托 → openTplPanel + setTplTab('prof') + 选中 + renderProfCards + updateTplBtn
307
- - 二十一套(id · 名称 · 主版式 · 页数):edu——thesis 毕业答辩 minimal 7 / proposal 开题报告 executive 7 / teaching 教学课件 education 7;biz——report 年终汇报 executive 8 / competition 竞聘述职 timeline 7 / plan 商业计划书 finance 7 / hiring 求职简历 timeline 6;corp——product 产品发布 keynote 7 / tech 科技发布会 blueprint 7 / marketing 营销方案 poster 7 / training 企业培训 education 7 / ceremony 年会盛典 poster 7;pro——finance 金融分析 finance 7 / medical 医疗科普 metro 7 / law 法律合规 executive 6;gov——gov 政务汇报 executive 7 / party 党建汇报 executive 7;life——food 餐饮品牌 magazine 7 / travel 旅游攻略 magazine 7 / festival 节日庆典 poster 6 / charity 公益慈善 minimal 7
312
+ - 二十二套(id · 名称 · 主版式 · 页数):edu——thesis 毕业答辩 minimal 7 / proposal 开题报告 executive 7 / teaching 教学课件 education 7;biz——report 年终汇报 executive 8 / competition 竞聘述职 timeline 7 / plan 商业计划书 finance 7 / hiring 求职简历 timeline 6;corp——product 产品发布 keynote 7 / tech 科技发布会 blueprint 7 / marketing 营销方案 poster 7 / sales 销售方案 executive 7 / training 企业培训 education 7 / ceremony 年会盛典 poster 7;pro——finance 金融分析 finance 7 / medical 医疗科普 metro 7 / law 法律合规 executive 6;gov——gov 政务汇报 executive 7 / party 党建汇报 executive 7;life——food 餐饮品牌 magazine 7 / travel 旅游攻略 magazine 7 / festival 节日庆典 poster 6 / charity 公益慈善 minimal 7
308
313
  - 生成后与版式/主题正交:每页照常挂 data-template 运行时任意切换,主题照常换肤;领域模板只在「生成整套」时决定页序+每页版式+图表选型,不新增版式骨架
309
314
  - 图表页生成规则不变:趋势 line / 占比 pie / 对比 bars / 达成率 ring,图表一律挂 data-anim-chart 保留自身动画(见 3.1 L6),关键数字挂 data-count 滚动
310
315
 
@@ -418,6 +423,7 @@
418
423
  ```css
419
424
  .tchar, .tword{ display:inline-block; }
420
425
  .tline{ display:block; }
426
+ .s-title .tchar, .s-title .tword, .s-title .tline{ background:inherit; -webkit-background-clip:text; background-clip:text; }
421
427
  ```
422
428
 
423
429
  ### L6 图表动画(bars/line/pie/ring/count 五式,图表容器挂 data-anim-chart,翻页自动播放、翻回重放)
@@ -480,7 +486,8 @@
480
486
  - 元素动画区:`chkAnim` 复选框(入场动画开关,默认勾选)+ 应用范围 radio(`input[name="animScope"]`:all 全部页面 / current 仅本页,`.seg-btn.sel` 高亮)+ 三组网格——入场 12 式(`data-a` + none)、离场 12 式(`data-l` + none)、强调 8 式(`data-e` + none);标题文字区:四选按钮(none 无动画 / char 逐字 / word 逐词 / line 逐行,`data-ta`);页面操作区:⧉ 复制本页 / ▦ 选页复制 / 📷 截图本页 / ▦ 选页截图(原工具栏四按钮移入,ID 与事件照旧)
481
487
  - 应用范围:`animSlides()` = scope 为 all 时全部 slides、current 时仅 slides[cur];入场/离场/强调/标题文字设置均作用于范围页;互斥规则:挂强调时移除该元素 `data-anim`(强调优先);applyEnter none = 移除 `data-anim` 与 `data-anim-delay`;applyLeave none = 移除 `data-anim-leave`;applyEmph none = 移除 `data-anim-emphasis`
482
488
  - 标题文字拆分:splitText 按 `<br>` 分行后逐字(char)/逐词(word,按空白分)/逐行(line)包 `<span class="tchar|tword|tline" data-anim="fade-up" style="animation-delay:min(序号×60,600)ms">`,原文存 `data-md-orig`;restoreText 按原文还原;none 时还原为纯文本(默认无动画)
483
- - deck 根标签:`data-transition="slide-lr" data-anim="on"`;JS 初始化时读 localStorage(`md-deck-transition` / `md-deck-anim` / `md-deck-anim-scope` / `md-deck-text-anim` / `md-deck-side-tab`),命中则回填控件并设置 deck 属性,无记忆则回退 DOM 属性;事件写 deck 属性 + 写 localStorage(try-catch 静默)
489
+ - 渐变字特例:`.s-title`(background-clip:text 渐变字)不拆分——span 行内块不参与父级文字剪裁,拆分后文字全透明只剩辉光(视觉成「蒙层」),改为整体 `data-anim="fade-up"`(自加属性标 `data-md-whole`,切回 none 时移除);CSS 兜底 `.s-title .tchar/.tword/.tline` 补 `background:inherit` + `background-clip:text` 修复历史拆分 DOM;deck `data-anim="off"`(入场开关关)时刷新不回填 localStorage 的文字动画
490
+ - deck 根标签:`data-transition="slide-lr" data-anim="on"`;JS 初始化时读 localStorage(键名均带 `md-deck:<deck-id>` 前缀命名空间:transition / anim / anim-scope / text-anim / side-tab,多份演示稿互不干扰、改名/移动目录记忆不丢),命中则回填控件并设置 deck 属性,无记忆则回退 DOM 属性;事件写 deck 属性 + 写 localStorage(try-catch 静默)
484
491
  - 离场引擎:`leaveThenGo(i)` = leaving 防抖;当前页无 `[data-anim-leave]:not(none)` 或 deck `data-anim="off"` 时直切 `go(i)`;否则 slide 加 `.leaving` 类触发 CSS 离场(0.45s),并重置节点 animation 重播,480ms 后移除类再 `go(i)`;next/prev/自动播放/键盘/缩略图/数字键/Home/End/data-goto/hashchange 全走 leaveThenGo
485
492
  - 生成侧规则:生成时按 user-config `TRANSITION` 写 deck 的 `data-transition` 初始值(用户口头点名风格当次优先);`ANIM: false` 时 deck 挂 `data-anim="off"` 且 chkAnim 不勾选
486
493
  - `data-anim` 十二式选用建议:页标题/封面大字配 `fade-up`,整页要点配 `fade-in`,数据卡/图片配 `zoom-in`,左右分栏内容各配 `slide-left`/`slide-right`,强调结论配 `pop`,轻快元素配 `bounce-in`,翻牌感配 `flip-in`,整卡浮现配 `blur`;同页多元素按视觉次序挂 `data-anim-delay`(60/120/180/240/300/400/500/600 八档)错落入场
@@ -552,8 +559,8 @@ function prev(){ if (cur > 0) leaveThenGo(cur - 1); else if (chkLoop.checked) le
552
559
  - P:播放/暂停;S:截图本页;C:复制本页;F:全屏;G:右侧边栏(▤ 页面管理:新页/复页/排序/删页/跳转 + ⚙ 动画与工具);?:说明弹层;Esc:关弹层 + 退全屏
553
560
  - Ctrl+Z:撤销;Ctrl+Shift+Z / Ctrl+Y:重做(弹层面板打开时忽略)
554
561
  - **全屏**:`toggleFull()` = fullscreenElement 存在则 exitFullscreen,否则 document.documentElement.requestFullscreen
555
- - **主题作用域**:主题面板范围 radio 选「全部页面」时点色点 → `documentElement.setAttribute('data-theme', name)` + 遍历 slides 移除所有 slide 级 data-theme;选「仅本页」时 → `slides[cur].setAttribute('data-theme', name)`(仅当前页变色);`?theme=biz` 参数走全局;面板色点 .on 态按 activeThemeName()(当前范围下的生效主题)显示
556
- - **模板应用**:TPLS 十六套元信息(id/name/ic/ds/mini 结构示意图);applyTpl(slide, tpl) = ensureOrigin 存档首次 innerHTML → 恢复语义态 → 挂 data-template(classic 则移除属性)→ 按需 wrapTimeline/wrapKeynote/wrapMagazine/wrapSteps/wrapPoster/wrapVintage/wrapFinance(封面/结束页/目录页 isSpecialPage 保护不包装;blueprint/education/executive/metro/bento/dark/nature 纯 CSS 无包装器);applyScope(tpl, scope, selected) 按范围应用返回页数;初始化时每页 data-template 声明自动跑 applyTpl 生效;`?tpl=xxx` 参数全局应用(只认 TPLS 内 id)
562
+ - **主题作用域**:主题面板范围 radio 选「全部页面」时点色点 → `documentElement.setAttribute('data-theme', name)` + 遍历 slides 移除所有 slide 级 data-theme;选「仅本页」时 → `slides[cur].setAttribute('data-theme', name)`(仅当前页变色);`?theme=biz` 参数走全局(任意 THEMES id 均可,如 ?theme=ocean;无参数时回退 localStorage `md-deck:<deck-id>-theme` 记忆);面板色点 .on 态按 activeThemeName()(当前范围下的生效主题)显示
563
+ - **模板应用**:TPLS 十七套元信息(id/name/ic/ds/mini 结构示意图);applyTpl(slide, tpl) = ensureOrigin 存档首次 innerHTML → 恢复语义态 → 挂 data-template(classic 则移除属性)→ 按需 wrapTimeline/wrapKeynote/wrapMagazine/wrapSteps/wrapPoster/wrapVintage/wrapFinance(封面/结束页/目录页 isSpecialPage 保护不包装;blueprint/education/executive/metro/bento/dark/nature/stats 纯 CSS 无包装器);applyScope(tpl, scope, selected) 按范围应用返回页数;初始化时每页 data-template 声明自动跑 applyTpl 生效;`?tpl=xxx` 参数全局应用(只认 TPLS 内 id)
557
564
  - **标题自动映射**:包装器从语义节点取内容重建模板结构——timeline 节点标题=卡片标题、keynote 大观点=页标题、magazine 分栏标题=页标题;内容一条不丢
558
565
  - **页内连接**:deck 上事件委托,`closest('[data-goto]')` 跳页;目录条目/任意元素都可用
559
566
  - **外部链接**:任意 `<a href="https://…">` 正常打开,不拦截
@@ -3,6 +3,8 @@
3
3
  <head>
4
4
  <meta charset="UTF-8">
5
5
  <meta name="viewport" content="width=device-width, initial-scale=1.0">
6
+ <meta name="sf-template" content="magic-deck@2">
7
+ <meta name="deck-id" content="REF-DECK-0000">
6
8
  <title>Reference 骨架 — magic-deck 定稿样例</title>
7
9
  <style>
8
10
  /* ══════════ 0. 基础 ══════════ */
@@ -405,6 +407,13 @@ button,select,input{ font-family:inherit; }
405
407
  [data-template="nature"] .bignum{ border-radius:50% 50% 8px 8px; }
406
408
  [data-template="nature"] .toc-item{ border-radius:18px 6px 18px 6px; }
407
409
  [data-template="nature"] .card:hover{ transform:translateY(-4px) rotate(-.6deg); }
410
+ /* T17 stats 统计图表:KPI 大数字顶横排 + 双线分区 + 图表框架,数据看板 */
411
+ [data-template="stats"] .s-head{ border-bottom:2px solid var(--accent); padding-bottom:14px; }
412
+ [data-template="stats"] .s-head h2{ font-size:30px; }
413
+ [data-template="stats"] .bignum{ border:none; border-top:3px solid var(--accent); border-radius:0 0 10px 10px; }
414
+ [data-template="stats"] .bignum b{ font-size:56px; }
415
+ [data-template="stats"] .chart-card{ border:1px solid var(--accent); }
416
+ [data-template="stats"] .card{ border-radius:8px; }
408
417
 
409
418
  /* ══════════ 6. 操作元素(固定样式) ══════════ */
410
419
  .toolbar{ position:fixed; right:18px; top:14px; z-index:10;
@@ -472,7 +481,7 @@ body:hover .nav{ opacity:1; }
472
481
  .cp-foot .tbtn{ border:1px solid var(--border); background:var(--tag-bg); cursor:pointer; }
473
482
  .cp-foot .tbtn.primary{ background:var(--accent); color:var(--bg); border-color:transparent; }
474
483
  /* ═══ 模板应用面板 ═══ */
475
- .tpl-panel{ width:760px; max-width:94vw; max-height:82vh; display:flex; flex-direction:column; padding:24px 26px;
484
+ .tpl-panel{ width:1060px; max-width:96vw; max-height:90vh; display:flex; flex-direction:column; padding:24px 26px;
476
485
  border-radius:16px; background:var(--panel-solid); border:1px solid var(--border); color:var(--text); }
477
486
  .tpl-panel h3{ font-size:18px; margin:0; }
478
487
  .tpl-tabs{ display:flex; gap:8px; }
@@ -483,7 +492,7 @@ body:hover .nav{ opacity:1; }
483
492
  .tpl-cat{ grid-column:1/-1; font-size:11px; color:var(--muted); letter-spacing:2px; margin:6px 0 -4px; }
484
493
  .tpl-card .nm .pg{ font-style:normal; font-size:10px; font-weight:400; color:var(--muted); margin-left:6px; letter-spacing:.5px; }
485
494
  .tpl-head-note{ font-size:12px; color:var(--muted); }
486
- .tpl-cards{ display:grid; grid-template-columns:repeat(3,1fr); gap:10px; margin:14px 0 12px; overflow-y:auto; max-height:46vh; padding:2px; }
495
+ .tpl-cards{ display:grid; grid-template-columns:repeat(4,1fr); gap:12px; margin:14px 0 12px; overflow-y:auto; max-height:64vh; padding:2px; }
487
496
  .tpl-card{ display:flex; flex-direction:column; align-items:stretch; gap:7px; padding:9px; border-radius:12px;
488
497
  background:var(--panel); border:1px solid var(--border); cursor:pointer; transition:all .15s ease; text-align:left; }
489
498
  .tpl-card:hover{ border-color:var(--accent); }
@@ -682,6 +691,8 @@ body:hover .nav{ opacity:1; }
682
691
  /* ── L5 标题文字动画(运行时拆分 h1/h2/h3/.s-title 为 span,复用入场机制)── */
683
692
  .tchar, .tword{ display:inline-block; }
684
693
  .tline{ display:block; }
694
+ /* 渐变字兜底:拆分 span 不继承 background,补回渐变剪裁防止标题变透明只剩辉光 */
695
+ .s-title .tchar, .s-title .tword, .s-title .tline{ background:inherit; -webkit-background-clip:text; background-clip:text; }
685
696
 
686
697
  /* ── 入场开关(deck[data-anim="off"] 全部停用)── */
687
698
  .deck[data-anim="off"] .slide [data-anim]{ opacity:1 !important; animation:none !important; }
@@ -783,8 +794,8 @@ body:hover .nav{ opacity:1; }
783
794
  </div>
784
795
  <div class="toolbar">
785
796
  <div class="group">
786
- <button class="tbtn" id="btnTemplate" title="十六套版式模板:可应用到全部页面 / 仅本页 / 勾选页面,支持预览本页,标题自动映射">🎨 模板</button>
787
- <button class="tbtn" id="btnTheme" title="十六套主题配色面板:色点即点即换,范围可选全部页面或仅本页">🎨 主题</button>
797
+ <button class="tbtn" id="btnTemplate" title="十七套版式模板:可应用到全部页面 / 仅本页 / 勾选页面,支持预览本页,标题自动映射">🎨 模板</button>
798
+ <button class="tbtn" id="btnTheme" title="十七套主题配色面板:色点即点即换,范围可选全部页面或仅本页">🎨 主题</button>
788
799
  </div>
789
800
  <div class="group" title="编辑:撤销 / 重做(支持模板应用、增删页、换主题等所有编辑操作)">
790
801
  <button class="tbtn" id="btnUndo" title="撤销上一步(Ctrl+Z)" disabled>↶ 撤销</button>
@@ -923,7 +934,7 @@ body:hover .nav{ opacity:1; }
923
934
  <div class="logo" data-anim="pop"></div>
924
935
  <div class="s-title" data-anim="fade-up">魔法幻灯<br>Magic Deck</div>
925
936
  <div class="sub" data-anim="fade-up" data-anim-delay="120">HTML 形态 · PPT 体验 · 单文件离线放映</div>
926
- <div class="sign" data-anim="fade-in" data-anim-delay="300">GENERATED BY SKILLFORGE</div>
937
+ <div class="sign" data-anim="fade-in" data-anim-delay="300">GENERATED BY AI TEAM</div>
927
938
  </section>
928
939
 
929
940
  <!-- 页 2 目录 -->
@@ -984,7 +995,7 @@ body:hover .nav{ opacity:1; }
984
995
  <div class="s-head"><h2>里程碑</h2><span class="tag">TIMELINE</span></div>
985
996
  <div class="grid3">
986
997
  <div class="card"><h4>立项与架构<span class="en">2026 Q1</span></h4><p>完成技术选型与十六主题变量体系。</p></div>
987
- <div class="card"><h4>模板库建设<span class="en">2026 Q2</span></h4><p>五套版式骨架与主题正交组合。</p></div>
998
+ <div class="card"><h4>模板库建设<span class="en">2026 Q2</span></h4><p>十七套版式骨架与主题正交组合。</p></div>
988
999
  <div class="card"><h4>单页换肤<span class="en">2026 Q3</span></h4><p>整份或单页自由切换主题。</p></div>
989
1000
  </div>
990
1001
  </section>
@@ -994,8 +1005,8 @@ body:hover .nav{ opacity:1; }
994
1005
  <div class="s-head"><h2>数据一览</h2><span class="tag">DATA</span></div>
995
1006
  <div class="grid4">
996
1007
  <div class="bignum"><b>99.9%</b><span>可用性</span></div>
997
- <div class="bignum"><b>5</b><span>版式模板</span></div>
998
- <div class="bignum"><b>4</b><span>配色主题</span></div>
1008
+ <div class="bignum"><b>17</b><span>版式模板</span></div>
1009
+ <div class="bignum"><b>17</b><span>配色主题</span></div>
999
1010
  <div class="bignum"><b>0</b><span>外部依赖</span></div>
1000
1011
  </div>
1001
1012
  </section>
@@ -1005,7 +1016,7 @@ body:hover .nav{ opacity:1; }
1005
1016
  <div class="s-head"><h2>发布流程四步走</h2><span class="tag">STEPS</span></div>
1006
1017
  <div class="grid4">
1007
1018
  <div class="card"><h4>撰写内容<span class="en">Draft</span></h4><p>结构与文案一气呵成。</p></div>
1008
- <div class="card"><h4>套用版式<span class="en">Layout</span></h4><p>十六套版式任意切换。</p></div>
1019
+ <div class="card"><h4>套用版式<span class="en">Layout</span></h4><p>十七套版式任意切换。</p></div>
1009
1020
  <div class="card"><h4>细节打磨<span class="en">Polish</span></h4><p>主题配色逐页微调。</p></div>
1010
1021
  <div class="card"><h4>发布放映<span class="en">Publish</span></h4><p>全屏放映或分享 HTML。</p></div>
1011
1022
  </div>
@@ -1090,9 +1101,9 @@ body:hover .nav{ opacity:1; }
1090
1101
  </div>
1091
1102
  </section>
1092
1103
 
1093
- <!-- 页 15 领域模板库(二十一套领域 / 业务成套模板,点卡片直达面板生成整套页面) -->
1104
+ <!-- 页 15 领域模板库(二十二套领域 / 业务成套模板,点卡片直达面板生成整套页面) -->
1094
1105
  <section class="slide" data-title="领域模板">
1095
- <div class="s-head"><h2>领域模板库 · 二十一套</h2><span class="tag">DOMAIN</span></div>
1106
+ <div class="s-head"><h2>领域模板库 · 二十二套</h2><span class="tag">DOMAIN</span></div>
1096
1107
  <div class="prof-grid">
1097
1108
  <div class="card prof-demo" data-prof="thesis" data-anim="fade-up" data-anim-delay="40"><h4>毕业答辩<span class="en">Thesis</span></h4></div>
1098
1109
  <div class="card prof-demo" data-prof="proposal" data-anim="fade-up" data-anim-delay="65"><h4>开题报告<span class="en">Proposal</span></h4></div>
@@ -1104,6 +1115,7 @@ body:hover .nav{ opacity:1; }
1104
1115
  <div class="card prof-demo" data-prof="product" data-anim="fade-up" data-anim-delay="215"><h4>产品发布<span class="en">Product</span></h4></div>
1105
1116
  <div class="card prof-demo" data-prof="tech" data-anim="fade-up" data-anim-delay="240"><h4>科技发布<span class="en">Tech</span></h4></div>
1106
1117
  <div class="card prof-demo" data-prof="marketing" data-anim="fade-up" data-anim-delay="265"><h4>营销方案<span class="en">Marketing</span></h4></div>
1118
+ <div class="card prof-demo" data-prof="sales" data-anim="fade-up" data-anim-delay="280"><h4>销售方案<span class="en">Sales</span></h4></div>
1107
1119
  <div class="card prof-demo" data-prof="training" data-anim="fade-up" data-anim-delay="290"><h4>企业培训<span class="en">Training</span></h4></div>
1108
1120
  <div class="card prof-demo" data-prof="ceremony" data-anim="fade-up" data-anim-delay="315"><h4>年会盛典<span class="en">Ceremony</span></h4></div>
1109
1121
  <div class="card prof-demo" data-prof="finance" data-anim="fade-up" data-anim-delay="340"><h4>金融分析<span class="en">Finance</span></h4></div>
@@ -1123,7 +1135,7 @@ body:hover .nav{ opacity:1; }
1123
1135
  <section class="slide endpage" data-title="结束">
1124
1136
  <div class="s-title">谢谢观看</div>
1125
1137
  <p>按 F 全屏放映 · 按 ? 查看全部热键</p>
1126
- <p class="sign">GENERATED BY SKILLFORGE</p>
1138
+ <p class="sign">GENERATED BY AI TEAM</p>
1127
1139
  </section>
1128
1140
 
1129
1141
  </div></main>
@@ -1142,7 +1154,7 @@ body:hover .nav{ opacity:1; }
1142
1154
  <tr><td><kbd>Ctrl</kbd>+<kbd>Z</kbd> / <kbd>Ctrl</kbd>+<kbd>Shift</kbd>+<kbd>Z</kbd></td><td>撤销 / 重做</td></tr>
1143
1155
  <tr><td><kbd>Esc</kbd></td><td>关弹层 / 退全屏</td></tr>
1144
1156
  </table>
1145
- <div class="help-note">「🎨 主题」面板 16 套配色即点即换,范围可选全部页面或仅本页。「🎨 模板」=十六套版式模板应用到全部页/仅本页/勾选页,支持「预览本页」先看效果,标题自动映射,切回经典商务即恢复原排版。右侧边栏双 Tab:「▤ 页面」缩略图跳页、悬停操作条复页/上移/下移/删页,头部「+新页」选版式插页;「⚙ 工具」收纳动画库(翻页八套 + 入场十二式 + 离场十二式 + 强调八式 + 标题文字逐字/逐词/逐行,可设全部页面/仅本页范围)与复制截图(本页/选页批量,只含主体内容,截图逐张下载 PNG),点选即应用并自动记忆。「↶/↷」撤销重做(Ctrl+Z)。</div>
1157
+ <div class="help-note">「🎨 主题」面板 16 套配色即点即换,范围可选全部页面或仅本页。「🎨 模板」=十七套版式模板应用到全部页/仅本页/勾选页,支持「预览本页」先看效果,标题自动映射,切回经典商务即恢复原排版。右侧边栏双 Tab:「▤ 页面」缩略图跳页、悬停操作条复页/上移/下移/删页,头部「+新页」选版式插页;「⚙ 工具」收纳动画库(翻页八套 + 入场十二式 + 离场十二式 + 强调八式 + 标题文字逐字/逐词/逐行,可设全部页面/仅本页范围)与复制截图(本页/选页批量,只含主体内容,截图逐张下载 PNG),点选即应用并自动记忆。「↶/↷」撤销重做(Ctrl+Z)。</div>
1146
1158
  </div>
1147
1159
  </div>
1148
1160
  <div class="help-mask" id="tplMask">
@@ -1339,10 +1351,37 @@ themeGrid.addEventListener('click', function(e){
1339
1351
  var sc = themeMask.querySelector('input[name="thScope"]:checked');
1340
1352
  if (sc && sc.value === 'current') setSlideTheme(it.getAttribute('data-theme'));
1341
1353
  else setGlobalTheme(it.getAttribute('data-theme'));
1354
+ saveThemeState();
1342
1355
  renderThemeDots();
1343
1356
  buildThumbs();
1344
1357
  });
1345
1358
 
1359
+ /* 稳定身份命名空间:localStorage 键按页内嵌唯一 ID(meta deck-id)命名——Chrome/Safari 下 file:// 与 localhost 共享同源存储,固定键名会导致多份演示稿主题/动画互相串台;ID 与文件路径解耦,改名/移动目录记忆不丢 */
1360
+ var DECK_ID = ((document.querySelector('meta[name="deck-id"]') || {}).content || 'ref-deck').trim();
1361
+ /* ID 格式自愈(格式定死执行层):meta 非法或缺失(占位残留/手写变体/误沿用旧值)时按路径键自愈为 crypto.randomUUID() 标准 v4,同路径跨打开稳定;合法 UUID 原样使用(复制文件副本=同一身份共享数据,是特性) */
1362
+ if (!/^[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12}$/i.test(DECK_ID)) {
1363
+ var __sfHealKey = 'sf-heal:' + location.pathname;
1364
+ try { DECK_ID = localStorage.getItem(__sfHealKey) || DECK_ID; } catch (e) {}
1365
+ if (!/^[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12}$/i.test(DECK_ID)) {
1366
+ try { DECK_ID = crypto.randomUUID(); } catch (e) {
1367
+ DECK_ID = 'xxxxxxxx-xxxx-4xxx-yxxx-xxxxxxxxxxxx'.replace(/[xy]/g, function(c){ var r = Math.random()*16|0, v = c === 'x' ? r : (r&0x3|0x8); return v.toString(16); });
1368
+ }
1369
+ try { localStorage.setItem(__sfHealKey, DECK_ID); } catch (e) {}
1370
+ }
1371
+ var __sfMeta = document.querySelector('meta[name="deck-id"]');
1372
+ if (__sfMeta) __sfMeta.setAttribute('content', DECK_ID);
1373
+ console.warn('[magic-deck] meta deck-id 非法或缺失,已自愈为标准 v4 ID(' + DECK_ID + '),建议重新生成页面固化');
1374
+ }
1375
+
1376
+ var MD_NS = 'md-deck:' + DECK_ID;
1377
+
1378
+ /* 主题记忆:全局主题 + 本页主题(按页码索引)序列化到 localStorage,刷新恢复;失败静默 */
1379
+ function saveThemeState(){
1380
+ var per = {};
1381
+ slides.forEach(function(s, k){ var t = s.getAttribute('data-theme'); if (t) per[k] = t; });
1382
+ try{ localStorage.setItem(MD_NS + '-theme', JSON.stringify({ global: document.documentElement.getAttribute('data-theme') || 'tech', slides: per })); }catch(e){}
1383
+ }
1384
+
1346
1385
 
1347
1386
  /* ── 模板应用(全部/本页/选页;标题自动映射到模板固定位置,内容不丢) ── */
1348
1387
  var TPLS = [
@@ -1377,7 +1416,9 @@ var TPLS = [
1377
1416
  { id:'dark', name:'暗夜深色', ic:'◐', ds:'页面级反色,浅色主题下也全黑',
1378
1417
  mini:'<i style="left:0;top:0;width:100%;height:100%;background:#0d1117"></i><i style="left:8%;top:20%;width:40%;height:10%;background:#58a6ff;opacity:.85"></i><i style="left:8%;top:44%;width:60%;height:6%;background:#30363d"></i><i style="left:8%;top:60%;width:50%;height:6%;background:#30363d"></i><i style="left:74%;top:18%;width:16%;height:34%;border-radius:50%;background:conic-gradient(#58a6ff 0 60%,#30363d 60% 100%)"></i>' },
1379
1418
  { id:'nature', name:'自然清新', ic:'❀', ds:'圆润有机形状,教育与生活主题',
1380
- mini:'<i style="left:8%;top:16%;width:30%;height:64%;border-radius:40% 15% 40% 15%;border:2px solid var(--accent)"></i><i style="left:44%;top:16%;width:26%;height:40%;border-radius:15% 40% 15% 40%;border:2px solid var(--accent2)"></i><i style="left:76%;top:26%;width:10%;height:22%;border-radius:50%;background:var(--accent)"></i>' }
1419
+ mini:'<i style="left:8%;top:16%;width:30%;height:64%;border-radius:40% 15% 40% 15%;border:2px solid var(--accent)"></i><i style="left:44%;top:16%;width:26%;height:40%;border-radius:15% 40% 15% 40%;border:2px solid var(--accent2)"></i><i style="left:76%;top:26%;width:10%;height:22%;border-radius:50%;background:var(--accent)"></i>' },
1420
+ { id:'stats', name:'统计图表', ic:'◧', ds:'KPI 大数字横排 + 图表框架,数据看板',
1421
+ mini:'<i style="left:5%;top:8%;width:28%;height:18%;border-top:3px solid var(--accent);border-radius:0 0 4px 4px;background:var(--panel)"></i><i style="left:36%;top:8%;width:28%;height:18%;border-top:3px solid var(--accent);border-radius:0 0 4px 4px;background:var(--panel)"></i><i style="left:67%;top:8%;width:28%;height:18%;border-top:3px solid var(--accent);border-radius:0 0 4px 4px;background:var(--panel)"></i><i style="left:5%;top:40%;width:56%;height:52%;border:1px solid var(--accent);border-radius:4px"></i><i style="left:67%;top:40%;width:28%;height:52%;border:1px solid var(--border);border-radius:4px"></i>' }
1381
1422
  ];
1382
1423
 
1383
1424
  /* ── 成套模板生成器:领域 / 业务 21 式(面板「💼 领域」Tab 一键生成整套页面) ── */
@@ -1387,7 +1428,7 @@ var P = (function(){
1387
1428
  function head(h2, tag){ return '<div class="s-head"><h2>' + h2 + '</h2><span class="tag">' + tag + '</span></div>'; }
1388
1429
  return {
1389
1430
  cover: function(title, sub){
1390
- return '<section class="slide cover" data-title="封面"><div class="logo" data-anim="pop"></div><div class="s-title" data-anim="fade-up">' + title + '</div><div class="sub" data-anim="fade-up" data-anim-delay="120">' + sub + '</div><div class="sign" data-anim="fade-in" data-anim-delay="300">GENERATED BY SKILLFORGE</div></section>';
1431
+ return '<section class="slide cover" data-title="封面"><div class="logo" data-anim="pop"></div><div class="s-title" data-anim="fade-up">' + title + '</div><div class="sub" data-anim="fade-up" data-anim-delay="120">' + sub + '</div><div class="sign" data-anim="fade-in" data-anim-delay="300">GENERATED BY AI TEAM</div></section>';
1391
1432
  },
1392
1433
  toc: function(title, items){
1393
1434
  var inner = head(title, 'CONTENTS') + '<div class="toc">';
@@ -1461,7 +1502,7 @@ var P = (function(){
1461
1502
  return sec(title, tpl, inner);
1462
1503
  },
1463
1504
  end: function(){
1464
- return '<section class="slide endpage" data-title="结束"><div class="s-title">谢谢观看</div><p>按 F 全屏放映 · 按 ? 查看全部热键</p><p class="sign">GENERATED BY SKILLFORGE</p></section>';
1505
+ return '<section class="slide endpage" data-title="结束"><div class="s-title">谢谢观看</div><p>按 F 全屏放映 · 按 ? 查看全部热键</p><p class="sign">GENERATED BY AI TEAM</p></section>';
1465
1506
  }
1466
1507
  };
1467
1508
  })();
@@ -1476,7 +1517,7 @@ var PROF_CATS = [
1476
1517
  { id:'life', name:'生活场景' }
1477
1518
  ];
1478
1519
 
1479
- /* 二十一套成套模板:pages = 封面 + 目录 + 内容页 + 图表页 + 结束页,一键整份替换 */
1520
+ /* 二十二套成套模板:pages = 封面 + 目录 + 内容页 + 图表页 + 结束页,一键整份替换 */
1480
1521
  var PROF = [
1481
1522
  { id:'thesis', cat:'edu', name:'毕业答辩', ds:'课题研究 · 方法创新 · 成果致谢', main:'minimal', pages:[
1482
1523
  P.cover('毕业答辩<br>基于深度学习的图像分割方法研究', '答辩人:张三 · 指导教师:李四教授 · 2026 年 6 月'),
@@ -1637,7 +1678,7 @@ var PROF = [
1637
1678
  P.points('品牌故事', 'STORY', 'magazine', ['创立于 2016 年,名字取自云南的山野', '坚持「不时不食」,只做当季菜', '每一道菜背后都有一位手艺人']),
1638
1679
  P.cards('招牌菜单', 'MENU', 'magazine', [{h:'汽锅鸡', en:'Steam Pot', p:'古法汽锅,原汁原味'}, {h:'野生菌火锅', en:'Mushroom', p:'当季鲜菌,山珍荟萃'}, {h:'鲜花饼', en:'Flower Cake', p:'现烤现卖,玫瑰馅料'}]),
1639
1680
  P.points('食材溯源', 'SOURCE', 'magazine', ['清晨 5 点直采,当日送达门店', '与 27 家农户签订直供协议', '扫码即可查看每一份食材的产地故事']),
1640
- P.chart('口碑数据', 'REPUTATION', 'magazine', 'bars', {t:'各平台评分', en:'BARS GROW', data:[{n:'大众点评', v:92}, {n:'美团', v:90}, {n:'小红书', v:95}, {n:'抖音', v:88}]}, '经营表现', ['人均客单价 128 元', '全年客流 40 万人次', '顾客复购率 58%']),
1681
+ P.chart('口碑数据', 'REPUTATION', 'magazine', 'bars', {t:'各平台评分', en:'BARS GROW', data:[{n:'点评平台', v:92}, {n:'外卖平台', v:90}, {n:'种草平台', v:95}, {n:'短视频平台', v:88}]}, '经营表现', ['人均客单价 128 元', '全年客流 40 万人次', '顾客复购率 58%']),
1641
1682
  P.end()
1642
1683
  ]},
1643
1684
  { id:'travel', cat:'life', name:'旅游攻略', ds:'行程总览 · 景点美食 · 预算构成', main:'magazine', pages:[
@@ -1665,6 +1706,15 @@ var PROF = [
1665
1706
  P.nums('预期成效', 'IMPACT', 'minimal', [{b:'100', s:'所学校'}, {b:'5万', s:'本图书'}, {b:'1万+', s:'儿童受益'}, {b:'200', s:'名志愿者'}]),
1666
1707
  P.points('如何参与', 'JOIN', 'minimal', ['捐一本书,写一句寄语', '成为线上共读志愿者', '企业冠名捐赠图书角']),
1667
1708
  P.end()
1709
+ ]},
1710
+ { id:'sales', cat:'corp', name:'销售方案', ds:'客户痛点 · 方案价值 · 案例与报价', main:'executive', pages:[
1711
+ P.cover('企业智能客服<br>解决方案建议书', '销售中心 · 张经理 · 2026 年 11 月'),
1712
+ P.toc('目录', ['客户痛点', '方案价值', '成功案例', '报价与服务']),
1713
+ P.points('客户痛点', 'PAIN', 'executive', ['人工客服成本高企,7×24 服务难以保障', '咨询渠道分散,客户问题响应不及时', '会话数据未沉淀,商机线索大量流失']),
1714
+ P.cards('方案价值', 'VALUE', 'executive', [{h:'智能应答', en:'AI Bot', p:'常见问题秒回,拦截 80% 重复咨询'}, {h:'人机协同', en:'Hybrid', p:'复杂问题无缝转人工,情绪识别预警'}, {h:'数据洞察', en:'Insight', p:'全渠道会话分析,商机自动挖掘跟进'}]),
1715
+ P.nums('成功案例', 'CASES', 'executive', [{b:'62%', s:'人力成本下降'}, {b:'92%', s:'客户满意度'}, {b:'3.2s', s:'平均响应'}, {b:'500+', s:'服务企业数'}]),
1716
+ P.chart('报价与服务', 'QUOTE', 'executive', 'pie', {t:'项目投入构成', en:'PIE SWEEP', data:[{n:'软件服务', v:55}, {n:'实施交付', v:25}, {n:'培训运维', v:20}]}, '服务承诺', ['标准版年费 18 万元,30 天交付上线', '7×24 运维保障,SLA 99.9%', '免费 POC 试用 14 天,效果看得见']),
1717
+ P.end()
1668
1718
  ]}
1669
1719
  ];
1670
1720
 
@@ -2183,7 +2233,7 @@ function blankSlideHtml(tpl){
2183
2233
  + '<div class="s-head"><h2>新页面标题</h2><span class="tag">' + tp.name + '</span></div>'
2184
2234
  + '<div class="grid2">'
2185
2235
  + '<div class="card"><h4>要点一<span class="en">Point 1</span></h4><p>在这里写下要点内容,然后按 F 放映。</p></div>'
2186
- + '<div class="card"><h4>要点二<span class="en">Point 2</span></h4><p>支持全部 16 套版式与 16 套主题。</p></div>'
2236
+ + '<div class="card"><h4>要点二<span class="en">Point 2</span></h4><p>支持全部 17 套版式与 17 套主题。</p></div>'
2187
2237
  + '</div></section>';
2188
2238
  }
2189
2239
  function addPage(tpl){
@@ -2507,7 +2557,23 @@ slides.forEach(function(s){
2507
2557
  if (tp && tp !== 'classic') applyTpl(s, tp);
2508
2558
  });
2509
2559
  var themeParam = new URLSearchParams(location.search).get('theme');
2510
- if (['tech','biz','mono','light','warm'].indexOf(themeParam) > -1) setGlobalTheme(themeParam);
2560
+ var themeIds = THEMES.map(function(t){ return t[0]; });
2561
+ if (themeIds.indexOf(themeParam) > -1) setGlobalTheme(themeParam);
2562
+ else { /* 无显式 URL 参数时恢复主题记忆(md-deck-theme JSON:global + slides 页码索引;删页/排序后本页主题可能错位,重新点选即可) */
2563
+ var savedTheme = null; try{ savedTheme = localStorage.getItem(MD_NS + '-theme') || localStorage.getItem('md-deck:' + location.pathname + '-theme'); }catch(e){}
2564
+ if (savedTheme){
2565
+ var st = null; try{ st = JSON.parse(savedTheme); }catch(e){}
2566
+ if (st && typeof st === 'object'){
2567
+ if (st.global && themeIds.indexOf(st.global) > -1) setGlobalTheme(st.global);
2568
+ if (st.slides && typeof st.slides === 'object'){
2569
+ Object.keys(st.slides).forEach(function(k){
2570
+ var i = parseInt(k, 10);
2571
+ if (isFinite(i) && slides[i] && themeIds.indexOf(st.slides[k]) > -1) slides[i].setAttribute('data-theme', st.slides[k]);
2572
+ });
2573
+ }
2574
+ }
2575
+ }
2576
+ }
2511
2577
  var tplParam = new URLSearchParams(location.search).get('tpl');
2512
2578
  if (tplParam && TPLS.some(function(t){ return t.id === tplParam; })) applyScope(tplParam, 'all', []);
2513
2579
  var sm = location.hash.match(/^#\/(\d+)$/);
@@ -2522,10 +2588,10 @@ fit();
2522
2588
  buildThumbs();
2523
2589
  if (!jumped) go(0);
2524
2590
 
2525
- /* ═══ 动画控制:翻页八套 + 入场/离场/强调 + 标题文字动画 + 应用范围(localStorage 记忆,失败静默)═══ */
2591
+ /* ═══ 动画控制:翻页八套 + 入场/离场/强调 + 标题文字动画 + 应用范围(localStorage 记忆,键按页内嵌 deck-id 隔离多文件,失败静默)═══ */
2526
2592
  var deckEl = document.getElementById('deck');
2527
2593
  var TRANS_LIST = ['slide-lr','fade','slide-ud','zoom','flip','cube','wipe','dissolve'];
2528
- var sideTabSaved = null; try{ sideTabSaved = localStorage.getItem('md-deck-side-tab'); }catch(e){}
2594
+ var sideTabSaved = null; try{ sideTabSaved = localStorage.getItem(MD_NS + '-side-tab') || localStorage.getItem('md-deck:' + location.pathname + '-side-tab'); }catch(e){}
2529
2595
  var leaving = false;
2530
2596
 
2531
2597
  function openSideTab(name){
@@ -2571,7 +2637,7 @@ function leaveThenGo(i){
2571
2637
  (function(){
2572
2638
  /* 应用范围:全部页面 / 仅本页 */
2573
2639
  var scope = 'all';
2574
- var savedScope = null; try{ savedScope = localStorage.getItem('md-deck-anim-scope'); }catch(e){}
2640
+ var savedScope = null; try{ savedScope = localStorage.getItem(MD_NS + '-anim-scope') || localStorage.getItem('md-deck:' + location.pathname + '-anim-scope'); }catch(e){}
2575
2641
  if (savedScope === 'current' || savedScope === 'all') scope = savedScope;
2576
2642
  var scopeRadios = Array.prototype.slice.call(document.querySelectorAll('input[name="animScope"]'));
2577
2643
  function syncScope(){
@@ -2583,7 +2649,7 @@ function leaveThenGo(i){
2583
2649
  }
2584
2650
  syncScope();
2585
2651
  scopeRadios.forEach(function(r){ r.addEventListener('change', function(){
2586
- if (r.checked){ scope = r.value; try{ localStorage.setItem('md-deck-anim-scope', scope); }catch(e){} syncScope(); }
2652
+ if (r.checked){ scope = r.value; try{ localStorage.setItem(MD_NS + '-anim-scope', scope); }catch(e){} syncScope(); }
2587
2653
  }); });
2588
2654
  function animSlides(){ return scope === 'all' ? slides : [slides[cur]]; }
2589
2655
  function animEls(s){
@@ -2595,9 +2661,9 @@ function leaveThenGo(i){
2595
2661
  function setTransition(v){
2596
2662
  deckEl.setAttribute('data-transition', v);
2597
2663
  tgBtns.forEach(function(b){ b.classList.toggle('on', b.getAttribute('data-tg') === v); });
2598
- try{ localStorage.setItem('md-deck-transition', v); }catch(e){}
2664
+ try{ localStorage.setItem(MD_NS + '-transition', v); }catch(e){}
2599
2665
  }
2600
- var savedT = null; try{ savedT = localStorage.getItem('md-deck-transition'); }catch(e){}
2666
+ var savedT = null; try{ savedT = localStorage.getItem(MD_NS + '-transition') || localStorage.getItem('md-deck:' + location.pathname + '-transition'); }catch(e){}
2601
2667
  if (savedT && TRANS_LIST.indexOf(savedT) !== -1){ setTransition(savedT); }
2602
2668
  else { setTransition(deckEl.getAttribute('data-transition') || 'slide-lr'); }
2603
2669
  tgBtns.forEach(function(b){ b.addEventListener('click', function(){ setTransition(b.getAttribute('data-tg')); }); });
@@ -2606,9 +2672,9 @@ function leaveThenGo(i){
2606
2672
  var chkA = document.getElementById('chkAnim');
2607
2673
  function setAnim(v){
2608
2674
  deckEl.setAttribute('data-anim', v ? 'on' : 'off');
2609
- try{ localStorage.setItem('md-deck-anim', v ? 'on' : 'off'); }catch(e){}
2675
+ try{ localStorage.setItem(MD_NS + '-anim', v ? 'on' : 'off'); }catch(e){}
2610
2676
  }
2611
- var savedA = null; try{ savedA = localStorage.getItem('md-deck-anim'); }catch(e){}
2677
+ var savedA = null; try{ savedA = localStorage.getItem(MD_NS + '-anim') || localStorage.getItem('md-deck:' + location.pathname + '-anim'); }catch(e){}
2612
2678
  if (savedA === 'off' || savedA === 'on'){ setAnim(savedA === 'on'); chkA.checked = savedA === 'on'; }
2613
2679
  else { chkA.checked = deckEl.getAttribute('data-anim') !== 'off'; }
2614
2680
  chkA.addEventListener('change', function(){ setAnim(chkA.checked); });
@@ -2674,25 +2740,37 @@ function leaveThenGo(i){
2674
2740
  animSlides().forEach(function(s){
2675
2741
  s.querySelectorAll('h1,h2,h3,.s-title').forEach(function(el){
2676
2742
  restoreText(el);
2743
+ if (el.classList.contains('s-title')){
2744
+ /* 渐变字(background-clip:text)拆 span 会丢父级渐变(span 行内块不参与文字剪裁),
2745
+ 视觉成「蒙层」,改用整体入场动画代替逐字/逐词/逐行 */
2746
+ if (mode === 'none'){
2747
+ if (el.hasAttribute('data-md-whole')){
2748
+ el.removeAttribute('data-md-whole');
2749
+ if (el.getAttribute('data-anim') === 'fade-up'){ el.removeAttribute('data-anim'); el.removeAttribute('data-anim-delay'); }
2750
+ }
2751
+ } else if (!el.hasAttribute('data-anim')){ el.setAttribute('data-anim', 'fade-up'); el.setAttribute('data-md-whole', '1'); }
2752
+ return;
2753
+ }
2677
2754
  if (mode !== 'none') splitText(el, mode);
2678
2755
  });
2679
2756
  });
2680
2757
  mark(textBtns, mode, 'data-ta');
2681
2758
  }
2682
- var savedTA = null; try{ savedTA = localStorage.getItem('md-deck-text-anim'); }catch(e){}
2683
- if (savedTA === 'char' || savedTA === 'word' || savedTA === 'line'){ applyText(savedTA); }
2759
+ var savedTA = null; try{ savedTA = localStorage.getItem(MD_NS + '-text-anim') || localStorage.getItem('md-deck:' + location.pathname + '-text-anim'); }catch(e){}
2760
+ /* 入场动画总开关关闭时不回填文字动画(与开关语义一致,避免「关不掉」) */
2761
+ if ((savedTA === 'char' || savedTA === 'word' || savedTA === 'line') && deckEl.getAttribute('data-anim') !== 'off'){ applyText(savedTA); }
2684
2762
  else { mark(textBtns, 'none', 'data-ta'); }
2685
2763
  textBtns.forEach(function(b){ b.addEventListener('click', function(){
2686
2764
  var m = b.getAttribute('data-ta');
2687
2765
  applyText(m);
2688
- try{ localStorage.setItem('md-deck-text-anim', m); }catch(e){}
2766
+ try{ localStorage.setItem(MD_NS + '-text-anim', m); }catch(e){}
2689
2767
  }); });
2690
2768
 
2691
2769
  /* 双 Tab 切换 */
2692
2770
  Array.prototype.forEach.call(document.querySelectorAll('.sp-tab'), function(b){
2693
2771
  b.addEventListener('click', function(){
2694
2772
  openSideTab(b.getAttribute('data-tab'));
2695
- try{ localStorage.setItem('md-deck-side-tab', b.getAttribute('data-tab')); }catch(e){}
2773
+ try{ localStorage.setItem(MD_NS + '-side-tab', b.getAttribute('data-tab')); }catch(e){}
2696
2774
  });
2697
2775
  });
2698
2776
  openSideTab(sideTabSaved === 'tools' ? 'tools' : 'pages');
@@ -5,7 +5,7 @@
5
5
  ## 能干什么(三句话版)
6
6
 
7
7
  1. **内容变幻灯**:把一段文字、一份大纲或一个文件,做成单文件 HTML 幻灯片——16:9 舞台、双击即开、离线可用
8
- 2. **现场改版**:版式模板十六套(经典商务 / 极简留白 / 杂志画册 / 黑金发布……)与主题配色十七套即点即换,可套全部页或仅当前页;「💼 领域」Tab 还有二十一套成套模板(毕业答辩 / 年终汇报 / 商业计划书 / 政务汇报……),一键生成整套页面
8
+ 2. **现场改版**:版式模板十七套(经典商务 / 极简留白 / 杂志画册 / 黑金发布 / 统计图表……)与主题配色十七套即点即换,可套全部页或仅当前页;「💼 领域」Tab 还有二十二套成套模板(毕业答辩 / 年终汇报 / 商业计划书 / 政务汇报……),一键生成整套页面
9
9
  3. **放映与出料**:自动播放 / 全屏纯净放映 / 翻页动画与元素动画库;逐页 PNG 截图与本页 / 选页文字复制(均不含工具栏等操作元素)
10
10
 
11
11
  ## 放映热键
@@ -26,7 +26,7 @@
26
26
 
27
27
  ## 工具栏与边栏
28
28
 
29
- - **🎨 模板**:十六套版式骨架,应用范围可选全部页面 / 仅本页 / 勾选页面;先「预览本页」看效果再应用,切回「经典商务」恢复原排版、内容不丢
29
+ - **🎨 模板**:十七套版式骨架,应用范围可选全部页面 / 仅本页 / 勾选页面;先「预览本页」看效果再应用,切回「经典商务」恢复原排版、内容不丢
30
30
  - **🎨 主题**:十七套配色,色点即点即换,范围可选全部页面或仅本页
31
31
  - **↶ ↷ 撤销 / 重做**:模板应用、增删页、换主题等所有编辑操作都可回退
32
32
  - **▤ 页导航**:右侧缩略图边栏——点缩略图跳页、+新页(16 版式任选)、复页、排序、删页
@@ -40,3 +40,11 @@
40
40
  - **改完怎么保存?** 页面的编辑与换肤作用于当前打开的内存副本,刷新后回到原始文件;要固化效果请把新的版式 / 主题告诉 AI,让它重新生成 HTML
41
41
  - **放映时怎么干净?** 按 F 进全屏:工具栏、页码、箭头、弹层全部隐藏,画面纯黑背景只留幻灯内容,与 PPT 软件放映一致
42
42
  - **能拿到 PPT 吗?** magic-deck 产出 HTML 幻灯;要 .pptx 文件请用「登台 deck-stage」技能(报告 / 素材转专业 PPT,原生可编辑)
43
+
44
+ ## 效果不对怎么办
45
+
46
+ - 页面效果不对(某页布局乱 / 主题错乱 / 动画不动 / 交互失灵 / 蒙层关不掉),对 AI 说「这个页面效果不对,对照参考模板修复」,把问题描述清楚(第几页、什么现象,能截图最好)
47
+ - 本技能的设计标准答案就在技能目录里:`resources/reference.html`(双击可打开放映看标准效果)+ `resources/deck-spec.md`(规格说明),AI 修复时以此为唯一对照
48
+ - AI 的处理流程固定:先打开 reference.html 作标准 → 再读你那份问题 html 文件 → 逐处比对找出跑偏的地方 → 以 reference 为准修复 → 自动翻完全部页面确认零报错、截图对比修复前后,自证修好了再交付
49
+ - 放映时的现场改动(换模板/换主题/增删页)刷新会回到原始文件——想固化效果就说「按这个效果重新生成」,这不算报修,AI 会按当前效果重建 HTML
50
+ - 参考模板本身有缺陷时(生成结果与 reference 一模一样但仍有问题,如历史过的「切模板后出现关不掉的蒙层」)说一句「参考模板也有这个问题」,AI 会连模板一起修并同步回 reference.html,避免以后再犯
@@ -12,7 +12,7 @@
12
12
  CONFIG_VERSION: 2 # 配置结构版本:skill 升级时若配置结构变化会递增;AI 每次执行前对比 SKILL.md「配置版本机制」节声明的当前版本,不一致时按 SKILL.md 的迁移规则处理(先备份本文件为带时间戳 .bak,再迁移,最后对话告知用户)
13
13
 
14
14
  # ── 落盘与外观 ──
15
- DIR: ~/Desktop # 幻灯片 HTML 落盘目录
15
+ DIR: ~/Desktop # 幻灯片落盘总目录:每次生成在此目录下新建「{文件名}/」子目录存放 slides.html 与后续衍生文件(截图等)——总目录统一管理、各次产出互不干扰;临时口头指定任意目录永远优先
16
16
  FILENAME: auto # 文件名(不含扩展名):auto = 按本次内容主题+用途自动总结中文名(如「智能探针系统-产品介绍」,便于日后按名找回继续改);也可口头指定文件名(永远优先);或写死固定名如 slides(重名自动加日期后缀,不覆盖)
17
17
  OPEN_HTML: true # 生成后自动打开浏览器放映
18
18
  THEME: tech # 默认主题(十七套:tech 深蓝科技 / biz 浅色商务 / mono IDEA 黑亮 / light IDEA 白亮 / warm 温暖渐变 / aurora 极光紫 / dracula 德古拉紫 / nord 北欧冰蓝 / midnight 东京夜色 / matrix 终端荧光绿 / cyber 赛博霓虹 / apple 苹果极简 / stripe 条纹紫蓝 / notion 纸感暖白 / gruvbox 复古暖橙 / gold 黑金奢华 / ocean 深洋蓝;放映时「🎨 主题」面板色点即点即换:范围可选全部页面或仅本页)
@@ -28,13 +28,13 @@ LOOP_DEFAULT: false # 循环播放默认关(放映时可勾选)
28
28
  FROM_START_DEFAULT: true # 从头播放默认开(取消勾选=从当前页继续)
29
29
 
30
30
  # ── 页脚署名 ──
31
- SIGNATURE: GENERATED BY SKILLFORGE # 封面/结束页署名
31
+ SIGNATURE: GENERATED BY AI TEAM # 封面/结束页署名
32
32
  ```
33
33
 
34
34
 
35
35
  ## 📝 模板、主题与动画(像真 PPT 一样可选)
36
36
 
37
- - **内置模板十六套**(版式骨架):classic 经典商务(默认)/ minimal 极简留白 / magazine 杂志画册 / keynote 黑金发布 / timeline 时间线叙事 / steps 流程步骤 / poster 海报宣传 / vintage 复古报纸 / finance 金融报表 / blueprint 蓝图工程 / education 教学板书 / executive 高管简报 / metro 扁平磁贴 / bento 模块网格 / dark 暗夜深色 / nature 自然清新。改上方 `TEMPLATE` 即换生成默认,或生成时口头点名(如「用杂志风模板」)当次生效;放映时随时经工具栏「🎨 模板」面板切换(全部页面/仅本页/选择页面),可先「预览本页」看效果再应用,标题自动映射到模板固定位置,切回经典商务即恢复原排版
37
+ - **内置模板十七套**(版式骨架):classic 经典商务(默认)/ minimal 极简留白 / magazine 杂志画册 / keynote 黑金发布 / timeline 时间线叙事 / steps 流程步骤 / poster 海报宣传 / vintage 复古报纸 / finance 金融报表 / blueprint 蓝图工程 / education 教学板书 / executive 高管简报 / metro 扁平磁贴 / bento 模块网格 / dark 暗夜深色 / nature 自然清新 / stats 统计图表。改上方 `TEMPLATE` 即换生成默认,或生成时口头点名(如「用杂志风模板」)当次生效;放映时随时经工具栏「🎨 模板」面板切换(全部页面/仅本页/选择页面),可先「预览本页」看效果再应用,标题自动映射到模板固定位置,切回经典商务即恢复原排版
38
38
  - **内置主题十七套**(配色,放映时随时换):tech 深蓝科技(默认)/ biz 浅色商务 / mono IDEA 黑亮 / light IDEA 白亮 / warm 温暖渐变 / aurora 极光紫 / dracula 德古拉紫 / nord 北欧冰蓝 / midnight 东京夜色 / matrix 终端荧光绿 / cyber 赛博霓虹 / apple 苹果极简 / stripe 条纹紫蓝 / notion 纸感暖白 / gruvbox 复古暖橙 / gold 黑金奢华 / ocean 深洋蓝。「🎨 主题」面板点色点=整份切换;范围选「仅本页」后再点色点=只给当前页换肤,选回「全部页面」即恢复整份模式
39
39
  - **动画库**(动效,与模板/主题正交,放映时收纳在右侧边栏「⚙ 工具」Tab,应用范围可选全部页面/仅本页):翻页风格八套——slide-lr 左右滑移(默认)/ fade 淡入淡出 / slide-ud 上下滑移 / zoom 缩放推进 / flip 3D 翻页 / cube 立方翻转 / wipe 平移擦除 / dissolve 溶解模糊,改上方 `TRANSITION` 即换生成默认,放映时即点即换;元素入场动画十二式(fade-up 上浮 / fade-in 淡入 / fade-down 下沉 / zoom-in 缩放 / slide-left 左滑 / slide-right 右滑 / slide-up 上滑 / slide-down 下滑 / pop 弹出 / bounce-in 弹跳 / flip-in 翻转 / blur 模糊浮现,另有 none 无动画),生成时元素挂 `data-anim` 属性声明、同页多元素挂 `data-anim-delay` 错落,翻到该页自动播放;离场动画十二式(元素挂 `data-anim-leave`,翻页前元素先离场 0.45s 再切页);强调动画八式(pulse 脉冲 / swing 摆动 / shake 抖动 / breathe 呼吸 / flash 闪烁 / tada 放大 / spin 旋转 / glow 发光,元素挂 `data-anim-emphasis` 循环播放);标题文字动画四式(none 无动画默认 / char 逐字 / word 逐词 / line 逐行);`ANIM: false` 时入场动画整份关闭(或放映时「开启」勾选框取消),所有选择浏览器记忆
40
- - **自定义模板片段**(可选):在 `resources/templates/` 下放 `my-*.html`(仅 body 内容片段,不含 html/head/script),生成时用户点名模板名即可套用;未点名用内置十六套模板
40
+ - **自定义模板片段**(可选):在 `resources/templates/` 下放 `my-*.html`(仅 body 内容片段,不含 html/head/script),生成时用户点名模板名即可套用;未点名用内置十七套模板