From 048d3cf36f78fb1f94fda6cd8bbdca79ac3bbd55 Mon Sep 17 00:00:00 2001 From: Fini Date: Sun, 2 Aug 2026 11:00:34 +0800 Subject: [PATCH] feat(editor): add the six-page presentation template MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit The `slides` scene had a filter chip and no content. This fills it with a deck that covers the shapes a report actually needs — cover, agenda, three-point argument, metrics, chart with its takeaway spelled out, and a closing — so a user replaces text rather than building structure. Typography and layout follow the `slides` domain contract rather than being eyeballed: 1920x1080 frames at a fixed size (never fit_content — projector aspect is a hard constraint), 120px safe margins, body at 26-34, titles at 64, and the metric numbers at 140 so each data slide has exactly one visual anchor. Frames are generated through `oplib` against the canonical schema, like the other templates, so they stay reproducible. The card baker learns to tile multiple renders into a grid. A 16:9 deck composited as a 1x6 strip is a 10:1 image that shrinks each slide to ~100px inside the 640x400 card — visible as noise, not as slides. Column count is picked to land nearest the card's own aspect, which puts this deck at 3x2 and leaves each slide legible. Also ignores `__pycache__` repo-wide; the generators are run in place and were leaving bytecode next to their sources. Claude-Session: https://claude.ai/code/session_01FqKQqNj8exYwopGDpYUU7x --- .gitignore | 2 + .../assets/scene_templates.toml | 12 + .../assets/scene_templates/slide-deck.op | 1658 +++++++++++++++++ .../src/scene_template_catalog.rs | 2 + .../scene_template_previews/slide-deck.jpg | Bin 0 -> 14679 bytes templates/step0/_generators/previews.sh | 5 +- .../step0/_generators/scene_preview_cards.py | 59 +- templates/step0/_generators/tpl_slides.py | 240 +++ templates/step0/previews/slide-deck-01.png | Bin 0 -> 70303 bytes templates/step0/previews/slide-deck-02.png | Bin 0 -> 56966 bytes templates/step0/previews/slide-deck-03.png | Bin 0 -> 81246 bytes templates/step0/previews/slide-deck-04.png | Bin 0 -> 72485 bytes templates/step0/previews/slide-deck-05.png | Bin 0 -> 89782 bytes templates/step0/previews/slide-deck-06.png | Bin 0 -> 37275 bytes 14 files changed, 1971 insertions(+), 7 deletions(-) create mode 100644 crates/op-editor-core/assets/scene_templates/slide-deck.op create mode 100644 crates/op-editor-ui/assets/scene_template_previews/slide-deck.jpg create mode 100644 templates/step0/_generators/tpl_slides.py create mode 100644 templates/step0/previews/slide-deck-01.png create mode 100644 templates/step0/previews/slide-deck-02.png create mode 100644 templates/step0/previews/slide-deck-03.png create mode 100644 templates/step0/previews/slide-deck-04.png create mode 100644 templates/step0/previews/slide-deck-05.png create mode 100644 templates/step0/previews/slide-deck-06.png diff --git a/.gitignore b/.gitignore index b9dbf9d09..20c51e519 100644 --- a/.gitignore +++ b/.gitignore @@ -58,5 +58,7 @@ Cargo.lock.merge-conflict **/locator-signing-key*.json tools/__pycache__/ +__pycache__/ +*.pyc openpencil-docs output diff --git a/crates/op-editor-core/assets/scene_templates.toml b/crates/op-editor-core/assets/scene_templates.toml index c3f3b3dae..a83e0c438 100644 --- a/crates/op-editor-core/assets/scene_templates.toml +++ b/crates/op-editor-core/assets/scene_templates.toml @@ -33,6 +33,18 @@ frames = 5 frame_width = 1080 frame_height = 1440 +[[template]] +id = "slide-deck" +scene = "slides" +title_key = "sceneTemplate.item.slideDeck.title" +title_fallback = "演示文稿 · 六页" +summary_key = "sceneTemplate.item.slideDeck.summary" +summary_fallback = "封面、目录、要点、数据、图表和结尾,16:9 投影比例,替换文案即可上台。" +tags = ["PPT", "演示", "汇报", "幻灯片", "slides", "deck", "presentation"] +frames = 6 +frame_width = 1920 +frame_height = 1080 + [[template]] id = "before-after" scene = "comparison" diff --git a/crates/op-editor-core/assets/scene_templates/slide-deck.op b/crates/op-editor-core/assets/scene_templates/slide-deck.op new file mode 100644 index 000000000..3e12b333c --- /dev/null +++ b/crates/op-editor-core/assets/scene_templates/slide-deck.op @@ -0,0 +1,1658 @@ +{ + "version": "1.0.0", + "name": "演示文稿 · 16:9 模板", + "variables": { + "c-bg": { + "type": "color", + "value": "#FFFFFF" + }, + "c-surface": { + "type": "color", + "value": "#F4F6F9" + }, + "c-ink": { + "type": "color", + "value": "#0B1220" + }, + "c-muted": { + "type": "color", + "value": "#5A6B85" + }, + "c-accent": { + "type": "color", + "value": "#2F5BEA" + }, + "c-accent-soft": { + "type": "color", + "value": "#E4EAFD" + }, + "c-border": { + "type": "color", + "value": "#DCE2EC" + } + }, + "children": [ + { + "type": "frame", + "id": "f1", + "name": "01 封面", + "width": 1920, + "height": 1080, + "layout": "vertical", + "padding": [ + 120, + 120 + ], + "gap": 40, + "justifyContent": "center", + "fill": [ + { + "type": "solid", + "color": "$c-bg" + } + ], + "clipContent": true, + "children": [ + { + "type": "frame", + "id": "f2", + "name": "封面文案", + "width": "fill_container", + "height": "fit_content", + "layout": "vertical", + "gap": 32, + "fill": [], + "children": [ + { + "type": "frame", + "id": "f3", + "name": "标签", + "width": "fit_content", + "height": "fit_content", + "layout": "horizontal", + "padding": [ + 8, + 18 + ], + "cornerRadius": 999, + "fill": [ + { + "type": "solid", + "color": "$c-accent-soft" + } + ], + "children": [ + { + "type": "text", + "id": "t4", + "name": "标签文字", + "content": "2026 · 季度汇报", + "fontFamily": "Noto Sans SC", + "fontSize": 24, + "fontWeight": 600, + "fill": [ + { + "type": "solid", + "color": "$c-accent" + } + ], + "lineHeight": 1.6, + "letterSpacing": 1.2, + "textGrowth": "fixed-width", + "width": "fit_content" + } + ] + }, + { + "type": "text", + "id": "t5", + "name": "主标题", + "content": "把复杂的事,讲成一句话", + "fontFamily": "Noto Sans SC", + "fontSize": 104, + "fontWeight": 700, + "fill": [ + { + "type": "solid", + "color": "$c-ink" + } + ], + "lineHeight": 1.15, + "letterSpacing": 0, + "textGrowth": "fixed-width", + "width": "fill_container" + }, + { + "type": "text", + "id": "t6", + "name": "副标题", + "content": "副标题写清楚这次要让听众记住的那个结论。", + "fontFamily": "Noto Sans SC", + "fontSize": 34, + "fontWeight": 400, + "fill": [ + { + "type": "solid", + "color": "$c-muted" + } + ], + "lineHeight": 1.4, + "letterSpacing": 0, + "textGrowth": "fixed-width", + "width": "fill_container" + }, + { + "type": "rectangle", + "id": "r7", + "name": "强调条", + "width": 120, + "height": 8, + "cornerRadius": 999, + "fill": [ + { + "type": "solid", + "color": "$c-accent" + } + ] + } + ] + }, + { + "type": "frame", + "id": "f8", + "name": "落款", + "width": "fill_container", + "height": "fit_content", + "layout": "horizontal", + "gap": 32, + "alignItems": "center", + "fill": [], + "children": [ + { + "type": "text", + "id": "t9", + "name": "演讲者", + "content": "演讲者姓名 · 团队", + "fontFamily": "Inter", + "fontSize": 28, + "fontWeight": 500, + "fill": [ + { + "type": "solid", + "color": "$c-ink" + } + ], + "lineHeight": 1.6, + "letterSpacing": 0, + "textGrowth": "fixed-width", + "width": "fit_content" + }, + { + "type": "text", + "id": "t10", + "name": "日期", + "content": "2026.08", + "fontFamily": "Inter", + "fontSize": 28, + "fontWeight": 400, + "fill": [ + { + "type": "solid", + "color": "$c-muted" + } + ], + "lineHeight": 1.6, + "letterSpacing": 0, + "textGrowth": "fixed-width", + "width": "fit_content" + } + ] + } + ] + }, + { + "type": "frame", + "id": "f11", + "name": "02 目录", + "width": 1920, + "height": 1080, + "layout": "vertical", + "padding": [ + 120, + 120 + ], + "gap": 48, + "justifyContent": "start", + "fill": [ + { + "type": "solid", + "color": "$c-bg" + } + ], + "clipContent": true, + "children": [ + { + "type": "text", + "id": "t12", + "name": "页标题", + "content": "目录", + "fontFamily": "Noto Sans SC", + "fontSize": 64, + "fontWeight": 700, + "fill": [ + { + "type": "solid", + "color": "$c-ink" + } + ], + "lineHeight": 1.15, + "letterSpacing": 0, + "textGrowth": "fixed-width", + "width": "fill_container" + }, + { + "type": "frame", + "id": "f13", + "name": "目录网格", + "width": "fill_container", + "height": "fit_content", + "layout": "horizontal", + "gap": 32, + "alignItems": "start", + "fill": [], + "children": [ + { + "type": "frame", + "id": "f14", + "name": "目录项", + "width": "fill_container", + "height": "fill_container", + "layout": "vertical", + "gap": 14, + "fill": [ + { + "type": "solid", + "color": "$c-surface" + } + ], + "padding": [ + 36, + 32 + ], + "cornerRadius": 20, + "children": [ + { + "type": "text", + "id": "t15", + "name": "序号", + "content": "01", + "fontFamily": "Noto Sans SC", + "fontSize": 40, + "fontWeight": 700, + "fill": [ + { + "type": "solid", + "color": "$c-accent" + } + ], + "lineHeight": 1.1, + "letterSpacing": 0, + "textGrowth": "fixed-width", + "width": "fit_content" + }, + { + "type": "text", + "id": "t16", + "name": "条目标题", + "content": "背景与问题", + "fontFamily": "Noto Sans SC", + "fontSize": 34, + "fontWeight": 600, + "fill": [ + { + "type": "solid", + "color": "$c-ink" + } + ], + "lineHeight": 1.25, + "letterSpacing": 0, + "textGrowth": "fixed-width", + "width": "fill_container" + }, + { + "type": "text", + "id": "t17", + "name": "条目说明", + "content": "我们面对的现状是什么", + "fontFamily": "Inter", + "fontSize": 26, + "fontWeight": 400, + "fill": [ + { + "type": "solid", + "color": "$c-muted" + } + ], + "lineHeight": 1.5, + "letterSpacing": 0, + "textGrowth": "fixed-width", + "width": "fill_container" + } + ] + }, + { + "type": "frame", + "id": "f18", + "name": "目录项", + "width": "fill_container", + "height": "fill_container", + "layout": "vertical", + "gap": 14, + "fill": [ + { + "type": "solid", + "color": "$c-surface" + } + ], + "padding": [ + 36, + 32 + ], + "cornerRadius": 20, + "children": [ + { + "type": "text", + "id": "t19", + "name": "序号", + "content": "02", + "fontFamily": "Noto Sans SC", + "fontSize": 40, + "fontWeight": 700, + "fill": [ + { + "type": "solid", + "color": "$c-accent" + } + ], + "lineHeight": 1.1, + "letterSpacing": 0, + "textGrowth": "fixed-width", + "width": "fit_content" + }, + { + "type": "text", + "id": "t20", + "name": "条目标题", + "content": "解决方案", + "fontFamily": "Noto Sans SC", + "fontSize": 34, + "fontWeight": 600, + "fill": [ + { + "type": "solid", + "color": "$c-ink" + } + ], + "lineHeight": 1.25, + "letterSpacing": 0, + "textGrowth": "fixed-width", + "width": "fill_container" + }, + { + "type": "text", + "id": "t21", + "name": "条目说明", + "content": "做了哪三件关键的事", + "fontFamily": "Inter", + "fontSize": 26, + "fontWeight": 400, + "fill": [ + { + "type": "solid", + "color": "$c-muted" + } + ], + "lineHeight": 1.5, + "letterSpacing": 0, + "textGrowth": "fixed-width", + "width": "fill_container" + } + ] + }, + { + "type": "frame", + "id": "f22", + "name": "目录项", + "width": "fill_container", + "height": "fill_container", + "layout": "vertical", + "gap": 14, + "fill": [ + { + "type": "solid", + "color": "$c-surface" + } + ], + "padding": [ + 36, + 32 + ], + "cornerRadius": 20, + "children": [ + { + "type": "text", + "id": "t23", + "name": "序号", + "content": "03", + "fontFamily": "Noto Sans SC", + "fontSize": 40, + "fontWeight": 700, + "fill": [ + { + "type": "solid", + "color": "$c-accent" + } + ], + "lineHeight": 1.1, + "letterSpacing": 0, + "textGrowth": "fixed-width", + "width": "fit_content" + }, + { + "type": "text", + "id": "t24", + "name": "条目标题", + "content": "结果与数据", + "fontFamily": "Noto Sans SC", + "fontSize": 34, + "fontWeight": 600, + "fill": [ + { + "type": "solid", + "color": "$c-ink" + } + ], + "lineHeight": 1.25, + "letterSpacing": 0, + "textGrowth": "fixed-width", + "width": "fill_container" + }, + { + "type": "text", + "id": "t25", + "name": "条目说明", + "content": "带来了多少可衡量的变化", + "fontFamily": "Inter", + "fontSize": 26, + "fontWeight": 400, + "fill": [ + { + "type": "solid", + "color": "$c-muted" + } + ], + "lineHeight": 1.5, + "letterSpacing": 0, + "textGrowth": "fixed-width", + "width": "fill_container" + } + ] + }, + { + "type": "frame", + "id": "f26", + "name": "目录项", + "width": "fill_container", + "height": "fill_container", + "layout": "vertical", + "gap": 14, + "fill": [ + { + "type": "solid", + "color": "$c-surface" + } + ], + "padding": [ + 36, + 32 + ], + "cornerRadius": 20, + "children": [ + { + "type": "text", + "id": "t27", + "name": "序号", + "content": "04", + "fontFamily": "Noto Sans SC", + "fontSize": 40, + "fontWeight": 700, + "fill": [ + { + "type": "solid", + "color": "$c-accent" + } + ], + "lineHeight": 1.1, + "letterSpacing": 0, + "textGrowth": "fixed-width", + "width": "fit_content" + }, + { + "type": "text", + "id": "t28", + "name": "条目标题", + "content": "下一步", + "fontFamily": "Noto Sans SC", + "fontSize": 34, + "fontWeight": 600, + "fill": [ + { + "type": "solid", + "color": "$c-ink" + } + ], + "lineHeight": 1.25, + "letterSpacing": 0, + "textGrowth": "fixed-width", + "width": "fill_container" + }, + { + "type": "text", + "id": "t29", + "name": "条目说明", + "content": "接下来三个月的计划", + "fontFamily": "Inter", + "fontSize": 26, + "fontWeight": 400, + "fill": [ + { + "type": "solid", + "color": "$c-muted" + } + ], + "lineHeight": 1.5, + "letterSpacing": 0, + "textGrowth": "fixed-width", + "width": "fill_container" + } + ] + } + ] + } + ] + }, + { + "type": "frame", + "id": "f30", + "name": "03 要点", + "width": 1920, + "height": 1080, + "layout": "vertical", + "padding": [ + 120, + 120 + ], + "gap": 48, + "justifyContent": "start", + "fill": [ + { + "type": "solid", + "color": "$c-bg" + } + ], + "clipContent": true, + "children": [ + { + "type": "frame", + "id": "f31", + "name": "页头", + "width": "fill_container", + "height": "fit_content", + "layout": "vertical", + "gap": 16, + "fill": [], + "children": [ + { + "type": "text", + "id": "t32", + "name": "页标题", + "content": "我们做了三件事", + "fontFamily": "Noto Sans SC", + "fontSize": 64, + "fontWeight": 700, + "fill": [ + { + "type": "solid", + "color": "$c-ink" + } + ], + "lineHeight": 1.15, + "letterSpacing": 0, + "textGrowth": "fixed-width", + "width": "fill_container" + }, + { + "type": "text", + "id": "t33", + "name": "页副标题", + "content": "每一件都能单独讲清楚,也都能被验证。", + "fontFamily": "Inter", + "fontSize": 30, + "fontWeight": 400, + "fill": [ + { + "type": "solid", + "color": "$c-muted" + } + ], + "lineHeight": 1.4, + "letterSpacing": 0, + "textGrowth": "fixed-width", + "width": "fill_container" + } + ] + }, + { + "type": "frame", + "id": "f34", + "name": "要点网格", + "width": "fill_container", + "height": "fit_content", + "layout": "horizontal", + "gap": 36, + "alignItems": "start", + "fill": [], + "children": [ + { + "type": "frame", + "id": "f35", + "name": "要点", + "width": "fill_container", + "height": "fill_container", + "layout": "vertical", + "gap": 20, + "fill": [ + { + "type": "solid", + "color": "$c-bg" + } + ], + "padding": [ + 40, + 36 + ], + "cornerRadius": 20, + "stroke": { + "thickness": 2, + "fill": [ + { + "type": "solid", + "color": "$c-border" + } + ] + }, + "children": [ + { + "type": "text", + "id": "t36", + "name": "要点序号", + "content": "01", + "fontFamily": "Noto Sans SC", + "fontSize": 32, + "fontWeight": 700, + "fill": [ + { + "type": "solid", + "color": "$c-accent" + } + ], + "lineHeight": 1.1, + "letterSpacing": 0, + "textGrowth": "fixed-width", + "width": "fit_content" + }, + { + "type": "text", + "id": "t37", + "name": "要点标题", + "content": "更快", + "fontFamily": "Noto Sans SC", + "fontSize": 40, + "fontWeight": 600, + "fill": [ + { + "type": "solid", + "color": "$c-ink" + } + ], + "lineHeight": 1.2, + "letterSpacing": 0, + "textGrowth": "fixed-width", + "width": "fill_container" + }, + { + "type": "text", + "id": "t38", + "name": "要点说明", + "content": "把等待时间从 8 秒压到 1.2 秒,用户不再中途离开。", + "fontFamily": "Inter", + "fontSize": 28, + "fontWeight": 400, + "fill": [ + { + "type": "solid", + "color": "$c-muted" + } + ], + "lineHeight": 1.55, + "letterSpacing": 0, + "textGrowth": "fixed-width", + "width": "fill_container" + } + ] + }, + { + "type": "frame", + "id": "f39", + "name": "要点", + "width": "fill_container", + "height": "fill_container", + "layout": "vertical", + "gap": 20, + "fill": [ + { + "type": "solid", + "color": "$c-bg" + } + ], + "padding": [ + 40, + 36 + ], + "cornerRadius": 20, + "stroke": { + "thickness": 2, + "fill": [ + { + "type": "solid", + "color": "$c-border" + } + ] + }, + "children": [ + { + "type": "text", + "id": "t40", + "name": "要点序号", + "content": "02", + "fontFamily": "Noto Sans SC", + "fontSize": 32, + "fontWeight": 700, + "fill": [ + { + "type": "solid", + "color": "$c-accent" + } + ], + "lineHeight": 1.1, + "letterSpacing": 0, + "textGrowth": "fixed-width", + "width": "fit_content" + }, + { + "type": "text", + "id": "t41", + "name": "要点标题", + "content": "更稳", + "fontFamily": "Noto Sans SC", + "fontSize": 40, + "fontWeight": 600, + "fill": [ + { + "type": "solid", + "color": "$c-ink" + } + ], + "lineHeight": 1.2, + "letterSpacing": 0, + "textGrowth": "fixed-width", + "width": "fill_container" + }, + { + "type": "text", + "id": "t42", + "name": "要点说明", + "content": "关键路径的失败率下降到千分之一以内。", + "fontFamily": "Inter", + "fontSize": 28, + "fontWeight": 400, + "fill": [ + { + "type": "solid", + "color": "$c-muted" + } + ], + "lineHeight": 1.55, + "letterSpacing": 0, + "textGrowth": "fixed-width", + "width": "fill_container" + } + ] + }, + { + "type": "frame", + "id": "f43", + "name": "要点", + "width": "fill_container", + "height": "fill_container", + "layout": "vertical", + "gap": 20, + "fill": [ + { + "type": "solid", + "color": "$c-bg" + } + ], + "padding": [ + 40, + 36 + ], + "cornerRadius": 20, + "stroke": { + "thickness": 2, + "fill": [ + { + "type": "solid", + "color": "$c-border" + } + ] + }, + "children": [ + { + "type": "text", + "id": "t44", + "name": "要点序号", + "content": "03", + "fontFamily": "Noto Sans SC", + "fontSize": 32, + "fontWeight": 700, + "fill": [ + { + "type": "solid", + "color": "$c-accent" + } + ], + "lineHeight": 1.1, + "letterSpacing": 0, + "textGrowth": "fixed-width", + "width": "fit_content" + }, + { + "type": "text", + "id": "t45", + "name": "要点标题", + "content": "更省", + "fontFamily": "Noto Sans SC", + "fontSize": 40, + "fontWeight": 600, + "fill": [ + { + "type": "solid", + "color": "$c-ink" + } + ], + "lineHeight": 1.2, + "letterSpacing": 0, + "textGrowth": "fixed-width", + "width": "fill_container" + }, + { + "type": "text", + "id": "t46", + "name": "要点说明", + "content": "同样的任务量,只用原来一半的算力预算。", + "fontFamily": "Inter", + "fontSize": 28, + "fontWeight": 400, + "fill": [ + { + "type": "solid", + "color": "$c-muted" + } + ], + "lineHeight": 1.55, + "letterSpacing": 0, + "textGrowth": "fixed-width", + "width": "fill_container" + } + ] + } + ] + } + ] + }, + { + "type": "frame", + "id": "f47", + "name": "04 数据", + "width": 1920, + "height": 1080, + "layout": "vertical", + "padding": [ + 120, + 120 + ], + "gap": 48, + "justifyContent": "start", + "fill": [ + { + "type": "solid", + "color": "$c-bg" + } + ], + "clipContent": true, + "children": [ + { + "type": "text", + "id": "t48", + "name": "页标题", + "content": "结果是可衡量的", + "fontFamily": "Noto Sans SC", + "fontSize": 64, + "fontWeight": 700, + "fill": [ + { + "type": "solid", + "color": "$c-ink" + } + ], + "lineHeight": 1.15, + "letterSpacing": 0, + "textGrowth": "fixed-width", + "width": "fill_container" + }, + { + "type": "frame", + "id": "f49", + "name": "数据网格", + "width": "fill_container", + "height": "fill_container", + "layout": "horizontal", + "gap": 36, + "alignItems": "stretch", + "fill": [], + "children": [ + { + "type": "frame", + "id": "f50", + "name": "数据卡", + "width": "fill_container", + "height": "fill_container", + "layout": "vertical", + "gap": 18, + "fill": [ + { + "type": "solid", + "color": "$c-surface" + } + ], + "padding": [ + 56, + 44 + ], + "cornerRadius": 24, + "justifyContent": "center", + "children": [ + { + "type": "text", + "id": "t51", + "name": "数值", + "content": "1.2s", + "fontFamily": "Noto Sans SC", + "fontSize": 140, + "fontWeight": 700, + "fill": [ + { + "type": "solid", + "color": "$c-accent" + } + ], + "lineHeight": 1.05, + "letterSpacing": 0, + "textGrowth": "fixed-width", + "width": "fill_container" + }, + { + "type": "text", + "id": "t52", + "name": "指标名", + "content": "首屏加载", + "fontFamily": "Noto Sans SC", + "fontSize": 32, + "fontWeight": 600, + "fill": [ + { + "type": "solid", + "color": "$c-ink" + } + ], + "lineHeight": 1.25, + "letterSpacing": 0, + "textGrowth": "fixed-width", + "width": "fill_container" + }, + { + "type": "text", + "id": "t53", + "name": "变化", + "content": "较上季度 -85%", + "fontFamily": "Inter", + "fontSize": 26, + "fontWeight": 400, + "fill": [ + { + "type": "solid", + "color": "$c-muted" + } + ], + "lineHeight": 1.4, + "letterSpacing": 0, + "textGrowth": "fixed-width", + "width": "fill_container" + } + ] + }, + { + "type": "frame", + "id": "f54", + "name": "数据卡", + "width": "fill_container", + "height": "fill_container", + "layout": "vertical", + "gap": 18, + "fill": [ + { + "type": "solid", + "color": "$c-surface" + } + ], + "padding": [ + 56, + 44 + ], + "cornerRadius": 24, + "justifyContent": "center", + "children": [ + { + "type": "text", + "id": "t55", + "name": "数值", + "content": "99.9%", + "fontFamily": "Noto Sans SC", + "fontSize": 140, + "fontWeight": 700, + "fill": [ + { + "type": "solid", + "color": "$c-accent" + } + ], + "lineHeight": 1.05, + "letterSpacing": 0, + "textGrowth": "fixed-width", + "width": "fill_container" + }, + { + "type": "text", + "id": "t56", + "name": "指标名", + "content": "关键路径成功率", + "fontFamily": "Noto Sans SC", + "fontSize": 32, + "fontWeight": 600, + "fill": [ + { + "type": "solid", + "color": "$c-ink" + } + ], + "lineHeight": 1.25, + "letterSpacing": 0, + "textGrowth": "fixed-width", + "width": "fill_container" + }, + { + "type": "text", + "id": "t57", + "name": "变化", + "content": "连续 90 天达标", + "fontFamily": "Inter", + "fontSize": 26, + "fontWeight": 400, + "fill": [ + { + "type": "solid", + "color": "$c-muted" + } + ], + "lineHeight": 1.4, + "letterSpacing": 0, + "textGrowth": "fixed-width", + "width": "fill_container" + } + ] + }, + { + "type": "frame", + "id": "f58", + "name": "数据卡", + "width": "fill_container", + "height": "fill_container", + "layout": "vertical", + "gap": 18, + "fill": [ + { + "type": "solid", + "color": "$c-surface" + } + ], + "padding": [ + 56, + 44 + ], + "cornerRadius": 24, + "justifyContent": "center", + "children": [ + { + "type": "text", + "id": "t59", + "name": "数值", + "content": "2.1x", + "fontFamily": "Noto Sans SC", + "fontSize": 140, + "fontWeight": 700, + "fill": [ + { + "type": "solid", + "color": "$c-accent" + } + ], + "lineHeight": 1.05, + "letterSpacing": 0, + "textGrowth": "fixed-width", + "width": "fill_container" + }, + { + "type": "text", + "id": "t60", + "name": "指标名", + "content": "人均处理量", + "fontFamily": "Noto Sans SC", + "fontSize": 32, + "fontWeight": 600, + "fill": [ + { + "type": "solid", + "color": "$c-ink" + } + ], + "lineHeight": 1.25, + "letterSpacing": 0, + "textGrowth": "fixed-width", + "width": "fill_container" + }, + { + "type": "text", + "id": "t61", + "name": "变化", + "content": "同等人力下", + "fontFamily": "Inter", + "fontSize": 26, + "fontWeight": 400, + "fill": [ + { + "type": "solid", + "color": "$c-muted" + } + ], + "lineHeight": 1.4, + "letterSpacing": 0, + "textGrowth": "fixed-width", + "width": "fill_container" + } + ] + } + ] + } + ] + }, + { + "type": "frame", + "id": "f62", + "name": "05 图表", + "width": 1920, + "height": 1080, + "layout": "vertical", + "padding": [ + 120, + 120 + ], + "gap": 48, + "justifyContent": "start", + "fill": [ + { + "type": "solid", + "color": "$c-bg" + } + ], + "clipContent": true, + "children": [ + { + "type": "frame", + "id": "f63", + "name": "页头", + "width": "fill_container", + "height": "fit_content", + "layout": "vertical", + "gap": 16, + "fill": [], + "children": [ + { + "type": "text", + "id": "t64", + "name": "页标题", + "content": "趋势说明结论", + "fontFamily": "Noto Sans SC", + "fontSize": 64, + "fontWeight": 700, + "fill": [ + { + "type": "solid", + "color": "$c-ink" + } + ], + "lineHeight": 1.15, + "letterSpacing": 0, + "textGrowth": "fixed-width", + "width": "fill_container" + }, + { + "type": "text", + "id": "t65", + "name": "页副标题", + "content": "把图表要说明的那句话写在这里,别让听众自己找。", + "fontFamily": "Inter", + "fontSize": 30, + "fontWeight": 400, + "fill": [ + { + "type": "solid", + "color": "$c-muted" + } + ], + "lineHeight": 1.4, + "letterSpacing": 0, + "textGrowth": "fixed-width", + "width": "fill_container" + } + ] + }, + { + "type": "frame", + "id": "f66", + "name": "图表区", + "width": "fill_container", + "height": "fill_container", + "layout": "horizontal", + "gap": 48, + "alignItems": "stretch", + "fill": [], + "children": [ + { + "type": "frame", + "id": "f67", + "name": "图表占位", + "width": "fill_container", + "height": "fill_container", + "layout": "horizontal", + "gap": 28, + "alignItems": "end", + "padding": [ + 40, + 40 + ], + "cornerRadius": 24, + "fill": [ + { + "type": "solid", + "color": "$c-surface" + } + ], + "children": [ + { + "type": "rectangle", + "id": "r68", + "name": "柱 1", + "width": "fill_container", + "height": 180, + "cornerRadius": 12, + "fill": [ + { + "type": "solid", + "color": "$c-accent-soft" + } + ] + }, + { + "type": "rectangle", + "id": "r69", + "name": "柱 2", + "width": "fill_container", + "height": 250, + "cornerRadius": 12, + "fill": [ + { + "type": "solid", + "color": "$c-accent-soft" + } + ] + }, + { + "type": "rectangle", + "id": "r70", + "name": "柱 3", + "width": "fill_container", + "height": 220, + "cornerRadius": 12, + "fill": [ + { + "type": "solid", + "color": "$c-accent-soft" + } + ] + }, + { + "type": "rectangle", + "id": "r71", + "name": "柱 4", + "width": "fill_container", + "height": 330, + "cornerRadius": 12, + "fill": [ + { + "type": "solid", + "color": "$c-accent-soft" + } + ] + }, + { + "type": "rectangle", + "id": "r72", + "name": "柱 5", + "width": "fill_container", + "height": 420, + "cornerRadius": 12, + "fill": [ + { + "type": "solid", + "color": "$c-accent" + } + ] + } + ] + }, + { + "type": "frame", + "id": "f73", + "name": "图表说明", + "width": 520, + "height": "fit_content", + "layout": "vertical", + "gap": 24, + "fill": [], + "children": [ + { + "type": "frame", + "id": "f74", + "name": "说明项", + "width": "fill_container", + "height": "fit_content", + "layout": "vertical", + "gap": 8, + "fill": [], + "children": [ + { + "type": "text", + "id": "t75", + "name": "说明标题", + "content": "持续增长", + "fontFamily": "Noto Sans SC", + "fontSize": 30, + "fontWeight": 600, + "fill": [ + { + "type": "solid", + "color": "$c-ink" + } + ], + "lineHeight": 1.25, + "letterSpacing": 0, + "textGrowth": "fixed-width", + "width": "fill_container" + }, + { + "type": "text", + "id": "t76", + "name": "说明正文", + "content": "连续五个周期上升,没有出现回落。", + "fontFamily": "Inter", + "fontSize": 26, + "fontWeight": 400, + "fill": [ + { + "type": "solid", + "color": "$c-muted" + } + ], + "lineHeight": 1.55, + "letterSpacing": 0, + "textGrowth": "fixed-width", + "width": "fill_container" + } + ] + }, + { + "type": "frame", + "id": "f77", + "name": "说明项", + "width": "fill_container", + "height": "fit_content", + "layout": "vertical", + "gap": 8, + "fill": [], + "children": [ + { + "type": "text", + "id": "t78", + "name": "说明标题", + "content": "拐点在第四期", + "fontFamily": "Noto Sans SC", + "fontSize": 30, + "fontWeight": 600, + "fill": [ + { + "type": "solid", + "color": "$c-ink" + } + ], + "lineHeight": 1.25, + "letterSpacing": 0, + "textGrowth": "fixed-width", + "width": "fill_container" + }, + { + "type": "text", + "id": "t79", + "name": "说明正文", + "content": "投入的三项改动都在这一期生效。", + "fontFamily": "Inter", + "fontSize": 26, + "fontWeight": 400, + "fill": [ + { + "type": "solid", + "color": "$c-muted" + } + ], + "lineHeight": 1.55, + "letterSpacing": 0, + "textGrowth": "fixed-width", + "width": "fill_container" + } + ] + }, + { + "type": "frame", + "id": "f80", + "name": "说明项", + "width": "fill_container", + "height": "fit_content", + "layout": "vertical", + "gap": 8, + "fill": [], + "children": [ + { + "type": "text", + "id": "t81", + "name": "说明标题", + "content": "可以外推", + "fontFamily": "Noto Sans SC", + "fontSize": 30, + "fontWeight": 600, + "fill": [ + { + "type": "solid", + "color": "$c-ink" + } + ], + "lineHeight": 1.25, + "letterSpacing": 0, + "textGrowth": "fixed-width", + "width": "fill_container" + }, + { + "type": "text", + "id": "t82", + "name": "说明正文", + "content": "按当前斜率,下季度可达成目标线。", + "fontFamily": "Inter", + "fontSize": 26, + "fontWeight": 400, + "fill": [ + { + "type": "solid", + "color": "$c-muted" + } + ], + "lineHeight": 1.55, + "letterSpacing": 0, + "textGrowth": "fixed-width", + "width": "fill_container" + } + ] + } + ] + } + ] + } + ] + }, + { + "type": "frame", + "id": "f83", + "name": "06 结尾", + "width": 1920, + "height": 1080, + "layout": "vertical", + "padding": [ + 120, + 120 + ], + "gap": 40, + "justifyContent": "center", + "fill": [ + { + "type": "solid", + "color": "$c-ink" + } + ], + "clipContent": true, + "children": [ + { + "type": "frame", + "id": "f84", + "name": "结尾文案", + "width": "fill_container", + "height": "fit_content", + "layout": "vertical", + "gap": 32, + "fill": [], + "children": [ + { + "type": "rectangle", + "id": "r85", + "name": "强调条", + "width": 120, + "height": 8, + "cornerRadius": 999, + "fill": [ + { + "type": "solid", + "color": "$c-accent" + } + ] + }, + { + "type": "text", + "id": "t86", + "name": "结语", + "content": "谢谢,欢迎提问。", + "fontFamily": "Noto Sans SC", + "fontSize": 96, + "fontWeight": 700, + "fill": [ + { + "type": "solid", + "color": "#FFFFFF" + } + ], + "lineHeight": 1.15, + "letterSpacing": 0, + "textGrowth": "fixed-width", + "width": "fill_container" + }, + { + "type": "text", + "id": "t87", + "name": "联系方式", + "content": "name@example.com · 团队主页", + "fontFamily": "Inter", + "fontSize": 32, + "fontWeight": 400, + "fill": [ + { + "type": "solid", + "color": "#9FB0CC" + } + ], + "lineHeight": 1.4, + "letterSpacing": 0, + "textGrowth": "fixed-width", + "width": "fill_container" + } + ] + } + ] + } + ] +} diff --git a/crates/op-editor-core/src/scene_template_catalog.rs b/crates/op-editor-core/src/scene_template_catalog.rs index c9621d477..216a606b9 100644 --- a/crates/op-editor-core/src/scene_template_catalog.rs +++ b/crates/op-editor-core/src/scene_template_catalog.rs @@ -26,6 +26,7 @@ const SCREENSHOT_TUTORIAL_OP: &str = include_str!("../assets/scene_templates/screenshot-tutorial.op"); const KNOWLEDGE_CAROUSEL_OP: &str = include_str!("../assets/scene_templates/knowledge-carousel.op"); const BEFORE_AFTER_OP: &str = include_str!("../assets/scene_templates/before-after.op"); +const SLIDE_DECK_OP: &str = include_str!("../assets/scene_templates/slide-deck.op"); /// Return the embedded document JSON for a template id. /// @@ -38,6 +39,7 @@ pub fn scene_template_document(template_id: &str) -> Option<&'static str> { "screenshot-tutorial" => Some(SCREENSHOT_TUTORIAL_OP), "knowledge-carousel" => Some(KNOWLEDGE_CAROUSEL_OP), "before-after" => Some(BEFORE_AFTER_OP), + "slide-deck" => Some(SLIDE_DECK_OP), _ => None, } } diff --git a/crates/op-editor-ui/assets/scene_template_previews/slide-deck.jpg b/crates/op-editor-ui/assets/scene_template_previews/slide-deck.jpg new file mode 100644 index 0000000000000000000000000000000000000000..9168447b613bb099f17e650b4d60561ade17f889 GIT binary patch literal 14679 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 literal 0 HcmV?d00001 diff --git a/templates/step0/_generators/previews.sh b/templates/step0/_generators/previews.sh index bcfb92cd1..67385a023 100644 --- a/templates/step0/_generators/previews.sh +++ b/templates/step0/_generators/previews.sh @@ -1,5 +1,6 @@ #!/usr/bin/env bash -# 渲染三套模板的预览图:每帧一张(scale 2)+ 整页拼合总览(scale 1) +# 渲染场景模板的预览图:每帧一张(scale 2)+ 整页拼合总览(scale 1) +# 卡片缩略图由 scene_preview_cards.py 从这些渲染产物再烤一层。 set -euo pipefail R=/Users/fini/workspace/openpencil BIN=$R/target/release/openpencil-desktop @@ -7,7 +8,7 @@ OUT=$R/templates/step0/previews TMP=$(mktemp -d) mkdir -p "$OUT" -for t in screenshot-tutorial knowledge-carousel before-after; do +for t in screenshot-tutorial knowledge-carousel before-after slide-deck; do # The documents themselves are shipped assets (embedded by the scene # template catalogue); this directory keeps only the generators and the # full-resolution renders they produce. diff --git a/templates/step0/_generators/scene_preview_cards.py b/templates/step0/_generators/scene_preview_cards.py index 45f5132cd..f1620ddff 100644 --- a/templates/step0/_generators/scene_preview_cards.py +++ b/templates/step0/_generators/scene_preview_cards.py @@ -37,12 +37,20 @@ INSET = 12 # (card id, source preview). The overview render is preferred wherever a # template has several frames: what makes a multi-page template legible at # thumbnail size is seeing that it HAS pages, not reading one of them. +# (card id, source). A string names one render; a list is tiled into a grid +# whose column count is chosen to land near the card's own aspect — a 16:9 +# deck laid out 1x6 is a 10:1 strip that shrinks each slide to ~100px inside +# the card, which reads as noise rather than as slides. CARDS = [ ("screenshot-tutorial", "screenshot-tutorial-overview.png"), ("knowledge-carousel", "knowledge-carousel-overview.png"), ("before-after", "before-after.png"), + ("slide-deck", [f"slide-deck-{i:02d}.png" for i in range(1, 7)]), ] +# Gap between tiles, in source pixels — scaled down with everything else. +TILE_GAP = 48 + def background_colour(image: Image.Image) -> tuple[int, int, int]: """The document's own backdrop, sampled from the render's corners. @@ -64,8 +72,45 @@ def background_colour(image: Image.Image) -> tuple[int, int, int]: return (245, 245, 245) -def bake(source: pathlib.Path) -> Image.Image: - image = Image.open(source) +def grid_columns(tile_aspect: float, count: int) -> int: + """Column count whose tiled aspect sits closest to the card's. + + Chosen rather than fixed so a 16:9 deck tiles 3x2 while a 3:4 carousel + tiles wide — the goal is filling the card, not a particular shape. + """ + card_aspect = CARD_W / CARD_H + best, best_error = count, float("inf") + for columns in range(1, count + 1): + rows = -(-count // columns) + aspect = (columns * tile_aspect) / rows + error = abs(aspect - card_aspect) + if error < best_error: + best, best_error = columns, error + return best + + +def tile(sources: list[pathlib.Path]) -> Image.Image: + images = [Image.open(path).convert("RGB") for path in sources] + width = max(i.width for i in images) + height = max(i.height for i in images) + columns = grid_columns(width / height, len(images)) + rows = -(-len(images) // columns) + canvas = Image.new( + "RGB", + ( + columns * width + (columns - 1) * TILE_GAP, + rows * height + (rows - 1) * TILE_GAP, + ), + background_colour(images[0]), + ) + for index, image in enumerate(images): + column, row = index % columns, index // columns + canvas.paste(image, (column * (width + TILE_GAP), row * (height + TILE_GAP))) + return canvas + + +def bake(source: pathlib.Path | list[pathlib.Path]) -> Image.Image: + image = tile(source) if isinstance(source, list) else Image.open(source) canvas = Image.new("RGB", (CARD_W, CARD_H), background_colour(image)) fitted = image.convert("RGB") fitted.thumbnail((CARD_W - 2 * INSET, CARD_H - 2 * INSET), Image.LANCZOS) @@ -86,11 +131,15 @@ def main() -> int: failed = False for card_id, source_name in CARDS: - source = SRC / source_name - if not source.exists(): - print(f"missing source: {source}", file=sys.stderr) + names = source_name if isinstance(source_name, list) else [source_name] + sources = [SRC / name for name in names] + missing = [path for path in sources if not path.exists()] + if missing: + for path in missing: + print(f"missing source: {path}", file=sys.stderr) failed = True continue + source = sources if isinstance(source_name, list) else sources[0] target = DST / f"{card_id}.jpg" if args.check: status = "ok" if target.exists() else "MISSING" diff --git a/templates/step0/_generators/tpl_slides.py b/templates/step0/_generators/tpl_slides.py new file mode 100644 index 000000000..4fb50b33e --- /dev/null +++ b/templates/step0/_generators/tpl_slides.py @@ -0,0 +1,240 @@ +#!/usr/bin/env python3 +"""slide-deck.op — 16:9 演示文稿模板(封面 + 目录 + 要点 + 数据 + 图表 + 结尾) + +排版遵循 skills/domains/slides.md 的硬契约: + - 每帧 1920×1080,内容距边缘 ≥100px + - 正文 ≥24(取 28-32),标题 ≥40,关键数字 80-200 + - 行高:标题 1.1-1.2,正文放宽 + - 最多 2 个字体族,靠字重而非字号数量做层级 + - 2-3 个主色 + 中性色,强调色只用于强调 +""" + +import sys + +from oplib import (Ids, color_vars, frame, rect, solid, stroke, text, + write_doc) + +ids = Ids() + +VARS = color_vars({ + "c-bg": "#FFFFFF", + "c-surface": "#F4F6F9", + "c-ink": "#0B1220", + "c-muted": "#5A6B85", + "c-accent": "#2F5BEA", + "c-accent-soft": "#E4EAFD", + "c-border": "#DCE2EC", +}) + +# 幻灯片尺寸与安全区。EDGE 同时是每帧的 padding —— 契约要求 ≥100。 +W, H = 1920, 1080 +EDGE = 120 + + +def slide(name, *, fill="$c-bg", gap=48, justify="start"): + """一帧幻灯片。固定 1920×1080,绝不 fit_content:投影比例是硬约束。""" + node = frame(ids, name, width=W, height=H, layout="vertical", + padding=[EDGE, EDGE], gap=gap, justifyContent=justify, + fill=solid(fill), clipContent=True) + node["children"] = [] + return node + + +def row(name, *, gap=40, align="start", width="fill_container", + height="fit_content", fill=None, **props): + # `fill=None` means a transparent structural wrapper; an explicit fill is + # what makes a row a painted surface (card, panel). + node = frame(ids, name, width=width, height=height, layout="horizontal", + gap=gap, alignItems=align, fill=fill or [], **props) + node["children"] = [] + return node + + +def col(name, *, gap=16, width="fill_container", height="fit_content", + fill=None, **props): + node = frame(ids, name, width=width, height=height, layout="vertical", + gap=gap, fill=fill or [], **props) + node["children"] = [] + return node + + +def eyebrow(label): + """小标签。ALL CAPS 只在这种小标签上使用(契约允许的唯一例外)。""" + node = frame(ids, "标签", width="fit_content", height="fit_content", + layout="horizontal", padding=[8, 18], cornerRadius=999, + fill=solid("$c-accent-soft")) + node["children"] = [ + text(ids, "标签文字", label, 24, 600, "$c-accent", + width="fit_content", spacing=1.2), + ] + return node + + +def accent_bar(width=120, height=8): + return rect(ids, "强调条", width=width, height=height, cornerRadius=999, + fill=solid("$c-accent")) + + +def cover(): + s = slide("01 封面", justify="center", gap=40) + body = col("封面文案", gap=32) + body["children"] = [ + eyebrow("2026 · 季度汇报"), + text(ids, "主标题", "把复杂的事,讲成一句话", 104, 700, "$c-ink", + line_height=1.15), + text(ids, "副标题", "副标题写清楚这次要让听众记住的那个结论。", 34, 400, + "$c-muted", line_height=1.4), + accent_bar(), + ] + meta = row("落款", gap=32, align="center") + meta["children"] = [ + text(ids, "演讲者", "演讲者姓名 · 团队", 28, 500, "$c-ink", + width="fit_content"), + text(ids, "日期", "2026.08", 28, 400, "$c-muted", width="fit_content"), + ] + s["children"] = [body, meta] + return s + + +def agenda(): + entries = [ + ("01", "背景与问题", "我们面对的现状是什么"), + ("02", "解决方案", "做了哪三件关键的事"), + ("03", "结果与数据", "带来了多少可衡量的变化"), + ("04", "下一步", "接下来三个月的计划"), + ] + s = slide("02 目录") + s["children"].append(text(ids, "页标题", "目录", 64, 700, "$c-ink", + line_height=1.15)) + grid = row("目录网格", gap=32) + for no, title, desc in entries: + item = col("目录项", gap=14, padding=[36, 32], cornerRadius=20, + fill=solid("$c-surface"), height="fill_container") + item["children"] = [ + text(ids, "序号", no, 40, 700, "$c-accent", width="fit_content", + line_height=1.1), + text(ids, "条目标题", title, 34, 600, "$c-ink", line_height=1.25), + text(ids, "条目说明", desc, 26, 400, "$c-muted", line_height=1.5), + ] + grid["children"].append(item) + s["children"].append(grid) + return s + + +def points(): + entries = [ + ("更快", "把等待时间从 8 秒压到 1.2 秒,用户不再中途离开。"), + ("更稳", "关键路径的失败率下降到千分之一以内。"), + ("更省", "同样的任务量,只用原来一半的算力预算。"), + ] + s = slide("03 要点") + head = col("页头", gap=16) + head["children"] = [ + text(ids, "页标题", "我们做了三件事", 64, 700, "$c-ink", + line_height=1.15), + text(ids, "页副标题", "每一件都能单独讲清楚,也都能被验证。", 30, 400, + "$c-muted", line_height=1.4), + ] + grid = row("要点网格", gap=36) + for index, (title, desc) in enumerate(entries, 1): + item = col("要点", gap=20, padding=[40, 36], cornerRadius=20, + height="fill_container", fill=solid("$c-bg"), + stroke=stroke("$c-border", 2)) + item["children"] = [ + text(ids, "要点序号", f"0{index}", 32, 700, "$c-accent", + width="fit_content", line_height=1.1), + text(ids, "要点标题", title, 40, 600, "$c-ink", line_height=1.2), + text(ids, "要点说明", desc, 28, 400, "$c-muted", line_height=1.55), + ] + grid["children"].append(item) + s["children"] = [head, grid] + return s + + +def metrics(): + entries = [ + ("1.2s", "首屏加载", "较上季度 -85%"), + ("99.9%", "关键路径成功率", "连续 90 天达标"), + ("2.1x", "人均处理量", "同等人力下"), + ] + s = slide("04 数据") + s["children"].append(text(ids, "页标题", "结果是可衡量的", 64, 700, + "$c-ink", line_height=1.15)) + grid = row("数据网格", gap=36, height="fill_container", align="stretch") + for value, label, delta in entries: + item = col("数据卡", gap=18, padding=[56, 44], cornerRadius=24, + height="fill_container", justifyContent="center", + fill=solid("$c-surface")) + item["children"] = [ + # 关键数字:契约允许 80-200,这里取 140 让它成为唯一的视觉锚点。 + text(ids, "数值", value, 140, 700, "$c-accent", line_height=1.05), + text(ids, "指标名", label, 32, 600, "$c-ink", line_height=1.25), + text(ids, "变化", delta, 26, 400, "$c-muted", line_height=1.4), + ] + grid["children"].append(item) + s["children"].append(grid) + return s + + +def chart(): + s = slide("05 图表") + head = col("页头", gap=16) + head["children"] = [ + text(ids, "页标题", "趋势说明结论", 64, 700, "$c-ink", + line_height=1.15), + text(ids, "页副标题", "把图表要说明的那句话写在这里,别让听众自己找。", + 30, 400, "$c-muted", line_height=1.4), + ] + body = row("图表区", gap=48, height="fill_container", align="stretch") + + # 图表占位:一组等宽柱子。替换成真实数据时改高度即可,不必重建结构。 + plot = frame(ids, "图表占位", width="fill_container", + height="fill_container", layout="horizontal", gap=28, + alignItems="end", padding=[40, 40], cornerRadius=24, + fill=solid("$c-surface")) + plot["children"] = [ + rect(ids, f"柱 {i + 1}", width="fill_container", height=height, + cornerRadius=12, + fill=solid("$c-accent" if i == 4 else "$c-accent-soft")) + for i, height in enumerate([180, 250, 220, 330, 420]) + ] + + notes = col("图表说明", gap=24, width=520) + for title, desc in [ + ("持续增长", "连续五个周期上升,没有出现回落。"), + ("拐点在第四期", "投入的三项改动都在这一期生效。"), + ("可以外推", "按当前斜率,下季度可达成目标线。"), + ]: + item = col("说明项", gap=8) + item["children"] = [ + text(ids, "说明标题", title, 30, 600, "$c-ink", line_height=1.25), + text(ids, "说明正文", desc, 26, 400, "$c-muted", line_height=1.55), + ] + notes["children"].append(item) + + body["children"] = [plot, notes] + s["children"] = [head, body] + return s + + +def closing(): + s = slide("06 结尾", fill="$c-ink", justify="center", gap=40) + body = col("结尾文案", gap=32) + body["children"] = [ + accent_bar(), + text(ids, "结语", "谢谢,欢迎提问。", 96, 700, "#FFFFFF", + line_height=1.15), + text(ids, "联系方式", "name@example.com · 团队主页", 32, 400, + "#9FB0CC", line_height=1.4), + ] + s["children"] = [body] + return s + + +def build(): + return [cover(), agenda(), points(), metrics(), chart(), closing()] + + +if __name__ == "__main__": + dst = sys.argv[1] + write_doc(dst, VARS, build(), "演示文稿 · 16:9 模板") diff --git a/templates/step0/previews/slide-deck-01.png b/templates/step0/previews/slide-deck-01.png new file mode 100644 index 0000000000000000000000000000000000000000..84bdb7da86ce3e192d1bd876bd94a4b392fd9fda GIT binary patch literal 70303 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%0A?wI$OP~a+n(dTS%?5gjXcNeHjZ1 zD0mm2Wc`^zA{F}+d`f?`hB7ppCbZ9BQec)C{$Q+T_2l_^utE5WBw;(eGUW_X^ZN4D z`_4a`<5o{gI}*96*q!z&o*JrdU;&sfc|RyuvxsgErKTb-S2cu%S8 zb@S|6bo0-Bykw#a)rdxhe@$*!JBCtl|0HCg@jBq6(>=p2xj}at`AjK!^28x%d}b&rW7-_v=p_A*a>Y_Osx$f1X0wQ5KAH?B=4i=?R!4H|3E+F z_sb{C{oKoSU-xxCPy4Wdm&x+yVL-BP>cEogM@>&88EEbp6Lna7&H6tyA*k~%h$Q}bUpBuK`rJd*$)JRJZOg*`dzYlQ0-x&h*Q)ZErySpn1i<8y{)u@jWh z%bz$uj&?zZaf&GnO?Cm^_T4ri!SHOPfR+S_Fwc%YVheCMt=6w7-N&#@HCuQ7qn}0% zoUdxupVP`MF|T-+VHj2=8~sHHgz&FGdDEQjdO}Q7k%;rCNslcPO`|P3ysYdt!TF+ECDlirE@>9h$Pg zCf=YHRr17tqL>Y#dPNeih%3(n&~obBIh~$m9UwgSx;W#o+0@h|D)@#sI;AJ{n=Z%3 zLVD0!PT0(qmw5Q5$~1ecgXKT}nQ_X@%qN8taOG}f3o}dFQ|DK88$vV6Qk zIR#)hOr-~*JyvFJN~!RHF!ch}k%Ut_YYaIlotVG9PE5Bij+Vin@tJhw2gh;;z3xTz zE}g)V9O~3&jK?cu3d1z9V^|-J_XHYBjraZU@ptZc2Mi<EBbHAllNOH8z0Z4@7F!ps1!JFxc~B7WPxo60cKhDMW| zMPFb$%=OP?q{X0Q!o+s|^d)zngCjZVNhohhU(gVXk0;t@C4{xb^B$5&gvEQ>=S4*Ey~U z5Vc}4);J*m&zHgI2G$7H5z474DGF*8$t8{zp&%*n<`Z(YXxTKUiJ$+-a%StDl=|h% ziYpkJV7-9CrCC2kUw=$S_GSkD6p(AB1=t-X<4!8DR~=eUtaBuIkrWB2h{&gPFfDl- zFR+5Nc5X)T!vjk4yQoT_)B^z|W2VlKs&Xy5*s7;E-u!ZjW+sx+A)blZF`XE0vimRk zI`QLMhiAJz#8Ri%qQ>3d$uuo>^`Z~c*Sp5Y-3|zqL@sLu(F+8Rf>hV%@Pkc04sjmz z=Xo8Ph<8_eViC`KJX4mN%v0oA`j+*Z69Z{g*|5SpwtYPu`9^3GIUGC$* zySr_tO%8tnJ>RiL2>Y!;25v4so1_Ylg-g$FAW9jqlZd;HF2R97NrAy&_XMlgOglIbnyZ3M}T`9wD>am zz6O$TXXi#O_{gheH@&o}&Te=M zIz21B^jGoXSwbCUzw^6GBWr?dXR4!azV6Y%pi*qv?9wFm+F+BIb-enE8BP>{zz1)V z0%jQrsX)9RD-5ydYvJL0bbxx`5_<68nn%=H@-@F@eaX%(Tb1oON~w)o>v@;l&RS=DJ#TxRj#@K`CKW{_Brey!I|1!==nHp|g_`eJ4m)6QNV$)b!Ole0+(Hvocw z5Ll!YfGk6a+0S_#E>ugHZHOW*M}~xil+ALNLgCR1&BdQ_Eqsef4xscFlamg~1Xx%Ue{imMo5S782D_NFt(bYEv8%GqNt&Zb=Gwj`0Z}zlw zf@kVXqr=Nnaj?jyq%)^ZpVMi0v)Fs_H!~|M8~bC($UeORly6u3|F?aJe{&3hv^@J>(zKn+wb80%gFtsIZ~7ozm0%el?s)} z$S6PZ0fg?@T#RX=EWsHPsZ`KCE8g4NJEYOq*B_T)m?A>+QH$^?uMHY?It}hY77}?6 zrRtdSVEN87jf9c%piJq3gJ)<3*6J*`8RPtDgQnNrRM7dumGC6Me_-)w*6_Px0A_p8 z^qF{?tILzTcKo3$DoH8{_}2y51m~k*>}!6Lm7Ih`GZ3w7hEihAX4pl_Ckz$x94MWx z+Qw@wZMuw?!zTwFJJ+H#E)v+A-TO?Sgi}CJP~u*8A=~V?U0L!=B2Zibp<+Kf4v{DF zZHQ$(yDN1B|J*>!UK=U>N}MHs6d(c$k##scNx8(n7hL>q|899J3w0ihz#}6goi_$5 zcr(;g-s;?hT31%vXt)@Zm&WB#M!twG4U2jNp45%F542WLK!)lemxjiubK=qE*vvXV zP+UrDp(XZ|V(iAlqlRR_>apiC4(B(v%(Rx?^>6Lp|29P~>rM1>tVObzduut5vtUy^ zop4OF!StA1gew5ch(P}B)qiAee3C3N;rK@d(Wax8AL}H)W~J?vf`)E9B4&L^#-wt$ z`S8$ot!T&1fTtwpQ`Fd-U-(_2`svqzdMbmvdX&Wb1D!p%%i}==%jEYAdurtax0=u`U9*1Bt7jj%-?bJ6i$xTP3U>D* zd2Mw?V2x{f6(F5mWu=U6)b->`(e(5v6iJv`4A=S=C5pd-N^2PzRRG%3QvkA{xD@$) zKib`$dQ&w$Icalx?pz?B_oZ4A6Nz1loPQ8KSm>Z#*sHS(DtdBL2?pXyVnlZU#on;q zX4kt2nRY#+z$=Ey*3U_nkZby$qJ` zM#&JR6Q`Qx1D$l+O?du4zTIurMDDllpd0Y|_cpD^A;Ha}d-_}|t&h?nSLoqa|5m2F zYa?eE2+ci-0dW$IoG0$>z_@b(=hMZWdV9^C?Z`F1PrO@OO8Vt9%)O>0PNE6XMdD!g z4FB~nDm}!tn{yg$@37wG*}n4`$Xehky~%B*tfE^Cqr%sgqQZOSWpsj_cb67h!;*lC zacE)n8?Lkd1+WnoMqgyhoYG-#86X>yuu}7O7B&&IJeM;)Q41$LcY2%7oPgFb>;?a- zc$ikmirp+C7t~efM6iD_Se@T%d!=i_`7li?wG2>|Zx$)i+wHSTriC=Zjg#7l6cJ}>$zC&;H&c<~6`;W#O0Hu(c8cRW8@e|nPj7{&-8uiOM93P?>BpLl9}kG{ z(C>K7T^^&_0?O~fHDi@ImrLb7#{?2 zIJU5I^u)y+$x3^y3@X|yXQbbrPWkA#q0G9B3I4)`*n^qHw$jMq%-R!^6@W#6ZZb-3 z>JB+vzh3<0i0n%e_PwGRpyah=VcT2UG<-l^h^I>f?HTd)s7aD_d;AYlVSJ+fD4)Ho z8Y|2VFW=>phSi7OG5@y%N`AcocVSSRG^7n30GzCze^mEndI|JCdS}mGfJ8)1rc$wc zh9~-Nyu0$i3Tx0-_(hADKJe+?UO=UzIfzz61NP)Y?Z9$HEv<43+yIaa0{lwqbB~G1 zegFO{p#O}Q8h3Vf2J>9d)`FGS(HNbaLIZBq{-ex70EAyG{MqRYZUM;2Zu$)@wIvU} zL0ek3Ab%el89~0NM(Jp!6R1!vFGKV$-m#8F?Q9*8(%}Vpjsmycoi&IWrKgIvNjqE@q#JCk2p0wv zCw#Y;@^;he4Co+V6Fy2^{$dYu*&m?x!vXjlZUy;SlCAHzun-m6Nm%1>D4@oc&E70` zZAd;MV^~}_7kei#bK}dMRJD5YEAzr5{-Xu?;mfqL>grGfou$XNec3TO`L7EYf9V{= zULU4uUe)A0umO&UT-*e5#NEYFvwmc2=`J-CxbYF#b}iKf!vX8PFSZ0vqh!%FnRvLAO&MO}NCp!5flr8l**B`+|%bKc=d_%iAL z?3y*>Dzzv5f{^%_wDy+4d*ktFN_j)|F$lg~sz4hCSeOO}u;enK${&enE}iQoN&|!* zRFktITpEvTP79>}8;KRllkJP1Ef53ty7+{*S-B$}KQH_p!z3`P`ND3!Y4GlVlX~ zLhXxZ9xKB=XZhxbu`?fE`VzkUj#=EwYh;95=@ff**Kzq3d{=Im+Z>XzvzTPaWpR}= zCHY~H%LOfbx=6(<$DRz$Dax~?js;Dva@=iA4m@Vy;}(=MCR9#@BWkD$_N> zy@p`1#E4DunW=snii?(z%)T* zQOqK!lqrs2Hc;=s}tBZ8~2A zpj1iYKJ^#5*fl>glQf-l!Zm_uT#^<%YUx0FZ=8@GfnM)HPW47FCrn;TN^q_TkQnzF z!^vX2EwvM~!^g_+GUt|R1@!4HUs89(_A{T`JhoRCc;0E{J`08GbR^T?iJ!R0#MEyM z=_!XT|2_wcf1d8(Nf! z7_E8s%-nn4{oc}_zVvFFK%!UICOGHSwbykb4|L>je^%2o1+_3?ITE_C`RB$Y^Xb#$ zVLQY1Q`;%=bl9=J(Mt6A{8%tQg1wL~FF!ST28KyLLlhsark~HaR4#|>$(BS|X4{Ju zGpM8g+MvUm?s31?_xqGz_f#kbsk%vMx*!@NLl^4<8)m|&ZrVo{TVUOPsw<n&JcEA3J_)xE?5st)dn;eo0k745Zs>uO2*Hp|0a=~g zX;fs6%@|PF&t^fFY01gS^@8H(cz7H!w=~fGMQTsNqo||tXJk)s^R}41LLMUmLF>-- zjE!9%XEg^^xYa4wv6jetk31cbim2;^QvS9Nv(k`H>Z8>b_u~&O6A;~7 zcY>M?!kmqanjt9rW(aYc-hgUC#;Zm%9hWzmGxF@Qs!05;$@llntt*z-RZ$i1o`g;H zLR17u#86h>)M{&s?PLQyw$U%^o<#*q^Q6?*xKU~o>R0S*;rXL6Eo;2@eP?81?S7@H zI#-`P-Li7;1s#oiK@Ufg!w?pc8t$ktTV~DN)QpYr?gI2NHz#VgA!6~bx!a5~=Z>Pn zte+2rF@9l`-V{uSE*;J{h9nUg1@oWK{Na#^9OEutP9*7Lz{<0P?0d9|>Bh{Uiophi z#ktmIW*zDRJc>yr!pO{-5)+s-d^GTc1E%qU)$yn(*HF6CD(wq(8ll>%V**Q4gLeanpY!SV9(%?zbf-;F06f zjIz3AB}iLFRh61&sf96)ki1Co{P1jNnp_BrZ(_w(RmQPwdos1+uSK(txxmS}ogGzI zmNJ4jR<5kh52&@fP2)SuEQ>EU*#DtP=vs?mM7GL^?w*{e=%f8?EG~$w6du%i zjjhN2lQniGe2A%|tY4VBbB*Ano3b%6xq1et65qO8X`)%p>i*R7ntsN{NYl+jGWS9; zjoY-RimND6w-erM-5Y8+%c>GYf%#~9lA|YA`CO5#+s3eZBNOi#v%N5mtVtcR#bJRcOqm^=Zd?Uz)VrRr;;%ulNF5@n%d zCF{*y0aR~-FV%ZhmVrx0iOThEUtSz4f(ChOe2o#ieLqB~Sm$|TeFrPAbY~cxc_NK8 z@<0p>mDN2>@)lDg>#qDkSN~G4AaW%nQc+P6ADd3}6sksdgdBrmQf?S%oCemGm)8nv zws{==N*1L2h@h#1!4n2`V)CrnOt^D|@Y4^dsdW(X0gW5aZstb#d&I>DO=#hy`HTXE1;5DpFE3WEK>22 zC29CxUB!~Hqy}8Ncn_(()F6C95%hx+o}_WP%sT%QM=?!h{V=0VPQ{ZBjo9p;)mqn_ zF(6*$jJM1DISlyE97Y*Ea7i=YzK4@XDVSiHD`*Z0(Hhm%!Sx{PChx$NGUDJ@Z+xk= z>y2RCM0()H#U2o@Iff4V@!zj{TV{Tc$)|o$zh;H?Op+Gc%j3plr8G+i4UoVu^!Xol zf;nON!OM@+KcwcVmfrno9#<1^5>&c3^TdO_J2+o*Zlr~P|Kd0&F2td+d-Vx$V`iR9 zo(c9kWZeWSCESg-kUQ98ml3n0@SQ^Bp*i_3V(T#XfzCMn#iyvct;;QFDF5#=CA_ZJQZ(6+z>> zXKiGpA0u=#HosUAe?r6CI4+SdzD#Uhq!de{9lFvo#fT1N&NcOGRSCK7L|yf%YL8R_ zvm+TrK(s7Z{dr-veb|R(RigQydmZj;7SVERJhGjN2e-Fi!m}HYonKX4>o45i$4~uF zxBIp=;afxX$L|XX|BLI*{`vO%x9>LC^W6{je76C}1mFGOyA5^=!goLTZiDZBuxo+u re(>D}U)|t)PW&DVUmfB9sg2u^x`)#7zi9dleGMFAE2HwOw;uivs(!=! literal 0 HcmV?d00001 diff --git a/templates/step0/previews/slide-deck-02.png b/templates/step0/previews/slide-deck-02.png new file mode 100644 index 0000000000000000000000000000000000000000..27eda1761dad1288cd7a18ce8773ffca49ecd15c GIT binary patch literal 56966 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