zcbot/skills/ppt/templates/icons
caoqianming 5d23ee682b fix(ppt): 修生成 PPT 缺图标(图标管线四层断点)+ 沙箱 SVG 预览渲染(bump 0.33.3)
查真实用户两个「ppt生成」任务的 DB 执行轨迹:24 页 SVG 共 0 个 <use data-icon>。
根因是图标管线四环节无一强制图标落地——策略层(有时)锁图标,执行层不放、
质检层不拦、工具层还断着。四层一起修:

- B 工具断点:references/SKILL 23 处路径仍指向已不存在的 skills/ppt-master/
  (zcbot 是 skills/ppt/)→ 模型 `ls .../icons/<lib>/|grep` 验名得空集 → 放弃图标;
  且 strategist 强制用的 icon_sync.py 在 zcbot 根本没有(GATE 空转,正是某任务连
  图标都没锁的原因)。修:全量改路径(保留上游署名)+ 新建 icon_sync.py(复用
  embed_icons 解析,验名+拷进 project/icons,缺名非零退出)。
- A 质检兜底(硬门):svg_quality_checker 加图标校验——锁了 icons.library + 非空
  inventory 但全 deck 0 图标 → deck 级 error 退非零(逼回执行重写);单页 0 图标 →
  warning(封面/分节/breathing/尾页豁免)。
- C 执行强制:executor-base §4 + SKILL 执行纪律改为"内容页必须放 1–3 个 inventory
  图标"(自由设计无模板可继承图标,只能逐页手写)。
- D 导出兜底(纵深):svg_to_pptx 导出前预扫,锁了 inventory 却 0 图标 → stderr 大声
  [WARN](非致命,防跳过质检直接导出)。核实 native 转换器本就自己从图标库展开
  <use data-icon>,故原设想的"finalize 硬前置"前提不成立,D 改成与 A 同源的导出层警告。

同版附带修 svg_preview.py 在沙箱里渲不出 SVG(报"未找到 Chrome / Edge"):移植自
ppt-master 的 find_browser() 只认 Windows chrome/msedge,不认镜像自带 /usr/bin/chromium
(给 mermaid 装的)→ 视觉验收这关在容器里全程失效。对齐 rendering/pdf.py 发现逻辑
(认 chromium/chromium-browser/google-chrome + $CHROMIUM 覆盖);render() 补容器必需的
--disable-dev-shm-usage + 临时 --user-data-dir;并修一个静默已久的 bug——--screenshot
传相对路径 chromium 写不出文件(原代码吞 stderr,看着和"没浏览器"一样),改传绝对路径
并暴露 chromium stderr。

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-06-30 13:59:00 +08:00
..
chunk-filled feat(ppt): skill 重构为 SVG-first(移植 ppt-master,弃 python-pptx 版式件)(bump 0.33.0) 2026-06-29 16:38:58 +08:00
phosphor-duotone feat(ppt): skill 重构为 SVG-first(移植 ppt-master,弃 python-pptx 版式件)(bump 0.33.0) 2026-06-29 16:38:58 +08:00
simple-icons feat(ppt): skill 重构为 SVG-first(移植 ppt-master,弃 python-pptx 版式件)(bump 0.33.0) 2026-06-29 16:38:58 +08:00
tabler-filled feat(ppt): skill 重构为 SVG-first(移植 ppt-master,弃 python-pptx 版式件)(bump 0.33.0) 2026-06-29 16:38:58 +08:00
tabler-outline feat(ppt): skill 重构为 SVG-first(移植 ppt-master,弃 python-pptx 版式件)(bump 0.33.0) 2026-06-29 16:38:58 +08:00
README.md fix(ppt): 修生成 PPT 缺图标(图标管线四层断点)+ 沙箱 SVG 预览渲染(bump 0.33.3) 2026-06-30 13:59:00 +08:00

README.md

SVG Icon Library

This directory provides 11,600+ high-quality SVG icons across five libraries that can be directly embedded into SVG files generated by PPT Master. Four are stylistic libraries (pick one per deck); one is a brand-logo library (simple-icons) used as an inset alongside the chosen stylistic library.

Libraries

Library Style Count viewBox Prefix
chunk-filled fill · straight-line geometry (sharp corners, rectilinear) 640 0 0 16 16 chunk-filled/
tabler-filled fill · bezier-curve forms (smooth, rounded contours) 1000+ 0 0 24 24 tabler-filled/
tabler-outline stroke / line 5000+ 0 0 24 24 tabler-outline/
phosphor-duotone duotone · single color + 0.2 opacity backplate (soft depth) 1200+ 0 0 256 256 phosphor-duotone/
simple-icons brand logos (real company / product marks) — single-color silhouettes, color in via fill 3400+ 0 0 24 24 simple-icons/

Per-project icons folder

This directory is the global library. At selection time the Strategist copies the chosen icons into the deck's own <project>/icons/<lib>/ with icon_sync.py:

python3 skills/ppt/scripts/icon_sync.py <project_path> chunk-filled/home tabler-outline/bulb

A name the library does not have is reported and the command exits non-zero — re-pick a real one then, not at export. finalize_svg.py embed-icons embeds project-first (from <project>/icons/), falling back to this global library per-icon.

Custom icons: drop your own .svg into <project>/icons/<lib>/ (any <lib>, e.g. custom/) and reference it as data-icon="<lib>/<name>" — it embeds like any library icon.

Usage

Use placeholder syntax during SVG generation:

<!-- chunk-filled (sharp, geometric — tech/engineering/enterprise tone) -->
<use data-icon="chunk-filled/home" x="100" y="200" width="48" height="48" fill="#0076A8"/>

<!-- tabler-filled (rounded, organic — lifestyle/health/home tone) -->
<use data-icon="tabler-filled/home" x="100" y="200" width="48" height="48" fill="#0076A8"/>

<!-- tabler-outline (light, line-art — refined screen-only showcases) -->
<use data-icon="tabler-outline/home" x="100" y="200" width="48" height="48" fill="#0076A8"/>

<!-- phosphor-duotone (soft depth — single color renders the backplate at 20% opacity) -->
<use data-icon="phosphor-duotone/house" x="100" y="200" width="48" height="48" fill="#0076A8"/>

<!-- simple-icons (brand logo — used alongside the deck's primary library, not as a substitute) -->
<use data-icon="simple-icons/github" x="100" y="200" width="48" height="48" fill="#181717"/>

Attributes:

  • data-icon<library>/<icon-name> (filename without .svg)
  • x, y — Position
  • width, height — Size (recommend 3248px for legibility)
  • fill — Color

finalize_svg.py auto-embeds all placeholders during post-processing. To run manually:

python3 scripts/svg_finalize/embed_icons.py svg_output/*.svg

Searching for Icons

Use ls | grep — zero token cost:

ls skills/ppt/templates/icons/chunk-filled/ | grep home
ls skills/ppt/templates/icons/tabler-filled/ | grep home
ls skills/ppt/templates/icons/tabler-outline/ | grep chart
ls skills/ppt/templates/icons/phosphor-duotone/ | grep house
ls skills/ppt/templates/icons/simple-icons/ | grep github

Style Rules

No default library — actively choose based on the deck's visual needs. Read the source material first, then pick the library whose visual character best serves the presentation. Each library has a distinct visual personality:

  • chunk-filledfill style, built from straight-line commands only (M/L/H/V/Z). Sharp, precise right angles; rectilinear geometry; structured and highly legible at small sizes. Visual weight: heavy, solid, architectural.
  • tabler-filledfill style, built from bezier curves and arcs (C/A). Smooth, rounded, organic contours; warmer and softer than chunk-filled. Visual weight: medium, approachable.
  • tabler-outlinestroke style (line art, default stroke-width 2). Airy, refined, lightweight; uses negative space. Visual weight: light, elegant. Best for screen-only viewing since thin strokes may become hard to read when printed or projected.
  • phosphor-duotoneduotone style; main shape at full opacity plus a backplate of the same color at 20% opacity, producing a soft sense of depth. Visual weight: medium, layered, contemporary.

Two axes to consider when choosing:

  1. Geometry: straight lines (chunk-filled) vs. curves (tabler-filled / phosphor-duotone) vs. open strokes (tabler-outline)
  2. Visual weight: heavy solid (chunk-filled) → medium solid (tabler-filled) → medium layered (phosphor-duotone) → light stroke (tabler-outline)

One presentation = one stylistic library. Pick chunk-filled / tabler-filled / tabler-outline / phosphor-duotone at the start and use it exclusively throughout for generic icons (home, chart, users, etc.). If the chosen library doesn't have an exact icon, find the closest available alternative within that same library — never cross stylistic libraries to fill a gap.

Brand-logo exception (simple-icons). simple-icons is not a stylistic library and does not participate in the "one library" rule. Its job is brand recognition — Slack's purple, GitHub's cat, AWS's color — which is intentionally heterogeneous. Use it alongside the chosen stylistic library, but only for actual company / product / service brand marks. Do not reach for it as a substitute when the chosen stylistic library lacks a generic icon.

Use simple-icons for Do NOT use simple-icons for
Customer / partner / ecosystem logos on a "trusted by" page Generic concepts (home, chart, settings, etc.)
Tech stack icons on architecture / integration diagrams Replacing a missing icon in chunk-filled / tabler-* / phosphor-duotone
Social media handles in a footer Decorative / illustrative purposes

⚠️ Do not mix icons from different stylistic libraries (chunk-filled / tabler-filled / tabler-outline / phosphor-duotone). simple-icons is the sole exception and may co-exist as a brand-logo inset — see the brand-logo exception above.