Sync third-party and MCP marketplace plugins

Constraint: Public skills are published only by explicit administrator action unless they are tracked third-party market sources.
Confidence: high
Scope-risk: narrow
Directive: Keep private/internal skills out of the public marketplace and preserve normal incremental market Git history.
Tested: Marketplace validation passed.
This commit is contained in:
KeyInfo Bot
2026-07-14 00:01:29 +08:00
parent e3dd129116
commit 658b4f3f5d
156 changed files with 5013 additions and 7830 deletions
+12 -12
View File
@@ -280,6 +280,18 @@
},
"category": "设计"
},
{
"name": "oh-my-codex",
"source": {
"source": "local",
"path": "./plugins/oh-my-codex"
},
"policy": {
"installation": "AVAILABLE",
"authentication": "ON_INSTALL"
},
"category": "开发工具"
},
{
"name": "ui-ux-pro-max",
"source": {
@@ -304,18 +316,6 @@
},
"category": "开发工具"
},
{
"name": "oh-my-codex",
"source": {
"source": "local",
"path": "./plugins/oh-my-codex"
},
"policy": {
"installation": "AVAILABLE",
"authentication": "ON_INSTALL"
},
"category": "开发工具"
},
{
"name": "ppt-master",
"source": {
@@ -3,5 +3,5 @@
"name": "playwright浏览器自动化操作",
"version": "20260605",
"keySource": "none",
"syncedAt": "2026-07-12T16:01:37Z"
"syncedAt": "2026-07-13T16:01:28Z"
}
@@ -2,8 +2,8 @@
"sourceId": "next-skills",
"repo": "https://github.com/vercel/next.js.git",
"ref": "canary",
"commit": "31541356c21bc389150b958379acb26aa7e97b22",
"commit": "41b823880d688b3e9f9aae3323b08ddd457240c2",
"adapter": "skill-collection",
"sourcePath": "skills",
"syncedAt": "2026-07-12T16:00:00Z"
"syncedAt": "2026-07-13T16:00:00Z"
}
+13 -1
View File
@@ -13,7 +13,17 @@
English | [中文](./README_CN.md)
<details open>
<summary>This project is kept free and open source with the support of <a href="https://www.packyapi.com/register?aff=ppt-master">PackyCode</a>, <a href="https://apikey.fun/register?aff=PPT-MASTER">APIKEY.FUN</a>, <a href="https://runapi.co/register?aff=WMLJ">RunAPI</a>, <a href="https://www.compshare.cn/coding-plan?ytag=GPU_YY-git_pptmaster0624">YouYun ZhiSuan</a> and other sponsors.</summary>
<summary>This project is kept free and open source with the support of <a href="https://www.kimi.com/code/?aff=ppt-master">Kimi</a>, <a href="https://www.packyapi.com/register?aff=ppt-master">PackyCode</a>, <a href="https://apikey.fun/register?aff=PPT-MASTER">APIKEY.FUN</a>, <a href="https://runapi.co/register?aff=WMLJ">RunAPI</a>, <a href="https://www.compshare.cn/coding-plan?ytag=GPU_YY-git_pptmaster0624">YouYun ZhiSuan</a> and other sponsors.</summary>
<p align="center">
<a href="https://www.kimi.com/code/?aff=ppt-master"><img src="https://gcdn.moonshot.cn/growth-cdn/sponsor/kimi-en.png" alt="Kimi" width="100%"></a>
</p>
Thanks to [Kimi](https://www.kimi.com/code/?aff=ppt-master) for sponsoring this project! [Kimi K2.7](https://platform.kimi.ai/docs/guide/kimi-k2-7-code-quickstart) is an open-source agentic model developed by Moonshot AI. With PPT Master, Kimi can understand source materials such as PDFs, DOCX files, and web pages, identify key points, structure the narrative, and generate a natively editable PPTX that you can continue refining in PowerPoint.
**Try [Kimi Code](https://www.kimi.com/code/?aff=ppt-master), or access the API through the Kimi Open Platform ([中文站](https://platform.kimi.com?aff=ppt-master) | [Global](https://platform.kimi.ai?aff=ppt-master)).**
<hr>
<table>
<tr>
@@ -397,6 +407,8 @@ PPT Master is currently built and maintained primarily by me. Every new template
**Corporate sponsors**
<a href="https://www.kimi.com/code/?aff=ppt-master"><picture><source media="(prefers-color-scheme: dark)" srcset="docs/assets/sponsors/kimi-dark.svg"><img src="docs/assets/sponsors/kimi-light.svg" alt="Kimi" height="40" /></picture></a>
&nbsp;
<a href="https://www.packyapi.com/register?aff=ppt-master"><img src="docs/assets/sponsors/packycode.png" alt="PackyCode" height="40" /></a>
&nbsp;
<a href="https://apikey.fun/register?aff=PPT-MASTER"><img src="docs/assets/sponsors/apikey-fun.png" alt="APIKEY.FUN" height="40" /></a>
@@ -2,8 +2,8 @@
"sourceId": "ppt-master",
"repo": "https://github.com/hugohe3/ppt-master.git",
"ref": "main",
"commit": "8f76b6fcef5f24c8716894adeb6fe24c5a418bc3",
"commit": "465e3b4149b852d33ddd1cb94ac059401fe4e823",
"adapter": "claude-skill",
"sourcePath": "skills/ppt-master",
"syncedAt": "2026-07-12T16:00:00Z"
"syncedAt": "2026-07-13T16:00:00Z"
}
@@ -34,7 +34,7 @@ description: "多格式源文档到高质量 SVG 页面再导出 PPTX 的多阶
> 5. **NO SPECULATIVE EXECUTION** — "Pre-preparing" content for subsequent Steps is FORBIDDEN (e.g., writing SVG code during the Strategist phase)
> 6. **NO SUB-AGENT SVG GENERATION** — Executor Step 6 SVG generation is context-dependent and MUST be completed by the current main agent end-to-end. Delegating page SVG generation to sub-agents is FORBIDDEN
> 7. **SEQUENTIAL PAGE GENERATION ONLY** — In Executor Step 6, after the global design context is confirmed, SVG pages MUST be generated sequentially page by page in one continuous pass. Grouped page batches (for example, 5 pages at a time) are FORBIDDEN
> 8. **SPEC_LOCK RE-READ PER PAGE** — Before generating each SVG page, Executor MUST `read_file <project_path>/spec_lock.md`. All colors / fonts / icons / images MUST come from this file — no values from memory or invented on the fly. Executor MUST also look up the complete `pptx_masters` / `pptx_layouts` structure, `pptx_structure.template_adherence` when present, the current page's `page_rhythm` (`anchor` / `dense` / `breathing`), `page_layouts` (the input template SVG), and `page_charts`. Master/Layout structure exists before drawing; export never infers it later. This rule exists to resist context-compression drift on long decks and to break the uniform "every page is a card grid" default
> 8. **SPEC_LOCK RE-READ PER PAGE** — Before generating each SVG page, Executor MUST `read_file <project_path>/spec_lock.md`. All colors / fonts / icons / images MUST come from this file — no values from memory or invented on the fly. Executor MUST also read `pptx_structure.mode`, the current page's `page_rhythm` (`anchor` / `dense` / `breathing`), and `page_charts`. Only a deck/layout template route (`mode: structured`) looks up `page_layouts` (the input template SVG), `page_pptx_layouts` (the page assignment), `pptx_masters`, `pptx_layouts` (the unique reusable roster), and `template_adherence`; free-design and brand-only routes use `mode: flat` and omit those sections. This rule exists to resist context-compression drift on long decks and to break the uniform "every page is a card grid" default
> 9. **SVG MUST BE HAND-WRITTEN, NOT SCRIPT-GENERATED** — Every SVG page is written by the main agent directly, one page at a time (see rules 6 and 7). Writing or running a Python / Node / shell script that produces the SVG files in batch — looping over pages, templating from data, or emitting them via a generator — is FORBIDDEN, including under "save tokens", "quick draft", or "user is in a hurry" pretexts. The script-generation path was tried on a feature branch and abandoned: cross-page visual consistency depends on per-page authoring with full upstream context, which a generator script cannot reproduce. **Narrow exception**: `preset_shape_svg.py` may print one deterministic stock-shape fragment to stdout after the main agent has selected its semantic role, frame, and paint. It cannot write `svg_output/`, choose layout, batch shapes, or generate a page; the main agent reads the fragment and inserts it through the normal hand-authored page edit
> 10. **FOLLOW DETERMINISTIC ROUTING RULES** — Do not add blocking routing questions when this skill defines a route. If the user request violates a route precondition, state the required prerequisite and stop that route instead of asking the user to choose around the rule. Ordinary finite options, stylistic preferences, and recoverable details are surfaced with a recommended value plus alternatives at the next existing confirmation gate.
@@ -141,11 +141,12 @@ keep model context small. Mechanical normalization may express the source facts
in the current explicit SVG contract and expand fixed-layer group wrappers into
direct atoms, but it MUST NOT merge, split, promote, demote, rename, or
re-parent source structure. Export compiles the selected contract and never
infers a different one. Because the current structured roster materializes only
identities referenced by emitted page prototypes, `mirror` is available only
when every source Layout is used by a source Slide and every source Master is
reachable through those Layouts. Otherwise stop and report the exact
unreachable identities; never drop them or invent a carrier page.
infers a different one. Mirror emits one complete page prototype per source
Slide plus one definition-only `layout_<layout_key>.svg` prototype for every
source Layout unused by those Slides. The independent Master/Layout roster then
registers the complete supported source graph without publishing synthetic
carrier pages. Stop only when required native evidence is missing or unsupported;
never silently drop or merge an identity.
**FALLBACK**: Ambiguous requests such as "make this PPT more professional" require exactly one discriminator question: preserve original page count/order and slide wording, or treat the deck as source material and restructure it?
@@ -244,7 +245,7 @@ Do **not** reinterpret this boundary as 1:1 redesign or free SVG generation. Use
|---|---|
| One or more explicit template workspace paths (each resolves to `templates/design_spec.md`, or to a compatible legacy-flat root `design_spec.md`, with `kind: brand` / `kind: layout` / `kind: deck` in YAML frontmatter) | Normalize each source directory, read its `kind`, dispatch per the kind matrix below, fuse if multiple |
| Current `create-template` workflow just completed project scope and validated its exact `<project>/` workspace | Consume that single workspace in place; it cannot join multi-path fusion |
| Anything else — bare template names ("用 academic_defense"), style descriptions ("麦肯锡风格"), brand mentions ("招商银行风格"), vague intent ("想用个模板"), or silence | Skip Step 3, free design |
| Anything else — bare template names ("用 presentation_core"), style descriptions ("麦肯锡风格"), brand mentions ("中国电信风格"), vague intent ("想用个模板"), or silence | Skip Step 3, free design |
There is no slug matching, no name lookup, no fuzzy resolution. A name without a path does not trigger — the user must give a path the AI can `cd` into.
@@ -252,7 +253,7 @@ There is no slug matching, no name lookup, no fuzzy resolution. A name without a
> Style descriptions ("麦肯锡风格" / "Keynote 风" / "极简风" / etc.) never trigger Step 3. They flow into the Strategist confirmation stage as a style brief (color / typography / tone in fields eg).
> Bare names ("academic_defense", "招商银行", "anthropic") do NOT trigger Step 3 even if a matching directory exists in the library. The user must give a path. AI must not "helpfully" resolve a name to a path.
> Bare names ("presentation_core", "中国电信", "anthropic") do NOT trigger Step 3 even if a matching directory exists in the library. The user must give a path. AI must not "helpfully" resolve a name to a path.
> "What templates exist?" is out-of-band Q&A — answer by listing entries from `brands_index.json` / `layouts_index.json` / `decks_index.json` together with their paths. Listing alone does not advance the pipeline; the user must send a path back to trigger Step 3.
@@ -303,7 +304,7 @@ A project-scoped workspace has the same portable routing as a library workspace.
Legacy template packages may ship `native_structure.json` + `source_template.pptx`, omit root Master identity, use direct atomic placeholders, or carry old baseline/distillation metadata. Do not copy or consume those semantic contracts through Step 3. Run [`restore-pptx-structure`](workflows/restore-pptx-structure.md) on the package first, then return with the migrated workspace path. Old flat packaging remains readable when its SVG structure is already current.
The Strategist confirmation stage decides whether the selected template is used `strict` or `adaptive`. New projects use `pptx_structure.mode: structured`, map every page to one input SVG in `page_layouts`, and write complete `pptx_masters` / `pptx_layouts` output mappings before SVG generation. Strict preserves the template's declared Master/Layout/slot contract. Adaptive keeps the template Master and may assign a new Layout key during authoring when the composition genuinely changes. Non-mirror paint and typography follow the project skin rules.
The Strategist confirmation stage decides whether the selected deck/layout template is used `strict` or `adaptive`. Those template projects use `pptx_structure.mode: structured`, map every page to one input SVG in `page_layouts`, declare unique reusable identities in `pptx_masters` / `pptx_layouts`, and assign each page through `page_pptx_layouts` before SVG generation. A Layout definition may remain unused by generated pages when it names an installed template SVG as its prototype source. Brand-only projects remain on the free-design `mode: flat` route. Strict preserves the template's declared Master/Layout/slot contract. Adaptive keeps the template Master and may define and assign a new Layout key during authoring when the composition genuinely changes. Non-mirror paint and typography follow the project skin rules.
#### Multi-path fusion
@@ -350,9 +351,9 @@ When fusion happens (any multi-path case), the resulting `<project>/templates/de
```markdown
> **Fused from:**
> - deck: `templates/decks/招商银行/` base
> - deck: `templates/decks/中国电信/` base
> - brand: `templates/brands/anthropic/` identity override
> - layout: `templates/layouts/academic_defense/` structure override
> - layout: `templates/layouts/presentation_core/` structure override
> - conflicts resolved: Color Scheme from anthropicuser picked a
```
@@ -621,7 +622,7 @@ python3 ${SKILL_DIR}/scripts/svg_editor/server.py <project_path> --live --daemon
> Image facts: trust the `analysis/image_analysis.csv` regenerated at the end of Step 5. If `images/` changed since (the user swapped or added files), re-run `python3 ${SKILL_DIR}/scripts/analyze_images.py <project_path>/images` before laying images out — facts are re-derived on use, never a stale store (Step 4 image-facts note).
**Per-page spec_lock re-read (Mandatory)**: before **each** SVG page, `read_file <project_path>/spec_lock.md` and use only its colors / fonts / icons / images, plus the complete `pptx_masters` / `pptx_layouts` structure and the per-page `page_rhythm` / `page_layouts` / `page_charts` lookups. Resists context-compression drift on long decks. See executor-base.md §2.1.
**Per-page spec_lock re-read (Mandatory)**: before **each** SVG page, `read_file <project_path>/spec_lock.md` and use only its colors / fonts / icons / images, plus `pptx_structure.mode` and the per-page `page_rhythm` / `page_charts` lookups. Read `page_layouts` / `page_pptx_layouts` / `pptx_masters` / `pptx_layouts` only on a structured deck/layout template route; they are absent in flat free-design and brand-only projects. Resists context-compression drift on long decks. See executor-base.md §2.1.
> ⚠️ **Main-agent only**: SVG generation MUST stay in the current main agent — page design depends on full upstream context. Do NOT delegate to sub-agents.
> ⚠️ **Generation rhythm**: generate pages sequentially, one at a time, in the same continuous context. Do NOT batch (e.g., 5 per group).
@@ -632,7 +633,7 @@ Each completed SVG MUST be a standalone, complete representation of that slide's
Template pages MUST start from the complete `page_layouts` SVG, keep all inherited visible objects in `svg_output/`, and preserve the locked root Master/Layout identity plus stable atomic Master/Layout and slot ids. Strict keeps the prototype structure unchanged. Adaptive keeps its Master contract and, when Layout atoms or slot topology/bounds genuinely evolve, assigns a new key/name and updates `spec_lock.md` immediately. Non-mirror fill/stroke/effects/font sizes still follow `spec_lock`.
Free-design and brand-only pages are also structured from the first draft. Use the planned Master roster and page Layout mapping, author Master/Layout fixed visuals only as direct root atoms (never `<g>`), and author reusable content zones as top-level slot groups with positive bounds plus exactly one compatible carrier. Every mapped page MUST mark the standard slots it actually has — `title` / `subtitle` / `body` / `picture` / `slide-number` / `footer` — and its `data-pptx-layer` marks: the deck-wide background and every-page chrome as `master`, this layout key's static framing (including chrome repeated on content pages but absent from the cover) as `layout`, per [`executor-base.md`](references/executor-base.md) §1.2. Repeated chrome stays on its appropriate Master/Layout layer; a per-page heading that should not remain Slide-local is authored as a `title` or `subtitle` slot, never as a fixed Layout atom. Any text or image whose value varies across pages sharing one Layout key MUST be carried by a slot or remain Slide-local. A page shipping only a marked background exports a bare Master and an empty Layout. A Layout may intentionally have zero slots — a stated decision for a fixed composition, never a silent default. Do not add `data-pptx-layout-kind`, `distilled`, `utility`, or a full-page fake slot.
Free-design and brand-only pages use `pptx_structure.mode: flat`. Draw the complete page directly: keep backgrounds, repeated chrome, headings, text, images, and decoration as ordinary Slide-local SVG content. Do not plan `pptx_masters` / `pptx_layouts` / `page_pptx_layouts`, do not add root Master/Layout identity, and do not add `data-pptx-layer` or `data-pptx-placeholder` metadata. Group logical content normally with top-level `<g id>` elements. Export materializes one clean project-owned Master plus one Blank Layout, applies the locked theme colors/fonts/title-body defaults, removes stock content placeholders and unused built-in Layouts, and retains only the standard date/footer/slide-number capability hooks. It does not promote or deduplicate page content.
Do not duplicate specialized identity with `data-pptx-role`. Add it only to structural page-frame objects whose package, page-number, or animation behavior is not already expressed by `data-pptx-layer`, `data-pptx-placeholder`, or `data-pptx-native`; such an element needs a stable unique `id`. Do not add generic content roles to ordinary titles, body text, cards, KPIs, diagrams, charts, icons, or images. Full contract: [`references/semantic-svg.md`](references/semantic-svg.md).
@@ -648,7 +649,7 @@ python3 ${SKILL_DIR}/scripts/svg_quality_checker.py <project_path>
```
- Any `error` (banned SVG features, viewBox mismatch, spec_lock drift, etc.) MUST be fixed before proceeding — return to Visual Construction, regenerate that page, re-run check.
- `warning` entries (low-res image, non-PPT-safe font tail, etc.): fix when straightforward, otherwise acknowledge and release.
- **PPTX-structure warnings are the exception — never acknowledge-and-release.** For each empty-Layout / framing-only-Layout / bare-Master / duplicate-layout-key warning, output one disposition line: either the fix applied (merge keys in `spec_lock.md pptx_layouts` + SVG roots, mark the missing slots/layers) or why the flagged state is intended (e.g. "P01 cover is a fixed composition, zero-slot by design"). "0 errors" alone does not pass this gate.
- **Structured template routes only — PPTX-structure warnings are the exception.** For each empty-Layout / framing-only-Layout / bare-Master / duplicate-layout-key warning, output one disposition line: either the fix applied (merge keys in `spec_lock.md pptx_layouts` + SVG roots, mark the missing slots/layers) or why the flagged state is intended (e.g. "P01 cover is a fixed composition, zero-slot by design"). Flat free-design and brand-only routes have no positive Master/Layout checkpoint; the checker instead enforces a complete flat lock including colors/fonts/title-body defaults, plus the absence of Master/Layout/layer/placeholder metadata. "0 errors" alone does not pass a structured template gate when such warnings remain undispositioned.
- Run against `svg_output/` (not after `finalize_svg.py` — finalize rewrites SVG and masks violations).
**Logic Construction Phase**: generate speaker notes → `<project_path>/notes/total.md`
@@ -660,7 +661,7 @@ python3 ${SKILL_DIR}/scripts/svg_quality_checker.py <project_path>
- [x] First-page gate run after page 1 (errors fixed before page 2)
- [x] All SVGs generated to svg_output/
- [x] svg_quality_checker.py passed (0 errors)
- [x] PPTX-structure warnings dispositioned one by one (each fixed or stated as intended)
- [x] Structured-template PPTX warnings dispositioned one by one when applicable
- [x] Speaker notes generated at notes/total.md
```
@@ -738,10 +739,21 @@ python3 ${SKILL_DIR}/scripts/svg_to_pptx.py <project_path>
> pages remain ordinary SVG pictures unless the user independently accepts the
> results of an unsupported Office conversion.
> **PPTX structure mode** — release export requires
> `spec_lock.md` `pptx_structure.mode: structured`, a complete
> `pptx_masters` roster, and exactly one `pptx_layouts` row per page in
> `<master_key> | <layout_key> | <PowerPoint layout name>` form. Every SVG
> **PPTX structure mode** — release export reads the explicit route from
> `spec_lock.md`. Free-design and brand-only projects use
> `pptx_structure.mode: flat`, omit `pptx_masters` / `pptx_layouts` /
> `page_pptx_layouts` / `page_layouts`, and author no Master/Layout/layer/placeholder metadata in
> SVG. Export keeps every represented object Slide-local while materializing
> one clean project-owned Master and one Blank Layout from the current lock;
> stock content placeholders and unused built-in Layouts are removed; only the
> standard date/footer/slide-number capability hooks remain.
>
> Deck/layout template projects use `pptx_structure.mode: structured`, a
> complete `pptx_masters` roster, one unique `pptx_layouts` definition per
> reusable Layout, and exactly one `page_pptx_layouts` assignment per page.
> A Layout definition records Master key, PowerPoint picker name, and either a
> `P<NN>` or `template:<basename>` prototype source; an unused Layout uses a template prototype
> and is registered without a published carrier slide. Every SVG
> root repeats the Master/Layout keys and picker names. Master/Layout fixed
> visuals are direct root atoms; a `<g data-pptx-layer="master|layout">` is
> forbidden. Reusable slots are direct root `<g id>` elements with positive
@@ -749,23 +761,26 @@ python3 ${SKILL_DIR}/scripts/svg_to_pptx.py <project_path>
> uses only the explicit `object` + `proxy` fallback, and a Layout may
> intentionally have zero slots.
>
> Export creates the declared Masters and Layouts, promotes the represented
> Structured template export creates the declared Masters and Layouts,
> promotes the represented
> atoms, binds slot carriers, installs the locked theme/text defaults, and
> reopens the candidate package to verify Presentation → Master → Layout →
> Slide registration, picker names, static-object rosters, placeholder
> type/index/bounds, carrier bindings, hidden proxies, and zero-slot Layouts.
> It never selects pages, clusters visuals, promotes repeated chrome by
> heuristic, or invents missing structure. Legacy `baseline`, `template`,
> heuristic, or invents missing structure. Legacy structured/template projects
> using `baseline`, `template`,
> `preserve`, `layout_strategy`, `data-pptx-layout-kind`,
> `distilled`/`utility`, direct atomic placeholders, or missing Master
> `distilled`/`utility`, direct atomic placeholders, or incomplete Master
> identity must run
> [`restore-pptx-structure`](workflows/restore-pptx-structure.md) before
> export.
> **Template structured export** — `page_layouts` records the complete
> input prototype per page while `pptx_masters` / `pptx_layouts` record the
> output structure from planning onward. Strict keeps the prototype
> input prototype per page, `pptx_masters` / `pptx_layouts` record the unique
> reusable output roster, and `page_pptx_layouts` records page assignment.
> Strict keeps the prototype
> Master/Layout/slot contract. Adaptive keeps its Master and may assign a new
> Layout identity during page authoring only when fixed Layout atoms or slot
> topology/bounds change; the lock is updated immediately. Non-mirror skin
@@ -18,7 +18,7 @@ Global artifact ownership rules for PPT Master projects.
| `analysis/<stem>.slide_library.json` | Native PPTX structure facts | Text slots, geometry, native tables, native chart caches, SmartArt nodes/connections | Direct PPTX workflows use as native fill/structure contract |
| `analysis/image_analysis.csv` | Regenerated image fact view | Measured facts about the current `images/` folder | Re-run `analyze_images.py` before reading image facts after changes |
| `design_spec.md` | Human design narrative | Explains design intent, outline, rationale, and resource plan | Strategist writes; humans and later roles read for intent |
| `spec_lock.md` | Execution contract | Literal colors, typography, icons, images, page rhythm, input template prototypes, charts, Master roster, and complete page-to-Master/Layout mapping | Strategist writes the initial structured contract; Executor re-reads it before every page and may add a new adaptive Layout identity only while authoring the page that first needs it; `restore-pptx-structure` owns legacy migration |
| `spec_lock.md` | Execution contract | Literal colors, typography, icons, images, page rhythm, charts, and the route's PowerPoint structure mode; deck/layout template routes additionally own input prototypes, the Master roster, and the complete page-to-Master/Layout mapping | Strategist writes the route-specific contract; Executor re-reads it before every page and may add a new adaptive Layout identity only on a structured template route while authoring the page that first needs it; `restore-pptx-structure` owns legacy template migration |
| `images/` | Runtime image pool | User, extracted, AI, web, formula, slice, EMF/WMF assets | Step 5 writes here; `analysis/image_analysis.csv` derives from current contents |
| `icons/` | Project icon inventory | Icons copied by `icon_sync.py` for this project | Executor uses locked project icons; exporter may fall back to global library only as documented |
| `templates/` | Project template reference | Step 3 imported specs, template SVGs, and non-image assets | Strategist/Executor read only when Step 3 is triggered |
@@ -42,9 +42,9 @@ Global artifact ownership rules for PPT Master projects.
| Sources read policy | In `sources/`, read content-type files (`.md` / `.markdown` / `.txt` / `.csv` / `.tsv` / `.json` / `.jsonl` / `.yaml` / `.yml`) and judge by content — a `.json` / `.csv` may be core content or just data. Exclude known sidecars: `*.conversion_profile.json` and `*_files/image_manifest.json`. `analysis/` facts (`source_profile.json`, `<stem>.slide_library.json`) are read per Step 4 / direct-PPTX workflow, not in the `sources/` content scan. |
| PPTX structure | `slide_library.json` owns native geometry, slot facts, and SmartArt layout/relationships for direct PPTX workflows. |
| Design contract | `design_spec.md` explains; `spec_lock.md` executes. Executor must not infer execution values from prose. |
| Free-design structure authority | Strategist plans the Master roster and complete page-to-Master/Layout mapping before SVG generation. `spec_lock.md` owns that mapping; `svg_output/` owns the matching root identities, atomic Master/Layout visuals, slot groups, bounds, and carriers. Export never infers structure. |
| Template structure authority | `page_layouts` owns the per-page input prototype. `pptx_masters` and `pptx_layouts` own the complete output structure from planning onward; strict keeps the prototype contract, while adaptive may create a new Layout identity during page authoring and updates the lock immediately. Templates validate provenance but never add missing visible objects during export. |
| Legacy structure migration | [`restore-pptx-structure`](../workflows/restore-pptx-structure.md) owns conversion of old unmapped/distilled/preserve SVG projects and legacy template packages into the current structured contract. The exporter does not migrate or visually cluster them. |
| Free-design / brand-only packaging authority | `spec_lock.md` declares `pptx_structure.mode: flat` and omits `pptx_masters`, `pptx_layouts`, `page_pptx_layouts`, and `page_layouts`. `svg_output/` owns the complete Slide-local visual design without root Master/Layout identity, fixed-layer ownership, or placeholder metadata. Export materializes one clean project-owned Master plus one Blank Layout, applies the locked theme defaults, removes stock content placeholders/Layout inventory, and retains only the standard date/footer/slide-number capability hooks. |
| Template structure authority | `page_layouts` owns each page's authoring-input prototype. `pptx_masters` / `pptx_layouts` own the unique reusable output definitions, while `page_pptx_layouts` owns page assignment. Strict keeps the prototype contract; adaptive may create a new Layout definition during page authoring and updates its assignment immediately. Unused definitions may register without a published Slide. Templates validate provenance but never add missing visible page objects during export. |
| Legacy structure migration | [`restore-pptx-structure`](../workflows/restore-pptx-structure.md) owns conversion of old unmapped/distilled/preserve structured projects and legacy template packages into the current template contract. An intentional free-design or brand-only `flat` project is not a migration input. The exporter does not migrate or visually cluster legacy template structure. |
| Image facts | `images/` is live state; `analysis/image_analysis.csv` is a regenerated view, not a durable cache. |
| SVG source | `svg_output/` is the only author source for generated pages. |
| Page-design closure | On SVG-authoring routes, every visible exported-slide object exists in the corresponding page SVG or an explicitly referenced visual asset. |
@@ -4,7 +4,7 @@
**Hard rule — complete page SVG**: Every visible object intended for the exported slide MUST exist in the final page SVG or be explicitly referenced by it. Templates and `spec_lock.md` guide construction; they are not export-time overlays for missing visible content.
**Hard rule — structure from the first page draft**: Every new page reads its locked Master/Layout row and declares `data-pptx-master`, `data-pptx-master-name`, `data-pptx-layout`, and `data-pptx-layout-name` on the root. Do not add `data-pptx-layout-kind` or duplicate identity with `data-pptx-page-role`. Add `data-pptx-role` only to structural page-frame objects whose package, page-number, or animation behavior is not already expressed by layer, placeholder, or native-object metadata; the marked element uses a stable unique `id`. See [`semantic-svg.md`](./semantic-svg.md).
**Hard rule — route-specific PowerPoint structure**: Free-design and brand-only projects use `pptx_structure.mode: flat`: write no root Master/Layout identity, `data-pptx-layer`, or `data-pptx-placeholder`; every visible object remains Slide-local. Export materializes one clean project-owned Master plus one Blank Layout from the current lock. Deck/layout template projects use `mode: structured`: every page reads its locked Master/Layout row and declares the four root identity attributes from the first draft. Do not add `data-pptx-layout-kind` or duplicate identity with `data-pptx-page-role`. Add `data-pptx-role` only to structural page-frame objects whose package, page-number, or animation behavior is not already expressed by specialized metadata; the marked element uses a stable unique `id`. See [`semantic-svg.md`](./semantic-svg.md).
**Hard rule — supported PPTX route**: The only supported generated-PPTX path is `svg_output/` through the project SVG-to-DrawingML converter. Step 7.2 still generates `svg_final/` as a mandatory self-contained visual preview that may be inserted as an SVG picture. Do not treat PowerPoint's manual Convert-to-Shape operation as an authoring target or compatibility requirement.
@@ -42,7 +42,7 @@ Resolve the per-page template SVG via `spec_lock.md page_layouts` (authoritative
1. **Mirror-mode template** (template's `design_spec.md` frontmatter has `replication_mode: mirror`) → see §1.1 below. The page is consumed as a **visual reference**, not as a placeholder shell.
2. `spec_lock.md page_layouts` has `P<NN>: <basename>` for this page → inherit the structure of `templates/<basename>.svg` (already in context from §1.0).
3. `template_adherence` is present but this page has no `page_layouts` entry → stop; the template contract is incomplete. Adaptive mode must still select a reference SVG.
4. No deck/layout template at all → free design using the complete `pptx_masters` / `pptx_layouts` contract already planned in `spec_lock.md`.
4. No deck/layout template at all → flat free design: use the visual composition planned in §IX, but write no native Master/Layout mapping or SVG structure metadata.
> Note: `page_layouts` disambiguates the multiple content variants a template may ship; missing mappings are contract errors.
@@ -92,11 +92,11 @@ Before generating each page, output which template is used:
### 1.2 PowerPoint Master / Layout Mapping
`page_layouts` selects an input SVG prototype only on deck/layout template routes. `pptx_masters` and `pptx_layouts` always declare the output PowerPoint structure before the first page is drawn.
This section applies only to deck/layout template routes. `page_layouts` selects the input SVG prototype, `pptx_masters` / `pptx_layouts` declare unique reusable output definitions, and `page_pptx_layouts` assigns every generated page before the first page is drawn. Free-design and brand-only routes use `pptx_structure.mode: flat`, omit all four sections, skip the rest of §1.2, and keep every SVG object Slide-local.
**Hard rule — current mode only**: `pptx_structure.mode` is `structured`. Missing mode or legacy values (`baseline`, `template`, `preserve`, `flat`), `layout_strategy`, Layout-kind fields, partial mappings, and old direct placeholders must stop generation and route to [`restore-pptx-structure`](../workflows/restore-pptx-structure.md).
**Hard rule — template mode only**: A deck/layout template project uses `pptx_structure.mode: structured`. Missing mode or legacy values (`baseline`, `template`, `preserve`), `layout_strategy`, Layout-kind fields, partial mappings, and old direct placeholders must stop generation and route to [`restore-pptx-structure`](../workflows/restore-pptx-structure.md). `flat` is valid only when no deck/layout template is active.
**Hard rule — root identity**: A row `P<NN>: <master_key> | <layout_key> | <layout name>` binds the page to a Master listed in `pptx_masters`. Put that Master key/name and Layout key/name on the root SVG. A Layout key belongs to exactly one Master and remains globally unique.
**Hard rule — root identity**: A `page_pptx_layouts` row binds the page to one key in `pptx_layouts`; that unique definition supplies its Master key, Layout picker name, and prototype source. Put the declared Master key/name and Layout key/name on the root SVG. A Layout key belongs to exactly one Master and remains globally unique.
**Hard rule — atomic fixed layers**: Every `data-pptx-layer="master|layout"` visual is one direct root child that compiles to one DrawingML object. A marked `<g>` is forbidden. When reconstructing source PPTX groups, recursively push supported transforms, paint, opacity, and z-order into atomic children. Repeat the identical ordered Master atom contract on every page using that Master and the identical ordered Layout atom contract on every page sharing that `(master, layout)` pair.
@@ -193,16 +193,17 @@ Before drawing each page, look up its entry in `page_layouts` to decide which ba
Do **not** invent a prototype entry, and do **not** assume a template just because `templates/` exists. For either template-adherence value, a missing or invalid `page_layouts` row is an upstream contract error. Free design is a separate deck route, never a per-page fallback.
**Per-page PowerPoint layout lookup — `pptx_layouts` section**:
**Per-page PowerPoint layout lookup — structured deck/layout templates only**:
- `pptx_structure.mode` must equal `structured`; any other or missing value routes to legacy restoration.
- When `pptx_structure.mode` is `flat`, skip this lookup and the structured scaffold below. `pptx_masters`, `pptx_layouts`, `page_layouts`, and the corresponding SVG metadata must all be absent.
- When a deck/layout template is active, `pptx_structure.mode` must equal `structured`; any other or missing value routes to legacy restoration.
- Read the current page row as `<master_key> | <layout_key> | <layout name>` and resolve `master_key` in `pptx_masters`. Missing, malformed, or partial mappings stop before drawing.
- Write matching root Master/Layout key and picker names. Do not write `data-pptx-layout-kind` or `data-pptx-page-role`.
- On strict template use, the row and SVG contract match the selected prototype exactly.
- On adaptive template use, retain the prototype Master. If the final composition changes fixed Layout atoms or slot topology/bounds, allocate a new key/name and update this row before completing the page.
- A Layout key may repeat across non-adjacent pages only when its fixed atoms and slot contracts are identical.
**Structured-page scaffold**:
**Structured template-page scaffold**:
```xml
<svg viewBox="…"
@@ -230,7 +231,7 @@ Do **not** invent a prototype entry, and do **not** assume a template just becau
</svg>
```
Master/Layout atoms and slot groups are direct root children and precede ordinary content groups. Structural metadata nested inside an ordinary content group fails export.
On structured template pages, Master/Layout atoms and slot groups are direct root children and precede ordinary content groups. Structural metadata nested inside an ordinary content group fails export. Flat pages use ordinary top-level semantic groups only.
**Per-page chart reference — `page_charts` section**:
@@ -245,7 +246,7 @@ Before drawing each page, look up its entry in `page_charts` to decide which cha
## 3. Execution Guidelines
- **Proximity**: group related elements with tight spacing; separate unrelated groups
- **Element grouping (Mandatory)**: wrap every logical Slide-local content unit — title, core-message line, each content block, card, list item, and diagram — in a top-level `<g id="...">` with a descriptive id. Slot `<g>` elements are already semantic groups and are excluded from the 38 ordinary content-group budget. Direct Master/Layout atoms are the required exception to grouping and may never be wrapped in a layer `<g>`. Authored native preset fragments (`preset_shape_svg.py`) already are one atomic `<g id>` each and count as one ordinary content group; keep their labels in a sibling parent `<g>`.
- **Element grouping (Mandatory)**: wrap every logical Slide-local content unit — title, core-message line, each content block, card, list item, and diagram — in a top-level `<g id="...">` with a descriptive id. Flat free-design/brand-only pages use ordinary semantic groups for every logical unit. On structured template pages, slot `<g>` elements are already semantic groups and direct Master/Layout atoms are the required exception to grouping. Authored native preset fragments (`preset_shape_svg.py`) already are one atomic `<g id>` each and count as one ordinary content group; keep their labels in a sibling parent `<g>`.
- **Spec adherence**: follow color, layout, canvas format, and typography in the spec
- **Template structure**: if templates exist, inherit the visual framework
- **Main-agent ownership**: SVG generation must run in the main agent (not sub-agents) — pages share upstream context for cross-page visual continuity
@@ -253,8 +254,8 @@ Before drawing each page, look up its entry in `page_charts` to decide which cha
- **Default — stage each page with the style's composition geometry (may override when the content genuinely calls for a plain grid)**: an SVG page is a canvas, not a DOM. Before defaulting to stacked rounded-rect cards or uniform equal columns, pick one page-scale move from the locked visual style's §1 `Composition geometry` (a bleed shape, diagonal split, oversized numeral, orbit rings, …) to stage the page's primary zone. Card grids are one option among many, not the house layout.
- **Reference — image-led promotional pages (not a constraint)**: for travel, venue, product-introduction, hospitality, event, real-estate, and brochure-style decks, let images define the page skeleton before placing text. Consult [`image-layout-patterns.md`](image-layout-patterns.md) §Imported Deck Patterns and prefer patterns such as `#74` TOC image-navigation cards, `#75` asymmetric chapter banners, `#77` photo mosaic with a text cell, `#78` ambient banner + evidence photo + text panel, `#79` ribbon-header image cards, and `#80` side hero image + staggered evidence cards before falling back to plain left/right image-text splits.
- **Phased batch generation** (recommended):
1. **Visual Construction Phase**: generate all SVG pages sequentially for visual consistency. Use layout judgment for chart marks during the draft. **MUST embed plot-area markers** per §3.1 below on every chart page — coordinate calibration is a post-generation step (see [`workflows/verify-charts.md`](../workflows/verify-charts.md)) that depends on these markers — and **native object metadata** per §3.2 on every eligible data-chart page. **First-page gate (Mandatory)**: after completing the first page, run `python3 scripts/svg_quality_checker.py <project_path>/svg_output/<first_page>.svg` and fix every error before drawing page 2 — structural violations are systematic, and a first-page error repeated deck-wide costs a whole-deck rewrite.
2. **Quality Check Gate**: run `python3 scripts/svg_quality_checker.py <project_path>` on `svg_output/`. Any `error` (banned features, viewBox mismatch, spec_lock drift, non-PPT-safe font, etc.) MUST be fixed on the offending page before proceeding — regenerate and re-check. Address `warning`s when straightforward. **PPTX-structure warnings (empty Layout, framing-only Layout, bare Master, duplicate layout keys) are never acknowledge-and-release**: list each one and either fix the page/lock or state per warning why the flagged state is intended (e.g. a zero-slot cover) before proceeding. Do NOT defer to after `finalize_svg.py` — finalize rewrites SVG and masks some violations.
1. **Visual Construction Phase**: generate all SVG pages sequentially for visual consistency. Use layout judgment for chart marks during the draft. **MUST embed plot-area markers** per §3.1 below on every chart page — coordinate calibration is a post-generation step (see [`workflows/verify-charts.md`](../workflows/verify-charts.md)) that depends on these markers — and **native object metadata** per §3.2 on every eligible data-chart page. **Reach for native presets** per §3.0 as you draw each page: a block arrow, chevron, banner/ribbon, callout, standard flowchart node, or star is authored through `preset_shape_svg.py` at draw time — decided by the object's intent as you create it, never by scanning finished paths, and never committed to a bare `<path>`/`<polygon>` when a preset expresses it (a gradient fill/stroke or a pattern fill is the one paint exception — keep those ordinary SVG). **First-page gate (Mandatory)**: after completing the first page, run `python3 scripts/svg_quality_checker.py <project_path>/svg_output/<first_page>.svg` and fix every error before drawing page 2 — structural violations are systematic, and a first-page error repeated deck-wide costs a whole-deck rewrite.
2. **Quality Check Gate**: run `python3 scripts/svg_quality_checker.py <project_path>` on `svg_output/`. Any `error` (banned features, viewBox mismatch, spec_lock drift, non-PPT-safe font, etc.) MUST be fixed on the offending page before proceeding — regenerate and re-check. Address `warning`s when straightforward. On a structured deck/layout template route, PPTX-structure warnings (empty Layout, framing-only Layout, bare Master, duplicate layout keys) are never acknowledge-and-release: list each one and either fix the page/lock or state per warning why the flagged state is intended (e.g. a zero-slot cover) before proceeding. Flat free-design/brand-only routes have no Master/Layout checkpoint. Do NOT defer to after `finalize_svg.py` — finalize rewrites SVG and masks some violations.
3. **Logic Construction Phase**: after SVGs pass the quality check, batch-generate speaker notes for narrative continuity.
### 3.0 Native Preset Shape Selection
@@ -273,6 +274,7 @@ shape and to keep only the exceptions below as ordinary SVG.
|---|---|
| Plain rect / symmetric round rect / circle / ellipse | Keep the ordinary SVG primitive; it is already natively editable. |
| Exact single-preset match | Call `preset_shape_svg.py render` and paste its complete stdout fragment into the current hand-authored SVG. |
| Stock shape that needs a gradient fill/stroke or a pattern fill | Keep ordinary SVG — the helper paints `none` or a solid HEX on both fill and stroke only ([`native-shape-authoring.md`](./native-shape-authoring.md) §5). |
| Page-specific, compound, organic, branded, icon, or data geometry | Keep ordinary SVG path/polygon geometry. |
| Similar-looking contour only | Never guess; keep ordinary SVG. |
@@ -15,7 +15,7 @@ PPT Master uses rendering-neutral compiler hints only where ordinary SVG cannot
The completed SVG remains the full visible page. Removing the metadata must not change browser rendering. Do not copy visible text, geometry, style, or asset values into metadata.
**Hard rule — structure exists at design time**: Every newly generated page declares its final Master and Layout before drawing begins. The exporter compiles this contract; it never selects, clusters, distills, or visually infers it.
**Hard rule — route boundary**: Free-design and brand-only pages use `pptx_structure.mode: flat` and omit every Master/Layout/layer/placeholder marker in this document. Deck/layout template pages declare their final Master and Layout before drawing begins; the structured exporter compiles that contract and never selects, clusters, distills, or visually infers it.
**Hard rule — specialized metadata wins**: Use Master/Layout/placeholder metadata for native structure, `data-pptx-native` for chart/table reconstruction, and the imported/authored shape metadata defined in [`shared-standards.md`](./shared-standards.md) §§1.41.5. Do not duplicate those facts with `data-pptx-role`.
@@ -23,7 +23,7 @@ The completed SVG remains the full visible page. Removing the metadata must not
## 2. Master and Layout Atoms
Master and fixed Layout visuals are atomic root children:
On structured deck/layout template routes, Master and fixed Layout visuals are atomic root children:
```xml
<svg xmlns="http://www.w3.org/2000/svg"
@@ -116,11 +116,11 @@ Do not add structural roles to ordinary titles, body copy, cards, KPIs, diagrams
## 5. Validation and Migration
The quality checker rejects:
For structured deck/layout template projects, validation rejects:
- a missing root Master/Layout identity or a page-to-lock mismatch;
- a Master/Layout `<g>`, nested structure marker, missing/stale id, or inconsistent shared atom contract;
- a slot without positive bounds, a carrier-bound slot without exactly one compatible carrier, or a proxy binding on a non-`object` slot;
- incomplete page mappings, cross-Master Layout-key reuse, or conflicting same-key Layout contracts.
Legacy SVGs using unmapped `baseline`, `preserve`, `layout_strategy: distill`, `data-pptx-layout-kind`, `distilled`, `utility`, direct atomic placeholders, or missing Master identity are not a second supported authoring contract. Run [`restore-pptx-structure`](../workflows/restore-pptx-structure.md) before generation or export. When original PPTX/native facts exist, migration restores those identities first; otherwise the main Agent explicitly derives a structure from the complete SVG pages. Export never performs that derivation.
Legacy structured/template SVGs using unmapped `baseline`, `preserve`, `layout_strategy: distill`, `data-pptx-layout-kind`, `distilled`, `utility`, direct atomic placeholders, or an incomplete Master identity are not a second supported structured contract. Run [`restore-pptx-structure`](../workflows/restore-pptx-structure.md) before generation or export. An explicit `mode: flat` free-design/brand-only project is current and intentionally has no Master identity. When original PPTX/native facts exist, migration restores those identities first; otherwise the main Agent explicitly derives structured template metadata. Export never performs that derivation.
@@ -7,8 +7,8 @@ Other files link here instead of restating its contracts.
| Section | Owns | Strength |
|---|---|---|
| §1 Required Foundation, Forbidden Features, and Conditional Interfaces | XML validity, the exhaustive structural blacklist, native line ends, image clipping, static local reuse, and imported/authored native-shape semantics | Required / Forbidden / Conditional |
| §2 Conditional Compatibility Mappings | Inline geometry and approximate group opacity | Conditional |
| §1 Required Foundation, Forbidden Features, and Conditional Interfaces | XML validity, the closed generated-authoring surface, structural blacklist, native line ends, image clipping, static local reuse, and imported/authored native-shape semantics | Required / Forbidden / Conditional |
| §2 Conditional Compatibility Mappings | Literal inline geometry and the converter-only group-opacity boundary | Conditional / Forbidden |
| §3 Canvas Format Quick Reference | Pointer to the complete canvas catalog | Reference |
| §4 Required Page Contract and Conditional Packaging | Complete-page authority, semantic markers, editable text/grouping, and package promotion | Required / Conditional |
| §5 Workflow Authority | Pointer to the serial post-processing/export procedure | Workflow pointer |
@@ -20,7 +20,7 @@ Other files link here instead of restating its contracts.
| Capability family | Available authoring vocabulary | Detail |
|---|---|---|
| Color and transparency | CSS alpha colors; fill, stroke, text, picture, stop, element, and group opacity | §2.2, §6.2 |
| Color and transparency | CSS alpha colors; fill, stroke, text, picture, stop, and element opacity; converter-only group-opacity compatibility | §2.2, §6.2 |
| Gradients and paint | Linear/radial fills, transparent stops, gradient text, gradient strokes, and preset patterns | §6.3, §7 |
| Depth and light | Soft/colored/directional shadow, glow, layered-geometry fallback, and paper-layer elevation | §6.4 |
| Image treatment | Directional scrim, bottom fade, vignette, spotlight, brand wash, picture fading, and glass-like surfaces | §1.2, §6.5 |
@@ -51,6 +51,17 @@ Other files link here instead of restating its contracts.
- **Reference — not a constraint** passages expose capabilities and recipes; they do not require every page or visual style to use them.
- The locked `visual_style` controls whether and how strongly a compatible effect is used. It never expands the technical boundary.
**Hard rule — generated authoring is fail-closed**: `svg_output/` and reusable
template SVGs may use only properties and conditional interfaces explicitly
listed in this file. `svg_quality_checker.py` rejects unknown inline visual
properties and incomplete conditional contracts before export.
**Hard rule — compatibility is not authoring permission**: the converter may
retain broader read compatibility for imported or historical SVG, including
normalization and documented approximation. That compatibility does not add a
feature to the generated-authoring surface. Do not remove converter support
merely to enforce a narrower authoring contract.
**Hard rule — one-way fidelity vocabulary**: the labels above describe the
`svg_output/` → generated PPTX path. They do not promise reconstruction of the
original SVG syntax, `<defs>` graph, `<use>` structure, path commands, or
@@ -92,9 +103,25 @@ One offending character invalidates the file and aborts export.
| `<script>` / event attributes | Scripts and interactivity |
| `<iframe>` | Embedded frames |
The blacklist above is exhaustive for globally forbidden SVG syntax. Features
that require a restricted form are not globally forbidden; they are documented
under the conditional contracts below.
The blacklist above is exhaustive for globally forbidden structural syntax.
It is not a positive allowlist for every browser-rendered property. Features
that require a restricted form are valid only under the conditional contracts
below; unlisted visual properties are unsupported.
**Hard rule — inline visual-property allowlist**:
| Property family | Allowed inline `style` properties |
|---|---|
| Paint and line | `fill`, `stroke`, `stroke-width`, `stroke-dasharray`, `stroke-linecap`, `stroke-linejoin`, `fill-opacity`, `stroke-opacity`, `vector-effect` |
| Text | `font-family`, `font-size`, `font-weight`, `font-style`, `text-anchor`, `letter-spacing`, `text-decoration` |
| Alpha and definition paint | `opacity`, `stop-color`, `stop-opacity`, `flood-color`, `flood-opacity` |
| Literal geometry | The element-specific properties in §2.1 |
| Preview-only | `shape-rendering`; it does not change native geometry |
Conditional properties with a required XML form stay out of inline style:
write `filter="url(#id)"`, `clip-path="url(#id)"`, and
`marker-start` / `marker-end` as direct attributes. `!important`, unknown CSS
properties, blend modes, isolation, and backdrop filters fail quality check.
> **`marker-start` / `marker-end` is conditional** — see §1.1.
>
@@ -106,8 +133,8 @@ under the conditional contracts below.
>
> **Authored native preset fragments are conditional** — see §1.5.
>
> **Inline CSS geometry, group opacity, simple gradients, and filters are
> conditional** — see §2 and §6.
> **Inline CSS geometry, simple gradients, and filters are conditional;
> generated group opacity is forbidden** — see §2 and §6.
>
> **PPT preset patterns and native chart/table/template metadata are
> conditional** — see §7.
@@ -171,13 +198,13 @@ the original `<use>` / `<symbol>` structure.
| Concern | Required form |
|---|---|
| Reference syntax | Exact same-document fragment: `href="#id"` or `xlink:href="#id"`. If both attributes exist, their values MUST match. |
| Reference syntax | Author new SVG with the SVG 2 form `href="#id"`. Legacy `xlink:href="#id"` remains read-compatible and Live Preview normalizes it to `href`; if both attributes exist, their values MUST match. |
| Referenced target | One of `<symbol>`, `<g>`, `<use>`, `<rect>`, `<circle>`, `<ellipse>`, `<line>`, `<path>`, `<polygon>`, `<polyline>`, `<text>`, or `<image>`. Nested local `<use>` is recursively expanded. |
| Instance position | `<use x>` / `<use y>` are finite unitless or `px` values; omitted values default to `0`. |
| Symbol viewport | A referenced `<symbol>` MUST have a finite four-number `viewBox` with positive width/height. Its `<use>` MUST have positive finite unitless or `px` `width` and `height`. |
| Aspect ratio | Default/aligned `meet` values and plain `preserveAspectRatio="none"` are supported. `slice`, `refX`, and `refY` are forbidden. |
| Viewport boundary | Symbol artwork MUST stay inside its `viewBox`; expansion does not reproduce symbol overflow clipping. |
| Internal references | Reusable subtrees use exact fragment forms: `href="#id"`, `xlink:href="#id"`, and `url(#id)`. The expander rewrites these references together with instance-local cloned IDs. |
| Internal references | Author exact `href="#id"` and `url(#id)` fragments. The expander also reads legacy `xlink:href="#id"` and rewrites all instance-local cloned IDs. |
| Structural metadata | Neither the `<use>` instance nor its referenced subtree may carry `data-pptx-layer*`, `data-pptx-native*`, or `data-pptx-placeholder*`. Author those objects directly instead of reusing them. |
| Safety limits | A reachable reference chain may contain at most 64 instances, and one SVG may expand at most 10,000 local `<use>` instances. |
@@ -193,8 +220,7 @@ the original `<use>` / `<symbol>` structure.
**Contract example**:
```xml
<svg xmlns="http://www.w3.org/2000/svg"
xmlns:xlink="http://www.w3.org/1999/xlink">
<svg xmlns="http://www.w3.org/2000/svg">
<defs>
<symbol id="statusDot" viewBox="0 0 20 20" preserveAspectRatio="xMidYMid meet">
<circle cx="10" cy="10" r="8" fill="#16A34A"/>
@@ -205,7 +231,7 @@ the original `<use>` / `<symbol>` structure.
</g>
</defs>
<use href="#statusDot" x="80" y="120" width="32" height="32"/>
<use xlink:href="#legendRow" x="120" y="120"/>
<use href="#legendRow" x="120" y="120"/>
</svg>
```
@@ -382,14 +408,19 @@ only for literal declarations in an element's own `style` attribute; PPT Master
does not compute CSS cascade or custom properties. Root canvas authority remains
the `viewBox`, regardless of root `<svg>` compatibility width/height values.
### 2.2 Group Opacity Is Approximate
### 2.2 Group Opacity Is Converter-Only Compatibility
`<g opacity="0.3">...</g>` maps the group alpha onto each descendant shape,
text run, picture, and supported
shadow/glow effect. Nested group and child opacity values multiply. Overlapping
children may differ from SVG isolated-group compositing because DrawingML has no
equivalent group-alpha model. With `--native-objects`, transparent native
table/chart markers are rejected; omit that flag to export their SVG fallback.
**Forbidden — generated group opacity**: Do not author `<g opacity="...">` or
inline group `opacity` below `1` in `svg_output/` or reusable templates. Put the
required alpha on each descendant paint, text run, picture, or supported effect.
The quality checker rejects generated group opacity because DrawingML has no
isolated group-alpha model and overlapping descendants produce a different
result.
The converter retains direct-read compatibility for historical/imported SVG by
multiplying group alpha into descendants. That path is `Approximate`; nested
group/child alpha multiplies, and `--native-objects` rejects transparent native
table/chart markers. It is not an authoring permission.
---
@@ -414,8 +445,7 @@ table/chart markers are rejected; omit that flag to export their SVG fallback.
### 4.1 Semantic SVG Marker Contract
Semantic markers are minimal compiler hints orthogonal to native SVG semantics.
Root Master/Layout identity, atomic layer elements, grouped slots, and native-object metadata are authoritative and read first. Every new page carries its final structured contract from the start of SVG authoring. Add `data-pptx-role` only when no specialized marker expresses the required page-frame behavior; the element also uses a stable unique `id`. Do not classify ordinary page content or move visible facts out of SVG attributes/text into metadata. See [`semantic-svg.md`](semantic-svg.md) for the canonical vocabulary and examples.
Semantic markers are minimal compiler hints orthogonal to native SVG semantics. Free-design and brand-only pages use flat export and omit Master/Layout/layer/placeholder markers. On deck/layout template routes, root Master/Layout identity, atomic layer elements, grouped slots, and native-object metadata are authoritative and read first; each page carries its final structured contract from the start of SVG authoring. Add `data-pptx-role` only when no specialized marker expresses the required page-frame behavior; the element also uses a stable unique `id`. Do not classify ordinary page content or move visible facts out of SVG attributes/text into metadata. See [`semantic-svg.md`](semantic-svg.md) for the canonical vocabulary and examples.
- **Canvas authority**: `viewBox` MUST match the selected canvas dimensions.
Root `width` and `height` are optional and do not override it. Root `<svg>`
@@ -437,16 +467,16 @@ These forms are needed only when the stated PPT behavior matters:
| One editable PPT text frame with mixed inline formatting | Put the logical line in one `<text>` with non-positional `<tspan>` children. A `<tspan>` with `x`/`y`/`dy` starts a new positioned line. Evenly `dy`-stacked lines that repeat the parent `<text>`'s `x` stay in one frame: equal effective `font-size` may flow in the current paragraph, while a font-size change, list marker, or accepted larger gap starts a new paragraph. An unmergeable gap or mismatched `x` flattens to separate frames. Separate `<text>` elements stay valid when separate frames are intended. |
| Stable object grouping or object-level animation anchor | Wrap the intended object in `<g id="...">`. Content grouping is **mandatory** per §4.3 — a top-level `<g id>` is also the animation anchor; it is not an optional convenience. |
| Native PowerPoint background promotion | Use a direct, full-canvas, solid `<rect>` without transform, filter, clip, rounding, or visible stroke. Other SVG backgrounds remain ordinary slide shapes. Template routes add the ownership metadata in §7. |
| Reusable free-design PowerPoint Layout | Strategist declares the Master roster and complete page-to-Layout map before drawing. Executor writes the root identities, atomic fixed layers, and grouped slots while authoring each page. Export compiles only those declarations. |
| Reusable template-based PowerPoint Layout | Select one complete input SVG per page in `page_layouts` and declare the output Master/Layout mapping at planning time. Strict preserves the prototype contract; adaptive retains its Master and may assign a new explicit Layout key during page authoring. Non-mirror skin follows `spec_lock`. |
| Free-design / brand-only PowerPoint structure | Use `pptx_structure.mode: flat`. Keep every represented object Slide-local; export materializes one clean project-owned Master plus one Blank Layout from the current lock, removes stock content placeholders/Layout inventory, and retains only the standard date/footer/slide-number capability hooks. Do not author Master/Layout identities, layers, or placeholder slots. |
| Reusable template-based PowerPoint Layout | Select one complete authoring SVG per page in `page_layouts`, declare each unique Master/Layout definition once, and assign pages through `page_pptx_layouts`. Strict preserves the prototype contract; adaptive retains its Master and may define and assign a new explicit Layout key during page authoring. Non-mirror skin follows `spec_lock`. |
**Hard rule — supported shape conversion**: Every PPT editability claim in this specification refers to the project converter reading `svg_output/` and emitting native DrawingML. `svg_final/` is a self-contained visual preview that may be inserted into PowerPoint as an SVG picture. PowerPoint's manual Convert-to-Shape operation is unsupported; do not narrow the authoring contract to its undocumented SVG subset.
### 4.3 Element Grouping (Mandatory)
Wrap logically related Slide-local elements in top-level `<g id="...">` groups. This is **required on every generated page**, not an optional convenience: it produces real PowerPoint groups in the exported PPTX and gives each content unit a stable animation anchor. Plain `<g>` is the normal grouping primitive; `<g opacity="0..1">` additionally maps to the per-descendant alpha approximation in §2.2. Direct atomic Master/Layout elements are the required exception and may never be layer groups. A top-level slot `<g>` is already a semantic group and is excluded from the ordinary content-group budget.
Wrap logically related Slide-local elements in top-level `<g id="...">` groups. This is **required on every generated page**, not an optional convenience: it produces real PowerPoint groups in the exported PPTX and gives each content unit a stable animation anchor. Plain `<g>` is the grouping primitive; keep alpha on individual descendants per §2.2. Flat free-design/brand-only pages use only ordinary semantic groups. On structured template pages, direct atomic Master/Layout elements are the required exception and a top-level slot `<g>` is already a semantic group.
**Semantic-group rule**: apart from atomic Master/Layout objects and the optional Slide background, direct Slide content uses semantic groups. Aim for **38 ordinary top-level content `<g id>` groups per slide**; slot groups and structural atoms are excluded. Each ordinary group becomes one entrance step under the chosen animation trigger. Leaving Slide-local titles, body lines, list items, cards, or decorative clusters as ungrouped top-level atoms is a contract violation.
**Semantic-group rule**: direct Slide content uses semantic groups. Aim for **38 ordinary top-level content `<g id>` groups per slide**; on structured template pages, slot groups and atomic Master/Layout objects are excluded. Each ordinary group becomes one entrance step under the chosen animation trigger. Leaving Slide-local titles, body lines, list items, cards, or decorative clusters as ungrouped top-level atoms is a contract violation.
**Structural atoms and slots are excluded automatically.** `data-pptx-layer` and `data-pptx-placeholder` semantics are read first; otherwise explicit `data-pptx-role` values (`background`, `decoration`, `header`, `footer`, `chrome`, `watermark`, `page-number`, `logo`) mark Slide-local static framing (§4.1, [`semantic-svg.md`](semantic-svg.md)). A normal slot group has exactly one direct compatible carrier; several drawing atoms require the explicit composite `object` proxy fallback. Native chart/table carrier groups retain their specialized §7 contract.
@@ -528,22 +558,23 @@ without `#` is invalid.
| Element `opacity` | Alpha compiled into supported paint/effect channels | `Native-normalized` |
| `<image opacity>` | Picture `<a:alphaModFix>` | `Native-stable` |
| `<stop stop-opacity>` | Per-stop gradient alpha | `Native-stable` |
| `<g opacity>` | Alpha multiplied into each supported descendant shape, text run, picture, and effect | `Approximate` |
| `<g opacity>` | Direct-converter compatibility only; generated SVG authoring is forbidden | `Approximate`; §2.2 |
| Pattern child/color alpha | Preset-pattern foreground/background alpha | Conditional; §7 |
```text
effective fill alpha
= color alpha × element opacity × fill-opacity × ancestor group opacity
= color alpha × element opacity × fill-opacity
```
The converter-only historical path may additionally multiply ancestor group
opacity; generated SVG never depends on that approximation.
**Hard rule — alpha grammar**: write `opacity`, `fill-opacity`,
`stroke-opacity`, and `stop-opacity` as finite numbers from `0` to `1`.
`stroke-opacity`, `stop-opacity`, and `flood-opacity` as finite unitless numbers
from `0` to `1`.
`fill="transparent"` / `stroke="transparent"` become no fill/line; use a color
plus alpha when a painted transparent layer must remain represented. Group
alpha is not isolated compositing, so overlapping descendants may differ from
the browser. Transparent groups around `data-pptx-native` chart/table markers
cannot be promoted under `--native-objects`; export the SVG fallback or remove
the group opacity.
opacity below `1` is forbidden in generated SVG; assign alpha to descendants.
---
@@ -598,12 +629,12 @@ Filters are native-effect metadata, not a general pixel-filter surface.
| Classification | Meaningful non-zero offset → one outer shadow; zero/no offset → one glow |
| Fidelity | `Approximate`; one filter becomes one DrawingML effect |
Flood/color alpha, linear `feFuncA slope`, element opacity, and ancestor opacity
multiply. Native export does not preserve filter-region, `in/in2/result`, merge
order, or composite topology. Other primitives, multiple independent effects,
filters on `<image>` / `<tspan>` / unsupported targets are forbidden. Do not
put a filter on a multi-element `<g>`; apply it to supported objects or use
explicit layers.
Flood/color alpha, linear `feFuncA slope`, and element opacity multiply. The
converter-only historical path may also multiply ancestor group opacity.
Native export does not preserve filter-region, `in/in2/result`, merge order, or
composite topology. Other primitives, multiple independent effects, filters on
`<image>` / `<tspan>` / `<g>` / unsupported targets are forbidden; apply the
effect to supported objects or use explicit layers.
```xml
<defs>
@@ -747,7 +778,7 @@ modes, generated effects, and text-image knockouts are outside editable text.
| Positive scale / negative mirror | Geometry/image only; explicit pivot; `Native-normalized` |
| `matrix(a b c d e f)` | Geometry/image only; transformed axes finite, non-zero, orthogonal; excludes rounded rects; `Native-normalized` |
| Source order | Back-to-front PPT z-order; `Native-stable` |
| `<g opacity>` | Descendant alpha; `Approximate`, §2.2 |
| `<g opacity>` | Converter-only historical compatibility; forbidden in generated SVG, §2.2 |
| Local `<use>` | §1.3 compile-time reuse; `Native-normalized` |
Set text size/position directly; do not scale or general-matrix text. `skewX`,
@@ -971,7 +1002,8 @@ the tile's arbitrary geometry. Use this interface only when that preset mapping
is intended.
`data-pptx-pattern="<preset>"` is required to select the intended preset from
the enum below; without it, export falls back to `ltUpDiag`.
the enum below. The converter retains an `ltUpDiag` fallback for historical
input, but generated authoring without the annotation fails quality check.
Pattern colors may come from importer metadata (`data-pptx-fg` /
`data-pptx-bg`) or from the pattern's child paint. Without metadata, the first
@@ -991,8 +1023,8 @@ itself is never used as a repeatable tile.
| Checks & confetti | `smCheck` · `lgCheck` · `smConfetti` · `lgConfetti` |
| Decorative | `horzBrick` · `diagBrick` · `weave` · `plaid` · `trellis` · `zigZag` · `wave` · `sphere` · `divot` · `shingle` · `solidDmnd` · `openDmnd` · `dotDmnd` |
`svg_quality_checker.py` warns when the annotation is missing and errors when
the preset is outside this enum.
`svg_quality_checker.py` errors when a referenced pattern lacks the annotation,
uses `patternTransform`, or names a preset outside this enum.
### Native PPTX Table / Chart Markers (Opt-in)
@@ -1341,11 +1373,11 @@ defaults to `bottom` and accepts `top`, `left`, or `right`.
**Forbidden — native marker transforms**: Do not rotate, skew, or matrix-transform native table/chart marker groups. Translate / scale is accepted; complex transforms fail export because PowerPoint native table/chart frames do not preserve arbitrary SVG transforms.
### Structured Layout Routing
### PPTX Structure Routing
Every new SVG project has one deterministic route: `pptx_structure.mode: structured`. `spec_lock.md` contains a complete Master roster and one page-to-Master/Layout row before the first page is drawn. Free design defaults to one Master. `standard` / `fidelity` templates use their newly authored contract; mirror templates use the restored source identities and parentage expressed through the same explicit interface.
Every new SVG project declares one deterministic route. Free-design and brand-only projects use `pptx_structure.mode: flat`, omit `pptx_masters` / `pptx_layouts` / `page_pptx_layouts` / `page_layouts`, and author no Master/Layout/layer/placeholder metadata. Export keeps all represented content Slide-local while materializing one clean project-owned Master plus one Blank Layout from the current color/typography lock; stock content placeholders and unused built-in Layouts are removed, while the standard date/footer/slide-number capability hooks remain. Deck/layout template projects use `mode: structured`; `standard` / `fidelity` templates use their authored contract, while mirror templates use restored source identities and parentage.
**Hard rule — no structure inference**: Export does not assign Layout families, promote repeated chrome, cluster pages, infer placeholders, or repair missing metadata. It compiles only the declared root identities, atomic fixed layers, and slot groups. Legacy or unmapped projects must run [`restore-pptx-structure`](../workflows/restore-pptx-structure.md) first.
**Hard rule — no structure inference**: Flat export performs no promotion or deduplication; every object stays Slide-local. Structured template export compiles only declared root identities, atomic fixed layers, and slot groups—it does not assign Layout families, cluster pages, infer placeholders, or repair missing metadata. Legacy structured/template projects must run [`restore-pptx-structure`](../workflows/restore-pptx-structure.md) first.
**Layout reuse**: Reuse one Layout key only when its ordered fixed Layout atoms and slot ids/types/effective indices/default bounds/binding modes are identical. Different wording, data, imagery, crop, or Slide-local carrier geometry does not create a new Layout. A genuinely different reusable contract gets a new key even when both pages are semantically `content`.
@@ -1355,26 +1387,30 @@ Every new SVG project has one deterministic route: `pptx_structure.mode: structu
### Explicit PPTX Master / Layout / Placeholder Metadata
**Trigger**: Every newly generated SVG page uses this interface. `spec_lock.md` declares `pptx_structure.mode: structured`, a complete `pptx_masters` roster, and one `pptx_layouts` row per page before authoring begins. Template routes additionally keep `page_layouts` as input-prototype provenance.
**Trigger**: This explicit metadata interface applies only to deck/layout template projects and structure-restoration workflows. `spec_lock.md` declares `pptx_structure.mode: structured`, complete unique `pptx_masters` / `pptx_layouts` rosters, one `page_pptx_layouts` assignment per generated page, and `page_layouts` as authoring-prototype provenance. Flat free-design/brand-only SVGs use none of these metadata fields.
**Project lock**: A Master row is `<master_key>: <PowerPoint picker name>`. A page row is `P<NN>: <master_key> | <layout_key> | <PowerPoint layout name>`. The SVG root values MUST match those rows. A Layout key belongs to exactly one Master and must be globally unique. Reuse one key only when pages share identical ordered Layout atoms and slot ids/types/effective indices/default bounds/binding modes. Every structured route requires numeric `spec_lock.md` typography `title` / `body` rows.
**Project lock**: A Master row is `<master_key>: <PowerPoint picker name>`. A unique Layout row is `<layout_key>: <master_key> | <PowerPoint picker name> | <prototype source>`, where the source is a generated `P<NN>` or installed `template:<basename>`. A page assignment is `P<NN>: <layout_key>` under `page_pptx_layouts`. The SVG root values MUST match the assigned definition. A Layout key belongs to exactly one Master and must be globally unique. Reuse one key only when prototypes share identical ordered Layout atoms and slot ids/types/effective indices/default bounds/binding modes. An unused Layout uses a template SVG source and remains registered without a published carrier slide. Every structured route requires numeric `spec_lock.md` typography `title` / `body` rows.
**Template behavior**: Strict preserves the selected prototype's declared Master/Layout/slot contract. Adaptive retains its Master and may allocate a new Layout key/name only when fixed Layout atoms or slot topology/bounds change; update the lock during authoring. Mirror-created prototypes preserve restored source identity, literal paint, typography, effects, atomic geometry, and referenced assets. `standard` / `fidelity` never make source topology authoritative; mirror does not synthesize a replacement topology.
**Master text-style contract**: Structured export maps the
locked `title` size to every `a:defRPr` in Master `p:titleStyle`, and map the
locked `body` size to every level in both `p:bodyStyle` and `p:otherStyle`.
**Master text-style contract**: Flat and structured export map the
locked `title` size to every `a:defRPr` in Master `p:titleStyle`. Level 1 in
both `p:bodyStyle` and `p:otherStyle` uses the locked `body` size; levels 29
use a deterministic descending hierarchy from `15/16` through `8/16` of that
size, rounded to 0.5 pt and floored at the smaller of 8 pt or the body size.
Existing per-level indentation and bullet properties remain unchanged.
| Master style | Locked source | XML field changed |
|---|---|---|
| `p:titleStyle` | `typography.title` | Every `a:defRPr@sz` |
| `p:bodyStyle` | `typography.body` | Every `a:defRPr@sz` |
| `p:otherStyle` | `typography.body` | Every `a:defRPr@sz` |
| `p:bodyStyle` | `typography.body` | Level 1 plus derived level 29 `a:defRPr@sz` |
| `p:otherStyle` | `typography.body` | Level 1 plus derived level 29 `a:defRPr@sz` |
**Hard rule — narrow scope**: This Master update changes only Master
`p:txStyles//a:defRPr@sz`. It does not rewrite direct run sizes on generated
slides, so the initial slide rendering remains controlled by the authored SVG.
Missing `title` or `body` rows fail structured export.
`p:txStyles//a:defRPr@sz`; it preserves level indentation, bullet, margin, and
paragraph settings. It does not rewrite direct run sizes on generated slides,
so the initial slide rendering remains controlled by the authored SVG. Missing
`title` or `body` rows fail flat or structured export.
**Layout level-one text-default contract**: For every text-bearing placeholder
whose first prototype run has a direct `a:rPr@sz`, explicit Layout export copies that
@@ -1400,7 +1436,7 @@ prototype size remain unchanged.
| `data-pptx-placeholder-binding="proxy"` | composite `object` slot `<g>` only | Keeps the visible group ordinary and creates one hidden transparent binding proxy |
| `data-pptx-editable="false"` | master/layout element or slide background | Declares intentional editing outside ordinary slide content |
**Hard rule — explicit only**: Structured export never promotes visually similar content by inference. Every SVG requires the four root Master/Layout identity attributes. Every Master/Layout atom and slot requires a unique stable `id` and is a direct root child. Layouts with zero slots are valid. `data-pptx-layout-kind`, `distilled`, and `utility` are legacy metadata and fail the current contract.
**Hard rule — explicit only**: On a structured deck/layout template route, every SVG requires the four root Master/Layout identity attributes. Every Master/Layout atom and slot requires a unique stable `id` and is a direct root child. Layouts with zero slots are valid. `data-pptx-layout-kind`, `distilled`, and `utility` are legacy metadata and fail the structured contract. Flat free-design/brand-only pages omit the entire interface.
**Layer order**: Author the SVG in PowerPoint paint order: Master background,
Layout background, optional Slide background, remaining Master atoms, remaining Layout atoms,
@@ -1445,15 +1481,14 @@ Because an omitted `p:ph@idx` has the effective value `0`, an omitted-index
title reserves `0`; no other placeholder on that Layout may use the same
effective index.
**Slot prototype**: The first slide using a Layout key supplies that Layout's placeholder formatting. `data-pptx-placeholder-bounds` supplies the reusable default frame and is mandatory on every slot. Derive it from
**Slot prototype**: The prototype source declared by the unique Layout definition supplies that Layout's placeholder formatting. `data-pptx-placeholder-bounds` supplies the reusable default frame and is mandatory on every slot. Derive it from
the intended design zone, column, panel inset, safe area, or picture frame —
never from text length, glyph width, line count, or a tight content bounding
box. Repeat the same slot ids/types/effective indices/default bounds/binding modes on every slide using that Layout. The Layout owns the reusable `p:ph`; normal visible carriers keep a matching Slide binding so approved rendering stays identical. A composite `object` proxy adds one hidden transparent binding shape to suppress empty inherited placeholder paint. Bounds define the Layout default only; actual Slide content and local carrier geometry may differ.
**Final-package read-back gate**: After writing a temporary structured PPTX and before publishing it, export reopens the package and
verifies that
each Slide targets exactly one Layout, one layout key always resolves to the
same part, different keys do not collapse onto one part, and every Layout is
verifies that each published Slide targets exactly one Layout, one Layout key always resolves to the
same part, different keys do not collapse onto one part, and every declared Layout—including one unused by all published Slides—is
registered through its Master and the Presentation. Physical Slide/Layout/
Master part rosters, their content-type overrides, and their Presentation/
Master registrations must be exact. It also verifies the Layout picker name,
@@ -1480,9 +1515,9 @@ video or audio media from a decorative SVG group.
### Legacy Structure Migration Boundary
Existing projects or packages that carry `native_structure.json` / `source_template.pptx`, `pptx_structure.mode: baseline|template|preserve`, `layout_strategy`, `data-pptx-layout-kind`, `distilled` / `utility`, direct atomic placeholders, or no root Master identity must run [`restore-pptx-structure`](../workflows/restore-pptx-structure.md) before generation or export.
Existing structured/template projects or packages that carry `native_structure.json` / `source_template.pptx`, `pptx_structure.mode: baseline|template|preserve`, `layout_strategy`, `data-pptx-layout-kind`, `distilled` / `utility`, direct atomic placeholders, or an incomplete root Master identity must run [`restore-pptx-structure`](../workflows/restore-pptx-structure.md) before generation or export. A project explicitly declaring `pptx_structure.mode: flat` is the current free-design/brand-only route and does not require restoration merely because it has no Master/Layout metadata.
When original PPTX/native facts exist, migration preserves the reachable source Master roster, Layout parent relationships and picker names, placeholder type/index/bounds, and visible supported geometry while normalizing the package into the explicit contract. Source Master/Layout groups are recursively flattened into atomic SVG elements. The current structured roster cannot materialize a source Layout that no output page references, or a Master reachable only through such Layouts; stop and report those identities instead of silently dropping them or inventing a carrier page. A subsequent `create-template` run treats the result according to its selected mode: `standard` / `fidelity` author a new topology, while mirror keeps the restored source topology only when the source graph satisfies that reachability boundary. When no native facts exist, the main Agent explicitly derives a structured contract from the complete SVG pages; the exporter never performs that derivation.
When original PPTX/native facts exist, migration preserves the complete source Master roster, Layout parent relationships and picker names, placeholder type/index/bounds, and visible supported geometry while normalizing the package into the explicit contract. Source Master/Layout groups are recursively flattened into atomic SVG elements. Create one reusable prototype SVG for every retained Layout, including Layouts unused by source slides; downstream `pptx_layouts` definitions can register those prototypes without manufacturing generated pages. A subsequent `create-template` run treats the result according to its selected mode: `standard` / `fidelity` author a new topology, while mirror keeps the restored source topology. When no native facts exist, the main Agent explicitly derives a structured contract from the complete SVG pages; the exporter never performs that derivation.
---
@@ -98,7 +98,7 @@ The deck's **visual aesthetic** — shape language, decoration density, whitespa
Write the locked value to `spec_lock.md` `- visual_style:` and the rationale to `design_spec.md`. Executor loads only that one visual-style file.
> **Template vs preset**: a style mention may sound like a template name ("academic style" vs the `academic_defense/` template directory). Step 3 only triggers on an explicit template directory path supplied by the user — bare names and style words never copy templates; they map to a visual-style preset here. If a template was triggered upstream, its files are already in `<project_path>/templates/` and its fused design_spec governs.
> **Template vs preset**: a style mention and a template name remain different inputs ("minimalist" vs the `presentation_core/` template directory). Step 3 only triggers on an explicit template directory path supplied by the user — bare names and style words never copy templates; they map to a visual-style preset here. If a template was triggered upstream, its files are already in `<project_path>/templates/` and its fused design_spec governs.
**Legacy template boundary**: A template containing `native_structure.json`, `source_template.pptx`, missing root Master identity, direct atomic placeholders, or old `baseline` / `preserve` / distillation metadata must run [`restore-pptx-structure`](../workflows/restore-pptx-structure.md) before Step 3. Do not plan against a legacy compatibility contract.
@@ -689,6 +689,8 @@ The catalog covers **both data charts and structural information designs**. A "m
The most common Strategist failure mode is missing the structural half — treating "chart" as "numeric chart only" and leaving team / agenda / principles / journey pages as text-only when a template would fit. Read the catalog with both lenses.
**Flag native-preset candidates on §VII pages.** For any page row already listed in §VII (including `no-template-match` rows), when its content also calls for a literal stock PowerPoint shape — a chevron, block arrow, standard flowchart node, callout, banner, or star (judged from the page plan, not from a template's name or drawing) — append a candidate note to that page's `Usage`, e.g. `…existing usage…; native-preset candidate: chevron; Executor applies executor-base §3.0`. This primes the Executor at plan-read time without deciding for it: the Executor still selects the exact preset, frame, and paint at draw time via [`executor-base.md`](./executor-base.md) §3.0, or keeps ordinary SVG when that section's exceptions apply. Pages with no §VII row rely on the Executor's §3.0 judgment at draw time.
> **Reading is mandatory; the catalog is a starting point, not a copy target.**
> - Fully read `templates/charts/charts_index.json` **before drafting the Strategist confirmation stage** — the read happens up front, not when you sit down to write Section VII. The file contains `meta` + `charts.<key>.summary` only; each `summary` is a selection rule (`"Pick for … Skip if …"`), not a description. There is **no category, quickLookup, or keyword index** — selection is done by semantically matching each page's content shape against all 76 summaries in one pass.
> - Not every page needs a chart. When a page's information structure matches a catalog entry, **use that template as a structural starting point** — keep the visualization type and core layout logic, then adapt composition, density, color, decoration, and accompanying elements to fit this deck's content and visual tone. Free adjustment is encouraged; what is forbidden is (a) generating without reading the catalog, and (b) blind verbatim mimicry that ignores the page's actual content weight.
@@ -845,18 +847,20 @@ This is what makes the axis meaningful: a `presentation` deck and a `text` deck
1. Read reference template: `templates/design_spec_reference.md`
2. Generate complete spec from scratch based on analysis
3. Save to: `projects/<project_name>.../design_spec.md`
4. **Generate execution lock**: read `templates/spec_lock_reference.md` and produce `projects/<project_name>.../spec_lock.md` — a compact, machine-readable form of the color / typography / icon / image / **page_rhythm** / **page_layouts** / **page_charts** / **pptx_masters** / **pptx_layouts** decisions above. Master/Layout structure is part of this planning contract before the first SVG. This file is what the Executor re-reads before every page (see [executor-base.md](executor-base.md) §2.1). The values in `spec_lock.md` MUST exactly match the decisions recorded in `design_spec.md`; if they ever diverge, `spec_lock.md` wins and `design_spec.md` should be treated as historical narrative.
4. **Generate execution lock**: read `templates/spec_lock_reference.md` and produce `projects/<project_name>.../spec_lock.md` — a compact, machine-readable form of the color / typography / icon / image / **page_rhythm** / **page_charts** and route-specific PowerPoint structure decisions above. Within the PowerPoint structure portion, free-design and brand-only routes write only `pptx_structure.mode: flat`; deck/layout template routes additionally write `page_layouts`, `page_pptx_layouts`, `pptx_masters`, and `pptx_layouts`. This file is what the Executor re-reads before every page (see [executor-base.md](executor-base.md) §2.1). The values in `spec_lock.md` MUST exactly match the decisions recorded in `design_spec.md`; if they ever diverge, `spec_lock.md` wins and `design_spec.md` should be treated as historical narrative.
- **page_rhythm is mandatory**: Based on the page list in §IX Content Outline, assign each page one of `anchor` / `dense` / `breathing` (see `spec_lock_reference.md` for the full vocabulary). This is what breaks the uniform "every page is a card grid" feel — without it the Executor defaults all pages to `dense`.
- **Rhythm follows narrative, not quota**: `breathing` pages mark natural pauses — chapter transitions, standalone emphasis (hero quote / big number), SCQA bridges. Dense decks may legitimately be all `dense`. **Do NOT invent filler pages** ("Thank you", empty dividers) to pad rhythm — every `breathing` page must say something independent. Delivery purpose biases the overall lean (`presentation` toward more `anchor` / `breathing`, `text` toward `dense`; see §6.1) — a bias, never a quota.
- **Cover impact is mandatory**: Page `P01` is the deck's first visual contract, not a generic title slide. In `design_spec.md §IX`, add a `Cover impact` line for `P01` that names one concrete hook and one concrete composition strategy. Use the source's strongest available signal: a provocative core claim, object / scene metaphor, hero number, founder / product / audience moment, or a distilled conflict. Pair it with one concrete composition strategy — such as `full-bleed image + floating title`, `typographic poster`, `hero object`, `data hook`, `editorial scene`, `high-contrast abstract geometry`, or a fresh composition the deck's subject suggests (these are starting points, not the allowed set). If no external or AI image is available, still specify a native-SVG visual hook; do not fall back to "title + subtitle + decorative background". (Beautify / template-fill keep the source cover verbatim — this rule does not apply on those preservation paths.)
- **Cover rhythm lock**: `P01` remains `anchor` in `spec_lock.md page_rhythm`, but its §IX `Cover impact` must prevent content-page patterns. Do not plan multi-card grids, agenda-like bullets, or equal-weight columns on the cover unless a template explicitly requires that structure, or a preservation path (beautify / template-fill) is transcribing the source cover verbatim.
- **Closing impact (only when the deck closes)**: the deck's last page is its final visual contract — the strongest impression after the cover. When the deck genuinely lands on a conclusion / call-to-action / final-takeaway page, give it a `Closing impact` line in §IX: name the one thing the audience should leave with (a distilled takeaway, a forward call, a memorable restatement of the core claim) + one composition that delivers it — never a generic "Thank you" / contact-only slide or a centered-title reprise of the cover. **Do NOT invent a closing page to satisfy this** — the filler-page ban above still holds; apply it only to the page where the deck actually resolves. Same exemptions as the cover: skip on template / beautify / template-fill preservation paths.
- **pptx_structure is mandatory**: Every new project writes `mode: structured`. Free design and brand-only routes default to one Master; add another only when the design genuinely needs it. Deck/layout templates also record `template_adherence: strict|adaptive`. Do not write `baseline`, `template`, `preserve`, `flat`, `layout_strategy`, or Layout-kind rows into a new project.
- **Master roster**: Write one `pptx_masters` row per Master as `<master_key>: <picker name>`. For a template, copy the restored prototype roster. For free design, define stable deck-wide background/chrome atoms at planning time; Master visuals are root-level atomic elements and may never be `<g>`.
- **pptx_layouts (native output contract)**: Write exactly one row per page before generation as `<master_key> | <layout_key> | <PowerPoint layout name>`. Plan semantic Layout families from the outline and reuse a key only when fixed Layout atoms plus slot ids/types/indices/bounds/binding modes are identical. Name each key after its composition (`timeline-spine`, `kpi-band-trio`, `content-image-right`), never after a PowerPoint stock role or the page's topic. A Layout may intentionally have zero slots; never manufacture an empty `utility` kind or full-page fake slot. **Self-check before writing the section**: compare distinct keys against the distinct compositions in §IX. Distinct compositions collapsing into a handful of stock-role keys (`cover` / `title-content` / `section`) means pages were clustered by role; one shared skeleton splitting into per-topic keys (`allocation-fengqing` / `allocation-luoping`) means pages were split by topic. Both misstate the roster — re-derive from composition.
- **Slot planning**: Each reusable slot is a direct root `<g id>` with `data-pptx-placeholder`, positive design-zone bounds, and exactly one compatible direct carrier. Bounds come from the intended safe area, column, panel inset, or media frame—not sample text ink. A genuinely composite region may use only the explicit `object` + `proxy` downgrade.
- **Adaptive refinement boundary**: The initial mapping is complete, not provisional. If actual adaptive construction genuinely changes reusable framing or slot topology/bounds, Executor creates a new Layout key and updates `spec_lock.md` while authoring that first page. It never mutates a reused contract silently. Export only compiles declared structure and never discovers or clusters Layouts.
- **page_layouts (deck/layout templates only)**: Add one `P<NN>: <svg_basename>` row for every page. This is the complete input-prototype mapping. Strict preserves that SVG's structural contract; adaptive keeps its Master and may explicitly assign a new output Layout identity during page authoring. Omit the whole section for free-design and brand-only routes.
- **pptx_structure is mandatory**: Free-design and brand-only routes write `mode: flat`. Deck/layout template routes write `mode: structured` plus `template_adherence: strict|adaptive`. Do not write legacy `baseline`, `template`, `preserve`, `layout_strategy`, or Layout-kind rows into a new project.
- **Flat-route boundary**: With `mode: flat`, omit `pptx_masters`, `pptx_layouts`, `page_pptx_layouts`, and `page_layouts`. Do not plan native Master/Layout families or reusable placeholder slots. Every generated SVG object remains Slide-local: omit root Master/Layout identity, `data-pptx-layer`, and `data-pptx-placeholder*` metadata. Export materializes one clean project-owned Master plus one Blank Layout from the current color/typography lock, removes stock content placeholders/Layout inventory, and retains only the standard date/footer/slide-number capability hooks.
- **Master roster (deck/layout templates only)**: Write one `pptx_masters` row per Master as `<master_key>: <picker name>` and copy the restored prototype roster. Master visuals are root-level atomic elements and may never be `<g>`.
- **pptx_layouts (deck/layout template reusable roster)**: Write every unique reusable Layout once as `<layout_key>: <master_key> | <PowerPoint layout name> | <prototype source>`. Copy the installed template roster with `template:<basename>` sources, including Layouts no generated page currently uses. A genuinely new adaptive Layout uses its first generated `P<NN>` as the source. Reuse a key only when fixed Layout atoms plus slot ids/types/indices/bounds/binding modes are identical. Name authored keys after composition (`timeline-spine`, `kpi-band-trio`, `content-image-right`), never after page topic. A Layout may intentionally have zero slots; never manufacture an empty `utility` kind or full-page fake slot.
- **page_pptx_layouts (deck/layout template page assignment)**: Write exactly one `P<NN>: <layout_key>` row per generated page. The key must exist in `pptx_layouts`; Master and picker name are inherited from that unique definition. **Self-check before writing the section**: compare distinct assigned keys against distinct compositions in §IX. Distinct compositions collapsing into a handful of role-only keys means pages were clustered by topic label; one shared skeleton splitting into topic-specific keys means pages were split by content wording. Both misstate the roster.
- **Slot planning (deck/layout templates only)**: Each reusable slot is a direct root `<g id>` with `data-pptx-placeholder`, positive design-zone bounds, and exactly one compatible direct carrier. Bounds come from the intended safe area, column, panel inset, or media frame—not sample text ink. A genuinely composite region may use only the explicit `object` + `proxy` downgrade.
- **Adaptive refinement boundary (deck/layout templates only)**: The initial definitions and assignments are complete, not provisional. If actual adaptive construction genuinely changes reusable framing or slot topology/bounds, Executor creates one new `pptx_layouts` definition sourced from that page and updates its `page_pptx_layouts` assignment while authoring the first page. It never mutates a reused contract silently. Export only compiles declared structure and never discovers or clusters Layouts.
- **page_layouts (deck/layout templates only)**: Add one `P<NN>: <svg_basename>` row for every page. This is the complete authoring-input prototype mapping. Strict preserves that SVG's structural contract; adaptive keeps its Master and may explicitly define and assign a new output Layout identity during page authoring. Omit the whole section for free-design and brand-only routes.
- **page_charts (write only for chart pages that match a catalog template)**: For each page in `design_spec.md §VII` whose `reference template path` points to `templates/charts/<name>.svg`, add `P<NN>: <chart_name>`. Pages with `no-template-match` in §VII MUST NOT appear here (Executor would look for a non-existent reference). If the deck has no data-visualization pages, omit the section.
- **Hard rule**: Use both `page_layouts` and `page_charts` only with a compatible template shell. For a chart page without an exact roster match, adaptive mode selects the closest neutral input prototype and assigns an explicit output Layout key in the planning map; strict mode must select an existing compatible Layout or revise the outline. Never omit `page_layouts` inside a new deck/layout template route.
@@ -58,14 +58,14 @@ Use `summary.md` only for orientation. Open screenshots or the original PPTX onl
Every page remains a complete standalone SVG preview.
**Hard rule — mirror graph reachability**: The current structured template
compiler materializes only Master/Layout identities referenced by emitted SVG
prototypes. Before accepting `mirror`, verify that every source Layout has a
non-empty `usedBySlides` set and that every source Master owns at least one such
Layout. If the source package contains an unused Layout or an otherwise
unreachable Master, stop and report that full-graph mirror is not representable
by the current template roster. Never silently drop it, merge it, or invent a
carrier page.
**Hard rule — complete mirror graph**: Restore every supported source Layout,
including Layouts unused by source Slides. Emit one complete source-page
prototype per source Slide and one definition-only
`layout_<layout_key>.svg` prototype for each otherwise unrepresented Layout.
The definition prototype carries the exact parent Master identity, Layout
identity, fixed atoms, and placeholder contract but is not a generated page.
This also retains a source Master that is reachable only through unused Layouts.
Never silently drop or merge an identity, and never invent a carrier page.
**Hard rule — no duplicate authored Layout contracts**: In `standard` / `fidelity`, distinct output Layout keys must differ in fixed Layout atoms or slot topology/type/index/bounds/binding. Topic, sample wording, or Slide-local content alone never justifies another authored key. Mirror keeps source Layout identities even when two source contracts are visibly equivalent.
@@ -129,12 +129,12 @@ Extension page types beyond the canonical four (transition / appendix / disclaim
When the brief sets `Replication mode: mirror`, restore the imported template rather than designing a new one:
- Restoration source: lossless `svg/master_*.svg`, `svg/layout_*.svg`, `svg/slide_NN.svg`, `svg-flat/slide_NN.svg`, `svg/inheritance.json`, and `native_structure.json`. Use matching lightweight projections only to inspect the result without loading opaque payload into model context.
- Precondition: every source Layout is referenced by at least one source slide, and every source Master is reachable through those referenced Layouts. Otherwise report that full-graph mirror is currently unsupported and stop before writing output.
- Output: `<template_workspace>/templates/<NNN>_<page_type>.svg` in both scopes. `<NNN>` is the zero-padded source slide index (3 digits) and `<page_type>` is derived from `manifest.json` `pageTypeCandidates``cover` / `toc` / `chapter` / `content` / `ending`. When the page-type heuristic is ambiguous, fall back to `content`. Preserve source slide order via the numeric prefix.
- Precondition: the import evidence identifies every source Master/Layout, parent relationship, picker name, placeholder contract, and fixed visual layer. Stop only when required facts or supported geometry are missing; unused identities are not a stop condition.
- Output: `<template_workspace>/templates/<NNN>_<page_type>.svg` for every source slide, plus `layout_<layout_key>.svg` for every source Layout unused by all source slides. `<NNN>` is the zero-padded source slide index (3 digits) and `<page_type>` is derived from `manifest.json` `pageTypeCandidates``cover` / `toc` / `chapter` / `content` / `ending`. When the page-type heuristic is ambiguous, fall back to `content`. Preserve source slide order via the numeric prefix; definition-only files are not generated pages.
- Required restoration: preserve source Master/Layout keys and picker names, Layout-to-Master parentage, slide assignments, placeholder type/index/bounds, supported native-object metadata, geometry, decoration, sprite-sheet wrappers, original example text, chart previews, fonts, effects, and paint order whenever the importer represents them.
- Allowed normalization: add or normalize explicit root declarations and asset paths, and recursively expand fixed Master/Layout group wrappers into direct atoms. The mapping must remain one-to-one at the ownership level and must not change paint order or appearance.
- Forbidden: commonality extraction, semantic synthesis, merging, splitting, promotion, demotion, renaming, re-parenting, decorative simplification, placeholder invention, or replacement of supported source-native metadata / SVG fallback with a model-authored approximation.
- `design_spec.md` §V Page Roster lists every emitted file, and `Source Restoration Map` records the preserved source Master/Layout assignment.
- `design_spec.md` §V Page Roster lists every emitted file and marks definition-only prototypes explicitly. `Source Restoration Map` records each source-slide assignment plus every unused Layout definition and its parent Master.
**Mirror consumption boundary**: `mirror` applies only while creating the template package from the source deck. Once created, the package is consumed as an ordinary deck / layout template roster: downstream generation may select, repeat, skip, reorder, or adapt pages according to the new content. The `replication_mode: mirror` field must not force the generated deck to preserve the source page count, source order, or one-output-slide-per-template-slide mapping.
@@ -492,8 +492,7 @@ templates/
│ ├── anthropic/ # Anthropic brand identity (logo + colors + typography)
│ └── google/ # Google brand identity
├── layouts/
── academic_defense/ # Academic-defense structure (no identity)
│ └── pixel_retro/ # Pixel retro / cyberpunk structure (no identity)
── presentation_core/ # General structure system (no identity)
└── decks/
├── <bank_deck>/ # Example banking deck
└── <engineering_deck>/ # Example engineering deck
@@ -97,7 +97,7 @@ the evidence source for mirror restoration; the projection is inspection-only.
The exporter never reads the import workspace or the projection. A projected
view is not a final template or release export source.
`template_preview_pptx.py` reads a template workspace, exports every `templates/*.svg` prototype as one structured review slide, and verifies the resulting Master/Layout package. This is an on-demand review action: its default output is `exports/<template_id>_template_preview.pptx`, and that directory need not exist before the command runs. It refuses an existing output unless an intentional re-export passes `--force`. `--visual-only` is an explicit migration aid for legacy SVG rosters: it creates a slide-local visual review deck without validating or claiming a reusable Master/Layout contract. New structured templates use the default mode when a review deck is requested.
`template_preview_pptx.py` reads a template workspace, exports every `templates/*.svg` prototype as one structured review slide, and verifies the resulting Master/Layout package. This is an on-demand review action: its default output is `exports/<template_id>_template_preview.pptx`, and that directory need not exist before the command runs. It refuses an existing output unless an intentional re-export passes `--force`. `--visual-only` is an explicit migration aid for legacy SVG rosters: it creates a slide-local visual review deck without validating or claiming a reusable Master/Layout contract. This diagnostic path does not require a project `spec_lock.md`; it may retain generic theme/text defaults inside its clean one-Master/one-Layout shell. New structured templates use the default mode when a review deck is requested.
Template fill (direct PPTX, no SVG conversion):
@@ -148,13 +148,13 @@ python3 scripts/svg_to_pptx.py <project_path>
For SVG-authoring routes, `svg_output/` is the complete visible page-design source: every exported text, image, shape, background, and template-derived layout element is present in the page SVG or explicitly referenced by it. Export may translate represented content into Master/Layout/Slide parts or native objects, but it does not retrieve missing visible content from templates or planning files. Speaker notes, animation, narration, transitions, `template-fill-pptx`, and `native-enhance-pptx` remain separately owned capabilities.
Native `svg_to_pptx.py` release export uses the project's `structured` lock. Every project supplies a complete Master roster and page-to-Master/Layout mapping before SVG generation. Every SVG root repeats that identity; fixed Master/Layout visuals are direct atomic children, and reusable slots are top-level groups with positive design-zone bounds plus one compatible carrier. Composite `object` regions use explicit proxy binding, and zero-slot Layouts are valid.
Native `svg_to_pptx.py` release export reads the project's explicit structure mode. Free-design and brand-only projects use `flat`, omit Master/Layout mappings and SVG structure metadata, keep every represented object Slide-local, and materialize one clean project-owned Master plus one Blank Layout from the current color/typography lock. Stock content placeholders and unused built-in Layouts are removed; only the standard date/footer/slide-number capability hooks remain. Deck/layout template projects use `structured`: each project supplies unique Master/Layout definitions and one Layout assignment per generated page before SVG generation, and every SVG root repeats its assigned identity. A template-backed definition may remain unused and still register without a published carrier slide. Fixed Master/Layout visuals are direct atomic children; reusable slots are top-level groups with positive design-zone bounds plus one compatible carrier. Composite `object` regions use explicit proxy binding, and zero-slot Layouts are valid.
The exporter compiles only this declared structure, maps locked typography/colors into PowerPoint defaults, creates the named Master/Layout parts, and reads the package back before publication. It never clusters pages, promotes repeated chrome heuristically, or invents placeholders. Use `--pptx-structure flat` only for diagnostics.
Structured template export compiles only the declared structure, maps locked typography/colors into PowerPoint defaults, creates the named Master/Layout parts, and reads the package back before publication. It never clusters pages, promotes repeated chrome heuristically, or invents placeholders. Flat export is the normal free-design/brand-only route: it creates only the clean project-owned shell and performs no promotion or deduplication of Slide content.
Template `page_layouts` records input provenance. Strict preserves its Master/Layout/slot contract; adaptive retains its Master and may use a new Layout key only when fixed Layout atoms or slot topology/bounds change. `standard` / `fidelity` author new SVGs and a new Master/Layout/slot contract. `mirror` restores the source identities and parentage without semantic synthesis, while mechanically expanding fixed-layer group wrappers into the direct atoms required by the structured contract.
Template `page_layouts` records authoring-input provenance, `pptx_masters` / `pptx_layouts` own unique reusable definitions, and `page_pptx_layouts` owns page assignment. Strict preserves its Master/Layout/slot contract; adaptive retains its Master and may use a new Layout key only when fixed Layout atoms or slot topology/bounds change. `standard` / `fidelity` author new SVGs and a new Master/Layout/slot contract. `mirror` restores the complete source identity graph—including unused Layout definitions—without semantic synthesis, while mechanically expanding fixed-layer group wrappers into the direct atoms required by the structured contract.
Legacy `baseline`, `template`, `preserve`, `layout_strategy`, `data-pptx-layout-kind`, `distilled`/`utility`, direct atomic placeholders, and missing root Master identity must run [`restore-pptx-structure`](../workflows/restore-pptx-structure.md) before release export.
Legacy structured/template contracts using `baseline`, `template`, `preserve`, `layout_strategy`, `data-pptx-layout-kind`, `distilled`/`utility`, direct atomic placeholders, or incomplete root Master identity must run [`restore-pptx-structure`](../workflows/restore-pptx-structure.md) before release export. Explicit flat free-design/brand-only projects intentionally omit root Master identity.
`pptx_to_svg.py` annotates verified text-grid tables and conservative chart data with `data-pptx-native` metadata. Table import covers exact physical row/grid topology, canonical rectangular merges, safe solid/no-fill per-side borders, plain multi-paragraph cells, and a closed run-rich paragraph schema. Each rich run requires `text` and may use only `bold`, `italic`, `underline`, `strike`, `color`, `font_size`, one `font_family`, `lang`, and `alt_lang`. A merge must use the exact `rowSpan` / `gridSpan` / `hMerge` / `vMerge` physical topology with empty merge slaves. Presentation-only source run XML normalizes, while relationship-bearing text, extensions, line breaks, fields, tabs, bullets, broken text topology, unsafe border XML, non-solid fills, and other merge encodings remain fallback-only. For table style `{5C22544A-7EE6-4342-B048-85BDC9FD1C3A}`, the normalized SVG fallback resolves `wholeTbl`, `firstRow`, horizontal banding, theme colors/fonts, and direct cell/run overrides; other built-in/custom style families are not implied.
@@ -66,8 +66,8 @@ Convert project SVGs into PPTX.
```bash
python3 scripts/svg_to_pptx.py <project_path>
python3 scripts/svg_to_pptx.py <project_path> --native-objects
python3 scripts/svg_to_pptx.py <project_path> --pptx-structure structured # current release structure
python3 scripts/svg_to_pptx.py <project_path> --pptx-structure flat # structure diagnostic
python3 scripts/svg_to_pptx.py <project_path> --pptx-structure structured # deck/layout template override
python3 scripts/svg_to_pptx.py <project_path> --pptx-structure flat # free-design/brand-only override
# Template-import visual round-trip diagnostic only:
python3 scripts/svg_to_pptx.py <template_import_output> -s svg-flat
# Post-processed-source comparison diagnostic only (never a release export):
@@ -101,16 +101,16 @@ Behavior:
inputs and package-level processing.
- For PPTX template-import workspaces, use `-s svg-flat` when you need a visual round-trip check. The layered `svg/` tree is the machine-readable template source and intentionally does not inline inherited master / layout decoration into each slide.
- Native mode is strict about unsupported visual SVG elements: if a visual element cannot be represented or safely preserved, export fails with the SVG file, element tag, and position instead of silently dropping content.
- Omitting `--pptx-structure` reads `spec_lock.md`; release export requires `mode: structured`. The lock must include a complete `pptx_masters` roster and one `pptx_layouts` row per page. `flat` is diagnostic-only.
- Every page root repeats Master/Layout keys and picker names. Master/Layout fixed visuals are direct atomic children; layer `<g>` elements are invalid.
- Each normal slot is a direct root `<g id>` with semantic type, positive design-zone bounds, and exactly one compatible carrier. Composite `object` slots use explicit proxy binding; zero-slot Layouts are valid.
- Structured export maps locked typography/colors into PowerPoint Master/Layout/theme defaults, creates one reusable Layout per declared key, and reopens the package to verify the full Presentation → Master → Layout → Slide graph, fixed-object order, placeholder identities/bounds, carrier bindings, hidden proxies, and zero-slot Layouts.
- Omitting `--pptx-structure` reads `spec_lock.md`. Free-design and brand-only releases declare `mode: flat`, omit Master/Layout mappings and SVG structure metadata, and materialize one clean project-owned Master plus one Blank Layout from the current lock. Deck/layout template releases declare `mode: structured` with complete unique `pptx_masters` / `pptx_layouts` rosters and one `page_pptx_layouts` assignment per page. A template-backed Layout definition may remain unused by pages and still register in the final package.
- On structured template routes, every page root repeats Master/Layout keys and picker names. Master/Layout fixed visuals are direct atomic children; layer `<g>` elements are invalid.
- On structured template routes, each normal slot is a direct root `<g id>` with semantic type, positive design-zone bounds, and exactly one compatible carrier. Composite `object` slots use explicit proxy binding; zero-slot Layouts are valid. Flat pages keep all SVG objects Slide-local.
- Flat export maps locked typography/colors into a clean project-owned theme/Master, removes stock content placeholders and unused built-in Layouts, retains only the standard date/footer/slide-number capability hooks, and keeps one Blank Layout without promoting Slide content. Structured export additionally creates one reusable Layout per declared key and reopens the package to verify the full Presentation → Master → Layout → Slide graph, fixed-object order, placeholder identities/bounds, carrier bindings, hidden proxies, and zero-slot Layouts.
- Template `page_layouts` remains input provenance. Strict preserves the prototype contract; adaptive retains its Master and may use a new Layout identity only when fixed Layout atoms or slot topology/bounds change.
- Legacy `baseline`, `template`, `preserve`, `layout_strategy`, `data-pptx-layout-kind`, `distilled`/`utility`, direct atomic placeholders, and missing Master identity are rejected with a pointer to [`restore-pptx-structure`](../../workflows/restore-pptx-structure.md). Export never migrates or infers them.
- Legacy structured/template contracts using `baseline`, `template`, `preserve`, `layout_strategy`, `data-pptx-layout-kind`, `distilled`/`utility`, direct atomic placeholders, or incomplete Master identity are rejected with a pointer to [`restore-pptx-structure`](../../workflows/restore-pptx-structure.md). Explicit flat free-design/brand-only projects intentionally omit Master identity.
- Native output uses content-hash media filenames, so identical images are reused and different images cannot overwrite each other by sharing a basename.
- `[Content_Types].xml` is generated from the actual media extensions written into the PPTX. Unknown media extensions fail unless Python's `mimetypes` can identify them.
- Native export writes to a temporary file first and publishes the requested PPTX only after conversion succeeds. A failed conversion does not replace the main output file.
- Before publishing structured-baseline or template-mode native output, export reopens the temporary PPTX and validates the Slide → Layout → Master graph and registrations, Layout identity, placeholder identity, reusable bounds, and prompt/level-one sizes. A mismatch aborts publication; legacy baseline, preserve, and flat skip this gate.
- Before publishing structured template output, export reopens the temporary PPTX and validates the Slide → Layout → Master graph and registrations, Layout identity, placeholder identity, reusable bounds, and prompt/level-one sizes. A mismatch aborts publication. Flat release instead validates its single referenced Master/Layout shell and exact date/footer/slide-number hook roster before packaging.
- SVG clip paths are still restricted for authored SVGs, but nested crop wrappers generated by PPTX import are mapped back to native picture crop / geometry when possible.
- Speaker notes are embedded automatically unless `--no-notes` is used
- Recorded narration is opt-in:
@@ -17,6 +17,11 @@ Configuration keys:
OPENAI_BACKGROUND (optional) auto or opaque for gpt-image-2
OPENAI_MODERATION (optional) auto or low for GPT image models
Image editing (image-to-image):
When image_gen.py passes reference_image=<path> (single-image CLI only,
via --reference-image), this backend calls /v1/images/edits with the source
image + the prompt as an edit instruction, instead of /v1/images/generations.
Dependencies:
pip install requests Pillow
"""
@@ -38,6 +43,7 @@ if __name__ == "__main__":
raise SystemExit(0 if any(arg in {"-h", "--help", "help"} for arg in sys.argv[1:]) else 1)
import base64
import mimetypes
import os
import time
import threading
@@ -171,6 +177,10 @@ GPT_IMAGE_BACKGROUNDS = {"auto", "opaque", "transparent"}
GPT_IMAGE_MODERATION_VALUES = {"auto", "low"}
DEFAULT_BASE_URL = "https://api.openai.com/v1"
# Signals to image_gen.py that this backend can accept a reference_image
# (image-to-image edit via /v1/images/edits). Other backends omit this marker.
SUPPORTS_REFERENCE_IMAGE = True
def _field(value, name: str):
"""Read a response field from either an SDK object or a dict."""
@@ -312,6 +322,16 @@ def _image_generations_url(base_url: str | None) -> str:
return f"{base}/images/generations"
def _image_edits_url(base_url: str | None) -> str:
base = (base_url or DEFAULT_BASE_URL).rstrip("/")
if base.endswith("/images/edits"):
return base
if base.endswith("/images/generations"):
# Swap the sibling endpoint rather than appending to a full URL.
return base[: -len("/generations")] + "/edits"
return f"{base}/images/edits"
def _read_size_preset() -> str | None:
"""Read the optional size mapping preset for OpenAI-compatible providers."""
return _read_env_choice("OPENAI_SIZE_PRESET", OPENAI_SIZE_PRESETS)
@@ -363,6 +383,32 @@ def _post_image_generation(api_key: str, base_url: str | None, request: dict) ->
raise RuntimeError("OpenAI image generation returned invalid JSON.") from exc
def _post_image_edit(api_key: str, base_url: str | None,
data: dict, image_path: str) -> dict:
headers = {"Authorization": f"Bearer {api_key}"}
# GPT Image models take the image list field 'image[]'; dall-e-2 and other
# OpenAI-compatible edit models use the singular 'image'.
model = str(data.get("model", ""))
field = "image[]" if _is_gpt_image_model(model) else "image"
mime_type = mimetypes.guess_type(image_path)[0] or "application/octet-stream"
# Let requests build the multipart/form-data body (and its Content-Type
# boundary) from files=; do not set Content-Type by hand.
with open(image_path, "rb") as image_file:
response = requests.post(
_image_edits_url(base_url),
headers=headers,
data=data,
files=[(field, (Path(image_path).name, image_file, mime_type))],
timeout=300,
)
if not response.ok:
raise http_error(response, "OpenAI image edit")
try:
return response.json()
except ValueError as exc:
raise RuntimeError("OpenAI image edit returned invalid JSON.") from exc
# ╔══════════════════════════════════════════════════════════════════╗
# ║ Image Generation ║
# ╚══════════════════════════════════════════════════════════════════╝
@@ -465,6 +511,103 @@ def _generate_image(api_key: str, prompt: str,
raise RuntimeError("No image was generated. The server may have refused the request.")
def _edit_image(api_key: str, prompt: str, reference_image: str,
aspect_ratio: str = "1:1", image_size: str = "1K",
output_dir: str = None, filename: str = None,
model: str = DEFAULT_MODEL, base_url: str = None) -> str:
"""
Image-to-image edit via the OpenAI-compatible /v1/images/edits endpoint.
Sends the reference image plus the prompt (used as the edit instruction).
Mirrors _generate_image's size/quality/format handling but posts
multipart/form-data instead of JSON.
Returns:
Path of the saved image file
"""
size_preset = _read_size_preset()
size = _select_size(model, aspect_ratio, image_size, size_preset)
quality = None if _is_dall_e_2(model) else _read_quality(image_size)
output_ext = ".png"
request = {
"prompt": prompt,
"model": model,
"size": size,
"n": 1,
}
if quality is not None:
request["quality"] = quality
if _is_gpt_image_model(model):
gpt_options, output_ext = _gpt_image_options(model)
request.update(gpt_options)
_apply_response_format(request, model)
mode_label = f"Proxy: {base_url}" if base_url else "OpenAI API"
print(f"[OpenAI - {mode_label}]")
print(f" Mode: edit (image-to-image)")
print(f" Model: {model}")
print(f" Reference: {reference_image}")
print(f" Prompt: {prompt[:120]}{'...' if len(prompt) > 120 else ''}")
print(f" Size: {size} (from aspect_ratio={aspect_ratio})")
if size_preset and size_preset != "auto":
print(f" Size Preset: {size_preset}")
if quality is not None:
print(f" Quality: {quality} (from image_size={image_size})")
else:
print(" Quality: omitted")
if request.get("response_format"):
print(f" Response: {request['response_format']}")
elif _read_response_format() == "omit":
print(" Response: omitted")
if request.get("output_format"):
print(f" Format: {request['output_format']}")
if request.get("output_compression") is not None:
print(f" Compression: {request['output_compression']}")
if request.get("background"):
print(f" Background: {request['background']}")
if request.get("moderation"):
print(f" Moderation: {request['moderation']}")
print()
start_time = time.time()
print(f" [..] Editing...", end="", flush=True)
heartbeat_stop = threading.Event()
def _heartbeat():
while not heartbeat_stop.is_set():
heartbeat_stop.wait(5)
if not heartbeat_stop.is_set():
elapsed = time.time() - start_time
print(f" {elapsed:.0f}s...", end="", flush=True)
hb_thread = threading.Thread(target=_heartbeat, daemon=True)
hb_thread.start()
try:
resp = _post_image_edit(api_key, base_url, request, reference_image)
finally:
heartbeat_stop.set()
hb_thread.join(timeout=1)
elapsed = time.time() - start_time
print(f"\n [DONE] Image edited ({elapsed:.1f}s)")
data = _field(resp, "data") if resp is not None else None
if data:
path = resolve_output_path(prompt, output_dir, filename, output_ext)
first_image = data[0]
b64_json = _field(first_image, "b64_json")
image_url = _field(first_image, "url")
if b64_json:
image_data = base64.b64decode(b64_json)
return save_image_bytes(image_data, path)
if image_url:
return download_image(image_url, path)
raise RuntimeError("No image was returned. The server may have refused the edit request.")
# ╔══════════════════════════════════════════════════════════════════╗
# ║ Public Entry Point ║
# ╚══════════════════════════════════════════════════════════════════╝
@@ -472,9 +615,10 @@ def _generate_image(api_key: str, prompt: str,
def generate(prompt: str,
aspect_ratio: str = "1:1", image_size: str = "1K",
output_dir: str = None, filename: str = None,
model: str = None, max_retries: int = MAX_RETRIES) -> str:
model: str = None, max_retries: int = MAX_RETRIES,
reference_image: str = None) -> str:
"""
OpenAI-compatible image generation with automatic retry.
OpenAI-compatible image generation (or image-to-image edit) with retry.
Reads credentials from the current process environment or a `.env` file:
OPENAI_API_KEY
@@ -482,13 +626,16 @@ def generate(prompt: str,
OPENAI_MODEL (optional override)
Args:
prompt: Prompt text
prompt: Prompt text (edit instruction when reference_image is set)
aspect_ratio: Aspect ratio, mapped to OpenAI size
image_size: Image size, mapped to OpenAI quality
output_dir: Output directory
filename: Output filename (without extension)
model: Model name (default: gpt-image-2)
max_retries: Maximum number of retries
reference_image: Optional source image path. When set, the request
goes to /v1/images/edits (image-to-image) instead of
/v1/images/generations.
Returns:
Path of the saved image file
@@ -516,6 +663,10 @@ def generate(prompt: str,
last_error = None
for attempt in range(max_retries + 1):
try:
if reference_image is not None:
return _edit_image(api_key, prompt, reference_image,
aspect_ratio, image_size, output_dir,
filename, model, base_url)
return _generate_image(api_key, prompt,
aspect_ratio, image_size, output_dir,
filename, model, base_url)
@@ -39,6 +39,7 @@ Supported keys:
Usage:
python3 image_gen.py "prompt" --aspect_ratio 16:9 --image_size 1K -o images/
python3 image_gen.py "edit instruction" --reference-image src.png -o images/
python3 image_gen.py --manifest project/images/image_prompts.json -o project/images/
python3 image_gen.py --list-backends
"""
@@ -690,8 +691,11 @@ def main() -> None:
description="Generate images using AI image model providers."
)
parser.add_argument(
"prompt", nargs="?", default="a beautiful landscape",
help="The text prompt for image generation."
"prompt", nargs="?", default=None,
help=(
"The text prompt for image generation. With --reference-image, "
"this is the edit instruction (required in that mode)."
)
)
parser.add_argument(
"--aspect_ratio", default="1:1", choices=ALL_ASPECT_RATIOS,
@@ -743,9 +747,42 @@ def main() -> None:
"next to the manifest, then exit. No backend / network needed."
),
)
parser.add_argument(
"--reference-image", dest="reference_image", default=None, metavar="PATH",
help=(
"Source image for image-to-image editing (single-image mode only). "
"When set, the prompt is used as the edit instruction. Only backends "
"that support editing accept this (currently: openai). Not valid with "
"--manifest / --render-md / --list-backends."
),
)
args = parser.parse_args()
if args.reference_image is not None:
# Reference editing is a single-image-only enhancement; keep it out of
# the manifest / sidecar / list surfaces entirely.
conflicting = [
name for name, val in (
("--manifest", args.manifest),
("--render-md", args.render_md),
("--list-backends", args.list_backends),
) if val
]
if conflicting:
parser.error(
"--reference-image is single-image mode only and cannot be "
f"combined with {', '.join(conflicting)}."
)
if not args.prompt or not args.prompt.strip():
parser.error(
"--reference-image requires a prompt to use as the edit instruction."
)
if not os.path.isfile(args.reference_image):
parser.error(
f"--reference-image file not found: {args.reference_image}"
)
if args.list_backends:
_print_backend_list()
return
@@ -806,15 +843,30 @@ def main() -> None:
print(f"Rendered Markdown sidecar: {md_path}")
sys.exit(1 if failed else 0)
# Single-image mode. Backfill the historical default prompt only here, so
# plain generation is byte-for-byte unchanged while edit mode still requires
# an explicit instruction (enforced above).
prompt = args.prompt if args.prompt is not None else "a beautiful landscape"
gen_kwargs = {
"prompt": prompt,
"aspect_ratio": args.aspect_ratio,
"image_size": args.image_size,
"output_dir": args.output,
"filename": args.filename,
"model": args.model,
}
if args.reference_image is not None:
if not getattr(backend, "SUPPORTS_REFERENCE_IMAGE", False):
print(
f"Error: backend '{backend_name}' does not support image editing "
"(--reference-image). Use a backend that does (currently: openai)."
)
sys.exit(1)
gen_kwargs["reference_image"] = args.reference_image
try:
backend.generate(
prompt=args.prompt,
aspect_ratio=args.aspect_ratio,
image_size=args.image_size,
output_dir=args.output,
filename=args.filename,
model=args.model,
)
backend.generate(**gen_kwargs)
except (ValueError, FileNotFoundError) as e:
print(f"Error: {e}")
sys.exit(1)
@@ -43,8 +43,10 @@ import re
import sys
from collections import OrderedDict
from pathlib import Path
from xml.etree import ElementTree as ET
from console_encoding import configure_utf8_stdio
from config import CANVAS_FORMATS
try:
import yaml # type: ignore
@@ -80,6 +82,24 @@ KIND_CONFIG = {
},
}
_BRAND_REQUIRED_SECTIONS = (
"Brand Overview",
"Color Scheme",
"Typography",
"Logo",
"Voice & Tone",
"Icon Style",
)
_BRAND_FORBIDDEN_SECTIONS = (
"Page Roster",
"Signature Design Elements",
)
_BRAND_PROVENANCE_VALUES = {"fact", "approx", "user"}
_BRAND_ASSET_REF_RE = re.compile(
r"`((?:\.\./)+(?:images|icons)/[^`]+)`"
)
_HEX_COLOR_RE = re.compile(r"#[0-9A-Fa-f]{6}")
# ---------------------------------------------------------------------------
# design_spec.md parsing
@@ -200,6 +220,264 @@ def _derive_page_types(pages: list[str]) -> list[str]:
return types
def _numbered_section(body: str, title: str) -> str | None:
match = re.search(
rf"^##\s+[IVX]+\.\s+{re.escape(title)}\s*$.*?(?=^##\s+|\Z)",
body,
re.MULTILINE | re.DOTALL,
)
return match.group(0) if match else None
def _validate_brand_spec(
template_id: str,
template_root: Path,
template_dir: Path,
frontmatter: dict,
body: str,
pages: list[str],
) -> None:
"""Reject brand workspaces that cannot be locked as portable identity truth.
Args:
template_id: Directory name used as the registry key.
template_root: Brand workspace root containing assets and templates.
template_dir: Directory containing ``design_spec.md`` and any page SVGs.
frontmatter: Parsed design-spec frontmatter.
body: Markdown content after the frontmatter block.
pages: SVG page stems discovered beside the design spec.
"""
errors: list[str] = []
declared_id = str(frontmatter.get("brand_id") or "").strip()
if declared_id != template_id:
errors.append(
f"frontmatter brand_id must match directory {template_id!r}, "
f"got {declared_id!r}"
)
declared_kind = str(frontmatter.get("kind") or "").strip()
if declared_kind != "brand":
errors.append(
"frontmatter kind must be 'brand', "
f"got {declared_kind!r}"
)
if pages:
errors.append(
"brand workspaces must not contain page SVGs under templates/: "
+ ", ".join(f"{page}.svg" for page in pages)
)
for title in _BRAND_REQUIRED_SECTIONS:
if _numbered_section(body, title) is None:
errors.append(f"missing required section: {title}")
for title in _BRAND_FORBIDDEN_SECTIONS:
if re.search(
rf"^##\s+(?:[IVX]+\.\s+)?{re.escape(title)}\s*$",
body,
re.MULTILINE,
):
errors.append(f"brand scope must not declare section: {title}")
declared_primary = str(frontmatter.get("primary_color") or "").strip()
if _HEX_COLOR_RE.fullmatch(declared_primary) is None:
errors.append(
"frontmatter primary_color must use #RRGGBB, "
f"got {declared_primary!r}"
)
color_section = _numbered_section(body, "Color Scheme") or ""
primary_rows: list[str] = []
for line in color_section.splitlines():
if not line.lstrip().startswith("|"):
continue
cells = [cell.strip() for cell in line.strip().strip("|").split("|")]
if len(cells) < 3:
continue
role = cells[0].strip("` ")
raw_color = cells[1].strip("` ")
if role.lower() == "role" or re.fullmatch(r":?-+:?", role):
continue
if _HEX_COLOR_RE.fullmatch(raw_color) is None:
errors.append(
f"color row {role!r} must use #RRGGBB, "
f"got {raw_color!r}"
)
continue
if role.lower() == "primary":
primary_rows.append(raw_color.upper())
provenance = cells[2].strip("` ").lower()
if provenance not in _BRAND_PROVENANCE_VALUES:
errors.append(
f"color {raw_color} must declare provenance as "
"fact, approx, or user"
)
if not primary_rows:
errors.append("Color Scheme must declare one primary color row")
elif len(primary_rows) > 1:
errors.append("Color Scheme must declare only one primary color row")
elif (
_HEX_COLOR_RE.fullmatch(declared_primary)
and primary_rows[0] != declared_primary.upper()
):
errors.append(
"Color Scheme primary must match frontmatter primary_color: "
f"{primary_rows[0]} != {declared_primary.upper()}"
)
root = template_root.resolve()
for raw_ref in sorted(set(_BRAND_ASSET_REF_RE.findall(body))):
asset = (template_dir / raw_ref).resolve()
try:
asset.relative_to(root)
except ValueError:
errors.append(f"asset reference escapes brand workspace: {raw_ref}")
continue
if not asset.is_file():
errors.append(f"referenced brand asset does not exist: {raw_ref}")
if errors:
details = "\n".join(f" - {error}" for error in errors)
raise SpecParseError(f"invalid brand specification:\n{details}")
def _validate_svg_template_spec(
kind: str,
template_id: str,
template_dir: Path,
frontmatter: dict,
pages: list[str],
) -> None:
"""Reject Layout/Deck workspaces whose registry facts drift from SVGs."""
errors: list[str] = []
id_key = KIND_CONFIG[kind]["id_key"]
declared_id = str(frontmatter.get(id_key) or "").strip()
if declared_id != template_id:
errors.append(
f"frontmatter {id_key} must match directory {template_id!r}, "
f"got {declared_id!r}"
)
declared_kind = str(frontmatter.get("kind") or "").strip()
if declared_kind != kind:
errors.append(
f"frontmatter kind must be {kind!r}, got {declared_kind!r}"
)
if not str(frontmatter.get("summary") or "").strip():
errors.append("frontmatter summary must be non-empty")
if not pages:
errors.append(f"{kind} workspace must contain at least one template SVG")
raw_page_count = frontmatter.get("page_count")
if isinstance(raw_page_count, bool) or not isinstance(raw_page_count, int):
errors.append("frontmatter page_count must be an integer")
elif raw_page_count != len(pages):
errors.append(
f"frontmatter page_count is {raw_page_count}, but templates/ "
f"contains {len(pages)} SVG files"
)
canvas_format = str(frontmatter.get("canvas_format") or "").strip()
canvas = CANVAS_FORMATS.get(canvas_format)
if canvas is None:
errors.append(
"frontmatter canvas_format must be one of: "
+ ", ".join(sorted(CANVAS_FORMATS))
)
else:
expected_canvas_fields = {
"canvas_width": canvas["width"],
"canvas_height": canvas["height"],
"canvas_viewbox": canvas["viewbox"],
}
for field, expected in expected_canvas_fields.items():
actual = frontmatter.get(field)
if str(actual) != str(expected):
errors.append(
f"frontmatter {field} must be {expected!r} for "
f"{canvas_format}, got {actual!r}"
)
if frontmatter.get("native_structure_mode") != "structured":
errors.append(
"frontmatter native_structure_mode must be 'structured'"
)
if frontmatter.get("replication_mode") not in {
"standard",
"fidelity",
"mirror",
}:
errors.append(
"frontmatter replication_mode must be standard, fidelity, or mirror"
)
if kind == "layout":
raw_page_types = frontmatter.get("page_types")
expected_page_types = _derive_page_types(pages)
if not isinstance(raw_page_types, list) or not all(
isinstance(item, str) and item.strip()
for item in raw_page_types
):
errors.append("frontmatter page_types must be a non-empty string list")
elif raw_page_types != expected_page_types:
errors.append(
"frontmatter page_types must exactly match the SVG filename "
f"roster: expected {expected_page_types!r}, got {raw_page_types!r}"
)
else:
primary_color = str(frontmatter.get("primary_color") or "").strip()
if _HEX_COLOR_RE.fullmatch(primary_color) is None:
errors.append(
"frontmatter primary_color must use #RRGGBB, "
f"got {primary_color!r}"
)
svg_paths = [template_dir / f"{page}.svg" for page in pages]
if canvas is not None:
expected_viewbox = str(canvas["viewbox"])
for svg_path in svg_paths:
try:
root = ET.parse(svg_path).getroot()
except (OSError, ET.ParseError) as exc:
errors.append(f"{svg_path.name} is not valid SVG XML: {exc}")
continue
actual_canvas = (
root.get("width"),
root.get("height"),
root.get("viewBox"),
)
expected_canvas = (
str(canvas["width"]),
str(canvas["height"]),
expected_viewbox,
)
if actual_canvas != expected_canvas:
errors.append(
f"{svg_path.name} canvas is {actual_canvas!r}, expected "
f"{expected_canvas!r}"
)
if svg_paths:
try:
from svg_to_pptx.pptx_package.template_structure import (
TemplateStructureError,
parse_template_slides,
)
except ImportError as exc:
errors.append(f"structured SVG roster is invalid: {exc}")
else:
try:
parse_template_slides(svg_paths)
except TemplateStructureError as exc:
errors.append(f"structured SVG roster is invalid: {exc}")
if errors:
details = "\n".join(f" - {error}" for error in errors)
raise SpecParseError(f"invalid {kind} specification:\n{details}")
# ---------------------------------------------------------------------------
# Per-kind extraction
# ---------------------------------------------------------------------------
@@ -233,25 +511,45 @@ def _extract_entry(kind: str, template_id: str, template_dir: Path) -> dict:
primary_color = fm.get("primary_color") or _extract_primary_color(body) or ""
if kind == "brand":
_validate_brand_spec(
template_id,
template_root,
template_dir,
fm,
body,
pages,
)
entry = OrderedDict(
summary=summary,
primary_color=str(primary_color),
)
elif kind == "layout":
page_types = fm.get("page_types") or _derive_page_types(pages)
if isinstance(page_types, str):
page_types = [t.strip() for t in re.split(r"[,]", page_types) if t.strip()]
_validate_svg_template_spec(
kind,
template_id,
template_dir,
fm,
pages,
)
page_types = fm["page_types"]
entry = OrderedDict(
summary=summary,
canvas_format=str(fm.get("canvas_format", "ppt169")),
page_count=int(fm.get("page_count", len(pages))),
canvas_format=str(fm["canvas_format"]),
page_count=int(fm["page_count"]),
page_types=list(page_types),
)
elif kind == "deck":
_validate_svg_template_spec(
kind,
template_id,
template_dir,
fm,
pages,
)
entry = OrderedDict(
summary=summary,
canvas_format=str(fm.get("canvas_format", "ppt169")),
page_count=int(fm.get("page_count", len(pages))),
canvas_format=str(fm["canvas_format"]),
page_count=int(fm["page_count"]),
primary_color=str(primary_color),
)
else:
@@ -19,9 +19,11 @@ from copy import deepcopy
from typing import Optional
SVG_NS = 'http://www.w3.org/2000/svg'
XLINK_NS = 'http://www.w3.org/1999/xlink'
# Register namespace to avoid ns0: prefix in output
# Register namespaces to avoid generated ns0/ns1 prefixes in saved SVGs.
ET.register_namespace('', SVG_NS)
ET.register_namespace('xlink', XLINK_NS)
def assign_temp_ids(root: ET.Element) -> None:
@@ -97,6 +97,7 @@ from svg_to_pptx.geometry_properties import ( # noqa: E402
_ICONS_DIR = _SCRIPTS_DIR.parent.parent / 'templates' / 'icons'
_USE_ICON_PATTERN = re.compile(r'<use\s+[^>]*data-icon="[^"]*"[^>]*/>')
_XLINK_HREF = '{http://www.w3.org/1999/xlink}href'
# Per-path mtime caches: key = absolute path str, value = (mtime, payload).
# Entry is evicted/replaced when the file's mtime changes, so stale data
@@ -136,6 +137,24 @@ def _cache_put(cache: dict, lock: threading.Lock, path: str, mtime: float, value
cache[path] = (mtime, value)
def _normalize_preview_hrefs(root: ET.Element) -> None:
"""Normalize legacy XLink references in the browser-only SVG copy.
ElementTree otherwise serializes an unregistered/legacy namespace with an
arbitrary prefix. The HTML SVG parser only gives special namespace handling
to ``xlink:href``; an arbitrary prefix can therefore render as an inert
attribute after ``innerHTML`` insertion. SVG 2 ``href`` works for both
images and local ``use`` references and avoids that parser boundary.
"""
for elem in root.iter():
legacy_href = elem.get(_XLINK_HREF)
if legacy_href is None:
continue
if elem.get('href') is None:
elem.set('href', legacy_href)
elem.attrib.pop(_XLINK_HREF, None)
# Lock / liveness helpers are shared with confirm_ui via server_common.
@@ -648,6 +667,7 @@ def create_app(
if '}' in tag:
tag = tag.split('}', 1)[1]
id_to_tag[eid] = tag
_normalize_preview_hrefs(root)
content = ET.tostring(root, encoding='unicode', xml_declaration=False)
content, warnings = _inline_icons(content)
if not pending_edits:
@@ -1730,10 +1730,10 @@
Array.from(el.attributes).forEach(function (attr) {
if (attr.name.indexOf("on") === 0) el.removeAttribute(attr.name);
// Strip dangerous URI protocols from href/xlink:href
if ((attr.name === "href" || attr.name === "xlink:href") &&
if (attr.localName === "href" &&
(/^\s*javascript\s*:/i.test(attr.value) ||
/^\s*data\s*:/i.test(attr.value))) {
el.removeAttribute(attr.name);
el.removeAttributeNode(attr);
}
});
});
File diff suppressed because it is too large Load Diff
@@ -48,11 +48,22 @@ class ThemeFontSpec:
@dataclass(frozen=True)
class MasterTextStyleSpec:
"""Title/body defaults written to a template slide master's txStyles."""
"""Title/body defaults written to one generated slide master's txStyles."""
title_hpt: int
body_hpt: int
@property
def body_levels_hpt(self) -> tuple[int, ...]:
"""Return a deterministic nine-level PowerPoint body-size hierarchy."""
factors = (16, 15, 14, 13, 12, 11, 10, 9, 8)
minimum = min(self.body_hpt, 800)
sizes = []
for factor in factors:
scaled = round((self.body_hpt * factor / 16) / 50) * 50
sizes.append(max(minimum, scaled))
return tuple(sizes)
def _font_face(font_family: str) -> ThemeFontFace:
fonts = parse_font_family(font_family)
@@ -125,17 +136,17 @@ def _font_size_hpt(raw: str, field: str) -> int:
def load_master_text_style_spec(project_path: Path) -> MasterTextStyleSpec:
"""Load required title/body defaults for explicit Layout master txStyles."""
"""Load required title/body defaults for generated Master text styles."""
lock_path = project_path / "spec_lock.md"
if not lock_path.is_file():
raise ThemeFontError(
"explicit Layout export requires spec_lock.md typography title and body rows"
"Master export requires spec_lock.md typography title and body rows"
)
rows = _typography_rows(lock_path)
missing = [field for field in ("title", "body") if field not in rows]
if missing:
raise ThemeFontError(
"explicit Layout export requires spec_lock.md typography rows: "
"Master export requires spec_lock.md typography rows: "
+ ", ".join(missing)
)
return MasterTextStyleSpec(
@@ -213,11 +224,29 @@ def _style_run_properties(style: ET.Element, label: str) -> list[ET.Element]:
return run_properties
def _style_level_run_properties(
style: ET.Element,
label: str,
) -> tuple[ET.Element, ...]:
"""Return direct level 1-9 defaults from one Master text style."""
levels: list[ET.Element] = []
for level in range(1, 10):
run_properties = style.find(
f"{{{DML_NS}}}lvl{level}pPr/{{{DML_NS}}}defRPr"
)
if run_properties is None:
raise ThemeFontError(
f"slide master {label} has no level-{level} a:defRPr"
)
levels.append(run_properties)
return tuple(levels)
def apply_master_text_style_spec(
extract_dir: Path,
spec: MasterTextStyleSpec,
) -> int:
"""Install locked title/body sizes into template slide-master txStyles."""
"""Install locked title/body sizes into generated slide-master txStyles."""
master_dir = extract_dir / "ppt" / "slideMasters"
master_paths = sorted(master_dir.glob("slideMaster*.xml"))
if not master_paths:
@@ -234,23 +263,39 @@ def apply_master_text_style_spec(
if text_styles is None:
raise ThemeFontError(f"Slide master has no p:txStyles: {master_path}")
style_sizes = (
("titleStyle", spec.title_hpt),
("bodyStyle", spec.body_hpt),
("otherStyle", spec.body_hpt),
)
for style_name, size in style_sizes:
title_style = text_styles.find(f"{{{PML_NS}}}titleStyle")
if title_style is None:
raise ThemeFontError(
f"Slide master has no p:titleStyle: {master_path}"
)
for run_properties in _style_run_properties(
title_style,
"p:titleStyle",
):
run_properties.set("sz", str(spec.title_hpt))
body_levels = spec.body_levels_hpt
for style_name in ("bodyStyle", "otherStyle"):
style = text_styles.find(f"{{{PML_NS}}}{style_name}")
if style is None:
raise ThemeFontError(
f"Slide master has no p:{style_name}: {master_path}"
)
for run_properties in _style_run_properties(
style,
f"p:{style_name}",
for run_properties, size in zip(
_style_level_run_properties(
style,
f"p:{style_name}",
),
body_levels,
):
run_properties.set("sz", str(size))
style_sizes = (
("titleStyle", (spec.title_hpt,)),
("bodyStyle", body_levels),
("otherStyle", body_levels),
)
tree.write(master_path, encoding="utf-8", xml_declaration=True)
try:
@@ -264,20 +309,27 @@ def apply_master_text_style_spec(
raise ThemeFontError(
f"Slide master lost p:txStyles after update: {master_path}"
)
for style_name, expected_size in style_sizes:
for style_name, expected_sizes in style_sizes:
style = read_back_styles.find(f"{{{PML_NS}}}{style_name}")
actual_sizes = (
{
if style is None:
actual_sizes: tuple[str | None, ...] = ()
elif style_name == "titleStyle":
actual_sizes = tuple(
item.get("sz")
for item in _style_run_properties(
style,
f"p:{style_name}",
)
}
if style is not None
else set()
)
if actual_sizes != {str(expected_size)}:
)
else:
actual_sizes = tuple(
item.get("sz")
for item in _style_level_run_properties(
style,
f"p:{style_name}",
)
)
if actual_sizes != tuple(str(size) for size in expected_sizes):
raise ThemeFontError(
f"Slide master p:{style_name} size read-back failed: "
f"{master_path}"
@@ -51,6 +51,7 @@ from .template_structure import (
TemplateStructureError,
load_pptx_structure_lock,
parse_template_slides,
structured_layout_definition_files,
template_lock_errors,
template_prototype_errors,
)
@@ -78,6 +79,7 @@ _LEGACY_PPTX_STRUCTURE_MODES = frozenset({
'preserve',
'template',
})
_RELEASE_PPTX_STRUCTURE_MODES = frozenset({'flat', 'structured'})
def _declared_pptx_structure_mode(project_path: Path) -> str | None:
@@ -98,14 +100,15 @@ def _print_structure_migration_error(mode: str | None) -> None:
"""Explain how a legacy or absent SVG structure contract is restored."""
label = repr(mode) if mode else 'missing (legacy implicit baseline)'
print(
"Error: release SVG export requires spec_lock.md "
"pptx_structure.mode: structured; found " + label + ".",
"Error: release SVG export requires an explicit spec_lock.md "
"pptx_structure.mode: flat (free design / brand-only) or structured "
"(deck/layout template); found " + label + ".",
file=sys.stderr,
)
print(
" Restore explicit Master/Layout metadata first by following "
"skills/ppt-master/workflows/restore-pptx-structure.md, then rerun "
"the quality gate and export.",
" New free-design and brand-only projects use mode: flat. Restore "
"legacy template/structured metadata by following skills/ppt-master/"
"workflows/restore-pptx-structure.md before export.",
file=sys.stderr,
)
@@ -320,12 +323,12 @@ Recorded narration:
],
default=None,
help=(
'PPTX structure strategy for native export. Release export requires '
'spec_lock.md pptx_structure.mode: structured and complete explicit '
'Master/Layout metadata in every SVG. flat is an explicit diagnostic '
'override that leaves all generated objects slide-local. baseline, '
'template, preserve, and generated are accepted only so legacy '
'invocations can receive a targeted migration error.'
'PPTX structure strategy for native export. Omitting this flag reads '
'spec_lock.md: flat is the free-design/brand-only release mode and '
'builds one clean project-owned Master plus Blank Layout while keeping '
'all SVG objects slide-local; structured is the deck/layout-template '
'mode and requires complete explicit metadata. baseline, template, '
'preserve, and generated are accepted only to report a migration error.'
),
)
parser.add_argument('--no-image-optimize', action='store_true',
@@ -419,24 +422,27 @@ Recorded narration:
_print_structure_migration_error(pptx_structure)
return 1
if pptx_structure is None:
if declared_structure_mode != 'structured':
if declared_structure_mode not in _RELEASE_PPTX_STRUCTURE_MODES:
_print_structure_migration_error(declared_structure_mode)
return 1
pptx_structure = 'structured'
pptx_structure = declared_structure_mode
elif pptx_structure == 'structured' and declared_structure_mode != 'structured':
_print_structure_migration_error(declared_structure_mode)
return 1
if pptx_structure == 'structured':
if (
pptx_structure in _RELEASE_PPTX_STRUCTURE_MODES
and declared_structure_mode == pptx_structure
):
try:
structure_lock = load_pptx_structure_lock(project_path)
except TemplateStructureError as exc:
print(f"Error: {exc}", file=sys.stderr)
return 1
if structure_lock is None or structure_lock.mode != 'structured':
if structure_lock is None or structure_lock.mode != pptx_structure:
print(
"Error: spec_lock.md must contain one complete "
"pptx_structure.mode: structured contract",
f"pptx_structure.mode: {pptx_structure} contract",
file=sys.stderr,
)
return 1
@@ -444,7 +450,7 @@ Recorded narration:
theme_font_spec = None
master_text_style_spec = None
theme_color_spec = None
if pptx_structure == 'structured':
if pptx_structure in {'flat', 'structured'}:
try:
theme_font_spec = load_theme_font_spec(project_path)
master_text_style_spec = load_master_text_style_spec(project_path)
@@ -452,6 +458,21 @@ Recorded narration:
except (ThemeFontError, ThemeColorError) as exc:
print(f"Error: {exc}", file=sys.stderr)
return 1
missing_theme_fields = []
if theme_font_spec is None:
missing_theme_fields.append(
'typography font_family/title_family/body_family'
)
if theme_color_spec is None:
missing_theme_fields.append('colors')
if missing_theme_fields:
print(
f"Error: {pptx_structure} export requires a current-project "
"theme contract in spec_lock.md; missing: "
+ ", ".join(missing_theme_fields),
file=sys.stderr,
)
return 1
if args.image_max_dimension < 1:
print("Error: --image-max-dimension must be >= 1", file=sys.stderr)
return 1
@@ -487,6 +508,7 @@ Recorded narration:
# parameters are removed. Structured export never activates either path.
structured_baseline = False
baseline_layout_specs = None
layout_definition_files: list[Path] = []
if pptx_structure == 'structured' and structure_lock is not None:
try:
template_specs = parse_template_slides(native_files)
@@ -499,6 +521,14 @@ Recorded narration:
for message in lock_errors:
print(f" {message}", file=sys.stderr)
return 1
try:
layout_definition_files = structured_layout_definition_files(
template_specs,
structure_lock,
)
except TemplateStructureError as exc:
print(f"Error: {exc}", file=sys.stderr)
return 1
prototype_errors = template_prototype_errors(
template_specs,
structure_lock,
@@ -847,9 +877,16 @@ Recorded narration:
else:
print(" [warn] metadata.json ignored (top level is not an object)", file=sys.stderr)
structure_name = project_name
if isinstance(doc_metadata, dict):
metadata_title = doc_metadata.get('title')
if isinstance(metadata_title, str) and metadata_title.strip():
structure_name = metadata_title
shared_kwargs = dict(
canvas_format=canvas_format,
doc_metadata=doc_metadata,
structure_name=structure_name,
verbose=verbose,
transition=transition,
transition_duration=transition_duration,
@@ -875,6 +912,7 @@ Recorded narration:
pptx_structure=pptx_structure,
structured_baseline=structured_baseline,
baseline_layout_specs=baseline_layout_specs,
layout_definition_files=layout_definition_files,
native_structure_contract=native_structure_contract,
theme_font_spec=theme_font_spec,
master_text_style_spec=master_text_style_spec,
@@ -47,6 +47,9 @@ _STRUCTURE_ATTRS = frozenset({
"data-pptx-placeholder-idx",
"data-pptx-editable",
})
_FLAT_FORBIDDEN_STRUCTURE_ATTRS = frozenset(
_STRUCTURE_ATTRS - {"data-pptx-editable"}
)
_LAYERS = frozenset({"master", "layout", "slide"})
_PLACEHOLDERS = frozenset({
"title",
@@ -150,7 +153,7 @@ class TemplateStructureError(RuntimeError):
@dataclass(frozen=True)
class PptxLayoutReference:
"""One spec_lock page-to-PowerPoint-layout declaration."""
"""One spec_lock page-to-PowerPoint-layout assignment."""
slide_num: int
layout_key: str
@@ -158,6 +161,17 @@ class PptxLayoutReference:
master_key: str | None = None
@dataclass(frozen=True)
class PptxLayoutDefinition:
"""One reusable PowerPoint Layout declared by a structured project lock."""
layout_key: str
master_key: str
layout_name: str
prototype_slide_num: int | None = None
prototype_svg_path: Path | None = None
@dataclass(frozen=True)
class PptxMasterReference:
"""One named Master declared by the structured project lock."""
@@ -183,6 +197,7 @@ class PptxStructureLock:
mode: str
template_adherence: str | None = None
masters: tuple[PptxMasterReference, ...] = ()
layout_definitions: tuple[PptxLayoutDefinition, ...] = ()
layouts: tuple[PptxLayoutReference, ...] = ()
prototypes: tuple[PptxPrototypeReference, ...] = ()
source_template: Path | None = None
@@ -480,6 +495,37 @@ def _template_replication_mode(template_dir: Path) -> str | None:
return None
def _template_svg_path(
template_dir: Path,
raw_basename: str,
context: str,
) -> tuple[str, Path]:
"""Resolve one flat template SVG basename inside the project workspace."""
basename = (
raw_basename[:-4]
if raw_basename.lower().endswith(".svg")
else raw_basename
)
if (
not basename
or basename in {".", ".."}
or "/" in basename
or "\\" in basename
or any(ord(char) < 0x20 for char in basename)
):
raise TemplateStructureError(
f"spec_lock.md {context} has invalid template SVG basename "
f"{raw_basename!r}"
)
svg_path = (template_dir / f"{basename}.svg").resolve()
if svg_path.parent != template_dir or not svg_path.is_file():
raise TemplateStructureError(
f"spec_lock.md {context} references missing template SVG "
f"templates/{basename}.svg"
)
return basename, svg_path
def load_pptx_structure_lock(project_path: Path) -> PptxStructureLock | None:
"""Load optional native-structure sections from spec_lock.md."""
lock_path = project_path / "spec_lock.md"
@@ -502,6 +548,7 @@ def load_pptx_structure_lock(project_path: Path) -> PptxStructureLock | None:
"pptx_structure",
"pptx_masters",
"pptx_layouts",
"page_pptx_layouts",
"page_layouts",
}:
continue
@@ -512,19 +559,23 @@ def load_pptx_structure_lock(project_path: Path) -> PptxStructureLock | None:
structure_rows = sections.get("pptx_structure", [])
master_rows = sections.get("pptx_masters", [])
layout_rows = sections.get("pptx_layouts", [])
page_layout_rows = sections.get("page_pptx_layouts", [])
prototype_rows = sections.get("page_layouts", [])
structure_section_present = "pptx_structure" in sections
master_section_present = "pptx_masters" in sections
layout_section_present = "pptx_layouts" in sections
page_layout_section_present = "page_pptx_layouts" in sections
prototype_section_present = "page_layouts" in sections
if (
not structure_rows
and not master_rows
and not layout_rows
and not page_layout_rows
and not prototype_rows
and not structure_section_present
and not master_section_present
and not layout_section_present
and not page_layout_section_present
and not prototype_section_present
):
return None
@@ -640,9 +691,9 @@ def load_pptx_structure_lock(project_path: Path) -> PptxStructureLock | None:
seen_prototype_slides: set[int] = set()
template_dir = (project_path / "templates").resolve()
template_replication_mode = _template_replication_mode(template_dir)
if mode != "structured" and prototype_rows:
if mode != "structured" and prototype_section_present:
raise TemplateStructureError(
"spec_lock.md page_layouts is allowed only when pptx_structure.mode "
"spec_lock.md page_layouts section is allowed only when pptx_structure.mode "
"is structured"
)
for page_key, raw_value in prototype_rows:
@@ -658,28 +709,11 @@ def load_pptx_structure_lock(project_path: Path) -> PptxStructureLock | None:
)
seen_prototype_slides.add(slide_num)
raw_basename = raw_value.strip()
basename = (
raw_basename[:-4]
if raw_basename.lower().endswith(".svg")
else raw_basename
basename, svg_path = _template_svg_path(
template_dir,
raw_basename,
f"page_layouts P{slide_num:02d}",
)
if (
not basename
or basename in {".", ".."}
or "/" in basename
or "\\" in basename
or any(ord(char) < 0x20 for char in basename)
):
raise TemplateStructureError(
f"spec_lock.md P{slide_num:02d} has invalid template SVG basename "
f"{raw_basename!r}"
)
svg_path = (template_dir / f"{basename}.svg").resolve()
if svg_path.parent != template_dir or not svg_path.is_file():
raise TemplateStructureError(
f"spec_lock.md P{slide_num:02d} references missing template SVG "
f"templates/{basename}.svg"
)
prototypes.append(PptxPrototypeReference(
slide_num=slide_num,
template_basename=basename,
@@ -696,98 +730,164 @@ def load_pptx_structure_lock(project_path: Path) -> PptxStructureLock | None:
"spec_lock.md page_layouts requires template_adherence: strict or adaptive"
)
layout_definitions: list[PptxLayoutDefinition] = []
references: list[PptxLayoutReference] = []
seen_slides: set[int] = set()
for page_key, raw_value in layout_rows:
page_match = _LOCK_PAGE_RE.fullmatch(page_key)
if not page_match or int(page_match.group(1)) <= 0:
if mode == "structured":
if not layout_rows:
raise TemplateStructureError(
f"spec_lock.md pptx_layouts key {page_key!r} must be P<NN>"
"spec_lock.md structured mode requires a non-empty "
"pptx_layouts definition section"
)
slide_num = int(page_match.group(1))
if slide_num in seen_slides:
raise TemplateStructureError(
f"spec_lock.md pptx_layouts repeats page P{slide_num:02d}"
)
seen_slides.add(slide_num)
parts = [part.strip() for part in raw_value.split("|")]
master_key: str | None = None
if mode == "structured":
seen_layout_keys: set[str] = set()
for layout_key, raw_value in layout_rows:
if not _LAYOUT_KEY_RE.fullmatch(layout_key):
raise TemplateStructureError(
f"spec_lock.md has invalid Layout key {layout_key!r}; use 1-64 "
"ASCII letters, digits, dots, underscores, or hyphens"
)
if layout_key in seen_layout_keys:
raise TemplateStructureError(
f"spec_lock.md pptx_layouts repeats Layout key {layout_key!r}"
)
seen_layout_keys.add(layout_key)
parts = [part.strip() for part in raw_value.split("|")]
if len(parts) != 3 or not all(parts):
raise TemplateStructureError(
f"spec_lock.md P{slide_num:02d} structured mapping must be "
"'<master_key> | <layout_key> | <PowerPoint layout name>'"
f"spec_lock.md Layout {layout_key!r} must be "
"'<master_key> | <PowerPoint layout name> | "
"<P<NN> or template:<basename>>'"
)
master_key, layout_key, layout_name = parts
master_key, layout_name, raw_source = parts
if not _MASTER_KEY_RE.fullmatch(master_key):
raise TemplateStructureError(
f"spec_lock.md P{slide_num:02d} has invalid Master key "
f"spec_lock.md Layout {layout_key!r} has invalid Master key "
f"{master_key!r}"
)
if master_key not in seen_master_keys:
raise TemplateStructureError(
f"spec_lock.md P{slide_num:02d} references undeclared Master "
f"{master_key!r}"
f"spec_lock.md Layout {layout_key!r} references undeclared "
f"Master {master_key!r}"
)
else:
prototype_slide_num: int | None = None
prototype_svg_path: Path | None = None
page_match = _LOCK_PAGE_RE.fullmatch(raw_source)
if page_match and int(page_match.group(1)) > 0:
prototype_slide_num = int(page_match.group(1))
elif raw_source.startswith("template:"):
raw_basename = raw_source.split(":", 1)[1].strip()
_basename, prototype_svg_path = _template_svg_path(
template_dir,
raw_basename,
f"pptx_layouts Layout {layout_key!r}",
)
else:
raise TemplateStructureError(
f"spec_lock.md Layout {layout_key!r} prototype source must be "
"P<NN> or template:<basename>"
)
layout_definitions.append(PptxLayoutDefinition(
layout_key=layout_key,
master_key=master_key,
layout_name=layout_name,
prototype_slide_num=prototype_slide_num,
prototype_svg_path=prototype_svg_path,
))
seen_slides: set[int] = set()
for page_key, raw_value in page_layout_rows:
page_match = _LOCK_PAGE_RE.fullmatch(page_key)
if not page_match or int(page_match.group(1)) <= 0:
raise TemplateStructureError(
f"spec_lock.md page_pptx_layouts key {page_key!r} must be P<NN>"
)
slide_num = int(page_match.group(1))
if slide_num in seen_slides:
raise TemplateStructureError(
"spec_lock.md page_pptx_layouts repeats page "
f"P{slide_num:02d}"
)
seen_slides.add(slide_num)
layout_key = raw_value.strip()
if not _LAYOUT_KEY_RE.fullmatch(layout_key):
raise TemplateStructureError(
f"spec_lock.md P{slide_num:02d} has invalid Layout key "
f"{layout_key!r}"
)
if layout_key not in seen_layout_keys:
raise TemplateStructureError(
f"spec_lock.md P{slide_num:02d} references undeclared Layout "
f"{layout_key!r}"
)
references.append(PptxLayoutReference(
slide_num=slide_num,
layout_key=layout_key,
))
if not references:
raise TemplateStructureError(
"spec_lock.md structured mode requires one page_pptx_layouts "
"assignment per generated page"
)
unused_masters = sorted(
seen_master_keys - {
definition.master_key for definition in layout_definitions
}
)
if unused_masters:
raise TemplateStructureError(
"spec_lock.md pptx_masters contains Master key(s) without a "
"Layout definition: " + ", ".join(unused_masters)
)
elif mode == "preserve":
if page_layout_section_present:
raise TemplateStructureError(
"spec_lock.md page_pptx_layouts is reserved for structured mode; "
"preserve mode maps source Layouts directly in pptx_layouts"
)
seen_slides: set[int] = set()
for page_key, raw_value in layout_rows:
page_match = _LOCK_PAGE_RE.fullmatch(page_key)
if not page_match or int(page_match.group(1)) <= 0:
raise TemplateStructureError(
f"spec_lock.md pptx_layouts key {page_key!r} must be P<NN>"
)
slide_num = int(page_match.group(1))
if slide_num in seen_slides:
raise TemplateStructureError(
f"spec_lock.md pptx_layouts repeats page P{slide_num:02d}"
)
seen_slides.add(slide_num)
parts = [part.strip() for part in raw_value.split("|")]
if len(parts) not in {1, 2} or not parts[0]:
raise TemplateStructureError(
f"spec_lock.md P{slide_num:02d} preserve mapping must be "
"'<layout_key>' or '<layout_key> | <PowerPoint layout name>'"
)
layout_key = parts[0]
layout_name = parts[1] if len(parts) == 2 else None
if not _LAYOUT_KEY_RE.fullmatch(layout_key):
if not _LAYOUT_KEY_RE.fullmatch(layout_key):
raise TemplateStructureError(
f"spec_lock.md P{slide_num:02d} has invalid Layout key "
f"{layout_key!r}"
)
references.append(PptxLayoutReference(
slide_num=slide_num,
layout_key=layout_key,
layout_name=parts[1] if len(parts) == 2 else None,
))
if not references:
raise TemplateStructureError(
f"spec_lock.md P{slide_num:02d} has invalid layout key "
f"{layout_key!r}"
"spec_lock.md preserve mode requires one pptx_layouts row per page"
)
references.append(PptxLayoutReference(
slide_num=slide_num,
layout_key=layout_key,
layout_name=layout_name,
master_key=master_key,
))
if mode in {"structured", "preserve"} and not references:
raise TemplateStructureError(
f"spec_lock.md {mode} mode requires one pptx_layouts row per page"
)
if mode == "structured" and layout_section_present and not layout_rows:
raise TemplateStructureError(
"spec_lock.md structured pptx_layouts section cannot be empty"
)
layout_contracts: dict[str, tuple[str | None, str | None]] = {}
for reference in references:
contract = (reference.master_key, reference.layout_name)
previous = layout_contracts.setdefault(reference.layout_key, contract)
if previous != contract:
else:
if layout_section_present or page_layout_section_present:
raise TemplateStructureError(
f"spec_lock.md layout key {reference.layout_key!r} must be globally "
"unique to one Master and one Layout name"
"spec_lock.md pptx_layouts/page_pptx_layouts sections are not "
"allowed when pptx_structure.mode is flat"
)
if mode == "structured":
unused_masters = sorted(
seen_master_keys - {
reference.master_key
for reference in references
if reference.master_key is not None
}
)
if unused_masters:
raise TemplateStructureError(
"spec_lock.md pptx_masters contains unreferenced Master key(s): "
+ ", ".join(unused_masters)
)
if mode == "flat" and layout_section_present:
raise TemplateStructureError(
"spec_lock.md pptx_layouts section is not allowed when "
"pptx_structure.mode is flat"
)
return PptxStructureLock(
mode=mode,
template_adherence=template_adherence,
masters=tuple(masters),
layout_definitions=tuple(layout_definitions),
layouts=tuple(sorted(references, key=lambda item: item.slide_num)),
prototypes=tuple(sorted(prototypes, key=lambda item: item.slide_num)),
source_template=source_template,
@@ -1446,17 +1546,10 @@ def parse_template_slide(
return spec
def parse_template_slides(svg_files: list[Path]) -> list[TemplateSlideSpec]:
"""Parse a deck and enforce cross-slide master/layout contracts."""
specs = [
parse_template_slide(svg_path, slide_num)
for slide_num, svg_path in enumerate(svg_files, start=1)
]
if not specs:
raise TemplateStructureError(
"Explicit Layout export requires at least one SVG slide"
)
def _validate_template_slide_contracts(
specs: list[TemplateSlideSpec],
) -> None:
"""Enforce cross-prototype Master and Layout structure identity."""
by_master: dict[str, list[TemplateSlideSpec]] = {}
for spec in specs:
by_master.setdefault(spec.master_key, []).append(spec)
@@ -1505,6 +1598,19 @@ def parse_template_slides(svg_files: list[Path]) -> list[TemplateSlideSpec]:
f"from prototype {prototype.svg_path.name}; repeat the same layout "
"layers and placeholder ids/types in the same order"
)
def parse_template_slides(svg_files: list[Path]) -> list[TemplateSlideSpec]:
"""Parse a deck and enforce cross-slide master/layout contracts."""
specs = [
parse_template_slide(svg_path, slide_num)
for slide_num, svg_path in enumerate(svg_files, start=1)
]
if not specs:
raise TemplateStructureError(
"Explicit Layout export requires at least one SVG slide"
)
_validate_template_slide_contracts(specs)
return specs
@@ -1579,6 +1685,33 @@ def parse_optional_layout_slides(
return parse_template_slides(svg_files)
def flat_structure_metadata_errors(svg_files: list[Path]) -> list[str]:
"""Return every Master/Layout marker forbidden by flat export."""
errors: list[str] = []
for svg_path in svg_files:
try:
root = ET.parse(svg_path).getroot()
except (OSError, ET.ParseError) as exc:
errors.append(
f"{svg_path.name}: unable to inspect flat-mode metadata: {exc}"
)
continue
for elem in root.iter():
attrs = sorted(
attr
for attr in _FLAT_FORBIDDEN_STRUCTURE_ATTRS
if elem.get(attr) is not None
)
if not attrs:
continue
element_id = (elem.get("id") or _local_tag(elem)).strip()
errors.append(
f"{svg_path.name}: flat mode forbids Master/Layout structure "
f"metadata on {element_id!r}: " + ", ".join(attrs)
)
return errors
def parse_preserve_slides(svg_files: list[Path]) -> list[TemplateSlideSpec]:
"""Parse preserve-mode slides before source master grouping is known."""
specs = [
@@ -1590,6 +1723,74 @@ def parse_preserve_slides(svg_files: list[Path]) -> list[TemplateSlideSpec]:
return specs
def structured_layout_definition_files(
specs: list[TemplateSlideSpec],
structure_lock: PptxStructureLock,
) -> list[Path]:
"""Validate the unique Layout roster and return unused prototype SVGs.
A generated page can be the carrier for a used Layout definition. A Layout
with no generated page must point at one installed template SVG; the builder
converts that SVG on an internal trailing slide and removes the carrier slide
after registering the reusable Layout.
"""
if structure_lock.mode != "structured":
return []
definitions = {
definition.layout_key: definition
for definition in structure_lock.layout_definitions
}
specs_by_slide = {spec.slide_num: spec for spec in specs}
used_layout_keys = {spec.layout_key for spec in specs}
master_names = {
master.master_key: master.master_name
for master in structure_lock.masters
}
combined_specs = list(specs)
definition_files: list[Path] = []
next_slide_num = max(specs_by_slide, default=0) + 1
for definition in structure_lock.layout_definitions:
if definition.prototype_slide_num is not None:
prototype = specs_by_slide.get(definition.prototype_slide_num)
if prototype is None:
raise TemplateStructureError(
f"spec_lock.md Layout {definition.layout_key!r} uses missing "
f"prototype page P{definition.prototype_slide_num:02d}"
)
elif definition.prototype_svg_path is not None:
prototype = parse_template_slide(
definition.prototype_svg_path,
next_slide_num,
)
next_slide_num += 1
combined_specs.append(prototype)
if definition.layout_key not in used_layout_keys:
definition_files.append(definition.prototype_svg_path)
else:
raise TemplateStructureError(
f"spec_lock.md Layout {definition.layout_key!r} has no prototype"
)
expected_master_name = master_names.get(definition.master_key)
if (
prototype.layout_key != definition.layout_key
or prototype.layout_name != definition.layout_name
or prototype.master_key != definition.master_key
or prototype.master_name != expected_master_name
):
raise TemplateStructureError(
f"spec_lock.md Layout {definition.layout_key!r} definition does "
f"not match prototype {prototype.svg_path.name} root identity"
)
missing_definitions = sorted(used_layout_keys - set(definitions))
if missing_definitions:
raise TemplateStructureError(
"spec_lock.md pptx_layouts is missing generated Layout key(s): "
+ ", ".join(missing_definitions)
)
_validate_template_slide_contracts(combined_specs)
return definition_files
def template_lock_errors(
specs: list[TemplateSlideSpec],
structure_lock: PptxStructureLock,
@@ -1606,15 +1807,22 @@ def template_lock_errors(
expected_slides = set(references)
missing = sorted(actual_slides - expected_slides)
extra = sorted(expected_slides - actual_slides)
assignment_section = (
"page_pptx_layouts"
if structure_lock.mode == "structured"
else "pptx_layouts"
)
if missing:
pages = ", ".join(f"P{slide_num:02d}" for slide_num in missing)
errors.append(
f"spec_lock.md pptx_layouts is missing generated page(s): {pages}"
f"spec_lock.md {assignment_section} is missing generated page(s): "
f"{pages}"
)
if extra:
pages = ", ".join(f"P{slide_num:02d}" for slide_num in extra)
errors.append(
f"spec_lock.md pptx_layouts references absent page(s): {pages}"
f"spec_lock.md {assignment_section} references absent page(s): "
f"{pages}"
)
for spec in specs:
reference = references.get(spec.slide_num)
@@ -1623,26 +1831,40 @@ def template_lock_errors(
if spec.layout_key != reference.layout_key:
errors.append(
f"{spec.svg_path.name}: data-pptx-layout={spec.layout_key!r} "
f"does not match spec_lock P{spec.slide_num:02d} layout key "
f"does not match spec_lock P{spec.slide_num:02d} Layout key "
f"{reference.layout_key!r}"
)
if reference.layout_name and spec.layout_name != reference.layout_name:
errors.append(
f"{spec.svg_path.name}: data-pptx-layout-name={spec.layout_name!r} "
f"does not match spec_lock P{spec.slide_num:02d} layout name "
f"{reference.layout_name!r}"
)
if reference.master_key and spec.master_key != reference.master_key:
errors.append(
f"{spec.svg_path.name}: data-pptx-master={spec.master_key!r} "
f"does not match spec_lock P{spec.slide_num:02d} Master key "
f"{reference.master_key!r}"
)
if structure_lock.mode == "preserve":
if reference.layout_name and spec.layout_name != reference.layout_name:
errors.append(
f"{spec.svg_path.name}: data-pptx-layout-name="
f"{spec.layout_name!r} does not match spec_lock "
f"P{spec.slide_num:02d} Layout name "
f"{reference.layout_name!r}"
)
if structure_lock.mode == "structured":
definitions = {
definition.layout_key: definition
for definition in structure_lock.layout_definitions
}
master_names = {
master.master_key: master.master_name for master in structure_lock.masters
}
for spec in specs:
definition = definitions.get(spec.layout_key)
if definition is not None:
if spec.layout_name != definition.layout_name:
errors.append(
f"{spec.svg_path.name}: data-pptx-layout-name="
f"{spec.layout_name!r} does not match Layout "
f"{spec.layout_key!r} name {definition.layout_name!r}"
)
if spec.master_key != definition.master_key:
errors.append(
f"{spec.svg_path.name}: data-pptx-master="
f"{spec.master_key!r} does not match Layout "
f"{spec.layout_key!r} Master {definition.master_key!r}"
)
expected_name = master_names.get(spec.master_key)
if expected_name is not None and spec.master_name != expected_name:
errors.append(
@@ -1650,6 +1872,10 @@ def template_lock_errors(
f"{spec.master_name!r} does not match spec_lock Master "
f"{spec.master_key!r} name {expected_name!r}"
)
try:
structured_layout_definition_files(specs, structure_lock)
except TemplateStructureError as exc:
errors.append(str(exc))
return errors
@@ -49,6 +49,7 @@ from .template_structure import (
PML_NS = "http://schemas.openxmlformats.org/presentationml/2006/main"
DML_NS = "http://schemas.openxmlformats.org/drawingml/2006/main"
REL_NS = "http://schemas.openxmlformats.org/officeDocument/2006/relationships"
P14_NS = "http://schemas.microsoft.com/office/powerpoint/2010/main"
SLIDE_LAYOUT_REL_TYPE = (
"http://schemas.openxmlformats.org/officeDocument/2006/relationships/slideLayout"
)
@@ -58,6 +59,9 @@ SLIDE_REL_TYPE = (
SLIDE_MASTER_REL_TYPE = (
"http://schemas.openxmlformats.org/officeDocument/2006/relationships/slideMaster"
)
THEME_REL_TYPE = (
"http://schemas.openxmlformats.org/officeDocument/2006/relationships/theme"
)
SLIDE_LAYOUT_CONTENT_TYPE = (
"application/vnd.openxmlformats-officedocument.presentationml.slideLayout+xml"
)
@@ -156,6 +160,51 @@ class _PackageReader:
return result
def _validate_unique_creation_ids(
reader: _PackageReader,
parts: set[str],
) -> None:
"""Reject cloned PowerPoint parts that retain the same p14:creationId."""
owners: dict[int, str] = {}
for part in sorted(parts):
root = reader.xml(part)
if root is None:
continue
c_sld = root.find(f"{{{PML_NS}}}cSld")
if c_sld is None:
continue
seen_in_part: set[int] = set()
for creation_id in c_sld.findall(
f"{{{PML_NS}}}extLst/{{{PML_NS}}}ext/"
f"{{{P14_NS}}}creationId"
):
raw_value = creation_id.get("val")
try:
value = int(raw_value or "")
except ValueError:
reader.errors.append(
f"{part} has invalid p14:creationId value {raw_value!r}"
)
continue
if value < 0 or value > OOXML_UINT32_MAX:
reader.errors.append(
f"{part} p14:creationId {value} is outside OOXML UInt32"
)
continue
if value in seen_in_part:
reader.errors.append(
f"{part} repeats p14:creationId {value}"
)
continue
seen_in_part.add(value)
previous_owner = owners.setdefault(value, part)
if previous_owner != part:
reader.errors.append(
f"p14:creationId {value} is shared by "
f"{previous_owner} and {part}"
)
def _top_level_shape_names(
root: ET.Element,
context: str,
@@ -759,6 +808,39 @@ def _validate_presentation_master_registration(
)
def _validate_master_theme_ownership(
reader: _PackageReader,
master_parts: set[str],
) -> None:
"""Require a separate Theme part for every structured Slide Master."""
owners: dict[str, str] = {}
for master_part in sorted(master_parts):
resolved = _single_relationship_target(
reader,
master_part,
THEME_REL_TYPE,
f"Master {master_part}",
)
if resolved is None:
continue
_relationship, theme_part = resolved
if not (
theme_part.startswith("ppt/theme/")
and theme_part.endswith(".xml")
):
reader.errors.append(
f"Master {master_part} targets non-Theme part {theme_part}"
)
continue
reader.xml(theme_part)
previous_owner = owners.setdefault(theme_part, master_part)
if previous_owner != master_part:
reader.errors.append(
f"Theme {theme_part} is shared by structured Masters "
f"{previous_owner} and {master_part}"
)
def _validate_presentation_slide_registration(
reader: _PackageReader,
slide_parts: set[str],
@@ -785,23 +867,32 @@ def validate_pptx_template_package(
pptx_path: str | Path,
specs: list[TemplateSlideSpec],
*,
layout_specs: list[TemplateSlideSpec] | None = None,
expected_layout_parts: dict[str, str] | None = None,
expected_master_parts: dict[str, str] | None = None,
expected_backgrounds: dict[str, str | None] | None = None,
expected_shape_rosters: dict[str, tuple[str, ...]] | None = None,
) -> None:
"""Validate a finished structured PPTX against its explicit SVG contract.
Export supplies pre-packaging background and shape expectations for exact
serialization read-back. Callers that only have the finished package still
receive the portable structure, ownership, and relationship checks.
``specs`` describes published slides. ``layout_specs`` may additionally
include internal prototypes for unused Layouts. Export supplies exact part,
background, and shape expectations for deterministic serialization
read-back. Callers with only published-slide specs retain the original
portable relationship checks.
"""
if not specs:
raise ValueError("structured package validation requires at least one slide spec")
structure_specs = layout_specs or specs
specs_by_layout: dict[str, list[TemplateSlideSpec]] = {}
public_specs_by_layout: dict[str, list[TemplateSlideSpec]] = {}
bindings_by_layout: dict[str, tuple[TemplatePlaceholderBinding, ...]] = {}
try:
for spec in specs:
for spec in structure_specs:
specs_by_layout.setdefault(spec.layout_key, []).append(spec)
for spec in specs:
public_specs_by_layout.setdefault(spec.layout_key, []).append(spec)
for layout_key, layout_specs in specs_by_layout.items():
bindings_by_layout[layout_key] = template_placeholder_bindings(
layout_specs[0]
@@ -849,8 +940,22 @@ def validate_pptx_template_package(
exact=True,
ordered=True,
)
layout_parts_by_key: dict[str, str] = {}
keys_by_layout_part: dict[str, str] = {}
layout_parts_by_key = dict(expected_layout_parts or {})
keys_by_layout_part = {
part: key for key, part in layout_parts_by_key.items()
}
if len(keys_by_layout_part) != len(layout_parts_by_key):
errors.append(
"expected Layout part mapping assigns one part to multiple keys"
)
if expected_layout_parts is not None and (
set(expected_layout_parts) != set(specs_by_layout)
):
errors.append(
"expected Layout key roster differs from the SVG contract; "
f"missing={sorted(set(specs_by_layout) - set(expected_layout_parts))}, "
f"extra={sorted(set(expected_layout_parts) - set(specs_by_layout))}"
)
slide_roots: dict[int, ET.Element] = {}
for spec in specs:
@@ -876,10 +981,7 @@ def validate_pptx_template_package(
)
continue
reader.xml(layout_part)
previous_part = layout_parts_by_key.setdefault(
spec.layout_key,
layout_part,
)
previous_part = layout_parts_by_key.setdefault(spec.layout_key, layout_part)
if previous_part != layout_part:
errors.append(
f"layout key {spec.layout_key!r} targets both {previous_part} "
@@ -898,8 +1000,25 @@ def validate_pptx_template_package(
used_master_parts: set[str] = set()
layout_parts_by_master: dict[str, set[str]] = {}
master_specs_by_part: dict[str, TemplateSlideSpec] = {}
master_parts_by_key: dict[str, str] = {}
keys_by_master_part: dict[str, str] = {}
master_parts_by_key = dict(expected_master_parts or {})
keys_by_master_part = {
part: key for key, part in master_parts_by_key.items()
}
expected_master_keys = {
spec.master_key for spec in structure_specs
}
if len(keys_by_master_part) != len(master_parts_by_key):
errors.append(
"expected Master part mapping assigns one part to multiple keys"
)
if expected_master_parts is not None and (
set(expected_master_parts) != expected_master_keys
):
errors.append(
"expected Master key roster differs from the SVG contract; "
f"missing={sorted(expected_master_keys - set(expected_master_parts))}, "
f"extra={sorted(set(expected_master_parts) - expected_master_keys)}"
)
for layout_key, layout_specs in specs_by_layout.items():
prototype = layout_specs[0]
layout_part = layout_parts_by_key.get(layout_key)
@@ -988,7 +1107,7 @@ def validate_pptx_template_package(
"for exact read-back"
)
slide_placeholders: dict[int, dict[int, _Placeholder]] = {}
for spec in layout_specs:
for spec in public_specs_by_layout.get(layout_key, []):
slide_root = slide_roots.get(spec.slide_num)
if slide_root is None:
continue
@@ -1373,8 +1492,13 @@ def validate_pptx_template_package(
errors,
"Master",
)
_validate_unique_creation_ids(
reader,
expected_slide_parts | expected_layout_parts | used_master_parts,
)
_validate_presentation_slide_registration(reader, expected_slide_parts)
_validate_presentation_master_registration(reader, used_master_parts)
_validate_master_theme_ownership(reader, used_master_parts)
except (OSError, zipfile.BadZipFile) as exc:
raise ValueError(f"cannot read template PPTX package {path}: {exc}") from exc
@@ -46,6 +46,10 @@ _FRONTMATTER_ID_RE = re.compile(
r"^(?:template_id|deck_id|layout_id)\s*:\s*(.+?)\s*$",
re.MULTILINE,
)
_REPLICATION_MODE_RE = re.compile(
r"^replication_mode\s*:\s*(standard|fidelity|mirror)\s*$",
re.MULTILINE,
)
_FONT_SIZE_RE = re.compile(r"^([0-9]+(?:\.[0-9]+)?)(?:px)?$")
_FILENAME_UNSAFE_RE = re.compile(r"[\\/:*?\"<>|\x00-\x1f]+")
_TITLE_PLACEHOLDERS = frozenset({"title", "subtitle"})
@@ -87,6 +91,13 @@ def _template_id(spec_path: Path, workspace: Path) -> str:
return safe or "template"
def _replication_mode(spec_path: Path) -> str:
"""Read the template replication mode, defaulting legacy packages to standard."""
text = spec_path.read_text(encoding="utf-8")
match = _REPLICATION_MODE_RE.search(text)
return match.group(1) if match else "standard"
def _style_property(style: str, name: str) -> str | None:
"""Return one inline CSS declaration value."""
for declaration in style.split(";"):
@@ -146,12 +157,62 @@ def _master_text_style(svg_files: list[Path]) -> tuple[MasterTextStyleSpec, floa
)
def _verify_output(output_path: Path) -> tuple[int, int, int]:
"""Reopen the review deck and return slide/master/layout counts."""
def _verify_output(
output_path: Path,
*,
require_full_placeholder_frames: bool,
) -> tuple[int, int, int, int]:
"""Reopen the review deck and verify counts plus authored placeholder frames."""
presentation = Presentation(str(output_path))
master_count = len(presentation.slide_masters)
layout_count = sum(len(master.slide_layouts) for master in presentation.slide_masters)
return len(presentation.slides), master_count, layout_count
placeholder_count = 0
if require_full_placeholder_frames:
for slide_number, slide in enumerate(presentation.slides, 1):
layout_placeholders = {
shape.placeholder_format.idx: shape
for shape in slide.slide_layout.placeholders
}
slide_placeholders = {
shape.placeholder_format.idx: shape
for shape in slide.placeholders
}
if set(slide_placeholders) != set(layout_placeholders):
raise ValueError(
f"review slide {slide_number} placeholder indexes do not match "
f"its Layout: {sorted(slide_placeholders)} != "
f"{sorted(layout_placeholders)}"
)
for placeholder_idx, slide_shape in slide_placeholders.items():
layout_shape = layout_placeholders[placeholder_idx]
if (
slide_shape.placeholder_format.type
!= layout_shape.placeholder_format.type
):
raise ValueError(
f"review slide {slide_number} placeholder {placeholder_idx} "
"type does not match its Layout"
)
slide_frame = (
slide_shape.left,
slide_shape.top,
slide_shape.width,
slide_shape.height,
)
layout_frame = (
layout_shape.left,
layout_shape.top,
layout_shape.width,
layout_shape.height,
)
if slide_frame != layout_frame:
raise ValueError(
f"review slide {slide_number} placeholder {placeholder_idx} "
f"uses a tight/local frame {slide_frame}; expected full "
f"Layout frame {layout_frame}"
)
placeholder_count += 1
return len(presentation.slides), master_count, layout_count, placeholder_count
def build_parser() -> argparse.ArgumentParser:
@@ -202,7 +263,12 @@ def main(argv: list[str] | None = None) -> int:
if not svg_files:
raise ValueError(f"template directory has no SVG prototypes: {template_dir}")
template_id = _template_id(template_dir / "design_spec.md", workspace)
spec_path = template_dir / "design_spec.md"
template_id = _template_id(spec_path, workspace)
replication_mode = _replication_mode(spec_path)
use_full_placeholder_frames = (
not args.visual_only and replication_mode != "mirror"
)
output_path = (
Path(args.output).expanduser().resolve()
if args.output
@@ -225,8 +291,11 @@ def main(argv: list[str] | None = None) -> int:
print(f" SVG prototypes: {len(svg_files)}")
if args.visual_only:
print(" Review mode: visual-only legacy compatibility")
elif replication_mode == "mirror":
print(" Review placeholder frames: preserved source Slide geometry")
else:
print(f" Review Master defaults: title {title_px:g}px, body {body_px:g}px")
print(" Review placeholder frames: full Layout bounds")
print(f" Output: {output_path}")
success = create_pptx_with_native_svg(
@@ -240,13 +309,18 @@ def main(argv: list[str] | None = None) -> int:
image_optimize=False,
native_objects=True,
pptx_structure="flat" if args.visual_only else "structured",
use_layout_placeholder_frames=use_full_placeholder_frames,
master_text_style_spec=text_style,
structure_name=template_id,
)
if not success or not output_path.is_file():
print("Error: template preview export did not produce a PPTX", file=sys.stderr)
return 1
slide_count, master_count, layout_count = _verify_output(output_path)
slide_count, master_count, layout_count, placeholder_count = _verify_output(
output_path,
require_full_placeholder_frames=use_full_placeholder_frames,
)
if slide_count != len(svg_files):
print(
"Error: review PPTX slide count does not match the template SVG roster "
@@ -256,9 +330,15 @@ def main(argv: list[str] | None = None) -> int:
return 1
label = "Visual-only template preview" if args.visual_only else "Template preview"
placeholder_status = (
f", {placeholder_count} full-frame placeholder(s)"
if use_full_placeholder_frames
else ""
)
print(
f"[OK] {label} verified: "
f"{slide_count} slides, {master_count} master(s), {layout_count} layout(s)"
f"{slide_count} slides, {master_count} master(s), "
f"{layout_count} layout(s){placeholder_status}"
)
print(output_path)
return 0
@@ -50,6 +50,6 @@ Logo filenames are descriptive, not contractual — `templates/design_spec.md`
## Discovery index
[brands_index.json](./brands_index.json) is a slim machine-readable map (`brand_id → { summary, primary_color }`). It is refreshed by `register_template.py --kind brand <brand_id>` after a brand is created or edited.
[brands_index.json](./brands_index.json) is a slim machine-readable map (`brand_id → { summary, primary_color }`). Refresh it with `register_template.py --kind brand <brand_id>` after a brand is created or edited. Registration rejects incomplete frontmatter, mismatched IDs, page SVGs, missing required identity sections, invalid or inconsistent colors/provenance, and broken workspace-local asset references.
Listing the index does not trigger any pipeline action — Step 3 triggers only on an explicit directory path supplied by the user, regardless of whether the brand appears in the index.
@@ -1,11 +1,11 @@
---
brand_id: anthropic
kind: brand
summary: Anthropic brand identity — AI/LLM tech talks, developer conferences, technical training, product launches
summary: Anthropic / Claude brand family — AI research, product talks, developer conferences, technical training, and launches
primary_color: "#D97757"
---
# Anthropic Brand Specification
# Anthropic / Claude Brand Family Specification
> Identity-only preset. No SVG page roster — pages are composed freely under these constraints.
@@ -13,25 +13,23 @@ primary_color: "#D97757"
| Property | Value |
|---|---|
| Brand Name | Anthropic |
| Use Cases | AI / LLM tech talks, developer conferences, technical training, product launches, research updates |
| Brand Name | Anthropic / Claude |
| Use Cases | AI / LLM research updates, Claude product talks, developer conferences, technical training, product launches |
| Tone | Tech-forward, professional, modern, conclusion-first, restrained |
| Sources | Bundled Claude SVG assets for literal logo colors; Anthropic public materials reviewed 2026-07-13 |
## II. Color Scheme
| Role | HEX | Provenance | Notes |
|---|---|---|---|
| primary | `#D97757` | fact | Anthropic Orange — extracted from `anthropic_mark.svg` (matches the mark fill on claude.com header) |
| neutral-dark | `#191919` | fact | Anthropic near-black — body text, dark surfaces, chart base |
| bg | `#FFFFFF` | fact | Pure white page background |
| accent (info) | `#4A90D9` | approx | Tech blue — flow / process, links, interactive elements |
| accent (positive) | `#10B981` | approx | Mint green — recommended options, success states |
| accent (alert) | `#EF4444` | approx | Coral red — risks, cautions, warnings |
| primary | `#D97757` | fact | Claude coral — literal fill in the bundled Claude star mark |
| neutral-dark | `#191919` | fact | Literal fill in the bundled Claude wordmark |
| bg | `#FFFFFF` | approx | Default light presentation background |
| surface | `#F8FAFC` | approx | Off-white — card background |
| border | `#E2E8F0` | approx | Light gray — card borders, dividers |
| muted-text | `#64748B` | approx | Slate gray — secondary text, chart labels |
The first three rows are the official triad; the accent / surface / border / muted rows are presentation conventions on top of the official identity, derived to match Anthropic's restrained product UI tone. The accent triple (info / positive / alert) differentiates content types (blue = process, green = recommended, red = risk). Strategist may rotate dominance per page.
The first two rows are literal Claude asset facts. Background and neutral rows are presentation conventions, not official company tokens. Choose semantic chart/status colors per deck; do not lock an invented info/success/alert trio as Anthropic identity.
## III. Typography
@@ -40,19 +38,20 @@ The first three rows are the official triad; the accent / surface / border / mut
| title | `"Styrene A", "Helvetica Neue", Arial, "Microsoft YaHei", sans-serif` | 600700 |
| body | `"Anthropic Sans", "Helvetica Neue", Arial, "Microsoft YaHei", sans-serif` | 400 |
> Anthropic's official typefaces are `Styrene A` (titles) and `Anthropic Sans` (body) — both proprietary and unlikely to be installed on viewer machines. Decks should either embed the fonts into the PPTX or accept the `Helvetica Neue``Arial` / `Microsoft YaHei` fallback chain. When locking, Strategist notes "official Anthropic typefaces require install or PPTX embed".
> `Styrene A` and `Anthropic Sans` are proprietary and unlikely to be installed on viewer machines. PPT Master does not bundle or automatically embed them; use the declared fallback chain unless the user supplies an installed/approved font workflow.
## IV. Logo
Anthropic uses a six-petal star **mark** that is most commonly seen locked up with a product wordmark. The bundled lockup pairs the mark with the **Claude** wordmark, since that is the live lockup on claude.com. Pick by context, never combine on the same page.
This preset intentionally combines Anthropic company voice with Claude product visuals. The bundled star and wordmark belong to Claude; they are not relabeled as an Anthropic corporate mark. Pick one Claude asset by context and never combine several lockups on the same page.
| File | Form | Usage |
|---|---|---|
| `../images/anthropic_claude_lockup.svg` | Mark + "Claude" wordmark (112×24) | Cover hero, ending sign-off, any moment when the brand needs to read as Claude-the-product at a glance |
| `../images/anthropic_mark.svg` | Square orange six-petal mark (24×24) | Header / footer corners, page-number neighbors, tight badges, any small-size moment where the lockup would become illegible — also the recommended choice when the deck is about Anthropic the company rather than Claude the product |
| `../images/anthropic_claude_lockup.svg` | Claude star + "Claude" wordmark (112×24) | Cover hero, ending sign-off, and Claude product moments |
| `../images/anthropic_mark.svg` | Claude square star mark (24×24; historical filename retained) | Header/footer corners, page-number neighbors, and compact Claude product badges |
| `../images/claude_wordmark.svg` | "Claude" wordmark alone (82×24) | When the visual context already establishes the brand and only the product name needs to be reinforced |
- Cover: prefer the lockup when the deck is Claude-facing; prefer the mark alone when the deck is Anthropic-company-facing
- Claude-facing cover: prefer the complete Claude lockup
- Anthropic-company-facing cover: use editable `Anthropic` text unless an approved corporate lockup is supplied; do not substitute the Claude wordmark
- Per-page: optional — only when one of these genuinely fits the layout; do not stamp every page
- Clearspace: leave at least 0.5× mark height of empty space on all sides; never overlap text or photographic backgrounds
- Mark color is fixed at `#D97757`; wordmark inherits the page text color (default `#191919` on light bg, `#FFFFFF` on dark)
@@ -68,4 +67,4 @@ Anthropic uses a six-petal star **mark** that is most commonly seen locked up wi
- Preference: stroke
> Outline / stroke icons read as "research / engineering" and align with Anthropic's restrained product UI aesthetic. When the deck uses `templates/icons/`, prefer `tabler` or `lucide` stroke families over filled libraries.
> This is a presentation convention, not an official brand token. Prefer `tabler` or `lucide` stroke families when they fit the deck; keep one icon family consistent.
@@ -1,15 +1,19 @@
{
"anthropic": {
"summary": "Anthropic brand identity — AI/LLM tech talks, developer conferences, technical training, product launches",
"summary": "Anthropic / Claude brand family — AI research, product talks, developer conferences, technical training, and launches",
"primary_color": "#D97757"
},
"google": {
"summary": "Google brand identity — multi-product corporate decks, developer events (Google I/O style), education and training in the Google ecosystem",
"primary_color": "#4285F4"
},
"中国电信": {
"summary": "China Telecom brand identity for digital infrastructure, government-enterprise solutions, transformation planning, and corporate reporting",
"primary_color": "#004EA2"
},
"中国电建": {
"summary": "POWERCHINA brand identity for engineering project reports, technical proposals, business negotiations, and corporate promotion",
"primary_color": "#00418D"
"primary_color": "#004EA1"
},
"中汽研": {
"summary": "CATARC brand identity for product certification, evaluation reports, automotive technology promotion, and business visits",
@@ -16,6 +16,7 @@ primary_color: "#4285F4"
| Brand Name | Google |
| Use Cases | Product launches, developer events (Google I/O style), corporate updates, multi-product decks, ecosystem education / training |
| Tone | Modern, friendly, optimistic, clear, multi-color expressive |
| Sources | Bundled Google SVG assets; [Google Brand Resource Center](https://about.google/brand-resource-center/guidance/), reviewed 2026-07-13 |
## II. Color Scheme
@@ -26,7 +27,7 @@ primary_color: "#4285F4"
| accent (warm) | `#FBBC05` | fact | Google Yellow |
| accent (alert) | `#EA4335` | fact | Google Red |
| text | `#202124` | approx | Standard Material / Google product UI text |
| bg | `#FFFFFF` | fact | |
| bg | `#FFFFFF` | approx | Default light presentation background |
The four primary brand colors (Blue / Green / Yellow / Red) carry equal weight in Google brand usage; the `primary` / `secondary` / `accent` role split above is a slide-layout presentation hierarchy convention, not a brand prominence statement. Strategist may rotate any of the four into the dominant role per page rhythm.
@@ -37,7 +38,7 @@ The four primary brand colors (Blue / Green / Yellow / Red) carry equal weight i
| title | `Google Sans, Roboto, "Microsoft YaHei", sans-serif` | 500700 |
| body | `Roboto, "Microsoft YaHei", sans-serif` | 400 |
> `Google Sans` is a proprietary brand font; decks rendering on machines without it installed should either embed it into the PPTX or accept the `Roboto` / `Microsoft YaHei` fallback. When locking, Strategist notes "requires install or PPTX embed".
> `Google Sans` is proprietary. PPT Master does not bundle or automatically embed it; use the `Roboto` / `Microsoft YaHei` fallback unless the user supplies an installed/approved font workflow.
## IV. Logo
@@ -50,7 +51,8 @@ Google uses a dual-lockup brand system — pick by context, never combine on the
- Cover: prefer wordmark
- Per-page: optional — only when wordmark or G mark genuinely fits the layout; do not stamp every page
- Clearspace: leave at least 0.5× logo height of empty space on all sides; never overlap text or photographic backgrounds
- Use only unmodified approved artwork and follow the official guidance for the actual context; never imply affiliation, sponsorship, or endorsement
- Clearspace: follow the applicable official asset guidance; never crowd the logo or place it on a busy background
## V. Voice & Tone
@@ -61,6 +63,6 @@ Google uses a dual-lockup brand system — pick by context, never combine on the
## VI. Icon Style
- Preference: filled
- Preference: one consistent Material-aligned family; filled or stroke according to the deck context
> Aligns with Material Icons' default filled style. When the deck uses `templates/icons/`, prefer `tabler-filled` or `chunk-filled`; avoid stroke-only libraries to stay consistent with Google's product UI aesthetic.
> This is a presentation convention, not permission to imitate Google's visual identity. When the deck uses `templates/icons/`, choose one compatible family and keep weight/fill treatment consistent.
Binary file not shown.

After

Width:  |  Height:  |  Size: 8.1 KiB

@@ -0,0 +1,72 @@
---
brand_id: 中国电信
kind: brand
summary: China Telecom brand identity for digital infrastructure, government-enterprise solutions, transformation planning, and corporate reporting
primary_color: "#004EA2"
---
# China Telecom (中国电信) Brand Specification
> Identity-only preset. No SVG page roster; pages are composed freely under these brand constraints.
## I. Brand Overview
| Property | Value |
|---|---|
| Brand Name | China Telecom / 中国电信 |
| Use Cases | Digital infrastructure reports, government-enterprise solutions, transformation planning, corporate reporting, and service presentations |
| Tone | Formal, trusted, service-oriented, technically credible |
| Sources | Bundled China Telecom logo for literal color evidence; [China Telecom official website](https://www.chinatelecom.com.cn/), reviewed 2026-07-13 |
## II. Color Scheme
| Role | HEX | Provenance | Notes |
|---|---|---|---|
| primary | `#004EA2` | approx | Dominant blue sampled from the bundled raster China Telecom logo |
| text | `#1F2937` | approx | Primary body text on light backgrounds |
| muted-text | `#6B7280` | approx | Secondary descriptions and annotations |
| bg | `#FFFFFF` | approx | Standard light presentation background |
| surface | `#F8FAFC` | approx | Light card and module surfaces |
| border | `#E5E7EB` | approx | Dividers, table borders, and restrained technical grids |
The primary blue is an exact pixel sample from the bundled raster logo, but remains `approx` because no authoritative token value is bundled. The neutrals are presentation conventions. Red accents found in individual retained decks are deck-specific and must not be promoted to a default China Telecom brand color without stronger evidence.
## III. Typography
| Role | Family | Weight |
|---|---|---|
| title | `"Microsoft YaHei", "微软雅黑", "SimHei", Arial, sans-serif` | 700 |
| body | `"Microsoft YaHei", "微软雅黑", Arial, sans-serif` | 400 |
| data | `Arial, "Microsoft YaHei", sans-serif` | 600-700 |
Use PowerPoint-safe CJK fonts by default. Keep English technical labels, network standards, and data labels in Arial where that improves scanning. This preset does not bundle or automatically embed proprietary fonts.
## IV. Logo
The bundled asset is the default China Telecom corporate lockup. Use it unmodified and keep product, campaign, and event identities out of the base brand preset.
| File | Form | Usage |
|---|---|---|
| `../images/logo.png` | China Telecom corporate lockup (252x69) | Cover, ending, and restrained page-header branding |
- Cover / ending: use the full lockup at a readable size.
- Content pages: use the lockup only when the title area has sufficient space; avoid repeating it as oversized decoration.
- Keep clearspace around the lockup and avoid busy image backgrounds.
- On dark backgrounds, use an owner-approved reverse asset when supplied; otherwise place this logo on a clean white backing plate.
- Do not substitute 5G, campaign, slogan, or event assets for the corporate lockup unless the presentation scope explicitly calls for that identity.
- External publication must follow the owner's trademark and asset permissions; packaging the logo does not grant usage rights.
## V. Voice & Tone
- Formality: formal-neutral
- Person: organization-first, "we / 我们" only when speaking as China Telecom
- Emoji: avoid
- Abbreviations: spell out organization and service names on first use; retain standard network terms such as 5G when context is clear
- Style: emphasize service reliability, secure infrastructure, customer value, public responsibility, and measurable digital outcomes
## VI. Icon Style
- Preference: clean stroke or solid geometric icons
- Recommended libraries: `tabler-outline`, `lucide`, or one consistent filled family when higher visual weight is needed
- Prefer network, cloud, security, service, data, infrastructure, and industry-solution metaphors. Avoid decorative telecom waves that could be mistaken for an official mark.
- This icon guidance is a presentation convention, not an official China Telecom icon token set.
@@ -2,7 +2,7 @@
brand_id: 中国电建
kind: brand
summary: POWERCHINA brand identity for engineering project reports, technical proposals, business negotiations, and corporate promotion
primary_color: "#00418D"
primary_color: "#004EA1"
---
# POWERCHINA (中国电建) Brand Specification
@@ -16,22 +16,21 @@ primary_color: "#00418D"
| Brand Name | POWERCHINA / 中国电建 |
| Use Cases | Engineering project reports, technical proposal presentations, business negotiations, corporate promotion, annual summaries |
| Tone | Professional, composed, international, state-owned enterprise style |
| Sources | Bundled logo assets for literal colors; [POWERCHINA Brand and Visual Identity Manual (2025) release page](https://11j.powerchina.cn/col/col16780/art/2025/art_daed13ac0e294a56a31033ced7689708.html), reviewed 2026-07-13 |
## II. Color Scheme
| Role | HEX | Provenance | Notes |
|---|---|---|---|
| primary | `#00418D` | approx | POWERCHINA Blue, inherited from the existing POWERCHINA deck templates |
| secondary | `#002B5C` | approx | Deep blue for chapter pages, dark headers, and gradient bases |
| accent (blue) | `#0066CC` | approx | Bright blue for charts, links, and secondary emphasis |
| accent (light) | `#4A90D9` | approx | Sky blue for tertiary highlights and decorative rules |
| accent (red) | `#C41E3A` | approx | China red for milestones, key data, and national-strength emphasis |
| accent (gold) | `#C9A227` | approx | Honors, achievements, and award moments |
| primary | `#004EA1` | approx | Dominant blue sampled from the bundled raster POWERCHINA group symbol |
| secondary | `#C90A4F` | approx | Dominant magenta-red sampled from the bundled raster POWERCHINA group symbol |
| text | `#1A1A1A` | approx | Primary body text on light backgrounds |
| muted-text | `#4A5568` | approx | Secondary descriptions and annotations |
| bg | `#FFFFFF` | approx | Standard light presentation background |
| surface | `#F4F6F8` | approx | Light gray card and module surfaces |
The two symbol colors are exact pixel samples from the bundled raster asset, but remain `approx` because no authoritative token values are bundled. The neutral presentation colors are also practical approximations, not claims about official POWERCHINA design tokens.
## III. Typography
| Role | Family | Weight |
@@ -44,19 +43,22 @@ Use PowerPoint-safe CJK fonts by default. Keep English technical labels in Arial
## IV. Logo
POWERCHINA templates may use the group brand logo or subsidiary logos depending on the presenting entity. Pick one primary logo per deck and avoid mixing several logos on every page.
This preset defaults to the POWERCHINA group as the presenting entity. Subsidiary marks are explicit alternates only when that subsidiary owns the presentation; pick one presenting entity per deck.
| File | Form | Usage |
|---|---|---|
| `../images/电建logo.png` | POWERCHINA symbol / primary mark (234x236) | Cover, ending, and compact brand moments where the group identity is required |
| `../images/电建logo.png` | POWERCHINA group symbol / primary mark (234x236) | Cover, ending, and compact brand moments where the group identity is required |
| `../images/中国水务logo.png` | China Water logo lockup (1108x190) | Subsidiary-led water-business reports; cover or ending lockup |
| `../images/华东院logo.png` | East China Institute logo lockup (1438x300) | Institute-led technical reports and engineering proposals |
| `../images/水电三局logo.png` | Sinohydro Bureau 3 logo lockup (629x75) | Bureau-led project reports and construction updates |
- Cover / ending: use the selected primary logo at readable size.
- Per-page header: optional; use a compact logo only when it does not crowd the title bar.
- Do not mix the group mark and several subsidiary marks as routine page chrome. Use co-branding only when the presentation brief explicitly requires it.
- If a subsidiary needs materially different colors, typography, or recurring identity rules, create a separate brand workspace for that entity.
- Dark backgrounds: prefer white/inverted treatment when available; otherwise place the logo on a white backing plate.
- Clearspace: leave at least 0.5x logo height around the mark or lockup.
- External publication must follow the owner-provided trademark and visual-identity permissions; packaging these assets does not grant usage rights.
## V. Voice & Tone
@@ -71,3 +73,4 @@ POWERCHINA templates may use the group brand logo or subsidiary logos depending
- Preference: filled or sturdy stroke icons
- Recommended libraries: `tabler-filled`, `chunk-filled`, or `tabler-outline` with heavier stroke
- Avoid thin decorative icons for engineering / construction content; prefer solid symbols, process arrows, infrastructure metaphors, and chart-friendly pictograms.
- This icon guidance is a presentation convention, not an official POWERCHINA icon token set.
@@ -16,23 +16,22 @@ primary_color: "#004098"
| Brand Name | CATARC / 中汽研 |
| Use Cases | Product certification display, evaluation presentations, automotive technology promotion, business visits, high-end technical reporting |
| Tone | Professional, authoritative, trustworthy, technical-consulting style |
| Sources | Bundled CATARC logo assets and the validated CATARC deck identity, reviewed 2026-07-13 |
## II. Color Scheme
| Role | HEX | Provenance | Notes |
|---|---|---|---|
| primary | `#004098` | approx | CATARC deep blue, inherited from the standard CATARC deck template |
| secondary | `#003366` | approx | Dark business blue for covers, chapter pages, and formal section headers |
| accent (blue) | `#0050B3` | approx | Bright blue for technology emphasis and gradients |
| accent (tech) | `#1890FF` | approx | Modern tech blue for forward-looking automotive topics |
| accent (cyan) | `#00E5FF` | approx | High-energy data / future-tech highlights; use sparingly |
| accent (red) | `#CC0000` | approx | Certification warnings, failed checks, and key risk emphasis |
| primary | `#004098` | approx | Working primary blue aligned with the validated CATARC deck template |
| secondary | `#003B82` | approx | Dark blue for chapter pages, headers, and restrained depth |
| text | `#333333` | approx | Primary body text on light backgrounds |
| muted-text | `#666666` | approx | Secondary descriptions and notes |
| bg | `#FFFFFF` | approx | Standard light presentation background |
| surface | `#F5F5F5` | approx | Secondary content blocks and cards |
| surface | `#F8FAFC` | approx | Secondary content blocks and cards |
| border | `#E0E0E0` | approx | Dividers, table borders, and technical grids |
This compact palette intentionally matches the retained CATARC deck identity. It is an internal presentation approximation, not a claim about official CATARC design tokens. Derive success, warning, and error colors from the content context rather than treating them as brand colors.
## III. Typography
| Role | Family | Weight |
@@ -70,3 +69,4 @@ CATARC uses separate large and header lockups. Choose the large logo for brand m
- Preference: filled or clean stroke icons
- Recommended libraries: `tabler-filled`, `chunk-filled`, or `tabler-outline`
- Prefer automotive, certification, testing, dashboard, data, process, and compliance metaphors. Avoid playful or consumer-app icon styling.
- This icon guidance is a presentation convention, not an official CATARC icon token set.
@@ -1,32 +1,14 @@
{
"中国电信": {
"summary": "China Telecom related briefings, 政企数字化方案, 转型规划, 内部汇报.",
"summary": "中国电信政企数字化转型规划内部汇报的克制红灰品牌模板。",
"canvas_format": "ppt169",
"page_count": 5,
"primary_color": "#C00000"
},
"中国电建": {
"summary": "Engineering project reports, technical proposal presentations, business negotiations, corporate promotion, annual summaries.",
"canvas_format": "ppt169",
"page_count": 5,
"primary_color": "#00418D"
},
"中汽研": {
"summary": "Product certification display, evaluation presentations, technology promotion, business visits.",
"summary": "中汽研认证展示、技术交流与业务来访场景的深蓝专业模板。",
"canvas_format": "ppt169",
"page_count": 5,
"primary_color": "#004098"
},
"招商银行": {
"summary": "交易银行产品介绍、销售收款方案汇报、客户案例拆解、分行培训材料.",
"canvas_format": "ppt169",
"page_count": 5,
"primary_color": "#C8152D"
},
"重庆大学": {
"summary": "Academic defense, research reports, teaching presentations, scholarly exchange.",
"canvas_format": "ppt169",
"page_count": 5,
"primary_color": "#006BB7"
}
}
@@ -1,24 +1,61 @@
<?xml version="1.0" encoding="UTF-8"?>
<svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" viewBox="0 0 1280 720" data-pptx-layout="01_cover" data-pptx-layout-name="Cover">
<rect x="0" y="0" width="1280" height="720" fill="#FFFFFF" id="layout-01_cover-background" data-pptx-layer="layout" data-pptx-editable="false"/>
<rect x="0" y="0" width="1280" height="8" fill="#C00000" />
<rect x="72" y="118" width="6" height="266" rx="3" fill="#C00000" />
<rect x="72" y="600" width="1136" height="1" fill="#D1D5DB" />
<svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink"
width="1280" height="720" viewBox="0 0 1280 720"
data-pptx-master="china_telecom_brand_master" data-pptx-master-name="China Telecom Brand"
data-pptx-layout="cover" data-pptx-layout-name="Cover">
<rect id="brand-master-background" x="0" y="0" width="1280" height="720" fill="#FFFFFF"
data-pptx-layer="master" data-pptx-editable="false"/>
<rect id="brand-master-top-rule" x="0" y="0" width="1280" height="8" fill="#C00000"
data-pptx-layer="master" data-pptx-editable="false"/>
<image id="brand-master-footer-ribbon" x="0" y="554" width="1280" height="166"
xlink:href="../images/footer_ribbon.png" preserveAspectRatio="xMidYMid slice"
data-pptx-layer="master" data-pptx-editable="false"/>
<text id="brand-master-footer-label" x="72" y="650" fill="#FFFFFF"
font-family="Arial, Microsoft YaHei, sans-serif" font-size="14"
data-pptx-layer="master" data-pptx-editable="false">CHINA TELECOM</text>
<image x="72" y="34" width="214" height="58" xlink:href="../images/logo.png" />
<image x="0" y="548" width="1280" height="172" xlink:href="../images/footer_ribbon.png" preserveAspectRatio="xMidYMid slice" />
<rect x="820" y="136" width="388" height="318" rx="28" fill="#F8FAFC" stroke="#E5E7EB" stroke-width="2" />
<rect x="858" y="188" width="110" height="4" rx="2" fill="#C00000" />
<image x="862" y="246" width="292" height="102" xlink:href="../images/slogan_red.png" preserveAspectRatio="xMidYMid meet" />
<image x="848" y="360" width="324" height="92" xlink:href="../images/skyline_bg.png" preserveAspectRatio="xMidYMid meet" />
<text x="108" y="202" fill="#111827" font-family="Microsoft YaHei, PingFang SC, Arial, sans-serif" font-size="42" font-weight="700" id="slot-01_cover-title-1" data-pptx-placeholder="title">{{TITLE}}</text>
<text x="108" y="248" fill="#6B7280" font-family="Microsoft YaHei, PingFang SC, Arial, sans-serif" font-size="21" id="slot-01_cover-subtitle-2" data-pptx-placeholder="subtitle">{{SUBTITLE}}</text>
<rect x="108" y="282" width="144" height="6" rx="3" fill="#C00000" />
<text x="108" y="352" fill="#2B2F33" font-family="Microsoft YaHei, PingFang SC, Arial, sans-serif" font-size="18">{{AUTHOR}}</text>
<text x="108" y="386" fill="#6B7280" font-family="Arial, sans-serif" font-size="15">China Telecom Digital Transformation Template</text>
<text x="108" y="434" fill="#6B7280" font-family="Arial, sans-serif" font-size="15">{{DATE}}</text>
<text x="72" y="650" fill="#FFFFFF" font-family="Microsoft YaHei, PingFang SC, Arial, sans-serif" font-size="14">CHINA TELECOM</text>
<rect id="cover-title-accent" x="72" y="118" width="6" height="316" rx="3" fill="#C00000"
data-pptx-layer="layout" data-pptx-editable="false"/>
<image id="cover-logo" x="72" y="34" width="214" height="58" xlink:href="../images/logo.png"
preserveAspectRatio="xMinYMid meet" data-pptx-layer="layout" data-pptx-editable="false"/>
<rect id="cover-brand-card" x="820" y="136" width="388" height="318" rx="28"
fill="#F8FAFC" stroke="#E5E7EB" stroke-width="2"
data-pptx-layer="layout" data-pptx-editable="false"/>
<rect id="cover-brand-card-accent" x="858" y="188" width="110" height="4" rx="2" fill="#C00000"
data-pptx-layer="layout" data-pptx-editable="false"/>
<image id="cover-slogan" x="862" y="236" width="292" height="102"
xlink:href="../images/slogan_red.png" preserveAspectRatio="xMidYMid meet"
data-pptx-layer="layout" data-pptx-editable="false"/>
<image id="cover-skyline" x="848" y="350" width="324" height="92"
xlink:href="../images/skyline_bg.png" preserveAspectRatio="xMidYMid meet"
data-pptx-layer="layout" data-pptx-editable="false"/>
<rect id="cover-title-rule" x="108" y="288" width="144" height="6" rx="3" fill="#C00000"
data-pptx-layer="layout" data-pptx-editable="false"/>
<g id="cover-title-slot" data-pptx-placeholder="title"
data-pptx-placeholder-bounds="108 148 640 82">
<text id="cover-title-carrier" data-pptx-placeholder-carrier="true"
x="108" y="202" fill="#111827"
font-family="Microsoft YaHei, PingFang SC, Arial, sans-serif"
font-size="42" font-weight="700">{{TITLE}}</text>
</g>
<g id="cover-subtitle-slot" data-pptx-placeholder="subtitle" data-pptx-placeholder-idx="1"
data-pptx-placeholder-bounds="108 226 640 48">
<text id="cover-subtitle-carrier" data-pptx-placeholder-carrier="true"
x="108" y="258" fill="#6B7280"
font-family="Microsoft YaHei, PingFang SC, Arial, sans-serif"
font-size="21">{{SUBTITLE}}</text>
</g>
<g id="cover-author-slot" data-pptx-placeholder="body" data-pptx-placeholder-idx="2"
data-pptx-placeholder-bounds="108 322 560 48">
<text id="cover-author-carrier" data-pptx-placeholder-carrier="true"
x="108" y="354" fill="#2B2F33"
font-family="Microsoft YaHei, PingFang SC, Arial, sans-serif"
font-size="18">{{AUTHOR}}</text>
</g>
<g id="cover-date-slot" data-pptx-placeholder="date" data-pptx-placeholder-idx="3"
data-pptx-placeholder-bounds="108 386 320 38">
<text id="cover-date-carrier" data-pptx-placeholder-carrier="true"
x="108" y="412" fill="#6B7280"
font-family="Arial, Microsoft YaHei, sans-serif" font-size="15">{{DATE}}</text>
</g>
</svg>

Before

Width:  |  Height:  |  Size: 2.1 KiB

After

Width:  |  Height:  |  Size: 3.6 KiB

@@ -1,29 +1,61 @@
<?xml version="1.0" encoding="UTF-8"?>
<svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" viewBox="0 0 1280 720" data-pptx-layout="02_chapter" data-pptx-layout-name="Section">
<rect x="0" y="0" width="1280" height="720" fill="#FFFFFF" id="layout-02_chapter-background" data-pptx-layer="layout" data-pptx-editable="false"/>
<rect x="72" y="84" width="112" height="8" rx="4" fill="#C00000" />
<image x="1016" y="44" width="192" height="52" xlink:href="../images/logo.png" preserveAspectRatio="xMaxYMid meet" />
<svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink"
width="1280" height="720" viewBox="0 0 1280 720"
data-pptx-master="china_telecom_brand_master" data-pptx-master-name="China Telecom Brand"
data-pptx-layout="section" data-pptx-layout-name="Section Header">
<rect id="brand-master-background" x="0" y="0" width="1280" height="720" fill="#FFFFFF"
data-pptx-layer="master" data-pptx-editable="false"/>
<rect id="brand-master-top-rule" x="0" y="0" width="1280" height="8" fill="#C00000"
data-pptx-layer="master" data-pptx-editable="false"/>
<image id="brand-master-footer-ribbon" x="0" y="554" width="1280" height="166"
xlink:href="../images/footer_ribbon.png" preserveAspectRatio="xMidYMid slice"
data-pptx-layer="master" data-pptx-editable="false"/>
<text id="brand-master-footer-label" x="72" y="650" fill="#FFFFFF"
font-family="Arial, Microsoft YaHei, sans-serif" font-size="14"
data-pptx-layer="master" data-pptx-editable="false">CHINA TELECOM</text>
<text x="96" y="244" fill="#C00000" fill-opacity="0.14" font-family="Arial, sans-serif" font-size="176" font-weight="700">{{CHAPTER_NUM}}</text>
<text x="96" y="316" fill="#111827" font-family="Microsoft YaHei, PingFang SC, Arial, sans-serif" font-size="42" font-weight="700" id="slot-02_chapter-title-1" data-pptx-placeholder="title">{{CHAPTER_TITLE}}</text>
<text x="96" y="364" fill="#6B7280" font-family="Arial, sans-serif" font-size="18">DIGITAL TRANSFORMATION / CHINA TELECOM</text>
<rect x="96" y="398" width="164" height="6" rx="3" fill="#C00000" />
<rect x="96" y="446" width="252" height="86" rx="20" fill="#F8FAFC" stroke="#E5E7EB" stroke-width="2" />
<rect x="124" y="478" width="92" height="4" rx="2" fill="#C00000" />
<text x="124" y="514" fill="#6B7280" font-family="Microsoft YaHei, PingFang SC, Arial, sans-serif" font-size="15">章节过渡页</text>
<rect x="852" y="132" width="356" height="356" rx="28" fill="#F8FAFC" stroke="#E5E7EB" stroke-width="2" />
<rect x="888" y="186" width="132" height="4" rx="2" fill="#C00000" />
<rect x="900" y="248" width="186" height="4" rx="2" fill="#C00000" fill-opacity="0.78" />
<rect x="900" y="270" width="144" height="4" rx="2" fill="#E55B5B" fill-opacity="0.6" />
<rect x="900" y="292" width="206" height="4" rx="2" fill="#C00000" fill-opacity="0.4" />
<rect x="900" y="342" width="228" height="4" rx="2" fill="#C00000" fill-opacity="0.22" />
<rect x="900" y="360" width="176" height="4" rx="2" fill="#E55B5B" fill-opacity="0.34" />
<rect x="900" y="378" width="252" height="4" rx="2" fill="#C00000" fill-opacity="0.16" />
<circle cx="934" cy="424" r="8" fill="#C00000" fill-opacity="0.18" />
<circle cx="966" cy="424" r="8" fill="#C00000" fill-opacity="0.32" />
<circle cx="998" cy="424" r="8" fill="#C00000" fill-opacity="0.48" />
<image x="0" y="590" width="1280" height="130" xlink:href="../images/footer_ribbon.png" preserveAspectRatio="xMidYMid slice" />
<rect id="section-top-accent" x="72" y="84" width="112" height="8" rx="4" fill="#C00000"
data-pptx-layer="layout" data-pptx-editable="false"/>
<image id="section-logo" x="1016" y="44" width="192" height="52" xlink:href="../images/logo.png"
preserveAspectRatio="xMaxYMid meet" data-pptx-layer="layout" data-pptx-editable="false"/>
<rect id="section-title-rule" x="96" y="398" width="164" height="6" rx="3" fill="#C00000"
data-pptx-layer="layout" data-pptx-editable="false"/>
<rect id="section-note-card" x="96" y="446" width="252" height="86" rx="20"
fill="#F8FAFC" stroke="#E5E7EB" stroke-width="2"
data-pptx-layer="layout" data-pptx-editable="false"/>
<rect id="section-note-accent" x="124" y="478" width="92" height="4" rx="2" fill="#C00000"
data-pptx-layer="layout" data-pptx-editable="false"/>
<text id="section-note" x="124" y="514" fill="#6B7280"
font-family="Microsoft YaHei, PingFang SC, Arial, sans-serif" font-size="15"
data-pptx-layer="layout" data-pptx-editable="false">章节过渡页</text>
<rect id="section-visual-card" x="852" y="132" width="356" height="356" rx="28"
fill="#F8FAFC" stroke="#E5E7EB" stroke-width="2"
data-pptx-layer="layout" data-pptx-editable="false"/>
<rect id="section-visual-accent" x="888" y="186" width="132" height="4" rx="2" fill="#C00000"
data-pptx-layer="layout" data-pptx-editable="false"/>
<image id="section-slogan" x="884" y="236" width="284" height="96"
xlink:href="../images/slogan_red.png" preserveAspectRatio="xMidYMid meet"
data-pptx-layer="layout" data-pptx-editable="false"/>
<image id="section-skyline" x="876" y="348" width="300" height="92"
xlink:href="../images/skyline_bg.png" preserveAspectRatio="xMidYMid meet"
data-pptx-layer="layout" data-pptx-editable="false"/>
<g id="section-number-slot" data-pptx-placeholder="body" data-pptx-placeholder-idx="1"
data-pptx-placeholder-bounds="96 148 300 116">
<text id="section-number-carrier" data-pptx-placeholder-carrier="true"
x="96" y="242" fill="#C00000" fill-opacity="0.14"
font-family="Arial, sans-serif" font-size="112" font-weight="700">{{CHAPTER_NUM}}</text>
</g>
<g id="section-title-slot" data-pptx-placeholder="title"
data-pptx-placeholder-bounds="96 270 680 72">
<text id="section-title-carrier" data-pptx-placeholder-carrier="true"
x="96" y="318" fill="#111827"
font-family="Microsoft YaHei, PingFang SC, Arial, sans-serif"
font-size="42" font-weight="700">{{CHAPTER_TITLE}}</text>
</g>
<g id="section-subtitle-slot" data-pptx-placeholder="subtitle" data-pptx-placeholder-idx="2"
data-pptx-placeholder-bounds="96 346 680 40">
<text id="section-subtitle-carrier" data-pptx-placeholder-carrier="true"
x="96" y="374" fill="#6B7280"
font-family="Arial, Microsoft YaHei, sans-serif" font-size="18">{{CHAPTER_SUBTITLE}}</text>
</g>
</svg>

Before

Width:  |  Height:  |  Size: 2.5 KiB

After

Width:  |  Height:  |  Size: 3.9 KiB

@@ -1,49 +1,118 @@
<?xml version="1.0" encoding="UTF-8"?>
<svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" viewBox="0 0 1280 720" data-pptx-layout="02_toc" data-pptx-layout-name="Agenda">
<rect x="0" y="0" width="1280" height="720" fill="#FFFFFF" id="layout-02_toc-background" data-pptx-layer="layout" data-pptx-editable="false"/>
<svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink"
width="1280" height="720" viewBox="0 0 1280 720"
data-pptx-master="china_telecom_content_master" data-pptx-master-name="China Telecom Content"
data-pptx-layout="agenda" data-pptx-layout-name="Agenda">
<rect id="content-master-background" x="0" y="0" width="1280" height="720" fill="#FFFFFF"
data-pptx-layer="master" data-pptx-editable="false"/>
<rect id="content-master-red-capsule" x="0" y="32" width="206" height="64" rx="24" fill="#C00000"
data-pptx-layer="master" data-pptx-editable="false"/>
<rect id="content-master-red-lane" x="114" y="32" width="1166" height="64" fill="#C00000"
data-pptx-layer="master" data-pptx-editable="false"/>
<rect id="content-master-gray-lane" x="206" y="39" width="1074" height="50" rx="22" fill="#D9D9D9"
data-pptx-layer="master" data-pptx-editable="false"/>
<image id="content-master-header-brand" x="1000" y="38" width="208" height="48"
xlink:href="../images/header_brand.png" preserveAspectRatio="xMaxYMid meet"
data-pptx-layer="master" data-pptx-editable="false"/>
<line id="content-master-footer-rule" x1="72" y1="650" x2="1208" y2="650" stroke="#D1D5DB"
stroke-width="1" data-pptx-layer="master" data-pptx-editable="false"/>
<rect x="0" y="32" width="158" height="64" rx="24" fill="#C00000" />
<rect x="114" y="32" width="1166" height="64" fill="#C00000" />
<rect x="206" y="39" width="1074" height="50" rx="22" fill="#D9D9D9" />
<text x="40" y="73" fill="#FFFFFF" font-family="Microsoft YaHei, PingFang SC, Arial, sans-serif" font-size="24" font-weight="700">目录</text>
<image x="1032" y="38" width="176" height="48" xlink:href="../images/logo.png" preserveAspectRatio="xMidYMid meet" />
<rect id="agenda-side-card" x="72" y="140" width="264" height="504" rx="26"
fill="#F8FAFC" stroke="#E5E7EB" stroke-width="2"
data-pptx-layer="layout" data-pptx-editable="false"/>
<text id="agenda-side-title" x="102" y="188" fill="#C00000"
font-family="Microsoft YaHei, PingFang SC, Arial, sans-serif"
font-size="18" font-weight="700" data-pptx-layer="layout"
data-pptx-editable="false">中国电信模板</text>
<text id="agenda-side-kicker" x="102" y="218" fill="#6B7280"
font-family="Arial, sans-serif" font-size="13"
data-pptx-layer="layout" data-pptx-editable="false">TELECOM / GOV-ENTERPRISE</text>
<rect id="agenda-side-rule" x="102" y="242" width="176" height="4" rx="2" fill="#C00000"
data-pptx-layer="layout" data-pptx-editable="false"/>
<image id="agenda-side-skyline" x="94" y="286" width="220" height="92"
xlink:href="../images/skyline_bg.png" preserveAspectRatio="xMidYMid meet"
data-pptx-layer="layout" data-pptx-editable="false"/>
<text id="agenda-side-use" x="102" y="430" fill="#6B7280"
font-family="Microsoft YaHei, PingFang SC, Arial, sans-serif" font-size="13"
data-pptx-layer="layout" data-pptx-editable="false">政企汇报 / 转型规划 / 方案呈现</text>
<text id="agenda-side-footer" x="102" y="586" fill="#111827"
font-family="Arial, sans-serif" font-size="13" font-weight="700"
data-pptx-layer="layout" data-pptx-editable="false">CHINA TELECOM</text>
<rect id="agenda-main-card" x="376" y="140" width="832" height="504" rx="26"
fill="#FFFFFF" stroke="#E5E7EB" stroke-width="2"
data-pptx-layer="layout" data-pptx-editable="false"/>
<circle id="agenda-number-1-bg" cx="438" cy="220" r="32" fill="#C00000"
data-pptx-layer="layout" data-pptx-editable="false"/>
<text id="agenda-number-1" x="438" y="229" text-anchor="middle" fill="#FFFFFF"
font-family="Arial, sans-serif" font-size="22" font-weight="700"
data-pptx-layer="layout" data-pptx-editable="false">1</text>
<line id="agenda-rule-1" x1="496" y1="240" x2="1120" y2="240" stroke="#D1D5DB"
stroke-width="1.5" stroke-dasharray="3 6"
data-pptx-layer="layout" data-pptx-editable="false"/>
<circle id="agenda-number-2-bg" cx="438" cy="324" r="32" fill="#C00000"
data-pptx-layer="layout" data-pptx-editable="false"/>
<text id="agenda-number-2" x="438" y="333" text-anchor="middle" fill="#FFFFFF"
font-family="Arial, sans-serif" font-size="22" font-weight="700"
data-pptx-layer="layout" data-pptx-editable="false">2</text>
<line id="agenda-rule-2" x1="496" y1="344" x2="1120" y2="344" stroke="#D1D5DB"
stroke-width="1.5" stroke-dasharray="3 6"
data-pptx-layer="layout" data-pptx-editable="false"/>
<circle id="agenda-number-3-bg" cx="438" cy="428" r="32" fill="#C00000"
data-pptx-layer="layout" data-pptx-editable="false"/>
<text id="agenda-number-3" x="438" y="437" text-anchor="middle" fill="#FFFFFF"
font-family="Arial, sans-serif" font-size="22" font-weight="700"
data-pptx-layer="layout" data-pptx-editable="false">3</text>
<line id="agenda-rule-3" x1="496" y1="448" x2="1120" y2="448" stroke="#D1D5DB"
stroke-width="1.5" stroke-dasharray="3 6"
data-pptx-layer="layout" data-pptx-editable="false"/>
<circle id="agenda-number-4-bg" cx="438" cy="532" r="32" fill="#C00000"
data-pptx-layer="layout" data-pptx-editable="false"/>
<text id="agenda-number-4" x="438" y="541" text-anchor="middle" fill="#FFFFFF"
font-family="Arial, sans-serif" font-size="22" font-weight="700"
data-pptx-layer="layout" data-pptx-editable="false">4</text>
<line id="agenda-rule-4" x1="496" y1="552" x2="1120" y2="552" stroke="#D1D5DB"
stroke-width="1.5" stroke-dasharray="3 6"
data-pptx-layer="layout" data-pptx-editable="false"/>
<rect x="72" y="140" width="264" height="504" rx="26" fill="#F8FAFC" stroke="#E5E7EB" stroke-width="2" />
<text x="102" y="188" fill="#C00000" font-family="Microsoft YaHei, PingFang SC, Arial, sans-serif" font-size="18" font-weight="700">中国电信模板</text>
<text x="102" y="218" fill="#6B7280" font-family="Arial, sans-serif" font-size="13">TELECOM / GOV-ENTERPRISE</text>
<rect x="102" y="242" width="176" height="4" rx="2" fill="#C00000" />
<rect x="102" y="288" width="120" height="4" rx="2" fill="#C00000" fill-opacity="0.75" />
<rect x="102" y="306" width="86" height="4" rx="2" fill="#E55B5B" fill-opacity="0.55" />
<text x="102" y="394" fill="#6B7280" font-family="Microsoft YaHei, PingFang SC, Arial, sans-serif" font-size="13">政企汇报 / 转型规划 / 方案呈现</text>
<rect x="102" y="438" width="156" height="4" rx="2" fill="#C00000" fill-opacity="0.68" />
<rect x="102" y="456" width="120" height="4" rx="2" fill="#E55B5B" fill-opacity="0.48" />
<rect x="102" y="474" width="176" height="4" rx="2" fill="#C00000" fill-opacity="0.28" />
<rect x="102" y="540" width="140" height="4" rx="2" fill="#C00000" fill-opacity="0.7" />
<text x="102" y="586" fill="#111827" font-family="Arial, sans-serif" font-size="13" font-weight="700">CHINA TELECOM TEMPLATE</text>
<rect x="376" y="140" width="832" height="504" rx="26" fill="#FFFFFF" stroke="#E5E7EB" stroke-width="2" />
<circle cx="438" cy="220" r="32" fill="#C00000" />
<text x="438" y="229" text-anchor="middle" fill="#FFFFFF" font-family="Arial, sans-serif" font-size="22" font-weight="700">1</text>
<text x="496" y="212" fill="#C00000" font-family="Microsoft YaHei, PingFang SC, Arial, sans-serif" font-size="24" font-weight="700">{{TOC_ITEM_1_TITLE}}</text>
<line x1="496" y1="228" x2="1080" y2="228" stroke="#9CA3AF" stroke-width="1.5" stroke-dasharray="3 6" />
<text x="1120" y="212" text-anchor="end" fill="#6B7280" font-family="Microsoft YaHei, PingFang SC, Arial, sans-serif" font-size="14">{{TOC_ITEM_1_DESC}}</text>
<circle cx="438" cy="324" r="32" fill="#C00000" />
<text x="438" y="333" text-anchor="middle" fill="#FFFFFF" font-family="Arial, sans-serif" font-size="22" font-weight="700">2</text>
<text x="496" y="316" fill="#111827" font-family="Microsoft YaHei, PingFang SC, Arial, sans-serif" font-size="24" font-weight="700">{{TOC_ITEM_2_TITLE}}</text>
<line x1="496" y1="332" x2="1080" y2="332" stroke="#9CA3AF" stroke-width="1.5" stroke-dasharray="3 6" />
<text x="1120" y="316" text-anchor="end" fill="#6B7280" font-family="Microsoft YaHei, PingFang SC, Arial, sans-serif" font-size="14">{{TOC_ITEM_2_DESC}}</text>
<circle cx="438" cy="428" r="32" fill="#C00000" />
<text x="438" y="437" text-anchor="middle" fill="#FFFFFF" font-family="Arial, sans-serif" font-size="22" font-weight="700">3</text>
<text x="496" y="420" fill="#111827" font-family="Microsoft YaHei, PingFang SC, Arial, sans-serif" font-size="24" font-weight="700">{{TOC_ITEM_3_TITLE}}</text>
<line x1="496" y1="436" x2="1080" y2="436" stroke="#9CA3AF" stroke-width="1.5" stroke-dasharray="3 6" />
<text x="1120" y="420" text-anchor="end" fill="#6B7280" font-family="Microsoft YaHei, PingFang SC, Arial, sans-serif" font-size="14">{{TOC_ITEM_3_DESC}}</text>
<circle cx="438" cy="532" r="32" fill="#C00000" />
<text x="438" y="541" text-anchor="middle" fill="#FFFFFF" font-family="Arial, sans-serif" font-size="22" font-weight="700">4</text>
<text x="496" y="524" fill="#111827" font-family="Microsoft YaHei, PingFang SC, Arial, sans-serif" font-size="24" font-weight="700">{{TOC_ITEM_4_TITLE}}</text>
<line x1="496" y1="540" x2="1080" y2="540" stroke="#9CA3AF" stroke-width="1.5" stroke-dasharray="3 6" />
<text x="1120" y="524" text-anchor="end" fill="#6B7280" font-family="Microsoft YaHei, PingFang SC, Arial, sans-serif" font-size="14">{{TOC_ITEM_4_DESC}}</text>
<g id="agenda-title-slot" data-pptx-placeholder="title"
data-pptx-placeholder-bounds="40 42 146 44">
<text id="agenda-title-carrier" data-pptx-placeholder-carrier="true"
x="40" y="73" fill="#FFFFFF"
font-family="Microsoft YaHei, PingFang SC, Arial, sans-serif"
font-size="24" font-weight="700">{{PAGE_TITLE}}</text>
</g>
<g id="agenda-item-1-slot" data-pptx-placeholder="body" data-pptx-placeholder-idx="1"
data-pptx-placeholder-bounds="496 186 624 50">
<text id="agenda-item-1-carrier" data-pptx-placeholder-carrier="true"
x="496" y="218" fill="#C00000"
font-family="Microsoft YaHei, PingFang SC, Arial, sans-serif"
font-size="24" font-weight="700">{{TOC_ITEM_1_TITLE}}</text>
</g>
<g id="agenda-item-2-slot" data-pptx-placeholder="body" data-pptx-placeholder-idx="2"
data-pptx-placeholder-bounds="496 290 624 50">
<text id="agenda-item-2-carrier" data-pptx-placeholder-carrier="true"
x="496" y="322" fill="#111827"
font-family="Microsoft YaHei, PingFang SC, Arial, sans-serif"
font-size="24" font-weight="700">{{TOC_ITEM_2_TITLE}}</text>
</g>
<g id="agenda-item-3-slot" data-pptx-placeholder="body" data-pptx-placeholder-idx="3"
data-pptx-placeholder-bounds="496 394 624 50">
<text id="agenda-item-3-carrier" data-pptx-placeholder-carrier="true"
x="496" y="426" fill="#111827"
font-family="Microsoft YaHei, PingFang SC, Arial, sans-serif"
font-size="24" font-weight="700">{{TOC_ITEM_3_TITLE}}</text>
</g>
<g id="agenda-item-4-slot" data-pptx-placeholder="body" data-pptx-placeholder-idx="4"
data-pptx-placeholder-bounds="496 498 624 50">
<text id="agenda-item-4-carrier" data-pptx-placeholder-carrier="true"
x="496" y="530" fill="#111827"
font-family="Microsoft YaHei, PingFang SC, Arial, sans-serif"
font-size="24" font-weight="700">{{TOC_ITEM_4_TITLE}}</text>
</g>
<g id="agenda-slide-number-slot" data-pptx-placeholder="slide-number"
data-pptx-placeholder-idx="5" data-pptx-placeholder-bounds="1128 666 80 24">
<text id="agenda-slide-number-carrier" data-pptx-placeholder-carrier="true"
x="1208" y="684" text-anchor="end" fill="#6B7280"
font-family="Arial, sans-serif" font-size="13">{{PAGE_NUM}}</text>
</g>
</svg>

Before

Width:  |  Height:  |  Size: 4.6 KiB

After

Width:  |  Height:  |  Size: 7.2 KiB

@@ -1,22 +1,60 @@
<?xml version="1.0" encoding="UTF-8"?>
<svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" viewBox="0 0 1280 720" data-pptx-layout="03_content" data-pptx-layout-name="Content">
<rect x="0" y="0" width="1280" height="720" fill="#FFFFFF" id="layout-03_content-background" data-pptx-layer="layout" data-pptx-editable="false"/>
<svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink"
width="1280" height="720" viewBox="0 0 1280 720"
data-pptx-master="china_telecom_content_master" data-pptx-master-name="China Telecom Content"
data-pptx-layout="content" data-pptx-layout-name="Title and Content">
<rect id="content-master-background" x="0" y="0" width="1280" height="720" fill="#FFFFFF"
data-pptx-layer="master" data-pptx-editable="false"/>
<rect id="content-master-red-capsule" x="0" y="32" width="206" height="64" rx="24" fill="#C00000"
data-pptx-layer="master" data-pptx-editable="false"/>
<rect id="content-master-red-lane" x="114" y="32" width="1166" height="64" fill="#C00000"
data-pptx-layer="master" data-pptx-editable="false"/>
<rect id="content-master-gray-lane" x="206" y="39" width="1074" height="50" rx="22" fill="#D9D9D9"
data-pptx-layer="master" data-pptx-editable="false"/>
<image id="content-master-header-brand" x="1000" y="38" width="208" height="48"
xlink:href="../images/header_brand.png" preserveAspectRatio="xMaxYMid meet"
data-pptx-layer="master" data-pptx-editable="false"/>
<line id="content-master-footer-rule" x1="72" y1="650" x2="1208" y2="650" stroke="#D1D5DB"
stroke-width="1" data-pptx-layer="master" data-pptx-editable="false"/>
<rect x="0" y="32" width="158" height="64" rx="24" fill="#C00000" />
<rect x="114" y="32" width="1166" height="64" fill="#C00000" />
<rect x="206" y="39" width="1074" height="50" rx="22" fill="#D9D9D9" />
<text x="40" y="73" fill="#FFFFFF" font-family="Microsoft YaHei, PingFang SC, Arial, sans-serif" font-size="22" font-weight="700">{{SECTION_NAME}}</text>
<text x="228" y="72" fill="#2B2F33" font-family="Microsoft YaHei, PingFang SC, Arial, sans-serif" font-size="24" font-weight="700" id="slot-03_content-title-1" data-pptx-placeholder="title">{{PAGE_TITLE}}</text>
<image x="1032" y="38" width="176" height="48" xlink:href="../images/logo.png" preserveAspectRatio="xMidYMid meet" />
<rect x="72" y="132" width="1136" height="486" rx="24" fill="#FFFFFF" stroke="#D1D5DB" stroke-width="2" stroke-dasharray="8 8" />
<text x="640" y="386" text-anchor="middle" fill="#9CA3AF" font-family="Microsoft YaHei, PingFang SC, Arial, sans-serif" font-size="20" id="slot-03_content-body-2" data-pptx-placeholder="body">{{CONTENT_AREA}}</text>
<rect x="1078" y="552" width="72" height="4" rx="2" fill="#C00000" />
<rect x="1042" y="572" width="132" height="4" rx="2" fill="#C00000" fill-opacity="0.24" />
<rect x="1072" y="590" width="102" height="4" rx="2" fill="#E55B5B" fill-opacity="0.36" />
<line x1="72" y1="650" x2="1208" y2="650" stroke="#D1D5DB" stroke-width="1" />
<text x="72" y="676" fill="#6B7280" font-family="Arial, sans-serif" font-size="13">{{SOURCE}}</text>
<text x="1208" y="676" text-anchor="end" fill="#6B7280" font-family="Arial, sans-serif" font-size="13" id="slot-03_content-slide_number-3" data-pptx-placeholder="slide-number">{{PAGE_NUM}}</text>
<rect id="content-panel" x="72" y="132" width="1136" height="486" rx="24"
fill="#F8FAFC" stroke="#D1D5DB" stroke-width="1"
data-pptx-layer="layout" data-pptx-editable="false"/>
<rect id="content-panel-accent" x="1078" y="552" width="72" height="4" rx="2" fill="#C00000"
data-pptx-layer="layout" data-pptx-editable="false"/>
<rect id="content-panel-accent-soft" x="1042" y="572" width="132" height="4" rx="2"
fill="#C00000" fill-opacity="0.24" data-pptx-layer="layout" data-pptx-editable="false"/>
<g id="content-section-slot" data-pptx-placeholder="body" data-pptx-placeholder-idx="1"
data-pptx-placeholder-bounds="40 44 146 40">
<text id="content-section-carrier" data-pptx-placeholder-carrier="true"
x="40" y="72" fill="#FFFFFF"
font-family="Microsoft YaHei, PingFang SC, Arial, sans-serif"
font-size="22" font-weight="700">{{SECTION_NAME}}</text>
</g>
<g id="content-title-slot" data-pptx-placeholder="title"
data-pptx-placeholder-bounds="228 44 714 40">
<text id="content-title-carrier" data-pptx-placeholder-carrier="true"
x="228" y="72" fill="#2B2F33"
font-family="Microsoft YaHei, PingFang SC, Arial, sans-serif"
font-size="24" font-weight="700">{{PAGE_TITLE}}</text>
</g>
<g id="content-object-slot" data-pptx-placeholder="object" data-pptx-placeholder-idx="2"
data-pptx-placeholder-bounds="96 156 1088 438">
<text id="content-object-carrier" data-pptx-placeholder-carrier="true"
x="96" y="190" fill="#9CA3AF"
font-family="Microsoft YaHei, PingFang SC, Arial, sans-serif"
font-size="20">{{CONTENT_AREA}}</text>
</g>
<g id="content-source-slot" data-pptx-placeholder="footer" data-pptx-placeholder-idx="3"
data-pptx-placeholder-bounds="72 658 720 28">
<text id="content-source-carrier" data-pptx-placeholder-carrier="true"
x="72" y="678" fill="#6B7280"
font-family="Arial, Microsoft YaHei, sans-serif" font-size="13">{{SOURCE}}</text>
</g>
<g id="content-slide-number-slot" data-pptx-placeholder="slide-number"
data-pptx-placeholder-idx="4" data-pptx-placeholder-bounds="1128 658 80 28">
<text id="content-slide-number-carrier" data-pptx-placeholder-carrier="true"
x="1208" y="678" text-anchor="end" fill="#6B7280"
font-family="Arial, sans-serif" font-size="13">{{PAGE_NUM}}</text>
</g>
</svg>

Before

Width:  |  Height:  |  Size: 2.0 KiB

After

Width:  |  Height:  |  Size: 3.6 KiB

@@ -1,18 +1,58 @@
<?xml version="1.0" encoding="UTF-8"?>
<svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" viewBox="0 0 1280 720" data-pptx-layout="04_ending" data-pptx-layout-name="Closing">
<rect x="0" y="0" width="1280" height="720" fill="#FFFFFF" id="layout-04_ending-background" data-pptx-layer="layout" data-pptx-editable="false"/>
<svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink"
width="1280" height="720" viewBox="0 0 1280 720"
data-pptx-master="china_telecom_brand_master" data-pptx-master-name="China Telecom Brand"
data-pptx-layout="closing" data-pptx-layout-name="Closing">
<rect id="brand-master-background" x="0" y="0" width="1280" height="720" fill="#FFFFFF"
data-pptx-layer="master" data-pptx-editable="false"/>
<rect id="brand-master-top-rule" x="0" y="0" width="1280" height="8" fill="#C00000"
data-pptx-layer="master" data-pptx-editable="false"/>
<image id="brand-master-footer-ribbon" x="0" y="554" width="1280" height="166"
xlink:href="../images/footer_ribbon.png" preserveAspectRatio="xMidYMid slice"
data-pptx-layer="master" data-pptx-editable="false"/>
<text id="brand-master-footer-label" x="72" y="650" fill="#FFFFFF"
font-family="Arial, Microsoft YaHei, sans-serif" font-size="14"
data-pptx-layer="master" data-pptx-editable="false">CHINA TELECOM</text>
<image x="72" y="34" width="214" height="58" xlink:href="../images/logo.png" />
<text x="96" y="274" fill="#111827" font-family="Microsoft YaHei, PingFang SC, Arial, sans-serif" font-size="40" font-weight="700">{{THANK_YOU}}</text>
<text x="96" y="324" fill="#6B7280" font-family="Arial, sans-serif" font-size="18">{{ENDING_SUBTITLE}}</text>
<rect x="96" y="352" width="192" height="6" rx="3" fill="#C00000" />
<text x="96" y="420" fill="#2B2F33" font-family="Microsoft YaHei, PingFang SC, Arial, sans-serif" font-size="18">{{CONTACT_INFO}}</text>
<rect x="838" y="156" width="370" height="266" rx="28" fill="#F8FAFC" stroke="#E5E7EB" stroke-width="2" />
<rect x="874" y="204" width="88" height="4" rx="2" fill="#C00000" />
<image x="888" y="252" width="268" height="92" xlink:href="../images/slogan_red.png" preserveAspectRatio="xMidYMid meet" />
<image x="872" y="356" width="304" height="84" xlink:href="../images/skyline_bg.png" preserveAspectRatio="xMidYMid meet" />
<image x="0" y="554" width="1280" height="166" xlink:href="../images/footer_ribbon.png" preserveAspectRatio="xMidYMid slice" />
<text x="1208" y="676" text-anchor="end" fill="#FFFFFF" font-family="Arial, sans-serif" font-size="13" id="slot-04_ending-slide_number-1" data-pptx-placeholder="slide-number">{{PAGE_NUM}}</text>
<image id="closing-logo" x="72" y="34" width="214" height="58" xlink:href="../images/logo.png"
preserveAspectRatio="xMinYMid meet" data-pptx-layer="layout" data-pptx-editable="false"/>
<rect id="closing-title-rule" x="96" y="352" width="192" height="6" rx="3" fill="#C00000"
data-pptx-layer="layout" data-pptx-editable="false"/>
<rect id="closing-brand-card" x="838" y="156" width="370" height="286" rx="28"
fill="#F8FAFC" stroke="#E5E7EB" stroke-width="2"
data-pptx-layer="layout" data-pptx-editable="false"/>
<rect id="closing-brand-accent" x="874" y="204" width="88" height="4" rx="2" fill="#C00000"
data-pptx-layer="layout" data-pptx-editable="false"/>
<image id="closing-slogan" x="888" y="242" width="268" height="92"
xlink:href="../images/slogan_red.png" preserveAspectRatio="xMidYMid meet"
data-pptx-layer="layout" data-pptx-editable="false"/>
<image id="closing-skyline" x="872" y="344" width="304" height="84"
xlink:href="../images/skyline_bg.png" preserveAspectRatio="xMidYMid meet"
data-pptx-layer="layout" data-pptx-editable="false"/>
<g id="closing-title-slot" data-pptx-placeholder="title"
data-pptx-placeholder-bounds="96 226 620 72">
<text id="closing-title-carrier" data-pptx-placeholder-carrier="true"
x="96" y="274" fill="#111827"
font-family="Microsoft YaHei, PingFang SC, Arial, sans-serif"
font-size="40" font-weight="700">{{THANK_YOU}}</text>
</g>
<g id="closing-subtitle-slot" data-pptx-placeholder="subtitle" data-pptx-placeholder-idx="1"
data-pptx-placeholder-bounds="96 300 620 40">
<text id="closing-subtitle-carrier" data-pptx-placeholder-carrier="true"
x="96" y="328" fill="#6B7280"
font-family="Arial, Microsoft YaHei, sans-serif" font-size="18">{{ENDING_SUBTITLE}}</text>
</g>
<g id="closing-contact-slot" data-pptx-placeholder="body" data-pptx-placeholder-idx="2"
data-pptx-placeholder-bounds="96 388 620 64">
<text id="closing-contact-carrier" data-pptx-placeholder-carrier="true"
x="96" y="420" fill="#2B2F33"
font-family="Microsoft YaHei, PingFang SC, Arial, sans-serif"
font-size="18">{{CONTACT_INFO}}</text>
</g>
<g id="closing-slide-number-slot" data-pptx-placeholder="slide-number"
data-pptx-placeholder-idx="3" data-pptx-placeholder-bounds="1128 658 80 28">
<text id="closing-slide-number-carrier" data-pptx-placeholder-carrier="true"
x="1208" y="678" text-anchor="end" fill="#FFFFFF"
font-family="Arial, sans-serif" font-size="13">{{PAGE_NUM}}</text>
</g>
</svg>

Before

Width:  |  Height:  |  Size: 1.6 KiB

After

Width:  |  Height:  |  Size: 3.5 KiB

@@ -1,212 +1,66 @@
---
deck_id: 中国电信
kind: deck
native_structure_mode: template
summary: China Telecom related briefings, 政企数字化方案, 转型规划, 内部汇报.
canvas_format: ppt169
page_count: 5
category: brand
summary: 中国电信政企数字化转型规划内部汇报的克制红灰品牌模板。
keywords: [中国电信, 政企, 数字化, 企业汇报]
primary_color: "#C00000"
canvas_format: ppt169
canvas_width: 1280
canvas_height: 720
canvas_viewbox: "0 0 1280 720"
source_canvas_width: 1280
source_canvas_height: 720
source_viewbox: "0 0 1280 720"
replication_mode: fidelity
native_structure_mode: structured
page_count: 5
---
# China Telecom Template - Design Specification
> Suitable for telecom solution proposals, digital transformation briefings, government-enterprise reports, and executive review materials.
---
# 中国电信 — Design Specification
## I. Template Overview
| Property | Description |
| --- | --- |
| **Template Name** | `中国电信` |
| **Use Cases** | China Telecom related briefings, 政企数字化方案, 转型规划, 内部汇报 |
| **Design Tone** | Authoritative, structured, restrained, enterprise-government hybrid |
| **Theme Mode** | Light theme (white background + telecom red title bar + silver-gray structural lane + restrained brand imagery) |
- 适用于政企数字化方案、转型规划、内部评审和客户汇报。
- 视觉基调为白底、通信红结构条、银灰内容承载区与少量城市线稿,强调权威、清晰和克制。
- 整套模板使用 China Telecom Brand 与 China Telecom Content 两个 Master,并提供五个可直接从 PowerPoint 布局库调用的 Layout。
---
## II. Color Scheme
## II. Canvas Specification
| Property | Value |
| --- | --- |
| **Format** | Standard 16:9 |
| **Dimensions** | 1280 × 720 px |
| **viewBox** | `0 0 1280 720` |
| **Page Margins** | Left/Right 72px, Top 88px, Bottom 56px |
| **Safe Area** | x: 72-1208, y: 88-664 |
---
## III. Color Scheme
### Primary Colors
| Role | Value | Notes |
| Role | Color | Application |
| --- | --- | --- |
| **Telecom Red** | `#C00000` | Main header blocks, numbering, emphasis |
| **Light Silver Gray** | `#D9D9D9` | Structural lane, chapter ribbon backing |
| **Warm White** | `#FFFFFF` | Main background |
| **Line Gray** | `#CFCFCF` | Divider lines and subtle frames |
| **Graphite** | `#2B2F33` | Primary text |
| Telecom red | #C00000 | 页眉胶囊、编号、分隔线和关键强调 |
| Silver gray | #D9D9D9 | 页眉结构带 |
| Panel gray | #F8FAFC | 内容承载区与品牌卡片 |
| Graphite | #111827 | 标题和关键文字 |
| Muted gray | #6B7280 | 辅助说明与页脚 |
| White | #FFFFFF | Master 背景与反白文字 |
### Secondary Colors
## IV. Signature Design Elements
| Role | Value | Notes |
| --- | --- | --- |
| **Muted Gray** | `#6B7280` | Secondary text and descriptions |
| **Soft Red** | `#E55B5B` | Auxiliary emphasis |
| **Near Black** | `#111827` | Key headings |
| **Skyline Blue** | `#DCEAF8` | Decorative cityline / digital texture |
- 内容页和目录页使用“红色胶囊 + 银灰长带”的页眉结构,右侧保留横向品牌图形。
- 封面、章节页和结束页复用红色口号、城市线稿与底部红色飘带,但控制在独立品牌卡片中。
- China Telecom Brand Master 统一承载白底、顶部红线、底部品牌飘带与英文标识;China Telecom Content Master 统一承载红灰页眉、横向品牌标识和页脚分隔线。
- 内容承载区采用浅灰圆角面板;实际内容由完整 object 占位框承载,不显示提示性虚线。
- 标题与通用内容保持左对齐;只在品牌图形内部使用居中构图。
---
## V. Page Roster
## IV. Typography System
| File | Master | Layout key | PowerPoint picker name | Visual character | Reusable slots |
| --- | --- | --- | --- | --- | --- |
| (01_cover.svg) | China Telecom Brand | cover | Cover | 左侧标题簇、右侧品牌卡片、底部飘带 | 标题、副标题、单位、日期 |
| (02_toc.svg) | China Telecom Content | agenda | Agenda | 左侧品牌说明卡、右侧四行编号目录 | 页面标题、四个目录项、页码 |
| (02_chapter.svg) | China Telecom Brand | section | Section Header | 左侧章节信息、右侧品牌卡片、底部飘带 | 章节号、章节标题、章节副标题 |
| (03_content.svg) | China Telecom Content | content | Title and Content | 红灰页眉与大面积浅灰开放内容区 | 栏目标、页面标题、内容对象、来源、页码 |
| (04_ending.svg) | China Telecom Brand | closing | Closing | 左侧结束语、右侧品牌卡片、底部飘带 | 结束标题、副标题、联系信息、页码 |
### Font Stack
## VI. Assets
`"Microsoft YaHei", "微软雅黑", "PingFang SC", "Source Han Sans SC", Arial, sans-serif`
### Font Size Hierarchy
| Level | Usage | Size | Weight |
| --- | --- | --- | --- |
| H1 | Cover title | 42px | Bold |
| H2 | Chapter / content title | 28px | Bold |
| H3 | Section label / TOC item | 20px | Bold |
| P | Body text | 16px | Regular |
| Meta | Subtitle / annotations | 13px | Regular |
| Number | TOC / chapter index | 30px | Bold |
---
## V. Page Structure
### General Layout
| Area | Position | Description |
| --- | --- | --- |
| **Logo Area** | x=72, y=36 | Fixed top-left brand logo |
| **Header Ribbon** | y=32 to 96 | Red capsule + gray lane for TOC/content pages |
| **Main Content Area** | y=132 to 618 | Main text/layout body |
| **Visual Sidebar** | x=922 to 1208 | Fixed image-only rail on cover / TOC / chapter / ending pages |
| **Footer Ribbon** | y=548 to 720 | Fixed decorative bottom image area on cover/ending |
| **Footer Meta** | y=650 to 690 | Source / page number / contact info |
### Structural Rules
- Cover and ending pages reuse the image-based footer ribbon to preserve the brand atmosphere.
- TOC and content pages use dedicated visual sidebars/cards for imagery, keeping text and images in separate safe zones.
- Chapter pages are cleaner section-divider pages and should not inherit the content-page header ribbon.
- Each page should contain at most one formal logo mark; sidebars should rely on slogan and skyline imagery instead of repeated logo lockups.
- The content page remains open-canvas by default and should not reserve a large fixed sidebar.
- Repeated telecom motifs use one reusable structure family rather than unrelated decorative variants.
---
## VI. Page Types
### 1. Cover Page (`01_cover.svg`)
- Top-left fixed logo
- Left-aligned title cluster with red accent rule
- Right-side visual card containing slogan and skyline imagery
- Bottom full-width ribbon background
### 2. Table of Contents (`02_toc.svg`)
- Red rounded title capsule + gray structural lane
- Top-right compact logo for page-level brand anchoring
- Left visual card with restrained brand imagery
- Right text list area for up to 4 major sections
- Dotted leaders and right-aligned descriptions
### 3. Chapter Page (`02_chapter.svg`)
- Clean section-divider page without the content-page header ribbon
- Top-right compact logo anchored away from the title area
- Large chapter number and title in the left safe zone
- Right-side visual card with fixed imagery and no duplicated large logo
- Footer ribbon used as a restrained anchor
### 4. Content Page (`03_content.svg`)
- Red section tab at top-left, gray lane at top-right
- Top-right compact logo for page-level brand anchoring
- Open-canvas content area for flexible charts, tables, and mixed layouts
- Only keep lightweight corner / footer-level brand control
- Footer source and page number
### 5. Ending Page (`04_ending.svg`)
- White background
- Left closing statement block
- Right closing visual card with restrained skyline / slogan composition
- Full-width footer ribbon
---
## VII. SVG Page Roster
| File | Role | Description |
|------|------|-------------|
| `01_cover.svg` | cover | Title slide; brand/project name + presenter + date |
| `02_chapter.svg` | chapter | Chapter divider page (large number + chapter title) |
| `02_toc.svg` | toc | Table of contents listing major sections |
| `03_content.svg` | content | Main content page; body of the deck |
| `04_ending.svg` | ending | Closing/thank-you page |
## VIII. Layout Modes
| Mode | Use Cases |
| File | Intended usage |
| --- | --- |
| **Title + Open Canvas** | Executive summary, key messages |
| **Two Column** | Solution architecture, comparison |
| **Card Grid** | Capability modules, initiatives |
| **Timeline / Process** | Implementation roadmap |
| **Chart + Notes** | Data dashboards, KPI explanation |
---
## IX. Spacing Specification
| Element | Value |
| --- | --- |
| Outer margin | 72px |
| Header inner padding | 24px |
| Content block gap | 24px |
| Card padding | 20px |
| Border radius | 18px |
| Title-to-subtitle gap | 18px |
| Text-to-image safety gap | 32px |
---
## X. Placeholder Specification
| Placeholder | Purpose | Applicable Page |
| --- | --- | --- |
| `{{TITLE}}` | Main title | Cover |
| `{{SUBTITLE}}` | Subtitle | Cover |
| `{{DATE}}` | Date | Cover |
| `{{AUTHOR}}` | Author / organization | Cover |
| `{{CHAPTER_NUM}}` | Chapter number | Chapter |
| `{{CHAPTER_TITLE}}` | Chapter title | Chapter |
| `{{PAGE_TITLE}}` | Page title | Content |
| `{{CONTENT_AREA}}` | Content placeholder | Content |
| `{{SECTION_NAME}}` | Section name | Content |
| `{{SOURCE}}` | Source note | Content |
| `{{PAGE_NUM}}` | Page number | Content, Ending |
| `{{TOC_ITEM_1_TITLE}}` ~ `{{TOC_ITEM_4_TITLE}}` | TOC titles | TOC |
| `{{TOC_ITEM_1_DESC}}` ~ `{{TOC_ITEM_4_DESC}}` | TOC descriptions | TOC |
| `{{THANK_YOU}}` | Closing heading | Ending |
| `{{ENDING_SUBTITLE}}` | Closing subtitle | Ending |
| `{{CONTACT_INFO}}` | Contact information | Ending |
---
## XI. Usage Guide
1. Reuse `logo.png` and `footer_ribbon.png` as fixed brand assets; `slogan_red.png` and `skyline_bg.png` should be used selectively and only on the cover / ending pages.
2. Keep generated text inside the documented safe areas; only chapter pages use a strong left/right split.
3. Prefer red emphasis only for structure and key figures; do not over-saturate the content area.
4. Reference only assets packaged with this template.
| logo.png | 封面、章节页和结束页品牌标识 |
| header_brand.png | 目录页和内容页横向页眉标识 |
| footer_ribbon.png | 封面、章节页和结束页底部品牌飘带 |
| slogan_red.png | 右侧品牌卡片口号 |
| skyline_bg.png | 右侧品牌卡片城市线稿 |
| top_emblem.png | 保留的备用横向品牌资产 |
Binary file not shown.

Before

Width:  |  Height:  |  Size: 56 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 128 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 20 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 82 KiB

@@ -1,100 +0,0 @@
<?xml version="1.0" encoding="UTF-8"?>
<svg xmlns="http://www.w3.org/2000/svg" width="1280" height="720" viewBox="0 0 1280 720" data-pptx-layout="01_cover" data-pptx-layout-name="Cover">
<!-- 模板: 封面页 - 中国电建经典风格 -->
<defs>
<!-- 深蓝渐变背景 -->
<linearGradient id="coverBgGrad" x1="0%" y1="0%" x2="100%" y2="100%">
<stop offset="0%" style="stop-color:#00418D;stop-opacity:1" />
<stop offset="40%" style="stop-color:#003270;stop-opacity:1" />
<stop offset="100%" style="stop-color:#001F45;stop-opacity:1" />
</linearGradient>
<!-- 顶部装饰渐变 -->
<linearGradient id="topGrad" x1="0%" y1="0%" x2="100%" y2="0%">
<stop offset="0%" style="stop-color:#4A90D9;stop-opacity:1" />
<stop offset="100%" style="stop-color:#00418D;stop-opacity:1" />
</linearGradient>
<!-- 左侧装饰渐变 -->
<linearGradient id="sideGrad" x1="0%" y1="0%" x2="0%" y2="100%">
<stop offset="0%" style="stop-color:#4A90D9;stop-opacity:1" />
<stop offset="50%" style="stop-color:#0066CC;stop-opacity:1" />
<stop offset="100%" style="stop-color:#4A90D9;stop-opacity:1" />
</linearGradient>
<!-- 斜线图案 - 工程感 -->
<pattern id="diagLines" width="40" height="40" patternUnits="userSpaceOnUse" patternTransform="rotate(45)">
<line x1="0" y1="0" x2="0" y2="40" stroke="#FFFFFF" stroke-width="1" stroke-opacity="0.03"/>
</pattern>
</defs>
<!-- 背景 -->
<rect x="0" y="0" width="1280" height="720" fill="url(#coverBgGrad)" id="layout-01_cover-background" data-pptx-layer="layout" data-pptx-editable="false"/>
<!-- 工程感斜线纹理 -->
<rect x="0" y="0" width="1280" height="720" fill="url(#diagLines)" id="full-canvas-01_cover-1"/>
<!-- 装饰元素 - 几何图案 -->
<circle cx="1150" cy="150" r="250" fill="#FFFFFF" fill-opacity="0.02" />
<circle cx="1200" cy="100" r="150" fill="#4A90D9" fill-opacity="0.04" />
<circle cx="100" cy="620" r="200" fill="#FFFFFF" fill-opacity="0.02" />
<!-- 对角线装饰 -->
<line x1="800" y1="0" x2="1280" y2="480" stroke="#4A90D9" stroke-width="1" stroke-opacity="0.1" />
<line x1="850" y1="0" x2="1280" y2="430" stroke="#4A90D9" stroke-width="1" stroke-opacity="0.08" />
<line x1="900" y1="0" x2="1280" y2="380" stroke="#4A90D9" stroke-width="1" stroke-opacity="0.06" />
<!-- 顶部渐变装饰线 -->
<rect x="0" y="0" width="1280" height="6" fill="url(#topGrad)" />
<!-- 左侧装饰竖条组 -->
<rect x="0" y="150" width="10" height="420" fill="url(#sideGrad)" />
<rect x="18" y="180" width="4" height="360" fill="#4A90D9" fill-opacity="0.5" />
<rect x="28" y="210" width="2" height="300" fill="#4A90D9" fill-opacity="0.3" />
<!-- 企业英文名称 - 顶部 -->
<text x="1220" y="50" text-anchor="end" font-family="Arial, sans-serif" font-size="16" font-weight="bold" fill="#FFFFFF" fill-opacity="0.6" letter-spacing="4">
POWERCHINA
</text>
<!-- 主标题区域背景 -->
<rect x="0" y="280" width="950" height="160" fill="#000000" fill-opacity="0.2" />
<rect x="0" y="280" width="10" height="160" fill="#C41E3A" />
<!-- 主标题 -->
<text x="60" y="350" font-family="Microsoft YaHei, SimHei, sans-serif" font-size="48" font-weight="bold" fill="#FFFFFF" id="slot-01_cover-title-1" data-pptx-placeholder="title">
{{TITLE}}
</text>
<!-- 副标题 -->
<text x="60" y="410" font-family="Microsoft YaHei, Arial, sans-serif" font-size="24" fill="#4A90D9" id="slot-01_cover-subtitle-2" data-pptx-placeholder="subtitle">
{{SUBTITLE}}
</text>
<!-- 分隔线 -->
<line x1="60" y1="480" x2="300" y2="480" stroke="#4A90D9" stroke-width="2" />
<line x1="300" y1="480" x2="400" y2="480" stroke="#C41E3A" stroke-width="2" />
<!-- 汇报单位 -->
<text x="60" y="530" font-family="Microsoft YaHei, sans-serif" font-size="18" fill="#FFFFFF" fill-opacity="0.9">
{{AUTHOR}}
</text>
<!-- 汇报人 -->
<text x="60" y="565" font-family="Microsoft YaHei, sans-serif" font-size="16" fill="#FFFFFF" fill-opacity="0.7">
汇报人:{{PRESENTER}}
</text>
<!-- 日期 -->
<text x="60" y="600" font-family="Arial, Microsoft YaHei, sans-serif" font-size="16" fill="#4A90D9" fill-opacity="0.8">
{{DATE}}
</text>
<!-- 底部装饰区域 -->
<rect x="0" y="690" width="1280" height="30" fill="#002B5C" />
<rect x="0" y="690" width="200" height="30" fill="#C41E3A" />
<!-- 底部企业名称 -->
<text x="640" y="712" text-anchor="middle" font-family="Microsoft YaHei, sans-serif" font-size="14" fill="#FFFFFF" fill-opacity="0.8">
中国电力建设集团有限公司 POWERCHINA
</text>
</svg>

Before

Width:  |  Height:  |  Size: 4.8 KiB

@@ -1,81 +0,0 @@
<?xml version="1.0" encoding="UTF-8"?>
<svg xmlns="http://www.w3.org/2000/svg" width="1280" height="720" viewBox="0 0 1280 720" data-pptx-layout="02_chapter" data-pptx-layout-name="Section">
<!-- 模板: 章节页 - 中国电建经典风格 -->
<defs>
<!-- 深蓝背景渐变 -->
<linearGradient id="gradChapter" x1="0%" y1="0%" x2="100%" y2="100%">
<stop offset="0%" style="stop-color:#00418D;stop-opacity:1" />
<stop offset="50%" style="stop-color:#003270;stop-opacity:1" />
<stop offset="100%" style="stop-color:#001F45;stop-opacity:1" />
</linearGradient>
<!-- 顶部装饰渐变 -->
<linearGradient id="topGrad" x1="0%" y1="0%" x2="100%" y2="0%">
<stop offset="0%" style="stop-color:#4A90D9;stop-opacity:1" />
<stop offset="100%" style="stop-color:#00418D;stop-opacity:1" />
</linearGradient>
<!-- 斜线图案 -->
<pattern id="diagLines" width="60" height="60" patternUnits="userSpaceOnUse" patternTransform="rotate(45)">
<line x1="0" y1="0" x2="0" y2="60" stroke="#FFFFFF" stroke-width="1" stroke-opacity="0.02"/>
</pattern>
</defs>
<!-- 背景 -->
<rect width="1280" height="720" fill="url(#gradChapter)" id="layout-02_chapter-background" data-pptx-layer="layout" data-pptx-editable="false"/>
<!-- 工程感斜线纹理 -->
<rect width="1280" height="720" fill="url(#diagLines)" id="full-canvas-02_chapter-1"/>
<!-- 装饰元素 - 几何图案 -->
<circle cx="1200" cy="100" r="300" fill="#FFFFFF" fill-opacity="0.02"/>
<circle cx="100" cy="620" r="250" fill="#FFFFFF" fill-opacity="0.02"/>
<circle cx="1100" cy="150" r="150" fill="#4A90D9" fill-opacity="0.03"/>
<!-- 顶部渐变装饰线 -->
<rect x="0" y="0" width="1280" height="6" fill="url(#topGrad)"/>
<!-- 网格装饰线 -->
<line x1="0" y1="240" x2="1280" y2="240" stroke="#FFFFFF" stroke-width="1" stroke-opacity="0.04"/>
<line x1="0" y1="480" x2="1280" y2="480" stroke="#FFFFFF" stroke-width="1" stroke-opacity="0.04"/>
<line x1="426" y1="0" x2="426" y2="720" stroke="#FFFFFF" stroke-width="1" stroke-opacity="0.04"/>
<line x1="854" y1="0" x2="854" y2="720" stroke="#FFFFFF" stroke-width="1" stroke-opacity="0.04"/>
<!-- 左侧装饰竖条 -->
<rect x="80" y="260" width="8" height="200" fill="#4A90D9"/>
<rect x="94" y="280" width="3" height="160" fill="#C41E3A" fill-opacity="0.8"/>
<!-- 章节内容 -->
<g transform="translate(640, 360)">
<!-- 章节编号 - 大号半透明背景 -->
<text x="0" y="-50" text-anchor="middle" font-family="Arial" font-size="200" font-weight="bold" fill="#FFFFFF" fill-opacity="0.04">
0{{CHAPTER_NUM}}
</text>
<!-- 章节编号描边效果 -->
<text x="0" y="-50" text-anchor="middle" font-family="Arial" font-size="200" font-weight="bold" fill="none" stroke="#4A90D9" stroke-width="1" stroke-opacity="0.15">
0{{CHAPTER_NUM}}
</text>
<!-- 装饰方块组 -->
<rect x="-80" y="10" width="160" height="6" fill="#4A90D9"/>
<rect x="-60" y="22" width="120" height="3" fill="#C41E3A" fill-opacity="0.8"/>
<!-- 章节标题 -->
<text x="0" y="80" text-anchor="middle" font-family="Microsoft YaHei, SimHei, sans-serif" font-size="48" font-weight="bold" fill="#FFFFFF">
{{CHAPTER_TITLE}}
</text>
<!-- 英文标题/副标题 -->
<text x="0" y="130" text-anchor="middle" font-family="Arial" font-size="22" fill="#4A90D9" letter-spacing="4">
{{CHAPTER_SUBTITLE}}
</text>
</g>
<!-- 底部装饰 -->
<rect x="0" y="680" width="1280" height="40" fill="#001F45" fill-opacity="0.6"/>
<rect x="0" y="680" width="200" height="40" fill="#C41E3A" fill-opacity="0.8"/>
<text x="640" y="707" text-anchor="middle" font-family="Arial, Microsoft YaHei, sans-serif" font-size="14" fill="#FFFFFF" fill-opacity="0.7">
POWERCHINA · 中国电力建设集团有限公司
</text>
</svg>

Before

Width:  |  Height:  |  Size: 4.0 KiB

@@ -1,112 +0,0 @@
<?xml version="1.0" encoding="UTF-8"?>
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 1280 720" data-pptx-layout="02_toc" data-pptx-layout-name="Agenda">
<!-- 模板: 目录页 - 中国电建经典风格 -->
<defs>
<!-- 顶部装饰渐变 -->
<linearGradient id="topGrad" x1="0%" y1="0%" x2="100%" y2="0%">
<stop offset="0%" style="stop-color:#4A90D9;stop-opacity:1" />
<stop offset="100%" style="stop-color:#00418D;stop-opacity:1" />
</linearGradient>
<!-- 左侧装饰渐变 -->
<linearGradient id="sideGrad" x1="0%" y1="0%" x2="0%" y2="100%">
<stop offset="0%" style="stop-color:#4A90D9;stop-opacity:1" />
<stop offset="100%" style="stop-color:#00418D;stop-opacity:1" />
</linearGradient>
</defs>
<!-- 白色背景 -->
<rect x="0" y="0" width="1280" height="720" fill="#FFFFFF" id="layout-02_toc-background" data-pptx-layer="layout" data-pptx-editable="false"/>
<!-- 顶部渐变装饰线 -->
<rect x="0" y="0" width="1280" height="6" fill="url(#topGrad)"/>
<!-- 左侧装饰区域 -->
<rect x="0" y="0" width="280" height="720" fill="#00418D" fill-opacity="0.03"/>
<rect x="0" y="0" width="8" height="720" fill="url(#sideGrad)"/>
<rect x="16" y="100" width="3" height="520" fill="#4A90D9" fill-opacity="0.5"/>
<!-- 页面标题 -->
<text x="60" y="80" font-family="Microsoft YaHei, SimHei, sans-serif" font-size="36" font-weight="bold" fill="#00418D">
目 录
</text>
<text x="60" y="110" font-family="Arial, sans-serif" font-size="16" fill="#4A90D9" letter-spacing="3">
CONTENTS
</text>
<!-- 装饰分隔线 -->
<line x1="60" y1="130" x2="180" y2="130" stroke="#00418D" stroke-width="3"/>
<line x1="180" y1="130" x2="220" y2="130" stroke="#C41E3A" stroke-width="2"/>
<!-- 目录项 1 -->
<g>
<text x="320" y="200" font-family="Arial, sans-serif" font-size="48" font-weight="bold" fill="#00418D">01</text>
<rect x="390" y="175" width="3" height="40" fill="#00418D"/>
<text x="410" y="195" font-family="Microsoft YaHei, sans-serif" font-size="22" font-weight="bold" fill="#1A1A1A">{{TOC_ITEM_1_TITLE}}</text>
<text x="410" y="220" font-family="Microsoft YaHei, sans-serif" font-size="14" fill="#718096">{{TOC_ITEM_1_DESC}}</text>
<line x1="410" y1="235" x2="800" y2="235" stroke="#E4E7EB" stroke-width="1"/>
</g>
<!-- 目录项 2 -->
<g>
<text x="320" y="300" font-family="Arial, sans-serif" font-size="48" font-weight="bold" fill="#00418D">02</text>
<rect x="390" y="275" width="3" height="40" fill="#00418D"/>
<text x="410" y="295" font-family="Microsoft YaHei, sans-serif" font-size="22" font-weight="bold" fill="#1A1A1A">{{TOC_ITEM_2_TITLE}}</text>
<text x="410" y="320" font-family="Microsoft YaHei, sans-serif" font-size="14" fill="#718096">{{TOC_ITEM_2_DESC}}</text>
<line x1="410" y1="335" x2="800" y2="335" stroke="#E4E7EB" stroke-width="1"/>
</g>
<!-- 目录项 3 -->
<g>
<text x="320" y="400" font-family="Arial, sans-serif" font-size="48" font-weight="bold" fill="#00418D">03</text>
<rect x="390" y="375" width="3" height="40" fill="#00418D"/>
<text x="410" y="395" font-family="Microsoft YaHei, sans-serif" font-size="22" font-weight="bold" fill="#1A1A1A">{{TOC_ITEM_3_TITLE}}</text>
<text x="410" y="420" font-family="Microsoft YaHei, sans-serif" font-size="14" fill="#718096">{{TOC_ITEM_3_DESC}}</text>
<line x1="410" y1="435" x2="800" y2="435" stroke="#E4E7EB" stroke-width="1"/>
</g>
<!-- 目录项 4 -->
<g>
<text x="320" y="500" font-family="Arial, sans-serif" font-size="48" font-weight="bold" fill="#00418D">04</text>
<rect x="390" y="475" width="3" height="40" fill="#00418D"/>
<text x="410" y="495" font-family="Microsoft YaHei, sans-serif" font-size="22" font-weight="bold" fill="#1A1A1A">{{TOC_ITEM_4_TITLE}}</text>
<text x="410" y="520" font-family="Microsoft YaHei, sans-serif" font-size="14" fill="#718096">{{TOC_ITEM_4_DESC}}</text>
<line x1="410" y1="535" x2="800" y2="535" stroke="#E4E7EB" stroke-width="1"/>
</g>
<!-- 目录项 5 -->
<g>
<text x="320" y="600" font-family="Arial, sans-serif" font-size="48" font-weight="bold" fill="#00418D">05</text>
<rect x="390" y="575" width="3" height="40" fill="#00418D"/>
<text x="410" y="595" font-family="Microsoft YaHei, sans-serif" font-size="22" font-weight="bold" fill="#1A1A1A">{{TOC_ITEM_5_TITLE}}</text>
<text x="410" y="620" font-family="Microsoft YaHei, sans-serif" font-size="14" fill="#718096">{{TOC_ITEM_5_DESC}}</text>
</g>
<!-- 右侧数据展示区 -->
<rect x="880" y="160" width="340" height="460" fill="#F4F6F8" rx="8"/>
<rect x="880" y="160" width="6" height="460" fill="#00418D"/>
<!-- 企业数据 -->
<text x="1050" y="260" text-anchor="middle" font-family="Arial, sans-serif" font-size="72" font-weight="bold" fill="#00418D" fill-opacity="0.15">{{STAT_1}}</text>
<text x="1050" y="300" text-anchor="middle" font-family="Microsoft YaHei, sans-serif" font-size="16" fill="#4A5568">{{STAT_1_LABEL}}</text>
<line x1="920" y1="340" x2="1180" y2="340" stroke="#E4E7EB" stroke-width="1"/>
<text x="1050" y="420" text-anchor="middle" font-family="Arial, sans-serif" font-size="72" font-weight="bold" fill="#C41E3A" fill-opacity="0.15">{{STAT_2}}</text>
<text x="1050" y="460" text-anchor="middle" font-family="Microsoft YaHei, sans-serif" font-size="16" fill="#4A5568">{{STAT_2_LABEL}}</text>
<line x1="920" y1="500" x2="1180" y2="500" stroke="#E4E7EB" stroke-width="1"/>
<text x="1050" y="570" text-anchor="middle" font-family="Arial, sans-serif" font-size="48" font-weight="bold" fill="#00418D" fill-opacity="0.12">{{STAT_3}}</text>
<text x="1050" y="600" text-anchor="middle" font-family="Microsoft YaHei, sans-serif" font-size="14" fill="#4A5568">{{STAT_3_LABEL}}</text>
<!-- 底部装饰线 -->
<rect x="0" y="716" width="1280" height="4" fill="#00418D"/>
<!-- 页码 -->
<text x="640" y="695" text-anchor="middle" font-family="Arial, sans-serif" font-size="14" fill="#718096" id="slot-02_toc-slide_number-1" data-pptx-placeholder="slide-number">{{PAGE_NUM}}</text>
<!-- 企业标识 -->
<text x="1220" y="695" text-anchor="end" font-family="Arial, sans-serif" font-size="12" fill="#718096">POWERCHINA</text>
</svg>

Before

Width:  |  Height:  |  Size: 6.4 KiB

@@ -1,57 +0,0 @@
<?xml version="1.0" encoding="UTF-8"?>
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 1280 720" data-pptx-layout="03_content" data-pptx-layout-name="Content">
<!-- 模板: 内容页 - 中国电建经典风格 -->
<defs>
<!-- 顶部装饰渐变 -->
<linearGradient id="topGrad" x1="0%" y1="0%" x2="100%" y2="0%">
<stop offset="0%" style="stop-color:#4A90D9;stop-opacity:1" />
<stop offset="100%" style="stop-color:#00418D;stop-opacity:1" />
</linearGradient>
<!-- 序号块渐变 -->
<linearGradient id="numGrad" x1="0%" y1="0%" x2="100%" y2="100%">
<stop offset="0%" style="stop-color:#0066CC;stop-opacity:1" />
<stop offset="100%" style="stop-color:#00418D;stop-opacity:1" />
</linearGradient>
</defs>
<!-- 白色背景 -->
<rect x="0" y="0" width="1280" height="720" fill="#FFFFFF" id="layout-03_content-background" data-pptx-layer="layout" data-pptx-editable="false"/>
<!-- 顶部渐变装饰线 -->
<rect x="0" y="0" width="1280" height="6" fill="url(#topGrad)" />
<!-- 页眉导航栏 -->
<!-- 章节序号块 -->
<rect x="60" y="30" width="50" height="50" rx="4" fill="url(#numGrad)" />
<text x="85" y="65" text-anchor="middle" font-family="Arial, sans-serif" font-size="24" font-weight="bold" fill="#FFFFFF">{{CHAPTER_NUM}}</text>
<!-- 页面标题 -->
<text x="130" y="65" font-family="Microsoft YaHei, SimHei, sans-serif" font-size="28" font-weight="bold" fill="#1A1A1A" id="slot-03_content-title-1" data-pptx-placeholder="title">{{PAGE_TITLE}}</text>
<!-- 右上角企业标识 -->
<text x="1220" y="50" text-anchor="end" font-family="Arial, sans-serif" font-size="12" font-weight="bold" fill="#00418D" fill-opacity="0.6">POWERCHINA</text>
<rect x="1100" y="58" width="120" height="2" fill="url(#topGrad)" fill-opacity="0.4"/>
<!-- 分隔线 -->
<line x1="60" y1="95" x2="1220" y2="95" stroke="#E4E7EB" stroke-width="1"/>
<!-- 内容区域占位 -->
<rect x="60" y="110" width="1160" height="550" fill="none" stroke="#E4E7EB" stroke-width="2" stroke-dasharray="8,8" />
<text x="640" y="365" text-anchor="middle" fill="#CBD5E1" font-size="18" font-family="Microsoft YaHei, sans-serif" id="slot-03_content-body-2" data-pptx-placeholder="body">
{{CONTENT_AREA}}
</text>
<text x="640" y="400" text-anchor="middle" fill="#CBD5E1" font-size="14" font-family="Microsoft YaHei, sans-serif">
(由 Executor 根据实际内容自由布局)
</text>
<!-- 底部装饰线 -->
<rect x="0" y="716" width="1280" height="4" fill="#00418D" />
<!-- 页码 -->
<text x="640" y="695" text-anchor="middle" font-family="Arial, sans-serif" font-size="14" fill="#718096" id="slot-03_content-slide_number-3" data-pptx-placeholder="slide-number">{{PAGE_NUM}}</text>
<!-- 底部企业名称 -->
<text x="1220" y="695" text-anchor="end" font-family="Arial, sans-serif" font-size="12" fill="#718096" fill-opacity="0.6">POWERCHINA</text>
</svg>

Before

Width:  |  Height:  |  Size: 3.0 KiB

@@ -1,92 +0,0 @@
<?xml version="1.0" encoding="UTF-8"?>
<svg xmlns="http://www.w3.org/2000/svg" width="1280" height="720" viewBox="0 0 1280 720" data-pptx-layout="04_ending" data-pptx-layout-name="Closing">
<!-- 模板: 结束页 - 中国电建经典风格 -->
<defs>
<!-- 深蓝背景渐变 -->
<linearGradient id="endBgGrad" x1="0%" y1="0%" x2="100%" y2="100%">
<stop offset="0%" style="stop-color:#00418D;stop-opacity:1" />
<stop offset="50%" style="stop-color:#003270;stop-opacity:1" />
<stop offset="100%" style="stop-color:#001F45;stop-opacity:1" />
</linearGradient>
<!-- 顶部装饰渐变 -->
<linearGradient id="topGrad" x1="0%" y1="0%" x2="100%" y2="0%">
<stop offset="0%" style="stop-color:#4A90D9;stop-opacity:1" />
<stop offset="100%" style="stop-color:#00418D;stop-opacity:1" />
</linearGradient>
<!-- 斜线图案 -->
<pattern id="diagLines" width="60" height="60" patternUnits="userSpaceOnUse" patternTransform="rotate(45)">
<line x1="0" y1="0" x2="0" y2="60" stroke="#FFFFFF" stroke-width="1" stroke-opacity="0.02"/>
</pattern>
</defs>
<!-- 背景 -->
<rect x="0" y="0" width="1280" height="720" fill="url(#endBgGrad)" id="layout-04_ending-background" data-pptx-layer="layout" data-pptx-editable="false"/>
<!-- 工程感斜线纹理 -->
<rect x="0" y="0" width="1280" height="720" fill="url(#diagLines)" id="full-canvas-04_ending-1"/>
<!-- 装饰元素 - 几何图案 -->
<circle cx="100" cy="120" r="200" fill="#FFFFFF" fill-opacity="0.02" />
<circle cx="1180" cy="600" r="250" fill="#FFFFFF" fill-opacity="0.02" />
<circle cx="640" cy="360" r="350" fill="#4A90D9" fill-opacity="0.02" />
<!-- 顶部渐变装饰线 -->
<rect x="0" y="0" width="1280" height="6" fill="url(#topGrad)" />
<!-- 网格装饰 -->
<line x1="0" y1="180" x2="1280" y2="180" stroke="#FFFFFF" stroke-width="1" stroke-opacity="0.03" />
<line x1="0" y1="360" x2="1280" y2="360" stroke="#FFFFFF" stroke-width="1" stroke-opacity="0.03" />
<line x1="0" y1="540" x2="1280" y2="540" stroke="#FFFFFF" stroke-width="1" stroke-opacity="0.03" />
<line x1="320" y1="0" x2="320" y2="720" stroke="#FFFFFF" stroke-width="1" stroke-opacity="0.03" />
<line x1="640" y1="0" x2="640" y2="720" stroke="#FFFFFF" stroke-width="1" stroke-opacity="0.03" />
<line x1="960" y1="0" x2="960" y2="720" stroke="#FFFFFF" stroke-width="1" stroke-opacity="0.03" />
<!-- 左侧装饰竖条 -->
<rect x="100" y="220" width="8" height="280" fill="#4A90D9" fill-opacity="0.6" />
<rect x="114" y="240" width="3" height="240" fill="#C41E3A" fill-opacity="0.5" />
<!-- 企业Logo区域占位 -->
<rect x="490" y="140" width="300" height="80" fill="#FFFFFF" fill-opacity="0.1" rx="4"/>
<text x="640" y="190" text-anchor="middle" font-family="Arial, sans-serif" font-size="28" font-weight="bold" fill="#FFFFFF" letter-spacing="6">
POWERCHINA
</text>
<!-- 感谢语(中文) -->
<text x="640" y="320" text-anchor="middle" font-family="Microsoft YaHei, SimHei, sans-serif" font-size="64" font-weight="bold" fill="#FFFFFF" letter-spacing="8">
{{THANK_YOU}}
</text>
<!-- 感谢语(英文) -->
<text x="640" y="380" text-anchor="middle" font-family="Arial, sans-serif" font-size="26" fill="#4A90D9" letter-spacing="6">
{{THANK_YOU_EN}}
</text>
<!-- 分隔线 -->
<line x1="490" y1="420" x2="580" y2="420" stroke="#4A90D9" stroke-width="2"/>
<rect x="590" y="415" width="100" height="10" fill="#C41E3A"/>
<line x1="700" y1="420" x2="790" y2="420" stroke="#4A90D9" stroke-width="2"/>
<!-- 欢迎指正 -->
<text x="640" y="480" text-anchor="middle" font-family="Microsoft YaHei, sans-serif" font-size="26" fill="#FFFFFF" fill-opacity="0.9">
欢迎批评指正
</text>
<!-- 单位信息 -->
<text x="640" y="540" text-anchor="middle" font-family="Microsoft YaHei, sans-serif" font-size="18" fill="#FFFFFF" fill-opacity="0.7">
{{AUTHOR}}
</text>
<!-- 联系信息 -->
<text x="640" y="580" text-anchor="middle" font-family="Microsoft YaHei, sans-serif" font-size="14" fill="#4A90D9" fill-opacity="0.8">
{{CONTACT_INFO}}
</text>
<!-- 底部装饰区域 -->
<rect x="0" y="680" width="1280" height="40" fill="#001F45" fill-opacity="0.6" />
<rect x="0" y="680" width="200" height="40" fill="#C41E3A" fill-opacity="0.8" />
<text x="640" y="707" text-anchor="middle" font-family="Microsoft YaHei, sans-serif" font-size="14" fill="#FFFFFF" fill-opacity="0.7">
中国电力建设集团有限公司
</text>
</svg>

Before

Width:  |  Height:  |  Size: 4.6 KiB

@@ -1,208 +0,0 @@
---
deck_id: 中国电建
kind: deck
native_structure_mode: template
summary: Engineering project reports, technical proposal presentations, business negotiations, corporate promotion, annual summaries.
canvas_format: ppt169
page_count: 5
primary_color: "#00418D"
---
# POWERCHINA (中国电建) Standard Template - Design Specification
> Suitable for PowerChina (China Power Construction Corporation) project reports, engineering showcases, business negotiations, corporate promotion, and similar scenarios.
---
## I. Template Overview
| Property | Description |
| -------------- | ---------------------------------------------------------------- |
| **Template Name** | 中国电建 |
| **Use Cases** | Engineering project reports, technical proposal presentations, business negotiations, corporate promotion, annual summaries |
| **Design Tone** | Professional, composed, international, state-owned enterprise style |
| **Theme Mode** | Light theme (white background + POWERCHINA blue accent) |
---
## II. Canvas Specification
| Property | Value |
| -------------- | ----------------------------- |
| **Format** | Standard 16:9 |
| **Dimensions** | 1280 × 720 px |
| **viewBox** | `0 0 1280 720` |
| **Page Margins** | Left/Right 60px, Top 80px, Bottom 40px |
| **Safe Area** | x: 60-1220, y: 80-680 |
---
## III. Color Scheme
### Primary Colors (POWERCHINA Brand Colors)
| Role | Color Value | Notes |
| -------------- | ----------- | ---------------------------------- |
| **POWERCHINA Blue** | `#00418D` | Primary color for title bars, accent blocks, decorative bars |
| **Deep Blue** | `#002B5C` | Chapter page background, gradient dark end |
| **Vibrant Blue** | `#0066CC` | Secondary accent, chart colors |
| **Sky Blue** | `#4A90D9` | Decorative accents, tertiary emphasis |
| **Background White** | `#FFFFFF` | Main page background |
| **Auxiliary Light Gray** | `#F4F6F8` | Secondary content background blocks |
### Auxiliary Colors (China Red Accents)
| Role | Color Value | Notes |
| -------------- | ----------- | ---------------------------------- |
| **China Red** | `#C41E3A` | Key data emphasis, decorative accents |
| **Gold** | `#C9A227` | Honors, achievements display |
### Text Colors
| Role | Color Value | Usage |
| -------------- | ----------- | ---------------------- |
| **Primary Text** | `#1A1A1A` | Body text, headings |
| **White Text** | `#FFFFFF` | Text on dark backgrounds |
| **Secondary Text** | `#4A5568` | Dimmed chapters, auxiliary descriptions |
| **Light Auxiliary** | `#718096` | Annotations, page numbers, hints |
---
## IV. Typography System
### Font Stack
**Font Stack**: `"Microsoft YaHei", "微软雅黑", "SimHei", Arial, sans-serif`
### Font Size Hierarchy
| Level | Usage | Size | Weight |
| ----- | ------------------ | ---- | ------- |
| H1 | Cover main title | 48px | Bold |
| H2 | Page heading | 28px | Bold |
| H3 | Section title / Subtitle | 24px | Bold |
| P | Body content | 18px | Regular |
| High | Emphasized data | 36px | Bold |
| Sub | Auxiliary notes | 14px | Regular |
---
## V. Page Structure
### Common Layout
| Area | Position/Height | Description |
| ---------- | --------------- | -------------------------------------- |
| **Top** | y=0, h=6px | POWERCHINA blue gradient bar spanning full width |
| **Title Bar** | y=30, h=50px | Chapter number block + Title text + Top-right Logo |
| **Content** | y=100, h=560px | Main content area |
| **Footer** | y=680, h=40px | Page number, company name, bottom decorative line |
**Required background layer**: Every page retains the template's full-canvas background layer.
---
## VI. Page Types
### 1. Cover Page (01_cover.svg)
- Deep blue gradient background + engineering-style diagonal line texture
- Left-side brand blue decorative bar
- Main title + subtitle (white)
- Company English name POWERCHINA
- Bottom red decorative bar
### 2. Table of Contents (02_toc.svg)
- White background + left-side blue decorative area
- Supports up to 5 chapters
- Numbered items + vertical line separator design
- Right side can display corporate data
### 3. Chapter Page (02_chapter.svg)
- Deep blue gradient background
- Large chapter number
- Chapter title + English subtitle
- Geometric grid decoration
### 4. Content Page (03_content.svg)
- White background
- Standard navigation bar
- Flexible content area
- Supports multiple layout patterns
### 5. Ending Page (04_ending.svg)
- Deep blue gradient background
- Corporate Logo area
- Thank-you message (Chinese & English)
- Corporate information
---
## VII. SVG Page Roster
| File | Role | Description |
|------|------|-------------|
| `01_cover.svg` | cover | Title slide; brand/project name + presenter + date |
| `02_chapter.svg` | chapter | Chapter divider page (large number + chapter title) |
| `02_toc.svg` | toc | Table of contents listing major sections |
| `03_content.svg` | content | Main content page; body of the deck |
| `04_ending.svg` | ending | Closing/thank-you page |
## VIII. Layout Patterns (Recommended)
### 1. Split Column
- Classic image-text mixed layout: left text / right image, or left image / right text.
- Recommended split ratio: 1:1 or 2:3.
### 2. Card Grid
- 3-column or 4-column card layout for showcasing project cases or qualifications.
- Card background recommended: auxiliary light gray `#F4F6F8`.
### 3. Process Flow
- Horizontal timeline or flowchart for displaying project progress.
- POWERCHINA blue as the main axis color, China Red for key milestone markers.
---
## IX. Spacing Guidelines
| Property | Value | Description |
| -------------- | ----- | ------------------------ |
| **Base Unit** | 8px | All spacing should be multiples of 8px |
| **Module Gap** | 32px | Standard gap between major modules |
| **Card Gap** | 24px | Gap between cards |
| **Inner Padding** | 24px | Padding inside cards |
| **Line Height** | 1.5 | Standard body line height |
---
## X. Placeholder Specification
| Placeholder | Description |
| -------------------- | ------------------ |
| `{{TITLE}}` | Main title |
| `{{SUBTITLE}}` | Subtitle |
| `{{AUTHOR}}` | Presenting organization |
| `{{PRESENTER}}` | Presenter |
| `{{CHAPTER_NUM}}` | Chapter number |
| `{{PAGE_NUM}}` | Page number |
| `{{DATE}}` | Date |
| `{{CHAPTER_TITLE}}` | Chapter title |
| `{{PAGE_TITLE}}` | Page title |
| `{{CONTENT_AREA}}` | Content area identifier |
| `{{TOC_ITEM_N_TITLE}}` | TOC item title |
| `{{TOC_ITEM_N_DESC}}` | TOC item description |
| `{{THANK_YOU}}` | Thank-you message |
| `{{CONTACT_INFO}}` | Contact information |
---
## XI. Usage Notes (Recommended)
1. **Logo Adaptation**: Cover and ending pages use inverted (white) Logo; content page upper-right uses color or inverted Logo.
2. **Image Assets**: Ensure the `images/` folder under the template directory contains necessary Logo files.
3. **Fonts**: Recommend installing "Microsoft YaHei" for optimal display.
@@ -1,54 +1,44 @@
<?xml version="1.0" encoding="UTF-8"?>
<svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" viewBox="0 0 1280 720" data-pptx-layout="01_cover" data-pptx-layout-name="Cover">
<!-- 模板: 封面页 - 中汽研风格 -->
<svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink"
width="1280" height="720" viewBox="0 0 1280 720"
data-pptx-master="catarc_dark_master" data-pptx-master-name="CATARC Dark"
data-pptx-layout="cover" data-pptx-layout-name="Cover">
<rect id="dark-master-background" x="0" y="0" width="1280" height="720" fill="#004098"
data-pptx-layer="master" data-pptx-editable="false"/>
<rect id="dark-master-top-rule" x="0" y="0" width="1280" height="4" fill="#FFFFFF" fill-opacity="0.35"
data-pptx-layer="master" data-pptx-editable="false"/>
<rect id="dark-master-bottom-rule" x="0" y="716" width="1280" height="4" fill="#FFFFFF" fill-opacity="0.35"
data-pptx-layer="master" data-pptx-editable="false"/>
<rect id="layout-01_cover-marker" data-pptx-layer="layout"
data-pptx-editable="false" x="0" y="0" width="1" height="1"
fill="#FFFFFF" fill-opacity="0" />
<!-- 背景层 - 使用封面背景图(AI生成或用户提供) -->
<image href="../images/{{COVER_BG_IMAGE}}" x="0" y="0" width="1280" height="720"
preserveAspectRatio="xMidYMid slice" id="semantic-01_cover-background-1" data-pptx-role="background" />
<!-- 半透明遮罩层 - 增强文字可读性 -->
<rect id="cover-overlay" x="0" y="0" width="1280" height="720"
fill="#001F4D" fill-opacity="0.4" transform="translate(0 0)" />
<!-- 顶部装饰线 -->
<rect x="0" y="0" width="1280" height="4" fill="#FFFFFF" fill-opacity="0.3" />
<!-- 大型Logo - 居中偏上 -->
<image href="../images/{{LOGO_LARGE}}" x="344" y="120" width="592" height="238"
preserveAspectRatio="xMidYMid meet" id="semantic-01_cover-logo-1" data-pptx-role="logo" />
<!-- 主标题区域 -->
<text x="640" y="440" text-anchor="middle" font-family="Microsoft YaHei, SimHei, sans-serif" font-size="48"
font-weight="bold" fill="#FFFFFF" id="slot-01_cover-title-1" data-pptx-placeholder="title">
{{TITLE}}
</text>
<!-- 副标题 -->
<text x="640" y="500" text-anchor="middle" font-family="Microsoft YaHei, Arial, sans-serif" font-size="26"
fill="#FFFFFF" fill-opacity="0.85" id="slot-01_cover-subtitle-2" data-pptx-placeholder="subtitle">
{{SUBTITLE}}
</text>
<!-- 分隔线 -->
<line x1="440" y1="540" x2="840" y2="540" stroke="#FFFFFF" stroke-width="1" stroke-opacity="0.4" />
<!-- 单位名称(中文) -->
<text x="640" y="590" text-anchor="middle" font-family="Microsoft YaHei, Arial, sans-serif" font-size="22"
fill="#FFFFFF" fill-opacity="0.9">
{{AUTHOR}}
</text>
<!-- 单位名称(英文) - 可选 -->
<text x="640" y="625" text-anchor="middle" font-family="Arial, sans-serif" font-size="16" fill="#FFFFFF"
fill-opacity="0.7">
{{AUTHOR_EN}}
</text>
<!-- 底部装饰线 -->
<rect x="0" y="716" width="1280" height="4" fill="#004098" />
<image id="cover-logo" x="344" y="92" width="592" height="238"
xlink:href="../images/大型 logo.png" preserveAspectRatio="xMidYMid meet"
data-pptx-layer="layout" data-pptx-editable="false"/>
<line id="cover-separator" x1="440" y1="542" x2="840" y2="542" stroke="#FFFFFF"
stroke-width="1" stroke-opacity="0.4" data-pptx-layer="layout" data-pptx-editable="false"/>
<g id="cover-title-slot" data-pptx-placeholder="title"
data-pptx-placeholder-bounds="160 356 960 92">
<text id="cover-title-carrier" data-pptx-placeholder-carrier="true"
x="640" y="416" text-anchor="middle" fill="#FFFFFF"
font-family="Microsoft YaHei, SimHei, Arial, sans-serif"
font-size="48" font-weight="700">{{TITLE}}</text>
</g>
<g id="cover-subtitle-slot" data-pptx-placeholder="subtitle" data-pptx-placeholder-idx="1"
data-pptx-placeholder-bounds="220 452 840 56">
<text id="cover-subtitle-carrier" data-pptx-placeholder-carrier="true"
x="640" y="490" text-anchor="middle" fill="#FFFFFF" fill-opacity="0.86"
font-family="Microsoft YaHei, Arial, sans-serif" font-size="26">{{SUBTITLE}}</text>
</g>
<g id="cover-author-slot" data-pptx-placeholder="body" data-pptx-placeholder-idx="2"
data-pptx-placeholder-bounds="300 560 680 44">
<text id="cover-author-carrier" data-pptx-placeholder-carrier="true"
x="640" y="590" text-anchor="middle" fill="#FFFFFF" fill-opacity="0.9"
font-family="Microsoft YaHei, Arial, sans-serif" font-size="22">{{AUTHOR}}</text>
</g>
<g id="cover-footer-slot" data-pptx-placeholder="footer" data-pptx-placeholder-idx="3"
data-pptx-placeholder-bounds="300 606 680 32">
<text id="cover-footer-carrier" data-pptx-placeholder-carrier="true"
x="640" y="628" text-anchor="middle" fill="#FFFFFF" fill-opacity="0.7"
font-family="Arial, Microsoft YaHei, sans-serif" font-size="16">{{AUTHOR_EN}}</text>
</g>
</svg>

Before

Width:  |  Height:  |  Size: 2.4 KiB

After

Width:  |  Height:  |  Size: 2.6 KiB

@@ -1,47 +1,41 @@
<?xml version="1.0" encoding="UTF-8"?>
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 1280 720" data-pptx-layout="02_chapter" data-pptx-layout-name="Section">
<!-- 模板: 章节页 - 中汽研风格 -->
<defs>
<!-- 深蓝背景渐变 -->
<linearGradient id="gradChapter" x1="0%" y1="0%" x2="100%" y2="100%">
<stop offset="0%" style="stop-color:#004098;stop-opacity:1" />
<stop offset="100%" style="stop-color:#002A55;stop-opacity:1" />
</linearGradient>
</defs>
<!-- 背景 -->
<rect width="1280" height="720" fill="url(#gradChapter)" id="layout-02_chapter-background" data-pptx-layer="layout" data-pptx-editable="false"/>
<!-- 装饰元素 - 几何图案 -->
<circle cx="1200" cy="100" r="200" fill="#FFFFFF" fill-opacity="0.03"/>
<circle cx="100" cy="620" r="250" fill="#FFFFFF" fill-opacity="0.03"/>
<!-- 水平装饰线 -->
<line x1="100" y1="360" x2="1180" y2="360" stroke="white" stroke-width="1" stroke-opacity="0.1"/>
<!-- 章节内容 -->
<g transform="translate(640, 360)">
<!-- 章节编号 - 大号半透明背景 -->
<text x="0" y="-40" text-anchor="middle" font-family="Arial" font-size="120" font-weight="bold" fill="white" fill-opacity="0.08">
0{{CHAPTER_NUM}}
</text>
<!-- 装饰方块 -->
<rect x="-40" y="10" width="80" height="6" fill="#FFFFFF"/>
<!-- 章节标题 -->
<text x="0" y="80" text-anchor="middle" font-family="Microsoft YaHei, SimHei, sans-serif" font-size="48" font-weight="bold" fill="white">
{{CHAPTER_TITLE}}
</text>
<!-- 英文标题/副标题 -->
<text x="0" y="130" text-anchor="middle" font-family="Arial" font-size="24" fill="#FFFFFF" fill-opacity="0.7" letter-spacing="2">
{{CHAPTER_SUBTITLE}}
</text>
</g>
<!-- 底部装饰线 -->
<rect x="0" y="716" width="1280" height="4" fill="#FFFFFF" fill-opacity="0.3"/>
<svg xmlns="http://www.w3.org/2000/svg"
width="1280" height="720" viewBox="0 0 1280 720"
data-pptx-master="catarc_dark_master" data-pptx-master-name="CATARC Dark"
data-pptx-layout="section" data-pptx-layout-name="Section Header">
<rect id="dark-master-background" x="0" y="0" width="1280" height="720" fill="#004098"
data-pptx-layer="master" data-pptx-editable="false"/>
<rect id="dark-master-top-rule" x="0" y="0" width="1280" height="4" fill="#FFFFFF" fill-opacity="0.35"
data-pptx-layer="master" data-pptx-editable="false"/>
<rect id="dark-master-bottom-rule" x="0" y="716" width="1280" height="4" fill="#FFFFFF" fill-opacity="0.35"
data-pptx-layer="master" data-pptx-editable="false"/>
<circle id="section-circle-right" cx="1200" cy="100" r="200" fill="#FFFFFF" fill-opacity="0.03"
data-pptx-layer="layout" data-pptx-editable="false"/>
<circle id="section-circle-left" cx="100" cy="620" r="250" fill="#FFFFFF" fill-opacity="0.03"
data-pptx-layer="layout" data-pptx-editable="false"/>
<line id="section-horizontal-rule" x1="100" y1="360" x2="1180" y2="360"
stroke="#FFFFFF" stroke-width="1" stroke-opacity="0.12"
data-pptx-layer="layout" data-pptx-editable="false"/>
<rect id="section-title-accent" x="600" y="370" width="80" height="6" fill="#FFFFFF"
data-pptx-layer="layout" data-pptx-editable="false"/>
<g id="section-number-slot" data-pptx-placeholder="body" data-pptx-placeholder-idx="1"
data-pptx-placeholder-bounds="440 176 400 152">
<text id="section-number-carrier" data-pptx-placeholder-carrier="true"
x="640" y="288" text-anchor="middle" fill="#FFFFFF" fill-opacity="0.1"
font-family="Arial, sans-serif" font-size="120" font-weight="700">{{CHAPTER_NUM}}</text>
</g>
<g id="section-title-slot" data-pptx-placeholder="title"
data-pptx-placeholder-bounds="180 398 920 86">
<text id="section-title-carrier" data-pptx-placeholder-carrier="true"
x="640" y="454" text-anchor="middle" fill="#FFFFFF"
font-family="Microsoft YaHei, SimHei, Arial, sans-serif"
font-size="48" font-weight="700">{{CHAPTER_TITLE}}</text>
</g>
<g id="section-subtitle-slot" data-pptx-placeholder="subtitle" data-pptx-placeholder-idx="2"
data-pptx-placeholder-bounds="240 494 800 50">
<text id="section-subtitle-carrier" data-pptx-placeholder-carrier="true"
x="640" y="528" text-anchor="middle" fill="#FFFFFF" fill-opacity="0.72"
font-family="Arial, Microsoft YaHei, sans-serif" font-size="24">{{CHAPTER_SUBTITLE}}</text>
</g>
</svg>

Before

Width:  |  Height:  |  Size: 2.0 KiB

After

Width:  |  Height:  |  Size: 2.5 KiB

@@ -1,73 +1,114 @@
<?xml version="1.0" encoding="UTF-8"?>
<svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" viewBox="0 0 1280 720" data-pptx-layout="02_toc" data-pptx-layout-name="Agenda">
<!-- 模板: 目录页 - 中汽研风格 -->
<!-- 白色背景 -->
<rect x="0" y="0" width="1280" height="720" fill="#FFFFFF" id="layout-02_toc-background" data-pptx-layer="layout" data-pptx-editable="false"/>
<!-- 顶部深蓝色装饰线 -->
<rect x="0" y="0" width="1280" height="4" fill="#004098"/>
<!-- 导航栏区域 -->
<rect x="60" y="30" width="50" height="50" fill="#004098"/>
<text x="85" y="65" text-anchor="middle" font-family="Arial, sans-serif" font-size="24" font-weight="bold" fill="#FFFFFF"></text>
<text x="130" y="65" font-family="Microsoft YaHei, SimHei, sans-serif" font-size="28" font-weight="bold" fill="#333333">目 录</text>
<image href="../images/{{LOGO_HEADER}}" x="1107" y="30" width="113" height="50" preserveAspectRatio="xMidYMid meet" id="semantic-02_toc-logo-1" data-pptx-role="logo"/>
<!-- 左侧装饰竖线 -->
<rect x="300" y="140" width="4" height="480" fill="#004098"/>
<!-- 目录项 - 第1章 -->
<g>
<text x="330" y="195" font-family="Microsoft YaHei, sans-serif" font-size="24" font-weight="bold" fill="#004098">01</text>
<text x="385" y="195" font-family="Microsoft YaHei, sans-serif" font-size="24" font-weight="bold" fill="#004098">||</text>
<text x="430" y="195" font-family="Microsoft YaHei, sans-serif" font-size="24" font-weight="bold" fill="#333333">{{TOC_ITEM_1_TITLE}}</text>
<text x="430" y="228" font-family="Microsoft YaHei, sans-serif" font-size="16" fill="#666666">{{TOC_ITEM_1_DESC}}</text>
</g>
<!-- 目录项 - 第2章 -->
<g>
<text x="330" y="295" font-family="Microsoft YaHei, sans-serif" font-size="24" font-weight="bold" fill="#004098">02</text>
<text x="385" y="295" font-family="Microsoft YaHei, sans-serif" font-size="24" font-weight="bold" fill="#004098">||</text>
<text x="430" y="295" font-family="Microsoft YaHei, sans-serif" font-size="24" font-weight="bold" fill="#333333">{{TOC_ITEM_2_TITLE}}</text>
<text x="430" y="328" font-family="Microsoft YaHei, sans-serif" font-size="16" fill="#666666">{{TOC_ITEM_2_DESC}}</text>
</g>
<!-- 目录项 - 第3章 -->
<g>
<text x="330" y="395" font-family="Microsoft YaHei, sans-serif" font-size="24" font-weight="bold" fill="#004098">03</text>
<text x="385" y="395" font-family="Microsoft YaHei, sans-serif" font-size="24" font-weight="bold" fill="#004098">||</text>
<text x="430" y="395" font-family="Microsoft YaHei, sans-serif" font-size="24" font-weight="bold" fill="#333333">{{TOC_ITEM_3_TITLE}}</text>
<text x="430" y="428" font-family="Microsoft YaHei, sans-serif" font-size="16" fill="#666666">{{TOC_ITEM_3_DESC}}</text>
</g>
<!-- 目录项 - 第4章 -->
<g>
<text x="330" y="495" font-family="Microsoft YaHei, sans-serif" font-size="24" font-weight="bold" fill="#004098">04</text>
<text x="385" y="495" font-family="Microsoft YaHei, sans-serif" font-size="24" font-weight="bold" fill="#004098">||</text>
<text x="430" y="495" font-family="Microsoft YaHei, sans-serif" font-size="24" font-weight="bold" fill="#333333">{{TOC_ITEM_4_TITLE}}</text>
<text x="430" y="528" font-family="Microsoft YaHei, sans-serif" font-size="16" fill="#666666">{{TOC_ITEM_4_DESC}}</text>
</g>
<!-- 目录项 - 第5章 -->
<g>
<text x="330" y="595" font-family="Microsoft YaHei, sans-serif" font-size="24" font-weight="bold" fill="#004098">05</text>
<text x="385" y="595" font-family="Microsoft YaHei, sans-serif" font-size="24" font-weight="bold" fill="#004098">||</text>
<text x="430" y="595" font-family="Microsoft YaHei, sans-serif" font-size="24" font-weight="bold" fill="#333333">{{TOC_ITEM_5_TITLE}}</text>
<text x="430" y="628" font-family="Microsoft YaHei, sans-serif" font-size="16" fill="#666666">{{TOC_ITEM_5_DESC}}</text>
</g>
<!-- 右侧装饰元素(可选统计区) -->
<rect x="900" y="180" width="280" height="400" fill="#F5F5F5" fill-opacity="0.5" rx="8"/>
<text x="1040" y="360" text-anchor="middle" font-family="Arial, sans-serif" font-size="120" font-weight="bold" fill="#004098" fill-opacity="0.1">{{STAT_NUMBER_1}}</text>
<text x="1040" y="400" text-anchor="middle" font-family="Microsoft YaHei, sans-serif" font-size="18" fill="#666666">{{STAT_LABEL_1}}</text>
<text x="1040" y="450" text-anchor="middle" font-family="Arial, sans-serif" font-size="48" font-weight="bold" fill="#004098" fill-opacity="0.15">{{STAT_NUMBER_2}}</text>
<text x="1040" y="480" text-anchor="middle" font-family="Microsoft YaHei, sans-serif" font-size="16" fill="#666666">{{STAT_LABEL_2}}</text>
<!-- 底部装饰线 -->
<rect x="0" y="716" width="1280" height="4" fill="#004098"/>
<!-- 页码 -->
<text x="1220" y="705" text-anchor="end" font-family="Arial, sans-serif" font-size="14" fill="#999999" id="slot-02_toc-slide_number-1" data-pptx-placeholder="slide-number">{{PAGE_NUM}}</text>
<svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink"
width="1280" height="720" viewBox="0 0 1280 720"
data-pptx-master="catarc_light_master" data-pptx-master-name="CATARC Light"
data-pptx-layout="agenda" data-pptx-layout-name="Agenda">
<rect id="light-master-background" x="0" y="0" width="1280" height="720" fill="#FFFFFF"
data-pptx-layer="master" data-pptx-editable="false"/>
<rect id="light-master-top-rule" x="0" y="0" width="1280" height="4" fill="#004098"
data-pptx-layer="master" data-pptx-editable="false"/>
<rect id="light-master-number-block" x="60" y="30" width="50" height="50" fill="#004098"
data-pptx-layer="master" data-pptx-editable="false"/>
<image id="light-master-logo" x="1107" y="30" width="113" height="50"
xlink:href="../images/右上角 logo.png" preserveAspectRatio="xMidYMid meet"
data-pptx-layer="master" data-pptx-editable="false"/>
<line id="light-master-header-rule" x1="60" y1="95" x2="1220" y2="95" stroke="#E0E0E0"
stroke-width="1" data-pptx-layer="master" data-pptx-editable="false"/>
<rect id="light-master-bottom-rule" x="0" y="716" width="1280" height="4" fill="#004098"
data-pptx-layer="master" data-pptx-editable="false"/>
<text id="agenda-title-mark" x="85" y="65" text-anchor="middle" fill="#FFFFFF"
font-family="Microsoft YaHei, Arial, sans-serif" font-size="24" font-weight="700"
data-pptx-layer="layout" data-pptx-editable="false">目</text>
<rect id="agenda-left-rule" x="300" y="140" width="4" height="480" fill="#004098"
data-pptx-layer="layout" data-pptx-editable="false"/>
<text id="agenda-number-1" x="330" y="198" fill="#004098"
font-family="Arial, sans-serif" font-size="24" font-weight="700"
data-pptx-layer="layout" data-pptx-editable="false">01</text>
<text id="agenda-separator-1" x="385" y="198" fill="#004098"
font-family="Arial, sans-serif" font-size="24" font-weight="700"
data-pptx-layer="layout" data-pptx-editable="false">||</text>
<text id="agenda-number-2" x="330" y="298" fill="#004098"
font-family="Arial, sans-serif" font-size="24" font-weight="700"
data-pptx-layer="layout" data-pptx-editable="false">02</text>
<text id="agenda-separator-2" x="385" y="298" fill="#004098"
font-family="Arial, sans-serif" font-size="24" font-weight="700"
data-pptx-layer="layout" data-pptx-editable="false">||</text>
<text id="agenda-number-3" x="330" y="398" fill="#004098"
font-family="Arial, sans-serif" font-size="24" font-weight="700"
data-pptx-layer="layout" data-pptx-editable="false">03</text>
<text id="agenda-separator-3" x="385" y="398" fill="#004098"
font-family="Arial, sans-serif" font-size="24" font-weight="700"
data-pptx-layer="layout" data-pptx-editable="false">||</text>
<text id="agenda-number-4" x="330" y="498" fill="#004098"
font-family="Arial, sans-serif" font-size="24" font-weight="700"
data-pptx-layer="layout" data-pptx-editable="false">04</text>
<text id="agenda-separator-4" x="385" y="498" fill="#004098"
font-family="Arial, sans-serif" font-size="24" font-weight="700"
data-pptx-layer="layout" data-pptx-editable="false">||</text>
<text id="agenda-number-5" x="330" y="598" fill="#004098"
font-family="Arial, sans-serif" font-size="24" font-weight="700"
data-pptx-layer="layout" data-pptx-editable="false">05</text>
<text id="agenda-separator-5" x="385" y="598" fill="#004098"
font-family="Arial, sans-serif" font-size="24" font-weight="700"
data-pptx-layer="layout" data-pptx-editable="false">||</text>
<rect id="agenda-stat-panel" x="900" y="180" width="280" height="400" rx="12"
fill="#F5F7FA" stroke="#E0E5EA" stroke-width="1"
data-pptx-layer="layout" data-pptx-editable="false"/>
<rect id="agenda-stat-accent" x="900" y="180" width="6" height="400" fill="#004098"
data-pptx-layer="layout" data-pptx-editable="false"/>
<g id="agenda-title-slot" data-pptx-placeholder="title"
data-pptx-placeholder-bounds="130 32 760 48">
<text id="agenda-title-carrier" data-pptx-placeholder-carrier="true"
x="130" y="65" fill="#333333"
font-family="Microsoft YaHei, SimHei, Arial, sans-serif"
font-size="28" font-weight="700">{{PAGE_TITLE}}</text>
</g>
<g id="agenda-item-1-slot" data-pptx-placeholder="body" data-pptx-placeholder-idx="1"
data-pptx-placeholder-bounds="430 160 420 72">
<text id="agenda-item-1-carrier" data-pptx-placeholder-carrier="true"
x="430" y="196" fill="#333333"
font-family="Microsoft YaHei, Arial, sans-serif" font-size="24"
font-weight="700">{{TOC_ITEM_1_TITLE}}</text>
</g>
<g id="agenda-item-2-slot" data-pptx-placeholder="body" data-pptx-placeholder-idx="2"
data-pptx-placeholder-bounds="430 260 420 72">
<text id="agenda-item-2-carrier" data-pptx-placeholder-carrier="true"
x="430" y="296" fill="#333333"
font-family="Microsoft YaHei, Arial, sans-serif" font-size="24"
font-weight="700">{{TOC_ITEM_2_TITLE}}</text>
</g>
<g id="agenda-item-3-slot" data-pptx-placeholder="body" data-pptx-placeholder-idx="3"
data-pptx-placeholder-bounds="430 360 420 72">
<text id="agenda-item-3-carrier" data-pptx-placeholder-carrier="true"
x="430" y="396" fill="#333333"
font-family="Microsoft YaHei, Arial, sans-serif" font-size="24"
font-weight="700">{{TOC_ITEM_3_TITLE}}</text>
</g>
<g id="agenda-item-4-slot" data-pptx-placeholder="body" data-pptx-placeholder-idx="4"
data-pptx-placeholder-bounds="430 460 420 72">
<text id="agenda-item-4-carrier" data-pptx-placeholder-carrier="true"
x="430" y="496" fill="#333333"
font-family="Microsoft YaHei, Arial, sans-serif" font-size="24"
font-weight="700">{{TOC_ITEM_4_TITLE}}</text>
</g>
<g id="agenda-item-5-slot" data-pptx-placeholder="body" data-pptx-placeholder-idx="5"
data-pptx-placeholder-bounds="430 560 420 72">
<text id="agenda-item-5-carrier" data-pptx-placeholder-carrier="true"
x="430" y="596" fill="#333333"
font-family="Microsoft YaHei, Arial, sans-serif" font-size="24"
font-weight="700">{{TOC_ITEM_5_TITLE}}</text>
</g>
<g id="agenda-stat-slot" data-pptx-placeholder="object" data-pptx-placeholder-idx="6"
data-pptx-placeholder-bounds="928 208 224 344">
<text id="agenda-stat-carrier" data-pptx-placeholder-carrier="true"
x="928" y="242" fill="#7890A8"
font-family="Microsoft YaHei, Arial, sans-serif" font-size="18">{{CONTENT_AREA}}</text>
</g>
<g id="agenda-slide-number-slot" data-pptx-placeholder="slide-number"
data-pptx-placeholder-idx="7" data-pptx-placeholder-bounds="1140 682 80 24">
<text id="agenda-slide-number-carrier" data-pptx-placeholder-carrier="true"
x="1220" y="702" text-anchor="end" fill="#999999"
font-family="Arial, sans-serif" font-size="14">{{PAGE_NUM}}</text>
</g>
</svg>

Before

Width:  |  Height:  |  Size: 5.1 KiB

After

Width:  |  Height:  |  Size: 6.8 KiB

@@ -1,57 +1,50 @@
<?xml version="1.0" encoding="UTF-8"?>
<svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" viewBox="0 0 1280 720" data-pptx-layout="03_content" data-pptx-layout-name="Content">
<!-- 模板: 内容页 - 中汽研风格 -->
<!-- 白色背景 -->
<rect x="0" y="0" width="1280" height="720" fill="#FFFFFF" id="layout-03_content-background" data-pptx-layer="layout" data-pptx-editable="false"/>
<!-- 顶部深蓝色装饰线 -->
<rect x="0" y="0" width="1280" height="4" fill="#004098" />
<!-- 页眉导航栏 -->
<!-- 章节序号块 - 深蓝色正方形 -->
<rect x="60" y="30" width="50" height="50" fill="#004098" />
<text x="85" y="65" text-anchor="middle" font-family="Arial, sans-serif" font-size="24" font-weight="bold"
fill="#FFFFFF">{{CHAPTER_NUM}}</text>
<!-- 页面标题 -->
<text x="130" y="65" font-family="Microsoft YaHei, SimHei, sans-serif" font-size="28" font-weight="bold"
fill="#333333" id="slot-03_content-title-1" data-pptx-placeholder="title">{{PAGE_TITLE}}</text>
<!-- 右上角Logo -->
<image href="../images/{{LOGO_HEADER}}" x="1107" y="30" width="113" height="50"
preserveAspectRatio="xMidYMid meet" id="semantic-03_content-logo-1" data-pptx-role="logo" />
<!-- 内容区域 - 灵活布局,由 Executor 根据实际内容自由设计 -->
<!-- 可使用的布局模式:
- 单栏文字列表
- 左右双栏对比
- 卡片式分块(如 2×2 四宫格)
- 图文混排(左图右文、上图下文、通栏图)
- 表格
- 时间轴
- 流程图
-->
<rect x="60" y="100" width="1160" height="570" fill="none" stroke="#E0E0E0" stroke-width="2"
stroke-dasharray="8,8" />
<text x="640" y="365" text-anchor="middle" fill="#CBD5E1" font-size="18" font-family="Microsoft YaHei, sans-serif" id="slot-03_content-body-2" data-pptx-placeholder="body">
{{CONTENT_AREA}}
</text>
<text x="640" y="400" text-anchor="middle" fill="#CBD5E1" font-size="14" font-family="Microsoft YaHei, sans-serif">
(由 Executor 根据实际内容自由布局)
</text>
<!-- 常用设计元素参考 -->
<!-- 色块容器: <rect fill="#F5F5F5" rx="4"/> -->
<!-- 强调色块: <rect fill="#004098"/> -->
<!-- 圆点列表: <circle r="5" fill="#004098"/> -->
<!-- 分隔线: <line stroke="#E0E0E0" stroke-width="1"/> -->
<!-- 底部装饰线 -->
<rect x="0" y="716" width="1280" height="4" fill="#004098" />
<!-- 页码 -->
<text x="1220" y="705" text-anchor="end" font-family="Arial, sans-serif" font-size="14"
fill="#999999" id="slot-03_content-slide_number-3" data-pptx-placeholder="slide-number">{{PAGE_NUM}}</text>
<svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink"
width="1280" height="720" viewBox="0 0 1280 720"
data-pptx-master="catarc_light_master" data-pptx-master-name="CATARC Light"
data-pptx-layout="content" data-pptx-layout-name="Title and Content">
<rect id="light-master-background" x="0" y="0" width="1280" height="720" fill="#FFFFFF"
data-pptx-layer="master" data-pptx-editable="false"/>
<rect id="light-master-top-rule" x="0" y="0" width="1280" height="4" fill="#004098"
data-pptx-layer="master" data-pptx-editable="false"/>
<rect id="light-master-number-block" x="60" y="30" width="50" height="50" fill="#004098"
data-pptx-layer="master" data-pptx-editable="false"/>
<image id="light-master-logo" x="1107" y="30" width="113" height="50"
xlink:href="../images/右上角 logo.png" preserveAspectRatio="xMidYMid meet"
data-pptx-layer="master" data-pptx-editable="false"/>
<line id="light-master-header-rule" x1="60" y1="95" x2="1220" y2="95" stroke="#E0E0E0"
stroke-width="1" data-pptx-layer="master" data-pptx-editable="false"/>
<rect id="light-master-bottom-rule" x="0" y="716" width="1280" height="4" fill="#004098"
data-pptx-layer="master" data-pptx-editable="false"/>
<rect id="content-panel" x="60" y="110" width="1160" height="550" rx="10"
fill="#F8FAFC" stroke="#E0E0E0" stroke-width="1"
data-pptx-layer="layout" data-pptx-editable="false"/>
<rect id="content-panel-accent" x="60" y="110" width="6" height="550" fill="#004098"
data-pptx-layer="layout" data-pptx-editable="false"/>
<g id="content-chapter-slot" data-pptx-placeholder="body" data-pptx-placeholder-idx="1"
data-pptx-placeholder-bounds="60 30 50 50">
<text id="content-chapter-carrier" data-pptx-placeholder-carrier="true"
x="85" y="65" text-anchor="middle" fill="#FFFFFF"
font-family="Arial, sans-serif" font-size="24" font-weight="700">{{CHAPTER_NUM}}</text>
</g>
<g id="content-title-slot" data-pptx-placeholder="title"
data-pptx-placeholder-bounds="130 32 920 48">
<text id="content-title-carrier" data-pptx-placeholder-carrier="true"
x="130" y="65" fill="#333333"
font-family="Microsoft YaHei, SimHei, Arial, sans-serif"
font-size="28" font-weight="700">{{PAGE_TITLE}}</text>
</g>
<g id="content-object-slot" data-pptx-placeholder="object" data-pptx-placeholder-idx="2"
data-pptx-placeholder-bounds="88 138 1104 494">
<text id="content-object-carrier" data-pptx-placeholder-carrier="true"
x="88" y="172" fill="#7890A8"
font-family="Microsoft YaHei, Arial, sans-serif" font-size="18">{{CONTENT_AREA}}</text>
</g>
<g id="content-slide-number-slot" data-pptx-placeholder="slide-number"
data-pptx-placeholder-idx="3" data-pptx-placeholder-bounds="1140 682 80 24">
<text id="content-slide-number-carrier" data-pptx-placeholder-carrier="true"
x="1220" y="702" text-anchor="end" fill="#999999"
font-family="Arial, sans-serif" font-size="14">{{PAGE_NUM}}</text>
</g>
</svg>

Before

Width:  |  Height:  |  Size: 2.7 KiB

After

Width:  |  Height:  |  Size: 3.0 KiB

@@ -1,62 +1,70 @@
<?xml version="1.0" encoding="UTF-8"?>
<svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" viewBox="0 0 1280 720" data-pptx-layout="04_ending" data-pptx-layout-name="Closing">
<!-- 模板: 结束页 - 中汽研风格 -->
<svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink"
width="1280" height="720" viewBox="0 0 1280 720"
data-pptx-master="catarc_dark_master" data-pptx-master-name="CATARC Dark"
data-pptx-layout="closing" data-pptx-layout-name="Closing">
<rect id="dark-master-background" x="0" y="0" width="1280" height="720" fill="#004098"
data-pptx-layer="master" data-pptx-editable="false"/>
<rect id="dark-master-top-rule" x="0" y="0" width="1280" height="4" fill="#FFFFFF" fill-opacity="0.35"
data-pptx-layer="master" data-pptx-editable="false"/>
<rect id="dark-master-bottom-rule" x="0" y="716" width="1280" height="4" fill="#FFFFFF" fill-opacity="0.35"
data-pptx-layer="master" data-pptx-editable="false"/>
<!-- 深蓝色背景 -->
<rect x="0" y="0" width="1280" height="720" fill="#004098" id="layout-04_ending-background" data-pptx-layer="layout" data-pptx-editable="false"/>
<!-- 装饰元素 - 几何图案(低透明度圆形) -->
<circle cx="100" cy="100" r="200" fill="#FFFFFF" fill-opacity="0.03" />
<circle cx="1200" cy="600" r="300" fill="#FFFFFF" fill-opacity="0.03" />
<circle cx="640" cy="360" r="400" fill="#FFFFFF" fill-opacity="0.02" />
<!-- 顶部装饰线 -->
<rect x="0" y="0" width="1280" height="4" fill="#FFFFFF" fill-opacity="0.3" />
<!-- 网格装饰 - 营造专业氛围 -->
<line x1="0" y1="180" x2="1280" y2="180" stroke="#FFFFFF" stroke-width="1" stroke-opacity="0.05" />
<line x1="0" y1="360" x2="1280" y2="360" stroke="#FFFFFF" stroke-width="1" stroke-opacity="0.05" />
<line x1="0" y1="540" x2="1280" y2="540" stroke="#FFFFFF" stroke-width="1" stroke-opacity="0.05" />
<line x1="320" y1="0" x2="320" y2="720" stroke="#FFFFFF" stroke-width="1" stroke-opacity="0.05" />
<line x1="640" y1="0" x2="640" y2="720" stroke="#FFFFFF" stroke-width="1" stroke-opacity="0.05" />
<line x1="960" y1="0" x2="960" y2="720" stroke="#FFFFFF" stroke-width="1" stroke-opacity="0.05" />
<!-- 大型Logo - 居中 -->
<image href="../images/{{LOGO_LARGE}}" x="344" y="160" width="592" height="238"
preserveAspectRatio="xMidYMid meet" id="semantic-04_ending-logo-1" data-pptx-role="logo" />
<!-- 感谢语(中文) -->
<text x="640" y="480" text-anchor="middle" font-family="Microsoft YaHei, SimHei, sans-serif" font-size="56"
font-weight="bold" fill="#FFFFFF">
{{THANK_YOU}}
</text>
<!-- 感谢语(英文) -->
<text x="640" y="530" text-anchor="middle" font-family="Arial, Georgia, serif" font-size="24" fill="#FFFFFF"
fill-opacity="0.7">
{{THANK_YOU_EN}}
</text>
<!-- 分隔线 -->
<line x1="540" y1="560" x2="740" y2="560" stroke="#FFFFFF" stroke-width="1" stroke-opacity="0.3" />
<!-- 单位信息(中文) -->
<text x="640" y="610" text-anchor="middle" font-family="Microsoft YaHei, sans-serif" font-size="18" fill="#FFFFFF"
fill-opacity="0.85">
{{CONTACT_INFO}}
</text>
<!-- 单位信息(英文) -->
<text x="640" y="640" text-anchor="middle" font-family="Arial, sans-serif" font-size="14" fill="#FFFFFF"
fill-opacity="0.6">
{{AUTHOR}}
</text>
<!-- 底部信息区 -->
<rect x="0" y="680" width="1280" height="40" fill="#FFFFFF" fill-opacity="0.1" />
<text x="640" y="707" text-anchor="middle" font-family="Microsoft YaHei, sans-serif" font-size="14" fill="#FFFFFF"
fill-opacity="0.6">
{{ENDING_SUBTITLE}}
</text>
<circle id="closing-circle-left" cx="100" cy="100" r="200" fill="#FFFFFF" fill-opacity="0.03"
data-pptx-layer="layout" data-pptx-editable="false"/>
<circle id="closing-circle-right" cx="1200" cy="600" r="300" fill="#FFFFFF" fill-opacity="0.03"
data-pptx-layer="layout" data-pptx-editable="false"/>
<circle id="closing-circle-center" cx="640" cy="360" r="400" fill="#FFFFFF" fill-opacity="0.02"
data-pptx-layer="layout" data-pptx-editable="false"/>
<line id="closing-grid-horizontal-1" x1="0" y1="180" x2="1280" y2="180"
stroke="#FFFFFF" stroke-width="1" stroke-opacity="0.05"
data-pptx-layer="layout" data-pptx-editable="false"/>
<line id="closing-grid-horizontal-2" x1="0" y1="360" x2="1280" y2="360"
stroke="#FFFFFF" stroke-width="1" stroke-opacity="0.05"
data-pptx-layer="layout" data-pptx-editable="false"/>
<line id="closing-grid-horizontal-3" x1="0" y1="540" x2="1280" y2="540"
stroke="#FFFFFF" stroke-width="1" stroke-opacity="0.05"
data-pptx-layer="layout" data-pptx-editable="false"/>
<line id="closing-grid-vertical-1" x1="320" y1="0" x2="320" y2="720"
stroke="#FFFFFF" stroke-width="1" stroke-opacity="0.05"
data-pptx-layer="layout" data-pptx-editable="false"/>
<line id="closing-grid-vertical-2" x1="640" y1="0" x2="640" y2="720"
stroke="#FFFFFF" stroke-width="1" stroke-opacity="0.05"
data-pptx-layer="layout" data-pptx-editable="false"/>
<line id="closing-grid-vertical-3" x1="960" y1="0" x2="960" y2="720"
stroke="#FFFFFF" stroke-width="1" stroke-opacity="0.05"
data-pptx-layer="layout" data-pptx-editable="false"/>
<image id="closing-logo" x="344" y="108" width="592" height="238"
xlink:href="../images/大型 logo.png" preserveAspectRatio="xMidYMid meet"
data-pptx-layer="layout" data-pptx-editable="false"/>
<line id="closing-separator" x1="540" y1="548" x2="740" y2="548" stroke="#FFFFFF"
stroke-width="1" stroke-opacity="0.35" data-pptx-layer="layout" data-pptx-editable="false"/>
<rect id="closing-footer-band" x="0" y="680" width="1280" height="40"
fill="#FFFFFF" fill-opacity="0.1" data-pptx-layer="layout" data-pptx-editable="false"/>
<g id="closing-title-slot" data-pptx-placeholder="title"
data-pptx-placeholder-bounds="220 376 840 92">
<text id="closing-title-carrier" data-pptx-placeholder-carrier="true"
x="640" y="436" text-anchor="middle" fill="#FFFFFF"
font-family="Microsoft YaHei, SimHei, Arial, sans-serif"
font-size="56" font-weight="700">{{THANK_YOU}}</text>
</g>
<g id="closing-subtitle-slot" data-pptx-placeholder="subtitle" data-pptx-placeholder-idx="1"
data-pptx-placeholder-bounds="260 472 760 50">
<text id="closing-subtitle-carrier" data-pptx-placeholder-carrier="true"
x="640" y="506" text-anchor="middle" fill="#FFFFFF" fill-opacity="0.72"
font-family="Arial, Microsoft YaHei, sans-serif" font-size="24">{{THANK_YOU_EN}}</text>
</g>
<g id="closing-contact-slot" data-pptx-placeholder="body" data-pptx-placeholder-idx="2"
data-pptx-placeholder-bounds="300 568 680 44">
<text id="closing-contact-carrier" data-pptx-placeholder-carrier="true"
x="640" y="598" text-anchor="middle" fill="#FFFFFF" fill-opacity="0.86"
font-family="Microsoft YaHei, Arial, sans-serif" font-size="18">{{CONTACT_INFO}}</text>
</g>
<g id="closing-footer-slot" data-pptx-placeholder="footer" data-pptx-placeholder-idx="3"
data-pptx-placeholder-bounds="240 686 800 28">
<text id="closing-footer-carrier" data-pptx-placeholder-carrier="true"
x="640" y="706" text-anchor="middle" fill="#FFFFFF" fill-opacity="0.65"
font-family="Microsoft YaHei, Arial, sans-serif" font-size="14">{{ENDING_SUBTITLE}}</text>
</g>
</svg>

Before

Width:  |  Height:  |  Size: 3.0 KiB

After

Width:  |  Height:  |  Size: 4.4 KiB

@@ -1,214 +1,62 @@
---
deck_id: 中汽研
kind: deck
native_structure_mode: template
summary: Product certification display, evaluation presentations, technology promotion, business visits.
canvas_format: ppt169
page_count: 5
category: brand
summary: 中汽研认证展示、技术交流与业务来访场景的深蓝专业模板。
keywords: [中汽研, 认证, 评测, 技术交流]
primary_color: "#004098"
canvas_format: ppt169
canvas_width: 1280
canvas_height: 720
canvas_viewbox: "0 0 1280 720"
source_canvas_width: 1280
source_canvas_height: 720
source_viewbox: "0 0 1280 720"
replication_mode: fidelity
native_structure_mode: structured
page_count: 5
---
# CATARC (中汽研) Standard Template - Design Specification
> Suitable for CATARC product certification, evaluation & certification, technology showcases, business visits, and similar scenarios.
---
# 中汽研 — Design Specification
## I. Template Overview
| Property | Description |
| -------------- | ---------------------------------------------------------- |
| **Template Name** | 中汽研 |
| **Use Cases** | Product certification display, evaluation presentations, technology promotion, business visits |
| **Design Tone** | Professional, authoritative, trustworthy, consulting style |
| **Theme Mode** | Light theme (white background + deep blue accent) |
- 适用于产品认证展示、评测汇报、技术推广和业务来访。
- 视觉以中汽研深蓝、白底内容页、方形章节编号和简洁网格为识别核心,强调专业、可信和工程秩序。
- 整套模板使用 CATARC Dark 与 CATARC Light 两个 Master,并提供五个可直接从 PowerPoint 布局库调用的 Layout。
---
## II. Color Scheme
## II. Canvas Specification
| Role | Color | Application |
| --- | --- | --- |
| CATARC blue | #004098 | 深色页面背景、章节编号块、结构线 |
| Deep blue | #003B82 | 封面背景 |
| Panel gray | #F8FAFC | 内容承载区 |
| Border gray | #E0E0E0 | 分隔线和面板边界 |
| Primary text | #333333 | 内容页标题和正文 |
| White | #FFFFFF | 深色页面文字与 Master 背景 |
| Property | Value |
| -------------- | ----------------------------- |
| **Format** | Standard 16:9 |
| **Dimensions** | 1280 × 720 px |
| **viewBox** | `0 0 1280 720` |
| **Page Margins** | Left/Right 60px, Top 80px, Bottom 40px |
| **Safe Area** | x: 60-1220, y: 80-680 |
## IV. Signature Design Elements
---
- 白底内容页使用“蓝色方形章节号 + 左对齐标题 + 右上角 Logo”的稳定页眉。
- 封面、章节页和结束页保留深蓝底、低透明度圆形与细网格,但删除无内容价值的复杂渐变和动态图片依赖。
- CATARC Dark Master 统一承载深蓝背景和上下结构线;章节页与结束页各自保留原稿中的圆形几何,封面不继承圆形。CATARC Light Master 统一承载白底、章节号方块、页眉 Logo、分隔线和底部蓝线。
- 目录页延续数字与双竖线的行式导航,并保留右侧独立数据对象区。
- 通用内容对象从框体左上角开始;封面、章节页、结束页以及小型章节号属于短焦点内容,允许在完整占位框中居中。
## III. Color Scheme
## V. Page Roster
### Primary Colors
| File | Master | Layout key | PowerPoint picker name | Visual character | Reusable slots |
| --- | --- | --- | --- | --- | --- |
| (01_cover.svg) | CATARC Dark | cover | Cover | 深蓝背景、居中大型 Logo 与标题簇 | 标题、副标题、单位、英文单位 |
| (02_toc.svg) | CATARC Light | agenda | Agenda | 数字双竖线目录、右侧数据面板 | 页面标题、五个目录项、数据对象、页码 |
| (02_chapter.svg) | CATARC Dark | section | Section Header | 深蓝章节页、居中章节号和标题 | 章节号、章节标题、章节副标题 |
| (03_content.svg) | CATARC Light | content | Title and Content | 方形章节号页眉与开放内容面板 | 章节号、页面标题、内容对象、页码 |
| (04_ending.svg) | CATARC Dark | closing | Closing | 深蓝网格背景、居中 Logo 与结束语 | 结束标题、英文副标题、联系信息、页脚 |
| Role | Color Value | Notes |
| -------------- | ----------- | -------------------------------- |
| **Primary Deep Blue** | `#004098` | Title bar, navigation bar, chapter number blocks, decorative bars |
| **Background White** | `#FFFFFF` | Main page background |
| **Auxiliary Light Gray** | `#F5F5F5` | Secondary content background blocks |
| **Border Gray** | `#E0E0E0` | Dividers, borders |
| **Accent Red** | `#CC0000` | Key information highlight |
## VI. Assets
### Text Colors
| Role | Color Value | Usage |
| -------------- | ----------- | ---------------------- |
| **Primary Text** | `#333333` | Body text, headings |
| **White Text** | `#FFFFFF` | Text on dark backgrounds |
| **Secondary Text** | `#666666` | Dimmed chapters, auxiliary descriptions |
| **Light Auxiliary** | `#999999` | Annotations, page numbers, hints |
### Functional Colors
| Usage | Color Value | Description |
| ---------- | ----------- | -------------- |
| **Success** | `#4CAF50` | Pass / Certified |
| **Warning** | `#CC0000` | Failed / Attention |
---
## IV. Typography System
### Font Stack
**Font Stack**: `"Microsoft YaHei", "微软雅黑", "SimHei", Arial, Calibri, sans-serif`
### Font Size Hierarchy
| Level | Usage | Size | Weight |
| ----- | ------------------ | ---- | ------- |
| H1 | Cover main title | 48px | Bold |
| H2 | Page heading | 28px | Bold |
| H3 | Section title / Subtitle | 24px | Bold |
| P | Body content | 18px | Regular |
| High | Emphasized data | 36px | Bold |
| Sub | Auxiliary notes | 14px | Regular |
---
## V. Page Structure
### Common Layout
| Area | Position/Height | Description |
| ---------- | --------------- | -------------------------------------- |
| **Top** | y=0, h=4px | Deep blue bar spanning full width |
| **Title Bar** | y=30, h=50px | Chapter number block + Title text + Top-right Logo |
| **Content** | y=100, h=560px | Main content area |
| **Footer** | y=680, h=40px | Page number (right-aligned), bottom decorative line |
### Navigation Design
- **Top Decorative Line**: Deep blue (`#004098`), height 4px, spanning full width
- **Bottom Decorative Line**: Deep blue (`#004098`), height 4px, y=716
- **Title Bar** (y=30):
- Chapter number block: Deep blue square (50×50px), white number/text centered
- Title text: 20px from number block, 28px font size, `#333333`
- Top-right Logo: Fixed at x=1107, size 113×50px
---
## VI. Page Types
### 1. Cover Page (01_cover.svg)
- Supports background image (AI-generated / user-provided)
- Semi-transparent overlay for text readability
- Large centered Logo
- Main title + subtitle
- Organization name (Chinese & English)
### 2. Table of Contents (02_toc.svg)
- Double vertical line `||` separator design
- Supports up to 5 chapters
- Left decorative vertical line
- Optional statistics display area on the right
### 3. Chapter Page (02_chapter.svg)
- Deep blue gradient background
- Large chapter number
- Chapter title + English subtitle
### 4. Content Page (03_content.svg)
- White background
- Standard navigation bar
- Flexible content area
- Supports multiple layout patterns
### 5. Ending Page (04_ending.svg)
- Deep blue solid background
- Centered Logo
- Thank-you message
- Organization information
---
## VII. SVG Page Roster
| File | Role | Description |
|------|------|-------------|
| `01_cover.svg` | cover | Title slide; brand/project name + presenter + date |
| `02_chapter.svg` | chapter | Chapter divider page (large number + chapter title) |
| `02_toc.svg` | toc | Table of contents listing major sections |
| `03_content.svg` | content | Main content page; body of the deck |
| `04_ending.svg` | ending | Closing/thank-you page |
## VIII. Layout Patterns (Recommended)
| Pattern | Use Cases |
| -------------------- | ------------------------------ |
| **Single Column Center** | Cover, conclusion, key points |
| **Left-Right Split (5:5)** | Comparison display |
| **Left-Right Split (4:6)** | Image-text mixed layout |
| **Top-Bottom Split** | Process description, standards list |
| **Three-Column Cards** | Project listings |
| **Matrix Grid** | Category display |
| **Table** | Data comparison, specification lists |
---
## IX. Spacing Guidelines
| Element | Value |
| -------------- | ------ |
| Card gap | 24px |
| Content block gap | 32px |
| Card padding | 24px |
| Card border radius | 8px |
| Icon-to-text gap | 12px |
---
## X. Placeholder Specification
Templates use `{{PLACEHOLDER}}` format. Common placeholders:
| Placeholder | Description |
| -------------------- | ------------------ |
| `{{TITLE}}` | Main title |
| `{{SUBTITLE}}` | Subtitle |
| `{{AUTHOR}}` | Author / Organization (Chinese) |
| `{{AUTHOR_EN}}` | Author / Organization (English) |
| `{{PAGE_TITLE}}` | Page title |
| `{{CHAPTER_NUM}}` | Chapter number |
| `{{PAGE_NUM}}` | Page number |
| `{{TOC_ITEM_N_TITLE}}` | TOC item title |
| `{{TOC_ITEM_N_DESC}}` | TOC item description |
| `{{THANK_YOU}}` | Thank-you message |
| `{{CONTACT_INFO}}` | Primary contact info |
| `{{LOGO_LARGE}}` | Large Logo filename |
| `{{LOGO_HEADER}}` | Header Logo filename |
| `{{COVER_BG_IMAGE}}` | Cover background image filename |
---
## XI. Usage Notes (Recommended)
1. **Template Deployment**: Copy the template to your project directory.
2. **Asset Replacement**: Replace `大型 logo.png` (592×238) and `右上角 logo.png` (113×50) in the `images` directory.
3. **Content Generation**: Select appropriate page templates based on content needs, and replace content using `{{}}` placeholders.
4. **SVG Generation**: Generate final SVG files via automation scripts.
| File | Intended usage |
| --- | --- |
| 大型 logo.png | 封面和结束页主标识 |
| 右上角 logo.png | 目录页和内容页页眉标识 |
Binary file not shown.

Before

Width:  |  Height:  |  Size: 119 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 22 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 22 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 14 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 25 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 56 KiB

@@ -1,33 +0,0 @@
<?xml version="1.0" encoding="UTF-8"?>
<svg xmlns="http://www.w3.org/2000/svg" width="1280" height="720" viewBox="0 0 1280 720" data-pptx-layout="01_cover" data-pptx-layout-name="Cover">
<rect width="1280" height="720" fill="#8F0F1B" id="layout-01_cover-background" data-pptx-layer="layout" data-pptx-editable="false"/>
<image href="../images/cover_bg.png" x="0" y="0" width="1280" height="720" preserveAspectRatio="xMidYMid slice"/>
<rect width="1280" height="720" fill="#8F0F1B" fill-opacity="0.18"
id="cover-overlay" transform="translate(0 0)"/>
<rect x="196" y="182" width="888" height="238" rx="10" fill="#5E0913" fill-opacity="0.18" stroke="#FFFFFF" stroke-width="1.2" stroke-opacity="0.16"/>
<rect x="236" y="448" width="808" height="1.5" fill="#FFFFFF" fill-opacity="0.22"/>
<line x1="210" y1="408" x2="380" y2="408" stroke="#E26A74" stroke-width="2" stroke-opacity="0.72"/>
<line x1="900" y1="408" x2="1070" y2="408" stroke="#E26A74" stroke-width="2" stroke-opacity="0.72"/>
<text x="640" y="254" text-anchor="middle" fill="#FFFFFF" font-family="Microsoft YaHei, PingFang SC, Arial, sans-serif" font-size="54" font-weight="700" id="slot-01_cover-title-1" data-pptx-placeholder="title">
{{TITLE}}
</text>
<text x="640" y="334" text-anchor="middle" fill="#FFFFFF" font-family="Microsoft YaHei, PingFang SC, Arial, sans-serif" font-size="24" font-weight="700" letter-spacing="2" id="slot-01_cover-subtitle-2" data-pptx-placeholder="subtitle">
{{SUBTITLE}}
</text>
<text x="640" y="468" text-anchor="middle" fill="#FFFFFF" font-family="Microsoft YaHei, PingFang SC, Arial, sans-serif" font-size="18">
{{AUTHOR}}
</text>
<text x="640" y="506" text-anchor="middle" fill="#FFFFFF" font-family="Microsoft YaHei, PingFang SC, Arial, sans-serif" font-size="18">
{{DATE}}
</text>
<text x="640" y="560" text-anchor="middle" fill="#FFFFFF" fill-opacity="0.74" font-family="Microsoft YaHei, PingFang SC, Arial, sans-serif" font-size="14" letter-spacing="4">
{{TAGLINE}}
</text>
<text x="640" y="646" text-anchor="middle" fill="#FFFFFF" fill-opacity="0.84" font-family="Microsoft YaHei, PingFang SC, Arial, sans-serif" font-size="14" letter-spacing="3">
{{BRAND_LINE}}
</text>
</svg>

Before

Width:  |  Height:  |  Size: 2.2 KiB

@@ -1,29 +0,0 @@
<?xml version="1.0" encoding="UTF-8"?>
<svg xmlns="http://www.w3.org/2000/svg" width="1280" height="720" viewBox="0 0 1280 720" data-pptx-layout="02_chapter" data-pptx-layout-name="Section">
<rect width="1280" height="720" fill="#A61120" id="layout-02_chapter-background" data-pptx-layer="layout" data-pptx-editable="false"/>
<circle cx="1010" cy="344" r="286" fill="none" stroke="#FFFFFF" stroke-width="18" stroke-opacity="0.06"/>
<circle cx="1042" cy="344" r="184" fill="none" stroke="#FFFFFF" stroke-width="10" stroke-opacity="0.05"/>
<circle cx="140" cy="620" r="170" fill="#7F0B17" fill-opacity="0.4"/>
<rect x="738" y="0" width="542" height="720" fill="#7F0B17" fill-opacity="0.16"/>
<image href="../images/logo_white.png" x="948" y="42" width="250" height="60"/>
<line x1="904" y1="118" x2="1204" y2="118" stroke="#FFFFFF" stroke-width="1.5" stroke-opacity="0.18"/>
<rect x="96" y="144" width="10" height="320" fill="#FFFFFF" fill-opacity="0.9"/>
<rect x="122" y="144" width="2" height="320" fill="#FFFFFF" fill-opacity="0.45"/>
<text x="154" y="258" fill="#FFFFFF" fill-opacity="0.12" font-family="Microsoft YaHei, PingFang SC, Arial, sans-serif" font-size="220" font-weight="700">
{{CHAPTER_NUM}}
</text>
<text x="154" y="334" fill="#FFFFFF" font-family="Microsoft YaHei, PingFang SC, Arial, sans-serif" font-size="46" font-weight="700" id="slot-02_chapter-title-1" data-pptx-placeholder="title">
{{CHAPTER_TITLE}}
</text>
<text x="154" y="392" fill="#FFFFFF" fill-opacity="0.82" font-family="Microsoft YaHei, PingFang SC, Arial, sans-serif" font-size="20">
{{CHAPTER_DESC}}
</text>
<line x1="154" y1="432" x2="486" y2="432" stroke="#FFFFFF" stroke-width="2" stroke-opacity="0.45"/>
<line x1="840" y1="520" x2="1188" y2="520" stroke="#FFFFFF" stroke-width="2" stroke-opacity="0.12"/>
<line x1="886" y1="548" x2="1188" y2="548" stroke="#FFFFFF" stroke-width="2" stroke-opacity="0.09"/>
<line x1="934" y1="576" x2="1188" y2="576" stroke="#FFFFFF" stroke-width="2" stroke-opacity="0.07"/>
</svg>

Before

Width:  |  Height:  |  Size: 2.0 KiB

@@ -1,46 +0,0 @@
<?xml version="1.0" encoding="UTF-8"?>
<svg xmlns="http://www.w3.org/2000/svg" width="1280" height="720" viewBox="0 0 1280 720" data-pptx-layout="02_toc" data-pptx-layout-name="Agenda">
<rect width="1280" height="720" fill="#FFFFFF" id="layout-02_toc-background" data-pptx-layer="layout" data-pptx-editable="false"/>
<rect x="0" y="0" width="1280" height="30" fill="#C8152D"/>
<defs>
<linearGradient id="accentFade" x1="0%" y1="0%" x2="100%" y2="0%">
<stop offset="0%" style="stop-color:#C8152D;stop-opacity:0.5"/>
<stop offset="100%" style="stop-color:#C8152D;stop-opacity:0"/>
</linearGradient>
</defs>
<rect x="0" y="30" width="180" height="4" fill="url(#accentFade)"/>
<image href="../images/logo_dark.png" x="940" y="42" width="280" height="48" preserveAspectRatio="xMidYMid meet"/>
<text x="72" y="88" fill="#1F1F1F" font-family="Microsoft YaHei, PingFang SC, Arial, sans-serif" font-size="26" font-weight="700">
目录 / CONTENTS
</text>
<line x1="72" y1="110" x2="1210" y2="110" stroke="#E3E3E3" stroke-width="2"/>
<line x1="72" y1="126" x2="250" y2="126" stroke="#C8152D" stroke-width="3"/>
<!--
AI 灵活布局区
可用空间: x=72, y=140, w=1138, h=540
推荐布局模式(按章节数量自由选择):
- 2-3 章: 单列纵排,每项间距 120px
- 4 章: 2×2 矩阵 或 单列紧凑排列
- 5-6 章: 2×3 矩阵 或 3 列布局
- 7+ 章: 紧凑列表,减小编号字号
设计元素参考:
编号: <text fill="#C8152D" font-size="44" font-weight="700"/> (品牌红)
<text fill="#2175D9" font-size="44" font-weight="700"/> (金融蓝-交替)
标题: <text fill="#1F1F1F" font-size="24" font-weight="700"/>
描述: <text fill="#666666" font-size="15"/>
分隔线: <line stroke="#ECECEC" stroke-width="1.5"/>
列分隔: <line stroke="#EFEFEF" stroke-width="2"/> (纵向)
-->
<text x="641" y="400" text-anchor="middle" fill="#D8D8D8" font-family="Microsoft YaHei, PingFang SC, Arial, sans-serif" font-size="28" font-weight="700" letter-spacing="3" id="slot-02_toc-body-1" data-pptx-placeholder="body">
{{CONTENT_AREA}}
</text>
<text x="641" y="436" text-anchor="middle" fill="#E6E6E6" font-family="Microsoft YaHei, PingFang SC, Arial, sans-serif" font-size="14">
Content Area: 1138 × 540 px
</text>
</svg>

Before

Width:  |  Height:  |  Size: 2.4 KiB

@@ -1,71 +0,0 @@
<?xml version="1.0" encoding="UTF-8"?>
<svg xmlns="http://www.w3.org/2000/svg" width="1280" height="720" viewBox="0 0 1280 720" data-pptx-layout="03_content" data-pptx-layout-name="Content">
<rect width="1280" height="720" fill="#FFFFFF" id="layout-03_content-background" data-pptx-layer="layout" data-pptx-editable="false"/>
<rect x="0" y="0" width="1280" height="30" fill="#C8152D"/>
<defs>
<linearGradient id="accentFade" x1="0%" y1="0%" x2="100%" y2="0%">
<stop offset="0%" style="stop-color:#C8152D;stop-opacity:0.5"/>
<stop offset="100%" style="stop-color:#C8152D;stop-opacity:0"/>
</linearGradient>
</defs>
<rect x="0" y="30" width="180" height="4" fill="url(#accentFade)"/>
<image href="../images/logo_dark.png" x="940" y="42" width="280" height="48" preserveAspectRatio="xMidYMid meet"/>
<text x="72" y="84" fill="#1F1F1F" font-family="Microsoft YaHei, PingFang SC, Arial, sans-serif" font-size="26" font-weight="700" id="slot-03_content-title-1" data-pptx-placeholder="title">
{{PAGE_TITLE}}
</text>
<line x1="72" y1="98" x2="286" y2="98" stroke="#C8152D" stroke-width="3"/>
<rect x="72" y="112" width="110" height="28" rx="14" fill="#C8152D"/>
<text x="127" y="131" text-anchor="middle" fill="#FFFFFF" font-family="Microsoft YaHei, PingFang SC, Arial, sans-serif" font-size="13" font-weight="700">
{{SECTION_NAME}}
</text>
<rect x="72" y="158" width="4" height="26" fill="#C8152D"/>
<text x="90" y="177" fill="#666666" font-family="Microsoft YaHei, PingFang SC, Arial, sans-serif" font-size="16" id="slot-03_content-body-2" data-pptx-placeholder="body">
{{KEY_MESSAGE}}
</text>
<line x1="72" y1="204" x2="1210" y2="204" stroke="#E9E9E9" stroke-width="2"/>
<rect x="72" y="212" width="132" height="4" fill="#C8152D" fill-opacity="0.1"/>
<path d="M72 236 L86 236 M72 236 L72 250" stroke="#C8152D" stroke-width="2" stroke-opacity="0.6"/>
<path d="M1210 236 L1196 236 M1210 236 L1210 250" stroke="#C8152D" stroke-width="2" stroke-opacity="0.6"/>
<path d="M72 640 L86 640 M72 640 L72 626" stroke="#C8152D" stroke-width="2" stroke-opacity="0.35"/>
<path d="M1210 640 L1196 640 M1210 640 L1210 626" stroke="#C8152D" stroke-width="2" stroke-opacity="0.35"/>
<!--
AI 灵活布局区
可用空间: x=72, y=236, w=1138, h=404
推荐布局模式:
- 左右分栏 (540+540, gap=24 或 380+700)
- 上下两段
- 2×2 矩阵 (270×190 每格, gap=20)
- 3 列卡片 (356×360, gap=24)
- 数据卡片组合 (160×120 每个)
- 横向流程 (全宽, 高度 100-140px, 3-6 节点)
常用设计元素:
数据卡片: <rect fill="#FFFFFF" stroke="#E9E9E9" stroke-width="1.5" rx="6"/>
<rect width="4" fill="#C8152D"/> (左侧品牌装饰条)
关键数据: <text fill="#C8152D" font-size="44" font-weight="bold"/> (品牌红-正向)
<text fill="#2175D9" font-size="44" font-weight="bold"/> (金融蓝-对比)
分隔线: <line stroke="#E9E9E9" stroke-width="1"/>
-->
<text x="641" y="450" text-anchor="middle" fill="#D8D8D8" font-family="Microsoft YaHei, PingFang SC, Arial, sans-serif" font-size="28" font-weight="700" letter-spacing="3">
{{CONTENT_AREA}}
</text>
<text x="641" y="486" text-anchor="middle" fill="#E6E6E6" font-family="Microsoft YaHei, PingFang SC, Arial, sans-serif" font-size="14">
Content Area: 1138 × 404 px
</text>
<line x1="72" y1="674" x2="1210" y2="674" stroke="#E5E5E5" stroke-width="1.5"/>
<line x1="72" y1="662" x2="184" y2="662" stroke="#C8152D" stroke-width="2" stroke-opacity="0.2"/>
<text x="72" y="698" fill="#8A8A8A" font-family="Microsoft YaHei, PingFang SC, Arial, sans-serif" font-size="12">
数据来源:{{SOURCE}}
</text>
<text x="1210" y="698" text-anchor="end" fill="#777777" font-family="Microsoft YaHei, PingFang SC, Arial, sans-serif" font-size="14" id="slot-03_content-slide_number-3" data-pptx-placeholder="slide-number">
{{PAGE_NUM}}
</text>
</svg>

Before

Width:  |  Height:  |  Size: 3.9 KiB

@@ -1,39 +0,0 @@
<?xml version="1.0" encoding="UTF-8"?>
<svg xmlns="http://www.w3.org/2000/svg" width="1280" height="720" viewBox="0 0 1280 720" data-pptx-layout="04_ending" data-pptx-layout-name="Closing">
<rect width="1280" height="720" fill="#8F0F1B" id="layout-04_ending-background" data-pptx-layer="layout" data-pptx-editable="false"/>
<image href="../images/cover_bg.png" x="0" y="0" width="1280" height="720" preserveAspectRatio="xMidYMid slice"/>
<rect width="1280" height="720" fill="#7F0B17" fill-opacity="0.22"
id="ending-overlay" transform="translate(0 0)"/>
<text x="640" y="260" text-anchor="middle" fill="#FFFFFF" font-family="Microsoft YaHei, PingFang SC, Arial, sans-serif" font-size="54" font-weight="700">
{{THANK_YOU}}
</text>
<text x="640" y="316" text-anchor="middle" fill="#FFFFFF" fill-opacity="0.88" font-family="Microsoft YaHei, PingFang SC, Arial, sans-serif" font-size="20">
{{ENDING_SUBTITLE}}
</text>
<text x="640" y="362" text-anchor="middle" fill="#FFFFFF" fill-opacity="0.8" font-family="Microsoft YaHei, PingFang SC, Arial, sans-serif" font-size="16">
{{CLOSING_MESSAGE}}
</text>
<rect x="338" y="420" width="604" height="150" rx="10" fill="#FFFFFF" fill-opacity="0.12" stroke="#FFFFFF" stroke-width="1.5" stroke-opacity="0.28"/>
<rect x="338" y="420" width="604" height="4" fill="#FFFFFF" fill-opacity="0.2" rx="2"/>
<text x="640" y="462" text-anchor="middle" fill="#FFFFFF" font-family="Microsoft YaHei, PingFang SC, Arial, sans-serif" font-size="22" font-weight="700">
{{CONTACT_NAME}}
</text>
<text x="640" y="492" text-anchor="middle" fill="#FFFFFF" fill-opacity="0.88" font-family="Microsoft YaHei, PingFang SC, Arial, sans-serif" font-size="16">
{{DEPARTMENT}}
</text>
<line x1="480" y1="510" x2="800" y2="510" stroke="#FFFFFF" stroke-width="1" stroke-opacity="0.2"/>
<text x="560" y="540" text-anchor="middle" fill="#FFFFFF" fill-opacity="0.82" font-family="Microsoft YaHei, PingFang SC, Arial, sans-serif" font-size="14">
{{CONTACT_EMAIL}}
</text>
<text x="720" y="540" text-anchor="middle" fill="#FFFFFF" fill-opacity="0.82" font-family="Microsoft YaHei, PingFang SC, Arial, sans-serif" font-size="14">
{{CONTACT_PHONE}}
</text>
<line x1="460" y1="610" x2="820" y2="610" stroke="#FFFFFF" stroke-width="2" stroke-opacity="0.4"/>
<text x="640" y="648" text-anchor="middle" fill="#FFFFFF" fill-opacity="0.84" font-family="Microsoft YaHei, PingFang SC, Arial, sans-serif" font-size="14" letter-spacing="3">
{{BRAND_LINE}}
</text>
</svg>

Before

Width:  |  Height:  |  Size: 2.5 KiB

@@ -1,234 +0,0 @@
---
deck_id: 招商银行
kind: deck
native_structure_mode: template
summary: 交易银行产品介绍、销售收款方案汇报、客户案例拆解、分行培训材料.
canvas_format: ppt169
page_count: 5
primary_color: "#C8152D"
---
# China Merchants Bank Transaction Banking - Design Specification
## I. Template Overview
| Property | Description |
| --- | --- |
| **Template Name** | 招商银行 |
| **Display Name** | China Merchants Bank Transaction Banking Template |
| **Use Cases** | 交易银行产品介绍、销售收款方案汇报、客户案例拆解、分行培训材料 |
| **Design Tone** | Brand-consistent, structured, product-focused, refined finance |
| **Theme Mode** | Hybrid theme (brand-red cover/chapter/ending + light content pages) |
Reference slides read before generation: `1, 2, 3, 4, 6, 9, 11, 13, 16, 18`.
## II. Canvas Specification
| Property | Value |
| --- | --- |
| **Format** | Standard 16:9 |
| **Dimensions** | 1280 × 720 px |
| **viewBox** | `0 0 1280 720` |
| **Safe Margins** | 56px left/right, 48px top, 40px bottom |
| **Primary Content Area** | x: 72-1216, y: 140-640 |
## III. Color Scheme
| Role | Color Value | Usage |
| --- | --- | --- |
| **Brand Red** | `#C8152D` | Header strips, emphasis, chapter anchor |
| **Deep Red** | `#8F0F1B` | Dark-page overlay and structural depth |
| **Signal Red** | `#E26A74` | Fine divider accents on cover |
| **Finance Blue** | `#2175D9` | Case-study secondary emphasis |
| **Dark Text** | `#1F1F1F` | Main titles and core copy |
| **Medium Gray** | `#666666` | Secondary copy |
| **Light Gray** | `#E9E9E9` | Dividers and boundary hints |
| **White** | `#FFFFFF` | Background and reverse text |
## IV. Typography System
| Level | Usage | Size | Weight |
| --- | --- | --- | --- |
| **H1** | Cover title | 54px | Bold |
| **H2** | Chapter title | 46px | Bold |
| **H3** | Content title | 26px | Bold |
| **H4** | TOC / card title | 20px | Bold |
| **Body** | Paragraph text | 16px | Regular |
| **Caption** | Metadata / footer | 12px | Regular |
| **Display Number** | Chapter numeral | 220px | Bold |
**Font Stack**: `"Microsoft YaHei", "PingFang SC", Arial, sans-serif`
## V. Page Structure
### Common Layout
| Area | Description |
| --- | --- |
| **Header Strip** | Red brand strip with logo, used on light pages |
| **Title Zone** | Left-aligned title and short key message |
| **Content Body** | Open layout with only light boundary hints |
| **Footer** | Thin divider, section/source/page number |
### Design DNA
1. Reuse the PPT's bank-red brand language, but simplify heavy PPT export artifacts into clean vector geometry.
2. Keep cover / chapter / ending pages visually strong and brand-led.
3. Keep content pages bright and practical for data, process, and case-study layouts.
4. Preserve a secondary finance-blue accent to support comparison and case storytelling.
5. Maintain content coverage ≤ 60%, ensuring visual "breathing room" on data-heavy pages.
6. Use structured layouts (cards, grids, process flows) to organize financial data clearly.
## VI. Page Types
### 1. Cover Page (`01_cover.svg`)
- Uses the imported cover background asset `cover_bg.png`
- Centered white typography with restrained divider lines
- Suitable for title, subtitle, presenter, and date
### 2. Table of Contents (`02_toc.svg`)
- Light page with red top strip and logo
- Two-column indexed list for up to four agenda items
- Red numerals + dark text for fast scanning
### 3. Chapter Page (`02_chapter.svg`)
- Full-brand dark red background
- Large translucent chapter numeral in the background
- Left-aligned title and short chapter description
### 4. Content Page (`03_content.svg`)
- Light page with a narrow red header strip and right-aligned white logo
- Page title, section label, key message line, and open body region
- Footer includes section name, source, and page number
### 5. Ending Page (`04_ending.svg`)
- Reuses the cover background asset
- Centered closing message and compact contact card
- Suitable for formal client-facing endings
## VII. SVG Page Roster
| File | Role | Description |
|------|------|-------------|
| `01_cover.svg` | cover | Title slide; brand/project name + presenter + date |
| `02_chapter.svg` | chapter | Chapter divider page (large number + chapter title) |
| `02_toc.svg` | toc | Table of contents listing major sections |
| `03_content.svg` | content | Main content page; body of the deck |
| `04_ending.svg` | ending | Closing/thank-you page |
## VIII. Layout Modes
| Mode | Recommendation |
| --- | --- |
| **Process / Flow** | Use full-width body area with 3-6 horizontal stages |
| **Case Study** | Use split columns or a left-right evidence / solution structure |
| **Product Feature** | Use a short key message on top and modular cards below |
| **Agenda / Sectioning** | Use TOC or chapter page instead of improvising layout headers |
## IX. Spacing Specification
| Property | Value |
| --- | --- |
| **Base Unit** | 8px |
| **Module Gap** | 24px |
| **Card Gap** | 20px |
| **Title to Body** | 44px |
| **Footer Offset** | 32px from bottom |
## X. Placeholder Specification
| Placeholder | Description |
| --- | --- |
| `{{TITLE}}` | Cover main title |
| `{{SUBTITLE}}` | Cover subtitle |
| `{{DATE}}` | Cover date |
| `{{AUTHOR}}` | Cover presenter / organization |
| `{{TAGLINE}}` | Cover tagline (e.g. product/service line) |
| `{{BRAND_LINE}}` | Cover bottom brand attribution line |
| `{{CHAPTER_NUM}}` | Chapter number |
| `{{CHAPTER_TITLE}}` | Chapter title |
| `{{CHAPTER_DESC}}` | Chapter description |
| `{{PAGE_TITLE}}` | Content page title |
| `{{KEY_MESSAGE}}` | Content page key message |
| `{{CONTENT_AREA}}` | Content page body placeholder |
| `{{SECTION_NAME}}` | Section label / footer section |
| `{{SOURCE}}` | Source text |
| `{{PAGE_NUM}}` | Page number |
| `{{TOC_ITEM_1_TITLE}}` | TOC item 1 title |
| `{{TOC_ITEM_1_DESC}}` | TOC item 1 description |
| `{{TOC_ITEM_2_TITLE}}` | TOC item 2 title |
| `{{TOC_ITEM_2_DESC}}` | TOC item 2 description |
| `{{TOC_ITEM_3_TITLE}}` | TOC item 3 title |
| `{{TOC_ITEM_3_DESC}}` | TOC item 3 description |
| `{{TOC_ITEM_4_TITLE}}` | TOC item 4 title |
| `{{TOC_ITEM_4_DESC}}` | TOC item 4 description |
| `{{TOC_FOOTER}}` | TOC page footer description |
| `{{THANK_YOU}}` | Ending main message |
| `{{ENDING_SUBTITLE}}` | Ending subtitle |
| `{{CLOSING_MESSAGE}}` | Ending supporting sentence |
| `{{CONTACT_NAME}}` | Ending contact person name |
| `{{DEPARTMENT}}` | Ending department name |
| `{{CONTACT_EMAIL}}` | Ending email address |
| `{{CONTACT_PHONE}}` | Ending phone number |
## XI. Asset Specification
### Core Assets
| Asset | Purpose |
| --- | --- |
| `cover_bg.png` | Cover / ending brand background (dark pages) |
| `logo_white.png` | White brand logo for red and dark pages |
| `logo_dark.png` | 「招商银行 \| 公司金融」dark logo for light page headers |
### Optional Assets
| Asset | Purpose |
| --- | --- |
| `page_header_bg.png` | Full-page header background reference (red accent + logo) |
| `logo_crm_banner.png` | 「招商银行 \| CRM 4.0」red banner (product-specific, use when applicable) |
| `ref_content_bg.png` | Content page reference layout (with building illustration, for design reference only) |
### Usage Rule
Core assets are wired into SVG templates. `logo_dark.png` is used on light pages (TOC, content); `logo_white.png` and `cover_bg.png` on dark pages (cover, chapter, ending). Optional assets are available for project-specific customization.
- Keep bundled image assets semantic and minimal.
- Reconstruct editable template geometry instead of embedding fragments exported from PowerPoint.
## XII. Chart Specifications
### Recommended Chart Dimensions
| Chart Type | Recommended Size |
| --- | --- |
| Bar chart | 500-700 × 400px |
| Pie chart | 300-400px diameter |
| Data card | 160 × 120px |
| Process flow | Full width, 100-140px height |
| Comparison table | 1100 × 300-400px |
### Chart Color Palette
| Usage | Colors |
| --- | --- |
| Primary series | `#C8152D`, `#E26A74`, `#8F0F1B` |
| Secondary series | `#2175D9`, `#5A9FE6` |
| Positive indicator | `#27AE60` |
| Negative indicator | `#E74C3C` |
| Neutral | `#666666` |
## XIII. Usage Instructions
1. Copy the template directory to the project `templates/` folder
2. Read this design specification to understand the visual system
3. Select the appropriate page template for each slide
4. Replace `company_finance_header.png` if the project is not CRM-specific
5. Mark content to be replaced using `{{PLACEHOLDER}}` format
6. Prioritize data charts and structured layouts; keep text concise
7. Generate final SVGs through the Executor role
Binary file not shown.

Before

Width:  |  Height:  |  Size: 12 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 27 KiB

@@ -1,74 +0,0 @@
<svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" viewBox="0 0 1280 720" data-pptx-layout="01_cover" data-pptx-layout-name="Cover">
<defs>
<!-- 左侧主渐变 -->
<linearGradient id="leftGradient" x1="0%" y1="0%" x2="100%" y2="100%">
<stop offset="0%" stop-color="#003D6B"/>
<stop offset="100%" stop-color="#006BB7"/>
</linearGradient>
<!-- 金色渐变 -->
<linearGradient id="goldLine" x1="0%" y1="0%" x2="100%" y2="0%">
<stop offset="0%" stop-color="#B8860B"/>
<stop offset="50%" stop-color="#D4A84B"/>
<stop offset="100%" stop-color="#B8860B"/>
</linearGradient>
</defs>
<!-- 背景 -->
<rect width="1280" height="720" fill="#FFFFFF" id="layout-01_cover-background" data-pptx-layer="layout" data-pptx-editable="false"/>
<!-- 左侧色块(占据左边约 35% -->
<rect x="0" y="0" width="450" height="720" fill="url(#leftGradient)"/>
<!-- 左侧色块上的装饰纹理 -->
<line x1="50" y1="0" x2="50" y2="720" stroke="#FFFFFF" stroke-width="1" stroke-opacity="0.05"/>
<line x1="100" y1="0" x2="100" y2="720" stroke="#FFFFFF" stroke-width="1" stroke-opacity="0.03"/>
<line x1="350" y1="0" x2="350" y2="720" stroke="#FFFFFF" stroke-width="1" stroke-opacity="0.05"/>
<line x1="400" y1="0" x2="400" y2="720" stroke="#FFFFFF" stroke-width="1" stroke-opacity="0.03"/>
<!-- 左侧金色装饰竖线 -->
<rect x="448" y="100" width="4" height="520" fill="url(#goldLine)"/>
<!-- Logo(左侧色块中央,白色版本) -->
<image x="75" y="260" width="300" height="90" xlink:href="../images/重庆大学logo2.png" preserveAspectRatio="xMidYMid meet"/>
<!-- 左侧底部年份水印 -->
<text x="225" y="650" text-anchor="middle" fill="#FFFFFF" fill-opacity="0.15" font-family="Arial, sans-serif" font-size="72" font-weight="bold">CQU</text>
<!-- 右侧内容区 -->
<!-- 主标题 -->
<text x="860" y="280" text-anchor="middle" fill="#1A2E44" font-family="Microsoft YaHei, PingFang SC, Arial, sans-serif" font-size="44" font-weight="bold" id="slot-01_cover-title-1" data-pptx-placeholder="title">{{TITLE}}</text>
<!-- 副标题 -->
<text x="860" y="340" text-anchor="middle" fill="#6B7B8C" font-family="Microsoft YaHei, Arial, sans-serif" font-size="20" id="slot-01_cover-subtitle-2" data-pptx-placeholder="subtitle">{{SUBTITLE}}</text>
<!-- 金色装饰分隔线 -->
<rect x="710" y="380" width="300" height="2" fill="url(#goldLine)"/>
<circle cx="710" cy="381" r="4" fill="#D4A84B"/>
<circle cx="1010" cy="381" r="4" fill="#D4A84B"/>
<!-- 答辩人信息 -->
<text x="860" y="450" text-anchor="middle" fill="#333D4A" font-family="Microsoft YaHei, Arial, sans-serif" font-size="18">
<tspan fill="#006BB7" font-weight="bold">答辩人</tspan>
<tspan dx="16">{{AUTHOR}}</tspan>
</text>
<text x="860" y="490" text-anchor="middle" fill="#6B7B8C" font-family="Microsoft YaHei, Arial, sans-serif" font-size="16">
<tspan>指导老师:{{ADVISOR}}</tspan>
</text>
<text x="860" y="530" text-anchor="middle" fill="#6B7B8C" font-family="Microsoft YaHei, Arial, sans-serif" font-size="16">{{INSTITUTION}}</text>
<!-- 日期(底部居中于右侧区域) -->
<rect x="780" y="620" width="160" height="36" fill="#F5F7FA" rx="18"/>
<text x="860" y="644" text-anchor="middle" fill="#6B7B8C" font-family="Microsoft YaHei, Arial, sans-serif" font-size="14">{{DATE}}</text>
<!-- 右下角装饰几何 -->
<polygon points="1280,600 1280,720 1160,720" fill="#006BB7" fill-opacity="0.06"/>
<polygon points="1280,660 1280,720 1200,720" fill="#D4A84B" fill-opacity="0.1"/>
<!-- 右上角装饰 -->
<line x1="1100" y1="60" x2="1240" y2="60" stroke="#006BB7" stroke-width="1" stroke-opacity="0.2"/>
<line x1="1150" y1="90" x2="1240" y2="90" stroke="#D4A84B" stroke-width="1" stroke-opacity="0.3"/>
<circle cx="1240" cy="60" r="3" fill="#006BB7" fill-opacity="0.3"/>
<circle cx="1240" cy="90" r="3" fill="#D4A84B" fill-opacity="0.4"/>
</svg>

Before

Width:  |  Height:  |  Size: 4.0 KiB

@@ -1,52 +0,0 @@
<svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" viewBox="0 0 1280 720" data-pptx-layout="02_chapter" data-pptx-layout-name="Section">
<defs>
<!-- 天际渐变 -->
<linearGradient id="skyGradient" x1="0%" y1="0%" x2="100%" y2="100%">
<stop offset="0%" stop-color="#3A9BD9"/>
<stop offset="100%" stop-color="#006BB7" stop-opacity="0.3"/>
</linearGradient>
</defs>
<!-- 深邃蓝全屏背景 -->
<rect width="1280" height="720" fill="#004A82" id="layout-02_chapter-background" data-pptx-layer="layout" data-pptx-editable="false"/>
<!-- 右上角斜切浅色区域(天际) -->
<polygon points="700,0 1280,0 1280,400 1000,0" fill="url(#skyGradient)" fill-opacity="0.3"/>
<polygon points="850,0 1280,0 1280,280" fill="#3A9BD9" fill-opacity="0.15"/>
<!-- 底部波浪装饰 -->
<path d="M0,680 Q200,660 400,680 T800,660 T1200,680 L1280,680 L1280,720 L0,720 Z" fill="#006BB7" fill-opacity="0.3"/>
<path d="M0,695 Q200,680 400,695 T800,680 T1200,695 L1280,695 L1280,720 L0,720 Z" fill="#FFFFFF" fill-opacity="0.05"/>
<!-- 左侧大号半透明章节编号 -->
<text x="60" y="580" fill="#FFFFFF" fill-opacity="0.06" font-family="Arial, sans-serif" font-size="400" font-weight="bold">{{CHAPTER_NUM}}</text>
<!-- 金色装饰竖线 -->
<rect x="60" y="200" width="4" height="120" fill="#D4A84B"/>
<!-- CHAPTER 标签 -->
<text x="80" y="240" fill="#D4A84B" font-family="Arial, sans-serif" font-size="16" font-weight="bold" letter-spacing="4">CHAPTER</text>
<!-- 章节编号 -->
<text x="80" y="300" fill="#FFFFFF" font-family="Arial, sans-serif" font-size="72" font-weight="bold">{{CHAPTER_NUM}}</text>
<!-- 金色装饰横线 -->
<rect x="80" y="330" width="100" height="3" fill="#D4A84B"/>
<!-- 章节主标题 -->
<text x="80" y="420" fill="#FFFFFF" font-family="Microsoft YaHei, PingFang SC, Arial, sans-serif" font-size="44" font-weight="bold" id="slot-02_chapter-title-1" data-pptx-placeholder="title">{{CHAPTER_TITLE}}</text>
<!-- 章节描述 -->
<text x="80" y="480" fill="#FFFFFF" fill-opacity="0.7" font-family="Microsoft YaHei, Arial, sans-serif" font-size="18">{{CHAPTER_DESC}}</text>
<!-- 金色光点装饰 -->
<circle cx="1150" cy="100" r="4" fill="#D4A84B" fill-opacity="0.6"/>
<circle cx="1200" cy="150" r="3" fill="#D4A84B" fill-opacity="0.4"/>
<circle cx="1100" cy="180" r="5" fill="#D4A84B" fill-opacity="0.5"/>
<!-- 右下角 Logo(白色版本) -->
<image x="1020" y="640" width="220" height="60" xlink:href="../images/重庆大学logo2.png" preserveAspectRatio="xMidYMid meet"/>
<!-- 底部金色装饰线 -->
<rect x="80" y="640" width="200" height="2" fill="#D4A84B" fill-opacity="0.5"/>
</svg>

Before

Width:  |  Height:  |  Size: 2.7 KiB

@@ -1,80 +0,0 @@
<svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" viewBox="0 0 1280 720" data-pptx-layout="02_toc" data-pptx-layout-name="Agenda">
<defs>
<!-- 顶部斜切渐变 -->
<linearGradient id="headerGradient" x1="0%" y1="0%" x2="100%" y2="0%">
<stop offset="0%" stop-color="#004A82"/>
<stop offset="100%" stop-color="#006BB7"/>
</linearGradient>
<!-- 金色渐变 -->
<linearGradient id="goldAccent" x1="0%" y1="0%" x2="0%" y2="100%">
<stop offset="0%" stop-color="#E8C675"/>
<stop offset="100%" stop-color="#C49A3D"/>
</linearGradient>
</defs>
<!-- 背景 -->
<rect width="1280" height="720" fill="#FAFCFF" id="layout-02_toc-background" data-pptx-layer="layout" data-pptx-editable="false"/>
<!-- 顶部斜切蓝色装饰带 -->
<polygon points="0,0 1280,0 1280,80 0,100" fill="url(#headerGradient)"/>
<polygon points="0,100 1280,80 1280,95 0,115" fill="#E3F2FD"/>
<!-- 页面标题 -->
<text x="60" y="60" fill="#FFFFFF" font-family="Microsoft YaHei, PingFang SC, Arial, sans-serif" font-size="26" font-weight="bold" id="slot-02_toc-title-1" data-pptx-placeholder="title">{{TOC_TITLE}}</text>
<!-- Logo -->
<image x="1040" y="15" width="200" height="50" xlink:href="../images/重庆大学logo2.png" preserveAspectRatio="xMidYMid meet"/>
<!-- 目录内容区 -->
<!-- 左侧大号数字区域 -->
<!-- 目录项 1 -->
<text x="80" y="200" fill="#006BB7" fill-opacity="0.15" font-family="Arial, sans-serif" font-size="80" font-weight="bold">01</text>
<rect x="170" y="160" width="4" height="60" fill="url(#goldAccent)"/>
<text x="190" y="195" fill="#1A2E44" font-family="Microsoft YaHei, Arial, sans-serif" font-size="22" font-weight="bold">{{TOC_ITEM_1_TITLE}}</text>
<text x="190" y="225" fill="#6B7B8C" font-family="Microsoft YaHei, Arial, sans-serif" font-size="14">{{TOC_ITEM_1_DESC}}</text>
<!-- 目录项 2 -->
<text x="700" y="200" fill="#006BB7" fill-opacity="0.15" font-family="Arial, sans-serif" font-size="80" font-weight="bold">02</text>
<rect x="790" y="160" width="4" height="60" fill="url(#goldAccent)"/>
<text x="810" y="195" fill="#1A2E44" font-family="Microsoft YaHei, Arial, sans-serif" font-size="22" font-weight="bold">{{TOC_ITEM_2_TITLE}}</text>
<text x="810" y="225" fill="#6B7B8C" font-family="Microsoft YaHei, Arial, sans-serif" font-size="14">{{TOC_ITEM_2_DESC}}</text>
<!-- 目录项 3 -->
<text x="80" y="340" fill="#006BB7" fill-opacity="0.15" font-family="Arial, sans-serif" font-size="80" font-weight="bold">03</text>
<rect x="170" y="300" width="4" height="60" fill="url(#goldAccent)"/>
<text x="190" y="335" fill="#1A2E44" font-family="Microsoft YaHei, Arial, sans-serif" font-size="22" font-weight="bold">{{TOC_ITEM_3_TITLE}}</text>
<text x="190" y="365" fill="#6B7B8C" font-family="Microsoft YaHei, Arial, sans-serif" font-size="14">{{TOC_ITEM_3_DESC}}</text>
<!-- 目录项 4 -->
<text x="700" y="340" fill="#006BB7" fill-opacity="0.15" font-family="Arial, sans-serif" font-size="80" font-weight="bold">04</text>
<rect x="790" y="300" width="4" height="60" fill="url(#goldAccent)"/>
<text x="810" y="335" fill="#1A2E44" font-family="Microsoft YaHei, Arial, sans-serif" font-size="22" font-weight="bold">{{TOC_ITEM_4_TITLE}}</text>
<text x="810" y="365" fill="#6B7B8C" font-family="Microsoft YaHei, Arial, sans-serif" font-size="14">{{TOC_ITEM_4_DESC}}</text>
<!-- 目录项 5 -->
<text x="80" y="480" fill="#006BB7" fill-opacity="0.15" font-family="Arial, sans-serif" font-size="80" font-weight="bold">05</text>
<rect x="170" y="440" width="4" height="60" fill="url(#goldAccent)"/>
<text x="190" y="475" fill="#1A2E44" font-family="Microsoft YaHei, Arial, sans-serif" font-size="22" font-weight="bold">{{TOC_ITEM_5_TITLE}}</text>
<text x="190" y="505" fill="#6B7B8C" font-family="Microsoft YaHei, Arial, sans-serif" font-size="14">{{TOC_ITEM_5_DESC}}</text>
<!-- 目录项 6(可选,更淡化) -->
<text x="700" y="480" fill="#006BB7" fill-opacity="0.08" font-family="Arial, sans-serif" font-size="80" font-weight="bold">06</text>
<rect x="790" y="440" width="4" height="60" fill="#D0D7E0"/>
<text x="810" y="475" fill="#A0AEC0" font-family="Microsoft YaHei, Arial, sans-serif" font-size="22" font-weight="bold">{{TOC_ITEM_6_TITLE}}</text>
<text x="810" y="505" fill="#B0BCC8" font-family="Microsoft YaHei, Arial, sans-serif" font-size="14">{{TOC_ITEM_6_DESC}}</text>
<!-- 底部波浪装饰 -->
<path d="M0,680 Q160,665 320,680 T640,665 T960,680 T1280,665 L1280,720 L0,720 Z" fill="#006BB7" fill-opacity="0.06"/>
<!-- 页脚 -->
<text x="640" y="680" text-anchor="middle" fill="#6B7B8C" font-family="Microsoft YaHei, Arial, sans-serif" font-size="12">目录 · CONTENTS</text>
<!-- 页码 -->
<rect x="1180" y="655" width="40" height="28" fill="#006BB7" rx="4"/>
<text x="1200" y="675" text-anchor="middle" fill="#FFFFFF" font-family="Arial, sans-serif" font-size="13" font-weight="bold" id="slot-02_toc-slide_number-2" data-pptx-placeholder="slide-number">{{PAGE_NUM}}</text>
<!-- 左下角金色光点 -->
<circle cx="50" cy="670" r="3" fill="#D4A84B" fill-opacity="0.5"/>
<circle cx="80" cy="690" r="2" fill="#D4A84B" fill-opacity="0.4"/>
</svg>

Before

Width:  |  Height:  |  Size: 5.2 KiB

@@ -1,56 +0,0 @@
<svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" viewBox="0 0 1280 720" data-pptx-layout="03_content" data-pptx-layout-name="Content">
<defs>
<!-- 顶部斜切渐变 -->
<linearGradient id="headerGradient" x1="0%" y1="0%" x2="100%" y2="0%">
<stop offset="0%" stop-color="#004A82"/>
<stop offset="100%" stop-color="#006BB7"/>
</linearGradient>
</defs>
<!-- 背景 -->
<rect width="1280" height="720" fill="#FAFCFF" id="layout-03_content-background" data-pptx-layer="layout" data-pptx-editable="false"/>
<!-- 顶部斜切蓝色装饰带(左高右低) -->
<polygon points="0,0 1280,0 1280,70 0,90" fill="url(#headerGradient)"/>
<!-- 斜切带下方的浅色过渡 -->
<polygon points="0,90 1280,70 1280,85 0,105" fill="#E3F2FD"/>
<!-- 页面标题 -->
<text x="60" y="55" fill="#FFFFFF" font-family="Microsoft YaHei, PingFang SC, Arial, sans-serif" font-size="24" font-weight="bold" id="slot-03_content-title-1" data-pptx-placeholder="title">{{PAGE_TITLE}}</text>
<!-- Logo(右上角,在斜切带上) -->
<image x="1040" y="12" width="200" height="50" xlink:href="../images/重庆大学logo2.png" preserveAspectRatio="xMidYMid meet"/>
<!-- 左侧金色装饰竖线(贯穿内容区) -->
<rect x="40" y="130" width="3" height="480" fill="#D4A84B" fill-opacity="0.6"/>
<!-- 核心观点条 -->
<rect x="60" y="120" width="1160" height="50" fill="#E3F2FD" rx="6"/>
<rect x="60" y="120" width="4" height="50" fill="#006BB7"/>
<text x="80" y="152" fill="#006BB7" font-family="Microsoft YaHei, Arial, sans-serif" font-size="15" font-weight="bold">核心观点</text>
<text x="170" y="152" fill="#333D4A" font-family="Microsoft YaHei, Arial, sans-serif" font-size="15" id="slot-03_content-body-2" data-pptx-placeholder="body">{{KEY_MESSAGE}}</text>
<!-- 内容区域占位 -->
<rect x="60" y="190" width="1160" height="440" fill="#FFFFFF" stroke="#E3F2FD" stroke-width="2" rx="8"/>
<text x="640" y="410" text-anchor="middle" fill="#B0C4D4" font-family="Microsoft YaHei, Arial, sans-serif" font-size="16">{{CONTENT_AREA}}</text>
<!-- 底部波浪装饰 -->
<path d="M0,690 Q160,680 320,690 T640,680 T960,690 T1280,680 L1280,720 L0,720 Z" fill="#006BB7" fill-opacity="0.05"/>
<!-- 页脚区域 -->
<rect x="0" y="650" width="1280" height="70" fill="#FAFCFF"/>
<!-- 页脚左侧:数据来源 -->
<text x="60" y="685" fill="#6B7B8C" font-family="Microsoft YaHei, Arial, sans-serif" font-size="11">数据来源:{{SOURCE}}</text>
<!-- 页脚中部:章节名称 -->
<text x="640" y="685" text-anchor="middle" fill="#6B7B8C" font-family="Microsoft YaHei, Arial, sans-serif" font-size="12">{{SECTION_NAME}}</text>
<!-- 页脚右侧:页码(金色装饰) -->
<rect x="1180" y="665" width="40" height="28" fill="#006BB7" rx="4"/>
<text x="1200" y="685" text-anchor="middle" fill="#FFFFFF" font-family="Arial, sans-serif" font-size="13" font-weight="bold" id="slot-03_content-slide_number-3" data-pptx-placeholder="slide-number">{{PAGE_NUM}}</text>
<!-- 左下角金色光点 -->
<circle cx="50" cy="670" r="3" fill="#D4A84B" fill-opacity="0.5"/>
</svg>

Before

Width:  |  Height:  |  Size: 3.2 KiB

@@ -1,62 +0,0 @@
<svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" viewBox="0 0 1280 720" data-pptx-layout="04_ending" data-pptx-layout-name="Closing">
<defs>
<!-- 底部渐变 -->
<linearGradient id="bottomBar" x1="0%" y1="0%" x2="100%" y2="0%">
<stop offset="0%" stop-color="#003D6B"/>
<stop offset="100%" stop-color="#006BB7"/>
</linearGradient>
<!-- 金色渐变 -->
<linearGradient id="goldAccent" x1="0%" y1="0%" x2="100%" y2="0%">
<stop offset="0%" stop-color="#B8860B"/>
<stop offset="50%" stop-color="#D4A84B"/>
<stop offset="100%" stop-color="#B8860B"/>
</linearGradient>
</defs>
<!-- 背景 -->
<rect width="1280" height="720" fill="#FFFFFF" id="layout-04_ending-background" data-pptx-layer="layout" data-pptx-editable="false"/>
<!-- 顶部细线装饰 -->
<rect x="0" y="0" width="1280" height="6" fill="#006BB7"/>
<rect x="0" y="6" width="1280" height="2" fill="#D4A84B"/>
<!-- 中央 Logo(大尺寸) -->
<image x="390" y="160" width="500" height="150" xlink:href="../images/重庆大学logo.png" preserveAspectRatio="xMidYMid meet"/>
<!-- 金色装饰分隔线 -->
<rect x="490" y="340" width="300" height="2" fill="url(#goldAccent)"/>
<circle cx="490" cy="341" r="4" fill="#D4A84B"/>
<circle cx="790" cy="341" r="4" fill="#D4A84B"/>
<!-- 感谢语 -->
<text x="640" y="420" text-anchor="middle" fill="#1A2E44" font-family="Microsoft YaHei, PingFang SC, Arial, sans-serif" font-size="48" font-weight="bold">{{THANK_YOU}}</text>
<!-- 副标语 -->
<text x="640" y="475" text-anchor="middle" fill="#006BB7" font-family="Microsoft YaHei, Arial, sans-serif" font-size="18">{{ENDING_SUBTITLE}}</text>
<!-- 底部色块 -->
<rect x="0" y="560" width="1280" height="160" fill="url(#bottomBar)"/>
<!-- 底部色块顶部金色装饰线 -->
<rect x="0" y="558" width="1280" height="3" fill="#D4A84B"/>
<!-- 底部白色装饰纹理 -->
<line x1="0" y1="600" x2="1280" y2="600" stroke="#FFFFFF" stroke-width="1" stroke-opacity="0.05"/>
<line x1="0" y1="650" x2="1280" y2="650" stroke="#FFFFFF" stroke-width="1" stroke-opacity="0.03"/>
<!-- 联系信息(在底部色块上) -->
<text x="640" y="615" text-anchor="middle" fill="#FFFFFF" font-family="Microsoft YaHei, Arial, sans-serif" font-size="16" font-weight="bold">{{CONTACT_INFO}}</text>
<text x="640" y="650" text-anchor="middle" fill="#FFFFFF" fill-opacity="0.85" font-family="Microsoft YaHei, Arial, sans-serif" font-size="14">{{EMAIL}}</text>
<!-- 版权信息 -->
<text x="640" y="695" text-anchor="middle" fill="#FFFFFF" fill-opacity="0.5" font-family="Microsoft YaHei, Arial, sans-serif" font-size="11">{{COPYRIGHT}}</text>
<!-- 页码 -->
<text x="1220" y="695" text-anchor="middle" fill="#FFFFFF" fill-opacity="0.5" font-family="Arial, sans-serif" font-size="11" id="slot-04_ending-slide_number-1" data-pptx-placeholder="slide-number">{{PAGE_NUM}}</text>
<!-- 左侧 CQU 水印 -->
<text x="80" y="660" fill="#FFFFFF" fill-opacity="0.08" font-family="Arial, sans-serif" font-size="80" font-weight="bold">CQU</text>
<!-- 右下角装饰 -->
<polygon points="1280,560 1280,720 1120,720" fill="#FFFFFF" fill-opacity="0.03"/>
</svg>

Before

Width:  |  Height:  |  Size: 3.2 KiB

@@ -1,235 +0,0 @@
---
deck_id: 重庆大学
kind: deck
native_structure_mode: template
summary: Academic defense, research reports, teaching presentations, scholarly exchange.
canvas_format: ppt169
page_count: 5
primary_color: "#006BB7"
---
# Chongqing University (重庆大学) Template - Design Specification
> A distinctive design blending the layered imagery of the Mountain City with modern academic elegance.
---
## I. Template Overview
| Property | Description |
| ------------------ | -------------------------------------------------------------------- |
| **Template Name** | Chongqing University (重庆大学) |
| **Use Cases** | Academic defense, research reports, teaching presentations, scholarly exchange |
| **Design Tone** | Academically grounded · Mountain City charm · Modern minimalism |
| **Design Inspiration** | Chongqing's layered terrain + the gravitas of historic campus buildings + modern academic professionalism |
### Design Features
1. **Layered Geometry**: Diagonal color blocks simulate the terraced landscape of the Mountain City, breaking away from traditional rectangular layouts
2. **Asymmetric Aesthetics**: Left-heavy visual balance guides reading focus
3. **Gradient Color Bands**: Deep-to-light transitions symbolize the journey from a rich history to a bright future
4. **Wave Patterns**: Abstract Yangtze River / Jialing River water elements
---
## II. Canvas Specification
| Property | Value |
| ------------------ | ----------------------------- |
| **Format** | Standard 16:9 |
| **Dimensions** | 1280 × 720 px |
| **viewBox** | `0 0 1280 720` |
| **Page Margins** | Left/right 60px, top/bottom 40px |
| **Content Safe Area** | x: 60-1220, y: 100-660 |
---
## III. Color Scheme
### Primary Colors (Extracted from Logo)
| Role | Value | Notes |
| ------------------ | ----------- | -------------------------------------------- |
| **CQU Blue** | `#006BB7` | Emblem primary color; header, titles, main elements |
| **Deep Blue** | `#004A82` | Chapter page background, emphasis areas |
| **Sky Blue** | `#3A9BD9` | Accent color, gradient endpoint |
| **Cloud Blue** | `#E3F2FD` | Light background, card base color |
| **Dawn Gold** | `#D4A84B` | Decorative accents, highlights (symbolizing brightness) |
| **Background White**| `#FAFCFF` | Subtly blue-tinted pure white |
### Text Colors
| Role | Value | Usage |
| ------------------ | ----------- | ------------------------ |
| **Dark Ink Text** | `#1A2E44` | Main titles, heading text |
| **Primary Text** | `#333D4A` | Body content |
| **Secondary Text** | `#6B7B8C` | Captions, annotations |
| **White Text** | `#FFFFFF` | Text on dark backgrounds |
### Gradient Scheme
```
Primary gradient: #004A82#006BB7#3A9BD9 (deep → light, used for background diagonal cuts)
Gold gradient: #C49A3D#D4A84B#E8C675 (decorative use)
```
---
## IV. Typography System
### Font Stack
**Font Stack**: `"Microsoft YaHei", "微软雅黑", "PingFang SC", Arial, sans-serif`
### Font Size Hierarchy
| Level | Usage | Size | Weight | Notes |
| ----- | ------------------ | ---- | ------- | ------------------ |
| H1 | Cover main title | 48px | Bold | Grand and dignified |
| H2 | Page title | 26px | Bold | |
| H3 | Chapter title | 44px | Bold | |
| H4 | Card title | 22px | Bold | |
| P | Body content | 17px | Regular | |
| High | Emphasized data | 32px | Bold | |
| Sub | Notes/sources | 13px | Regular | |
| XS | Page number/copyright | 11px | Regular | |
---
## V. Core Visual Elements
### 1. Diagonal Color Blocks (Mountain City Layers)
The template's signature design uses diagonally divided color blocks to simulate the layered terrain of the Mountain City:
```
Cover: Large deep-blue diagonal block in the lower-left corner (approx. 40% of area)
Chapter page: Full-screen deep blue + light diagonal accent in the upper-right
Content page: Small diagonal accent strip at the top
```
### 2. Wave Patterns (Two Rivers Imagery)
Abstract curves symbolizing the Yangtze and Jialing Rivers:
```xml
<path d="M0,700 Q320,680 640,700 T1280,680 L1280,720 L0,720 Z"
fill="#006BB7" fill-opacity="0.08"/>
```
### 3. Light Dot Decorations (City Lights)
Small circle elements representing the nighttime lights of the Mountain City:
```xml
<circle cx="x" cy="y" r="3" fill="#D4A84B" fill-opacity="0.6"/>
```
---
## VI. Page Types
### 1. Cover Page (01_cover.svg)
**Layout Structure**:
- Upper-right area: Logo (using logo.png)
- Center-left: Main title + subtitle
- Lower-left corner: Large diagonal deep-blue color block (extending from lower-left to upper-right)
- Bottom: Presenter info, date
- Decorations: Wave patterns + gold light dots
### 2. Chapter Page (02_chapter.svg)
**Layout Structure**:
- Full-screen deep blue background
- Upper-right: Diagonal light area (sky blue gradient)
- Left: Large chapter number (semi-transparent)
- Center-left: Chapter title (white)
- Bottom: Gold decorative line + Logo (white version)
### 3. Content Page (03_content.svg)
**Layout Structure**:
- Top: Diagonal blue accent strip (approx. 80px height, higher on left, lower on right)
- On the accent strip: Page title + Logo
- Body: White content area (flexible layout)
- Left: Thin gold decorative line
- Bottom: Clean footer + wave pattern
### 4. Ending Page (04_ending.svg)
**Layout Structure**:
- Center: Large-sized Logo
- Below logo: Thank-you message
- Bottom diagonal blue area: Contact information
- Decorations: Wave patterns + gold light dots
### 5. Table of Contents (02_toc.svg)
**Layout Structure**:
- Top diagonal accent strip + title
- Left: Large numeric indices (vertically arranged, with gold accents)
- Right: TOC item text
- Bottom: Wave decoration
---
## VII. SVG Page Roster
| File | Role | Description |
|------|------|-------------|
| `01_cover.svg` | cover | Title slide; brand/project name + presenter + date |
| `02_chapter.svg` | chapter | Chapter divider page (large number + chapter title) |
| `02_toc.svg` | toc | Table of contents listing major sections |
| `03_content.svg` | content | Main content page; body of the deck |
| `04_ending.svg` | ending | Closing/thank-you page |
## VIII. Logo Usage Guidelines
| File | Applicable Context | Notes |
|------|-------------------|-------|
| `重庆大学logo.png` | Light/white backgrounds | Blue version |
| `重庆大学logo2.png` | Dark/blue backgrounds | White version |
**Recommended Logo Sizes**:
- Cover page: Width 280-320px
- Content page header: Width 160-200px
- Ending page: Width 320-400px
Use the packaged university logo assets through the standard project image pipeline.
---
## IX. Spacing Specification
| Element | Value |
| -------------------- | ---------- |
| Page margins | 60px |
| Content block spacing | 28px |
| Card inner padding | 24px |
| Card border radius | 12px |
| Diagonal cut angle | Approx. 8-12° |
---
## X. Placeholder Specification
| Placeholder | Description |
| -------------------- | ---------------------- |
| `{{TITLE}}` | Main title |
| `{{SUBTITLE}}` | Subtitle |
| `{{AUTHOR}}` | Presenter name |
| `{{ADVISOR}}` | Thesis advisor |
| `{{INSTITUTION}}` | College/Institution |
| `{{DATE}}` | Date |
| `{{PAGE_TITLE}}` | Page title |
| `{{CHAPTER_NUM}}` | Chapter number |
| `{{CHAPTER_TITLE}}` | Chapter title |
| `{{CHAPTER_DESC}}` | Chapter description |
| `{{KEY_MESSAGE}}` | Key message |
| `{{CONTENT_AREA}}` | Content area |
| `{{PAGE_NUM}}` | Page number |
| `{{THANK_YOU}}` | Thank-you message |
| `{{CONTACT_INFO}}` | Contact information |
| `{{TOC_ITEM_N_TITLE}}` | TOC item title |
| `{{TOC_ITEM_N_DESC}}` | TOC item description |
@@ -250,6 +250,8 @@ Catalog read: 76 templates
> **Audit rule**: `Summary-quote` must be copy-pasted verbatim — paraphrasing breaks the audit. Every template name listed must `grep` cleanly inside `charts_index.json` (so misspellings/inventions fail). If fewer than 3 viz pages exist, list what exists and note "fewer than 3 viz pages"; runners-up still required for each page that does exist.
> **Native-preset candidates → append to `Usage`**: for a page already in this list, when its content calls for a literal stock PowerPoint shape (chevron, block arrow, standard flowchart node, callout, banner, star — judged from the page plan, not a template's name), append a candidate note to that page's `Usage`, e.g. `…usage…; native-preset candidate: chevron; Executor applies executor-base §3.0`. The Executor still selects the exact preset, frame, and paint. See [`strategist.md`](../references/strategist.md) Template Match.
---
## VIII. Image Resource List (if needed)
@@ -306,7 +308,7 @@ Catalog read: 76 templates
## IX. Content Outline
> **Native Layout boundary**: Each `Layout` line below describes visual composition intent and feeds the planning-time structured mapping. Before SVG generation, Strategist writes the Master roster and exactly one `<master_key> | <layout_key> | <PowerPoint layout name>` row per page. Free-design/brand-only pages use that structure from their first draft; template pages also select an input prototype through `page_layouts`. Strict preserves the prototype contract. Adaptive keeps its Master and may assign a new Layout key during page authoring only when fixed Layout atoms or slot topology/bounds change. Legacy prototypes first run [`restore-pptx-structure`](../workflows/restore-pptx-structure.md); no deferred distillation or immediate-compatibility fallback exists.
> **Native Layout boundary**: Each `Layout` line below always describes visual composition intent. On free-design and brand-only routes, it does not create native Master/Layout identity: `spec_lock.md` uses `pptx_structure.mode: flat`, omits `pptx_masters` / `pptx_layouts` / `page_pptx_layouts` / `page_layouts`, and every SVG object stays Slide-local. Export materializes one clean project-owned Master plus one Blank Layout from the current lock, removes stock content placeholders/Layout inventory, and retains only the standard date/footer/slide-number capability hooks. Deck/layout template routes use `mode: structured`: Strategist writes each unique Master/Layout definition once, assigns every page through `page_pptx_layouts`, and selects its authoring prototype through `page_layouts`. Strict preserves the prototype contract. Adaptive keeps its Master and may define and assign a new Layout key during page authoring only when fixed Layout atoms or slot topology/bounds change. Legacy prototypes first run [`restore-pptx-structure`](../workflows/restore-pptx-structure.md); no deferred distillation or immediate-compatibility fallback exists.
### Part 1: [Chapter Name]
@@ -1,49 +0,0 @@
<?xml version="1.0" encoding="UTF-8"?>
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 1280 720" data-pptx-layout="01_cover" data-pptx-layout-name="Cover">
<!-- 背景 -->
<rect width="1280" height="720" fill="#FFFFFF" id="layout-01_cover-background" data-pptx-layer="layout" data-pptx-editable="false"/>
<!-- ==================== 顶部装饰区域 ==================== -->
<!-- 深蓝色主横条 -->
<rect x="0" y="0" width="1280" height="100" fill="#003366"/>
<!-- 左侧红色竖条装饰 -->
<rect x="0" y="0" width="6" height="100" fill="#CC0000"/>
<!-- 右上角 Logo 区域占位 -->
<rect x="1080" y="25" width="160" height="50" fill="none" stroke="#FFFFFF" stroke-width="1" stroke-opacity="0.3" rx="4"/>
<text x="1160" y="58" text-anchor="middle" fill="#FFFFFF" font-family="Microsoft YaHei, Arial, sans-serif" font-size="18" font-weight="bold" id="semantic-01_cover-logo-1" data-pptx-role="logo">
{{LOGO}}
</text>
<!-- ==================== 主内容区域 ==================== -->
<!-- 主标题 -->
<text x="640" y="340" text-anchor="middle" fill="#003366" font-family="Microsoft YaHei, Arial, sans-serif" font-size="56" font-weight="bold" id="slot-01_cover-title-1" data-pptx-placeholder="title">
{{TITLE}}
</text>
<!-- 副标题 -->
<text x="640" y="410" text-anchor="middle" fill="#666666" font-family="Microsoft YaHei, Arial, sans-serif" font-size="28" id="slot-01_cover-subtitle-2" data-pptx-placeholder="subtitle">
{{SUBTITLE}}
</text>
<!-- 装饰分割线 -->
<line x1="420" y1="450" x2="860" y2="450" stroke="#0066CC" stroke-width="2"/>
<circle cx="640" cy="450" r="5" fill="#0066CC"/>
<!-- ==================== 答辩人信息区域 ==================== -->
<text x="640" y="520" text-anchor="middle" fill="#333333" font-family="Microsoft YaHei, Arial, sans-serif" font-size="24">
答辩人:{{AUTHOR}}
</text>
<text x="640" y="560" text-anchor="middle" fill="#666666" font-family="Microsoft YaHei, Arial, sans-serif" font-size="20">
指导老师:{{ADVISOR}}
</text>
<text x="640" y="600" text-anchor="middle" fill="#666666" font-family="Microsoft YaHei, Arial, sans-serif" font-size="18">
{{INSTITUTION}}
</text>
<!-- ==================== 底部信息 ==================== -->
<rect x="0" y="665" width="1280" height="55" fill="#F5F7FA"/>
<text x="640" y="698" text-anchor="middle" fill="#999999" font-family="Microsoft YaHei, Arial, sans-serif" font-size="14">
{{DATE}}
</text>
</svg>

Before

Width:  |  Height:  |  Size: 2.5 KiB

@@ -1,36 +0,0 @@
<?xml version="1.0" encoding="UTF-8"?>
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 1280 720" data-pptx-layout="02_chapter" data-pptx-layout-name="Section">
<!-- 背景:全屏深蓝,营造过渡感和沉浸感 -->
<rect width="1280" height="720" fill="#003366" id="layout-02_chapter-background" data-pptx-layer="layout" data-pptx-editable="false"/>
<!-- 背景装饰:右侧几何图形,增加层次 -->
<path d="M800 0 L1280 0 L1280 720 L600 720 Z" fill="#004080" fill-opacity="0.3"/>
<rect x="1200" y="0" width="80" height="720" fill="#002244" fill-opacity="0.2"/>
<!-- 左侧红色装饰条 -->
<rect x="0" y="240" width="12" height="240" fill="#CC0000"/>
<!-- ==================== 章节信息区域 ==================== -->
<!-- 章节编号:大号数字,半透明背景字 -->
<text x="120" y="480" fill="#FFFFFF" fill-opacity="0.08" font-family="Microsoft YaHei, Arial, sans-serif" font-size="280" font-weight="bold">
{{CHAPTER_NUM}}
</text>
<!-- 章节标题:醒目白色 -->
<text x="380" y="340" fill="#FFFFFF" font-family="Microsoft YaHei, Arial, sans-serif" font-size="56" font-weight="bold" id="slot-02_chapter-title-1" data-pptx-placeholder="title">
{{CHAPTER_TITLE}}
</text>
<!-- 章节描述/摘要:浅灰色 -->
<text x="380" y="410" fill="#E8F4FC" font-family="Microsoft YaHei, Arial, sans-serif" font-size="24">
{{CHAPTER_DESC}}
</text>
<!-- 装饰线条 -->
<line x1="380" y1="265" x2="500" y2="265" stroke="#CC0000" stroke-width="6"/>
<!-- 底部信息 -->
<text x="1240" y="680" text-anchor="end" fill="#FFFFFF" fill-opacity="0.4" font-family="Microsoft YaHei, Arial, sans-serif" font-size="18">
{{TITLE}}
</text>
</svg>

Before

Width:  |  Height:  |  Size: 1.7 KiB

@@ -1,63 +0,0 @@
<?xml version="1.0" encoding="UTF-8"?>
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 1280 720" data-pptx-layout="02_toc" data-pptx-layout-name="Agenda">
<!-- 背景 -->
<rect width="1280" height="720" fill="#FFFFFF" id="layout-02_toc-background" data-pptx-layer="layout" data-pptx-editable="false"/>
<!-- ==================== 页眉区域 ==================== -->
<rect x="0" y="0" width="1280" height="70" fill="#003366"/>
<rect x="0" y="0" width="6" height="70" fill="#CC0000"/>
<!-- 页面标题 -->
<text x="40" y="46" fill="#FFFFFF" font-family="Microsoft YaHei, Arial, sans-serif" font-size="28" font-weight="bold">
目 录
</text>
<!-- 右上角 Logo -->
<text x="1200" y="46" text-anchor="end" fill="#FFFFFF" font-family="Microsoft YaHei, Arial, sans-serif" font-size="18" font-weight="bold" id="semantic-02_toc-logo-1" data-pptx-role="logo">
{{LOGO}}
</text>
<!-- ==================== 目录内容区域 ==================== -->
<!-- 目录项容器 -->
<rect x="80" y="100" width="1120" height="520" fill="none"/>
<!-- 目录项 01 -->
<rect x="80" y="115" width="540" height="90" fill="#E8F4FC" rx="8"/>
<rect x="80" y="115" width="6" height="90" fill="#003366" rx="3"/>
<text x="120" y="160" fill="#003366" font-family="Microsoft YaHei, Arial, sans-serif" font-size="36" font-weight="bold">01</text>
<text x="185" y="160" fill="#003366" font-family="Microsoft YaHei, Arial, sans-serif" font-size="24" font-weight="bold">{{TOC_ITEM_1_TITLE}}</text>
<text x="120" y="188" fill="#666666" font-family="Microsoft YaHei, Arial, sans-serif" font-size="14">{{TOC_ITEM_1_DESC}}</text>
<!-- 目录项 02 -->
<rect x="660" y="115" width="540" height="90" fill="#E8F4FC" rx="8"/>
<rect x="660" y="115" width="6" height="90" fill="#003366" rx="3"/>
<text x="700" y="160" fill="#003366" font-family="Microsoft YaHei, Arial, sans-serif" font-size="36" font-weight="bold">02</text>
<text x="765" y="160" fill="#003366" font-family="Microsoft YaHei, Arial, sans-serif" font-size="24" font-weight="bold">{{TOC_ITEM_2_TITLE}}</text>
<text x="700" y="188" fill="#666666" font-family="Microsoft YaHei, Arial, sans-serif" font-size="14">{{TOC_ITEM_2_DESC}}</text>
<!-- 目录项 03 -->
<rect x="80" y="230" width="540" height="90" fill="#E8F4FC" rx="8"/>
<rect x="80" y="230" width="6" height="90" fill="#0066CC" rx="3"/>
<text x="120" y="275" fill="#003366" font-family="Microsoft YaHei, Arial, sans-serif" font-size="36" font-weight="bold">03</text>
<text x="185" y="275" fill="#003366" font-family="Microsoft YaHei, Arial, sans-serif" font-size="24" font-weight="bold">{{TOC_ITEM_3_TITLE}}</text>
<text x="120" y="303" fill="#666666" font-family="Microsoft YaHei, Arial, sans-serif" font-size="14">{{TOC_ITEM_3_DESC}}</text>
<!-- 目录项 04 -->
<rect x="660" y="230" width="540" height="90" fill="#E8F4FC" rx="8"/>
<rect x="660" y="230" width="6" height="90" fill="#0066CC" rx="3"/>
<text x="700" y="275" fill="#003366" font-family="Microsoft YaHei, Arial, sans-serif" font-size="36" font-weight="bold">04</text>
<text x="765" y="275" fill="#003366" font-family="Microsoft YaHei, Arial, sans-serif" font-size="24" font-weight="bold">{{TOC_ITEM_4_TITLE}}</text>
<text x="700" y="303" fill="#666666" font-family="Microsoft YaHei, Arial, sans-serif" font-size="14">{{TOC_ITEM_4_DESC}}</text>
<!-- 目录项 05(可选) -->
<rect x="80" y="345" width="540" height="90" fill="none" stroke="#D0D7E0" stroke-width="1" stroke-dasharray="4,4" rx="8"/>
<text x="350" y="398" text-anchor="middle" fill="#999999" font-family="Microsoft YaHei, Arial, sans-serif" font-size="16">{{TOC_ITEM_5_TITLE}}</text>
<!-- 目录项 06(可选) -->
<rect x="660" y="345" width="540" height="90" fill="none" stroke="#D0D7E0" stroke-width="1" stroke-dasharray="4,4" rx="8"/>
<text x="930" y="398" text-anchor="middle" fill="#999999" font-family="Microsoft YaHei, Arial, sans-serif" font-size="16">{{TOC_ITEM_6_TITLE}}</text>
<!-- ==================== 页脚区域 ==================== -->
<line x1="40" y1="665" x2="1240" y2="665" stroke="#E8F4FC" stroke-width="1"/>
<text x="1220" y="698" text-anchor="end" fill="#999999" font-family="Microsoft YaHei, Arial, sans-serif" font-size="14" id="slot-02_toc-slide_number-1" data-pptx-placeholder="slide-number">{{PAGE_NUM}}</text>
</svg>

Before

Width:  |  Height:  |  Size: 4.3 KiB

@@ -1,58 +0,0 @@
<?xml version="1.0" encoding="UTF-8"?>
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 1280 720" data-pptx-layout="03_content" data-pptx-layout-name="Content">
<!-- 背景 -->
<rect width="1280" height="720" fill="#FFFFFF" id="layout-03_content-background" data-pptx-layer="layout" data-pptx-editable="false"/>
<!-- ==================== 页眉区域 ==================== -->
<!-- 深蓝色页眉背景 -->
<rect x="0" y="0" width="1280" height="70" fill="#003366"/>
<!-- 左侧红色竖条装饰 -->
<rect x="0" y="0" width="6" height="70" fill="#CC0000"/>
<!-- 章节编号 + 页面标题 -->
<text x="40" y="46" fill="#FFFFFF" font-family="Microsoft YaHei, Arial, sans-serif" font-size="28" font-weight="bold" id="slot-03_content-title-1" data-pptx-placeholder="title">
{{SECTION_NUM}} {{PAGE_TITLE}}
</text>
<!-- 右上角 Logo -->
<rect x="1100" y="20" width="140" height="30" fill="none"/>
<text x="1220" y="46" text-anchor="end" fill="#FFFFFF" font-family="Microsoft YaHei, Arial, sans-serif" font-size="18" font-weight="bold" id="semantic-03_content-logo-1" data-pptx-role="logo">
{{LOGO}}
</text>
<!-- ==================== 核心观点条(可选) ==================== -->
<rect x="0" y="70" width="1280" height="50" fill="#E8F4FC"/>
<rect x="0" y="70" width="6" height="50" fill="#0066CC"/>
<text x="40" y="102" fill="#333333" font-family="Microsoft YaHei, Arial, sans-serif" font-size="18" id="slot-03_content-body-2" data-pptx-placeholder="body">
{{KEY_MESSAGE}}
</text>
<!-- ==================== 内容区域 ==================== -->
<!--
AI 灵活布局区
可用空间: x=40, y=135, width=1200, height=515
AI 根据实际内容自由安排布局(单栏、双栏、图文混排等)
-->
<rect x="40" y="135" width="1200" height="515" fill="#FFFFFF" rx="4"/>
<rect x="40" y="135" width="1200" height="515" fill="none" stroke="#D0D7E0" stroke-width="1" rx="4" stroke-dasharray="8,4"/>
<text x="640" y="400" text-anchor="middle" fill="#CBD5E1" font-family="Microsoft YaHei, Arial, sans-serif" font-size="16">
{{CONTENT_AREA}}
</text>
<!-- 内容区域说明(仅模板展示用,实际生成时替换) -->
<text x="640" y="430" text-anchor="middle" fill="#CBD5E1" font-family="Microsoft YaHei, Arial, sans-serif" font-size="14">
可用布局:单栏、双栏、图文混排、卡片网格、时间线等
</text>
<!-- ==================== 页脚区域 ==================== -->
<line x1="40" y1="665" x2="1240" y2="665" stroke="#E8F4FC" stroke-width="1"/>
<text x="40" y="695" fill="#999999" font-family="Microsoft YaHei, Arial, sans-serif" font-size="12">
数据来源:{{SOURCE}}
</text>
<text x="640" y="695" text-anchor="middle" fill="#999999" font-family="Microsoft YaHei, Arial, sans-serif" font-size="12">
{{SECTION_NAME}}
</text>
<text x="1220" y="695" text-anchor="end" fill="#666666" font-family="Microsoft YaHei, Arial, sans-serif" font-size="14" id="slot-03_content-slide_number-3" data-pptx-placeholder="slide-number">
{{PAGE_NUM}}
</text>
</svg>

Before

Width:  |  Height:  |  Size: 3.1 KiB

@@ -1,52 +0,0 @@
<?xml version="1.0" encoding="UTF-8"?>
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 1280 720" data-pptx-layout="04_ending" data-pptx-layout-name="Closing">
<!-- 背景 -->
<rect width="1280" height="720" fill="#FFFFFF" id="layout-04_ending-background" data-pptx-layer="layout" data-pptx-editable="false"/>
<!-- ==================== 顶部装饰区域 ==================== -->
<rect x="0" y="0" width="1280" height="100" fill="#003366"/>
<rect x="0" y="0" width="6" height="100" fill="#CC0000"/>
<!-- 右上角 Logo -->
<text x="1200" y="58" text-anchor="end" fill="#FFFFFF" font-family="Microsoft YaHei, Arial, sans-serif" font-size="18" font-weight="bold" id="semantic-04_ending-logo-1" data-pptx-role="logo">
{{LOGO}}
</text>
<!-- ==================== 主内容区域 ==================== -->
<!-- 感谢语 -->
<text x="640" y="300" text-anchor="middle" fill="#003366" font-family="Microsoft YaHei, Arial, sans-serif" font-size="56" font-weight="bold">
{{THANK_YOU}}
</text>
<!-- 副标语 -->
<text x="640" y="365" text-anchor="middle" fill="#666666" font-family="Microsoft YaHei, Arial, sans-serif" font-size="24">
{{ENDING_SUBTITLE}}
</text>
<!-- 装饰分割线 -->
<line x1="460" y1="405" x2="820" y2="405" stroke="#0066CC" stroke-width="2"/>
<circle cx="640" cy="405" r="5" fill="#CC0000"/>
<!-- ==================== 联系信息区域 ==================== -->
<rect x="360" y="445" width="560" height="130" fill="#F5F7FA" rx="8"/>
<!-- 联系方式 -->
<text x="640" y="490" text-anchor="middle" fill="#333333" font-family="Microsoft YaHei, Arial, sans-serif" font-size="18">
{{CONTACT_INFO}}
</text>
<text x="640" y="525" text-anchor="middle" fill="#666666" font-family="Microsoft YaHei, Arial, sans-serif" font-size="16">
{{EMAIL}}
</text>
<text x="640" y="555" text-anchor="middle" fill="#666666" font-family="Microsoft YaHei, Arial, sans-serif" font-size="16">
{{INSTITUTION}}
</text>
<!-- ==================== 底部信息 ==================== -->
<rect x="0" y="665" width="1280" height="55" fill="#F5F7FA"/>
<text x="640" y="698" text-anchor="middle" fill="#999999" font-family="Microsoft YaHei, Arial, sans-serif" font-size="14">
{{COPYRIGHT}}
</text>
<text x="1220" y="698" text-anchor="end" fill="#999999" font-family="Microsoft YaHei, Arial, sans-serif" font-size="14" id="slot-04_ending-slide_number-1" data-pptx-placeholder="slide-number">
{{PAGE_NUM}}
</text>
</svg>

Before

Width:  |  Height:  |  Size: 2.5 KiB

@@ -1,216 +0,0 @@
---
layout_id: academic_defense
kind: layout
native_structure_mode: template
summary: Thesis defense, academic presentations, research progress reports, grant applications.
canvas_format: ppt169
page_count: 5
page_types: [cover, toc, chapter, content, ending]
---
# Academic Defense Template - Design Specification
> Suitable for academic thesis defense, research presentations, graduation project showcases, and similar scenarios.
---
## I. Template Overview
| Property | Description |
| -------------- | ------------------------------------------------------ |
| **Template Name** | academic_defense |
| **Use Cases** | Thesis defense, academic presentations, research progress reports, grant applications |
| **Design Tone** | Professional, rigorous, research-oriented, clear hierarchy |
| **Theme Mode** | Light theme (white background + dark blue title bar) |
---
## II. Canvas Specification
| Property | Value |
| -------------- | ----------------------------- |
| **Format** | Standard 16:9 |
| **Dimensions** | 1280 × 720 px |
| **viewBox** | `0 0 1280 720` |
| **Page Margins** | Left/Right 40px, Top 0px, Bottom 35px |
| **Safe Area** | x: 40-1240, y: 70-665 |
---
## III. Page Structure
### General Layout
| Area | Position/Height | Description |
| -------------- | --------------- | -------------------------------------- |
| **Header** | y=0, h=70px | Dark blue background + red left bar + page title |
| **Key Message Bar** | y=70, h=50px | Core message/summary area (light blue-gray background) |
| **Content Area** | y=135, h=515px | Main content area |
| **Footer** | y=665, h=55px | Data source, section name, page number |
### Decorative Elements
- **Left Red Bar**: Red (`#CC0000`), width 6px, used for header and card decoration
- **Blue Border**: Accent blue (`#0066CC`), used for card borders
- **Decorative Divider**: Blue (`#0066CC`), paired with decorative dots
---
## IV. Page Types
### 1. Cover Page (01_cover.svg)
- White background
- Dark blue top bar + red left vertical bar decoration
- Top-right Logo placeholder area
- Centered main title + subtitle
- Decorative divider line (blue + dots)
- Presenter info area (name, advisor, institution)
- Bottom gray info area (date)
### 2. Table of Contents Page (02_toc.svg)
- White background
- Standard header (dark blue + red vertical bar)
- Card-style TOC item layout (2 columns)
- Light blue-gray background cards + left colored vertical bar
- Optional items use dashed borders
### 3. Chapter Page (02_chapter.svg)
- Dark blue full-screen background (`#003366`)
- Right-side geometric decorations
- Left red vertical bar decoration
- Large semi-transparent background number
- Prominent white chapter title
- Light blue-gray chapter description
- Red decorative horizontal line
### 4. Content Page (03_content.svg)
- White background
- Standard header (dark blue + red vertical bar)
- Key message bar (light blue-gray background + blue left vertical bar)
- Flexible content area
- Footer: data source, section name, page number
### 5. Ending Page (04_ending.svg)
- White background
- Dark blue top bar
- Centered thank-you message
- Tagline
- Decorative divider line
- Contact info card (gray background)
- Bottom gray area (copyright, page number)
---
## V. SVG Page Roster
| File | Role | Description |
|------|------|-------------|
| `01_cover.svg` | cover | Title slide; project name, presenter, date |
| `02_chapter.svg` | chapter | Chapter divider page (large number + chapter title) |
| `02_toc.svg` | toc | Table of contents listing major sections |
| `03_content.svg` | content | Main content page; body of the deck |
| `04_ending.svg` | ending | Closing/thank-you page |
## VI. Layout Patterns
| Pattern | Use Cases |
| ------------------ | ------------------------------ |
| **Single Column Centered** | Cover, ending, key points |
| **Two-Column Cards** | Table of contents |
| **Left-Right Split (5:5)** | Comparison display |
| **Left-Right Split (4:6)** | Image-text mixed layout |
| **Card Grid** | Research content list |
| **Timeline** | Research progress |
| **Table** | Data comparison, experiment results |
---
## VII. Spacing Guidelines
| Element | Value |
| ------------------ | ------ |
| Card gap | 20px |
| Content block gap | 24px |
| Card padding | 20px |
| Card border radius | 8px |
| Icon-to-text gap | 12px |
---
## VIII. Placeholder Specification
Templates use `{{PLACEHOLDER}}` format placeholders. Common placeholders:
| Placeholder | Description |
| ------------------ | ------------------ |
| `{{TITLE}}` | Thesis/project main title |
| `{{SUBTITLE}}` | Subtitle |
| `{{AUTHOR}}` | Presenter name |
| `{{ADVISOR}}` | Advisor |
| `{{INSTITUTION}}` | University/institution |
| `{{DATE}}` | Defense date |
| `{{PAGE_TITLE}}` | Page title |
| `{{SECTION_NUM}}` | Section number |
| `{{CHAPTER_NUM}}` | Chapter number (large) |
| `{{CHAPTER_TITLE}}`| Chapter title |
| `{{CHAPTER_DESC}}` | Chapter description |
| `{{KEY_MESSAGE}}` | Key message |
| `{{PAGE_NUM}}` | Page number |
| `{{SOURCE}}` | Data source |
| `{{SECTION_NAME}}` | Section name (footer) |
| `{{TOC_ITEM_N_TITLE}}` | TOC item title (N=1..n) |
| `{{TOC_ITEM_N_DESC}}` | TOC item description (N=1..n) |
| `{{THANK_YOU}}` | Thank-you message |
| `{{ENDING_SUBTITLE}}` | Ending subtitle/tagline |
| `{{CONTACT_INFO}}` | Contact information |
| `{{EMAIL}}` | Email address |
| `{{COPYRIGHT}}` | Copyright info |
| `{{LOGO}}` | Logo text |
---
## IX. Component Specifications
### 1. Tag
```xml
<!-- Blue background white text tag -->
<rect x="40" y="150" width="80" height="28" fill="#0066CC" rx="4"/>
<text x="80" y="170" text-anchor="middle" fill="#FFFFFF" font-size="14" font-weight="bold">内容详解</text>
<!-- Red background white text tag (emphasis) -->
<rect x="40" y="150" width="80" height="28" fill="#CC0000" rx="4"/>
<text x="80" y="170" text-anchor="middle" fill="#FFFFFF" font-size="14" font-weight="bold">核心目标</text>
```
### 2. Flow Arrow
```xml
<!-- Horizontal flow arrow -->
<line x1="200" y1="300" x2="350" y2="300" stroke="#0066CC" stroke-width="2"/>
<polygon points="350,295 360,300 350,305" fill="#0066CC"/>
```
### 3. Data Highlight Box
```xml
<!-- Key data block -->
<rect x="40" y="400" width="200" height="80" fill="#FFFFFF" stroke="#CC0000" stroke-width="2" rx="8"/>
<text x="140" y="445" text-anchor="middle" fill="#CC0000" font-size="24" font-weight="bold">30%</text>
<text x="140" y="470" text-anchor="middle" fill="#666666" font-size="12">关键指标</text>
```
---
## X. Usage Instructions
1. Copy the template to the project directory
2. Select the appropriate page template based on defense content needs
3. Use placeholders to mark content that needs replacement
4. Ensure presenter info and advisor info are complete
5. Generate the final SVG through the Executor role
@@ -1,65 +0,0 @@
<svg width="1280" height="720" viewBox="0 0 1280 720" xmlns="http://www.w3.org/2000/svg" data-pptx-layout="01_cover" data-pptx-layout-name="Cover">
<!-- Background -->
<rect x="0" y="0" width="1280" height="720" fill="#FFFFFF" id="layout-01_cover-background" data-pptx-layer="layout" data-pptx-editable="false"/>
<!-- Top Red Banner -->
<rect x="0" y="0" width="1280" height="8" fill="#C00000" />
<!-- Left Decorative Red Block -->
<rect x="0" y="0" width="60" height="360" fill="#C00000" />
<rect x="0" y="360" width="60" height="360" fill="#2E75B6" />
<!-- Warm Gray Subtitle Band -->
<rect x="60" y="280" width="1220" height="60" fill="#F2F2F2" />
<!-- Title Group -->
<text x="640" y="220" font-family="'Microsoft YaHei', Arial, sans-serif" font-size="56" font-weight="bold" fill="#C00000" text-anchor="middle" id="slot-01_cover-title-1" data-pptx-placeholder="title">{{TITLE}}</text>
<!-- Subtitle -->
<text x="640" y="320" font-family="'Microsoft YaHei', Arial, sans-serif" font-size="22" fill="#666666" text-anchor="middle" id="slot-01_cover-subtitle-2" data-pptx-placeholder="subtitle">{{SUBTITLE}}</text>
<!-- Decorative Numbered Badges (referencing architecture style) -->
<rect x="200" y="400" width="40" height="40" fill="#C00000" />
<text x="220" y="428" font-family="Arial, sans-serif" font-size="22" font-weight="bold" fill="#FFFFFF" text-anchor="middle">1</text>
<rect x="400" y="400" width="40" height="40" fill="#C00000" />
<text x="420" y="428" font-family="Arial, sans-serif" font-size="22" font-weight="bold" fill="#FFFFFF" text-anchor="middle">2</text>
<rect x="600" y="400" width="40" height="40" fill="#C00000" />
<text x="620" y="428" font-family="Arial, sans-serif" font-size="22" font-weight="bold" fill="#FFFFFF" text-anchor="middle">3</text>
<rect x="800" y="400" width="40" height="40" fill="#C00000" />
<text x="820" y="428" font-family="Arial, sans-serif" font-size="22" font-weight="bold" fill="#FFFFFF" text-anchor="middle">4</text>
<rect x="1000" y="400" width="40" height="40" fill="#C00000" />
<text x="1020" y="428" font-family="Arial, sans-serif" font-size="22" font-weight="bold" fill="#FFFFFF" text-anchor="middle">5</text>
<!-- Blue Scenario Tags -->
<rect x="250" y="400" width="120" height="40" fill="#2E75B6" />
<text x="310" y="427" font-family="'Microsoft YaHei', Arial, sans-serif" font-size="14" fill="#FFFFFF" text-anchor="middle">智能运维</text>
<rect x="450" y="400" width="120" height="40" fill="#2E75B6" />
<text x="510" y="427" font-family="'Microsoft YaHei', Arial, sans-serif" font-size="14" fill="#FFFFFF" text-anchor="middle">数字员工</text>
<rect x="650" y="400" width="120" height="40" fill="#2E75B6" />
<text x="710" y="427" font-family="'Microsoft YaHei', Arial, sans-serif" font-size="14" fill="#FFFFFF" text-anchor="middle">自动化测试</text>
<rect x="850" y="400" width="120" height="40" fill="#2E75B6" />
<text x="910" y="427" font-family="'Microsoft YaHei', Arial, sans-serif" font-size="14" fill="#FFFFFF" text-anchor="middle">故障诊断</text>
<rect x="1050" y="400" width="120" height="40" fill="#2E75B6" />
<text x="1110" y="427" font-family="'Microsoft YaHei', Arial, sans-serif" font-size="14" fill="#FFFFFF" text-anchor="middle">开放共享</text>
<!-- Dashed Separator -->
<line x1="120" y1="480" x2="1160" y2="480" stroke="#E7E6E6" stroke-width="1" stroke-dasharray="5 5" />
<!-- Author & Date -->
<text x="640" y="560" font-family="'Microsoft YaHei', Arial, sans-serif" font-size="20" fill="#333333" text-anchor="middle">{{AUTHOR}}</text>
<text x="640" y="600" font-family="'Microsoft YaHei', Arial, sans-serif" font-size="18" fill="#999999" text-anchor="middle">{{DATE}}</text>
<!-- Bottom Blue Band -->
<rect x="0" y="690" width="1280" height="30" fill="#2E75B6" />
<!-- Bottom Warm Accent -->
<rect x="0" y="680" width="1280" height="10" fill="#FDF3EB" />
</svg>

Before

Width:  |  Height:  |  Size: 3.9 KiB

@@ -1,36 +0,0 @@
<svg width="1280" height="720" viewBox="0 0 1280 720" xmlns="http://www.w3.org/2000/svg" data-pptx-layout="02_chapter" data-pptx-layout-name="Section">
<!-- Background -->
<rect x="0" y="0" width="1280" height="720" fill="#FFFFFF" id="layout-02_chapter-background" data-pptx-layer="layout" data-pptx-editable="false"/>
<!-- Top Red Strip -->
<rect x="0" y="0" width="1280" height="8" fill="#C00000" />
<!-- Left Decorative Block -->
<rect x="0" y="80" width="120" height="560" fill="#F2F2F2" />
<rect x="0" y="80" width="8" height="560" fill="#C00000" />
<!-- Right Decorative Block -->
<rect x="1160" y="80" width="120" height="560" fill="#FDF3EB" />
<rect x="1272" y="80" width="8" height="560" fill="#2E75B6" />
<!-- Chapter Number Badge (Large) -->
<rect x="540" y="220" width="80" height="80" fill="#C00000" />
<text x="580" y="278" font-family="Arial, sans-serif" font-size="48" font-weight="bold" fill="#FFFFFF" text-anchor="middle">{{CHAPTER_NUM}}</text>
<!-- Chapter Number Watermark -->
<text x="640" y="340" font-family="Arial, sans-serif" font-size="160" font-weight="bold" fill="#F2F2F2" text-anchor="middle">{{CHAPTER_NUM}}</text>
<!-- Chapter Title -->
<text x="640" y="420" font-family="'Microsoft YaHei', Arial, sans-serif" font-size="48" font-weight="bold" fill="#000000" text-anchor="middle" id="slot-02_chapter-title-1" data-pptx-placeholder="title">{{CHAPTER_TITLE}}</text>
<!-- Decorative Lines -->
<line x1="480" y1="450" x2="800" y2="450" stroke="#C00000" stroke-width="3" />
<line x1="520" y1="458" x2="760" y2="458" stroke="#2E75B6" stroke-width="1" />
<!-- Chapter Description -->
<text x="640" y="510" font-family="'Microsoft YaHei', Arial, sans-serif" font-size="20" fill="#666666" text-anchor="middle">{{CHAPTER_DESC}}</text>
<!-- Bottom Accent -->
<rect x="0" y="690" width="1280" height="30" fill="#2E75B6" />
<rect x="0" y="680" width="1280" height="10" fill="#FDF3EB" />
</svg>

Before

Width:  |  Height:  |  Size: 1.9 KiB

@@ -1,51 +0,0 @@
<svg width="1280" height="720" viewBox="0 0 1280 720" xmlns="http://www.w3.org/2000/svg" data-pptx-layout="02_toc" data-pptx-layout-name="Agenda">
<!-- Background -->
<rect x="0" y="0" width="1280" height="720" fill="#FFFFFF" id="layout-02_toc-background" data-pptx-layer="layout" data-pptx-editable="false"/>
<!-- Top Red Strip -->
<rect x="0" y="0" width="1280" height="8" fill="#C00000" />
<!-- Left Panel -->
<rect x="0" y="8" width="320" height="682" fill="#C00000" />
<text x="160" y="300" font-family="'Microsoft YaHei', Arial, sans-serif" font-size="56" font-weight="bold" fill="#FFFFFF" text-anchor="middle">目 录</text>
<text x="160" y="360" font-family="Arial, sans-serif" font-size="20" fill="#FFFFFF" text-anchor="middle" fill-opacity="0.7">CONTENTS</text>
<!-- TOC Items -->
<!-- Item 1 -->
<rect x="380" y="140" width="40" height="40" fill="#C00000" />
<text x="400" y="168" font-family="Arial, sans-serif" font-size="22" font-weight="bold" fill="#FFFFFF" text-anchor="middle">1</text>
<rect x="430" y="140" width="260" height="40" fill="#2E75B6" />
<text x="560" y="167" font-family="'Microsoft YaHei', Arial, sans-serif" font-size="18" fill="#FFFFFF" text-anchor="middle">{{TOC_ITEM_1_TITLE}}</text>
<!-- Item 2 -->
<rect x="380" y="220" width="40" height="40" fill="#C00000" />
<text x="400" y="248" font-family="Arial, sans-serif" font-size="22" font-weight="bold" fill="#FFFFFF" text-anchor="middle">2</text>
<rect x="430" y="220" width="260" height="40" fill="#2E75B6" />
<text x="560" y="247" font-family="'Microsoft YaHei', Arial, sans-serif" font-size="18" fill="#FFFFFF" text-anchor="middle">{{TOC_ITEM_2_TITLE}}</text>
<!-- Item 3 -->
<rect x="380" y="300" width="40" height="40" fill="#C00000" />
<text x="400" y="328" font-family="Arial, sans-serif" font-size="22" font-weight="bold" fill="#FFFFFF" text-anchor="middle">3</text>
<rect x="430" y="300" width="260" height="40" fill="#2E75B6" />
<text x="560" y="327" font-family="'Microsoft YaHei', Arial, sans-serif" font-size="18" fill="#FFFFFF" text-anchor="middle">{{TOC_ITEM_3_TITLE}}</text>
<!-- Item 4 -->
<rect x="380" y="380" width="40" height="40" fill="#C00000" />
<text x="400" y="408" font-family="Arial, sans-serif" font-size="22" font-weight="bold" fill="#FFFFFF" text-anchor="middle">4</text>
<rect x="430" y="380" width="260" height="40" fill="#2E75B6" />
<text x="560" y="407" font-family="'Microsoft YaHei', Arial, sans-serif" font-size="18" fill="#FFFFFF" text-anchor="middle">{{TOC_ITEM_4_TITLE}}</text>
<!-- Item 5 -->
<rect x="380" y="460" width="40" height="40" fill="#C00000" />
<text x="400" y="488" font-family="Arial, sans-serif" font-size="22" font-weight="bold" fill="#FFFFFF" text-anchor="middle">5</text>
<rect x="430" y="460" width="260" height="40" fill="#2E75B6" />
<text x="560" y="487" font-family="'Microsoft YaHei', Arial, sans-serif" font-size="18" fill="#FFFFFF" text-anchor="middle">{{TOC_ITEM_5_TITLE}}</text>
<!-- Right side decorative panel -->
<rect x="780" y="140" width="420" height="400" fill="#FDF3EB" stroke="#F8CBAD" stroke-width="2" />
<text x="990" y="340" font-family="'Microsoft YaHei', Arial, sans-serif" font-size="16" fill="#999999" text-anchor="middle">{{TOC_SUMMARY}}</text>
<!-- Bottom Accent -->
<rect x="0" y="680" width="1280" height="10" fill="#FDF3EB" />
<rect x="0" y="690" width="1280" height="30" fill="#2E75B6" />
</svg>

Before

Width:  |  Height:  |  Size: 3.4 KiB

@@ -1,37 +0,0 @@
<svg width="1280" height="720" viewBox="0 0 1280 720" xmlns="http://www.w3.org/2000/svg" data-pptx-layout="03_content" data-pptx-layout-name="Content">
<!-- Background -->
<rect x="0" y="0" width="1280" height="720" fill="#FFFFFF" id="layout-03_content-background" data-pptx-layer="layout" data-pptx-editable="false"/>
<!-- Top Red Strip -->
<rect x="0" y="0" width="1280" height="4" fill="#C00000" />
<!-- Header Area -->
<rect x="0" y="4" width="1280" height="76" fill="#FFFFFF" />
<line x1="0" y1="80" x2="1280" y2="80" stroke="#E7E6E6" stroke-width="1" />
<!-- Left Red Accent Bar -->
<rect x="50" y="20" width="8" height="40" fill="#C00000" />
<!-- Page Title -->
<text x="72" y="52" font-family="'Microsoft YaHei', Arial, sans-serif" font-size="32" font-weight="bold" fill="#000000" id="slot-03_content-title-1" data-pptx-placeholder="title">{{PAGE_TITLE}}</text>
<!-- Content Area -->
<rect x="50" y="95" width="1180" height="560" rx="4" ry="4" fill="#FFFFFF" stroke="#E7E6E6" stroke-width="1" stroke-dasharray="5 5" />
<!-- Content Area Placeholder -->
<text x="640" y="380" text-anchor="middle" font-family="'Microsoft YaHei', Arial, sans-serif" font-size="20" fill="#CCCCCC" id="slot-03_content-body-2" data-pptx-placeholder="body">{{CONTENT_AREA}}</text>
<!-- Footer -->
<rect x="0" y="680" width="1280" height="40" fill="#F2F2F2" />
<rect x="0" y="680" width="4" height="40" fill="#C00000" />
<!-- Section Name -->
<text x="60" y="706" font-family="'Microsoft YaHei', Arial, sans-serif" font-size="14" fill="#666666">{{SECTION_NAME}}</text>
<!-- Source -->
<text x="640" y="706" font-family="'Microsoft YaHei', Arial, sans-serif" font-size="12" fill="#999999" text-anchor="middle">{{SOURCE}}</text>
<!-- Page Number -->
<rect x="1210" y="688" width="30" height="24" fill="#C00000" />
<text x="1225" y="706" text-anchor="middle" font-family="Arial, sans-serif" font-size="14" font-weight="bold" fill="#FFFFFF" id="slot-03_content-slide_number-3" data-pptx-placeholder="slide-number">{{PAGE_NUM}}</text>
</svg>

Before

Width:  |  Height:  |  Size: 2.0 KiB

@@ -1,59 +0,0 @@
<svg width="1280" height="720" viewBox="0 0 1280 720" xmlns="http://www.w3.org/2000/svg" data-pptx-layout="04_ending" data-pptx-layout-name="Closing">
<!-- Background -->
<rect x="0" y="0" width="1280" height="720" fill="#FFFFFF" id="layout-04_ending-background" data-pptx-layer="layout" data-pptx-editable="false"/>
<!-- Top Red Strip -->
<rect x="0" y="0" width="1280" height="8" fill="#C00000" />
<!-- Left Decorative Block (mirror of cover) -->
<rect x="0" y="0" width="60" height="360" fill="#C00000" />
<rect x="0" y="360" width="60" height="360" fill="#2E75B6" />
<!-- Central Warm Panel -->
<rect x="280" y="200" width="720" height="320" fill="#FDF3EB" stroke="#F8CBAD" stroke-width="2" />
<!-- Thank You Text -->
<text x="640" y="310" font-family="'Microsoft YaHei', Arial, sans-serif" font-size="64" font-weight="bold" fill="#C00000" text-anchor="middle">{{THANK_YOU}}</text>
<!-- English Tagline -->
<text x="640" y="370" font-family="Arial, sans-serif" font-size="22" fill="#2E75B6" text-anchor="middle" letter-spacing="6">{{ENDING_SUBTITLE}}</text>
<!-- Separator -->
<line x1="480" y1="400" x2="800" y2="400" stroke="#E7E6E6" stroke-width="1" />
<!-- Contact Info -->
<text x="640" y="450" font-family="'Microsoft YaHei', Arial, sans-serif" font-size="18" fill="#666666" text-anchor="middle">{{CONTACT_INFO}}</text>
<!-- Copyright -->
<text x="640" y="490" font-family="'Microsoft YaHei', Arial, sans-serif" font-size="14" fill="#999999" text-anchor="middle">{{COPYRIGHT}}</text>
<!-- Bottom Accent (mirror of cover) -->
<rect x="0" y="680" width="1280" height="10" fill="#FDF3EB" />
<rect x="0" y="690" width="1280" height="30" fill="#2E75B6" />
<!-- Decorative Numbered Badges (echoing cover) -->
<rect x="300" y="580" width="30" height="30" fill="#C00000" />
<text x="315" y="602" font-family="Arial, sans-serif" font-size="16" font-weight="bold" fill="#FFFFFF" text-anchor="middle">1</text>
<rect x="500" y="580" width="30" height="30" fill="#C00000" />
<text x="515" y="602" font-family="Arial, sans-serif" font-size="16" font-weight="bold" fill="#FFFFFF" text-anchor="middle">2</text>
<rect x="700" y="580" width="30" height="30" fill="#C00000" />
<text x="715" y="602" font-family="Arial, sans-serif" font-size="16" font-weight="bold" fill="#FFFFFF" text-anchor="middle">3</text>
<rect x="900" y="580" width="30" height="30" fill="#C00000" />
<text x="915" y="602" font-family="Arial, sans-serif" font-size="16" font-weight="bold" fill="#FFFFFF" text-anchor="middle">4</text>
<!-- Blue Label Tags (echoing cover) -->
<rect x="340" y="580" width="100" height="30" fill="#5B9BD5" />
<text x="390" y="601" font-family="'Microsoft YaHei', Arial, sans-serif" font-size="12" fill="#FFFFFF" text-anchor="middle">能力封装</text>
<rect x="540" y="580" width="100" height="30" fill="#5B9BD5" />
<text x="590" y="601" font-family="'Microsoft YaHei', Arial, sans-serif" font-size="12" fill="#FFFFFF" text-anchor="middle">跨域拉通</text>
<rect x="740" y="580" width="100" height="30" fill="#5B9BD5" />
<text x="790" y="601" font-family="'Microsoft YaHei', Arial, sans-serif" font-size="12" fill="#FFFFFF" text-anchor="middle">知识沉淀</text>
<rect x="940" y="580" width="100" height="30" fill="#5B9BD5" />
<text x="990" y="601" font-family="'Microsoft YaHei', Arial, sans-serif" font-size="12" fill="#FFFFFF" text-anchor="middle">开放共享</text>
</svg>

Before

Width:  |  Height:  |  Size: 3.4 KiB

@@ -1,302 +0,0 @@
---
layout_id: ai_ops
kind: layout
native_structure_mode: template
summary: Telecom AI operations architecture, IT system overviews, digital transformation proposals, smart infrastructure reports.
canvas_format: ppt169
page_count: 6
page_types: [cover, toc, chapter, content, ending, reference_style]
---
# ai_ops - Enterprise Digital Intelligence Design Specification
> Suitable for telecom operator AI operations architecture, digital transformation proposals, smart infrastructure reports, IT system overview diagrams, and other high-information-density scenarios.
> **Style Reference**: See `reference_style.svg` (Telecom Operator AI Operations Architecture Overview), which demonstrates the core visual language of this template.
---
## I. Template Overview
| Property | Description |
| ------------------ | ------------------------------------------------------------------------------ |
| **Template Name** | ai_ops (Enterprise Digital Intelligence) |
| **Use Cases** | Telecom AI operations architecture, IT system overviews, digital transformation proposals, smart infrastructure reports |
| **Design Tone** | Information-dense, structured, modular zoning, telecom/enterprise style |
| **Theme Mode** | Light theme (white background + red-blue dual-color accents + warm gray panels) |
| **Info Density** | High density — a single page can accommodate 6-10 information modules, matching telecom reporting conventions |
---
## II. Canvas Specification
| Property | Value |
| ------------------ | -------------------------------- |
| **Format** | Standard 16:9 |
| **Dimensions** | 1280 × 720 px |
| **viewBox** | `0 0 1280 720` |
| **Page Margins** | Left/right 30-50px, top 20px, bottom 40px |
| **Content Safe Area** | x: 30-1250, y: 80-680 |
| **Title Area** | y: 20-80 |
| **Grid Baseline** | 20px (high-density layouts require a finer grid) |
> **Note**: Margins are narrower than standard templates (30px vs 60px) to accommodate the high-information-density reporting style common in telecom presentations.
---
## III. Core Design Principles
### Telecom High-Density Information Style
This template emulates the visual language of telecom technical reports. The core characteristics are "**modular zoning + high information density + red-blue dual-color hierarchy**".
1. **Left Red Vertical Bar**: A red rectangle (10×40px) before titles serves as a visual anchor — the most essential title identifier throughout the template.
2. **Number Badges**: Red square badges (30×30px with white numbers) identify key initiatives/capability numbers (e.g., numbers 1-5 in "Five Key Initiatives").
3. **Dashed Zone Frames**: `stroke-dasharray="5 5"` dashed rectangles group content modules, creating a structured, modular visual effect — a common "zone frame" in telecom reports.
4. **Blue Label Bars**: `#2E75B6` blue-filled rectangles (full-width or fixed-width) serve as scenario/category headers carrying scenario names.
5. **Warm Gray Overview Panels**: Panels with `#FDF3EB` background + `#F8CBAD` border carry overviews, summaries, and open platform entries.
6. **Metric Card Groups**: White cards with `#F2F2F2` borders, closely arranged to display KPI metrics; values highlighted in `#C00000` red.
7. **Light Blue Sub-modules**: `#5B9BD5` filled small rectangular cards displaying specific feature items (e.g., "AI One-Click Troubleshooting Assistant").
8. **Gray Capability Base Cards**: Cards with `#E7E6E6` / `#F2F2F2` background for displaying foundational capabilities/platform components.
### Advanced Features
1. **Triangle Decorations**: The top area may use light semi-transparent triangles (`fill-opacity="0.3"`) as visual guides.
2. **Star/Icon Accents**: Simple polygon stars near key achievements enhance visual impact.
3. **Multi-level Nested Zones**: Outer dashed frame > inner label area > specific feature cards, forming a three-layer visual hierarchy.
4. **Compact Line Spacing**: Module spacing compressed to 10-20px to maximize information capacity.
---
## IV. Page Structure
### General Layout
| Area | Position/Height | Description |
| ------------------ | ---------------- | ---------------------------------------------------- |
| **Title Area** | y=20-80 | Red vertical bar + title text + optional subtitle overview bar |
| **Overview Bar** | y=80-140 | Full-width `#F2F2F2` background bar carrying the page's core summary |
| **Content Area** | y=140-670 | Main content area (densely packed multi-module layout) |
| **Footer** | y=680-720 | Red narrow bar with page number + chapter name + source citation |
### Navigation Bar Design
- **Title Vertical Bar**: Red rectangle `#C00000`, 10×40px, positioned left of the title text
- **Title Text**: 10px from the vertical bar, 36px font size, `#C00000` or `#000000`
- **Overview Bar**: Full-width light gray rectangle (h=60px), centered 16px body text carrying the page overview/introduction
### Decorative Elements
- **Number Badges**: 30×30px red squares + white numbers (centered)
- **Blue Labels**: Fixed-width blue rectangles + white text (e.g., "Fault Boundary Identification")
- **Dashed Zone Frames**: `stroke="#C00000"` or `stroke="#E7E6E6"`, `stroke-dasharray="5 5"`
- **Warm Gray Panels**: `fill="#FDF3EB"` + `stroke="#F8CBAD"` + `stroke-width="2"`
- **Light Blue Feature Cards**: `fill="#5B9BD5"` rectangles + white text
---
## V. Page Types
### 1. Cover Page (01_cover.svg)
- **Background**: White `#FFFFFF`
- **Left Decoration**: Full-height red-blue dual-color vertical bar (red upper half + blue lower half), width 60px
- **Title Area**: Centered large title `{{TITLE}}` (red), with subtitle `{{SUBTITLE}}` inside a light gray overview bar below
- **Middle Decoration**: Number badges (1-5) + blue scenario labels showcasing core capabilities/scenarios
- **Bottom Info**: Speaker `{{AUTHOR}}` + date `{{DATE}}`
- **Bottom Decoration**: Warm gray narrow bar + blue full-width bottom bar
### 2. Chapter Page (02_chapter.svg)
- **Background**: White `#FFFFFF`
- **Left/Right Decoration**: Left red vertical bar + right blue vertical bar (echoing the cover dual-color scheme)
- **Center**: Red number badge (80×80px large) `{{CHAPTER_NUM}}` + watermark number (160px light gray)
- **Title**: Centered `{{CHAPTER_TITLE}}` (48px Bold)
- **Decorative Line**: Red-blue dual lines (thick red line + thin blue line)
- **Description**: `{{CHAPTER_DESC}}` in gray text
### 3. Content Page (03_content.svg)
- **Top**: 4px red top bar + white title bar (80px height)
- **Title Identifier**: Red vertical bar (8×40px) + 32px Bold title `{{PAGE_TITLE}}`
- **Content Area**: Dashed frame (`stroke-dasharray="5 5"`) marking content area `{{CONTENT_AREA}}`
- **Footer**: Light gray bottom bar, left red vertical bar + chapter name `{{SECTION_NAME}}`, right red square page number `{{PAGE_NUM}}`
- **Source Citation**: Footer centered `{{SOURCE}}`
- **TOC**: Use canonical indexed placeholders such as `{{TOC_ITEM_1_TITLE}}`
### 4. Ending Page (04_ending.svg)
- **Layout**: Mirrors the cover — left red-blue dual-color vertical bar, bottom blue bar
- **Central Panel**: Warm gray panel (`#FDF3EB` + `#F8CBAD` border) carrying the thank-you message
- **Content**: `{{THANK_YOU}}` (red 64px Bold) + `{{ENDING_SUBTITLE}}` (blue 22px)
- **Contact Info**: `{{CONTACT_INFO}}` + `{{COPYRIGHT}}`
- **Bottom Decoration**: Number badges + blue labels, echoing the cover
---
## VI. SVG Page Roster
| File | Role | Description |
|------|------|-------------|
| `01_cover.svg` | cover | Title slide; project name, presenter, date |
| `02_chapter.svg` | chapter | Chapter divider page (large number + chapter title) |
| `02_toc.svg` | toc | Table of contents listing major sections |
| `03_content.svg` | content | Main content page; body of the deck |
| `04_ending.svg` | ending | Closing/thank-you page |
| `reference_style.svg` | reference_style | Style reference card (developer aid; not used in normal decks) |
## VII. Layout Patterns
| Pattern | Applicable Scenarios |
| ------------------------------ | ------------------------------------------------- |
| **Architecture Overview** | AI operations overview, system architecture panorama |
| **Metrics Dashboard** | KPI display, performance reports, data dashboards |
| **Multi-Module Zoning** | Capability lists, scenario matrices, domain displays |
| **Process/Timeline** | Implementation roadmap, deployment plan, evolution path |
| **Top-Bottom Split** | Objectives+results (top), scenarios+capabilities (bottom) |
| **Left-Right Split (3:7)** | Left navigation labels + right content area |
| **Card Matrix (2x3/3x3)** | Capability modules, team assignments, project lists |
| **Table** | Metric comparisons, progress tracking |
> **Recommended**: Telecom reports commonly use the "**Architecture Overview**" pattern — a single page presenting the complete architecture from objectives → results → scenarios → orchestration → foundational capabilities, unfolding top to bottom.
---
## VIII. Common Components
### Title Vertical Bar Decoration
```xml
<!-- Red vertical bar + title -->
<rect x="30" y="20" width="10" height="40" fill="#C00000" />
<text x="50" y="55" font-family="Microsoft YaHei, sans-serif" font-size="36" font-weight="bold" fill="#C00000">Page Title</text>
```
### Number Badge
```xml
<!-- Red square number badge -->
<rect x="80" y="560" width="30" height="30" fill="#C00000" />
<text x="95" y="582" font-family="Arial, sans-serif" font-size="18" font-weight="bold" fill="#FFFFFF" text-anchor="middle">1</text>
```
### Blue Scenario Label
```xml
<!-- Blue label bar -->
<rect x="120" y="310" width="220" height="40" fill="#2E75B6" />
<text x="230" y="336" font-family="Microsoft YaHei, sans-serif" font-size="16" font-weight="bold" fill="#FFFFFF" text-anchor="middle">Fault Boundary Identification</text>
```
### Metric Card
```xml
<!-- White metric card (values highlighted in red) -->
<rect x="120" y="215" width="140" height="35" fill="#FFFFFF" stroke="#F2F2F2" stroke-width="2" />
<text x="190" y="239" font-family="Microsoft YaHei, sans-serif" font-size="14" font-weight="bold" fill="#000000" text-anchor="middle">Fault tickets reduced by<tspan fill="#C00000">30%</tspan></text>
```
### Dashed Zone Frame
```xml
<!-- Dashed content zone -->
<rect x="120" y="390" width="940" height="150" fill="none" stroke="#C00000" stroke-width="2" stroke-dasharray="5 5" />
```
### Warm Gray Overview Bar
```xml
<!-- Full-width warm gray overview/summary bar -->
<rect x="30" y="80" width="1220" height="60" fill="#F2F2F2" />
<text x="640" y="115" font-family="Microsoft YaHei, sans-serif" font-size="16" fill="#000000" text-anchor="middle">Overview text content...</text>
```
### Warm Gray Panel
```xml
<!-- Warm gray panel (open platform/summary area) -->
<rect x="1080" y="390" width="160" height="300" fill="#FDF3EB" stroke="#F8CBAD" stroke-width="2" />
```
### Light Blue Feature Card
```xml
<!-- Feature module card -->
<rect x="160" y="450" width="240" height="30" fill="#5B9BD5" />
<text x="280" y="471" font-family="Microsoft YaHei, sans-serif" font-size="14" fill="#FFFFFF" text-anchor="middle">AI One-Click Troubleshooting Assistant</text>
```
### Gray Capability Base Card
```xml
<!-- Foundational capability card -->
<rect x="120" y="630" width="80" height="40" fill="#F2F2F2" stroke="#D9D9D9" stroke-width="1" />
<text x="160" y="655" font-family="Microsoft YaHei, sans-serif" font-size="14" fill="#000000" text-anchor="middle">Core Network</text>
```
---
## IX. Spacing Specification
| Element | Value |
| ------------------------------ | --------- |
| Page left/right margins | 30-50px |
| Page top/bottom margins | 20-40px |
| Title area height | 60px |
| Overview bar height | 60px |
| Title to overview bar spacing | 0px |
| Overview bar to content spacing | 10-20px |
| Module spacing | 10-20px |
| Card spacing | 10px |
| Card inner padding | 15-20px |
| Badge to label spacing | 5-10px |
| Footer height | 40px |
> **Compact Principle**: The telecom style pursues maximum information per page; spacing is generally 30-50% smaller than standard templates.
---
## X. Placeholder Specification
The template uses `{{PLACEHOLDER}}` format placeholders:
| Placeholder | Description | Applicable Template |
| ------------------- | ------------------------ | ------------------- |
| `{{TITLE}}` | Main title | Cover |
| `{{SUBTITLE}}` | Subtitle/overview | Cover |
| `{{AUTHOR}}` | Speaker/organization | Cover |
| `{{DATE}}` | Date | Cover |
| `{{CHAPTER_NUM}}` | Chapter number | Chapter page |
| `{{CHAPTER_TITLE}}` | Chapter title | Chapter page |
| `{{CHAPTER_DESC}}` | Chapter description | Chapter page |
| `{{PAGE_TITLE}}` | Page title | Content page |
| `{{CONTENT_AREA}}` | Content area identifier | Content page |
| `{{SECTION_NAME}}` | Section name (footer) | Content page |
| `{{SOURCE}}` | Data source (footer) | Content page |
| `{{PAGE_NUM}}` | Page number | Content/ending page |
| `{{THANK_YOU}}` | Thank-you message | Ending page |
| `{{ENDING_SUBTITLE}}` | Slogan/tagline | Ending page |
| `{{CONTACT_INFO}}` | Contact information | Ending page |
| `{{COPYRIGHT}}` | Copyright | Ending page |
---
## XI. Usage Notes
1. Copy this template directory to the project `templates/` directory
2. Review `reference_style.svg` to understand the core visual style
3. Select appropriate page templates based on content needs
4. Mark content to be replaced using placeholders
5. Generate final SVG through the Executor role
6. For high-information-density pages, refer to the multi-module zoning layout in `reference_style.svg`
---
## XII. Design Highlights
- **Telecom DNA**: Derived from real telecom AI operations architecture reports, naturally suited for telecom/enterprise presentation styles
- **High Information Density**: A single page can accommodate a complete architecture view (objectives → results → scenarios → orchestration → foundational capabilities)
- **Red-Blue Dual-Color Hierarchy**: Red = core/emphasis/objectives, Blue = scenarios/modules/capabilities — clear visual hierarchy
- **Number Badge System**: Red square numbers throughout create a "N Key Initiatives" visual narrative
- **Three-Level Nested Zoning**: Dashed outer frame → category labels → feature cards for structured expression of complex architectures
- **Metric Card Groups**: Compactly arranged KPI metrics with red-highlighted values for instant readability
@@ -1,154 +0,0 @@
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 1280 720" width="1280" height="720" data-pptx-layout="reference_style" data-pptx-layout-name="Reference Style">
<!-- Background -->
<rect x="0" y="0" width="1280" height="720" fill="#ffffff" id="layout-reference_style-background" data-pptx-layer="layout" data-pptx-editable="false"/>
<!-- Header -->
<rect x="30" y="20" width="10" height="40" fill="#C00000" />
<text x="50" y="55" font-family="Microsoft YaHei, sans-serif" font-size="36" font-weight="bold" fill="#C00000">1 公司运维AI建设总体视图</text>
<!-- Subtitle -->
<rect x="30" y="80" width="1220" height="60" fill="#F2F2F2" />
<text x="640" y="105" font-family="Microsoft YaHei, sans-serif" font-size="16" font-weight="bold" fill="#000000" text-anchor="middle">
<tspan x="640" dy="0">聚焦用户故障压降,提升优化一键诊断能力,实现降本提质;深入系统架构具备一键故障定位;借助大数据核心网实现网络效能提升;通过能</tspan>
<tspan x="640" dy="25">力封装、跨域拉通、知识沉淀、智能编排、开放共享等五大举措,深化AI大模型应用,重塑故障诊断处置流程,做深做实1-5-10</tspan>
</text>
<!-- Large Triangle Background (simplified to a polygon) -->
<polygon points="640,160 30,340 1250,340" fill="#F8CBAD" fill-opacity="0.3" stroke="none" />
<!-- Target Bar -->
<rect x="300" y="160" width="680" height="40" fill="#C00000" rx="5" ry="5"/>
<text x="640" y="188" font-family="Microsoft YaHei, sans-serif" font-size="20" font-weight="bold" fill="#FFFFFF" text-anchor="middle">以故障双压降,快速定位故障问题为目标</text>
<!-- Metrics -->
<text x="50" y="240" font-family="Microsoft YaHei, sans-serif" font-size="20" font-weight="bold" fill="#C00000">成效</text>
<rect x="120" y="215" width="140" height="35" fill="#FFFFFF" stroke="#F2F2F2" stroke-width="2" />
<text x="190" y="239" font-family="Microsoft YaHei, sans-serif" font-size="14" font-weight="bold" fill="#000000" text-anchor="middle">故障工单压降<tspan fill="#C00000">30%</tspan></text>
<rect x="270" y="215" width="140" height="35" fill="#FFFFFF" stroke="#F2F2F2" stroke-width="2" />
<text x="340" y="239" font-family="Microsoft YaHei, sans-serif" font-size="14" font-weight="bold" fill="#000000" text-anchor="middle">IT订单自愈<tspan fill="#C00000">69w</tspan></text>
<rect x="420" y="215" width="140" height="35" fill="#FFFFFF" stroke="#F2F2F2" stroke-width="2" />
<text x="490" y="239" font-family="Microsoft YaHei, sans-serif" font-size="14" font-weight="bold" fill="#000000" text-anchor="middle">自动化测试覆盖<tspan fill="#C00000">80%</tspan></text>
<rect x="570" y="215" width="140" height="35" fill="#FFFFFF" stroke="#F2F2F2" stroke-width="2" />
<text x="640" y="239" font-family="Microsoft YaHei, sans-serif" font-size="14" font-weight="bold" fill="#000000" text-anchor="middle">系统监控覆盖<tspan fill="#C00000">100%</tspan></text>
<rect x="720" y="215" width="140" height="35" fill="#FFFFFF" stroke="#F2F2F2" stroke-width="2" />
<text x="790" y="239" font-family="Microsoft YaHei, sans-serif" font-size="14" font-weight="bold" fill="#000000" text-anchor="middle">监控指标<tspan fill="#C00000">4000+</tspan></text>
<rect x="870" y="215" width="140" height="35" fill="#FFFFFF" stroke="#F2F2F2" stroke-width="2" />
<text x="940" y="239" font-family="Microsoft YaHei, sans-serif" font-size="14" font-weight="bold" fill="#000000" text-anchor="middle">CMDB纳管<tspan fill="#C00000">7000+</tspan></text>
<polygon points="1060,220 1080,225 1095,210 1105,230 1125,235 1110,245 1115,265 1095,255 1075,265 1085,245" fill="#C00000" />
<rect x="1130" y="210" width="120" height="50" fill="#FDF3EB" stroke="#C00000" stroke-width="2" />
<text x="1190" y="230" font-family="Microsoft YaHei, sans-serif" font-size="16" font-weight="bold" fill="#000000" text-anchor="middle">
<tspan x="1190" dy="0">节省运维成本</tspan>
<tspan x="1190" dy="20" fill="#C00000">150万</tspan>
</text>
<!-- Scenarios -->
<text x="50" y="320" font-family="Microsoft YaHei, sans-serif" font-size="20" font-weight="bold" fill="#000000">应用</text>
<text x="50" y="345" font-family="Microsoft YaHei, sans-serif" font-size="20" font-weight="bold" fill="#000000">场景</text>
<rect x="120" y="310" width="220" height="40" fill="#2E75B6" />
<text x="230" y="336" font-family="Microsoft YaHei, sans-serif" font-size="16" font-weight="bold" fill="#FFFFFF" text-anchor="middle">故障申告、故障定界定段</text>
<rect x="360" y="310" width="220" height="40" fill="#2E75B6" />
<text x="470" y="336" font-family="Microsoft YaHei, sans-serif" font-size="16" font-weight="bold" fill="#FFFFFF" text-anchor="middle">RPA数字员工</text>
<rect x="600" y="310" width="220" height="40" fill="#2E75B6" />
<text x="710" y="336" font-family="Microsoft YaHei, sans-serif" font-size="16" font-weight="bold" fill="#FFFFFF" text-anchor="middle">IT自动化运维</text>
<rect x="840" y="310" width="220" height="40" fill="#2E75B6" />
<text x="950" y="336" font-family="Microsoft YaHei, sans-serif" font-size="16" font-weight="bold" fill="#FFFFFF" text-anchor="middle">系统故障快速定位诊断</text>
<!-- Orchestration & Release Panel -->
<rect x="30" y="390" width="30" height="30" fill="#C00000" />
<text x="45" y="412" font-family="Microsoft YaHei, sans-serif" font-size="18" font-weight="bold" fill="#FFFFFF" text-anchor="middle">4</text>
<text x="50" y="460" font-family="Microsoft YaHei, sans-serif" font-size="20" font-weight="bold" fill="#000000">智能体</text>
<text x="50" y="485" font-family="Microsoft YaHei, sans-serif" font-size="20" font-weight="bold" fill="#000000">编排</text>
<rect x="120" y="390" width="940" height="150" fill="none" stroke="#C00000" stroke-width="2" stroke-dasharray="5 5" />
<rect x="120" y="390" width="940" height="30" fill="#FDF3EB" />
<text x="590" y="412" font-family="Microsoft YaHei, sans-serif" font-size="16" font-weight="bold" fill="#000000" text-anchor="middle">持续迭代用户一键诊断智能体能力;引入RPA,针对固化场景实现RPA数字员工;建设系统故障诊断处置Agent</text>
<rect x="140" y="440" width="280" height="90" fill="none" stroke="#2E75B6" stroke-width="1" stroke-dasharray="3 3"/>
<rect x="160" y="450" width="240" height="30" fill="#5B9BD5" />
<text x="280" y="471" font-family="Microsoft YaHei, sans-serif" font-size="14" fill="#FFFFFF" text-anchor="middle">网络:AI一键排障助手</text>
<rect x="160" y="490" width="240" height="30" fill="#5B9BD5" />
<text x="280" y="511" font-family="Microsoft YaHei, sans-serif" font-size="14" fill="#FFFFFF" text-anchor="middle">ITAI一键查询助手</text>
<rect x="440" y="440" width="280" height="90" fill="none" stroke="#C00000" stroke-width="1" stroke-dasharray="3 3"/>
<rect x="460" y="445" width="240" height="25" fill="#5B9BD5" />
<text x="580" y="462" font-family="Microsoft YaHei, sans-serif" font-size="14" fill="#FFFFFF" text-anchor="middle">NB工单自动化处理</text>
<rect x="460" y="475" width="240" height="25" fill="#5B9BD5" />
<text x="580" y="492" font-family="Microsoft YaHei, sans-serif" font-size="14" fill="#FFFFFF" text-anchor="middle">IT订单自愈</text>
<rect x="460" y="505" width="240" height="25" fill="#5B9BD5" />
<text x="580" y="522" font-family="Microsoft YaHei, sans-serif" font-size="14" fill="#FFFFFF" text-anchor="middle">IT自动化测试</text>
<rect x="740" y="440" width="280" height="90" fill="none" stroke="#C00000" stroke-width="1" stroke-dasharray="3 3"/>
<rect x="760" y="445" width="240" height="25" fill="#5B9BD5" />
<text x="880" y="462" font-family="Microsoft YaHei, sans-serif" font-size="14" fill="#FFFFFF" text-anchor="middle">自动化巡检</text>
<rect x="760" y="475" width="240" height="25" fill="#5B9BD5" />
<text x="880" y="492" font-family="Microsoft YaHei, sans-serif" font-size="14" fill="#FFFFFF" text-anchor="middle">AI隐患排查助手</text>
<rect x="760" y="505" width="240" height="25" fill="#5B9BD5" />
<text x="880" y="522" font-family="Microsoft YaHei, sans-serif" font-size="14" fill="#FFFFFF" text-anchor="middle">AI系统诊断助手</text>
<rect x="1080" y="390" width="160" height="300" fill="#FDF3EB" stroke="#F8CBAD" stroke-width="2" />
<text x="1130" y="420" font-family="Microsoft YaHei, sans-serif" font-size="20" font-weight="bold" fill="#000000">开放</text>
<rect x="1180" y="400" width="30" height="25" fill="#C00000" />
<text x="1195" y="419" font-family="Microsoft YaHei, sans-serif" font-size="18" font-weight="bold" fill="#FFFFFF" text-anchor="middle">5</text>
<rect x="1100" y="440" width="120" height="40" fill="#E7E6E6" />
<text x="1160" y="465" font-family="Microsoft YaHei, sans-serif" font-size="14" fill="#000000" text-anchor="middle">统一监控运维平台</text>
<rect x="1100" y="490" width="120" height="40" fill="#E7E6E6" />
<text x="1160" y="515" font-family="Microsoft YaHei, sans-serif" font-size="14" fill="#000000" text-anchor="middle">一站服务中台</text>
<rect x="1100" y="540" width="120" height="40" fill="#E7E6E6" />
<text x="1160" y="565" font-family="Microsoft YaHei, sans-serif" font-size="14" fill="#000000" text-anchor="middle">物联网IT</text>
<rect x="1100" y="590" width="120" height="40" fill="#E7E6E6" />
<text x="1160" y="615" font-family="Microsoft YaHei, sans-serif" font-size="14" fill="#000000" text-anchor="middle">集同昆仑平台</text>
<rect x="1100" y="640" width="120" height="40" fill="#E7E6E6" />
<text x="1160" y="665" font-family="Microsoft YaHei, sans-serif" font-size="14" fill="#000000" text-anchor="middle">B客户推广</text>
<!-- Base Capabilities -->
<text x="50" y="620" font-family="Microsoft YaHei, sans-serif" font-size="20" font-weight="bold" fill="#000000">基础</text>
<text x="50" y="645" font-family="Microsoft YaHei, sans-serif" font-size="20" font-weight="bold" fill="#000000">能力</text>
<rect x="100" y="580" width="310" height="110" fill="none" stroke="#E7E6E6" stroke-width="2" />
<rect x="80" y="560" width="30" height="30" fill="#C00000" />
<text x="95" y="582" font-family="Microsoft YaHei, sans-serif" font-size="18" font-weight="bold" fill="#FFFFFF" text-anchor="middle">1</text>
<text x="255" y="595" font-family="Microsoft YaHei, sans-serif" font-size="14" font-weight="bold" fill="#000000" text-anchor="middle">梳理3大能力底座,做好场景清单化</text>
<line x1="120" y1="605" x2="390" y2="605" stroke="#000000" stroke-width="1" stroke-dasharray="2 2" />
<rect x="120" y="630" width="80" height="40" fill="#F2F2F2" stroke="#D9D9D9" stroke-width="1" />
<text x="160" y="655" font-family="Microsoft YaHei, sans-serif" font-size="14" fill="#000000" text-anchor="middle">核心网</text>
<rect x="210" y="630" width="80" height="40" fill="#F2F2F2" stroke="#D9D9D9" stroke-width="1" />
<text x="250" y="655" font-family="Microsoft YaHei, sans-serif" font-size="14" fill="#000000" text-anchor="middle">物联网IT</text>
<rect x="300" y="630" width="80" height="40" fill="#F2F2F2" stroke="#D9D9D9" stroke-width="1" />
<text x="340" y="655" font-family="Microsoft YaHei, sans-serif" font-size="14" fill="#000000" text-anchor="middle">物联网平台</text>
<rect x="430" y="580" width="300" height="110" fill="none" stroke="#E7E6E6" stroke-width="2" />
<rect x="410" y="560" width="30" height="30" fill="#C00000" />
<text x="425" y="582" font-family="Microsoft YaHei, sans-serif" font-size="18" font-weight="bold" fill="#FFFFFF" text-anchor="middle">2</text>
<text x="580" y="595" font-family="Microsoft YaHei, sans-serif" font-size="14" font-weight="bold" fill="#000000" text-anchor="middle">利用数字员工实现日常固化场景自动化</text>
<line x1="450" y1="605" x2="710" y2="605" stroke="#000000" stroke-width="1" stroke-dasharray="2 2" />
<rect x="450" y="630" width="80" height="40" fill="#F2F2F2" stroke="#D9D9D9" stroke-width="1" />
<text x="490" y="655" font-family="Microsoft YaHei, sans-serif" font-size="14" fill="#000000" text-anchor="middle">场景设计</text>
<rect x="540" y="630" width="80" height="40" fill="#F2F2F2" stroke="#D9D9D9" stroke-width="1" />
<text x="580" y="655" font-family="Microsoft YaHei, sans-serif" font-size="14" fill="#000000" text-anchor="middle">机器人</text>
<rect x="630" y="630" width="80" height="40" fill="#F2F2F2" stroke="#D9D9D9" stroke-width="1" />
<text x="670" y="655" font-family="Microsoft YaHei, sans-serif" font-size="14" fill="#000000" text-anchor="middle">知识库</text>
<rect x="750" y="580" width="300" height="110" fill="none" stroke="#E7E6E6" stroke-width="2" />
<rect x="730" y="560" width="30" height="30" fill="#C00000" />
<text x="745" y="582" font-family="Microsoft YaHei, sans-serif" font-size="18" font-weight="bold" fill="#FFFFFF" text-anchor="middle">3</text>
<text x="900" y="595" font-family="Microsoft YaHei, sans-serif" font-size="14" font-weight="bold" fill="#000000" text-anchor="middle">实现系统IPS三层监控全覆盖</text>
<line x1="770" y1="605" x2="1030" y2="605" stroke="#000000" stroke-width="1" stroke-dasharray="2 2" />
<rect x="770" y="630" width="80" height="40" fill="#F2F2F2" stroke="#D9D9D9" stroke-width="1" />
<text x="810" y="655" font-family="Microsoft YaHei, sans-serif" font-size="14" fill="#000000" text-anchor="middle">CMDB</text>
<rect x="860" y="630" width="80" height="40" fill="#F2F2F2" stroke="#D9D9D9" stroke-width="1" />
<text x="900" y="655" font-family="Microsoft YaHei, sans-serif" font-size="14" fill="#000000" text-anchor="middle">日志</text>
<rect x="950" y="630" width="80" height="40" fill="#F2F2F2" stroke="#D9D9D9" stroke-width="1" />
<text x="990" y="655" font-family="Microsoft YaHei, sans-serif" font-size="14" fill="#000000" text-anchor="middle">调用链</text>
</svg>

Before

Width:  |  Height:  |  Size: 14 KiB

@@ -1,93 +0,0 @@
<?xml version="1.0" encoding="UTF-8"?>
<svg xmlns="http://www.w3.org/2000/svg" width="1280" height="720" viewBox="0 0 1280 720" data-pptx-layout="01_cover" data-pptx-layout-name="Cover">
<!-- 模板: 封面页 - 政府蓝风格 (优化版) -->
<defs>
<!-- 深蓝渐变背景 -->
<linearGradient id="coverBgGrad" x1="0%" y1="0%" x2="100%" y2="100%">
<stop offset="0%" style="stop-color:#0050B3;stop-opacity:1" />
<stop offset="40%" style="stop-color:#003D8F;stop-opacity:1" />
<stop offset="100%" style="stop-color:#001F4D;stop-opacity:1" />
</linearGradient>
<!-- 顶部装饰渐变 -->
<linearGradient id="topGrad" x1="0%" y1="0%" x2="100%" y2="0%">
<stop offset="0%" style="stop-color:#00B4D8;stop-opacity:1" />
<stop offset="100%" style="stop-color:#0050B3;stop-opacity:1" />
</linearGradient>
<!-- 左侧装饰渐变 -->
<linearGradient id="sideGrad" x1="0%" y1="0%" x2="0%" y2="100%">
<stop offset="0%" style="stop-color:#00B4D8;stop-opacity:1" />
<stop offset="50%" style="stop-color:#0077B6;stop-opacity:1" />
<stop offset="100%" style="stop-color:#00B4D8;stop-opacity:1" />
</linearGradient>
<!-- 网格图案 -->
<pattern id="gridPattern" width="60" height="60" patternUnits="userSpaceOnUse">
<path d="M 60 0 L 0 0 0 60" fill="none" stroke="#FFFFFF" stroke-width="0.5" stroke-opacity="0.08"/>
</pattern>
</defs>
<!-- 背景 -->
<rect x="0" y="0" width="1280" height="720" fill="url(#coverBgGrad)" id="layout-01_cover-background" data-pptx-layer="layout" data-pptx-editable="false"/>
<!-- 科技网格纹理 -->
<rect x="0" y="0" width="1280" height="720" fill="url(#gridPattern)" id="full-canvas-01_cover-1"/>
<!-- 装饰元素 - 几何图案 -->
<circle cx="1150" cy="120" r="200" fill="#FFFFFF" fill-opacity="0.03" />
<circle cx="1200" cy="80" r="120" fill="#00B4D8" fill-opacity="0.05" />
<circle cx="150" cy="600" r="250" fill="#FFFFFF" fill-opacity="0.02" />
<circle cx="80" cy="650" r="150" fill="#00B4D8" fill-opacity="0.04" />
<!-- 对角线装饰 -->
<line x1="900" y1="0" x2="1280" y2="380" stroke="#00B4D8" stroke-width="1" stroke-opacity="0.15" />
<line x1="950" y1="0" x2="1280" y2="330" stroke="#00B4D8" stroke-width="1" stroke-opacity="0.1" />
<!-- 顶部渐变装饰线 -->
<rect x="0" y="0" width="1280" height="6" fill="url(#topGrad)" />
<!-- 左侧装饰竖条 -->
<rect x="0" y="180" width="8" height="360" fill="url(#sideGrad)" />
<rect x="16" y="220" width="3" height="280" fill="#00B4D8" fill-opacity="0.5" />
<!-- 主标题区域背景 -->
<rect x="0" y="260" width="900" height="180" fill="#000000" fill-opacity="0.25" />
<rect x="0" y="260" width="8" height="180" fill="#00B4D8" />
<!-- 主标题 -->
<text x="60" y="340" font-family="Microsoft YaHei, SimHei, sans-serif" font-size="52" font-weight="bold" fill="#FFFFFF" id="slot-01_cover-title-1" data-pptx-placeholder="title">
{{TITLE}}
</text>
<!-- 副标题 -->
<text x="60" y="400" font-family="Microsoft YaHei, Arial, sans-serif" font-size="26" fill="#90E0EF" id="slot-01_cover-subtitle-2" data-pptx-placeholder="subtitle">
{{SUBTITLE}}
</text>
<!-- 分隔线 -->
<line x1="60" y1="480" x2="400" y2="480" stroke="#00B4D8" stroke-width="2" stroke-opacity="0.8" />
<!-- 汇报人信息 -->
<text x="60" y="530" font-family="Microsoft YaHei, sans-serif" font-size="20" fill="#FFFFFF" fill-opacity="0.9">
汇报人:{{PRESENTER}}
</text>
<!-- 单位名称 -->
<text x="60" y="570" font-family="Microsoft YaHei, sans-serif" font-size="18" fill="#FFFFFF" fill-opacity="0.7">
{{ORGANIZATION}}
</text>
<!-- 日期 -->
<text x="60" y="610" font-family="Arial, Microsoft YaHei, sans-serif" font-size="16" fill="#90E0EF" fill-opacity="0.8">
{{DATE}}
</text>
<!-- 底部装饰区域 -->
<rect x="0" y="700" width="1280" height="20" fill="#003366" />
<rect x="0" y="700" width="400" height="20" fill="url(#topGrad)" fill-opacity="0.6" />
<!-- 右下角Logo区域 -->
<text x="1200" y="680" text-anchor="end" font-family="Arial, sans-serif" font-size="14" fill="#FFFFFF" fill-opacity="0.5">
{{ORG_SHORT}}
</text>
</svg>

Before

Width:  |  Height:  |  Size: 4.4 KiB

@@ -1,82 +0,0 @@
<?xml version="1.0" encoding="UTF-8"?>
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 1280 720" data-pptx-layout="02_chapter" data-pptx-layout-name="Section">
<!-- 模板: 章节页 - 政府蓝风格 (优化版) -->
<defs>
<!-- 深蓝背景渐变 -->
<linearGradient id="gradChapter" x1="0%" y1="0%" x2="100%" y2="100%">
<stop offset="0%" style="stop-color:#0050B3;stop-opacity:1" />
<stop offset="50%" style="stop-color:#003D8F;stop-opacity:1" />
<stop offset="100%" style="stop-color:#001F4D;stop-opacity:1" />
</linearGradient>
<!-- 顶部装饰渐变 -->
<linearGradient id="topGrad" x1="0%" y1="0%" x2="100%" y2="0%">
<stop offset="0%" style="stop-color:#00B4D8;stop-opacity:1" />
<stop offset="100%" style="stop-color:#0050B3;stop-opacity:1" />
</linearGradient>
<!-- 径向光晕 -->
<radialGradient id="glowGrad" cx="80%" cy="20%" r="60%">
<stop offset="0%" style="stop-color:#00B4D8;stop-opacity:0.15" />
<stop offset="100%" style="stop-color:#00B4D8;stop-opacity:0" />
</radialGradient>
</defs>
<!-- 背景 -->
<rect width="1280" height="720" fill="url(#gradChapter)" id="layout-02_chapter-background" data-pptx-layer="layout" data-pptx-editable="false"/>
<!-- 径向光晕装饰 -->
<rect width="1280" height="720" fill="url(#glowGrad)" id="full-canvas-02_chapter-1"/>
<!-- 装饰元素 - 几何图案 -->
<circle cx="1200" cy="100" r="300" fill="#FFFFFF" fill-opacity="0.02"/>
<circle cx="100" cy="620" r="250" fill="#FFFFFF" fill-opacity="0.02"/>
<circle cx="1100" cy="150" r="150" fill="#00B4D8" fill-opacity="0.03"/>
<!-- 顶部渐变装饰线 -->
<rect x="0" y="0" width="1280" height="6" fill="url(#topGrad)"/>
<!-- 网格装饰线 -->
<line x1="0" y1="240" x2="1280" y2="240" stroke="#FFFFFF" stroke-width="1" stroke-opacity="0.05"/>
<line x1="0" y1="480" x2="1280" y2="480" stroke="#FFFFFF" stroke-width="1" stroke-opacity="0.05"/>
<line x1="426" y1="0" x2="426" y2="720" stroke="#FFFFFF" stroke-width="1" stroke-opacity="0.05"/>
<line x1="854" y1="0" x2="854" y2="720" stroke="#FFFFFF" stroke-width="1" stroke-opacity="0.05"/>
<!-- 左侧装饰竖条 -->
<rect x="80" y="260" width="6" height="200" fill="#00B4D8"/>
<rect x="92" y="280" width="3" height="160" fill="#90E0EF" fill-opacity="0.6"/>
<!-- 章节内容 -->
<g transform="translate(640, 360)">
<!-- 章节编号 - 大号半透明背景 -->
<text x="0" y="-50" text-anchor="middle" font-family="Arial" font-size="180" font-weight="bold" fill="#FFFFFF" fill-opacity="0.05">
0{{CHAPTER_NUM}}
</text>
<!-- 章节编号描边效果 -->
<text x="0" y="-50" text-anchor="middle" font-family="Arial" font-size="180" font-weight="bold" fill="none" stroke="#00B4D8" stroke-width="1" stroke-opacity="0.2">
0{{CHAPTER_NUM}}
</text>
<!-- 装饰方块 -->
<rect x="-60" y="10" width="120" height="6" fill="#00B4D8"/>
<rect x="-40" y="22" width="80" height="3" fill="#90E0EF" fill-opacity="0.6"/>
<!-- 章节标题 -->
<text x="0" y="80" text-anchor="middle" font-family="Microsoft YaHei, SimHei, sans-serif" font-size="48" font-weight="bold" fill="#FFFFFF">
{{CHAPTER_TITLE}}
</text>
<!-- 英文标题/副标题 -->
<text x="0" y="130" text-anchor="middle" font-family="Arial" font-size="22" fill="#90E0EF" letter-spacing="4">
{{CHAPTER_SUBTITLE}}
</text>
</g>
<!-- 底部装饰 -->
<rect x="0" y="680" width="1280" height="40" fill="#001F4D" fill-opacity="0.5"/>
<rect x="0" y="680" width="400" height="40" fill="url(#topGrad)" fill-opacity="0.3"/>
<text x="640" y="707" text-anchor="middle" font-family="Microsoft YaHei, sans-serif" font-size="14" fill="#FFFFFF" fill-opacity="0.6">
{{ORGANIZATION}}
</text>
</svg>

Before

Width:  |  Height:  |  Size: 4.0 KiB

@@ -1,107 +0,0 @@
<?xml version="1.0" encoding="UTF-8"?>
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 1280 720" data-pptx-layout="02_toc" data-pptx-layout-name="Agenda">
<!-- 模板: 目录页 - 政府蓝风格 (优化版) -->
<defs>
<!-- 顶部装饰渐变 -->
<linearGradient id="topGrad" x1="0%" y1="0%" x2="100%" y2="0%">
<stop offset="0%" style="stop-color:#00B4D8;stop-opacity:1" />
<stop offset="100%" style="stop-color:#0050B3;stop-opacity:1" />
</linearGradient>
<!-- 左侧装饰渐变 -->
<linearGradient id="sideGrad" x1="0%" y1="0%" x2="0%" y2="100%">
<stop offset="0%" style="stop-color:#00B4D8;stop-opacity:1" />
<stop offset="100%" style="stop-color:#0050B3;stop-opacity:1" />
</linearGradient>
<!-- 背景渐变 -->
<linearGradient id="bgGrad" x1="0%" y1="0%" x2="100%" y2="100%">
<stop offset="0%" style="stop-color:#F0F9FF;stop-opacity:1" />
<stop offset="100%" style="stop-color:#E6F4FF;stop-opacity:1" />
</linearGradient>
</defs>
<!-- 背景 -->
<rect x="0" y="0" width="1280" height="720" fill="url(#bgGrad)" id="layout-02_toc-background" data-pptx-layer="layout" data-pptx-editable="false"/>
<!-- 顶部渐变装饰线 -->
<rect x="0" y="0" width="1280" height="6" fill="url(#topGrad)"/>
<!-- 左侧装饰区域 -->
<path d="M 0 0 L 280 0 L 200 720 L 0 720 Z" fill="#0050B3" fill-opacity="0.03"/>
<rect x="0" y="0" width="8" height="720" fill="url(#sideGrad)"/>
<rect x="16" y="100" width="3" height="520" fill="#00B4D8" fill-opacity="0.4"/>
<!-- 页面标题 -->
<text x="80" y="85" font-family="Microsoft YaHei, SimHei, sans-serif" font-size="38" font-weight="bold" fill="#0050B3">
目 录
</text>
<text x="80" y="115" font-family="Arial, sans-serif" font-size="18" fill="#00B4D8" letter-spacing="3">
CONTENTS
</text>
<!-- 装饰分隔线 -->
<line x1="80" y1="135" x2="220" y2="135" stroke="#0050B3" stroke-width="3"/>
<line x1="220" y1="135" x2="280" y2="135" stroke="#00B4D8" stroke-width="2"/>
<!-- 目录项容器 -->
<!-- 目录项 1 -->
<g>
<circle cx="350" cy="200" r="32" fill="#FFFFFF" stroke="#0050B3" stroke-width="3"/>
<text x="350" y="210" text-anchor="middle" font-family="Arial, sans-serif" font-size="24" font-weight="bold" fill="#0050B3">01</text>
<line x1="390" y1="200" x2="1180" y2="200" stroke="#E4E7EB" stroke-width="2"/>
<circle cx="390" cy="200" r="5" fill="#00B4D8"/>
<text x="420" y="195" font-family="Microsoft YaHei, sans-serif" font-size="22" font-weight="bold" fill="#1A1A1A">{{TOC_ITEM_1_TITLE}}</text>
<text x="420" y="220" font-family="Microsoft YaHei, sans-serif" font-size="14" fill="#718096">{{TOC_ITEM_1_DESC}}</text>
</g>
<!-- 目录项 2 -->
<g>
<circle cx="350" cy="300" r="32" fill="#FFFFFF" stroke="#0050B3" stroke-width="3"/>
<text x="350" y="310" text-anchor="middle" font-family="Arial, sans-serif" font-size="24" font-weight="bold" fill="#0050B3">02</text>
<line x1="390" y1="300" x2="1180" y2="300" stroke="#E4E7EB" stroke-width="2"/>
<circle cx="390" cy="300" r="5" fill="#00B4D8"/>
<text x="420" y="295" font-family="Microsoft YaHei, sans-serif" font-size="22" font-weight="bold" fill="#1A1A1A">{{TOC_ITEM_2_TITLE}}</text>
<text x="420" y="320" font-family="Microsoft YaHei, sans-serif" font-size="14" fill="#718096">{{TOC_ITEM_2_DESC}}</text>
</g>
<!-- 目录项 3 -->
<g>
<circle cx="350" cy="400" r="32" fill="#FFFFFF" stroke="#0050B3" stroke-width="3"/>
<text x="350" y="410" text-anchor="middle" font-family="Arial, sans-serif" font-size="24" font-weight="bold" fill="#0050B3">03</text>
<line x1="390" y1="400" x2="1180" y2="400" stroke="#E4E7EB" stroke-width="2"/>
<circle cx="390" cy="400" r="5" fill="#00B4D8"/>
<text x="420" y="395" font-family="Microsoft YaHei, sans-serif" font-size="22" font-weight="bold" fill="#1A1A1A">{{TOC_ITEM_3_TITLE}}</text>
<text x="420" y="420" font-family="Microsoft YaHei, sans-serif" font-size="14" fill="#718096">{{TOC_ITEM_3_DESC}}</text>
</g>
<!-- 目录项 4 -->
<g>
<circle cx="350" cy="500" r="32" fill="#FFFFFF" stroke="#0050B3" stroke-width="3"/>
<text x="350" y="510" text-anchor="middle" font-family="Arial, sans-serif" font-size="24" font-weight="bold" fill="#0050B3">04</text>
<line x1="390" y1="500" x2="1180" y2="500" stroke="#E4E7EB" stroke-width="2"/>
<circle cx="390" cy="500" r="5" fill="#00B4D8"/>
<text x="420" y="495" font-family="Microsoft YaHei, sans-serif" font-size="22" font-weight="bold" fill="#1A1A1A">{{TOC_ITEM_4_TITLE}}</text>
<text x="420" y="520" font-family="Microsoft YaHei, sans-serif" font-size="14" fill="#718096">{{TOC_ITEM_4_DESC}}</text>
</g>
<!-- 目录项 5 -->
<g>
<circle cx="350" cy="600" r="32" fill="#FFFFFF" stroke="#0050B3" stroke-width="3"/>
<text x="350" y="610" text-anchor="middle" font-family="Arial, sans-serif" font-size="24" font-weight="bold" fill="#0050B3">05</text>
<line x1="390" y1="600" x2="1180" y2="600" stroke="#E4E7EB" stroke-width="2"/>
<circle cx="390" cy="600" r="5" fill="#00B4D8"/>
<text x="420" y="595" font-family="Microsoft YaHei, sans-serif" font-size="22" font-weight="bold" fill="#1A1A1A">{{TOC_ITEM_5_TITLE}}</text>
<text x="420" y="620" font-family="Microsoft YaHei, sans-serif" font-size="14" fill="#718096">{{TOC_ITEM_5_DESC}}</text>
</g>
<!-- 右侧装饰 -->
<circle cx="1200" cy="120" r="80" fill="#0050B3" fill-opacity="0.03"/>
<circle cx="1220" cy="600" r="100" fill="#00B4D8" fill-opacity="0.03"/>
<!-- 底部装饰线 -->
<rect x="0" y="716" width="1280" height="4" fill="#0050B3"/>
<!-- 页码 -->
<text x="640" y="695" text-anchor="middle" font-family="Arial, sans-serif" font-size="14" fill="#718096" id="slot-02_toc-slide_number-1" data-pptx-placeholder="slide-number">{{PAGE_NUM}}</text>
</svg>

Before

Width:  |  Height:  |  Size: 6.0 KiB

@@ -1,78 +0,0 @@
<?xml version="1.0" encoding="UTF-8"?>
<svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" viewBox="0 0 1280 720" data-pptx-layout="03_content" data-pptx-layout-name="Content">
<!-- 模板: 内容页 - 政府蓝风格 (优化版) -->
<defs>
<!-- 顶部装饰渐变 -->
<linearGradient id="topGrad" x1="0%" y1="0%" x2="100%" y2="0%">
<stop offset="0%" style="stop-color:#00B4D8;stop-opacity:1" />
<stop offset="100%" style="stop-color:#0050B3;stop-opacity:1" />
</linearGradient>
<!-- 序号块渐变 -->
<linearGradient id="numGrad" x1="0%" y1="0%" x2="100%" y2="100%">
<stop offset="0%" style="stop-color:#0077B6;stop-opacity:1" />
<stop offset="100%" style="stop-color:#0050B3;stop-opacity:1" />
</linearGradient>
<!-- 背景渐变 -->
<linearGradient id="bgGrad" x1="0%" y1="0%" x2="0%" y2="100%">
<stop offset="0%" style="stop-color:#F8FCFF;stop-opacity:1" />
<stop offset="100%" style="stop-color:#FFFFFF;stop-opacity:1" />
</linearGradient>
</defs>
<!-- 背景 -->
<rect x="0" y="0" width="1280" height="720" fill="url(#bgGrad)" id="layout-03_content-background" data-pptx-layer="layout" data-pptx-editable="false"/>
<!-- 顶部渐变装饰线 -->
<rect x="0" y="0" width="1280" height="6" fill="url(#topGrad)" />
<!-- 页眉导航栏 -->
<!-- 章节序号块 -->
<rect x="60" y="30" width="50" height="50" rx="6" fill="url(#numGrad)" />
<text x="85" y="65" text-anchor="middle" font-family="Arial, sans-serif" font-size="24" font-weight="bold" fill="#FFFFFF">{{CHAPTER_NUM}}</text>
<!-- 页面标题 -->
<text x="130" y="65" font-family="Microsoft YaHei, SimHei, sans-serif" font-size="28" font-weight="bold" fill="#1A1A1A" id="slot-03_content-title-1" data-pptx-placeholder="title">{{PAGE_TITLE}}</text>
<!-- 右上角单位标识 -->
<text x="1220" y="50" text-anchor="end" font-family="Microsoft YaHei, sans-serif" font-size="12" fill="#718096">{{ORG_SHORT}}</text>
<rect x="1100" y="58" width="120" height="2" fill="url(#topGrad)" fill-opacity="0.4"/>
<!-- 分隔线 -->
<line x1="60" y1="95" x2="1220" y2="95" stroke="#E4E7EB" stroke-width="1" stroke-dasharray="6,4"/>
<!-- 内容区域 - 灵活布局,由 Executor 根据实际内容自由设计 -->
<!-- 可使用的布局模式:
- 单栏文字列表
- 左右双栏对比
- 卡片式分块(如 2×2 四宫格)
- 图文混排(左图右文、上图下文、通栏图)
- 表格
- 时间轴
- 流程图
-->
<rect x="60" y="110" width="1160" height="550" fill="none" stroke="#E4E7EB" stroke-width="2" stroke-dasharray="8,8" />
<text x="640" y="365" text-anchor="middle" fill="#CBD5E1" font-size="18" font-family="Microsoft YaHei, sans-serif" id="slot-03_content-body-2" data-pptx-placeholder="body">
{{CONTENT_AREA}}
</text>
<text x="640" y="400" text-anchor="middle" fill="#CBD5E1" font-size="14" font-family="Microsoft YaHei, sans-serif">
(由 Executor 根据实际内容自由布局)
</text>
<!-- 常用设计元素参考 -->
<!-- 色块容器: <rect fill="#F0F9FF" rx="8"/> -->
<!-- 强调色块: <rect fill="#0050B3"/> -->
<!-- 辅助色块: <rect fill="#00B4D8"/> -->
<!-- 圆点列表: <circle r="5" fill="#0050B3"/> -->
<!-- 分隔线: <line stroke="#E4E7EB" stroke-width="1"/> -->
<!-- 底部装饰线 -->
<rect x="0" y="716" width="1280" height="4" fill="#0050B3" />
<!-- 页码 -->
<text x="640" y="695" text-anchor="middle" font-family="Arial, sans-serif" font-size="14" fill="#718096" id="slot-03_content-slide_number-3" data-pptx-placeholder="slide-number">{{PAGE_NUM}}</text>
<!-- 底部单位名称 -->
<text x="1220" y="695" text-anchor="end" font-family="Microsoft YaHei, sans-serif" font-size="12" fill="#718096" fill-opacity="0.6">{{ORG_SHORT}}</text>
</svg>

Before

Width:  |  Height:  |  Size: 4.0 KiB

@@ -1,81 +0,0 @@
<?xml version="1.0" encoding="UTF-8"?>
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 1280 720" data-pptx-layout="04_ending" data-pptx-layout-name="Closing">
<!-- 模板: 结束页 - 政府蓝风格 (优化版) -->
<defs>
<!-- 深蓝背景渐变 -->
<linearGradient id="endBgGrad" x1="0%" y1="0%" x2="100%" y2="100%">
<stop offset="0%" style="stop-color:#0050B3;stop-opacity:1" />
<stop offset="50%" style="stop-color:#003D8F;stop-opacity:1" />
<stop offset="100%" style="stop-color:#001F4D;stop-opacity:1" />
</linearGradient>
<!-- 顶部装饰渐变 -->
<linearGradient id="topGrad" x1="0%" y1="0%" x2="100%" y2="0%">
<stop offset="0%" style="stop-color:#00B4D8;stop-opacity:1" />
<stop offset="100%" style="stop-color:#0050B3;stop-opacity:1" />
</linearGradient>
</defs>
<!-- 背景 -->
<rect x="0" y="0" width="1280" height="720" fill="url(#endBgGrad)" id="layout-04_ending-background" data-pptx-layer="layout" data-pptx-editable="false"/>
<!-- 装饰元素 - 几何图案 -->
<circle cx="100" cy="120" r="200" fill="#FFFFFF" fill-opacity="0.02" />
<circle cx="1180" cy="600" r="250" fill="#FFFFFF" fill-opacity="0.02" />
<circle cx="640" cy="360" r="350" fill="#00B4D8" fill-opacity="0.02" />
<!-- 顶部渐变装饰线 -->
<rect x="0" y="0" width="1280" height="6" fill="url(#topGrad)" />
<!-- 网格装饰 -->
<line x1="0" y1="180" x2="1280" y2="180" stroke="#FFFFFF" stroke-width="1" stroke-opacity="0.03" />
<line x1="0" y1="360" x2="1280" y2="360" stroke="#FFFFFF" stroke-width="1" stroke-opacity="0.03" />
<line x1="0" y1="540" x2="1280" y2="540" stroke="#FFFFFF" stroke-width="1" stroke-opacity="0.03" />
<line x1="320" y1="0" x2="320" y2="720" stroke="#FFFFFF" stroke-width="1" stroke-opacity="0.03" />
<line x1="640" y1="0" x2="640" y2="720" stroke="#FFFFFF" stroke-width="1" stroke-opacity="0.03" />
<line x1="960" y1="0" x2="960" y2="720" stroke="#FFFFFF" stroke-width="1" stroke-opacity="0.03" />
<!-- 波浪曲线装饰 -->
<path d="M 0 580 Q 320 620 640 580 T 1280 580" fill="none" stroke="#00B4D8" stroke-width="2" stroke-opacity="0.2"/>
<path d="M 0 600 Q 320 640 640 600 T 1280 600" fill="none" stroke="#00B4D8" stroke-width="1" stroke-opacity="0.15"/>
<path d="M 0 620 Q 320 660 640 620 T 1280 620" fill="none" stroke="#90E0EF" stroke-width="1" stroke-opacity="0.1"/>
<!-- 左侧装饰竖条 -->
<rect x="100" y="240" width="6" height="240" fill="#00B4D8" fill-opacity="0.6" />
<rect x="112" y="260" width="3" height="200" fill="#90E0EF" fill-opacity="0.4" />
<!-- 感谢语(中文) -->
<text x="640" y="300" text-anchor="middle" font-family="Microsoft YaHei, SimHei, sans-serif" font-size="64" font-weight="bold" fill="#FFFFFF" letter-spacing="8">
{{THANK_YOU}}
</text>
<!-- 感谢语(英文) -->
<text x="640" y="360" text-anchor="middle" font-family="Arial, sans-serif" font-size="26" fill="#90E0EF" letter-spacing="6">
{{THANK_YOU_EN}}
</text>
<!-- 分隔线 -->
<line x1="490" y1="400" x2="600" y2="400" stroke="#00B4D8" stroke-width="2"/>
<circle cx="640" cy="400" r="4" fill="#00B4D8"/>
<line x1="680" y1="400" x2="790" y2="400" stroke="#00B4D8" stroke-width="2"/>
<!-- 欢迎指正 -->
<text x="640" y="460" text-anchor="middle" font-family="Microsoft YaHei, sans-serif" font-size="28" fill="#FFFFFF" fill-opacity="0.9">
欢迎批评指正
</text>
<!-- 单位信息 -->
<text x="640" y="520" text-anchor="middle" font-family="Microsoft YaHei, sans-serif" font-size="18" fill="#FFFFFF" fill-opacity="0.7">
{{ORGANIZATION}}
</text>
<!-- 联系信息 -->
<text x="640" y="560" text-anchor="middle" font-family="Microsoft YaHei, sans-serif" font-size="14" fill="#90E0EF" fill-opacity="0.8">
{{CONTACT_INFO}}
</text>
<!-- 底部装饰区域 -->
<rect x="0" y="680" width="1280" height="40" fill="#001F4D" fill-opacity="0.6" />
<rect x="0" y="680" width="400" height="40" fill="url(#topGrad)" fill-opacity="0.3" />
</svg>

Before

Width:  |  Height:  |  Size: 4.1 KiB

@@ -1,183 +0,0 @@
---
layout_id: government_blue
kind: layout
native_structure_mode: template
summary: Key project briefings, Five-Year Plan presentations, work summaries, investment promotion, policy interpretation.
canvas_format: ppt169
page_count: 5
page_types: [cover, toc, chapter, content, ending]
---
# Government Blue Style Template - Design Specification
> Suitable for government agency briefings, key project presentations, planning proposals, investment promotion, and similar scenarios across all levels of government.
---
## I. Template Overview
| Property | Description |
| -------------- | ------------------------------------------------------------ |
| **Template Name** | government_blue (Government Blue Template) |
| **Use Cases** | Key project briefings, Five-Year Plan presentations, work summaries, investment promotion, policy interpretation |
| **Design Tone** | Grand, tech-forward, modern, professional government style |
| **Theme Mode** | Light theme (white background + blue gradient accents) |
---
## II. Canvas Specification
| Property | Value |
| -------------- | ----------------------------- |
| **Format** | Standard 16:9 |
| **Dimensions** | 1280 × 720 px |
| **viewBox** | `0 0 1280 720` |
| **Page Margins** | Left/Right 60px, Top 80px, Bottom 40px |
| **Safe Area** | x: 60-1220, y: 80-680 |
---
## III. Page Structure
### General Layout
| Area | Position/Height | Description |
| ---------- | --------------- | -------------------------------------- |
| **Top** | y=0, h=6px | Blue gradient bar (bright blue → deep blue), full width |
| **Title Bar** | y=30, h=50px | Section number block + title text + top-right logo |
| **Content Area** | y=100, h=560px | Main content area |
| **Footer** | y=680, h=40px | Page number, organization name, bottom decoration line |
### Navigation Bar Design
- **Top Decoration Line**: Blue gradient (`#00B4D8``#0050B3`), height 6px, full width
- **Bottom Decoration Line**: Deep blue (`#0050B3`), height 4px, y=716
- **Title Bar** (y=30):
- Section number block: Deep blue square (50×50px), white number centered
- Title text: 20px from number block, 28px font size, `#1A1A1A`
- Top-right logo: Fixed at x=1107, dimensions 113×50px
---
## IV. Page Types
### 1. Cover Page (01_cover.svg)
- Deep blue gradient background + tech grid texture
- Left-side bright blue accent bar
- Main title + subtitle (white)
- Presenter/Organization info
- Bottom date area
- Geometric decorative circles
### 2. Table of Contents (02_toc.svg)
- Light blue gradient background
- Left-side decorative trapezoid + gradient vertical bar
- Supports up to 5 chapters
- Circular numbering + connector line design
- Floating card effect (simulated with solid colors)
### 3. Chapter Page (02_chapter.svg)
- Deep blue gradient background
- Radial glow decoration
- Large chapter number (semi-transparent + stroke effect)
- Chapter title + English subtitle
- Bright blue accent bar
### 4. Content Page (03_content.svg)
- Light gradient background
- Gradient number block
- Dashed divider lines
- Flexible content area
- Supports multiple layout modes
### 5. Ending Page (04_ending.svg)
- Deep blue gradient background
- Wave curve decoration
- Centered thank-you message (Chinese and English)
- Bright blue divider line
- Contact information
---
## V. SVG Page Roster
| File | Role | Description |
|------|------|-------------|
| `01_cover.svg` | cover | Title slide; project name, presenter, date |
| `02_chapter.svg` | chapter | Chapter divider page (large number + chapter title) |
| `02_toc.svg` | toc | Table of contents listing major sections |
| `03_content.svg` | content | Main content page; body of the deck |
| `04_ending.svg` | ending | Closing/thank-you page |
## VI. Layout Modes
| Mode | Use Cases |
| ------------------ | ------------------------------ |
| **Single Column Centered** | Cover, closing, key points |
| **Two Columns (5:5)** | Comparative display |
| **Two Columns (4:6)** | Image-text mixed layout |
| **Top-Bottom Split** | Process descriptions, policy lists |
| **Three-Column Cards** | Project lists, data display |
| **Matrix Grid** | Category display |
| **Table** | Data comparison, specification lists |
---
## VII. Spacing Guidelines
| Element | Value |
| ---------------- | ------ |
| Card spacing | 24px |
| Content block spacing | 32px |
| Card padding | 24px |
| Card border radius | 8px |
| Icon-to-text gap | 12px |
---
## VIII. Placeholder Specification
Templates use `{{PLACEHOLDER}}` format placeholders. Common placeholders:
| Placeholder | Description |
| ------------------ | ------------------ |
| `{{TITLE}}` | Main title |
| `{{SUBTITLE}}` | Subtitle |
| `{{AUTHOR}}` | Organization name (Chinese) |
| `{{AUTHOR_EN}}` | Organization name (English) |
| `{{PRESENTER}}` | Presenter |
| `{{PAGE_TITLE}}` | Page title |
| `{{CHAPTER_NUM}}` | Chapter number |
| `{{PAGE_NUM}}` | Page number |
| `{{DATE}}` | Date |
| `{{ORGANIZATION}}` | Full organization name |
| `{{ORG_SHORT}}` | Abbreviated organization name |
| `{{CONTACT_INFO}}` | Contact information |
| `{{TOC_ITEM_N_TITLE}}` | TOC item title |
| `{{TOC_ITEM_N_DESC}}` | TOC item description |
| `{{LOGO_HEADER}}` | Header logo filename |
---
## IX. Usage Instructions
1. Copy the template to the project directory
2. Replace logo files in the images directory (if applicable)
3. Select the appropriate page template based on content requirements
4. Mark content to be replaced using placeholders
5. Generate the final SVG through the Executor role
---
## X. Design Highlights
- **Tech Gradient**: Bright-to-deep blue gradient reflects a modern tech aesthetic
- **Geometric Decorative Elements**: Circles and grids add a tech atmosphere
- **Wave Curves**: Dynamic decoration on the ending page
- **Floating Card Effect**: Modern design for the table of contents page
- **Clear Visual Hierarchy**: Ensures efficient information delivery
@@ -1,73 +0,0 @@
<?xml version="1.0" encoding="UTF-8"?>
<svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" viewBox="0 0 1280 720" data-pptx-layout="01_cover" data-pptx-layout-name="Cover">
<!-- 模板: 封面页 - 重庆两江新区发改委风格 -->
<defs>
<!-- 深蓝渐变背景 -->
<linearGradient id="coverBgGrad" x1="0%" y1="0%" x2="100%" y2="100%">
<stop offset="0%" style="stop-color:#003366;stop-opacity:1" />
<stop offset="50%" style="stop-color:#002244;stop-opacity:1" />
<stop offset="100%" style="stop-color:#001a33;stop-opacity:1" />
</linearGradient>
<!-- 顶部装饰渐变 -->
<linearGradient id="topDecoGrad" x1="0%" y1="0%" x2="100%" y2="0%">
<stop offset="0%" style="stop-color:#8B0000;stop-opacity:1" />
<stop offset="100%" style="stop-color:#DAA520;stop-opacity:1" />
</linearGradient>
</defs>
<!-- 背景 -->
<rect x="0" y="0" width="1280" height="720" fill="url(#coverBgGrad)" id="layout-01_cover-background" data-pptx-layer="layout" data-pptx-editable="false"/>
<!-- 装饰元素 - 几何图案 -->
<circle cx="1200" cy="100" r="300" fill="#FFFFFF" fill-opacity="0.02" />
<circle cx="80" cy="650" r="200" fill="#FFFFFF" fill-opacity="0.02" />
<circle cx="640" cy="360" r="450" fill="#FFFFFF" fill-opacity="0.015" />
<!-- 网格装饰线 -->
<line x1="0" y1="180" x2="1280" y2="180" stroke="#FFFFFF" stroke-width="1" stroke-opacity="0.05" />
<line x1="0" y1="540" x2="1280" y2="540" stroke="#FFFFFF" stroke-width="1" stroke-opacity="0.05" />
<line x1="320" y1="0" x2="320" y2="720" stroke="#FFFFFF" stroke-width="1" stroke-opacity="0.05" />
<line x1="960" y1="0" x2="960" y2="720" stroke="#FFFFFF" stroke-width="1" stroke-opacity="0.05" />
<!-- 顶部金色装饰线 -->
<rect x="0" y="0" width="1280" height="6" fill="url(#topDecoGrad)" />
<!-- 左侧装饰竖条 -->
<rect x="60" y="200" width="6" height="320" fill="#DAA520" fill-opacity="0.6" />
<!-- 主标题区域 -->
<text x="640" y="300" text-anchor="middle" font-family="Microsoft YaHei, SimHei, sans-serif" font-size="52" font-weight="bold" fill="#FFFFFF" id="slot-01_cover-title-1" data-pptx-placeholder="title">
{{TITLE}}
</text>
<!-- 副标题 -->
<text x="640" y="370" text-anchor="middle" font-family="Microsoft YaHei, Arial, sans-serif" font-size="28" fill="#FFFFFF" fill-opacity="0.85" id="slot-01_cover-subtitle-2" data-pptx-placeholder="subtitle">
{{SUBTITLE}}
</text>
<!-- 分隔线 -->
<line x1="440" y1="420" x2="840" y2="420" stroke="#DAA520" stroke-width="2" stroke-opacity="0.8" />
<!-- 单位名称(中文) -->
<text x="640" y="490" text-anchor="middle" font-family="Microsoft YaHei, Arial, sans-serif" font-size="24" fill="#FFFFFF" fill-opacity="0.9">
{{AUTHOR}}
</text>
<!-- 单位名称(英文) -->
<text x="640" y="530" text-anchor="middle" font-family="Arial, sans-serif" font-size="16" fill="#FFFFFF" fill-opacity="0.6">
{{AUTHOR_EN}}
</text>
<!-- 日期 -->
<text x="640" y="620" text-anchor="middle" font-family="Arial, Microsoft YaHei, sans-serif" font-size="18" fill="#FFFFFF" fill-opacity="0.7">
{{DATE}}
</text>
<!-- 底部装饰区域 -->
<rect x="0" y="690" width="1280" height="30" fill="#8B0000" fill-opacity="0.8" />
<text x="640" y="712" text-anchor="middle" font-family="Microsoft YaHei, sans-serif" font-size="14" fill="#FFFFFF" fill-opacity="0.8">
{{ORGANIZATION}}
</text>
</svg>

Before

Width:  |  Height:  |  Size: 3.6 KiB

@@ -1,66 +0,0 @@
<?xml version="1.0" encoding="UTF-8"?>
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 1280 720" data-pptx-layout="02_chapter" data-pptx-layout-name="Section">
<!-- 模板: 章节页 - 重庆两江新区发改委风格 -->
<defs>
<!-- 深蓝背景渐变 -->
<linearGradient id="gradChapter" x1="0%" y1="0%" x2="100%" y2="100%">
<stop offset="0%" style="stop-color:#003366;stop-opacity:1" />
<stop offset="50%" style="stop-color:#002244;stop-opacity:1" />
<stop offset="100%" style="stop-color:#001a33;stop-opacity:1" />
</linearGradient>
<!-- 顶部装饰渐变 -->
<linearGradient id="topDecoGrad" x1="0%" y1="0%" x2="100%" y2="0%">
<stop offset="0%" style="stop-color:#8B0000;stop-opacity:1" />
<stop offset="100%" style="stop-color:#DAA520;stop-opacity:1" />
</linearGradient>
</defs>
<!-- 背景 -->
<rect width="1280" height="720" fill="url(#gradChapter)" id="layout-02_chapter-background" data-pptx-layer="layout" data-pptx-editable="false"/>
<!-- 装饰元素 - 几何图案 -->
<circle cx="1200" cy="100" r="250" fill="#FFFFFF" fill-opacity="0.02"/>
<circle cx="80" cy="620" r="300" fill="#FFFFFF" fill-opacity="0.02"/>
<circle cx="640" cy="360" r="400" fill="#FFFFFF" fill-opacity="0.015"/>
<!-- 顶部金红渐变装饰线 -->
<rect x="0" y="0" width="1280" height="6" fill="url(#topDecoGrad)"/>
<!-- 网格装饰线 -->
<line x1="0" y1="240" x2="1280" y2="240" stroke="#FFFFFF" stroke-width="1" stroke-opacity="0.05"/>
<line x1="0" y1="480" x2="1280" y2="480" stroke="#FFFFFF" stroke-width="1" stroke-opacity="0.05"/>
<line x1="426" y1="0" x2="426" y2="720" stroke="#FFFFFF" stroke-width="1" stroke-opacity="0.05"/>
<line x1="854" y1="0" x2="854" y2="720" stroke="#FFFFFF" stroke-width="1" stroke-opacity="0.05"/>
<!-- 左侧装饰竖条 -->
<rect x="100" y="260" width="6" height="200" fill="#DAA520" fill-opacity="0.8"/>
<!-- 章节内容 -->
<g transform="translate(640, 360)">
<!-- 章节编号 - 大号半透明背景 -->
<text x="0" y="-60" text-anchor="middle" font-family="Arial" font-size="160" font-weight="bold" fill="#FFFFFF" fill-opacity="0.06">
0{{CHAPTER_NUM}}
</text>
<!-- 装饰方块 -->
<rect x="-50" y="0" width="100" height="6" fill="#DAA520"/>
<!-- 章节标题 -->
<text x="0" y="70" text-anchor="middle" font-family="Microsoft YaHei, SimHei, sans-serif" font-size="48" font-weight="bold" fill="#FFFFFF">
{{CHAPTER_TITLE}}
</text>
<!-- 英文标题/副标题 -->
<text x="0" y="120" text-anchor="middle" font-family="Arial" font-size="22" fill="#FFFFFF" fill-opacity="0.6" letter-spacing="3">
{{CHAPTER_SUBTITLE}}
</text>
</g>
<!-- 底部装饰 -->
<rect x="0" y="680" width="1280" height="40" fill="#8B0000" fill-opacity="0.6"/>
<text x="640" y="707" text-anchor="middle" font-family="Microsoft YaHei, sans-serif" font-size="14" fill="#FFFFFF" fill-opacity="0.8">
{{ORGANIZATION}}
</text>
</svg>

Before

Width:  |  Height:  |  Size: 3.1 KiB

Some files were not shown because too many files have changed in this diff Show More