@taloswork/ose-shared 0.1.3 → 0.1.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 (138) hide show
  1. package/package.json +3 -3
  2. package/skills/document/SKILL.md +54 -47
  3. package/skills/document/assets/fonts/ChakraPetch-600.woff2 +0 -0
  4. package/skills/document/assets/fonts/DMSerifDisplay-400.woff2 +0 -0
  5. package/skills/document/assets/fonts/Lexend-500.woff2 +0 -0
  6. package/skills/document/assets/fonts/Nunito-700.woff2 +0 -0
  7. package/skills/document/assets/fonts/PlayfairDisplay-600.woff2 +0 -0
  8. package/skills/document/assets/fonts/Quicksand-600.woff2 +0 -0
  9. package/skills/document/assets/fonts/SpaceGrotesk-500.woff2 +0 -0
  10. package/skills/document/assets/fonts/Syne-700.woff2 +0 -0
  11. package/skills/document/assets/fonts/ZillaSlab-600.woff2 +0 -0
  12. package/skills/document/assets/fonts/fonts.json +314 -216
  13. package/skills/document/bin/html2pptx.cjs +7 -5
  14. package/skills/document/catalog.json +37 -19
  15. package/skills/document/layouts/README.md +1 -0
  16. package/skills/document/layouts/big-stat.tpl +1 -1
  17. package/skills/document/layouts/quote-aside.tpl +11 -0
  18. package/skills/document/layouts/slots.json +1 -1
  19. package/skills/document/motion/README.md +19 -1
  20. package/skills/document/motion/anthropic.json +29 -0
  21. package/skills/document/motion/apple.json +41 -0
  22. package/skills/document/motion/bistro-warm.json +16 -0
  23. package/skills/document/motion/black-gold.json +29 -0
  24. package/skills/document/motion/board-brief.json +14 -0
  25. package/skills/document/motion/bold-clash.json +16 -0
  26. package/skills/document/motion/branding.json +22 -0
  27. package/skills/document/motion/campus-teal.json +22 -0
  28. package/skills/document/motion/cinereel.json +23 -0
  29. package/skills/document/motion/clinic-care.json +22 -0
  30. package/skills/document/motion/cool.json +41 -0
  31. package/skills/document/motion/dark-glass.json +22 -0
  32. package/skills/document/motion/gov-brief.json +14 -0
  33. package/skills/document/motion/grid-tech.json +16 -0
  34. package/skills/document/motion/hand-drawn.json +23 -0
  35. package/skills/document/motion/ivory-gold.json +22 -0
  36. package/skills/document/motion/legal-slate.json +15 -0
  37. package/skills/document/motion/magazine-ink.json +29 -0
  38. package/skills/document/motion/mckinsey.json +28 -0
  39. package/skills/document/motion/memphis.json +16 -0
  40. package/skills/document/motion/mono.json +21 -0
  41. package/skills/document/motion/neon-cyber.json +42 -0
  42. package/skills/document/motion/olive-gold.json +22 -0
  43. package/skills/document/motion/organic-earth.json +15 -0
  44. package/skills/document/motion/pastel-saas.json +15 -0
  45. package/skills/document/motion/portfolio-noir.json +21 -0
  46. package/skills/document/motion/press-room.json +14 -0
  47. package/skills/document/motion/retro-press.json +15 -0
  48. package/skills/document/motion/sport-arena.json +16 -0
  49. package/skills/document/motion/swiss-grid.json +34 -0
  50. package/skills/document/motion/wedding-blush.json +15 -0
  51. package/skills/document/packs/README.md +20 -1
  52. package/skills/document/packs/board-brief/backdrop.html +4 -0
  53. package/skills/document/packs/board-brief/layouts/cover.tpl +12 -0
  54. package/skills/document/packs/board-brief/layouts/toc-agenda.tpl +20 -0
  55. package/skills/document/packs/board-brief/pack.css +27 -0
  56. package/skills/document/packs/press-room/backdrop.html +4 -0
  57. package/skills/document/packs/press-room/layouts/cover.tpl +12 -0
  58. package/skills/document/packs/press-room/layouts/section.tpl +13 -0
  59. package/skills/document/packs/press-room/pack.css +27 -0
  60. package/skills/document/styles/README.md +32 -4
  61. package/skills/document/styles/_samples/_groups/biz-premium.webp +0 -0
  62. package/skills/document/styles/_samples/_groups/creative.webp +0 -0
  63. package/skills/document/styles/_samples/_groups/editorial.webp +0 -0
  64. package/skills/document/styles/_samples/_groups/minimal.webp +0 -0
  65. package/skills/document/styles/_samples/_groups/natural.webp +0 -0
  66. package/skills/document/styles/_samples/_groups/tech-future.webp +0 -0
  67. package/skills/document/styles/_samples/anthropic.webp +0 -0
  68. package/skills/document/styles/_samples/apple.webp +0 -0
  69. package/skills/document/styles/_samples/bistro-warm.webp +0 -0
  70. package/skills/document/styles/_samples/black-gold.webp +0 -0
  71. package/skills/document/styles/_samples/board-brief.webp +0 -0
  72. package/skills/document/styles/_samples/bold-clash.webp +0 -0
  73. package/skills/document/styles/_samples/campus-teal.webp +0 -0
  74. package/skills/document/styles/_samples/cinereel.webp +0 -0
  75. package/skills/document/styles/_samples/clinic-care.webp +0 -0
  76. package/skills/document/styles/_samples/cool.webp +0 -0
  77. package/skills/document/styles/_samples/dark-glass.webp +0 -0
  78. package/skills/document/styles/_samples/gov-brief.webp +0 -0
  79. package/skills/document/styles/_samples/grid-tech.webp +0 -0
  80. package/skills/document/styles/_samples/hand-drawn.webp +0 -0
  81. package/skills/document/styles/_samples/ivory-gold.webp +0 -0
  82. package/skills/document/styles/_samples/legal-slate.webp +0 -0
  83. package/skills/document/styles/_samples/magazine-ink.webp +0 -0
  84. package/skills/document/styles/_samples/memphis.webp +0 -0
  85. package/skills/document/styles/_samples/mono.webp +0 -0
  86. package/skills/document/styles/_samples/neon-cyber.webp +0 -0
  87. package/skills/document/styles/_samples/olive-gold.webp +0 -0
  88. package/skills/document/styles/_samples/organic-earth.webp +0 -0
  89. package/skills/document/styles/_samples/pastel-saas.webp +0 -0
  90. package/skills/document/styles/_samples/portfolio-noir.webp +0 -0
  91. package/skills/document/styles/_samples/press-room.webp +0 -0
  92. package/skills/document/styles/_samples/retro-press.webp +0 -0
  93. package/skills/document/styles/_samples/sport-arena.webp +0 -0
  94. package/skills/document/styles/_samples/wedding-blush.webp +0 -0
  95. package/skills/document/styles/anthropic/skin.css +1 -1
  96. package/skills/document/styles/bistro-warm/backdrop.html +4 -0
  97. package/skills/document/styles/bistro-warm/skin.css +27 -0
  98. package/skills/document/styles/black-gold/skin.css +1 -1
  99. package/skills/document/styles/bold-clash/backdrop.html +4 -0
  100. package/skills/document/styles/bold-clash/skin.css +27 -0
  101. package/skills/document/styles/branding/skin.css +1 -1
  102. package/skills/document/styles/campus-teal/backdrop.html +3 -0
  103. package/skills/document/styles/campus-teal/skin.css +27 -0
  104. package/skills/document/styles/cinereel/skin.css +2 -2
  105. package/skills/document/styles/clinic-care/backdrop.html +4 -0
  106. package/skills/document/styles/clinic-care/skin.css +27 -0
  107. package/skills/document/styles/dark-glass/backdrop.html +4 -0
  108. package/skills/document/styles/dark-glass/skin.css +27 -0
  109. package/skills/document/styles/gov-brief/backdrop.html +4 -0
  110. package/skills/document/styles/gov-brief/skin.css +27 -0
  111. package/skills/document/styles/grid-tech/backdrop.html +37 -0
  112. package/skills/document/styles/grid-tech/skin.css +27 -0
  113. package/skills/document/styles/hand-drawn/skin.css +2 -2
  114. package/skills/document/styles/ivory-gold/skin.css +2 -2
  115. package/skills/document/styles/legal-slate/backdrop.html +6 -0
  116. package/skills/document/styles/legal-slate/skin.css +27 -0
  117. package/skills/document/styles/magazine-ink/skin.css +1 -1
  118. package/skills/document/styles/memphis/backdrop.html +5 -0
  119. package/skills/document/styles/memphis/skin.css +27 -0
  120. package/skills/document/styles/mono/skin.css +1 -1
  121. package/skills/document/styles/neon-cyber/backdrop.html +4 -0
  122. package/skills/document/styles/neon-cyber/skin.css +27 -0
  123. package/skills/document/styles/olive-gold/skin.css +1 -1
  124. package/skills/document/styles/organic-earth/backdrop.html +4 -0
  125. package/skills/document/styles/organic-earth/skin.css +27 -0
  126. package/skills/document/styles/pastel-saas/backdrop.html +4 -0
  127. package/skills/document/styles/pastel-saas/skin.css +27 -0
  128. package/skills/document/styles/portfolio-noir/backdrop.html +4 -0
  129. package/skills/document/styles/portfolio-noir/skin.css +27 -0
  130. package/skills/document/styles/retro-press/backdrop.html +6 -0
  131. package/skills/document/styles/retro-press/skin.css +27 -0
  132. package/skills/document/styles/sport-arena/backdrop.html +4 -0
  133. package/skills/document/styles/sport-arena/skin.css +27 -0
  134. package/skills/document/styles/wedding-blush/backdrop.html +6 -0
  135. package/skills/document/styles/wedding-blush/skin.css +27 -0
  136. package/skills/image-compose/LICENSE.txt +30 -0
  137. package/skills/image-compose/SKILL.md +137 -0
  138. package/skills/image-compose/bin/html2img.cjs +122 -0
@@ -0,0 +1,22 @@
1
+ {
2
+ "transition": {
3
+ "effect": "fade",
4
+ "durMs": 600
5
+ },
6
+ "entrance": {
7
+ "cover": [
8
+ {
9
+ "sel": ".cover-sub",
10
+ "anim": "fade",
11
+ "delay": 300
12
+ }
13
+ ],
14
+ "cards": [
15
+ {
16
+ "sel": ".card",
17
+ "anim": "fade",
18
+ "stagger": 160
19
+ }
20
+ ]
21
+ }
22
+ }
@@ -0,0 +1,15 @@
1
+ {
2
+ "transition": {
3
+ "effect": "fade",
4
+ "durMs": 420
5
+ },
6
+ "entrance": {
7
+ "cover": [
8
+ {
9
+ "sel": ".cover-sub",
10
+ "anim": "fade",
11
+ "delay": 200
12
+ }
13
+ ]
14
+ }
15
+ }
@@ -0,0 +1,29 @@
1
+ {
2
+ "transition": {
3
+ "effect": "dissolve",
4
+ "durMs": 460
5
+ },
6
+ "entrance": {
7
+ "cover": [
8
+ {
9
+ "sel": ".cover-title",
10
+ "anim": "fade-up",
11
+ "dur": 700
12
+ }
13
+ ],
14
+ "section": [
15
+ {
16
+ "sel": ".section-desc",
17
+ "anim": "fade",
18
+ "delay": 180
19
+ }
20
+ ],
21
+ "cards": [
22
+ {
23
+ "sel": ".card",
24
+ "anim": "fade",
25
+ "stagger": 130
26
+ }
27
+ ]
28
+ }
29
+ }
@@ -0,0 +1,28 @@
1
+ {
2
+ "transition": {
3
+ "effect": "cut"
4
+ },
5
+ "entrance": {
6
+ "cover": [
7
+ {
8
+ "sel": ".cover-title",
9
+ "anim": "fade",
10
+ "dur": 400
11
+ }
12
+ ],
13
+ "cards": [
14
+ {
15
+ "sel": ".card",
16
+ "anim": "appear",
17
+ "stagger": 80
18
+ }
19
+ ],
20
+ "stat": [
21
+ {
22
+ "sel": ".stat-lead",
23
+ "anim": "fade",
24
+ "delay": 160
25
+ }
26
+ ]
27
+ }
28
+ }
@@ -0,0 +1,16 @@
1
+ {
2
+ "transition": {
3
+ "effect": "push",
4
+ "dir": "u",
5
+ "durMs": 360
6
+ },
7
+ "entrance": {
8
+ "cards": [
9
+ {
10
+ "sel": ".card",
11
+ "anim": "fly-up",
12
+ "stagger": 150
13
+ }
14
+ ]
15
+ }
16
+ }
@@ -0,0 +1,21 @@
1
+ {
2
+ "transition": {
3
+ "effect": "cut"
4
+ },
5
+ "entrance": {
6
+ "cover": [
7
+ {
8
+ "sel": ".cover-title",
9
+ "anim": "fade",
10
+ "dur": 500
11
+ }
12
+ ],
13
+ "cards": [
14
+ {
15
+ "sel": ".card",
16
+ "anim": "fade",
17
+ "stagger": 90
18
+ }
19
+ ]
20
+ }
21
+ }
@@ -0,0 +1,42 @@
1
+ {
2
+ "transition": {
3
+ "effect": "push",
4
+ "dir": "l",
5
+ "durMs": 380
6
+ },
7
+ "entrance": {
8
+ "cover": [
9
+ {
10
+ "sel": ".cover-title",
11
+ "anim": "fade-up",
12
+ "dur": 700
13
+ },
14
+ {
15
+ "sel": ".cover-sub",
16
+ "anim": "fade-up",
17
+ "delay": 140
18
+ }
19
+ ],
20
+ "section": [
21
+ {
22
+ "sel": ".section-title",
23
+ "anim": "fly-up",
24
+ "delay": 120
25
+ }
26
+ ],
27
+ "cards": [
28
+ {
29
+ "sel": ".card",
30
+ "anim": "fade-up",
31
+ "stagger": 140
32
+ }
33
+ ],
34
+ "stat": [
35
+ {
36
+ "sel": ".stat-num",
37
+ "anim": "appear",
38
+ "delay": 240
39
+ }
40
+ ]
41
+ }
42
+ }
@@ -0,0 +1,22 @@
1
+ {
2
+ "transition": {
3
+ "effect": "dissolve",
4
+ "durMs": 560
5
+ },
6
+ "entrance": {
7
+ "cover": [
8
+ {
9
+ "sel": ".cover-sub",
10
+ "anim": "fade-up",
11
+ "delay": 260
12
+ }
13
+ ],
14
+ "cards": [
15
+ {
16
+ "sel": ".card",
17
+ "anim": "fade",
18
+ "stagger": 140
19
+ }
20
+ ]
21
+ }
22
+ }
@@ -0,0 +1,15 @@
1
+ {
2
+ "transition": {
3
+ "effect": "fade",
4
+ "durMs": 400
5
+ },
6
+ "entrance": {
7
+ "cover": [
8
+ {
9
+ "sel": ".cover-sub",
10
+ "anim": "fade-up",
11
+ "dur": 800
12
+ }
13
+ ]
14
+ }
15
+ }
@@ -0,0 +1,15 @@
1
+ {
2
+ "transition": {
3
+ "effect": "fade",
4
+ "durMs": 340
5
+ },
6
+ "entrance": {
7
+ "cards": [
8
+ {
9
+ "sel": ".card",
10
+ "anim": "fade-up",
11
+ "stagger": 130
12
+ }
13
+ ]
14
+ }
15
+ }
@@ -0,0 +1,21 @@
1
+ {
2
+ "transition": {
3
+ "effect": "cut"
4
+ },
5
+ "entrance": {
6
+ "cover": [
7
+ {
8
+ "sel": ".cover-title",
9
+ "anim": "fade-up",
10
+ "dur": 640
11
+ }
12
+ ],
13
+ "cards": [
14
+ {
15
+ "sel": ".card",
16
+ "anim": "appear",
17
+ "stagger": 90
18
+ }
19
+ ]
20
+ }
21
+ }
@@ -0,0 +1,14 @@
1
+ {
2
+ "transition": {
3
+ "effect": "cut"
4
+ },
5
+ "entrance": {
6
+ "cards": [
7
+ {
8
+ "sel": ".card",
9
+ "anim": "fade",
10
+ "stagger": 100
11
+ }
12
+ ]
13
+ }
14
+ }
@@ -0,0 +1,15 @@
1
+ {
2
+ "transition": {
3
+ "effect": "dissolve",
4
+ "durMs": 420
5
+ },
6
+ "entrance": {
7
+ "cover": [
8
+ {
9
+ "sel": ".cover-sub",
10
+ "anim": "fade",
11
+ "delay": 200
12
+ }
13
+ ]
14
+ }
15
+ }
@@ -0,0 +1,16 @@
1
+ {
2
+ "transition": {
3
+ "effect": "push",
4
+ "dir": "l",
5
+ "durMs": 280
6
+ },
7
+ "entrance": {
8
+ "cards": [
9
+ {
10
+ "sel": ".card",
11
+ "anim": "fly-left",
12
+ "stagger": 90
13
+ }
14
+ ]
15
+ }
16
+ }
@@ -0,0 +1,34 @@
1
+ {
2
+ "transition": {
3
+ "effect": "wipe",
4
+ "dir": "l",
5
+ "durMs": 260
6
+ },
7
+ "entrance": {
8
+ "cover": [
9
+ {
10
+ "sel": ".cover-title",
11
+ "anim": "appear"
12
+ },
13
+ {
14
+ "sel": ".cover-sub",
15
+ "anim": "fade",
16
+ "delay": 120
17
+ }
18
+ ],
19
+ "cards": [
20
+ {
21
+ "sel": ".card",
22
+ "anim": "appear",
23
+ "stagger": 70
24
+ }
25
+ ],
26
+ "stat": [
27
+ {
28
+ "sel": ".stat-num",
29
+ "anim": "appear",
30
+ "delay": 140
31
+ }
32
+ ]
33
+ }
34
+ }
@@ -0,0 +1,15 @@
1
+ {
2
+ "transition": {
3
+ "effect": "dissolve",
4
+ "durMs": 520
5
+ },
6
+ "entrance": {
7
+ "cover": [
8
+ {
9
+ "sel": ".cover-sub",
10
+ "anim": "fade",
11
+ "delay": 280
12
+ }
13
+ ]
14
+ }
15
+ }
@@ -6,4 +6,23 @@ pack = 实现完整 class 契约的 `pack.css` **加上**一组包专属签名
6
6
  包自带的 `layouts/<id>.tpl` 与共享同名时**包内优先**(同名遮蔽)。
7
7
 
8
8
  目录结构见 `docs/superpowers/specs/2026-09-01-ppt-tpl-prod-design.md` §5.3。
9
- P0 不产出任何 pack;首批 2 个包在 P1 落地。
9
+
10
+ ## 两条硬约束(都有闸门)
11
+
12
+ 1. **遮蔽版式不得引入新槽位**。`deck-build` 用共享 `layouts/slots.json` 校验 spec,
13
+ 包内版式并不单独登记:自己发明一个槽位,模型读不到、用户填了还会被整份拒绝。
14
+ 更根本的是可移植性——同一份 spec 换个 `--style` 就该照样出得来。
15
+ 2. **包内版式可以带颜色,但只能引用 `pack.css` 声明的变量**,禁止裸十六进制。
16
+
17
+ ## 现有的包
18
+
19
+ | pack | 大类 | 遮蔽的版式 | 签名 |
20
+ |---|---|---|---|
21
+ | **board-brief** 董事会简报 | biz-premium | `cover`(顶部密级条 + 标题压到中轴以下,共享版靠留白撑气势)· `toc-agenda`(编号/议题/时长的表格式议程,共享版是卡片列表) | 四角角标 |
22
+ | **press-room** 报刊头版 | editorial | `cover`(报头通栏 + 三分之二版大标题)· `section`(左栏轴 + 并列刊号,共享版是幽灵数字压在标题后)· `quote`(左侧巨型引号 + 右侧不对称引文,共享版是居中) | 顶部报头条 |
23
+
24
+ ## 新增一个包
25
+
26
+ 见 `.claude/skills/ppt-tpl-prod/SKILL.md` 的"新增一个 pack"。`pack.css` 由
27
+ `gen-skin.mjs <id> --pack` 从 `ppt-tpl/families/<id>/family.json` 生成,与 skin
28
+ 的 CSS 完全同构;专属版式是手写的结构创新,不由生成器产。
@@ -0,0 +1,4 @@
1
+ <!-- generated by scripts/ppt-tpl/gen-skin.mjs — signature: corner-marks -->
2
+ <div style="position:absolute;inset:0;background:#F4FAFF"></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,12 @@
1
+ <!-- packs/board-brief/layouts/cover — 包内签名版式,遮蔽共享 cover。
2
+ 治理文件封面:顶部密级/文件条(实心块 + 通栏细线),标题左对齐但压低到版面中轴
3
+ 以下,底部两栏署名。共享 cover 把标题放在 332px 并靠留白撑气势,这里相反:
4
+ 气势让位于"这是一份可归档的文件"。槽位与共享 cover 完全一致。 -->
5
+ <section class="slide" data-layout="cover" style="position:relative;width:1280px;height:720px;overflow:hidden"><div class="slide-backdrop"></div>
6
+ <div class="accent-bar" style="position:absolute;left:0;top:0;width:296px;height:34px"></div>
7
+ <div class="eyebrow" style="position:absolute;left:calc(96px * var(--space-scale,1));top:9px;font-size:calc(12px * var(--type-scale,1));letter-spacing:.4em;color:var(--slide-bg)">{{eyebrow|内部资料 · 请勿外传}}</div>
8
+ <div class="rule" style="position:absolute;left:0;right:0;top:34px;height:1px"></div>
9
+ <h1 class="cover-title" style="position:absolute;left:calc(96px * var(--space-scale,1));right:calc(200px * var(--space-scale,1));top:404px;font-size:calc(62px * var(--type-scale,1));line-height:1.16;letter-spacing:-.5px">{{title|2026 年第三季度<br>经营情况汇报}}</h1>
10
+ <div class="rule" style="position:absolute;left:calc(96px * var(--space-scale,1));right:calc(96px * var(--space-scale,1));top:556px;height:1px"></div>
11
+ <p class="cover-sub" style="position:absolute;left:calc(96px * var(--space-scale,1));right:calc(96px * var(--space-scale,1));top:576px;font-size:calc(17px * var(--type-scale,1));line-height:1.6">{{subtitle|提交董事会审议}}</p>
12
+ <div class="deck-footer" style="position:absolute;left:calc(96px * var(--space-scale,1));right:calc(96px * var(--space-scale,1));bottom:38px;display:flex;justify-content:space-between;font-size:calc(12px * var(--type-scale,1));letter-spacing:.08em"><span>{{presenter|汇报人 · 部门}}</span><span>{{date|2026-09}}</span></div></section>
@@ -0,0 +1,20 @@
1
+ <!-- packs/board-brief/layouts/toc-agenda — 包内签名版式,遮蔽共享 toc-agenda。
2
+ 议程表:每一项是一整行(编号 / 议题 / 时长),行间用细线分隔,像会议纪要的表格,
3
+ 而不是共享版的卡片列表。槽位与共享 toc-agenda 一致。 -->
4
+ <section class="slide" data-layout="toc-agenda" style="position:relative;width:1280px;height:720px;overflow:hidden"><div class="slide-backdrop"></div>
5
+ <div class="eyebrow-row" style="position:absolute;left:calc(96px * var(--space-scale,1));top:96px;display:flex;align-items:center;gap:14px"><span class="accent-bar" style="width:24px;height:2px;display:inline-block"></span><span class="eyebrow" style="font-size:calc(12px * var(--type-scale,1));letter-spacing:.34em">{{eyebrow|AGENDA}}</span></div>
6
+ <h2 class="deck-title" style="position:absolute;left:calc(96px * var(--space-scale,1));top:124px;font-size:calc(42px * var(--type-scale,1));letter-spacing:-.3px">{{title|会议议程}}</h2>
7
+ <div class="rule" style="position:absolute;left:calc(96px * var(--space-scale,1));right:calc(96px * var(--space-scale,1));top:206px;height:1px"></div>
8
+ <div style="position:absolute;left:calc(96px * var(--space-scale,1));right:calc(96px * var(--space-scale,1));top:222px;display:flex;justify-content:space-between;align-items:baseline"><span class="toc-num" style="font-size:calc(15px * var(--type-scale,1));width:56px;display:inline-block">01</span><span class="toc-title" style="flex:1;font-size:calc(21px * var(--type-scale,1))">{{item1_title|上季度经营回顾}}</span><span class="toc-desc" style="font-size:calc(14px * var(--type-scale,1))">{{item1_dur|15 分钟}}</span></div>
9
+ <div class="rule" style="position:absolute;left:calc(96px * var(--space-scale,1));right:calc(96px * var(--space-scale,1));top:274px;height:1px"></div>
10
+ <div style="position:absolute;left:calc(96px * var(--space-scale,1));right:calc(96px * var(--space-scale,1));top:290px;display:flex;justify-content:space-between;align-items:baseline"><span class="toc-num" style="font-size:calc(15px * var(--type-scale,1));width:56px;display:inline-block">02</span><span class="toc-title" style="flex:1;font-size:calc(21px * var(--type-scale,1))">{{item2_title|核心指标与偏差分析}}</span><span class="toc-desc" style="font-size:calc(14px * var(--type-scale,1))">{{item2_dur|20 分钟}}</span></div>
11
+ <div class="rule" style="position:absolute;left:calc(96px * var(--space-scale,1));right:calc(96px * var(--space-scale,1));top:342px;height:1px"></div>
12
+ <div style="position:absolute;left:calc(96px * var(--space-scale,1));right:calc(96px * var(--space-scale,1));top:358px;display:flex;justify-content:space-between;align-items:baseline"><span class="toc-num" style="font-size:calc(15px * var(--type-scale,1));width:56px;display:inline-block">03</span><span class="toc-title" style="flex:1;font-size:calc(21px * var(--type-scale,1))">{{item3_title|下一阶段计划}}</span><span class="toc-desc" style="font-size:calc(14px * var(--type-scale,1))">{{item3_dur|15 分钟}}</span></div>
13
+ <div class="rule" style="position:absolute;left:calc(96px * var(--space-scale,1));right:calc(96px * var(--space-scale,1));top:410px;height:1px"></div>
14
+ <div style="position:absolute;left:calc(96px * var(--space-scale,1));right:calc(96px * var(--space-scale,1));top:426px;display:flex;justify-content:space-between;align-items:baseline"><span class="toc-num" style="font-size:calc(15px * var(--type-scale,1));width:56px;display:inline-block">04</span><span class="toc-title" style="flex:1;font-size:calc(21px * var(--type-scale,1))">{{item4_title|资源与预算申请}}</span><span class="toc-desc" style="font-size:calc(14px * var(--type-scale,1))">{{item4_dur|10 分钟}}</span></div>
15
+ <div class="rule" style="position:absolute;left:calc(96px * var(--space-scale,1));right:calc(96px * var(--space-scale,1));top:478px;height:1px"></div>
16
+ <div style="position:absolute;left:calc(96px * var(--space-scale,1));right:calc(96px * var(--space-scale,1));top:494px;display:flex;justify-content:space-between;align-items:baseline"><span class="toc-num" style="font-size:calc(15px * var(--type-scale,1));width:56px;display:inline-block">05</span><span class="toc-title" style="flex:1;font-size:calc(21px * var(--type-scale,1))">{{item5_title|议案表决}}</span><span class="toc-desc" style="font-size:calc(14px * var(--type-scale,1))">{{item5_dur|10 分钟}}</span></div>
17
+ <div class="rule" style="position:absolute;left:calc(96px * var(--space-scale,1));right:calc(96px * var(--space-scale,1));top:546px;height:1px"></div>
18
+ <div class="rule rule-foot" style="position:absolute;left:calc(96px * var(--space-scale,1));right:calc(96px * var(--space-scale,1));bottom:40px;height:1px"></div>
19
+ <div class="deck-footer" style="position:absolute;left:calc(96px * var(--space-scale,1));bottom:17px;font-size:calc(12px * var(--type-scale,1));letter-spacing:.1em">{{footer|季度经营汇报 / 议程}}</div>
20
+ <div class="deck-pageno" style="position:absolute;right:calc(96px * var(--space-scale,1));bottom:17px;font-size:calc(12px * var(--type-scale,1))">{{pageno|02}}</div></section>
@@ -0,0 +1,27 @@
1
+ /* packs/board-brief — generated by scripts/ppt-tpl/gen-skin.mjs from ppt-tpl/families/board-brief/family.json.
2
+ 手改会在下次生成时丢失:要改就改 family.json。 */
3
+ :root{
4
+ --space-scale:0.96; --type-scale:0.94;
5
+ --accent:#075F8B; --c1:#075F8B; --c2:#634E8E; --c3:#913C61; --c4:#8E4430; --chart-1:#075F8B;
6
+ --title:#202930; --body:#4B5156; --muted:#767D82; --foot:#767D82;
7
+ --hair:#C8D3DC; --card-radius:4px;
8
+ --font-head:'Archivo','Noto Sans SC',sans-serif;
9
+ --font-body:'IBM Plex Sans','Noto Sans SC',sans-serif;
10
+ --title-color:#202930; --body-color:#4B5156; --slide-bg:#F4FAFF; --font-heading:var(--font-head);
11
+ }
12
+ .slide{background:#F4FAFF;color:var(--body);font-family:var(--font-body)}
13
+ .slide-backdrop{position:absolute;inset:0;background:#F4FAFF}
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:#FDF5F0"></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,12 @@
1
+ <!-- packs/press-room/layouts/cover — 包内签名版式,遮蔽共享 cover。
2
+ 报纸头版:顶部通栏报头(双细线夹住的刊名条)+ 中部占三分之二版面的通栏大标题 +
3
+ 底部三栏 meta。与共享 cover 的"左对齐区块"是两种结构,不是同一版式换色。 -->
4
+ <section class="slide" data-layout="cover" style="position:relative;width:1280px;height:720px;overflow:hidden"><div class="slide-backdrop"></div>
5
+ <div class="rule" style="position:absolute;left:72px;right:72px;top:74px;height:2px"></div>
6
+ <div class="eyebrow-row" style="position:absolute;left:72px;right:72px;top:88px;display:flex;justify-content:space-between;align-items:center"><span class="eyebrow" style="font-size:calc(13px * var(--type-scale,1));letter-spacing:.42em">{{eyebrow|THE PRESS ROOM}}</span><span class="eyebrow" style="font-size:calc(13px * var(--type-scale,1));letter-spacing:.42em">{{date|2026 年 9 月}}</span></div>
7
+ <div class="rule" style="position:absolute;left:72px;right:72px;top:118px;height:1px"></div>
8
+ <h1 class="cover-title" style="position:absolute;left:72px;right:72px;top:206px;font-size:calc(104px * var(--type-scale,1));line-height:1.02;letter-spacing:-1.5px">{{title|头版主标题<br>第二行}}</h1>
9
+ <div class="accent-bar" style="position:absolute;left:72px;top:474px;width:180px;height:6px"></div>
10
+ <p class="cover-sub" style="position:absolute;left:72px;right:340px;top:508px;font-size:calc(22px * var(--type-scale,1));line-height:1.5">{{subtitle|一句导语,交代这次要讲的是什么。}}</p>
11
+ <div class="rule rule-foot" style="position:absolute;left:72px;right:72px;bottom:66px;height:1px"></div>
12
+ <div class="deck-footer" style="position:absolute;left:72px;bottom:36px;font-size:calc(13px * var(--type-scale,1));letter-spacing:.06em">{{presenter|署名 · 部门}}</div></section>
@@ -0,0 +1,13 @@
1
+ <!-- packs/press-room/layouts/section — 包内签名版式,遮蔽共享 section。
2
+ 栏目页:左侧一根到底的强调色栏轴 + 竖排刊号,右侧标题与导语。共享 section 是
3
+ "巨型幽灵数字压在标题后面",两者的结构关系相反(这里数字与文字并列不重叠)。 -->
4
+ <section class="slide" data-layout="section" style="position:relative;width:1280px;height:720px;overflow:hidden"><div class="slide-backdrop"></div>
5
+ <div class="accent-bar" style="position:absolute;left:96px;top:132px;bottom:132px;width:6px"></div>
6
+ <div class="section-ghost" style="position:absolute;left:136px;top:150px;font-weight:700;line-height:.9;font-size:calc(148px * var(--type-scale,1));letter-spacing:-4px">{{index|01}}</div>
7
+ <div class="eyebrow" style="position:absolute;left:142px;top:318px;font-size:calc(13px * var(--type-scale,1));letter-spacing:.42em">{{eyebrow|CHAPTER}}</div>
8
+ <h2 class="section-title" style="position:absolute;left:470px;right:96px;top:150px;font-size:calc(72px * var(--type-scale,1));line-height:1.1;letter-spacing:-.5px">{{title|栏目标题}}</h2>
9
+ <div class="rule" style="position:absolute;left:470px;right:96px;top:330px;height:1px"></div>
10
+ <p class="section-desc" style="position:absolute;left:470px;right:96px;top:362px;font-size:calc(19px * var(--type-scale,1));line-height:1.7">{{desc|一句本栏概述,点出这一章要回答的问题。}}</p>
11
+ <div class="rule rule-foot" style="position:absolute;left:96px;right:96px;bottom:40px;height:1px"></div>
12
+ <div class="deck-footer" style="position:absolute;left:96px;bottom:17px;font-size:calc(12px * var(--type-scale,1));letter-spacing:.1em">{{footer|报告标题 / 栏目}}</div>
13
+ <div class="deck-pageno" style="position:absolute;right:96px;bottom:17px;font-size:calc(12px * var(--type-scale,1))">{{pageno|02}}</div></section>
@@ -0,0 +1,27 @@
1
+ /* packs/press-room — generated by scripts/ppt-tpl/gen-skin.mjs from ppt-tpl/families/press-room/family.json.
2
+ 手改会在下次生成时丢失:要改就改 family.json。 */
3
+ :root{
4
+ --space-scale:1; --type-scale:1;
5
+ --accent:#C12E4C; --c1:#C12E4C; --c2:#896103; --c3:#0B7927; --c4:#117379; --chart-1:#C12E4C;
6
+ --title:#26201D; --body:#564F4B; --muted:#827B76; --foot:#827B76;
7
+ --hair:#CBBFB7; --card-radius:4px;
8
+ --font-head:'Bodoni Moda','Songti SC',sans-serif;
9
+ --font-body:'Public Sans','Noto Sans SC',sans-serif;
10
+ --title-color:#26201D; --body-color:#564F4B; --slide-bg:#FDF5F0; --font-heading:var(--font-head);
11
+ }
12
+ .slide{background:#FDF5F0;color:var(--body);font-family:var(--font-body)}
13
+ .slide-backdrop{position:absolute;inset:0;background:#FDF5F0}
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)}
@@ -28,6 +28,22 @@ layout renders in any skin — see `layouts/README.md` for the current count and
28
28
  | **ivory-gold** | light | 奢华极简 · 品牌手册 · 路演 · 高端零售 | 奶油底 + 青铜金 **Anton** 粗体大写标题(标题=accent)+ **黑色反色区块**(`.slide-inverse`) |
29
29
  | **cinereel** | dark | 影视 · 创意作品集 · 音乐/传媒行业 · 幕后花絮 | 黑底/照片底 + 白色超浓缩粗体大写(Big Shoulders Display,无色相)+ 几何无衬线正文(Jost)+ **常驻胶片取景框**(顶/底黑遮幅条,每页恒定)+ 浅灰面板反色(`.slide-inverse`) |
30
30
  | **magazine-ink** | light | 人文分享 · 行业观察 · 商业发布 · 杂志感演讲 | 瓷白底 + 靛蓝 Noto Serif SC 衬线大标题 + 无衬线正文 + 等宽元数据 + 无阴影无卡片盒(纯发丝线分隔)+ 巨幅淡墨水印章节号 |
31
+ | **neon-cyber** | dark | 科技 · 游戏 · Web3 · 夜场发布 | 深紫夜场 + 品红辉光 + **Jost** 几何无衬线 + **等距网格与右上辉光**(生成族,DNA 见 `ppt-tpl/families/neon-cyber/`) |
32
+ | **dark-glass** | dark | 产品评审 · 技术方案 · 路线图 · 内部汇报 | 石墨灰 + 冰蓝 + **Space Grotesk** + **四角角标** + 最松节奏(`--space-scale:1.06`)(生成族) |
33
+ | **grid-tech** | dark | 工程 · 基础设施 · 数据平台 · 技术大会 | 近黑 + 荧光绿 + **Chakra Petch** 方硬科技体 + **底缘刻度尺** + 最紧节奏(0.92)(生成族) |
34
+ | **pastel-saas** | light | SaaS · 产品提案 · 增长复盘 · 客户成功 | 薰衣草白 + 圆角 **Quicksand** + **地平线色场** + 大留白(1.1)(生成族) |
35
+ | **memphis** | light | 创意提案 · 品牌活动 · 校园分享 · 工作坊 | 米白 + 撞色橙 + **Syne** 反常规展示体 + **右缘阶梯色块**(生成族) |
36
+ | **retro-press** | light | 文化 · 书业 · 展览 · 品牌故事 | 旧纸米黄 + 砖红 + **DM Serif Display** + 宋体系 CJK + **四角裁切框**(生成族) |
37
+ | **bold-clash** | light | 发布造势 · 营销 campaign · 潮牌 · 音乐节 | 亮黄底 + 品红/墨黑 + **Anton** + **左缘书脊带** + 最大字号(1.12)(生成族) |
38
+ | **organic-earth** | light | 可持续 · 农业食品 · 户外 · ESG 报告 | 米绿 + 苔绿陶土 + **Fraunces** + 宋体系 CJK + **地平线**(生成族) |
39
+ | **campus-teal** | light | 教学 · 课件 · 培训 · 校园 | 浅青 + **Lexend** 高可读无衬线 + **点阵底纹** + 大留白(1.06)(生成族) |
40
+ | **clinic-care** | light | 医疗 · 健康科普 · 器械 · 公共卫生 | 洁净浅蓝 + 圆角 **Nunito** + **双层版心细框**(生成族) |
41
+ | **wedding-blush** | light | 婚礼 · 请柬 · 纪念册 · 私人典礼 | 胭脂米白 + **Playfair Display** 高反差衬线 + 宋体系 CJK + **升起的弧**(生成族) |
42
+ | **portfolio-noir** | dark | 作品集 · 个人品牌 · 摄影 · 设计评审 | 炭黑 + 铜金 + **Archivo/Space Grotesk** + **底座色带** + 最松节奏(1.12)(生成族) |
43
+ | **bistro-warm** | light | 餐饮 · 门店 · 食品品牌 · 菜单发布 | 奶油 + 辣椒红 + **Zilla Slab** 板衬线 + **斜切带**(生成族) |
44
+ | **gov-brief** | light | 政务 · 公共事务 · 工作汇报 · 会议材料 | 素白 + 藏蓝 + **Public Sans** + **顶部报头条** + 最紧字号(0.96)(生成族) |
45
+ | **sport-arena** | dark | 赛事 · 体育 · 战报 · 俱乐部 | 夜蓝 + 亮橙 + **Big Shoulders Display** 窄体 + **斜切带** + 紧排(0.92)(生成族) |
46
+ | **legal-slate** | light | 法务 · 合规 · 尽调 · 风险评估 | 石板白 + 墨绿 + **Lora** 衬线 + 宋体系 CJK + **四角裁切框**(生成族) |
31
47
  | **swiss-grid** | light | 科技产品 · 数据汇报 · 设计/工程分享 · 年度总结 | 全无衬线 + 克莱因蓝单色高亮 + 极致字号反差(标题细/KPI 粗)+ 零阴影零圆角零渐变 + 点阵网格底纹 |
32
48
 
33
49
  **Default** — when the user didn't specify: `cool` (酷炫深色). For clean/formal/light
@@ -42,15 +58,27 @@ padding of your own:
42
58
  `branding` → **暖米绿意 · 品牌手册** · `hand-drawn` → **纸感手绘 · 创意教学** ·
43
59
  `mono` → **纯白黑灰 · 极简设计** · `ivory-gold` → **奶油青铜 · 奢华极简** ·
44
60
  `cinereel` → **黑白胶片 · 影视创意** · `magazine-ink` → **瓷白靛蓝 · 杂志人文** ·
45
- `swiss-grid` → **克莱因蓝白 · 瑞士国际**
61
+ `swiss-grid` → **克莱因蓝白 · 瑞士国际** · `neon-cyber` → **霓虹品红 · 赛博夜场** ·
62
+ `dark-glass` → **石墨冰蓝 · 产品评审** · `grid-tech` → **近黑荧绿 · 工程评审** ·
63
+ `pastel-saas` → **薰衣草白 · SaaS 提案** · `memphis` → **米白撞色 · 创意提案** ·
64
+ `retro-press` → **旧纸砖红 · 文化叙事** · `bold-clash` → **亮黄墨黑 · 发布造势** ·
65
+ `organic-earth` → **苔绿陶土 · 可持续** · `campus-teal` → **浅青板书 · 教学课件** ·
66
+ `clinic-care` → **洁净浅蓝 · 医疗健康** · `wedding-blush` → **胭脂米白 · 婚礼请柬** ·
67
+ `portfolio-noir` → **炭黑铜金 · 作品集** · `bistro-warm` → **奶油辣椒红 · 餐饮门店** ·
68
+ `gov-brief` → **素白藏蓝 · 政务汇报** · `sport-arena` → **夜场亮橙 · 赛事发布** ·
69
+ `legal-slate` → **石板墨绿 · 法务合规**
46
70
 
47
71
  ## 皮肤靠什么区分(不只是配色)
48
72
 
49
73
  三条正交的轴。只改配色的皮肤会和别的皮肤长得一样 —— 加皮肤时三条都要想过:
50
74
 
51
- 1. **字体** — 每个皮肤的 `--font-head`/`--font-body` 组合都是唯一的,并且 CJK 首选也
52
- 分了宋体系/黑体系/楷体系(纯拉丁字体对中文 deck 不起作用,只有 CJK 栈能拉开中文观感)。
53
- 非系统字体必须在 `assets/fonts/fonts.json` 里登记;**衬线/展示字体还必须 bake**,否则
75
+ 1. **字体** — 每个皮肤的 `--font-head`/`--font-body` 组合都是唯一的,并且 CJK 首选分了
76
+ 宋体系/黑体系(纯拉丁字体对中文 deck 不起作用,只有 CJK 栈能拉开中文观感;楷体系目前
77
+ 没有打包字体,`assets/fonts/` 只有 Noto Sans SC 与 Noto Serif SC 两套 CJK 子集)。
78
+ **字体栈里只允许出现打包字体与通用兜底**(`sans-serif`/`serif`/`cursive`)——写
79
+ `Heiti SC`/`Comic Sans MS`/`Kaiti SC` 这类"某些机器上碰巧有"的名字,渲染结果就取决于
80
+ 跑它的那台机器,像素基线与样图会一起变得不可信。CJK 位置写 `PingFang SC`/`Songti SC`
81
+ 是安全的:它们在 `fonts.json` 里被别名到打包子集。**衬线/展示字体还必须 bake**,否则
54
82
  只在预览里生效、进不了交付的 pptx(见 deck-design.md § Fonts)。
55
83
  2. **结构签名** — `backdrop.html` 里一个有边界的标记:页眉条、裁切框、书脊带、四角角标、
56
84
  刻度尺、地平线。这是 layout 之外唯一能引入**结构**差异的地方,也是同质化最容易发生的