feat(editor): register the six deck templates in the picker

Wires the new decks into the catalog, the preview grid and all fifteen
locales, so they are reachable rather than merely present on disk.

The preview cards ship as JPEGs like the rest, which grows the staged
scene-template payload; both figures in the asset notes are refreshed
so the wasm budget stays auditable against a real number.

Claude-Session: https://claude.ai/code/session_01FqKQqNj8exYwopGDpYUU7x
This commit is contained in:
Fini 2026-08-09 19:54:23 +08:00
parent 728a32e7f6
commit 267a08f7aa
29 changed files with 309 additions and 8 deletions

View file

@ -67,7 +67,7 @@ a local `parse_hex` / `escape_json` again.
- **Blocking on a future from sync host code goes through `op_host_services::chat_runtime::block_on_anywhere`.** A bare `Runtime::block_on` (or a privately-built current-thread runtime) aborts with "runtime within runtime" when the caller happens to sit on a tokio worker. `block_on_anywhere` picks the safe strategy for whichever context it is called from; it is the only sanctioned entry point and is exercised by tests for the no-runtime, multi-thread-worker, and borrowing-non-`Send`-future cases.
- **Fallible paths carry typed error enums, not `String`.** The whole workspace is converted (80+ enums; `Result<_, String>` survives at exactly two documented boundary sites). Find the domain's enum in its `*_error.rs` / `error.rs` sibling module (e.g. `CliError`, `ProgramError`, `WebCanvasError`, `McpServeError`, `ExportError`, `McpLiveError`, `DocIoError`, `ImageGenerateError`). The pattern to copy: one enum per failure domain in its own sibling module, structured fields instead of pre-formatted text, a `Display` impl that reproduces the previous message **byte-identically** (so user-visible strings and their tests don't move), and `From` impls that collapse the `map_err` adapters at the call sites. New fallible code should introduce or reuse an enum rather than add another `Result<_, String>`.
- **Web bundle ceiling: 6 MiB gzip + 0 env.\* imports.** Enforced by `tools/check-wasm-bundle.sh`. The CanvasKit bundle carries the full app logic (codegen AI pipeline, Figma parser, AI/live-sync, collaboration) plus the still-embedded AI skill corpus (~1.1 MiB of markdown via `include_dir!`), so the ceiling sits well above the retired skia raster path's 1 MiB (**4.93 MiB today**; the ceiling is a runaway-regression tripwire, not a budget). Re-baselined from 8 MiB once the ~2.4 MiB of preview JPEGs moved out — see below. The 0 env.\* guard still holds — CanvasKit needs no libc shim.
- **Product assets are embedded on native and fetched on wasm.** `op-editor-core/src/web_assets.rs` is the platform-free half: a process-global `route -> bytes` registry with single-flight, a widget-records / host-drains request queue, and `Absent/Pending/Ready/Failed` states. The widget layer calls `web_assets::request(route)` from paint and draws a placeholder; `op-host-web/src/web_asset_fetch.rs` drains it once per frame over XHR and installs the bytes. Native keeps its `include_bytes!` unchanged behind `#[cfg(not(target_arch = "wasm32"))]`, so desktop behaviour is byte-identical. Assets are served from `/pkg/assets/…` (**not** `/assets/`, which belongs to the hub frontend) and staged into the bundle by `tools/stage-web-assets.sh`, which `check-wasm-bundle.sh` runs as step 4 and both the CI workflow and `Dockerfile.web-rust` inherit. Moved: the Prompt Center (~2.0 MiB) and Scene Template (~388 KiB) preview JPEGs, the 58 scene-template `.op` documents (~4.9 MiB), and `iconify-catalog-core.json` (~452 KiB) — ~9.7 MiB of staged assets in total. Still embedded everywhere: the `op-ai-skills` corpus (~1.1 MiB, `include_dir!`).
- **Product assets are embedded on native and fetched on wasm.** `op-editor-core/src/web_assets.rs` is the platform-free half: a process-global `route -> bytes` registry with single-flight, a widget-records / host-drains request queue, and `Absent/Pending/Ready/Failed` states. The widget layer calls `web_assets::request(route)` from paint and draws a placeholder; `op-host-web/src/web_asset_fetch.rs` drains it once per frame over XHR and installs the bytes. Native keeps its `include_bytes!` unchanged behind `#[cfg(not(target_arch = "wasm32"))]`, so desktop behaviour is byte-identical. Assets are served from `/pkg/assets/…` (**not** `/assets/`, which belongs to the hub frontend) and staged into the bundle by `tools/stage-web-assets.sh`, which `check-wasm-bundle.sh` runs as step 4 and both the CI workflow and `Dockerfile.web-rust` inherit. Moved: the Prompt Center (~2.1 MiB) and Scene Template (~2.7 MiB) preview JPEGs, the 64 scene-template `.op` documents (~6.2 MiB), and `iconify-catalog-core.json` (~452 KiB) — ~11.3 MiB of staged assets in total. Still embedded everywhere: the `op-ai-skills` corpus (~1.1 MiB, `include_dir!`).
- **The icon-catalog split is opt-in, the rest is `cfg(target_arch = "wasm32")`.** `op-editor-ui`'s `runtime-icon-catalog` feature is enabled only by `op-host-web`, which has a daemon to fetch from and a frame pump to install on. `op-web-sdk` renders iconFont nodes but has no daemon, so it keeps the embed — for that viewer "not fetched yet" would mean "never". Bundle ceilings are per-bundle and measured: op-host-web 6 MiB (5.17 MiB measured), op-web-sdk 6 MiB (5.20 MiB measured).
## Document model (`shell-core/src/document/`)

View file

@ -735,3 +735,81 @@ tags = ["轮播", "年度", "总结", "复盘", "年终", "carousel", "yearrevie
frames = 8
frame_width = 1080
frame_height = 1440
[[template]]
id = "sounding-navy-deck"
scene = "slides"
title_key = "sceneTemplate.item.soundingNavyDeck.title"
title_fallback = "测深海图 · 咨询策略档"
summary_key = "sceneTemplate.item.soundingNavyDeck.summary"
summary_fallback = "海图暖白配钢蓝墨蓝,结论式标题加一条带来源的读数,深度剖面条与航迹目录贯穿七页,适合咨询交付与策略汇报。"
tags = ["策略", "咨询", "汇报", "结论", "数据", "PPT", "slides", "deck", "consulting", "strategy"]
frames = 7
frame_width = 1920
frame_height = 1080
style_guide = "sounding-navy"
[[template]]
id = "tidemark-slate-deck"
scene = "slides"
title_key = "sceneTemplate.item.tidemarkSlateDeck.title"
title_fallback = "潮痕石板 · 数据评审档"
summary_key = "sceneTemplate.item.tidemarkSlateDeck.summary"
summary_fallback = "石板灰底上的全景磁贴、趋势线、明细表、风险清单和泳道路线,七页走完一次数据评审,适合季度复盘与指标例会。"
tags = ["数据", "评审", "指标", "复盘", "看板", "PPT", "slides", "deck", "review", "metrics"]
frames = 7
frame_width = 1920
frame_height = 1080
style_guide = "tidemark-slate"
[[template]]
id = "banxin-rule-deck"
scene = "slides"
title_key = "sceneTemplate.item.banxinRuleDeck.title"
title_fallback = "版心界行 · 中文排版档"
summary_key = "sceneTemplate.item.banxinRuleDeck.summary"
summary_fallback = "以版心、界行、天头批注和鱼尾页码立身的中文原生排版,正文每行不超三十字,双栏对读与引文页耐读,适合讲稿与研讨。"
tags = ["中文", "排版", "版心", "讲稿", "研讨", "PPT", "slides", "deck", "typography", "chinese"]
frames = 7
frame_width = 1920
frame_height = 1080
style_guide = "banxin-rule"
[[template]]
id = "gridpaper-graphite-deck"
scene = "slides"
title_key = "sceneTemplate.item.gridpaperGraphiteDeck.title"
title_fallback = "方格石墨 · 学术答辩档"
summary_key = "sceneTemplate.item.gridpaperGraphiteDeck.summary"
summary_fallback = "方格纸底配石墨灰字,问题与缺口、方法、图表两页结果、局限、结论到引用,八页照答辩顺序排好,适合开题与论文答辩。"
tags = ["学术", "答辩", "论文", "研究", "开题", "PPT", "slides", "deck", "academic", "thesis"]
frames = 8
frame_width = 1920
frame_height = 1080
style_guide = "gridpaper-graphite"
[[template]]
id = "dossier-linen-deck"
scene = "slides"
title_key = "sceneTemplate.item.dossierLinenDeck.title"
title_fallback = "卷宗亚麻 · 文档备忘档"
summary_key = "sceneTemplate.item.dossierLinenDeck.summary"
summary_fallback = "亚麻纸卷宗质感,从文件首页、背景、现状数据到方案对比与决议,八页写成一份能独立读完的备忘录,适合决策评审。"
tags = ["备忘录", "决策", "评审", "文档", "方案", "PPT", "slides", "deck", "memo", "decision"]
frames = 8
frame_width = 1920
frame_height = 1080
style_guide = "dossier-linen"
[[template]]
id = "ledger-tick-deck"
scene = "slides"
title_key = "sceneTemplate.item.ledgerTickDeck.title"
title_fallback = "账簿勾格 · 竞品矩阵档"
summary_key = "sceneTemplate.item.ledgerTickDeck.summary"
summary_fallback = "账簿格线上的评估口径、主矩阵、分位刻度与差距优势对照,七页把竞品比较讲成一笔可核对的账,适合选型与市场分析。"
tags = ["竞品", "矩阵", "对比", "选型", "市场", "PPT", "slides", "deck", "matrix", "competitive"]
frames = 7
frame_width = 1920
frame_height = 1080
style_guide = "ledger-tick"

View file

@ -23,7 +23,7 @@ const SCENE_TEMPLATES_TOML: &str = include_str!("../assets/scene_templates.toml"
/// The shipped documents.
///
/// Embedded on desktop so opening a template needs no filesystem. NOT embedded
/// on `wasm32`: the ten documents are ~1.1 MB of JSON that every visitor would
/// on `wasm32`: the documents are ~6.2 MiB of JSON that every visitor would
/// download before the editor painted, to open a panel most sessions never
/// touch. There the document is fetched from the daemon when a template is
/// actually instantiated — see [`scene_template_document_route`] and
@ -127,6 +127,12 @@ pub fn scene_template_document_route(template_id: &str) -> Option<&'static str>
"toolkit-notebook-carousel" => route!("toolkit-notebook-carousel"),
"tutorial-journal-carousel" => route!("tutorial-journal-carousel"),
"yearreview-mineral-carousel" => route!("yearreview-mineral-carousel"),
"sounding-navy-deck" => route!("sounding-navy-deck"),
"tidemark-slate-deck" => route!("tidemark-slate-deck"),
"banxin-rule-deck" => route!("banxin-rule-deck"),
"gridpaper-graphite-deck" => route!("gridpaper-graphite-deck"),
"dossier-linen-deck" => route!("dossier-linen-deck"),
"ledger-tick-deck" => route!("ledger-tick-deck"),
_ => None,
}
}
@ -201,6 +207,12 @@ pub fn scene_template_document(template_id: &str) -> Option<&'static str> {
"toolkit-notebook-carousel" => template_document!("toolkit-notebook-carousel"),
"tutorial-journal-carousel" => template_document!("tutorial-journal-carousel"),
"yearreview-mineral-carousel" => template_document!("yearreview-mineral-carousel"),
"sounding-navy-deck" => template_document!("sounding-navy-deck"),
"tidemark-slate-deck" => template_document!("tidemark-slate-deck"),
"banxin-rule-deck" => template_document!("banxin-rule-deck"),
"gridpaper-graphite-deck" => template_document!("gridpaper-graphite-deck"),
"dossier-linen-deck" => template_document!("dossier-linen-deck"),
"ledger-tick-deck" => template_document!("ledger-tick-deck"),
_ => None,
}
}

Binary file not shown.

After

Width:  |  Height:  |  Size: 51 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 55 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 64 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 48 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 52 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 40 KiB

View file

@ -88,8 +88,8 @@ fn only_templates_the_pipeline_can_build_offer_generation() {
}
}
assert_eq!(
offered, 8,
"the six deck templates plus the two web pages carry a style guide"
offered, 14,
"the twelve deck templates plus the two web pages carry a style guide"
);
}

View file

@ -4,7 +4,7 @@
//! `templates/step0/_generators/scene_preview_cards.py`; see that script for
//! why a deck is tiled into a grid rather than fitted as a strip.
//!
//! ~388 KB of JPEG. Embedded on desktop, fetched from the daemon on `wasm32`
//! ~2.7 MiB of JPEG. Embedded on desktop, fetched from the daemon on `wasm32`
//! for the same reason the Prompt Center's are — see
//! `prompt_center_previews` for the full rationale and
//! `op_editor_core::web_assets` for the loader.
@ -129,6 +129,12 @@ pub(crate) fn scene_template_preview(template_id: &str) -> Option<TemplatePrevie
"toolkit-notebook-carousel" => preview!(56, "toolkit-notebook-carousel"),
"tutorial-journal-carousel" => preview!(57, "tutorial-journal-carousel"),
"yearreview-mineral-carousel" => preview!(58, "yearreview-mineral-carousel"),
"sounding-navy-deck" => preview!(59, "sounding-navy-deck"),
"tidemark-slate-deck" => preview!(60, "tidemark-slate-deck"),
"banxin-rule-deck" => preview!(61, "banxin-rule-deck"),
"gridpaper-graphite-deck" => preview!(62, "gridpaper-graphite-deck"),
"dossier-linen-deck" => preview!(63, "dossier-linen-deck"),
"ledger-tick-deck" => preview!(64, "ledger-tick-deck"),
_ => None,
}
}

View file

@ -251,7 +251,7 @@ fn placeholders(value: &str) -> BTreeSet<String> {
fn every_locale_has_exactly_the_english_key_set() {
let all_tables = tables();
let expected = table_keys(all_tables[0].0, all_tables[0].1, all_tables[0].2);
assert_eq!(expected.len(), 1643, "update the intentional catalog size");
assert_eq!(expected.len(), 1655, "update the intentional catalog size");
for (name, main, git, lookup) in all_tables {
let actual = table_keys(name, main, git);

View file

@ -112,6 +112,18 @@ pub fn lookup(key: &str) -> Option<&'static str> {
"collab.a11y.remoteCursor" => "Cursor von {{name}}",
"icon.catalogLoading" => "Symbolkatalog wird geladen…",
"sceneTemplate.documentUnavailable" => "Das Dokument dieser Vorlage konnte nicht geladen werden. Bitte erneut versuchen.",
"sceneTemplate.item.soundingNavyDeck.title" => "Seekarte · Strategie-Deck",
"sceneTemplate.item.soundingNavyDeck.summary" => "Kartenpapierweiß mit Stahl- und Tintenblau: Jede Seite beginnt mit der Aussage und belegt sie mit genau einem Messwert samt Quelle. Tiefenprofilbalken und ein Kurslinien-Inhaltsverzeichnis tragen sieben Seiten, für Beratungsergebnisse und Strategiereviews.",
"sceneTemplate.item.tidemarkSlateDeck.title" => "Tidenschiefer · Daten-Review-Deck",
"sceneTemplate.item.tidemarkSlateDeck.summary" => "Auf Schiefergrau: Überblickskacheln, Trendlinie, Detailtabelle, Risikoliste und eine Roadmap in Swimlanes. Sieben Seiten für einen vollständigen Datenreview, für Quartalsrückblicke und Kennzahlenrunden.",
"sceneTemplate.item.banxinRuleDeck.title" => "Satzspiegel und Linien · Deck für chinesischen Satz",
"sceneTemplate.item.banxinRuleDeck.summary" => "Auf der klassischen chinesischen Seite gebaut: Satzspiegel, Kolumnenlinien, Kopfnoten und Fischschwanz-Kolumnentitel. Textzeilen bleiben unter dreißig Zeichen, mit Gegenspalten und Zitatseite, für Vorlesungen und Seminare.",
"sceneTemplate.item.gridpaperGraphiteDeck.title" => "Karogrid Graphit · Deck für die Verteidigung",
"sceneTemplate.item.gridpaperGraphiteDeck.summary" => "Graphitschrift auf Karopapier: Problem und Lücke, Methode, zwei Ergebnisseiten, Grenzen, Fazit und Quellen. Acht Seiten in der Reihenfolge einer Verteidigung, für Exposés und Disputationen.",
"sceneTemplate.item.dossierLinenDeck.title" => "Leinen-Dossier · Memo-Deck",
"sceneTemplate.item.dossierLinenDeck.summary" => "Ein Dossier auf Leinenpapier, vom Deckblatt über Hintergrund, aktuelle Daten, Analyse und Optionsvergleich bis zum Beschluss. Acht Seiten, die sich als eigenständiges Memo lesen, für Entscheidungsvorlagen.",
"sceneTemplate.item.ledgerTickDeck.title" => "Kontobuchraster · Wettbewerbsmatrix-Deck",
"sceneTemplate.item.ledgerTickDeck.summary" => "Bewertungsmaßstab, Hauptmatrix, Quantilsskalen und die Gegenüberstellung von Lücke und Stärke auf Kontobuchlinien. Sieben Seiten, die einen Wettbewerbsvergleich wie eine prüfbare Rechnung erzählen, für Auswahlentscheidungen und Marktanalysen.",
_ => return None,
})
}

View file

@ -152,6 +152,18 @@ pub fn lookup(key: &str) -> Option<&'static str> {
"collab.a11y.remoteCursor" => "{{name}}'s cursor",
"icon.catalogLoading" => "Icon catalog is still loading…",
"sceneTemplate.documentUnavailable" => "That template's document could not be loaded. Try again.",
"sceneTemplate.item.soundingNavyDeck.title" => "Sounding Chart · Strategy Deck",
"sceneTemplate.item.soundingNavyDeck.summary" => "Chart-paper white against steel and ink blue: every slide leads with a conclusion and backs it with one sourced reading. Depth-profile bars and a sounding-track agenda carry all seven pages, for consulting deliverables and strategy reviews.",
"sceneTemplate.item.tidemarkSlateDeck.title" => "Tidemark Slate · Data Review Deck",
"sceneTemplate.item.tidemarkSlateDeck.summary" => "Overview tiles, a trend line, a detail table, a risk list and a swimlane roadmap on slate grey — seven pages that walk one full data review, for quarterly retrospectives and metric meetings.",
"sceneTemplate.item.banxinRuleDeck.title" => "Banxin Rule · Chinese Typography Deck",
"sceneTemplate.item.banxinRuleDeck.summary" => "Built on the classical Chinese page: type block, column rules, marginal notes and a fishtail folio. Body lines stay under thirty characters, with facing columns and a quotation page that reward reading, for lectures and seminars.",
"sceneTemplate.item.gridpaperGraphiteDeck.title" => "Graphite Grid · Academic Defence Deck",
"sceneTemplate.item.gridpaperGraphiteDeck.summary" => "Graphite type on grid paper: problem and gap, method, two pages of results, limitations, conclusion and references — eight pages in defence order, for proposals and thesis defences.",
"sceneTemplate.item.dossierLinenDeck.title" => "Linen Dossier · Memo Deck",
"sceneTemplate.item.dossierLinenDeck.summary" => "A linen-paper dossier from cover sheet through background, current data, analysis and option comparison to the resolution — eight pages that read as a standalone memo, for decision reviews.",
"sceneTemplate.item.ledgerTickDeck.title" => "Ledger Tick · Competitive Matrix Deck",
"sceneTemplate.item.ledgerTickDeck.summary" => "Scoring criteria, the main matrix, quantile scales and a gap-versus-strength read-out on ledger ruling — seven pages that tell a competitive comparison like a balanced account, for vendor selection and market analysis.",
_ => return None,
})
}

View file

@ -112,6 +112,18 @@ pub fn lookup(key: &str) -> Option<&'static str> {
"collab.a11y.remoteCursor" => "Cursor de {{name}}",
"icon.catalogLoading" => "Cargando el catálogo de iconos…",
"sceneTemplate.documentUnavailable" => "No se pudo cargar el documento de esa plantilla. Inténtalo de nuevo.",
"sceneTemplate.item.soundingNavyDeck.title" => "Carta de sondeo · deck de estrategia",
"sceneTemplate.item.soundingNavyDeck.summary" => "Blanco de carta náutica con azul acero y azul tinta: cada página abre con una conclusión y la sostiene con una sola lectura con fuente. Barras de perfil de profundidad e índice en derrota de sondeo a lo largo de siete páginas, para entregables de consultoría y revisiones de estrategia.",
"sceneTemplate.item.tidemarkSlateDeck.title" => "Pizarra de marea · deck de revisión de datos",
"sceneTemplate.item.tidemarkSlateDeck.summary" => "Sobre gris pizarra: mosaicos de panorama, línea de tendencia, tabla de detalle, lista de riesgos y hoja de ruta por carriles. Siete páginas que recorren una revisión de datos completa, para retrospectivas trimestrales y comités de métricas.",
"sceneTemplate.item.banxinRuleDeck.title" => "Caja y filetes · deck de tipografía china",
"sceneTemplate.item.banxinRuleDeck.summary" => "Construido sobre la página china clásica: caja de texto, filetes de columna, notas al margen superior y folio en cola de pez. Las líneas de texto no pasan de treinta caracteres, con columnas enfrentadas y página de cita, para clases y seminarios.",
"sceneTemplate.item.gridpaperGraphiteDeck.title" => "Grafito cuadriculado · deck de defensa académica",
"sceneTemplate.item.gridpaperGraphiteDeck.summary" => "Tipografía grafito sobre papel cuadriculado: problema y vacío, método, dos páginas de resultados, limitaciones, conclusión y referencias. Ocho páginas en el orden de una defensa, para anteproyectos y defensas de tesis.",
"sceneTemplate.item.dossierLinenDeck.title" => "Expediente de lino · deck de memorando",
"sceneTemplate.item.dossierLinenDeck.summary" => "Un expediente en papel de lino, de la portada al contexto, los datos actuales, el análisis, la comparación de opciones y la resolución. Ocho páginas que se leen como un memorando autónomo, para comités de decisión.",
"sceneTemplate.item.ledgerTickDeck.title" => "Libro mayor · deck de matriz competitiva",
"sceneTemplate.item.ledgerTickDeck.summary" => "Criterios de evaluación, matriz principal, escalas por cuantiles y lectura de brechas y fortalezas sobre el rayado de un libro mayor. Siete páginas que cuentan una comparación competitiva como una cuenta verificable, para selección de proveedores y análisis de mercado.",
_ => return None,
})
}

View file

@ -112,6 +112,18 @@ pub fn lookup(key: &str) -> Option<&'static str> {
"collab.a11y.remoteCursor" => "Curseur de {{name}}",
"icon.catalogLoading" => "Chargement du catalogue d'icônes…",
"sceneTemplate.documentUnavailable" => "Le document de ce modèle n'a pas pu être chargé. Réessayez.",
"sceneTemplate.item.soundingNavyDeck.title" => "Carte de sondage · deck stratégie",
"sceneTemplate.item.soundingNavyDeck.summary" => "Blanc de carte marine, bleu acier et bleu encre : chaque page ouvre sur une conclusion et lappuie sur une seule mesure sourcée. Barres de profil de profondeur et sommaire en route de sondage sur sept pages, pour les livrables de conseil et les revues de stratégie.",
"sceneTemplate.item.tidemarkSlateDeck.title" => "Ardoise de marée · deck revue de données",
"sceneTemplate.item.tidemarkSlateDeck.summary" => "Sur fond ardoise : tuiles de vue densemble, courbe de tendance, tableau détaillé, liste de risques et feuille de route en couloirs. Sept pages qui déroulent une revue de données complète, pour les bilans trimestriels et les comités dindicateurs.",
"sceneTemplate.item.banxinRuleDeck.title" => "Justification et filets · deck typographie chinoise",
"sceneTemplate.item.banxinRuleDeck.summary" => "Construit sur la page chinoise classique : miroir de page, filets de colonne, notes de tête et folio en queue de poisson. Les lignes de texte restent sous trente caractères, avec colonnes en vis-à-vis et page de citation, pour les cours et les séminaires.",
"sceneTemplate.item.gridpaperGraphiteDeck.title" => "Graphite quadrillé · deck de soutenance",
"sceneTemplate.item.gridpaperGraphiteDeck.summary" => "Caractères graphite sur papier quadrillé : problème et manque, méthode, deux pages de résultats, limites, conclusion et références. Huit pages dans lordre de la soutenance, pour les projets de thèse et les défenses.",
"sceneTemplate.item.dossierLinenDeck.title" => "Dossier lin · deck note interne",
"sceneTemplate.item.dossierLinenDeck.summary" => "Un dossier sur papier lin, de la page de garde au contexte, aux données actuelles, à lanalyse, à la comparaison des options et à la décision. Huit pages qui se lisent comme une note autonome, pour les comités de décision.",
"sceneTemplate.item.ledgerTickDeck.title" => "Registre à colonnes · deck matrice concurrentielle",
"sceneTemplate.item.ledgerTickDeck.summary" => "Critères dévaluation, matrice principale, échelles de quantiles et lecture des écarts et des forces sur une réglure de registre. Sept pages qui racontent une comparaison concurrentielle comme un compte vérifiable, pour le choix de fournisseurs et lanalyse de marché.",
_ => return None,
})
}

View file

@ -116,6 +116,18 @@ pub fn lookup(key: &str) -> Option<&'static str> {
"collab.a11y.remoteCursor" => "{{name}} का कर्सर",
"icon.catalogLoading" => "आइकन कैटलॉग लोड हो रहा है…",
"sceneTemplate.documentUnavailable" => "इस टेम्पलेट का दस्तावेज़ लोड नहीं हो सका। फिर से कोशिश करें।",
"sceneTemplate.item.soundingNavyDeck.title" => "गहराई मानचित्र · रणनीति प्रस्तुति",
"sceneTemplate.item.soundingNavyDeck.summary" => "समुद्री मानचित्र का गर्म सफ़ेद, इस्पाती और स्याही नीले के साथ: हर पृष्ठ निष्कर्ष से शुरू होता है और स्रोत सहित एक ही माप से उसे टिकाता है। गहराई की पट्टियाँ और मार्ग-रेखा वाली सूची सातों पृष्ठों में चलती हैं — परामर्श सामग्री और रणनीति समीक्षा के लिए।",
"sceneTemplate.item.tidemarkSlateDeck.title" => "ज्वार स्लेट · डेटा समीक्षा प्रस्तुति",
"sceneTemplate.item.tidemarkSlateDeck.summary" => "स्लेटी पृष्ठभूमि पर सारांश टाइलें, प्रवृत्ति रेखा, विस्तृत तालिका, जोखिम सूची और लेन-वार रोडमैप। सात पृष्ठ एक पूरी डेटा समीक्षा पूरी करते हैं — तिमाही समीक्षा और मापदंड बैठकों के लिए।",
"sceneTemplate.item.banxinRuleDeck.title" => "मुद्रण क्षेत्र और रेखाएँ · चीनी टाइपोग्राफी प्रस्तुति",
"sceneTemplate.item.banxinRuleDeck.summary" => "शास्त्रीय चीनी पृष्ठ पर बना: मुद्रण क्षेत्र, स्तंभ रेखाएँ, ऊपरी हाशिये की टिप्पणियाँ और मछली-पूँछ पृष्ठांक। मुख्य पाठ की पंक्तियाँ तीस अक्षरों से कम रहती हैं, आमने-सामने स्तंभ और उद्धरण पृष्ठ के साथ — व्याख्यान और संगोष्ठी के लिए।",
"sceneTemplate.item.gridpaperGraphiteDeck.title" => "ग्राफ़ कागज़ ग्रेफ़ाइट · शैक्षणिक प्रस्तुति",
"sceneTemplate.item.gridpaperGraphiteDeck.summary" => "ग्राफ़ कागज़ पर ग्रेफ़ाइट अक्षर: समस्या और अंतराल, विधि, परिणाम के दो पृष्ठ, सीमाएँ, निष्कर्ष और संदर्भ। आठ पृष्ठ मौखिक परीक्षा के क्रम में — शोध प्रस्ताव और थीसिस बचाव के लिए।",
"sceneTemplate.item.dossierLinenDeck.title" => "लिनन दस्तावेज़ · ज्ञापन प्रस्तुति",
"sceneTemplate.item.dossierLinenDeck.summary" => "लिनन कागज़ की फ़ाइल: आवरण पृष्ठ, पृष्ठभूमि, वर्तमान आँकड़े, विश्लेषण, विकल्पों की तुलना और निर्णय। आठ पृष्ठ अपने आप में पूरा ज्ञापन बनते हैं — निर्णय समीक्षा के लिए।",
"sceneTemplate.item.ledgerTickDeck.title" => "बहीखाता रेखा · प्रतिस्पर्धी मैट्रिक्स प्रस्तुति",
"sceneTemplate.item.ledgerTickDeck.summary" => "बहीखाते की रेखाओं पर मूल्यांकन मानक, मुख्य मैट्रिक्स, चतुर्थक पैमाने और अंतर बनाम ताकत का मिलान। सात पृष्ठ प्रतिस्पर्धी तुलना को जाँचे जा सकने वाले खाते की तरह कहते हैं — विक्रेता चयन और बाज़ार विश्लेषण के लिए।",
_ => return None,
})
}

View file

@ -112,6 +112,18 @@ pub fn lookup(key: &str) -> Option<&'static str> {
"collab.a11y.remoteCursor" => "Kursor {{name}}",
"icon.catalogLoading" => "Katalog ikon sedang dimuat…",
"sceneTemplate.documentUnavailable" => "Dokumen templat itu tidak dapat dimuat. Coba lagi.",
"sceneTemplate.item.soundingNavyDeck.title" => "Peta pengukuran kedalaman · deck strategi",
"sceneTemplate.item.soundingNavyDeck.summary" => "Putih hangat kertas peta laut berpadu biru baja dan biru tinta: setiap halaman dibuka dengan kesimpulan dan ditopang satu angka bersumber. Batang profil kedalaman dan daftar isi berbentuk jalur pengukuran mengikat tujuh halaman, untuk hasil kerja konsultan dan tinjauan strategi.",
"sceneTemplate.item.tidemarkSlateDeck.title" => "Batu tulis jejak pasang · deck tinjauan data",
"sceneTemplate.item.tidemarkSlateDeck.summary" => "Di atas abu batu tulis: ubin ringkasan, garis tren, tabel rincian, daftar risiko, dan peta jalan berjalur. Tujuh halaman menuntaskan satu putaran tinjauan data, untuk evaluasi kuartalan dan rapat metrik.",
"sceneTemplate.item.banxinRuleDeck.title" => "Bidang cetak dan garis · deck tipografi Tionghoa",
"sceneTemplate.item.banxinRuleDeck.summary" => "Dibangun di atas halaman Tionghoa klasik: bidang cetak, garis kolom, catatan tepi atas, dan nomor halaman ekor ikan. Baris isi tetap di bawah tiga puluh aksara, dengan dua kolom berhadapan dan halaman kutipan, untuk kuliah dan seminar.",
"sceneTemplate.item.gridpaperGraphiteDeck.title" => "Grafit kertas kotak · deck sidang akademik",
"sceneTemplate.item.gridpaperGraphiteDeck.summary" => "Huruf grafit di atas kertas kotak: masalah dan celah, metode, dua halaman hasil, keterbatasan, simpulan, dan daftar pustaka. Delapan halaman tersusun menurut urutan sidang, untuk proposal dan sidang tesis.",
"sceneTemplate.item.dossierLinenDeck.title" => "Berkas linen · deck memo",
"sceneTemplate.item.dossierLinenDeck.summary" => "Tekstur berkas kertas linen, dari halaman muka, latar, data terkini, analisis, perbandingan opsi, hingga keputusan. Delapan halaman yang terbaca utuh sebagai memo tersendiri, untuk rapat pengambilan keputusan.",
"sceneTemplate.item.ledgerTickDeck.title" => "Garis buku besar · deck matriks kompetitor",
"sceneTemplate.item.ledgerTickDeck.summary" => "Di atas garis buku besar ada kriteria penilaian, matriks utama, skala kuantil, dan pembacaan selisih berbanding keunggulan. Tujuh halaman menceritakan perbandingan kompetitor seperti pembukuan yang dapat dicocokkan, untuk seleksi vendor dan analisis pasar.",
_ => return None,
})
}

View file

@ -128,6 +128,18 @@ pub fn lookup(key: &str) -> Option<&'static str> {
"collab.a11y.remoteCursor" => "{{name}} のカーソル",
"icon.catalogLoading" => "アイコンカタログを読み込んでいます…",
"sceneTemplate.documentUnavailable" => "このテンプレートのドキュメントを読み込めませんでした。もう一度お試しください。",
"sceneTemplate.item.soundingNavyDeck.title" => "測深海図 · 戦略提案デッキ",
"sceneTemplate.item.soundingNavyDeck.summary" => "海図の温白にスチールブルーと墨藍。各ページは結論から始め、出典付きの数値ひとつで裏づける。水深プロファイルの棒と航跡目次が七ページを貫く、コンサル提出物や戦略報告向け。",
"sceneTemplate.item.tidemarkSlateDeck.title" => "潮痕スレート · データレビュー デッキ",
"sceneTemplate.item.tidemarkSlateDeck.summary" => "スレートグレーの地に全体タイル、トレンド線、明細表、リスク一覧、スイムレーンのロードマップ。七ページでデータレビューを一巡する、四半期の振り返りや指標定例向け。",
"sceneTemplate.item.banxinRuleDeck.title" => "版心と界線 · 中国語組版デッキ",
"sceneTemplate.item.banxinRuleDeck.summary" => "版心、界線、天の注記、魚尾のノンブルで組み立てた中国語本文のための組版。本文は一行三十字以内に収め、二段の対照や引用ページが読みやすい、講義や研究会向け。",
"sceneTemplate.item.gridpaperGraphiteDeck.title" => "方眼グラファイト · 学術発表デッキ",
"sceneTemplate.item.gridpaperGraphiteDeck.summary" => "方眼紙の地にグラファイトの文字。課題と空白、手法、図と表の結果二ページ、限界、結論、参考文献まで八ページを審査の順に配置、着手報告や学位審査向け。",
"sceneTemplate.item.dossierLinenDeck.title" => "リネン調ドシエ · 文書メモデッキ",
"sceneTemplate.item.dossierLinenDeck.summary" => "リネン紙の書類束の質感で、表紙、背景、現状データ、分析、案の比較から決議まで。単体で読み切れるメモとして仕上げた八ページ、意思決定レビュー向け。",
"sceneTemplate.item.ledgerTickDeck.title" => "台帳の目盛 · 競合マトリクス デッキ",
"sceneTemplate.item.ledgerTickDeck.summary" => "台帳の罫線の上に評価基準、主マトリクス、分位の目盛、差と強みの対照。七ページで競合比較を照合可能な帳簿として語る、製品選定や市場分析向け。",
_ => return None,
})
}

View file

@ -128,6 +128,18 @@ pub fn lookup(key: &str) -> Option<&'static str> {
"sceneTemplate.documentUnavailable" => {
"이 템플릿의 문서를 불러오지 못했습니다. 다시 시도하세요."
}
"sceneTemplate.item.soundingNavyDeck.title" => "수심도 · 전략 제안 덱",
"sceneTemplate.item.soundingNavyDeck.summary" => "해도의 따뜻한 백색에 강청색과 먹빛 남색. 각 장은 결론으로 시작하고 출처가 붙은 수치 하나로 뒷받침한다. 수심 단면 막대와 항적 목차가 일곱 장을 관통하는, 컨설팅 산출물과 전략 보고용.",
"sceneTemplate.item.tidemarkSlateDeck.title" => "조수 자국 슬레이트 · 데이터 리뷰 덱",
"sceneTemplate.item.tidemarkSlateDeck.summary" => "슬레이트 회색 바탕의 전경 타일, 추세선, 명세표, 위험 목록, 스윔레인 로드맵. 일곱 장으로 데이터 리뷰를 한 바퀴 도는, 분기 회고와 지표 정례 회의용.",
"sceneTemplate.item.banxinRuleDeck.title" => "판심과 계선 · 중국어 조판 덱",
"sceneTemplate.item.banxinRuleDeck.summary" => "판심, 계선, 두주 주석, 어미 쪽번호로 세운 중국어 본문 조판. 본문은 한 줄 서른 자를 넘기지 않고 두 단 대조와 인용 쪽이 읽기 좋은, 강의와 세미나용.",
"sceneTemplate.item.gridpaperGraphiteDeck.title" => "모눈 그래파이트 · 학술 발표 덱",
"sceneTemplate.item.gridpaperGraphiteDeck.summary" => "모눈종이 바탕에 흑연빛 글자. 문제와 공백, 방법, 그림과 표로 나눈 결과 두 장, 한계, 결론, 참고문헌까지 여덟 장을 심사 순서대로 배치한, 착수 발표와 논문 심사용.",
"sceneTemplate.item.dossierLinenDeck.title" => "리넨 도시에 · 문서 메모 덱",
"sceneTemplate.item.dossierLinenDeck.summary" => "리넨 종이 서류철의 질감으로 표지, 배경, 현황 데이터, 분석, 안 비교에서 결의까지. 그 자체로 읽히는 메모로 쓴 여덟 장, 의사결정 검토용.",
"sceneTemplate.item.ledgerTickDeck.title" => "장부 눈금 · 경쟁 매트릭스 덱",
"sceneTemplate.item.ledgerTickDeck.summary" => "장부 괘선 위의 평가 기준, 주 매트릭스, 분위 눈금, 격차와 강점 대조. 일곱 장으로 경쟁 비교를 대조 가능한 장부처럼 풀어내는, 제품 선정과 시장 분석용.",
_ => return None,
})
}

View file

@ -112,6 +112,18 @@ pub fn lookup(key: &str) -> Option<&'static str> {
"collab.a11y.remoteCursor" => "Cursor de {{name}}",
"icon.catalogLoading" => "Carregando o catálogo de ícones…",
"sceneTemplate.documentUnavailable" => "Não foi possível carregar o documento desse modelo. Tente novamente.",
"sceneTemplate.item.soundingNavyDeck.title" => "Carta de sondagem · deck de estratégia",
"sceneTemplate.item.soundingNavyDeck.summary" => "Branco de carta náutica com azul aço e azul tinta: cada página abre com a conclusão e a sustenta com uma única leitura com fonte. Barras de perfil de profundidade e um sumário em rota de sondagem ao longo de sete páginas, para entregas de consultoria e revisões de estratégia.",
"sceneTemplate.item.tidemarkSlateDeck.title" => "Ardósia de maré · deck de revisão de dados",
"sceneTemplate.item.tidemarkSlateDeck.summary" => "Sobre cinza ardósia: mosaicos de panorama, linha de tendência, tabela de detalhe, lista de riscos e um roteiro em raias. Sete páginas que percorrem uma revisão de dados completa, para retrospectivas trimestrais e reuniões de indicadores.",
"sceneTemplate.item.banxinRuleDeck.title" => "Mancha e filetes · deck de tipografia chinesa",
"sceneTemplate.item.banxinRuleDeck.summary" => "Construído sobre a página chinesa clássica: mancha de texto, filetes de coluna, notas de cabeça e fólio em cauda de peixe. As linhas de texto ficam abaixo de trinta caracteres, com colunas confrontantes e página de citação, para aulas e seminários.",
"sceneTemplate.item.gridpaperGraphiteDeck.title" => "Grafite quadriculado · deck de defesa acadêmica",
"sceneTemplate.item.gridpaperGraphiteDeck.summary" => "Tipos em grafite sobre papel quadriculado: problema e lacuna, método, duas páginas de resultados, limitações, conclusão e referências. Oito páginas na ordem de uma defesa, para projetos e defesas de tese.",
"sceneTemplate.item.dossierLinenDeck.title" => "Dossiê de linho · deck de memorando",
"sceneTemplate.item.dossierLinenDeck.summary" => "Um dossiê em papel de linho, da folha de rosto ao contexto, aos dados atuais, à análise, à comparação de opções e à decisão. Oito páginas que se leem como um memorando autônomo, para comitês de decisão.",
"sceneTemplate.item.ledgerTickDeck.title" => "Livro-razão · deck de matriz competitiva",
"sceneTemplate.item.ledgerTickDeck.summary" => "Critérios de avaliação, matriz principal, escalas por quantis e a leitura de lacunas e forças sobre o pautado de um livro-razão. Sete páginas que contam uma comparação competitiva como uma conta conferível, para seleção de fornecedores e análise de mercado.",
_ => return None,
})
}

View file

@ -142,6 +142,18 @@ pub fn lookup(key: &str) -> Option<&'static str> {
"collab.a11y.remoteCursor" => "Курсор пользователя {{name}}",
"icon.catalogLoading" => "Загрузка каталога значков…",
"sceneTemplate.documentUnavailable" => "Не удалось загрузить документ этого шаблона. Попробуйте снова.",
"sceneTemplate.item.soundingNavyDeck.title" => "Карта промеров · стратегическая презентация",
"sceneTemplate.item.soundingNavyDeck.summary" => "Тёплая белизна морской карты со стальным и чернильно-синим: каждая страница начинается с вывода и подкрепляется одним показателем с источником. Столбцы профиля глубин и оглавление-галс проходят через семь страниц — для консалтинговых материалов и стратегических разборов.",
"sceneTemplate.item.tidemarkSlateDeck.title" => "Приливный сланец · презентация обзора данных",
"sceneTemplate.item.tidemarkSlateDeck.summary" => "На сланцево-сером: обзорные плитки, линия тренда, детальная таблица, список рисков и дорожная карта по дорожкам. Семь страниц проходят полный обзор данных — для квартальных ретроспектив и встреч по метрикам.",
"sceneTemplate.item.banxinRuleDeck.title" => "Наборная полоса и линейки · презентация китайской типографики",
"sceneTemplate.item.banxinRuleDeck.summary" => "Построена на классической китайской полосе: наборное поле, линейки колонок, заметки на верхнем поле и колонцифра-рыбий хвост. Строки текста не длиннее тридцати иероглифов, с разворотом в две колонки и страницей цитаты — для лекций и семинаров.",
"sceneTemplate.item.gridpaperGraphiteDeck.title" => "Графит на клетчатой бумаге · презентация защиты",
"sceneTemplate.item.gridpaperGraphiteDeck.summary" => "Графитовый набор на клетчатой бумаге: проблема и пробел, метод, две страницы результатов, ограничения, вывод и список литературы. Восемь страниц в порядке защиты — для заявок и защиты диссертации.",
"sceneTemplate.item.dossierLinenDeck.title" => "Льняное досье · презентация служебной записки",
"sceneTemplate.item.dossierLinenDeck.summary" => "Досье на льняной бумаге: титульный лист, предыстория, текущие данные, анализ, сравнение вариантов и решение. Восемь страниц читаются как самостоятельная записка — для разбора решений.",
"sceneTemplate.item.ledgerTickDeck.title" => "Разлиновка гроссбуха · презентация конкурентной матрицы",
"sceneTemplate.item.ledgerTickDeck.summary" => "Критерии оценки, основная матрица, квантильные шкалы и сопоставление разрывов и сильных сторон на линовке гроссбуха. Семь страниц рассказывают сравнение конкурентов как сверяемый счёт — для выбора поставщика и анализа рынка.",
_ => return None,
})
}

View file

@ -114,6 +114,18 @@ pub fn lookup(key: &str) -> Option<&'static str> {
"collab.a11y.remoteCursor" => "เคอร์เซอร์ของ {{name}}",
"icon.catalogLoading" => "กำลังโหลดแคตตาล็อกไอคอน…",
"sceneTemplate.documentUnavailable" => "โหลดเอกสารของเทมเพลตนี้ไม่สำเร็จ ลองอีกครั้ง",
"sceneTemplate.item.soundingNavyDeck.title" => "แผนที่หยั่งความลึก · เด็คกลยุทธ์",
"sceneTemplate.item.soundingNavyDeck.summary" => "ขาวอุ่นแบบกระดาษแผนที่เดินเรือ ตัดกับน้ำเงินเหล็กและน้ำเงินหมึก แต่ละหน้าขึ้นต้นด้วยข้อสรุปและหนุนด้วยตัวเลขพร้อมแหล่งที่มาเพียงตัวเดียว แท่งโปรไฟล์ความลึกและสารบัญแนวร่องน้ำพาดผ่านทั้งเจ็ดหน้า เหมาะกับงานส่งมอบที่ปรึกษาและการทบทวนกลยุทธ์",
"sceneTemplate.item.tidemarkSlateDeck.title" => "หินชนวนรอยน้ำ · เด็คทบทวนข้อมูล",
"sceneTemplate.item.tidemarkSlateDeck.summary" => "บนพื้นเทาหินชนวน มีการ์ดภาพรวม เส้นแนวโน้ม ตารางรายละเอียด รายการความเสี่ยง และแผนที่เส้นทางแบบเลน เจ็ดหน้าเดินครบหนึ่งรอบการทบทวนข้อมูล เหมาะกับการสรุปรายไตรมาสและประชุมตัวชี้วัด",
"sceneTemplate.item.banxinRuleDeck.title" => "กรอบหน้าและเส้นคั่น · เด็คการจัดหน้าภาษาจีน",
"sceneTemplate.item.banxinRuleDeck.summary" => "สร้างบนหน้ากระดาษจีนแบบดั้งเดิม ทั้งกรอบหน้า เส้นคั่นคอลัมน์ หมายเหตุขอบบน และเลขหน้าแบบหางปลา บรรทัดเนื้อความไม่เกินสามสิบอักษร พร้อมสองคอลัมน์เทียบอ่านและหน้าอ้างคำ เหมาะกับการบรรยายและสัมมนา",
"sceneTemplate.item.gridpaperGraphiteDeck.title" => "กระดาษกราฟสีแกรไฟต์ · เด็คสอบป้องกันวิทยานิพนธ์",
"sceneTemplate.item.gridpaperGraphiteDeck.summary" => "ตัวอักษรสีแกรไฟต์บนกระดาษกราฟ ตั้งแต่ปัญหาและช่องว่าง วิธีการ ผลลัพธ์สองหน้าทั้งภาพและตาราง ข้อจำกัด ข้อสรุป จนถึงเอกสารอ้างอิง แปดหน้าเรียงตามลำดับการสอบ เหมาะกับการเสนอหัวข้อและสอบป้องกัน",
"sceneTemplate.item.dossierLinenDeck.title" => "แฟ้มผ้าลินิน · เด็คบันทึกข้อความ",
"sceneTemplate.item.dossierLinenDeck.summary" => "ผิวสัมผัสแบบแฟ้มกระดาษลินิน ตั้งแต่หน้าปกเอกสาร ที่มา ข้อมูลปัจจุบัน การวิเคราะห์ การเทียบทางเลือก จนถึงมติ แปดหน้าที่อ่านจบได้ในตัวเองเหมือนบันทึกข้อความ เหมาะกับการพิจารณาตัดสินใจ",
"sceneTemplate.item.ledgerTickDeck.title" => "เส้นบัญชี · เด็คเมทริกซ์คู่แข่ง",
"sceneTemplate.item.ledgerTickDeck.summary" => "บนเส้นบรรทัดสมุดบัญชี มีเกณฑ์ประเมิน เมทริกซ์หลัก สเกลแบ่งช่วง และการเทียบช่องว่างกับจุดแข็ง เจ็ดหน้าเล่าการเปรียบเทียบคู่แข่งให้เป็นบัญชีที่ตรวจทานได้ เหมาะกับการคัดเลือกและวิเคราะห์ตลาด",
_ => return None,
})
}

View file

@ -112,6 +112,18 @@ pub fn lookup(key: &str) -> Option<&'static str> {
"collab.a11y.remoteCursor" => "{{name}} imleci",
"icon.catalogLoading" => "Simge kataloğu yükleniyor…",
"sceneTemplate.documentUnavailable" => "Bu şablonun belgesi yüklenemedi. Tekrar deneyin.",
"sceneTemplate.item.soundingNavyDeck.title" => "İskandil haritası · strateji sunumu",
"sceneTemplate.item.soundingNavyDeck.summary" => "Harita kâğıdının sıcak beyazı, çelik ve mürekkep mavisiyle: her sayfa sonuçla açılır ve kaynaklı tek bir ölçümle desteklenir. Derinlik profili çubukları ve rota biçimli içindekiler yedi sayfa boyunca sürer, danışmanlık çıktıları ve strateji değerlendirmeleri için.",
"sceneTemplate.item.tidemarkSlateDeck.title" => "Gelgit arduvazı · veri değerlendirme sunumu",
"sceneTemplate.item.tidemarkSlateDeck.summary" => "Arduvaz grisi zeminde genel görünüm kartları, eğilim çizgisi, ayrıntı tablosu, risk listesi ve kulvarlı yol haritası. Yedi sayfa tam bir veri değerlendirmesini baştan sona yürütür, çeyrek dönem değerlendirmeleri ve metrik toplantıları için.",
"sceneTemplate.item.banxinRuleDeck.title" => "Dizgi alanı ve çizgiler · Çince tipografi sunumu",
"sceneTemplate.item.banxinRuleDeck.summary" => "Klasik Çin sayfası üzerine kurulu: dizgi alanı, sütun çizgileri, üst kenar notları ve balık kuyruğu sayfa numarası. Metin satırları otuz karakterin altında kalır, karşılıklı sütunlar ve alıntı sayfasıyla, ders ve seminerler için.",
"sceneTemplate.item.gridpaperGraphiteDeck.title" => "Kareli grafit · akademik savunma sunumu",
"sceneTemplate.item.gridpaperGraphiteDeck.summary" => "Kareli kâğıt üzerinde grafit yazı: sorun ve boşluk, yöntem, iki sayfa sonuç, sınırlılıklar, sonuç ve kaynakça. Sekiz sayfa savunma sırasına göre dizilmiş, öneri ve tez savunmaları için.",
"sceneTemplate.item.dossierLinenDeck.title" => "Keten dosya · muhtıra sunumu",
"sceneTemplate.item.dossierLinenDeck.summary" => "Keten kâğıt dosya dokusuyla kapak sayfasından arka plana, güncel verilere, çözümlemeye, seçenek karşılaştırmasına ve karara. Tek başına okunabilen bir muhtıra olarak yazılmış sekiz sayfa, karar değerlendirmeleri için.",
"sceneTemplate.item.ledgerTickDeck.title" => "Defter çizgisi · rekabet matrisi sunumu",
"sceneTemplate.item.ledgerTickDeck.summary" => "Defter çizgileri üzerinde değerlendirme ölçütleri, ana matris, dilim ölçekleri ve fark ile güçlü yön karşılaştırması. Yedi sayfa rekabet karşılaştırmasını denetlenebilir bir hesap gibi anlatır, tedarikçi seçimi ve pazar analizi için.",
_ => return None,
})
}

View file

@ -124,6 +124,18 @@ pub fn lookup(key: &str) -> Option<&'static str> {
"collab.a11y.remoteCursor" => "Con trỏ của {{name}}",
"icon.catalogLoading" => "Đang tải danh mục biểu tượng…",
"sceneTemplate.documentUnavailable" => "Không tải được tài liệu của mẫu này. Hãy thử lại.",
"sceneTemplate.item.soundingNavyDeck.title" => "Hải đồ đo sâu · deck chiến lược",
"sceneTemplate.item.soundingNavyDeck.summary" => "Trắng ấm của giấy hải đồ đi cùng xanh thép và xanh mực: mỗi trang mở bằng kết luận và chống đỡ bằng đúng một số đo có nguồn. Thanh mặt cắt độ sâu và mục lục dạng vệt đo chạy suốt bảy trang, hợp cho sản phẩm tư vấn và họp chiến lược.",
"sceneTemplate.item.tidemarkSlateDeck.title" => "Đá phiến vệt triều · deck rà soát dữ liệu",
"sceneTemplate.item.tidemarkSlateDeck.summary" => "Trên nền xám đá phiến: ô toàn cảnh, đường xu hướng, bảng chi tiết, danh sách rủi ro và lộ trình theo làn. Bảy trang đi hết một vòng rà soát dữ liệu, hợp cho tổng kết quý và họp chỉ số.",
"sceneTemplate.item.banxinRuleDeck.title" => "Khuôn chữ và đường kẻ · deck dàn trang tiếng Trung",
"sceneTemplate.item.banxinRuleDeck.summary" => "Dựng trên trang sách Trung Hoa cổ điển: khuôn chữ, đường kẻ cột, chú ở lề trên và số trang đuôi cá. Dòng chính văn giữ dưới ba mươi chữ, kèm hai cột đối chiếu và trang trích dẫn, hợp cho bài giảng và hội thảo.",
"sceneTemplate.item.gridpaperGraphiteDeck.title" => "Giấy ô ly than chì · deck bảo vệ luận văn",
"sceneTemplate.item.gridpaperGraphiteDeck.summary" => "Chữ màu than chì trên giấy ô ly: vấn đề và khoảng trống, phương pháp, hai trang kết quả, hạn chế, kết luận và tài liệu tham khảo. Tám trang xếp đúng thứ tự buổi bảo vệ, hợp cho đề cương và bảo vệ luận văn.",
"sceneTemplate.item.dossierLinenDeck.title" => "Hồ sơ vải lanh · deck bản ghi nhớ",
"sceneTemplate.item.dossierLinenDeck.summary" => "Chất giấy lanh của một tập hồ sơ, từ trang bìa, bối cảnh, số liệu hiện trạng, phân tích, so sánh phương án đến nghị quyết. Tám trang đọc trọn như một bản ghi nhớ độc lập, hợp cho họp ra quyết định.",
"sceneTemplate.item.ledgerTickDeck.title" => "Kẻ ô sổ cái · deck ma trận đối thủ",
"sceneTemplate.item.ledgerTickDeck.summary" => "Trên đường kẻ sổ cái là tiêu chí đánh giá, ma trận chính, thang phân vị và đối chiếu khoảng cách với thế mạnh. Bảy trang kể việc so sánh đối thủ như một khoản sổ có thể đối chiếu, hợp cho chọn nhà cung cấp và phân tích thị trường.",
_ => return None,
})
}

View file

@ -112,6 +112,18 @@ pub fn lookup(key: &str) -> Option<&'static str> {
"collab.a11y.remoteCursor" => "{{name}} 的光标",
"icon.catalogLoading" => "图标库正在加载…",
"sceneTemplate.documentUnavailable" => "该模板的文档加载失败,请重试。",
"sceneTemplate.item.soundingNavyDeck.title" => "测深海图 · 咨询策略档",
"sceneTemplate.item.soundingNavyDeck.summary" => "海图暖白配钢蓝墨蓝,结论式标题加一条带来源的读数,深度剖面条与航迹目录贯穿七页,适合咨询交付与策略汇报。",
"sceneTemplate.item.tidemarkSlateDeck.title" => "潮痕石板 · 数据评审档",
"sceneTemplate.item.tidemarkSlateDeck.summary" => "石板灰底上的全景磁贴、趋势线、明细表、风险清单和泳道路线,七页走完一次数据评审,适合季度复盘与指标例会。",
"sceneTemplate.item.banxinRuleDeck.title" => "版心界行 · 中文排版档",
"sceneTemplate.item.banxinRuleDeck.summary" => "以版心、界行、天头批注和鱼尾页码立身的中文原生排版,正文每行不超三十字,双栏对读与引文页耐读,适合讲稿与研讨。",
"sceneTemplate.item.gridpaperGraphiteDeck.title" => "方格石墨 · 学术答辩档",
"sceneTemplate.item.gridpaperGraphiteDeck.summary" => "方格纸底配石墨灰字,问题与缺口、方法、图表两页结果、局限、结论到引用,八页照答辩顺序排好,适合开题与论文答辩。",
"sceneTemplate.item.dossierLinenDeck.title" => "卷宗亚麻 · 文档备忘档",
"sceneTemplate.item.dossierLinenDeck.summary" => "亚麻纸卷宗质感,从文件首页、背景、现状数据到方案对比与决议,八页写成一份能独立读完的备忘录,适合决策评审。",
"sceneTemplate.item.ledgerTickDeck.title" => "账簿勾格 · 竞品矩阵档",
"sceneTemplate.item.ledgerTickDeck.summary" => "账簿格线上的评估口径、主矩阵、分位刻度与差距优势对照,七页把竞品比较讲成一笔可核对的账,适合选型与市场分析。",
_ => return None,
})
}

View file

@ -112,6 +112,18 @@ pub fn lookup(key: &str) -> Option<&'static str> {
"collab.a11y.remoteCursor" => "{{name}} 的游標",
"icon.catalogLoading" => "圖示庫正在載入…",
"sceneTemplate.documentUnavailable" => "該範本的文件載入失敗,請重試。",
"sceneTemplate.item.soundingNavyDeck.title" => "測深海圖 · 顧問策略檔",
"sceneTemplate.item.soundingNavyDeck.summary" => "海圖暖白配鋼藍墨藍,結論式標題加一條帶來源的讀數,深度剖面條與航跡目錄貫穿七頁,適合顧問交付與策略簡報。",
"sceneTemplate.item.tidemarkSlateDeck.title" => "潮痕石板 · 資料審視檔",
"sceneTemplate.item.tidemarkSlateDeck.summary" => "石板灰底上的全景磁磚、趨勢線、明細表、風險清單與泳道路線,七頁走完一次資料審視,適合季度覆盤與指標例會。",
"sceneTemplate.item.banxinRuleDeck.title" => "版心界行 · 中文排版檔",
"sceneTemplate.item.banxinRuleDeck.summary" => "以版心、界行、天頭批註與魚尾頁碼立身的中文原生排版,內文每行不超過三十字,雙欄對讀與引文頁耐讀,適合講稿與研討。",
"sceneTemplate.item.gridpaperGraphiteDeck.title" => "方格石墨 · 學術口試檔",
"sceneTemplate.item.gridpaperGraphiteDeck.summary" => "方格紙底配石墨灰字,問題與缺口、方法、圖表兩頁結果、限制、結論到引用,八頁照口試順序排好,適合開題與論文口試。",
"sceneTemplate.item.dossierLinenDeck.title" => "卷宗亞麻 · 文件備忘檔",
"sceneTemplate.item.dossierLinenDeck.summary" => "亞麻紙卷宗質感,從文件首頁、背景、現況資料到方案比較與決議,八頁寫成一份能獨立讀完的備忘錄,適合決策審查。",
"sceneTemplate.item.ledgerTickDeck.title" => "帳簿勾格 · 競品矩陣檔",
"sceneTemplate.item.ledgerTickDeck.summary" => "帳簿格線上的評估口徑、主矩陣、分位刻度與差距優勢對照,七頁把競品比較講成一筆可核對的帳,適合選型與市場分析。",
_ => return None,
})
}

View file

@ -49,6 +49,12 @@ for t in screenshot-tutorial knowledge-carousel before-after slide-deck \
toolkit-notebook-carousel \
tutorial-journal-carousel \
yearreview-mineral-carousel \
sounding-navy-deck \
tidemark-slate-deck \
banxin-rule-deck \
gridpaper-graphite-deck \
dossier-linen-deck \
ledger-tick-deck \
event-poster-deck; do
# The documents themselves are shipped assets (embedded by the scene
# template catalogue); this directory keeps only the generators and the

View file

@ -62,9 +62,16 @@ INSET = 20
# whole thing: a 1:4.5 marketing page contained inside a 16:10 card is a
# 140px-wide sliver, where its masthead and hero at full width are exactly
# what makes it recognisable.
#
# 多板模板一律走帧列表,**不要**拿 `<id>-overview.png` 当源overview 是整画布
# 导出,板与板之间的间隙和最后一行缺的格子都是画布底色,缩进卡片里就是几道黑
# 条。帧列表这条路由 `tile()` 自己按文档底色铺画布(`background_colour` 从首帧
# 四角取),缺的格子跟着一起变成文档底色,所以永远不会露黑。
CARDS = [
("screenshot-tutorial", "screenshot-tutorial-overview.png"),
("knowledge-carousel", "knowledge-carousel-overview.png"),
("screenshot-tutorial",
[f"screenshot-tutorial-{index:02d}.png" for index in range(1, 6)]),
("knowledge-carousel",
[f"knowledge-carousel-{index:02d}.png" for index in range(1, 6)]),
("before-after", "before-after.png"),
("slide-deck", [f"slide-deck-{i:02d}.png" for i in range(1, 7)]),
("knowledge-card-vertical", "knowledge-card-vertical.png"),
@ -139,6 +146,18 @@ CARDS = [
[f"yearreview-mineral-carousel-{index:02d}.png" for index in range(1, 9)]),
("event-poster-deck",
[f"event-poster-deck-{i:02d}.png" for i in range(1, 7)]),
("sounding-navy-deck",
[f"sounding-navy-deck-{i:02d}.png" for i in range(1, 8)]),
("tidemark-slate-deck",
[f"tidemark-slate-deck-{i:02d}.png" for i in range(1, 8)]),
("banxin-rule-deck",
[f"banxin-rule-deck-{i:02d}.png" for i in range(1, 8)]),
("gridpaper-graphite-deck",
[f"gridpaper-graphite-deck-{i:02d}.png" for i in range(1, 9)]),
("dossier-linen-deck",
[f"dossier-linen-deck-{i:02d}.png" for i in range(1, 9)]),
("ledger-tick-deck",
[f"ledger-tick-deck-{i:02d}.png" for i in range(1, 8)]),
]
# Gap between tiles, in source pixels — scaled down with everything else.