@taloswork/ose-shared 0.1.2 → 0.1.4

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 (237) hide show
  1. package/package.json +3 -3
  2. package/skills/document/SKILL.md +56 -53
  3. package/skills/document/assets/fonts/Archivo-Regular.woff2 +0 -0
  4. package/skills/document/assets/fonts/Archivo-SemiBold.woff2 +0 -0
  5. package/skills/document/assets/fonts/BigShouldersDisplay-Bold.woff2 +0 -0
  6. package/skills/document/assets/fonts/BodoniModa-SemiBold.woff2 +0 -0
  7. package/skills/document/assets/fonts/ChakraPetch-600.woff2 +0 -0
  8. package/skills/document/assets/fonts/CormorantGaramond-SemiBold.woff2 +0 -0
  9. package/skills/document/assets/fonts/DMSerifDisplay-400.woff2 +0 -0
  10. package/skills/document/assets/fonts/Fraunces-SemiBold.woff2 +0 -0
  11. package/skills/document/assets/fonts/GochiHand-Regular.woff2 +0 -0
  12. package/skills/document/assets/fonts/IBMPlexSans-Regular.woff2 +0 -0
  13. package/skills/document/assets/fonts/IBMPlexSans-SemiBold.woff2 +0 -0
  14. package/skills/document/assets/fonts/Inter-Regular.woff2 +0 -0
  15. package/skills/document/assets/fonts/Jost-Regular.woff2 +0 -0
  16. package/skills/document/assets/fonts/Jost-SemiBold.woff2 +0 -0
  17. package/skills/document/assets/fonts/Karla-Regular.woff2 +0 -0
  18. package/skills/document/assets/fonts/Lexend-500.woff2 +0 -0
  19. package/skills/document/assets/fonts/Lora-Regular.woff2 +0 -0
  20. package/skills/document/assets/fonts/Manrope-Bold.woff2 +0 -0
  21. package/skills/document/assets/fonts/Manrope-Regular.woff2 +0 -0
  22. package/skills/document/assets/fonts/Marcellus-Regular.woff2 +0 -0
  23. package/skills/document/assets/fonts/Nunito-700.woff2 +0 -0
  24. package/skills/document/assets/fonts/PlayfairDisplay-600.woff2 +0 -0
  25. package/skills/document/assets/fonts/PublicSans-Regular.woff2 +0 -0
  26. package/skills/document/assets/fonts/Quicksand-600.woff2 +0 -0
  27. package/skills/document/assets/fonts/Sora-Regular.woff2 +0 -0
  28. package/skills/document/assets/fonts/Sora-SemiBold.woff2 +0 -0
  29. package/skills/document/assets/fonts/SpaceGrotesk-500.woff2 +0 -0
  30. package/skills/document/assets/fonts/Syne-700.woff2 +0 -0
  31. package/skills/document/assets/fonts/ZillaSlab-600.woff2 +0 -0
  32. package/skills/document/assets/fonts/fonts.json +316 -0
  33. package/skills/document/bin/deck-build.cjs +273 -5
  34. package/skills/document/bin/doc-gen.cjs +108 -23
  35. package/skills/document/bin/html2pptx.cjs +284 -51
  36. package/skills/document/catalog.json +43 -0
  37. package/skills/document/deck-design.md +191 -0
  38. package/skills/document/layouts/README.md +33 -0
  39. package/skills/document/layouts/banner-columns.tpl +9 -9
  40. package/skills/document/layouts/bento.tpl +3 -3
  41. package/skills/document/layouts/big-stat.tpl +3 -3
  42. package/skills/document/layouts/blocks-2x2.tpl +12 -12
  43. package/skills/document/layouts/brand-values.tpl +5 -5
  44. package/skills/document/layouts/cards-3.tpl +3 -3
  45. package/skills/document/layouts/cards-grid.tpl +3 -3
  46. package/skills/document/layouts/chart-full.tpl +3 -3
  47. package/skills/document/layouts/chart-kpi.tpl +3 -3
  48. package/skills/document/layouts/color-palette.tpl +5 -5
  49. package/skills/document/layouts/comparison.tpl +3 -3
  50. package/skills/document/layouts/concept-hub.tpl +3 -3
  51. package/skills/document/layouts/cover-centered.tpl +1 -1
  52. package/skills/document/layouts/cover-image.tpl +1 -1
  53. package/skills/document/layouts/cover-minimal.tpl +3 -3
  54. package/skills/document/layouts/cover-statement.tpl +3 -3
  55. package/skills/document/layouts/cover.tpl +1 -1
  56. package/skills/document/layouts/data-table.tpl +3 -3
  57. package/skills/document/layouts/dos-donts.tpl +14 -14
  58. package/skills/document/layouts/editorial-panel.tpl +11 -11
  59. package/skills/document/layouts/ending-contact.tpl +1 -1
  60. package/skills/document/layouts/ending.tpl +1 -1
  61. package/skills/document/layouts/funnel.tpl +3 -3
  62. package/skills/document/layouts/gantt.tpl +3 -3
  63. package/skills/document/layouts/hero.tpl +3 -3
  64. package/skills/document/layouts/icon-row.tpl +3 -3
  65. package/skills/document/layouts/image-full.tpl +5 -5
  66. package/skills/document/layouts/image-grid.tpl +3 -3
  67. package/skills/document/layouts/image-left.tpl +3 -3
  68. package/skills/document/layouts/list.tpl +3 -3
  69. package/skills/document/layouts/logo-guidelines.tpl +8 -8
  70. package/skills/document/layouts/map-distribution.tpl +3 -3
  71. package/skills/document/layouts/map-quad.tpl +6 -6
  72. package/skills/document/layouts/matrix-2x2.tpl +3 -3
  73. package/skills/document/layouts/numbered-brief.tpl +12 -12
  74. package/skills/document/layouts/org-tree.tpl +3 -3
  75. package/skills/document/layouts/problem-solution-banner.tpl +7 -7
  76. package/skills/document/layouts/problem-solution.tpl +3 -3
  77. package/skills/document/layouts/pyramid.tpl +3 -3
  78. package/skills/document/layouts/quote-aside.tpl +11 -0
  79. package/skills/document/layouts/quote.tpl +1 -1
  80. package/skills/document/layouts/radar.tpl +3 -3
  81. package/skills/document/layouts/ring-progress.tpl +3 -3
  82. package/skills/document/layouts/section-fullbleed.tpl +3 -3
  83. package/skills/document/layouts/section-image.tpl +1 -1
  84. package/skills/document/layouts/section-stat.tpl +1 -1
  85. package/skills/document/layouts/section.tpl +1 -1
  86. package/skills/document/layouts/slots.json +1 -1
  87. package/skills/document/layouts/split-two-col.tpl +3 -3
  88. package/skills/document/layouts/stats-chart.tpl +3 -3
  89. package/skills/document/layouts/steps-serpentine.tpl +11 -11
  90. package/skills/document/layouts/steps-vertical.tpl +3 -3
  91. package/skills/document/layouts/steps.tpl +3 -3
  92. package/skills/document/layouts/team-row.tpl +4 -4
  93. package/skills/document/layouts/three-kpi.tpl +3 -3
  94. package/skills/document/layouts/timeline.tpl +3 -3
  95. package/skills/document/layouts/title-meta.tpl +5 -5
  96. package/skills/document/layouts/title.tpl +2 -2
  97. package/skills/document/layouts/toc-agenda.tpl +3 -3
  98. package/skills/document/layouts/toc-editorial.tpl +15 -0
  99. package/skills/document/layouts/toc-panel.tpl +4 -4
  100. package/skills/document/layouts/toc.tpl +3 -3
  101. package/skills/document/layouts/transition.tpl +1 -1
  102. package/skills/document/layouts/two-kpi.tpl +3 -3
  103. package/skills/document/layouts/type-specimen.tpl +10 -10
  104. package/skills/document/layouts/versus.tpl +3 -3
  105. package/skills/document/motion/README.md +29 -0
  106. package/skills/document/motion/anthropic.json +29 -0
  107. package/skills/document/motion/apple.json +41 -0
  108. package/skills/document/motion/bistro-warm.json +16 -0
  109. package/skills/document/motion/black-gold.json +29 -0
  110. package/skills/document/motion/board-brief.json +14 -0
  111. package/skills/document/motion/bold-clash.json +16 -0
  112. package/skills/document/motion/branding.json +22 -0
  113. package/skills/document/motion/campus-teal.json +22 -0
  114. package/skills/document/motion/cinereel.json +23 -0
  115. package/skills/document/motion/clinic-care.json +22 -0
  116. package/skills/document/motion/cool.json +41 -0
  117. package/skills/document/motion/dark-glass.json +22 -0
  118. package/skills/document/motion/gov-brief.json +14 -0
  119. package/skills/document/motion/grid-tech.json +16 -0
  120. package/skills/document/motion/hand-drawn.json +23 -0
  121. package/skills/document/motion/ivory-gold.json +22 -0
  122. package/skills/document/motion/legal-slate.json +15 -0
  123. package/skills/document/motion/magazine-ink.json +29 -0
  124. package/skills/document/motion/mckinsey.json +28 -0
  125. package/skills/document/motion/memphis.json +16 -0
  126. package/skills/document/motion/mono.json +21 -0
  127. package/skills/document/motion/neon-cyber.json +42 -0
  128. package/skills/document/motion/olive-gold.json +22 -0
  129. package/skills/document/motion/organic-earth.json +15 -0
  130. package/skills/document/motion/pastel-saas.json +15 -0
  131. package/skills/document/motion/portfolio-noir.json +21 -0
  132. package/skills/document/motion/press-room.json +14 -0
  133. package/skills/document/motion/retro-press.json +15 -0
  134. package/skills/document/motion/sport-arena.json +16 -0
  135. package/skills/document/motion/swiss-grid.json +34 -0
  136. package/skills/document/motion/wedding-blush.json +15 -0
  137. package/skills/document/packs/README.md +28 -0
  138. package/skills/document/packs/board-brief/backdrop.html +4 -0
  139. package/skills/document/packs/board-brief/layouts/cover.tpl +12 -0
  140. package/skills/document/packs/board-brief/layouts/toc-agenda.tpl +20 -0
  141. package/skills/document/packs/board-brief/pack.css +27 -0
  142. package/skills/document/packs/press-room/backdrop.html +4 -0
  143. package/skills/document/packs/press-room/layouts/cover.tpl +12 -0
  144. package/skills/document/packs/press-room/layouts/section.tpl +13 -0
  145. package/skills/document/packs/press-room/pack.css +27 -0
  146. package/skills/document/styles/README.md +65 -16
  147. package/skills/document/styles/_contract-defaults.css +55 -0
  148. package/skills/document/styles/_samples/_groups/biz-premium.webp +0 -0
  149. package/skills/document/styles/_samples/_groups/creative.webp +0 -0
  150. package/skills/document/styles/_samples/_groups/editorial.webp +0 -0
  151. package/skills/document/styles/_samples/_groups/minimal.webp +0 -0
  152. package/skills/document/styles/_samples/_groups/natural.webp +0 -0
  153. package/skills/document/styles/_samples/_groups/tech-future.webp +0 -0
  154. package/skills/document/styles/_samples/anthropic.webp +0 -0
  155. package/skills/document/styles/_samples/apple.webp +0 -0
  156. package/skills/document/styles/_samples/bistro-warm.webp +0 -0
  157. package/skills/document/styles/_samples/black-gold.webp +0 -0
  158. package/skills/document/styles/_samples/board-brief.webp +0 -0
  159. package/skills/document/styles/_samples/bold-clash.webp +0 -0
  160. package/skills/document/styles/_samples/branding.webp +0 -0
  161. package/skills/document/styles/_samples/campus-teal.webp +0 -0
  162. package/skills/document/styles/_samples/cinereel.webp +0 -0
  163. package/skills/document/styles/_samples/clinic-care.webp +0 -0
  164. package/skills/document/styles/_samples/cool.webp +0 -0
  165. package/skills/document/styles/_samples/dark-glass.webp +0 -0
  166. package/skills/document/styles/_samples/gov-brief.webp +0 -0
  167. package/skills/document/styles/_samples/grid-tech.webp +0 -0
  168. package/skills/document/styles/_samples/hand-drawn.webp +0 -0
  169. package/skills/document/styles/_samples/ivory-gold.webp +0 -0
  170. package/skills/document/styles/_samples/legal-slate.webp +0 -0
  171. package/skills/document/styles/_samples/magazine-ink.webp +0 -0
  172. package/skills/document/styles/_samples/mckinsey.webp +0 -0
  173. package/skills/document/styles/_samples/memphis.webp +0 -0
  174. package/skills/document/styles/_samples/mono.webp +0 -0
  175. package/skills/document/styles/_samples/neon-cyber.webp +0 -0
  176. package/skills/document/styles/_samples/olive-gold.webp +0 -0
  177. package/skills/document/styles/_samples/organic-earth.webp +0 -0
  178. package/skills/document/styles/_samples/pastel-saas.webp +0 -0
  179. package/skills/document/styles/_samples/portfolio-noir.webp +0 -0
  180. package/skills/document/styles/_samples/press-room.webp +0 -0
  181. package/skills/document/styles/_samples/retro-press.webp +0 -0
  182. package/skills/document/styles/_samples/sport-arena.webp +0 -0
  183. package/skills/document/styles/_samples/swiss-grid.webp +0 -0
  184. package/skills/document/styles/_samples/wedding-blush.webp +0 -0
  185. package/skills/document/styles/anthropic/backdrop.html +4 -0
  186. package/skills/document/styles/anthropic/skin.css +15 -8
  187. package/skills/document/styles/apple/backdrop.html +4 -1
  188. package/skills/document/styles/apple/skin.css +5 -2
  189. package/skills/document/styles/bistro-warm/backdrop.html +4 -0
  190. package/skills/document/styles/bistro-warm/skin.css +27 -0
  191. package/skills/document/styles/black-gold/backdrop.html +3 -0
  192. package/skills/document/styles/black-gold/skin.css +15 -8
  193. package/skills/document/styles/bold-clash/backdrop.html +4 -0
  194. package/skills/document/styles/bold-clash/skin.css +27 -0
  195. package/skills/document/styles/branding/backdrop.html +4 -0
  196. package/skills/document/styles/branding/skin.css +14 -7
  197. package/skills/document/styles/campus-teal/backdrop.html +3 -0
  198. package/skills/document/styles/campus-teal/skin.css +27 -0
  199. package/skills/document/styles/cinereel/skin.css +28 -10
  200. package/skills/document/styles/clinic-care/backdrop.html +4 -0
  201. package/skills/document/styles/clinic-care/skin.css +27 -0
  202. package/skills/document/styles/cool/backdrop.html +3 -0
  203. package/skills/document/styles/cool/skin.css +5 -2
  204. package/skills/document/styles/dark-glass/backdrop.html +4 -0
  205. package/skills/document/styles/dark-glass/skin.css +27 -0
  206. package/skills/document/styles/gov-brief/backdrop.html +4 -0
  207. package/skills/document/styles/gov-brief/skin.css +27 -0
  208. package/skills/document/styles/grid-tech/backdrop.html +37 -0
  209. package/skills/document/styles/grid-tech/skin.css +27 -0
  210. package/skills/document/styles/hand-drawn/skin.css +16 -8
  211. package/skills/document/styles/ivory-gold/skin.css +21 -8
  212. package/skills/document/styles/legal-slate/backdrop.html +6 -0
  213. package/skills/document/styles/legal-slate/skin.css +27 -0
  214. package/skills/document/styles/magazine-ink/skin.css +7 -2
  215. package/skills/document/styles/mckinsey/backdrop.html +5 -0
  216. package/skills/document/styles/mckinsey/skin.css +5 -2
  217. package/skills/document/styles/memphis/backdrop.html +5 -0
  218. package/skills/document/styles/memphis/skin.css +27 -0
  219. package/skills/document/styles/mono/backdrop.html +6 -0
  220. package/skills/document/styles/mono/skin.css +6 -3
  221. package/skills/document/styles/neon-cyber/backdrop.html +4 -0
  222. package/skills/document/styles/neon-cyber/skin.css +27 -0
  223. package/skills/document/styles/olive-gold/backdrop.html +5 -0
  224. package/skills/document/styles/olive-gold/skin.css +15 -8
  225. package/skills/document/styles/organic-earth/backdrop.html +4 -0
  226. package/skills/document/styles/organic-earth/skin.css +27 -0
  227. package/skills/document/styles/pastel-saas/backdrop.html +4 -0
  228. package/skills/document/styles/pastel-saas/skin.css +27 -0
  229. package/skills/document/styles/portfolio-noir/backdrop.html +4 -0
  230. package/skills/document/styles/portfolio-noir/skin.css +27 -0
  231. package/skills/document/styles/retro-press/backdrop.html +6 -0
  232. package/skills/document/styles/retro-press/skin.css +27 -0
  233. package/skills/document/styles/sport-arena/backdrop.html +4 -0
  234. package/skills/document/styles/sport-arena/skin.css +27 -0
  235. package/skills/document/styles/swiss-grid/skin.css +6 -1
  236. package/skills/document/styles/wedding-blush/backdrop.html +6 -0
  237. package/skills/document/styles/wedding-blush/skin.css +27 -0
@@ -1,11 +1,14 @@
1
1
  /* styles/anthropic — 温暖人文:奶油底 + 赤陶(clay)珊瑚 + Georgia 衬线标题 + 土系 ramp + 软卡。
2
2
  皮肤层:定义 layouts/*.tpl 用到的全部语义 class。换 skin 只换这一个文件。 */
3
3
  :root{
4
+ /* 排版节奏 — layouts 的字号与页边距都写成 calc(N * var(--…-scale,1)),
5
+ 所以皮肤可以在不碰任何 layout 的前提下定义自己的疏密。研究分享:呼吸感。 */
6
+ --space-scale:1.05; --type-scale:1.0;
4
7
  --accent:#CC785C; --c1:#CC785C; --c2:#7C9082; --c3:#BD5D3E; --c4:#B7A99A; --chart-1:#C4785C;
5
8
  --title:#191919; --body:#514B3F; --muted:#6B6558; --foot:#9A917F;
6
9
  --hair:#DDD6C7; --card-radius:12px;
7
- --font-head:Georgia,'Songti SC','Times New Roman',serif;
8
- --font-body:'Helvetica Neue','PingFang SC','Hiragino Sans GB',sans-serif;
10
+ --font-head:'Fraunces','Songti SC','Noto Serif SC','Source Han Serif SC',serif;
11
+ --font-body:'Public Sans','PingFang SC','Noto Sans SC','Hiragino Sans GB',sans-serif;
9
12
  /* theme-compat vars: SKELETON_CSS's section.slide h1/h2/h3 + section.slide out-specify
10
13
  the skin's .cover-title/.slide, so titles/body fall back to these — define them so
11
14
  --style alone fully colors the deck. */
@@ -18,7 +21,11 @@
18
21
  .deck-header,.deck-footer,.deck-pageno{color:var(--muted)}
19
22
  .rule{background:var(--hair)} .rule-foot{background:#E7E1D3}
20
23
  .eyebrow{color:var(--accent);font-weight:700} .accent-bar{background:var(--accent);border-radius:1px}
21
- .deck-title,.cover-title,.section-title,.ending-title{color:var(--title);font-family:var(--font-head);font-weight:700}
24
+ /* This skin's identity IS this face — a didone/garalde/roman falling back to the
25
+ system serif reads as a different deck entirely. Bake the display classes so the
26
+ audience sees it; body copy stays native (editable/searchable). See
27
+ deck-design.md § Fonts for why bundling alone doesn't reach the native text layer. */
28
+ .deck-title,.cover-title,.section-title,.ending-title{color:var(--title);font-family:var(--font-head);font-weight:700;--talos-bake:1}
22
29
  .cover-sub,.ending-sub,.section-desc{color:var(--muted)}
23
30
  /* soft warm card + earthy ramp */
24
31
  .card{border-radius:var(--card-radius);background:#FAF8F2;border:1px solid var(--hair);box-shadow:0 10px 28px rgba(80,55,30,.07);overflow:hidden}
@@ -35,19 +42,19 @@
35
42
  .cmp-col--rec .cmp-v{color:var(--accent)}
36
43
  .cmp-badge{background:var(--accent);color:#FBF6EF;font-family:var(--font-body)}
37
44
  /* kpi / big-stat */
38
- .kpi-num,.stat-num{color:var(--title);font-family:var(--font-head)} .kpi-label{color:var(--muted)}
45
+ .kpi-num,.stat-num{color:var(--title);font-family:var(--font-head);--talos-bake:1} .kpi-label{color:var(--muted)}
39
46
  .stat-unit{color:var(--accent)} .stat-lead{color:var(--title)} .stat-note{color:var(--body)}
40
47
  /* steps */
41
48
  .step-line{background:var(--hair)}
42
- .step-circle{background:#F6F1E7;border:1px solid var(--hair);box-shadow:0 10px 24px rgba(80,55,30,.06);font-family:var(--font-head)}
49
+ .step-circle{background:#F6F1E7;border:1px solid var(--hair);box-shadow:0 10px 24px rgba(80,55,30,.06);font-family:var(--font-head);--talos-bake:1}
43
50
  .steps .step:nth-child(4n+1) .step-circle{color:var(--c1)} .steps .step:nth-child(4n+2) .step-circle{color:var(--c2)} .steps .step:nth-child(4n+3) .step-circle{color:var(--c3)} .steps .step:nth-child(4n+4) .step-circle{color:var(--c4)}
44
51
  .step-tag,.step-body{color:var(--muted)} .step-title{color:var(--title)}
45
52
  /* toc */
46
53
  .toc-item{border-top:1px solid var(--hair)} .toc-grid .toc-item:nth-child(1){border-top-color:var(--accent)} .toc-grid .toc-item:nth-child(2){border-top-color:var(--c2)}
47
- .toc-grid .toc-item:nth-child(1) .toc-num{color:var(--accent)} .toc-grid .toc-item:nth-child(2) .toc-num{color:var(--c2)} .toc-num{color:var(--foot);font-family:var(--font-head)}
54
+ .toc-grid .toc-item:nth-child(1) .toc-num{color:var(--accent)} .toc-grid .toc-item:nth-child(2) .toc-num{color:var(--c2)} .toc-num{color:var(--foot);font-family:var(--font-head);--talos-bake:1}
48
55
  .toc-title{color:var(--title)} .toc-desc{color:var(--muted)}
49
56
  /* section ghost + surface */
50
- .section-ghost{color:transparent;-webkit-text-stroke:1px rgba(204,120,92,.20);font-family:var(--font-head)}
57
+ .section-ghost{color:transparent;-webkit-text-stroke:1px rgba(204,120,92,.20);font-family:var(--font-head);--talos-bake:1}
51
58
  .surface{background:#F6F1E7;border:1px solid var(--hair);border-radius:12px} .surface-label{color:var(--muted)}
52
59
  .ending-contact{color:var(--muted)}
53
60
 
@@ -56,7 +63,7 @@
56
63
  .overlay-sub{color:rgba(255,255,255,.82)}
57
64
  /* batch-5 layouts: timeline / concept-hub / cover-image */
58
65
  .tl-dot{background:var(--accent);border-radius:50%}
59
- .tl-date{color:var(--accent);font-family:var(--font-head)}
66
+ .tl-date{color:var(--accent);font-family:var(--font-head);--talos-bake:1}
60
67
  .tl-title{color:var(--title)} .tl-desc{color:var(--muted)}
61
68
  .hub-center{border-radius:50%;border:2px solid var(--accent)}
62
69
  .hub-title{color:var(--accent)}
@@ -1 +1,4 @@
1
- <div style="position:absolute;inset:0;background:radial-gradient(70% 50% at 50% -12%,rgba(255,255,255,.07),transparent 55%),radial-gradient(130% 90% at 50% 128%,rgba(0,0,0,.42),transparent 48%)"></div><div class="bd-arc" style="position:absolute;left:0;right:0;height:120px;top:var(--bd-arc-y,540px);pointer-events:none"><svg width="100%" height="100%" viewBox="0 0 1280 120" preserveAspectRatio="none"><defs><linearGradient id="arc" x1="0" y1="0" x2="1" y2="0"><stop offset="0" stop-color="__ACCENT__" stop-opacity=".12"/><stop offset=".5" stop-color="__ACCENT__" stop-opacity=".34"/><stop offset="1" stop-color="__ACCENT__" stop-opacity=".12"/></linearGradient><filter id="arcb"><feGaussianBlur stdDeviation="1.4"/></filter></defs><path d="M-40 100 C 360 22,920 22,1320 100" fill="none" stroke="url(#arc)" stroke-width="1.6" filter="url(#arcb)"/><path d="M-40 100 C 360 22,920 22,1320 100" fill="none" stroke="url(#arc)" stroke-width=".7"/></svg></div><svg style="position:absolute;inset:0;width:100%;height:100%;opacity:.02;mix-blend-mode:screen;pointer-events:none"><filter id="bdap"><feTurbulence type="fractalNoise" baseFrequency=".9" numOctaves="2" stitchTiles="stitch"/></filter><rect width="100%" height="100%" filter="url(#bdap)"/></svg>
1
+ <div style="position:absolute;inset:0;background:radial-gradient(70% 50% at 50% -12%,rgba(255,255,255,.07),transparent 55%),radial-gradient(130% 90% at 50% 128%,rgba(0,0,0,.42),transparent 48%)"></div><div class="bd-arc" style="position:absolute;left:0;right:0;height:120px;top:var(--bd-arc-y,540px);pointer-events:none"><svg width="100%" height="100%" viewBox="0 0 1280 120" preserveAspectRatio="none"><defs><linearGradient id="arc" x1="0" y1="0" x2="1" y2="0"><stop offset="0" stop-color="__ACCENT__" stop-opacity=".12"/><stop offset=".5" stop-color="__ACCENT__" stop-opacity=".34"/><stop offset="1" stop-color="__ACCENT__" stop-opacity=".12"/></linearGradient><filter id="arcb"><feGaussianBlur stdDeviation="1.4"/></filter></defs><path d="M-40 100 C 360 22,920 22,1320 100" fill="none" stroke="url(#arc)" stroke-width="1.6" filter="url(#arcb)"/><path d="M-40 100 C 360 22,920 22,1320 100" fill="none" stroke="url(#arc)" stroke-width=".7"/></svg></div><svg style="position:absolute;inset:0;width:100%;height:100%;opacity:.02;mix-blend-mode:screen;pointer-events:none"><filter id="bdap"><feTurbulence type="fractalNoise" baseFrequency=".9" numOctaves="2" stitchTiles="stitch"/></filter><rect width="100%" height="100%" filter="url(#bdap)"/></svg>
2
+ <!-- signature: the keynote stage — one hairline horizon with a faint floor reflection. -->
3
+ <div style="position:absolute;left:0;right:0;bottom:96px;height:112px;pointer-events:none;background:linear-gradient(180deg,transparent,color-mix(in srgb,var(--accent) 14%,transparent))"></div>
4
+ <div style="position:absolute;left:0;right:0;bottom:96px;height:1px;pointer-events:none;background:linear-gradient(90deg,transparent,var(--accent),transparent);opacity:.55"></div>
@@ -1,11 +1,14 @@
1
1
  /* styles/apple — keynote 舞台:纯黑底 + 超大留白 + 近白单色层级(无彩色 accent,靠字号/明度分层)。
2
2
  皮肤层:定义 layouts/*.tpl 用到的全部语义 class。换 skin 只换这一个文件。 */
3
3
  :root{
4
+ /* 排版节奏 — layouts 的字号与页边距都写成 calc(N * var(--…-scale,1)),
5
+ 所以皮肤可以在不碰任何 layout 的前提下定义自己的疏密。发布会舞台:超大留白,标题略放。 */
6
+ --space-scale:1.22; --type-scale:1.04;
4
7
  --accent:#F5F5F7; --c1:#F5F5F7; --c2:#C7C7CC; --c3:#98989D; --c4:#636366; --chart-1:#6E6E73;
5
8
  --title:#F5F5F7; --body:#A1A1A6; --muted:#86868B; --foot:#636366;
6
9
  --hair:rgba(255,255,255,.09); --card-radius:20px;
7
- --font-head:'Helvetica Neue','SF Pro Display','PingFang SC','Hiragino Sans GB',sans-serif;
8
- --font-body:'Helvetica Neue','SF Pro Text','PingFang SC',sans-serif;
10
+ --font-head:'Manrope','PingFang SC','Noto Sans SC','Hiragino Sans GB',sans-serif;
11
+ --font-body:'Manrope','PingFang SC','Noto Sans SC','Hiragino Sans GB',sans-serif;
9
12
  /* theme-compat vars: SKELETON_CSS targets section.slide h1/h2/h3 + section.slide
10
13
  (specificity 0,1,2 / 0,1,1) which out-specify the skin's .cover-title/.slide, so
11
14
  titles/body fall back to these. Define them so --style alone fully colors the deck. */
@@ -0,0 +1,4 @@
1
+ <!-- generated by scripts/ppt-tpl/gen-skin.mjs — signature: diagonal-band -->
2
+ <div style="position:absolute;inset:0;background:#FEEEE3"></div>
3
+ <div style="position:absolute;right:-60px;top:-40px;width:260px;height:820px;background:var(--accent);opacity:.14;transform:rotate(18deg);pointer-events:none"></div>
4
+ <div style="position:absolute;right:96px;top:-40px;width:2px;height:820px;background:var(--accent);opacity:.5;transform:rotate(18deg);pointer-events:none"></div>
@@ -0,0 +1,27 @@
1
+ /* styles/bistro-warm — generated by scripts/ppt-tpl/gen-skin.mjs from ppt-tpl/families/bistro-warm/family.json.
2
+ 手改会在下次生成时丢失:要改就改 family.json。 */
3
+ :root{
4
+ --space-scale:1; --type-scale:1.04;
5
+ --accent:#C43C3C; --c1:#C43C3C; --c2:#9B5F0B; --c3:#67730E; --c4:#037E3F; --chart-1:#C43C3C;
6
+ --title:#3A2823; --body:#62514D; --muted:#8D7B76; --foot:#8D7B76;
7
+ --hair:#ECCEC6; --card-radius:4px;
8
+ --font-head:'Zilla Slab','Songti SC',sans-serif;
9
+ --font-body:'Karla','Noto Sans SC',sans-serif;
10
+ --title-color:#3A2823; --body-color:#62514D; --slide-bg:#FEEEE3; --font-heading:var(--font-head);
11
+ }
12
+ .slide{background:#FEEEE3;color:var(--body);font-family:var(--font-body)}
13
+ .slide-backdrop{position:absolute;inset:0;background:#FEEEE3}
14
+ .deck-header,.deck-footer,.deck-pageno{color:var(--muted)}
15
+ .rule,.rule-foot{background:var(--hair)}
16
+ .eyebrow{color:var(--accent);letter-spacing:.22em;font-weight:700}
17
+ .accent-bar{background:var(--accent)}
18
+ .deck-title,.cover-title,.section-title,.ending-title{color:var(--title);font-family:var(--font-head);font-weight:700;--talos-bake:1}
19
+ .cover-sub,.ending-sub,.section-desc{color:var(--muted)}
20
+ .card{border-radius:var(--card-radius);background:transparent;border:1px solid var(--hair)}
21
+ .card-idx{color:var(--muted)} .card-body{color:var(--body)} .card-title{color:var(--title)}
22
+ .card-grid .card:nth-child(4n+1) .card-rail,.card-grid .card:nth-child(4n+1) .card-dot{background:var(--c1)}
23
+ .card-grid .card:nth-child(4n+2) .card-rail,.card-grid .card:nth-child(4n+2) .card-dot{background:var(--c2)}
24
+ .card-grid .card:nth-child(4n+3) .card-rail,.card-grid .card:nth-child(4n+3) .card-dot{background:var(--c3)}
25
+ .card-grid .card:nth-child(4n+4) .card-rail,.card-grid .card:nth-child(4n+4) .card-dot{background:var(--c4)}
26
+ .kpi-num,.stat-num{color:var(--title);font-family:var(--font-head);--talos-bake:1}
27
+ .kpi-label,.stat-unit{color:var(--muted)} .stat-lead{color:var(--title)} .stat-note{color:var(--body)}
@@ -1 +1,4 @@
1
1
  <div class="bd-arc" style="position:absolute;left:0;right:0;height:120px;top:var(--bd-arc-y,540px);pointer-events:none"><svg width="100%" height="100%" viewBox="0 0 1280 120" preserveAspectRatio="none"><defs><linearGradient id="arc" x1="0" y1="0" x2="1" y2="0"><stop offset="0" stop-color="__ACCENT__" stop-opacity=".12"/><stop offset=".5" stop-color="__ACCENT__" stop-opacity=".34"/><stop offset="1" stop-color="__ACCENT__" stop-opacity=".12"/></linearGradient><filter id="arcb"><feGaussianBlur stdDeviation="1.4"/></filter></defs><path d="M-40 100 C 360 22,920 22,1320 100" fill="none" stroke="url(#arc)" stroke-width="1.6" filter="url(#arcb)"/><path d="M-40 100 C 360 22,920 22,1320 100" fill="none" stroke="url(#arc)" stroke-width=".7"/></svg></div><svg style="position:absolute;inset:0;width:100%;height:100%;opacity:.045;mix-blend-mode:overlay;pointer-events:none"><filter id="bgn"><feTurbulence type="fractalNoise" baseFrequency=".8" numOctaves="2" stitchTiles="stitch"/></filter><rect width="100%" height="100%" filter="url(#bgn)"/></svg>
2
+ <!-- signature: the certificate — a double rule inside the trim, bond-paper convention. -->
3
+ <div style="position:absolute;inset:26px;border:1px solid var(--accent);opacity:.38;pointer-events:none"></div>
4
+ <div style="position:absolute;inset:33px;border:1px solid var(--hair);pointer-events:none"></div>
@@ -1,10 +1,13 @@
1
1
  /* styles/black-gold — 纯黑 + 金辉光 + 衬线 + 单色金 ramp。复用同一套 layouts。 */
2
2
  :root{
3
+ /* 排版节奏 — layouts 的字号与页边距都写成 calc(N * var(--…-scale,1)),
4
+ 所以皮肤可以在不碰任何 layout 的前提下定义自己的疏密。年报:庄重的边距。 */
5
+ --space-scale:1.1; --type-scale:1.0;
3
6
  --accent:#D4AF37; --c1:#D4AF37; --c2:#E7C08A; --c3:#C9A24B; --c4:#F5D98B; --chart-1:#B8912C;
4
7
  --title:#F6E8C2; --body:#b3a887; --muted:#8a7f63; --foot:#6a614a;
5
8
  --hair:rgba(212,175,55,.16); --card-radius:16px;
6
- --font-head:'Georgia','Times New Roman','Songti SC','Noto Serif SC',serif;
7
- --font-body:'Georgia','Songti SC',serif;
9
+ --font-head:'Bodoni Moda','Songti SC','Noto Serif SC','Source Han Serif SC',serif;
10
+ --font-body:'Lora','Songti SC','Noto Serif SC','Source Han Serif SC',serif;
8
11
  /* theme-compat vars: SKELETON_CSS's section.slide h1/h2/h3 + section.slide out-specify
9
12
  the skin's .cover-title/.slide, so titles/body fall back to these — define them so
10
13
  --style alone fully colors the deck (else headings render dark on the dark bg). */
@@ -18,7 +21,11 @@
18
21
  .deck-header,.deck-footer,.deck-pageno{color:var(--muted)}
19
22
  .rule{background:var(--hair)} .rule-foot{background:rgba(212,175,55,.10)}
20
23
  .eyebrow{color:var(--accent)} .accent-bar{background:var(--accent);border-radius:1px}
21
- .deck-title,.cover-title,.section-title,.ending-title{color:var(--title);font-family:var(--font-head);font-weight:700}
24
+ /* This skin's identity IS this face — a didone/garalde/roman falling back to the
25
+ system serif reads as a different deck entirely. Bake the display classes so the
26
+ audience sees it; body copy stays native (editable/searchable). See
27
+ deck-design.md § Fonts for why bundling alone doesn't reach the native text layer. */
28
+ .deck-title,.cover-title,.section-title,.ending-title{color:var(--title);font-family:var(--font-head);font-weight:700;--talos-bake:1}
22
29
  .cover-sub,.ending-sub,.section-desc{color:var(--body)}
23
30
  .card{border-radius:var(--card-radius);background:linear-gradient(180deg,rgba(212,175,55,.06),rgba(212,175,55,.015));border:1px solid rgba(212,175,55,.20);box-shadow:0 24px 60px rgba(0,0,0,.5);overflow:hidden}
24
31
  .card-idx{color:var(--muted)} .card-body{color:var(--body)}
@@ -32,16 +39,16 @@
32
39
  .cmp-title{color:var(--title)} .cmp-k{color:var(--muted)} .cmp-v{color:var(--title)}
33
40
  .cmp-col--rec .cmp-v{color:var(--accent)}
34
41
  .cmp-badge{background:var(--accent);color:#241a04}
35
- .kpi-num,.stat-num{color:var(--title);font-family:var(--font-head)} .kpi-label{color:var(--muted)}
42
+ .kpi-num,.stat-num{color:var(--title);font-family:var(--font-head);--talos-bake:1} .kpi-label{color:var(--muted)}
36
43
  .stat-unit{color:var(--accent)} .stat-lead{color:var(--title)} .stat-note{color:var(--body)}
37
44
  .step-line{background:linear-gradient(90deg,transparent,var(--accent),transparent);opacity:.5}
38
- .step-circle{background:linear-gradient(180deg,rgba(212,175,55,.06),rgba(212,175,55,.015));border:1px solid rgba(212,175,55,.22);box-shadow:0 20px 44px rgba(0,0,0,.5);font-family:var(--font-head)}
45
+ .step-circle{background:linear-gradient(180deg,rgba(212,175,55,.06),rgba(212,175,55,.015));border:1px solid rgba(212,175,55,.22);box-shadow:0 20px 44px rgba(0,0,0,.5);font-family:var(--font-head);--talos-bake:1}
39
46
  .steps .step:nth-child(4n+1) .step-circle{color:var(--c1)} .steps .step:nth-child(4n+2) .step-circle{color:var(--c2)} .steps .step:nth-child(4n+3) .step-circle{color:var(--c3)} .steps .step:nth-child(4n+4) .step-circle{color:var(--c4)}
40
47
  .step-tag,.step-body{color:var(--muted)} .step-title{color:var(--title)}
41
48
  .toc-item{border-top:1px solid var(--hair)} .toc-grid .toc-item:nth-child(1){border-top-color:var(--c1)} .toc-grid .toc-item:nth-child(2){border-top-color:var(--c2)}
42
- .toc-grid .toc-item:nth-child(1) .toc-num{color:var(--c1)} .toc-grid .toc-item:nth-child(2) .toc-num{color:var(--c2)} .toc-num{color:var(--foot);font-family:var(--font-head)}
49
+ .toc-grid .toc-item:nth-child(1) .toc-num{color:var(--c1)} .toc-grid .toc-item:nth-child(2) .toc-num{color:var(--c2)} .toc-num{color:var(--foot);font-family:var(--font-head);--talos-bake:1}
43
50
  .toc-title{color:var(--title)} .toc-desc{color:var(--muted)}
44
- .section-ghost{color:transparent;-webkit-text-stroke:1px rgba(212,175,55,.16);font-family:var(--font-head)}
51
+ .section-ghost{color:transparent;-webkit-text-stroke:1px rgba(212,175,55,.16);font-family:var(--font-head);--talos-bake:1}
45
52
  .surface{background:rgba(212,175,55,.04);border:1px solid rgba(212,175,55,.20);border-radius:16px} .surface-label{color:var(--muted)}
46
53
  .ending-contact{color:var(--muted)}
47
54
 
@@ -50,7 +57,7 @@
50
57
  .overlay-sub{color:rgba(255,255,255,.82)}
51
58
  /* batch-5 layouts: timeline / concept-hub / cover-image (added classes) */
52
59
  .tl-dot{background:var(--accent);border-radius:50%}
53
- .tl-date{color:var(--accent);font-family:var(--font-head)}
60
+ .tl-date{color:var(--accent);font-family:var(--font-head);--talos-bake:1}
54
61
  .tl-title{color:var(--title)} .tl-desc{color:var(--muted)}
55
62
  .hub-center{border-radius:50%;border:2px solid var(--accent)}
56
63
  .hub-title{color:var(--accent)}
@@ -0,0 +1,4 @@
1
+ <!-- generated by scripts/ppt-tpl/gen-skin.mjs — signature: spine -->
2
+ <div style="position:absolute;inset:0;background:#FFE87D"></div>
3
+ <div style="position:absolute;left:0;top:0;bottom:0;width:26px;background:var(--hair);opacity:.55;pointer-events:none"></div>
4
+ <div style="position:absolute;left:0;top:96px;height:216px;width:26px;background:var(--accent);pointer-events:none"></div>
@@ -0,0 +1,27 @@
1
+ /* styles/bold-clash — generated by scripts/ppt-tpl/gen-skin.mjs from ppt-tpl/families/bold-clash/family.json.
2
+ 手改会在下次生成时丢失:要改就改 family.json。 */
3
+ :root{
4
+ --space-scale:0.9; --type-scale:1.12;
5
+ --accent:#BF257D; --c1:#BF257D; --c2:#905E0A; --c3:#02774C; --c4:#047193; --chart-1:#BF257D;
6
+ --title:#221F15; --body:#4A473D; --muted:#716D60; --foot:#716D60;
7
+ --hair:#C2B68A; --card-radius:4px;
8
+ --font-head:'Anton','Noto Sans SC',sans-serif;
9
+ --font-body:'Karla','Noto Sans SC',sans-serif;
10
+ --title-color:#221F15; --body-color:#4A473D; --slide-bg:#FFE87D; --font-heading:var(--font-head);
11
+ }
12
+ .slide{background:#FFE87D;color:var(--body);font-family:var(--font-body)}
13
+ .slide-backdrop{position:absolute;inset:0;background:#FFE87D}
14
+ .deck-header,.deck-footer,.deck-pageno{color:var(--muted)}
15
+ .rule,.rule-foot{background:var(--hair)}
16
+ .eyebrow{color:var(--accent);letter-spacing:.22em;font-weight:700}
17
+ .accent-bar{background:var(--accent)}
18
+ .deck-title,.cover-title,.section-title,.ending-title{color:var(--title);font-family:var(--font-head);font-weight:700;--talos-bake:1}
19
+ .cover-sub,.ending-sub,.section-desc{color:var(--muted)}
20
+ .card{border-radius:var(--card-radius);background:transparent;border:1px solid var(--hair)}
21
+ .card-idx{color:var(--muted)} .card-body{color:var(--body)} .card-title{color:var(--title)}
22
+ .card-grid .card:nth-child(4n+1) .card-rail,.card-grid .card:nth-child(4n+1) .card-dot{background:var(--c1)}
23
+ .card-grid .card:nth-child(4n+2) .card-rail,.card-grid .card:nth-child(4n+2) .card-dot{background:var(--c2)}
24
+ .card-grid .card:nth-child(4n+3) .card-rail,.card-grid .card:nth-child(4n+3) .card-dot{background:var(--c3)}
25
+ .card-grid .card:nth-child(4n+4) .card-rail,.card-grid .card:nth-child(4n+4) .card-dot{background:var(--c4)}
26
+ .kpi-num,.stat-num{color:var(--title);font-family:var(--font-head);--talos-bake:1}
27
+ .kpi-label,.stat-unit{color:var(--muted)} .stat-lead{color:var(--title)} .stat-note{color:var(--body)}
@@ -1 +1,5 @@
1
1
  <div style="position:absolute;inset:0;background:radial-gradient(50% 64% at 92% 4%,rgba(122,154,114,.11),transparent 58%),radial-gradient(44% 54% at 4% 98%,rgba(183,156,110,.07),transparent 62%)"></div><svg width="1280" height="720" viewBox="0 0 1280 720" style="position:absolute;inset:0" preserveAspectRatio="none"><defs><linearGradient id="brl" x1="0" y1="0" x2="1" y2="0"><stop offset="0" stop-color="#7A9A72" stop-opacity="0"/><stop offset=".5" stop-color="#7A9A72" stop-opacity=".26"/><stop offset="1" stop-color="#7A9A72" stop-opacity="0"/></linearGradient></defs><path d="M-40 150 C 380 92,880 128,1330 44" fill="none" stroke="url(#brl)" stroke-width=".7"/></svg><svg style="position:absolute;inset:0;width:100%;height:100%;opacity:.04;mix-blend-mode:multiply;pointer-events:none"><filter id="brn"><feTurbulence type="fractalNoise" baseFrequency=".82" numOctaves="2" stitchTiles="stitch"/></filter><rect width="100%" height="100%" filter="url(#brn)"/></svg>
2
+ <!-- signature: the brand-book spine — a bound left edge with its fold rule. -->
3
+ <div style="position:absolute;left:0;top:0;bottom:0;width:30px;background:var(--accent);opacity:.15;pointer-events:none"></div>
4
+ <div style="position:absolute;left:30px;top:0;bottom:0;width:1px;background:var(--hair);pointer-events:none"></div>
5
+ <div style="position:absolute;left:0;top:64px;width:30px;height:44px;background:var(--accent);opacity:.5;pointer-events:none"></div>
@@ -2,11 +2,14 @@
2
2
  清爽、留白大、可持续/美妆/零售调性。原创皮肤(风格方向,非复刻任何模版)。
3
3
  浅色 skin:复用同一套 layouts。 */
4
4
  :root{
5
+ /* 排版节奏 — layouts 的字号与页边距都写成 calc(N * var(--…-scale,1)),
6
+ 所以皮肤可以在不碰任何 layout 的前提下定义自己的疏密。品牌手册:书页般的宽边距。 */
7
+ --space-scale:1.12; --type-scale:0.98;
5
8
  --accent:#7A9A72; --c1:#7A9A72; --c2:#B79C6E; --c3:#5E7D5A; --c4:#A9A288; --chart-1:#6F9169;
6
9
  --title:#26261F; --body:#57574A; --muted:#8A876F; --foot:#A8A48C;
7
10
  --hair:#DFD8C5; --card-radius:10px;
8
- --font-head:Georgia,'Songti SC','Noto Serif SC','Times New Roman',serif;
9
- --font-body:'Helvetica Neue','PingFang SC','Hiragino Sans GB',sans-serif;
11
+ --font-head:'Cormorant Garamond','Songti SC','Noto Serif SC','Source Han Serif SC',serif;
12
+ --font-body:'Karla','PingFang SC','Noto Sans SC','Hiragino Sans GB',sans-serif;
10
13
  /* theme-compat */
11
14
  --title-color:#26261F; --body-color:#57574A; --slide-bg:#F3EEE2; --font-heading:var(--font-head);
12
15
  }
@@ -21,6 +24,10 @@
21
24
  /* --talos-bake:1 → titles bake into the backdrop so the serif shows for CJK too
22
25
  (pinning a CJK pptx typeface vanishes in hybrid). Trade-off: title is image,
23
26
  not editable/searchable — the accepted cost for a serif 品牌 skin. */
27
+ /* This skin's identity IS this face — a didone/garalde/roman falling back to the
28
+ system serif reads as a different deck entirely. Bake the display classes so the
29
+ audience sees it; body copy stays native (editable/searchable). See
30
+ deck-design.md § Fonts for why bundling alone doesn't reach the native text layer. */
24
31
  .deck-title,.cover-title,.section-title,.ending-title{color:var(--title);font-family:var(--font-head);font-weight:700;--talos-bake:1}
25
32
  .cover-sub,.ending-sub,.section-desc{color:var(--body)}
26
33
  .card{border-radius:var(--card-radius);background:#FBF7EC;border:1px solid var(--hair);box-shadow:0 14px 34px rgba(60,58,40,.09);overflow:hidden}
@@ -35,16 +42,16 @@
35
42
  .cmp-title{color:var(--title)} .cmp-k{color:var(--muted)} .cmp-v{color:var(--title)}
36
43
  .cmp-col--rec .cmp-v{color:var(--accent)}
37
44
  .cmp-badge{background:var(--accent);color:#F6F2E8}
38
- .kpi-num,.stat-num{color:var(--title);font-family:var(--font-head);font-weight:700} .kpi-label{color:var(--muted)}
45
+ .kpi-num,.stat-num{color:var(--title);font-family:var(--font-head);font-weight:700;--talos-bake:1} .kpi-label{color:var(--muted)}
39
46
  .stat-unit{color:var(--accent)} .stat-lead{color:var(--title)} .stat-note{color:var(--body)}
40
47
  .step-line{background:linear-gradient(90deg,transparent,var(--accent),transparent);opacity:.5}
41
- .step-circle{background:#FBF7EC;border:1px solid var(--hair);box-shadow:0 12px 28px rgba(60,58,40,.09);font-family:var(--font-head)}
48
+ .step-circle{background:#FBF7EC;border:1px solid var(--hair);box-shadow:0 12px 28px rgba(60,58,40,.09);font-family:var(--font-head);--talos-bake:1}
42
49
  .steps .step:nth-child(4n+1) .step-circle{color:var(--c1)} .steps .step:nth-child(4n+2) .step-circle{color:var(--c2)} .steps .step:nth-child(4n+3) .step-circle{color:var(--c3)} .steps .step:nth-child(4n+4) .step-circle{color:var(--c4)}
43
50
  .step-tag,.step-body{color:var(--muted)} .step-title{color:var(--title)}
44
51
  .toc-item{border-top:1px solid var(--hair)} .toc-grid .toc-item:nth-child(1){border-top-color:var(--c1)} .toc-grid .toc-item:nth-child(2){border-top-color:var(--c2)}
45
- .toc-grid .toc-item:nth-child(1) .toc-num{color:var(--c1)} .toc-grid .toc-item:nth-child(2) .toc-num{color:var(--c2)} .toc-num{color:var(--foot);font-family:var(--font-head)}
52
+ .toc-grid .toc-item:nth-child(1) .toc-num{color:var(--c1)} .toc-grid .toc-item:nth-child(2) .toc-num{color:var(--c2)} .toc-num{color:var(--foot);font-family:var(--font-head);--talos-bake:1}
46
53
  .toc-title{color:var(--title)} .toc-desc{color:var(--muted)}
47
- .section-ghost{color:transparent;-webkit-text-stroke:1px rgba(122,154,114,.28);font-family:var(--font-head)}
54
+ .section-ghost{color:transparent;-webkit-text-stroke:1px rgba(122,154,114,.28);font-family:var(--font-head);--talos-bake:1}
48
55
  .surface{background:#FBF7EC;border:1px solid var(--hair);border-radius:10px} .surface-label{color:var(--muted)}
49
56
  .ending-contact{color:var(--muted)}
50
57
  /* full-bleed image overlay — 始终浅色 */
@@ -52,7 +59,7 @@
52
59
  .scrim{background:linear-gradient(180deg,transparent 26%,rgba(0,0,0,.58))}
53
60
  /* timeline / concept-hub */
54
61
  .tl-dot{background:var(--accent);border-radius:50%}
55
- .tl-date{color:var(--accent);font-family:var(--font-head)}
62
+ .tl-date{color:var(--accent);font-family:var(--font-head);--talos-bake:1}
56
63
  .tl-title{color:var(--title)} .tl-desc{color:var(--muted)}
57
64
  .hub-center{border-radius:50%;border:2px solid var(--accent)} .hub-title{color:var(--accent)} .hub-link{stroke:var(--accent);opacity:.4}
58
65
  /* data-table */
@@ -0,0 +1,3 @@
1
+ <!-- generated by scripts/ppt-tpl/gen-skin.mjs — signature: dot-matrix -->
2
+ <div style="position:absolute;inset:0;background:#E1F8F6"></div>
3
+ <div style="position:absolute;inset:0;background-image:radial-gradient(var(--hair) 1.4px,transparent 1.4px);background-size:28px 28px;opacity:.85;pointer-events:none"></div>
@@ -0,0 +1,27 @@
1
+ /* styles/campus-teal — generated by scripts/ppt-tpl/gen-skin.mjs from ppt-tpl/families/campus-teal/family.json.
2
+ 手改会在下次生成时丢失:要改就改 family.json。 */
3
+ :root{
4
+ --space-scale:1.06; --type-scale:1.02;
5
+ --accent:#0E6A63; --c1:#0E6A63; --c2:#11677E; --c3:#1860A5; --c4:#7F498F; --chart-1:#0E6A63;
6
+ --title:#1D2F2E; --body:#495856; --muted:#728280; --foot:#728280;
7
+ --hair:#C1DDDA; --card-radius:4px;
8
+ --font-head:'Lexend','Noto Sans SC',sans-serif;
9
+ --font-body:'Public Sans','Noto Sans SC',sans-serif;
10
+ --title-color:#1D2F2E; --body-color:#495856; --slide-bg:#E1F8F6; --font-heading:var(--font-head);
11
+ }
12
+ .slide{background:#E1F8F6;color:var(--body);font-family:var(--font-body)}
13
+ .slide-backdrop{position:absolute;inset:0;background:#E1F8F6}
14
+ .deck-header,.deck-footer,.deck-pageno{color:var(--muted)}
15
+ .rule,.rule-foot{background:var(--hair)}
16
+ .eyebrow{color:var(--accent);letter-spacing:.22em;font-weight:700}
17
+ .accent-bar{background:var(--accent)}
18
+ .deck-title,.cover-title,.section-title,.ending-title{color:var(--title);font-family:var(--font-head);font-weight:700}
19
+ .cover-sub,.ending-sub,.section-desc{color:var(--muted)}
20
+ .card{border-radius:var(--card-radius);background:transparent;border:1px solid var(--hair)}
21
+ .card-idx{color:var(--muted)} .card-body{color:var(--body)} .card-title{color:var(--title)}
22
+ .card-grid .card:nth-child(4n+1) .card-rail,.card-grid .card:nth-child(4n+1) .card-dot{background:var(--c1)}
23
+ .card-grid .card:nth-child(4n+2) .card-rail,.card-grid .card:nth-child(4n+2) .card-dot{background:var(--c2)}
24
+ .card-grid .card:nth-child(4n+3) .card-rail,.card-grid .card:nth-child(4n+3) .card-dot{background:var(--c3)}
25
+ .card-grid .card:nth-child(4n+4) .card-rail,.card-grid .card:nth-child(4n+4) .card-dot{background:var(--c4)}
26
+ .kpi-num,.stat-num{color:var(--title);font-family:var(--font-head)}
27
+ .kpi-label,.stat-unit{color:var(--muted)} .stat-lead{color:var(--title)} .stat-note{color:var(--body)}
@@ -1,13 +1,16 @@
1
- /* styles/cinereel — 胶片感黑白极简:黑底/照片底 + 白色 Anton 粗体大写标题(标题=accent,
1
+ /* styles/cinereel — 胶片感黑白极简:黑底/照片底 + 白色超浓缩粗体大写标题(Big Shoulders
2
+ Display,比 Anton 更窄、字腔更开,对齐 slidescarnival 音乐录影带模板;正文 Jost 几何无衬线)(标题=accent,
2
3
  无色相)+ 常驻胶片取景框(顶/底黑色遮幅条,每页恒定)+ .slide-inverse 浅灰面板反色(目录/流程页)。
3
4
  皮肤层:定义 layouts/*.tpl 用到的全部语义 class。换 skin 只换这一个文件。 */
4
- @font-face{font-family:'Anton';src:local('Anton'),url(data:font/woff2;base64,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) format('woff2');font-display:swap}
5
5
  :root{
6
+ /* 排版节奏 — layouts 的字号与页边距都写成 calc(N * var(--…-scale,1)),
7
+ 所以皮肤可以在不碰任何 layout 的前提下定义自己的疏密。遮幅条已经定了节奏,不再叠加。 */
8
+ --space-scale:1.0; --type-scale:1.0;
6
9
  --accent:#F5F4F0; --c1:#F5F4F0; --c2:#C7C5BE; --c3:#8A8880; --c4:#5A584F; --chart-1:#8A8880;
7
10
  --title:#F5F4F0; --body:#C7C5BE; --muted:#8A8880; --foot:#656358;
8
11
  --hair:rgba(245,244,240,.16); --card-radius:0px;
9
- --font-head:'Anton','Arial Narrow Bold','Heiti SC','PingFang SC',sans-serif;
10
- --font-body:'Helvetica Neue','Arial','PingFang SC','Microsoft YaHei',sans-serif;
12
+ --font-head:'Big Shoulders Display','Anton','PingFang SC','Noto Sans SC',sans-serif;
13
+ --font-body:'Jost','PingFang SC','Noto Sans SC',sans-serif;
11
14
  /* theme-compat vars: SKELETON_CSS's section.slide h1/h2/h3 + section.slide out-specify
12
15
  the skin's .cover-title/.slide, so titles/body fall back to these — define them so
13
16
  --style alone fully colors the deck. */
@@ -50,19 +53,30 @@
50
53
  .cmp-col--rec .cmp-v{color:var(--accent)}
51
54
  .cmp-badge{background:var(--accent);color:#0D0D0C}
52
55
  /* kpi / big-stat */
53
- .kpi-num,.stat-num{color:var(--title);font-family:var(--font-head)} .kpi-label{color:var(--muted)}
56
+ /* Anton in the NATIVE text layer is a lottery (the consuming app substitutes a wider
57
+ generic sans — wrong glyphs, and wide enough to wrap). These are decorative display
58
+ numerals/dates that nobody edits, so fidelity beats editability: bake them, same call
59
+ as the titles above. `.panel-item-title` is deliberately NOT baked — it is real
60
+ content a reader may want to change. Baked text is also invisible to data-anim and
61
+ deck-qa; see deck-design.md § Fonts. */
62
+ .kpi-num,.stat-num{color:var(--title);font-family:var(--font-head);--talos-bake:1} .kpi-label{color:var(--muted)}
54
63
  .stat-unit{color:var(--accent)} .stat-lead{color:var(--title)} .stat-note{color:var(--body)}
55
64
  /* steps */
56
65
  .step-line{background:var(--hair)}
57
- .step-circle{background:rgba(245,244,240,.04);border:1px solid var(--hair);font-family:var(--font-head);position:relative;z-index:1}
66
+ .step-circle{background:rgba(245,244,240,.04);border:1px solid var(--hair);font-family:var(--font-head);position:relative;z-index:1;--talos-bake:1}
58
67
  .steps .step:nth-child(4n+1) .step-circle{color:var(--c1)} .steps .step:nth-child(4n+2) .step-circle{color:var(--c2)} .steps .step:nth-child(4n+3) .step-circle{color:var(--c3)} .steps .step:nth-child(4n+4) .step-circle{color:var(--c4)}
59
68
  .step-tag,.step-body{color:var(--muted)} .step-title{color:var(--title)}
60
69
  /* toc */
61
70
  .toc-item{border-top:1px solid var(--hair)} .toc-grid .toc-item:nth-child(1){border-top-color:var(--c1)} .toc-grid .toc-item:nth-child(2){border-top-color:var(--c2)}
62
- .toc-grid .toc-item:nth-child(1) .toc-num{color:var(--c1)} .toc-grid .toc-item:nth-child(2) .toc-num{color:var(--c2)} .toc-num{color:var(--foot);font-family:var(--font-head)}
71
+ .toc-grid .toc-item:nth-child(1) .toc-num{color:var(--c1)} .toc-grid .toc-item:nth-child(2) .toc-num{color:var(--c2)} /* Anton is a custom condensed face the consuming app may fail to resolve for the
72
+ NATIVE text layer (same failure the title rule above documents). On a big
73
+ display numeral that substitution is wide enough to wrap the trailing "."
74
+ onto its own line — and the numeral renders in a generic sans instead of
75
+ Anton. Bake it: these numerals are decoration, editability buys nothing. */
76
+ .toc-num{color:var(--foot);font-family:var(--font-head);--talos-bake:1}
63
77
  .toc-title{color:var(--title)} .toc-desc{color:var(--muted)}
64
78
  /* section ghost + surface */
65
- .section-ghost{color:transparent;-webkit-text-stroke:1px rgba(245,244,240,.16);font-family:var(--font-head)}
79
+ .section-ghost{color:transparent;-webkit-text-stroke:1px rgba(245,244,240,.16);font-family:var(--font-head);--talos-bake:1}
66
80
  .surface{background:rgba(245,244,240,.05);border:1px solid var(--hair);border-radius:0;position:relative;z-index:1} .surface-label{color:var(--muted)}
67
81
  .ending-contact{color:var(--muted)}
68
82
 
@@ -71,7 +85,7 @@
71
85
  .overlay-sub{color:rgba(255,255,255,.82)}
72
86
  /* batch-5 layouts: timeline / concept-hub / cover-image */
73
87
  .tl-dot{background:var(--accent);border-radius:50%}
74
- .tl-date{color:var(--accent);font-family:var(--font-head)}
88
+ .tl-date{color:var(--accent);font-family:var(--font-head);--talos-bake:1}
75
89
  .tl-title{color:var(--title)} .tl-desc{color:var(--muted)}
76
90
  .hub-center{border-radius:50%;border:2px solid var(--accent)}
77
91
  .hub-title{color:var(--accent)}
@@ -125,6 +139,10 @@
125
139
  /* ===== .slide-inverse — 浅灰面板反色(目录/流程图这类页面,原模版里黑色取景框不变,
126
140
  只有中间内容区翻成浅灰;标题/accent 在这套皮肤里没有独立色相,必须跟着翻黑,
127
141
  与 ivory-gold 的"标题恒定金色"不同 —— 每个皮肤自行决定哪些 token 要翻)。 */
128
- .slide.slide-inverse{--slide-bg:#F0EFEA;--body:#3A3830;--muted:#6E6C61;--foot:#8F8D80;--hair:rgba(13,13,12,.14);--title:#0D0D0C;--accent:#0D0D0C;--title-color:#0D0D0C;--body-color:#3A3830}
142
+ .slide.slide-inverse{--slide-bg:#F0EFEA;--body:#3A3830;--muted:#6E6C61;--foot:#8F8D80;--hair:rgba(13,13,12,.14);--title:#0D0D0C;--accent:#0D0D0C;--title-color:#0D0D0C;--body-color:#3A3830;/* the 4-step ramp is a LIGHTNESS ladder tuned for the black ground (c1 near-white = most
143
+ emphasis). On the light panel it has to invert too, or the first two steps — the TOC
144
+ numerals, card rails, step circles — sit near-white on near-white and vanish. Same order
145
+ of emphasis, mirrored: c1 darkest. */
146
+ --c1:#0D0D0C;--c2:#3A3830;--c3:#55534A;--c4:#6E6C61}
129
147
  .slide.slide-inverse .card,.slide.slide-inverse .cmp-col,.slide.slide-inverse .step-circle,.slide.slide-inverse .surface{background:rgba(13,13,12,.04)}
130
148
  .slide.slide-inverse .cmp-badge,.slide.slide-inverse .banner-title{color:#F0EFEA}
@@ -0,0 +1,4 @@
1
+ <!-- generated by scripts/ppt-tpl/gen-skin.mjs — signature: rule-frame -->
2
+ <div style="position:absolute;inset:0;background:#EDF9FA"></div>
3
+ <div style="position:absolute;left:40px;top:40px;right:40px;bottom:40px;border:1px solid var(--hair);pointer-events:none"></div>
4
+ <div style="position:absolute;left:52px;top:52px;right:52px;bottom:52px;border:1px solid var(--hair);opacity:.5;pointer-events:none"></div>
@@ -0,0 +1,27 @@
1
+ /* styles/clinic-care — generated by scripts/ppt-tpl/gen-skin.mjs from ppt-tpl/families/clinic-care/family.json.
2
+ 手改会在下次生成时丢失:要改就改 family.json。 */
3
+ :root{
4
+ --space-scale:1.04; --type-scale:0.98;
5
+ --accent:#05747A; --c1:#05747A; --c2:#157092; --c3:#3A68B0; --c4:#875498; --chart-1:#05747A;
6
+ --title:#212E30; --body:#4B5758; --muted:#748183; --foot:#748183;
7
+ --hair:#CAE1E4; --card-radius:4px;
8
+ --font-head:'Nunito','Noto Sans SC',sans-serif;
9
+ --font-body:'Karla','Noto Sans SC',sans-serif;
10
+ --title-color:#212E30; --body-color:#4B5758; --slide-bg:#EDF9FA; --font-heading:var(--font-head);
11
+ }
12
+ .slide{background:#EDF9FA;color:var(--body);font-family:var(--font-body)}
13
+ .slide-backdrop{position:absolute;inset:0;background:#EDF9FA}
14
+ .deck-header,.deck-footer,.deck-pageno{color:var(--muted)}
15
+ .rule,.rule-foot{background:var(--hair)}
16
+ .eyebrow{color:var(--accent);letter-spacing:.22em;font-weight:700}
17
+ .accent-bar{background:var(--accent)}
18
+ .deck-title,.cover-title,.section-title,.ending-title{color:var(--title);font-family:var(--font-head);font-weight:700}
19
+ .cover-sub,.ending-sub,.section-desc{color:var(--muted)}
20
+ .card{border-radius:var(--card-radius);background:transparent;border:1px solid var(--hair)}
21
+ .card-idx{color:var(--muted)} .card-body{color:var(--body)} .card-title{color:var(--title)}
22
+ .card-grid .card:nth-child(4n+1) .card-rail,.card-grid .card:nth-child(4n+1) .card-dot{background:var(--c1)}
23
+ .card-grid .card:nth-child(4n+2) .card-rail,.card-grid .card:nth-child(4n+2) .card-dot{background:var(--c2)}
24
+ .card-grid .card:nth-child(4n+3) .card-rail,.card-grid .card:nth-child(4n+3) .card-dot{background:var(--c3)}
25
+ .card-grid .card:nth-child(4n+4) .card-rail,.card-grid .card:nth-child(4n+4) .card-dot{background:var(--c4)}
26
+ .kpi-num,.stat-num{color:var(--title);font-family:var(--font-head)}
27
+ .kpi-label,.stat-unit{color:var(--muted)} .stat-lead{color:var(--title)} .stat-note{color:var(--body)}
@@ -1 +1,4 @@
1
1
  <div class="bd-arc" style="position:absolute;left:0;right:0;height:120px;top:var(--bd-arc-y,540px);pointer-events:none"><svg width="100%" height="100%" viewBox="0 0 1280 120" preserveAspectRatio="none"><defs><linearGradient id="arc" x1="0" y1="0" x2="1" y2="0"><stop offset="0" stop-color="__ACCENT__" stop-opacity=".12"/><stop offset=".5" stop-color="__ACCENT__" stop-opacity=".34"/><stop offset="1" stop-color="__ACCENT__" stop-opacity=".12"/></linearGradient><filter id="arcb"><feGaussianBlur stdDeviation="1.4"/></filter></defs><path d="M-40 100 C 360 22,920 22,1320 100" fill="none" stroke="url(#arc)" stroke-width="1.6" filter="url(#arcb)"/><path d="M-40 100 C 360 22,920 22,1320 100" fill="none" stroke="url(#arc)" stroke-width=".7"/></svg></div><svg style="position:absolute;inset:0;width:100%;height:100%;opacity:.05;mix-blend-mode:overlay;pointer-events:none"><filter id="bdns"><feTurbulence type="fractalNoise" baseFrequency=".85" numOctaves="2" stitchTiles="stitch"/></filter><rect width="100%" height="100%" filter="url(#bdns)"/></svg>
2
+ <!-- signature: instrument ticks — a measurement scale along the top right edge. -->
3
+ <div style="position:absolute;right:56px;top:34px;display:flex;gap:9px;align-items:flex-start;pointer-events:none"><span style="display:block;width:1px;height:16px;background:var(--accent);opacity:.8"></span><span style="display:block;width:1px;height:8px;background:var(--accent);opacity:.45"></span><span style="display:block;width:1px;height:8px;background:var(--accent);opacity:.45"></span><span style="display:block;width:1px;height:8px;background:var(--accent);opacity:.45"></span><span style="display:block;width:1px;height:16px;background:var(--accent);opacity:.8"></span><span style="display:block;width:1px;height:8px;background:var(--accent);opacity:.45"></span><span style="display:block;width:1px;height:8px;background:var(--accent);opacity:.45"></span><span style="display:block;width:1px;height:8px;background:var(--accent);opacity:.45"></span><span style="display:block;width:1px;height:16px;background:var(--accent);opacity:.8"></span></div>
4
+ <div style="position:absolute;right:56px;top:34px;width:129px;height:1px;background:var(--accent);opacity:.5;pointer-events:none"></div>
@@ -1,11 +1,14 @@
1
1
  /* styles/cool — 默认酷炫:深蓝底 + 蓝青辉光 + 玻璃卡 + 4 色 accent ramp。
2
2
  皮肤层:定义 layouts/*.tpl 用到的全部语义 class。换 skin 只换这一个文件。 */
3
3
  :root{
4
+ /* 排版节奏 — layouts 的字号与页边距都写成 calc(N * var(--…-scale,1)),
5
+ 所以皮肤可以在不碰任何 layout 的前提下定义自己的疏密。基准。 */
6
+ --space-scale:1.0; --type-scale:1.0;
4
7
  --accent:#7DE2D1; --c1:#7DE2D1; --c2:#A9B4FF; --c3:#E7C08A; --c4:#E6A0B0; --chart-1:#35B0A0;
5
8
  --title:#F4F8FF; --body:#93A0BE; --muted:#6E7A98; --foot:#5C6885;
6
9
  --hair:rgba(255,255,255,.08); --card-radius:18px; --glow:0 0 18px var(--accent);
7
- --font-head:'Avenir Next','Futura','Helvetica Neue','PingFang SC','Hiragino Sans GB',sans-serif;
8
- --font-body:'Helvetica Neue','PingFang SC',sans-serif;
10
+ --font-head:'Sora','PingFang SC','Noto Sans SC','Hiragino Sans GB',sans-serif;
11
+ --font-body:'Sora','PingFang SC','Noto Sans SC','Hiragino Sans GB',sans-serif;
9
12
  /* theme-compat vars: SKELETON_CSS's section.slide h1/h2/h3 + section.slide out-specify
10
13
  the skin's .cover-title/.slide, so titles/body fall back to these — define them so
11
14
  --style alone fully colors the deck (else headings render dark on the dark bg). */
@@ -0,0 +1,4 @@
1
+ <!-- generated by scripts/ppt-tpl/gen-skin.mjs — signature: corner-marks -->
2
+ <div style="position:absolute;inset:0;background:#1A252B"></div>
3
+ <div style="position:absolute;left:56px;top:56px;border-left:2px solid var(--accent);border-top:2px solid var(--accent);width:34px;height:34px;pointer-events:none"></div>
4
+ <div style="position:absolute;right:56px;bottom:56px;border-right:2px solid var(--accent);border-bottom:2px solid var(--accent);width:34px;height:34px;pointer-events:none"></div>
@@ -0,0 +1,27 @@
1
+ /* styles/dark-glass — generated by scripts/ppt-tpl/gen-skin.mjs from ppt-tpl/families/dark-glass/family.json.
2
+ 手改会在下次生成时丢失:要改就改 family.json。 */
3
+ :root{
4
+ --space-scale:1.06; --type-scale:0.98;
5
+ --accent:#1EC2D2; --c1:#1EC2D2; --c2:#46BBFC; --c3:#B0A7FB; --c4:#F292CB; --chart-1:#1EC2D2;
6
+ --title:#EEF5F8; --body:#B4BDC2; --muted:#7D8589; --foot:#7D8589;
7
+ --hair:#3D484F; --card-radius:4px;
8
+ --font-head:'Space Grotesk','Noto Sans SC',sans-serif;
9
+ --font-body:'Inter','Noto Sans SC',sans-serif;
10
+ --title-color:#EEF5F8; --body-color:#B4BDC2; --slide-bg:#1A252B; --font-heading:var(--font-head);
11
+ }
12
+ .slide{background:#1A252B;color:var(--body);font-family:var(--font-body)}
13
+ .slide-backdrop{position:absolute;inset:0;background:#1A252B}
14
+ .deck-header,.deck-footer,.deck-pageno{color:var(--muted)}
15
+ .rule,.rule-foot{background:var(--hair)}
16
+ .eyebrow{color:var(--accent);letter-spacing:.22em;font-weight:700}
17
+ .accent-bar{background:var(--accent)}
18
+ .deck-title,.cover-title,.section-title,.ending-title{color:var(--title);font-family:var(--font-head);font-weight:700}
19
+ .cover-sub,.ending-sub,.section-desc{color:var(--muted)}
20
+ .card{border-radius:var(--card-radius);background:transparent;border:1px solid var(--hair)}
21
+ .card-idx{color:var(--muted)} .card-body{color:var(--body)} .card-title{color:var(--title)}
22
+ .card-grid .card:nth-child(4n+1) .card-rail,.card-grid .card:nth-child(4n+1) .card-dot{background:var(--c1)}
23
+ .card-grid .card:nth-child(4n+2) .card-rail,.card-grid .card:nth-child(4n+2) .card-dot{background:var(--c2)}
24
+ .card-grid .card:nth-child(4n+3) .card-rail,.card-grid .card:nth-child(4n+3) .card-dot{background:var(--c3)}
25
+ .card-grid .card:nth-child(4n+4) .card-rail,.card-grid .card:nth-child(4n+4) .card-dot{background:var(--c4)}
26
+ .kpi-num,.stat-num{color:var(--title);font-family:var(--font-head)}
27
+ .kpi-label,.stat-unit{color:var(--muted)} .stat-lead{color:var(--title)} .stat-note{color:var(--body)}
@@ -0,0 +1,4 @@
1
+ <!-- generated by scripts/ppt-tpl/gen-skin.mjs — signature: header-band -->
2
+ <div style="position:absolute;inset:0;background:#F6FAFD"></div>
3
+ <div style="position:absolute;left:0;right:0;top:0;height:5px;background:var(--accent);opacity:.92;pointer-events:none"></div>
4
+ <div style="position:absolute;left:0;top:0;width:60px;height:16px;background:var(--accent);pointer-events:none"></div>
@@ -0,0 +1,27 @@
1
+ /* styles/gov-brief — generated by scripts/ppt-tpl/gen-skin.mjs from ppt-tpl/families/gov-brief/family.json.
2
+ 手改会在下次生成时丢失:要改就改 family.json。 */
3
+ :root{
4
+ --space-scale:1; --type-scale:0.96;
5
+ --accent:#04557A; --c1:#04557A; --c2:#514884; --c3:#80365E; --c4:#843931; --chart-1:#04557A;
6
+ --title:#23292D; --body:#4C5154; --muted:#787D81; --foot:#787D81;
7
+ --hair:#CFD8E0; --card-radius:4px;
8
+ --font-head:'Public Sans','Noto Sans SC',sans-serif;
9
+ --font-body:'IBM Plex Sans','Noto Sans SC',sans-serif;
10
+ --title-color:#23292D; --body-color:#4C5154; --slide-bg:#F6FAFD; --font-heading:var(--font-head);
11
+ }
12
+ .slide{background:#F6FAFD;color:var(--body);font-family:var(--font-body)}
13
+ .slide-backdrop{position:absolute;inset:0;background:#F6FAFD}
14
+ .deck-header,.deck-footer,.deck-pageno{color:var(--muted)}
15
+ .rule,.rule-foot{background:var(--hair)}
16
+ .eyebrow{color:var(--accent);letter-spacing:.22em;font-weight:700}
17
+ .accent-bar{background:var(--accent)}
18
+ .deck-title,.cover-title,.section-title,.ending-title{color:var(--title);font-family:var(--font-head);font-weight:700}
19
+ .cover-sub,.ending-sub,.section-desc{color:var(--muted)}
20
+ .card{border-radius:var(--card-radius);background:transparent;border:1px solid var(--hair)}
21
+ .card-idx{color:var(--muted)} .card-body{color:var(--body)} .card-title{color:var(--title)}
22
+ .card-grid .card:nth-child(4n+1) .card-rail,.card-grid .card:nth-child(4n+1) .card-dot{background:var(--c1)}
23
+ .card-grid .card:nth-child(4n+2) .card-rail,.card-grid .card:nth-child(4n+2) .card-dot{background:var(--c2)}
24
+ .card-grid .card:nth-child(4n+3) .card-rail,.card-grid .card:nth-child(4n+3) .card-dot{background:var(--c3)}
25
+ .card-grid .card:nth-child(4n+4) .card-rail,.card-grid .card:nth-child(4n+4) .card-dot{background:var(--c4)}
26
+ .kpi-num,.stat-num{color:var(--title);font-family:var(--font-head)}
27
+ .kpi-label,.stat-unit{color:var(--muted)} .stat-lead{color:var(--title)} .stat-note{color:var(--body)}