@taloswork/ose-shared 0.0.2 → 0.0.3

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 (124) hide show
  1. package/mcp/gen/mcp.json +26 -0
  2. package/mcp/gen-google/mcp.json +30 -0
  3. package/mcp/gen-seedance/mcp.json +30 -0
  4. package/mcp/gen-seedream/mcp.json +30 -0
  5. package/mcp/gen-veo/mcp.json +30 -0
  6. package/package.json +3 -3
  7. package/skills/document/SKILL.md +11 -7
  8. package/skills/document/assets/fonts/Anton-Regular.woff2 +0 -0
  9. package/skills/document/bin/doc-convert.cjs +983 -936
  10. package/skills/document/bin/doc-gen.cjs +52 -4
  11. package/skills/document/bin/html2pptx.cjs +34 -10
  12. package/skills/document/content-pipeline.md +4 -3
  13. package/skills/document/layouts/README.md +9 -0
  14. package/skills/document/layouts/bento.tpl +1 -1
  15. package/skills/document/layouts/big-stat.tpl +1 -1
  16. package/skills/document/layouts/blocks-2x2.tpl +3 -3
  17. package/skills/document/layouts/brand-values.tpl +1 -1
  18. package/skills/document/layouts/cards-3.tpl +1 -1
  19. package/skills/document/layouts/cards-grid.tpl +1 -1
  20. package/skills/document/layouts/chart-full.tpl +1 -1
  21. package/skills/document/layouts/chart-kpi.tpl +1 -1
  22. package/skills/document/layouts/color-palette.tpl +6 -6
  23. package/skills/document/layouts/comparison.tpl +2 -2
  24. package/skills/document/layouts/concept-hub.tpl +1 -1
  25. package/skills/document/layouts/cover-centered.tpl +1 -1
  26. package/skills/document/layouts/cover-image.tpl +1 -1
  27. package/skills/document/layouts/cover-minimal.tpl +1 -1
  28. package/skills/document/layouts/cover-statement.tpl +1 -1
  29. package/skills/document/layouts/cover.tpl +1 -1
  30. package/skills/document/layouts/data-table.tpl +1 -1
  31. package/skills/document/layouts/dos-donts.tpl +1 -1
  32. package/skills/document/layouts/editorial-panel.tpl +5 -5
  33. package/skills/document/layouts/ending-contact.tpl +1 -1
  34. package/skills/document/layouts/ending.tpl +1 -1
  35. package/skills/document/layouts/funnel.tpl +1 -1
  36. package/skills/document/layouts/gantt.tpl +2 -2
  37. package/skills/document/layouts/hero.tpl +1 -1
  38. package/skills/document/layouts/icon-row.tpl +1 -1
  39. package/skills/document/layouts/image-grid.tpl +1 -1
  40. package/skills/document/layouts/image-left.tpl +1 -1
  41. package/skills/document/layouts/list.tpl +1 -1
  42. package/skills/document/layouts/logo-guidelines.tpl +3 -3
  43. package/skills/document/layouts/map-distribution.tpl +1 -1
  44. package/skills/document/layouts/map-quad.tpl +1 -1
  45. package/skills/document/layouts/matrix-2x2.tpl +1 -1
  46. package/skills/document/layouts/numbered-brief.tpl +3 -3
  47. package/skills/document/layouts/org-tree.tpl +1 -1
  48. package/skills/document/layouts/problem-solution-banner.tpl +12 -0
  49. package/skills/document/layouts/problem-solution.tpl +2 -2
  50. package/skills/document/layouts/pyramid.tpl +1 -1
  51. package/skills/document/layouts/quote.tpl +1 -1
  52. package/skills/document/layouts/radar.tpl +1 -1
  53. package/skills/document/layouts/ring-progress.tpl +1 -1
  54. package/skills/document/layouts/section-fullbleed.tpl +8 -0
  55. package/skills/document/layouts/section-image.tpl +1 -1
  56. package/skills/document/layouts/section-stat.tpl +1 -1
  57. package/skills/document/layouts/section.tpl +1 -1
  58. package/skills/document/layouts/slots.json +763 -1
  59. package/skills/document/layouts/split-two-col.tpl +1 -1
  60. package/skills/document/layouts/stats-chart.tpl +2 -2
  61. package/skills/document/layouts/steps-serpentine.tpl +19 -0
  62. package/skills/document/layouts/steps-vertical.tpl +1 -1
  63. package/skills/document/layouts/steps.tpl +1 -1
  64. package/skills/document/layouts/team-row.tpl +6 -6
  65. package/skills/document/layouts/three-kpi.tpl +1 -1
  66. package/skills/document/layouts/timeline.tpl +1 -1
  67. package/skills/document/layouts/title-meta.tpl +1 -1
  68. package/skills/document/layouts/title.tpl +1 -1
  69. package/skills/document/layouts/toc-agenda.tpl +1 -1
  70. package/skills/document/layouts/toc-panel.tpl +3 -3
  71. package/skills/document/layouts/toc.tpl +1 -1
  72. package/skills/document/layouts/transition.tpl +1 -1
  73. package/skills/document/layouts/two-kpi.tpl +1 -1
  74. package/skills/document/layouts/type-specimen.tpl +3 -3
  75. package/skills/document/layouts/versus.tpl +1 -1
  76. package/skills/document/styles/README.md +42 -6
  77. package/skills/document/styles/_backdrops/arch.html +5 -0
  78. package/skills/document/styles/_backdrops/aurora.html +6 -0
  79. package/skills/document/styles/_backdrops/beam.html +5 -0
  80. package/skills/document/styles/_backdrops/bloom.html +5 -0
  81. package/skills/document/styles/_backdrops/duotone.html +6 -0
  82. package/skills/document/styles/_backdrops/frosted.html +4 -0
  83. package/skills/document/styles/_backdrops/rimlight.html +7 -0
  84. package/skills/document/styles/_backdrops/shared.html +5 -0
  85. package/skills/document/styles/_samples/anthropic.webp +0 -0
  86. package/skills/document/styles/_samples/apple.webp +0 -0
  87. package/skills/document/styles/_samples/black-gold.webp +0 -0
  88. package/skills/document/styles/_samples/branding.webp +0 -0
  89. package/skills/document/styles/_samples/cinereel.webp +0 -0
  90. package/skills/document/styles/_samples/cool.webp +0 -0
  91. package/skills/document/styles/_samples/hand-drawn.webp +0 -0
  92. package/skills/document/styles/_samples/ivory-gold.webp +0 -0
  93. package/skills/document/styles/_samples/magazine-ink.webp +0 -0
  94. package/skills/document/styles/_samples/mckinsey.webp +0 -0
  95. package/skills/document/styles/_samples/mono.webp +0 -0
  96. package/skills/document/styles/_samples/olive-gold.webp +0 -0
  97. package/skills/document/styles/_samples/swiss-grid.webp +0 -0
  98. package/skills/document/styles/anthropic/skin.css +1 -1
  99. package/skills/document/styles/apple/skin.css +1 -1
  100. package/skills/document/styles/black-gold/skin.css +1 -1
  101. package/skills/document/styles/cinereel/backdrop.html +2 -0
  102. package/skills/document/styles/cinereel/skin.css +133 -0
  103. package/skills/document/styles/cool/skin.css +1 -1
  104. package/skills/document/styles/hand-drawn/skin.css +1 -1
  105. package/skills/document/styles/ivory-gold/backdrop.html +15 -0
  106. package/skills/document/styles/ivory-gold/skin.css +137 -0
  107. package/skills/document/styles/magazine-ink/backdrop.html +12 -0
  108. package/skills/document/styles/magazine-ink/skin.css +121 -0
  109. package/skills/document/styles/mckinsey/skin.css +1 -1
  110. package/skills/document/styles/mono/skin.css +1 -1
  111. package/skills/document/styles/swiss-grid/backdrop.html +2 -0
  112. package/skills/document/styles/swiss-grid/skin.css +117 -0
  113. package/skills/document/themes/README.md +5 -1
  114. package/skills/document/themes/cinereel.json +24 -0
  115. package/skills/document/themes/ivory-gold.json +24 -0
  116. package/skills/document/themes/magazine-ink.json +24 -0
  117. package/skills/document/themes/swiss-grid.json +24 -0
  118. package/mcp/Linear/mcp.json +0 -17
  119. package/skills/document/styles/anthropic/backdrop-arch.html +0 -3
  120. package/skills/document/styles/anthropic/backdrop-shared.html +0 -3
  121. package/skills/document/styles/apple/backdrop-shared.html +0 -3
  122. package/skills/document/styles/cool/backdrop-spotlight.html +0 -3
  123. package/skills/document/styles/mckinsey/backdrop-shared.html +0 -3
  124. /package/skills/document/styles/{apple/backdrop-spotlight.html → _backdrops/spotlight.html} +0 -0
@@ -152474,6 +152474,13 @@ function iconSvgDataUri(name, colorHex) {
152474
152474
  function bareHex(c) {
152475
152475
  return c.replace("#", "").toUpperCase();
152476
152476
  }
152477
+ function assertTextDocumentSpec(spec) {
152478
+ if (!spec || typeof spec !== "object")
152479
+ return;
152480
+ if (Object.prototype.hasOwnProperty.call(spec, "section")) {
152481
+ throw new Error("unsupported document field: section (use blocks for DOCX/PDF content; section is PPTX-only)");
152482
+ }
152483
+ }
152477
152484
  var HEADINGS = [HeadingLevel.HEADING_1, HeadingLevel.HEADING_2, HeadingLevel.HEADING_3, HeadingLevel.HEADING_4];
152478
152485
  var ORDERED_REF = "ol";
152479
152486
  var DOCX_TABLE_WIDTH_TWIPS = 9026;
@@ -152551,6 +152558,7 @@ function westFont(name) {
152551
152558
  return name ? { font: { ascii: name, hAnsi: name, cs: name } } : {};
152552
152559
  }
152553
152560
  async function generateDocx(spec, themeInput) {
152561
+ assertTextDocumentSpec(spec);
152554
152562
  const theme = asTheme(themeInput);
152555
152563
  const children = [];
152556
152564
  if (theme.cover.enabled && spec.title) {
@@ -153631,6 +153639,7 @@ function hexRgb(c) {
153631
153639
  return (0, import_pdf_lib.rgb)((n >> 16 & 255) / 255, (n >> 8 & 255) / 255, (n & 255) / 255);
153632
153640
  }
153633
153641
  async function generatePdf(spec, themeInput) {
153642
+ assertTextDocumentSpec(spec);
153634
153643
  const theme = asTheme(themeInput);
153635
153644
  const doc = await import_pdf_lib.PDFDocument.create();
153636
153645
  const fonts = {
@@ -153656,6 +153665,44 @@ async function generatePdf(spec, themeInput) {
153656
153665
  blocks.push({ text: foldFullwidthAlnum(String(spec.title)), style: headingStyle, color: headingColor });
153657
153666
  for (const p of spec.paragraphs ?? [])
153658
153667
  blocks.push({ text: foldFullwidthAlnum(String(p)), style: bodyStyle, color: textColor });
153668
+ for (const block of spec.blocks ?? []) {
153669
+ switch (block.type) {
153670
+ case "heading": {
153671
+ const level = Math.min(Math.max(block.level ?? 1, 1), 4);
153672
+ const key = `h${level}`;
153673
+ const h = theme.heading[key];
153674
+ blocks.push({
153675
+ text: foldFullwidthAlnum(String(block.text)),
153676
+ style: { size: h.size, bold: h.bold, lineHeight: Math.round(h.size * 1.35), spaceAfter: h.spaceAfter },
153677
+ color: hexRgb(resolveColor(theme, h.color))
153678
+ });
153679
+ break;
153680
+ }
153681
+ case "paragraph":
153682
+ blocks.push({ text: foldFullwidthAlnum(String(block.text)), style: { ...bodyStyle, bold: Boolean(block.bold) }, color: textColor });
153683
+ break;
153684
+ case "list":
153685
+ for (const [index, item] of (block.items ?? []).entries()) {
153686
+ blocks.push({
153687
+ // Use an ASCII marker here: the fallback may have no Unicode font
153688
+ // available, while the Chromium HTML path renders real list markers.
153689
+ text: foldFullwidthAlnum(`${block.ordered ? `${index + 1}.` : "-"} ${String(item)}`),
153690
+ style: bodyStyle,
153691
+ color: textColor
153692
+ });
153693
+ }
153694
+ break;
153695
+ case "table":
153696
+ for (const row of block.rows ?? []) {
153697
+ blocks.push({ text: foldFullwidthAlnum(row.map(String).join(" ")), style: bodyStyle, color: textColor });
153698
+ }
153699
+ break;
153700
+ case "image":
153701
+ break;
153702
+ default:
153703
+ throw new Error(`unhandled block type: ${block.type}`);
153704
+ }
153705
+ }
153659
153706
  const segments = blocks.flatMap((b) => b.text.split(/\r?\n/));
153660
153707
  if (segments.some((s) => !canEncode(fonts.latin, s))) {
153661
153708
  const fontPath = resolveUnicodeFontPath(spec);
@@ -153776,6 +153823,7 @@ function blockHtml(b) {
153776
153823
  }
153777
153824
  }
153778
153825
  function specToHtml(spec, themeInput) {
153826
+ assertTextDocumentSpec(spec);
153779
153827
  const theme = themeInput && "warnings" in themeInput ? themeInput : resolveTheme(themeInput);
153780
153828
  const body = [];
153781
153829
  if (theme.cover.enabled) {
@@ -154281,12 +154329,12 @@ function isSingleLineBox(el) {
154281
154329
  return el.frame.h <= linePx * 1.5;
154282
154330
  }
154283
154331
  function compensateTextWidth(el, frame) {
154284
- if (!isSingleLineBox(el))
154285
- return frame;
154332
+ const single = isSingleLineBox(el);
154286
154333
  const cjk = CJK_RE2.test(el.text);
154287
154334
  const pxToIn = el.frame.w > 0 ? frame.w / el.frame.w : 0;
154288
- const floor = cjk ? el.fontSizePx * pxToIn : 0;
154289
- const pad = Math.max(frame.w * (cjk ? 0.1 : 0.05), floor);
154335
+ const floor = (cjk ? el.fontSizePx : el.fontSizePx * 0.45) * pxToIn * (single ? 1 : 0.5);
154336
+ const pct = single ? cjk ? 0.22 : 0.16 : cjk ? 0.1 : 0.06;
154337
+ const pad = Math.max(frame.w * pct, floor);
154290
154338
  const align = el.align ?? "left";
154291
154339
  let x = frame.x;
154292
154340
  if (align === "right")
@@ -72021,8 +72021,8 @@ var require_tmp = __commonJS({
72021
72021
  if (!_isUndefined(options.name)) {
72022
72022
  const name = options.name;
72023
72023
  if (path.isAbsolute(name)) throw new Error(`name option must not contain an absolute path, found "${name}".`);
72024
- const basename = path.basename(name);
72025
- if (basename === ".." || basename === "." || basename !== name) {
72024
+ const basename2 = path.basename(name);
72025
+ if (basename2 === ".." || basename2 === "." || basename2 !== name) {
72026
72026
  throw new Error(`name option must not contain a path, found "${name}".`);
72027
72027
  }
72028
72028
  }
@@ -147185,6 +147185,7 @@ function lintHardcodedColors(html) {
147185
147185
  ];
147186
147186
  }
147187
147187
  var STRUCTURAL_LAYOUTS = /* @__PURE__ */ new Set(["cover", "toc", "section", "transition", "ending", "title"]);
147188
+ var isStructuralLayout = (layout) => STRUCTURAL_LAYOUTS.has(layout) || STRUCTURAL_LAYOUTS.has(layout.split("-")[0]);
147188
147189
  function lintRepeatedLayouts(html) {
147189
147190
  const seq = [];
147190
147191
  for (const m of html.matchAll(/<section\b([^>]*)>/gi)) {
@@ -147205,7 +147206,7 @@ function lintRepeatedLayouts(html) {
147205
147206
  if (s)
147206
147207
  counts.set(s, (counts.get(s) ?? 0) + 1);
147207
147208
  for (const [layout, n] of counts) {
147208
- if (n > 2 && !STRUCTURAL_LAYOUTS.has(layout)) {
147209
+ if (n > 2 && !isStructuralLayout(layout)) {
147209
147210
  out.push(`content layout "${layout}" used ${n}\xD7 across the deck \u2014 cap it at 2 (P3 diversity); vary the layout on the extra slide(s).`);
147210
147211
  }
147211
147212
  }
@@ -147295,12 +147296,12 @@ function isSingleLineBox(el) {
147295
147296
  return el.frame.h <= linePx * 1.5;
147296
147297
  }
147297
147298
  function compensateTextWidth(el, frame) {
147298
- if (!isSingleLineBox(el))
147299
- return frame;
147299
+ const single = isSingleLineBox(el);
147300
147300
  const cjk = CJK_RE.test(el.text);
147301
147301
  const pxToIn = el.frame.w > 0 ? frame.w / el.frame.w : 0;
147302
- const floor = cjk ? el.fontSizePx * pxToIn : 0;
147303
- const pad = Math.max(frame.w * (cjk ? 0.1 : 0.05), floor);
147302
+ const floor = (cjk ? el.fontSizePx : el.fontSizePx * 0.45) * pxToIn * (single ? 1 : 0.5);
147303
+ const pct = single ? cjk ? 0.22 : 0.16 : cjk ? 0.1 : 0.06;
147304
+ const pad = Math.max(frame.w * pct, floor);
147304
147305
  const align = el.align ?? "left";
147305
147306
  let x = frame.x;
147306
147307
  if (align === "right")
@@ -148018,10 +148019,33 @@ async function main() {
148018
148019
  } catch (e) {
148019
148020
  die(`cannot read style ${skinPath}: ${e.message}`, 66);
148020
148021
  }
148021
- const bdVariantPath = bdVariant ? (0, import_node_path.join)(styleDir, `backdrop-${bdVariant}.html`) : null;
148022
- const bdPath = bdVariantPath && (0, import_node_fs.existsSync)(bdVariantPath) ? bdVariantPath : (0, import_node_path.join)(styleDir, "backdrop.html");
148023
- if (bdVariantPath && !(0, import_node_fs.existsSync)(bdVariantPath)) process.stderr.write(`html2pptx: backdrop variant "${bdVariant}" not found for ${styleArg}, using default backdrop.html
148022
+ const sharedBackdropsDir = (0, import_node_path.join)(skillDir, "styles", "_backdrops");
148023
+ const NO_AUTO_BACKDROP_VARIETY = /* @__PURE__ */ new Set(["mckinsey", "mono", "cinereel"]);
148024
+ let bdPath;
148025
+ if (bdVariant) {
148026
+ const ownVariantPath = (0, import_node_path.join)(styleDir, `backdrop-${bdVariant}.html`);
148027
+ const sharedVariantPath = (0, import_node_path.join)(sharedBackdropsDir, `${bdVariant}.html`);
148028
+ if ((0, import_node_fs.existsSync)(ownVariantPath)) bdPath = ownVariantPath;
148029
+ else if ((0, import_node_fs.existsSync)(sharedVariantPath)) bdPath = sharedVariantPath;
148030
+ else {
148031
+ process.stderr.write(`html2pptx: backdrop variant "${bdVariant}" not found for ${styleArg}, using default backdrop.html
148024
148032
  `);
148033
+ bdPath = (0, import_node_path.join)(styleDir, "backdrop.html");
148034
+ }
148035
+ } else if (NO_AUTO_BACKDROP_VARIETY.has((0, import_node_path.basename)(styleDir))) {
148036
+ bdPath = (0, import_node_path.join)(styleDir, "backdrop.html");
148037
+ } else {
148038
+ const ownVariants = (0, import_node_fs.existsSync)(styleDir) ? (0, import_node_fs.readdirSync)(styleDir).filter((f) => /^backdrop.*\.html$/.test(f)).map((f) => (0, import_node_path.join)(styleDir, f)) : [];
148039
+ const sharedVariants = (0, import_node_fs.existsSync)(sharedBackdropsDir) ? (0, import_node_fs.readdirSync)(sharedBackdropsDir).filter((f) => f.endsWith(".html")).map((f) => (0, import_node_path.join)(sharedBackdropsDir, f)) : [];
148040
+ const pool = [...ownVariants, ...sharedVariants].sort();
148041
+ if (pool.length > 0) {
148042
+ let h = 0;
148043
+ for (let i = 0; i < raw.length; i++) h = h * 31 + raw.charCodeAt(i) >>> 0;
148044
+ bdPath = pool[h % pool.length];
148045
+ } else {
148046
+ bdPath = (0, import_node_path.join)(styleDir, "backdrop.html");
148047
+ }
148048
+ }
148025
148049
  if ((0, import_node_fs.existsSync)(bdPath)) backdropHtml = await (0, import_promises.readFile)(bdPath, "utf8");
148026
148050
  const stripLine = (h) => h.replace(/<div class="bd-arc"[\s\S]*?<\/svg><\/div>/g, "");
148027
148051
  if (lineArg === "none") {
@@ -57,15 +57,16 @@ deck, even if the style seems "obvious", all four are asked (only "你决定" by
57
57
  — the full 15 with their logic live in the **Scenario matrix** below). AskUserQuestion
58
58
  caps at 4 **TEXT** options, so **for THIS scenario question** present the **3–4 best-fit
59
59
  for the topic** + let the user type Other (any scenario, listed or not). **This 4-cap is
60
- TEXT-only — it does NOT apply to Q3 (style), which is an IMAGE-CARD pick capped at 12:
60
+ TEXT-only — it does NOT apply to Q3 (style), which is an IMAGE-CARD pick capped at 16:
61
61
  Q3 shows ALL skins, never a shortlist.** Then look the choice up in the matrix (unlisted →
62
62
  map to the nearest row). Record as a short phrase. Scenario is NOT just wording — it
63
63
  locks **five** things at once (tone · density · **required roles** · narrative shape ·
64
64
  page range). Carry them through: required roles = a checklist Phase 2 MUST satisfy
65
65
  (MECE), density feeds Phase 4 §4.2 P2, narrative picks the Phase 2 pyramid, pages seed Q4.
66
66
  3. **Style — pick ONE skin.** By DEFAULT show **EVERY skin as image-card options** —
67
- **all 9 (anthropic · apple · black-gold · branding · cool · hand-drawn · mckinsey ·
68
- mono · olive-gold), NOT a 3–5 shortlist.** Image-card picks are capped at **12**, so the
67
+ **all 13 (anthropic · apple · black-gold · branding · cinereel · cool · hand-drawn ·
68
+ ivory-gold · magazine-ink · mckinsey · mono · olive-gold · swiss-grid), NOT a 3–5
69
+ shortlist.** Image-card picks are capped at **16**, so the
69
70
  4-option TEXT cap does NOT apply here — emit one card per skin every time —
70
71
  one option per skin `{ label: skin 名, description: <the skin's **picker one-liner**
71
72
  from styles/README.md, VERBATIM — one short line, no 首选/风/keynote padding>, imagePath: <absolute
@@ -36,7 +36,9 @@ Each slide carries `data-layout="<id>"` (drives the diversity lint + traceabilit
36
36
  | `cards-3` | content | grid-3 | medium (3) | text-only | 3 个并列要点 |
37
37
  | `cards-grid` | content | grid-6 | dense (5–6) | text-only | 5–6 项密集 |
38
38
  | `comparison` | content | 3-col compare + recommend | medium (3 opts) | text-only | 方案对比 / 推荐 |
39
+ | `problem-solution-banner` | content | stacked problem/solution + full-width banner divider | light (1+1) | **image/diagram banner** | 问题→方案(上下堆叠+通栏图分隔,vs 左右两栏的 `problem-solution`) |
39
40
  | `steps` | content | process row (3–5) | medium (4) | text-only | 流程 / 实施路径 |
41
+ | `steps-serpentine` | content | 2-row 8-step serpentine (上行→下行,右侧弧线连接) | dense (8) | text-only | 步骤超过 5 个的长流程(vs 单排 `steps`) |
40
42
  | `chart-kpi` | content · data | native chart + KPI strip | medium | **diagram (chart)** | 趋势 + 指标 |
41
43
  | `ending` | ending | centered statement | light | text-only | 结尾 / 致谢 |
42
44
  | `cover-centered` | cover | hero · centered | — | text-only (bg) | 封面(居中,vs 左对齐 `cover`) |
@@ -60,6 +62,7 @@ Each slide carries `data-layout="<id>"` (drives the diversity lint + traceabilit
60
62
  | `cover-image` | cover | full-bleed image + overlay title | — | **full-bleed photo** | 图片封面(压字) |
61
63
  | `timeline` | content | horizontal dated timeline | medium (4–5) | text-only | 时间轴 / 发展历程 |
62
64
  | `section-image` | section | ghost-number + side image | light | **image slot** | 章节页(带配图) |
65
+ | `section-fullbleed` | section | 满出血图片 + 底部压边超大编号标题 | light | **full-bleed photo** | 章节页(满屏影像,vs 小侧图的 `section-image`;影视/摄影类皮肤常用) |
63
66
  | `section-stat` | section | ghost-number + hero stat | light | text-only | 章节页(带关键数字) |
64
67
  | `transition` | transition | minimal big-number break | light | text-only | 纯过渡页(整册复用一个) |
65
68
  | `funnel` | content · data | narrowing funnel stages | medium (4) | text-only | 转化漏斗 |
@@ -108,6 +111,12 @@ Content: `.card`/`.card-rail`/`.card-dot`/`.card-idx`/`.card-title`/`.card-body`
108
111
  `.do-head`/`.dont-head`/`.do-mark`/`.dont-mark`/`.do-item`/`.dont-item` (dos-donts) ·
109
112
  `.team-name`/`.team-role` (team-row 姓名 accent / 职位;人像槽复用 `.surface`).
110
113
  (type-specimen / brand-values 复用既有 class,无新增。)
114
+ **`.slide-inverse`**(可选修饰类,加在任意 `<section class="slide">` 实例上,与
115
+ `data-layout` 正交):同一 layout 在同一份 deck 里可能既要浅底又要整页反色(如
116
+ ivory-gold 皮肤里 `split-two-col` 复用两次,一次奶油底一次纯黑底)——由拼装
117
+ deck.html 时逐页决定要不要加这个类,skin 只需在自己的 `--slide-bg`/`--body`/
118
+ `--muted`/`--hair` 等 token 上定义 `.slide-inverse` 覆盖即可(`--title`/`--accent`
119
+ 一般保持不变)。浅色皮肤才需要实现它;深色皮肤可以不定义(no-op)。
111
120
  `cover-minimal` 只用既有通用 class(`.rule`/`.accent-bar`/`.cover-title`/`.cover-sub`/`.deck-footer`),无需新增。
112
121
 
113
122
  Adding a **skin** = one `styles/<name>/skin.css` defining the above; all layouts get
@@ -1,4 +1,4 @@
1
1
  <!-- layouts/bento — structure-only variant (paint via skin). -->
2
- <section class="slide" data-layout="bento" style="position:relative;width:1280px;height:720px;overflow:hidden"><div class="slide-backdrop"></div><div class="eyebrow-row" style="position:absolute;left:96px;top:132px;display:flex;align-items:center;gap:14px"><span class="accent-bar" style="width:30px;height:1px;display:inline-block"></span><span class="eyebrow" style="font-size:13px;letter-spacing:.28em">{{eyebrow|AT A GLANCE}}</span></div><h2 class="deck-title" style="position:absolute;left:92px;top:158px;font-size:48px;font-weight:700;letter-spacing:-.4px">{{title|总览}}</h2>
2
+ <section class="slide" data-layout="bento" style="position:relative;width:1280px;height:720px;overflow:hidden"><div class="slide-backdrop"></div><div class="eyebrow-row" style="position:absolute;left:96px;top:132px;display:flex;align-items:center;gap:14px"><span class="accent-bar" style="width:30px;height:1px;display:inline-block"></span><span class="eyebrow" style="font-size:13px;letter-spacing:.28em">{{eyebrow|AT A GLANCE}}</span></div><h2 class="deck-title" style="position:absolute;left:92px;top:158px;font-size:48px;letter-spacing:-.4px">{{title|总览}}</h2>
3
3
  <div class="card-grid" style="position:absolute;left:96px;right:96px;top:270px;bottom:70px;display:grid;grid-template-columns:1.6fr 1fr 1fr;grid-template-rows:1fr 1fr;gap:18px"><div class="card" style="grid-row:1 / span 2;position:relative;padding:34px;display:flex;flex-direction:column;justify-content:space-between"><span class="card-rail" style="position:absolute;left:0;top:34px;width:3px;height:44px;border-radius:2px"></span><div class="card-title" style="font-size:23px;font-weight:700">{{big_title|核心指标}}</div><div><div class="kpi-num" style="font-size:88px;font-weight:800;line-height:1">{{big_num|38}}<span class="stat-unit" style="font-size:34px">{{big_unit|B}}</span></div><p class="card-body" style="font-size:15px;margin-top:10px">{{big_body|一句说明,替换为真实内容。}}</p></div></div><div class="card" style="position:relative;padding:26px"><span class="card-rail" style="position:absolute;left:0;top:26px;width:3px;height:34px;border-radius:2px"></span><div class="card-title" style="font-size:19px;font-weight:700">{{card1_title|要点 01}}</div><p class="card-body" style="font-size:14px;line-height:1.55;margin-top:8px">{{card1_body|一句说明。}}</p></div><div class="card" style="position:relative;padding:26px"><span class="card-rail" style="position:absolute;left:0;top:26px;width:3px;height:34px;border-radius:2px"></span><div class="card-title" style="font-size:19px;font-weight:700">{{card2_title|要点 02}}</div><p class="card-body" style="font-size:14px;line-height:1.55;margin-top:8px">{{card2_body|一句说明。}}</p></div><div class="card" style="position:relative;padding:26px"><span class="card-rail" style="position:absolute;left:0;top:26px;width:3px;height:34px;border-radius:2px"></span><div class="card-title" style="font-size:19px;font-weight:700">{{card3_title|要点 03}}</div><p class="card-body" style="font-size:14px;line-height:1.55;margin-top:8px">{{card3_body|一句说明。}}</p></div><div class="card" style="position:relative;padding:26px"><span class="card-rail" style="position:absolute;left:0;top:26px;width:3px;height:34px;border-radius:2px"></span><div class="card-title" style="font-size:19px;font-weight:700">{{card4_title|要点 04}}</div><p class="card-body" style="font-size:14px;line-height:1.55;margin-top:8px">{{card4_body|一句说明。}}</p></div></div>
4
4
  <div class="rule rule-foot" style="position:absolute;left:96px;right:96px;bottom:40px;height:1px"></div><div class="deck-footer" style="position:absolute;left:96px;bottom:17px;font-size:12px;letter-spacing:.1em">{{footer|报告标题 / 章节}}</div><div class="deck-pageno" style="position:absolute;right:96px;bottom:17px;font-size:12px">{{pageno|01}}</div></section>
@@ -1,4 +1,4 @@
1
1
  <!-- layouts/big-stat — structure-only (paint via styles/<skin>/skin.css). data-layout drives P1/P2/P3 + dedup. -->
2
- <section class="slide" data-layout="big-stat" style="position:relative;width:1280px;height:720px;overflow:hidden"><div class="slide-backdrop"></div><div class="eyebrow-row" style="position:absolute;left:96px;top:132px;display:flex;align-items:center;gap:14px"><span class="accent-bar" style="width:30px;height:1px;display:inline-block"></span><span class="eyebrow" style="font-size:13px;letter-spacing:.28em">{{eyebrow|KEY METRIC}}</span></div><h2 class="deck-title" style="position:absolute;left:92px;top:158px;font-size:48px;font-weight:700;letter-spacing:-.4px">{{title|}}</h2>
2
+ <section class="slide" data-layout="big-stat" style="position:relative;width:1280px;height:720px;overflow:hidden"><div class="slide-backdrop"></div><div class="eyebrow-row" style="position:absolute;left:96px;top:132px;display:flex;align-items:center;gap:14px"><span class="accent-bar" style="width:30px;height:1px;display:inline-block"></span><span class="eyebrow" style="font-size:13px;letter-spacing:.28em">{{eyebrow|KEY METRIC}}</span></div><h2 class="deck-title" style="position:absolute;left:92px;top:158px;font-size:48px;letter-spacing:-.4px">{{title|}}</h2>
3
3
  <div class="stat-num" style="position:absolute;left:90px;top:196px;font-weight:800;line-height:1;font-size:216px;letter-spacing:-2px">{{stat|585}}<span class="stat-unit" style="font-size:64px">{{unit| 单位}}</span></div><div class="stat-lead" style="position:absolute;left:100px;top:492px;font-size:30px;font-weight:600">{{lead|一句结论,数字说明了什么}}</div><p class="stat-note" style="position:absolute;left:100px;top:556px;width:900px;font-size:17px;line-height:1.6">{{note|一句支撑说明,给上下文与来源。}}</p>
4
4
  <div class="rule rule-foot" style="position:absolute;left:96px;right:96px;bottom:40px;height:1px"></div><div class="deck-footer" style="position:absolute;left:96px;bottom:17px;font-size:12px;letter-spacing:.1em">{{footer|报告标题 / 章节}}</div><div class="deck-pageno" style="position:absolute;right:96px;bottom:17px;font-size:12px">{{pageno|01}}</div></section>
@@ -3,7 +3,7 @@
3
3
 
4
4
 
5
5
  <div class="eyebrow-row" style="position:absolute;left:96px;top:124px;display:flex;align-items:center;gap:14px"><span class="accent-bar" style="width:30px;height:1px;display:inline-block"></span><span class="eyebrow" style="font-size:13px;letter-spacing:.28em">{{eyebrow|PRINCIPLES}}</span></div>
6
- <h2 class="deck-title" style="position:absolute;left:92px;top:146px;font-size:42px;font-weight:800;letter-spacing:-.4px">{{title|章节主标题}}</h2>
6
+ <h2 class="deck-title" style="position:absolute;left:92px;top:146px;font-size:42px;letter-spacing:-.4px">{{title|章节主标题}}</h2>
7
7
  <p class="card-body" style="position:absolute;left:96px;right:96px;top:214px;font-size:16px;line-height:1.7">{{intro|一段引子说明,两三行,交代这一章的核心观点与背景,替换为真实内容。承接标题,引出下面四个要点。}}</p>
8
8
  <div class="card-grid" style="position:absolute;left:96px;right:96px;top:296px;display:grid;grid-template-columns:1fr 1fr;gap:20px">
9
9
  <div class="card" style="position:relative;padding:26px 30px;height:118px"><span class="card-rail" style="position:absolute;left:0;top:24px;width:3px;height:40px;border-radius:2px"></span><span class="card-idx" style="font-size:34px;font-weight:800;line-height:1">01</span><div class="card-title" style="font-size:22px;font-weight:700;margin-top:6px">{{block1_title|要点一标题}}</div><p class="card-body" style="font-size:14px;line-height:1.5;margin-top:6px">{{block1_body|一句说明,替换为真实内容。}}</p></div>
@@ -12,8 +12,8 @@
12
12
  <div class="card" style="position:relative;padding:26px 30px;height:118px"><span class="card-rail" style="position:absolute;left:0;top:24px;width:3px;height:40px;border-radius:2px"></span><span class="card-idx" style="font-size:34px;font-weight:800;line-height:1">04</span><div class="card-title" style="font-size:22px;font-weight:700;margin-top:6px">{{block4_title|要点四标题}}</div><p class="card-body" style="font-size:14px;line-height:1.5;margin-top:6px">{{block4_body|一句说明,替换为真实内容。}}</p></div>
13
13
  </div>
14
14
  <div style="position:absolute;left:96px;right:96px;bottom:76px;display:flex;gap:18px">
15
- <div class="quote-bar" style="flex:1.7;padding:18px 24px;border-radius:8px"><div class="quote-txt" style="font-size:17px;font-weight:700">{{quote|"一句金句,点睛这一章。"}}</div><div class="quote-attr" style="font-size:13px;margin-top:4px">{{quote_attr|— 出处 / 作者}}</div></div>
16
- <div class="footnote" style="flex:1;padding:16px 20px;border-radius:8px"><span class="footnote-label" style="font-size:12px;font-weight:700">参考资料:</span><span class="footnote-body" style="font-size:12px"> {{refs|来源一;来源二}}</span></div>
15
+ <div class="quote-bar" style="flex:1.7;padding:18px 24px;border-radius:var(--card-radius)"><div class="quote-txt" style="font-size:17px;font-weight:700">{{quote|"一句金句,点睛这一章。"}}</div><div class="quote-attr" style="font-size:13px;margin-top:4px">{{quote_attr|— 出处 / 作者}}</div></div>
16
+ <div class="footnote" style="flex:1;padding:16px 20px;border-radius:var(--card-radius)"><span class="footnote-label" style="font-size:12px;font-weight:700">参考资料:</span><span class="footnote-body" style="font-size:12px"> {{refs|来源一;来源二}}</span></div>
17
17
  </div>
18
18
  <div class="rule rule-foot" style="position:absolute;left:96px;right:96px;bottom:40px;height:1px"></div><div class="deck-footer" style="position:absolute;left:96px;bottom:17px;font-size:12px;letter-spacing:.1em">{{footer|报告标题 / 章节}}</div><div class="deck-pageno" style="position:absolute;right:96px;bottom:17px;font-size:12px">{{pageno|01}}</div>
19
19
  </section>
@@ -1,7 +1,7 @@
1
1
  <!-- layouts/brand-values — structure-only (paint via skin). 品牌手册"品牌主张":3 张卡,每张 编号圆 + 准则标题 + 说明. 复用既有 class(.surface/.step-circle/.step-title/.step-body). data-layout drives P1/P2/P3 + dedup. -->
2
2
  <section class="slide" data-layout="brand-values" style="position:relative;width:1280px;height:720px;overflow:hidden"><div class="slide-backdrop"></div>
3
3
  <div class="eyebrow-row" style="position:absolute;left:96px;top:132px;display:flex;align-items:center;gap:14px"><span class="accent-bar" style="width:30px;height:1px;display:inline-block"></span><span class="eyebrow" style="font-size:13px;letter-spacing:.28em">BRAND VALUES</span></div>
4
- <h2 class="deck-title" style="position:absolute;left:92px;top:158px;font-size:48px;font-weight:700;letter-spacing:-.4px">品牌主张</h2>
4
+ <h2 class="deck-title" style="position:absolute;left:92px;top:158px;font-size:48px;letter-spacing:-.4px">品牌主张</h2>
5
5
  <div class="steps" style="position:absolute;left:96px;right:96px;top:280px;bottom:96px;display:grid;grid-template-columns:repeat(3,1fr);gap:28px">
6
6
  <div class="step surface" style="padding:34px 32px;display:flex;flex-direction:column"><div class="step-circle" style="width:64px;height:64px;border-radius:50%;display:flex;align-items:center;justify-content:center;font-size:26px;font-weight:700;line-height:1">01</div><div class="step-title" style="font-size:22px;font-weight:700;font-family:var(--font-head);margin-top:22px">真诚 · Authentic</div><p class="step-body" style="font-size:15px;line-height:1.7;margin-top:10px">一句准则说明,表达品牌的核心态度,替换为真实内容。</p></div>
7
7
  <div class="step surface" style="padding:34px 32px;display:flex;flex-direction:column"><div class="step-circle" style="width:64px;height:64px;border-radius:50%;display:flex;align-items:center;justify-content:center;font-size:26px;font-weight:700;line-height:1">02</div><div class="step-title" style="font-size:22px;font-weight:700;font-family:var(--font-head);margin-top:22px">克制 · Minimal</div><p class="step-body" style="font-size:15px;line-height:1.7;margin-top:10px">一句准则说明,表达品牌的核心态度,替换为真实内容。</p></div>
@@ -1,4 +1,4 @@
1
1
  <!-- layouts/cards-3 — structure-only (paint via styles/<skin>/skin.css). data-layout drives P1/P2/P3 + dedup. -->
2
- <section class="slide" data-layout="cards-3" style="position:relative;width:1280px;height:720px;overflow:hidden"><div class="slide-backdrop"></div><div class="eyebrow-row" style="position:absolute;left:96px;top:132px;display:flex;align-items:center;gap:14px"><span class="accent-bar" style="width:30px;height:1px;display:inline-block"></span><span class="eyebrow" style="font-size:13px;letter-spacing:.28em">{{eyebrow|OVERVIEW}}</span></div><h2 class="deck-title" style="position:absolute;left:92px;top:158px;font-size:48px;font-weight:700;letter-spacing:-.4px">{{title|三个要点}}</h2>
2
+ <section class="slide" data-layout="cards-3" style="position:relative;width:1280px;height:720px;overflow:hidden"><div class="slide-backdrop"></div><div class="eyebrow-row" style="position:absolute;left:96px;top:132px;display:flex;align-items:center;gap:14px"><span class="accent-bar" style="width:30px;height:1px;display:inline-block"></span><span class="eyebrow" style="font-size:13px;letter-spacing:.28em">{{eyebrow|OVERVIEW}}</span></div><h2 class="deck-title" style="position:absolute;left:92px;top:158px;font-size:48px;letter-spacing:-.4px">{{title|三个要点}}</h2>
3
3
  <div class="card-grid" style="position:absolute;left:96px;right:96px;top:290px;display:grid;grid-template-columns:1fr 1fr 1fr;gap:24px"><div class="card" style="position:relative;padding:32px 34px;height:300px"><span class="card-rail" style="position:absolute;left:0;top:28px;width:3px;height:40px;border-radius:2px"></span><div style="display:flex;align-items:center;gap:10px"><span class="card-dot" style="width:7px;height:7px;border-radius:50%;display:inline-block"></span><span class="card-idx" style="font-size:12px;letter-spacing:.2em">01</span></div><div class="card-title" style="font-size:23px;font-weight:700;margin-top:14px">{{card1_title|要点标题}}</div><p class="card-body" style="font-size:15.5px;line-height:1.6;margin-top:10px">{{card1_body|一句说明,替换为真实内容。}}</p></div><div class="card" style="position:relative;padding:32px 34px;height:300px"><span class="card-rail" style="position:absolute;left:0;top:28px;width:3px;height:40px;border-radius:2px"></span><div style="display:flex;align-items:center;gap:10px"><span class="card-dot" style="width:7px;height:7px;border-radius:50%;display:inline-block"></span><span class="card-idx" style="font-size:12px;letter-spacing:.2em">02</span></div><div class="card-title" style="font-size:23px;font-weight:700;margin-top:14px">{{card2_title|要点标题}}</div><p class="card-body" style="font-size:15.5px;line-height:1.6;margin-top:10px">{{card2_body|一句说明,替换为真实内容。}}</p></div><div class="card" style="position:relative;padding:32px 34px;height:300px"><span class="card-rail" style="position:absolute;left:0;top:28px;width:3px;height:40px;border-radius:2px"></span><div style="display:flex;align-items:center;gap:10px"><span class="card-dot" style="width:7px;height:7px;border-radius:50%;display:inline-block"></span><span class="card-idx" style="font-size:12px;letter-spacing:.2em">03</span></div><div class="card-title" style="font-size:23px;font-weight:700;margin-top:14px">{{card3_title|要点标题}}</div><p class="card-body" style="font-size:15.5px;line-height:1.6;margin-top:10px">{{card3_body|一句说明,替换为真实内容。}}</p></div></div>
4
4
  <div class="rule rule-foot" style="position:absolute;left:96px;right:96px;bottom:40px;height:1px"></div><div class="deck-footer" style="position:absolute;left:96px;bottom:17px;font-size:12px;letter-spacing:.1em">{{footer|报告标题 / 章节}}</div><div class="deck-pageno" style="position:absolute;right:96px;bottom:17px;font-size:12px">{{pageno|01}}</div></section>
@@ -1,4 +1,4 @@
1
1
  <!-- layouts/cards-grid — structure-only (paint via styles/<skin>/skin.css). data-layout drives P1/P2/P3 + dedup. -->
2
- <section class="slide" data-layout="cards-grid" style="position:relative;width:1280px;height:720px;overflow:hidden"><div class="slide-backdrop"></div><div class="eyebrow-row" style="position:absolute;left:96px;top:132px;display:flex;align-items:center;gap:14px"><span class="accent-bar" style="width:30px;height:1px;display:inline-block"></span><span class="eyebrow" style="font-size:13px;letter-spacing:.28em">{{eyebrow|CAPABILITIES}}</span></div><h2 class="deck-title" style="position:absolute;left:92px;top:154px;font-size:46px;font-weight:700;letter-spacing:-.4px">{{title|六大能力}}</h2>
2
+ <section class="slide" data-layout="cards-grid" style="position:relative;width:1280px;height:720px;overflow:hidden"><div class="slide-backdrop"></div><div class="eyebrow-row" style="position:absolute;left:96px;top:132px;display:flex;align-items:center;gap:14px"><span class="accent-bar" style="width:30px;height:1px;display:inline-block"></span><span class="eyebrow" style="font-size:13px;letter-spacing:.28em">{{eyebrow|CAPABILITIES}}</span></div><h2 class="deck-title" style="position:absolute;left:92px;top:154px;font-size:46px;letter-spacing:-.4px">{{title|六大能力}}</h2>
3
3
  <div class="card-grid" style="position:absolute;left:96px;right:96px;top:270px;display:grid;grid-template-columns:1fr 1fr 1fr;gap:20px"><div class="card" style="position:relative;padding:32px 34px;height:178px"><span class="card-rail" style="position:absolute;left:0;top:28px;width:3px;height:40px;border-radius:2px"></span><div style="display:flex;align-items:center;gap:10px"><span class="card-dot" style="width:7px;height:7px;border-radius:50%;display:inline-block"></span><span class="card-idx" style="font-size:12px;letter-spacing:.2em">01</span></div><div class="card-title" style="font-size:23px;font-weight:700;margin-top:14px">{{card1_title|要点标题}}</div><p class="card-body" style="font-size:15.5px;line-height:1.6;margin-top:10px">{{card1_body|一句说明,替换为真实内容。}}</p></div><div class="card" style="position:relative;padding:32px 34px;height:178px"><span class="card-rail" style="position:absolute;left:0;top:28px;width:3px;height:40px;border-radius:2px"></span><div style="display:flex;align-items:center;gap:10px"><span class="card-dot" style="width:7px;height:7px;border-radius:50%;display:inline-block"></span><span class="card-idx" style="font-size:12px;letter-spacing:.2em">02</span></div><div class="card-title" style="font-size:23px;font-weight:700;margin-top:14px">{{card2_title|要点标题}}</div><p class="card-body" style="font-size:15.5px;line-height:1.6;margin-top:10px">{{card2_body|一句说明,替换为真实内容。}}</p></div><div class="card" style="position:relative;padding:32px 34px;height:178px"><span class="card-rail" style="position:absolute;left:0;top:28px;width:3px;height:40px;border-radius:2px"></span><div style="display:flex;align-items:center;gap:10px"><span class="card-dot" style="width:7px;height:7px;border-radius:50%;display:inline-block"></span><span class="card-idx" style="font-size:12px;letter-spacing:.2em">03</span></div><div class="card-title" style="font-size:23px;font-weight:700;margin-top:14px">{{card3_title|要点标题}}</div><p class="card-body" style="font-size:15.5px;line-height:1.6;margin-top:10px">{{card3_body|一句说明,替换为真实内容。}}</p></div><div class="card" style="position:relative;padding:32px 34px;height:178px"><span class="card-rail" style="position:absolute;left:0;top:28px;width:3px;height:40px;border-radius:2px"></span><div style="display:flex;align-items:center;gap:10px"><span class="card-dot" style="width:7px;height:7px;border-radius:50%;display:inline-block"></span><span class="card-idx" style="font-size:12px;letter-spacing:.2em">04</span></div><div class="card-title" style="font-size:23px;font-weight:700;margin-top:14px">{{card4_title|要点标题}}</div><p class="card-body" style="font-size:15.5px;line-height:1.6;margin-top:10px">{{card4_body|一句说明,替换为真实内容。}}</p></div><div class="card" style="position:relative;padding:32px 34px;height:178px"><span class="card-rail" style="position:absolute;left:0;top:28px;width:3px;height:40px;border-radius:2px"></span><div style="display:flex;align-items:center;gap:10px"><span class="card-dot" style="width:7px;height:7px;border-radius:50%;display:inline-block"></span><span class="card-idx" style="font-size:12px;letter-spacing:.2em">05</span></div><div class="card-title" style="font-size:23px;font-weight:700;margin-top:14px">{{card5_title|要点标题}}</div><p class="card-body" style="font-size:15.5px;line-height:1.6;margin-top:10px">{{card5_body|一句说明,替换为真实内容。}}</p></div><div class="card" style="position:relative;padding:32px 34px;height:178px"><span class="card-rail" style="position:absolute;left:0;top:28px;width:3px;height:40px;border-radius:2px"></span><div style="display:flex;align-items:center;gap:10px"><span class="card-dot" style="width:7px;height:7px;border-radius:50%;display:inline-block"></span><span class="card-idx" style="font-size:12px;letter-spacing:.2em">06</span></div><div class="card-title" style="font-size:23px;font-weight:700;margin-top:14px">{{card6_title|要点标题}}</div><p class="card-body" style="font-size:15.5px;line-height:1.6;margin-top:10px">{{card6_body|一句说明,替换为真实内容。}}</p></div></div>
4
4
  <div class="rule rule-foot" style="position:absolute;left:96px;right:96px;bottom:40px;height:1px"></div><div class="deck-footer" style="position:absolute;left:96px;bottom:17px;font-size:12px;letter-spacing:.1em">{{footer|报告标题 / 章节}}</div><div class="deck-pageno" style="position:absolute;right:96px;bottom:17px;font-size:12px">{{pageno|01}}</div></section>
@@ -1,4 +1,4 @@
1
1
  <!-- layouts/chart-full — structure-only variant (paint via skin). reuses class contract, no skin change. -->
2
- <section class="slide" data-layout="chart-full" style="position:relative;width:1280px;height:720px;overflow:hidden"><div class="slide-backdrop"></div><div class="eyebrow-row" style="position:absolute;left:96px;top:132px;display:flex;align-items:center;gap:14px"><span class="accent-bar" style="width:30px;height:1px;display:inline-block"></span><span class="eyebrow" style="font-size:13px;letter-spacing:.28em">{{eyebrow|TREND}}</span></div><h2 class="deck-title" style="position:absolute;left:92px;top:158px;font-size:48px;font-weight:700;letter-spacing:-.4px">{{title|增长趋势}}</h2>
2
+ <section class="slide" data-layout="chart-full" style="position:relative;width:1280px;height:720px;overflow:hidden"><div class="slide-backdrop"></div><div class="eyebrow-row" style="position:absolute;left:96px;top:132px;display:flex;align-items:center;gap:14px"><span class="accent-bar" style="width:30px;height:1px;display:inline-block"></span><span class="eyebrow" style="font-size:13px;letter-spacing:.28em">{{eyebrow|TREND}}</span></div><h2 class="deck-title" style="position:absolute;left:92px;top:158px;font-size:48px;letter-spacing:-.4px">{{title|增长趋势}}</h2>
3
3
  <div class="chart" style="position:absolute;left:80px;right:80px;top:238px;height:316px"><div class="talos-chart" style="width:100%;height:100%" data-chart='{"type":"bar","labels":["2021","2022","2023","2024","2025"],"series":[{"name":"数值","values":[100,180,290,430,585]}],"colors":["__ACCENT__"],"axisColor":"__AXIS__"}'></div></div><div style="position:absolute;left:96px;top:584px;display:flex;align-items:baseline;gap:16px"><span class="accent-bar" style="width:26px;height:3px;display:inline-block;position:relative;top:-4px"></span><div class="stat-lead" style="font-size:22px;font-weight:700">{{lead|五年增长 5.8×,复合增速 55%}}</div></div><div class="kpi-label" style="position:absolute;right:96px;top:588px;font-size:14px">{{source|数据来源:替换为真实出处}}</div>
4
4
  <div class="rule rule-foot" style="position:absolute;left:96px;right:96px;bottom:40px;height:1px"></div><div class="deck-footer" style="position:absolute;left:96px;bottom:17px;font-size:12px;letter-spacing:.1em">{{footer|报告标题 / 章节}}</div><div class="deck-pageno" style="position:absolute;right:96px;bottom:17px;font-size:12px">{{pageno|01}}</div></section>
@@ -1,4 +1,4 @@
1
1
  <!-- layouts/chart-kpi — structure-only (paint via styles/<skin>/skin.css). data-layout drives P1/P2/P3 + dedup. -->
2
- <section class="slide" data-layout="chart-kpi" style="position:relative;width:1280px;height:720px;overflow:hidden"><div class="slide-backdrop"></div><div class="eyebrow-row" style="position:absolute;left:96px;top:132px;display:flex;align-items:center;gap:14px"><span class="accent-bar" style="width:30px;height:1px;display:inline-block"></span><span class="eyebrow" style="font-size:13px;letter-spacing:.28em">{{eyebrow|PERFORMANCE}}</span></div><h2 class="deck-title" style="position:absolute;left:92px;top:158px;font-size:48px;font-weight:700;letter-spacing:-.4px">{{title|吞吐量逐季提升}}</h2>
2
+ <section class="slide" data-layout="chart-kpi" style="position:relative;width:1280px;height:720px;overflow:hidden"><div class="slide-backdrop"></div><div class="eyebrow-row" style="position:absolute;left:96px;top:132px;display:flex;align-items:center;gap:14px"><span class="accent-bar" style="width:30px;height:1px;display:inline-block"></span><span class="eyebrow" style="font-size:13px;letter-spacing:.28em">{{eyebrow|PERFORMANCE}}</span></div><h2 class="deck-title" style="position:absolute;left:92px;top:158px;font-size:48px;letter-spacing:-.4px">{{title|吞吐量逐季提升}}</h2>
3
3
  <div class="chart" style="position:absolute;left:80px;top:250px;width:700px;height:370px"><div class="talos-chart" style="width:100%;height:100%" data-chart='{"type":"bar","labels":["Q1","Q2","Q3","Q4","Q5"],"series":[{"name":"数值","values":[42,58,71,88,100]}],"colors":["__ACCENT__"],"axisColor":"__AXIS__"}'></div></div><div style="position:absolute;right:96px;top:260px;width:280px"><div class="kpi" style="position:relative;padding-left:18px;margin-bottom:36px"><span class="accent-bar" style="position:absolute;left:0;top:6px;width:4px;height:44px"></span><div class="kpi-num" style="font-size:48px;font-weight:800">{{kpi1_num|100}}<span style="font-size:22px">{{kpi1_unit| 单位}}</span></div><div class="kpi-label" style="font-size:14px">{{kpi1_label|关键指标一}}</div></div><div class="kpi" style="position:relative;padding-left:18px;margin-bottom:0px"><span class="accent-bar" style="position:absolute;left:0;top:6px;width:4px;height:44px"></span><div class="kpi-num" style="font-size:48px;font-weight:800">{{kpi2_num|99.9}}<span style="font-size:22px">{{kpi2_unit| %}}</span></div><div class="kpi-label" style="font-size:14px">{{kpi2_label|关键指标二}}</div></div></div>
4
4
  <div class="rule rule-foot" style="position:absolute;left:96px;right:96px;bottom:40px;height:1px"></div><div class="deck-footer" style="position:absolute;left:96px;bottom:17px;font-size:12px;letter-spacing:.1em">{{footer|报告标题 / 章节}}</div><div class="deck-pageno" style="position:absolute;right:96px;bottom:17px;font-size:12px">{{pageno|01}}</div></section>
@@ -1,13 +1,13 @@
1
1
  <!-- layouts/color-palette — structure-only (paint via skin). 品牌手册"配色方案":一排色板(主色更宽)+ 名称 + HEX 标签. 色块填色走 skin 的 ramp 变量(var(--c1..c4)/--title),不硬编码;HEX 是可替换文本. data-layout drives P1/P2/P3 + dedup. -->
2
2
  <section class="slide" data-layout="color-palette" style="position:relative;width:1280px;height:720px;overflow:hidden"><div class="slide-backdrop"></div>
3
3
  <div class="eyebrow-row" style="position:absolute;left:96px;top:132px;display:flex;align-items:center;gap:14px"><span class="accent-bar" style="width:30px;height:1px;display:inline-block"></span><span class="eyebrow" style="font-size:13px;letter-spacing:.28em">COLOR PALETTE</span></div>
4
- <h2 class="deck-title" style="position:absolute;left:92px;top:158px;font-size:48px;font-weight:700;letter-spacing:-.4px">配色方案</h2>
4
+ <h2 class="deck-title" style="position:absolute;left:92px;top:158px;font-size:48px;letter-spacing:-.4px">配色方案</h2>
5
5
  <div class="palette" style="position:absolute;left:96px;right:96px;top:264px;bottom:92px;display:grid;grid-template-columns:1.7fr 1fr 1fr 1fr 1fr;gap:20px">
6
- <div class="pal-item" style="display:flex;flex-direction:column"><div class="swatch" style="flex:1;border-radius:12px;min-height:180px"></div><div class="pal-name" style="font-size:16px;font-weight:700;margin-top:16px">主色 · Primary</div><div class="pal-hex" style="font-size:13px;margin-top:4px;letter-spacing:.06em;font-family:ui-monospace,'SF Mono',Menlo,monospace">#7A9A72</div></div>
7
- <div class="pal-item" style="display:flex;flex-direction:column"><div class="swatch" style="flex:1;border-radius:12px;min-height:180px"></div><div class="pal-name" style="font-size:16px;font-weight:700;margin-top:16px">辅助 · Secondary</div><div class="pal-hex" style="font-size:13px;margin-top:4px;letter-spacing:.06em;font-family:ui-monospace,'SF Mono',Menlo,monospace">#B79C6E</div></div>
8
- <div class="pal-item" style="display:flex;flex-direction:column"><div class="swatch" style="flex:1;border-radius:12px;min-height:180px"></div><div class="pal-name" style="font-size:16px;font-weight:700;margin-top:16px">强调 · Accent</div><div class="pal-hex" style="font-size:13px;margin-top:4px;letter-spacing:.06em;font-family:ui-monospace,'SF Mono',Menlo,monospace">#5E7D5A</div></div>
9
- <div class="pal-item" style="display:flex;flex-direction:column"><div class="swatch" style="flex:1;border-radius:12px;min-height:180px"></div><div class="pal-name" style="font-size:16px;font-weight:700;margin-top:16px">中性 · Neutral</div><div class="pal-hex" style="font-size:13px;margin-top:4px;letter-spacing:.06em;font-family:ui-monospace,'SF Mono',Menlo,monospace">#A9A288</div></div>
10
- <div class="pal-item" style="display:flex;flex-direction:column"><div class="swatch" style="flex:1;border-radius:12px;min-height:180px"></div><div class="pal-name" style="font-size:16px;font-weight:700;margin-top:16px">墨 · Ink</div><div class="pal-hex" style="font-size:13px;margin-top:4px;letter-spacing:.06em;font-family:ui-monospace,'SF Mono',Menlo,monospace">#26261F</div></div>
6
+ <div class="pal-item" style="display:flex;flex-direction:column"><div class="swatch" style="flex:1;border-radius:var(--card-radius);min-height:180px"></div><div class="pal-name" style="font-size:16px;font-weight:700;margin-top:16px">主色 · Primary</div><div class="pal-hex" style="font-size:13px;margin-top:4px;letter-spacing:.06em;font-family:ui-monospace,'SF Mono',Menlo,monospace">#7A9A72</div></div>
7
+ <div class="pal-item" style="display:flex;flex-direction:column"><div class="swatch" style="flex:1;border-radius:var(--card-radius);min-height:180px"></div><div class="pal-name" style="font-size:16px;font-weight:700;margin-top:16px">辅助 · Secondary</div><div class="pal-hex" style="font-size:13px;margin-top:4px;letter-spacing:.06em;font-family:ui-monospace,'SF Mono',Menlo,monospace">#B79C6E</div></div>
8
+ <div class="pal-item" style="display:flex;flex-direction:column"><div class="swatch" style="flex:1;border-radius:var(--card-radius);min-height:180px"></div><div class="pal-name" style="font-size:16px;font-weight:700;margin-top:16px">强调 · Accent</div><div class="pal-hex" style="font-size:13px;margin-top:4px;letter-spacing:.06em;font-family:ui-monospace,'SF Mono',Menlo,monospace">#5E7D5A</div></div>
9
+ <div class="pal-item" style="display:flex;flex-direction:column"><div class="swatch" style="flex:1;border-radius:var(--card-radius);min-height:180px"></div><div class="pal-name" style="font-size:16px;font-weight:700;margin-top:16px">中性 · Neutral</div><div class="pal-hex" style="font-size:13px;margin-top:4px;letter-spacing:.06em;font-family:ui-monospace,'SF Mono',Menlo,monospace">#A9A288</div></div>
10
+ <div class="pal-item" style="display:flex;flex-direction:column"><div class="swatch" style="flex:1;border-radius:var(--card-radius);min-height:180px"></div><div class="pal-name" style="font-size:16px;font-weight:700;margin-top:16px">墨 · Ink</div><div class="pal-hex" style="font-size:13px;margin-top:4px;letter-spacing:.06em;font-family:ui-monospace,'SF Mono',Menlo,monospace">#26261F</div></div>
11
11
  </div>
12
12
  <div class="rule rule-foot" style="position:absolute;left:96px;right:96px;bottom:40px;height:1px"></div><div class="deck-footer" style="position:absolute;left:96px;bottom:17px;font-size:12px;letter-spacing:.1em">报告标题 / 章节</div><div class="deck-pageno" style="position:absolute;right:96px;bottom:17px;font-size:12px">01</div>
13
13
  </section>
@@ -1,4 +1,4 @@
1
1
  <!-- layouts/comparison — structure-only (paint via styles/<skin>/skin.css). data-layout drives P1/P2/P3 + dedup. -->
2
- <section class="slide" data-layout="comparison" style="position:relative;width:1280px;height:720px;overflow:hidden"><div class="slide-backdrop"></div><div class="eyebrow-row" style="position:absolute;left:96px;top:132px;display:flex;align-items:center;gap:14px"><span class="accent-bar" style="width:30px;height:1px;display:inline-block"></span><span class="eyebrow" style="font-size:13px;letter-spacing:.28em">{{eyebrow|COMPARISON}}</span></div><h2 class="deck-title" style="position:absolute;left:92px;top:158px;font-size:48px;font-weight:700;letter-spacing:-.4px">{{title|方案对比}}</h2>
3
- <div class="cmp-grid" style="position:absolute;left:96px;right:96px;top:288px;display:grid;grid-template-columns:1fr 1fr 1fr;gap:24px"><div class="cmp-col" style="position:relative;border-radius:18px;padding:30px"><div class="cmp-title" style="font-size:22px;font-weight:700">{{colA_title|方案 A}}</div><div style="margin-top:16px"><div class="cmp-row" style="display:flex;justify-content:space-between;padding:12px 0;border-bottom:1px solid var(--hair)"><span class="cmp-k" style="font-size:15px">{{dim1|成本}}</span><span class="cmp-v" style="font-size:15px;font-weight:600">{{colA_v1|中}}</span></div><div class="cmp-row" style="display:flex;justify-content:space-between;padding:12px 0;border-bottom:1px solid var(--hair)"><span class="cmp-k" style="font-size:15px">{{dim2|周期}}</span><span class="cmp-v" style="font-size:15px;font-weight:600">{{colA_v2|短}}</span></div><div class="cmp-row" style="display:flex;justify-content:space-between;padding:12px 0"><span class="cmp-k" style="font-size:15px">{{dim3|风险}}</span><span class="cmp-v" style="font-size:15px;font-weight:600">{{colA_v3|高}}</span></div></div></div><div class="cmp-col cmp-col--rec" style="position:relative;border-radius:18px;padding:30px"><div class="cmp-badge" style="position:absolute;top:-13px;left:28px;font-weight:700;font-size:12px;letter-spacing:.08em;border-radius:999px;padding:5px 14px">{{badge|✓ 推荐}}</div><div class="cmp-title" style="font-size:22px;font-weight:700">{{colB_title|方案 B}}</div><div style="margin-top:16px"><div class="cmp-row" style="display:flex;justify-content:space-between;padding:12px 0;border-bottom:1px solid var(--hair)"><span class="cmp-k" style="font-size:15px">{{dim1|成本}}</span><span class="cmp-v" style="font-size:15px;font-weight:600">{{colB_v1|低}}</span></div><div class="cmp-row" style="display:flex;justify-content:space-between;padding:12px 0;border-bottom:1px solid var(--hair)"><span class="cmp-k" style="font-size:15px">{{dim2|周期}}</span><span class="cmp-v" style="font-size:15px;font-weight:600">{{colB_v2|中}}</span></div><div class="cmp-row" style="display:flex;justify-content:space-between;padding:12px 0"><span class="cmp-k" style="font-size:15px">{{dim3|风险}}</span><span class="cmp-v" style="font-size:15px;font-weight:600">{{colB_v3|低}}</span></div></div></div><div class="cmp-col" style="position:relative;border-radius:18px;padding:30px"><div class="cmp-title" style="font-size:22px;font-weight:700">{{colC_title|方案 C}}</div><div style="margin-top:16px"><div class="cmp-row" style="display:flex;justify-content:space-between;padding:12px 0;border-bottom:1px solid var(--hair)"><span class="cmp-k" style="font-size:15px">{{dim1|成本}}</span><span class="cmp-v" style="font-size:15px;font-weight:600">{{colC_v1|高}}</span></div><div class="cmp-row" style="display:flex;justify-content:space-between;padding:12px 0;border-bottom:1px solid var(--hair)"><span class="cmp-k" style="font-size:15px">{{dim2|周期}}</span><span class="cmp-v" style="font-size:15px;font-weight:600">{{colC_v2|长}}</span></div><div class="cmp-row" style="display:flex;justify-content:space-between;padding:12px 0"><span class="cmp-k" style="font-size:15px">{{dim3|风险}}</span><span class="cmp-v" style="font-size:15px;font-weight:600">{{colC_v3|中}}</span></div></div></div></div>
2
+ <section class="slide" data-layout="comparison" style="position:relative;width:1280px;height:720px;overflow:hidden"><div class="slide-backdrop"></div><div class="eyebrow-row" style="position:absolute;left:96px;top:132px;display:flex;align-items:center;gap:14px"><span class="accent-bar" style="width:30px;height:1px;display:inline-block"></span><span class="eyebrow" style="font-size:13px;letter-spacing:.28em">{{eyebrow|COMPARISON}}</span></div><h2 class="deck-title" style="position:absolute;left:92px;top:158px;font-size:48px;letter-spacing:-.4px">{{title|方案对比}}</h2>
3
+ <div class="cmp-grid" style="position:absolute;left:96px;right:96px;top:288px;display:grid;grid-template-columns:1fr 1fr 1fr;gap:24px"><div class="cmp-col" style="position:relative;border-radius:var(--card-radius);padding:30px"><div class="cmp-title" style="font-size:22px;font-weight:700">{{colA_title|方案 A}}</div><div style="margin-top:16px"><div class="cmp-row" style="display:flex;justify-content:space-between;padding:12px 0;border-bottom:1px solid var(--hair)"><span class="cmp-k" style="font-size:15px">{{dim1|成本}}</span><span class="cmp-v" style="font-size:15px;font-weight:600">{{colA_v1|中}}</span></div><div class="cmp-row" style="display:flex;justify-content:space-between;padding:12px 0;border-bottom:1px solid var(--hair)"><span class="cmp-k" style="font-size:15px">{{dim2|周期}}</span><span class="cmp-v" style="font-size:15px;font-weight:600">{{colA_v2|短}}</span></div><div class="cmp-row" style="display:flex;justify-content:space-between;padding:12px 0"><span class="cmp-k" style="font-size:15px">{{dim3|风险}}</span><span class="cmp-v" style="font-size:15px;font-weight:600">{{colA_v3|高}}</span></div></div></div><div class="cmp-col cmp-col--rec" style="position:relative;border-radius:var(--card-radius);padding:30px"><div class="cmp-badge" style="position:absolute;top:-13px;left:28px;font-weight:700;font-size:12px;letter-spacing:.08em;border-radius:999px;padding:5px 14px">{{badge|✓ 推荐}}</div><div class="cmp-title" style="font-size:22px;font-weight:700">{{colB_title|方案 B}}</div><div style="margin-top:16px"><div class="cmp-row" style="display:flex;justify-content:space-between;padding:12px 0;border-bottom:1px solid var(--hair)"><span class="cmp-k" style="font-size:15px">{{dim1|成本}}</span><span class="cmp-v" style="font-size:15px;font-weight:600">{{colB_v1|低}}</span></div><div class="cmp-row" style="display:flex;justify-content:space-between;padding:12px 0;border-bottom:1px solid var(--hair)"><span class="cmp-k" style="font-size:15px">{{dim2|周期}}</span><span class="cmp-v" style="font-size:15px;font-weight:600">{{colB_v2|中}}</span></div><div class="cmp-row" style="display:flex;justify-content:space-between;padding:12px 0"><span class="cmp-k" style="font-size:15px">{{dim3|风险}}</span><span class="cmp-v" style="font-size:15px;font-weight:600">{{colB_v3|低}}</span></div></div></div><div class="cmp-col" style="position:relative;border-radius:var(--card-radius);padding:30px"><div class="cmp-title" style="font-size:22px;font-weight:700">{{colC_title|方案 C}}</div><div style="margin-top:16px"><div class="cmp-row" style="display:flex;justify-content:space-between;padding:12px 0;border-bottom:1px solid var(--hair)"><span class="cmp-k" style="font-size:15px">{{dim1|成本}}</span><span class="cmp-v" style="font-size:15px;font-weight:600">{{colC_v1|高}}</span></div><div class="cmp-row" style="display:flex;justify-content:space-between;padding:12px 0;border-bottom:1px solid var(--hair)"><span class="cmp-k" style="font-size:15px">{{dim2|周期}}</span><span class="cmp-v" style="font-size:15px;font-weight:600">{{colC_v2|长}}</span></div><div class="cmp-row" style="display:flex;justify-content:space-between;padding:12px 0"><span class="cmp-k" style="font-size:15px">{{dim3|风险}}</span><span class="cmp-v" style="font-size:15px;font-weight:600">{{colC_v3|中}}</span></div></div></div></div>
4
4
  <div class="rule rule-foot" style="position:absolute;left:96px;right:96px;bottom:40px;height:1px"></div><div class="deck-footer" style="position:absolute;left:96px;bottom:17px;font-size:12px;letter-spacing:.1em">{{footer|报告标题 / 章节}}</div><div class="deck-pageno" style="position:absolute;right:96px;bottom:17px;font-size:12px">{{pageno|01}}</div></section>
@@ -1,4 +1,4 @@
1
1
  <!-- layouts/concept-hub — structure-only variant (paint via skin; uses batch-5 classes). -->
2
- <section class="slide" data-layout="concept-hub" style="position:relative;width:1280px;height:720px;overflow:hidden"><div class="slide-backdrop"></div><div class="eyebrow-row" style="position:absolute;left:96px;top:132px;display:flex;align-items:center;gap:14px"><span class="accent-bar" style="width:30px;height:1px;display:inline-block"></span><span class="eyebrow" style="font-size:13px;letter-spacing:.28em">{{eyebrow|FRAMEWORK}}</span></div><h2 class="deck-title" style="position:absolute;left:92px;top:158px;font-size:48px;font-weight:700;letter-spacing:-.4px">{{title|核心框架}}</h2>
2
+ <section class="slide" data-layout="concept-hub" style="position:relative;width:1280px;height:720px;overflow:hidden"><div class="slide-backdrop"></div><div class="eyebrow-row" style="position:absolute;left:96px;top:132px;display:flex;align-items:center;gap:14px"><span class="accent-bar" style="width:30px;height:1px;display:inline-block"></span><span class="eyebrow" style="font-size:13px;letter-spacing:.28em">{{eyebrow|FRAMEWORK}}</span></div><h2 class="deck-title" style="position:absolute;left:92px;top:158px;font-size:48px;letter-spacing:-.4px">{{title|核心框架}}</h2>
3
3
  <svg width="1280" height="720" viewBox="0 0 1280 720" style="position:absolute;inset:0;pointer-events:none"><g class="hub-link" fill="none" stroke-width="1.5"><line x1="640" y1="418" x2="300" y2="316"/><line x1="640" y1="418" x2="980" y2="316"/><line x1="640" y1="418" x2="300" y2="540"/><line x1="640" y1="418" x2="980" y2="540"/></g></svg><div class="card hub-center" style="position:absolute;left:540px;top:318px;width:200px;height:200px;display:flex;align-items:center;justify-content:center;text-align:center"><div><div class="hub-title" style="font-size:24px;font-weight:800">{{center_title|核心}}</div><div class="card-body" style="font-size:14px;margin-top:6px">{{center_body|一句概括}}</div></div></div><div class="card hub-node" style="position:absolute;left:150px;top:256px;width:260px;height:120px;padding:22px 26px"><div class="hub-title" style="font-size:19px;font-weight:700">{{node1_title|01 维度}}</div><p class="card-body" style="font-size:14px;line-height:1.5;margin-top:6px">{{node1_body|一句说明。}}</p></div><div class="card hub-node" style="position:absolute;right:150px;top:256px;width:260px;height:120px;padding:22px 26px"><div class="hub-title" style="font-size:19px;font-weight:700">{{node2_title|02 维度}}</div><p class="card-body" style="font-size:14px;line-height:1.5;margin-top:6px">{{node2_body|一句说明。}}</p></div><div class="card hub-node" style="position:absolute;left:150px;top:480px;width:260px;height:120px;padding:22px 26px"><div class="hub-title" style="font-size:19px;font-weight:700">{{node3_title|03 维度}}</div><p class="card-body" style="font-size:14px;line-height:1.5;margin-top:6px">{{node3_body|一句说明。}}</p></div><div class="card hub-node" style="position:absolute;right:150px;top:480px;width:260px;height:120px;padding:22px 26px"><div class="hub-title" style="font-size:19px;font-weight:700">{{node4_title|04 维度}}</div><p class="card-body" style="font-size:14px;line-height:1.5;margin-top:6px">{{node4_body|一句说明。}}</p></div>
4
4
  <div class="rule rule-foot" style="position:absolute;left:96px;right:96px;bottom:40px;height:1px"></div><div class="deck-footer" style="position:absolute;left:96px;bottom:17px;font-size:12px;letter-spacing:.1em">{{footer|报告标题 / 章节}}</div><div class="deck-pageno" style="position:absolute;right:96px;bottom:17px;font-size:12px">{{pageno|01}}</div></section>
@@ -1,2 +1,2 @@
1
1
  <!-- layouts/cover-centered — structure-only. -->
2
- <section class="slide" data-layout="cover-centered" style="position:relative;width:1280px;height:720px;overflow:hidden"><div class="slide-backdrop"></div><div style="position:absolute;left:0;right:0;top:262px;text-align:center"><span class="eyebrow-row" style="display:inline-flex;align-items:center;gap:14px"><span class="accent-bar" style="width:44px;height:3px;display:inline-block"></span><span class="eyebrow" style="font-size:13px;letter-spacing:.28em">{{eyebrow|2026 · 行业报告}}</span></span></div><h1 class="cover-title" style="position:absolute;left:0;right:0;top:306px;text-align:center;font-size:82px;font-weight:800;line-height:1.06">{{title|主标题<br>第二行}}</h1><p class="cover-sub" style="position:absolute;left:0;right:0;top:534px;text-align:center;font-size:23px">{{subtitle|一句副标题 / 价值主张}}</p><div class="ending-contact" style="position:absolute;left:0;right:0;bottom:44px;text-align:center;font-size:13px;letter-spacing:.14em">{{meta|演讲者 · 部门 · 2026}}</div></section>
2
+ <section class="slide" data-layout="cover-centered" style="position:relative;width:1280px;height:720px;overflow:hidden"><div class="slide-backdrop"></div><div style="position:absolute;left:0;right:0;top:262px;text-align:center"><span class="eyebrow-row" style="display:inline-flex;align-items:center;gap:14px"><span class="accent-bar" style="width:44px;height:3px;display:inline-block"></span><span class="eyebrow" style="font-size:13px;letter-spacing:.28em">{{eyebrow|2026 · 行业报告}}</span></span></div><h1 class="cover-title" style="position:absolute;left:0;right:0;top:306px;text-align:center;font-size:82px;line-height:1.06">{{title|主标题<br>第二行}}</h1><p class="cover-sub" style="position:absolute;left:0;right:0;top:534px;text-align:center;font-size:23px">{{subtitle|一句副标题 / 价值主张}}</p><div class="ending-contact" style="position:absolute;left:0;right:0;bottom:44px;text-align:center;font-size:13px;letter-spacing:.14em">{{meta|演讲者 · 部门 · 2026}}</div></section>
@@ -1,2 +1,2 @@
1
1
  <!-- layouts/cover-image — structure-only (uses batch-5 classes; overlay text stays light on any skin). -->
2
- <section class="slide" data-layout="cover-image" style="position:relative;width:1280px;height:720px;overflow:hidden"><div class="surface" style="position:absolute;inset:0;display:flex;align-items:center;justify-content:center"><span class="surface-label" style="font-size:16px">{{image_label|全出血图片占位(替换为 &lt;img&gt;)}}</span></div><div class="scrim" style="position:absolute;inset:0"></div><div class="eyebrow-row" style="position:absolute;left:96px;top:470px;display:flex;align-items:center;gap:14px"><span class="accent-bar" style="width:40px;height:3px;display:inline-block"></span><span class="eyebrow" style="font-size:13px;letter-spacing:.28em">{{eyebrow|2026 · 行业报告}}</span></div><h1 class="overlay-title" style="position:absolute;left:92px;top:506px;width:1000px;font-size:78px;font-weight:800;line-height:1.06">{{title|主标题<br>压在图片上}}</h1><p class="overlay-sub" style="position:absolute;left:96px;bottom:48px;font-size:20px">{{subtitle|一句副标题 / 价值主张}}</p></section>
2
+ <section class="slide" data-layout="cover-image" style="position:relative;width:1280px;height:720px;overflow:hidden"><div class="slide-backdrop"></div><div class="surface" style="position:absolute;inset:0;display:flex;align-items:center;justify-content:center"><span class="surface-label" style="font-size:16px">{{image_label|全出血图片占位(替换为 &lt;img&gt;)}}</span></div><div class="scrim" style="position:absolute;inset:0"></div><div class="eyebrow-row" style="position:absolute;left:96px;top:470px;display:flex;align-items:center;gap:14px"><span class="accent-bar" style="width:40px;height:3px;display:inline-block"></span><span class="eyebrow" style="font-size:13px;letter-spacing:.28em">{{eyebrow|2026 · 行业报告}}</span></div><h1 class="overlay-title" style="position:absolute;left:92px;top:506px;width:1000px;font-size:78px;font-weight:800;line-height:1.06">{{title|主标题<br>压在图片上}}</h1><p class="overlay-sub" style="position:absolute;left:96px;bottom:48px;font-size:20px">{{subtitle|一句副标题 / 价值主张}}</p></section>
@@ -1,7 +1,7 @@
1
1
  <!-- layouts/cover-minimal — structure-only (paint via skin). 招牌"线点线极简封面":居中 ── ● ── 分隔符 + 粗标题 + 宽字距大写拉丁副标 + 居中元信息. mono/极简单色最佳. 线用 .rule(发丝) 点用 .accent-bar(实心,inline 改圆). -->
2
2
  <section class="slide" data-layout="cover-minimal" style="position:relative;width:1280px;height:720px;overflow:hidden"><div class="slide-backdrop"></div>
3
3
  <div class="cover-divider" style="position:absolute;left:0;right:0;top:236px;display:flex;align-items:center;justify-content:center;gap:18px"><span class="rule" style="width:64px;height:1px;display:inline-block"></span><span class="accent-bar" style="width:8px;height:8px;border-radius:50%;display:inline-block"></span><span class="rule" style="width:64px;height:1px;display:inline-block"></span></div>
4
- <h1 class="cover-title" style="position:absolute;left:0;right:0;top:272px;text-align:center;font-size:72px;font-weight:800;line-height:1.1;letter-spacing:-.01em">{{title|产品设计报告}}</h1>
4
+ <h1 class="cover-title" style="position:absolute;left:0;right:0;top:272px;text-align:center;font-size:72px;line-height:1.1;letter-spacing:-.01em">{{title|产品设计报告}}</h1>
5
5
  <p class="cover-sub" style="position:absolute;left:0;right:0;top:392px;text-align:center;font-size:20px;letter-spacing:.26em;text-transform:uppercase">{{subtitle|Product Design Report 2025}}</p>
6
6
  <div class="deck-footer" style="position:absolute;left:0;right:0;top:452px;text-align:center;font-size:14px;letter-spacing:.06em">{{meta|主讲人: 张小明 | 2025/01/20}}</div>
7
7
  </section>
@@ -1,6 +1,6 @@
1
1
  <!-- layouts/cover-statement — structure-only variant (paint via skin). -->
2
2
  <section class="slide" data-layout="cover-statement" style="position:relative;width:1280px;height:720px;overflow:hidden"><div class="slide-backdrop"></div>
3
3
  <div class="eyebrow-row" style="position:absolute;left:96px;top:214px;display:flex;align-items:center;gap:14px"><span class="accent-bar" style="width:44px;height:3px;display:inline-block"></span><span class="eyebrow" style="font-size:13px;letter-spacing:.28em">{{eyebrow|2026 · 主张}}</span></div>
4
- <h1 class="cover-title" style="position:absolute;left:92px;top:252px;width:1090px;font-size:96px;font-weight:800;line-height:1.08;letter-spacing:-1px">{{statement|一句有力的主张,<br>点出整份报告的核心。}}</h1>
4
+ <h1 class="cover-title" style="position:absolute;left:92px;top:252px;width:1090px;font-size:96px;line-height:1.08;letter-spacing:-1px">{{statement|一句有力的主张,<br>点出整份报告的核心。}}</h1>
5
5
  <div class="ending-contact" style="position:absolute;left:96px;bottom:44px;font-size:13px;letter-spacing:.14em">{{meta|演讲者 · 部门 · 2026}}</div>
6
6
  </section>
@@ -1,2 +1,2 @@
1
1
  <!-- layouts/cover — structure-only (paint via skin). -->
2
- <section class="slide" data-layout="cover" style="position:relative;width:1280px;height:720px;overflow:hidden"><div class="slide-backdrop"></div><div class="eyebrow-row" style="position:absolute;left:96px;top:296px;display:flex;align-items:center;gap:14px"><span class="accent-bar" style="width:30px;height:1px;display:inline-block"></span><span class="eyebrow" style="font-size:13px;letter-spacing:.28em">{{eyebrow|2026 · 行业报告}}</span></div><h1 class="cover-title" style="position:absolute;left:92px;top:332px;font-size:86px;font-weight:800;line-height:1.05;max-width:1000px">{{title|主标题<br>第二行}}</h1><p class="cover-sub" style="position:absolute;left:96px;top:558px;font-size:24px">{{subtitle|一句副标题 / 价值主张}}</p><div class="deck-footer" style="position:absolute;left:96px;right:96px;bottom:40px;display:flex;justify-content:space-between;font-size:13px"><span>{{presenter|演讲者 · 部门}}</span><span>{{date|2026}}</span></div></section>
2
+ <section class="slide" data-layout="cover" style="position:relative;width:1280px;height:720px;overflow:hidden"><div class="slide-backdrop"></div><div class="eyebrow-row" style="position:absolute;left:96px;top:296px;display:flex;align-items:center;gap:14px"><span class="accent-bar" style="width:30px;height:1px;display:inline-block"></span><span class="eyebrow" style="font-size:13px;letter-spacing:.28em">{{eyebrow|2026 · 行业报告}}</span></div><h1 class="cover-title" style="position:absolute;left:92px;top:332px;font-size:86px;line-height:1.05;max-width:1000px">{{title|主标题<br>第二行}}</h1><p class="cover-sub" style="position:absolute;left:96px;top:558px;font-size:24px">{{subtitle|一句副标题 / 价值主张}}</p><div class="deck-footer" style="position:absolute;left:96px;right:96px;bottom:40px;display:flex;justify-content:space-between;font-size:13px"><span>{{presenter|演讲者 · 部门}}</span><span>{{date|2026}}</span></div></section>
@@ -1,4 +1,4 @@
1
1
  <!-- layouts/data-table — structure-only variant (paint via skin). -->
2
- <section class="slide" data-layout="data-table" style="position:relative;width:1280px;height:720px;overflow:hidden"><div class="slide-backdrop"></div><div class="eyebrow-row" style="position:absolute;left:96px;top:132px;display:flex;align-items:center;gap:14px"><span class="accent-bar" style="width:30px;height:1px;display:inline-block"></span><span class="eyebrow" style="font-size:13px;letter-spacing:.28em">{{eyebrow|DATA}}</span></div><h2 class="deck-title" style="position:absolute;left:92px;top:158px;font-size:48px;font-weight:700;letter-spacing:-.4px">{{title|关键数据一览}}</h2>
2
+ <section class="slide" data-layout="data-table" style="position:relative;width:1280px;height:720px;overflow:hidden"><div class="slide-backdrop"></div><div class="eyebrow-row" style="position:absolute;left:96px;top:132px;display:flex;align-items:center;gap:14px"><span class="accent-bar" style="width:30px;height:1px;display:inline-block"></span><span class="eyebrow" style="font-size:13px;letter-spacing:.28em">{{eyebrow|DATA}}</span></div><h2 class="deck-title" style="position:absolute;left:92px;top:158px;font-size:48px;letter-spacing:-.4px">{{title|关键数据一览}}</h2>
3
3
  <div style="position:absolute;left:96px;right:96px;top:290px"><div class="dt-head" style="display:grid;grid-template-columns:1.4fr 1fr 1fr 1fr;padding:16px 22px"><div class="dt-key" style="font-size:16px;font-weight:700">{{col0|维度}}</div><div class="dt-cell" style="font-size:16px;font-weight:700;text-align:right">{{col1|方案 A}}</div><div class="dt-cell" style="font-size:16px;font-weight:700;text-align:right">{{col2|方案 B}}</div><div class="dt-cell" style="font-size:16px;font-weight:700;text-align:right">{{col3|方案 C}}</div></div><div class="dt-row" style="display:grid;grid-template-columns:1.4fr 1fr 1fr 1fr;padding:16px 22px"><div class="dt-key" style="font-size:16px;font-weight:600">{{r1_key|成本}}</div><div class="dt-cell" style="font-size:16px;text-align:right">{{r1c1|中}}</div><div class="dt-em" style="font-size:16px;text-align:right">{{r1c2|低}}</div><div class="dt-cell" style="font-size:16px;text-align:right">{{r1c3|高}}</div></div><div class="dt-row" style="display:grid;grid-template-columns:1.4fr 1fr 1fr 1fr;padding:16px 22px"><div class="dt-key" style="font-size:16px;font-weight:600">{{r2_key|周期}}</div><div class="dt-cell" style="font-size:16px;text-align:right">{{r2c1|短}}</div><div class="dt-em" style="font-size:16px;text-align:right">{{r2c2|中}}</div><div class="dt-cell" style="font-size:16px;text-align:right">{{r2c3|长}}</div></div><div class="dt-row" style="display:grid;grid-template-columns:1.4fr 1fr 1fr 1fr;padding:16px 22px"><div class="dt-key" style="font-size:16px;font-weight:600">{{r3_key|风险}}</div><div class="dt-cell" style="font-size:16px;text-align:right">{{r3c1|高}}</div><div class="dt-em" style="font-size:16px;text-align:right">{{r3c2|低}}</div><div class="dt-cell" style="font-size:16px;text-align:right">{{r3c3|中}}</div></div><div class="dt-row" style="display:grid;grid-template-columns:1.4fr 1fr 1fr 1fr;padding:16px 22px"><div class="dt-key" style="font-size:16px;font-weight:600">{{r4_key|收益}}</div><div class="dt-cell" style="font-size:16px;text-align:right">{{r4c1|中}}</div><div class="dt-em" style="font-size:16px;text-align:right">{{r4c2|高}}</div><div class="dt-cell" style="font-size:16px;text-align:right">{{r4c3|中}}</div></div></div>
4
4
  <div class="rule rule-foot" style="position:absolute;left:96px;right:96px;bottom:40px;height:1px"></div><div class="deck-footer" style="position:absolute;left:96px;bottom:17px;font-size:12px;letter-spacing:.1em">{{footer|报告标题 / 章节}}</div><div class="deck-pageno" style="position:absolute;right:96px;bottom:17px;font-size:12px">{{pageno|01}}</div></section>
@@ -1,7 +1,7 @@
1
1
  <!-- layouts/dos-donts — structure-only (paint via skin). 品牌手册"Do & Don't":左推荐(✓)/ 右避免(✗)双栏,每条一个标记 + 说明. 标记/表头走 skin 变量(.do-head/.dont-head/.do-mark/.dont-mark). data-layout drives P1/P2/P3 + dedup. -->
2
2
  <section class="slide" data-layout="dos-donts" style="position:relative;width:1280px;height:720px;overflow:hidden"><div class="slide-backdrop"></div>
3
3
  <div class="eyebrow-row" style="position:absolute;left:96px;top:132px;display:flex;align-items:center;gap:14px"><span class="accent-bar" style="width:30px;height:1px;display:inline-block"></span><span class="eyebrow" style="font-size:13px;letter-spacing:.28em">{{eyebrow|GUIDELINES}}</span></div>
4
- <h2 class="deck-title" style="position:absolute;left:92px;top:158px;font-size:48px;font-weight:700;letter-spacing:-.4px">Do &amp; Don&#39;t</h2>
4
+ <h2 class="deck-title" style="position:absolute;left:92px;top:158px;font-size:48px;letter-spacing:-.4px">Do &amp; Don&#39;t</h2>
5
5
  <div style="position:absolute;left:96px;right:96px;top:266px;bottom:92px;display:grid;grid-template-columns:1fr 1fr;gap:28px">
6
6
  <div class="surface" style="padding:32px 36px;display:flex;flex-direction:column"><div class="do-head" style="font-size:22px;font-weight:700;font-family:var(--font-head)">{{do_head|✓ 推荐 Do}}</div><div style="margin-top:22px;display:flex;flex-direction:column;gap:18px">
7
7
  <div style="display:flex;gap:14px;align-items:flex-start"><span class="do-mark" style="font-size:18px;line-height:1.5;flex:none">✓</span><span class="do-item" style="font-size:15.5px;line-height:1.55">{{do1|保持充足留白,让 Logo 与元素有呼吸空间。}}</span></div>
@@ -1,12 +1,12 @@
1
1
  <!-- layouts/editorial-panel — structure-only (paint via styles/<skin>/skin.css). 招牌"编辑多面板":标题带下划线 + 两列×两带对齐网格(左:虚线导语卡 / 2×2 小卡;右:引言卡 / 列表卡)+ 底部通栏 Note. skin 决定柔彩/实色/单色. data-layout drives P1/P2/P3 + dedup. -->
2
2
  <section class="slide" data-layout="editorial-panel" style="position:relative;width:1280px;height:720px;overflow:hidden"><div class="slide-backdrop"></div>
3
3
  <div class="eyebrow-row" style="position:absolute;left:96px;top:68px"><span class="eyebrow" style="font-size:12px;letter-spacing:.3em">{{eyebrow|CHAPTER}}</span></div>
4
- <h2 class="deck-title" style="position:absolute;left:96px;top:94px;font-size:38px;font-weight:700">{{title|章节主标题}}</h2>
4
+ <h2 class="deck-title" style="position:absolute;left:96px;top:94px;font-size:38px;">{{title|章节主标题}}</h2>
5
5
  <!-- ===== TOP BAND (186–336) ===== -->
6
6
  <!-- left: dashed lead card -->
7
- <div class="surface surface--dashed" style="position:absolute;left:96px;top:186px;width:660px;height:150px;padding:24px 30px;border-radius:10px"><p class="card-body" style="font-size:15.5px;line-height:1.8">{{lead1|在这里写一段导语,两三行,交代主题的背景与基调,替换为真实内容。}}</p><p class="card-body" style="font-size:15.5px;line-height:1.8;margin-top:10px">{{lead2|第二段延展一句,收束到下面的要点。}}</p></div>
7
+ <div class="surface surface--dashed" style="position:absolute;left:96px;top:186px;width:660px;height:150px;padding:24px 30px;border-radius:var(--card-radius)"><p class="card-body" style="font-size:15.5px;line-height:1.8">{{lead1|在这里写一段导语,两三行,交代主题的背景与基调,替换为真实内容。}}</p><p class="card-body" style="font-size:15.5px;line-height:1.8;margin-top:10px">{{lead2|第二段延展一句,收束到下面的要点。}}</p></div>
8
8
  <!-- right: quote card -->
9
- <div class="quote-card" style="position:absolute;left:788px;right:96px;top:186px;height:150px;padding:26px 30px;border-radius:10px"><div class="quote-txt" style="font-size:18px;font-weight:700;line-height:1.5;font-style:italic">{{quote|"一句引言,点题。"}}</div><div class="quote-attr" style="font-size:13px;margin-top:12px">{{quote_attr|— 出处 / 作者}}</div></div>
9
+ <div class="quote-card" style="position:absolute;left:788px;right:96px;top:186px;height:150px;padding:26px 30px;border-radius:var(--card-radius)"><div class="quote-txt" style="font-size:18px;font-weight:700;line-height:1.5;font-style:italic">{{quote|"一句引言,点题。"}}</div><div class="quote-attr" style="font-size:13px;margin-top:12px">{{quote_attr|— 出处 / 作者}}</div></div>
10
10
  <!-- ===== BOTTOM BAND (352–528) ===== -->
11
11
  <!-- left: 2x2 small cards -->
12
12
  <div class="card-grid" style="position:absolute;left:96px;top:352px;width:660px;display:grid;grid-template-columns:1fr 1fr;grid-auto-rows:80px;gap:16px">
@@ -16,7 +16,7 @@
16
16
  <div class="card" style="position:relative;padding:18px 22px"><span class="card-rail" style="position:absolute;left:0;top:18px;width:3px;height:34px;border-radius:2px"></span><div class="card-title" style="font-size:17px;font-weight:700">{{card4_title|要点四}}</div><p class="card-body" style="font-size:13px;line-height:1.5;margin-top:5px">{{card4_body|一句说明}}</p></div>
17
17
  </div>
18
18
  <!-- right: list card (same band as left grid) -->
19
- <div class="list-card" style="position:absolute;left:788px;right:96px;top:352px;height:176px;padding:22px 26px;border-radius:10px"><div class="list-title" style="font-size:16px;font-weight:700;text-align:center">{{list_title|列表标题}}</div><div class="list" style="margin-top:14px;display:flex;flex-direction:column;gap:10px;text-align:center"><div class="list-item" style="font-size:14px">{{list1|列表项一}}</div><div class="list-item" style="font-size:14px">{{list2|列表项二}}</div><div class="list-item" style="font-size:14px">{{list3|列表项三}}</div><div class="list-item" style="font-size:14px">{{list4|列表项四}}</div></div></div>
19
+ <div class="list-card" style="position:absolute;left:788px;right:96px;top:352px;height:176px;padding:22px 26px;border-radius:var(--card-radius)"><div class="list-title" style="font-size:16px;font-weight:700;text-align:center">{{list_title|列表标题}}</div><div class="list" style="margin-top:14px;display:flex;flex-direction:column;gap:10px;text-align:center"><div class="list-item" style="font-size:14px">{{list1|列表项一}}</div><div class="list-item" style="font-size:14px">{{list2|列表项二}}</div><div class="list-item" style="font-size:14px">{{list3|列表项三}}</div><div class="list-item" style="font-size:14px">{{list4|列表项四}}</div></div></div>
20
20
  <!-- ===== FULL-WIDTH NOTE STRIP ===== -->
21
- <div class="note" style="position:absolute;left:96px;right:96px;top:560px;padding:14px 22px;border-radius:8px"><span class="note-label" style="font-size:12px;font-weight:700">温馨提示:</span><span class="note-body" style="font-size:12.5px"> {{note|一句补充说明,替换为真实内容。}}</span></div>
21
+ <div class="note" style="position:absolute;left:96px;right:96px;top:560px;padding:14px 22px;border-radius:var(--card-radius)"><span class="note-label" style="font-size:12px;font-weight:700">温馨提示:</span><span class="note-body" style="font-size:12.5px"> {{note|一句补充说明,替换为真实内容。}}</span></div>
22
22
  </section>