From 455ff075276bdab5926450692be0afc77834024d Mon Sep 17 00:00:00 2001 From: "songtianyi.theo" Date: Sun, 28 Jun 2026 13:48:18 +0800 Subject: [PATCH] =?UTF-8?q?feat(svglide):=20=E5=AE=8C=E6=88=90=20beautiful?= =?UTF-8?q?=20=E6=A8=A1=E6=9D=BF=E5=85=A8=E9=87=8F=20page-family=20?= =?UTF-8?q?=E6=9B=B4=E6=96=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 补齐 34 套 beautiful family 的 renderer、golden、smoke、gallery 证据。 刷新 351 页 current deck render 和 production review gallery。 强化 contract_compile 的 raw Satori lowering,覆盖 line、path、matrix 等协议风险。 修复模板侧可见元信息泄漏、XML-like primitive、canvas bounds 等问题。 保持仅 blue-professional 为 production/default_selectable,其余继续 needs_review。 --- .../beautiful-template-executable-matrix.json | 47781 ++++++++-------- .../page-family-smoke-decks/8-bit-orbit.json | 80 + .../biennale-yellow.json | 77 + .../page-family-smoke-decks/block-frame.json | 80 + .../page-family-smoke-decks/broadside.json | 92 + .../page-family-smoke-decks/capsule.json | 62 + .../page-family-smoke-decks/cartesian.json | 62 + .../page-family-smoke-decks/cobalt-grid.json | 57 + .../page-family-smoke-decks/coral.json | 62 + .../creative-mode.json | 74 + .../page-family-smoke-decks/daisy-days.json | 62 + .../editorial-forest.json | 57 + .../editorial-tri-tone.json | 57 + .../emerald-editorial.json | 57 + .../page-family-smoke-decks/grove.json | 72 + .../page-family-smoke-decks/long-table.json | 57 + .../page-family-smoke-decks/mat.json | 62 + .../page-family-smoke-decks/monochrome.json | 116 + .../neo-grid-bold.json | 92 + .../peoples-platform.json | 62 + .../pin-and-paper.json | 67 + .../page-family-smoke-decks/pink-script.json | 57 + .../page-family-smoke-decks/playful.json | 62 + .../page-family-smoke-decks/raw-grid.json | 62 + .../retro-windows.json | 67 + .../page-family-smoke-decks/retro-zine.json | 62 + .../sakura-chroma.json | 57 + .../page-family-smoke-decks/scatterbrain.json | 67 + .../page-family-smoke-decks/signal.json | 101 + .../soft-editorial.json | 71 + .../stencil-tablet.json | 61 + .../page-family-smoke-decks/studio.json | 164 + .../page-family-smoke-decks/vellum.json | 125 + .../beautiful/families/8-bit-orbit.html | 8 +- .../beautiful/families/8-bit-orbit.json | 666 +- .../beautiful/families/biennale-yellow.html | 8 +- .../beautiful/families/biennale-yellow.json | 833 +- .../beautiful/families/block-frame.html | 8 +- .../beautiful/families/block-frame.json | 834 +- .../beautiful/families/blue-professional.json | 140 +- .../beautiful/families/bold-poster.json | 124 +- .../beautiful/families/broadside.html | 8 +- .../beautiful/families/broadside.json | 1228 +- .../beautiful/families/capsule.html | 8 +- .../beautiful/families/capsule.json | 798 +- .../beautiful/families/cartesian.html | 22 +- .../beautiful/families/cartesian.json | 1754 +- .../beautiful/families/cobalt-grid.html | 8 +- .../beautiful/families/cobalt-grid.json | 867 +- .../beautiful/families/coral.html | 8 +- .../beautiful/families/coral.json | 779 +- .../beautiful/families/creative-mode.html | 8 +- .../beautiful/families/creative-mode.json | 559 +- .../beautiful/families/daisy-days.html | 22 +- .../beautiful/families/daisy-days.json | 2047 +- .../beautiful/families/editorial-forest.html | 8 +- .../beautiful/families/editorial-forest.json | 935 +- .../families/editorial-tri-tone.html | 8 +- .../families/editorial-tri-tone.json | 889 +- .../beautiful/families/emerald-editorial.html | 8 +- .../beautiful/families/emerald-editorial.json | 871 +- .../beautiful/families/grove.html | 8 +- .../beautiful/families/grove.json | 911 +- .../beautiful/families/long-table.html | 8 +- .../beautiful/families/long-table.json | 600 +- .../beautiful/families/mat.html | 8 +- .../beautiful/families/mat.json | 654 +- .../beautiful/families/monochrome.html | 8 +- .../beautiful/families/monochrome.json | 1379 +- .../beautiful/families/neo-grid-bold.html | 8 +- .../beautiful/families/neo-grid-bold.json | 948 +- .../beautiful/families/peoples-platform.html | 8 +- .../beautiful/families/peoples-platform.json | 701 +- .../beautiful/families/pin-and-paper.html | 8 +- .../beautiful/families/pin-and-paper.json | 723 +- .../beautiful/families/pink-script.html | 8 +- .../beautiful/families/pink-script.json | 629 +- .../beautiful/families/playful.html | 8 +- .../beautiful/families/playful.json | 1278 +- .../beautiful/families/raw-grid.html | 20 +- .../beautiful/families/raw-grid.json | 1583 +- .../beautiful/families/retro-windows.html | 8 +- .../beautiful/families/retro-windows.json | 1152 +- .../beautiful/families/retro-zine.html | 8 +- .../beautiful/families/retro-zine.json | 727 +- .../beautiful/families/sakura-chroma.html | 8 +- .../beautiful/families/sakura-chroma.json | 600 +- .../beautiful/families/scatterbrain.html | 22 +- .../beautiful/families/scatterbrain.json | 1843 +- .../beautiful/families/signal.html | 8 +- .../beautiful/families/signal.json | 1826 +- .../beautiful/families/soft-editorial.html | 8 +- .../beautiful/families/soft-editorial.json | 1329 +- .../beautiful/families/stencil-tablet.html | 8 +- .../beautiful/families/stencil-tablet.json | 719 +- .../beautiful/families/studio.html | 8 +- .../beautiful/families/studio.json | 787 +- .../beautiful/families/vellum.html | 8 +- .../beautiful/families/vellum.json | 647 +- .../production-review/beautiful/index.html | 66 +- .../production-review/beautiful/manifest.json | 32367 ++++++----- .../template-repair-status-matrix.json | 1548 + .../template-repair-status-matrix.md | 64 + .../8-bit-orbit.pixel-orbit-console.json | 289 + ...nale-yellow.biennale-programme-poster.json | 275 + .../block-frame.block-frame-grid.json | 287 + .../broadside.editorial-quote-chart.json | 371 + .../capsule.capsule-card-system.json | 287 + .../cartesian.architectural-spec.json | 289 + .../cobalt-grid.trend-grid-report.json | 277 + .../coral.coral-magazine-feature.json | 289 + .../creative-mode.creative-mode-grid.json | 276 + .../daisy-days.daisy-workshop-playbook.json | 289 + ...editorial-forest.serif-stat-editorial.json | 277 + ...ial-tri-tone.tritone-editorial-spread.json | 277 + ...ald-editorial.emerald-editorial-cover.json | 277 + .../grove.grove-organic-brief.json | 317 + .../long-table.printed-program.json | 276 + .../mat.mat-midcentury-board.json | 290 + .../monochrome.ledger-briefing.json | 372 + .../neo-grid-bold.dense-panel-grid.json | 316 + ...es-platform.people-platform-manifesto.json | 285 + .../pin-and-paper.annotated-field-board.json | 302 + .../pink-script.pink-nocturne-feature.json | 275 + .../playful.playful-indie-launch.json | 289 + .../raw-grid.brutalist-matrix.json | 288 + .../retro-windows.retro-ui-dashboard.json | 304 + .../retro-zine.retro-zine-spread.json | 288 + .../sakura-chroma.product-ribbon.json | 277 + .../scatterbrain.sticky-workshop-board.json | 304 + .../signal.intelligence-brief.json | 400 + ...soft-editorial.soft-editorial-feature.json | 316 + .../stencil-tablet.stencil-field-manual.json | 302 + .../studio.type-mass-poster.json | 316 + .../vellum.vellum-scholar-brief.json | 274 + .../beautiful-34-gallery.json | 447 +- ...blue-professional.executive-dashboard.json | 10 +- ...nale-yellow.biennale-programme-poster.json | 72 +- .../block-frame.block-frame-grid.json | 34 +- .../broadside.editorial-quote-chart.json | 2526 +- .../capsule.capsule-card-system.json | 2368 +- .../cartesian.architectural-spec.json | 2180 +- .../cobalt-grid.trend-grid-report.json | 2103 +- .../coral.coral-magazine-feature.json | 2389 +- .../daisy-days.daisy-workshop-playbook.json | 267 +- ...editorial-forest.serif-stat-editorial.json | 313 +- ...ial-tri-tone.tritone-editorial-spread.json | 237 +- ...ald-editorial.emerald-editorial-cover.json | 127 +- .../beautiful/grove.grove-organic-brief.json | 43 +- .../beautiful/long-table.printed-program.json | 2172 +- .../beautiful/mat.mat-midcentury-board.json | 85 +- .../beautiful/monochrome.ledger-briefing.json | 2505 +- .../neo-grid-bold.dense-panel-grid.json | 28 +- ...es-platform.people-platform-manifesto.json | 101 +- .../pin-and-paper.annotated-field-board.json | 142 +- .../pink-script.pink-nocturne-feature.json | 99 +- .../playful.playful-indie-launch.json | 121 +- .../beautiful/raw-grid.brutalist-matrix.json | 171 +- .../retro-windows.retro-ui-dashboard.json | 172 +- .../retro-zine.retro-zine-spread.json | 2463 +- .../sakura-chroma.product-ribbon.json | 140 +- .../scatterbrain.sticky-workshop-board.json | 516 +- .../beautiful/signal.intelligence-brief.json | 2771 +- ...soft-editorial.soft-editorial-feature.json | 2511 +- .../stencil-tablet.stencil-field-manual.json | 46 +- .../beautiful/studio.type-mass-poster.json | 61 +- .../vellum.vellum-scholar-brief.json | 52 +- .../scripts/artboard_renderer/dist/render.mjs | 20827 +++++-- .../scripts/artboard_renderer/render.mjs | 28 +- .../beautiful/annotated-field-board.mjs | 666 +- .../beautiful/biennale-programme-poster.mjs | 622 +- .../templates/beautiful/block-frame-grid.mjs | 546 +- .../beautiful/broadside-editorial-quote.mjs | 500 +- .../templates/beautiful/brutalist-matrix.mjs | 615 +- .../beautiful/capsule-card-system.mjs | 555 +- .../cartesian-architectural-spec.mjs | 495 +- .../beautiful/coral-magazine-feature.mjs | 671 +- .../beautiful/creative-mode-grid.mjs | 532 +- .../beautiful/daisy-workshop-playbook.mjs | 939 +- .../templates/beautiful/dense-panel-grid.mjs | 790 +- .../beautiful/emerald-editorial-cover.mjs | 723 +- .../beautiful/grove-organic-brief.mjs | 586 +- .../beautiful/intelligence-brief.mjs | 776 +- .../beautiful/long-table-printed-program.mjs | 678 +- .../beautiful/mat-midcentury-board.mjs | 529 +- .../beautiful/monochrome-ledger-briefing.mjs | 789 +- .../beautiful/people-platform-manifesto.mjs | 550 +- .../beautiful/pink-nocturne-feature.mjs | 628 +- .../beautiful/pixel-orbit-console.mjs | 929 +- .../beautiful/playful-indie-launch.mjs | 583 +- .../templates/beautiful/product-ribbon.mjs | 744 +- .../beautiful/retro-ui-dashboard.mjs | 733 +- .../templates/beautiful/retro-zine-spread.mjs | 543 +- .../beautiful/serif-stat-editorial.mjs | 580 +- .../beautiful/soft-editorial-feature.mjs | 597 +- .../beautiful/stencil-field-manual.mjs | 509 +- .../beautiful/sticky-workshop-board.mjs | 745 +- .../templates/beautiful/trend-grid-report.mjs | 448 +- .../beautiful/tritone-editorial-spread.mjs | 496 +- .../templates/beautiful/type-mass-poster.mjs | 470 +- .../beautiful/vellum-scholar-brief.mjs | 369 +- .../beautiful_template_current_deck_render.py | 4004 +- ...tiful_template_current_deck_render_test.py | 50 +- ...iful_template_production_review_gallery.py | 2 + ...template_production_review_gallery_test.py | 34 +- .../scripts/beautiful_template_runtime.py | 1 + .../8-bit-orbit.slide-1.canvas-spec.json | 190 + .../8-bit-orbit.slide-10.canvas-spec.json | 194 + .../8-bit-orbit.slide-2.canvas-spec.json | 192 + .../8-bit-orbit.slide-3.canvas-spec.json | 208 + .../8-bit-orbit.slide-4.canvas-spec.json | 212 + .../8-bit-orbit.slide-5.canvas-spec.json | 212 + .../8-bit-orbit.slide-6.canvas-spec.json | 212 + .../8-bit-orbit.slide-7.canvas-spec.json | 208 + .../8-bit-orbit.slide-8.canvas-spec.json | 192 + .../8-bit-orbit.slide-9.canvas-spec.json | 225 + .../biennale-yellow.cal.canvas-spec.json | 239 + .../biennale-yellow.chapter.canvas-spec.json | 191 + .../biennale-yellow.colophon.canvas-spec.json | 207 + .../biennale-yellow.cover.canvas-spec.json | 206 + .../biennale-yellow.data.canvas-spec.json | 228 + ...biennale-yellow.manifesto.canvas-spec.json | 190 + ...biennale-yellow.programme.canvas-spec.json | 217 + .../biennale-yellow.quote.canvas-spec.json | 192 + .../block-frame.agenda.canvas-spec.json | 202 + .../block-frame.closing.canvas-spec.json | 187 + .../golden/block-frame.cover.canvas-spec.json | 187 + ...ck-frame.data_dashboard-4.canvas-spec.json | 233 + ...ck-frame.data_dashboard-8.canvas-spec.json | 205 + ...lock-frame.data_dashboard.canvas-spec.json | 209 + ...ame.process_or_timeline-7.canvas-spec.json | 209 + ...ame.process_or_timeline-9.canvas-spec.json | 207 + ...frame.process_or_timeline.canvas-spec.json | 193 + ...k-frame.quote_or_emphasis.canvas-spec.json | 189 + ...ue-professional.dashboard.canvas-spec.json | 5 + ...blue-professional.metrics.canvas-spec.json | 3 +- .../blue-professional.split.canvas-spec.json | 3 +- ...lue-professional.timeline.canvas-spec.json | 3 +- .../golden/broadside.chapter.canvas-spec.json | 187 + .../golden/broadside.chart.canvas-spec.json | 205 + .../golden/broadside.compare.canvas-spec.json | 198 + .../golden/broadside.cover.canvas-spec.json | 187 + .../golden/broadside.cycle.canvas-spec.json | 193 + .../golden/broadside.diagram.canvas-spec.json | 193 + .../golden/broadside.end.canvas-spec.json | 187 + .../broadside.fadelist.canvas-spec.json | 192 + .../golden/broadside.list.canvas-spec.json | 193 + .../golden/broadside.pie.canvas-spec.json | 202 + .../golden/broadside.pyramid.canvas-spec.json | 194 + .../golden/broadside.quote.canvas-spec.json | 188 + .../golden/broadside.split.canvas-spec.json | 193 + .../broadside.statement.canvas-spec.json | 187 + .../golden/broadside.stats.canvas-spec.json | 204 + .../broadside.vtimeline.canvas-spec.json | 204 + .../golden/capsule.agenda.canvas-spec.json | 209 + .../golden/capsule.closing.canvas-spec.json | 208 + .../golden/capsule.cover.canvas-spec.json | 209 + .../capsule.data_dashboard-4.canvas-spec.json | 227 + .../capsule.data_dashboard-7.canvas-spec.json | 218 + .../capsule.data_dashboard.canvas-spec.json | 217 + ...psule.process_or_timeline.canvas-spec.json | 222 + ...capsule.quote_or_emphasis.canvas-spec.json | 209 + .../golden/capsule.slide-8.canvas-spec.json | 211 + .../golden/capsule.slide-9.canvas-spec.json | 207 + .../golden/cartesian.agenda.canvas-spec.json | 191 + .../cartesian.barchart.canvas-spec.json | 203 + .../golden/cartesian.cards.canvas-spec.json | 201 + .../golden/cartesian.closing.canvas-spec.json | 186 + .../cartesian.linechart.canvas-spec.json | 193 + .../cartesian.statement.canvas-spec.json | 186 + .../golden/cartesian.team.canvas-spec.json | 206 + .../cartesian.timeline.canvas-spec.json | 206 + .../golden/cartesian.title.canvas-spec.json | 186 + .../golden/cartesian.twocol.canvas-spec.json | 200 + .../cobalt-grid.chapter.canvas-spec.json | 186 + .../cobalt-grid.colophon.canvas-spec.json | 189 + .../golden/cobalt-grid.cover.canvas-spec.json | 188 + .../golden/cobalt-grid.data.canvas-spec.json | 217 + .../golden/cobalt-grid.index.canvas-spec.json | 217 + .../cobalt-grid.manifesto.canvas-spec.json | 187 + .../golden/cobalt-grid.quote.canvas-spec.json | 188 + .../golden/cobalt-grid.table.canvas-spec.json | 229 + .../golden/coral.agenda.canvas-spec.json | 174 + .../golden/coral.closing.canvas-spec.json | 192 + .../golden/coral.cover.canvas-spec.json | 177 + .../coral.data_dashboard-6.canvas-spec.json | 193 + .../coral.data_dashboard.canvas-spec.json | 211 + .../golden/coral.detail-9.canvas-spec.json | 195 + .../golden/coral.detail.canvas-spec.json | 187 + ...ral.process_or_timeline-8.canvas-spec.json | 200 + ...coral.process_or_timeline.canvas-spec.json | 174 + .../coral.quote_or_emphasis.canvas-spec.json | 175 + .../golden/creative-mode.s1.canvas-spec.json | 183 + .../golden/creative-mode.s2.canvas-spec.json | 188 + .../golden/creative-mode.s3.canvas-spec.json | 203 + .../golden/creative-mode.s4.canvas-spec.json | 188 + .../golden/creative-mode.s5.canvas-spec.json | 199 + .../golden/creative-mode.s6.canvas-spec.json | 199 + .../golden/creative-mode.s7.canvas-spec.json | 213 + .../golden/creative-mode.s8.canvas-spec.json | 188 + .../golden/daisy-days.cards.canvas-spec.json | 274 + .../daisy-days.chart-bar.canvas-spec.json | 279 + .../golden/daisy-days.donut.canvas-spec.json | 281 + .../daisy-days.process.canvas-spec.json | 269 + .../golden/daisy-days.quote.canvas-spec.json | 254 + .../golden/daisy-days.team.canvas-spec.json | 274 + .../daisy-days.timeline.canvas-spec.json | 279 + .../golden/daisy-days.title.canvas-spec.json | 254 + .../golden/daisy-days.weekly.canvas-spec.json | 309 + .../daisy-days.welcome.canvas-spec.json | 258 + .../editorial-forest.agenda.canvas-spec.json | 205 + .../editorial-forest.cover.canvas-spec.json | 175 + .../editorial-forest.data.canvas-spec.json | 206 + ...ditorial-forest.framework.canvas-spec.json | 208 + ...ditorial-forest.statement.canvas-spec.json | 177 + .../editorial-forest.stats.canvas-spec.json | 194 + .../editorial-forest.summary.canvas-spec.json | 188 + .../editorial-forest.two-col.canvas-spec.json | 194 + .../editorial-tri-tone.chart.canvas-spec.json | 234 + ...editorial-tri-tone.closer.canvas-spec.json | 204 + .../editorial-tri-tone.cover.canvas-spec.json | 187 + .../editorial-tri-tone.grid.canvas-spec.json | 213 + ...torial-tri-tone.manifesto.canvas-spec.json | 180 + .../editorial-tri-tone.quote.canvas-spec.json | 192 + .../editorial-tri-tone.stat.canvas-spec.json | 194 + ...itorial-tri-tone.timeline.canvas-spec.json | 198 + .../emerald-editorial.s1.canvas-spec.json | 174 + .../emerald-editorial.s2.canvas-spec.json | 199 + .../emerald-editorial.s3.canvas-spec.json | 178 + .../emerald-editorial.s4.canvas-spec.json | 191 + .../emerald-editorial.s5.canvas-spec.json | 208 + .../emerald-editorial.s6.canvas-spec.json | 195 + .../emerald-editorial.s7.canvas-spec.json | 195 + .../emerald-editorial.s8.canvas-spec.json | 176 + .../golden/grove.chapter-9.canvas-spec.json | 177 + .../golden/grove.chapter.canvas-spec.json | 177 + .../golden/grove.chart.canvas-spec.json | 202 + .../golden/grove.compare.canvas-spec.json | 200 + .../golden/grove.cover.canvas-spec.json | 179 + .../golden/grove.end.canvas-spec.json | 178 + .../golden/grove.list.canvas-spec.json | 187 + .../golden/grove.quote.canvas-spec.json | 177 + .../golden/grove.split.canvas-spec.json | 187 + .../grove.statement-10.canvas-spec.json | 181 + .../golden/grove.statement.canvas-spec.json | 179 + .../golden/grove.stats.canvas-spec.json | 193 + .../golden/long-table.cal.canvas-spec.json | 230 + .../long-table.closing.canvas-spec.json | 206 + .../golden/long-table.cover.canvas-spec.json | 196 + .../long-table.featured.canvas-spec.json | 218 + .../golden/long-table.index.canvas-spec.json | 212 + .../long-table.manifesto.canvas-spec.json | 194 + .../golden/long-table.menu.canvas-spec.json | 218 + .../golden/long-table.quote.canvas-spec.json | 189 + .../golden/mat.chart.canvas-spec.json | 219 + .../golden/mat.compare.canvas-spec.json | 212 + .../golden/mat.cover.canvas-spec.json | 192 + .../golden/mat.end.canvas-spec.json | 191 + .../golden/mat.list.canvas-spec.json | 197 + .../golden/mat.quote.canvas-spec.json | 188 + .../golden/mat.split.canvas-spec.json | 197 + .../golden/mat.statement.canvas-spec.json | 196 + .../golden/mat.stats.canvas-spec.json | 203 + .../monochrome.chapter.canvas-spec.json | 188 + .../golden/monochrome.chart.canvas-spec.json | 208 + .../monochrome.compare.canvas-spec.json | 203 + .../golden/monochrome.cover.canvas-spec.json | 185 + .../golden/monochrome.cycle.canvas-spec.json | 209 + .../golden/monochrome.dense.canvas-spec.json | 205 + .../monochrome.diagram.canvas-spec.json | 209 + .../golden/monochrome.end.canvas-spec.json | 187 + .../golden/monochrome.list.canvas-spec.json | 194 + .../golden/monochrome.pie.canvas-spec.json | 207 + .../monochrome.pyramid.canvas-spec.json | 194 + .../golden/monochrome.quote.canvas-spec.json | 188 + .../golden/monochrome.split.canvas-spec.json | 193 + .../monochrome.statement.canvas-spec.json | 187 + .../golden/monochrome.stats.canvas-spec.json | 204 + .../monochrome.vtimeline.canvas-spec.json | 209 + .../neo-grid-bold.chart.canvas-spec.json | 214 + .../neo-grid-bold.chart2.canvas-spec.json | 199 + .../neo-grid-bold.consult.canvas-spec.json | 221 + .../neo-grid-bold.cover.canvas-spec.json | 191 + .../golden/neo-grid-bold.cta.canvas-spec.json | 207 + .../neo-grid-bold.features.canvas-spec.json | 204 + .../neo-grid-bold.matrix2.canvas-spec.json | 222 + .../neo-grid-bold.process2.canvas-spec.json | 222 + .../neo-grid-bold.quote.canvas-spec.json | 193 + .../neo-grid-bold.section.canvas-spec.json | 191 + .../neo-grid-bold.stats.canvas-spec.json | 204 + .../golden/neo-grid-bold.toc.canvas-spec.json | 222 + .../peoples-platform.close.canvas-spec.json | 210 + .../peoples-platform.compare.canvas-spec.json | 224 + .../peoples-platform.cover.canvas-spec.json | 208 + ...eoples-platform.manifesto.canvas-spec.json | 212 + .../peoples-platform.pillars.canvas-spec.json | 223 + ...peoples-platform.platform.canvas-spec.json | 236 + .../peoples-platform.quote.canvas-spec.json | 205 + .../peoples-platform.stat.canvas-spec.json | 218 + ...peoples-platform.timeline.canvas-spec.json | 240 + .../peoples-platform.toc.canvas-spec.json | 248 + .../pin-and-paper.agenda.canvas-spec.json | 219 + .../pin-and-paper.chart.canvas-spec.json | 198 + .../pin-and-paper.cover.canvas-spec.json | 194 + .../golden/pin-and-paper.cta.canvas-spec.json | 211 + .../pin-and-paper.matrix.canvas-spec.json | 225 + .../pin-and-paper.notes.canvas-spec.json | 213 + .../pin-and-paper.notice.canvas-spec.json | 225 + .../pin-and-paper.process.canvas-spec.json | 227 + .../pin-and-paper.quote.canvas-spec.json | 196 + .../golden/pin-and-paper.sec.canvas-spec.json | 195 + .../pin-and-paper.stats.canvas-spec.json | 213 + .../golden/pink-script.chart.canvas-spec.json | 247 + .../golden/pink-script.cover.canvas-spec.json | 249 + .../golden/pink-script.cta.canvas-spec.json | 246 + .../pink-script.matrix.canvas-spec.json | 265 + .../pink-script.process.canvas-spec.json | 261 + .../golden/pink-script.quote.canvas-spec.json | 230 + .../pink-script.section.canvas-spec.json | 230 + .../golden/pink-script.stats.canvas-spec.json | 260 + .../golden/pink-script.toc.canvas-spec.json | 260 + .../golden/playful.chart.canvas-spec.json | 252 + .../golden/playful.closing.canvas-spec.json | 226 + .../golden/playful.cover.canvas-spec.json | 224 + .../golden/playful.gallery.canvas-spec.json | 239 + .../golden/playful.services.canvas-spec.json | 250 + .../golden/playful.statement.canvas-spec.json | 225 + .../golden/playful.stats.canvas-spec.json | 230 + .../golden/playful.team.canvas-spec.json | 239 + .../golden/playful.timeline.canvas-spec.json | 243 + .../golden/playful.toc.canvas-spec.json | 248 + .../golden/raw-grid.bars.canvas-spec.json | 261 + .../golden/raw-grid.cards.canvas-spec.json | 247 + .../golden/raw-grid.closing.canvas-spec.json | 230 + .../golden/raw-grid.cover.canvas-spec.json | 219 + .../golden/raw-grid.donut.canvas-spec.json | 248 + .../golden/raw-grid.feature.canvas-spec.json | 221 + .../golden/raw-grid.process.canvas-spec.json | 241 + .../golden/raw-grid.quote.canvas-spec.json | 239 + .../golden/raw-grid.split.canvas-spec.json | 230 + .../golden/raw-grid.table.canvas-spec.json | 262 + .../retro-windows.slide-1.canvas-spec.json | 198 + .../retro-windows.slide-10.canvas-spec.json | 212 + .../retro-windows.slide-2.canvas-spec.json | 209 + .../retro-windows.slide-3.canvas-spec.json | 220 + .../retro-windows.slide-4.canvas-spec.json | 230 + .../retro-windows.slide-5.canvas-spec.json | 229 + .../retro-windows.slide-6.canvas-spec.json | 214 + .../retro-windows.slide-7.canvas-spec.json | 219 + .../retro-windows.slide-8.canvas-spec.json | 228 + .../retro-windows.slide-9.canvas-spec.json | 244 + .../retro-zine.closing.canvas-spec.json | 196 + .../retro-zine.collage.canvas-spec.json | 207 + .../retro-zine.editorial.canvas-spec.json | 193 + .../golden/retro-zine.grid.canvas-spec.json | 207 + .../golden/retro-zine.hero.canvas-spec.json | 190 + .../retro-zine.numbers.canvas-spec.json | 206 + .../golden/retro-zine.rsvp.canvas-spec.json | 195 + .../golden/retro-zine.split.canvas-spec.json | 193 + .../retro-zine.statement.canvas-spec.json | 190 + .../golden/retro-zine.visual.canvas-spec.json | 190 + .../golden/sakura-chroma.cal.canvas-spec.json | 250 + .../sakura-chroma.catalogue.canvas-spec.json | 246 + .../sakura-chroma.colophon.canvas-spec.json | 207 + .../sakura-chroma.cover.canvas-spec.json | 194 + .../sakura-chroma.data.canvas-spec.json | 228 + .../sakura-chroma.manifesto.canvas-spec.json | 192 + .../sakura-chroma.quote.canvas-spec.json | 195 + .../sakura-chroma.stripe.canvas-spec.json | 193 + .../scatterbrain.chart.canvas-spec.json | 213 + .../scatterbrain.closing.canvas-spec.json | 200 + .../scatterbrain.comparison.canvas-spec.json | 209 + .../scatterbrain.diagram.canvas-spec.json | 220 + .../scatterbrain.features.canvas-spec.json | 210 + .../scatterbrain.image-text.canvas-spec.json | 197 + .../scatterbrain.statement.canvas-spec.json | 197 + .../scatterbrain.timeline.canvas-spec.json | 210 + .../scatterbrain.title.canvas-spec.json | 199 + .../scatterbrain.two-column.canvas-spec.json | 217 + .../golden/signal.chapter.canvas-spec.json | 194 + .../golden/signal.chart.canvas-spec.json | 207 + .../golden/signal.compare.canvas-spec.json | 207 + .../golden/signal.cover.canvas-spec.json | 196 + .../golden/signal.cycle.canvas-spec.json | 215 + .../golden/signal.dense.canvas-spec.json | 209 + .../golden/signal.diagram.canvas-spec.json | 210 + .../golden/signal.editorial.canvas-spec.json | 214 + .../golden/signal.end.canvas-spec.json | 194 + .../golden/signal.list.canvas-spec.json | 200 + .../golden/signal.pie.canvas-spec.json | 212 + .../golden/signal.pyramid.canvas-spec.json | 215 + .../golden/signal.quote.canvas-spec.json | 195 + .../golden/signal.split.canvas-spec.json | 202 + .../signal.statement-2.canvas-spec.json | 196 + .../golden/signal.statement.canvas-spec.json | 196 + .../golden/signal.stats.canvas-spec.json | 215 + .../golden/signal.vtimeline.canvas-spec.json | 215 + .../soft-editorial.chart.canvas-spec.json | 201 + .../soft-editorial.closer.canvas-spec.json | 197 + .../soft-editorial.consult.canvas-spec.json | 211 + .../soft-editorial.cover.canvas-spec.json | 197 + .../soft-editorial.foreword.canvas-spec.json | 202 + .../soft-editorial.insights.canvas-spec.json | 195 + .../soft-editorial.matrix.canvas-spec.json | 228 + .../soft-editorial.method.canvas-spec.json | 217 + .../soft-editorial.next.canvas-spec.json | 213 + .../soft-editorial.numbers.canvas-spec.json | 209 + .../soft-editorial.process.canvas-spec.json | 230 + .../soft-editorial.quote.canvas-spec.json | 198 + .../stencil-tablet.agenda.canvas-spec.json | 203 + .../stencil-tablet.chart.canvas-spec.json | 213 + .../stencil-tablet.consult.canvas-spec.json | 229 + .../stencil-tablet.cover.canvas-spec.json | 197 + .../stencil-tablet.cta.canvas-spec.json | 216 + .../stencil-tablet.matrix.canvas-spec.json | 225 + .../stencil-tablet.princ.canvas-spec.json | 219 + .../stencil-tablet.process.canvas-spec.json | 232 + .../stencil-tablet.quote.canvas-spec.json | 200 + .../stencil-tablet.sec.canvas-spec.json | 199 + .../stencil-tablet.stats.canvas-spec.json | 215 + .../golden/studio.chapter-9.canvas-spec.json | 187 + .../golden/studio.chapter.canvas-spec.json | 187 + .../golden/studio.chart.canvas-spec.json | 202 + .../golden/studio.compare.canvas-spec.json | 202 + .../golden/studio.cover.canvas-spec.json | 185 + .../golden/studio.end.canvas-spec.json | 187 + .../golden/studio.list.canvas-spec.json | 194 + .../golden/studio.quote.canvas-spec.json | 188 + .../golden/studio.split.canvas-spec.json | 194 + .../studio.statement-10.canvas-spec.json | 186 + .../golden/studio.statement.canvas-spec.json | 186 + .../golden/studio.stats.canvas-spec.json | 203 + .../golden/vellum.chart.canvas-spec.json | 216 + .../golden/vellum.compare.canvas-spec.json | 215 + .../golden/vellum.cover.canvas-spec.json | 200 + .../golden/vellum.end.canvas-spec.json | 200 + .../golden/vellum.list.canvas-spec.json | 208 + .../golden/vellum.quote.canvas-spec.json | 201 + .../golden/vellum.statement.canvas-spec.json | 200 + .../golden/vellum.stats.canvas-spec.json | 210 + .../golden/vellum.text.canvas-spec.json | 205 + skills/lark-slides/scripts/svg_preflight.py | 133 +- .../lark-slides/scripts/svg_preflight_test.py | 6 + .../svglide_artboard_layout_collision.py | 41 + .../svglide_artboard_layout_collision_test.py | 123 + .../svglide_artboard_template_golden_test.py | 2217 +- .../scripts/svglide_contract_compile.py | 594 +- .../scripts/svglide_contract_compile_test.py | 166 + .../scripts/svglide_editability_gate.py | 107 + .../scripts/svglide_editability_gate_test.py | 31 + .../scripts/svglide_pre_submit_review.py | 4 +- .../scripts/svglide_pre_submit_review_test.py | 16 + .../scripts/svglide_prepare_test.py | 23 + .../scripts/svglide_project_runner.py | 16 +- .../scripts/svglide_project_runner_test.py | 13 +- .../scripts/svglide_quality_gate.py | 45 +- .../scripts/svglide_quality_gate_test.py | 91 + .../scripts/svglide_runtime_review.py | 33 +- .../scripts/svglide_strategy_review.py | 19 +- .../scripts/svglide_visual_acceptance.py | 41 +- .../scripts/svglide_visual_acceptance_test.py | 34 + 561 files changed, 200802 insertions(+), 70441 deletions(-) create mode 100644 skills/lark-slides/references/page-family-smoke-decks/8-bit-orbit.json create mode 100644 skills/lark-slides/references/page-family-smoke-decks/biennale-yellow.json create mode 100644 skills/lark-slides/references/page-family-smoke-decks/block-frame.json create mode 100644 skills/lark-slides/references/page-family-smoke-decks/broadside.json create mode 100644 skills/lark-slides/references/page-family-smoke-decks/capsule.json create mode 100644 skills/lark-slides/references/page-family-smoke-decks/cartesian.json create mode 100644 skills/lark-slides/references/page-family-smoke-decks/cobalt-grid.json create mode 100644 skills/lark-slides/references/page-family-smoke-decks/coral.json create mode 100644 skills/lark-slides/references/page-family-smoke-decks/creative-mode.json create mode 100644 skills/lark-slides/references/page-family-smoke-decks/daisy-days.json create mode 100644 skills/lark-slides/references/page-family-smoke-decks/editorial-forest.json create mode 100644 skills/lark-slides/references/page-family-smoke-decks/editorial-tri-tone.json create mode 100644 skills/lark-slides/references/page-family-smoke-decks/emerald-editorial.json create mode 100644 skills/lark-slides/references/page-family-smoke-decks/grove.json create mode 100644 skills/lark-slides/references/page-family-smoke-decks/long-table.json create mode 100644 skills/lark-slides/references/page-family-smoke-decks/mat.json create mode 100644 skills/lark-slides/references/page-family-smoke-decks/monochrome.json create mode 100644 skills/lark-slides/references/page-family-smoke-decks/neo-grid-bold.json create mode 100644 skills/lark-slides/references/page-family-smoke-decks/peoples-platform.json create mode 100644 skills/lark-slides/references/page-family-smoke-decks/pin-and-paper.json create mode 100644 skills/lark-slides/references/page-family-smoke-decks/pink-script.json create mode 100644 skills/lark-slides/references/page-family-smoke-decks/playful.json create mode 100644 skills/lark-slides/references/page-family-smoke-decks/raw-grid.json create mode 100644 skills/lark-slides/references/page-family-smoke-decks/retro-windows.json create mode 100644 skills/lark-slides/references/page-family-smoke-decks/retro-zine.json create mode 100644 skills/lark-slides/references/page-family-smoke-decks/sakura-chroma.json create mode 100644 skills/lark-slides/references/page-family-smoke-decks/scatterbrain.json create mode 100644 skills/lark-slides/references/page-family-smoke-decks/signal.json create mode 100644 skills/lark-slides/references/page-family-smoke-decks/soft-editorial.json create mode 100644 skills/lark-slides/references/page-family-smoke-decks/stencil-tablet.json create mode 100644 skills/lark-slides/references/page-family-smoke-decks/studio.json create mode 100644 skills/lark-slides/references/page-family-smoke-decks/vellum.json create mode 100644 skills/lark-slides/references/production-review/beautiful/template-repair-status-matrix.json create mode 100644 skills/lark-slides/references/production-review/beautiful/template-repair-status-matrix.md create mode 100644 skills/lark-slides/references/receipts/page-family-smoke/8-bit-orbit.pixel-orbit-console.json create mode 100644 skills/lark-slides/references/receipts/page-family-smoke/biennale-yellow.biennale-programme-poster.json create mode 100644 skills/lark-slides/references/receipts/page-family-smoke/block-frame.block-frame-grid.json create mode 100644 skills/lark-slides/references/receipts/page-family-smoke/broadside.editorial-quote-chart.json create mode 100644 skills/lark-slides/references/receipts/page-family-smoke/capsule.capsule-card-system.json create mode 100644 skills/lark-slides/references/receipts/page-family-smoke/cartesian.architectural-spec.json create mode 100644 skills/lark-slides/references/receipts/page-family-smoke/cobalt-grid.trend-grid-report.json create mode 100644 skills/lark-slides/references/receipts/page-family-smoke/coral.coral-magazine-feature.json create mode 100644 skills/lark-slides/references/receipts/page-family-smoke/creative-mode.creative-mode-grid.json create mode 100644 skills/lark-slides/references/receipts/page-family-smoke/daisy-days.daisy-workshop-playbook.json create mode 100644 skills/lark-slides/references/receipts/page-family-smoke/editorial-forest.serif-stat-editorial.json create mode 100644 skills/lark-slides/references/receipts/page-family-smoke/editorial-tri-tone.tritone-editorial-spread.json create mode 100644 skills/lark-slides/references/receipts/page-family-smoke/emerald-editorial.emerald-editorial-cover.json create mode 100644 skills/lark-slides/references/receipts/page-family-smoke/grove.grove-organic-brief.json create mode 100644 skills/lark-slides/references/receipts/page-family-smoke/long-table.printed-program.json create mode 100644 skills/lark-slides/references/receipts/page-family-smoke/mat.mat-midcentury-board.json create mode 100644 skills/lark-slides/references/receipts/page-family-smoke/monochrome.ledger-briefing.json create mode 100644 skills/lark-slides/references/receipts/page-family-smoke/neo-grid-bold.dense-panel-grid.json create mode 100644 skills/lark-slides/references/receipts/page-family-smoke/peoples-platform.people-platform-manifesto.json create mode 100644 skills/lark-slides/references/receipts/page-family-smoke/pin-and-paper.annotated-field-board.json create mode 100644 skills/lark-slides/references/receipts/page-family-smoke/pink-script.pink-nocturne-feature.json create mode 100644 skills/lark-slides/references/receipts/page-family-smoke/playful.playful-indie-launch.json create mode 100644 skills/lark-slides/references/receipts/page-family-smoke/raw-grid.brutalist-matrix.json create mode 100644 skills/lark-slides/references/receipts/page-family-smoke/retro-windows.retro-ui-dashboard.json create mode 100644 skills/lark-slides/references/receipts/page-family-smoke/retro-zine.retro-zine-spread.json create mode 100644 skills/lark-slides/references/receipts/page-family-smoke/sakura-chroma.product-ribbon.json create mode 100644 skills/lark-slides/references/receipts/page-family-smoke/scatterbrain.sticky-workshop-board.json create mode 100644 skills/lark-slides/references/receipts/page-family-smoke/signal.intelligence-brief.json create mode 100644 skills/lark-slides/references/receipts/page-family-smoke/soft-editorial.soft-editorial-feature.json create mode 100644 skills/lark-slides/references/receipts/page-family-smoke/stencil-tablet.stencil-field-manual.json create mode 100644 skills/lark-slides/references/receipts/page-family-smoke/studio.type-mass-poster.json create mode 100644 skills/lark-slides/references/receipts/page-family-smoke/vellum.vellum-scholar-brief.json create mode 100644 skills/lark-slides/scripts/fixtures/svglide_artboard/golden/8-bit-orbit.slide-1.canvas-spec.json create mode 100644 skills/lark-slides/scripts/fixtures/svglide_artboard/golden/8-bit-orbit.slide-10.canvas-spec.json create mode 100644 skills/lark-slides/scripts/fixtures/svglide_artboard/golden/8-bit-orbit.slide-2.canvas-spec.json create mode 100644 skills/lark-slides/scripts/fixtures/svglide_artboard/golden/8-bit-orbit.slide-3.canvas-spec.json create mode 100644 skills/lark-slides/scripts/fixtures/svglide_artboard/golden/8-bit-orbit.slide-4.canvas-spec.json create mode 100644 skills/lark-slides/scripts/fixtures/svglide_artboard/golden/8-bit-orbit.slide-5.canvas-spec.json create mode 100644 skills/lark-slides/scripts/fixtures/svglide_artboard/golden/8-bit-orbit.slide-6.canvas-spec.json create mode 100644 skills/lark-slides/scripts/fixtures/svglide_artboard/golden/8-bit-orbit.slide-7.canvas-spec.json create mode 100644 skills/lark-slides/scripts/fixtures/svglide_artboard/golden/8-bit-orbit.slide-8.canvas-spec.json create mode 100644 skills/lark-slides/scripts/fixtures/svglide_artboard/golden/8-bit-orbit.slide-9.canvas-spec.json create mode 100644 skills/lark-slides/scripts/fixtures/svglide_artboard/golden/biennale-yellow.cal.canvas-spec.json create mode 100644 skills/lark-slides/scripts/fixtures/svglide_artboard/golden/biennale-yellow.chapter.canvas-spec.json create mode 100644 skills/lark-slides/scripts/fixtures/svglide_artboard/golden/biennale-yellow.colophon.canvas-spec.json create mode 100644 skills/lark-slides/scripts/fixtures/svglide_artboard/golden/biennale-yellow.cover.canvas-spec.json create mode 100644 skills/lark-slides/scripts/fixtures/svglide_artboard/golden/biennale-yellow.data.canvas-spec.json create mode 100644 skills/lark-slides/scripts/fixtures/svglide_artboard/golden/biennale-yellow.manifesto.canvas-spec.json create mode 100644 skills/lark-slides/scripts/fixtures/svglide_artboard/golden/biennale-yellow.programme.canvas-spec.json create mode 100644 skills/lark-slides/scripts/fixtures/svglide_artboard/golden/biennale-yellow.quote.canvas-spec.json create mode 100644 skills/lark-slides/scripts/fixtures/svglide_artboard/golden/block-frame.agenda.canvas-spec.json create mode 100644 skills/lark-slides/scripts/fixtures/svglide_artboard/golden/block-frame.closing.canvas-spec.json create mode 100644 skills/lark-slides/scripts/fixtures/svglide_artboard/golden/block-frame.cover.canvas-spec.json create mode 100644 skills/lark-slides/scripts/fixtures/svglide_artboard/golden/block-frame.data_dashboard-4.canvas-spec.json create mode 100644 skills/lark-slides/scripts/fixtures/svglide_artboard/golden/block-frame.data_dashboard-8.canvas-spec.json create mode 100644 skills/lark-slides/scripts/fixtures/svglide_artboard/golden/block-frame.data_dashboard.canvas-spec.json create mode 100644 skills/lark-slides/scripts/fixtures/svglide_artboard/golden/block-frame.process_or_timeline-7.canvas-spec.json create mode 100644 skills/lark-slides/scripts/fixtures/svglide_artboard/golden/block-frame.process_or_timeline-9.canvas-spec.json create mode 100644 skills/lark-slides/scripts/fixtures/svglide_artboard/golden/block-frame.process_or_timeline.canvas-spec.json create mode 100644 skills/lark-slides/scripts/fixtures/svglide_artboard/golden/block-frame.quote_or_emphasis.canvas-spec.json create mode 100644 skills/lark-slides/scripts/fixtures/svglide_artboard/golden/broadside.chapter.canvas-spec.json create mode 100644 skills/lark-slides/scripts/fixtures/svglide_artboard/golden/broadside.chart.canvas-spec.json create mode 100644 skills/lark-slides/scripts/fixtures/svglide_artboard/golden/broadside.compare.canvas-spec.json create mode 100644 skills/lark-slides/scripts/fixtures/svglide_artboard/golden/broadside.cover.canvas-spec.json create mode 100644 skills/lark-slides/scripts/fixtures/svglide_artboard/golden/broadside.cycle.canvas-spec.json create mode 100644 skills/lark-slides/scripts/fixtures/svglide_artboard/golden/broadside.diagram.canvas-spec.json create mode 100644 skills/lark-slides/scripts/fixtures/svglide_artboard/golden/broadside.end.canvas-spec.json create mode 100644 skills/lark-slides/scripts/fixtures/svglide_artboard/golden/broadside.fadelist.canvas-spec.json create mode 100644 skills/lark-slides/scripts/fixtures/svglide_artboard/golden/broadside.list.canvas-spec.json create mode 100644 skills/lark-slides/scripts/fixtures/svglide_artboard/golden/broadside.pie.canvas-spec.json create mode 100644 skills/lark-slides/scripts/fixtures/svglide_artboard/golden/broadside.pyramid.canvas-spec.json create mode 100644 skills/lark-slides/scripts/fixtures/svglide_artboard/golden/broadside.quote.canvas-spec.json create mode 100644 skills/lark-slides/scripts/fixtures/svglide_artboard/golden/broadside.split.canvas-spec.json create mode 100644 skills/lark-slides/scripts/fixtures/svglide_artboard/golden/broadside.statement.canvas-spec.json create mode 100644 skills/lark-slides/scripts/fixtures/svglide_artboard/golden/broadside.stats.canvas-spec.json create mode 100644 skills/lark-slides/scripts/fixtures/svglide_artboard/golden/broadside.vtimeline.canvas-spec.json create mode 100644 skills/lark-slides/scripts/fixtures/svglide_artboard/golden/capsule.agenda.canvas-spec.json create mode 100644 skills/lark-slides/scripts/fixtures/svglide_artboard/golden/capsule.closing.canvas-spec.json create mode 100644 skills/lark-slides/scripts/fixtures/svglide_artboard/golden/capsule.cover.canvas-spec.json create mode 100644 skills/lark-slides/scripts/fixtures/svglide_artboard/golden/capsule.data_dashboard-4.canvas-spec.json create mode 100644 skills/lark-slides/scripts/fixtures/svglide_artboard/golden/capsule.data_dashboard-7.canvas-spec.json create mode 100644 skills/lark-slides/scripts/fixtures/svglide_artboard/golden/capsule.data_dashboard.canvas-spec.json create mode 100644 skills/lark-slides/scripts/fixtures/svglide_artboard/golden/capsule.process_or_timeline.canvas-spec.json create mode 100644 skills/lark-slides/scripts/fixtures/svglide_artboard/golden/capsule.quote_or_emphasis.canvas-spec.json create mode 100644 skills/lark-slides/scripts/fixtures/svglide_artboard/golden/capsule.slide-8.canvas-spec.json create mode 100644 skills/lark-slides/scripts/fixtures/svglide_artboard/golden/capsule.slide-9.canvas-spec.json create mode 100644 skills/lark-slides/scripts/fixtures/svglide_artboard/golden/cartesian.agenda.canvas-spec.json create mode 100644 skills/lark-slides/scripts/fixtures/svglide_artboard/golden/cartesian.barchart.canvas-spec.json create mode 100644 skills/lark-slides/scripts/fixtures/svglide_artboard/golden/cartesian.cards.canvas-spec.json create mode 100644 skills/lark-slides/scripts/fixtures/svglide_artboard/golden/cartesian.closing.canvas-spec.json create mode 100644 skills/lark-slides/scripts/fixtures/svglide_artboard/golden/cartesian.linechart.canvas-spec.json create mode 100644 skills/lark-slides/scripts/fixtures/svglide_artboard/golden/cartesian.statement.canvas-spec.json create mode 100644 skills/lark-slides/scripts/fixtures/svglide_artboard/golden/cartesian.team.canvas-spec.json create mode 100644 skills/lark-slides/scripts/fixtures/svglide_artboard/golden/cartesian.timeline.canvas-spec.json create mode 100644 skills/lark-slides/scripts/fixtures/svglide_artboard/golden/cartesian.title.canvas-spec.json create mode 100644 skills/lark-slides/scripts/fixtures/svglide_artboard/golden/cartesian.twocol.canvas-spec.json create mode 100644 skills/lark-slides/scripts/fixtures/svglide_artboard/golden/cobalt-grid.chapter.canvas-spec.json create mode 100644 skills/lark-slides/scripts/fixtures/svglide_artboard/golden/cobalt-grid.colophon.canvas-spec.json create mode 100644 skills/lark-slides/scripts/fixtures/svglide_artboard/golden/cobalt-grid.cover.canvas-spec.json create mode 100644 skills/lark-slides/scripts/fixtures/svglide_artboard/golden/cobalt-grid.data.canvas-spec.json create mode 100644 skills/lark-slides/scripts/fixtures/svglide_artboard/golden/cobalt-grid.index.canvas-spec.json create mode 100644 skills/lark-slides/scripts/fixtures/svglide_artboard/golden/cobalt-grid.manifesto.canvas-spec.json create mode 100644 skills/lark-slides/scripts/fixtures/svglide_artboard/golden/cobalt-grid.quote.canvas-spec.json create mode 100644 skills/lark-slides/scripts/fixtures/svglide_artboard/golden/cobalt-grid.table.canvas-spec.json create mode 100644 skills/lark-slides/scripts/fixtures/svglide_artboard/golden/coral.agenda.canvas-spec.json create mode 100644 skills/lark-slides/scripts/fixtures/svglide_artboard/golden/coral.closing.canvas-spec.json create mode 100644 skills/lark-slides/scripts/fixtures/svglide_artboard/golden/coral.cover.canvas-spec.json create mode 100644 skills/lark-slides/scripts/fixtures/svglide_artboard/golden/coral.data_dashboard-6.canvas-spec.json create mode 100644 skills/lark-slides/scripts/fixtures/svglide_artboard/golden/coral.data_dashboard.canvas-spec.json create mode 100644 skills/lark-slides/scripts/fixtures/svglide_artboard/golden/coral.detail-9.canvas-spec.json create mode 100644 skills/lark-slides/scripts/fixtures/svglide_artboard/golden/coral.detail.canvas-spec.json create mode 100644 skills/lark-slides/scripts/fixtures/svglide_artboard/golden/coral.process_or_timeline-8.canvas-spec.json create mode 100644 skills/lark-slides/scripts/fixtures/svglide_artboard/golden/coral.process_or_timeline.canvas-spec.json create mode 100644 skills/lark-slides/scripts/fixtures/svglide_artboard/golden/coral.quote_or_emphasis.canvas-spec.json create mode 100644 skills/lark-slides/scripts/fixtures/svglide_artboard/golden/creative-mode.s1.canvas-spec.json create mode 100644 skills/lark-slides/scripts/fixtures/svglide_artboard/golden/creative-mode.s2.canvas-spec.json create mode 100644 skills/lark-slides/scripts/fixtures/svglide_artboard/golden/creative-mode.s3.canvas-spec.json create mode 100644 skills/lark-slides/scripts/fixtures/svglide_artboard/golden/creative-mode.s4.canvas-spec.json create mode 100644 skills/lark-slides/scripts/fixtures/svglide_artboard/golden/creative-mode.s5.canvas-spec.json create mode 100644 skills/lark-slides/scripts/fixtures/svglide_artboard/golden/creative-mode.s6.canvas-spec.json create mode 100644 skills/lark-slides/scripts/fixtures/svglide_artboard/golden/creative-mode.s7.canvas-spec.json create mode 100644 skills/lark-slides/scripts/fixtures/svglide_artboard/golden/creative-mode.s8.canvas-spec.json create mode 100644 skills/lark-slides/scripts/fixtures/svglide_artboard/golden/daisy-days.cards.canvas-spec.json create mode 100644 skills/lark-slides/scripts/fixtures/svglide_artboard/golden/daisy-days.chart-bar.canvas-spec.json create mode 100644 skills/lark-slides/scripts/fixtures/svglide_artboard/golden/daisy-days.donut.canvas-spec.json create mode 100644 skills/lark-slides/scripts/fixtures/svglide_artboard/golden/daisy-days.process.canvas-spec.json create mode 100644 skills/lark-slides/scripts/fixtures/svglide_artboard/golden/daisy-days.quote.canvas-spec.json create mode 100644 skills/lark-slides/scripts/fixtures/svglide_artboard/golden/daisy-days.team.canvas-spec.json create mode 100644 skills/lark-slides/scripts/fixtures/svglide_artboard/golden/daisy-days.timeline.canvas-spec.json create mode 100644 skills/lark-slides/scripts/fixtures/svglide_artboard/golden/daisy-days.title.canvas-spec.json create mode 100644 skills/lark-slides/scripts/fixtures/svglide_artboard/golden/daisy-days.weekly.canvas-spec.json create mode 100644 skills/lark-slides/scripts/fixtures/svglide_artboard/golden/daisy-days.welcome.canvas-spec.json create mode 100644 skills/lark-slides/scripts/fixtures/svglide_artboard/golden/editorial-forest.agenda.canvas-spec.json create mode 100644 skills/lark-slides/scripts/fixtures/svglide_artboard/golden/editorial-forest.cover.canvas-spec.json create mode 100644 skills/lark-slides/scripts/fixtures/svglide_artboard/golden/editorial-forest.data.canvas-spec.json create mode 100644 skills/lark-slides/scripts/fixtures/svglide_artboard/golden/editorial-forest.framework.canvas-spec.json create mode 100644 skills/lark-slides/scripts/fixtures/svglide_artboard/golden/editorial-forest.statement.canvas-spec.json create mode 100644 skills/lark-slides/scripts/fixtures/svglide_artboard/golden/editorial-forest.stats.canvas-spec.json create mode 100644 skills/lark-slides/scripts/fixtures/svglide_artboard/golden/editorial-forest.summary.canvas-spec.json create mode 100644 skills/lark-slides/scripts/fixtures/svglide_artboard/golden/editorial-forest.two-col.canvas-spec.json create mode 100644 skills/lark-slides/scripts/fixtures/svglide_artboard/golden/editorial-tri-tone.chart.canvas-spec.json create mode 100644 skills/lark-slides/scripts/fixtures/svglide_artboard/golden/editorial-tri-tone.closer.canvas-spec.json create mode 100644 skills/lark-slides/scripts/fixtures/svglide_artboard/golden/editorial-tri-tone.cover.canvas-spec.json create mode 100644 skills/lark-slides/scripts/fixtures/svglide_artboard/golden/editorial-tri-tone.grid.canvas-spec.json create mode 100644 skills/lark-slides/scripts/fixtures/svglide_artboard/golden/editorial-tri-tone.manifesto.canvas-spec.json create mode 100644 skills/lark-slides/scripts/fixtures/svglide_artboard/golden/editorial-tri-tone.quote.canvas-spec.json create mode 100644 skills/lark-slides/scripts/fixtures/svglide_artboard/golden/editorial-tri-tone.stat.canvas-spec.json create mode 100644 skills/lark-slides/scripts/fixtures/svglide_artboard/golden/editorial-tri-tone.timeline.canvas-spec.json create mode 100644 skills/lark-slides/scripts/fixtures/svglide_artboard/golden/emerald-editorial.s1.canvas-spec.json create mode 100644 skills/lark-slides/scripts/fixtures/svglide_artboard/golden/emerald-editorial.s2.canvas-spec.json create mode 100644 skills/lark-slides/scripts/fixtures/svglide_artboard/golden/emerald-editorial.s3.canvas-spec.json create mode 100644 skills/lark-slides/scripts/fixtures/svglide_artboard/golden/emerald-editorial.s4.canvas-spec.json create mode 100644 skills/lark-slides/scripts/fixtures/svglide_artboard/golden/emerald-editorial.s5.canvas-spec.json create mode 100644 skills/lark-slides/scripts/fixtures/svglide_artboard/golden/emerald-editorial.s6.canvas-spec.json create mode 100644 skills/lark-slides/scripts/fixtures/svglide_artboard/golden/emerald-editorial.s7.canvas-spec.json create mode 100644 skills/lark-slides/scripts/fixtures/svglide_artboard/golden/emerald-editorial.s8.canvas-spec.json create mode 100644 skills/lark-slides/scripts/fixtures/svglide_artboard/golden/grove.chapter-9.canvas-spec.json create mode 100644 skills/lark-slides/scripts/fixtures/svglide_artboard/golden/grove.chapter.canvas-spec.json create mode 100644 skills/lark-slides/scripts/fixtures/svglide_artboard/golden/grove.chart.canvas-spec.json create mode 100644 skills/lark-slides/scripts/fixtures/svglide_artboard/golden/grove.compare.canvas-spec.json create mode 100644 skills/lark-slides/scripts/fixtures/svglide_artboard/golden/grove.cover.canvas-spec.json create mode 100644 skills/lark-slides/scripts/fixtures/svglide_artboard/golden/grove.end.canvas-spec.json create mode 100644 skills/lark-slides/scripts/fixtures/svglide_artboard/golden/grove.list.canvas-spec.json create mode 100644 skills/lark-slides/scripts/fixtures/svglide_artboard/golden/grove.quote.canvas-spec.json create mode 100644 skills/lark-slides/scripts/fixtures/svglide_artboard/golden/grove.split.canvas-spec.json create mode 100644 skills/lark-slides/scripts/fixtures/svglide_artboard/golden/grove.statement-10.canvas-spec.json create mode 100644 skills/lark-slides/scripts/fixtures/svglide_artboard/golden/grove.statement.canvas-spec.json create mode 100644 skills/lark-slides/scripts/fixtures/svglide_artboard/golden/grove.stats.canvas-spec.json create mode 100644 skills/lark-slides/scripts/fixtures/svglide_artboard/golden/long-table.cal.canvas-spec.json create mode 100644 skills/lark-slides/scripts/fixtures/svglide_artboard/golden/long-table.closing.canvas-spec.json create mode 100644 skills/lark-slides/scripts/fixtures/svglide_artboard/golden/long-table.cover.canvas-spec.json create mode 100644 skills/lark-slides/scripts/fixtures/svglide_artboard/golden/long-table.featured.canvas-spec.json create mode 100644 skills/lark-slides/scripts/fixtures/svglide_artboard/golden/long-table.index.canvas-spec.json create mode 100644 skills/lark-slides/scripts/fixtures/svglide_artboard/golden/long-table.manifesto.canvas-spec.json create mode 100644 skills/lark-slides/scripts/fixtures/svglide_artboard/golden/long-table.menu.canvas-spec.json create mode 100644 skills/lark-slides/scripts/fixtures/svglide_artboard/golden/long-table.quote.canvas-spec.json create mode 100644 skills/lark-slides/scripts/fixtures/svglide_artboard/golden/mat.chart.canvas-spec.json create mode 100644 skills/lark-slides/scripts/fixtures/svglide_artboard/golden/mat.compare.canvas-spec.json create mode 100644 skills/lark-slides/scripts/fixtures/svglide_artboard/golden/mat.cover.canvas-spec.json create mode 100644 skills/lark-slides/scripts/fixtures/svglide_artboard/golden/mat.end.canvas-spec.json create mode 100644 skills/lark-slides/scripts/fixtures/svglide_artboard/golden/mat.list.canvas-spec.json create mode 100644 skills/lark-slides/scripts/fixtures/svglide_artboard/golden/mat.quote.canvas-spec.json create mode 100644 skills/lark-slides/scripts/fixtures/svglide_artboard/golden/mat.split.canvas-spec.json create mode 100644 skills/lark-slides/scripts/fixtures/svglide_artboard/golden/mat.statement.canvas-spec.json create mode 100644 skills/lark-slides/scripts/fixtures/svglide_artboard/golden/mat.stats.canvas-spec.json create mode 100644 skills/lark-slides/scripts/fixtures/svglide_artboard/golden/monochrome.chapter.canvas-spec.json create mode 100644 skills/lark-slides/scripts/fixtures/svglide_artboard/golden/monochrome.chart.canvas-spec.json create mode 100644 skills/lark-slides/scripts/fixtures/svglide_artboard/golden/monochrome.compare.canvas-spec.json create mode 100644 skills/lark-slides/scripts/fixtures/svglide_artboard/golden/monochrome.cover.canvas-spec.json create mode 100644 skills/lark-slides/scripts/fixtures/svglide_artboard/golden/monochrome.cycle.canvas-spec.json create mode 100644 skills/lark-slides/scripts/fixtures/svglide_artboard/golden/monochrome.dense.canvas-spec.json create mode 100644 skills/lark-slides/scripts/fixtures/svglide_artboard/golden/monochrome.diagram.canvas-spec.json create mode 100644 skills/lark-slides/scripts/fixtures/svglide_artboard/golden/monochrome.end.canvas-spec.json create mode 100644 skills/lark-slides/scripts/fixtures/svglide_artboard/golden/monochrome.list.canvas-spec.json create mode 100644 skills/lark-slides/scripts/fixtures/svglide_artboard/golden/monochrome.pie.canvas-spec.json create mode 100644 skills/lark-slides/scripts/fixtures/svglide_artboard/golden/monochrome.pyramid.canvas-spec.json create mode 100644 skills/lark-slides/scripts/fixtures/svglide_artboard/golden/monochrome.quote.canvas-spec.json create mode 100644 skills/lark-slides/scripts/fixtures/svglide_artboard/golden/monochrome.split.canvas-spec.json create mode 100644 skills/lark-slides/scripts/fixtures/svglide_artboard/golden/monochrome.statement.canvas-spec.json create mode 100644 skills/lark-slides/scripts/fixtures/svglide_artboard/golden/monochrome.stats.canvas-spec.json create mode 100644 skills/lark-slides/scripts/fixtures/svglide_artboard/golden/monochrome.vtimeline.canvas-spec.json create mode 100644 skills/lark-slides/scripts/fixtures/svglide_artboard/golden/neo-grid-bold.chart.canvas-spec.json create mode 100644 skills/lark-slides/scripts/fixtures/svglide_artboard/golden/neo-grid-bold.chart2.canvas-spec.json create mode 100644 skills/lark-slides/scripts/fixtures/svglide_artboard/golden/neo-grid-bold.consult.canvas-spec.json create mode 100644 skills/lark-slides/scripts/fixtures/svglide_artboard/golden/neo-grid-bold.cover.canvas-spec.json create mode 100644 skills/lark-slides/scripts/fixtures/svglide_artboard/golden/neo-grid-bold.cta.canvas-spec.json create mode 100644 skills/lark-slides/scripts/fixtures/svglide_artboard/golden/neo-grid-bold.features.canvas-spec.json create mode 100644 skills/lark-slides/scripts/fixtures/svglide_artboard/golden/neo-grid-bold.matrix2.canvas-spec.json create mode 100644 skills/lark-slides/scripts/fixtures/svglide_artboard/golden/neo-grid-bold.process2.canvas-spec.json create mode 100644 skills/lark-slides/scripts/fixtures/svglide_artboard/golden/neo-grid-bold.quote.canvas-spec.json create mode 100644 skills/lark-slides/scripts/fixtures/svglide_artboard/golden/neo-grid-bold.section.canvas-spec.json create mode 100644 skills/lark-slides/scripts/fixtures/svglide_artboard/golden/neo-grid-bold.stats.canvas-spec.json create mode 100644 skills/lark-slides/scripts/fixtures/svglide_artboard/golden/neo-grid-bold.toc.canvas-spec.json create mode 100644 skills/lark-slides/scripts/fixtures/svglide_artboard/golden/peoples-platform.close.canvas-spec.json create mode 100644 skills/lark-slides/scripts/fixtures/svglide_artboard/golden/peoples-platform.compare.canvas-spec.json create mode 100644 skills/lark-slides/scripts/fixtures/svglide_artboard/golden/peoples-platform.cover.canvas-spec.json create mode 100644 skills/lark-slides/scripts/fixtures/svglide_artboard/golden/peoples-platform.manifesto.canvas-spec.json create mode 100644 skills/lark-slides/scripts/fixtures/svglide_artboard/golden/peoples-platform.pillars.canvas-spec.json create mode 100644 skills/lark-slides/scripts/fixtures/svglide_artboard/golden/peoples-platform.platform.canvas-spec.json create mode 100644 skills/lark-slides/scripts/fixtures/svglide_artboard/golden/peoples-platform.quote.canvas-spec.json create mode 100644 skills/lark-slides/scripts/fixtures/svglide_artboard/golden/peoples-platform.stat.canvas-spec.json create mode 100644 skills/lark-slides/scripts/fixtures/svglide_artboard/golden/peoples-platform.timeline.canvas-spec.json create mode 100644 skills/lark-slides/scripts/fixtures/svglide_artboard/golden/peoples-platform.toc.canvas-spec.json create mode 100644 skills/lark-slides/scripts/fixtures/svglide_artboard/golden/pin-and-paper.agenda.canvas-spec.json create mode 100644 skills/lark-slides/scripts/fixtures/svglide_artboard/golden/pin-and-paper.chart.canvas-spec.json create mode 100644 skills/lark-slides/scripts/fixtures/svglide_artboard/golden/pin-and-paper.cover.canvas-spec.json create mode 100644 skills/lark-slides/scripts/fixtures/svglide_artboard/golden/pin-and-paper.cta.canvas-spec.json create mode 100644 skills/lark-slides/scripts/fixtures/svglide_artboard/golden/pin-and-paper.matrix.canvas-spec.json create mode 100644 skills/lark-slides/scripts/fixtures/svglide_artboard/golden/pin-and-paper.notes.canvas-spec.json create mode 100644 skills/lark-slides/scripts/fixtures/svglide_artboard/golden/pin-and-paper.notice.canvas-spec.json create mode 100644 skills/lark-slides/scripts/fixtures/svglide_artboard/golden/pin-and-paper.process.canvas-spec.json create mode 100644 skills/lark-slides/scripts/fixtures/svglide_artboard/golden/pin-and-paper.quote.canvas-spec.json create mode 100644 skills/lark-slides/scripts/fixtures/svglide_artboard/golden/pin-and-paper.sec.canvas-spec.json create mode 100644 skills/lark-slides/scripts/fixtures/svglide_artboard/golden/pin-and-paper.stats.canvas-spec.json create mode 100644 skills/lark-slides/scripts/fixtures/svglide_artboard/golden/pink-script.chart.canvas-spec.json create mode 100644 skills/lark-slides/scripts/fixtures/svglide_artboard/golden/pink-script.cover.canvas-spec.json create mode 100644 skills/lark-slides/scripts/fixtures/svglide_artboard/golden/pink-script.cta.canvas-spec.json create mode 100644 skills/lark-slides/scripts/fixtures/svglide_artboard/golden/pink-script.matrix.canvas-spec.json create mode 100644 skills/lark-slides/scripts/fixtures/svglide_artboard/golden/pink-script.process.canvas-spec.json create mode 100644 skills/lark-slides/scripts/fixtures/svglide_artboard/golden/pink-script.quote.canvas-spec.json create mode 100644 skills/lark-slides/scripts/fixtures/svglide_artboard/golden/pink-script.section.canvas-spec.json create mode 100644 skills/lark-slides/scripts/fixtures/svglide_artboard/golden/pink-script.stats.canvas-spec.json create mode 100644 skills/lark-slides/scripts/fixtures/svglide_artboard/golden/pink-script.toc.canvas-spec.json create mode 100644 skills/lark-slides/scripts/fixtures/svglide_artboard/golden/playful.chart.canvas-spec.json create mode 100644 skills/lark-slides/scripts/fixtures/svglide_artboard/golden/playful.closing.canvas-spec.json create mode 100644 skills/lark-slides/scripts/fixtures/svglide_artboard/golden/playful.cover.canvas-spec.json create mode 100644 skills/lark-slides/scripts/fixtures/svglide_artboard/golden/playful.gallery.canvas-spec.json create mode 100644 skills/lark-slides/scripts/fixtures/svglide_artboard/golden/playful.services.canvas-spec.json create mode 100644 skills/lark-slides/scripts/fixtures/svglide_artboard/golden/playful.statement.canvas-spec.json create mode 100644 skills/lark-slides/scripts/fixtures/svglide_artboard/golden/playful.stats.canvas-spec.json create mode 100644 skills/lark-slides/scripts/fixtures/svglide_artboard/golden/playful.team.canvas-spec.json create mode 100644 skills/lark-slides/scripts/fixtures/svglide_artboard/golden/playful.timeline.canvas-spec.json create mode 100644 skills/lark-slides/scripts/fixtures/svglide_artboard/golden/playful.toc.canvas-spec.json create mode 100644 skills/lark-slides/scripts/fixtures/svglide_artboard/golden/raw-grid.bars.canvas-spec.json create mode 100644 skills/lark-slides/scripts/fixtures/svglide_artboard/golden/raw-grid.cards.canvas-spec.json create mode 100644 skills/lark-slides/scripts/fixtures/svglide_artboard/golden/raw-grid.closing.canvas-spec.json create mode 100644 skills/lark-slides/scripts/fixtures/svglide_artboard/golden/raw-grid.cover.canvas-spec.json create mode 100644 skills/lark-slides/scripts/fixtures/svglide_artboard/golden/raw-grid.donut.canvas-spec.json create mode 100644 skills/lark-slides/scripts/fixtures/svglide_artboard/golden/raw-grid.feature.canvas-spec.json create mode 100644 skills/lark-slides/scripts/fixtures/svglide_artboard/golden/raw-grid.process.canvas-spec.json create mode 100644 skills/lark-slides/scripts/fixtures/svglide_artboard/golden/raw-grid.quote.canvas-spec.json create mode 100644 skills/lark-slides/scripts/fixtures/svglide_artboard/golden/raw-grid.split.canvas-spec.json create mode 100644 skills/lark-slides/scripts/fixtures/svglide_artboard/golden/raw-grid.table.canvas-spec.json create mode 100644 skills/lark-slides/scripts/fixtures/svglide_artboard/golden/retro-windows.slide-1.canvas-spec.json create mode 100644 skills/lark-slides/scripts/fixtures/svglide_artboard/golden/retro-windows.slide-10.canvas-spec.json create mode 100644 skills/lark-slides/scripts/fixtures/svglide_artboard/golden/retro-windows.slide-2.canvas-spec.json create mode 100644 skills/lark-slides/scripts/fixtures/svglide_artboard/golden/retro-windows.slide-3.canvas-spec.json create mode 100644 skills/lark-slides/scripts/fixtures/svglide_artboard/golden/retro-windows.slide-4.canvas-spec.json create mode 100644 skills/lark-slides/scripts/fixtures/svglide_artboard/golden/retro-windows.slide-5.canvas-spec.json create mode 100644 skills/lark-slides/scripts/fixtures/svglide_artboard/golden/retro-windows.slide-6.canvas-spec.json create mode 100644 skills/lark-slides/scripts/fixtures/svglide_artboard/golden/retro-windows.slide-7.canvas-spec.json create mode 100644 skills/lark-slides/scripts/fixtures/svglide_artboard/golden/retro-windows.slide-8.canvas-spec.json create mode 100644 skills/lark-slides/scripts/fixtures/svglide_artboard/golden/retro-windows.slide-9.canvas-spec.json create mode 100644 skills/lark-slides/scripts/fixtures/svglide_artboard/golden/retro-zine.closing.canvas-spec.json create mode 100644 skills/lark-slides/scripts/fixtures/svglide_artboard/golden/retro-zine.collage.canvas-spec.json create mode 100644 skills/lark-slides/scripts/fixtures/svglide_artboard/golden/retro-zine.editorial.canvas-spec.json create mode 100644 skills/lark-slides/scripts/fixtures/svglide_artboard/golden/retro-zine.grid.canvas-spec.json create mode 100644 skills/lark-slides/scripts/fixtures/svglide_artboard/golden/retro-zine.hero.canvas-spec.json create mode 100644 skills/lark-slides/scripts/fixtures/svglide_artboard/golden/retro-zine.numbers.canvas-spec.json create mode 100644 skills/lark-slides/scripts/fixtures/svglide_artboard/golden/retro-zine.rsvp.canvas-spec.json create mode 100644 skills/lark-slides/scripts/fixtures/svglide_artboard/golden/retro-zine.split.canvas-spec.json create mode 100644 skills/lark-slides/scripts/fixtures/svglide_artboard/golden/retro-zine.statement.canvas-spec.json create mode 100644 skills/lark-slides/scripts/fixtures/svglide_artboard/golden/retro-zine.visual.canvas-spec.json create mode 100644 skills/lark-slides/scripts/fixtures/svglide_artboard/golden/sakura-chroma.cal.canvas-spec.json create mode 100644 skills/lark-slides/scripts/fixtures/svglide_artboard/golden/sakura-chroma.catalogue.canvas-spec.json create mode 100644 skills/lark-slides/scripts/fixtures/svglide_artboard/golden/sakura-chroma.colophon.canvas-spec.json create mode 100644 skills/lark-slides/scripts/fixtures/svglide_artboard/golden/sakura-chroma.cover.canvas-spec.json create mode 100644 skills/lark-slides/scripts/fixtures/svglide_artboard/golden/sakura-chroma.data.canvas-spec.json create mode 100644 skills/lark-slides/scripts/fixtures/svglide_artboard/golden/sakura-chroma.manifesto.canvas-spec.json create mode 100644 skills/lark-slides/scripts/fixtures/svglide_artboard/golden/sakura-chroma.quote.canvas-spec.json create mode 100644 skills/lark-slides/scripts/fixtures/svglide_artboard/golden/sakura-chroma.stripe.canvas-spec.json create mode 100644 skills/lark-slides/scripts/fixtures/svglide_artboard/golden/scatterbrain.chart.canvas-spec.json create mode 100644 skills/lark-slides/scripts/fixtures/svglide_artboard/golden/scatterbrain.closing.canvas-spec.json create mode 100644 skills/lark-slides/scripts/fixtures/svglide_artboard/golden/scatterbrain.comparison.canvas-spec.json create mode 100644 skills/lark-slides/scripts/fixtures/svglide_artboard/golden/scatterbrain.diagram.canvas-spec.json create mode 100644 skills/lark-slides/scripts/fixtures/svglide_artboard/golden/scatterbrain.features.canvas-spec.json create mode 100644 skills/lark-slides/scripts/fixtures/svglide_artboard/golden/scatterbrain.image-text.canvas-spec.json create mode 100644 skills/lark-slides/scripts/fixtures/svglide_artboard/golden/scatterbrain.statement.canvas-spec.json create mode 100644 skills/lark-slides/scripts/fixtures/svglide_artboard/golden/scatterbrain.timeline.canvas-spec.json create mode 100644 skills/lark-slides/scripts/fixtures/svglide_artboard/golden/scatterbrain.title.canvas-spec.json create mode 100644 skills/lark-slides/scripts/fixtures/svglide_artboard/golden/scatterbrain.two-column.canvas-spec.json create mode 100644 skills/lark-slides/scripts/fixtures/svglide_artboard/golden/signal.chapter.canvas-spec.json create mode 100644 skills/lark-slides/scripts/fixtures/svglide_artboard/golden/signal.chart.canvas-spec.json create mode 100644 skills/lark-slides/scripts/fixtures/svglide_artboard/golden/signal.compare.canvas-spec.json create mode 100644 skills/lark-slides/scripts/fixtures/svglide_artboard/golden/signal.cover.canvas-spec.json create mode 100644 skills/lark-slides/scripts/fixtures/svglide_artboard/golden/signal.cycle.canvas-spec.json create mode 100644 skills/lark-slides/scripts/fixtures/svglide_artboard/golden/signal.dense.canvas-spec.json create mode 100644 skills/lark-slides/scripts/fixtures/svglide_artboard/golden/signal.diagram.canvas-spec.json create mode 100644 skills/lark-slides/scripts/fixtures/svglide_artboard/golden/signal.editorial.canvas-spec.json create mode 100644 skills/lark-slides/scripts/fixtures/svglide_artboard/golden/signal.end.canvas-spec.json create mode 100644 skills/lark-slides/scripts/fixtures/svglide_artboard/golden/signal.list.canvas-spec.json create mode 100644 skills/lark-slides/scripts/fixtures/svglide_artboard/golden/signal.pie.canvas-spec.json create mode 100644 skills/lark-slides/scripts/fixtures/svglide_artboard/golden/signal.pyramid.canvas-spec.json create mode 100644 skills/lark-slides/scripts/fixtures/svglide_artboard/golden/signal.quote.canvas-spec.json create mode 100644 skills/lark-slides/scripts/fixtures/svglide_artboard/golden/signal.split.canvas-spec.json create mode 100644 skills/lark-slides/scripts/fixtures/svglide_artboard/golden/signal.statement-2.canvas-spec.json create mode 100644 skills/lark-slides/scripts/fixtures/svglide_artboard/golden/signal.statement.canvas-spec.json create mode 100644 skills/lark-slides/scripts/fixtures/svglide_artboard/golden/signal.stats.canvas-spec.json create mode 100644 skills/lark-slides/scripts/fixtures/svglide_artboard/golden/signal.vtimeline.canvas-spec.json create mode 100644 skills/lark-slides/scripts/fixtures/svglide_artboard/golden/soft-editorial.chart.canvas-spec.json create mode 100644 skills/lark-slides/scripts/fixtures/svglide_artboard/golden/soft-editorial.closer.canvas-spec.json create mode 100644 skills/lark-slides/scripts/fixtures/svglide_artboard/golden/soft-editorial.consult.canvas-spec.json create mode 100644 skills/lark-slides/scripts/fixtures/svglide_artboard/golden/soft-editorial.cover.canvas-spec.json create mode 100644 skills/lark-slides/scripts/fixtures/svglide_artboard/golden/soft-editorial.foreword.canvas-spec.json create mode 100644 skills/lark-slides/scripts/fixtures/svglide_artboard/golden/soft-editorial.insights.canvas-spec.json create mode 100644 skills/lark-slides/scripts/fixtures/svglide_artboard/golden/soft-editorial.matrix.canvas-spec.json create mode 100644 skills/lark-slides/scripts/fixtures/svglide_artboard/golden/soft-editorial.method.canvas-spec.json create mode 100644 skills/lark-slides/scripts/fixtures/svglide_artboard/golden/soft-editorial.next.canvas-spec.json create mode 100644 skills/lark-slides/scripts/fixtures/svglide_artboard/golden/soft-editorial.numbers.canvas-spec.json create mode 100644 skills/lark-slides/scripts/fixtures/svglide_artboard/golden/soft-editorial.process.canvas-spec.json create mode 100644 skills/lark-slides/scripts/fixtures/svglide_artboard/golden/soft-editorial.quote.canvas-spec.json create mode 100644 skills/lark-slides/scripts/fixtures/svglide_artboard/golden/stencil-tablet.agenda.canvas-spec.json create mode 100644 skills/lark-slides/scripts/fixtures/svglide_artboard/golden/stencil-tablet.chart.canvas-spec.json create mode 100644 skills/lark-slides/scripts/fixtures/svglide_artboard/golden/stencil-tablet.consult.canvas-spec.json create mode 100644 skills/lark-slides/scripts/fixtures/svglide_artboard/golden/stencil-tablet.cover.canvas-spec.json create mode 100644 skills/lark-slides/scripts/fixtures/svglide_artboard/golden/stencil-tablet.cta.canvas-spec.json create mode 100644 skills/lark-slides/scripts/fixtures/svglide_artboard/golden/stencil-tablet.matrix.canvas-spec.json create mode 100644 skills/lark-slides/scripts/fixtures/svglide_artboard/golden/stencil-tablet.princ.canvas-spec.json create mode 100644 skills/lark-slides/scripts/fixtures/svglide_artboard/golden/stencil-tablet.process.canvas-spec.json create mode 100644 skills/lark-slides/scripts/fixtures/svglide_artboard/golden/stencil-tablet.quote.canvas-spec.json create mode 100644 skills/lark-slides/scripts/fixtures/svglide_artboard/golden/stencil-tablet.sec.canvas-spec.json create mode 100644 skills/lark-slides/scripts/fixtures/svglide_artboard/golden/stencil-tablet.stats.canvas-spec.json create mode 100644 skills/lark-slides/scripts/fixtures/svglide_artboard/golden/studio.chapter-9.canvas-spec.json create mode 100644 skills/lark-slides/scripts/fixtures/svglide_artboard/golden/studio.chapter.canvas-spec.json create mode 100644 skills/lark-slides/scripts/fixtures/svglide_artboard/golden/studio.chart.canvas-spec.json create mode 100644 skills/lark-slides/scripts/fixtures/svglide_artboard/golden/studio.compare.canvas-spec.json create mode 100644 skills/lark-slides/scripts/fixtures/svglide_artboard/golden/studio.cover.canvas-spec.json create mode 100644 skills/lark-slides/scripts/fixtures/svglide_artboard/golden/studio.end.canvas-spec.json create mode 100644 skills/lark-slides/scripts/fixtures/svglide_artboard/golden/studio.list.canvas-spec.json create mode 100644 skills/lark-slides/scripts/fixtures/svglide_artboard/golden/studio.quote.canvas-spec.json create mode 100644 skills/lark-slides/scripts/fixtures/svglide_artboard/golden/studio.split.canvas-spec.json create mode 100644 skills/lark-slides/scripts/fixtures/svglide_artboard/golden/studio.statement-10.canvas-spec.json create mode 100644 skills/lark-slides/scripts/fixtures/svglide_artboard/golden/studio.statement.canvas-spec.json create mode 100644 skills/lark-slides/scripts/fixtures/svglide_artboard/golden/studio.stats.canvas-spec.json create mode 100644 skills/lark-slides/scripts/fixtures/svglide_artboard/golden/vellum.chart.canvas-spec.json create mode 100644 skills/lark-slides/scripts/fixtures/svglide_artboard/golden/vellum.compare.canvas-spec.json create mode 100644 skills/lark-slides/scripts/fixtures/svglide_artboard/golden/vellum.cover.canvas-spec.json create mode 100644 skills/lark-slides/scripts/fixtures/svglide_artboard/golden/vellum.end.canvas-spec.json create mode 100644 skills/lark-slides/scripts/fixtures/svglide_artboard/golden/vellum.list.canvas-spec.json create mode 100644 skills/lark-slides/scripts/fixtures/svglide_artboard/golden/vellum.quote.canvas-spec.json create mode 100644 skills/lark-slides/scripts/fixtures/svglide_artboard/golden/vellum.statement.canvas-spec.json create mode 100644 skills/lark-slides/scripts/fixtures/svglide_artboard/golden/vellum.stats.canvas-spec.json create mode 100644 skills/lark-slides/scripts/fixtures/svglide_artboard/golden/vellum.text.canvas-spec.json diff --git a/skills/lark-slides/references/beautiful-template-executable-matrix.json b/skills/lark-slides/references/beautiful-template-executable-matrix.json index 57c1384e..56cbe6be 100644 --- a/skills/lark-slides/references/beautiful-template-executable-matrix.json +++ b/skills/lark-slides/references/beautiful-template-executable-matrix.json @@ -1,130 +1,24 @@ { - "version": "svglide-beautiful-template-executable-matrix/v1", - "policy": { - "default_selectable_count_contract": "not_fixed", - "production_requires": [ - "dedicated_renderer", - "golden_spec", - "reference_screenshot", - "screenshot_fidelity_receipt", - "visual_contract", - "selector_gate", - "quality_gate", - "production_review_receipt", - "visual_contract_path" - ] - }, "candidates": [ { - "family_id": "8-bit-orbit", - "template_id": "pixel-orbit-console", - "runtime_template_id": "pixel-orbit-console", - "source_template_html": "beautiful-html-templates/templates/8-bit-orbit/template.html", - "source_design_md": "beautiful-html-templates/templates/8-bit-orbit/design.md", - "source_template_json": "beautiful-html-templates/templates/8-bit-orbit/template.json", - "renderer_id": "artboard_satori.pixel-orbit-console", - "renderer_module": "skills/lark-slides/scripts/artboard_renderer/templates/beautiful/pixel-orbit-console.mjs", - "golden_spec": "skills/lark-slides/scripts/fixtures/svglide_artboard/golden/pixel-orbit-console.canvas-spec.json", - "reference_screenshot": "beautiful-html-templates/screenshots/8-bit-orbit-1.png", - "fidelity_receipt": "skills/lark-slides/references/receipts/template-fidelity/8-bit-orbit.pixel-orbit-console.json", - "source_trace": [ - { - "source": "beautiful-html-templates/templates/8-bit-orbit/template.html", - "evidence": "source_template_html" - }, - { - "source": "beautiful-html-templates/templates/8-bit-orbit/design.md", - "evidence": "source_design_md" - }, - { - "source": "beautiful-html-templates/templates/8-bit-orbit/template.json", - "evidence": "source_template_json" - }, - { - "source": "beautiful-html-templates/screenshots/8-bit-orbit-1.png", - "evidence": "reference_screenshot" - }, - { - "source": "skills/lark-slides/references/absorptions/beautiful-html-templates/8-bit-orbit.pixel-orbit-console.json", - "evidence": "absorption_record" - }, - { - "source": "skills/lark-slides/references/receipts/template-fidelity/8-bit-orbit.pixel-orbit-console.json", - "evidence": "template_fidelity_receipt" - } - ], - "visual_contract": { - "path": "skills/lark-slides/references/visual-contracts/beautiful/8-bit-orbit.pixel-orbit-console.json", - "layout_rhythm": "8-bit-orbit: medium density, low formality. Pixel-art neon arcade aesthetic on a deep navy void.", - "motifs": [ - "grid", - "accent line", - "card panels", - "paper texture", - "window chrome", - "poster blocks", - "quote mark", - "sticker collage", - "pixel motif" - ], - "palette_roles": [ - "accent", - "background", - "border", - "muted", - "negative", - "positive", - "primary", - "surface", - "text" - ], - "do_not_simplify": [ - "preserve_fonts_palette_grid_slide_classes_decorative_elements", - "do_not_recolor_without_explicit_brand_override", - "do_not_mix_template_families", - "extend_missing_layout_inside_same_family", - "do_not_strip_identity_decorations", - "new_palette", - "cross_family_components", - "fake_italic", - "new_decorative_motif", - "remote_font_dependency", - "do_not_replace_family_with_generic_card_shell", - "do_not_mark_production_without_renderer_golden_fidelity_receipt", - "do_not_strip_identity_decorations", - "do_not_recolor_without_explicit_brand_override" - ] - }, - "fidelity_gate": { - "status": "passed", - "score": 0.8995, - "threshold": 0.72, - "reference_screenshot": "/Users/bytedance/bd-projects/beautiful-html-templates/screenshots/8-bit-orbit-1.png", - "render_screenshot": "/Users/bytedance/bd-projects/workspaces/SVGlide/.worktrees/cli-svglide-svg-private/skills/lark-slides/scripts/fixtures/svglide_artboard/golden/pixel-orbit-console.preview.png", - "receipt_path": "skills/lark-slides/references/receipts/template-fidelity/8-bit-orbit.pixel-orbit-console.json", - "issues": [] - }, - "promotion_status": "needs_review", - "default_selectable": false, "blocking_issues": [ "selector_gate_missing", "quality_gate_integration_pending", "production_review_pending" ], - "visual_contract_path": "skills/lark-slides/references/visual-contracts/beautiful/8-bit-orbit.pixel-orbit-console.json", - "planned_renderer_module": "skills/lark-slides/scripts/artboard_renderer/templates/beautiful/pixel-orbit-console.mjs", - "planned_golden_spec": "skills/lark-slides/scripts/fixtures/svglide_artboard/golden/pixel-orbit-console.canvas-spec.json", - "planned_fidelity_receipt": "skills/lark-slides/references/receipts/template-fidelity/8-bit-orbit.pixel-orbit-console.json", + "default_selectable": false, + "family_id": "8-bit-orbit", + "fidelity_gate": { + "issues": [], + "receipt_path": "skills/lark-slides/references/receipts/template-fidelity/8-bit-orbit.pixel-orbit-console.json", + "reference_screenshot": "/Users/bytedance/bd-projects/beautiful-html-templates/screenshots/8-bit-orbit-1.png", + "render_screenshot": "/Users/bytedance/bd-projects/workspaces/SVGlide/.worktrees/cli-svglide-svg-private/skills/lark-slides/scripts/fixtures/svglide_artboard/golden/pixel-orbit-console.preview.png", + "score": 0.8995, + "status": "passed", + "threshold": 0.72 + }, + "fidelity_receipt": "skills/lark-slides/references/receipts/template-fidelity/8-bit-orbit.pixel-orbit-console.json", "font_strategy": { - "source_fonts": [ - "Tektur", - "Chakra Petch", - "Space Mono" - ], - "slide_native_preferred": [ - "system-sans-cjk", - "system-mono" - ], "adobe_or_embedded_fallback": [ "Source Sans Pro", "Source Code Pro", @@ -132,59 +26,17 @@ "思源等宽" ], "cjk_fallback": "Noto Sans SC", - "role_mapping": { - "display": { - "source_font": "Tektur", - "slide_font": "Source Sans Pro", - "runtime_alias": "SVGlideDisplay", - "cjk_font": "思源黑体", - "fallback_stack": [ - "system-sans-cjk", - "SVGlideDisplay" - ], - "source_only": false, - "requires_download": false, - "mapping_reason": "保留 Tektur 的语义角色,但运行时优先使用 Slide/系统可用的 Source Sans Pro 与 思源黑体。" - }, - "body": { - "source_font": "Chakra Petch", - "slide_font": "Source Sans Pro", - "runtime_alias": "SVGlideBody", - "cjk_font": "思源黑体", - "fallback_stack": [ - "system-sans-cjk", - "SVGlideBody" - ], - "source_only": false, - "requires_download": false, - "mapping_reason": "保留 Chakra Petch 的语义角色,但运行时优先使用 Slide/系统可用的 Source Sans Pro 与 思源黑体。" - }, - "label": { - "source_font": "Space Mono", - "slide_font": "Source Code Pro", - "runtime_alias": "SVGlideLabel", - "cjk_font": "思源等宽", - "fallback_stack": [ - "system-mono", - "SVGlideLabel" - ], - "source_only": false, - "requires_download": false, - "mapping_reason": "保留 Space Mono 的语义角色,但运行时优先使用 Slide/系统可用的 Source Code Pro 与 思源等宽。" - }, - "metric": { - "source_font": "Space Mono", - "slide_font": "Source Code Pro", - "runtime_alias": "SVGlideMetric", - "cjk_font": "思源等宽", - "fallback_stack": [ - "system-mono", - "SVGlideMetric" - ], - "source_only": false, - "requires_download": false, - "mapping_reason": "保留 Space Mono 的语义角色,但运行时优先使用 Slide/系统可用的 Source Code Pro 与 思源等宽。" - } + "extraction_confidence": { + "adobe_or_embedded_fallback": "inferred_from_layout", + "cjk_fallback": "inferred_from_layout", + "forbidden": "inferred_from_layout", + "mapping_reason": "inferred_from_layout", + "role_mapping.body": "inferred_from_layout", + "role_mapping.display": "inferred_from_layout", + "role_mapping.label": "inferred_from_layout", + "role_mapping.metric": "inferred_from_layout", + "slide_native_preferred": "inferred_from_layout", + "source_fonts": "css_extracted_from_template_html" }, "forbidden": [ "remote_font_runtime_dependency", @@ -193,118 +45,690 @@ "drop_cjk_fallback" ], "mapping_reason": "根据 design.md/template.html/template.json 中的 font-family 与 typography token 提取源字体;运行时按 Slide/系统/Adobe/思源可用字体降级。", + "role_mapping": { + "body": { + "cjk_font": "思源黑体", + "fallback_stack": [ + "system-sans-cjk", + "SVGlideBody" + ], + "mapping_reason": "保留 Chakra Petch 的语义角色,但运行时优先使用 Slide/系统可用的 Source Sans Pro 与 思源黑体。", + "requires_download": false, + "runtime_alias": "SVGlideBody", + "slide_font": "Source Sans Pro", + "source_font": "Chakra Petch", + "source_only": false + }, + "display": { + "cjk_font": "思源黑体", + "fallback_stack": [ + "system-sans-cjk", + "SVGlideDisplay" + ], + "mapping_reason": "保留 Tektur 的语义角色,但运行时优先使用 Slide/系统可用的 Source Sans Pro 与 思源黑体。", + "requires_download": false, + "runtime_alias": "SVGlideDisplay", + "slide_font": "Source Sans Pro", + "source_font": "Tektur", + "source_only": false + }, + "label": { + "cjk_font": "思源等宽", + "fallback_stack": [ + "system-mono", + "SVGlideLabel" + ], + "mapping_reason": "保留 Space Mono 的语义角色,但运行时优先使用 Slide/系统可用的 Source Code Pro 与 思源等宽。", + "requires_download": false, + "runtime_alias": "SVGlideLabel", + "slide_font": "Source Code Pro", + "source_font": "Space Mono", + "source_only": false + }, + "metric": { + "cjk_font": "思源等宽", + "fallback_stack": [ + "system-mono", + "SVGlideMetric" + ], + "mapping_reason": "保留 Space Mono 的语义角色,但运行时优先使用 Slide/系统可用的 Source Code Pro 与 思源等宽。", + "requires_download": false, + "runtime_alias": "SVGlideMetric", + "slide_font": "Source Code Pro", + "source_font": "Space Mono", + "source_only": false + } + }, + "slide_native_preferred": [ + "system-sans-cjk", + "system-mono" + ], "source_evidence": [ "beautiful-html-templates/templates/8-bit-orbit/design.md", "beautiful-html-templates/templates/8-bit-orbit/template.html", "beautiful-html-templates/templates/8-bit-orbit/template.json", "beautiful-html-templates/screenshots/8-bit-orbit-1.png" ], - "extraction_confidence": { - "role_mapping.body": "inferred_from_layout", - "role_mapping.display": "inferred_from_layout", - "source_fonts": "css_extracted_from_template_html", - "adobe_or_embedded_fallback": "inferred_from_layout", - "cjk_fallback": "inferred_from_layout", - "role_mapping.metric": "inferred_from_layout", - "forbidden": "inferred_from_layout", - "slide_native_preferred": "inferred_from_layout", - "mapping_reason": "inferred_from_layout", - "role_mapping.label": "inferred_from_layout" - }, + "source_fonts": [ + "Tektur", + "Chakra Petch", + "Space Mono" + ], "source_refs": { - "role_mapping.body": [ - { - "path": "beautiful-html-templates/templates/8-bit-orbit/template.html", - "selector_or_token": "role_mapping.body.source_font", - "raw_value": "Chakra Petch" - }, - { - "path": "beautiful-html-templates/templates/8-bit-orbit/design.md", - "selector_or_token": "design.typography.roles", - "raw_value": "px 0 rgba(15, 27, 61, 0.15)\" card-featured: \"8px 8px 0 {colors.neon-yellow}\" typography: pixel-hero: fontFamily: \"'Tektur', cursive\" fontSize: \"clamp(48px, 10vw, 128px)\" fontWeight: 900 lineHeight: 1.05 letterSpacing: 0.04em display: fontFamily: \"'Tektur', cursive\"" - } - ], - "role_mapping.display": [ - { - "path": "beautiful-html-templates/templates/8-bit-orbit/template.html", - "selector_or_token": "role_mapping.display.source_font", - "raw_value": "Tektur" - }, - { - "path": "beautiful-html-templates/templates/8-bit-orbit/design.md", - "selector_or_token": "design.typography.roles", - "raw_value": "px 0 rgba(15, 27, 61, 0.15)\" card-featured: \"8px 8px 0 {colors.neon-yellow}\" typography: pixel-hero: fontFamily: \"'Tektur', cursive\" fontSize: \"clamp(48px, 10vw, 128px)\" fontWeight: 900 lineHeight: 1.05 letterSpacing: 0.04em display: fontFamily: \"'Tektur', cursive\"" - } - ], - "source_fonts": [ - { - "path": "beautiful-html-templates/templates/8-bit-orbit/template.html", - "selector_or_token": "css.font-family", - "raw_value": "'Noto Sans SC', sans-serif`. 思源黑体 ships Latin glyphs that read cleanly alongside Chinese characters, so a sentence like `使用 Tektur 字体` renders in one consistent face rather than font-switching mid-word. This system normally runs three faces (display / body / HUD); var(--font-body); var(--font-display); var(--font-mono)" - } - ], "adobe_or_embedded_fallback": [ { "path": "beautiful-html-templates/templates/8-bit-orbit/template.html", - "selector_or_token": "css.font-family", - "raw_value": "'Noto Sans SC', sans-serif`. 思源黑体 ships Latin glyphs that read cleanly alongside Chinese characters, so a sentence like `使用 Tektur 字体` renders in one consistent face rather than font-switching mid-word. This system normally runs three faces (display / body / HUD); var(--font-body); var(--font-display); var(--font-mono)" + "raw_value": "'Noto Sans SC', sans-serif`. 思源黑体 ships Latin glyphs that read cleanly alongside Chinese characters, so a sentence like `使用 Tektur 字体` renders in one consistent face rather than font-switching mid-word. This system normally runs three faces (display / body / HUD); var(--font-body); var(--font-display); var(--font-mono)", + "selector_or_token": "css.font-family" } ], "cjk_fallback": [ { "path": "beautiful-html-templates/templates/8-bit-orbit/template.html", - "selector_or_token": "css.font-family", - "raw_value": "'Noto Sans SC', sans-serif`. 思源黑体 ships Latin glyphs that read cleanly alongside Chinese characters, so a sentence like `使用 Tektur 字体` renders in one consistent face rather than font-switching mid-word. This system normally runs three faces (display / body / HUD); var(--font-body); var(--font-display); var(--font-mono)" - } - ], - "role_mapping.metric": [ - { - "path": "beautiful-html-templates/templates/8-bit-orbit/template.html", - "selector_or_token": "role_mapping.metric.source_font", - "raw_value": "Space Mono" - }, - { - "path": "beautiful-html-templates/templates/8-bit-orbit/design.md", - "selector_or_token": "design.typography.roles", - "raw_value": "px 0 rgba(15, 27, 61, 0.15)\" card-featured: \"8px 8px 0 {colors.neon-yellow}\" typography: pixel-hero: fontFamily: \"'Tektur', cursive\" fontSize: \"clamp(48px, 10vw, 128px)\" fontWeight: 900 lineHeight: 1.05 letterSpacing: 0.04em display: fontFamily: \"'Tektur', cursive\"" + "raw_value": "'Noto Sans SC', sans-serif`. 思源黑体 ships Latin glyphs that read cleanly alongside Chinese characters, so a sentence like `使用 Tektur 字体` renders in one consistent face rather than font-switching mid-word. This system normally runs three faces (display / body / HUD); var(--font-body); var(--font-display); var(--font-mono)", + "selector_or_token": "css.font-family" } ], "forbidden": [ { "path": "beautiful-html-templates/templates/8-bit-orbit/template.html", - "selector_or_token": "css.font-family", - "raw_value": "'Noto Sans SC', sans-serif`. 思源黑体 ships Latin glyphs that read cleanly alongside Chinese characters, so a sentence like `使用 Tektur 字体` renders in one consistent face rather than font-switching mid-word. This system normally runs three faces (display / body / HUD); var(--font-body); var(--font-display); var(--font-mono)" - } - ], - "slide_native_preferred": [ - { - "path": "beautiful-html-templates/templates/8-bit-orbit/template.html", - "selector_or_token": "css.font-family", - "raw_value": "'Noto Sans SC', sans-serif`. 思源黑体 ships Latin glyphs that read cleanly alongside Chinese characters, so a sentence like `使用 Tektur 字体` renders in one consistent face rather than font-switching mid-word. This system normally runs three faces (display / body / HUD); var(--font-body); var(--font-display); var(--font-mono)" + "raw_value": "'Noto Sans SC', sans-serif`. 思源黑体 ships Latin glyphs that read cleanly alongside Chinese characters, so a sentence like `使用 Tektur 字体` renders in one consistent face rather than font-switching mid-word. This system normally runs three faces (display / body / HUD); var(--font-body); var(--font-display); var(--font-mono)", + "selector_or_token": "css.font-family" } ], "mapping_reason": [ { "path": "beautiful-html-templates/templates/8-bit-orbit/template.html", - "selector_or_token": "css.font-family", - "raw_value": "'Noto Sans SC', sans-serif`. 思源黑体 ships Latin glyphs that read cleanly alongside Chinese characters, so a sentence like `使用 Tektur 字体` renders in one consistent face rather than font-switching mid-word. This system normally runs three faces (display / body / HUD); var(--font-body); var(--font-display); var(--font-mono)" + "raw_value": "'Noto Sans SC', sans-serif`. 思源黑体 ships Latin glyphs that read cleanly alongside Chinese characters, so a sentence like `使用 Tektur 字体` renders in one consistent face rather than font-switching mid-word. This system normally runs three faces (display / body / HUD); var(--font-body); var(--font-display); var(--font-mono)", + "selector_or_token": "css.font-family" + } + ], + "role_mapping.body": [ + { + "path": "beautiful-html-templates/templates/8-bit-orbit/template.html", + "raw_value": "Chakra Petch", + "selector_or_token": "role_mapping.body.source_font" + }, + { + "path": "beautiful-html-templates/templates/8-bit-orbit/design.md", + "raw_value": "px 0 rgba(15, 27, 61, 0.15)\" card-featured: \"8px 8px 0 {colors.neon-yellow}\" typography: pixel-hero: fontFamily: \"'Tektur', cursive\" fontSize: \"clamp(48px, 10vw, 128px)\" fontWeight: 900 lineHeight: 1.05 letterSpacing: 0.04em display: fontFamily: \"'Tektur', cursive\"", + "selector_or_token": "design.typography.roles" + } + ], + "role_mapping.display": [ + { + "path": "beautiful-html-templates/templates/8-bit-orbit/template.html", + "raw_value": "Tektur", + "selector_or_token": "role_mapping.display.source_font" + }, + { + "path": "beautiful-html-templates/templates/8-bit-orbit/design.md", + "raw_value": "px 0 rgba(15, 27, 61, 0.15)\" card-featured: \"8px 8px 0 {colors.neon-yellow}\" typography: pixel-hero: fontFamily: \"'Tektur', cursive\" fontSize: \"clamp(48px, 10vw, 128px)\" fontWeight: 900 lineHeight: 1.05 letterSpacing: 0.04em display: fontFamily: \"'Tektur', cursive\"", + "selector_or_token": "design.typography.roles" } ], "role_mapping.label": [ { "path": "beautiful-html-templates/templates/8-bit-orbit/template.html", - "selector_or_token": "role_mapping.label.source_font", - "raw_value": "Space Mono" + "raw_value": "Space Mono", + "selector_or_token": "role_mapping.label.source_font" }, { "path": "beautiful-html-templates/templates/8-bit-orbit/design.md", - "selector_or_token": "design.typography.roles", - "raw_value": "px 0 rgba(15, 27, 61, 0.15)\" card-featured: \"8px 8px 0 {colors.neon-yellow}\" typography: pixel-hero: fontFamily: \"'Tektur', cursive\" fontSize: \"clamp(48px, 10vw, 128px)\" fontWeight: 900 lineHeight: 1.05 letterSpacing: 0.04em display: fontFamily: \"'Tektur', cursive\"" + "raw_value": "px 0 rgba(15, 27, 61, 0.15)\" card-featured: \"8px 8px 0 {colors.neon-yellow}\" typography: pixel-hero: fontFamily: \"'Tektur', cursive\" fontSize: \"clamp(48px, 10vw, 128px)\" fontWeight: 900 lineHeight: 1.05 letterSpacing: 0.04em display: fontFamily: \"'Tektur', cursive\"", + "selector_or_token": "design.typography.roles" + } + ], + "role_mapping.metric": [ + { + "path": "beautiful-html-templates/templates/8-bit-orbit/template.html", + "raw_value": "Space Mono", + "selector_or_token": "role_mapping.metric.source_font" + }, + { + "path": "beautiful-html-templates/templates/8-bit-orbit/design.md", + "raw_value": "px 0 rgba(15, 27, 61, 0.15)\" card-featured: \"8px 8px 0 {colors.neon-yellow}\" typography: pixel-hero: fontFamily: \"'Tektur', cursive\" fontSize: \"clamp(48px, 10vw, 128px)\" fontWeight: 900 lineHeight: 1.05 letterSpacing: 0.04em display: fontFamily: \"'Tektur', cursive\"", + "selector_or_token": "design.typography.roles" + } + ], + "slide_native_preferred": [ + { + "path": "beautiful-html-templates/templates/8-bit-orbit/template.html", + "raw_value": "'Noto Sans SC', sans-serif`. 思源黑体 ships Latin glyphs that read cleanly alongside Chinese characters, so a sentence like `使用 Tektur 字体` renders in one consistent face rather than font-switching mid-word. This system normally runs three faces (display / body / HUD); var(--font-body); var(--font-display); var(--font-mono)", + "selector_or_token": "css.font-family" + } + ], + "source_fonts": [ + { + "path": "beautiful-html-templates/templates/8-bit-orbit/template.html", + "raw_value": "'Noto Sans SC', sans-serif`. 思源黑体 ships Latin glyphs that read cleanly alongside Chinese characters, so a sentence like `使用 Tektur 字体` renders in one consistent face rather than font-switching mid-word. This system normally runs three faces (display / body / HUD); var(--font-body); var(--font-display); var(--font-mono)", + "selector_or_token": "css.font-family" } ] } }, + "golden_spec": "skills/lark-slides/scripts/fixtures/svglide_artboard/golden/pixel-orbit-console.canvas-spec.json", + "implemented_page_variants": [ + "slide-1", + "slide-2", + "slide-3", + "slide-4", + "slide-5", + "slide-6", + "slide-7", + "slide-8", + "slide-9", + "slide-10" + ], + "loss_notes": [ + "italic is source-aware but CJK fake italic is forbidden; use color/weight fallback when unavailable", + "letter spacing is preserved for Latin labels and reset/softened for CJK" + ], + "page_family_implementation_note": "Implements the 10 source slides from 8-bit-orbit/template.html as explicit pixel-orbit-console variants. Smoke evidence covers source variants and production role aliases but does not promote the family.", + "page_family_smoke_deck": "skills/lark-slides/references/page-family-smoke-decks/8-bit-orbit.json", + "page_family_smoke_receipt": "skills/lark-slides/references/receipts/page-family-smoke/8-bit-orbit.pixel-orbit-console.json", + "page_family_source": { + "claim_boundary": "source extraction only; does not imply renderer, fidelity, quality gate, or production/default selectable status", + "extractor": "skills/lark-slides/scripts/beautiful_template_page_family_extract.py", + "source_design_md": "beautiful-html-templates/templates/8-bit-orbit/design.md", + "source_template_html": "beautiful-html-templates/templates/8-bit-orbit/template.html", + "source_template_json": "beautiful-html-templates/templates/8-bit-orbit/template.json" + }, + "page_variant_count": 10, + "page_variant_golden_specs": { + "slide-1": "skills/lark-slides/scripts/fixtures/svglide_artboard/golden/8-bit-orbit.slide-1.canvas-spec.json", + "slide-10": "skills/lark-slides/scripts/fixtures/svglide_artboard/golden/8-bit-orbit.slide-10.canvas-spec.json", + "slide-2": "skills/lark-slides/scripts/fixtures/svglide_artboard/golden/8-bit-orbit.slide-2.canvas-spec.json", + "slide-3": "skills/lark-slides/scripts/fixtures/svglide_artboard/golden/8-bit-orbit.slide-3.canvas-spec.json", + "slide-4": "skills/lark-slides/scripts/fixtures/svglide_artboard/golden/8-bit-orbit.slide-4.canvas-spec.json", + "slide-5": "skills/lark-slides/scripts/fixtures/svglide_artboard/golden/8-bit-orbit.slide-5.canvas-spec.json", + "slide-6": "skills/lark-slides/scripts/fixtures/svglide_artboard/golden/8-bit-orbit.slide-6.canvas-spec.json", + "slide-7": "skills/lark-slides/scripts/fixtures/svglide_artboard/golden/8-bit-orbit.slide-7.canvas-spec.json", + "slide-8": "skills/lark-slides/scripts/fixtures/svglide_artboard/golden/8-bit-orbit.slide-8.canvas-spec.json", + "slide-9": "skills/lark-slides/scripts/fixtures/svglide_artboard/golden/8-bit-orbit.slide-9.canvas-spec.json" + }, + "planned_fidelity_receipt": "skills/lark-slides/references/receipts/template-fidelity/8-bit-orbit.pixel-orbit-console.json", + "planned_golden_spec": "skills/lark-slides/scripts/fixtures/svglide_artboard/golden/pixel-orbit-console.canvas-spec.json", + "planned_renderer_module": "skills/lark-slides/scripts/artboard_renderer/templates/beautiful/pixel-orbit-console.mjs", + "promotion_status": "needs_review", + "reference_screenshot": "beautiful-html-templates/screenshots/8-bit-orbit-1.png", + "renderer_id": "artboard_satori.pixel-orbit-console", + "renderer_module": "skills/lark-slides/scripts/artboard_renderer/templates/beautiful/pixel-orbit-console.mjs", + "runtime_template_id": "pixel-orbit-console", + "satori": { + "font_and_typography_constraints": [ + "italic is source-aware but CJK fake italic is forbidden; use color/weight fallback when unavailable", + "letter spacing is preserved for Latin labels and reset/softened for CJK" + ] + }, + "source_design_md": "beautiful-html-templates/templates/8-bit-orbit/design.md", + "source_page_variants": [ + "slide-1", + "slide-10", + "slide-2", + "slide-3", + "slide-4", + "slide-5", + "slide-6", + "slide-7", + "slide-8", + "slide-9" + ], + "source_template_html": "beautiful-html-templates/templates/8-bit-orbit/template.html", + "source_template_json": "beautiful-html-templates/templates/8-bit-orbit/template.json", + "source_trace": [ + { + "evidence": "source_template_html", + "source": "beautiful-html-templates/templates/8-bit-orbit/template.html" + }, + { + "evidence": "source_design_md", + "source": "beautiful-html-templates/templates/8-bit-orbit/design.md" + }, + { + "evidence": "source_template_json", + "source": "beautiful-html-templates/templates/8-bit-orbit/template.json" + }, + { + "evidence": "reference_screenshot", + "source": "beautiful-html-templates/screenshots/8-bit-orbit-1.png" + }, + { + "evidence": "absorption_record", + "source": "skills/lark-slides/references/absorptions/beautiful-html-templates/8-bit-orbit.pixel-orbit-console.json" + }, + { + "evidence": "template_fidelity_receipt", + "source": "skills/lark-slides/references/receipts/template-fidelity/8-bit-orbit.pixel-orbit-console.json" + } + ], + "template_id": "pixel-orbit-console", + "text_budget_by_variant": { + "slide-1": { + "body_max_lines": 4, + "title_max_lines": 2 + }, + "slide-10": { + "body_max_lines": 4, + "title_max_lines": 2 + }, + "slide-2": { + "body_max_lines": 8, + "title_max_lines": 3 + }, + "slide-3": { + "item_body_max_lines": 3, + "title_max_lines": 2 + }, + "slide-4": { + "chart_label_max_lines": 1, + "title_max_lines": 3 + }, + "slide-5": { + "chart_label_max_lines": 1, + "title_max_lines": 2 + }, + "slide-6": { + "timeline_body_max_lines": 2, + "title_max_lines": 2 + }, + "slide-7": { + "metric_label_max_lines": 2, + "title_max_lines": 2 + }, + "slide-8": { + "author_max_lines": 1, + "quote_max_lines": 7 + }, + "slide-9": { + "tier_feature_max_lines": 1, + "title_max_lines": 2 + } + }, + "text_style_strategy": { + "bold": { + "allowed_roles": [ + "display", + "label", + "metric" + ], + "mapped_weight": { + "display": 900, + "label": 700, + "metric": 900 + }, + "source_usage": "source uses heavy display/label weights" + }, + "emphasis": { + "color_shift": "use source accent color roles only", + "font_family_switch": "only switch between mapped display/body/label/metric roles from this family", + "style_shift": "italic only when source_usage requires and CJK fallback is safe", + "weight_shift": "increase one role step within font_weight_scale" + }, + "extraction_confidence": { + "bold": "css_extracted_from_template_html", + "emphasis": "inferred_from_layout", + "forbidden": "inferred_from_layout", + "italic": "css_extracted_from_template_html", + "line_through": "absent_use_default", + "text_decoration_policy.line_through.color": "absent_use_default", + "text_decoration_policy.line_through.style": "absent_use_default", + "text_decoration_policy.line_through.thickness": "absent_use_default", + "text_decoration_policy.underline.color": "absent_use_default", + "text_decoration_policy.underline.style": "absent_use_default", + "text_decoration_policy.underline.thickness": "absent_use_default", + "underline": "absent_use_default" + }, + "forbidden": [ + "fake_cjk_italic", + "drop_source_text_transform", + "drop_source_letter_spacing_without_loss_note", + "use_cross_family_font_motif", + "remote_font_dependency_without_receipt" + ], + "italic": { + "fallback_when_unavailable": "use color_shift or weight_shift; do not fake CJK italic", + "loss_notes": "Satori/Slide may not provide exact Google italic face; record as visual approximation.", + "mapped_style": "latin_only_when_source_requires_else_normal", + "source_usage": "source uses italic/font-style or italic-family tokens" + }, + "line_through": { + "fallback_shape": "none", + "mapped_decoration": "none", + "source_usage": "not present in source; default no line-through" + }, + "source_refs": { + "bold": [ + { + "path": "beautiful-html-templates/templates/8-bit-orbit/template.html", + "raw_value": "700; 900; 400; 500", + "selector_or_token": "css.font-weight" + } + ], + "emphasis": [ + { + "path": "beautiful-html-templates/templates/8-bit-orbit/template.html", + "raw_value": "ml, body { width: 100%; height: 100%; overflow: hidden; font-family: var(--font-body); color: var(--dark-void); background: var(--dark-void); } /* Scroll behavior for slide navigation */ .deck { width: 100%; height: 100vh; overflow:", + "selector_or_token": "template.css.typography" + } + ], + "forbidden": [ + { + "path": "beautiful-html-templates/templates/8-bit-orbit/template.html", + "raw_value": "ml, body { width: 100%; height: 100%; overflow: hidden; font-family: var(--font-body); color: var(--dark-void); background: var(--dark-void); } /* Scroll behavior for slide navigation */ .deck { width: 100%; height: 100vh; overflow:", + "selector_or_token": "template.css.typography" + } + ], + "italic": [ + { + "path": "beautiful-html-templates/templates/8-bit-orbit/template.html", + "raw_value": "les to a different face flattens the system into a generic dark-mode aesthetic. Italic is never used in display or body — the only italic that appears anywhere is implicit in the slight tilt on pixel-art decorative elements. Tektur should always feel **planted** — left-aligned, generous line-height", + "selector_or_token": "css.font-style" + } + ] + }, + "text_decoration_policy": { + "line_through": { + "color": "currentColor", + "style": "none", + "thickness": "0px" + }, + "underline": { + "color": "currentColor", + "style": "none", + "thickness": "0px" + } + }, + "underline": { + "fallback_shape": "1px-3px rule or border accent when underline font rendering is unavailable", + "mapped_decoration": "native underline only for actual text-decoration source usage", + "source_usage": "not a dominant source motif" + } + }, "typography_strategy": { + "alignment": { + "fallback": "left/top aligned unless source screenshot is centered", + "primary": "follow source composition" + }, + "cjk_typography_adjustment": { + "body_font_cn": "Noto Sans SC", + "display_font_cn": "Noto Sans SC", + "italic_policy": "weight_only_emphasis", + "letter_spacing_policy": "reset_letter_spacing_for_cjk_keep_latin_labels", + "mixed_run_spacing": "pangu_spacing" + }, + "extraction_confidence": { + "alignment": "inferred_from_layout", + "cjk_typography_adjustment": "inferred_from_layout", + "font_size_scale": "css_extracted_from_template_html", + "font_weight_scale": "css_extracted_from_template_html", + "hierarchy_ratio": "inferred_from_layout", + "letter_spacing_scale": "css_extracted_from_template_html", + "line_height_scale": "css_extracted_from_template_html", + "mapping_reason": "inferred_from_layout", + "max_lines": "inferred_from_layout", + "measure": "inferred_from_layout", + "paragraph_spacing": "css_extracted_from_template_html", + "role_mapping.body": "inferred_from_layout", + "role_mapping.display": "inferred_from_layout", + "role_mapping.label": "inferred_from_layout", + "role_mapping.metric": "inferred_from_layout", + "source_typography_tokens": "css_extracted_from_template_html", + "text_direction": "css_extracted_from_template_html", + "text_transform_policy": "css_extracted_from_template_html", + "word_spacing": "absent_use_default", + "wrapping_policy": "inferred_from_layout", + "writing_mode": "absent_use_default" + }, + "font_size_scale": { + "body": 20, + "display": 54, + "label": 12, + "metric": 42 + }, + "font_weight_scale": { + "body": 400, + "display": 900, + "label": 700, + "metric": 900 + }, + "hierarchy_ratio": 2.7, + "letter_spacing_scale": { + "body": 0, + "display": 0, + "label": 0.08, + "metric": 0 + }, + "line_height_scale": { + "body": 1.32, + "display": 0.9, + "label": 1.05, + "metric": 0.95 + }, + "mapping_reason": "按源模板字号/字重/行高/字距/大小写规则抽象到 960x540 Slide 画布的四个文本角色。", + "max_lines": { + "body": 5, + "display": 3, + "label": 1, + "metric": 2 + }, + "measure": { + "body": "40-70 characters or CJK equivalent", + "display": "0.55-0.78 canvas width", + "label": "short mono labels", + "metric": "short numeric/stat blocks" + }, + "paragraph_spacing": { + "body_after": 12, + "display_after": 0, + "label_after": 0, + "metric_after": 0 + }, + "role_mapping": { + "body": { + "alignment": "source_layout_dependent", + "font_role": "body", + "font_size": 20, + "font_weight": 400, + "letter_spacing": 0, + "line_height": 1.32, + "max_lines": 5, + "runtime_alias": "SVGlideBody", + "source_font": "Chakra Petch", + "text_transform": "preserve_source_case" + }, + "display": { + "alignment": "source_layout_dependent", + "font_role": "display", + "font_size": 54, + "font_weight": 900, + "letter_spacing": 0, + "line_height": 0.9, + "max_lines": 3, + "runtime_alias": "SVGlideDisplay", + "source_font": "Tektur", + "text_transform": "latin_uppercase_only" + }, + "label": { + "alignment": "source_layout_dependent", + "font_role": "label", + "font_size": 12, + "font_weight": 700, + "letter_spacing": 0.08, + "line_height": 1.05, + "max_lines": 1, + "runtime_alias": "SVGlideLabel", + "source_font": "Space Mono", + "text_transform": "latin_uppercase_labels_reset_cjk_spacing" + }, + "metric": { + "alignment": "source_layout_dependent", + "font_role": "metric", + "font_size": 42, + "font_weight": 900, + "letter_spacing": 0, + "line_height": 0.95, + "max_lines": 2, + "runtime_alias": "SVGlideMetric", + "source_font": "Space Mono", + "text_transform": "preserve_numbers_and_units" + } + }, + "source_refs": { + "alignment": [ + { + "path": "beautiful-html-templates/templates/8-bit-orbit/template.html", + "raw_value": "ml, body { width: 100%; height: 100%; overflow: hidden; font-family: var(--font-body); color: var(--dark-void); background: var(--dark-void); } /* Scroll behavior for slide navigation */ .deck { width: 100%; height: 100vh; overflow:", + "selector_or_token": "template.css.typography" + } + ], + "cjk_typography_adjustment": [ + { + "path": "beautiful-html-templates/templates/8-bit-orbit/template.html", + "raw_value": "ml, body { width: 100%; height: 100%; overflow: hidden; font-family: var(--font-body); color: var(--dark-void); background: var(--dark-void); } /* Scroll behavior for slide navigation */ .deck { width: 100%; height: 100vh; overflow:", + "selector_or_token": "template.css.typography" + } + ], + "font_size_scale": [ + { + "path": "beautiful-html-templates/templates/8-bit-orbit/template.html", + "raw_value": "1rem; clamp(3rem, 10vw, 8rem); 0.75rem; clamp(2rem, 5vw, 4rem); clamp(1.5rem, 3.5vw, 2.8rem); clamp(1.1rem, 2vw, 1.5rem); clamp(0.9rem, 1.2vw, 1.15rem); 0.8rem; 0.85rem; clamp(0.9rem, 1.5vw, 1.2rem); 0.7rem; 1.1rem; clamp(2rem, 4vw, 3.5rem); 8rem; clamp(1.1rem, 2.2vw, 1.6rem); 1.2rem", + "selector_or_token": "css.font_size_scale" + } + ], + "font_weight_scale": [ + { + "path": "beautiful-html-templates/templates/8-bit-orbit/template.html", + "raw_value": "700; 900; 400; 500", + "selector_or_token": "css.font_weight_scale" + } + ], + "hierarchy_ratio": [ + { + "path": "beautiful-html-templates/templates/8-bit-orbit/template.html", + "raw_value": "ml, body { width: 100%; height: 100%; overflow: hidden; font-family: var(--font-body); color: var(--dark-void); background: var(--dark-void); } /* Scroll behavior for slide navigation */ .deck { width: 100%; height: 100vh; overflow:", + "selector_or_token": "template.css.typography" + } + ], + "letter_spacing_scale": [ + { + "path": "beautiful-html-templates/templates/8-bit-orbit/template.html", + "raw_value": "0.08em; 0.04em; 0.2em; 0.15em; 0.3em; 0.1em; 0.05em; 0.12em", + "selector_or_token": "css.letter_spacing_scale" + } + ], + "line_height_scale": [ + { + "path": "beautiful-html-templates/templates/8-bit-orbit/template.html", + "raw_value": "1.05; 1.15; 1.7; 1.8; 1.6; 1.5; 1", + "selector_or_token": "css.line_height_scale" + } + ], + "mapping_reason": [ + { + "path": "beautiful-html-templates/templates/8-bit-orbit/template.html", + "raw_value": "ml, body { width: 100%; height: 100%; overflow: hidden; font-family: var(--font-body); color: var(--dark-void); background: var(--dark-void); } /* Scroll behavior for slide navigation */ .deck { width: 100%; height: 100vh; overflow:", + "selector_or_token": "template.css.typography" + } + ], + "max_lines": [ + { + "path": "beautiful-html-templates/templates/8-bit-orbit/template.html", + "raw_value": "ml, body { width: 100%; height: 100%; overflow: hidden; font-family: var(--font-body); color: var(--dark-void); background: var(--dark-void); } /* Scroll behavior for slide navigation */ .deck { width: 100%; height: 100vh; overflow:", + "selector_or_token": "template.css.typography" + } + ], + "measure": [ + { + "path": "beautiful-html-templates/templates/8-bit-orbit/template.html", + "raw_value": "ml, body { width: 100%; height: 100%; overflow: hidden; font-family: var(--font-body); color: var(--dark-void); background: var(--dark-void); } /* Scroll behavior for slide navigation */ .deck { width: 100%; height: 100vh; overflow:", + "selector_or_token": "template.css.typography" + } + ], + "paragraph_spacing": [ + { + "path": "beautiful-html-templates/templates/8-bit-orbit/template.html", + "raw_value": "1.5rem; 22px; 8px; 3rem; 0.5rem; 4px; 20px; 24px; 1rem; 2.5rem; 1.2rem; 12px; 16px; 4vw; 24px; 20px; 32px; 0", + "selector_or_token": "css.paragraph_spacing" + } + ], + "role_mapping.body": [ + { + "path": "beautiful-html-templates/templates/8-bit-orbit/template.html", + "raw_value": "Chakra Petch", + "selector_or_token": "role_mapping.body.source_font" + }, + { + "path": "beautiful-html-templates/templates/8-bit-orbit/design.md", + "raw_value": "px 0 rgba(15, 27, 61, 0.15)\" card-featured: \"8px 8px 0 {colors.neon-yellow}\" typography: pixel-hero: fontFamily: \"'Tektur', cursive\" fontSize: \"clamp(48px, 10vw, 128px)\" fontWeight: 900 lineHeight: 1.05 letterSpacing: 0.04em display: fontFamily: \"'Tektur', cursive\"", + "selector_or_token": "design.typography.roles" + } + ], + "role_mapping.display": [ + { + "path": "beautiful-html-templates/templates/8-bit-orbit/template.html", + "raw_value": "Tektur", + "selector_or_token": "role_mapping.display.source_font" + }, + { + "path": "beautiful-html-templates/templates/8-bit-orbit/design.md", + "raw_value": "px 0 rgba(15, 27, 61, 0.15)\" card-featured: \"8px 8px 0 {colors.neon-yellow}\" typography: pixel-hero: fontFamily: \"'Tektur', cursive\" fontSize: \"clamp(48px, 10vw, 128px)\" fontWeight: 900 lineHeight: 1.05 letterSpacing: 0.04em display: fontFamily: \"'Tektur', cursive\"", + "selector_or_token": "design.typography.roles" + } + ], + "role_mapping.label": [ + { + "path": "beautiful-html-templates/templates/8-bit-orbit/template.html", + "raw_value": "Space Mono", + "selector_or_token": "role_mapping.label.source_font" + }, + { + "path": "beautiful-html-templates/templates/8-bit-orbit/design.md", + "raw_value": "px 0 rgba(15, 27, 61, 0.15)\" card-featured: \"8px 8px 0 {colors.neon-yellow}\" typography: pixel-hero: fontFamily: \"'Tektur', cursive\" fontSize: \"clamp(48px, 10vw, 128px)\" fontWeight: 900 lineHeight: 1.05 letterSpacing: 0.04em display: fontFamily: \"'Tektur', cursive\"", + "selector_or_token": "design.typography.roles" + } + ], + "role_mapping.metric": [ + { + "path": "beautiful-html-templates/templates/8-bit-orbit/template.html", + "raw_value": "Space Mono", + "selector_or_token": "role_mapping.metric.source_font" + }, + { + "path": "beautiful-html-templates/templates/8-bit-orbit/design.md", + "raw_value": "px 0 rgba(15, 27, 61, 0.15)\" card-featured: \"8px 8px 0 {colors.neon-yellow}\" typography: pixel-hero: fontFamily: \"'Tektur', cursive\" fontSize: \"clamp(48px, 10vw, 128px)\" fontWeight: 900 lineHeight: 1.05 letterSpacing: 0.04em display: fontFamily: \"'Tektur', cursive\"", + "selector_or_token": "design.typography.roles" + } + ], + "source_typography_tokens": [ + { + "path": "beautiful-html-templates/templates/8-bit-orbit/template.html", + "raw_value": "1rem; clamp(3rem, 10vw, 8rem); 0.75rem; clamp(2rem, 5vw, 4rem); clamp(1.5rem, 3.5vw, 2.8rem); clamp(1.1rem, 2vw, 1.5rem); clamp(0.9rem, 1.2vw, 1.15rem); 0.8rem; 0.85rem; clamp(0.9rem, 1.5vw, 1.2rem); 0.7rem; 1.1rem; clamp(2rem, 4vw, 3.5rem); 8rem; clamp(1.1rem, 2.2vw, 1.6rem); 1.2rem; 700; 900; 400; 500; 1.05; 1.15; 1.7; 1.8; 1.6; 1.5; 1; 0.08em; 0.04em; 0.2em; 0.15em; 0.3em; 0.1em; 0.05em; 0.12em; uppercase`; uppercase", + "selector_or_token": "css.source_typography_tokens" + } + ], + "text_direction": [ + { + "path": "beautiful-html-templates/templates/8-bit-orbit/template.html", + "raw_value": "column", + "selector_or_token": "css.text_direction" + } + ], + "text_transform_policy": [ + { + "path": "beautiful-html-templates/templates/8-bit-orbit/template.html", + "raw_value": "uppercase`; uppercase", + "selector_or_token": "css.text_transform_policy" + } + ], + "wrapping_policy": [ + { + "path": "beautiful-html-templates/templates/8-bit-orbit/template.html", + "raw_value": "ml, body { width: 100%; height: 100%; overflow: hidden; font-family: var(--font-body); color: var(--dark-void); background: var(--dark-void); } /* Scroll behavior for slide navigation */ .deck { width: 100%; height: 100vh; overflow:", + "selector_or_token": "template.css.typography" + } + ] + }, "source_typography_tokens": { "font_families": [ "Tektur", @@ -329,15 +753,6 @@ "400", "500" ], - "line_height": [ - "1.05", - "1.15", - "1", - "1.7", - "1.8", - "1.6", - "1.5" - ], "letter_spacing": [ "0.04em", "0.2em", @@ -348,11 +763,15 @@ "0.08em", "0.12em" ], - "text_transform": [ - "uppercase", - "uppercase`" + "line_height": [ + "1.05", + "1.15", + "1", + "1.7", + "1.8", + "1.6", + "1.5" ], - "word_spacing": [], "paragraph_spacing": [ "1.5rem", "22px", @@ -373,515 +792,45 @@ "32px", "0" ], + "text_decoration": [], "text_direction": [ "column" ], - "writing_mode": [], - "text_decoration": [] + "text_transform": [ + "uppercase", + "uppercase`" + ], + "word_spacing": [], + "writing_mode": [] }, - "role_mapping": { - "display": { - "font_role": "display", - "source_font": "Tektur", - "runtime_alias": "SVGlideDisplay", - "font_size": 54, - "font_weight": 900, - "line_height": 0.9, - "letter_spacing": 0, - "text_transform": "latin_uppercase_only", - "max_lines": 3, - "alignment": "source_layout_dependent" - }, - "body": { - "font_role": "body", - "source_font": "Chakra Petch", - "runtime_alias": "SVGlideBody", - "font_size": 20, - "font_weight": 400, - "line_height": 1.32, - "letter_spacing": 0, - "text_transform": "preserve_source_case", - "max_lines": 5, - "alignment": "source_layout_dependent" - }, - "label": { - "font_role": "label", - "source_font": "Space Mono", - "runtime_alias": "SVGlideLabel", - "font_size": 12, - "font_weight": 700, - "line_height": 1.05, - "letter_spacing": 0.08, - "text_transform": "latin_uppercase_labels_reset_cjk_spacing", - "max_lines": 1, - "alignment": "source_layout_dependent" - }, - "metric": { - "font_role": "metric", - "source_font": "Space Mono", - "runtime_alias": "SVGlideMetric", - "font_size": 42, - "font_weight": 900, - "line_height": 0.95, - "letter_spacing": 0, - "text_transform": "preserve_numbers_and_units", - "max_lines": 2, - "alignment": "source_layout_dependent" - } - }, - "font_size_scale": { - "display": 54, - "body": 20, - "label": 12, - "metric": 42 - }, - "font_weight_scale": { - "display": 900, - "body": 400, - "label": 700, - "metric": 900 - }, - "line_height_scale": { - "display": 0.9, - "body": 1.32, - "label": 1.05, - "metric": 0.95 - }, - "letter_spacing_scale": { - "display": 0, - "body": 0, - "label": 0.08, - "metric": 0 + "text_direction": { + "cjk": "ltr", + "default": "column" }, "text_transform_policy": { - "display": "latin_uppercase_only", "body": "preserve_source_case", + "display": "latin_uppercase_only", "label": "latin_uppercase_labels_reset_cjk_spacing", "metric": "preserve_numbers_and_units" }, - "hierarchy_ratio": 2.7, - "max_lines": { - "display": 3, - "body": 5, - "label": 1, - "metric": 2 - }, - "measure": { - "display": "0.55-0.78 canvas width", - "body": "40-70 characters or CJK equivalent", - "label": "short mono labels", - "metric": "short numeric/stat blocks" - }, - "alignment": { - "primary": "follow source composition", - "fallback": "left/top aligned unless source screenshot is centered" - }, - "cjk_typography_adjustment": { - "display_font_cn": "Noto Sans SC", - "body_font_cn": "Noto Sans SC", - "letter_spacing_policy": "reset_letter_spacing_for_cjk_keep_latin_labels", - "mixed_run_spacing": "pangu_spacing", - "italic_policy": "weight_only_emphasis" - }, - "mapping_reason": "按源模板字号/字重/行高/字距/大小写规则抽象到 960x540 Slide 画布的四个文本角色。", "word_spacing": { - "display": 0, "body": 0, + "display": 0, "label": 0, "metric": 0 }, - "paragraph_spacing": { - "display_after": 0, - "body_after": 12, - "label_after": 0, - "metric_after": 0 - }, "wrapping_policy": { - "display": "manual_break_or_balance", "body": "wrap_with_measure", + "display": "manual_break_or_balance", "label": "no_wrap_preferred", "metric": "no_wrap_preferred" }, - "text_direction": { - "default": "column", - "cjk": "ltr" - }, "writing_mode": { "default": "horizontal-tb", "vertical_roles": [] - }, - "extraction_confidence": { - "role_mapping.body": "inferred_from_layout", - "role_mapping.display": "inferred_from_layout", - "font_size_scale": "css_extracted_from_template_html", - "max_lines": "inferred_from_layout", - "writing_mode": "absent_use_default", - "text_direction": "css_extracted_from_template_html", - "alignment": "inferred_from_layout", - "role_mapping.label": "inferred_from_layout", - "paragraph_spacing": "css_extracted_from_template_html", - "text_transform_policy": "css_extracted_from_template_html", - "line_height_scale": "css_extracted_from_template_html", - "wrapping_policy": "inferred_from_layout", - "font_weight_scale": "css_extracted_from_template_html", - "source_typography_tokens": "css_extracted_from_template_html", - "word_spacing": "absent_use_default", - "role_mapping.metric": "inferred_from_layout", - "cjk_typography_adjustment": "inferred_from_layout", - "hierarchy_ratio": "inferred_from_layout", - "measure": "inferred_from_layout", - "mapping_reason": "inferred_from_layout", - "letter_spacing_scale": "css_extracted_from_template_html" - }, - "source_refs": { - "role_mapping.body": [ - { - "path": "beautiful-html-templates/templates/8-bit-orbit/template.html", - "selector_or_token": "role_mapping.body.source_font", - "raw_value": "Chakra Petch" - }, - { - "path": "beautiful-html-templates/templates/8-bit-orbit/design.md", - "selector_or_token": "design.typography.roles", - "raw_value": "px 0 rgba(15, 27, 61, 0.15)\" card-featured: \"8px 8px 0 {colors.neon-yellow}\" typography: pixel-hero: fontFamily: \"'Tektur', cursive\" fontSize: \"clamp(48px, 10vw, 128px)\" fontWeight: 900 lineHeight: 1.05 letterSpacing: 0.04em display: fontFamily: \"'Tektur', cursive\"" - } - ], - "role_mapping.display": [ - { - "path": "beautiful-html-templates/templates/8-bit-orbit/template.html", - "selector_or_token": "role_mapping.display.source_font", - "raw_value": "Tektur" - }, - { - "path": "beautiful-html-templates/templates/8-bit-orbit/design.md", - "selector_or_token": "design.typography.roles", - "raw_value": "px 0 rgba(15, 27, 61, 0.15)\" card-featured: \"8px 8px 0 {colors.neon-yellow}\" typography: pixel-hero: fontFamily: \"'Tektur', cursive\" fontSize: \"clamp(48px, 10vw, 128px)\" fontWeight: 900 lineHeight: 1.05 letterSpacing: 0.04em display: fontFamily: \"'Tektur', cursive\"" - } - ], - "font_size_scale": [ - { - "path": "beautiful-html-templates/templates/8-bit-orbit/template.html", - "selector_or_token": "css.font_size_scale", - "raw_value": "1rem; clamp(3rem, 10vw, 8rem); 0.75rem; clamp(2rem, 5vw, 4rem); clamp(1.5rem, 3.5vw, 2.8rem); clamp(1.1rem, 2vw, 1.5rem); clamp(0.9rem, 1.2vw, 1.15rem); 0.8rem; 0.85rem; clamp(0.9rem, 1.5vw, 1.2rem); 0.7rem; 1.1rem; clamp(2rem, 4vw, 3.5rem); 8rem; clamp(1.1rem, 2.2vw, 1.6rem); 1.2rem" - } - ], - "max_lines": [ - { - "path": "beautiful-html-templates/templates/8-bit-orbit/template.html", - "selector_or_token": "template.css.typography", - "raw_value": "ml, body { width: 100%; height: 100%; overflow: hidden; font-family: var(--font-body); color: var(--dark-void); background: var(--dark-void); } /* Scroll behavior for slide navigation */ .deck { width: 100%; height: 100vh; overflow:" - } - ], - "text_direction": [ - { - "path": "beautiful-html-templates/templates/8-bit-orbit/template.html", - "selector_or_token": "css.text_direction", - "raw_value": "column" - } - ], - "alignment": [ - { - "path": "beautiful-html-templates/templates/8-bit-orbit/template.html", - "selector_or_token": "template.css.typography", - "raw_value": "ml, body { width: 100%; height: 100%; overflow: hidden; font-family: var(--font-body); color: var(--dark-void); background: var(--dark-void); } /* Scroll behavior for slide navigation */ .deck { width: 100%; height: 100vh; overflow:" - } - ], - "role_mapping.label": [ - { - "path": "beautiful-html-templates/templates/8-bit-orbit/template.html", - "selector_or_token": "role_mapping.label.source_font", - "raw_value": "Space Mono" - }, - { - "path": "beautiful-html-templates/templates/8-bit-orbit/design.md", - "selector_or_token": "design.typography.roles", - "raw_value": "px 0 rgba(15, 27, 61, 0.15)\" card-featured: \"8px 8px 0 {colors.neon-yellow}\" typography: pixel-hero: fontFamily: \"'Tektur', cursive\" fontSize: \"clamp(48px, 10vw, 128px)\" fontWeight: 900 lineHeight: 1.05 letterSpacing: 0.04em display: fontFamily: \"'Tektur', cursive\"" - } - ], - "paragraph_spacing": [ - { - "path": "beautiful-html-templates/templates/8-bit-orbit/template.html", - "selector_or_token": "css.paragraph_spacing", - "raw_value": "1.5rem; 22px; 8px; 3rem; 0.5rem; 4px; 20px; 24px; 1rem; 2.5rem; 1.2rem; 12px; 16px; 4vw; 24px; 20px; 32px; 0" - } - ], - "text_transform_policy": [ - { - "path": "beautiful-html-templates/templates/8-bit-orbit/template.html", - "selector_or_token": "css.text_transform_policy", - "raw_value": "uppercase`; uppercase" - } - ], - "line_height_scale": [ - { - "path": "beautiful-html-templates/templates/8-bit-orbit/template.html", - "selector_or_token": "css.line_height_scale", - "raw_value": "1.05; 1.15; 1.7; 1.8; 1.6; 1.5; 1" - } - ], - "wrapping_policy": [ - { - "path": "beautiful-html-templates/templates/8-bit-orbit/template.html", - "selector_or_token": "template.css.typography", - "raw_value": "ml, body { width: 100%; height: 100%; overflow: hidden; font-family: var(--font-body); color: var(--dark-void); background: var(--dark-void); } /* Scroll behavior for slide navigation */ .deck { width: 100%; height: 100vh; overflow:" - } - ], - "font_weight_scale": [ - { - "path": "beautiful-html-templates/templates/8-bit-orbit/template.html", - "selector_or_token": "css.font_weight_scale", - "raw_value": "700; 900; 400; 500" - } - ], - "source_typography_tokens": [ - { - "path": "beautiful-html-templates/templates/8-bit-orbit/template.html", - "selector_or_token": "css.source_typography_tokens", - "raw_value": "1rem; clamp(3rem, 10vw, 8rem); 0.75rem; clamp(2rem, 5vw, 4rem); clamp(1.5rem, 3.5vw, 2.8rem); clamp(1.1rem, 2vw, 1.5rem); clamp(0.9rem, 1.2vw, 1.15rem); 0.8rem; 0.85rem; clamp(0.9rem, 1.5vw, 1.2rem); 0.7rem; 1.1rem; clamp(2rem, 4vw, 3.5rem); 8rem; clamp(1.1rem, 2.2vw, 1.6rem); 1.2rem; 700; 900; 400; 500; 1.05; 1.15; 1.7; 1.8; 1.6; 1.5; 1; 0.08em; 0.04em; 0.2em; 0.15em; 0.3em; 0.1em; 0.05em; 0.12em; uppercase`; uppercase" - } - ], - "role_mapping.metric": [ - { - "path": "beautiful-html-templates/templates/8-bit-orbit/template.html", - "selector_or_token": "role_mapping.metric.source_font", - "raw_value": "Space Mono" - }, - { - "path": "beautiful-html-templates/templates/8-bit-orbit/design.md", - "selector_or_token": "design.typography.roles", - "raw_value": "px 0 rgba(15, 27, 61, 0.15)\" card-featured: \"8px 8px 0 {colors.neon-yellow}\" typography: pixel-hero: fontFamily: \"'Tektur', cursive\" fontSize: \"clamp(48px, 10vw, 128px)\" fontWeight: 900 lineHeight: 1.05 letterSpacing: 0.04em display: fontFamily: \"'Tektur', cursive\"" - } - ], - "cjk_typography_adjustment": [ - { - "path": "beautiful-html-templates/templates/8-bit-orbit/template.html", - "selector_or_token": "template.css.typography", - "raw_value": "ml, body { width: 100%; height: 100%; overflow: hidden; font-family: var(--font-body); color: var(--dark-void); background: var(--dark-void); } /* Scroll behavior for slide navigation */ .deck { width: 100%; height: 100vh; overflow:" - } - ], - "hierarchy_ratio": [ - { - "path": "beautiful-html-templates/templates/8-bit-orbit/template.html", - "selector_or_token": "template.css.typography", - "raw_value": "ml, body { width: 100%; height: 100%; overflow: hidden; font-family: var(--font-body); color: var(--dark-void); background: var(--dark-void); } /* Scroll behavior for slide navigation */ .deck { width: 100%; height: 100vh; overflow:" - } - ], - "measure": [ - { - "path": "beautiful-html-templates/templates/8-bit-orbit/template.html", - "selector_or_token": "template.css.typography", - "raw_value": "ml, body { width: 100%; height: 100%; overflow: hidden; font-family: var(--font-body); color: var(--dark-void); background: var(--dark-void); } /* Scroll behavior for slide navigation */ .deck { width: 100%; height: 100vh; overflow:" - } - ], - "mapping_reason": [ - { - "path": "beautiful-html-templates/templates/8-bit-orbit/template.html", - "selector_or_token": "template.css.typography", - "raw_value": "ml, body { width: 100%; height: 100%; overflow: hidden; font-family: var(--font-body); color: var(--dark-void); background: var(--dark-void); } /* Scroll behavior for slide navigation */ .deck { width: 100%; height: 100vh; overflow:" - } - ], - "letter_spacing_scale": [ - { - "path": "beautiful-html-templates/templates/8-bit-orbit/template.html", - "selector_or_token": "css.letter_spacing_scale", - "raw_value": "0.08em; 0.04em; 0.2em; 0.15em; 0.3em; 0.1em; 0.05em; 0.12em" - } - ] } }, - "text_style_strategy": { - "bold": { - "source_usage": "source uses heavy display/label weights", - "mapped_weight": { - "display": 900, - "label": 700, - "metric": 900 - }, - "allowed_roles": [ - "display", - "label", - "metric" - ] - }, - "italic": { - "source_usage": "source uses italic/font-style or italic-family tokens", - "mapped_style": "latin_only_when_source_requires_else_normal", - "fallback_when_unavailable": "use color_shift or weight_shift; do not fake CJK italic", - "loss_notes": "Satori/Slide may not provide exact Google italic face; record as visual approximation." - }, - "underline": { - "source_usage": "not a dominant source motif", - "mapped_decoration": "native underline only for actual text-decoration source usage", - "fallback_shape": "1px-3px rule or border accent when underline font rendering is unavailable" - }, - "line_through": { - "source_usage": "not present in source; default no line-through", - "mapped_decoration": "none", - "fallback_shape": "none" - }, - "emphasis": { - "color_shift": "use source accent color roles only", - "font_family_switch": "only switch between mapped display/body/label/metric roles from this family", - "weight_shift": "increase one role step within font_weight_scale", - "style_shift": "italic only when source_usage requires and CJK fallback is safe" - }, - "text_decoration_policy": { - "underline": { - "style": "none", - "color": "currentColor", - "thickness": "0px" - }, - "line_through": { - "style": "none", - "color": "currentColor", - "thickness": "0px" - } - }, - "forbidden": [ - "fake_cjk_italic", - "drop_source_text_transform", - "drop_source_letter_spacing_without_loss_note", - "use_cross_family_font_motif", - "remote_font_dependency_without_receipt" - ], - "extraction_confidence": { - "text_decoration_policy.line_through.color": "absent_use_default", - "text_decoration_policy.underline.color": "absent_use_default", - "text_decoration_policy.line_through.style": "absent_use_default", - "italic": "css_extracted_from_template_html", - "forbidden": "inferred_from_layout", - "emphasis": "inferred_from_layout", - "text_decoration_policy.underline.thickness": "absent_use_default", - "underline": "absent_use_default", - "text_decoration_policy.line_through.thickness": "absent_use_default", - "line_through": "absent_use_default", - "text_decoration_policy.underline.style": "absent_use_default", - "bold": "css_extracted_from_template_html" - }, - "source_refs": { - "italic": [ - { - "path": "beautiful-html-templates/templates/8-bit-orbit/template.html", - "selector_or_token": "css.font-style", - "raw_value": "les to a different face flattens the system into a generic dark-mode aesthetic. Italic is never used in display or body — the only italic that appears anywhere is implicit in the slight tilt on pixel-art decorative elements. Tektur should always feel **planted** — left-aligned, generous line-height" - } - ], - "forbidden": [ - { - "path": "beautiful-html-templates/templates/8-bit-orbit/template.html", - "selector_or_token": "template.css.typography", - "raw_value": "ml, body { width: 100%; height: 100%; overflow: hidden; font-family: var(--font-body); color: var(--dark-void); background: var(--dark-void); } /* Scroll behavior for slide navigation */ .deck { width: 100%; height: 100vh; overflow:" - } - ], - "emphasis": [ - { - "path": "beautiful-html-templates/templates/8-bit-orbit/template.html", - "selector_or_token": "template.css.typography", - "raw_value": "ml, body { width: 100%; height: 100%; overflow: hidden; font-family: var(--font-body); color: var(--dark-void); background: var(--dark-void); } /* Scroll behavior for slide navigation */ .deck { width: 100%; height: 100vh; overflow:" - } - ], - "bold": [ - { - "path": "beautiful-html-templates/templates/8-bit-orbit/template.html", - "selector_or_token": "css.font-weight", - "raw_value": "700; 900; 400; 500" - } - ] - } - }, - "satori": { - "font_and_typography_constraints": [ - "italic is source-aware but CJK fake italic is forbidden; use color/weight fallback when unavailable", - "letter spacing is preserved for Latin labels and reset/softened for CJK" - ] - }, - "loss_notes": [ - "italic is source-aware but CJK fake italic is forbidden; use color/weight fallback when unavailable", - "letter spacing is preserved for Latin labels and reset/softened for CJK" - ], - "page_variant_count": 10, - "source_page_variants": [ - "slide-1", - "slide-10", - "slide-2", - "slide-3", - "slide-4", - "slide-5", - "slide-6", - "slide-7", - "slide-8", - "slide-9" - ], - "page_family_source": { - "extractor": "skills/lark-slides/scripts/beautiful_template_page_family_extract.py", - "source_template_html": "beautiful-html-templates/templates/8-bit-orbit/template.html", - "source_design_md": "beautiful-html-templates/templates/8-bit-orbit/design.md", - "source_template_json": "beautiful-html-templates/templates/8-bit-orbit/template.json", - "claim_boundary": "source extraction only; does not imply renderer, fidelity, quality gate, or production/default selectable status" - } - }, - { - "family_id": "biennale-yellow", - "template_id": "biennale-programme-poster", - "runtime_template_id": "biennale-programme-poster", - "source_template_html": "beautiful-html-templates/templates/biennale-yellow/template.html", - "source_design_md": "beautiful-html-templates/templates/biennale-yellow/design.md", - "source_template_json": "beautiful-html-templates/templates/biennale-yellow/template.json", - "renderer_id": "artboard_satori.biennale-programme-poster", - "renderer_module": "skills/lark-slides/scripts/artboard_renderer/templates/beautiful/biennale-programme-poster.mjs", - "golden_spec": "skills/lark-slides/scripts/fixtures/svglide_artboard/golden/biennale-programme-poster.canvas-spec.json", - "reference_screenshot": "beautiful-html-templates/screenshots/biennale-yellow-1.png", - "fidelity_receipt": "skills/lark-slides/references/receipts/template-fidelity/biennale-yellow.biennale-programme-poster.json", - "source_trace": [ - { - "source": "beautiful-html-templates/templates/biennale-yellow/template.html", - "evidence": "source_template_html" - }, - { - "source": "beautiful-html-templates/templates/biennale-yellow/design.md", - "evidence": "source_design_md" - }, - { - "source": "beautiful-html-templates/templates/biennale-yellow/template.json", - "evidence": "source_template_json" - }, - { - "source": "beautiful-html-templates/screenshots/biennale-yellow-1.png", - "evidence": "reference_screenshot" - }, - { - "source": "skills/lark-slides/references/absorptions/beautiful-html-templates/biennale-yellow.biennale-programme-poster.json", - "evidence": "absorption_record" - }, - { - "source": "skills/lark-slides/references/receipts/template-fidelity/biennale-yellow.biennale-programme-poster.json", - "evidence": "template_fidelity_receipt" - } - ], "visual_contract": { - "path": "skills/lark-slides/references/visual-contracts/beautiful/biennale-yellow.biennale-programme-poster.json", - "layout_rhythm": "biennale-yellow: medium density, high formality. Solar yellow on warm parchment with deep indigo serif and atmospheric sun-glow gradients.", - "motifs": [ - "grid", - "accent line", - "card panels", - "paper texture", - "window chrome", - "poster blocks", - "quote mark", - "sticker collage" - ], - "palette_roles": [ - "accent", - "background", - "border", - "muted", - "negative", - "positive", - "primary", - "surface", - "text" - ], "do_not_simplify": [ "preserve_fonts_palette_grid_slide_classes_decorative_elements", "do_not_recolor_without_explicit_brand_override", @@ -897,41 +846,53 @@ "do_not_mark_production_without_renderer_golden_fidelity_receipt", "do_not_strip_identity_decorations", "do_not_recolor_without_explicit_brand_override" - ] + ], + "layout_rhythm": "8-bit-orbit: medium density, low formality. Pixel-art neon arcade aesthetic on a deep navy void.", + "motifs": [ + "grid", + "accent line", + "card panels", + "paper texture", + "window chrome", + "poster blocks", + "quote mark", + "sticker collage", + "pixel motif" + ], + "palette_roles": [ + "accent", + "background", + "border", + "muted", + "negative", + "positive", + "primary", + "surface", + "text" + ], + "path": "skills/lark-slides/references/visual-contracts/beautiful/8-bit-orbit.pixel-orbit-console.json" }, - "fidelity_gate": { - "status": "passed", - "score": 0.7675, - "threshold": 0.72, - "reference_screenshot": "/Users/bytedance/bd-projects/beautiful-html-templates/screenshots/biennale-yellow-1.png", - "render_screenshot": "/Users/bytedance/bd-projects/workspaces/SVGlide/.worktrees/cli-svglide-svg-private/skills/lark-slides/scripts/fixtures/svglide_artboard/golden/biennale-programme-poster.preview.png", - "receipt_path": "skills/lark-slides/references/receipts/template-fidelity/biennale-yellow.biennale-programme-poster.json", - "issues": [] - }, - "promotion_status": "needs_review", - "default_selectable": false, + "visual_contract_path": "skills/lark-slides/references/visual-contracts/beautiful/8-bit-orbit.pixel-orbit-console.json" + }, + { "blocking_issues": [ "selector_gate_missing", "quality_gate_integration_pending", "production_review_pending" ], - "visual_contract_path": "skills/lark-slides/references/visual-contracts/beautiful/biennale-yellow.biennale-programme-poster.json", - "planned_renderer_module": "skills/lark-slides/scripts/artboard_renderer/templates/beautiful/biennale-programme-poster.mjs", - "planned_golden_spec": "skills/lark-slides/scripts/fixtures/svglide_artboard/golden/biennale-programme-poster.canvas-spec.json", - "planned_fidelity_receipt": "skills/lark-slides/references/receipts/template-fidelity/biennale-yellow.biennale-programme-poster.json", + "default_selectable": false, + "family_id": "biennale-yellow", + "fidelity_gate": { + "issues": [], + "receipt_path": "skills/lark-slides/references/receipts/template-fidelity/biennale-yellow.biennale-programme-poster.json", + "reference_screenshot": "/Users/bytedance/bd-projects/beautiful-html-templates/screenshots/biennale-yellow-1.png", + "render_screenshot": "/Users/bytedance/bd-projects/workspaces/SVGlide/.worktrees/cli-svglide-svg-private/skills/lark-slides/scripts/fixtures/svglide_artboard/golden/biennale-programme-poster.preview.png", + "score": 0.7675, + "status": "passed", + "threshold": 0.72 + }, + "fidelity_receipt": "skills/lark-slides/references/receipts/template-fidelity/biennale-yellow.biennale-programme-poster.json", "font_strategy": { - "source_fonts": [ - "Instrument Serif", - "Archivo", - "Smiley Sans Oblique", - "Helvetica Neue", - "JetBrains Mono" - ], - "slide_native_preferred": [ - "system-serif-cjk", - "system-sans-cjk", - "system-mono" - ], "adobe_or_embedded_fallback": [ "Source Serif Pro", "Source Sans Pro", @@ -941,59 +902,17 @@ "思源等宽" ], "cjk_fallback": "Noto Serif SC", - "role_mapping": { - "display": { - "source_font": "Instrument Serif", - "slide_font": "Source Serif Pro", - "runtime_alias": "SVGlideDisplay", - "cjk_font": "思源宋体", - "fallback_stack": [ - "system-serif-cjk", - "SVGlideDisplay" - ], - "source_only": false, - "requires_download": false, - "mapping_reason": "保留 Instrument Serif 的语义角色,但运行时优先使用 Slide/系统可用的 Source Serif Pro 与 思源宋体。" - }, - "body": { - "source_font": "Archivo", - "slide_font": "Source Sans Pro", - "runtime_alias": "SVGlideBody", - "cjk_font": "思源黑体", - "fallback_stack": [ - "system-sans-cjk", - "SVGlideBody" - ], - "source_only": false, - "requires_download": false, - "mapping_reason": "保留 Archivo 的语义角色,但运行时优先使用 Slide/系统可用的 Source Sans Pro 与 思源黑体。" - }, - "label": { - "source_font": "JetBrains Mono", - "slide_font": "Source Code Pro", - "runtime_alias": "SVGlideLabel", - "cjk_font": "思源等宽", - "fallback_stack": [ - "system-mono", - "SVGlideLabel" - ], - "source_only": false, - "requires_download": false, - "mapping_reason": "保留 JetBrains Mono 的语义角色,但运行时优先使用 Slide/系统可用的 Source Code Pro 与 思源等宽。" - }, - "metric": { - "source_font": "JetBrains Mono", - "slide_font": "Source Code Pro", - "runtime_alias": "SVGlideMetric", - "cjk_font": "思源等宽", - "fallback_stack": [ - "system-mono", - "SVGlideMetric" - ], - "source_only": false, - "requires_download": false, - "mapping_reason": "保留 JetBrains Mono 的语义角色,但运行时优先使用 Slide/系统可用的 Source Code Pro 与 思源等宽。" - } + "extraction_confidence": { + "adobe_or_embedded_fallback": "inferred_from_layout", + "cjk_fallback": "inferred_from_layout", + "forbidden": "inferred_from_layout", + "mapping_reason": "inferred_from_layout", + "role_mapping.body": "inferred_from_layout", + "role_mapping.display": "inferred_from_layout", + "role_mapping.label": "inferred_from_layout", + "role_mapping.metric": "inferred_from_layout", + "slide_native_preferred": "inferred_from_layout", + "source_fonts": "css_extracted_from_template_html" }, "forbidden": [ "remote_font_runtime_dependency", @@ -1002,118 +921,716 @@ "drop_cjk_fallback" ], "mapping_reason": "根据 design.md/template.html/template.json 中的 font-family 与 typography token 提取源字体;运行时按 Slide/系统/Adobe/思源可用字体降级。", + "role_mapping": { + "body": { + "cjk_font": "思源黑体", + "fallback_stack": [ + "system-sans-cjk", + "SVGlideBody" + ], + "mapping_reason": "保留 Archivo 的语义角色,但运行时优先使用 Slide/系统可用的 Source Sans Pro 与 思源黑体。", + "requires_download": false, + "runtime_alias": "SVGlideBody", + "slide_font": "Source Sans Pro", + "source_font": "Archivo", + "source_only": false + }, + "display": { + "cjk_font": "思源宋体", + "fallback_stack": [ + "system-serif-cjk", + "SVGlideDisplay" + ], + "mapping_reason": "保留 Instrument Serif 的语义角色,但运行时优先使用 Slide/系统可用的 Source Serif Pro 与 思源宋体。", + "requires_download": false, + "runtime_alias": "SVGlideDisplay", + "slide_font": "Source Serif Pro", + "source_font": "Instrument Serif", + "source_only": false + }, + "label": { + "cjk_font": "思源等宽", + "fallback_stack": [ + "system-mono", + "SVGlideLabel" + ], + "mapping_reason": "保留 JetBrains Mono 的语义角色,但运行时优先使用 Slide/系统可用的 Source Code Pro 与 思源等宽。", + "requires_download": false, + "runtime_alias": "SVGlideLabel", + "slide_font": "Source Code Pro", + "source_font": "JetBrains Mono", + "source_only": false + }, + "metric": { + "cjk_font": "思源等宽", + "fallback_stack": [ + "system-mono", + "SVGlideMetric" + ], + "mapping_reason": "保留 JetBrains Mono 的语义角色,但运行时优先使用 Slide/系统可用的 Source Code Pro 与 思源等宽。", + "requires_download": false, + "runtime_alias": "SVGlideMetric", + "slide_font": "Source Code Pro", + "source_font": "JetBrains Mono", + "source_only": false + } + }, + "slide_native_preferred": [ + "system-serif-cjk", + "system-sans-cjk", + "system-mono" + ], "source_evidence": [ "beautiful-html-templates/templates/biennale-yellow/design.md", "beautiful-html-templates/templates/biennale-yellow/template.html", "beautiful-html-templates/templates/biennale-yellow/template.json", "beautiful-html-templates/screenshots/biennale-yellow-1.png" ], - "extraction_confidence": { - "role_mapping.body": "inferred_from_layout", - "role_mapping.display": "inferred_from_layout", - "source_fonts": "css_extracted_from_template_html", - "adobe_or_embedded_fallback": "inferred_from_layout", - "cjk_fallback": "inferred_from_layout", - "role_mapping.metric": "inferred_from_layout", - "forbidden": "inferred_from_layout", - "slide_native_preferred": "inferred_from_layout", - "mapping_reason": "inferred_from_layout", - "role_mapping.label": "inferred_from_layout" - }, + "source_fonts": [ + "Instrument Serif", + "Archivo", + "Smiley Sans Oblique", + "Helvetica Neue", + "JetBrains Mono" + ], "source_refs": { - "role_mapping.body": [ - { - "path": "beautiful-html-templates/templates/biennale-yellow/template.html", - "selector_or_token": "role_mapping.body.source_font", - "raw_value": "Archivo" - }, - { - "path": "beautiful-html-templates/templates/biennale-yellow/design.md", - "selector_or_token": "design.typography.roles", - "raw_value": "aze: \"#F0DA7C\" ink: \"#1B2566\" ember: \"#E26B4A\" color-aliases: line: ink typography: display: fontFamily: \"'Instrument Serif', Georgia, serif\" fontWeight: 400 fontSize: \"clamp(120px, min(14.6vw, 22vh), 240px)\" lineHeight: 0.86 letterSpacing: -0.018em display-md: fo" - } - ], - "role_mapping.display": [ - { - "path": "beautiful-html-templates/templates/biennale-yellow/template.html", - "selector_or_token": "role_mapping.display.source_font", - "raw_value": "Instrument Serif" - }, - { - "path": "beautiful-html-templates/templates/biennale-yellow/design.md", - "selector_or_token": "design.typography.roles", - "raw_value": "aze: \"#F0DA7C\" ink: \"#1B2566\" ember: \"#E26B4A\" color-aliases: line: ink typography: display: fontFamily: \"'Instrument Serif', Georgia, serif\" fontWeight: 400 fontSize: \"clamp(120px, min(14.6vw, 22vh), 240px)\" lineHeight: 0.86 letterSpacing: -0.018em display-md: fo" - } - ], - "source_fonts": [ - { - "path": "beautiful-html-templates/templates/biennale-yellow/template.html", - "selector_or_token": "css.font-family", - "raw_value": "'Smiley Sans Oblique', 'Noto Serif SC', serif` on the display tokens that should carry the strongest poster register. ### Universal CJK Adjustments - **Line-height**: increase by ~15–25% from the Latin spec. Body 1.75–1.85 (up from 1.5–1.55), display 1.05–1.15 (up from the very tight 0.84–0.96 used on Instrument Serif). The Latin display tokens here use line-height as low as 0.84 — at that compression, CJK characters collide vertically. Open display to a minimum of 1.0 for Chinese, and 1.15+ on " - } - ], "adobe_or_embedded_fallback": [ { "path": "beautiful-html-templates/templates/biennale-yellow/template.html", - "selector_or_token": "css.font-family", - "raw_value": "'Smiley Sans Oblique', 'Noto Serif SC', serif` on the display tokens that should carry the strongest poster register. ### Universal CJK Adjustments - **Line-height**: increase by ~15–25% from the Latin spec. Body 1.75–1.85 (up from 1.5–1.55), display 1.05–1.15 (up from the very tight 0.84–0.96 used on Instrument Serif). The Latin display tokens here use line-height as low as 0.84 — at that compression, CJK characters collide vertically. Open display to a minimum of 1.0 for Chinese, and 1.15+ on " + "raw_value": "'Smiley Sans Oblique', 'Noto Serif SC', serif` on the display tokens that should carry the strongest poster register. ### Universal CJK Adjustments - **Line-height**: increase by ~15–25% from the Latin spec. Body 1.75–1.85 (up from 1.5–1.55), display 1.05–1.15 (up from the very tight 0.84–0.96 used on Instrument Serif). The Latin display tokens here use line-height as low as 0.84 — at that compression, CJK characters collide vertically. Open display to a minimum of 1.0 for Chinese, and 1.15+ on ", + "selector_or_token": "css.font-family" } ], "cjk_fallback": [ { "path": "beautiful-html-templates/templates/biennale-yellow/template.html", - "selector_or_token": "css.font-family", - "raw_value": "'Smiley Sans Oblique', 'Noto Serif SC', serif` on the display tokens that should carry the strongest poster register. ### Universal CJK Adjustments - **Line-height**: increase by ~15–25% from the Latin spec. Body 1.75–1.85 (up from 1.5–1.55), display 1.05–1.15 (up from the very tight 0.84–0.96 used on Instrument Serif). The Latin display tokens here use line-height as low as 0.84 — at that compression, CJK characters collide vertically. Open display to a minimum of 1.0 for Chinese, and 1.15+ on " - } - ], - "role_mapping.metric": [ - { - "path": "beautiful-html-templates/templates/biennale-yellow/template.html", - "selector_or_token": "role_mapping.metric.source_font", - "raw_value": "JetBrains Mono" - }, - { - "path": "beautiful-html-templates/templates/biennale-yellow/design.md", - "selector_or_token": "design.typography.roles", - "raw_value": "aze: \"#F0DA7C\" ink: \"#1B2566\" ember: \"#E26B4A\" color-aliases: line: ink typography: display: fontFamily: \"'Instrument Serif', Georgia, serif\" fontWeight: 400 fontSize: \"clamp(120px, min(14.6vw, 22vh), 240px)\" lineHeight: 0.86 letterSpacing: -0.018em display-md: fo" + "raw_value": "'Smiley Sans Oblique', 'Noto Serif SC', serif` on the display tokens that should carry the strongest poster register. ### Universal CJK Adjustments - **Line-height**: increase by ~15–25% from the Latin spec. Body 1.75–1.85 (up from 1.5–1.55), display 1.05–1.15 (up from the very tight 0.84–0.96 used on Instrument Serif). The Latin display tokens here use line-height as low as 0.84 — at that compression, CJK characters collide vertically. Open display to a minimum of 1.0 for Chinese, and 1.15+ on ", + "selector_or_token": "css.font-family" } ], "forbidden": [ { "path": "beautiful-html-templates/templates/biennale-yellow/template.html", - "selector_or_token": "css.font-family", - "raw_value": "'Smiley Sans Oblique', 'Noto Serif SC', serif` on the display tokens that should carry the strongest poster register. ### Universal CJK Adjustments - **Line-height**: increase by ~15–25% from the Latin spec. Body 1.75–1.85 (up from 1.5–1.55), display 1.05–1.15 (up from the very tight 0.84–0.96 used on Instrument Serif). The Latin display tokens here use line-height as low as 0.84 — at that compression, CJK characters collide vertically. Open display to a minimum of 1.0 for Chinese, and 1.15+ on " - } - ], - "slide_native_preferred": [ - { - "path": "beautiful-html-templates/templates/biennale-yellow/template.html", - "selector_or_token": "css.font-family", - "raw_value": "'Smiley Sans Oblique', 'Noto Serif SC', serif` on the display tokens that should carry the strongest poster register. ### Universal CJK Adjustments - **Line-height**: increase by ~15–25% from the Latin spec. Body 1.75–1.85 (up from 1.5–1.55), display 1.05–1.15 (up from the very tight 0.84–0.96 used on Instrument Serif). The Latin display tokens here use line-height as low as 0.84 — at that compression, CJK characters collide vertically. Open display to a minimum of 1.0 for Chinese, and 1.15+ on " + "raw_value": "'Smiley Sans Oblique', 'Noto Serif SC', serif` on the display tokens that should carry the strongest poster register. ### Universal CJK Adjustments - **Line-height**: increase by ~15–25% from the Latin spec. Body 1.75–1.85 (up from 1.5–1.55), display 1.05–1.15 (up from the very tight 0.84–0.96 used on Instrument Serif). The Latin display tokens here use line-height as low as 0.84 — at that compression, CJK characters collide vertically. Open display to a minimum of 1.0 for Chinese, and 1.15+ on ", + "selector_or_token": "css.font-family" } ], "mapping_reason": [ { "path": "beautiful-html-templates/templates/biennale-yellow/template.html", - "selector_or_token": "css.font-family", - "raw_value": "'Smiley Sans Oblique', 'Noto Serif SC', serif` on the display tokens that should carry the strongest poster register. ### Universal CJK Adjustments - **Line-height**: increase by ~15–25% from the Latin spec. Body 1.75–1.85 (up from 1.5–1.55), display 1.05–1.15 (up from the very tight 0.84–0.96 used on Instrument Serif). The Latin display tokens here use line-height as low as 0.84 — at that compression, CJK characters collide vertically. Open display to a minimum of 1.0 for Chinese, and 1.15+ on " + "raw_value": "'Smiley Sans Oblique', 'Noto Serif SC', serif` on the display tokens that should carry the strongest poster register. ### Universal CJK Adjustments - **Line-height**: increase by ~15–25% from the Latin spec. Body 1.75–1.85 (up from 1.5–1.55), display 1.05–1.15 (up from the very tight 0.84–0.96 used on Instrument Serif). The Latin display tokens here use line-height as low as 0.84 — at that compression, CJK characters collide vertically. Open display to a minimum of 1.0 for Chinese, and 1.15+ on ", + "selector_or_token": "css.font-family" + } + ], + "role_mapping.body": [ + { + "path": "beautiful-html-templates/templates/biennale-yellow/template.html", + "raw_value": "Archivo", + "selector_or_token": "role_mapping.body.source_font" + }, + { + "path": "beautiful-html-templates/templates/biennale-yellow/design.md", + "raw_value": "aze: \"#F0DA7C\" ink: \"#1B2566\" ember: \"#E26B4A\" color-aliases: line: ink typography: display: fontFamily: \"'Instrument Serif', Georgia, serif\" fontWeight: 400 fontSize: \"clamp(120px, min(14.6vw, 22vh), 240px)\" lineHeight: 0.86 letterSpacing: -0.018em display-md: fo", + "selector_or_token": "design.typography.roles" + } + ], + "role_mapping.display": [ + { + "path": "beautiful-html-templates/templates/biennale-yellow/template.html", + "raw_value": "Instrument Serif", + "selector_or_token": "role_mapping.display.source_font" + }, + { + "path": "beautiful-html-templates/templates/biennale-yellow/design.md", + "raw_value": "aze: \"#F0DA7C\" ink: \"#1B2566\" ember: \"#E26B4A\" color-aliases: line: ink typography: display: fontFamily: \"'Instrument Serif', Georgia, serif\" fontWeight: 400 fontSize: \"clamp(120px, min(14.6vw, 22vh), 240px)\" lineHeight: 0.86 letterSpacing: -0.018em display-md: fo", + "selector_or_token": "design.typography.roles" } ], "role_mapping.label": [ { "path": "beautiful-html-templates/templates/biennale-yellow/template.html", - "selector_or_token": "role_mapping.label.source_font", - "raw_value": "JetBrains Mono" + "raw_value": "JetBrains Mono", + "selector_or_token": "role_mapping.label.source_font" }, { "path": "beautiful-html-templates/templates/biennale-yellow/design.md", - "selector_or_token": "design.typography.roles", - "raw_value": "aze: \"#F0DA7C\" ink: \"#1B2566\" ember: \"#E26B4A\" color-aliases: line: ink typography: display: fontFamily: \"'Instrument Serif', Georgia, serif\" fontWeight: 400 fontSize: \"clamp(120px, min(14.6vw, 22vh), 240px)\" lineHeight: 0.86 letterSpacing: -0.018em display-md: fo" + "raw_value": "aze: \"#F0DA7C\" ink: \"#1B2566\" ember: \"#E26B4A\" color-aliases: line: ink typography: display: fontFamily: \"'Instrument Serif', Georgia, serif\" fontWeight: 400 fontSize: \"clamp(120px, min(14.6vw, 22vh), 240px)\" lineHeight: 0.86 letterSpacing: -0.018em display-md: fo", + "selector_or_token": "design.typography.roles" + } + ], + "role_mapping.metric": [ + { + "path": "beautiful-html-templates/templates/biennale-yellow/template.html", + "raw_value": "JetBrains Mono", + "selector_or_token": "role_mapping.metric.source_font" + }, + { + "path": "beautiful-html-templates/templates/biennale-yellow/design.md", + "raw_value": "aze: \"#F0DA7C\" ink: \"#1B2566\" ember: \"#E26B4A\" color-aliases: line: ink typography: display: fontFamily: \"'Instrument Serif', Georgia, serif\" fontWeight: 400 fontSize: \"clamp(120px, min(14.6vw, 22vh), 240px)\" lineHeight: 0.86 letterSpacing: -0.018em display-md: fo", + "selector_or_token": "design.typography.roles" + } + ], + "slide_native_preferred": [ + { + "path": "beautiful-html-templates/templates/biennale-yellow/template.html", + "raw_value": "'Smiley Sans Oblique', 'Noto Serif SC', serif` on the display tokens that should carry the strongest poster register. ### Universal CJK Adjustments - **Line-height**: increase by ~15–25% from the Latin spec. Body 1.75–1.85 (up from 1.5–1.55), display 1.05–1.15 (up from the very tight 0.84–0.96 used on Instrument Serif). The Latin display tokens here use line-height as low as 0.84 — at that compression, CJK characters collide vertically. Open display to a minimum of 1.0 for Chinese, and 1.15+ on ", + "selector_or_token": "css.font-family" + } + ], + "source_fonts": [ + { + "path": "beautiful-html-templates/templates/biennale-yellow/template.html", + "raw_value": "'Smiley Sans Oblique', 'Noto Serif SC', serif` on the display tokens that should carry the strongest poster register. ### Universal CJK Adjustments - **Line-height**: increase by ~15–25% from the Latin spec. Body 1.75–1.85 (up from 1.5–1.55), display 1.05–1.15 (up from the very tight 0.84–0.96 used on Instrument Serif). The Latin display tokens here use line-height as low as 0.84 — at that compression, CJK characters collide vertically. Open display to a minimum of 1.0 for Chinese, and 1.15+ on ", + "selector_or_token": "css.font-family" } ] } }, + "golden_spec": "skills/lark-slides/scripts/fixtures/svglide_artboard/golden/biennale-programme-poster.canvas-spec.json", + "implemented_page_variants": [ + "cover", + "manifesto", + "programme", + "chapter", + "data", + "quote", + "cal", + "colophon" + ], + "loss_notes": [ + "italic is source-aware but CJK fake italic is forbidden; use color/weight fallback when unavailable", + "letter spacing is preserved for Latin labels and reset/softened for CJK" + ], + "page_family_implementation_note": "Implemented eight source-backed Biennale Yellow page variants from template.html; smoke deck reuses cal once to cover detail because the source has 8 pages while production minimum roles contain 9 roles. Kept needs_review/default_selectable=false.", + "page_family_smoke_deck": "skills/lark-slides/references/page-family-smoke-decks/biennale-yellow.json", + "page_family_smoke_receipt": "skills/lark-slides/references/receipts/page-family-smoke/biennale-yellow.biennale-programme-poster.json", + "page_family_source": { + "claim_boundary": "source extraction only; does not imply renderer, fidelity, quality gate, or production/default selectable status", + "extractor": "skills/lark-slides/scripts/beautiful_template_page_family_extract.py", + "source_design_md": "beautiful-html-templates/templates/biennale-yellow/design.md", + "source_template_html": "beautiful-html-templates/templates/biennale-yellow/template.html", + "source_template_json": "beautiful-html-templates/templates/biennale-yellow/template.json" + }, + "page_variant_count": 8, + "page_variant_golden_specs": { + "cal": "skills/lark-slides/scripts/fixtures/svglide_artboard/golden/biennale-yellow.cal.canvas-spec.json", + "chapter": "skills/lark-slides/scripts/fixtures/svglide_artboard/golden/biennale-yellow.chapter.canvas-spec.json", + "colophon": "skills/lark-slides/scripts/fixtures/svglide_artboard/golden/biennale-yellow.colophon.canvas-spec.json", + "cover": "skills/lark-slides/scripts/fixtures/svglide_artboard/golden/biennale-yellow.cover.canvas-spec.json", + "data": "skills/lark-slides/scripts/fixtures/svglide_artboard/golden/biennale-yellow.data.canvas-spec.json", + "manifesto": "skills/lark-slides/scripts/fixtures/svglide_artboard/golden/biennale-yellow.manifesto.canvas-spec.json", + "programme": "skills/lark-slides/scripts/fixtures/svglide_artboard/golden/biennale-yellow.programme.canvas-spec.json", + "quote": "skills/lark-slides/scripts/fixtures/svglide_artboard/golden/biennale-yellow.quote.canvas-spec.json" + }, + "planned_fidelity_receipt": "skills/lark-slides/references/receipts/template-fidelity/biennale-yellow.biennale-programme-poster.json", + "planned_golden_spec": "skills/lark-slides/scripts/fixtures/svglide_artboard/golden/biennale-programme-poster.canvas-spec.json", + "planned_renderer_module": "skills/lark-slides/scripts/artboard_renderer/templates/beautiful/biennale-programme-poster.mjs", + "promotion_status": "needs_review", + "reference_screenshot": "beautiful-html-templates/screenshots/biennale-yellow-1.png", + "renderer_id": "artboard_satori.biennale-programme-poster", + "renderer_module": "skills/lark-slides/scripts/artboard_renderer/templates/beautiful/biennale-programme-poster.mjs", + "runtime_template_id": "biennale-programme-poster", + "satori": { + "font_and_typography_constraints": [ + "italic is source-aware but CJK fake italic is forbidden; use color/weight fallback when unavailable", + "letter spacing is preserved for Latin labels and reset/softened for CJK" + ] + }, + "source_design_md": "beautiful-html-templates/templates/biennale-yellow/design.md", + "source_page_variants": [ + "cal", + "chapter", + "colophon", + "cover", + "data", + "manifesto", + "programme", + "quote" + ], + "source_template_html": "beautiful-html-templates/templates/biennale-yellow/template.html", + "source_template_json": "beautiful-html-templates/templates/biennale-yellow/template.json", + "source_trace": [ + { + "evidence": "source_template_html", + "source": "beautiful-html-templates/templates/biennale-yellow/template.html" + }, + { + "evidence": "source_design_md", + "source": "beautiful-html-templates/templates/biennale-yellow/design.md" + }, + { + "evidence": "source_template_json", + "source": "beautiful-html-templates/templates/biennale-yellow/template.json" + }, + { + "evidence": "reference_screenshot", + "source": "beautiful-html-templates/screenshots/biennale-yellow-1.png" + }, + { + "evidence": "absorption_record", + "source": "skills/lark-slides/references/absorptions/beautiful-html-templates/biennale-yellow.biennale-programme-poster.json" + }, + { + "evidence": "template_fidelity_receipt", + "source": "skills/lark-slides/references/receipts/template-fidelity/biennale-yellow.biennale-programme-poster.json" + } + ], + "supported_page_variants": [ + "cover", + "manifesto", + "programme", + "chapter", + "data", + "quote", + "cal", + "colophon" + ], + "template_id": "biennale-programme-poster", + "text_budget_by_variant": { + "cal": { + "max_rows": 8, + "max_title_chars": 60 + }, + "chapter": { + "max_body_chars": 260, + "max_title_chars": 84 + }, + "colophon": { + "max_footer_items": 4, + "max_title_chars": 70 + }, + "cover": { + "max_body_items": 4, + "max_title_chars": 44 + }, + "data": { + "max_chart_rows": 5, + "max_stats": 2 + }, + "manifesto": { + "max_quote_chars": 140 + }, + "programme": { + "max_item_body_chars": 150, + "max_items": 5 + }, + "quote": { + "max_attr_chars": 96, + "max_quote_chars": 135 + } + }, + "text_style_strategy": { + "bold": { + "allowed_roles": [ + "display", + "label", + "metric" + ], + "mapped_weight": { + "display": 400, + "label": 700, + "metric": 900 + }, + "source_usage": "source uses heavy display/label weights" + }, + "emphasis": { + "color_shift": "use source accent color roles only", + "font_family_switch": "only switch between mapped display/body/label/metric roles from this family", + "style_shift": "italic only when source_usage requires and CJK fallback is safe", + "weight_shift": "increase one role step within font_weight_scale" + }, + "extraction_confidence": { + "bold": "css_extracted_from_template_html", + "emphasis": "inferred_from_layout", + "forbidden": "inferred_from_layout", + "italic": "css_extracted_from_template_html", + "line_through": "absent_use_default", + "text_decoration_policy.line_through.color": "absent_use_default", + "text_decoration_policy.line_through.style": "absent_use_default", + "text_decoration_policy.line_through.thickness": "absent_use_default", + "text_decoration_policy.underline.color": "css_extracted_from_template_html", + "text_decoration_policy.underline.style": "css_extracted_from_template_html", + "text_decoration_policy.underline.thickness": "css_extracted_from_template_html", + "underline": "css_extracted_from_template_html" + }, + "forbidden": [ + "fake_cjk_italic", + "drop_source_text_transform", + "drop_source_letter_spacing_without_loss_note", + "use_cross_family_font_motif", + "remote_font_dependency_without_receipt" + ], + "italic": { + "fallback_when_unavailable": "use color_shift or weight_shift; do not fake CJK italic", + "loss_notes": "Satori/Slide may not provide exact Google italic face; record as visual approximation.", + "mapped_style": "latin_only_when_source_requires_else_normal", + "source_usage": "source uses italic/font-style or italic-family tokens" + }, + "line_through": { + "fallback_shape": "none", + "mapped_decoration": "none", + "source_usage": "not present in source; default no line-through" + }, + "source_refs": { + "bold": [ + { + "path": "beautiful-html-templates/templates/biennale-yellow/template.html", + "raw_value": "400; 600; 500", + "selector_or_token": "css.font-weight" + } + ], + "emphasis": [ + { + "path": "beautiful-html-templates/templates/biennale-yellow/template.html", + "raw_value": "body { margin: 0; padding: 0; height: 100%; background: #0a0a0a; } body { font-family: 'Archivo', 'Helvetica Neue', sans-serif; color: var(--ink); overflow: hidden; } /* deck wrapper — fills the viewport, centers a stage */ .deck { position: fixed; inset: 0; display: grid; place", + "selector_or_token": "template.css.typography" + } + ], + "forbidden": [ + { + "path": "beautiful-html-templates/templates/biennale-yellow/template.html", + "raw_value": "body { margin: 0; padding: 0; height: 100%; background: #0a0a0a; } body { font-family: 'Archivo', 'Helvetica Neue', sans-serif; color: var(--ink); overflow: hidden; } /* deck wrapper — fills the viewport, centers a stage */ .deck { position: fixed; inset: 0; display: grid; place", + "selector_or_token": "template.css.typography" + } + ], + "italic": [ + { + "path": "beautiful-html-templates/templates/biennale-yellow/template.html", + "raw_value": "ment Serif — a contemporary high-contrast serif with tall ascenders and elegant italics — paired with Archivo for sans-serif chrome and JetBrains Mono for numerical and metadata callouts. No drop shadows, no rounded corners, no bordered cards: the only structural lines are hairline 1px rules in ink.", + "selector_or_token": "css.font-style" + } + ], + "text_decoration_policy.underline.color": [ + { + "path": "beautiful-html-templates/templates/biennale-yellow/template.html", + "raw_value": "ights - **1px solid `{colors.ink}`** — the universal rule. Used for header-band underlines, ledger row separators, footer-column tops, and the bordered chart bar accent on the lit row. - **1px solid `rgba(27, 37, 102, 0.18-0.2)`** — soft variant of the same rule. Used for secondary row separators in", + "selector_or_token": "css.text-decoration" + } + ], + "text_decoration_policy.underline.style": [ + { + "path": "beautiful-html-templates/templates/biennale-yellow/template.html", + "raw_value": "ights - **1px solid `{colors.ink}`** — the universal rule. Used for header-band underlines, ledger row separators, footer-column tops, and the bordered chart bar accent on the lit row. - **1px solid `rgba(27, 37, 102, 0.18-0.2)`** — soft variant of the same rule. Used for secondary row separators in", + "selector_or_token": "css.text-decoration" + } + ], + "text_decoration_policy.underline.thickness": [ + { + "path": "beautiful-html-templates/templates/biennale-yellow/template.html", + "raw_value": "ights - **1px solid `{colors.ink}`** — the universal rule. Used for header-band underlines, ledger row separators, footer-column tops, and the bordered chart bar accent on the lit row. - **1px solid `rgba(27, 37, 102, 0.18-0.2)`** — soft variant of the same rule. Used for secondary row separators in", + "selector_or_token": "css.text-decoration" + } + ], + "underline": [ + { + "path": "beautiful-html-templates/templates/biennale-yellow/template.html", + "raw_value": "ights - **1px solid `{colors.ink}`** — the universal rule. Used for header-band underlines, ledger row separators, footer-column tops, and the bordered chart bar accent on the lit row. - **1px solid `rgba(27, 37, 102, 0.18-0.2)`** — soft variant of the same rule. Used for secondary row separators in", + "selector_or_token": "css.text-decoration" + } + ] + }, + "text_decoration_policy": { + "line_through": { + "color": "currentColor", + "style": "none", + "thickness": "0px" + }, + "underline": { + "color": "currentColor", + "style": "solid", + "thickness": "1px" + } + }, + "underline": { + "fallback_shape": "1px-3px rule or border accent when underline font rendering is unavailable", + "mapped_decoration": "native underline only for actual text-decoration source usage", + "source_usage": "source uses underline/text-decoration or hairline emphasis" + } + }, "typography_strategy": { + "alignment": { + "fallback": "left/top aligned unless source screenshot is centered", + "primary": "follow source composition" + }, + "cjk_typography_adjustment": { + "body_font_cn": "Noto Sans SC", + "display_font_cn": "Noto Serif SC", + "italic_policy": "drop_italic", + "letter_spacing_policy": "reset_letter_spacing_for_cjk_keep_latin_labels", + "mixed_run_spacing": "pangu_spacing" + }, + "extraction_confidence": { + "alignment": "inferred_from_layout", + "cjk_typography_adjustment": "inferred_from_layout", + "font_size_scale": "css_extracted_from_template_html", + "font_weight_scale": "css_extracted_from_template_html", + "hierarchy_ratio": "inferred_from_layout", + "letter_spacing_scale": "css_extracted_from_template_html", + "line_height_scale": "css_extracted_from_template_html", + "mapping_reason": "inferred_from_layout", + "max_lines": "inferred_from_layout", + "measure": "inferred_from_layout", + "paragraph_spacing": "css_extracted_from_template_html", + "role_mapping.body": "inferred_from_layout", + "role_mapping.display": "inferred_from_layout", + "role_mapping.label": "inferred_from_layout", + "role_mapping.metric": "inferred_from_layout", + "source_typography_tokens": "css_extracted_from_template_html", + "text_direction": "css_extracted_from_template_html", + "text_transform_policy": "css_extracted_from_template_html", + "word_spacing": "absent_use_default", + "wrapping_policy": "inferred_from_layout", + "writing_mode": "absent_use_default" + }, + "font_size_scale": { + "body": 20, + "display": 88, + "label": 12, + "metric": 56 + }, + "font_weight_scale": { + "body": 400, + "display": 400, + "label": 700, + "metric": 900 + }, + "hierarchy_ratio": 4.4, + "letter_spacing_scale": { + "body": 0, + "display": 0, + "label": 0.08, + "metric": 0 + }, + "line_height_scale": { + "body": 1.32, + "display": 0.96, + "label": 1.05, + "metric": 0.95 + }, + "mapping_reason": "按源模板字号/字重/行高/字距/大小写规则抽象到 960x540 Slide 画布的四个文本角色。", + "max_lines": { + "body": 5, + "display": 3, + "label": 1, + "metric": 2 + }, + "measure": { + "body": "40-70 characters or CJK equivalent", + "display": "0.55-0.78 canvas width", + "label": "short mono labels", + "metric": "short numeric/stat blocks" + }, + "paragraph_spacing": { + "body_after": 12, + "display_after": 0, + "label_after": 0, + "metric_after": 0 + }, + "role_mapping": { + "body": { + "alignment": "source_layout_dependent", + "font_role": "body", + "font_size": 20, + "font_weight": 400, + "letter_spacing": 0, + "line_height": 1.32, + "max_lines": 5, + "runtime_alias": "SVGlideBody", + "source_font": "Archivo", + "text_transform": "preserve_source_case" + }, + "display": { + "alignment": "source_layout_dependent", + "font_role": "display", + "font_size": 88, + "font_weight": 400, + "letter_spacing": 0, + "line_height": 0.96, + "max_lines": 3, + "runtime_alias": "SVGlideDisplay", + "source_font": "Instrument Serif", + "text_transform": "latin_uppercase_only" + }, + "label": { + "alignment": "source_layout_dependent", + "font_role": "label", + "font_size": 12, + "font_weight": 700, + "letter_spacing": 0.08, + "line_height": 1.05, + "max_lines": 1, + "runtime_alias": "SVGlideLabel", + "source_font": "JetBrains Mono", + "text_transform": "latin_uppercase_labels_reset_cjk_spacing" + }, + "metric": { + "alignment": "source_layout_dependent", + "font_role": "metric", + "font_size": 56, + "font_weight": 900, + "letter_spacing": 0, + "line_height": 0.95, + "max_lines": 2, + "runtime_alias": "SVGlideMetric", + "source_font": "JetBrains Mono", + "text_transform": "preserve_numbers_and_units" + } + }, + "source_refs": { + "alignment": [ + { + "path": "beautiful-html-templates/templates/biennale-yellow/template.html", + "raw_value": "body { margin: 0; padding: 0; height: 100%; background: #0a0a0a; } body { font-family: 'Archivo', 'Helvetica Neue', sans-serif; color: var(--ink); overflow: hidden; } /* deck wrapper — fills the viewport, centers a stage */ .deck { position: fixed; inset: 0; display: grid; place", + "selector_or_token": "template.css.typography" + } + ], + "cjk_typography_adjustment": [ + { + "path": "beautiful-html-templates/templates/biennale-yellow/template.html", + "raw_value": "body { margin: 0; padding: 0; height: 100%; background: #0a0a0a; } body { font-family: 'Archivo', 'Helvetica Neue', sans-serif; color: var(--ink); overflow: hidden; } /* deck wrapper — fills the viewport, centers a stage */ .deck { position: fixed; inset: 0; display: grid; place", + "selector_or_token": "template.css.typography" + } + ], + "font_size_scale": [ + { + "path": "beautiful-html-templates/templates/biennale-yellow/template.html", + "raw_value": "clamp(11px, 0.85vw, 13px); clamp(10px, 0.75vw, 12px); clamp(48px, min(5.2vw, 9vh), 96px); clamp(120px, min(14.6vw, 22vh), 240px); clamp(10px, 0.72vw, 12px); clamp(11px, 0.78vw, 13px); clamp(11px, 0.74vw, 12px); clamp(56px, min(7vw, 11vh), 120px); clamp(11px, 0.85vw, 14px); clamp(110px, min(11vw, 18vh), 200px); clamp(13px, 0.95vw, 16px); clamp(28px, 2vw, 38px); clamp(22px, 1.7vw, 32px); clamp(14px, 0.95vw, 15px); clamp(220px, min(28vw, 64vh), 720px); clamp(40px, min(4.4vw, 7vh), 90px)", + "selector_or_token": "css.font_size_scale" + } + ], + "font_weight_scale": [ + { + "path": "beautiful-html-templates/templates/biennale-yellow/template.html", + "raw_value": "400; 600; 500", + "selector_or_token": "css.font_weight_scale" + } + ], + "hierarchy_ratio": [ + { + "path": "beautiful-html-templates/templates/biennale-yellow/template.html", + "raw_value": "body { margin: 0; padding: 0; height: 100%; background: #0a0a0a; } body { font-family: 'Archivo', 'Helvetica Neue', sans-serif; color: var(--ink); overflow: hidden; } /* deck wrapper — fills the viewport, centers a stage */ .deck { position: fixed; inset: 0; display: grid; place", + "selector_or_token": "template.css.typography" + } + ], + "letter_spacing_scale": [ + { + "path": "beautiful-html-templates/templates/biennale-yellow/template.html", + "raw_value": "-0.012em; -0.005em; 0.18em; 0.08em; -0.018em; 0.16em; 0.2em; 0.32em; -0.04em; -0.01em; 0.04em; 0.02em; 0.22em", + "selector_or_token": "css.letter_spacing_scale" + } + ], + "line_height_scale": [ + { + "path": "beautiful-html-templates/templates/biennale-yellow/template.html", + "raw_value": "0.9; 1.04; 1.5; 0.96; 0.86; 1.45; 1; 1.1; 0.84; 1.05; 1.55; 0.92; 1.06; 1.15", + "selector_or_token": "css.line_height_scale" + } + ], + "mapping_reason": [ + { + "path": "beautiful-html-templates/templates/biennale-yellow/template.html", + "raw_value": "body { margin: 0; padding: 0; height: 100%; background: #0a0a0a; } body { font-family: 'Archivo', 'Helvetica Neue', sans-serif; color: var(--ink); overflow: hidden; } /* deck wrapper — fills the viewport, centers a stage */ .deck { position: fixed; inset: 0; display: grid; place", + "selector_or_token": "template.css.typography" + } + ], + "max_lines": [ + { + "path": "beautiful-html-templates/templates/biennale-yellow/template.html", + "raw_value": "body { margin: 0; padding: 0; height: 100%; background: #0a0a0a; } body { font-family: 'Archivo', 'Helvetica Neue', sans-serif; color: var(--ink); overflow: hidden; } /* deck wrapper — fills the viewport, centers a stage */ .deck { position: fixed; inset: 0; display: grid; place", + "selector_or_token": "template.css.typography" + } + ], + "measure": [ + { + "path": "beautiful-html-templates/templates/biennale-yellow/template.html", + "raw_value": "body { margin: 0; padding: 0; height: 100%; background: #0a0a0a; } body { font-family: 'Archivo', 'Helvetica Neue', sans-serif; color: var(--ink); overflow: hidden; } /* deck wrapper — fills the viewport, centers a stage */ .deck { position: fixed; inset: 0; display: grid; place", + "selector_or_token": "template.css.typography" + } + ], + "paragraph_spacing": [ + { + "path": "beautiful-html-templates/templates/biennale-yellow/template.html", + "raw_value": "6px; clamp(14px, 1.8vh, 26px); clamp(16px, 1.8vh, 26px); clamp(12px, 1.4vh, 22px); clamp(20px, 2.4vw, 44px); clamp(18px, 2.2vh, 32px); clamp(14px, 1.8vh, 22px); clamp(14px, 1.4vw, 24px); clamp(20px, 2.5vw, 48px); 32px; clamp(18px, 2vh, 32px); 4px; clamp(8px, 1vh, 14px); clamp(12px, 1vw, 22px); 0; clamp(14px, 1.4vw, 28px)", + "selector_or_token": "css.paragraph_spacing" + } + ], + "role_mapping.body": [ + { + "path": "beautiful-html-templates/templates/biennale-yellow/template.html", + "raw_value": "Archivo", + "selector_or_token": "role_mapping.body.source_font" + }, + { + "path": "beautiful-html-templates/templates/biennale-yellow/design.md", + "raw_value": "aze: \"#F0DA7C\" ink: \"#1B2566\" ember: \"#E26B4A\" color-aliases: line: ink typography: display: fontFamily: \"'Instrument Serif', Georgia, serif\" fontWeight: 400 fontSize: \"clamp(120px, min(14.6vw, 22vh), 240px)\" lineHeight: 0.86 letterSpacing: -0.018em display-md: fo", + "selector_or_token": "design.typography.roles" + } + ], + "role_mapping.display": [ + { + "path": "beautiful-html-templates/templates/biennale-yellow/template.html", + "raw_value": "Instrument Serif", + "selector_or_token": "role_mapping.display.source_font" + }, + { + "path": "beautiful-html-templates/templates/biennale-yellow/design.md", + "raw_value": "aze: \"#F0DA7C\" ink: \"#1B2566\" ember: \"#E26B4A\" color-aliases: line: ink typography: display: fontFamily: \"'Instrument Serif', Georgia, serif\" fontWeight: 400 fontSize: \"clamp(120px, min(14.6vw, 22vh), 240px)\" lineHeight: 0.86 letterSpacing: -0.018em display-md: fo", + "selector_or_token": "design.typography.roles" + } + ], + "role_mapping.label": [ + { + "path": "beautiful-html-templates/templates/biennale-yellow/template.html", + "raw_value": "JetBrains Mono", + "selector_or_token": "role_mapping.label.source_font" + }, + { + "path": "beautiful-html-templates/templates/biennale-yellow/design.md", + "raw_value": "aze: \"#F0DA7C\" ink: \"#1B2566\" ember: \"#E26B4A\" color-aliases: line: ink typography: display: fontFamily: \"'Instrument Serif', Georgia, serif\" fontWeight: 400 fontSize: \"clamp(120px, min(14.6vw, 22vh), 240px)\" lineHeight: 0.86 letterSpacing: -0.018em display-md: fo", + "selector_or_token": "design.typography.roles" + } + ], + "role_mapping.metric": [ + { + "path": "beautiful-html-templates/templates/biennale-yellow/template.html", + "raw_value": "JetBrains Mono", + "selector_or_token": "role_mapping.metric.source_font" + }, + { + "path": "beautiful-html-templates/templates/biennale-yellow/design.md", + "raw_value": "aze: \"#F0DA7C\" ink: \"#1B2566\" ember: \"#E26B4A\" color-aliases: line: ink typography: display: fontFamily: \"'Instrument Serif', Georgia, serif\" fontWeight: 400 fontSize: \"clamp(120px, min(14.6vw, 22vh), 240px)\" lineHeight: 0.86 letterSpacing: -0.018em display-md: fo", + "selector_or_token": "design.typography.roles" + } + ], + "source_typography_tokens": [ + { + "path": "beautiful-html-templates/templates/biennale-yellow/template.html", + "raw_value": "clamp(11px, 0.85vw, 13px); clamp(10px, 0.75vw, 12px); clamp(48px, min(5.2vw, 9vh), 96px); clamp(120px, min(14.6vw, 22vh), 240px); clamp(10px, 0.72vw, 12px); clamp(11px, 0.78vw, 13px); clamp(11px, 0.74vw, 12px); clamp(56px, min(7vw, 11vh), 120px); clamp(11px, 0.85vw, 14px); clamp(110px, min(11vw, 18vh), 200px); clamp(13px, 0.95vw, 16px); clamp(28px, 2vw, 38px); clamp(22px, 1.7vw, 32px); clamp(14px, 0.95vw, 15px); clamp(220px, min(28vw, 64vh), 720px); clamp(40px, min(4.4vw, 7vh), 90px); 400; 600; ", + "selector_or_token": "css.source_typography_tokens" + } + ], + "text_direction": [ + { + "path": "beautiful-html-templates/templates/biennale-yellow/template.html", + "raw_value": "column", + "selector_or_token": "css.text_direction" + } + ], + "text_transform_policy": [ + { + "path": "beautiful-html-templates/templates/biennale-yellow/template.html", + "raw_value": "uppercase`; uppercase", + "selector_or_token": "css.text_transform_policy" + } + ], + "wrapping_policy": [ + { + "path": "beautiful-html-templates/templates/biennale-yellow/template.html", + "raw_value": "body { margin: 0; padding: 0; height: 100%; background: #0a0a0a; } body { font-family: 'Archivo', 'Helvetica Neue', sans-serif; color: var(--ink); overflow: hidden; } /* deck wrapper — fills the viewport, centers a stage */ .deck { position: fixed; inset: 0; display: grid; place", + "selector_or_token": "template.css.typography" + } + ] + }, "source_typography_tokens": { "font_families": [ "Instrument Serif", @@ -1139,18 +1656,6 @@ "600", "500" ], - "line_height": [ - "0.86", - "1.04", - "0.84", - "0.9", - "0.92", - "1.06", - "1", - "0.96", - "1.15", - "1.1" - ], "letter_spacing": [ "-0.018em", "-0.005em", @@ -1163,11 +1668,18 @@ "0.02em", "0.08em" ], - "text_transform": [ - "uppercase", - "uppercase`" + "line_height": [ + "0.86", + "1.04", + "0.84", + "0.9", + "0.92", + "1.06", + "1", + "0.96", + "1.15", + "1.1" ], - "word_spacing": [], "paragraph_spacing": [ "6px", "clamp(14px, 1.8vh, 26px)", @@ -1186,539 +1698,45 @@ "0", "clamp(14px, 1.4vw, 28px)" ], + "text_decoration": [], "text_direction": [ "column" ], - "writing_mode": [], - "text_decoration": [] + "text_transform": [ + "uppercase", + "uppercase`" + ], + "word_spacing": [], + "writing_mode": [] }, - "role_mapping": { - "display": { - "font_role": "display", - "source_font": "Instrument Serif", - "runtime_alias": "SVGlideDisplay", - "font_size": 88, - "font_weight": 400, - "line_height": 0.96, - "letter_spacing": 0, - "text_transform": "latin_uppercase_only", - "max_lines": 3, - "alignment": "source_layout_dependent" - }, - "body": { - "font_role": "body", - "source_font": "Archivo", - "runtime_alias": "SVGlideBody", - "font_size": 20, - "font_weight": 400, - "line_height": 1.32, - "letter_spacing": 0, - "text_transform": "preserve_source_case", - "max_lines": 5, - "alignment": "source_layout_dependent" - }, - "label": { - "font_role": "label", - "source_font": "JetBrains Mono", - "runtime_alias": "SVGlideLabel", - "font_size": 12, - "font_weight": 700, - "line_height": 1.05, - "letter_spacing": 0.08, - "text_transform": "latin_uppercase_labels_reset_cjk_spacing", - "max_lines": 1, - "alignment": "source_layout_dependent" - }, - "metric": { - "font_role": "metric", - "source_font": "JetBrains Mono", - "runtime_alias": "SVGlideMetric", - "font_size": 56, - "font_weight": 900, - "line_height": 0.95, - "letter_spacing": 0, - "text_transform": "preserve_numbers_and_units", - "max_lines": 2, - "alignment": "source_layout_dependent" - } - }, - "font_size_scale": { - "display": 88, - "body": 20, - "label": 12, - "metric": 56 - }, - "font_weight_scale": { - "display": 400, - "body": 400, - "label": 700, - "metric": 900 - }, - "line_height_scale": { - "display": 0.96, - "body": 1.32, - "label": 1.05, - "metric": 0.95 - }, - "letter_spacing_scale": { - "display": 0, - "body": 0, - "label": 0.08, - "metric": 0 + "text_direction": { + "cjk": "ltr", + "default": "column" }, "text_transform_policy": { - "display": "latin_uppercase_only", "body": "preserve_source_case", + "display": "latin_uppercase_only", "label": "latin_uppercase_labels_reset_cjk_spacing", "metric": "preserve_numbers_and_units" }, - "hierarchy_ratio": 4.4, - "max_lines": { - "display": 3, - "body": 5, - "label": 1, - "metric": 2 - }, - "measure": { - "display": "0.55-0.78 canvas width", - "body": "40-70 characters or CJK equivalent", - "label": "short mono labels", - "metric": "short numeric/stat blocks" - }, - "alignment": { - "primary": "follow source composition", - "fallback": "left/top aligned unless source screenshot is centered" - }, - "cjk_typography_adjustment": { - "display_font_cn": "Noto Serif SC", - "body_font_cn": "Noto Sans SC", - "letter_spacing_policy": "reset_letter_spacing_for_cjk_keep_latin_labels", - "mixed_run_spacing": "pangu_spacing", - "italic_policy": "drop_italic" - }, - "mapping_reason": "按源模板字号/字重/行高/字距/大小写规则抽象到 960x540 Slide 画布的四个文本角色。", "word_spacing": { - "display": 0, "body": 0, + "display": 0, "label": 0, "metric": 0 }, - "paragraph_spacing": { - "display_after": 0, - "body_after": 12, - "label_after": 0, - "metric_after": 0 - }, "wrapping_policy": { - "display": "manual_break_or_balance", "body": "wrap_with_measure", + "display": "manual_break_or_balance", "label": "no_wrap_preferred", "metric": "no_wrap_preferred" }, - "text_direction": { - "default": "column", - "cjk": "ltr" - }, "writing_mode": { "default": "horizontal-tb", "vertical_roles": [] - }, - "extraction_confidence": { - "role_mapping.body": "inferred_from_layout", - "role_mapping.display": "inferred_from_layout", - "font_size_scale": "css_extracted_from_template_html", - "max_lines": "inferred_from_layout", - "writing_mode": "absent_use_default", - "text_direction": "css_extracted_from_template_html", - "alignment": "inferred_from_layout", - "role_mapping.label": "inferred_from_layout", - "paragraph_spacing": "css_extracted_from_template_html", - "text_transform_policy": "css_extracted_from_template_html", - "line_height_scale": "css_extracted_from_template_html", - "wrapping_policy": "inferred_from_layout", - "font_weight_scale": "css_extracted_from_template_html", - "source_typography_tokens": "css_extracted_from_template_html", - "word_spacing": "absent_use_default", - "role_mapping.metric": "inferred_from_layout", - "cjk_typography_adjustment": "inferred_from_layout", - "hierarchy_ratio": "inferred_from_layout", - "measure": "inferred_from_layout", - "mapping_reason": "inferred_from_layout", - "letter_spacing_scale": "css_extracted_from_template_html" - }, - "source_refs": { - "role_mapping.body": [ - { - "path": "beautiful-html-templates/templates/biennale-yellow/template.html", - "selector_or_token": "role_mapping.body.source_font", - "raw_value": "Archivo" - }, - { - "path": "beautiful-html-templates/templates/biennale-yellow/design.md", - "selector_or_token": "design.typography.roles", - "raw_value": "aze: \"#F0DA7C\" ink: \"#1B2566\" ember: \"#E26B4A\" color-aliases: line: ink typography: display: fontFamily: \"'Instrument Serif', Georgia, serif\" fontWeight: 400 fontSize: \"clamp(120px, min(14.6vw, 22vh), 240px)\" lineHeight: 0.86 letterSpacing: -0.018em display-md: fo" - } - ], - "role_mapping.display": [ - { - "path": "beautiful-html-templates/templates/biennale-yellow/template.html", - "selector_or_token": "role_mapping.display.source_font", - "raw_value": "Instrument Serif" - }, - { - "path": "beautiful-html-templates/templates/biennale-yellow/design.md", - "selector_or_token": "design.typography.roles", - "raw_value": "aze: \"#F0DA7C\" ink: \"#1B2566\" ember: \"#E26B4A\" color-aliases: line: ink typography: display: fontFamily: \"'Instrument Serif', Georgia, serif\" fontWeight: 400 fontSize: \"clamp(120px, min(14.6vw, 22vh), 240px)\" lineHeight: 0.86 letterSpacing: -0.018em display-md: fo" - } - ], - "font_size_scale": [ - { - "path": "beautiful-html-templates/templates/biennale-yellow/template.html", - "selector_or_token": "css.font_size_scale", - "raw_value": "clamp(11px, 0.85vw, 13px); clamp(10px, 0.75vw, 12px); clamp(48px, min(5.2vw, 9vh), 96px); clamp(120px, min(14.6vw, 22vh), 240px); clamp(10px, 0.72vw, 12px); clamp(11px, 0.78vw, 13px); clamp(11px, 0.74vw, 12px); clamp(56px, min(7vw, 11vh), 120px); clamp(11px, 0.85vw, 14px); clamp(110px, min(11vw, 18vh), 200px); clamp(13px, 0.95vw, 16px); clamp(28px, 2vw, 38px); clamp(22px, 1.7vw, 32px); clamp(14px, 0.95vw, 15px); clamp(220px, min(28vw, 64vh), 720px); clamp(40px, min(4.4vw, 7vh), 90px)" - } - ], - "max_lines": [ - { - "path": "beautiful-html-templates/templates/biennale-yellow/template.html", - "selector_or_token": "template.css.typography", - "raw_value": "body { margin: 0; padding: 0; height: 100%; background: #0a0a0a; } body { font-family: 'Archivo', 'Helvetica Neue', sans-serif; color: var(--ink); overflow: hidden; } /* deck wrapper — fills the viewport, centers a stage */ .deck { position: fixed; inset: 0; display: grid; place" - } - ], - "text_direction": [ - { - "path": "beautiful-html-templates/templates/biennale-yellow/template.html", - "selector_or_token": "css.text_direction", - "raw_value": "column" - } - ], - "alignment": [ - { - "path": "beautiful-html-templates/templates/biennale-yellow/template.html", - "selector_or_token": "template.css.typography", - "raw_value": "body { margin: 0; padding: 0; height: 100%; background: #0a0a0a; } body { font-family: 'Archivo', 'Helvetica Neue', sans-serif; color: var(--ink); overflow: hidden; } /* deck wrapper — fills the viewport, centers a stage */ .deck { position: fixed; inset: 0; display: grid; place" - } - ], - "role_mapping.label": [ - { - "path": "beautiful-html-templates/templates/biennale-yellow/template.html", - "selector_or_token": "role_mapping.label.source_font", - "raw_value": "JetBrains Mono" - }, - { - "path": "beautiful-html-templates/templates/biennale-yellow/design.md", - "selector_or_token": "design.typography.roles", - "raw_value": "aze: \"#F0DA7C\" ink: \"#1B2566\" ember: \"#E26B4A\" color-aliases: line: ink typography: display: fontFamily: \"'Instrument Serif', Georgia, serif\" fontWeight: 400 fontSize: \"clamp(120px, min(14.6vw, 22vh), 240px)\" lineHeight: 0.86 letterSpacing: -0.018em display-md: fo" - } - ], - "paragraph_spacing": [ - { - "path": "beautiful-html-templates/templates/biennale-yellow/template.html", - "selector_or_token": "css.paragraph_spacing", - "raw_value": "6px; clamp(14px, 1.8vh, 26px); clamp(16px, 1.8vh, 26px); clamp(12px, 1.4vh, 22px); clamp(20px, 2.4vw, 44px); clamp(18px, 2.2vh, 32px); clamp(14px, 1.8vh, 22px); clamp(14px, 1.4vw, 24px); clamp(20px, 2.5vw, 48px); 32px; clamp(18px, 2vh, 32px); 4px; clamp(8px, 1vh, 14px); clamp(12px, 1vw, 22px); 0; clamp(14px, 1.4vw, 28px)" - } - ], - "text_transform_policy": [ - { - "path": "beautiful-html-templates/templates/biennale-yellow/template.html", - "selector_or_token": "css.text_transform_policy", - "raw_value": "uppercase`; uppercase" - } - ], - "line_height_scale": [ - { - "path": "beautiful-html-templates/templates/biennale-yellow/template.html", - "selector_or_token": "css.line_height_scale", - "raw_value": "0.9; 1.04; 1.5; 0.96; 0.86; 1.45; 1; 1.1; 0.84; 1.05; 1.55; 0.92; 1.06; 1.15" - } - ], - "wrapping_policy": [ - { - "path": "beautiful-html-templates/templates/biennale-yellow/template.html", - "selector_or_token": "template.css.typography", - "raw_value": "body { margin: 0; padding: 0; height: 100%; background: #0a0a0a; } body { font-family: 'Archivo', 'Helvetica Neue', sans-serif; color: var(--ink); overflow: hidden; } /* deck wrapper — fills the viewport, centers a stage */ .deck { position: fixed; inset: 0; display: grid; place" - } - ], - "font_weight_scale": [ - { - "path": "beautiful-html-templates/templates/biennale-yellow/template.html", - "selector_or_token": "css.font_weight_scale", - "raw_value": "400; 600; 500" - } - ], - "source_typography_tokens": [ - { - "path": "beautiful-html-templates/templates/biennale-yellow/template.html", - "selector_or_token": "css.source_typography_tokens", - "raw_value": "clamp(11px, 0.85vw, 13px); clamp(10px, 0.75vw, 12px); clamp(48px, min(5.2vw, 9vh), 96px); clamp(120px, min(14.6vw, 22vh), 240px); clamp(10px, 0.72vw, 12px); clamp(11px, 0.78vw, 13px); clamp(11px, 0.74vw, 12px); clamp(56px, min(7vw, 11vh), 120px); clamp(11px, 0.85vw, 14px); clamp(110px, min(11vw, 18vh), 200px); clamp(13px, 0.95vw, 16px); clamp(28px, 2vw, 38px); clamp(22px, 1.7vw, 32px); clamp(14px, 0.95vw, 15px); clamp(220px, min(28vw, 64vh), 720px); clamp(40px, min(4.4vw, 7vh), 90px); 400; 600; " - } - ], - "role_mapping.metric": [ - { - "path": "beautiful-html-templates/templates/biennale-yellow/template.html", - "selector_or_token": "role_mapping.metric.source_font", - "raw_value": "JetBrains Mono" - }, - { - "path": "beautiful-html-templates/templates/biennale-yellow/design.md", - "selector_or_token": "design.typography.roles", - "raw_value": "aze: \"#F0DA7C\" ink: \"#1B2566\" ember: \"#E26B4A\" color-aliases: line: ink typography: display: fontFamily: \"'Instrument Serif', Georgia, serif\" fontWeight: 400 fontSize: \"clamp(120px, min(14.6vw, 22vh), 240px)\" lineHeight: 0.86 letterSpacing: -0.018em display-md: fo" - } - ], - "cjk_typography_adjustment": [ - { - "path": "beautiful-html-templates/templates/biennale-yellow/template.html", - "selector_or_token": "template.css.typography", - "raw_value": "body { margin: 0; padding: 0; height: 100%; background: #0a0a0a; } body { font-family: 'Archivo', 'Helvetica Neue', sans-serif; color: var(--ink); overflow: hidden; } /* deck wrapper — fills the viewport, centers a stage */ .deck { position: fixed; inset: 0; display: grid; place" - } - ], - "hierarchy_ratio": [ - { - "path": "beautiful-html-templates/templates/biennale-yellow/template.html", - "selector_or_token": "template.css.typography", - "raw_value": "body { margin: 0; padding: 0; height: 100%; background: #0a0a0a; } body { font-family: 'Archivo', 'Helvetica Neue', sans-serif; color: var(--ink); overflow: hidden; } /* deck wrapper — fills the viewport, centers a stage */ .deck { position: fixed; inset: 0; display: grid; place" - } - ], - "measure": [ - { - "path": "beautiful-html-templates/templates/biennale-yellow/template.html", - "selector_or_token": "template.css.typography", - "raw_value": "body { margin: 0; padding: 0; height: 100%; background: #0a0a0a; } body { font-family: 'Archivo', 'Helvetica Neue', sans-serif; color: var(--ink); overflow: hidden; } /* deck wrapper — fills the viewport, centers a stage */ .deck { position: fixed; inset: 0; display: grid; place" - } - ], - "mapping_reason": [ - { - "path": "beautiful-html-templates/templates/biennale-yellow/template.html", - "selector_or_token": "template.css.typography", - "raw_value": "body { margin: 0; padding: 0; height: 100%; background: #0a0a0a; } body { font-family: 'Archivo', 'Helvetica Neue', sans-serif; color: var(--ink); overflow: hidden; } /* deck wrapper — fills the viewport, centers a stage */ .deck { position: fixed; inset: 0; display: grid; place" - } - ], - "letter_spacing_scale": [ - { - "path": "beautiful-html-templates/templates/biennale-yellow/template.html", - "selector_or_token": "css.letter_spacing_scale", - "raw_value": "-0.012em; -0.005em; 0.18em; 0.08em; -0.018em; 0.16em; 0.2em; 0.32em; -0.04em; -0.01em; 0.04em; 0.02em; 0.22em" - } - ] } }, - "text_style_strategy": { - "bold": { - "source_usage": "source uses heavy display/label weights", - "mapped_weight": { - "display": 400, - "label": 700, - "metric": 900 - }, - "allowed_roles": [ - "display", - "label", - "metric" - ] - }, - "italic": { - "source_usage": "source uses italic/font-style or italic-family tokens", - "mapped_style": "latin_only_when_source_requires_else_normal", - "fallback_when_unavailable": "use color_shift or weight_shift; do not fake CJK italic", - "loss_notes": "Satori/Slide may not provide exact Google italic face; record as visual approximation." - }, - "underline": { - "source_usage": "source uses underline/text-decoration or hairline emphasis", - "mapped_decoration": "native underline only for actual text-decoration source usage", - "fallback_shape": "1px-3px rule or border accent when underline font rendering is unavailable" - }, - "line_through": { - "source_usage": "not present in source; default no line-through", - "mapped_decoration": "none", - "fallback_shape": "none" - }, - "emphasis": { - "color_shift": "use source accent color roles only", - "font_family_switch": "only switch between mapped display/body/label/metric roles from this family", - "weight_shift": "increase one role step within font_weight_scale", - "style_shift": "italic only when source_usage requires and CJK fallback is safe" - }, - "text_decoration_policy": { - "underline": { - "style": "solid", - "color": "currentColor", - "thickness": "1px" - }, - "line_through": { - "style": "none", - "color": "currentColor", - "thickness": "0px" - } - }, - "forbidden": [ - "fake_cjk_italic", - "drop_source_text_transform", - "drop_source_letter_spacing_without_loss_note", - "use_cross_family_font_motif", - "remote_font_dependency_without_receipt" - ], - "extraction_confidence": { - "text_decoration_policy.line_through.color": "absent_use_default", - "text_decoration_policy.underline.color": "css_extracted_from_template_html", - "text_decoration_policy.line_through.style": "absent_use_default", - "italic": "css_extracted_from_template_html", - "forbidden": "inferred_from_layout", - "emphasis": "inferred_from_layout", - "text_decoration_policy.underline.thickness": "css_extracted_from_template_html", - "underline": "css_extracted_from_template_html", - "text_decoration_policy.line_through.thickness": "absent_use_default", - "line_through": "absent_use_default", - "text_decoration_policy.underline.style": "css_extracted_from_template_html", - "bold": "css_extracted_from_template_html" - }, - "source_refs": { - "text_decoration_policy.underline.color": [ - { - "path": "beautiful-html-templates/templates/biennale-yellow/template.html", - "selector_or_token": "css.text-decoration", - "raw_value": "ights - **1px solid `{colors.ink}`** — the universal rule. Used for header-band underlines, ledger row separators, footer-column tops, and the bordered chart bar accent on the lit row. - **1px solid `rgba(27, 37, 102, 0.18-0.2)`** — soft variant of the same rule. Used for secondary row separators in" - } - ], - "italic": [ - { - "path": "beautiful-html-templates/templates/biennale-yellow/template.html", - "selector_or_token": "css.font-style", - "raw_value": "ment Serif — a contemporary high-contrast serif with tall ascenders and elegant italics — paired with Archivo for sans-serif chrome and JetBrains Mono for numerical and metadata callouts. No drop shadows, no rounded corners, no bordered cards: the only structural lines are hairline 1px rules in ink." - } - ], - "forbidden": [ - { - "path": "beautiful-html-templates/templates/biennale-yellow/template.html", - "selector_or_token": "template.css.typography", - "raw_value": "body { margin: 0; padding: 0; height: 100%; background: #0a0a0a; } body { font-family: 'Archivo', 'Helvetica Neue', sans-serif; color: var(--ink); overflow: hidden; } /* deck wrapper — fills the viewport, centers a stage */ .deck { position: fixed; inset: 0; display: grid; place" - } - ], - "emphasis": [ - { - "path": "beautiful-html-templates/templates/biennale-yellow/template.html", - "selector_or_token": "template.css.typography", - "raw_value": "body { margin: 0; padding: 0; height: 100%; background: #0a0a0a; } body { font-family: 'Archivo', 'Helvetica Neue', sans-serif; color: var(--ink); overflow: hidden; } /* deck wrapper — fills the viewport, centers a stage */ .deck { position: fixed; inset: 0; display: grid; place" - } - ], - "text_decoration_policy.underline.thickness": [ - { - "path": "beautiful-html-templates/templates/biennale-yellow/template.html", - "selector_or_token": "css.text-decoration", - "raw_value": "ights - **1px solid `{colors.ink}`** — the universal rule. Used for header-band underlines, ledger row separators, footer-column tops, and the bordered chart bar accent on the lit row. - **1px solid `rgba(27, 37, 102, 0.18-0.2)`** — soft variant of the same rule. Used for secondary row separators in" - } - ], - "underline": [ - { - "path": "beautiful-html-templates/templates/biennale-yellow/template.html", - "selector_or_token": "css.text-decoration", - "raw_value": "ights - **1px solid `{colors.ink}`** — the universal rule. Used for header-band underlines, ledger row separators, footer-column tops, and the bordered chart bar accent on the lit row. - **1px solid `rgba(27, 37, 102, 0.18-0.2)`** — soft variant of the same rule. Used for secondary row separators in" - } - ], - "text_decoration_policy.underline.style": [ - { - "path": "beautiful-html-templates/templates/biennale-yellow/template.html", - "selector_or_token": "css.text-decoration", - "raw_value": "ights - **1px solid `{colors.ink}`** — the universal rule. Used for header-band underlines, ledger row separators, footer-column tops, and the bordered chart bar accent on the lit row. - **1px solid `rgba(27, 37, 102, 0.18-0.2)`** — soft variant of the same rule. Used for secondary row separators in" - } - ], - "bold": [ - { - "path": "beautiful-html-templates/templates/biennale-yellow/template.html", - "selector_or_token": "css.font-weight", - "raw_value": "400; 600; 500" - } - ] - } - }, - "satori": { - "font_and_typography_constraints": [ - "italic is source-aware but CJK fake italic is forbidden; use color/weight fallback when unavailable", - "letter spacing is preserved for Latin labels and reset/softened for CJK" - ] - }, - "loss_notes": [ - "italic is source-aware but CJK fake italic is forbidden; use color/weight fallback when unavailable", - "letter spacing is preserved for Latin labels and reset/softened for CJK" - ], - "page_variant_count": 8, - "source_page_variants": [ - "cal", - "chapter", - "colophon", - "cover", - "data", - "manifesto", - "programme", - "quote" - ], - "page_family_source": { - "extractor": "skills/lark-slides/scripts/beautiful_template_page_family_extract.py", - "source_template_html": "beautiful-html-templates/templates/biennale-yellow/template.html", - "source_design_md": "beautiful-html-templates/templates/biennale-yellow/design.md", - "source_template_json": "beautiful-html-templates/templates/biennale-yellow/template.json", - "claim_boundary": "source extraction only; does not imply renderer, fidelity, quality gate, or production/default selectable status" - } - }, - { - "family_id": "block-frame", - "template_id": "block-frame-grid", - "runtime_template_id": "block-frame-grid", - "source_template_html": "beautiful-html-templates/templates/block-frame/template.html", - "source_design_md": "beautiful-html-templates/templates/block-frame/design.md", - "source_template_json": "beautiful-html-templates/templates/block-frame/template.json", - "renderer_id": "artboard_satori.block-frame-grid", - "renderer_module": "skills/lark-slides/scripts/artboard_renderer/templates/beautiful/block-frame-grid.mjs", - "golden_spec": "skills/lark-slides/scripts/fixtures/svglide_artboard/golden/block-frame-grid.canvas-spec.json", - "reference_screenshot": "beautiful-html-templates/screenshots/block-frame-1.png", - "fidelity_receipt": "skills/lark-slides/references/receipts/template-fidelity/block-frame.block-frame-grid.json", - "source_trace": [ - { - "source": "beautiful-html-templates/templates/block-frame/template.html", - "evidence": "source_template_html" - }, - { - "source": "beautiful-html-templates/templates/block-frame/design.md", - "evidence": "source_design_md" - }, - { - "source": "beautiful-html-templates/templates/block-frame/template.json", - "evidence": "source_template_json" - }, - { - "source": "beautiful-html-templates/screenshots/block-frame-1.png", - "evidence": "reference_screenshot" - }, - { - "source": "skills/lark-slides/references/absorptions/beautiful-html-templates/block-frame.block-frame-grid.json", - "evidence": "absorption_record" - }, - { - "source": "skills/lark-slides/references/receipts/template-fidelity/block-frame.block-frame-grid.json", - "evidence": "template_fidelity_receipt" - } - ], "visual_contract": { - "path": "skills/lark-slides/references/visual-contracts/beautiful/block-frame.block-frame-grid.json", - "layout_rhythm": "block-frame: high density, medium-low formality. Neobrutalist deck with pastel-neon color blocks and chunky black borders.", - "motifs": [ - "grid", - "accent line", - "card panels", - "poster blocks", - "quote mark", - "sticker collage" - ], - "palette_roles": [ - "accent", - "background", - "border", - "muted", - "negative", - "positive", - "primary", - "surface", - "text" - ], "do_not_simplify": [ "preserve_fonts_palette_grid_slide_classes_decorative_elements", "do_not_recolor_without_explicit_brand_override", @@ -1734,94 +1752,68 @@ "do_not_mark_production_without_renderer_golden_fidelity_receipt", "do_not_strip_identity_decorations", "do_not_recolor_without_explicit_brand_override" - ] + ], + "layout_rhythm": "biennale-yellow: medium density, high formality. Solar yellow on warm parchment with deep indigo serif and atmospheric sun-glow gradients.", + "motifs": [ + "grid", + "accent line", + "card panels", + "paper texture", + "window chrome", + "poster blocks", + "quote mark", + "sticker collage" + ], + "palette_roles": [ + "accent", + "background", + "border", + "muted", + "negative", + "positive", + "primary", + "surface", + "text" + ], + "path": "skills/lark-slides/references/visual-contracts/beautiful/biennale-yellow.biennale-programme-poster.json" }, - "fidelity_gate": { - "status": "passed", - "score": 0.9716, - "threshold": 0.72, - "reference_screenshot": "/Users/bytedance/bd-projects/beautiful-html-templates/screenshots/block-frame-1.png", - "render_screenshot": "/Users/bytedance/bd-projects/workspaces/SVGlide/.worktrees/cli-svglide-svg-private/skills/lark-slides/scripts/fixtures/svglide_artboard/golden/block-frame-grid.preview.png", - "receipt_path": "skills/lark-slides/references/receipts/template-fidelity/block-frame.block-frame-grid.json", - "issues": [] - }, - "promotion_status": "needs_review", - "default_selectable": false, + "visual_contract_path": "skills/lark-slides/references/visual-contracts/beautiful/biennale-yellow.biennale-programme-poster.json" + }, + { "blocking_issues": [ "selector_gate_missing", "quality_gate_integration_pending", "production_review_pending" ], - "visual_contract_path": "skills/lark-slides/references/visual-contracts/beautiful/block-frame.block-frame-grid.json", - "planned_renderer_module": "skills/lark-slides/scripts/artboard_renderer/templates/beautiful/block-frame-grid.mjs", - "planned_golden_spec": "skills/lark-slides/scripts/fixtures/svglide_artboard/golden/block-frame-grid.canvas-spec.json", - "planned_fidelity_receipt": "skills/lark-slides/references/receipts/template-fidelity/block-frame.block-frame-grid.json", + "default_selectable": false, + "family_id": "block-frame", + "fidelity_gate": { + "issues": [], + "receipt_path": "skills/lark-slides/references/receipts/template-fidelity/block-frame.block-frame-grid.json", + "reference_screenshot": "/Users/bytedance/bd-projects/beautiful-html-templates/screenshots/block-frame-1.png", + "render_screenshot": "/Users/bytedance/bd-projects/workspaces/SVGlide/.worktrees/cli-svglide-svg-private/skills/lark-slides/scripts/fixtures/svglide_artboard/golden/block-frame-grid.preview.png", + "score": 0.9716, + "status": "passed", + "threshold": 0.72 + }, + "fidelity_receipt": "skills/lark-slides/references/receipts/template-fidelity/block-frame.block-frame-grid.json", "font_strategy": { - "source_fonts": [ - "Space Grotesk", - "Inter" - ], - "slide_native_preferred": [ - "system-sans-cjk" - ], "adobe_or_embedded_fallback": [ "Source Sans Pro", "思源黑体" ], "cjk_fallback": "Noto Sans SC", - "role_mapping": { - "display": { - "source_font": "Space Grotesk", - "slide_font": "Source Sans Pro", - "runtime_alias": "SVGlideDisplay", - "cjk_font": "思源黑体", - "fallback_stack": [ - "system-sans-cjk", - "SVGlideDisplay" - ], - "source_only": false, - "requires_download": false, - "mapping_reason": "保留 Space Grotesk 的语义角色,但运行时优先使用 Slide/系统可用的 Source Sans Pro 与 思源黑体。" - }, - "body": { - "source_font": "Inter", - "slide_font": "Source Sans Pro", - "runtime_alias": "SVGlideBody", - "cjk_font": "思源黑体", - "fallback_stack": [ - "system-sans-cjk", - "SVGlideBody" - ], - "source_only": false, - "requires_download": false, - "mapping_reason": "保留 Inter 的语义角色,但运行时优先使用 Slide/系统可用的 Source Sans Pro 与 思源黑体。" - }, - "label": { - "source_font": "Space Grotesk", - "slide_font": "Source Sans Pro", - "runtime_alias": "SVGlideLabel", - "cjk_font": "思源黑体", - "fallback_stack": [ - "system-sans-cjk", - "SVGlideLabel" - ], - "source_only": false, - "requires_download": false, - "mapping_reason": "保留 Space Grotesk 的语义角色,但运行时优先使用 Slide/系统可用的 Source Sans Pro 与 思源黑体。" - }, - "metric": { - "source_font": "Space Grotesk", - "slide_font": "Source Sans Pro", - "runtime_alias": "SVGlideMetric", - "cjk_font": "思源黑体", - "fallback_stack": [ - "system-sans-cjk", - "SVGlideMetric" - ], - "source_only": false, - "requires_download": false, - "mapping_reason": "保留 Space Grotesk 的语义角色,但运行时优先使用 Slide/系统可用的 Source Sans Pro 与 思源黑体。" - } + "extraction_confidence": { + "adobe_or_embedded_fallback": "inferred_from_layout", + "cjk_fallback": "inferred_from_layout", + "forbidden": "inferred_from_layout", + "mapping_reason": "inferred_from_layout", + "role_mapping.body": "inferred_from_layout", + "role_mapping.display": "inferred_from_layout", + "role_mapping.label": "inferred_from_layout", + "role_mapping.metric": "inferred_from_layout", + "slide_native_preferred": "inferred_from_layout", + "source_fonts": "css_extracted_from_template_html" }, "forbidden": [ "remote_font_runtime_dependency", @@ -1830,119 +1822,729 @@ "drop_cjk_fallback" ], "mapping_reason": "根据 design.md/template.html/template.json 中的 font-family 与 typography token 提取源字体;运行时按 Slide/系统/Adobe/思源可用字体降级。", + "role_mapping": { + "body": { + "cjk_font": "思源黑体", + "fallback_stack": [ + "system-sans-cjk", + "SVGlideBody" + ], + "mapping_reason": "保留 Inter 的语义角色,但运行时优先使用 Slide/系统可用的 Source Sans Pro 与 思源黑体。", + "requires_download": false, + "runtime_alias": "SVGlideBody", + "slide_font": "Source Sans Pro", + "source_font": "Inter", + "source_only": false + }, + "display": { + "cjk_font": "思源黑体", + "fallback_stack": [ + "system-sans-cjk", + "SVGlideDisplay" + ], + "mapping_reason": "保留 Space Grotesk 的语义角色,但运行时优先使用 Slide/系统可用的 Source Sans Pro 与 思源黑体。", + "requires_download": false, + "runtime_alias": "SVGlideDisplay", + "slide_font": "Source Sans Pro", + "source_font": "Space Grotesk", + "source_only": false + }, + "label": { + "cjk_font": "思源黑体", + "fallback_stack": [ + "system-sans-cjk", + "SVGlideLabel" + ], + "mapping_reason": "保留 Space Grotesk 的语义角色,但运行时优先使用 Slide/系统可用的 Source Sans Pro 与 思源黑体。", + "requires_download": false, + "runtime_alias": "SVGlideLabel", + "slide_font": "Source Sans Pro", + "source_font": "Space Grotesk", + "source_only": false + }, + "metric": { + "cjk_font": "思源黑体", + "fallback_stack": [ + "system-sans-cjk", + "SVGlideMetric" + ], + "mapping_reason": "保留 Space Grotesk 的语义角色,但运行时优先使用 Slide/系统可用的 Source Sans Pro 与 思源黑体。", + "requires_download": false, + "runtime_alias": "SVGlideMetric", + "slide_font": "Source Sans Pro", + "source_font": "Space Grotesk", + "source_only": false + } + }, + "same_role_font_justification": "源模板本身以单一 sans/system family 承担多数字体角色;通过 weight/size/line-height/uppercase 区分 display/body/label/metric。", + "slide_native_preferred": [ + "system-sans-cjk" + ], "source_evidence": [ "beautiful-html-templates/templates/block-frame/design.md", "beautiful-html-templates/templates/block-frame/template.html", "beautiful-html-templates/templates/block-frame/template.json", "beautiful-html-templates/screenshots/block-frame-1.png" ], - "same_role_font_justification": "源模板本身以单一 sans/system family 承担多数字体角色;通过 weight/size/line-height/uppercase 区分 display/body/label/metric。", - "extraction_confidence": { - "role_mapping.body": "inferred_from_layout", - "role_mapping.display": "inferred_from_layout", - "source_fonts": "css_extracted_from_template_html", - "adobe_or_embedded_fallback": "inferred_from_layout", - "cjk_fallback": "inferred_from_layout", - "role_mapping.metric": "inferred_from_layout", - "forbidden": "inferred_from_layout", - "slide_native_preferred": "inferred_from_layout", - "mapping_reason": "inferred_from_layout", - "role_mapping.label": "inferred_from_layout" - }, + "source_fonts": [ + "Space Grotesk", + "Inter" + ], "source_refs": { - "role_mapping.body": [ - { - "path": "beautiful-html-templates/templates/block-frame/template.html", - "selector_or_token": "role_mapping.body.source_font", - "raw_value": "Inter" - }, - { - "path": "beautiful-html-templates/templates/block-frame/design.md", - "selector_or_token": "design.typography.roles", - "raw_value": "w: \"12px 12px 0px {colors.yellow}\" close-white: \"6px 6px 0px {colors.white}\" typography: heading-xl: fontFamily: \"'Inter', sans-serif\" fontWeight: 900 fontSize: \"clamp(48px, 6vw, 96px)\" lineHeight: 0.95 letterSpacing: -0.03em textTransform: uppercase heading-lg: fo" - } - ], - "role_mapping.display": [ - { - "path": "beautiful-html-templates/templates/block-frame/template.html", - "selector_or_token": "role_mapping.display.source_font", - "raw_value": "Space Grotesk" - }, - { - "path": "beautiful-html-templates/templates/block-frame/design.md", - "selector_or_token": "design.typography.roles", - "raw_value": "w: \"12px 12px 0px {colors.yellow}\" close-white: \"6px 6px 0px {colors.white}\" typography: heading-xl: fontFamily: \"'Inter', sans-serif\" fontWeight: 900 fontSize: \"clamp(48px, 6vw, 96px)\" lineHeight: 0.95 letterSpacing: -0.03em textTransform: uppercase heading-lg: fo" - } - ], - "source_fonts": [ - { - "path": "beautiful-html-templates/templates/block-frame/template.html", - "selector_or_token": "css.font-family", - "raw_value": "'Noto Sans SC', sans-serif`. 思源黑体 ships Latin glyphs that pair cleanly with its Chinese characters, so mixed sentences render in one consistent face. The Inter / Space Grotesk distinction in the Latin original is preserved through weight contrast: weight 900 carries the brutalist display role, weight 600 carries the label role, weight 400–500 carries body. Visual hierarchy survives even though the face contrast is gone. ### Loading Add to the template's ``: ```html `: ```html `: ```html `: ```html `: ```html `: ```html `: ```html `: ```html `: ```html `: ```html `: ```html `: ```html where the market sits
what actually matters
mission ", + "selector_or_token": "css.font-weight" + } + ], + "emphasis": [ + { + "path": "beautiful-html-templates/templates/broadside/template.html", + "raw_value": "r { position: fixed; bottom: 20px; right: 28px; font-family: var(--f-mono); font-size: 10px; letter-spacing: 0.12em; color: rgba(255, 255, 255, 0.25); z-index: 100; user-select: none; } /* ╔═════════════════════════", + "selector_or_token": "template.css.typography" + } + ], + "forbidden": [ + { + "path": "beautiful-html-templates/templates/broadside/template.html", + "raw_value": "r { position: fixed; bottom: 20px; right: 28px; font-family: var(--f-mono); font-size: 10px; letter-spacing: 0.12em; color: rgba(255, 255, 255, 0.25); z-index: 100; user-select: none; } /* ╔═════════════════════════", + "selector_or_token": "template.css.typography" + } + ], + "italic": [ + { + "path": "beautiful-html-templates/templates/broadside/template.html", + "raw_value": "y typographic rhythm; the primary rhythm is Barlow's own weight and size axis. Italic is not used. Underline is not used. The only emphasis mechanisms are weight, size, and color (orange accent on dark, or weight-only on orange). ### Display, Heading, and Body Scale | Token | Size | Family | Weig", + "selector_or_token": "css.font-style" + } + ], + "text_decoration_policy.underline.color": [ + { + "path": "beautiful-html-templates/templates/broadside/template.html", + "raw_value": "; the primary rhythm is Barlow's own weight and size axis. Italic is not used. Underline is not used. The only emphasis mechanisms are weight, size, and color (orange accent on dark, or weight-only on orange). ### Display, Heading, and Body Scale | Token | Size | Family | Weight | Use | |---|---|", + "selector_or_token": "css.text-decoration" + } + ], + "text_decoration_policy.underline.style": [ + { + "path": "beautiful-html-templates/templates/broadside/template.html", + "raw_value": "; the primary rhythm is Barlow's own weight and size axis. Italic is not used. Underline is not used. The only emphasis mechanisms are weight, size, and color (orange accent on dark, or weight-only on orange). ### Display, Heading, and Body Scale | Token | Size | Family | Weight | Use | |---|---|", + "selector_or_token": "css.text-decoration" + } + ], + "text_decoration_policy.underline.thickness": [ + { + "path": "beautiful-html-templates/templates/broadside/template.html", + "raw_value": "; the primary rhythm is Barlow's own weight and size axis. Italic is not used. Underline is not used. The only emphasis mechanisms are weight, size, and color (orange accent on dark, or weight-only on orange). ### Display, Heading, and Body Scale | Token | Size | Family | Weight | Use | |---|---|", + "selector_or_token": "css.text-decoration" + } + ], + "underline": [ + { + "path": "beautiful-html-templates/templates/broadside/template.html", + "raw_value": "; the primary rhythm is Barlow's own weight and size axis. Italic is not used. Underline is not used. The only emphasis mechanisms are weight, size, and color (orange accent on dark, or weight-only on orange). ### Display, Heading, and Body Scale | Token | Size | Family | Weight | Use | |---|---|", + "selector_or_token": "css.text-decoration" + } + ] + }, + "text_decoration_policy": { + "line_through": { + "color": "currentColor", + "style": "none", + "thickness": "0px" + }, + "underline": { + "color": "currentColor", + "style": "solid", + "thickness": "1px" + } + }, + "underline": { + "fallback_shape": "1px-3px rule or border accent when underline font rendering is unavailable", + "mapped_decoration": "native underline only for actual text-decoration source usage", + "source_usage": "source uses underline/text-decoration or hairline emphasis" + } + }, "typography_strategy": { + "alignment": { + "fallback": "left/top aligned unless source screenshot is centered", + "primary": "follow source composition" + }, + "cjk_typography_adjustment": { + "body_font_cn": "Noto Sans SC", + "display_font_cn": "Noto Serif SC", + "italic_policy": "color_only_emphasis", + "letter_spacing_policy": "reset_letter_spacing_for_cjk_keep_latin_labels", + "mixed_run_spacing": "pangu_spacing" + }, + "extraction_confidence": { + "alignment": "inferred_from_layout", + "cjk_typography_adjustment": "inferred_from_layout", + "font_size_scale": "css_extracted_from_template_html", + "font_weight_scale": "css_extracted_from_template_html", + "hierarchy_ratio": "inferred_from_layout", + "letter_spacing_scale": "css_extracted_from_template_html", + "line_height_scale": "css_extracted_from_template_html", + "mapping_reason": "inferred_from_layout", + "max_lines": "inferred_from_layout", + "measure": "inferred_from_layout", + "paragraph_spacing": "css_extracted_from_template_html", + "role_mapping.body": "inferred_from_layout", + "role_mapping.display": "inferred_from_layout", + "role_mapping.label": "inferred_from_layout", + "role_mapping.metric": "inferred_from_layout", + "source_typography_tokens": "css_extracted_from_template_html", + "text_direction": "css_extracted_from_template_html", + "text_transform_policy": "css_extracted_from_template_html", + "word_spacing": "absent_use_default", + "wrapping_policy": "inferred_from_layout", + "writing_mode": "absent_use_default" + }, + "font_size_scale": { + "body": 20, + "display": 54, + "label": 12, + "metric": 42 + }, + "font_weight_scale": { + "body": 400, + "display": 900, + "label": 700, + "metric": 900 + }, + "hierarchy_ratio": 2.7, + "letter_spacing_scale": { + "body": 0, + "display": 0, + "label": 0.08, + "metric": 0 + }, + "line_height_scale": { + "body": 1.32, + "display": 0.9, + "label": 1.05, + "metric": 0.95 + }, + "mapping_reason": "按源模板字号/字重/行高/字距/大小写规则抽象到 960x540 Slide 画布的四个文本角色。", + "max_lines": { + "body": 5, + "display": 3, + "label": 1, + "metric": 2 + }, + "measure": { + "body": "40-70 characters or CJK equivalent", + "display": "0.55-0.78 canvas width", + "label": "short mono labels", + "metric": "short numeric/stat blocks" + }, + "paragraph_spacing": { + "body_after": 12, + "display_after": 0, + "label_after": 0, + "metric_after": 0 + }, + "role_mapping": { + "body": { + "alignment": "source_layout_dependent", + "font_role": "body", + "font_size": 20, + "font_weight": 400, + "letter_spacing": 0, + "line_height": 1.32, + "max_lines": 5, + "runtime_alias": "SVGlideBody", + "source_font": "IBM Plex Mono", + "text_transform": "preserve_source_case" + }, + "display": { + "alignment": "source_layout_dependent", + "font_role": "display", + "font_size": 54, + "font_weight": 900, + "letter_spacing": 0, + "line_height": 0.9, + "max_lines": 3, + "runtime_alias": "SVGlideDisplay", + "source_font": "Barlow", + "text_transform": "latin_uppercase_only" + }, + "label": { + "alignment": "source_layout_dependent", + "font_role": "label", + "font_size": 12, + "font_weight": 700, + "letter_spacing": 0.08, + "line_height": 1.05, + "max_lines": 1, + "runtime_alias": "SVGlideLabel", + "source_font": "IBM Plex Mono", + "text_transform": "latin_uppercase_labels_reset_cjk_spacing" + }, + "metric": { + "alignment": "source_layout_dependent", + "font_role": "metric", + "font_size": 42, + "font_weight": 900, + "letter_spacing": 0, + "line_height": 0.95, + "max_lines": 2, + "runtime_alias": "SVGlideMetric", + "source_font": "IBM Plex Mono", + "text_transform": "preserve_numbers_and_units" + } + }, + "source_refs": { + "alignment": [ + { + "path": "beautiful-html-templates/templates/broadside/template.html", + "raw_value": "r { position: fixed; bottom: 20px; right: 28px; font-family: var(--f-mono); font-size: 10px; letter-spacing: 0.12em; color: rgba(255, 255, 255, 0.25); z-index: 100; user-select: none; } /* ╔═════════════════════════", + "selector_or_token": "template.css.typography" + } + ], + "cjk_typography_adjustment": [ + { + "path": "beautiful-html-templates/templates/broadside/template.html", + "raw_value": "r { position: fixed; bottom: 20px; right: 28px; font-family: var(--f-mono); font-size: 10px; letter-spacing: 0.12em; color: rgba(255, 255, 255, 0.25); z-index: 100; user-select: none; } /* ╔═════════════════════════", + "selector_or_token": "template.css.typography" + } + ], + "font_size_scale": [ + { + "path": "beautiful-html-templates/templates/broadside/template.html", + "raw_value": "10px; var(--sz-display); var(--sz-h1); var(--sz-h2); var(--sz-h3); var(--sz-lead); var(--sz-body); var(--sz-caption); var(--sz-label); 0.85rem; 5.5vw; 10vw; 3.8vw; 1.1vw; 7.5vw; 10.5vw", + "selector_or_token": "css.font_size_scale" + } + ], + "font_weight_scale": [ + { + "path": "beautiful-html-templates/templates/broadside/template.html", + "raw_value": "900; 800; 700; 600; 400; 500; 300; 900\" > where the market sits
what actually matters
mission ", + "selector_or_token": "css.font_weight_scale" + } + ], + "hierarchy_ratio": [ + { + "path": "beautiful-html-templates/templates/broadside/template.html", + "raw_value": "r { position: fixed; bottom: 20px; right: 28px; font-family: var(--f-mono); font-size: 10px; letter-spacing: 0.12em; color: rgba(255, 255, 255, 0.25); z-index: 100; user-select: none; } /* ╔═════════════════════════", + "selector_or_token": "template.css.typography" + } + ], + "letter_spacing_scale": [ + { + "path": "beautiful-html-templates/templates/broadside/template.html", + "raw_value": "0.12em; -0.04em; -0.03em; -0.02em; 0.14em; 0.2em; 0.05em; 0.16em; 0.04em; 0.1em; 0.06em; -0.02em\" data-anim=\"fade-up\" data-delay=\"0\" > how it works
01
Discover
Talk to users. Read the data. Surface what's actually true vs. what the team assumes.
02 / Chapter

the next chapter begins here

On speed

\"Move fast and you'll break things. Move slow and something else will break you.\"
where the market sits

02 / Chapter

the next chapter begins here

On speed

\"Move fast and you'll break things. Move slow and something else will break you.\"
where the market sits
what actually matters
mission " - } - ], - "source_typography_tokens": [ - { - "path": "beautiful-html-templates/templates/broadside/template.html", - "selector_or_token": "css.source_typography_tokens", - "raw_value": "10px; var(--sz-display); var(--sz-h1); var(--sz-h2); var(--sz-h3); var(--sz-lead); var(--sz-body); var(--sz-caption); var(--sz-label); 0.85rem; 5.5vw; 10vw; 3.8vw; 1.1vw; 7.5vw; 10.5vw; 900; 800; 700; 600; 400; 500; 300; 900\" > where the market sits
how it works
01
Discover
Talk to users. Read the data. Surface what's actually true vs. what the team assumes.
where the market sits
what actually matters
mission " - } - ] - } - }, - "satori": { - "font_and_typography_constraints": [ - "distinctive display face may be approximated by Slide/Source/思源 fonts; preserve weight/size/case first", - "italic is source-aware but CJK fake italic is forbidden; use color/weight fallback when unavailable", - "letter spacing is preserved for Latin labels and reset/softened for CJK" - ] - }, - "loss_notes": [ - "distinctive display face may be approximated by Slide/Source/思源 fonts; preserve weight/size/case first", - "italic is source-aware but CJK fake italic is forbidden; use color/weight fallback when unavailable", - "letter spacing is preserved for Latin labels and reset/softened for CJK" - ], - "page_variant_count": 16, - "source_page_variants": [ - "chapter", - "chart", - "compare", - "cover", - "cycle", - "diagram", - "end", - "fadelist", - "list", - "pie", - "pyramid", - "quote", - "split", - "statement", - "stats", - "vtimeline" - ], - "page_family_source": { - "extractor": "skills/lark-slides/scripts/beautiful_template_page_family_extract.py", - "source_template_html": "beautiful-html-templates/templates/broadside/template.html", - "source_design_md": "beautiful-html-templates/templates/broadside/design.md", - "source_template_json": "beautiful-html-templates/templates/broadside/template.json", - "claim_boundary": "source extraction only; does not imply renderer, fidelity, quality gate, or production/default selectable status" - } - }, - { - "family_id": "capsule", - "template_id": "capsule-card-system", - "runtime_template_id": "capsule-card-system", - "source_template_html": "beautiful-html-templates/templates/capsule/template.html", - "source_design_md": "beautiful-html-templates/templates/capsule/design.md", - "source_template_json": "beautiful-html-templates/templates/capsule/template.json", - "renderer_id": "artboard_satori.capsule-card-system", - "renderer_module": "skills/lark-slides/scripts/artboard_renderer/templates/beautiful/capsule-card-system.mjs", - "golden_spec": "skills/lark-slides/scripts/fixtures/svglide_artboard/golden/capsule-card-system.canvas-spec.json", - "reference_screenshot": "beautiful-html-templates/screenshots/capsule-1.png", - "fidelity_receipt": "skills/lark-slides/references/receipts/template-fidelity/capsule.capsule-card-system.json", - "source_trace": [ - { - "source": "beautiful-html-templates/templates/capsule/template.html", - "evidence": "source_template_html" - }, - { - "source": "beautiful-html-templates/templates/capsule/design.md", - "evidence": "source_design_md" - }, - { - "source": "beautiful-html-templates/templates/capsule/template.json", - "evidence": "source_template_json" - }, - { - "source": "beautiful-html-templates/screenshots/capsule-1.png", - "evidence": "reference_screenshot" - }, - { - "source": "skills/lark-slides/references/absorptions/beautiful-html-templates/capsule.capsule-card-system.json", - "evidence": "absorption_record" - }, - { - "source": "skills/lark-slides/references/receipts/template-fidelity/capsule.capsule-card-system.json", - "evidence": "template_fidelity_receipt" - } - ], "visual_contract": { - "path": "skills/lark-slides/references/visual-contracts/beautiful/capsule.capsule-card-system.json", - "layout_rhythm": "capsule: medium density, medium-low formality. Modular pill-shaped cards on warm bone with a full pastel-pop palette.", + "do_not_simplify": [ + "preserve_fonts_palette_grid_slide_classes_decorative_elements", + "do_not_recolor_without_explicit_brand_override", + "do_not_mix_template_families", + "extend_missing_layout_inside_same_family", + "do_not_strip_identity_decorations", + "new_palette", + "cross_family_components", + "fake_italic", + "new_decorative_motif", + "remote_font_dependency", + "do_not_replace_family_with_generic_card_shell", + "do_not_mark_production_without_renderer_golden_fidelity_receipt", + "do_not_strip_identity_decorations", + "do_not_recolor_without_explicit_brand_override" + ], + "layout_rhythm": "broadside: medium density, medium-high formality. Dark editorial canvas with a single fire orange accent and bilingual Latin/Chinese type stack.", "motifs": [ "grid", "accent line", @@ -5152,109 +5345,45 @@ "surface", "text" ], - "do_not_simplify": [ - "preserve_fonts_palette_grid_slide_classes_decorative_elements", - "do_not_recolor_without_explicit_brand_override", - "do_not_mix_template_families", - "extend_missing_layout_inside_same_family", - "do_not_strip_identity_decorations", - "new_palette", - "cross_family_components", - "fake_italic", - "new_decorative_motif", - "remote_font_dependency", - "do_not_replace_family_with_generic_card_shell", - "do_not_mark_production_without_renderer_golden_fidelity_receipt", - "do_not_strip_identity_decorations", - "do_not_recolor_without_explicit_brand_override" - ] + "path": "skills/lark-slides/references/visual-contracts/beautiful/broadside.editorial-quote-chart.json" }, - "fidelity_gate": { - "status": "passed", - "score": 0.9158, - "threshold": 0.72, - "reference_screenshot": "/Users/bytedance/bd-projects/beautiful-html-templates/screenshots/capsule-1.png", - "render_screenshot": "/Users/bytedance/bd-projects/workspaces/SVGlide/.worktrees/cli-svglide-svg-private/skills/lark-slides/scripts/fixtures/svglide_artboard/golden/capsule-card-system.preview.png", - "receipt_path": "skills/lark-slides/references/receipts/template-fidelity/capsule.capsule-card-system.json", - "issues": [] - }, - "promotion_status": "needs_review", - "default_selectable": false, + "visual_contract_path": "skills/lark-slides/references/visual-contracts/beautiful/broadside.editorial-quote-chart.json" + }, + { "blocking_issues": [ "selector_gate_missing", "quality_gate_integration_pending", "production_review_pending" ], - "visual_contract_path": "skills/lark-slides/references/visual-contracts/beautiful/capsule.capsule-card-system.json", - "planned_renderer_module": "skills/lark-slides/scripts/artboard_renderer/templates/beautiful/capsule-card-system.mjs", - "planned_golden_spec": "skills/lark-slides/scripts/fixtures/svglide_artboard/golden/capsule-card-system.canvas-spec.json", - "planned_fidelity_receipt": "skills/lark-slides/references/receipts/template-fidelity/capsule.capsule-card-system.json", + "default_selectable": false, + "family_id": "capsule", + "fidelity_gate": { + "issues": [], + "receipt_path": "skills/lark-slides/references/receipts/template-fidelity/capsule.capsule-card-system.json", + "reference_screenshot": "/Users/bytedance/bd-projects/beautiful-html-templates/screenshots/capsule-1.png", + "render_screenshot": "/Users/bytedance/bd-projects/workspaces/SVGlide/.worktrees/cli-svglide-svg-private/skills/lark-slides/scripts/fixtures/svglide_artboard/golden/capsule-card-system.preview.png", + "score": 0.9158, + "status": "passed", + "threshold": 0.72 + }, + "fidelity_receipt": "skills/lark-slides/references/receipts/template-fidelity/capsule.capsule-card-system.json", "font_strategy": { - "source_fonts": [ - "Bodoni Moda", - "Space Grotesk" - ], - "slide_native_preferred": [ - "system-sans-cjk" - ], "adobe_or_embedded_fallback": [ "Source Sans Pro", "思源黑体" ], "cjk_fallback": "LXGW WenKai TC", - "role_mapping": { - "display": { - "source_font": "Bodoni Moda", - "slide_font": "Source Sans Pro", - "runtime_alias": "SVGlideDisplay", - "cjk_font": "思源黑体", - "fallback_stack": [ - "system-sans-cjk", - "SVGlideDisplay" - ], - "source_only": false, - "requires_download": false, - "mapping_reason": "保留 Bodoni Moda 的语义角色,但运行时优先使用 Slide/系统可用的 Source Sans Pro 与 思源黑体。" - }, - "body": { - "source_font": "Space Grotesk", - "slide_font": "Source Sans Pro", - "runtime_alias": "SVGlideBody", - "cjk_font": "思源黑体", - "fallback_stack": [ - "system-sans-cjk", - "SVGlideBody" - ], - "source_only": false, - "requires_download": false, - "mapping_reason": "保留 Space Grotesk 的语义角色,但运行时优先使用 Slide/系统可用的 Source Sans Pro 与 思源黑体。" - }, - "label": { - "source_font": "Bodoni Moda", - "slide_font": "Source Sans Pro", - "runtime_alias": "SVGlideLabel", - "cjk_font": "思源黑体", - "fallback_stack": [ - "system-sans-cjk", - "SVGlideLabel" - ], - "source_only": false, - "requires_download": false, - "mapping_reason": "保留 Bodoni Moda 的语义角色,但运行时优先使用 Slide/系统可用的 Source Sans Pro 与 思源黑体。" - }, - "metric": { - "source_font": "Bodoni Moda", - "slide_font": "Source Sans Pro", - "runtime_alias": "SVGlideMetric", - "cjk_font": "思源黑体", - "fallback_stack": [ - "system-sans-cjk", - "SVGlideMetric" - ], - "source_only": false, - "requires_download": false, - "mapping_reason": "保留 Bodoni Moda 的语义角色,但运行时优先使用 Slide/系统可用的 Source Sans Pro 与 思源黑体。" - } + "extraction_confidence": { + "adobe_or_embedded_fallback": "inferred_from_layout", + "cjk_fallback": "inferred_from_layout", + "forbidden": "inferred_from_layout", + "mapping_reason": "inferred_from_layout", + "role_mapping.body": "inferred_from_layout", + "role_mapping.display": "inferred_from_layout", + "role_mapping.label": "inferred_from_layout", + "role_mapping.metric": "inferred_from_layout", + "slide_native_preferred": "inferred_from_layout", + "source_fonts": "css_extracted_from_template_html" }, "forbidden": [ "remote_font_runtime_dependency", @@ -5263,119 +5392,687 @@ "drop_cjk_fallback" ], "mapping_reason": "根据 design.md/template.html/template.json 中的 font-family 与 typography token 提取源字体;运行时按 Slide/系统/Adobe/思源可用字体降级。", + "role_mapping": { + "body": { + "cjk_font": "思源黑体", + "fallback_stack": [ + "system-sans-cjk", + "SVGlideBody" + ], + "mapping_reason": "保留 Space Grotesk 的语义角色,但运行时优先使用 Slide/系统可用的 Source Sans Pro 与 思源黑体。", + "requires_download": false, + "runtime_alias": "SVGlideBody", + "slide_font": "Source Sans Pro", + "source_font": "Space Grotesk", + "source_only": false + }, + "display": { + "cjk_font": "思源黑体", + "fallback_stack": [ + "system-sans-cjk", + "SVGlideDisplay" + ], + "mapping_reason": "保留 Bodoni Moda 的语义角色,但运行时优先使用 Slide/系统可用的 Source Sans Pro 与 思源黑体。", + "requires_download": false, + "runtime_alias": "SVGlideDisplay", + "slide_font": "Source Sans Pro", + "source_font": "Bodoni Moda", + "source_only": false + }, + "label": { + "cjk_font": "思源黑体", + "fallback_stack": [ + "system-sans-cjk", + "SVGlideLabel" + ], + "mapping_reason": "保留 Bodoni Moda 的语义角色,但运行时优先使用 Slide/系统可用的 Source Sans Pro 与 思源黑体。", + "requires_download": false, + "runtime_alias": "SVGlideLabel", + "slide_font": "Source Sans Pro", + "source_font": "Bodoni Moda", + "source_only": false + }, + "metric": { + "cjk_font": "思源黑体", + "fallback_stack": [ + "system-sans-cjk", + "SVGlideMetric" + ], + "mapping_reason": "保留 Bodoni Moda 的语义角色,但运行时优先使用 Slide/系统可用的 Source Sans Pro 与 思源黑体。", + "requires_download": false, + "runtime_alias": "SVGlideMetric", + "slide_font": "Source Sans Pro", + "source_font": "Bodoni Moda", + "source_only": false + } + }, + "same_role_font_justification": "源模板本身以单一 sans/system family 承担多数字体角色;通过 weight/size/line-height/uppercase 区分 display/body/label/metric。", + "slide_native_preferred": [ + "system-sans-cjk" + ], "source_evidence": [ "beautiful-html-templates/templates/capsule/design.md", "beautiful-html-templates/templates/capsule/template.html", "beautiful-html-templates/templates/capsule/template.json", "beautiful-html-templates/screenshots/capsule-1.png" ], - "same_role_font_justification": "源模板本身以单一 sans/system family 承担多数字体角色;通过 weight/size/line-height/uppercase 区分 display/body/label/metric。", - "extraction_confidence": { - "role_mapping.body": "inferred_from_layout", - "role_mapping.display": "inferred_from_layout", - "source_fonts": "css_extracted_from_template_html", - "adobe_or_embedded_fallback": "inferred_from_layout", - "cjk_fallback": "inferred_from_layout", - "role_mapping.metric": "inferred_from_layout", - "forbidden": "inferred_from_layout", - "slide_native_preferred": "inferred_from_layout", - "mapping_reason": "inferred_from_layout", - "role_mapping.label": "inferred_from_layout" - }, + "source_fonts": [ + "Bodoni Moda", + "Space Grotesk" + ], "source_refs": { - "role_mapping.body": [ - { - "path": "beautiful-html-templates/templates/capsule/template.html", - "selector_or_token": "role_mapping.body.source_font", - "raw_value": "Space Grotesk" - }, - { - "path": "beautiful-html-templates/templates/capsule/design.md", - "selector_or_token": "design.typography.roles", - "raw_value": "ft 6–12px offset shadow. The aesthetic is \"Memphis-meets-editorial\" — confident typography, generous bordered shapes, and decorative floating pills as atmospheric wallpaper. colors: cream: \"#F5F5F0\" ink: \"#1A1A1A\" outline: \"#1E1E1E\" white: \"#FFFFFF\" coral: \"#E85D4E\" lime: \"#C4D94E\" la" - } - ], - "role_mapping.display": [ - { - "path": "beautiful-html-templates/templates/capsule/template.html", - "selector_or_token": "role_mapping.display.source_font", - "raw_value": "Bodoni Moda" - }, - { - "path": "beautiful-html-templates/templates/capsule/design.md", - "selector_or_token": "design.typography.roles", - "raw_value": "ft 6–12px offset shadow. The aesthetic is \"Memphis-meets-editorial\" — confident typography, generous bordered shapes, and decorative floating pills as atmospheric wallpaper. colors: cream: \"#F5F5F0\" ink: \"#1A1A1A\" outline: \"#1E1E1E\" white: \"#FFFFFF\" coral: \"#E85D4E\" lime: \"#C4D94E\" la" - } - ], - "source_fonts": [ - { - "path": "beautiful-html-templates/templates/capsule/template.html", - "selector_or_token": "css.font-family", - "raw_value": "var(--font-body); var(--font-display)" - } - ], "adobe_or_embedded_fallback": [ { "path": "beautiful-html-templates/templates/capsule/template.html", - "selector_or_token": "css.font-family", - "raw_value": "var(--font-body); var(--font-display)" + "raw_value": "var(--font-body); var(--font-display)", + "selector_or_token": "css.font-family" } ], "cjk_fallback": [ { "path": "beautiful-html-templates/templates/capsule/template.html", - "selector_or_token": "css.font-family", - "raw_value": "var(--font-body); var(--font-display)" - } - ], - "role_mapping.metric": [ - { - "path": "beautiful-html-templates/templates/capsule/template.html", - "selector_or_token": "role_mapping.metric.source_font", - "raw_value": "Bodoni Moda" - }, - { - "path": "beautiful-html-templates/templates/capsule/design.md", - "selector_or_token": "design.typography.roles", - "raw_value": "ft 6–12px offset shadow. The aesthetic is \"Memphis-meets-editorial\" — confident typography, generous bordered shapes, and decorative floating pills as atmospheric wallpaper. colors: cream: \"#F5F5F0\" ink: \"#1A1A1A\" outline: \"#1E1E1E\" white: \"#FFFFFF\" coral: \"#E85D4E\" lime: \"#C4D94E\" la" + "raw_value": "var(--font-body); var(--font-display)", + "selector_or_token": "css.font-family" } ], "forbidden": [ { "path": "beautiful-html-templates/templates/capsule/template.html", - "selector_or_token": "css.font-family", - "raw_value": "var(--font-body); var(--font-display)" - } - ], - "slide_native_preferred": [ - { - "path": "beautiful-html-templates/templates/capsule/template.html", - "selector_or_token": "css.font-family", - "raw_value": "var(--font-body); var(--font-display)" + "raw_value": "var(--font-body); var(--font-display)", + "selector_or_token": "css.font-family" } ], "mapping_reason": [ { "path": "beautiful-html-templates/templates/capsule/template.html", - "selector_or_token": "css.font-family", - "raw_value": "var(--font-body); var(--font-display)" + "raw_value": "var(--font-body); var(--font-display)", + "selector_or_token": "css.font-family" + } + ], + "role_mapping.body": [ + { + "path": "beautiful-html-templates/templates/capsule/template.html", + "raw_value": "Space Grotesk", + "selector_or_token": "role_mapping.body.source_font" + }, + { + "path": "beautiful-html-templates/templates/capsule/design.md", + "raw_value": "ft 6–12px offset shadow. The aesthetic is \"Memphis-meets-editorial\" — confident typography, generous bordered shapes, and decorative floating pills as atmospheric wallpaper. colors: cream: \"#F5F5F0\" ink: \"#1A1A1A\" outline: \"#1E1E1E\" white: \"#FFFFFF\" coral: \"#E85D4E\" lime: \"#C4D94E\" la", + "selector_or_token": "design.typography.roles" + } + ], + "role_mapping.display": [ + { + "path": "beautiful-html-templates/templates/capsule/template.html", + "raw_value": "Bodoni Moda", + "selector_or_token": "role_mapping.display.source_font" + }, + { + "path": "beautiful-html-templates/templates/capsule/design.md", + "raw_value": "ft 6–12px offset shadow. The aesthetic is \"Memphis-meets-editorial\" — confident typography, generous bordered shapes, and decorative floating pills as atmospheric wallpaper. colors: cream: \"#F5F5F0\" ink: \"#1A1A1A\" outline: \"#1E1E1E\" white: \"#FFFFFF\" coral: \"#E85D4E\" lime: \"#C4D94E\" la", + "selector_or_token": "design.typography.roles" } ], "role_mapping.label": [ { "path": "beautiful-html-templates/templates/capsule/template.html", - "selector_or_token": "role_mapping.label.source_font", - "raw_value": "Bodoni Moda" + "raw_value": "Bodoni Moda", + "selector_or_token": "role_mapping.label.source_font" }, { "path": "beautiful-html-templates/templates/capsule/design.md", - "selector_or_token": "design.typography.roles", - "raw_value": "ft 6–12px offset shadow. The aesthetic is \"Memphis-meets-editorial\" — confident typography, generous bordered shapes, and decorative floating pills as atmospheric wallpaper. colors: cream: \"#F5F5F0\" ink: \"#1A1A1A\" outline: \"#1E1E1E\" white: \"#FFFFFF\" coral: \"#E85D4E\" lime: \"#C4D94E\" la" + "raw_value": "ft 6–12px offset shadow. The aesthetic is \"Memphis-meets-editorial\" — confident typography, generous bordered shapes, and decorative floating pills as atmospheric wallpaper. colors: cream: \"#F5F5F0\" ink: \"#1A1A1A\" outline: \"#1E1E1E\" white: \"#FFFFFF\" coral: \"#E85D4E\" lime: \"#C4D94E\" la", + "selector_or_token": "design.typography.roles" + } + ], + "role_mapping.metric": [ + { + "path": "beautiful-html-templates/templates/capsule/template.html", + "raw_value": "Bodoni Moda", + "selector_or_token": "role_mapping.metric.source_font" + }, + { + "path": "beautiful-html-templates/templates/capsule/design.md", + "raw_value": "ft 6–12px offset shadow. The aesthetic is \"Memphis-meets-editorial\" — confident typography, generous bordered shapes, and decorative floating pills as atmospheric wallpaper. colors: cream: \"#F5F5F0\" ink: \"#1A1A1A\" outline: \"#1E1E1E\" white: \"#FFFFFF\" coral: \"#E85D4E\" lime: \"#C4D94E\" la", + "selector_or_token": "design.typography.roles" + } + ], + "slide_native_preferred": [ + { + "path": "beautiful-html-templates/templates/capsule/template.html", + "raw_value": "var(--font-body); var(--font-display)", + "selector_or_token": "css.font-family" + } + ], + "source_fonts": [ + { + "path": "beautiful-html-templates/templates/capsule/template.html", + "raw_value": "var(--font-body); var(--font-display)", + "selector_or_token": "css.font-family" } ] } }, + "golden_spec": "skills/lark-slides/scripts/fixtures/svglide_artboard/golden/capsule-card-system.canvas-spec.json", + "implemented_page_variants": [ + "cover", + "agenda", + "data_dashboard", + "data_dashboard-4", + "quote_or_emphasis", + "process_or_timeline", + "data_dashboard-7", + "slide-8", + "slide-9", + "closing" + ], + "loss_notes": [ + "italic is source-aware but CJK fake italic is forbidden; use color/weight fallback when unavailable", + "letter spacing is preserved for Latin labels and reset/softened for CJK" + ], + "page_family_implementation_note": "Implemented ten source-backed Capsule page variants with pill cards, orbit, bars, quote, timeline, stats, flow, visual split, and closing. Kept needs_review/default_selectable=false pending visual review and production gates.", + "page_family_smoke_deck": "skills/lark-slides/references/page-family-smoke-decks/capsule.json", + "page_family_smoke_receipt": "skills/lark-slides/references/receipts/page-family-smoke/capsule.capsule-card-system.json", + "page_family_source": { + "claim_boundary": "source extraction only; does not imply renderer, fidelity, quality gate, or production/default selectable status", + "extractor": "skills/lark-slides/scripts/beautiful_template_page_family_extract.py", + "source_design_md": "beautiful-html-templates/templates/capsule/design.md", + "source_template_html": "beautiful-html-templates/templates/capsule/template.html", + "source_template_json": "beautiful-html-templates/templates/capsule/template.json" + }, + "page_variant_count": 10, + "page_variant_golden_specs": { + "agenda": "skills/lark-slides/scripts/fixtures/svglide_artboard/golden/capsule.agenda.canvas-spec.json", + "closing": "skills/lark-slides/scripts/fixtures/svglide_artboard/golden/capsule.closing.canvas-spec.json", + "cover": "skills/lark-slides/scripts/fixtures/svglide_artboard/golden/capsule.cover.canvas-spec.json", + "data_dashboard": "skills/lark-slides/scripts/fixtures/svglide_artboard/golden/capsule.data_dashboard.canvas-spec.json", + "data_dashboard-4": "skills/lark-slides/scripts/fixtures/svglide_artboard/golden/capsule.data_dashboard-4.canvas-spec.json", + "data_dashboard-7": "skills/lark-slides/scripts/fixtures/svglide_artboard/golden/capsule.data_dashboard-7.canvas-spec.json", + "process_or_timeline": "skills/lark-slides/scripts/fixtures/svglide_artboard/golden/capsule.process_or_timeline.canvas-spec.json", + "quote_or_emphasis": "skills/lark-slides/scripts/fixtures/svglide_artboard/golden/capsule.quote_or_emphasis.canvas-spec.json", + "slide-8": "skills/lark-slides/scripts/fixtures/svglide_artboard/golden/capsule.slide-8.canvas-spec.json", + "slide-9": "skills/lark-slides/scripts/fixtures/svglide_artboard/golden/capsule.slide-9.canvas-spec.json" + }, + "planned_fidelity_receipt": "skills/lark-slides/references/receipts/template-fidelity/capsule.capsule-card-system.json", + "planned_golden_spec": "skills/lark-slides/scripts/fixtures/svglide_artboard/golden/capsule-card-system.canvas-spec.json", + "planned_renderer_module": "skills/lark-slides/scripts/artboard_renderer/templates/beautiful/capsule-card-system.mjs", + "promotion_status": "needs_review", + "reference_screenshot": "beautiful-html-templates/screenshots/capsule-1.png", + "renderer_id": "artboard_satori.capsule-card-system", + "renderer_module": "skills/lark-slides/scripts/artboard_renderer/templates/beautiful/capsule-card-system.mjs", + "runtime_template_id": "capsule-card-system", + "satori": { + "font_and_typography_constraints": [ + "italic is source-aware but CJK fake italic is forbidden; use color/weight fallback when unavailable", + "letter spacing is preserved for Latin labels and reset/softened for CJK" + ] + }, + "source_design_md": "beautiful-html-templates/templates/capsule/design.md", + "source_page_variants": [ + "agenda", + "closing", + "cover", + "data_dashboard", + "data_dashboard-4", + "data_dashboard-7", + "process_or_timeline", + "quote_or_emphasis", + "slide-8", + "slide-9" + ], + "source_template_html": "beautiful-html-templates/templates/capsule/template.html", + "source_template_json": "beautiful-html-templates/templates/capsule/template.json", + "source_trace": [ + { + "evidence": "source_template_html", + "source": "beautiful-html-templates/templates/capsule/template.html" + }, + { + "evidence": "source_design_md", + "source": "beautiful-html-templates/templates/capsule/design.md" + }, + { + "evidence": "source_template_json", + "source": "beautiful-html-templates/templates/capsule/template.json" + }, + { + "evidence": "reference_screenshot", + "source": "beautiful-html-templates/screenshots/capsule-1.png" + }, + { + "evidence": "absorption_record", + "source": "skills/lark-slides/references/absorptions/beautiful-html-templates/capsule.capsule-card-system.json" + }, + { + "evidence": "template_fidelity_receipt", + "source": "skills/lark-slides/references/receipts/template-fidelity/capsule.capsule-card-system.json" + } + ], + "supported_page_variants": [ + "cover", + "agenda", + "data_dashboard", + "data_dashboard-4", + "quote_or_emphasis", + "process_or_timeline", + "data_dashboard-7", + "slide-8", + "slide-9", + "closing" + ], + "template_id": "capsule-card-system", + "text_style_strategy": { + "bold": { + "allowed_roles": [ + "display", + "label", + "metric" + ], + "mapped_weight": { + "display": 900, + "label": 700, + "metric": 900 + }, + "source_usage": "source uses heavy display/label weights" + }, + "emphasis": { + "color_shift": "use source accent color roles only", + "font_family_switch": "only switch between mapped display/body/label/metric roles from this family", + "style_shift": "italic only when source_usage requires and CJK fallback is safe", + "weight_shift": "increase one role step within font_weight_scale" + }, + "extraction_confidence": { + "bold": "css_extracted_from_template_html", + "emphasis": "inferred_from_layout", + "forbidden": "inferred_from_layout", + "italic": "css_extracted_from_template_html", + "line_through": "absent_use_default", + "text_decoration_policy.line_through.color": "absent_use_default", + "text_decoration_policy.line_through.style": "absent_use_default", + "text_decoration_policy.line_through.thickness": "absent_use_default", + "text_decoration_policy.underline.color": "css_extracted_from_template_html", + "text_decoration_policy.underline.style": "css_extracted_from_template_html", + "text_decoration_policy.underline.thickness": "css_extracted_from_template_html", + "underline": "css_extracted_from_template_html" + }, + "forbidden": [ + "fake_cjk_italic", + "drop_source_text_transform", + "drop_source_letter_spacing_without_loss_note", + "use_cross_family_font_motif", + "remote_font_dependency_without_receipt" + ], + "italic": { + "fallback_when_unavailable": "use color_shift or weight_shift; do not fake CJK italic", + "loss_notes": "Satori/Slide may not provide exact Google italic face; record as visual approximation.", + "mapped_style": "latin_only_when_source_requires_else_normal", + "source_usage": "source uses italic/font-style or italic-family tokens" + }, + "line_through": { + "fallback_shape": "none", + "mapped_decoration": "none", + "source_usage": "not present in source; default no line-through" + }, + "source_refs": { + "bold": [ + { + "path": "beautiful-html-templates/templates/capsule/template.html", + "raw_value": "500; 700; 800; 400; 600", + "selector_or_token": "css.font-weight" + } + ], + "emphasis": [ + { + "path": "beautiful-html-templates/templates/capsule/template.html", + "raw_value": "h: 100%; height: 100%; overflow: hidden; background: var(--bg); font-family: var(--font-body); color: var(--fg); } /* Grain texture overlay */ .grain-overlay { position: fixed; inset: 0; pointer-events: none; z-index: 9999; opacity: 0.04; mix-blend-", + "selector_or_token": "template.css.typography" + } + ], + "forbidden": [ + { + "path": "beautiful-html-templates/templates/capsule/template.html", + "raw_value": "h: 100%; height: 100%; overflow: hidden; background: var(--bg); font-family: var(--font-body); color: var(--fg); } /* Grain texture overlay */ .grain-overlay { position: fixed; inset: 0; pointer-events: none; z-index: 9999; opacity: 0.04; mix-blend-", + "selector_or_token": "template.css.typography" + } + ], + "italic": [ + { + "path": "beautiful-html-templates/templates/capsule/template.html", + "raw_value": "eadlines. An inline `` inside a Bodoni headline keeps Bodoni and shifts to italic. A `quote-highlight` inside a Bodoni quote body switches the wrapped word to a pill (Space Grotesk uppercase pill text on a candy fill) for visual emphasis. ### Type Scale | Token | Size | Family | Weight | Use", + "selector_or_token": "css.font-style" + } + ], + "text_decoration_policy.underline.color": [ + { + "path": "beautiful-html-templates/templates/capsule/template.html", + "raw_value": "talic appears only inside pull-quote bodies via the `` tag (Bodoni italic). Underline is not used. Pill-encapsulation is the system's primary emphasis mechanism: wrapping a phrase in a candy-filled pill is the equivalent of bold-italicizing it in a traditional editorial system. Line-height tigh", + "selector_or_token": "css.text-decoration" + } + ], + "text_decoration_policy.underline.style": [ + { + "path": "beautiful-html-templates/templates/capsule/template.html", + "raw_value": "talic appears only inside pull-quote bodies via the `` tag (Bodoni italic). Underline is not used. Pill-encapsulation is the system's primary emphasis mechanism: wrapping a phrase in a candy-filled pill is the equivalent of bold-italicizing it in a traditional editorial system. Line-height tigh", + "selector_or_token": "css.text-decoration" + } + ], + "text_decoration_policy.underline.thickness": [ + { + "path": "beautiful-html-templates/templates/capsule/template.html", + "raw_value": "talic appears only inside pull-quote bodies via the `` tag (Bodoni italic). Underline is not used. Pill-encapsulation is the system's primary emphasis mechanism: wrapping a phrase in a candy-filled pill is the equivalent of bold-italicizing it in a traditional editorial system. Line-height tigh", + "selector_or_token": "css.text-decoration" + } + ], + "underline": [ + { + "path": "beautiful-html-templates/templates/capsule/template.html", + "raw_value": "talic appears only inside pull-quote bodies via the `` tag (Bodoni italic). Underline is not used. Pill-encapsulation is the system's primary emphasis mechanism: wrapping a phrase in a candy-filled pill is the equivalent of bold-italicizing it in a traditional editorial system. Line-height tigh", + "selector_or_token": "css.text-decoration" + } + ] + }, + "text_decoration_policy": { + "line_through": { + "color": "currentColor", + "style": "none", + "thickness": "0px" + }, + "underline": { + "color": "currentColor", + "style": "solid", + "thickness": "1px" + } + }, + "underline": { + "fallback_shape": "1px-3px rule or border accent when underline font rendering is unavailable", + "mapped_decoration": "native underline only for actual text-decoration source usage", + "source_usage": "source uses underline/text-decoration or hairline emphasis" + } + }, "typography_strategy": { + "alignment": { + "fallback": "left/top aligned unless source screenshot is centered", + "primary": "follow source composition" + }, + "cjk_typography_adjustment": { + "body_font_cn": "ZCOOL XiaoWei", + "display_font_cn": "LXGW WenKai TC", + "italic_policy": "weight_only_emphasis", + "letter_spacing_policy": "reset_letter_spacing_for_cjk_keep_latin_labels", + "mixed_run_spacing": "pangu_spacing" + }, + "extraction_confidence": { + "alignment": "inferred_from_layout", + "cjk_typography_adjustment": "inferred_from_layout", + "font_size_scale": "css_extracted_from_template_html", + "font_weight_scale": "css_extracted_from_template_html", + "hierarchy_ratio": "inferred_from_layout", + "letter_spacing_scale": "css_extracted_from_template_html", + "line_height_scale": "css_extracted_from_template_html", + "mapping_reason": "inferred_from_layout", + "max_lines": "inferred_from_layout", + "measure": "inferred_from_layout", + "paragraph_spacing": "css_extracted_from_template_html", + "role_mapping.body": "inferred_from_layout", + "role_mapping.display": "inferred_from_layout", + "role_mapping.label": "inferred_from_layout", + "role_mapping.metric": "inferred_from_layout", + "source_typography_tokens": "css_extracted_from_template_html", + "text_direction": "css_extracted_from_template_html", + "text_transform_policy": "css_extracted_from_template_html", + "word_spacing": "absent_use_default", + "wrapping_policy": "inferred_from_layout", + "writing_mode": "absent_use_default" + }, + "font_size_scale": { + "body": 20, + "display": 54, + "label": 12, + "metric": 42 + }, + "font_weight_scale": { + "body": 400, + "display": 900, + "label": 700, + "metric": 900 + }, + "hierarchy_ratio": 2.7, + "letter_spacing_scale": { + "body": 0, + "display": 0, + "label": 0.08, + "metric": 0 + }, + "line_height_scale": { + "body": 1.32, + "display": 0.9, + "label": 1.05, + "metric": 0.95 + }, + "mapping_reason": "按源模板字号/字重/行高/字距/大小写规则抽象到 960x540 Slide 画布的四个文本角色。", + "max_lines": { + "body": 5, + "display": 3, + "label": 1, + "metric": 2 + }, + "measure": { + "body": "40-70 characters or CJK equivalent", + "display": "0.55-0.78 canvas width", + "label": "short mono labels", + "metric": "short numeric/stat blocks" + }, + "paragraph_spacing": { + "body_after": 12, + "display_after": 0, + "label_after": 0, + "metric_after": 0 + }, + "role_mapping": { + "body": { + "alignment": "source_layout_dependent", + "font_role": "body", + "font_size": 20, + "font_weight": 400, + "letter_spacing": 0, + "line_height": 1.32, + "max_lines": 5, + "runtime_alias": "SVGlideBody", + "source_font": "Space Grotesk", + "text_transform": "preserve_source_case" + }, + "display": { + "alignment": "source_layout_dependent", + "font_role": "display", + "font_size": 54, + "font_weight": 900, + "letter_spacing": 0, + "line_height": 0.9, + "max_lines": 3, + "runtime_alias": "SVGlideDisplay", + "source_font": "Bodoni Moda", + "text_transform": "latin_uppercase_only" + }, + "label": { + "alignment": "source_layout_dependent", + "font_role": "label", + "font_size": 12, + "font_weight": 700, + "letter_spacing": 0.08, + "line_height": 1.05, + "max_lines": 1, + "runtime_alias": "SVGlideLabel", + "source_font": "Bodoni Moda", + "text_transform": "latin_uppercase_labels_reset_cjk_spacing" + }, + "metric": { + "alignment": "source_layout_dependent", + "font_role": "metric", + "font_size": 42, + "font_weight": 900, + "letter_spacing": 0, + "line_height": 0.95, + "max_lines": 2, + "runtime_alias": "SVGlideMetric", + "source_font": "Bodoni Moda", + "text_transform": "preserve_numbers_and_units" + } + }, + "source_refs": { + "alignment": [ + { + "path": "beautiful-html-templates/templates/capsule/template.html", + "raw_value": "h: 100%; height: 100%; overflow: hidden; background: var(--bg); font-family: var(--font-body); color: var(--fg); } /* Grain texture overlay */ .grain-overlay { position: fixed; inset: 0; pointer-events: none; z-index: 9999; opacity: 0.04; mix-blend-", + "selector_or_token": "template.css.typography" + } + ], + "cjk_typography_adjustment": [ + { + "path": "beautiful-html-templates/templates/capsule/template.html", + "raw_value": "h: 100%; height: 100%; overflow: hidden; background: var(--bg); font-family: var(--font-body); color: var(--fg); } /* Grain texture overlay */ .grain-overlay { position: fixed; inset: 0; pointer-events: none; z-index: 9999; opacity: 0.04; mix-blend-", + "selector_or_token": "template.css.typography" + } + ], + "font_size_scale": [ + { + "path": "beautiful-html-templates/templates/capsule/template.html", + "raw_value": "0.75rem; 0.65rem; clamp(3rem, 8vw, 7rem); clamp(0.8rem, 1.5vw, 1.1rem); 0.85rem; clamp(2rem, 4vw, 3.5rem); clamp(0.95rem, 1.2vw, 1.15rem); 2.5rem; clamp(1.8rem, 3.5vw, 3rem); 0.7rem; 1.5rem; 0.9rem; 8rem; clamp(1.6rem, 3.5vw, 3rem); 1.3rem; 0.8rem", + "selector_or_token": "css.font_size_scale" + } + ], + "font_weight_scale": [ + { + "path": "beautiful-html-templates/templates/capsule/template.html", + "raw_value": "500; 700; 800; 400; 600", + "selector_or_token": "css.font_weight_scale" + } + ], + "hierarchy_ratio": [ + { + "path": "beautiful-html-templates/templates/capsule/template.html", + "raw_value": "h: 100%; height: 100%; overflow: hidden; background: var(--bg); font-family: var(--font-body); color: var(--fg); } /* Grain texture overlay */ .grain-overlay { position: fixed; inset: 0; pointer-events: none; z-index: 9999; opacity: 0.04; mix-blend-", + "selector_or_token": "template.css.typography" + } + ], + "letter_spacing_scale": [ + { + "path": "beautiful-html-templates/templates/capsule/template.html", + "raw_value": "0.02em; 0.1em; 0.08em; 0.04em; -0.02em; 0.15em; 0.12em; 0.06em; -0.01em; -0.03em", + "selector_or_token": "css.letter_spacing_scale" + } + ], + "line_height_scale": [ + { + "path": "beautiful-html-templates/templates/capsule/template.html", + "raw_value": "0.9; 1.05; 1.6; 1.1; 1.55; 0; 1.35; 1.3; 1.4; 1; 0.95", + "selector_or_token": "css.line_height_scale" + } + ], + "mapping_reason": [ + { + "path": "beautiful-html-templates/templates/capsule/template.html", + "raw_value": "h: 100%; height: 100%; overflow: hidden; background: var(--bg); font-family: var(--font-body); color: var(--fg); } /* Grain texture overlay */ .grain-overlay { position: fixed; inset: 0; pointer-events: none; z-index: 9999; opacity: 0.04; mix-blend-", + "selector_or_token": "template.css.typography" + } + ], + "max_lines": [ + { + "path": "beautiful-html-templates/templates/capsule/template.html", + "raw_value": "h: 100%; height: 100%; overflow: hidden; background: var(--bg); font-family: var(--font-body); color: var(--fg); } /* Grain texture overlay */ .grain-overlay { position: fixed; inset: 0; pointer-events: none; z-index: 9999; opacity: 0.04; mix-blend-", + "selector_or_token": "template.css.typography" + } + ], + "measure": [ + { + "path": "beautiful-html-templates/templates/capsule/template.html", + "raw_value": "h: 100%; height: 100%; overflow: hidden; background: var(--bg); font-family: var(--font-body); color: var(--fg); } /* Grain texture overlay */ .grain-overlay { position: fixed; inset: 0; pointer-events: none; z-index: 9999; opacity: 0.04; mix-blend-", + "selector_or_token": "template.css.typography" + } + ], + "paragraph_spacing": [ + { + "path": "beautiful-html-templates/templates/capsule/template.html", + "raw_value": "2rem; 1rem; 0.5rem; 0.75rem; 4rem; 1.5rem; 3rem; 2rem; 1.25rem; 2.5rem; 1rem; 0; 0.6rem; 0.5rem", + "selector_or_token": "css.paragraph_spacing" + } + ], + "role_mapping.body": [ + { + "path": "beautiful-html-templates/templates/capsule/template.html", + "raw_value": "Space Grotesk", + "selector_or_token": "role_mapping.body.source_font" + }, + { + "path": "beautiful-html-templates/templates/capsule/design.md", + "raw_value": "ft 6–12px offset shadow. The aesthetic is \"Memphis-meets-editorial\" — confident typography, generous bordered shapes, and decorative floating pills as atmospheric wallpaper. colors: cream: \"#F5F5F0\" ink: \"#1A1A1A\" outline: \"#1E1E1E\" white: \"#FFFFFF\" coral: \"#E85D4E\" lime: \"#C4D94E\" la", + "selector_or_token": "design.typography.roles" + } + ], + "role_mapping.display": [ + { + "path": "beautiful-html-templates/templates/capsule/template.html", + "raw_value": "Bodoni Moda", + "selector_or_token": "role_mapping.display.source_font" + }, + { + "path": "beautiful-html-templates/templates/capsule/design.md", + "raw_value": "ft 6–12px offset shadow. The aesthetic is \"Memphis-meets-editorial\" — confident typography, generous bordered shapes, and decorative floating pills as atmospheric wallpaper. colors: cream: \"#F5F5F0\" ink: \"#1A1A1A\" outline: \"#1E1E1E\" white: \"#FFFFFF\" coral: \"#E85D4E\" lime: \"#C4D94E\" la", + "selector_or_token": "design.typography.roles" + } + ], + "role_mapping.label": [ + { + "path": "beautiful-html-templates/templates/capsule/template.html", + "raw_value": "Bodoni Moda", + "selector_or_token": "role_mapping.label.source_font" + }, + { + "path": "beautiful-html-templates/templates/capsule/design.md", + "raw_value": "ft 6–12px offset shadow. The aesthetic is \"Memphis-meets-editorial\" — confident typography, generous bordered shapes, and decorative floating pills as atmospheric wallpaper. colors: cream: \"#F5F5F0\" ink: \"#1A1A1A\" outline: \"#1E1E1E\" white: \"#FFFFFF\" coral: \"#E85D4E\" lime: \"#C4D94E\" la", + "selector_or_token": "design.typography.roles" + } + ], + "role_mapping.metric": [ + { + "path": "beautiful-html-templates/templates/capsule/template.html", + "raw_value": "Bodoni Moda", + "selector_or_token": "role_mapping.metric.source_font" + }, + { + "path": "beautiful-html-templates/templates/capsule/design.md", + "raw_value": "ft 6–12px offset shadow. The aesthetic is \"Memphis-meets-editorial\" — confident typography, generous bordered shapes, and decorative floating pills as atmospheric wallpaper. colors: cream: \"#F5F5F0\" ink: \"#1A1A1A\" outline: \"#1E1E1E\" white: \"#FFFFFF\" coral: \"#E85D4E\" lime: \"#C4D94E\" la", + "selector_or_token": "design.typography.roles" + } + ], + "source_typography_tokens": [ + { + "path": "beautiful-html-templates/templates/capsule/template.html", + "raw_value": "0.75rem; 0.65rem; clamp(3rem, 8vw, 7rem); clamp(0.8rem, 1.5vw, 1.1rem); 0.85rem; clamp(2rem, 4vw, 3.5rem); clamp(0.95rem, 1.2vw, 1.15rem); 2.5rem; clamp(1.8rem, 3.5vw, 3rem); 0.7rem; 1.5rem; 0.9rem; 8rem; clamp(1.6rem, 3.5vw, 3rem); 1.3rem; 0.8rem; 500; 700; 800; 400; 600; 0.9; 1.05; 1.6; 1.1; 1.55; 0; 1.35; 1.3; 1.4; 1; 0.95; 0.02em; 0.1em; 0.08em; 0.04em; -0.02em; 0.15em; 0.12em; 0.06em; -0.01em; -0.03em; uppercase` on any pill/label/subtitle when content is Hanzi — Chinese has no case; upperc", + "selector_or_token": "css.source_typography_tokens" + } + ], + "text_direction": [ + { + "path": "beautiful-html-templates/templates/capsule/template.html", + "raw_value": "column", + "selector_or_token": "css.text_direction" + } + ], + "text_transform_policy": [ + { + "path": "beautiful-html-templates/templates/capsule/template.html", + "raw_value": "uppercase` on any pill/label/subtitle when content is Hanzi — Chinese has no case; uppercase", + "selector_or_token": "css.text_transform_policy" + } + ], + "wrapping_policy": [ + { + "path": "beautiful-html-templates/templates/capsule/template.html", + "raw_value": "h: 100%; height: 100%; overflow: hidden; background: var(--bg); font-family: var(--font-body); color: var(--fg); } /* Grain texture overlay */ .grain-overlay { position: fixed; inset: 0; pointer-events: none; z-index: 9999; opacity: 0.04; mix-blend-", + "selector_or_token": "template.css.typography" + } + ] + }, "source_typography_tokens": { "font_families": [ "Bodoni Moda", @@ -5400,18 +6097,6 @@ "400", "500" ], - "line_height": [ - "0.9", - "0.95", - "1.05", - "1.35", - "1.1", - "1", - "1.6", - "1.55", - "1.4", - "0" - ], "letter_spacing": [ "-0.02em", "-0.03em", @@ -5424,11 +6109,18 @@ "0.04em", "0.06em" ], - "text_transform": [ - "uppercase", - "uppercase` on any pill/label/subtitle when content is Hanzi — Chinese has no case" + "line_height": [ + "0.9", + "0.95", + "1.05", + "1.35", + "1.1", + "1", + "1.6", + "1.55", + "1.4", + "0" ], - "word_spacing": [], "paragraph_spacing": [ "2rem", "1rem", @@ -5445,541 +6137,45 @@ "0.6rem", "0.5rem" ], + "text_decoration": [], "text_direction": [ "column" ], - "writing_mode": [], - "text_decoration": [] + "text_transform": [ + "uppercase", + "uppercase` on any pill/label/subtitle when content is Hanzi — Chinese has no case" + ], + "word_spacing": [], + "writing_mode": [] }, - "role_mapping": { - "display": { - "font_role": "display", - "source_font": "Bodoni Moda", - "runtime_alias": "SVGlideDisplay", - "font_size": 54, - "font_weight": 900, - "line_height": 0.9, - "letter_spacing": 0, - "text_transform": "latin_uppercase_only", - "max_lines": 3, - "alignment": "source_layout_dependent" - }, - "body": { - "font_role": "body", - "source_font": "Space Grotesk", - "runtime_alias": "SVGlideBody", - "font_size": 20, - "font_weight": 400, - "line_height": 1.32, - "letter_spacing": 0, - "text_transform": "preserve_source_case", - "max_lines": 5, - "alignment": "source_layout_dependent" - }, - "label": { - "font_role": "label", - "source_font": "Bodoni Moda", - "runtime_alias": "SVGlideLabel", - "font_size": 12, - "font_weight": 700, - "line_height": 1.05, - "letter_spacing": 0.08, - "text_transform": "latin_uppercase_labels_reset_cjk_spacing", - "max_lines": 1, - "alignment": "source_layout_dependent" - }, - "metric": { - "font_role": "metric", - "source_font": "Bodoni Moda", - "runtime_alias": "SVGlideMetric", - "font_size": 42, - "font_weight": 900, - "line_height": 0.95, - "letter_spacing": 0, - "text_transform": "preserve_numbers_and_units", - "max_lines": 2, - "alignment": "source_layout_dependent" - } - }, - "font_size_scale": { - "display": 54, - "body": 20, - "label": 12, - "metric": 42 - }, - "font_weight_scale": { - "display": 900, - "body": 400, - "label": 700, - "metric": 900 - }, - "line_height_scale": { - "display": 0.9, - "body": 1.32, - "label": 1.05, - "metric": 0.95 - }, - "letter_spacing_scale": { - "display": 0, - "body": 0, - "label": 0.08, - "metric": 0 + "text_direction": { + "cjk": "ltr", + "default": "column" }, "text_transform_policy": { - "display": "latin_uppercase_only", "body": "preserve_source_case", + "display": "latin_uppercase_only", "label": "latin_uppercase_labels_reset_cjk_spacing", "metric": "preserve_numbers_and_units" }, - "hierarchy_ratio": 2.7, - "max_lines": { - "display": 3, - "body": 5, - "label": 1, - "metric": 2 - }, - "measure": { - "display": "0.55-0.78 canvas width", - "body": "40-70 characters or CJK equivalent", - "label": "short mono labels", - "metric": "short numeric/stat blocks" - }, - "alignment": { - "primary": "follow source composition", - "fallback": "left/top aligned unless source screenshot is centered" - }, - "cjk_typography_adjustment": { - "display_font_cn": "LXGW WenKai TC", - "body_font_cn": "ZCOOL XiaoWei", - "letter_spacing_policy": "reset_letter_spacing_for_cjk_keep_latin_labels", - "mixed_run_spacing": "pangu_spacing", - "italic_policy": "weight_only_emphasis" - }, - "mapping_reason": "按源模板字号/字重/行高/字距/大小写规则抽象到 960x540 Slide 画布的四个文本角色。", "word_spacing": { - "display": 0, "body": 0, + "display": 0, "label": 0, "metric": 0 }, - "paragraph_spacing": { - "display_after": 0, - "body_after": 12, - "label_after": 0, - "metric_after": 0 - }, "wrapping_policy": { - "display": "manual_break_or_balance", "body": "wrap_with_measure", + "display": "manual_break_or_balance", "label": "no_wrap_preferred", "metric": "no_wrap_preferred" }, - "text_direction": { - "default": "column", - "cjk": "ltr" - }, "writing_mode": { "default": "horizontal-tb", "vertical_roles": [] - }, - "extraction_confidence": { - "role_mapping.body": "inferred_from_layout", - "role_mapping.display": "inferred_from_layout", - "font_size_scale": "css_extracted_from_template_html", - "max_lines": "inferred_from_layout", - "writing_mode": "absent_use_default", - "text_direction": "css_extracted_from_template_html", - "alignment": "inferred_from_layout", - "role_mapping.label": "inferred_from_layout", - "paragraph_spacing": "css_extracted_from_template_html", - "text_transform_policy": "css_extracted_from_template_html", - "line_height_scale": "css_extracted_from_template_html", - "wrapping_policy": "inferred_from_layout", - "font_weight_scale": "css_extracted_from_template_html", - "source_typography_tokens": "css_extracted_from_template_html", - "word_spacing": "absent_use_default", - "role_mapping.metric": "inferred_from_layout", - "cjk_typography_adjustment": "inferred_from_layout", - "hierarchy_ratio": "inferred_from_layout", - "measure": "inferred_from_layout", - "mapping_reason": "inferred_from_layout", - "letter_spacing_scale": "css_extracted_from_template_html" - }, - "source_refs": { - "role_mapping.body": [ - { - "path": "beautiful-html-templates/templates/capsule/template.html", - "selector_or_token": "role_mapping.body.source_font", - "raw_value": "Space Grotesk" - }, - { - "path": "beautiful-html-templates/templates/capsule/design.md", - "selector_or_token": "design.typography.roles", - "raw_value": "ft 6–12px offset shadow. The aesthetic is \"Memphis-meets-editorial\" — confident typography, generous bordered shapes, and decorative floating pills as atmospheric wallpaper. colors: cream: \"#F5F5F0\" ink: \"#1A1A1A\" outline: \"#1E1E1E\" white: \"#FFFFFF\" coral: \"#E85D4E\" lime: \"#C4D94E\" la" - } - ], - "role_mapping.display": [ - { - "path": "beautiful-html-templates/templates/capsule/template.html", - "selector_or_token": "role_mapping.display.source_font", - "raw_value": "Bodoni Moda" - }, - { - "path": "beautiful-html-templates/templates/capsule/design.md", - "selector_or_token": "design.typography.roles", - "raw_value": "ft 6–12px offset shadow. The aesthetic is \"Memphis-meets-editorial\" — confident typography, generous bordered shapes, and decorative floating pills as atmospheric wallpaper. colors: cream: \"#F5F5F0\" ink: \"#1A1A1A\" outline: \"#1E1E1E\" white: \"#FFFFFF\" coral: \"#E85D4E\" lime: \"#C4D94E\" la" - } - ], - "font_size_scale": [ - { - "path": "beautiful-html-templates/templates/capsule/template.html", - "selector_or_token": "css.font_size_scale", - "raw_value": "0.75rem; 0.65rem; clamp(3rem, 8vw, 7rem); clamp(0.8rem, 1.5vw, 1.1rem); 0.85rem; clamp(2rem, 4vw, 3.5rem); clamp(0.95rem, 1.2vw, 1.15rem); 2.5rem; clamp(1.8rem, 3.5vw, 3rem); 0.7rem; 1.5rem; 0.9rem; 8rem; clamp(1.6rem, 3.5vw, 3rem); 1.3rem; 0.8rem" - } - ], - "max_lines": [ - { - "path": "beautiful-html-templates/templates/capsule/template.html", - "selector_or_token": "template.css.typography", - "raw_value": "h: 100%; height: 100%; overflow: hidden; background: var(--bg); font-family: var(--font-body); color: var(--fg); } /* Grain texture overlay */ .grain-overlay { position: fixed; inset: 0; pointer-events: none; z-index: 9999; opacity: 0.04; mix-blend-" - } - ], - "text_direction": [ - { - "path": "beautiful-html-templates/templates/capsule/template.html", - "selector_or_token": "css.text_direction", - "raw_value": "column" - } - ], - "alignment": [ - { - "path": "beautiful-html-templates/templates/capsule/template.html", - "selector_or_token": "template.css.typography", - "raw_value": "h: 100%; height: 100%; overflow: hidden; background: var(--bg); font-family: var(--font-body); color: var(--fg); } /* Grain texture overlay */ .grain-overlay { position: fixed; inset: 0; pointer-events: none; z-index: 9999; opacity: 0.04; mix-blend-" - } - ], - "role_mapping.label": [ - { - "path": "beautiful-html-templates/templates/capsule/template.html", - "selector_or_token": "role_mapping.label.source_font", - "raw_value": "Bodoni Moda" - }, - { - "path": "beautiful-html-templates/templates/capsule/design.md", - "selector_or_token": "design.typography.roles", - "raw_value": "ft 6–12px offset shadow. The aesthetic is \"Memphis-meets-editorial\" — confident typography, generous bordered shapes, and decorative floating pills as atmospheric wallpaper. colors: cream: \"#F5F5F0\" ink: \"#1A1A1A\" outline: \"#1E1E1E\" white: \"#FFFFFF\" coral: \"#E85D4E\" lime: \"#C4D94E\" la" - } - ], - "paragraph_spacing": [ - { - "path": "beautiful-html-templates/templates/capsule/template.html", - "selector_or_token": "css.paragraph_spacing", - "raw_value": "2rem; 1rem; 0.5rem; 0.75rem; 4rem; 1.5rem; 3rem; 2rem; 1.25rem; 2.5rem; 1rem; 0; 0.6rem; 0.5rem" - } - ], - "text_transform_policy": [ - { - "path": "beautiful-html-templates/templates/capsule/template.html", - "selector_or_token": "css.text_transform_policy", - "raw_value": "uppercase` on any pill/label/subtitle when content is Hanzi — Chinese has no case; uppercase" - } - ], - "line_height_scale": [ - { - "path": "beautiful-html-templates/templates/capsule/template.html", - "selector_or_token": "css.line_height_scale", - "raw_value": "0.9; 1.05; 1.6; 1.1; 1.55; 0; 1.35; 1.3; 1.4; 1; 0.95" - } - ], - "wrapping_policy": [ - { - "path": "beautiful-html-templates/templates/capsule/template.html", - "selector_or_token": "template.css.typography", - "raw_value": "h: 100%; height: 100%; overflow: hidden; background: var(--bg); font-family: var(--font-body); color: var(--fg); } /* Grain texture overlay */ .grain-overlay { position: fixed; inset: 0; pointer-events: none; z-index: 9999; opacity: 0.04; mix-blend-" - } - ], - "font_weight_scale": [ - { - "path": "beautiful-html-templates/templates/capsule/template.html", - "selector_or_token": "css.font_weight_scale", - "raw_value": "500; 700; 800; 400; 600" - } - ], - "source_typography_tokens": [ - { - "path": "beautiful-html-templates/templates/capsule/template.html", - "selector_or_token": "css.source_typography_tokens", - "raw_value": "0.75rem; 0.65rem; clamp(3rem, 8vw, 7rem); clamp(0.8rem, 1.5vw, 1.1rem); 0.85rem; clamp(2rem, 4vw, 3.5rem); clamp(0.95rem, 1.2vw, 1.15rem); 2.5rem; clamp(1.8rem, 3.5vw, 3rem); 0.7rem; 1.5rem; 0.9rem; 8rem; clamp(1.6rem, 3.5vw, 3rem); 1.3rem; 0.8rem; 500; 700; 800; 400; 600; 0.9; 1.05; 1.6; 1.1; 1.55; 0; 1.35; 1.3; 1.4; 1; 0.95; 0.02em; 0.1em; 0.08em; 0.04em; -0.02em; 0.15em; 0.12em; 0.06em; -0.01em; -0.03em; uppercase` on any pill/label/subtitle when content is Hanzi — Chinese has no case; upperc" - } - ], - "role_mapping.metric": [ - { - "path": "beautiful-html-templates/templates/capsule/template.html", - "selector_or_token": "role_mapping.metric.source_font", - "raw_value": "Bodoni Moda" - }, - { - "path": "beautiful-html-templates/templates/capsule/design.md", - "selector_or_token": "design.typography.roles", - "raw_value": "ft 6–12px offset shadow. The aesthetic is \"Memphis-meets-editorial\" — confident typography, generous bordered shapes, and decorative floating pills as atmospheric wallpaper. colors: cream: \"#F5F5F0\" ink: \"#1A1A1A\" outline: \"#1E1E1E\" white: \"#FFFFFF\" coral: \"#E85D4E\" lime: \"#C4D94E\" la" - } - ], - "cjk_typography_adjustment": [ - { - "path": "beautiful-html-templates/templates/capsule/template.html", - "selector_or_token": "template.css.typography", - "raw_value": "h: 100%; height: 100%; overflow: hidden; background: var(--bg); font-family: var(--font-body); color: var(--fg); } /* Grain texture overlay */ .grain-overlay { position: fixed; inset: 0; pointer-events: none; z-index: 9999; opacity: 0.04; mix-blend-" - } - ], - "hierarchy_ratio": [ - { - "path": "beautiful-html-templates/templates/capsule/template.html", - "selector_or_token": "template.css.typography", - "raw_value": "h: 100%; height: 100%; overflow: hidden; background: var(--bg); font-family: var(--font-body); color: var(--fg); } /* Grain texture overlay */ .grain-overlay { position: fixed; inset: 0; pointer-events: none; z-index: 9999; opacity: 0.04; mix-blend-" - } - ], - "measure": [ - { - "path": "beautiful-html-templates/templates/capsule/template.html", - "selector_or_token": "template.css.typography", - "raw_value": "h: 100%; height: 100%; overflow: hidden; background: var(--bg); font-family: var(--font-body); color: var(--fg); } /* Grain texture overlay */ .grain-overlay { position: fixed; inset: 0; pointer-events: none; z-index: 9999; opacity: 0.04; mix-blend-" - } - ], - "mapping_reason": [ - { - "path": "beautiful-html-templates/templates/capsule/template.html", - "selector_or_token": "template.css.typography", - "raw_value": "h: 100%; height: 100%; overflow: hidden; background: var(--bg); font-family: var(--font-body); color: var(--fg); } /* Grain texture overlay */ .grain-overlay { position: fixed; inset: 0; pointer-events: none; z-index: 9999; opacity: 0.04; mix-blend-" - } - ], - "letter_spacing_scale": [ - { - "path": "beautiful-html-templates/templates/capsule/template.html", - "selector_or_token": "css.letter_spacing_scale", - "raw_value": "0.02em; 0.1em; 0.08em; 0.04em; -0.02em; 0.15em; 0.12em; 0.06em; -0.01em; -0.03em" - } - ] } }, - "text_style_strategy": { - "bold": { - "source_usage": "source uses heavy display/label weights", - "mapped_weight": { - "display": 900, - "label": 700, - "metric": 900 - }, - "allowed_roles": [ - "display", - "label", - "metric" - ] - }, - "italic": { - "source_usage": "source uses italic/font-style or italic-family tokens", - "mapped_style": "latin_only_when_source_requires_else_normal", - "fallback_when_unavailable": "use color_shift or weight_shift; do not fake CJK italic", - "loss_notes": "Satori/Slide may not provide exact Google italic face; record as visual approximation." - }, - "underline": { - "source_usage": "source uses underline/text-decoration or hairline emphasis", - "mapped_decoration": "native underline only for actual text-decoration source usage", - "fallback_shape": "1px-3px rule or border accent when underline font rendering is unavailable" - }, - "line_through": { - "source_usage": "not present in source; default no line-through", - "mapped_decoration": "none", - "fallback_shape": "none" - }, - "emphasis": { - "color_shift": "use source accent color roles only", - "font_family_switch": "only switch between mapped display/body/label/metric roles from this family", - "weight_shift": "increase one role step within font_weight_scale", - "style_shift": "italic only when source_usage requires and CJK fallback is safe" - }, - "text_decoration_policy": { - "underline": { - "style": "solid", - "color": "currentColor", - "thickness": "1px" - }, - "line_through": { - "style": "none", - "color": "currentColor", - "thickness": "0px" - } - }, - "forbidden": [ - "fake_cjk_italic", - "drop_source_text_transform", - "drop_source_letter_spacing_without_loss_note", - "use_cross_family_font_motif", - "remote_font_dependency_without_receipt" - ], - "extraction_confidence": { - "text_decoration_policy.line_through.color": "absent_use_default", - "text_decoration_policy.underline.color": "css_extracted_from_template_html", - "text_decoration_policy.line_through.style": "absent_use_default", - "italic": "css_extracted_from_template_html", - "forbidden": "inferred_from_layout", - "emphasis": "inferred_from_layout", - "text_decoration_policy.underline.thickness": "css_extracted_from_template_html", - "underline": "css_extracted_from_template_html", - "text_decoration_policy.line_through.thickness": "absent_use_default", - "line_through": "absent_use_default", - "text_decoration_policy.underline.style": "css_extracted_from_template_html", - "bold": "css_extracted_from_template_html" - }, - "source_refs": { - "text_decoration_policy.underline.color": [ - { - "path": "beautiful-html-templates/templates/capsule/template.html", - "selector_or_token": "css.text-decoration", - "raw_value": "talic appears only inside pull-quote bodies via the `` tag (Bodoni italic). Underline is not used. Pill-encapsulation is the system's primary emphasis mechanism: wrapping a phrase in a candy-filled pill is the equivalent of bold-italicizing it in a traditional editorial system. Line-height tigh" - } - ], - "italic": [ - { - "path": "beautiful-html-templates/templates/capsule/template.html", - "selector_or_token": "css.font-style", - "raw_value": "eadlines. An inline `` inside a Bodoni headline keeps Bodoni and shifts to italic. A `quote-highlight` inside a Bodoni quote body switches the wrapped word to a pill (Space Grotesk uppercase pill text on a candy fill) for visual emphasis. ### Type Scale | Token | Size | Family | Weight | Use" - } - ], - "forbidden": [ - { - "path": "beautiful-html-templates/templates/capsule/template.html", - "selector_or_token": "template.css.typography", - "raw_value": "h: 100%; height: 100%; overflow: hidden; background: var(--bg); font-family: var(--font-body); color: var(--fg); } /* Grain texture overlay */ .grain-overlay { position: fixed; inset: 0; pointer-events: none; z-index: 9999; opacity: 0.04; mix-blend-" - } - ], - "emphasis": [ - { - "path": "beautiful-html-templates/templates/capsule/template.html", - "selector_or_token": "template.css.typography", - "raw_value": "h: 100%; height: 100%; overflow: hidden; background: var(--bg); font-family: var(--font-body); color: var(--fg); } /* Grain texture overlay */ .grain-overlay { position: fixed; inset: 0; pointer-events: none; z-index: 9999; opacity: 0.04; mix-blend-" - } - ], - "text_decoration_policy.underline.thickness": [ - { - "path": "beautiful-html-templates/templates/capsule/template.html", - "selector_or_token": "css.text-decoration", - "raw_value": "talic appears only inside pull-quote bodies via the `` tag (Bodoni italic). Underline is not used. Pill-encapsulation is the system's primary emphasis mechanism: wrapping a phrase in a candy-filled pill is the equivalent of bold-italicizing it in a traditional editorial system. Line-height tigh" - } - ], - "underline": [ - { - "path": "beautiful-html-templates/templates/capsule/template.html", - "selector_or_token": "css.text-decoration", - "raw_value": "talic appears only inside pull-quote bodies via the `` tag (Bodoni italic). Underline is not used. Pill-encapsulation is the system's primary emphasis mechanism: wrapping a phrase in a candy-filled pill is the equivalent of bold-italicizing it in a traditional editorial system. Line-height tigh" - } - ], - "text_decoration_policy.underline.style": [ - { - "path": "beautiful-html-templates/templates/capsule/template.html", - "selector_or_token": "css.text-decoration", - "raw_value": "talic appears only inside pull-quote bodies via the `` tag (Bodoni italic). Underline is not used. Pill-encapsulation is the system's primary emphasis mechanism: wrapping a phrase in a candy-filled pill is the equivalent of bold-italicizing it in a traditional editorial system. Line-height tigh" - } - ], - "bold": [ - { - "path": "beautiful-html-templates/templates/capsule/template.html", - "selector_or_token": "css.font-weight", - "raw_value": "500; 700; 800; 400; 600" - } - ] - } - }, - "satori": { - "font_and_typography_constraints": [ - "italic is source-aware but CJK fake italic is forbidden; use color/weight fallback when unavailable", - "letter spacing is preserved for Latin labels and reset/softened for CJK" - ] - }, - "loss_notes": [ - "italic is source-aware but CJK fake italic is forbidden; use color/weight fallback when unavailable", - "letter spacing is preserved for Latin labels and reset/softened for CJK" - ], - "page_variant_count": 10, - "source_page_variants": [ - "agenda", - "closing", - "cover", - "data_dashboard", - "data_dashboard-4", - "data_dashboard-7", - "process_or_timeline", - "quote_or_emphasis", - "slide-8", - "slide-9" - ], - "page_family_source": { - "extractor": "skills/lark-slides/scripts/beautiful_template_page_family_extract.py", - "source_template_html": "beautiful-html-templates/templates/capsule/template.html", - "source_design_md": "beautiful-html-templates/templates/capsule/design.md", - "source_template_json": "beautiful-html-templates/templates/capsule/template.json", - "claim_boundary": "source extraction only; does not imply renderer, fidelity, quality gate, or production/default selectable status" - } - }, - { - "family_id": "cartesian", - "template_id": "architectural-spec", - "runtime_template_id": "architectural-spec", - "source_template_html": "beautiful-html-templates/templates/cartesian/template.html", - "source_design_md": "beautiful-html-templates/templates/cartesian/design.md", - "source_template_json": "beautiful-html-templates/templates/cartesian/template.json", - "renderer_id": "artboard_satori.architectural-spec", - "renderer_module": "skills/lark-slides/scripts/artboard_renderer/templates/beautiful/cartesian-architectural-spec.mjs", - "golden_spec": "skills/lark-slides/scripts/fixtures/svglide_artboard/golden/architectural-spec.canvas-spec.json", - "reference_screenshot": "beautiful-html-templates/screenshots/cartesian-1.png", - "fidelity_receipt": "skills/lark-slides/references/receipts/template-fidelity/cartesian.architectural-spec.json", - "source_trace": [ - { - "source": "beautiful-html-templates/templates/cartesian/template.html", - "evidence": "source_template_html" - }, - { - "source": "beautiful-html-templates/templates/cartesian/design.md", - "evidence": "source_design_md" - }, - { - "source": "beautiful-html-templates/templates/cartesian/template.json", - "evidence": "source_template_json" - }, - { - "source": "beautiful-html-templates/screenshots/cartesian-1.png", - "evidence": "reference_screenshot" - }, - { - "source": "skills/lark-slides/references/absorptions/beautiful-html-templates/cartesian.architectural-spec.json", - "evidence": "absorption_record" - }, - { - "source": "skills/lark-slides/references/receipts/template-fidelity/cartesian.architectural-spec.json", - "evidence": "template_fidelity_receipt" - } - ], "visual_contract": { - "path": "skills/lark-slides/references/visual-contracts/beautiful/cartesian.architectural-spec.json", - "layout_rhythm": "cartesian: low density, high formality. Quiet warm-neutral palette with classical Playfair serifs; tasteful and unhurried.", - "motifs": [ - "grid", - "accent line", - "card panels", - "paper texture", - "poster blocks", - "quote mark" - ], - "palette_roles": [ - "accent", - "background", - "border", - "muted", - "negative", - "positive", - "primary", - "surface", - "text" - ], "do_not_simplify": [ "preserve_fonts_palette_grid_slide_classes_decorative_elements", "do_not_recolor_without_explicit_brand_override", @@ -5995,37 +6191,51 @@ "do_not_mark_production_without_renderer_golden_fidelity_receipt", "do_not_strip_identity_decorations", "do_not_recolor_without_explicit_brand_override" - ] + ], + "layout_rhythm": "capsule: medium density, medium-low formality. Modular pill-shaped cards on warm bone with a full pastel-pop palette.", + "motifs": [ + "grid", + "accent line", + "card panels", + "paper texture", + "poster blocks", + "quote mark", + "sticker collage" + ], + "palette_roles": [ + "accent", + "background", + "border", + "muted", + "negative", + "positive", + "primary", + "surface", + "text" + ], + "path": "skills/lark-slides/references/visual-contracts/beautiful/capsule.capsule-card-system.json" }, - "fidelity_gate": { - "status": "passed", - "score": 0.9801, - "threshold": 0.72, - "reference_screenshot": "/Users/bytedance/bd-projects/beautiful-html-templates/screenshots/cartesian-1.png", - "render_screenshot": "/Users/bytedance/bd-projects/workspaces/SVGlide/.worktrees/cli-svglide-svg-private/skills/lark-slides/scripts/fixtures/svglide_artboard/golden/architectural-spec.preview.png", - "receipt_path": "skills/lark-slides/references/receipts/template-fidelity/cartesian.architectural-spec.json", - "issues": [] - }, - "promotion_status": "needs_review", - "default_selectable": false, + "visual_contract_path": "skills/lark-slides/references/visual-contracts/beautiful/capsule.capsule-card-system.json" + }, + { "blocking_issues": [ "selector_gate_missing", "quality_gate_integration_pending", "production_review_pending" ], - "visual_contract_path": "skills/lark-slides/references/visual-contracts/beautiful/cartesian.architectural-spec.json", - "planned_renderer_module": "skills/lark-slides/scripts/artboard_renderer/templates/beautiful/cartesian-architectural-spec.mjs", - "planned_golden_spec": "skills/lark-slides/scripts/fixtures/svglide_artboard/golden/architectural-spec.canvas-spec.json", - "planned_fidelity_receipt": "skills/lark-slides/references/receipts/template-fidelity/cartesian.architectural-spec.json", + "default_selectable": false, + "family_id": "cartesian", + "fidelity_gate": { + "issues": [], + "receipt_path": "skills/lark-slides/references/receipts/template-fidelity/cartesian.architectural-spec.json", + "reference_screenshot": "/Users/bytedance/bd-projects/beautiful-html-templates/screenshots/cartesian-1.png", + "render_screenshot": "/Users/bytedance/bd-projects/workspaces/SVGlide/.worktrees/cli-svglide-svg-private/skills/lark-slides/scripts/fixtures/svglide_artboard/golden/architectural-spec.preview.png", + "score": 0.9801, + "status": "passed", + "threshold": 0.72 + }, + "fidelity_receipt": "skills/lark-slides/references/receipts/template-fidelity/cartesian.architectural-spec.json", "font_strategy": { - "source_fonts": [ - "Playfair Display", - "Inter" - ], - "slide_native_preferred": [ - "system-serif-cjk", - "system-sans-cjk" - ], "adobe_or_embedded_fallback": [ "Source Serif Pro", "Source Sans Pro", @@ -6033,59 +6243,17 @@ "思源黑体" ], "cjk_fallback": "Noto Serif SC", - "role_mapping": { - "display": { - "source_font": "Playfair Display", - "slide_font": "Source Serif Pro", - "runtime_alias": "SVGlideDisplay", - "cjk_font": "思源宋体", - "fallback_stack": [ - "system-serif-cjk", - "SVGlideDisplay" - ], - "source_only": false, - "requires_download": false, - "mapping_reason": "保留 Playfair Display 的语义角色,但运行时优先使用 Slide/系统可用的 Source Serif Pro 与 思源宋体。" - }, - "body": { - "source_font": "Inter", - "slide_font": "Source Sans Pro", - "runtime_alias": "SVGlideBody", - "cjk_font": "思源黑体", - "fallback_stack": [ - "system-sans-cjk", - "SVGlideBody" - ], - "source_only": false, - "requires_download": false, - "mapping_reason": "保留 Inter 的语义角色,但运行时优先使用 Slide/系统可用的 Source Sans Pro 与 思源黑体。" - }, - "label": { - "source_font": "Playfair Display", - "slide_font": "Source Serif Pro", - "runtime_alias": "SVGlideLabel", - "cjk_font": "思源宋体", - "fallback_stack": [ - "system-serif-cjk", - "SVGlideLabel" - ], - "source_only": false, - "requires_download": false, - "mapping_reason": "保留 Playfair Display 的语义角色,但运行时优先使用 Slide/系统可用的 Source Serif Pro 与 思源宋体。" - }, - "metric": { - "source_font": "Playfair Display", - "slide_font": "Source Serif Pro", - "runtime_alias": "SVGlideMetric", - "cjk_font": "思源宋体", - "fallback_stack": [ - "system-serif-cjk", - "SVGlideMetric" - ], - "source_only": false, - "requires_download": false, - "mapping_reason": "保留 Playfair Display 的语义角色,但运行时优先使用 Slide/系统可用的 Source Serif Pro 与 思源宋体。" - } + "extraction_confidence": { + "adobe_or_embedded_fallback": "inferred_from_layout", + "cjk_fallback": "inferred_from_layout", + "forbidden": "inferred_from_layout", + "mapping_reason": "inferred_from_layout", + "role_mapping.body": "inferred_from_layout", + "role_mapping.display": "inferred_from_layout", + "role_mapping.label": "inferred_from_layout", + "role_mapping.metric": "inferred_from_layout", + "slide_native_preferred": "inferred_from_layout", + "source_fonts": "css_extracted_from_template_html" }, "forbidden": [ "remote_font_runtime_dependency", @@ -6094,118 +6262,717 @@ "drop_cjk_fallback" ], "mapping_reason": "根据 design.md/template.html/template.json 中的 font-family 与 typography token 提取源字体;运行时按 Slide/系统/Adobe/思源可用字体降级。", + "role_mapping": { + "body": { + "cjk_font": "思源黑体", + "fallback_stack": [ + "system-sans-cjk", + "SVGlideBody" + ], + "mapping_reason": "保留 Inter 的语义角色,但运行时优先使用 Slide/系统可用的 Source Sans Pro 与 思源黑体。", + "requires_download": false, + "runtime_alias": "SVGlideBody", + "slide_font": "Source Sans Pro", + "source_font": "Inter", + "source_only": false + }, + "display": { + "cjk_font": "思源宋体", + "fallback_stack": [ + "system-serif-cjk", + "SVGlideDisplay" + ], + "mapping_reason": "保留 Playfair Display 的语义角色,但运行时优先使用 Slide/系统可用的 Source Serif Pro 与 思源宋体。", + "requires_download": false, + "runtime_alias": "SVGlideDisplay", + "slide_font": "Source Serif Pro", + "source_font": "Playfair Display", + "source_only": false + }, + "label": { + "cjk_font": "思源宋体", + "fallback_stack": [ + "system-serif-cjk", + "SVGlideLabel" + ], + "mapping_reason": "保留 Playfair Display 的语义角色,但运行时优先使用 Slide/系统可用的 Source Serif Pro 与 思源宋体。", + "requires_download": false, + "runtime_alias": "SVGlideLabel", + "slide_font": "Source Serif Pro", + "source_font": "Playfair Display", + "source_only": false + }, + "metric": { + "cjk_font": "思源宋体", + "fallback_stack": [ + "system-serif-cjk", + "SVGlideMetric" + ], + "mapping_reason": "保留 Playfair Display 的语义角色,但运行时优先使用 Slide/系统可用的 Source Serif Pro 与 思源宋体。", + "requires_download": false, + "runtime_alias": "SVGlideMetric", + "slide_font": "Source Serif Pro", + "source_font": "Playfair Display", + "source_only": false + } + }, + "slide_native_preferred": [ + "system-serif-cjk", + "system-sans-cjk" + ], "source_evidence": [ "beautiful-html-templates/templates/cartesian/design.md", "beautiful-html-templates/templates/cartesian/template.html", "beautiful-html-templates/templates/cartesian/template.json", "beautiful-html-templates/screenshots/cartesian-1.png" ], - "extraction_confidence": { - "role_mapping.body": "inferred_from_layout", - "role_mapping.display": "inferred_from_layout", - "source_fonts": "css_extracted_from_template_html", - "adobe_or_embedded_fallback": "inferred_from_layout", - "cjk_fallback": "inferred_from_layout", - "role_mapping.metric": "inferred_from_layout", - "forbidden": "inferred_from_layout", - "slide_native_preferred": "inferred_from_layout", - "mapping_reason": "inferred_from_layout", - "role_mapping.label": "inferred_from_layout" - }, + "source_fonts": [ + "Playfair Display", + "Inter" + ], "source_refs": { - "role_mapping.body": [ - { - "path": "beautiful-html-templates/templates/cartesian/template.html", - "selector_or_token": "role_mapping.body.source_font", - "raw_value": "Inter" - }, - { - "path": "beautiful-html-templates/templates/cartesian/design.md", - "selector_or_token": "design.typography.roles", - "raw_value": "ccent: \"#8A8178\" line: \"#B8B0A4\" white-overlay: \"rgba(255, 255, 255, 0.3)\" typography: display: fontFamily: \"Playfair Display, serif\" fontSize: \"clamp(3rem, 6vw, 5.5rem)\" fontWeight: 400 lineHeight: 1.1 h1: fontFamily: \"Playfair Display, serif\" fontSize: \"clamp(2.5re" - } - ], - "role_mapping.display": [ - { - "path": "beautiful-html-templates/templates/cartesian/template.html", - "selector_or_token": "role_mapping.display.source_font", - "raw_value": "Playfair Display" - }, - { - "path": "beautiful-html-templates/templates/cartesian/design.md", - "selector_or_token": "design.typography.roles", - "raw_value": "ccent: \"#8A8178\" line: \"#B8B0A4\" white-overlay: \"rgba(255, 255, 255, 0.3)\" typography: display: fontFamily: \"Playfair Display, serif\" fontSize: \"clamp(3rem, 6vw, 5.5rem)\" fontWeight: 400 lineHeight: 1.1 h1: fontFamily: \"Playfair Display, serif\" fontSize: \"clamp(2.5re" - } - ], - "source_fonts": [ - { - "path": "beautiful-html-templates/templates/cartesian/template.html", - "selector_or_token": "css.font-family", - "raw_value": "'Inter', sans-serif; 'Playfair Display', serif" - } - ], "adobe_or_embedded_fallback": [ { "path": "beautiful-html-templates/templates/cartesian/template.html", - "selector_or_token": "css.font-family", - "raw_value": "'Inter', sans-serif; 'Playfair Display', serif" + "raw_value": "'Inter', sans-serif; 'Playfair Display', serif", + "selector_or_token": "css.font-family" } ], "cjk_fallback": [ { "path": "beautiful-html-templates/templates/cartesian/template.html", - "selector_or_token": "css.font-family", - "raw_value": "'Inter', sans-serif; 'Playfair Display', serif" - } - ], - "role_mapping.metric": [ - { - "path": "beautiful-html-templates/templates/cartesian/template.html", - "selector_or_token": "role_mapping.metric.source_font", - "raw_value": "Playfair Display" - }, - { - "path": "beautiful-html-templates/templates/cartesian/design.md", - "selector_or_token": "design.typography.roles", - "raw_value": "ccent: \"#8A8178\" line: \"#B8B0A4\" white-overlay: \"rgba(255, 255, 255, 0.3)\" typography: display: fontFamily: \"Playfair Display, serif\" fontSize: \"clamp(3rem, 6vw, 5.5rem)\" fontWeight: 400 lineHeight: 1.1 h1: fontFamily: \"Playfair Display, serif\" fontSize: \"clamp(2.5re" + "raw_value": "'Inter', sans-serif; 'Playfair Display', serif", + "selector_or_token": "css.font-family" } ], "forbidden": [ { "path": "beautiful-html-templates/templates/cartesian/template.html", - "selector_or_token": "css.font-family", - "raw_value": "'Inter', sans-serif; 'Playfair Display', serif" - } - ], - "slide_native_preferred": [ - { - "path": "beautiful-html-templates/templates/cartesian/template.html", - "selector_or_token": "css.font-family", - "raw_value": "'Inter', sans-serif; 'Playfair Display', serif" + "raw_value": "'Inter', sans-serif; 'Playfair Display', serif", + "selector_or_token": "css.font-family" } ], "mapping_reason": [ { "path": "beautiful-html-templates/templates/cartesian/template.html", - "selector_or_token": "css.font-family", - "raw_value": "'Inter', sans-serif; 'Playfair Display', serif" + "raw_value": "'Inter', sans-serif; 'Playfair Display', serif", + "selector_or_token": "css.font-family" + } + ], + "role_mapping.body": [ + { + "path": "beautiful-html-templates/templates/cartesian/template.html", + "raw_value": "Inter", + "selector_or_token": "role_mapping.body.source_font" + }, + { + "path": "beautiful-html-templates/templates/cartesian/design.md", + "raw_value": "ccent: \"#8A8178\" line: \"#B8B0A4\" white-overlay: \"rgba(255, 255, 255, 0.3)\" typography: display: fontFamily: \"Playfair Display, serif\" fontSize: \"clamp(3rem, 6vw, 5.5rem)\" fontWeight: 400 lineHeight: 1.1 h1: fontFamily: \"Playfair Display, serif\" fontSize: \"clamp(2.5re", + "selector_or_token": "design.typography.roles" + } + ], + "role_mapping.display": [ + { + "path": "beautiful-html-templates/templates/cartesian/template.html", + "raw_value": "Playfair Display", + "selector_or_token": "role_mapping.display.source_font" + }, + { + "path": "beautiful-html-templates/templates/cartesian/design.md", + "raw_value": "ccent: \"#8A8178\" line: \"#B8B0A4\" white-overlay: \"rgba(255, 255, 255, 0.3)\" typography: display: fontFamily: \"Playfair Display, serif\" fontSize: \"clamp(3rem, 6vw, 5.5rem)\" fontWeight: 400 lineHeight: 1.1 h1: fontFamily: \"Playfair Display, serif\" fontSize: \"clamp(2.5re", + "selector_or_token": "design.typography.roles" } ], "role_mapping.label": [ { "path": "beautiful-html-templates/templates/cartesian/template.html", - "selector_or_token": "role_mapping.label.source_font", - "raw_value": "Playfair Display" + "raw_value": "Playfair Display", + "selector_or_token": "role_mapping.label.source_font" }, { "path": "beautiful-html-templates/templates/cartesian/design.md", - "selector_or_token": "design.typography.roles", - "raw_value": "ccent: \"#8A8178\" line: \"#B8B0A4\" white-overlay: \"rgba(255, 255, 255, 0.3)\" typography: display: fontFamily: \"Playfair Display, serif\" fontSize: \"clamp(3rem, 6vw, 5.5rem)\" fontWeight: 400 lineHeight: 1.1 h1: fontFamily: \"Playfair Display, serif\" fontSize: \"clamp(2.5re" + "raw_value": "ccent: \"#8A8178\" line: \"#B8B0A4\" white-overlay: \"rgba(255, 255, 255, 0.3)\" typography: display: fontFamily: \"Playfair Display, serif\" fontSize: \"clamp(3rem, 6vw, 5.5rem)\" fontWeight: 400 lineHeight: 1.1 h1: fontFamily: \"Playfair Display, serif\" fontSize: \"clamp(2.5re", + "selector_or_token": "design.typography.roles" + } + ], + "role_mapping.metric": [ + { + "path": "beautiful-html-templates/templates/cartesian/template.html", + "raw_value": "Playfair Display", + "selector_or_token": "role_mapping.metric.source_font" + }, + { + "path": "beautiful-html-templates/templates/cartesian/design.md", + "raw_value": "ccent: \"#8A8178\" line: \"#B8B0A4\" white-overlay: \"rgba(255, 255, 255, 0.3)\" typography: display: fontFamily: \"Playfair Display, serif\" fontSize: \"clamp(3rem, 6vw, 5.5rem)\" fontWeight: 400 lineHeight: 1.1 h1: fontFamily: \"Playfair Display, serif\" fontSize: \"clamp(2.5re", + "selector_or_token": "design.typography.roles" + } + ], + "slide_native_preferred": [ + { + "path": "beautiful-html-templates/templates/cartesian/template.html", + "raw_value": "'Inter', sans-serif; 'Playfair Display', serif", + "selector_or_token": "css.font-family" + } + ], + "source_fonts": [ + { + "path": "beautiful-html-templates/templates/cartesian/template.html", + "raw_value": "'Inter', sans-serif; 'Playfair Display', serif", + "selector_or_token": "css.font-family" } ] } }, + "golden_spec": "skills/lark-slides/scripts/fixtures/svglide_artboard/golden/cartesian.title.canvas-spec.json", + "implemented_page_variants": [ + "title", + "agenda", + "statement", + "barchart", + "twocol", + "cards", + "linechart", + "timeline", + "team", + "closing" + ], + "loss_notes": [ + "italic is source-aware but CJK fake italic is forbidden; use color/weight fallback when unavailable", + "letter spacing is preserved for Latin labels and reset/softened for CJK" + ], + "page_family": { + "family_id": "cartesian", + "source_slide_count": 10, + "supported_page_roles": [ + "cover", + "agenda", + "content", + "data", + "comparison", + "quote", + "process", + "detail", + "closing" + ], + "supported_page_variants": [ + "title", + "agenda", + "statement", + "barchart", + "twocol", + "cards", + "linechart", + "timeline", + "team", + "closing" + ], + "variant_usage_policy": { + "repeatable": [ + "statement", + "barchart", + "twocol", + "cards", + "linechart", + "timeline", + "team" + ], + "singletons": [ + "title", + "agenda", + "closing" + ] + } + }, + "page_family_smoke_deck": "skills/lark-slides/references/page-family-smoke-decks/cartesian.json", + "page_family_smoke_receipt": "skills/lark-slides/references/receipts/page-family-smoke/cartesian.architectural-spec.json", + "page_family_source": { + "claim_boundary": "source-backed page-family implementation evidence; does not imply production/default selectable status", + "source_design_md": "beautiful-html-templates/templates/cartesian/design.md", + "source_template_html": "beautiful-html-templates/templates/cartesian/template.html", + "source_template_json": "beautiful-html-templates/templates/cartesian/template.json" + }, + "page_variant_count": 10, + "page_variant_golden_specs": { + "agenda": "skills/lark-slides/scripts/fixtures/svglide_artboard/golden/cartesian.agenda.canvas-spec.json", + "barchart": "skills/lark-slides/scripts/fixtures/svglide_artboard/golden/cartesian.barchart.canvas-spec.json", + "cards": "skills/lark-slides/scripts/fixtures/svglide_artboard/golden/cartesian.cards.canvas-spec.json", + "closing": "skills/lark-slides/scripts/fixtures/svglide_artboard/golden/cartesian.closing.canvas-spec.json", + "linechart": "skills/lark-slides/scripts/fixtures/svglide_artboard/golden/cartesian.linechart.canvas-spec.json", + "statement": "skills/lark-slides/scripts/fixtures/svglide_artboard/golden/cartesian.statement.canvas-spec.json", + "team": "skills/lark-slides/scripts/fixtures/svglide_artboard/golden/cartesian.team.canvas-spec.json", + "timeline": "skills/lark-slides/scripts/fixtures/svglide_artboard/golden/cartesian.timeline.canvas-spec.json", + "title": "skills/lark-slides/scripts/fixtures/svglide_artboard/golden/cartesian.title.canvas-spec.json", + "twocol": "skills/lark-slides/scripts/fixtures/svglide_artboard/golden/cartesian.twocol.canvas-spec.json" + }, + "planned_fidelity_receipt": "skills/lark-slides/references/receipts/template-fidelity/cartesian.architectural-spec.json", + "planned_golden_spec": "skills/lark-slides/scripts/fixtures/svglide_artboard/golden/cartesian.title.canvas-spec.json", + "planned_renderer_module": "skills/lark-slides/scripts/artboard_renderer/templates/beautiful/cartesian-architectural-spec.mjs", + "promotion_status": "needs_review", + "reference_screenshot": "beautiful-html-templates/screenshots/cartesian-1.png", + "renderer_id": "artboard_satori.architectural-spec", + "renderer_module": "skills/lark-slides/scripts/artboard_renderer/templates/beautiful/cartesian-architectural-spec.mjs", + "renderer_stage": "page_family", + "runtime_template_id": "architectural-spec", + "satori": { + "font_and_typography_constraints": [ + "italic is source-aware but CJK fake italic is forbidden; use color/weight fallback when unavailable", + "letter spacing is preserved for Latin labels and reset/softened for CJK" + ] + }, + "source_design_md": "beautiful-html-templates/templates/cartesian/design.md", + "source_page_variants": [ + "title", + "agenda", + "statement", + "barchart", + "twocol", + "cards", + "linechart", + "timeline", + "team", + "closing" + ], + "source_template_html": "beautiful-html-templates/templates/cartesian/template.html", + "source_template_json": "beautiful-html-templates/templates/cartesian/template.json", + "source_trace": [ + { + "evidence": "source_template_html", + "source": "beautiful-html-templates/templates/cartesian/template.html" + }, + { + "evidence": "source_design_md", + "source": "beautiful-html-templates/templates/cartesian/design.md" + }, + { + "evidence": "source_template_json", + "source": "beautiful-html-templates/templates/cartesian/template.json" + }, + { + "evidence": "reference_screenshot", + "source": "beautiful-html-templates/screenshots/cartesian-1.png" + }, + { + "evidence": "absorption_record", + "source": "skills/lark-slides/references/absorptions/beautiful-html-templates/cartesian.architectural-spec.json" + }, + { + "evidence": "template_fidelity_receipt", + "source": "skills/lark-slides/references/receipts/template-fidelity/cartesian.architectural-spec.json" + } + ], + "template_id": "architectural-spec", + "text_style_strategy": { + "bold": { + "allowed_roles": [ + "display", + "label", + "metric" + ], + "mapped_weight": { + "display": 400, + "label": 700, + "metric": 900 + }, + "source_usage": "source uses heavy display/label weights" + }, + "emphasis": { + "color_shift": "use source accent color roles only", + "font_family_switch": "only switch between mapped display/body/label/metric roles from this family", + "style_shift": "italic only when source_usage requires and CJK fallback is safe", + "weight_shift": "increase one role step within font_weight_scale" + }, + "extraction_confidence": { + "bold": "css_extracted_from_template_html", + "emphasis": "inferred_from_layout", + "forbidden": "inferred_from_layout", + "italic": "css_extracted_from_template_html", + "line_through": "absent_use_default", + "text_decoration_policy.line_through.color": "absent_use_default", + "text_decoration_policy.line_through.style": "absent_use_default", + "text_decoration_policy.line_through.thickness": "absent_use_default", + "text_decoration_policy.underline.color": "css_extracted_from_template_html", + "text_decoration_policy.underline.style": "css_extracted_from_template_html", + "text_decoration_policy.underline.thickness": "css_extracted_from_template_html", + "underline": "css_extracted_from_template_html" + }, + "forbidden": [ + "fake_cjk_italic", + "drop_source_text_transform", + "drop_source_letter_spacing_without_loss_note", + "use_cross_family_font_motif", + "remote_font_dependency_without_receipt" + ], + "italic": { + "fallback_when_unavailable": "use color_shift or weight_shift; do not fake CJK italic", + "loss_notes": "Satori/Slide may not provide exact Google italic face; record as visual approximation.", + "mapped_style": "latin_only_when_source_requires_else_normal", + "source_usage": "source uses italic/font-style or italic-family tokens" + }, + "line_through": { + "fallback_shape": "none", + "mapped_decoration": "none", + "source_usage": "not present in source; default no line-through" + }, + "source_refs": { + "bold": [ + { + "path": "beautiful-html-templates/templates/cartesian/template.html", + "raw_value": "400; 500", + "selector_or_token": "css.font-weight" + } + ], + "emphasis": [ + { + "path": "beautiful-html-templates/templates/cartesian/template.html", + "raw_value": "nt: #8a8178; --line: #b8b0a4; } body { font-family: 'Inter', sans-serif; background: var(--bg-primary); color: var(--text-primary); overflow: hidden; } .presentation { width: 100vw;", + "selector_or_token": "template.css.typography" + } + ], + "forbidden": [ + { + "path": "beautiful-html-templates/templates/cartesian/template.html", + "raw_value": "nt: #8a8178; --line: #b8b0a4; } body { font-family: 'Inter', sans-serif; background: var(--bg-primary); color: var(--text-primary); overflow: hidden; } .presentation { width: 100vw;", + "selector_or_token": "template.css.typography" + } + ], + "italic": [ + { + "path": "beautiful-html-templates/templates/cartesian/template.html", + "raw_value": "on a **two-face conversation**: `Playfair Display` (serif, weights 400/600/700, italic available) carries every headline, stat numeral, quote mark, card title, and team initial; `Inter` (sans, weights 300/400/500/600) carries every body, subtitle, label, attribution, and micro-text. There is no thir", + "selector_or_token": "css.font-style" + } + ], + "text_decoration_policy.underline.color": [ + { + "path": "beautiful-html-templates/templates/cartesian/template.html", + "raw_value": "ody copy (Inter italic) — italic Playfair is loaded but reserved for rare uses. Underline is not used. Line-height stays open: headlines at 1.1, body at 1.6. The wide body line-height is part of the breathing-room aesthetic. ## Layout ### Canvas System The canvas is `100vw × 100vh` — full viewpor", + "selector_or_token": "css.text-decoration" + } + ], + "text_decoration_policy.underline.style": [ + { + "path": "beautiful-html-templates/templates/cartesian/template.html", + "raw_value": "ody copy (Inter italic) — italic Playfair is loaded but reserved for rare uses. Underline is not used. Line-height stays open: headlines at 1.1, body at 1.6. The wide body line-height is part of the breathing-room aesthetic. ## Layout ### Canvas System The canvas is `100vw × 100vh` — full viewpor", + "selector_or_token": "css.text-decoration" + } + ], + "text_decoration_policy.underline.thickness": [ + { + "path": "beautiful-html-templates/templates/cartesian/template.html", + "raw_value": "ody copy (Inter italic) — italic Playfair is loaded but reserved for rare uses. Underline is not used. Line-height stays open: headlines at 1.1, body at 1.6. The wide body line-height is part of the breathing-room aesthetic. ## Layout ### Canvas System The canvas is `100vw × 100vh` — full viewpor", + "selector_or_token": "css.text-decoration" + } + ], + "underline": [ + { + "path": "beautiful-html-templates/templates/cartesian/template.html", + "raw_value": "ody copy (Inter italic) — italic Playfair is loaded but reserved for rare uses. Underline is not used. Line-height stays open: headlines at 1.1, body at 1.6. The wide body line-height is part of the breathing-room aesthetic. ## Layout ### Canvas System The canvas is `100vw × 100vh` — full viewpor", + "selector_or_token": "css.text-decoration" + } + ] + }, + "text_decoration_policy": { + "line_through": { + "color": "currentColor", + "style": "none", + "thickness": "0px" + }, + "underline": { + "color": "currentColor", + "style": "solid", + "thickness": "1px" + } + }, + "underline": { + "fallback_shape": "1px-3px rule or border accent when underline font rendering is unavailable", + "mapped_decoration": "native underline only for actual text-decoration source usage", + "source_usage": "source uses underline/text-decoration or hairline emphasis" + } + }, "typography_strategy": { + "alignment": { + "fallback": "left/top aligned unless source screenshot is centered", + "primary": "follow source composition" + }, + "cjk_typography_adjustment": { + "body_font_cn": "Noto Serif SC", + "display_font_cn": "Noto Serif SC", + "italic_policy": "drop_italic", + "letter_spacing_policy": "reset_letter_spacing_for_cjk_keep_latin_labels", + "mixed_run_spacing": "pangu_spacing" + }, + "extraction_confidence": { + "alignment": "inferred_from_layout", + "cjk_typography_adjustment": "inferred_from_layout", + "font_size_scale": "css_extracted_from_template_html", + "font_weight_scale": "css_extracted_from_template_html", + "hierarchy_ratio": "inferred_from_layout", + "letter_spacing_scale": "css_extracted_from_template_html", + "line_height_scale": "css_extracted_from_template_html", + "mapping_reason": "inferred_from_layout", + "max_lines": "inferred_from_layout", + "measure": "inferred_from_layout", + "paragraph_spacing": "css_extracted_from_template_html", + "role_mapping.body": "inferred_from_layout", + "role_mapping.display": "inferred_from_layout", + "role_mapping.label": "inferred_from_layout", + "role_mapping.metric": "inferred_from_layout", + "source_typography_tokens": "css_extracted_from_template_html", + "text_direction": "css_extracted_from_template_html", + "text_transform_policy": "css_extracted_from_template_html", + "word_spacing": "absent_use_default", + "wrapping_policy": "inferred_from_layout", + "writing_mode": "absent_use_default" + }, + "font_size_scale": { + "body": 20, + "display": 54, + "label": 12, + "metric": 42 + }, + "font_weight_scale": { + "body": 400, + "display": 400, + "label": 700, + "metric": 900 + }, + "hierarchy_ratio": 2.7, + "letter_spacing_scale": { + "body": 0, + "display": 0, + "label": 0.08, + "metric": 0 + }, + "line_height_scale": { + "body": 1.32, + "display": 0.96, + "label": 1.05, + "metric": 0.95 + }, + "mapping_reason": "按源模板字号/字重/行高/字距/大小写规则抽象到 960x540 Slide 画布的四个文本角色。", + "max_lines": { + "body": 5, + "display": 3, + "label": 1, + "metric": 2 + }, + "measure": { + "body": "40-70 characters or CJK equivalent", + "display": "0.55-0.78 canvas width", + "label": "short mono labels", + "metric": "short numeric/stat blocks" + }, + "paragraph_spacing": { + "body_after": 12, + "display_after": 0, + "label_after": 0, + "metric_after": 0 + }, + "role_mapping": { + "body": { + "alignment": "source_layout_dependent", + "font_role": "body", + "font_size": 20, + "font_weight": 400, + "letter_spacing": 0, + "line_height": 1.32, + "max_lines": 5, + "runtime_alias": "SVGlideBody", + "source_font": "Inter", + "text_transform": "preserve_source_case" + }, + "display": { + "alignment": "source_layout_dependent", + "font_role": "display", + "font_size": 54, + "font_weight": 400, + "letter_spacing": 0, + "line_height": 0.96, + "max_lines": 3, + "runtime_alias": "SVGlideDisplay", + "source_font": "Playfair Display", + "text_transform": "latin_uppercase_only" + }, + "label": { + "alignment": "source_layout_dependent", + "font_role": "label", + "font_size": 12, + "font_weight": 700, + "letter_spacing": 0.08, + "line_height": 1.05, + "max_lines": 1, + "runtime_alias": "SVGlideLabel", + "source_font": "Playfair Display", + "text_transform": "latin_uppercase_labels_reset_cjk_spacing" + }, + "metric": { + "alignment": "source_layout_dependent", + "font_role": "metric", + "font_size": 42, + "font_weight": 900, + "letter_spacing": 0, + "line_height": 0.95, + "max_lines": 2, + "runtime_alias": "SVGlideMetric", + "source_font": "Playfair Display", + "text_transform": "preserve_numbers_and_units" + } + }, + "source_refs": { + "alignment": [ + { + "path": "beautiful-html-templates/templates/cartesian/template.html", + "raw_value": "nt: #8a8178; --line: #b8b0a4; } body { font-family: 'Inter', sans-serif; background: var(--bg-primary); color: var(--text-primary); overflow: hidden; } .presentation { width: 100vw;", + "selector_or_token": "template.css.typography" + } + ], + "cjk_typography_adjustment": [ + { + "path": "beautiful-html-templates/templates/cartesian/template.html", + "raw_value": "nt: #8a8178; --line: #b8b0a4; } body { font-family: 'Inter', sans-serif; background: var(--bg-primary); color: var(--text-primary); overflow: hidden; } .presentation { width: 100vw;", + "selector_or_token": "template.css.typography" + } + ], + "font_size_scale": [ + { + "path": "beautiful-html-templates/templates/cartesian/template.html", + "raw_value": "0.75rem; 1.2rem; clamp(2.5rem, 5vw, 4.5rem); clamp(1.8rem, 3.5vw, 3rem); clamp(1.2rem, 2vw, 1.6rem); clamp(0.9rem, 1.2vw, 1.1rem); clamp(3rem, 6vw, 5.5rem); clamp(1rem, 1.5vw, 1.3rem); 1.5rem; 5rem; 0.85rem; 0.8rem; 2rem; 1rem; 1.3rem; 0.9rem", + "selector_or_token": "css.font_size_scale" + } + ], + "font_weight_scale": [ + { + "path": "beautiful-html-templates/templates/cartesian/template.html", + "raw_value": "400; 500", + "selector_or_token": "css.font_weight_scale" + } + ], + "hierarchy_ratio": [ + { + "path": "beautiful-html-templates/templates/cartesian/template.html", + "raw_value": "nt: #8a8178; --line: #b8b0a4; } body { font-family: 'Inter', sans-serif; background: var(--bg-primary); color: var(--text-primary); overflow: hidden; } .presentation { width: 100vw;", + "selector_or_token": "template.css.typography" + } + ], + "letter_spacing_scale": [ + { + "path": "beautiful-html-templates/templates/cartesian/template.html", + "raw_value": "2px; 3px; 1px", + "selector_or_token": "css.letter_spacing_scale" + } + ], + "line_height_scale": [ + { + "path": "beautiful-html-templates/templates/cartesian/template.html", + "raw_value": "1.1; 1.6; 1", + "selector_or_token": "css.line_height_scale" + } + ], + "mapping_reason": [ + { + "path": "beautiful-html-templates/templates/cartesian/template.html", + "raw_value": "nt: #8a8178; --line: #b8b0a4; } body { font-family: 'Inter', sans-serif; background: var(--bg-primary); color: var(--text-primary); overflow: hidden; } .presentation { width: 100vw;", + "selector_or_token": "template.css.typography" + } + ], + "max_lines": [ + { + "path": "beautiful-html-templates/templates/cartesian/template.html", + "raw_value": "nt: #8a8178; --line: #b8b0a4; } body { font-family: 'Inter', sans-serif; background: var(--bg-primary); color: var(--text-primary); overflow: hidden; } .presentation { width: 100vw;", + "selector_or_token": "template.css.typography" + } + ], + "measure": [ + { + "path": "beautiful-html-templates/templates/cartesian/template.html", + "raw_value": "nt: #8a8178; --line: #b8b0a4; } body { font-family: 'Inter', sans-serif; background: var(--bg-primary); color: var(--text-primary); overflow: hidden; } .presentation { width: 100vw;", + "selector_or_token": "template.css.typography" + } + ], + "paragraph_spacing": [ + { + "path": "beautiful-html-templates/templates/cartesian/template.html", + "raw_value": "3vh; 2vh; 0.5vh; 6vh; 1vh; 4vh; 12px; 16px; 6vw; 2vw; 5vw; 3vw; 4vw; 3vh", + "selector_or_token": "css.paragraph_spacing" + } + ], + "role_mapping.body": [ + { + "path": "beautiful-html-templates/templates/cartesian/template.html", + "raw_value": "Inter", + "selector_or_token": "role_mapping.body.source_font" + }, + { + "path": "beautiful-html-templates/templates/cartesian/design.md", + "raw_value": "ccent: \"#8A8178\" line: \"#B8B0A4\" white-overlay: \"rgba(255, 255, 255, 0.3)\" typography: display: fontFamily: \"Playfair Display, serif\" fontSize: \"clamp(3rem, 6vw, 5.5rem)\" fontWeight: 400 lineHeight: 1.1 h1: fontFamily: \"Playfair Display, serif\" fontSize: \"clamp(2.5re", + "selector_or_token": "design.typography.roles" + } + ], + "role_mapping.display": [ + { + "path": "beautiful-html-templates/templates/cartesian/template.html", + "raw_value": "Playfair Display", + "selector_or_token": "role_mapping.display.source_font" + }, + { + "path": "beautiful-html-templates/templates/cartesian/design.md", + "raw_value": "ccent: \"#8A8178\" line: \"#B8B0A4\" white-overlay: \"rgba(255, 255, 255, 0.3)\" typography: display: fontFamily: \"Playfair Display, serif\" fontSize: \"clamp(3rem, 6vw, 5.5rem)\" fontWeight: 400 lineHeight: 1.1 h1: fontFamily: \"Playfair Display, serif\" fontSize: \"clamp(2.5re", + "selector_or_token": "design.typography.roles" + } + ], + "role_mapping.label": [ + { + "path": "beautiful-html-templates/templates/cartesian/template.html", + "raw_value": "Playfair Display", + "selector_or_token": "role_mapping.label.source_font" + }, + { + "path": "beautiful-html-templates/templates/cartesian/design.md", + "raw_value": "ccent: \"#8A8178\" line: \"#B8B0A4\" white-overlay: \"rgba(255, 255, 255, 0.3)\" typography: display: fontFamily: \"Playfair Display, serif\" fontSize: \"clamp(3rem, 6vw, 5.5rem)\" fontWeight: 400 lineHeight: 1.1 h1: fontFamily: \"Playfair Display, serif\" fontSize: \"clamp(2.5re", + "selector_or_token": "design.typography.roles" + } + ], + "role_mapping.metric": [ + { + "path": "beautiful-html-templates/templates/cartesian/template.html", + "raw_value": "Playfair Display", + "selector_or_token": "role_mapping.metric.source_font" + }, + { + "path": "beautiful-html-templates/templates/cartesian/design.md", + "raw_value": "ccent: \"#8A8178\" line: \"#B8B0A4\" white-overlay: \"rgba(255, 255, 255, 0.3)\" typography: display: fontFamily: \"Playfair Display, serif\" fontSize: \"clamp(3rem, 6vw, 5.5rem)\" fontWeight: 400 lineHeight: 1.1 h1: fontFamily: \"Playfair Display, serif\" fontSize: \"clamp(2.5re", + "selector_or_token": "design.typography.roles" + } + ], + "source_typography_tokens": [ + { + "path": "beautiful-html-templates/templates/cartesian/template.html", + "raw_value": "0.75rem; 1.2rem; clamp(2.5rem, 5vw, 4.5rem); clamp(1.8rem, 3.5vw, 3rem); clamp(1.2rem, 2vw, 1.6rem); clamp(0.9rem, 1.2vw, 1.1rem); clamp(3rem, 6vw, 5.5rem); clamp(1rem, 1.5vw, 1.3rem); 1.5rem; 5rem; 0.85rem; 0.8rem; 2rem; 1rem; 1.3rem; 0.9rem; 400; 500; 1.1; 1.6; 1; 2px; 3px; 1px; uppercase` on any label/attribution/micro when content is Hanzi — Chinese has no case; uppercase", + "selector_or_token": "css.source_typography_tokens" + } + ], + "text_direction": [ + { + "path": "beautiful-html-templates/templates/cartesian/template.html", + "raw_value": "column", + "selector_or_token": "css.text_direction" + } + ], + "text_transform_policy": [ + { + "path": "beautiful-html-templates/templates/cartesian/template.html", + "raw_value": "uppercase` on any label/attribution/micro when content is Hanzi — Chinese has no case; uppercase", + "selector_or_token": "css.text_transform_policy" + } + ], + "wrapping_policy": [ + { + "path": "beautiful-html-templates/templates/cartesian/template.html", + "raw_value": "nt: #8a8178; --line: #b8b0a4; } body { font-family: 'Inter', sans-serif; background: var(--bg-primary); color: var(--text-primary); overflow: hidden; } .presentation { width: 100vw;", + "selector_or_token": "template.css.typography" + } + ] + }, "source_typography_tokens": { "font_families": [ "Playfair Display", @@ -6227,6 +6994,11 @@ "400", "500" ], + "letter_spacing": [ + "2px", + "3px", + "1px" + ], "line_height": [ "1.1", "1", @@ -6234,16 +7006,6 @@ "1.5", "1.4" ], - "letter_spacing": [ - "2px", - "3px", - "1px" - ], - "text_transform": [ - "uppercase", - "uppercase` on any label/attribution/micro when content is Hanzi — Chinese has no case" - ], - "word_spacing": [], "paragraph_spacing": [ "3vh", "2vh", @@ -6260,537 +7022,45 @@ "4vw", "3vh" ], + "text_decoration": [], "text_direction": [ "column" ], - "writing_mode": [], - "text_decoration": [] + "text_transform": [ + "uppercase", + "uppercase` on any label/attribution/micro when content is Hanzi — Chinese has no case" + ], + "word_spacing": [], + "writing_mode": [] }, - "role_mapping": { - "display": { - "font_role": "display", - "source_font": "Playfair Display", - "runtime_alias": "SVGlideDisplay", - "font_size": 54, - "font_weight": 400, - "line_height": 0.96, - "letter_spacing": 0, - "text_transform": "latin_uppercase_only", - "max_lines": 3, - "alignment": "source_layout_dependent" - }, - "body": { - "font_role": "body", - "source_font": "Inter", - "runtime_alias": "SVGlideBody", - "font_size": 20, - "font_weight": 400, - "line_height": 1.32, - "letter_spacing": 0, - "text_transform": "preserve_source_case", - "max_lines": 5, - "alignment": "source_layout_dependent" - }, - "label": { - "font_role": "label", - "source_font": "Playfair Display", - "runtime_alias": "SVGlideLabel", - "font_size": 12, - "font_weight": 700, - "line_height": 1.05, - "letter_spacing": 0.08, - "text_transform": "latin_uppercase_labels_reset_cjk_spacing", - "max_lines": 1, - "alignment": "source_layout_dependent" - }, - "metric": { - "font_role": "metric", - "source_font": "Playfair Display", - "runtime_alias": "SVGlideMetric", - "font_size": 42, - "font_weight": 900, - "line_height": 0.95, - "letter_spacing": 0, - "text_transform": "preserve_numbers_and_units", - "max_lines": 2, - "alignment": "source_layout_dependent" - } - }, - "font_size_scale": { - "display": 54, - "body": 20, - "label": 12, - "metric": 42 - }, - "font_weight_scale": { - "display": 400, - "body": 400, - "label": 700, - "metric": 900 - }, - "line_height_scale": { - "display": 0.96, - "body": 1.32, - "label": 1.05, - "metric": 0.95 - }, - "letter_spacing_scale": { - "display": 0, - "body": 0, - "label": 0.08, - "metric": 0 + "text_direction": { + "cjk": "ltr", + "default": "column" }, "text_transform_policy": { - "display": "latin_uppercase_only", "body": "preserve_source_case", + "display": "latin_uppercase_only", "label": "latin_uppercase_labels_reset_cjk_spacing", "metric": "preserve_numbers_and_units" }, - "hierarchy_ratio": 2.7, - "max_lines": { - "display": 3, - "body": 5, - "label": 1, - "metric": 2 - }, - "measure": { - "display": "0.55-0.78 canvas width", - "body": "40-70 characters or CJK equivalent", - "label": "short mono labels", - "metric": "short numeric/stat blocks" - }, - "alignment": { - "primary": "follow source composition", - "fallback": "left/top aligned unless source screenshot is centered" - }, - "cjk_typography_adjustment": { - "display_font_cn": "Noto Serif SC", - "body_font_cn": "Noto Serif SC", - "letter_spacing_policy": "reset_letter_spacing_for_cjk_keep_latin_labels", - "mixed_run_spacing": "pangu_spacing", - "italic_policy": "drop_italic" - }, - "mapping_reason": "按源模板字号/字重/行高/字距/大小写规则抽象到 960x540 Slide 画布的四个文本角色。", "word_spacing": { - "display": 0, "body": 0, + "display": 0, "label": 0, "metric": 0 }, - "paragraph_spacing": { - "display_after": 0, - "body_after": 12, - "label_after": 0, - "metric_after": 0 - }, "wrapping_policy": { - "display": "manual_break_or_balance", "body": "wrap_with_measure", + "display": "manual_break_or_balance", "label": "no_wrap_preferred", "metric": "no_wrap_preferred" }, - "text_direction": { - "default": "column", - "cjk": "ltr" - }, "writing_mode": { "default": "horizontal-tb", "vertical_roles": [] - }, - "extraction_confidence": { - "role_mapping.body": "inferred_from_layout", - "role_mapping.display": "inferred_from_layout", - "font_size_scale": "css_extracted_from_template_html", - "max_lines": "inferred_from_layout", - "writing_mode": "absent_use_default", - "text_direction": "css_extracted_from_template_html", - "alignment": "inferred_from_layout", - "role_mapping.label": "inferred_from_layout", - "paragraph_spacing": "css_extracted_from_template_html", - "text_transform_policy": "css_extracted_from_template_html", - "line_height_scale": "css_extracted_from_template_html", - "wrapping_policy": "inferred_from_layout", - "font_weight_scale": "css_extracted_from_template_html", - "source_typography_tokens": "css_extracted_from_template_html", - "word_spacing": "absent_use_default", - "role_mapping.metric": "inferred_from_layout", - "cjk_typography_adjustment": "inferred_from_layout", - "hierarchy_ratio": "inferred_from_layout", - "measure": "inferred_from_layout", - "mapping_reason": "inferred_from_layout", - "letter_spacing_scale": "css_extracted_from_template_html" - }, - "source_refs": { - "role_mapping.body": [ - { - "path": "beautiful-html-templates/templates/cartesian/template.html", - "selector_or_token": "role_mapping.body.source_font", - "raw_value": "Inter" - }, - { - "path": "beautiful-html-templates/templates/cartesian/design.md", - "selector_or_token": "design.typography.roles", - "raw_value": "ccent: \"#8A8178\" line: \"#B8B0A4\" white-overlay: \"rgba(255, 255, 255, 0.3)\" typography: display: fontFamily: \"Playfair Display, serif\" fontSize: \"clamp(3rem, 6vw, 5.5rem)\" fontWeight: 400 lineHeight: 1.1 h1: fontFamily: \"Playfair Display, serif\" fontSize: \"clamp(2.5re" - } - ], - "role_mapping.display": [ - { - "path": "beautiful-html-templates/templates/cartesian/template.html", - "selector_or_token": "role_mapping.display.source_font", - "raw_value": "Playfair Display" - }, - { - "path": "beautiful-html-templates/templates/cartesian/design.md", - "selector_or_token": "design.typography.roles", - "raw_value": "ccent: \"#8A8178\" line: \"#B8B0A4\" white-overlay: \"rgba(255, 255, 255, 0.3)\" typography: display: fontFamily: \"Playfair Display, serif\" fontSize: \"clamp(3rem, 6vw, 5.5rem)\" fontWeight: 400 lineHeight: 1.1 h1: fontFamily: \"Playfair Display, serif\" fontSize: \"clamp(2.5re" - } - ], - "font_size_scale": [ - { - "path": "beautiful-html-templates/templates/cartesian/template.html", - "selector_or_token": "css.font_size_scale", - "raw_value": "0.75rem; 1.2rem; clamp(2.5rem, 5vw, 4.5rem); clamp(1.8rem, 3.5vw, 3rem); clamp(1.2rem, 2vw, 1.6rem); clamp(0.9rem, 1.2vw, 1.1rem); clamp(3rem, 6vw, 5.5rem); clamp(1rem, 1.5vw, 1.3rem); 1.5rem; 5rem; 0.85rem; 0.8rem; 2rem; 1rem; 1.3rem; 0.9rem" - } - ], - "max_lines": [ - { - "path": "beautiful-html-templates/templates/cartesian/template.html", - "selector_or_token": "template.css.typography", - "raw_value": "nt: #8a8178; --line: #b8b0a4; } body { font-family: 'Inter', sans-serif; background: var(--bg-primary); color: var(--text-primary); overflow: hidden; } .presentation { width: 100vw;" - } - ], - "text_direction": [ - { - "path": "beautiful-html-templates/templates/cartesian/template.html", - "selector_or_token": "css.text_direction", - "raw_value": "column" - } - ], - "alignment": [ - { - "path": "beautiful-html-templates/templates/cartesian/template.html", - "selector_or_token": "template.css.typography", - "raw_value": "nt: #8a8178; --line: #b8b0a4; } body { font-family: 'Inter', sans-serif; background: var(--bg-primary); color: var(--text-primary); overflow: hidden; } .presentation { width: 100vw;" - } - ], - "role_mapping.label": [ - { - "path": "beautiful-html-templates/templates/cartesian/template.html", - "selector_or_token": "role_mapping.label.source_font", - "raw_value": "Playfair Display" - }, - { - "path": "beautiful-html-templates/templates/cartesian/design.md", - "selector_or_token": "design.typography.roles", - "raw_value": "ccent: \"#8A8178\" line: \"#B8B0A4\" white-overlay: \"rgba(255, 255, 255, 0.3)\" typography: display: fontFamily: \"Playfair Display, serif\" fontSize: \"clamp(3rem, 6vw, 5.5rem)\" fontWeight: 400 lineHeight: 1.1 h1: fontFamily: \"Playfair Display, serif\" fontSize: \"clamp(2.5re" - } - ], - "paragraph_spacing": [ - { - "path": "beautiful-html-templates/templates/cartesian/template.html", - "selector_or_token": "css.paragraph_spacing", - "raw_value": "3vh; 2vh; 0.5vh; 6vh; 1vh; 4vh; 12px; 16px; 6vw; 2vw; 5vw; 3vw; 4vw; 3vh" - } - ], - "text_transform_policy": [ - { - "path": "beautiful-html-templates/templates/cartesian/template.html", - "selector_or_token": "css.text_transform_policy", - "raw_value": "uppercase` on any label/attribution/micro when content is Hanzi — Chinese has no case; uppercase" - } - ], - "line_height_scale": [ - { - "path": "beautiful-html-templates/templates/cartesian/template.html", - "selector_or_token": "css.line_height_scale", - "raw_value": "1.1; 1.6; 1" - } - ], - "wrapping_policy": [ - { - "path": "beautiful-html-templates/templates/cartesian/template.html", - "selector_or_token": "template.css.typography", - "raw_value": "nt: #8a8178; --line: #b8b0a4; } body { font-family: 'Inter', sans-serif; background: var(--bg-primary); color: var(--text-primary); overflow: hidden; } .presentation { width: 100vw;" - } - ], - "font_weight_scale": [ - { - "path": "beautiful-html-templates/templates/cartesian/template.html", - "selector_or_token": "css.font_weight_scale", - "raw_value": "400; 500" - } - ], - "source_typography_tokens": [ - { - "path": "beautiful-html-templates/templates/cartesian/template.html", - "selector_or_token": "css.source_typography_tokens", - "raw_value": "0.75rem; 1.2rem; clamp(2.5rem, 5vw, 4.5rem); clamp(1.8rem, 3.5vw, 3rem); clamp(1.2rem, 2vw, 1.6rem); clamp(0.9rem, 1.2vw, 1.1rem); clamp(3rem, 6vw, 5.5rem); clamp(1rem, 1.5vw, 1.3rem); 1.5rem; 5rem; 0.85rem; 0.8rem; 2rem; 1rem; 1.3rem; 0.9rem; 400; 500; 1.1; 1.6; 1; 2px; 3px; 1px; uppercase` on any label/attribution/micro when content is Hanzi — Chinese has no case; uppercase" - } - ], - "role_mapping.metric": [ - { - "path": "beautiful-html-templates/templates/cartesian/template.html", - "selector_or_token": "role_mapping.metric.source_font", - "raw_value": "Playfair Display" - }, - { - "path": "beautiful-html-templates/templates/cartesian/design.md", - "selector_or_token": "design.typography.roles", - "raw_value": "ccent: \"#8A8178\" line: \"#B8B0A4\" white-overlay: \"rgba(255, 255, 255, 0.3)\" typography: display: fontFamily: \"Playfair Display, serif\" fontSize: \"clamp(3rem, 6vw, 5.5rem)\" fontWeight: 400 lineHeight: 1.1 h1: fontFamily: \"Playfair Display, serif\" fontSize: \"clamp(2.5re" - } - ], - "cjk_typography_adjustment": [ - { - "path": "beautiful-html-templates/templates/cartesian/template.html", - "selector_or_token": "template.css.typography", - "raw_value": "nt: #8a8178; --line: #b8b0a4; } body { font-family: 'Inter', sans-serif; background: var(--bg-primary); color: var(--text-primary); overflow: hidden; } .presentation { width: 100vw;" - } - ], - "hierarchy_ratio": [ - { - "path": "beautiful-html-templates/templates/cartesian/template.html", - "selector_or_token": "template.css.typography", - "raw_value": "nt: #8a8178; --line: #b8b0a4; } body { font-family: 'Inter', sans-serif; background: var(--bg-primary); color: var(--text-primary); overflow: hidden; } .presentation { width: 100vw;" - } - ], - "measure": [ - { - "path": "beautiful-html-templates/templates/cartesian/template.html", - "selector_or_token": "template.css.typography", - "raw_value": "nt: #8a8178; --line: #b8b0a4; } body { font-family: 'Inter', sans-serif; background: var(--bg-primary); color: var(--text-primary); overflow: hidden; } .presentation { width: 100vw;" - } - ], - "mapping_reason": [ - { - "path": "beautiful-html-templates/templates/cartesian/template.html", - "selector_or_token": "template.css.typography", - "raw_value": "nt: #8a8178; --line: #b8b0a4; } body { font-family: 'Inter', sans-serif; background: var(--bg-primary); color: var(--text-primary); overflow: hidden; } .presentation { width: 100vw;" - } - ], - "letter_spacing_scale": [ - { - "path": "beautiful-html-templates/templates/cartesian/template.html", - "selector_or_token": "css.letter_spacing_scale", - "raw_value": "2px; 3px; 1px" - } - ] } }, - "text_style_strategy": { - "bold": { - "source_usage": "source uses heavy display/label weights", - "mapped_weight": { - "display": 400, - "label": 700, - "metric": 900 - }, - "allowed_roles": [ - "display", - "label", - "metric" - ] - }, - "italic": { - "source_usage": "source uses italic/font-style or italic-family tokens", - "mapped_style": "latin_only_when_source_requires_else_normal", - "fallback_when_unavailable": "use color_shift or weight_shift; do not fake CJK italic", - "loss_notes": "Satori/Slide may not provide exact Google italic face; record as visual approximation." - }, - "underline": { - "source_usage": "source uses underline/text-decoration or hairline emphasis", - "mapped_decoration": "native underline only for actual text-decoration source usage", - "fallback_shape": "1px-3px rule or border accent when underline font rendering is unavailable" - }, - "line_through": { - "source_usage": "not present in source; default no line-through", - "mapped_decoration": "none", - "fallback_shape": "none" - }, - "emphasis": { - "color_shift": "use source accent color roles only", - "font_family_switch": "only switch between mapped display/body/label/metric roles from this family", - "weight_shift": "increase one role step within font_weight_scale", - "style_shift": "italic only when source_usage requires and CJK fallback is safe" - }, - "text_decoration_policy": { - "underline": { - "style": "solid", - "color": "currentColor", - "thickness": "1px" - }, - "line_through": { - "style": "none", - "color": "currentColor", - "thickness": "0px" - } - }, - "forbidden": [ - "fake_cjk_italic", - "drop_source_text_transform", - "drop_source_letter_spacing_without_loss_note", - "use_cross_family_font_motif", - "remote_font_dependency_without_receipt" - ], - "extraction_confidence": { - "text_decoration_policy.line_through.color": "absent_use_default", - "text_decoration_policy.underline.color": "css_extracted_from_template_html", - "text_decoration_policy.line_through.style": "absent_use_default", - "italic": "css_extracted_from_template_html", - "forbidden": "inferred_from_layout", - "emphasis": "inferred_from_layout", - "text_decoration_policy.underline.thickness": "css_extracted_from_template_html", - "underline": "css_extracted_from_template_html", - "text_decoration_policy.line_through.thickness": "absent_use_default", - "line_through": "absent_use_default", - "text_decoration_policy.underline.style": "css_extracted_from_template_html", - "bold": "css_extracted_from_template_html" - }, - "source_refs": { - "text_decoration_policy.underline.color": [ - { - "path": "beautiful-html-templates/templates/cartesian/template.html", - "selector_or_token": "css.text-decoration", - "raw_value": "ody copy (Inter italic) — italic Playfair is loaded but reserved for rare uses. Underline is not used. Line-height stays open: headlines at 1.1, body at 1.6. The wide body line-height is part of the breathing-room aesthetic. ## Layout ### Canvas System The canvas is `100vw × 100vh` — full viewpor" - } - ], - "italic": [ - { - "path": "beautiful-html-templates/templates/cartesian/template.html", - "selector_or_token": "css.font-style", - "raw_value": "on a **two-face conversation**: `Playfair Display` (serif, weights 400/600/700, italic available) carries every headline, stat numeral, quote mark, card title, and team initial; `Inter` (sans, weights 300/400/500/600) carries every body, subtitle, label, attribution, and micro-text. There is no thir" - } - ], - "forbidden": [ - { - "path": "beautiful-html-templates/templates/cartesian/template.html", - "selector_or_token": "template.css.typography", - "raw_value": "nt: #8a8178; --line: #b8b0a4; } body { font-family: 'Inter', sans-serif; background: var(--bg-primary); color: var(--text-primary); overflow: hidden; } .presentation { width: 100vw;" - } - ], - "emphasis": [ - { - "path": "beautiful-html-templates/templates/cartesian/template.html", - "selector_or_token": "template.css.typography", - "raw_value": "nt: #8a8178; --line: #b8b0a4; } body { font-family: 'Inter', sans-serif; background: var(--bg-primary); color: var(--text-primary); overflow: hidden; } .presentation { width: 100vw;" - } - ], - "text_decoration_policy.underline.thickness": [ - { - "path": "beautiful-html-templates/templates/cartesian/template.html", - "selector_or_token": "css.text-decoration", - "raw_value": "ody copy (Inter italic) — italic Playfair is loaded but reserved for rare uses. Underline is not used. Line-height stays open: headlines at 1.1, body at 1.6. The wide body line-height is part of the breathing-room aesthetic. ## Layout ### Canvas System The canvas is `100vw × 100vh` — full viewpor" - } - ], - "underline": [ - { - "path": "beautiful-html-templates/templates/cartesian/template.html", - "selector_or_token": "css.text-decoration", - "raw_value": "ody copy (Inter italic) — italic Playfair is loaded but reserved for rare uses. Underline is not used. Line-height stays open: headlines at 1.1, body at 1.6. The wide body line-height is part of the breathing-room aesthetic. ## Layout ### Canvas System The canvas is `100vw × 100vh` — full viewpor" - } - ], - "text_decoration_policy.underline.style": [ - { - "path": "beautiful-html-templates/templates/cartesian/template.html", - "selector_or_token": "css.text-decoration", - "raw_value": "ody copy (Inter italic) — italic Playfair is loaded but reserved for rare uses. Underline is not used. Line-height stays open: headlines at 1.1, body at 1.6. The wide body line-height is part of the breathing-room aesthetic. ## Layout ### Canvas System The canvas is `100vw × 100vh` — full viewpor" - } - ], - "bold": [ - { - "path": "beautiful-html-templates/templates/cartesian/template.html", - "selector_or_token": "css.font-weight", - "raw_value": "400; 500" - } - ] - } - }, - "satori": { - "font_and_typography_constraints": [ - "italic is source-aware but CJK fake italic is forbidden; use color/weight fallback when unavailable", - "letter spacing is preserved for Latin labels and reset/softened for CJK" - ] - }, - "loss_notes": [ - "italic is source-aware but CJK fake italic is forbidden; use color/weight fallback when unavailable", - "letter spacing is preserved for Latin labels and reset/softened for CJK" - ], - "page_variant_count": 9, - "source_page_variants": [ - "agenda", - "barchart", - "cards", - "closing", - "linechart", - "statement", - "team", - "timeline", - "twocol" - ], - "page_family_source": { - "extractor": "skills/lark-slides/scripts/beautiful_template_page_family_extract.py", - "source_template_html": "beautiful-html-templates/templates/cartesian/template.html", - "source_design_md": "beautiful-html-templates/templates/cartesian/design.md", - "source_template_json": "beautiful-html-templates/templates/cartesian/template.json", - "claim_boundary": "source extraction only; does not imply renderer, fidelity, quality gate, or production/default selectable status" - } - }, - { - "family_id": "cobalt-grid", - "template_id": "trend-grid-report", - "runtime_template_id": "trend-grid-report", - "source_template_html": "beautiful-html-templates/templates/cobalt-grid/template.html", - "source_design_md": "beautiful-html-templates/templates/cobalt-grid/design.md", - "source_template_json": "beautiful-html-templates/templates/cobalt-grid/template.json", - "renderer_id": "artboard_satori.trend-grid-report", - "renderer_module": "skills/lark-slides/scripts/artboard_renderer/templates/beautiful/trend-grid-report.mjs", - "golden_spec": "skills/lark-slides/scripts/fixtures/svglide_artboard/golden/trend-grid-report.canvas-spec.json", - "reference_screenshot": "beautiful-html-templates/screenshots/cobalt-grid-1.png", - "fidelity_receipt": "skills/lark-slides/references/receipts/template-fidelity/cobalt-grid.trend-grid-report.json", - "source_trace": [ - { - "source": "beautiful-html-templates/templates/cobalt-grid/template.html", - "evidence": "source_template_html" - }, - { - "source": "beautiful-html-templates/templates/cobalt-grid/design.md", - "evidence": "source_design_md" - }, - { - "source": "beautiful-html-templates/templates/cobalt-grid/template.json", - "evidence": "source_template_json" - }, - { - "source": "beautiful-html-templates/screenshots/cobalt-grid-1.png", - "evidence": "reference_screenshot" - }, - { - "source": "skills/lark-slides/references/absorptions/beautiful-html-templates/cobalt-grid.trend-grid-report.json", - "evidence": "absorption_record" - } - ], "visual_contract": { - "path": "skills/lark-slides/references/visual-contracts/beautiful/cobalt-grid.trend-grid-report.json", - "layout_rhythm": "cobalt-grid: medium density, high formality. Electric cobalt serifs on a graph-paper canvas, anchored by stair-stepped pixel-glitch decorations and slim hairline rules.", - "motifs": [ - "grid", - "accent line", - "paper texture", - "poster blocks", - "quote mark", - "sticker collage", - "pixel motif" - ], - "palette_roles": [ - "accent", - "background", - "border", - "muted", - "negative", - "positive", - "primary", - "surface", - "text" - ], "do_not_simplify": [ "preserve_fonts_palette_grid_slide_classes_decorative_elements", "do_not_recolor_without_explicit_brand_override", @@ -6806,40 +7076,50 @@ "do_not_mark_production_without_renderer_golden_fidelity_receipt", "do_not_strip_identity_decorations", "do_not_recolor_without_explicit_brand_override" - ] + ], + "layout_rhythm": "cartesian: low density, high formality. Quiet warm-neutral palette with classical Playfair serifs; tasteful and unhurried.", + "motifs": [ + "grid", + "accent line", + "card panels", + "paper texture", + "poster blocks", + "quote mark" + ], + "palette_roles": [ + "accent", + "background", + "border", + "muted", + "negative", + "positive", + "primary", + "surface", + "text" + ], + "path": "skills/lark-slides/references/visual-contracts/beautiful/cartesian.architectural-spec.json" }, - "fidelity_gate": { - "status": "passed", - "score": 0.9296, - "threshold": 0.72, - "reference_screenshot": "/Users/bytedance/bd-projects/beautiful-html-templates/screenshots/cobalt-grid-1.png", - "render_screenshot": "/Users/bytedance/bd-projects/workspaces/SVGlide/.worktrees/cli-svglide-svg-private/skills/lark-slides/scripts/fixtures/svglide_artboard/golden/trend-grid-report.preview.png", - "receipt_path": "skills/lark-slides/references/receipts/template-fidelity/cobalt-grid.trend-grid-report.json", - "issues": [] - }, - "promotion_status": "needs_review", - "default_selectable": false, + "visual_contract_path": "skills/lark-slides/references/visual-contracts/beautiful/cartesian.architectural-spec.json" + }, + { "blocking_issues": [ "selector_gate_missing", "quality_gate_integration_pending", "production_review_pending" ], - "visual_contract_path": "skills/lark-slides/references/visual-contracts/beautiful/cobalt-grid.trend-grid-report.json", - "planned_renderer_module": "skills/lark-slides/scripts/artboard_renderer/templates/beautiful/trend-grid-report.mjs", - "planned_golden_spec": "skills/lark-slides/scripts/fixtures/svglide_artboard/golden/trend-grid-report.canvas-spec.json", - "planned_fidelity_receipt": "skills/lark-slides/references/receipts/template-fidelity/cobalt-grid.trend-grid-report.json", + "default_selectable": false, + "family_id": "cobalt-grid", + "fidelity_gate": { + "issues": [], + "receipt_path": "skills/lark-slides/references/receipts/template-fidelity/cobalt-grid.trend-grid-report.json", + "reference_screenshot": "/Users/bytedance/bd-projects/beautiful-html-templates/screenshots/cobalt-grid-1.png", + "render_screenshot": "/Users/bytedance/bd-projects/workspaces/SVGlide/.worktrees/cli-svglide-svg-private/skills/lark-slides/scripts/fixtures/svglide_artboard/golden/trend-grid-report.preview.png", + "score": 0.9296, + "status": "passed", + "threshold": 0.72 + }, + "fidelity_receipt": "skills/lark-slides/references/receipts/template-fidelity/cobalt-grid.trend-grid-report.json", "font_strategy": { - "source_fonts": [ - "Newsreader", - "Hanken Grotesk", - "DM Mono", - "Helvetica Neue" - ], - "slide_native_preferred": [ - "system-serif-cjk", - "system-sans-cjk", - "system-mono" - ], "adobe_or_embedded_fallback": [ "Source Serif Pro", "Source Sans Pro", @@ -6849,59 +7129,17 @@ "思源等宽" ], "cjk_fallback": "Noto Serif SC", - "role_mapping": { - "display": { - "source_font": "Newsreader", - "slide_font": "Source Serif Pro", - "runtime_alias": "SVGlideDisplay", - "cjk_font": "思源宋体", - "fallback_stack": [ - "system-serif-cjk", - "SVGlideDisplay" - ], - "source_only": false, - "requires_download": false, - "mapping_reason": "保留 Newsreader 的语义角色,但运行时优先使用 Slide/系统可用的 Source Serif Pro 与 思源宋体。" - }, - "body": { - "source_font": "Hanken Grotesk", - "slide_font": "Source Sans Pro", - "runtime_alias": "SVGlideBody", - "cjk_font": "思源黑体", - "fallback_stack": [ - "system-sans-cjk", - "SVGlideBody" - ], - "source_only": false, - "requires_download": false, - "mapping_reason": "保留 Hanken Grotesk 的语义角色,但运行时优先使用 Slide/系统可用的 Source Sans Pro 与 思源黑体。" - }, - "label": { - "source_font": "DM Mono", - "slide_font": "Source Code Pro", - "runtime_alias": "SVGlideLabel", - "cjk_font": "思源等宽", - "fallback_stack": [ - "system-mono", - "SVGlideLabel" - ], - "source_only": false, - "requires_download": false, - "mapping_reason": "保留 DM Mono 的语义角色,但运行时优先使用 Slide/系统可用的 Source Code Pro 与 思源等宽。" - }, - "metric": { - "source_font": "DM Mono", - "slide_font": "Source Code Pro", - "runtime_alias": "SVGlideMetric", - "cjk_font": "思源等宽", - "fallback_stack": [ - "system-mono", - "SVGlideMetric" - ], - "source_only": false, - "requires_download": false, - "mapping_reason": "保留 DM Mono 的语义角色,但运行时优先使用 Slide/系统可用的 Source Code Pro 与 思源等宽。" - } + "extraction_confidence": { + "adobe_or_embedded_fallback": "inferred_from_layout", + "cjk_fallback": "inferred_from_layout", + "forbidden": "inferred_from_layout", + "mapping_reason": "inferred_from_layout", + "role_mapping.body": "inferred_from_layout", + "role_mapping.display": "inferred_from_layout", + "role_mapping.label": "inferred_from_layout", + "role_mapping.metric": "inferred_from_layout", + "slide_native_preferred": "inferred_from_layout", + "source_fonts": "css_extracted_from_template_html" }, "forbidden": [ "remote_font_runtime_dependency", @@ -6910,118 +7148,713 @@ "drop_cjk_fallback" ], "mapping_reason": "根据 design.md/template.html/template.json 中的 font-family 与 typography token 提取源字体;运行时按 Slide/系统/Adobe/思源可用字体降级。", + "role_mapping": { + "body": { + "cjk_font": "思源黑体", + "fallback_stack": [ + "system-sans-cjk", + "SVGlideBody" + ], + "mapping_reason": "保留 Hanken Grotesk 的语义角色,但运行时优先使用 Slide/系统可用的 Source Sans Pro 与 思源黑体。", + "requires_download": false, + "runtime_alias": "SVGlideBody", + "slide_font": "Source Sans Pro", + "source_font": "Hanken Grotesk", + "source_only": false + }, + "display": { + "cjk_font": "思源宋体", + "fallback_stack": [ + "system-serif-cjk", + "SVGlideDisplay" + ], + "mapping_reason": "保留 Newsreader 的语义角色,但运行时优先使用 Slide/系统可用的 Source Serif Pro 与 思源宋体。", + "requires_download": false, + "runtime_alias": "SVGlideDisplay", + "slide_font": "Source Serif Pro", + "source_font": "Newsreader", + "source_only": false + }, + "label": { + "cjk_font": "思源等宽", + "fallback_stack": [ + "system-mono", + "SVGlideLabel" + ], + "mapping_reason": "保留 DM Mono 的语义角色,但运行时优先使用 Slide/系统可用的 Source Code Pro 与 思源等宽。", + "requires_download": false, + "runtime_alias": "SVGlideLabel", + "slide_font": "Source Code Pro", + "source_font": "DM Mono", + "source_only": false + }, + "metric": { + "cjk_font": "思源等宽", + "fallback_stack": [ + "system-mono", + "SVGlideMetric" + ], + "mapping_reason": "保留 DM Mono 的语义角色,但运行时优先使用 Slide/系统可用的 Source Code Pro 与 思源等宽。", + "requires_download": false, + "runtime_alias": "SVGlideMetric", + "slide_font": "Source Code Pro", + "source_font": "DM Mono", + "source_only": false + } + }, + "slide_native_preferred": [ + "system-serif-cjk", + "system-sans-cjk", + "system-mono" + ], "source_evidence": [ "beautiful-html-templates/templates/cobalt-grid/design.md", "beautiful-html-templates/templates/cobalt-grid/template.html", "beautiful-html-templates/templates/cobalt-grid/template.json", "beautiful-html-templates/screenshots/cobalt-grid-1.png" ], - "extraction_confidence": { - "role_mapping.body": "inferred_from_layout", - "role_mapping.display": "inferred_from_layout", - "source_fonts": "css_extracted_from_template_html", - "adobe_or_embedded_fallback": "inferred_from_layout", - "cjk_fallback": "inferred_from_layout", - "role_mapping.metric": "inferred_from_layout", - "forbidden": "inferred_from_layout", - "slide_native_preferred": "inferred_from_layout", - "mapping_reason": "inferred_from_layout", - "role_mapping.label": "inferred_from_layout" - }, + "source_fonts": [ + "Newsreader", + "Hanken Grotesk", + "DM Mono", + "Helvetica Neue" + ], "source_refs": { - "role_mapping.body": [ - { - "path": "beautiful-html-templates/templates/cobalt-grid/template.html", - "selector_or_token": "role_mapping.body.source_font", - "raw_value": "Hanken Grotesk" - }, - { - "path": "beautiful-html-templates/templates/cobalt-grid/design.md", - "selector_or_token": "design.typography.roles", - "raw_value": "ink-faint: \"rgba(31, 43, 224, 0.18)\" color-aliases: rule: ink bg: paper typography: display-hero: fontFamily: \"Newsreader, Georgia, serif\" fontSize: \"clamp(100px, min(11vw, 18vh), 200px)\" fontWeight: 400 lineHeight: 0.92 letterSpacing: -0.008em display-closing: fo" - } - ], - "role_mapping.display": [ - { - "path": "beautiful-html-templates/templates/cobalt-grid/template.html", - "selector_or_token": "role_mapping.display.source_font", - "raw_value": "Newsreader" - }, - { - "path": "beautiful-html-templates/templates/cobalt-grid/design.md", - "selector_or_token": "design.typography.roles", - "raw_value": "ink-faint: \"rgba(31, 43, 224, 0.18)\" color-aliases: rule: ink bg: paper typography: display-hero: fontFamily: \"Newsreader, Georgia, serif\" fontSize: \"clamp(100px, min(11vw, 18vh), 200px)\" fontWeight: 400 lineHeight: 0.92 letterSpacing: -0.008em display-closing: fo" - } - ], - "source_fonts": [ - { - "path": "beautiful-html-templates/templates/cobalt-grid/template.html", - "selector_or_token": "css.font-family", - "raw_value": "'Hanken Grotesk', 'Helvetica Neue', sans-serif; 'Newsreader', Georgia, serif; 'Hanken Grotesk', sans-serif; 'DM Mono', ui-monospace, monospace" - } - ], "adobe_or_embedded_fallback": [ { "path": "beautiful-html-templates/templates/cobalt-grid/template.html", - "selector_or_token": "css.font-family", - "raw_value": "'Hanken Grotesk', 'Helvetica Neue', sans-serif; 'Newsreader', Georgia, serif; 'Hanken Grotesk', sans-serif; 'DM Mono', ui-monospace, monospace" + "raw_value": "'Hanken Grotesk', 'Helvetica Neue', sans-serif; 'Newsreader', Georgia, serif; 'Hanken Grotesk', sans-serif; 'DM Mono', ui-monospace, monospace", + "selector_or_token": "css.font-family" } ], "cjk_fallback": [ { "path": "beautiful-html-templates/templates/cobalt-grid/template.html", - "selector_or_token": "css.font-family", - "raw_value": "'Hanken Grotesk', 'Helvetica Neue', sans-serif; 'Newsreader', Georgia, serif; 'Hanken Grotesk', sans-serif; 'DM Mono', ui-monospace, monospace" - } - ], - "role_mapping.metric": [ - { - "path": "beautiful-html-templates/templates/cobalt-grid/template.html", - "selector_or_token": "role_mapping.metric.source_font", - "raw_value": "DM Mono" - }, - { - "path": "beautiful-html-templates/templates/cobalt-grid/design.md", - "selector_or_token": "design.typography.roles", - "raw_value": "ink-faint: \"rgba(31, 43, 224, 0.18)\" color-aliases: rule: ink bg: paper typography: display-hero: fontFamily: \"Newsreader, Georgia, serif\" fontSize: \"clamp(100px, min(11vw, 18vh), 200px)\" fontWeight: 400 lineHeight: 0.92 letterSpacing: -0.008em display-closing: fo" + "raw_value": "'Hanken Grotesk', 'Helvetica Neue', sans-serif; 'Newsreader', Georgia, serif; 'Hanken Grotesk', sans-serif; 'DM Mono', ui-monospace, monospace", + "selector_or_token": "css.font-family" } ], "forbidden": [ { "path": "beautiful-html-templates/templates/cobalt-grid/template.html", - "selector_or_token": "css.font-family", - "raw_value": "'Hanken Grotesk', 'Helvetica Neue', sans-serif; 'Newsreader', Georgia, serif; 'Hanken Grotesk', sans-serif; 'DM Mono', ui-monospace, monospace" - } - ], - "slide_native_preferred": [ - { - "path": "beautiful-html-templates/templates/cobalt-grid/template.html", - "selector_or_token": "css.font-family", - "raw_value": "'Hanken Grotesk', 'Helvetica Neue', sans-serif; 'Newsreader', Georgia, serif; 'Hanken Grotesk', sans-serif; 'DM Mono', ui-monospace, monospace" + "raw_value": "'Hanken Grotesk', 'Helvetica Neue', sans-serif; 'Newsreader', Georgia, serif; 'Hanken Grotesk', sans-serif; 'DM Mono', ui-monospace, monospace", + "selector_or_token": "css.font-family" } ], "mapping_reason": [ { "path": "beautiful-html-templates/templates/cobalt-grid/template.html", - "selector_or_token": "css.font-family", - "raw_value": "'Hanken Grotesk', 'Helvetica Neue', sans-serif; 'Newsreader', Georgia, serif; 'Hanken Grotesk', sans-serif; 'DM Mono', ui-monospace, monospace" + "raw_value": "'Hanken Grotesk', 'Helvetica Neue', sans-serif; 'Newsreader', Georgia, serif; 'Hanken Grotesk', sans-serif; 'DM Mono', ui-monospace, monospace", + "selector_or_token": "css.font-family" + } + ], + "role_mapping.body": [ + { + "path": "beautiful-html-templates/templates/cobalt-grid/template.html", + "raw_value": "Hanken Grotesk", + "selector_or_token": "role_mapping.body.source_font" + }, + { + "path": "beautiful-html-templates/templates/cobalt-grid/design.md", + "raw_value": "ink-faint: \"rgba(31, 43, 224, 0.18)\" color-aliases: rule: ink bg: paper typography: display-hero: fontFamily: \"Newsreader, Georgia, serif\" fontSize: \"clamp(100px, min(11vw, 18vh), 200px)\" fontWeight: 400 lineHeight: 0.92 letterSpacing: -0.008em display-closing: fo", + "selector_or_token": "design.typography.roles" + } + ], + "role_mapping.display": [ + { + "path": "beautiful-html-templates/templates/cobalt-grid/template.html", + "raw_value": "Newsreader", + "selector_or_token": "role_mapping.display.source_font" + }, + { + "path": "beautiful-html-templates/templates/cobalt-grid/design.md", + "raw_value": "ink-faint: \"rgba(31, 43, 224, 0.18)\" color-aliases: rule: ink bg: paper typography: display-hero: fontFamily: \"Newsreader, Georgia, serif\" fontSize: \"clamp(100px, min(11vw, 18vh), 200px)\" fontWeight: 400 lineHeight: 0.92 letterSpacing: -0.008em display-closing: fo", + "selector_or_token": "design.typography.roles" } ], "role_mapping.label": [ { "path": "beautiful-html-templates/templates/cobalt-grid/template.html", - "selector_or_token": "role_mapping.label.source_font", - "raw_value": "DM Mono" + "raw_value": "DM Mono", + "selector_or_token": "role_mapping.label.source_font" }, { "path": "beautiful-html-templates/templates/cobalt-grid/design.md", - "selector_or_token": "design.typography.roles", - "raw_value": "ink-faint: \"rgba(31, 43, 224, 0.18)\" color-aliases: rule: ink bg: paper typography: display-hero: fontFamily: \"Newsreader, Georgia, serif\" fontSize: \"clamp(100px, min(11vw, 18vh), 200px)\" fontWeight: 400 lineHeight: 0.92 letterSpacing: -0.008em display-closing: fo" + "raw_value": "ink-faint: \"rgba(31, 43, 224, 0.18)\" color-aliases: rule: ink bg: paper typography: display-hero: fontFamily: \"Newsreader, Georgia, serif\" fontSize: \"clamp(100px, min(11vw, 18vh), 200px)\" fontWeight: 400 lineHeight: 0.92 letterSpacing: -0.008em display-closing: fo", + "selector_or_token": "design.typography.roles" + } + ], + "role_mapping.metric": [ + { + "path": "beautiful-html-templates/templates/cobalt-grid/template.html", + "raw_value": "DM Mono", + "selector_or_token": "role_mapping.metric.source_font" + }, + { + "path": "beautiful-html-templates/templates/cobalt-grid/design.md", + "raw_value": "ink-faint: \"rgba(31, 43, 224, 0.18)\" color-aliases: rule: ink bg: paper typography: display-hero: fontFamily: \"Newsreader, Georgia, serif\" fontSize: \"clamp(100px, min(11vw, 18vh), 200px)\" fontWeight: 400 lineHeight: 0.92 letterSpacing: -0.008em display-closing: fo", + "selector_or_token": "design.typography.roles" + } + ], + "slide_native_preferred": [ + { + "path": "beautiful-html-templates/templates/cobalt-grid/template.html", + "raw_value": "'Hanken Grotesk', 'Helvetica Neue', sans-serif; 'Newsreader', Georgia, serif; 'Hanken Grotesk', sans-serif; 'DM Mono', ui-monospace, monospace", + "selector_or_token": "css.font-family" + } + ], + "source_fonts": [ + { + "path": "beautiful-html-templates/templates/cobalt-grid/template.html", + "raw_value": "'Hanken Grotesk', 'Helvetica Neue', sans-serif; 'Newsreader', Georgia, serif; 'Hanken Grotesk', sans-serif; 'DM Mono', ui-monospace, monospace", + "selector_or_token": "css.font-family" } ] } }, + "golden_spec": "skills/lark-slides/scripts/fixtures/svglide_artboard/golden/cobalt-grid.cover.canvas-spec.json", + "implemented_page_variants": [ + "cover", + "manifesto", + "index", + "chapter", + "data", + "quote", + "table", + "colophon" + ], + "loss_notes": [ + "italic is source-aware but CJK fake italic is forbidden; use color/weight fallback when unavailable", + "letter spacing is preserved for Latin labels and reset/softened for CJK" + ], + "page_family": { + "family_id": "cobalt-grid", + "source_slide_count": 8, + "supported_page_roles": [ + "cover", + "agenda", + "content", + "data", + "comparison", + "quote", + "process", + "detail", + "closing" + ], + "supported_page_variants": [ + "cover", + "manifesto", + "index", + "chapter", + "data", + "quote", + "table", + "colophon" + ], + "variant_usage_policy": { + "repeatable": [ + "manifesto", + "index", + "chapter", + "data", + "quote", + "table" + ], + "singletons": [ + "cover", + "colophon" + ] + } + }, + "page_family_smoke_deck": "skills/lark-slides/references/page-family-smoke-decks/cobalt-grid.json", + "page_family_smoke_receipt": "skills/lark-slides/references/receipts/page-family-smoke/cobalt-grid.trend-grid-report.json", + "page_family_source": { + "claim_boundary": "source-backed page-family implementation evidence; does not imply production/default selectable status", + "source_design_md": "beautiful-html-templates/templates/cobalt-grid/design.md", + "source_template_html": "beautiful-html-templates/templates/cobalt-grid/template.html", + "source_template_json": "beautiful-html-templates/templates/cobalt-grid/template.json" + }, + "page_variant_count": 8, + "page_variant_golden_specs": { + "chapter": "skills/lark-slides/scripts/fixtures/svglide_artboard/golden/cobalt-grid.chapter.canvas-spec.json", + "colophon": "skills/lark-slides/scripts/fixtures/svglide_artboard/golden/cobalt-grid.colophon.canvas-spec.json", + "cover": "skills/lark-slides/scripts/fixtures/svglide_artboard/golden/cobalt-grid.cover.canvas-spec.json", + "data": "skills/lark-slides/scripts/fixtures/svglide_artboard/golden/cobalt-grid.data.canvas-spec.json", + "index": "skills/lark-slides/scripts/fixtures/svglide_artboard/golden/cobalt-grid.index.canvas-spec.json", + "manifesto": "skills/lark-slides/scripts/fixtures/svglide_artboard/golden/cobalt-grid.manifesto.canvas-spec.json", + "quote": "skills/lark-slides/scripts/fixtures/svglide_artboard/golden/cobalt-grid.quote.canvas-spec.json", + "table": "skills/lark-slides/scripts/fixtures/svglide_artboard/golden/cobalt-grid.table.canvas-spec.json" + }, + "planned_fidelity_receipt": "skills/lark-slides/references/receipts/template-fidelity/cobalt-grid.trend-grid-report.json", + "planned_golden_spec": "skills/lark-slides/scripts/fixtures/svglide_artboard/golden/cobalt-grid.cover.canvas-spec.json", + "planned_renderer_module": "skills/lark-slides/scripts/artboard_renderer/templates/beautiful/trend-grid-report.mjs", + "promotion_status": "needs_review", + "reference_screenshot": "beautiful-html-templates/screenshots/cobalt-grid-1.png", + "renderer_id": "artboard_satori.trend-grid-report", + "renderer_module": "skills/lark-slides/scripts/artboard_renderer/templates/beautiful/trend-grid-report.mjs", + "renderer_stage": "page_family", + "runtime_template_id": "trend-grid-report", + "satori": { + "font_and_typography_constraints": [ + "italic is source-aware but CJK fake italic is forbidden; use color/weight fallback when unavailable", + "letter spacing is preserved for Latin labels and reset/softened for CJK" + ] + }, + "source_design_md": "beautiful-html-templates/templates/cobalt-grid/design.md", + "source_page_variants": [ + "cover", + "manifesto", + "index", + "chapter", + "data", + "quote", + "table", + "colophon" + ], + "source_template_html": "beautiful-html-templates/templates/cobalt-grid/template.html", + "source_template_json": "beautiful-html-templates/templates/cobalt-grid/template.json", + "source_trace": [ + { + "evidence": "source_template_html", + "source": "beautiful-html-templates/templates/cobalt-grid/template.html" + }, + { + "evidence": "source_design_md", + "source": "beautiful-html-templates/templates/cobalt-grid/design.md" + }, + { + "evidence": "source_template_json", + "source": "beautiful-html-templates/templates/cobalt-grid/template.json" + }, + { + "evidence": "reference_screenshot", + "source": "beautiful-html-templates/screenshots/cobalt-grid-1.png" + }, + { + "evidence": "absorption_record", + "source": "skills/lark-slides/references/absorptions/beautiful-html-templates/cobalt-grid.trend-grid-report.json" + } + ], + "template_id": "trend-grid-report", + "text_style_strategy": { + "bold": { + "allowed_roles": [ + "display", + "label", + "metric" + ], + "mapped_weight": { + "display": 400, + "label": 700, + "metric": 900 + }, + "source_usage": "source uses heavy display/label weights" + }, + "emphasis": { + "color_shift": "use source accent color roles only", + "font_family_switch": "only switch between mapped display/body/label/metric roles from this family", + "style_shift": "italic only when source_usage requires and CJK fallback is safe", + "weight_shift": "increase one role step within font_weight_scale" + }, + "extraction_confidence": { + "bold": "css_extracted_from_template_html", + "emphasis": "inferred_from_layout", + "forbidden": "inferred_from_layout", + "italic": "css_extracted_from_template_html", + "line_through": "absent_use_default", + "text_decoration_policy.line_through.color": "absent_use_default", + "text_decoration_policy.line_through.style": "absent_use_default", + "text_decoration_policy.line_through.thickness": "absent_use_default", + "text_decoration_policy.underline.color": "css_extracted_from_template_html", + "text_decoration_policy.underline.style": "css_extracted_from_template_html", + "text_decoration_policy.underline.thickness": "css_extracted_from_template_html", + "underline": "css_extracted_from_template_html" + }, + "forbidden": [ + "fake_cjk_italic", + "drop_source_text_transform", + "drop_source_letter_spacing_without_loss_note", + "use_cross_family_font_motif", + "remote_font_dependency_without_receipt" + ], + "italic": { + "fallback_when_unavailable": "use color_shift or weight_shift; do not fake CJK italic", + "loss_notes": "Satori/Slide may not provide exact Google italic face; record as visual approximation.", + "mapped_style": "latin_only_when_source_requires_else_normal", + "source_usage": "source uses italic/font-style or italic-family tokens" + }, + "line_through": { + "fallback_shape": "none", + "mapped_decoration": "none", + "source_usage": "not present in source; default no line-through" + }, + "source_refs": { + "bold": [ + { + "path": "beautiful-html-templates/templates/cobalt-grid/template.html", + "raw_value": "400; 600; 500", + "selector_or_token": "css.font-weight" + } + ], + "emphasis": [ + { + "path": "beautiful-html-templates/templates/cobalt-grid/template.html", + "raw_value": "body { margin: 0; padding: 0; height: 100%; background: #0a0a0a; } body { font-family: 'Hanken Grotesk', 'Helvetica Neue', sans-serif; color: var(--ink); overflow: hidden; } /* Deck wrapper — fills the viewport */ .deck { position: fixed; inset: 0; display: grid; place-items: ce", + "selector_or_token": "template.css.typography" + } + ], + "forbidden": [ + { + "path": "beautiful-html-templates/templates/cobalt-grid/template.html", + "raw_value": "body { margin: 0; padding: 0; height: 100%; background: #0a0a0a; } body { font-family: 'Hanken Grotesk', 'Helvetica Neue', sans-serif; color: var(--ink); overflow: hidden; } /* Deck wrapper — fills the viewport */ .deck { position: fixed; inset: 0; display: grid; place-items: ce", + "selector_or_token": "template.css.typography" + } + ], + "italic": [ + { + "path": "beautiful-html-templates/templates/cobalt-grid/template.html", + "raw_value": "em runs on a **three-face conversation**: `Newsreader` (serif, weight 400 / 500 italic) carries every display and headline; `Hanken Grotesk` (sans, weights 400–700) carries every body, label, and micro-text; `DM Mono` (monospace, 400–500) carries every chrome element. There is no fourth face. Newsr", + "selector_or_token": "css.font-style" + } + ], + "text_decoration_policy.underline.color": [ + { + "path": "beautiful-html-templates/templates/cobalt-grid/template.html", + "raw_value": "e `` and for the manifesto's editorial italic-with-`.roman`-flip treatment. Underline is not used. Line-height collapses at the top: display-hero / vbig-numeral at 0.92, display-chapter at 1.0, body at 1.5. The tight display + open body contrast is what gives the system its trend-report rhythm.", + "selector_or_token": "css.text-decoration" + } + ], + "text_decoration_policy.underline.style": [ + { + "path": "beautiful-html-templates/templates/cobalt-grid/template.html", + "raw_value": "e `` and for the manifesto's editorial italic-with-`.roman`-flip treatment. Underline is not used. Line-height collapses at the top: display-hero / vbig-numeral at 0.92, display-chapter at 1.0, body at 1.5. The tight display + open body contrast is what gives the system its trend-report rhythm.", + "selector_or_token": "css.text-decoration" + } + ], + "text_decoration_policy.underline.thickness": [ + { + "path": "beautiful-html-templates/templates/cobalt-grid/template.html", + "raw_value": "e `` and for the manifesto's editorial italic-with-`.roman`-flip treatment. Underline is not used. Line-height collapses at the top: display-hero / vbig-numeral at 0.92, display-chapter at 1.0, body at 1.5. The tight display + open body contrast is what gives the system its trend-report rhythm.", + "selector_or_token": "css.text-decoration" + } + ], + "underline": [ + { + "path": "beautiful-html-templates/templates/cobalt-grid/template.html", + "raw_value": "e `` and for the manifesto's editorial italic-with-`.roman`-flip treatment. Underline is not used. Line-height collapses at the top: display-hero / vbig-numeral at 0.92, display-chapter at 1.0, body at 1.5. The tight display + open body contrast is what gives the system its trend-report rhythm.", + "selector_or_token": "css.text-decoration" + } + ] + }, + "text_decoration_policy": { + "line_through": { + "color": "currentColor", + "style": "none", + "thickness": "0px" + }, + "underline": { + "color": "currentColor", + "style": "solid", + "thickness": "1px" + } + }, + "underline": { + "fallback_shape": "1px-3px rule or border accent when underline font rendering is unavailable", + "mapped_decoration": "native underline only for actual text-decoration source usage", + "source_usage": "source uses underline/text-decoration or hairline emphasis" + } + }, "typography_strategy": { + "alignment": { + "fallback": "left/top aligned unless source screenshot is centered", + "primary": "follow source composition" + }, + "cjk_typography_adjustment": { + "body_font_cn": "Noto Serif SC", + "display_font_cn": "Noto Serif SC", + "italic_policy": "drop_italic", + "letter_spacing_policy": "reset_letter_spacing_for_cjk_keep_latin_labels", + "mixed_run_spacing": "pangu_spacing" + }, + "extraction_confidence": { + "alignment": "inferred_from_layout", + "cjk_typography_adjustment": "inferred_from_layout", + "font_size_scale": "css_extracted_from_template_html", + "font_weight_scale": "css_extracted_from_template_html", + "hierarchy_ratio": "inferred_from_layout", + "letter_spacing_scale": "css_extracted_from_template_html", + "line_height_scale": "css_extracted_from_template_html", + "mapping_reason": "inferred_from_layout", + "max_lines": "inferred_from_layout", + "measure": "inferred_from_layout", + "paragraph_spacing": "css_extracted_from_template_html", + "role_mapping.body": "inferred_from_layout", + "role_mapping.display": "inferred_from_layout", + "role_mapping.label": "inferred_from_layout", + "role_mapping.metric": "inferred_from_layout", + "source_typography_tokens": "css_extracted_from_template_html", + "text_direction": "css_extracted_from_template_html", + "text_transform_policy": "css_extracted_from_template_html", + "word_spacing": "absent_use_default", + "wrapping_policy": "inferred_from_layout", + "writing_mode": "css_extracted_from_template_html" + }, + "font_size_scale": { + "body": 20, + "display": 54, + "label": 12, + "metric": 42 + }, + "font_weight_scale": { + "body": 400, + "display": 400, + "label": 700, + "metric": 900 + }, + "hierarchy_ratio": 2.7, + "letter_spacing_scale": { + "body": 0, + "display": 0, + "label": 0.08, + "metric": 0 + }, + "line_height_scale": { + "body": 1.32, + "display": 0.96, + "label": 1.05, + "metric": 0.95 + }, + "mapping_reason": "按源模板字号/字重/行高/字距/大小写规则抽象到 960x540 Slide 画布的四个文本角色。", + "max_lines": { + "body": 5, + "display": 3, + "label": 1, + "metric": 2 + }, + "measure": { + "body": "40-70 characters or CJK equivalent", + "display": "0.55-0.78 canvas width", + "label": "short mono labels", + "metric": "short numeric/stat blocks" + }, + "paragraph_spacing": { + "body_after": 12, + "display_after": 0, + "label_after": 0, + "metric_after": 0 + }, + "role_mapping": { + "body": { + "alignment": "source_layout_dependent", + "font_role": "body", + "font_size": 20, + "font_weight": 400, + "letter_spacing": 0, + "line_height": 1.32, + "max_lines": 5, + "runtime_alias": "SVGlideBody", + "source_font": "Hanken Grotesk", + "text_transform": "preserve_source_case" + }, + "display": { + "alignment": "source_layout_dependent", + "font_role": "display", + "font_size": 54, + "font_weight": 400, + "letter_spacing": 0, + "line_height": 0.96, + "max_lines": 3, + "runtime_alias": "SVGlideDisplay", + "source_font": "Newsreader", + "text_transform": "latin_uppercase_only" + }, + "label": { + "alignment": "source_layout_dependent", + "font_role": "label", + "font_size": 12, + "font_weight": 700, + "letter_spacing": 0.08, + "line_height": 1.05, + "max_lines": 1, + "runtime_alias": "SVGlideLabel", + "source_font": "DM Mono", + "text_transform": "latin_uppercase_labels_reset_cjk_spacing" + }, + "metric": { + "alignment": "source_layout_dependent", + "font_role": "metric", + "font_size": 42, + "font_weight": 900, + "letter_spacing": 0, + "line_height": 0.95, + "max_lines": 2, + "runtime_alias": "SVGlideMetric", + "source_font": "DM Mono", + "text_transform": "preserve_numbers_and_units" + } + }, + "source_refs": { + "alignment": [ + { + "path": "beautiful-html-templates/templates/cobalt-grid/template.html", + "raw_value": "body { margin: 0; padding: 0; height: 100%; background: #0a0a0a; } body { font-family: 'Hanken Grotesk', 'Helvetica Neue', sans-serif; color: var(--ink); overflow: hidden; } /* Deck wrapper — fills the viewport */ .deck { position: fixed; inset: 0; display: grid; place-items: ce", + "selector_or_token": "template.css.typography" + } + ], + "cjk_typography_adjustment": [ + { + "path": "beautiful-html-templates/templates/cobalt-grid/template.html", + "raw_value": "body { margin: 0; padding: 0; height: 100%; background: #0a0a0a; } body { font-family: 'Hanken Grotesk', 'Helvetica Neue', sans-serif; color: var(--ink); overflow: hidden; } /* Deck wrapper — fills the viewport */ .deck { position: fixed; inset: 0; display: grid; place-items: ce", + "selector_or_token": "template.css.typography" + } + ], + "font_size_scale": [ + { + "path": "beautiful-html-templates/templates/cobalt-grid/template.html", + "raw_value": "clamp(11px, 0.82vw, 13px); clamp(10px, 0.75vw, 12px); clamp(100px, min(11vw, 18vh), 200px); clamp(13px, 1vw, 16px); clamp(28px, min(2.8vw, 4.6vh), 50px); clamp(12px, 0.9vw, 15px); clamp(14px, 0.92vw, 15px); clamp(11px, 0.78vw, 13px); clamp(56px, min(6.4vw, 11vh), 120px); clamp(12px, 0.85vw, 14px); clamp(12px, 0.82vw, 14px); clamp(48px, min(5vw, 8.5vh), 100px); clamp(12px, 0.9vw, 14px); clamp(13px, 0.9vw, 15px); clamp(26px, 2vw, 40px); clamp(14px, 0.95vw, 15px)", + "selector_or_token": "css.font_size_scale" + } + ], + "font_weight_scale": [ + { + "path": "beautiful-html-templates/templates/cobalt-grid/template.html", + "raw_value": "400; 600; 500", + "selector_or_token": "css.font_weight_scale" + } + ], + "hierarchy_ratio": [ + { + "path": "beautiful-html-templates/templates/cobalt-grid/template.html", + "raw_value": "body { margin: 0; padding: 0; height: 100%; background: #0a0a0a; } body { font-family: 'Hanken Grotesk', 'Helvetica Neue', sans-serif; color: var(--ink); overflow: hidden; } /* Deck wrapper — fills the viewport */ .deck { position: fixed; inset: 0; display: grid; place-items: ce", + "selector_or_token": "template.css.typography" + } + ], + "letter_spacing_scale": [ + { + "path": "beautiful-html-templates/templates/cobalt-grid/template.html", + "raw_value": "-0.005em; 0.16em; 0.06em; 0.08em; -0.008em; 0.18em; 0.04em; -0.015em; 0.2em; 0.22em", + "selector_or_token": "css.letter_spacing_scale" + } + ], + "line_height_scale": [ + { + "path": "beautiful-html-templates/templates/cobalt-grid/template.html", + "raw_value": "0.92; 1.5; 1.1; 1; 1.45; 1.05; 0.95; 1.0; 1.15; 1.4; 0.96", + "selector_or_token": "css.line_height_scale" + } + ], + "mapping_reason": [ + { + "path": "beautiful-html-templates/templates/cobalt-grid/template.html", + "raw_value": "body { margin: 0; padding: 0; height: 100%; background: #0a0a0a; } body { font-family: 'Hanken Grotesk', 'Helvetica Neue', sans-serif; color: var(--ink); overflow: hidden; } /* Deck wrapper — fills the viewport */ .deck { position: fixed; inset: 0; display: grid; place-items: ce", + "selector_or_token": "template.css.typography" + } + ], + "max_lines": [ + { + "path": "beautiful-html-templates/templates/cobalt-grid/template.html", + "raw_value": "body { margin: 0; padding: 0; height: 100%; background: #0a0a0a; } body { font-family: 'Hanken Grotesk', 'Helvetica Neue', sans-serif; color: var(--ink); overflow: hidden; } /* Deck wrapper — fills the viewport */ .deck { position: fixed; inset: 0; display: grid; place-items: ce", + "selector_or_token": "template.css.typography" + } + ], + "measure": [ + { + "path": "beautiful-html-templates/templates/cobalt-grid/template.html", + "raw_value": "body { margin: 0; padding: 0; height: 100%; background: #0a0a0a; } body { font-family: 'Hanken Grotesk', 'Helvetica Neue', sans-serif; color: var(--ink); overflow: hidden; } /* Deck wrapper — fills the viewport */ .deck { position: fixed; inset: 0; display: grid; place-items: ce", + "selector_or_token": "template.css.typography" + } + ], + "paragraph_spacing": [ + { + "path": "beautiful-html-templates/templates/cobalt-grid/template.html", + "raw_value": "4px; clamp(16px, 1.8vh, 28px); clamp(14px, 1.6vh, 24px); 6px; 1.5px background: \"{colors.paper; \"clamp(14px, 1.4vw, 28px)\" borderBottom: \"1px solid {colors.ink-faint; 1.5px; 6px; clamp(10px, 1.2vh, 18px); clamp(28px, 3vw, 56px); clamp(14px, 1.4vw, 24px); clamp(20px, 2.2vh, 36px); 30px; clamp(14px, 2vh, 28px) clamp(28px, 3vw, 56px); clamp(12px, 1.4vw, 22px); clamp(18px, 2vh, 32px); clamp(20px, 2vh, 36px); clamp(20px, 2.4vh, 36px); clamp(10px, 1vw, 18px); 3px", + "selector_or_token": "css.paragraph_spacing" + } + ], + "role_mapping.body": [ + { + "path": "beautiful-html-templates/templates/cobalt-grid/template.html", + "raw_value": "Hanken Grotesk", + "selector_or_token": "role_mapping.body.source_font" + }, + { + "path": "beautiful-html-templates/templates/cobalt-grid/design.md", + "raw_value": "ink-faint: \"rgba(31, 43, 224, 0.18)\" color-aliases: rule: ink bg: paper typography: display-hero: fontFamily: \"Newsreader, Georgia, serif\" fontSize: \"clamp(100px, min(11vw, 18vh), 200px)\" fontWeight: 400 lineHeight: 0.92 letterSpacing: -0.008em display-closing: fo", + "selector_or_token": "design.typography.roles" + } + ], + "role_mapping.display": [ + { + "path": "beautiful-html-templates/templates/cobalt-grid/template.html", + "raw_value": "Newsreader", + "selector_or_token": "role_mapping.display.source_font" + }, + { + "path": "beautiful-html-templates/templates/cobalt-grid/design.md", + "raw_value": "ink-faint: \"rgba(31, 43, 224, 0.18)\" color-aliases: rule: ink bg: paper typography: display-hero: fontFamily: \"Newsreader, Georgia, serif\" fontSize: \"clamp(100px, min(11vw, 18vh), 200px)\" fontWeight: 400 lineHeight: 0.92 letterSpacing: -0.008em display-closing: fo", + "selector_or_token": "design.typography.roles" + } + ], + "role_mapping.label": [ + { + "path": "beautiful-html-templates/templates/cobalt-grid/template.html", + "raw_value": "DM Mono", + "selector_or_token": "role_mapping.label.source_font" + }, + { + "path": "beautiful-html-templates/templates/cobalt-grid/design.md", + "raw_value": "ink-faint: \"rgba(31, 43, 224, 0.18)\" color-aliases: rule: ink bg: paper typography: display-hero: fontFamily: \"Newsreader, Georgia, serif\" fontSize: \"clamp(100px, min(11vw, 18vh), 200px)\" fontWeight: 400 lineHeight: 0.92 letterSpacing: -0.008em display-closing: fo", + "selector_or_token": "design.typography.roles" + } + ], + "role_mapping.metric": [ + { + "path": "beautiful-html-templates/templates/cobalt-grid/template.html", + "raw_value": "DM Mono", + "selector_or_token": "role_mapping.metric.source_font" + }, + { + "path": "beautiful-html-templates/templates/cobalt-grid/design.md", + "raw_value": "ink-faint: \"rgba(31, 43, 224, 0.18)\" color-aliases: rule: ink bg: paper typography: display-hero: fontFamily: \"Newsreader, Georgia, serif\" fontSize: \"clamp(100px, min(11vw, 18vh), 200px)\" fontWeight: 400 lineHeight: 0.92 letterSpacing: -0.008em display-closing: fo", + "selector_or_token": "design.typography.roles" + } + ], + "source_typography_tokens": [ + { + "path": "beautiful-html-templates/templates/cobalt-grid/template.html", + "raw_value": "clamp(11px, 0.82vw, 13px); clamp(10px, 0.75vw, 12px); clamp(100px, min(11vw, 18vh), 200px); clamp(13px, 1vw, 16px); clamp(28px, min(2.8vw, 4.6vh), 50px); clamp(12px, 0.9vw, 15px); clamp(14px, 0.92vw, 15px); clamp(11px, 0.78vw, 13px); clamp(56px, min(6.4vw, 11vh), 120px); clamp(12px, 0.85vw, 14px); clamp(12px, 0.82vw, 14px); clamp(48px, min(5vw, 8.5vh), 100px); clamp(12px, 0.9vw, 14px); clamp(13px, 0.9vw, 15px); clamp(26px, 2vw, 40px); clamp(14px, 0.95vw, 15px); 400; 600; 500; 0.92; 1.5; 1.1; 1; ", + "selector_or_token": "css.source_typography_tokens" + } + ], + "text_direction": [ + { + "path": "beautiful-html-templates/templates/cobalt-grid/template.html", + "raw_value": "column; column-reverse", + "selector_or_token": "css.text_direction" + } + ], + "text_transform_policy": [ + { + "path": "beautiful-html-templates/templates/cobalt-grid/template.html", + "raw_value": "uppercase` on any micro/label/kicker when content is Hanzi — Chinese has no case; uppercase", + "selector_or_token": "css.text_transform_policy" + } + ], + "wrapping_policy": [ + { + "path": "beautiful-html-templates/templates/cobalt-grid/template.html", + "raw_value": "body { margin: 0; padding: 0; height: 100%; background: #0a0a0a; } body { font-family: 'Hanken Grotesk', 'Helvetica Neue', sans-serif; color: var(--ink); overflow: hidden; } /* Deck wrapper — fills the viewport */ .deck { position: fixed; inset: 0; display: grid; place-items: ce", + "selector_or_token": "template.css.typography" + } + ], + "writing_mode": [ + { + "path": "beautiful-html-templates/templates/cobalt-grid/template.html", + "raw_value": "vertical-rl` and `text-orientation: mixed`, rotating Latin text 90° clockwise. Anchored to right edge, vertically centered, evenly spaced. Reads as catalogue-style metadata stacked along the slide edge. **Topbar (with rule)** — A flex row containing a Newsreader headline left and a small mono lab-tag right, separated from the content below by a 1.5px solid cobalt bottom border. The universal section-header pattern. **Frame** — An absolutely-positioned content container with `inset: {spacing.pad-", + "selector_or_token": "css.writing_mode" + } + ] + }, "source_typography_tokens": { "font_families": [ "Newsreader", @@ -7046,18 +7879,6 @@ "600", "500" ], - "line_height": [ - "0.92", - "0.96", - "1", - "1.05", - "0.95", - "1.1", - "1.15", - "1.5", - "1.45", - "1.0" - ], "letter_spacing": [ "-0.008em", "-0.005em", @@ -7070,11 +7891,18 @@ "0.2em", "0.22em" ], - "text_transform": [ - "uppercase", - "uppercase` on any micro/label/kicker when content is Hanzi — Chinese has no case" + "line_height": [ + "0.92", + "0.96", + "1", + "1.05", + "0.95", + "1.1", + "1.15", + "1.5", + "1.45", + "1.0" ], - "word_spacing": [], "paragraph_spacing": [ "4px", "clamp(16px, 1.8vh, 28px)", @@ -7097,555 +7925,53 @@ "clamp(10px, 1vw, 18px)", "3px" ], + "text_decoration": [], "text_direction": [ "column", "column-reverse" ], + "text_transform": [ + "uppercase", + "uppercase` on any micro/label/kicker when content is Hanzi — Chinese has no case" + ], + "word_spacing": [], "writing_mode": [ "vertical-rl` and `text-orientation: mixed`, rotating Latin text 90° clockwise. Anchored to right edge, vertically centered, evenly spaced. Reads as catalogue-style metadata stacked along the slide edge. **Topbar (with rule)** — A flex row containing a Newsreader headline left and a small mono lab-tag right, separated from the content below by a 1.5px solid cobalt bottom border. The universal section-header pattern. **Frame** — An absolutely-positioned content container with `inset: {spacing.pad-top", "vertical-rl` work for Hanzi too — Chinese is the original vertical script — but mixing Latin and Hanzi in the same vertical run will rotate the Hanzi to upright while keeping Latin rotated 90°", "vertical-rl`", "vertical-rl" - ], - "text_decoration": [] + ] }, - "role_mapping": { - "display": { - "font_role": "display", - "source_font": "Newsreader", - "runtime_alias": "SVGlideDisplay", - "font_size": 54, - "font_weight": 400, - "line_height": 0.96, - "letter_spacing": 0, - "text_transform": "latin_uppercase_only", - "max_lines": 3, - "alignment": "source_layout_dependent" - }, - "body": { - "font_role": "body", - "source_font": "Hanken Grotesk", - "runtime_alias": "SVGlideBody", - "font_size": 20, - "font_weight": 400, - "line_height": 1.32, - "letter_spacing": 0, - "text_transform": "preserve_source_case", - "max_lines": 5, - "alignment": "source_layout_dependent" - }, - "label": { - "font_role": "label", - "source_font": "DM Mono", - "runtime_alias": "SVGlideLabel", - "font_size": 12, - "font_weight": 700, - "line_height": 1.05, - "letter_spacing": 0.08, - "text_transform": "latin_uppercase_labels_reset_cjk_spacing", - "max_lines": 1, - "alignment": "source_layout_dependent" - }, - "metric": { - "font_role": "metric", - "source_font": "DM Mono", - "runtime_alias": "SVGlideMetric", - "font_size": 42, - "font_weight": 900, - "line_height": 0.95, - "letter_spacing": 0, - "text_transform": "preserve_numbers_and_units", - "max_lines": 2, - "alignment": "source_layout_dependent" - } - }, - "font_size_scale": { - "display": 54, - "body": 20, - "label": 12, - "metric": 42 - }, - "font_weight_scale": { - "display": 400, - "body": 400, - "label": 700, - "metric": 900 - }, - "line_height_scale": { - "display": 0.96, - "body": 1.32, - "label": 1.05, - "metric": 0.95 - }, - "letter_spacing_scale": { - "display": 0, - "body": 0, - "label": 0.08, - "metric": 0 + "text_direction": { + "cjk": "ltr", + "default": "column" }, "text_transform_policy": { - "display": "latin_uppercase_only", "body": "preserve_source_case", + "display": "latin_uppercase_only", "label": "latin_uppercase_labels_reset_cjk_spacing", "metric": "preserve_numbers_and_units" }, - "hierarchy_ratio": 2.7, - "max_lines": { - "display": 3, - "body": 5, - "label": 1, - "metric": 2 - }, - "measure": { - "display": "0.55-0.78 canvas width", - "body": "40-70 characters or CJK equivalent", - "label": "short mono labels", - "metric": "short numeric/stat blocks" - }, - "alignment": { - "primary": "follow source composition", - "fallback": "left/top aligned unless source screenshot is centered" - }, - "cjk_typography_adjustment": { - "display_font_cn": "Noto Serif SC", - "body_font_cn": "Noto Serif SC", - "letter_spacing_policy": "reset_letter_spacing_for_cjk_keep_latin_labels", - "mixed_run_spacing": "pangu_spacing", - "italic_policy": "drop_italic" - }, - "mapping_reason": "按源模板字号/字重/行高/字距/大小写规则抽象到 960x540 Slide 画布的四个文本角色。", "word_spacing": { - "display": 0, "body": 0, + "display": 0, "label": 0, "metric": 0 }, - "paragraph_spacing": { - "display_after": 0, - "body_after": 12, - "label_after": 0, - "metric_after": 0 - }, "wrapping_policy": { - "display": "manual_break_or_balance", "body": "wrap_with_measure", + "display": "manual_break_or_balance", "label": "no_wrap_preferred", "metric": "no_wrap_preferred" }, - "text_direction": { - "default": "column", - "cjk": "ltr" - }, "writing_mode": { "default": "vertical-rl` and `text-orientation: mixed`, rotating Latin text 90° clockwise. Anchored to right edge, vertically centered, evenly spaced. Reads as catalogue-style metadata stacked along the slide edge. **Topbar (with rule)** — A flex row containing a Newsreader headline left and a small mono lab-tag right, separated from the content below by a 1.5px solid cobalt bottom border. The universal section-header pattern. **Frame** — An absolutely-positioned content container with `inset: {spacing.pad-top", "vertical_roles": [ "metric" ] - }, - "extraction_confidence": { - "role_mapping.body": "inferred_from_layout", - "role_mapping.display": "inferred_from_layout", - "font_size_scale": "css_extracted_from_template_html", - "max_lines": "inferred_from_layout", - "writing_mode": "css_extracted_from_template_html", - "text_direction": "css_extracted_from_template_html", - "alignment": "inferred_from_layout", - "role_mapping.label": "inferred_from_layout", - "paragraph_spacing": "css_extracted_from_template_html", - "text_transform_policy": "css_extracted_from_template_html", - "line_height_scale": "css_extracted_from_template_html", - "wrapping_policy": "inferred_from_layout", - "font_weight_scale": "css_extracted_from_template_html", - "source_typography_tokens": "css_extracted_from_template_html", - "word_spacing": "absent_use_default", - "role_mapping.metric": "inferred_from_layout", - "cjk_typography_adjustment": "inferred_from_layout", - "hierarchy_ratio": "inferred_from_layout", - "measure": "inferred_from_layout", - "mapping_reason": "inferred_from_layout", - "letter_spacing_scale": "css_extracted_from_template_html" - }, - "source_refs": { - "role_mapping.body": [ - { - "path": "beautiful-html-templates/templates/cobalt-grid/template.html", - "selector_or_token": "role_mapping.body.source_font", - "raw_value": "Hanken Grotesk" - }, - { - "path": "beautiful-html-templates/templates/cobalt-grid/design.md", - "selector_or_token": "design.typography.roles", - "raw_value": "ink-faint: \"rgba(31, 43, 224, 0.18)\" color-aliases: rule: ink bg: paper typography: display-hero: fontFamily: \"Newsreader, Georgia, serif\" fontSize: \"clamp(100px, min(11vw, 18vh), 200px)\" fontWeight: 400 lineHeight: 0.92 letterSpacing: -0.008em display-closing: fo" - } - ], - "role_mapping.display": [ - { - "path": "beautiful-html-templates/templates/cobalt-grid/template.html", - "selector_or_token": "role_mapping.display.source_font", - "raw_value": "Newsreader" - }, - { - "path": "beautiful-html-templates/templates/cobalt-grid/design.md", - "selector_or_token": "design.typography.roles", - "raw_value": "ink-faint: \"rgba(31, 43, 224, 0.18)\" color-aliases: rule: ink bg: paper typography: display-hero: fontFamily: \"Newsreader, Georgia, serif\" fontSize: \"clamp(100px, min(11vw, 18vh), 200px)\" fontWeight: 400 lineHeight: 0.92 letterSpacing: -0.008em display-closing: fo" - } - ], - "font_size_scale": [ - { - "path": "beautiful-html-templates/templates/cobalt-grid/template.html", - "selector_or_token": "css.font_size_scale", - "raw_value": "clamp(11px, 0.82vw, 13px); clamp(10px, 0.75vw, 12px); clamp(100px, min(11vw, 18vh), 200px); clamp(13px, 1vw, 16px); clamp(28px, min(2.8vw, 4.6vh), 50px); clamp(12px, 0.9vw, 15px); clamp(14px, 0.92vw, 15px); clamp(11px, 0.78vw, 13px); clamp(56px, min(6.4vw, 11vh), 120px); clamp(12px, 0.85vw, 14px); clamp(12px, 0.82vw, 14px); clamp(48px, min(5vw, 8.5vh), 100px); clamp(12px, 0.9vw, 14px); clamp(13px, 0.9vw, 15px); clamp(26px, 2vw, 40px); clamp(14px, 0.95vw, 15px)" - } - ], - "max_lines": [ - { - "path": "beautiful-html-templates/templates/cobalt-grid/template.html", - "selector_or_token": "template.css.typography", - "raw_value": "body { margin: 0; padding: 0; height: 100%; background: #0a0a0a; } body { font-family: 'Hanken Grotesk', 'Helvetica Neue', sans-serif; color: var(--ink); overflow: hidden; } /* Deck wrapper — fills the viewport */ .deck { position: fixed; inset: 0; display: grid; place-items: ce" - } - ], - "writing_mode": [ - { - "path": "beautiful-html-templates/templates/cobalt-grid/template.html", - "selector_or_token": "css.writing_mode", - "raw_value": "vertical-rl` and `text-orientation: mixed`, rotating Latin text 90° clockwise. Anchored to right edge, vertically centered, evenly spaced. Reads as catalogue-style metadata stacked along the slide edge. **Topbar (with rule)** — A flex row containing a Newsreader headline left and a small mono lab-tag right, separated from the content below by a 1.5px solid cobalt bottom border. The universal section-header pattern. **Frame** — An absolutely-positioned content container with `inset: {spacing.pad-" - } - ], - "text_direction": [ - { - "path": "beautiful-html-templates/templates/cobalt-grid/template.html", - "selector_or_token": "css.text_direction", - "raw_value": "column; column-reverse" - } - ], - "alignment": [ - { - "path": "beautiful-html-templates/templates/cobalt-grid/template.html", - "selector_or_token": "template.css.typography", - "raw_value": "body { margin: 0; padding: 0; height: 100%; background: #0a0a0a; } body { font-family: 'Hanken Grotesk', 'Helvetica Neue', sans-serif; color: var(--ink); overflow: hidden; } /* Deck wrapper — fills the viewport */ .deck { position: fixed; inset: 0; display: grid; place-items: ce" - } - ], - "role_mapping.label": [ - { - "path": "beautiful-html-templates/templates/cobalt-grid/template.html", - "selector_or_token": "role_mapping.label.source_font", - "raw_value": "DM Mono" - }, - { - "path": "beautiful-html-templates/templates/cobalt-grid/design.md", - "selector_or_token": "design.typography.roles", - "raw_value": "ink-faint: \"rgba(31, 43, 224, 0.18)\" color-aliases: rule: ink bg: paper typography: display-hero: fontFamily: \"Newsreader, Georgia, serif\" fontSize: \"clamp(100px, min(11vw, 18vh), 200px)\" fontWeight: 400 lineHeight: 0.92 letterSpacing: -0.008em display-closing: fo" - } - ], - "paragraph_spacing": [ - { - "path": "beautiful-html-templates/templates/cobalt-grid/template.html", - "selector_or_token": "css.paragraph_spacing", - "raw_value": "4px; clamp(16px, 1.8vh, 28px); clamp(14px, 1.6vh, 24px); 6px; 1.5px background: \"{colors.paper; \"clamp(14px, 1.4vw, 28px)\" borderBottom: \"1px solid {colors.ink-faint; 1.5px; 6px; clamp(10px, 1.2vh, 18px); clamp(28px, 3vw, 56px); clamp(14px, 1.4vw, 24px); clamp(20px, 2.2vh, 36px); 30px; clamp(14px, 2vh, 28px) clamp(28px, 3vw, 56px); clamp(12px, 1.4vw, 22px); clamp(18px, 2vh, 32px); clamp(20px, 2vh, 36px); clamp(20px, 2.4vh, 36px); clamp(10px, 1vw, 18px); 3px" - } - ], - "text_transform_policy": [ - { - "path": "beautiful-html-templates/templates/cobalt-grid/template.html", - "selector_or_token": "css.text_transform_policy", - "raw_value": "uppercase` on any micro/label/kicker when content is Hanzi — Chinese has no case; uppercase" - } - ], - "line_height_scale": [ - { - "path": "beautiful-html-templates/templates/cobalt-grid/template.html", - "selector_or_token": "css.line_height_scale", - "raw_value": "0.92; 1.5; 1.1; 1; 1.45; 1.05; 0.95; 1.0; 1.15; 1.4; 0.96" - } - ], - "wrapping_policy": [ - { - "path": "beautiful-html-templates/templates/cobalt-grid/template.html", - "selector_or_token": "template.css.typography", - "raw_value": "body { margin: 0; padding: 0; height: 100%; background: #0a0a0a; } body { font-family: 'Hanken Grotesk', 'Helvetica Neue', sans-serif; color: var(--ink); overflow: hidden; } /* Deck wrapper — fills the viewport */ .deck { position: fixed; inset: 0; display: grid; place-items: ce" - } - ], - "font_weight_scale": [ - { - "path": "beautiful-html-templates/templates/cobalt-grid/template.html", - "selector_or_token": "css.font_weight_scale", - "raw_value": "400; 600; 500" - } - ], - "source_typography_tokens": [ - { - "path": "beautiful-html-templates/templates/cobalt-grid/template.html", - "selector_or_token": "css.source_typography_tokens", - "raw_value": "clamp(11px, 0.82vw, 13px); clamp(10px, 0.75vw, 12px); clamp(100px, min(11vw, 18vh), 200px); clamp(13px, 1vw, 16px); clamp(28px, min(2.8vw, 4.6vh), 50px); clamp(12px, 0.9vw, 15px); clamp(14px, 0.92vw, 15px); clamp(11px, 0.78vw, 13px); clamp(56px, min(6.4vw, 11vh), 120px); clamp(12px, 0.85vw, 14px); clamp(12px, 0.82vw, 14px); clamp(48px, min(5vw, 8.5vh), 100px); clamp(12px, 0.9vw, 14px); clamp(13px, 0.9vw, 15px); clamp(26px, 2vw, 40px); clamp(14px, 0.95vw, 15px); 400; 600; 500; 0.92; 1.5; 1.1; 1; " - } - ], - "role_mapping.metric": [ - { - "path": "beautiful-html-templates/templates/cobalt-grid/template.html", - "selector_or_token": "role_mapping.metric.source_font", - "raw_value": "DM Mono" - }, - { - "path": "beautiful-html-templates/templates/cobalt-grid/design.md", - "selector_or_token": "design.typography.roles", - "raw_value": "ink-faint: \"rgba(31, 43, 224, 0.18)\" color-aliases: rule: ink bg: paper typography: display-hero: fontFamily: \"Newsreader, Georgia, serif\" fontSize: \"clamp(100px, min(11vw, 18vh), 200px)\" fontWeight: 400 lineHeight: 0.92 letterSpacing: -0.008em display-closing: fo" - } - ], - "cjk_typography_adjustment": [ - { - "path": "beautiful-html-templates/templates/cobalt-grid/template.html", - "selector_or_token": "template.css.typography", - "raw_value": "body { margin: 0; padding: 0; height: 100%; background: #0a0a0a; } body { font-family: 'Hanken Grotesk', 'Helvetica Neue', sans-serif; color: var(--ink); overflow: hidden; } /* Deck wrapper — fills the viewport */ .deck { position: fixed; inset: 0; display: grid; place-items: ce" - } - ], - "hierarchy_ratio": [ - { - "path": "beautiful-html-templates/templates/cobalt-grid/template.html", - "selector_or_token": "template.css.typography", - "raw_value": "body { margin: 0; padding: 0; height: 100%; background: #0a0a0a; } body { font-family: 'Hanken Grotesk', 'Helvetica Neue', sans-serif; color: var(--ink); overflow: hidden; } /* Deck wrapper — fills the viewport */ .deck { position: fixed; inset: 0; display: grid; place-items: ce" - } - ], - "measure": [ - { - "path": "beautiful-html-templates/templates/cobalt-grid/template.html", - "selector_or_token": "template.css.typography", - "raw_value": "body { margin: 0; padding: 0; height: 100%; background: #0a0a0a; } body { font-family: 'Hanken Grotesk', 'Helvetica Neue', sans-serif; color: var(--ink); overflow: hidden; } /* Deck wrapper — fills the viewport */ .deck { position: fixed; inset: 0; display: grid; place-items: ce" - } - ], - "mapping_reason": [ - { - "path": "beautiful-html-templates/templates/cobalt-grid/template.html", - "selector_or_token": "template.css.typography", - "raw_value": "body { margin: 0; padding: 0; height: 100%; background: #0a0a0a; } body { font-family: 'Hanken Grotesk', 'Helvetica Neue', sans-serif; color: var(--ink); overflow: hidden; } /* Deck wrapper — fills the viewport */ .deck { position: fixed; inset: 0; display: grid; place-items: ce" - } - ], - "letter_spacing_scale": [ - { - "path": "beautiful-html-templates/templates/cobalt-grid/template.html", - "selector_or_token": "css.letter_spacing_scale", - "raw_value": "-0.005em; 0.16em; 0.06em; 0.08em; -0.008em; 0.18em; 0.04em; -0.015em; 0.2em; 0.22em" - } - ] } }, - "text_style_strategy": { - "bold": { - "source_usage": "source uses heavy display/label weights", - "mapped_weight": { - "display": 400, - "label": 700, - "metric": 900 - }, - "allowed_roles": [ - "display", - "label", - "metric" - ] - }, - "italic": { - "source_usage": "source uses italic/font-style or italic-family tokens", - "mapped_style": "latin_only_when_source_requires_else_normal", - "fallback_when_unavailable": "use color_shift or weight_shift; do not fake CJK italic", - "loss_notes": "Satori/Slide may not provide exact Google italic face; record as visual approximation." - }, - "underline": { - "source_usage": "source uses underline/text-decoration or hairline emphasis", - "mapped_decoration": "native underline only for actual text-decoration source usage", - "fallback_shape": "1px-3px rule or border accent when underline font rendering is unavailable" - }, - "line_through": { - "source_usage": "not present in source; default no line-through", - "mapped_decoration": "none", - "fallback_shape": "none" - }, - "emphasis": { - "color_shift": "use source accent color roles only", - "font_family_switch": "only switch between mapped display/body/label/metric roles from this family", - "weight_shift": "increase one role step within font_weight_scale", - "style_shift": "italic only when source_usage requires and CJK fallback is safe" - }, - "text_decoration_policy": { - "underline": { - "style": "solid", - "color": "currentColor", - "thickness": "1px" - }, - "line_through": { - "style": "none", - "color": "currentColor", - "thickness": "0px" - } - }, - "forbidden": [ - "fake_cjk_italic", - "drop_source_text_transform", - "drop_source_letter_spacing_without_loss_note", - "use_cross_family_font_motif", - "remote_font_dependency_without_receipt" - ], - "extraction_confidence": { - "text_decoration_policy.line_through.color": "absent_use_default", - "text_decoration_policy.underline.color": "css_extracted_from_template_html", - "text_decoration_policy.line_through.style": "absent_use_default", - "italic": "css_extracted_from_template_html", - "forbidden": "inferred_from_layout", - "emphasis": "inferred_from_layout", - "text_decoration_policy.underline.thickness": "css_extracted_from_template_html", - "underline": "css_extracted_from_template_html", - "text_decoration_policy.line_through.thickness": "absent_use_default", - "line_through": "absent_use_default", - "text_decoration_policy.underline.style": "css_extracted_from_template_html", - "bold": "css_extracted_from_template_html" - }, - "source_refs": { - "text_decoration_policy.underline.color": [ - { - "path": "beautiful-html-templates/templates/cobalt-grid/template.html", - "selector_or_token": "css.text-decoration", - "raw_value": "e `` and for the manifesto's editorial italic-with-`.roman`-flip treatment. Underline is not used. Line-height collapses at the top: display-hero / vbig-numeral at 0.92, display-chapter at 1.0, body at 1.5. The tight display + open body contrast is what gives the system its trend-report rhythm." - } - ], - "italic": [ - { - "path": "beautiful-html-templates/templates/cobalt-grid/template.html", - "selector_or_token": "css.font-style", - "raw_value": "em runs on a **three-face conversation**: `Newsreader` (serif, weight 400 / 500 italic) carries every display and headline; `Hanken Grotesk` (sans, weights 400–700) carries every body, label, and micro-text; `DM Mono` (monospace, 400–500) carries every chrome element. There is no fourth face. Newsr" - } - ], - "forbidden": [ - { - "path": "beautiful-html-templates/templates/cobalt-grid/template.html", - "selector_or_token": "template.css.typography", - "raw_value": "body { margin: 0; padding: 0; height: 100%; background: #0a0a0a; } body { font-family: 'Hanken Grotesk', 'Helvetica Neue', sans-serif; color: var(--ink); overflow: hidden; } /* Deck wrapper — fills the viewport */ .deck { position: fixed; inset: 0; display: grid; place-items: ce" - } - ], - "emphasis": [ - { - "path": "beautiful-html-templates/templates/cobalt-grid/template.html", - "selector_or_token": "template.css.typography", - "raw_value": "body { margin: 0; padding: 0; height: 100%; background: #0a0a0a; } body { font-family: 'Hanken Grotesk', 'Helvetica Neue', sans-serif; color: var(--ink); overflow: hidden; } /* Deck wrapper — fills the viewport */ .deck { position: fixed; inset: 0; display: grid; place-items: ce" - } - ], - "text_decoration_policy.underline.thickness": [ - { - "path": "beautiful-html-templates/templates/cobalt-grid/template.html", - "selector_or_token": "css.text-decoration", - "raw_value": "e `` and for the manifesto's editorial italic-with-`.roman`-flip treatment. Underline is not used. Line-height collapses at the top: display-hero / vbig-numeral at 0.92, display-chapter at 1.0, body at 1.5. The tight display + open body contrast is what gives the system its trend-report rhythm." - } - ], - "underline": [ - { - "path": "beautiful-html-templates/templates/cobalt-grid/template.html", - "selector_or_token": "css.text-decoration", - "raw_value": "e `` and for the manifesto's editorial italic-with-`.roman`-flip treatment. Underline is not used. Line-height collapses at the top: display-hero / vbig-numeral at 0.92, display-chapter at 1.0, body at 1.5. The tight display + open body contrast is what gives the system its trend-report rhythm." - } - ], - "text_decoration_policy.underline.style": [ - { - "path": "beautiful-html-templates/templates/cobalt-grid/template.html", - "selector_or_token": "css.text-decoration", - "raw_value": "e `` and for the manifesto's editorial italic-with-`.roman`-flip treatment. Underline is not used. Line-height collapses at the top: display-hero / vbig-numeral at 0.92, display-chapter at 1.0, body at 1.5. The tight display + open body contrast is what gives the system its trend-report rhythm." - } - ], - "bold": [ - { - "path": "beautiful-html-templates/templates/cobalt-grid/template.html", - "selector_or_token": "css.font-weight", - "raw_value": "400; 600; 500" - } - ] - } - }, - "satori": { - "font_and_typography_constraints": [ - "italic is source-aware but CJK fake italic is forbidden; use color/weight fallback when unavailable", - "letter spacing is preserved for Latin labels and reset/softened for CJK" - ] - }, - "loss_notes": [ - "italic is source-aware but CJK fake italic is forbidden; use color/weight fallback when unavailable", - "letter spacing is preserved for Latin labels and reset/softened for CJK" - ], - "page_variant_count": 8, - "source_page_variants": [ - "chapter", - "colophon", - "cover", - "data", - "index", - "manifesto", - "quote", - "table" - ], - "page_family_source": { - "extractor": "skills/lark-slides/scripts/beautiful_template_page_family_extract.py", - "source_template_html": "beautiful-html-templates/templates/cobalt-grid/template.html", - "source_design_md": "beautiful-html-templates/templates/cobalt-grid/design.md", - "source_template_json": "beautiful-html-templates/templates/cobalt-grid/template.json", - "claim_boundary": "source extraction only; does not imply renderer, fidelity, quality gate, or production/default selectable status" - } - }, - { - "family_id": "coral", - "template_id": "coral-magazine-feature", - "runtime_template_id": "coral-magazine-feature", - "source_template_html": "beautiful-html-templates/templates/coral/template.html", - "source_design_md": "beautiful-html-templates/templates/coral/design.md", - "source_template_json": "beautiful-html-templates/templates/coral/template.json", - "renderer_id": "artboard_satori.coral-magazine-feature", - "renderer_module": "skills/lark-slides/scripts/artboard_renderer/templates/beautiful/coral-magazine-feature.mjs", - "golden_spec": "skills/lark-slides/scripts/fixtures/svglide_artboard/golden/coral-magazine-feature.canvas-spec.json", - "reference_screenshot": "beautiful-html-templates/screenshots/coral-1.png", - "fidelity_receipt": "skills/lark-slides/references/receipts/template-fidelity/coral.coral-magazine-feature.json", - "source_trace": [ - { - "source": "beautiful-html-templates/templates/coral/template.html", - "evidence": "source_template_html" - }, - { - "source": "beautiful-html-templates/templates/coral/design.md", - "evidence": "source_design_md" - }, - { - "source": "beautiful-html-templates/templates/coral/template.json", - "evidence": "source_template_json" - }, - { - "source": "beautiful-html-templates/screenshots/coral-1.png", - "evidence": "reference_screenshot" - }, - { - "source": "skills/lark-slides/references/absorptions/beautiful-html-templates/coral.coral-magazine-feature.json", - "evidence": "absorption_record" - }, - { - "source": "skills/lark-slides/references/receipts/template-fidelity/coral.coral-magazine-feature.json", - "evidence": "template_fidelity_receipt" - } - ], "visual_contract": { - "path": "skills/lark-slides/references/visual-contracts/beautiful/coral.coral-magazine-feature.json", - "layout_rhythm": "coral: medium density, medium formality. Cream and coral on near-black, set in oversized Bebas Neue.", - "motifs": [ - "grid", - "accent line", - "card panels", - "paper texture", - "poster blocks", - "quote mark", - "sticker collage" - ], - "palette_roles": [ - "accent", - "background", - "border", - "muted", - "negative", - "positive", - "primary", - "surface", - "text" - ], "do_not_simplify": [ "preserve_fonts_palette_grid_slide_classes_decorative_elements", "do_not_recolor_without_explicit_brand_override", @@ -7661,94 +7987,67 @@ "do_not_mark_production_without_renderer_golden_fidelity_receipt", "do_not_strip_identity_decorations", "do_not_recolor_without_explicit_brand_override" - ] + ], + "layout_rhythm": "cobalt-grid: medium density, high formality. Electric cobalt serifs on a graph-paper canvas, anchored by stair-stepped pixel-glitch decorations and slim hairline rules.", + "motifs": [ + "grid", + "accent line", + "paper texture", + "poster blocks", + "quote mark", + "sticker collage", + "pixel motif" + ], + "palette_roles": [ + "accent", + "background", + "border", + "muted", + "negative", + "positive", + "primary", + "surface", + "text" + ], + "path": "skills/lark-slides/references/visual-contracts/beautiful/cobalt-grid.trend-grid-report.json" }, - "fidelity_gate": { - "status": "passed", - "score": 0.9491, - "threshold": 0.72, - "reference_screenshot": "/Users/bytedance/bd-projects/beautiful-html-templates/screenshots/coral-1.png", - "render_screenshot": "/Users/bytedance/bd-projects/workspaces/SVGlide/.worktrees/cli-svglide-svg-private/skills/lark-slides/scripts/fixtures/svglide_artboard/golden/coral-magazine-feature.preview.png", - "receipt_path": "skills/lark-slides/references/receipts/template-fidelity/coral.coral-magazine-feature.json", - "issues": [] - }, - "promotion_status": "needs_review", - "default_selectable": false, + "visual_contract_path": "skills/lark-slides/references/visual-contracts/beautiful/cobalt-grid.trend-grid-report.json" + }, + { "blocking_issues": [ "selector_gate_missing", "quality_gate_integration_pending", "production_review_pending" ], - "visual_contract_path": "skills/lark-slides/references/visual-contracts/beautiful/coral.coral-magazine-feature.json", - "planned_renderer_module": "skills/lark-slides/scripts/artboard_renderer/templates/beautiful/coral-magazine-feature.mjs", - "planned_golden_spec": "skills/lark-slides/scripts/fixtures/svglide_artboard/golden/coral-magazine-feature.canvas-spec.json", - "planned_fidelity_receipt": "skills/lark-slides/references/receipts/template-fidelity/coral.coral-magazine-feature.json", + "default_selectable": false, + "family_id": "coral", + "fidelity_gate": { + "issues": [], + "receipt_path": "skills/lark-slides/references/receipts/template-fidelity/coral.coral-magazine-feature.json", + "reference_screenshot": "/Users/bytedance/bd-projects/beautiful-html-templates/screenshots/coral-1.png", + "render_screenshot": "/Users/bytedance/bd-projects/workspaces/SVGlide/.worktrees/cli-svglide-svg-private/skills/lark-slides/scripts/fixtures/svglide_artboard/golden/coral-magazine-feature.preview.png", + "score": 0.9491, + "status": "passed", + "threshold": 0.72 + }, + "fidelity_receipt": "skills/lark-slides/references/receipts/template-fidelity/coral.coral-magazine-feature.json", "font_strategy": { - "source_fonts": [ - "Bebas Neue", - "Inter" - ], - "slide_native_preferred": [ - "system-sans-cjk" - ], "adobe_or_embedded_fallback": [ "Source Sans Pro", "思源黑体" ], "cjk_fallback": "LXGW WenKai TC", - "role_mapping": { - "display": { - "source_font": "Bebas Neue", - "slide_font": "Source Sans Pro", - "runtime_alias": "SVGlideDisplay", - "cjk_font": "思源黑体", - "fallback_stack": [ - "system-sans-cjk", - "SVGlideDisplay" - ], - "source_only": false, - "requires_download": false, - "mapping_reason": "保留 Bebas Neue 的语义角色,但运行时优先使用 Slide/系统可用的 Source Sans Pro 与 思源黑体。" - }, - "body": { - "source_font": "Inter", - "slide_font": "Source Sans Pro", - "runtime_alias": "SVGlideBody", - "cjk_font": "思源黑体", - "fallback_stack": [ - "system-sans-cjk", - "SVGlideBody" - ], - "source_only": false, - "requires_download": false, - "mapping_reason": "保留 Inter 的语义角色,但运行时优先使用 Slide/系统可用的 Source Sans Pro 与 思源黑体。" - }, - "label": { - "source_font": "Bebas Neue", - "slide_font": "Source Sans Pro", - "runtime_alias": "SVGlideLabel", - "cjk_font": "思源黑体", - "fallback_stack": [ - "system-sans-cjk", - "SVGlideLabel" - ], - "source_only": false, - "requires_download": false, - "mapping_reason": "保留 Bebas Neue 的语义角色,但运行时优先使用 Slide/系统可用的 Source Sans Pro 与 思源黑体。" - }, - "metric": { - "source_font": "Bebas Neue", - "slide_font": "Source Sans Pro", - "runtime_alias": "SVGlideMetric", - "cjk_font": "思源黑体", - "fallback_stack": [ - "system-sans-cjk", - "SVGlideMetric" - ], - "source_only": false, - "requires_download": false, - "mapping_reason": "保留 Bebas Neue 的语义角色,但运行时优先使用 Slide/系统可用的 Source Sans Pro 与 思源黑体。" - } + "extraction_confidence": { + "adobe_or_embedded_fallback": "inferred_from_layout", + "cjk_fallback": "inferred_from_layout", + "forbidden": "inferred_from_layout", + "mapping_reason": "inferred_from_layout", + "role_mapping.body": "inferred_from_layout", + "role_mapping.display": "inferred_from_layout", + "role_mapping.label": "inferred_from_layout", + "role_mapping.metric": "inferred_from_layout", + "slide_native_preferred": "inferred_from_layout", + "source_fonts": "css_extracted_from_template_html" }, "forbidden": [ "remote_font_runtime_dependency", @@ -7757,119 +8056,701 @@ "drop_cjk_fallback" ], "mapping_reason": "根据 design.md/template.html/template.json 中的 font-family 与 typography token 提取源字体;运行时按 Slide/系统/Adobe/思源可用字体降级。", + "role_mapping": { + "body": { + "cjk_font": "思源黑体", + "fallback_stack": [ + "system-sans-cjk", + "SVGlideBody" + ], + "mapping_reason": "保留 Inter 的语义角色,但运行时优先使用 Slide/系统可用的 Source Sans Pro 与 思源黑体。", + "requires_download": false, + "runtime_alias": "SVGlideBody", + "slide_font": "Source Sans Pro", + "source_font": "Inter", + "source_only": false + }, + "display": { + "cjk_font": "思源黑体", + "fallback_stack": [ + "system-sans-cjk", + "SVGlideDisplay" + ], + "mapping_reason": "保留 Bebas Neue 的语义角色,但运行时优先使用 Slide/系统可用的 Source Sans Pro 与 思源黑体。", + "requires_download": false, + "runtime_alias": "SVGlideDisplay", + "slide_font": "Source Sans Pro", + "source_font": "Bebas Neue", + "source_only": false + }, + "label": { + "cjk_font": "思源黑体", + "fallback_stack": [ + "system-sans-cjk", + "SVGlideLabel" + ], + "mapping_reason": "保留 Bebas Neue 的语义角色,但运行时优先使用 Slide/系统可用的 Source Sans Pro 与 思源黑体。", + "requires_download": false, + "runtime_alias": "SVGlideLabel", + "slide_font": "Source Sans Pro", + "source_font": "Bebas Neue", + "source_only": false + }, + "metric": { + "cjk_font": "思源黑体", + "fallback_stack": [ + "system-sans-cjk", + "SVGlideMetric" + ], + "mapping_reason": "保留 Bebas Neue 的语义角色,但运行时优先使用 Slide/系统可用的 Source Sans Pro 与 思源黑体。", + "requires_download": false, + "runtime_alias": "SVGlideMetric", + "slide_font": "Source Sans Pro", + "source_font": "Bebas Neue", + "source_only": false + } + }, + "same_role_font_justification": "源模板本身以单一 sans/system family 承担多数字体角色;通过 weight/size/line-height/uppercase 区分 display/body/label/metric。", + "slide_native_preferred": [ + "system-sans-cjk" + ], "source_evidence": [ "beautiful-html-templates/templates/coral/design.md", "beautiful-html-templates/templates/coral/template.html", "beautiful-html-templates/templates/coral/template.json", "beautiful-html-templates/screenshots/coral-1.png" ], - "same_role_font_justification": "源模板本身以单一 sans/system family 承担多数字体角色;通过 weight/size/line-height/uppercase 区分 display/body/label/metric。", - "extraction_confidence": { - "role_mapping.body": "inferred_from_layout", - "role_mapping.display": "inferred_from_layout", - "source_fonts": "css_extracted_from_template_html", - "adobe_or_embedded_fallback": "inferred_from_layout", - "cjk_fallback": "inferred_from_layout", - "role_mapping.metric": "inferred_from_layout", - "forbidden": "inferred_from_layout", - "slide_native_preferred": "inferred_from_layout", - "mapping_reason": "inferred_from_layout", - "role_mapping.label": "inferred_from_layout" - }, + "source_fonts": [ + "Bebas Neue", + "Inter" + ], "source_refs": { - "role_mapping.body": [ - { - "path": "beautiful-html-templates/templates/coral/template.html", - "selector_or_token": "role_mapping.body.source_font", - "raw_value": "Inter" - }, - { - "path": "beautiful-html-templates/templates/coral/design.md", - "selector_or_token": "design.typography.roles", - "raw_value": "ht-gray: \"#B0B0B0\" white: \"#FFFFFF\" color-aliases: bg: cream ink: black typography: hero-title: fontFamily: \"Bebas Neue, sans-serif\" fontSize: \"min(120px, 9vw, 13vh)\" fontWeight: 400 lineHeight: 0.9 letterSpacing: 4px jumbo-feature: fontFamily: \"Bebas Neue, sans-s" - } - ], - "role_mapping.display": [ - { - "path": "beautiful-html-templates/templates/coral/template.html", - "selector_or_token": "role_mapping.display.source_font", - "raw_value": "Bebas Neue" - }, - { - "path": "beautiful-html-templates/templates/coral/design.md", - "selector_or_token": "design.typography.roles", - "raw_value": "ht-gray: \"#B0B0B0\" white: \"#FFFFFF\" color-aliases: bg: cream ink: black typography: hero-title: fontFamily: \"Bebas Neue, sans-serif\" fontSize: \"min(120px, 9vw, 13vh)\" fontWeight: 400 lineHeight: 0.9 letterSpacing: 4px jumbo-feature: fontFamily: \"Bebas Neue, sans-s" - } - ], - "source_fonts": [ - { - "path": "beautiful-html-templates/templates/coral/template.html", - "selector_or_token": "css.font-family", - "raw_value": "'Inter', sans-serif; 'Bebas Neue', sans-serif" - } - ], "adobe_or_embedded_fallback": [ { "path": "beautiful-html-templates/templates/coral/template.html", - "selector_or_token": "css.font-family", - "raw_value": "'Inter', sans-serif; 'Bebas Neue', sans-serif" + "raw_value": "'Inter', sans-serif; 'Bebas Neue', sans-serif", + "selector_or_token": "css.font-family" } ], "cjk_fallback": [ { "path": "beautiful-html-templates/templates/coral/template.html", - "selector_or_token": "css.font-family", - "raw_value": "'Inter', sans-serif; 'Bebas Neue', sans-serif" - } - ], - "role_mapping.metric": [ - { - "path": "beautiful-html-templates/templates/coral/template.html", - "selector_or_token": "role_mapping.metric.source_font", - "raw_value": "Bebas Neue" - }, - { - "path": "beautiful-html-templates/templates/coral/design.md", - "selector_or_token": "design.typography.roles", - "raw_value": "ht-gray: \"#B0B0B0\" white: \"#FFFFFF\" color-aliases: bg: cream ink: black typography: hero-title: fontFamily: \"Bebas Neue, sans-serif\" fontSize: \"min(120px, 9vw, 13vh)\" fontWeight: 400 lineHeight: 0.9 letterSpacing: 4px jumbo-feature: fontFamily: \"Bebas Neue, sans-s" + "raw_value": "'Inter', sans-serif; 'Bebas Neue', sans-serif", + "selector_or_token": "css.font-family" } ], "forbidden": [ { "path": "beautiful-html-templates/templates/coral/template.html", - "selector_or_token": "css.font-family", - "raw_value": "'Inter', sans-serif; 'Bebas Neue', sans-serif" - } - ], - "slide_native_preferred": [ - { - "path": "beautiful-html-templates/templates/coral/template.html", - "selector_or_token": "css.font-family", - "raw_value": "'Inter', sans-serif; 'Bebas Neue', sans-serif" + "raw_value": "'Inter', sans-serif; 'Bebas Neue', sans-serif", + "selector_or_token": "css.font-family" } ], "mapping_reason": [ { "path": "beautiful-html-templates/templates/coral/template.html", - "selector_or_token": "css.font-family", - "raw_value": "'Inter', sans-serif; 'Bebas Neue', sans-serif" + "raw_value": "'Inter', sans-serif; 'Bebas Neue', sans-serif", + "selector_or_token": "css.font-family" + } + ], + "role_mapping.body": [ + { + "path": "beautiful-html-templates/templates/coral/template.html", + "raw_value": "Inter", + "selector_or_token": "role_mapping.body.source_font" + }, + { + "path": "beautiful-html-templates/templates/coral/design.md", + "raw_value": "ht-gray: \"#B0B0B0\" white: \"#FFFFFF\" color-aliases: bg: cream ink: black typography: hero-title: fontFamily: \"Bebas Neue, sans-serif\" fontSize: \"min(120px, 9vw, 13vh)\" fontWeight: 400 lineHeight: 0.9 letterSpacing: 4px jumbo-feature: fontFamily: \"Bebas Neue, sans-s", + "selector_or_token": "design.typography.roles" + } + ], + "role_mapping.display": [ + { + "path": "beautiful-html-templates/templates/coral/template.html", + "raw_value": "Bebas Neue", + "selector_or_token": "role_mapping.display.source_font" + }, + { + "path": "beautiful-html-templates/templates/coral/design.md", + "raw_value": "ht-gray: \"#B0B0B0\" white: \"#FFFFFF\" color-aliases: bg: cream ink: black typography: hero-title: fontFamily: \"Bebas Neue, sans-serif\" fontSize: \"min(120px, 9vw, 13vh)\" fontWeight: 400 lineHeight: 0.9 letterSpacing: 4px jumbo-feature: fontFamily: \"Bebas Neue, sans-s", + "selector_or_token": "design.typography.roles" } ], "role_mapping.label": [ { "path": "beautiful-html-templates/templates/coral/template.html", - "selector_or_token": "role_mapping.label.source_font", - "raw_value": "Bebas Neue" + "raw_value": "Bebas Neue", + "selector_or_token": "role_mapping.label.source_font" }, { "path": "beautiful-html-templates/templates/coral/design.md", - "selector_or_token": "design.typography.roles", - "raw_value": "ht-gray: \"#B0B0B0\" white: \"#FFFFFF\" color-aliases: bg: cream ink: black typography: hero-title: fontFamily: \"Bebas Neue, sans-serif\" fontSize: \"min(120px, 9vw, 13vh)\" fontWeight: 400 lineHeight: 0.9 letterSpacing: 4px jumbo-feature: fontFamily: \"Bebas Neue, sans-s" + "raw_value": "ht-gray: \"#B0B0B0\" white: \"#FFFFFF\" color-aliases: bg: cream ink: black typography: hero-title: fontFamily: \"Bebas Neue, sans-serif\" fontSize: \"min(120px, 9vw, 13vh)\" fontWeight: 400 lineHeight: 0.9 letterSpacing: 4px jumbo-feature: fontFamily: \"Bebas Neue, sans-s", + "selector_or_token": "design.typography.roles" + } + ], + "role_mapping.metric": [ + { + "path": "beautiful-html-templates/templates/coral/template.html", + "raw_value": "Bebas Neue", + "selector_or_token": "role_mapping.metric.source_font" + }, + { + "path": "beautiful-html-templates/templates/coral/design.md", + "raw_value": "ht-gray: \"#B0B0B0\" white: \"#FFFFFF\" color-aliases: bg: cream ink: black typography: hero-title: fontFamily: \"Bebas Neue, sans-serif\" fontSize: \"min(120px, 9vw, 13vh)\" fontWeight: 400 lineHeight: 0.9 letterSpacing: 4px jumbo-feature: fontFamily: \"Bebas Neue, sans-s", + "selector_or_token": "design.typography.roles" + } + ], + "slide_native_preferred": [ + { + "path": "beautiful-html-templates/templates/coral/template.html", + "raw_value": "'Inter', sans-serif; 'Bebas Neue', sans-serif", + "selector_or_token": "css.font-family" + } + ], + "source_fonts": [ + { + "path": "beautiful-html-templates/templates/coral/template.html", + "raw_value": "'Inter', sans-serif; 'Bebas Neue', sans-serif", + "selector_or_token": "css.font-family" } ] } }, + "golden_spec": "skills/lark-slides/scripts/fixtures/svglide_artboard/golden/coral-magazine-feature.canvas-spec.json", + "implemented_page_variants": [ + "cover", + "agenda", + "detail", + "data_dashboard", + "process_or_timeline", + "data_dashboard-6", + "quote_or_emphasis", + "process_or_timeline-8", + "detail-9", + "closing" + ], + "loss_notes": [ + "distinctive display face may be approximated by Slide/Source/思源 fonts; preserve weight/size/case first", + "italic is source-aware but CJK fake italic is forbidden; use color/weight fallback when unavailable", + "letter spacing is preserved for Latin labels and reset/softened for CJK" + ], + "page_family_smoke": { + "claim_boundary": "current-run smoke evidence only; not production/default selectable evidence", + "implemented_page_variants": [ + "cover", + "agenda", + "detail", + "data_dashboard", + "process_or_timeline", + "data_dashboard-6", + "quote_or_emphasis", + "process_or_timeline-8", + "detail-9", + "closing" + ], + "missing_implemented_page_variants": [], + "missing_required_roles": [], + "production_selectable": false, + "receipt_path": "skills/lark-slides/references/receipts/page-family-smoke/coral.coral-magazine-feature.json", + "rendered_pages": 10, + "reuse_count": 0, + "status": "passed", + "unimplemented_page_variants": [] + }, + "page_family_smoke_deck": "skills/lark-slides/references/page-family-smoke-decks/coral.json", + "page_family_smoke_receipt": "skills/lark-slides/references/receipts/page-family-smoke/coral.coral-magazine-feature.json", + "page_family_source": { + "claim_boundary": "source extraction only; does not imply renderer, fidelity, quality gate, or production/default selectable status", + "extractor": "skills/lark-slides/scripts/beautiful_template_page_family_extract.py", + "source_design_md": "beautiful-html-templates/templates/coral/design.md", + "source_template_html": "beautiful-html-templates/templates/coral/template.html", + "source_template_json": "beautiful-html-templates/templates/coral/template.json" + }, + "page_variant_count": 10, + "page_variant_golden_specs": { + "agenda": "skills/lark-slides/scripts/fixtures/svglide_artboard/golden/coral.agenda.canvas-spec.json", + "closing": "skills/lark-slides/scripts/fixtures/svglide_artboard/golden/coral.closing.canvas-spec.json", + "cover": "skills/lark-slides/scripts/fixtures/svglide_artboard/golden/coral.cover.canvas-spec.json", + "data_dashboard": "skills/lark-slides/scripts/fixtures/svglide_artboard/golden/coral.data_dashboard.canvas-spec.json", + "data_dashboard-6": "skills/lark-slides/scripts/fixtures/svglide_artboard/golden/coral.data_dashboard-6.canvas-spec.json", + "detail": "skills/lark-slides/scripts/fixtures/svglide_artboard/golden/coral.detail.canvas-spec.json", + "detail-9": "skills/lark-slides/scripts/fixtures/svglide_artboard/golden/coral.detail-9.canvas-spec.json", + "process_or_timeline": "skills/lark-slides/scripts/fixtures/svglide_artboard/golden/coral.process_or_timeline.canvas-spec.json", + "process_or_timeline-8": "skills/lark-slides/scripts/fixtures/svglide_artboard/golden/coral.process_or_timeline-8.canvas-spec.json", + "quote_or_emphasis": "skills/lark-slides/scripts/fixtures/svglide_artboard/golden/coral.quote_or_emphasis.canvas-spec.json" + }, + "planned_fidelity_receipt": "skills/lark-slides/references/receipts/template-fidelity/coral.coral-magazine-feature.json", + "planned_golden_spec": "skills/lark-slides/scripts/fixtures/svglide_artboard/golden/coral-magazine-feature.canvas-spec.json", + "planned_renderer_module": "skills/lark-slides/scripts/artboard_renderer/templates/beautiful/coral-magazine-feature.mjs", + "promotion_status": "needs_review", + "reference_screenshot": "beautiful-html-templates/screenshots/coral-1.png", + "renderer_id": "artboard_satori.coral-magazine-feature", + "renderer_module": "skills/lark-slides/scripts/artboard_renderer/templates/beautiful/coral-magazine-feature.mjs", + "renderer_stage": "page_family", + "runtime_template_id": "coral-magazine-feature", + "satori": { + "font_and_typography_constraints": [ + "distinctive display face may be approximated by Slide/Source/思源 fonts; preserve weight/size/case first", + "italic is source-aware but CJK fake italic is forbidden; use color/weight fallback when unavailable", + "letter spacing is preserved for Latin labels and reset/softened for CJK" + ] + }, + "selection_scope": "experimental", + "source_design_md": "beautiful-html-templates/templates/coral/design.md", + "source_page_variants": [ + "agenda", + "closing", + "cover", + "data_dashboard", + "data_dashboard-6", + "detail", + "detail-9", + "process_or_timeline", + "process_or_timeline-8", + "quote_or_emphasis" + ], + "source_template_html": "beautiful-html-templates/templates/coral/template.html", + "source_template_json": "beautiful-html-templates/templates/coral/template.json", + "source_trace": [ + { + "evidence": "source_template_html", + "source": "beautiful-html-templates/templates/coral/template.html" + }, + { + "evidence": "source_design_md", + "source": "beautiful-html-templates/templates/coral/design.md" + }, + { + "evidence": "source_template_json", + "source": "beautiful-html-templates/templates/coral/template.json" + }, + { + "evidence": "reference_screenshot", + "source": "beautiful-html-templates/screenshots/coral-1.png" + }, + { + "evidence": "absorption_record", + "source": "skills/lark-slides/references/absorptions/beautiful-html-templates/coral.coral-magazine-feature.json" + }, + { + "evidence": "template_fidelity_receipt", + "source": "skills/lark-slides/references/receipts/template-fidelity/coral.coral-magazine-feature.json" + } + ], + "template_id": "coral-magazine-feature", + "text_style_strategy": { + "bold": { + "allowed_roles": [ + "display", + "label", + "metric" + ], + "mapped_weight": { + "display": 900, + "label": 700, + "metric": 900 + }, + "source_usage": "source uses heavy display/label weights" + }, + "emphasis": { + "color_shift": "use source accent color roles only", + "font_family_switch": "only switch between mapped display/body/label/metric roles from this family", + "style_shift": "italic only when source_usage requires and CJK fallback is safe", + "weight_shift": "increase one role step within font_weight_scale" + }, + "extraction_confidence": { + "bold": "css_extracted_from_template_html", + "emphasis": "inferred_from_layout", + "forbidden": "inferred_from_layout", + "italic": "css_extracted_from_template_html", + "line_through": "absent_use_default", + "text_decoration_policy.line_through.color": "absent_use_default", + "text_decoration_policy.line_through.style": "absent_use_default", + "text_decoration_policy.line_through.thickness": "absent_use_default", + "text_decoration_policy.underline.color": "css_extracted_from_template_html", + "text_decoration_policy.underline.style": "css_extracted_from_template_html", + "text_decoration_policy.underline.thickness": "css_extracted_from_template_html", + "underline": "css_extracted_from_template_html" + }, + "forbidden": [ + "fake_cjk_italic", + "drop_source_text_transform", + "drop_source_letter_spacing_without_loss_note", + "use_cross_family_font_motif", + "remote_font_dependency_without_receipt" + ], + "italic": { + "fallback_when_unavailable": "use color_shift or weight_shift; do not fake CJK italic", + "loss_notes": "Satori/Slide may not provide exact Google italic face; record as visual approximation.", + "mapped_style": "latin_only_when_source_requires_else_normal", + "source_usage": "source uses italic/font-style or italic-family tokens" + }, + "line_through": { + "fallback_shape": "none", + "mapped_decoration": "none", + "source_usage": "not present in source; default no line-through" + }, + "source_refs": { + "bold": [ + { + "path": "beautiful-html-templates/templates/coral/template.html", + "raw_value": "700; 600; 300", + "selector_or_token": "css.font-weight" + } + ], + "emphasis": [ + { + "path": "beautiful-html-templates/templates/coral/template.html", + "raw_value": "idth: 100%; height: 100%; overflow: hidden; font-family: 'Inter', sans-serif; background: var(--black); color: var(--black); } .presentation { width: 100%; height: 100%; position: relativ", + "selector_or_token": "template.css.typography" + } + ], + "forbidden": [ + { + "path": "beautiful-html-templates/templates/coral/template.html", + "raw_value": "idth: 100%; height: 100%; overflow: hidden; font-family: 'Inter', sans-serif; background: var(--black); color: var(--black); } .presentation { width: 100%; height: 100%; position: relativ", + "selector_or_token": "template.css.typography" + } + ], + "italic": [ + { + "path": "beautiful-html-templates/templates/coral/template.html", + "raw_value": "nance), 400 for body paragraphs, 600 for meta labels, 700 for section eyebrows. Italic and underline are not used. ### Type Scale | Token | Size | Family | Weight | Use | |---|---|---|---|---| | `{typography.giant-mark}` | clamp(140px, 20vw, 280px) | Bebas Neue | 400 | Oversized decorative quote m", + "selector_or_token": "css.font-style" + } + ], + "text_decoration_policy.underline.color": [ + { + "path": "beautiful-html-templates/templates/coral/template.html", + "raw_value": "for body paragraphs, 600 for meta labels, 700 for section eyebrows. Italic and underline are not used. ### Type Scale | Token | Size | Family | Weight | Use | |---|---|---|---|---| | `{typography.giant-mark}` | clamp(140px, 20vw, 280px) | Bebas Neue | 400 | Oversized decorative quote mark or feat", + "selector_or_token": "css.text-decoration" + } + ], + "text_decoration_policy.underline.style": [ + { + "path": "beautiful-html-templates/templates/coral/template.html", + "raw_value": "for body paragraphs, 600 for meta labels, 700 for section eyebrows. Italic and underline are not used. ### Type Scale | Token | Size | Family | Weight | Use | |---|---|---|---|---| | `{typography.giant-mark}` | clamp(140px, 20vw, 280px) | Bebas Neue | 400 | Oversized decorative quote mark or feat", + "selector_or_token": "css.text-decoration" + } + ], + "text_decoration_policy.underline.thickness": [ + { + "path": "beautiful-html-templates/templates/coral/template.html", + "raw_value": "for body paragraphs, 600 for meta labels, 700 for section eyebrows. Italic and underline are not used. ### Type Scale | Token | Size | Family | Weight | Use | |---|---|---|---|---| | `{typography.giant-mark}` | clamp(140px, 20vw, 280px) | Bebas Neue | 400 | Oversized decorative quote mark or feat", + "selector_or_token": "css.text-decoration" + } + ], + "underline": [ + { + "path": "beautiful-html-templates/templates/coral/template.html", + "raw_value": "for body paragraphs, 600 for meta labels, 700 for section eyebrows. Italic and underline are not used. ### Type Scale | Token | Size | Family | Weight | Use | |---|---|---|---|---| | `{typography.giant-mark}` | clamp(140px, 20vw, 280px) | Bebas Neue | 400 | Oversized decorative quote mark or feat", + "selector_or_token": "css.text-decoration" + } + ] + }, + "text_decoration_policy": { + "line_through": { + "color": "currentColor", + "style": "none", + "thickness": "0px" + }, + "underline": { + "color": "currentColor", + "style": "solid", + "thickness": "1px" + } + }, + "underline": { + "fallback_shape": "1px-3px rule or border accent when underline font rendering is unavailable", + "mapped_decoration": "native underline only for actual text-decoration source usage", + "source_usage": "source uses underline/text-decoration or hairline emphasis" + } + }, "typography_strategy": { + "alignment": { + "fallback": "left/top aligned unless source screenshot is centered", + "primary": "follow source composition" + }, + "cjk_typography_adjustment": { + "body_font_cn": "ZCOOL XiaoWei", + "display_font_cn": "LXGW WenKai TC", + "italic_policy": "color_only_emphasis", + "letter_spacing_policy": "reset_letter_spacing_for_cjk_keep_latin_labels", + "mixed_run_spacing": "pangu_spacing" + }, + "extraction_confidence": { + "alignment": "inferred_from_layout", + "cjk_typography_adjustment": "inferred_from_layout", + "font_size_scale": "css_extracted_from_template_html", + "font_weight_scale": "css_extracted_from_template_html", + "hierarchy_ratio": "inferred_from_layout", + "letter_spacing_scale": "css_extracted_from_template_html", + "line_height_scale": "css_extracted_from_template_html", + "mapping_reason": "inferred_from_layout", + "max_lines": "inferred_from_layout", + "measure": "inferred_from_layout", + "paragraph_spacing": "css_extracted_from_template_html", + "role_mapping.body": "inferred_from_layout", + "role_mapping.display": "inferred_from_layout", + "role_mapping.label": "inferred_from_layout", + "role_mapping.metric": "inferred_from_layout", + "source_typography_tokens": "css_extracted_from_template_html", + "text_direction": "css_extracted_from_template_html", + "text_transform_policy": "css_extracted_from_template_html", + "word_spacing": "absent_use_default", + "wrapping_policy": "inferred_from_layout", + "writing_mode": "absent_use_default" + }, + "font_size_scale": { + "body": 20, + "display": 88, + "label": 12, + "metric": 56 + }, + "font_weight_scale": { + "body": 400, + "display": 900, + "label": 700, + "metric": 900 + }, + "hierarchy_ratio": 4.4, + "letter_spacing_scale": { + "body": 0, + "display": 0, + "label": 0.08, + "metric": 0 + }, + "line_height_scale": { + "body": 1.32, + "display": 0.9, + "label": 1.05, + "metric": 0.95 + }, + "mapping_reason": "按源模板字号/字重/行高/字距/大小写规则抽象到 960x540 Slide 画布的四个文本角色。", + "max_lines": { + "body": 5, + "display": 3, + "label": 1, + "metric": 2 + }, + "measure": { + "body": "40-70 characters or CJK equivalent", + "display": "0.55-0.78 canvas width", + "label": "short mono labels", + "metric": "short numeric/stat blocks" + }, + "paragraph_spacing": { + "body_after": 12, + "display_after": 0, + "label_after": 0, + "metric_after": 0 + }, + "role_mapping": { + "body": { + "alignment": "source_layout_dependent", + "font_role": "body", + "font_size": 20, + "font_weight": 400, + "letter_spacing": 0, + "line_height": 1.32, + "max_lines": 5, + "runtime_alias": "SVGlideBody", + "source_font": "Inter", + "text_transform": "preserve_source_case" + }, + "display": { + "alignment": "source_layout_dependent", + "font_role": "display", + "font_size": 88, + "font_weight": 900, + "letter_spacing": 0, + "line_height": 0.9, + "max_lines": 3, + "runtime_alias": "SVGlideDisplay", + "source_font": "Bebas Neue", + "text_transform": "latin_uppercase_only" + }, + "label": { + "alignment": "source_layout_dependent", + "font_role": "label", + "font_size": 12, + "font_weight": 700, + "letter_spacing": 0.08, + "line_height": 1.05, + "max_lines": 1, + "runtime_alias": "SVGlideLabel", + "source_font": "Bebas Neue", + "text_transform": "latin_uppercase_labels_reset_cjk_spacing" + }, + "metric": { + "alignment": "source_layout_dependent", + "font_role": "metric", + "font_size": 56, + "font_weight": 900, + "letter_spacing": 0, + "line_height": 0.95, + "max_lines": 2, + "runtime_alias": "SVGlideMetric", + "source_font": "Bebas Neue", + "text_transform": "preserve_numbers_and_units" + } + }, + "source_refs": { + "alignment": [ + { + "path": "beautiful-html-templates/templates/coral/template.html", + "raw_value": "idth: 100%; height: 100%; overflow: hidden; font-family: 'Inter', sans-serif; background: var(--black); color: var(--black); } .presentation { width: 100%; height: 100%; position: relativ", + "selector_or_token": "template.css.typography" + } + ], + "cjk_typography_adjustment": [ + { + "path": "beautiful-html-templates/templates/coral/template.html", + "raw_value": "idth: 100%; height: 100%; overflow: hidden; font-family: 'Inter', sans-serif; background: var(--black); color: var(--black); } .presentation { width: 100%; height: 100%; position: relativ", + "selector_or_token": "template.css.typography" + } + ], + "font_size_scale": [ + { + "path": "beautiful-html-templates/templates/coral/template.html", + "raw_value": "18px; 12px; min(120px, 9vw, 13vh); 11px; min(44px, 3.5vw, 5.5vh); min(38px, 3vw, 4.8vh); clamp(42px, 7vw, 100px); clamp(15px, 1.4vw, 20px); clamp(100px, 15vw, 200px); clamp(36px, 5vw, 72px); clamp(14px, 1.2vw, 18px); clamp(40px, 6vw, 80px); clamp(48px, 7vw, 96px); clamp(28px, 3vw, 48px); clamp(80px, 15vw, 200px); clamp(28px, 4vw, 56px)", + "selector_or_token": "css.font_size_scale" + } + ], + "font_weight_scale": [ + { + "path": "beautiful-html-templates/templates/coral/template.html", + "raw_value": "700; 600; 300", + "selector_or_token": "css.font_weight_scale" + } + ], + "hierarchy_ratio": [ + { + "path": "beautiful-html-templates/templates/coral/template.html", + "raw_value": "idth: 100%; height: 100%; overflow: hidden; font-family: 'Inter', sans-serif; background: var(--black); color: var(--black); } .presentation { width: 100%; height: 100%; position: relativ", + "selector_or_token": "template.css.typography" + } + ], + "letter_spacing_scale": [ + { + "path": "beautiful-html-templates/templates/coral/template.html", + "raw_value": "2px; 4px; 3px; 1px; 12px", + "selector_or_token": "css.letter_spacing_scale" + } + ], + "line_height_scale": [ + { + "path": "beautiful-html-templates/templates/coral/template.html", + "raw_value": "0.9; 1; 1.0; 1.7; 1.6; 1.1; 1.5; 1.4; 0.95", + "selector_or_token": "css.line_height_scale" + } + ], + "mapping_reason": [ + { + "path": "beautiful-html-templates/templates/coral/template.html", + "raw_value": "idth: 100%; height: 100%; overflow: hidden; font-family: 'Inter', sans-serif; background: var(--black); color: var(--black); } .presentation { width: 100%; height: 100%; position: relativ", + "selector_or_token": "template.css.typography" + } + ], + "max_lines": [ + { + "path": "beautiful-html-templates/templates/coral/template.html", + "raw_value": "idth: 100%; height: 100%; overflow: hidden; font-family: 'Inter', sans-serif; background: var(--black); color: var(--black); } .presentation { width: 100%; height: 100%; position: relativ", + "selector_or_token": "template.css.typography" + } + ], + "measure": [ + { + "path": "beautiful-html-templates/templates/coral/template.html", + "raw_value": "idth: 100%; height: 100%; overflow: hidden; font-family: 'Inter', sans-serif; background: var(--black); color: var(--black); } .presentation { width: 100%; height: 100%; position: relativ", + "selector_or_token": "template.css.typography" + } + ], + "paragraph_spacing": [ + { + "path": "beautiful-html-templates/templates/coral/template.html", + "raw_value": "24px; 32px; 28px; 0; 8px; 40px; 12px; 48px; 20px; 4px; 16px; 12px; 16px; 2px; 40px; 20px; 32px; 24px", + "selector_or_token": "css.paragraph_spacing" + } + ], + "role_mapping.body": [ + { + "path": "beautiful-html-templates/templates/coral/template.html", + "raw_value": "Inter", + "selector_or_token": "role_mapping.body.source_font" + }, + { + "path": "beautiful-html-templates/templates/coral/design.md", + "raw_value": "ht-gray: \"#B0B0B0\" white: \"#FFFFFF\" color-aliases: bg: cream ink: black typography: hero-title: fontFamily: \"Bebas Neue, sans-serif\" fontSize: \"min(120px, 9vw, 13vh)\" fontWeight: 400 lineHeight: 0.9 letterSpacing: 4px jumbo-feature: fontFamily: \"Bebas Neue, sans-s", + "selector_or_token": "design.typography.roles" + } + ], + "role_mapping.display": [ + { + "path": "beautiful-html-templates/templates/coral/template.html", + "raw_value": "Bebas Neue", + "selector_or_token": "role_mapping.display.source_font" + }, + { + "path": "beautiful-html-templates/templates/coral/design.md", + "raw_value": "ht-gray: \"#B0B0B0\" white: \"#FFFFFF\" color-aliases: bg: cream ink: black typography: hero-title: fontFamily: \"Bebas Neue, sans-serif\" fontSize: \"min(120px, 9vw, 13vh)\" fontWeight: 400 lineHeight: 0.9 letterSpacing: 4px jumbo-feature: fontFamily: \"Bebas Neue, sans-s", + "selector_or_token": "design.typography.roles" + } + ], + "role_mapping.label": [ + { + "path": "beautiful-html-templates/templates/coral/template.html", + "raw_value": "Bebas Neue", + "selector_or_token": "role_mapping.label.source_font" + }, + { + "path": "beautiful-html-templates/templates/coral/design.md", + "raw_value": "ht-gray: \"#B0B0B0\" white: \"#FFFFFF\" color-aliases: bg: cream ink: black typography: hero-title: fontFamily: \"Bebas Neue, sans-serif\" fontSize: \"min(120px, 9vw, 13vh)\" fontWeight: 400 lineHeight: 0.9 letterSpacing: 4px jumbo-feature: fontFamily: \"Bebas Neue, sans-s", + "selector_or_token": "design.typography.roles" + } + ], + "role_mapping.metric": [ + { + "path": "beautiful-html-templates/templates/coral/template.html", + "raw_value": "Bebas Neue", + "selector_or_token": "role_mapping.metric.source_font" + }, + { + "path": "beautiful-html-templates/templates/coral/design.md", + "raw_value": "ht-gray: \"#B0B0B0\" white: \"#FFFFFF\" color-aliases: bg: cream ink: black typography: hero-title: fontFamily: \"Bebas Neue, sans-serif\" fontSize: \"min(120px, 9vw, 13vh)\" fontWeight: 400 lineHeight: 0.9 letterSpacing: 4px jumbo-feature: fontFamily: \"Bebas Neue, sans-s", + "selector_or_token": "design.typography.roles" + } + ], + "source_typography_tokens": [ + { + "path": "beautiful-html-templates/templates/coral/template.html", + "raw_value": "18px; 12px; min(120px, 9vw, 13vh); 11px; min(44px, 3.5vw, 5.5vh); min(38px, 3vw, 4.8vh); clamp(42px, 7vw, 100px); clamp(15px, 1.4vw, 20px); clamp(100px, 15vw, 200px); clamp(36px, 5vw, 72px); clamp(14px, 1.2vw, 18px); clamp(40px, 6vw, 80px); clamp(48px, 7vw, 96px); clamp(28px, 3vw, 48px); clamp(80px, 15vw, 200px); clamp(28px, 4vw, 56px); 700; 600; 300; 0.9; 1; 1.0; 1.7; 1.6; 1.1; 1.5; 1.4; 0.95; 2px; 4px; 3px; 1px; 12px; uppercase` on any label/eyebrow/meta when content is Hanzi — Chinese has no ", + "selector_or_token": "css.source_typography_tokens" + } + ], + "text_direction": [ + { + "path": "beautiful-html-templates/templates/coral/template.html", + "raw_value": "column", + "selector_or_token": "css.text_direction" + } + ], + "text_transform_policy": [ + { + "path": "beautiful-html-templates/templates/coral/template.html", + "raw_value": "uppercase` on any label/eyebrow/meta when content is Hanzi — Chinese has no case; uppercase", + "selector_or_token": "css.text_transform_policy" + } + ], + "wrapping_policy": [ + { + "path": "beautiful-html-templates/templates/coral/template.html", + "raw_value": "idth: 100%; height: 100%; overflow: hidden; font-family: 'Inter', sans-serif; background: var(--black); color: var(--black); } .presentation { width: 100%; height: 100%; position: relativ", + "selector_or_token": "template.css.typography" + } + ] + }, "source_typography_tokens": { "font_families": [ "Bebas Neue", @@ -7893,6 +8774,13 @@ "700", "600" ], + "letter_spacing": [ + "4px", + "12px", + "2px", + "1px", + "3px" + ], "line_height": [ "0.9", "1", @@ -7904,18 +8792,6 @@ "1.0", "0.95" ], - "letter_spacing": [ - "4px", - "12px", - "2px", - "1px", - "3px" - ], - "text_transform": [ - "uppercase", - "uppercase` on any label/eyebrow/meta when content is Hanzi — Chinese has no case" - ], - "word_spacing": [], "paragraph_spacing": [ "24px", "32px", @@ -7936,524 +8812,62 @@ "32px", "24px" ], + "text_decoration": [], "text_direction": [ "column" ], - "writing_mode": [], - "text_decoration": [] + "text_transform": [ + "uppercase", + "uppercase` on any label/eyebrow/meta when content is Hanzi — Chinese has no case" + ], + "word_spacing": [], + "writing_mode": [] }, - "role_mapping": { - "display": { - "font_role": "display", - "source_font": "Bebas Neue", - "runtime_alias": "SVGlideDisplay", - "font_size": 88, - "font_weight": 900, - "line_height": 0.9, - "letter_spacing": 0, - "text_transform": "latin_uppercase_only", - "max_lines": 3, - "alignment": "source_layout_dependent" - }, - "body": { - "font_role": "body", - "source_font": "Inter", - "runtime_alias": "SVGlideBody", - "font_size": 20, - "font_weight": 400, - "line_height": 1.32, - "letter_spacing": 0, - "text_transform": "preserve_source_case", - "max_lines": 5, - "alignment": "source_layout_dependent" - }, - "label": { - "font_role": "label", - "source_font": "Bebas Neue", - "runtime_alias": "SVGlideLabel", - "font_size": 12, - "font_weight": 700, - "line_height": 1.05, - "letter_spacing": 0.08, - "text_transform": "latin_uppercase_labels_reset_cjk_spacing", - "max_lines": 1, - "alignment": "source_layout_dependent" - }, - "metric": { - "font_role": "metric", - "source_font": "Bebas Neue", - "runtime_alias": "SVGlideMetric", - "font_size": 56, - "font_weight": 900, - "line_height": 0.95, - "letter_spacing": 0, - "text_transform": "preserve_numbers_and_units", - "max_lines": 2, - "alignment": "source_layout_dependent" - } - }, - "font_size_scale": { - "display": 88, - "body": 20, - "label": 12, - "metric": 56 - }, - "font_weight_scale": { - "display": 900, - "body": 400, - "label": 700, - "metric": 900 - }, - "line_height_scale": { - "display": 0.9, - "body": 1.32, - "label": 1.05, - "metric": 0.95 - }, - "letter_spacing_scale": { - "display": 0, - "body": 0, - "label": 0.08, - "metric": 0 + "text_direction": { + "cjk": "ltr", + "default": "column" }, "text_transform_policy": { - "display": "latin_uppercase_only", "body": "preserve_source_case", + "display": "latin_uppercase_only", "label": "latin_uppercase_labels_reset_cjk_spacing", "metric": "preserve_numbers_and_units" }, - "hierarchy_ratio": 4.4, - "max_lines": { - "display": 3, - "body": 5, - "label": 1, - "metric": 2 - }, - "measure": { - "display": "0.55-0.78 canvas width", - "body": "40-70 characters or CJK equivalent", - "label": "short mono labels", - "metric": "short numeric/stat blocks" - }, - "alignment": { - "primary": "follow source composition", - "fallback": "left/top aligned unless source screenshot is centered" - }, - "cjk_typography_adjustment": { - "display_font_cn": "LXGW WenKai TC", - "body_font_cn": "ZCOOL XiaoWei", - "letter_spacing_policy": "reset_letter_spacing_for_cjk_keep_latin_labels", - "mixed_run_spacing": "pangu_spacing", - "italic_policy": "color_only_emphasis" - }, - "mapping_reason": "按源模板字号/字重/行高/字距/大小写规则抽象到 960x540 Slide 画布的四个文本角色。", "word_spacing": { - "display": 0, "body": 0, + "display": 0, "label": 0, "metric": 0 }, - "paragraph_spacing": { - "display_after": 0, - "body_after": 12, - "label_after": 0, - "metric_after": 0 - }, "wrapping_policy": { - "display": "manual_break_or_balance", "body": "wrap_with_measure", + "display": "manual_break_or_balance", "label": "no_wrap_preferred", "metric": "no_wrap_preferred" }, - "text_direction": { - "default": "column", - "cjk": "ltr" - }, "writing_mode": { "default": "horizontal-tb", "vertical_roles": [] - }, - "extraction_confidence": { - "role_mapping.body": "inferred_from_layout", - "role_mapping.display": "inferred_from_layout", - "font_size_scale": "css_extracted_from_template_html", - "max_lines": "inferred_from_layout", - "writing_mode": "absent_use_default", - "text_direction": "css_extracted_from_template_html", - "alignment": "inferred_from_layout", - "role_mapping.label": "inferred_from_layout", - "paragraph_spacing": "css_extracted_from_template_html", - "text_transform_policy": "css_extracted_from_template_html", - "line_height_scale": "css_extracted_from_template_html", - "wrapping_policy": "inferred_from_layout", - "font_weight_scale": "css_extracted_from_template_html", - "source_typography_tokens": "css_extracted_from_template_html", - "word_spacing": "absent_use_default", - "role_mapping.metric": "inferred_from_layout", - "cjk_typography_adjustment": "inferred_from_layout", - "hierarchy_ratio": "inferred_from_layout", - "measure": "inferred_from_layout", - "mapping_reason": "inferred_from_layout", - "letter_spacing_scale": "css_extracted_from_template_html" - }, - "source_refs": { - "role_mapping.body": [ - { - "path": "beautiful-html-templates/templates/coral/template.html", - "selector_or_token": "role_mapping.body.source_font", - "raw_value": "Inter" - }, - { - "path": "beautiful-html-templates/templates/coral/design.md", - "selector_or_token": "design.typography.roles", - "raw_value": "ht-gray: \"#B0B0B0\" white: \"#FFFFFF\" color-aliases: bg: cream ink: black typography: hero-title: fontFamily: \"Bebas Neue, sans-serif\" fontSize: \"min(120px, 9vw, 13vh)\" fontWeight: 400 lineHeight: 0.9 letterSpacing: 4px jumbo-feature: fontFamily: \"Bebas Neue, sans-s" - } - ], - "role_mapping.display": [ - { - "path": "beautiful-html-templates/templates/coral/template.html", - "selector_or_token": "role_mapping.display.source_font", - "raw_value": "Bebas Neue" - }, - { - "path": "beautiful-html-templates/templates/coral/design.md", - "selector_or_token": "design.typography.roles", - "raw_value": "ht-gray: \"#B0B0B0\" white: \"#FFFFFF\" color-aliases: bg: cream ink: black typography: hero-title: fontFamily: \"Bebas Neue, sans-serif\" fontSize: \"min(120px, 9vw, 13vh)\" fontWeight: 400 lineHeight: 0.9 letterSpacing: 4px jumbo-feature: fontFamily: \"Bebas Neue, sans-s" - } - ], - "font_size_scale": [ - { - "path": "beautiful-html-templates/templates/coral/template.html", - "selector_or_token": "css.font_size_scale", - "raw_value": "18px; 12px; min(120px, 9vw, 13vh); 11px; min(44px, 3.5vw, 5.5vh); min(38px, 3vw, 4.8vh); clamp(42px, 7vw, 100px); clamp(15px, 1.4vw, 20px); clamp(100px, 15vw, 200px); clamp(36px, 5vw, 72px); clamp(14px, 1.2vw, 18px); clamp(40px, 6vw, 80px); clamp(48px, 7vw, 96px); clamp(28px, 3vw, 48px); clamp(80px, 15vw, 200px); clamp(28px, 4vw, 56px)" - } - ], - "max_lines": [ - { - "path": "beautiful-html-templates/templates/coral/template.html", - "selector_or_token": "template.css.typography", - "raw_value": "idth: 100%; height: 100%; overflow: hidden; font-family: 'Inter', sans-serif; background: var(--black); color: var(--black); } .presentation { width: 100%; height: 100%; position: relativ" - } - ], - "text_direction": [ - { - "path": "beautiful-html-templates/templates/coral/template.html", - "selector_or_token": "css.text_direction", - "raw_value": "column" - } - ], - "alignment": [ - { - "path": "beautiful-html-templates/templates/coral/template.html", - "selector_or_token": "template.css.typography", - "raw_value": "idth: 100%; height: 100%; overflow: hidden; font-family: 'Inter', sans-serif; background: var(--black); color: var(--black); } .presentation { width: 100%; height: 100%; position: relativ" - } - ], - "role_mapping.label": [ - { - "path": "beautiful-html-templates/templates/coral/template.html", - "selector_or_token": "role_mapping.label.source_font", - "raw_value": "Bebas Neue" - }, - { - "path": "beautiful-html-templates/templates/coral/design.md", - "selector_or_token": "design.typography.roles", - "raw_value": "ht-gray: \"#B0B0B0\" white: \"#FFFFFF\" color-aliases: bg: cream ink: black typography: hero-title: fontFamily: \"Bebas Neue, sans-serif\" fontSize: \"min(120px, 9vw, 13vh)\" fontWeight: 400 lineHeight: 0.9 letterSpacing: 4px jumbo-feature: fontFamily: \"Bebas Neue, sans-s" - } - ], - "paragraph_spacing": [ - { - "path": "beautiful-html-templates/templates/coral/template.html", - "selector_or_token": "css.paragraph_spacing", - "raw_value": "24px; 32px; 28px; 0; 8px; 40px; 12px; 48px; 20px; 4px; 16px; 12px; 16px; 2px; 40px; 20px; 32px; 24px" - } - ], - "text_transform_policy": [ - { - "path": "beautiful-html-templates/templates/coral/template.html", - "selector_or_token": "css.text_transform_policy", - "raw_value": "uppercase` on any label/eyebrow/meta when content is Hanzi — Chinese has no case; uppercase" - } - ], - "line_height_scale": [ - { - "path": "beautiful-html-templates/templates/coral/template.html", - "selector_or_token": "css.line_height_scale", - "raw_value": "0.9; 1; 1.0; 1.7; 1.6; 1.1; 1.5; 1.4; 0.95" - } - ], - "wrapping_policy": [ - { - "path": "beautiful-html-templates/templates/coral/template.html", - "selector_or_token": "template.css.typography", - "raw_value": "idth: 100%; height: 100%; overflow: hidden; font-family: 'Inter', sans-serif; background: var(--black); color: var(--black); } .presentation { width: 100%; height: 100%; position: relativ" - } - ], - "font_weight_scale": [ - { - "path": "beautiful-html-templates/templates/coral/template.html", - "selector_or_token": "css.font_weight_scale", - "raw_value": "700; 600; 300" - } - ], - "source_typography_tokens": [ - { - "path": "beautiful-html-templates/templates/coral/template.html", - "selector_or_token": "css.source_typography_tokens", - "raw_value": "18px; 12px; min(120px, 9vw, 13vh); 11px; min(44px, 3.5vw, 5.5vh); min(38px, 3vw, 4.8vh); clamp(42px, 7vw, 100px); clamp(15px, 1.4vw, 20px); clamp(100px, 15vw, 200px); clamp(36px, 5vw, 72px); clamp(14px, 1.2vw, 18px); clamp(40px, 6vw, 80px); clamp(48px, 7vw, 96px); clamp(28px, 3vw, 48px); clamp(80px, 15vw, 200px); clamp(28px, 4vw, 56px); 700; 600; 300; 0.9; 1; 1.0; 1.7; 1.6; 1.1; 1.5; 1.4; 0.95; 2px; 4px; 3px; 1px; 12px; uppercase` on any label/eyebrow/meta when content is Hanzi — Chinese has no " - } - ], - "role_mapping.metric": [ - { - "path": "beautiful-html-templates/templates/coral/template.html", - "selector_or_token": "role_mapping.metric.source_font", - "raw_value": "Bebas Neue" - }, - { - "path": "beautiful-html-templates/templates/coral/design.md", - "selector_or_token": "design.typography.roles", - "raw_value": "ht-gray: \"#B0B0B0\" white: \"#FFFFFF\" color-aliases: bg: cream ink: black typography: hero-title: fontFamily: \"Bebas Neue, sans-serif\" fontSize: \"min(120px, 9vw, 13vh)\" fontWeight: 400 lineHeight: 0.9 letterSpacing: 4px jumbo-feature: fontFamily: \"Bebas Neue, sans-s" - } - ], - "cjk_typography_adjustment": [ - { - "path": "beautiful-html-templates/templates/coral/template.html", - "selector_or_token": "template.css.typography", - "raw_value": "idth: 100%; height: 100%; overflow: hidden; font-family: 'Inter', sans-serif; background: var(--black); color: var(--black); } .presentation { width: 100%; height: 100%; position: relativ" - } - ], - "hierarchy_ratio": [ - { - "path": "beautiful-html-templates/templates/coral/template.html", - "selector_or_token": "template.css.typography", - "raw_value": "idth: 100%; height: 100%; overflow: hidden; font-family: 'Inter', sans-serif; background: var(--black); color: var(--black); } .presentation { width: 100%; height: 100%; position: relativ" - } - ], - "measure": [ - { - "path": "beautiful-html-templates/templates/coral/template.html", - "selector_or_token": "template.css.typography", - "raw_value": "idth: 100%; height: 100%; overflow: hidden; font-family: 'Inter', sans-serif; background: var(--black); color: var(--black); } .presentation { width: 100%; height: 100%; position: relativ" - } - ], - "mapping_reason": [ - { - "path": "beautiful-html-templates/templates/coral/template.html", - "selector_or_token": "template.css.typography", - "raw_value": "idth: 100%; height: 100%; overflow: hidden; font-family: 'Inter', sans-serif; background: var(--black); color: var(--black); } .presentation { width: 100%; height: 100%; position: relativ" - } - ], - "letter_spacing_scale": [ - { - "path": "beautiful-html-templates/templates/coral/template.html", - "selector_or_token": "css.letter_spacing_scale", - "raw_value": "2px; 4px; 3px; 1px; 12px" - } - ] } }, - "text_style_strategy": { - "bold": { - "source_usage": "source uses heavy display/label weights", - "mapped_weight": { - "display": 900, - "label": 700, - "metric": 900 - }, - "allowed_roles": [ - "display", - "label", - "metric" - ] - }, - "italic": { - "source_usage": "source uses italic/font-style or italic-family tokens", - "mapped_style": "latin_only_when_source_requires_else_normal", - "fallback_when_unavailable": "use color_shift or weight_shift; do not fake CJK italic", - "loss_notes": "Satori/Slide may not provide exact Google italic face; record as visual approximation." - }, - "underline": { - "source_usage": "source uses underline/text-decoration or hairline emphasis", - "mapped_decoration": "native underline only for actual text-decoration source usage", - "fallback_shape": "1px-3px rule or border accent when underline font rendering is unavailable" - }, - "line_through": { - "source_usage": "not present in source; default no line-through", - "mapped_decoration": "none", - "fallback_shape": "none" - }, - "emphasis": { - "color_shift": "use source accent color roles only", - "font_family_switch": "only switch between mapped display/body/label/metric roles from this family", - "weight_shift": "increase one role step within font_weight_scale", - "style_shift": "italic only when source_usage requires and CJK fallback is safe" - }, - "text_decoration_policy": { - "underline": { - "style": "solid", - "color": "currentColor", - "thickness": "1px" - }, - "line_through": { - "style": "none", - "color": "currentColor", - "thickness": "0px" - } - }, - "forbidden": [ - "fake_cjk_italic", - "drop_source_text_transform", - "drop_source_letter_spacing_without_loss_note", - "use_cross_family_font_motif", - "remote_font_dependency_without_receipt" - ], - "extraction_confidence": { - "text_decoration_policy.line_through.color": "absent_use_default", - "text_decoration_policy.underline.color": "css_extracted_from_template_html", - "text_decoration_policy.line_through.style": "absent_use_default", - "italic": "css_extracted_from_template_html", - "forbidden": "inferred_from_layout", - "emphasis": "inferred_from_layout", - "text_decoration_policy.underline.thickness": "css_extracted_from_template_html", - "underline": "css_extracted_from_template_html", - "text_decoration_policy.line_through.thickness": "absent_use_default", - "line_through": "absent_use_default", - "text_decoration_policy.underline.style": "css_extracted_from_template_html", - "bold": "css_extracted_from_template_html" - }, - "source_refs": { - "text_decoration_policy.underline.color": [ - { - "path": "beautiful-html-templates/templates/coral/template.html", - "selector_or_token": "css.text-decoration", - "raw_value": "for body paragraphs, 600 for meta labels, 700 for section eyebrows. Italic and underline are not used. ### Type Scale | Token | Size | Family | Weight | Use | |---|---|---|---|---| | `{typography.giant-mark}` | clamp(140px, 20vw, 280px) | Bebas Neue | 400 | Oversized decorative quote mark or feat" - } - ], - "italic": [ - { - "path": "beautiful-html-templates/templates/coral/template.html", - "selector_or_token": "css.font-style", - "raw_value": "nance), 400 for body paragraphs, 600 for meta labels, 700 for section eyebrows. Italic and underline are not used. ### Type Scale | Token | Size | Family | Weight | Use | |---|---|---|---|---| | `{typography.giant-mark}` | clamp(140px, 20vw, 280px) | Bebas Neue | 400 | Oversized decorative quote m" - } - ], - "forbidden": [ - { - "path": "beautiful-html-templates/templates/coral/template.html", - "selector_or_token": "template.css.typography", - "raw_value": "idth: 100%; height: 100%; overflow: hidden; font-family: 'Inter', sans-serif; background: var(--black); color: var(--black); } .presentation { width: 100%; height: 100%; position: relativ" - } - ], - "emphasis": [ - { - "path": "beautiful-html-templates/templates/coral/template.html", - "selector_or_token": "template.css.typography", - "raw_value": "idth: 100%; height: 100%; overflow: hidden; font-family: 'Inter', sans-serif; background: var(--black); color: var(--black); } .presentation { width: 100%; height: 100%; position: relativ" - } - ], - "text_decoration_policy.underline.thickness": [ - { - "path": "beautiful-html-templates/templates/coral/template.html", - "selector_or_token": "css.text-decoration", - "raw_value": "for body paragraphs, 600 for meta labels, 700 for section eyebrows. Italic and underline are not used. ### Type Scale | Token | Size | Family | Weight | Use | |---|---|---|---|---| | `{typography.giant-mark}` | clamp(140px, 20vw, 280px) | Bebas Neue | 400 | Oversized decorative quote mark or feat" - } - ], - "underline": [ - { - "path": "beautiful-html-templates/templates/coral/template.html", - "selector_or_token": "css.text-decoration", - "raw_value": "for body paragraphs, 600 for meta labels, 700 for section eyebrows. Italic and underline are not used. ### Type Scale | Token | Size | Family | Weight | Use | |---|---|---|---|---| | `{typography.giant-mark}` | clamp(140px, 20vw, 280px) | Bebas Neue | 400 | Oversized decorative quote mark or feat" - } - ], - "text_decoration_policy.underline.style": [ - { - "path": "beautiful-html-templates/templates/coral/template.html", - "selector_or_token": "css.text-decoration", - "raw_value": "for body paragraphs, 600 for meta labels, 700 for section eyebrows. Italic and underline are not used. ### Type Scale | Token | Size | Family | Weight | Use | |---|---|---|---|---| | `{typography.giant-mark}` | clamp(140px, 20vw, 280px) | Bebas Neue | 400 | Oversized decorative quote mark or feat" - } - ], - "bold": [ - { - "path": "beautiful-html-templates/templates/coral/template.html", - "selector_or_token": "css.font-weight", - "raw_value": "700; 600; 300" - } - ] - } - }, - "satori": { - "font_and_typography_constraints": [ - "distinctive display face may be approximated by Slide/Source/思源 fonts; preserve weight/size/case first", - "italic is source-aware but CJK fake italic is forbidden; use color/weight fallback when unavailable", - "letter spacing is preserved for Latin labels and reset/softened for CJK" - ] - }, - "loss_notes": [ - "distinctive display face may be approximated by Slide/Source/思源 fonts; preserve weight/size/case first", - "italic is source-aware but CJK fake italic is forbidden; use color/weight fallback when unavailable", - "letter spacing is preserved for Latin labels and reset/softened for CJK" - ], - "page_variant_count": 10, - "source_page_variants": [ - "agenda", - "closing", - "cover", - "data_dashboard", - "data_dashboard-6", - "detail", - "detail-9", - "process_or_timeline", - "process_or_timeline-8", - "quote_or_emphasis" - ], - "page_family_source": { - "extractor": "skills/lark-slides/scripts/beautiful_template_page_family_extract.py", - "source_template_html": "beautiful-html-templates/templates/coral/template.html", - "source_design_md": "beautiful-html-templates/templates/coral/design.md", - "source_template_json": "beautiful-html-templates/templates/coral/template.json", - "claim_boundary": "source extraction only; does not imply renderer, fidelity, quality gate, or production/default selectable status" - } - }, - { - "family_id": "creative-mode", - "template_id": "creative-mode-grid", - "runtime_template_id": "creative-mode-grid", - "source_template_html": "beautiful-html-templates/templates/creative-mode/template.html", - "source_design_md": "beautiful-html-templates/templates/creative-mode/design.md", - "source_template_json": "beautiful-html-templates/templates/creative-mode/template.json", - "renderer_id": "artboard_satori.creative-mode-grid", - "renderer_module": "skills/lark-slides/scripts/artboard_renderer/templates/beautiful/creative-mode-grid.mjs", - "golden_spec": "skills/lark-slides/scripts/fixtures/svglide_artboard/golden/creative-mode-grid.canvas-spec.json", - "reference_screenshot": "beautiful-html-templates/screenshots/creative-mode-1.png", - "fidelity_receipt": "skills/lark-slides/references/receipts/template-fidelity/creative-mode.creative-mode-grid.json", - "source_trace": [ - { - "source": "beautiful-html-templates/templates/creative-mode/template.html", - "evidence": "source_template_html" - }, - { - "source": "beautiful-html-templates/templates/creative-mode/design.md", - "evidence": "source_design_md" - }, - { - "source": "beautiful-html-templates/templates/creative-mode/template.json", - "evidence": "source_template_json" - }, - { - "source": "beautiful-html-templates/screenshots/creative-mode-1.png", - "evidence": "reference_screenshot" - }, - { - "source": "skills/lark-slides/references/absorptions/beautiful-html-templates/creative-mode.creative-mode-grid.json", - "evidence": "absorption_record" - }, - { - "source": "skills/lark-slides/references/receipts/template-fidelity/creative-mode.creative-mode-grid.json", - "evidence": "template_fidelity_receipt" - } - ], "visual_contract": { - "path": "skills/lark-slides/references/visual-contracts/beautiful/creative-mode.creative-mode-grid.json", - "layout_rhythm": "creative-mode: medium-high density, medium formality. Cream paper canvas with confident multi-color (green, pink, orange, yellow) accents and Archivo Black display.", + "do_not_simplify": [ + "preserve_fonts_palette_grid_slide_classes_decorative_elements", + "do_not_recolor_without_explicit_brand_override", + "do_not_mix_template_families", + "extend_missing_layout_inside_same_family", + "do_not_strip_identity_decorations", + "new_palette", + "cross_family_components", + "fake_italic", + "new_decorative_motif", + "remote_font_dependency", + "do_not_replace_family_with_generic_card_shell", + "do_not_mark_production_without_renderer_golden_fidelity_receipt", + "do_not_strip_identity_decorations", + "do_not_recolor_without_explicit_brand_override" + ], + "layout_rhythm": "coral: medium density, medium formality. Cream and coral on near-black, set in oversized Bebas Neue.", "motifs": [ "grid", "accent line", @@ -8474,53 +8888,29 @@ "surface", "text" ], - "do_not_simplify": [ - "preserve_fonts_palette_grid_slide_classes_decorative_elements", - "do_not_recolor_without_explicit_brand_override", - "do_not_mix_template_families", - "extend_missing_layout_inside_same_family", - "do_not_strip_identity_decorations", - "new_palette", - "cross_family_components", - "fake_italic", - "new_decorative_motif", - "remote_font_dependency", - "do_not_replace_family_with_generic_card_shell", - "do_not_mark_production_without_renderer_golden_fidelity_receipt", - "do_not_strip_identity_decorations", - "do_not_recolor_without_explicit_brand_override" - ] + "path": "skills/lark-slides/references/visual-contracts/beautiful/coral.coral-magazine-feature.json" }, - "fidelity_gate": { - "status": "passed", - "score": 0.9409, - "threshold": 0.72, - "reference_screenshot": "/Users/bytedance/bd-projects/beautiful-html-templates/screenshots/creative-mode-1.png", - "render_screenshot": "/Users/bytedance/bd-projects/workspaces/SVGlide/.worktrees/cli-svglide-svg-private/skills/lark-slides/scripts/fixtures/svglide_artboard/golden/creative-mode-grid.preview.png", - "receipt_path": "skills/lark-slides/references/receipts/template-fidelity/creative-mode.creative-mode-grid.json", - "issues": [] - }, - "promotion_status": "needs_review", - "default_selectable": false, + "visual_contract_path": "skills/lark-slides/references/visual-contracts/beautiful/coral.coral-magazine-feature.json" + }, + { "blocking_issues": [ "selector_gate_missing", "quality_gate_integration_pending", "production_review_pending" ], - "visual_contract_path": "skills/lark-slides/references/visual-contracts/beautiful/creative-mode.creative-mode-grid.json", - "planned_renderer_module": "skills/lark-slides/scripts/artboard_renderer/templates/beautiful/creative-mode-grid.mjs", - "planned_golden_spec": "skills/lark-slides/scripts/fixtures/svglide_artboard/golden/creative-mode-grid.canvas-spec.json", - "planned_fidelity_receipt": "skills/lark-slides/references/receipts/template-fidelity/creative-mode.creative-mode-grid.json", + "default_selectable": false, + "family_id": "creative-mode", + "fidelity_gate": { + "issues": [], + "receipt_path": "skills/lark-slides/references/receipts/template-fidelity/creative-mode.creative-mode-grid.json", + "reference_screenshot": "/Users/bytedance/bd-projects/beautiful-html-templates/screenshots/creative-mode-1.png", + "render_screenshot": "/Users/bytedance/bd-projects/workspaces/SVGlide/.worktrees/cli-svglide-svg-private/skills/lark-slides/scripts/fixtures/svglide_artboard/golden/creative-mode-grid.preview.png", + "score": 0.9409, + "status": "passed", + "threshold": 0.72 + }, + "fidelity_receipt": "skills/lark-slides/references/receipts/template-fidelity/creative-mode.creative-mode-grid.json", "font_strategy": { - "source_fonts": [ - "Archivo Black", - "Space Grotesk", - "JetBrains Mono" - ], - "slide_native_preferred": [ - "system-sans-cjk", - "system-mono" - ], "adobe_or_embedded_fallback": [ "Source Sans Pro", "Source Code Pro", @@ -8528,59 +8918,17 @@ "思源等宽" ], "cjk_fallback": "Noto Serif SC", - "role_mapping": { - "display": { - "source_font": "Archivo Black", - "slide_font": "Source Sans Pro", - "runtime_alias": "SVGlideDisplay", - "cjk_font": "思源黑体", - "fallback_stack": [ - "system-sans-cjk", - "SVGlideDisplay" - ], - "source_only": false, - "requires_download": false, - "mapping_reason": "保留 Archivo Black 的语义角色,但运行时优先使用 Slide/系统可用的 Source Sans Pro 与 思源黑体。" - }, - "body": { - "source_font": "Space Grotesk", - "slide_font": "Source Sans Pro", - "runtime_alias": "SVGlideBody", - "cjk_font": "思源黑体", - "fallback_stack": [ - "system-sans-cjk", - "SVGlideBody" - ], - "source_only": false, - "requires_download": false, - "mapping_reason": "保留 Space Grotesk 的语义角色,但运行时优先使用 Slide/系统可用的 Source Sans Pro 与 思源黑体。" - }, - "label": { - "source_font": "JetBrains Mono", - "slide_font": "Source Code Pro", - "runtime_alias": "SVGlideLabel", - "cjk_font": "思源等宽", - "fallback_stack": [ - "system-mono", - "SVGlideLabel" - ], - "source_only": false, - "requires_download": false, - "mapping_reason": "保留 JetBrains Mono 的语义角色,但运行时优先使用 Slide/系统可用的 Source Code Pro 与 思源等宽。" - }, - "metric": { - "source_font": "JetBrains Mono", - "slide_font": "Source Code Pro", - "runtime_alias": "SVGlideMetric", - "cjk_font": "思源等宽", - "fallback_stack": [ - "system-mono", - "SVGlideMetric" - ], - "source_only": false, - "requires_download": false, - "mapping_reason": "保留 JetBrains Mono 的语义角色,但运行时优先使用 Slide/系统可用的 Source Code Pro 与 思源等宽。" - } + "extraction_confidence": { + "adobe_or_embedded_fallback": "inferred_from_layout", + "cjk_fallback": "inferred_from_layout", + "forbidden": "inferred_from_layout", + "mapping_reason": "inferred_from_layout", + "role_mapping.body": "inferred_from_layout", + "role_mapping.display": "inferred_from_layout", + "role_mapping.label": "inferred_from_layout", + "role_mapping.metric": "inferred_from_layout", + "slide_native_preferred": "inferred_from_layout", + "source_fonts": "css_extracted_from_template_html" }, "forbidden": [ "remote_font_runtime_dependency", @@ -8589,118 +8937,641 @@ "drop_cjk_fallback" ], "mapping_reason": "根据 design.md/template.html/template.json 中的 font-family 与 typography token 提取源字体;运行时按 Slide/系统/Adobe/思源可用字体降级。", + "role_mapping": { + "body": { + "cjk_font": "思源黑体", + "fallback_stack": [ + "system-sans-cjk", + "SVGlideBody" + ], + "mapping_reason": "保留 Space Grotesk 的语义角色,但运行时优先使用 Slide/系统可用的 Source Sans Pro 与 思源黑体。", + "requires_download": false, + "runtime_alias": "SVGlideBody", + "slide_font": "Source Sans Pro", + "source_font": "Space Grotesk", + "source_only": false + }, + "display": { + "cjk_font": "思源黑体", + "fallback_stack": [ + "system-sans-cjk", + "SVGlideDisplay" + ], + "mapping_reason": "保留 Archivo Black 的语义角色,但运行时优先使用 Slide/系统可用的 Source Sans Pro 与 思源黑体。", + "requires_download": false, + "runtime_alias": "SVGlideDisplay", + "slide_font": "Source Sans Pro", + "source_font": "Archivo Black", + "source_only": false + }, + "label": { + "cjk_font": "思源等宽", + "fallback_stack": [ + "system-mono", + "SVGlideLabel" + ], + "mapping_reason": "保留 JetBrains Mono 的语义角色,但运行时优先使用 Slide/系统可用的 Source Code Pro 与 思源等宽。", + "requires_download": false, + "runtime_alias": "SVGlideLabel", + "slide_font": "Source Code Pro", + "source_font": "JetBrains Mono", + "source_only": false + }, + "metric": { + "cjk_font": "思源等宽", + "fallback_stack": [ + "system-mono", + "SVGlideMetric" + ], + "mapping_reason": "保留 JetBrains Mono 的语义角色,但运行时优先使用 Slide/系统可用的 Source Code Pro 与 思源等宽。", + "requires_download": false, + "runtime_alias": "SVGlideMetric", + "slide_font": "Source Code Pro", + "source_font": "JetBrains Mono", + "source_only": false + } + }, + "slide_native_preferred": [ + "system-sans-cjk", + "system-mono" + ], "source_evidence": [ "beautiful-html-templates/templates/creative-mode/design.md", "beautiful-html-templates/templates/creative-mode/template.html", "beautiful-html-templates/templates/creative-mode/template.json", "beautiful-html-templates/screenshots/creative-mode-1.png" ], - "extraction_confidence": { - "role_mapping.body": "inferred_from_layout", - "role_mapping.display": "inferred_from_layout", - "source_fonts": "css_extracted_from_template_html", - "adobe_or_embedded_fallback": "inferred_from_layout", - "cjk_fallback": "inferred_from_layout", - "role_mapping.metric": "inferred_from_layout", - "forbidden": "inferred_from_layout", - "slide_native_preferred": "inferred_from_layout", - "mapping_reason": "inferred_from_layout", - "role_mapping.label": "inferred_from_layout" - }, + "source_fonts": [ + "Archivo Black", + "Space Grotesk", + "JetBrains Mono" + ], "source_refs": { - "role_mapping.body": [ - { - "path": "beautiful-html-templates/templates/creative-mode/template.html", - "selector_or_token": "role_mapping.body.source_font", - "raw_value": "Space Grotesk" - }, - { - "path": "beautiful-html-templates/templates/creative-mode/design.md", - "selector_or_token": "design.typography.roles", - "raw_value": "pink: \"#F06CA8\" pink-dark: \"#D14E8B\" orange: \"#E85A1F\" yellow: \"#F5C518\" typography: display-jumbo: fontFamily: \"Archivo Black, sans-serif\" fontSize: 220px fontWeight: 400 lineHeight: 0.92 letterSpacing: -0.01em textTransform: uppercase display-hero: fontFamily" - } - ], - "role_mapping.display": [ - { - "path": "beautiful-html-templates/templates/creative-mode/template.html", - "selector_or_token": "role_mapping.display.source_font", - "raw_value": "Archivo Black" - }, - { - "path": "beautiful-html-templates/templates/creative-mode/design.md", - "selector_or_token": "design.typography.roles", - "raw_value": "pink: \"#F06CA8\" pink-dark: \"#D14E8B\" orange: \"#E85A1F\" yellow: \"#F5C518\" typography: display-jumbo: fontFamily: \"Archivo Black, sans-serif\" fontSize: 220px fontWeight: 400 lineHeight: 0.92 letterSpacing: -0.01em textTransform: uppercase display-hero: fontFamily" - } - ], - "source_fonts": [ - { - "path": "beautiful-html-templates/templates/creative-mode/template.html", - "selector_or_token": "css.font-family", - "raw_value": "\"Space Grotesk\", system-ui, sans-serif; \"Archivo Black\", sans-serif; \"JetBrains Mono\", monospace; \"Space Grotesk\", sans-serif; \"Archivo Black\"; \"JetBrains Mono\"" - } - ], "adobe_or_embedded_fallback": [ { "path": "beautiful-html-templates/templates/creative-mode/template.html", - "selector_or_token": "css.font-family", - "raw_value": "\"Space Grotesk\", system-ui, sans-serif; \"Archivo Black\", sans-serif; \"JetBrains Mono\", monospace; \"Space Grotesk\", sans-serif; \"Archivo Black\"; \"JetBrains Mono\"" + "raw_value": "\"Space Grotesk\", system-ui, sans-serif; \"Archivo Black\", sans-serif; \"JetBrains Mono\", monospace; \"Space Grotesk\", sans-serif; \"Archivo Black\"; \"JetBrains Mono\"", + "selector_or_token": "css.font-family" } ], "cjk_fallback": [ { "path": "beautiful-html-templates/templates/creative-mode/template.html", - "selector_or_token": "css.font-family", - "raw_value": "\"Space Grotesk\", system-ui, sans-serif; \"Archivo Black\", sans-serif; \"JetBrains Mono\", monospace; \"Space Grotesk\", sans-serif; \"Archivo Black\"; \"JetBrains Mono\"" - } - ], - "role_mapping.metric": [ - { - "path": "beautiful-html-templates/templates/creative-mode/template.html", - "selector_or_token": "role_mapping.metric.source_font", - "raw_value": "JetBrains Mono" - }, - { - "path": "beautiful-html-templates/templates/creative-mode/design.md", - "selector_or_token": "design.typography.roles", - "raw_value": "pink: \"#F06CA8\" pink-dark: \"#D14E8B\" orange: \"#E85A1F\" yellow: \"#F5C518\" typography: display-jumbo: fontFamily: \"Archivo Black, sans-serif\" fontSize: 220px fontWeight: 400 lineHeight: 0.92 letterSpacing: -0.01em textTransform: uppercase display-hero: fontFamily" + "raw_value": "\"Space Grotesk\", system-ui, sans-serif; \"Archivo Black\", sans-serif; \"JetBrains Mono\", monospace; \"Space Grotesk\", sans-serif; \"Archivo Black\"; \"JetBrains Mono\"", + "selector_or_token": "css.font-family" } ], "forbidden": [ { "path": "beautiful-html-templates/templates/creative-mode/template.html", - "selector_or_token": "css.font-family", - "raw_value": "\"Space Grotesk\", system-ui, sans-serif; \"Archivo Black\", sans-serif; \"JetBrains Mono\", monospace; \"Space Grotesk\", sans-serif; \"Archivo Black\"; \"JetBrains Mono\"" - } - ], - "slide_native_preferred": [ - { - "path": "beautiful-html-templates/templates/creative-mode/template.html", - "selector_or_token": "css.font-family", - "raw_value": "\"Space Grotesk\", system-ui, sans-serif; \"Archivo Black\", sans-serif; \"JetBrains Mono\", monospace; \"Space Grotesk\", sans-serif; \"Archivo Black\"; \"JetBrains Mono\"" + "raw_value": "\"Space Grotesk\", system-ui, sans-serif; \"Archivo Black\", sans-serif; \"JetBrains Mono\", monospace; \"Space Grotesk\", sans-serif; \"Archivo Black\"; \"JetBrains Mono\"", + "selector_or_token": "css.font-family" } ], "mapping_reason": [ { "path": "beautiful-html-templates/templates/creative-mode/template.html", - "selector_or_token": "css.font-family", - "raw_value": "\"Space Grotesk\", system-ui, sans-serif; \"Archivo Black\", sans-serif; \"JetBrains Mono\", monospace; \"Space Grotesk\", sans-serif; \"Archivo Black\"; \"JetBrains Mono\"" + "raw_value": "\"Space Grotesk\", system-ui, sans-serif; \"Archivo Black\", sans-serif; \"JetBrains Mono\", monospace; \"Space Grotesk\", sans-serif; \"Archivo Black\"; \"JetBrains Mono\"", + "selector_or_token": "css.font-family" + } + ], + "role_mapping.body": [ + { + "path": "beautiful-html-templates/templates/creative-mode/template.html", + "raw_value": "Space Grotesk", + "selector_or_token": "role_mapping.body.source_font" + }, + { + "path": "beautiful-html-templates/templates/creative-mode/design.md", + "raw_value": "pink: \"#F06CA8\" pink-dark: \"#D14E8B\" orange: \"#E85A1F\" yellow: \"#F5C518\" typography: display-jumbo: fontFamily: \"Archivo Black, sans-serif\" fontSize: 220px fontWeight: 400 lineHeight: 0.92 letterSpacing: -0.01em textTransform: uppercase display-hero: fontFamily", + "selector_or_token": "design.typography.roles" + } + ], + "role_mapping.display": [ + { + "path": "beautiful-html-templates/templates/creative-mode/template.html", + "raw_value": "Archivo Black", + "selector_or_token": "role_mapping.display.source_font" + }, + { + "path": "beautiful-html-templates/templates/creative-mode/design.md", + "raw_value": "pink: \"#F06CA8\" pink-dark: \"#D14E8B\" orange: \"#E85A1F\" yellow: \"#F5C518\" typography: display-jumbo: fontFamily: \"Archivo Black, sans-serif\" fontSize: 220px fontWeight: 400 lineHeight: 0.92 letterSpacing: -0.01em textTransform: uppercase display-hero: fontFamily", + "selector_or_token": "design.typography.roles" } ], "role_mapping.label": [ { "path": "beautiful-html-templates/templates/creative-mode/template.html", - "selector_or_token": "role_mapping.label.source_font", - "raw_value": "JetBrains Mono" + "raw_value": "JetBrains Mono", + "selector_or_token": "role_mapping.label.source_font" }, { "path": "beautiful-html-templates/templates/creative-mode/design.md", - "selector_or_token": "design.typography.roles", - "raw_value": "pink: \"#F06CA8\" pink-dark: \"#D14E8B\" orange: \"#E85A1F\" yellow: \"#F5C518\" typography: display-jumbo: fontFamily: \"Archivo Black, sans-serif\" fontSize: 220px fontWeight: 400 lineHeight: 0.92 letterSpacing: -0.01em textTransform: uppercase display-hero: fontFamily" + "raw_value": "pink: \"#F06CA8\" pink-dark: \"#D14E8B\" orange: \"#E85A1F\" yellow: \"#F5C518\" typography: display-jumbo: fontFamily: \"Archivo Black, sans-serif\" fontSize: 220px fontWeight: 400 lineHeight: 0.92 letterSpacing: -0.01em textTransform: uppercase display-hero: fontFamily", + "selector_or_token": "design.typography.roles" + } + ], + "role_mapping.metric": [ + { + "path": "beautiful-html-templates/templates/creative-mode/template.html", + "raw_value": "JetBrains Mono", + "selector_or_token": "role_mapping.metric.source_font" + }, + { + "path": "beautiful-html-templates/templates/creative-mode/design.md", + "raw_value": "pink: \"#F06CA8\" pink-dark: \"#D14E8B\" orange: \"#E85A1F\" yellow: \"#F5C518\" typography: display-jumbo: fontFamily: \"Archivo Black, sans-serif\" fontSize: 220px fontWeight: 400 lineHeight: 0.92 letterSpacing: -0.01em textTransform: uppercase display-hero: fontFamily", + "selector_or_token": "design.typography.roles" + } + ], + "slide_native_preferred": [ + { + "path": "beautiful-html-templates/templates/creative-mode/template.html", + "raw_value": "\"Space Grotesk\", system-ui, sans-serif; \"Archivo Black\", sans-serif; \"JetBrains Mono\", monospace; \"Space Grotesk\", sans-serif; \"Archivo Black\"; \"JetBrains Mono\"", + "selector_or_token": "css.font-family" + } + ], + "source_fonts": [ + { + "path": "beautiful-html-templates/templates/creative-mode/template.html", + "raw_value": "\"Space Grotesk\", system-ui, sans-serif; \"Archivo Black\", sans-serif; \"JetBrains Mono\", monospace; \"Space Grotesk\", sans-serif; \"Archivo Black\"; \"JetBrains Mono\"", + "selector_or_token": "css.font-family" } ] } }, + "golden_spec": "skills/lark-slides/scripts/fixtures/svglide_artboard/golden/creative-mode-grid.canvas-spec.json", + "implemented_page_variants": [ + "s1", + "s2", + "s3", + "s4", + "s5", + "s6", + "s7", + "s8" + ], + "loss_notes": [ + "italic is source-aware but CJK fake italic is forbidden; use color/weight fallback when unavailable", + "letter spacing is preserved for Latin labels and reset/softened for CJK" + ], + "page_family_smoke_deck": "skills/lark-slides/references/page-family-smoke-decks/creative-mode.json", + "page_family_smoke_receipt": "skills/lark-slides/references/receipts/page-family-smoke/creative-mode.creative-mode-grid.json", + "page_family_source": { + "claim_boundary": "source extraction only; does not imply renderer, fidelity, quality gate, or production/default selectable status", + "extractor": "skills/lark-slides/scripts/beautiful_template_page_family_extract.py", + "source_design_md": "beautiful-html-templates/templates/creative-mode/design.md", + "source_template_html": "beautiful-html-templates/templates/creative-mode/template.html", + "source_template_json": "beautiful-html-templates/templates/creative-mode/template.json" + }, + "page_variant_count": 8, + "page_variant_golden_specs": { + "s1": "skills/lark-slides/scripts/fixtures/svglide_artboard/golden/creative-mode.s1.canvas-spec.json", + "s2": "skills/lark-slides/scripts/fixtures/svglide_artboard/golden/creative-mode.s2.canvas-spec.json", + "s3": "skills/lark-slides/scripts/fixtures/svglide_artboard/golden/creative-mode.s3.canvas-spec.json", + "s4": "skills/lark-slides/scripts/fixtures/svglide_artboard/golden/creative-mode.s4.canvas-spec.json", + "s5": "skills/lark-slides/scripts/fixtures/svglide_artboard/golden/creative-mode.s5.canvas-spec.json", + "s6": "skills/lark-slides/scripts/fixtures/svglide_artboard/golden/creative-mode.s6.canvas-spec.json", + "s7": "skills/lark-slides/scripts/fixtures/svglide_artboard/golden/creative-mode.s7.canvas-spec.json", + "s8": "skills/lark-slides/scripts/fixtures/svglide_artboard/golden/creative-mode.s8.canvas-spec.json" + }, + "planned_fidelity_receipt": "skills/lark-slides/references/receipts/template-fidelity/creative-mode.creative-mode-grid.json", + "planned_golden_spec": "skills/lark-slides/scripts/fixtures/svglide_artboard/golden/creative-mode-grid.canvas-spec.json", + "planned_renderer_module": "skills/lark-slides/scripts/artboard_renderer/templates/beautiful/creative-mode-grid.mjs", + "promotion_status": "needs_review", + "reference_screenshot": "beautiful-html-templates/screenshots/creative-mode-1.png", + "renderer_id": "artboard_satori.creative-mode-grid", + "renderer_module": "skills/lark-slides/scripts/artboard_renderer/templates/beautiful/creative-mode-grid.mjs", + "runtime_template_id": "creative-mode-grid", + "satori": { + "font_and_typography_constraints": [ + "italic is source-aware but CJK fake italic is forbidden; use color/weight fallback when unavailable", + "letter spacing is preserved for Latin labels and reset/softened for CJK" + ] + }, + "source_design_md": "beautiful-html-templates/templates/creative-mode/design.md", + "source_page_variants": [ + "s1", + "s2", + "s3", + "s4", + "s5", + "s6", + "s7", + "s8" + ], + "source_template_html": "beautiful-html-templates/templates/creative-mode/template.html", + "source_template_json": "beautiful-html-templates/templates/creative-mode/template.json", + "source_trace": [ + { + "evidence": "source_template_html", + "source": "beautiful-html-templates/templates/creative-mode/template.html" + }, + { + "evidence": "source_design_md", + "source": "beautiful-html-templates/templates/creative-mode/design.md" + }, + { + "evidence": "source_template_json", + "source": "beautiful-html-templates/templates/creative-mode/template.json" + }, + { + "evidence": "reference_screenshot", + "source": "beautiful-html-templates/screenshots/creative-mode-1.png" + }, + { + "evidence": "absorption_record", + "source": "skills/lark-slides/references/absorptions/beautiful-html-templates/creative-mode.creative-mode-grid.json" + }, + { + "evidence": "template_fidelity_receipt", + "source": "skills/lark-slides/references/receipts/template-fidelity/creative-mode.creative-mode-grid.json" + } + ], + "template_id": "creative-mode-grid", + "text_style_strategy": { + "bold": { + "allowed_roles": [ + "display", + "label", + "metric" + ], + "mapped_weight": { + "display": 900, + "label": 700, + "metric": 900 + }, + "source_usage": "source uses heavy display/label weights" + }, + "emphasis": { + "color_shift": "use source accent color roles only", + "font_family_switch": "only switch between mapped display/body/label/metric roles from this family", + "style_shift": "italic only when source_usage requires and CJK fallback is safe", + "weight_shift": "increase one role step within font_weight_scale" + }, + "extraction_confidence": { + "bold": "inferred_from_layout", + "emphasis": "inferred_from_layout", + "forbidden": "inferred_from_layout", + "italic": "css_extracted_from_template_html", + "line_through": "absent_use_default", + "text_decoration_policy.line_through.color": "absent_use_default", + "text_decoration_policy.line_through.style": "absent_use_default", + "text_decoration_policy.line_through.thickness": "absent_use_default", + "text_decoration_policy.underline.color": "absent_use_default", + "text_decoration_policy.underline.style": "absent_use_default", + "text_decoration_policy.underline.thickness": "absent_use_default", + "underline": "absent_use_default" + }, + "forbidden": [ + "fake_cjk_italic", + "drop_source_text_transform", + "drop_source_letter_spacing_without_loss_note", + "use_cross_family_font_motif", + "remote_font_dependency_without_receipt" + ], + "italic": { + "fallback_when_unavailable": "use color_shift or weight_shift; do not fake CJK italic", + "loss_notes": "Satori/Slide may not provide exact Google italic face; record as visual approximation.", + "mapped_style": "latin_only_when_source_requires_else_normal", + "source_usage": "source uses italic/font-style or italic-family tokens" + }, + "line_through": { + "fallback_shape": "none", + "mapped_decoration": "none", + "source_usage": "not present in source; default no line-through" + }, + "source_refs": { + "bold": [ + { + "path": "beautiful-html-templates/templates/creative-mode/template.html", + "raw_value": "le:#0F0F0F; } html, body { margin:0; padding:0; background:#000; } body { font-family:\"Space Grotesk\", system-ui, sans-serif; color:var(--ink); } deck-stage > section{ width:1920px; height:1080px; background:var(--cream); color:var(--ink); position:relative; overflow:hid", + "selector_or_token": "template.css.typography" + } + ], + "emphasis": [ + { + "path": "beautiful-html-templates/templates/creative-mode/template.html", + "raw_value": "le:#0F0F0F; } html, body { margin:0; padding:0; background:#000; } body { font-family:\"Space Grotesk\", system-ui, sans-serif; color:var(--ink); } deck-stage > section{ width:1920px; height:1080px; background:var(--cream); color:var(--ink); position:relative; overflow:hid", + "selector_or_token": "template.css.typography" + } + ], + "forbidden": [ + { + "path": "beautiful-html-templates/templates/creative-mode/template.html", + "raw_value": "le:#0F0F0F; } html, body { margin:0; padding:0; background:#000; } body { font-family:\"Space Grotesk\", system-ui, sans-serif; color:var(--ink); } deck-stage > section{ width:1920px; height:1080px; background:var(--cream); color:var(--ink); position:relative; overflow:hid", + "selector_or_token": "template.css.typography" + } + ], + "italic": [ + { + "path": "beautiful-html-templates/templates/creative-mode/template.html", + "raw_value": "ut conflicts with the system's strict orthogonal rectangle geometry. NSC has no italic axis, but the system doesn't use italic anywhere — no loss. The mono chrome's \"technical spec\" voice is best preserved by keeping all JetBrains Mono content in Latin/digit and reserving NSC for headline and body r", + "selector_or_token": "css.font-style" + } + ] + }, + "text_decoration_policy": { + "line_through": { + "color": "currentColor", + "style": "none", + "thickness": "0px" + }, + "underline": { + "color": "currentColor", + "style": "none", + "thickness": "0px" + } + }, + "underline": { + "fallback_shape": "1px-3px rule or border accent when underline font rendering is unavailable", + "mapped_decoration": "native underline only for actual text-decoration source usage", + "source_usage": "not a dominant source motif" + } + }, "typography_strategy": { + "alignment": { + "fallback": "left/top aligned unless source screenshot is centered", + "primary": "follow source composition" + }, + "cjk_typography_adjustment": { + "body_font_cn": "Noto Serif SC", + "display_font_cn": "Noto Serif SC", + "italic_policy": "drop_italic", + "letter_spacing_policy": "reset_letter_spacing_for_cjk_keep_latin_labels", + "mixed_run_spacing": "pangu_spacing" + }, + "extraction_confidence": { + "alignment": "inferred_from_layout", + "cjk_typography_adjustment": "inferred_from_layout", + "font_size_scale": "css_extracted_from_template_html", + "font_weight_scale": "inferred_from_layout", + "hierarchy_ratio": "inferred_from_layout", + "letter_spacing_scale": "css_extracted_from_template_html", + "line_height_scale": "css_extracted_from_template_html", + "mapping_reason": "inferred_from_layout", + "max_lines": "inferred_from_layout", + "measure": "inferred_from_layout", + "paragraph_spacing": "css_extracted_from_template_html", + "role_mapping.body": "inferred_from_layout", + "role_mapping.display": "inferred_from_layout", + "role_mapping.label": "inferred_from_layout", + "role_mapping.metric": "inferred_from_layout", + "source_typography_tokens": "css_extracted_from_template_html", + "text_direction": "css_extracted_from_template_html", + "text_transform_policy": "css_extracted_from_template_html", + "word_spacing": "absent_use_default", + "wrapping_policy": "inferred_from_layout", + "writing_mode": "absent_use_default" + }, + "font_size_scale": { + "body": 18, + "display": 54, + "label": 10, + "metric": 42 + }, + "font_weight_scale": { + "body": 400, + "display": 900, + "label": 700, + "metric": 900 + }, + "hierarchy_ratio": 3.0, + "letter_spacing_scale": { + "body": 0, + "display": 0, + "label": 0.08, + "metric": 0 + }, + "line_height_scale": { + "body": 1.32, + "display": 0.9, + "label": 1.05, + "metric": 0.95 + }, + "mapping_reason": "按源模板字号/字重/行高/字距/大小写规则抽象到 960x540 Slide 画布的四个文本角色。", + "max_lines": { + "body": 5, + "display": 3, + "label": 1, + "metric": 2 + }, + "measure": { + "body": "40-70 characters or CJK equivalent", + "display": "0.55-0.78 canvas width", + "label": "short mono labels", + "metric": "short numeric/stat blocks" + }, + "paragraph_spacing": { + "body_after": 12, + "display_after": 0, + "label_after": 0, + "metric_after": 0 + }, + "role_mapping": { + "body": { + "alignment": "source_layout_dependent", + "font_role": "body", + "font_size": 18, + "font_weight": 400, + "letter_spacing": 0, + "line_height": 1.32, + "max_lines": 5, + "runtime_alias": "SVGlideBody", + "source_font": "Space Grotesk", + "text_transform": "preserve_source_case" + }, + "display": { + "alignment": "source_layout_dependent", + "font_role": "display", + "font_size": 54, + "font_weight": 900, + "letter_spacing": 0, + "line_height": 0.9, + "max_lines": 3, + "runtime_alias": "SVGlideDisplay", + "source_font": "Archivo Black", + "text_transform": "latin_uppercase_only" + }, + "label": { + "alignment": "source_layout_dependent", + "font_role": "label", + "font_size": 10, + "font_weight": 700, + "letter_spacing": 0.08, + "line_height": 1.05, + "max_lines": 1, + "runtime_alias": "SVGlideLabel", + "source_font": "JetBrains Mono", + "text_transform": "latin_uppercase_labels_reset_cjk_spacing" + }, + "metric": { + "alignment": "source_layout_dependent", + "font_role": "metric", + "font_size": 42, + "font_weight": 900, + "letter_spacing": 0, + "line_height": 0.95, + "max_lines": 2, + "runtime_alias": "SVGlideMetric", + "source_font": "JetBrains Mono", + "text_transform": "preserve_numbers_and_units" + } + }, + "source_refs": { + "alignment": [ + { + "path": "beautiful-html-templates/templates/creative-mode/template.html", + "raw_value": "le:#0F0F0F; } html, body { margin:0; padding:0; background:#000; } body { font-family:\"Space Grotesk\", system-ui, sans-serif; color:var(--ink); } deck-stage > section{ width:1920px; height:1080px; background:var(--cream); color:var(--ink); position:relative; overflow:hid", + "selector_or_token": "template.css.typography" + } + ], + "cjk_typography_adjustment": [ + { + "path": "beautiful-html-templates/templates/creative-mode/template.html", + "raw_value": "le:#0F0F0F; } html, body { margin:0; padding:0; background:#000; } body { font-family:\"Space Grotesk\", system-ui, sans-serif; color:var(--ink); } deck-stage > section{ width:1920px; height:1080px; background:var(--cream); color:var(--ink); position:relative; overflow:hid", + "selector_or_token": "template.css.typography" + } + ], + "font_size_scale": [ + { + "path": "beautiful-html-templates/templates/creative-mode/template.html", + "raw_value": "24px; 160px; 32px; 140px; 28px; 46px; 72px; 96px; 100px; 84px; 30px; 34px; 220px; 64px", + "selector_or_token": "css.font_size_scale" + } + ], + "font_weight_scale": [ + { + "path": "beautiful-html-templates/templates/creative-mode/template.html", + "raw_value": "le:#0F0F0F; } html, body { margin:0; padding:0; background:#000; } body { font-family:\"Space Grotesk\", system-ui, sans-serif; color:var(--ink); } deck-stage > section{ width:1920px; height:1080px; background:var(--cream); color:var(--ink); position:relative; overflow:hid", + "selector_or_token": "template.css.typography" + } + ], + "hierarchy_ratio": [ + { + "path": "beautiful-html-templates/templates/creative-mode/template.html", + "raw_value": "le:#0F0F0F; } html, body { margin:0; padding:0; background:#000; } body { font-family:\"Space Grotesk\", system-ui, sans-serif; color:var(--ink); } deck-stage > section{ width:1920px; height:1080px; background:var(--cream); color:var(--ink); position:relative; overflow:hid", + "selector_or_token": "template.css.typography" + } + ], + "letter_spacing_scale": [ + { + "path": "beautiful-html-templates/templates/creative-mode/template.html", + "raw_value": "-.01em; .06em; .08em; .16em; .14em; .12em; .1em", + "selector_or_token": "css.letter_spacing_scale" + } + ], + "line_height_scale": [ + { + "path": "beautiful-html-templates/templates/creative-mode/template.html", + "raw_value": ".92; 1.4; .95; .9; 1.3; 1.45; .85; 1", + "selector_or_token": "css.line_height_scale" + } + ], + "mapping_reason": [ + { + "path": "beautiful-html-templates/templates/creative-mode/template.html", + "raw_value": "le:#0F0F0F; } html, body { margin:0; padding:0; background:#000; } body { font-family:\"Space Grotesk\", system-ui, sans-serif; color:var(--ink); } deck-stage > section{ width:1920px; height:1080px; background:var(--cream); color:var(--ink); position:relative; overflow:hid", + "selector_or_token": "template.css.typography" + } + ], + "max_lines": [ + { + "path": "beautiful-html-templates/templates/creative-mode/template.html", + "raw_value": "le:#0F0F0F; } html, body { margin:0; padding:0; background:#000; } body { font-family:\"Space Grotesk\", system-ui, sans-serif; color:var(--ink); } deck-stage > section{ width:1920px; height:1080px; background:var(--cream); color:var(--ink); position:relative; overflow:hid", + "selector_or_token": "template.css.typography" + } + ], + "measure": [ + { + "path": "beautiful-html-templates/templates/creative-mode/template.html", + "raw_value": "le:#0F0F0F; } html, body { margin:0; padding:0; background:#000; } body { font-family:\"Space Grotesk\", system-ui, sans-serif; color:var(--ink); } deck-stage > section{ width:1920px; height:1080px; background:var(--cream); color:var(--ink); position:relative; overflow:hid", + "selector_or_token": "template.css.typography" + } + ], + "paragraph_spacing": [ + { + "path": "beautiful-html-templates/templates/creative-mode/template.html", + "raw_value": "10px; 28px cell-pad: 32px step-pad: 28px topbar-top: 48px meta-bottom: 40px table-cell-pad: 18px 26px canvas: width: 1920px height: 1080px components: slide-chrome: topbar: fontFamily: \"JetBrains Mono, monospace\" fontSize: 24px letterSpacing: 0.08em textTransform: uppercase position: absolute left: 64px right: 64px top: 48px topbar-pill: border: \"2px solid {colors.ink; 28px; 18px; 16px; 36px; 14px; 10px", + "selector_or_token": "css.paragraph_spacing" + } + ], + "role_mapping.body": [ + { + "path": "beautiful-html-templates/templates/creative-mode/template.html", + "raw_value": "Space Grotesk", + "selector_or_token": "role_mapping.body.source_font" + }, + { + "path": "beautiful-html-templates/templates/creative-mode/design.md", + "raw_value": "pink: \"#F06CA8\" pink-dark: \"#D14E8B\" orange: \"#E85A1F\" yellow: \"#F5C518\" typography: display-jumbo: fontFamily: \"Archivo Black, sans-serif\" fontSize: 220px fontWeight: 400 lineHeight: 0.92 letterSpacing: -0.01em textTransform: uppercase display-hero: fontFamily", + "selector_or_token": "design.typography.roles" + } + ], + "role_mapping.display": [ + { + "path": "beautiful-html-templates/templates/creative-mode/template.html", + "raw_value": "Archivo Black", + "selector_or_token": "role_mapping.display.source_font" + }, + { + "path": "beautiful-html-templates/templates/creative-mode/design.md", + "raw_value": "pink: \"#F06CA8\" pink-dark: \"#D14E8B\" orange: \"#E85A1F\" yellow: \"#F5C518\" typography: display-jumbo: fontFamily: \"Archivo Black, sans-serif\" fontSize: 220px fontWeight: 400 lineHeight: 0.92 letterSpacing: -0.01em textTransform: uppercase display-hero: fontFamily", + "selector_or_token": "design.typography.roles" + } + ], + "role_mapping.label": [ + { + "path": "beautiful-html-templates/templates/creative-mode/template.html", + "raw_value": "JetBrains Mono", + "selector_or_token": "role_mapping.label.source_font" + }, + { + "path": "beautiful-html-templates/templates/creative-mode/design.md", + "raw_value": "pink: \"#F06CA8\" pink-dark: \"#D14E8B\" orange: \"#E85A1F\" yellow: \"#F5C518\" typography: display-jumbo: fontFamily: \"Archivo Black, sans-serif\" fontSize: 220px fontWeight: 400 lineHeight: 0.92 letterSpacing: -0.01em textTransform: uppercase display-hero: fontFamily", + "selector_or_token": "design.typography.roles" + } + ], + "role_mapping.metric": [ + { + "path": "beautiful-html-templates/templates/creative-mode/template.html", + "raw_value": "JetBrains Mono", + "selector_or_token": "role_mapping.metric.source_font" + }, + { + "path": "beautiful-html-templates/templates/creative-mode/design.md", + "raw_value": "pink: \"#F06CA8\" pink-dark: \"#D14E8B\" orange: \"#E85A1F\" yellow: \"#F5C518\" typography: display-jumbo: fontFamily: \"Archivo Black, sans-serif\" fontSize: 220px fontWeight: 400 lineHeight: 0.92 letterSpacing: -0.01em textTransform: uppercase display-hero: fontFamily", + "selector_or_token": "design.typography.roles" + } + ], + "source_typography_tokens": [ + { + "path": "beautiful-html-templates/templates/creative-mode/template.html", + "raw_value": "24px; 160px; 32px; 140px; 28px; 46px; 72px; 96px; 100px; 84px; 30px; 34px; 220px; 64px; .92; 1.4; .95; .9; 1.3; 1.45; .85; 1; -.01em; .06em; .08em; .16em; .14em; .12em; .1em; uppercase` on any display/label/mono when content is Hanzi — Chinese has no case; uppercase` and the -0.01em tracking when content switches to Chinese — NSC 900 stands on size and color alone. JetBrains Mono chrome (topbar pill, slide-meta, axis ticks, kicker block) intentionally stays Latin/digit-only: render `04 / 08` sli", + "selector_or_token": "css.source_typography_tokens" + } + ], + "text_direction": [ + { + "path": "beautiful-html-templates/templates/creative-mode/template.html", + "raw_value": "column; column-reverse", + "selector_or_token": "css.text_direction" + } + ], + "text_transform_policy": [ + { + "path": "beautiful-html-templates/templates/creative-mode/template.html", + "raw_value": "uppercase` on any display/label/mono when content is Hanzi — Chinese has no case; uppercase` and the -0.01em tracking when content switches to Chinese — NSC 900 stands on size and color alone. JetBrains Mono chrome (topbar pill, slide-meta, axis ticks, kicker block) intentionally stays Latin/digit-only: render `04 / 08` slide counters in mono, but render any Chinese descriptor label in NSC 400 inside the meta footer. The four accents (green / pink / orange / yellow), stat-cell color blocks, tabl", + "selector_or_token": "css.text_transform_policy" + } + ], + "wrapping_policy": [ + { + "path": "beautiful-html-templates/templates/creative-mode/template.html", + "raw_value": "le:#0F0F0F; } html, body { margin:0; padding:0; background:#000; } body { font-family:\"Space Grotesk\", system-ui, sans-serif; color:var(--ink); } deck-stage > section{ width:1920px; height:1080px; background:var(--cream); color:var(--ink); position:relative; overflow:hid", + "selector_or_token": "template.css.typography" + } + ] + }, "source_typography_tokens": { "font_families": [ "Archivo Black", @@ -8722,18 +9593,6 @@ "font_weight": [ "400" ], - "line_height": [ - "0.92", - "0.95", - "0.9", - "0.85", - "1.0", - "1.4", - "1.3", - ".92", - ".95", - ".9" - ], "letter_spacing": [ "-0.01em", "0", @@ -8746,12 +9605,18 @@ ".08em", ".16em" ], - "text_transform": [ - "uppercase", - "uppercase` on any display/label/mono when content is Hanzi — Chinese has no case", - "uppercase` and the -0.01em tracking when content switches to Chinese — NSC 900 stands on size and color alone. JetBrains Mono chrome (topbar pill, slide-meta, axis ticks, kicker block) intentionally stays Latin/digit-only: render `04 / 08` slide counters in mono, but render any Chinese descriptor label in NSC 400 inside the meta footer. The four accents (green / pink / orange / yellow), stat-cell color blocks, table treatment, and decorative geometry (stamp, badge, stacked blocks) are all content-agnostic." + "line_height": [ + "0.92", + "0.95", + "0.9", + "0.85", + "1.0", + "1.4", + "1.3", + ".92", + ".95", + ".9" ], - "word_spacing": [], "paragraph_spacing": [ "10px", "28px cell-pad: 32px step-pad: 28px topbar-top: 48px meta-bottom: 40px table-cell-pad: 18px 26px canvas: width: 1920px height: 1080px components: slide-chrome: topbar: fontFamily: \"JetBrains Mono, monospace\" fontSize: 24px letterSpacing: 0.08em textTransform: uppercase position: absolute left: 64px right: 64px top: 48px topbar-pill: border: \"2px solid {colors.ink", @@ -8762,512 +9627,47 @@ "14px", "10px" ], + "text_decoration": [], "text_direction": [ "column", "column-reverse" ], - "writing_mode": [], - "text_decoration": [] + "text_transform": [ + "uppercase", + "uppercase` on any display/label/mono when content is Hanzi — Chinese has no case", + "uppercase` and the -0.01em tracking when content switches to Chinese — NSC 900 stands on size and color alone. JetBrains Mono chrome (topbar pill, slide-meta, axis ticks, kicker block) intentionally stays Latin/digit-only: render `04 / 08` slide counters in mono, but render any Chinese descriptor label in NSC 400 inside the meta footer. The four accents (green / pink / orange / yellow), stat-cell color blocks, table treatment, and decorative geometry (stamp, badge, stacked blocks) are all content-agnostic." + ], + "word_spacing": [], + "writing_mode": [] }, - "role_mapping": { - "display": { - "font_role": "display", - "source_font": "Archivo Black", - "runtime_alias": "SVGlideDisplay", - "font_size": 54, - "font_weight": 900, - "line_height": 0.9, - "letter_spacing": 0, - "text_transform": "latin_uppercase_only", - "max_lines": 3, - "alignment": "source_layout_dependent" - }, - "body": { - "font_role": "body", - "source_font": "Space Grotesk", - "runtime_alias": "SVGlideBody", - "font_size": 18, - "font_weight": 400, - "line_height": 1.32, - "letter_spacing": 0, - "text_transform": "preserve_source_case", - "max_lines": 5, - "alignment": "source_layout_dependent" - }, - "label": { - "font_role": "label", - "source_font": "JetBrains Mono", - "runtime_alias": "SVGlideLabel", - "font_size": 10, - "font_weight": 700, - "line_height": 1.05, - "letter_spacing": 0.08, - "text_transform": "latin_uppercase_labels_reset_cjk_spacing", - "max_lines": 1, - "alignment": "source_layout_dependent" - }, - "metric": { - "font_role": "metric", - "source_font": "JetBrains Mono", - "runtime_alias": "SVGlideMetric", - "font_size": 42, - "font_weight": 900, - "line_height": 0.95, - "letter_spacing": 0, - "text_transform": "preserve_numbers_and_units", - "max_lines": 2, - "alignment": "source_layout_dependent" - } - }, - "font_size_scale": { - "display": 54, - "body": 18, - "label": 10, - "metric": 42 - }, - "font_weight_scale": { - "display": 900, - "body": 400, - "label": 700, - "metric": 900 - }, - "line_height_scale": { - "display": 0.9, - "body": 1.32, - "label": 1.05, - "metric": 0.95 - }, - "letter_spacing_scale": { - "display": 0, - "body": 0, - "label": 0.08, - "metric": 0 + "text_direction": { + "cjk": "ltr", + "default": "column" }, "text_transform_policy": { - "display": "latin_uppercase_only", "body": "preserve_source_case", + "display": "latin_uppercase_only", "label": "latin_uppercase_labels_reset_cjk_spacing", "metric": "preserve_numbers_and_units" }, - "hierarchy_ratio": 3.0, - "max_lines": { - "display": 3, - "body": 5, - "label": 1, - "metric": 2 - }, - "measure": { - "display": "0.55-0.78 canvas width", - "body": "40-70 characters or CJK equivalent", - "label": "short mono labels", - "metric": "short numeric/stat blocks" - }, - "alignment": { - "primary": "follow source composition", - "fallback": "left/top aligned unless source screenshot is centered" - }, - "cjk_typography_adjustment": { - "display_font_cn": "Noto Serif SC", - "body_font_cn": "Noto Serif SC", - "letter_spacing_policy": "reset_letter_spacing_for_cjk_keep_latin_labels", - "mixed_run_spacing": "pangu_spacing", - "italic_policy": "drop_italic" - }, - "mapping_reason": "按源模板字号/字重/行高/字距/大小写规则抽象到 960x540 Slide 画布的四个文本角色。", "word_spacing": { - "display": 0, "body": 0, + "display": 0, "label": 0, "metric": 0 }, - "paragraph_spacing": { - "display_after": 0, - "body_after": 12, - "label_after": 0, - "metric_after": 0 - }, "wrapping_policy": { - "display": "manual_break_or_balance", "body": "wrap_with_measure", + "display": "manual_break_or_balance", "label": "no_wrap_preferred", "metric": "no_wrap_preferred" }, - "text_direction": { - "default": "column", - "cjk": "ltr" - }, "writing_mode": { "default": "horizontal-tb", "vertical_roles": [] - }, - "extraction_confidence": { - "role_mapping.body": "inferred_from_layout", - "role_mapping.display": "inferred_from_layout", - "font_size_scale": "css_extracted_from_template_html", - "max_lines": "inferred_from_layout", - "writing_mode": "absent_use_default", - "text_direction": "css_extracted_from_template_html", - "alignment": "inferred_from_layout", - "role_mapping.label": "inferred_from_layout", - "paragraph_spacing": "css_extracted_from_template_html", - "text_transform_policy": "css_extracted_from_template_html", - "line_height_scale": "css_extracted_from_template_html", - "wrapping_policy": "inferred_from_layout", - "font_weight_scale": "inferred_from_layout", - "source_typography_tokens": "css_extracted_from_template_html", - "word_spacing": "absent_use_default", - "role_mapping.metric": "inferred_from_layout", - "cjk_typography_adjustment": "inferred_from_layout", - "hierarchy_ratio": "inferred_from_layout", - "measure": "inferred_from_layout", - "mapping_reason": "inferred_from_layout", - "letter_spacing_scale": "css_extracted_from_template_html" - }, - "source_refs": { - "role_mapping.body": [ - { - "path": "beautiful-html-templates/templates/creative-mode/template.html", - "selector_or_token": "role_mapping.body.source_font", - "raw_value": "Space Grotesk" - }, - { - "path": "beautiful-html-templates/templates/creative-mode/design.md", - "selector_or_token": "design.typography.roles", - "raw_value": "pink: \"#F06CA8\" pink-dark: \"#D14E8B\" orange: \"#E85A1F\" yellow: \"#F5C518\" typography: display-jumbo: fontFamily: \"Archivo Black, sans-serif\" fontSize: 220px fontWeight: 400 lineHeight: 0.92 letterSpacing: -0.01em textTransform: uppercase display-hero: fontFamily" - } - ], - "role_mapping.display": [ - { - "path": "beautiful-html-templates/templates/creative-mode/template.html", - "selector_or_token": "role_mapping.display.source_font", - "raw_value": "Archivo Black" - }, - { - "path": "beautiful-html-templates/templates/creative-mode/design.md", - "selector_or_token": "design.typography.roles", - "raw_value": "pink: \"#F06CA8\" pink-dark: \"#D14E8B\" orange: \"#E85A1F\" yellow: \"#F5C518\" typography: display-jumbo: fontFamily: \"Archivo Black, sans-serif\" fontSize: 220px fontWeight: 400 lineHeight: 0.92 letterSpacing: -0.01em textTransform: uppercase display-hero: fontFamily" - } - ], - "font_size_scale": [ - { - "path": "beautiful-html-templates/templates/creative-mode/template.html", - "selector_or_token": "css.font_size_scale", - "raw_value": "24px; 160px; 32px; 140px; 28px; 46px; 72px; 96px; 100px; 84px; 30px; 34px; 220px; 64px" - } - ], - "max_lines": [ - { - "path": "beautiful-html-templates/templates/creative-mode/template.html", - "selector_or_token": "template.css.typography", - "raw_value": "le:#0F0F0F; } html, body { margin:0; padding:0; background:#000; } body { font-family:\"Space Grotesk\", system-ui, sans-serif; color:var(--ink); } deck-stage > section{ width:1920px; height:1080px; background:var(--cream); color:var(--ink); position:relative; overflow:hid" - } - ], - "text_direction": [ - { - "path": "beautiful-html-templates/templates/creative-mode/template.html", - "selector_or_token": "css.text_direction", - "raw_value": "column; column-reverse" - } - ], - "alignment": [ - { - "path": "beautiful-html-templates/templates/creative-mode/template.html", - "selector_or_token": "template.css.typography", - "raw_value": "le:#0F0F0F; } html, body { margin:0; padding:0; background:#000; } body { font-family:\"Space Grotesk\", system-ui, sans-serif; color:var(--ink); } deck-stage > section{ width:1920px; height:1080px; background:var(--cream); color:var(--ink); position:relative; overflow:hid" - } - ], - "role_mapping.label": [ - { - "path": "beautiful-html-templates/templates/creative-mode/template.html", - "selector_or_token": "role_mapping.label.source_font", - "raw_value": "JetBrains Mono" - }, - { - "path": "beautiful-html-templates/templates/creative-mode/design.md", - "selector_or_token": "design.typography.roles", - "raw_value": "pink: \"#F06CA8\" pink-dark: \"#D14E8B\" orange: \"#E85A1F\" yellow: \"#F5C518\" typography: display-jumbo: fontFamily: \"Archivo Black, sans-serif\" fontSize: 220px fontWeight: 400 lineHeight: 0.92 letterSpacing: -0.01em textTransform: uppercase display-hero: fontFamily" - } - ], - "paragraph_spacing": [ - { - "path": "beautiful-html-templates/templates/creative-mode/template.html", - "selector_or_token": "css.paragraph_spacing", - "raw_value": "10px; 28px cell-pad: 32px step-pad: 28px topbar-top: 48px meta-bottom: 40px table-cell-pad: 18px 26px canvas: width: 1920px height: 1080px components: slide-chrome: topbar: fontFamily: \"JetBrains Mono, monospace\" fontSize: 24px letterSpacing: 0.08em textTransform: uppercase position: absolute left: 64px right: 64px top: 48px topbar-pill: border: \"2px solid {colors.ink; 28px; 18px; 16px; 36px; 14px; 10px" - } - ], - "text_transform_policy": [ - { - "path": "beautiful-html-templates/templates/creative-mode/template.html", - "selector_or_token": "css.text_transform_policy", - "raw_value": "uppercase` on any display/label/mono when content is Hanzi — Chinese has no case; uppercase` and the -0.01em tracking when content switches to Chinese — NSC 900 stands on size and color alone. JetBrains Mono chrome (topbar pill, slide-meta, axis ticks, kicker block) intentionally stays Latin/digit-only: render `04 / 08` slide counters in mono, but render any Chinese descriptor label in NSC 400 inside the meta footer. The four accents (green / pink / orange / yellow), stat-cell color blocks, tabl" - } - ], - "line_height_scale": [ - { - "path": "beautiful-html-templates/templates/creative-mode/template.html", - "selector_or_token": "css.line_height_scale", - "raw_value": ".92; 1.4; .95; .9; 1.3; 1.45; .85; 1" - } - ], - "wrapping_policy": [ - { - "path": "beautiful-html-templates/templates/creative-mode/template.html", - "selector_or_token": "template.css.typography", - "raw_value": "le:#0F0F0F; } html, body { margin:0; padding:0; background:#000; } body { font-family:\"Space Grotesk\", system-ui, sans-serif; color:var(--ink); } deck-stage > section{ width:1920px; height:1080px; background:var(--cream); color:var(--ink); position:relative; overflow:hid" - } - ], - "font_weight_scale": [ - { - "path": "beautiful-html-templates/templates/creative-mode/template.html", - "selector_or_token": "template.css.typography", - "raw_value": "le:#0F0F0F; } html, body { margin:0; padding:0; background:#000; } body { font-family:\"Space Grotesk\", system-ui, sans-serif; color:var(--ink); } deck-stage > section{ width:1920px; height:1080px; background:var(--cream); color:var(--ink); position:relative; overflow:hid" - } - ], - "source_typography_tokens": [ - { - "path": "beautiful-html-templates/templates/creative-mode/template.html", - "selector_or_token": "css.source_typography_tokens", - "raw_value": "24px; 160px; 32px; 140px; 28px; 46px; 72px; 96px; 100px; 84px; 30px; 34px; 220px; 64px; .92; 1.4; .95; .9; 1.3; 1.45; .85; 1; -.01em; .06em; .08em; .16em; .14em; .12em; .1em; uppercase` on any display/label/mono when content is Hanzi — Chinese has no case; uppercase` and the -0.01em tracking when content switches to Chinese — NSC 900 stands on size and color alone. JetBrains Mono chrome (topbar pill, slide-meta, axis ticks, kicker block) intentionally stays Latin/digit-only: render `04 / 08` sli" - } - ], - "role_mapping.metric": [ - { - "path": "beautiful-html-templates/templates/creative-mode/template.html", - "selector_or_token": "role_mapping.metric.source_font", - "raw_value": "JetBrains Mono" - }, - { - "path": "beautiful-html-templates/templates/creative-mode/design.md", - "selector_or_token": "design.typography.roles", - "raw_value": "pink: \"#F06CA8\" pink-dark: \"#D14E8B\" orange: \"#E85A1F\" yellow: \"#F5C518\" typography: display-jumbo: fontFamily: \"Archivo Black, sans-serif\" fontSize: 220px fontWeight: 400 lineHeight: 0.92 letterSpacing: -0.01em textTransform: uppercase display-hero: fontFamily" - } - ], - "cjk_typography_adjustment": [ - { - "path": "beautiful-html-templates/templates/creative-mode/template.html", - "selector_or_token": "template.css.typography", - "raw_value": "le:#0F0F0F; } html, body { margin:0; padding:0; background:#000; } body { font-family:\"Space Grotesk\", system-ui, sans-serif; color:var(--ink); } deck-stage > section{ width:1920px; height:1080px; background:var(--cream); color:var(--ink); position:relative; overflow:hid" - } - ], - "hierarchy_ratio": [ - { - "path": "beautiful-html-templates/templates/creative-mode/template.html", - "selector_or_token": "template.css.typography", - "raw_value": "le:#0F0F0F; } html, body { margin:0; padding:0; background:#000; } body { font-family:\"Space Grotesk\", system-ui, sans-serif; color:var(--ink); } deck-stage > section{ width:1920px; height:1080px; background:var(--cream); color:var(--ink); position:relative; overflow:hid" - } - ], - "measure": [ - { - "path": "beautiful-html-templates/templates/creative-mode/template.html", - "selector_or_token": "template.css.typography", - "raw_value": "le:#0F0F0F; } html, body { margin:0; padding:0; background:#000; } body { font-family:\"Space Grotesk\", system-ui, sans-serif; color:var(--ink); } deck-stage > section{ width:1920px; height:1080px; background:var(--cream); color:var(--ink); position:relative; overflow:hid" - } - ], - "mapping_reason": [ - { - "path": "beautiful-html-templates/templates/creative-mode/template.html", - "selector_or_token": "template.css.typography", - "raw_value": "le:#0F0F0F; } html, body { margin:0; padding:0; background:#000; } body { font-family:\"Space Grotesk\", system-ui, sans-serif; color:var(--ink); } deck-stage > section{ width:1920px; height:1080px; background:var(--cream); color:var(--ink); position:relative; overflow:hid" - } - ], - "letter_spacing_scale": [ - { - "path": "beautiful-html-templates/templates/creative-mode/template.html", - "selector_or_token": "css.letter_spacing_scale", - "raw_value": "-.01em; .06em; .08em; .16em; .14em; .12em; .1em" - } - ] } }, - "text_style_strategy": { - "bold": { - "source_usage": "source uses heavy display/label weights", - "mapped_weight": { - "display": 900, - "label": 700, - "metric": 900 - }, - "allowed_roles": [ - "display", - "label", - "metric" - ] - }, - "italic": { - "source_usage": "source uses italic/font-style or italic-family tokens", - "mapped_style": "latin_only_when_source_requires_else_normal", - "fallback_when_unavailable": "use color_shift or weight_shift; do not fake CJK italic", - "loss_notes": "Satori/Slide may not provide exact Google italic face; record as visual approximation." - }, - "underline": { - "source_usage": "not a dominant source motif", - "mapped_decoration": "native underline only for actual text-decoration source usage", - "fallback_shape": "1px-3px rule or border accent when underline font rendering is unavailable" - }, - "line_through": { - "source_usage": "not present in source; default no line-through", - "mapped_decoration": "none", - "fallback_shape": "none" - }, - "emphasis": { - "color_shift": "use source accent color roles only", - "font_family_switch": "only switch between mapped display/body/label/metric roles from this family", - "weight_shift": "increase one role step within font_weight_scale", - "style_shift": "italic only when source_usage requires and CJK fallback is safe" - }, - "text_decoration_policy": { - "underline": { - "style": "none", - "color": "currentColor", - "thickness": "0px" - }, - "line_through": { - "style": "none", - "color": "currentColor", - "thickness": "0px" - } - }, - "forbidden": [ - "fake_cjk_italic", - "drop_source_text_transform", - "drop_source_letter_spacing_without_loss_note", - "use_cross_family_font_motif", - "remote_font_dependency_without_receipt" - ], - "extraction_confidence": { - "text_decoration_policy.line_through.color": "absent_use_default", - "text_decoration_policy.underline.color": "absent_use_default", - "text_decoration_policy.line_through.style": "absent_use_default", - "italic": "css_extracted_from_template_html", - "forbidden": "inferred_from_layout", - "emphasis": "inferred_from_layout", - "text_decoration_policy.underline.thickness": "absent_use_default", - "underline": "absent_use_default", - "text_decoration_policy.line_through.thickness": "absent_use_default", - "line_through": "absent_use_default", - "text_decoration_policy.underline.style": "absent_use_default", - "bold": "inferred_from_layout" - }, - "source_refs": { - "italic": [ - { - "path": "beautiful-html-templates/templates/creative-mode/template.html", - "selector_or_token": "css.font-style", - "raw_value": "ut conflicts with the system's strict orthogonal rectangle geometry. NSC has no italic axis, but the system doesn't use italic anywhere — no loss. The mono chrome's \"technical spec\" voice is best preserved by keeping all JetBrains Mono content in Latin/digit and reserving NSC for headline and body r" - } - ], - "forbidden": [ - { - "path": "beautiful-html-templates/templates/creative-mode/template.html", - "selector_or_token": "template.css.typography", - "raw_value": "le:#0F0F0F; } html, body { margin:0; padding:0; background:#000; } body { font-family:\"Space Grotesk\", system-ui, sans-serif; color:var(--ink); } deck-stage > section{ width:1920px; height:1080px; background:var(--cream); color:var(--ink); position:relative; overflow:hid" - } - ], - "emphasis": [ - { - "path": "beautiful-html-templates/templates/creative-mode/template.html", - "selector_or_token": "template.css.typography", - "raw_value": "le:#0F0F0F; } html, body { margin:0; padding:0; background:#000; } body { font-family:\"Space Grotesk\", system-ui, sans-serif; color:var(--ink); } deck-stage > section{ width:1920px; height:1080px; background:var(--cream); color:var(--ink); position:relative; overflow:hid" - } - ], - "bold": [ - { - "path": "beautiful-html-templates/templates/creative-mode/template.html", - "selector_or_token": "template.css.typography", - "raw_value": "le:#0F0F0F; } html, body { margin:0; padding:0; background:#000; } body { font-family:\"Space Grotesk\", system-ui, sans-serif; color:var(--ink); } deck-stage > section{ width:1920px; height:1080px; background:var(--cream); color:var(--ink); position:relative; overflow:hid" - } - ] - } - }, - "satori": { - "font_and_typography_constraints": [ - "italic is source-aware but CJK fake italic is forbidden; use color/weight fallback when unavailable", - "letter spacing is preserved for Latin labels and reset/softened for CJK" - ] - }, - "loss_notes": [ - "italic is source-aware but CJK fake italic is forbidden; use color/weight fallback when unavailable", - "letter spacing is preserved for Latin labels and reset/softened for CJK" - ], - "page_variant_count": 8, - "source_page_variants": [ - "s1", - "s2", - "s3", - "s4", - "s5", - "s6", - "s7", - "s8" - ], - "page_family_source": { - "extractor": "skills/lark-slides/scripts/beautiful_template_page_family_extract.py", - "source_template_html": "beautiful-html-templates/templates/creative-mode/template.html", - "source_design_md": "beautiful-html-templates/templates/creative-mode/design.md", - "source_template_json": "beautiful-html-templates/templates/creative-mode/template.json", - "claim_boundary": "source extraction only; does not imply renderer, fidelity, quality gate, or production/default selectable status" - } - }, - { - "family_id": "daisy-days", - "template_id": "daisy-workshop-playbook", - "runtime_template_id": "daisy-workshop-playbook", - "source_template_html": "beautiful-html-templates/templates/daisy-days/template.html", - "source_design_md": "beautiful-html-templates/templates/daisy-days/design.md", - "source_template_json": "beautiful-html-templates/templates/daisy-days/template.json", - "renderer_id": "artboard_satori.daisy-workshop-playbook", - "renderer_module": "skills/lark-slides/scripts/artboard_renderer/templates/beautiful/daisy-workshop-playbook.mjs", - "golden_spec": "skills/lark-slides/scripts/fixtures/svglide_artboard/golden/daisy-workshop-playbook.canvas-spec.json", - "reference_screenshot": "beautiful-html-templates/screenshots/daisy-days-1.png", - "fidelity_receipt": "skills/lark-slides/references/receipts/template-fidelity/daisy-days.daisy-workshop-playbook.json", - "source_trace": [ - { - "source": "beautiful-html-templates/templates/daisy-days/template.html", - "evidence": "source_template_html" - }, - { - "source": "beautiful-html-templates/templates/daisy-days/design.md", - "evidence": "source_design_md" - }, - { - "source": "beautiful-html-templates/templates/daisy-days/template.json", - "evidence": "source_template_json" - }, - { - "source": "beautiful-html-templates/screenshots/daisy-days-1.png", - "evidence": "reference_screenshot" - }, - { - "source": "skills/lark-slides/references/absorptions/beautiful-html-templates/daisy-days.daisy-workshop-playbook.json", - "evidence": "absorption_record" - }, - { - "source": "skills/lark-slides/references/receipts/template-fidelity/daisy-days.daisy-workshop-playbook.json", - "evidence": "template_fidelity_receipt" - } - ], "visual_contract": { - "path": "skills/lark-slides/references/visual-contracts/beautiful/daisy-days.daisy-workshop-playbook.json", - "layout_rhythm": "daisy-days: medium density, low formality. Cheerful pastel deck with hand-drawn daisies, stars, and rainbows. Friendly, soft, and warm.", - "motifs": [ - "grid", - "accent line", - "card panels", - "poster blocks", - "quote mark", - "sticker collage" - ], - "palette_roles": [ - "accent", - "background", - "border", - "muted", - "negative", - "positive", - "primary", - "surface", - "text" - ], "do_not_simplify": [ "preserve_fonts_palette_grid_slide_classes_decorative_elements", "do_not_recolor_without_explicit_brand_override", @@ -9283,94 +9683,67 @@ "do_not_mark_production_without_renderer_golden_fidelity_receipt", "do_not_strip_identity_decorations", "do_not_recolor_without_explicit_brand_override" - ] + ], + "layout_rhythm": "creative-mode: medium-high density, medium formality. Cream paper canvas with confident multi-color (green, pink, orange, yellow) accents and Archivo Black display.", + "motifs": [ + "grid", + "accent line", + "card panels", + "paper texture", + "poster blocks", + "quote mark", + "sticker collage" + ], + "palette_roles": [ + "accent", + "background", + "border", + "muted", + "negative", + "positive", + "primary", + "surface", + "text" + ], + "path": "skills/lark-slides/references/visual-contracts/beautiful/creative-mode.creative-mode-grid.json" }, - "fidelity_gate": { - "status": "passed", - "score": 0.9711, - "threshold": 0.72, - "reference_screenshot": "/Users/bytedance/bd-projects/beautiful-html-templates/screenshots/daisy-days-1.png", - "render_screenshot": "/Users/bytedance/bd-projects/workspaces/SVGlide/.worktrees/cli-svglide-svg-private/skills/lark-slides/scripts/fixtures/svglide_artboard/golden/daisy-workshop-playbook.preview.png", - "receipt_path": "skills/lark-slides/references/receipts/template-fidelity/daisy-days.daisy-workshop-playbook.json", - "issues": [] - }, - "promotion_status": "needs_review", - "default_selectable": false, + "visual_contract_path": "skills/lark-slides/references/visual-contracts/beautiful/creative-mode.creative-mode-grid.json" + }, + { "blocking_issues": [ "selector_gate_missing", "quality_gate_integration_pending", "production_review_pending" ], - "visual_contract_path": "skills/lark-slides/references/visual-contracts/beautiful/daisy-days.daisy-workshop-playbook.json", - "planned_renderer_module": "skills/lark-slides/scripts/artboard_renderer/templates/beautiful/daisy-workshop-playbook.mjs", - "planned_golden_spec": "skills/lark-slides/scripts/fixtures/svglide_artboard/golden/daisy-workshop-playbook.canvas-spec.json", - "planned_fidelity_receipt": "skills/lark-slides/references/receipts/template-fidelity/daisy-days.daisy-workshop-playbook.json", + "default_selectable": false, + "family_id": "daisy-days", + "fidelity_gate": { + "issues": [], + "receipt_path": "skills/lark-slides/references/receipts/template-fidelity/daisy-days.daisy-workshop-playbook.json", + "reference_screenshot": "/Users/bytedance/bd-projects/beautiful-html-templates/screenshots/daisy-days-1.png", + "render_screenshot": "/Users/bytedance/bd-projects/workspaces/SVGlide/.worktrees/cli-svglide-svg-private/skills/lark-slides/scripts/fixtures/svglide_artboard/golden/daisy-workshop-playbook.preview.png", + "score": 0.9711, + "status": "passed", + "threshold": 0.72 + }, + "fidelity_receipt": "skills/lark-slides/references/receipts/template-fidelity/daisy-days.daisy-workshop-playbook.json", "font_strategy": { - "source_fonts": [ - "Fredoka One", - "Quicksand" - ], - "slide_native_preferred": [ - "system-sans-cjk" - ], "adobe_or_embedded_fallback": [ "Source Sans Pro", "思源黑体" ], "cjk_fallback": "LXGW WenKai TC", - "role_mapping": { - "display": { - "source_font": "Fredoka One", - "slide_font": "Source Sans Pro", - "runtime_alias": "SVGlideDisplay", - "cjk_font": "思源黑体", - "fallback_stack": [ - "system-sans-cjk", - "SVGlideDisplay" - ], - "source_only": false, - "requires_download": false, - "mapping_reason": "保留 Fredoka One 的语义角色,但运行时优先使用 Slide/系统可用的 Source Sans Pro 与 思源黑体。" - }, - "body": { - "source_font": "Quicksand", - "slide_font": "Source Sans Pro", - "runtime_alias": "SVGlideBody", - "cjk_font": "思源黑体", - "fallback_stack": [ - "system-sans-cjk", - "SVGlideBody" - ], - "source_only": false, - "requires_download": false, - "mapping_reason": "保留 Quicksand 的语义角色,但运行时优先使用 Slide/系统可用的 Source Sans Pro 与 思源黑体。" - }, - "label": { - "source_font": "Fredoka One", - "slide_font": "Source Sans Pro", - "runtime_alias": "SVGlideLabel", - "cjk_font": "思源黑体", - "fallback_stack": [ - "system-sans-cjk", - "SVGlideLabel" - ], - "source_only": false, - "requires_download": false, - "mapping_reason": "保留 Fredoka One 的语义角色,但运行时优先使用 Slide/系统可用的 Source Sans Pro 与 思源黑体。" - }, - "metric": { - "source_font": "Fredoka One", - "slide_font": "Source Sans Pro", - "runtime_alias": "SVGlideMetric", - "cjk_font": "思源黑体", - "fallback_stack": [ - "system-sans-cjk", - "SVGlideMetric" - ], - "source_only": false, - "requires_download": false, - "mapping_reason": "保留 Fredoka One 的语义角色,但运行时优先使用 Slide/系统可用的 Source Sans Pro 与 思源黑体。" - } + "extraction_confidence": { + "adobe_or_embedded_fallback": "inferred_from_layout", + "cjk_fallback": "inferred_from_layout", + "forbidden": "inferred_from_layout", + "mapping_reason": "inferred_from_layout", + "role_mapping.body": "inferred_from_layout", + "role_mapping.display": "inferred_from_layout", + "role_mapping.label": "inferred_from_layout", + "role_mapping.metric": "inferred_from_layout", + "slide_native_preferred": "inferred_from_layout", + "source_fonts": "css_extracted_from_template_html" }, "forbidden": [ "remote_font_runtime_dependency", @@ -9379,119 +9752,683 @@ "drop_cjk_fallback" ], "mapping_reason": "根据 design.md/template.html/template.json 中的 font-family 与 typography token 提取源字体;运行时按 Slide/系统/Adobe/思源可用字体降级。", + "role_mapping": { + "body": { + "cjk_font": "思源黑体", + "fallback_stack": [ + "system-sans-cjk", + "SVGlideBody" + ], + "mapping_reason": "保留 Quicksand 的语义角色,但运行时优先使用 Slide/系统可用的 Source Sans Pro 与 思源黑体。", + "requires_download": false, + "runtime_alias": "SVGlideBody", + "slide_font": "Source Sans Pro", + "source_font": "Quicksand", + "source_only": false + }, + "display": { + "cjk_font": "思源黑体", + "fallback_stack": [ + "system-sans-cjk", + "SVGlideDisplay" + ], + "mapping_reason": "保留 Fredoka One 的语义角色,但运行时优先使用 Slide/系统可用的 Source Sans Pro 与 思源黑体。", + "requires_download": false, + "runtime_alias": "SVGlideDisplay", + "slide_font": "Source Sans Pro", + "source_font": "Fredoka One", + "source_only": false + }, + "label": { + "cjk_font": "思源黑体", + "fallback_stack": [ + "system-sans-cjk", + "SVGlideLabel" + ], + "mapping_reason": "保留 Fredoka One 的语义角色,但运行时优先使用 Slide/系统可用的 Source Sans Pro 与 思源黑体。", + "requires_download": false, + "runtime_alias": "SVGlideLabel", + "slide_font": "Source Sans Pro", + "source_font": "Fredoka One", + "source_only": false + }, + "metric": { + "cjk_font": "思源黑体", + "fallback_stack": [ + "system-sans-cjk", + "SVGlideMetric" + ], + "mapping_reason": "保留 Fredoka One 的语义角色,但运行时优先使用 Slide/系统可用的 Source Sans Pro 与 思源黑体。", + "requires_download": false, + "runtime_alias": "SVGlideMetric", + "slide_font": "Source Sans Pro", + "source_font": "Fredoka One", + "source_only": false + } + }, + "same_role_font_justification": "源模板本身以单一 sans/system family 承担多数字体角色;通过 weight/size/line-height/uppercase 区分 display/body/label/metric。", + "slide_native_preferred": [ + "system-sans-cjk" + ], "source_evidence": [ "beautiful-html-templates/templates/daisy-days/design.md", "beautiful-html-templates/templates/daisy-days/template.html", "beautiful-html-templates/templates/daisy-days/template.json", "beautiful-html-templates/screenshots/daisy-days-1.png" ], - "same_role_font_justification": "源模板本身以单一 sans/system family 承担多数字体角色;通过 weight/size/line-height/uppercase 区分 display/body/label/metric。", - "extraction_confidence": { - "role_mapping.body": "inferred_from_layout", - "role_mapping.display": "inferred_from_layout", - "source_fonts": "css_extracted_from_template_html", - "adobe_or_embedded_fallback": "inferred_from_layout", - "cjk_fallback": "inferred_from_layout", - "role_mapping.metric": "inferred_from_layout", - "forbidden": "inferred_from_layout", - "slide_native_preferred": "inferred_from_layout", - "mapping_reason": "inferred_from_layout", - "role_mapping.label": "inferred_from_layout" - }, + "source_fonts": [ + "Fredoka One", + "Quicksand" + ], "source_refs": { - "role_mapping.body": [ - { - "path": "beautiful-html-templates/templates/daisy-days/template.html", - "selector_or_token": "role_mapping.body.source_font", - "raw_value": "Quicksand" - }, - { - "path": "beautiful-html-templates/templates/daisy-days/design.md", - "selector_or_token": "design.typography.roles", - "raw_value": "px 3px 0 {colors.text-dark}\" text-headline-soft: \"3px 3px 0 rgba(0,0,0,0.2)\" typography: display: fontFamily: \"'Fredoka One', cursive\" fontSize: \"clamp(3.2rem, 7vw, 6.5rem)\" fontWeight: 400 lineHeight: 1.1 letterSpacing: 0.02em headline: fontFamily: \"'Fredoka One', cur" - } - ], - "role_mapping.display": [ - { - "path": "beautiful-html-templates/templates/daisy-days/template.html", - "selector_or_token": "role_mapping.display.source_font", - "raw_value": "Fredoka One" - }, - { - "path": "beautiful-html-templates/templates/daisy-days/design.md", - "selector_or_token": "design.typography.roles", - "raw_value": "px 3px 0 {colors.text-dark}\" text-headline-soft: \"3px 3px 0 rgba(0,0,0,0.2)\" typography: display: fontFamily: \"'Fredoka One', cursive\" fontSize: \"clamp(3.2rem, 7vw, 6.5rem)\" fontWeight: 400 lineHeight: 1.1 letterSpacing: 0.02em headline: fontFamily: \"'Fredoka One', cur" - } - ], - "source_fonts": [ - { - "path": "beautiful-html-templates/templates/daisy-days/template.html", - "selector_or_token": "css.font-family", - "raw_value": "var(--font-body); var(--font-display)" - } - ], "adobe_or_embedded_fallback": [ { "path": "beautiful-html-templates/templates/daisy-days/template.html", - "selector_or_token": "css.font-family", - "raw_value": "var(--font-body); var(--font-display)" + "raw_value": "var(--font-body); var(--font-display)", + "selector_or_token": "css.font-family" } ], "cjk_fallback": [ { "path": "beautiful-html-templates/templates/daisy-days/template.html", - "selector_or_token": "css.font-family", - "raw_value": "var(--font-body); var(--font-display)" - } - ], - "role_mapping.metric": [ - { - "path": "beautiful-html-templates/templates/daisy-days/template.html", - "selector_or_token": "role_mapping.metric.source_font", - "raw_value": "Fredoka One" - }, - { - "path": "beautiful-html-templates/templates/daisy-days/design.md", - "selector_or_token": "design.typography.roles", - "raw_value": "px 3px 0 {colors.text-dark}\" text-headline-soft: \"3px 3px 0 rgba(0,0,0,0.2)\" typography: display: fontFamily: \"'Fredoka One', cursive\" fontSize: \"clamp(3.2rem, 7vw, 6.5rem)\" fontWeight: 400 lineHeight: 1.1 letterSpacing: 0.02em headline: fontFamily: \"'Fredoka One', cur" + "raw_value": "var(--font-body); var(--font-display)", + "selector_or_token": "css.font-family" } ], "forbidden": [ { "path": "beautiful-html-templates/templates/daisy-days/template.html", - "selector_or_token": "css.font-family", - "raw_value": "var(--font-body); var(--font-display)" - } - ], - "slide_native_preferred": [ - { - "path": "beautiful-html-templates/templates/daisy-days/template.html", - "selector_or_token": "css.font-family", - "raw_value": "var(--font-body); var(--font-display)" + "raw_value": "var(--font-body); var(--font-display)", + "selector_or_token": "css.font-family" } ], "mapping_reason": [ { "path": "beautiful-html-templates/templates/daisy-days/template.html", - "selector_or_token": "css.font-family", - "raw_value": "var(--font-body); var(--font-display)" + "raw_value": "var(--font-body); var(--font-display)", + "selector_or_token": "css.font-family" + } + ], + "role_mapping.body": [ + { + "path": "beautiful-html-templates/templates/daisy-days/template.html", + "raw_value": "Quicksand", + "selector_or_token": "role_mapping.body.source_font" + }, + { + "path": "beautiful-html-templates/templates/daisy-days/design.md", + "raw_value": "px 3px 0 {colors.text-dark}\" text-headline-soft: \"3px 3px 0 rgba(0,0,0,0.2)\" typography: display: fontFamily: \"'Fredoka One', cursive\" fontSize: \"clamp(3.2rem, 7vw, 6.5rem)\" fontWeight: 400 lineHeight: 1.1 letterSpacing: 0.02em headline: fontFamily: \"'Fredoka One', cur", + "selector_or_token": "design.typography.roles" + } + ], + "role_mapping.display": [ + { + "path": "beautiful-html-templates/templates/daisy-days/template.html", + "raw_value": "Fredoka One", + "selector_or_token": "role_mapping.display.source_font" + }, + { + "path": "beautiful-html-templates/templates/daisy-days/design.md", + "raw_value": "px 3px 0 {colors.text-dark}\" text-headline-soft: \"3px 3px 0 rgba(0,0,0,0.2)\" typography: display: fontFamily: \"'Fredoka One', cursive\" fontSize: \"clamp(3.2rem, 7vw, 6.5rem)\" fontWeight: 400 lineHeight: 1.1 letterSpacing: 0.02em headline: fontFamily: \"'Fredoka One', cur", + "selector_or_token": "design.typography.roles" } ], "role_mapping.label": [ { "path": "beautiful-html-templates/templates/daisy-days/template.html", - "selector_or_token": "role_mapping.label.source_font", - "raw_value": "Fredoka One" + "raw_value": "Fredoka One", + "selector_or_token": "role_mapping.label.source_font" }, { "path": "beautiful-html-templates/templates/daisy-days/design.md", - "selector_or_token": "design.typography.roles", - "raw_value": "px 3px 0 {colors.text-dark}\" text-headline-soft: \"3px 3px 0 rgba(0,0,0,0.2)\" typography: display: fontFamily: \"'Fredoka One', cursive\" fontSize: \"clamp(3.2rem, 7vw, 6.5rem)\" fontWeight: 400 lineHeight: 1.1 letterSpacing: 0.02em headline: fontFamily: \"'Fredoka One', cur" + "raw_value": "px 3px 0 {colors.text-dark}\" text-headline-soft: \"3px 3px 0 rgba(0,0,0,0.2)\" typography: display: fontFamily: \"'Fredoka One', cursive\" fontSize: \"clamp(3.2rem, 7vw, 6.5rem)\" fontWeight: 400 lineHeight: 1.1 letterSpacing: 0.02em headline: fontFamily: \"'Fredoka One', cur", + "selector_or_token": "design.typography.roles" + } + ], + "role_mapping.metric": [ + { + "path": "beautiful-html-templates/templates/daisy-days/template.html", + "raw_value": "Fredoka One", + "selector_or_token": "role_mapping.metric.source_font" + }, + { + "path": "beautiful-html-templates/templates/daisy-days/design.md", + "raw_value": "px 3px 0 {colors.text-dark}\" text-headline-soft: \"3px 3px 0 rgba(0,0,0,0.2)\" typography: display: fontFamily: \"'Fredoka One', cursive\" fontSize: \"clamp(3.2rem, 7vw, 6.5rem)\" fontWeight: 400 lineHeight: 1.1 letterSpacing: 0.02em headline: fontFamily: \"'Fredoka One', cur", + "selector_or_token": "design.typography.roles" + } + ], + "slide_native_preferred": [ + { + "path": "beautiful-html-templates/templates/daisy-days/template.html", + "raw_value": "var(--font-body); var(--font-display)", + "selector_or_token": "css.font-family" + } + ], + "source_fonts": [ + { + "path": "beautiful-html-templates/templates/daisy-days/template.html", + "raw_value": "var(--font-body); var(--font-display)", + "selector_or_token": "css.font-family" } ] } }, + "golden_spec": "skills/lark-slides/scripts/fixtures/svglide_artboard/golden/daisy-workshop-playbook.canvas-spec.json", + "implemented_page_variants": [ + "title", + "welcome", + "weekly", + "timeline", + "chart-bar", + "cards", + "quote", + "team", + "process", + "donut" + ], + "loss_notes": [ + "italic is source-aware but CJK fake italic is forbidden; use color/weight fallback when unavailable", + "letter spacing is preserved for Latin labels and reset/softened for CJK" + ], + "page_family_smoke": { + "production_selectable": false, + "receipt_path": "skills/lark-slides/references/receipts/page-family-smoke/daisy-days.daisy-workshop-playbook.json", + "rendered_pages": 10, + "reuse_count": 0, + "status": "passed" + }, + "page_family_smoke_deck": "skills/lark-slides/references/page-family-smoke-decks/daisy-days.json", + "page_family_smoke_receipt": "skills/lark-slides/references/receipts/page-family-smoke/daisy-days.daisy-workshop-playbook.json", + "page_family_source": { + "claim_boundary": "source extraction only; does not imply renderer, fidelity, quality gate, or production/default selectable status", + "extractor": "skills/lark-slides/scripts/beautiful_template_page_family_extract.py", + "source_design_md": "beautiful-html-templates/templates/daisy-days/design.md", + "source_template_html": "beautiful-html-templates/templates/daisy-days/template.html", + "source_template_json": "beautiful-html-templates/templates/daisy-days/template.json" + }, + "page_variant_count": 10, + "page_variant_golden_specs": { + "cards": "skills/lark-slides/scripts/fixtures/svglide_artboard/golden/daisy-days.cards.canvas-spec.json", + "chart-bar": "skills/lark-slides/scripts/fixtures/svglide_artboard/golden/daisy-days.chart-bar.canvas-spec.json", + "donut": "skills/lark-slides/scripts/fixtures/svglide_artboard/golden/daisy-days.donut.canvas-spec.json", + "process": "skills/lark-slides/scripts/fixtures/svglide_artboard/golden/daisy-days.process.canvas-spec.json", + "quote": "skills/lark-slides/scripts/fixtures/svglide_artboard/golden/daisy-days.quote.canvas-spec.json", + "team": "skills/lark-slides/scripts/fixtures/svglide_artboard/golden/daisy-days.team.canvas-spec.json", + "timeline": "skills/lark-slides/scripts/fixtures/svglide_artboard/golden/daisy-days.timeline.canvas-spec.json", + "title": "skills/lark-slides/scripts/fixtures/svglide_artboard/golden/daisy-days.title.canvas-spec.json", + "weekly": "skills/lark-slides/scripts/fixtures/svglide_artboard/golden/daisy-days.weekly.canvas-spec.json", + "welcome": "skills/lark-slides/scripts/fixtures/svglide_artboard/golden/daisy-days.welcome.canvas-spec.json" + }, + "planned_fidelity_receipt": "skills/lark-slides/references/receipts/template-fidelity/daisy-days.daisy-workshop-playbook.json", + "planned_golden_spec": "skills/lark-slides/scripts/fixtures/svglide_artboard/golden/daisy-workshop-playbook.canvas-spec.json", + "planned_renderer_module": "skills/lark-slides/scripts/artboard_renderer/templates/beautiful/daisy-workshop-playbook.mjs", + "promotion_status": "needs_review", + "reference_screenshot": "beautiful-html-templates/screenshots/daisy-days-1.png", + "renderer_id": "artboard_satori.daisy-workshop-playbook", + "renderer_module": "skills/lark-slides/scripts/artboard_renderer/templates/beautiful/daisy-workshop-playbook.mjs", + "renderer_stage": "page_family", + "runtime_template_id": "daisy-workshop-playbook", + "satori": { + "font_and_typography_constraints": [ + "italic is source-aware but CJK fake italic is forbidden; use color/weight fallback when unavailable", + "letter spacing is preserved for Latin labels and reset/softened for CJK" + ] + }, + "selection_scope": "experimental", + "source_design_md": "beautiful-html-templates/templates/daisy-days/design.md", + "source_page_variants": [ + "title", + "welcome", + "weekly", + "timeline", + "chart-bar", + "cards", + "quote", + "team", + "process", + "donut" + ], + "source_template_html": "beautiful-html-templates/templates/daisy-days/template.html", + "source_template_json": "beautiful-html-templates/templates/daisy-days/template.json", + "source_trace": [ + { + "evidence": "source_template_html", + "source": "beautiful-html-templates/templates/daisy-days/template.html" + }, + { + "evidence": "source_design_md", + "source": "beautiful-html-templates/templates/daisy-days/design.md" + }, + { + "evidence": "source_template_json", + "source": "beautiful-html-templates/templates/daisy-days/template.json" + }, + { + "evidence": "reference_screenshot", + "source": "beautiful-html-templates/screenshots/daisy-days-1.png" + }, + { + "evidence": "absorption_record", + "source": "skills/lark-slides/references/absorptions/beautiful-html-templates/daisy-days.daisy-workshop-playbook.json" + }, + { + "evidence": "template_fidelity_receipt", + "source": "skills/lark-slides/references/receipts/template-fidelity/daisy-days.daisy-workshop-playbook.json" + } + ], + "template_id": "daisy-workshop-playbook", + "text_style_strategy": { + "bold": { + "allowed_roles": [ + "display", + "label", + "metric" + ], + "mapped_weight": { + "display": 900, + "label": 700, + "metric": 900 + }, + "source_usage": "source uses heavy display/label weights" + }, + "emphasis": { + "color_shift": "use source accent color roles only", + "font_family_switch": "only switch between mapped display/body/label/metric roles from this family", + "style_shift": "italic only when source_usage requires and CJK fallback is safe", + "weight_shift": "increase one role step within font_weight_scale" + }, + "extraction_confidence": { + "bold": "css_extracted_from_template_html", + "emphasis": "inferred_from_layout", + "forbidden": "inferred_from_layout", + "italic": "css_extracted_from_template_html", + "line_through": "absent_use_default", + "text_decoration_policy.line_through.color": "absent_use_default", + "text_decoration_policy.line_through.style": "absent_use_default", + "text_decoration_policy.line_through.thickness": "absent_use_default", + "text_decoration_policy.underline.color": "css_extracted_from_template_html", + "text_decoration_policy.underline.style": "css_extracted_from_template_html", + "text_decoration_policy.underline.thickness": "css_extracted_from_template_html", + "underline": "css_extracted_from_template_html" + }, + "forbidden": [ + "fake_cjk_italic", + "drop_source_text_transform", + "drop_source_letter_spacing_without_loss_note", + "use_cross_family_font_motif", + "remote_font_dependency_without_receipt" + ], + "italic": { + "fallback_when_unavailable": "use color_shift or weight_shift; do not fake CJK italic", + "loss_notes": "Satori/Slide may not provide exact Google italic face; record as visual approximation.", + "mapped_style": "latin_only_when_source_requires_else_normal", + "source_usage": "source uses italic/font-style or italic-family tokens" + }, + "line_through": { + "fallback_shape": "none", + "mapped_decoration": "none", + "source_usage": "not present in source; default no line-through" + }, + "source_refs": { + "bold": [ + { + "path": "beautiful-html-templates/templates/daisy-days/template.html", + "raw_value": "400; 600; 500; 700", + "selector_or_token": "css.font-weight" + } + ], + "emphasis": [ + { + "path": "beautiful-html-templates/templates/daisy-days/template.html", + "raw_value": "body:'Quicksand',sans-serif; } html,body{width:100%;height:100%;overflow:hidden;font-family:var(--font-body);color:var(--text-dark);background:var(--cream)} /* ---- Slide system ---- */ .slides-container{width:100vw;height:100vh;overflow-y:scroll;scroll-snap-type:y mandatory;scroll-behavior:smooth}", + "selector_or_token": "template.css.typography" + } + ], + "forbidden": [ + { + "path": "beautiful-html-templates/templates/daisy-days/template.html", + "raw_value": "body:'Quicksand',sans-serif; } html,body{width:100%;height:100%;overflow:hidden;font-family:var(--font-body);color:var(--text-dark);background:var(--cream)} /* ---- Slide system ---- */ .slides-container{width:100vw;height:100vh;overflow-y:scroll;scroll-snap-type:y mandatory;scroll-behavior:smooth}", + "selector_or_token": "template.css.typography" + } + ], + "italic": [ + { + "path": "beautiful-html-templates/templates/daisy-days/template.html", + "raw_value": "aphic identity. Fredoka One is a chunky single-weight display face — it has no italic, no lighter variants, no condensed cuts. The display weight reads as 400 by spec but visually behaves as a heavy weight because the letterforms are so rounded and full. Every headline, every title, every step numb", + "selector_or_token": "css.font-style" + } + ], + "text_decoration_policy.underline.color": [ + { + "path": "beautiful-html-templates/templates/daisy-days/template.html", + "raw_value": "Principles The size ladder is the rhythm. Fredoka One does not get italicized, underlined, or rendered in alternate weights — Fredoka has one weight, full stop. Quicksand stays inside the 500 / 600 / 700 ladder; do not introduce 400 or 800 even if available. Letter-spacing on Fredoka stays at the s", + "selector_or_token": "css.text-decoration" + } + ], + "text_decoration_policy.underline.style": [ + { + "path": "beautiful-html-templates/templates/daisy-days/template.html", + "raw_value": "Principles The size ladder is the rhythm. Fredoka One does not get italicized, underlined, or rendered in alternate weights — Fredoka has one weight, full stop. Quicksand stays inside the 500 / 600 / 700 ladder; do not introduce 400 or 800 even if available. Letter-spacing on Fredoka stays at the s", + "selector_or_token": "css.text-decoration" + } + ], + "text_decoration_policy.underline.thickness": [ + { + "path": "beautiful-html-templates/templates/daisy-days/template.html", + "raw_value": "Principles The size ladder is the rhythm. Fredoka One does not get italicized, underlined, or rendered in alternate weights — Fredoka has one weight, full stop. Quicksand stays inside the 500 / 600 / 700 ladder; do not introduce 400 or 800 even if available. Letter-spacing on Fredoka stays at the s", + "selector_or_token": "css.text-decoration" + } + ], + "underline": [ + { + "path": "beautiful-html-templates/templates/daisy-days/template.html", + "raw_value": "Principles The size ladder is the rhythm. Fredoka One does not get italicized, underlined, or rendered in alternate weights — Fredoka has one weight, full stop. Quicksand stays inside the 500 / 600 / 700 ladder; do not introduce 400 or 800 even if available. Letter-spacing on Fredoka stays at the s", + "selector_or_token": "css.text-decoration" + } + ] + }, + "text_decoration_policy": { + "line_through": { + "color": "currentColor", + "style": "none", + "thickness": "0px" + }, + "underline": { + "color": "currentColor", + "style": "solid", + "thickness": "1px" + } + }, + "underline": { + "fallback_shape": "1px-3px rule or border accent when underline font rendering is unavailable", + "mapped_decoration": "native underline only for actual text-decoration source usage", + "source_usage": "source uses underline/text-decoration or hairline emphasis" + } + }, "typography_strategy": { + "alignment": { + "fallback": "left/top aligned unless source screenshot is centered", + "primary": "follow source composition" + }, + "cjk_typography_adjustment": { + "body_font_cn": "ZCOOL XiaoWei", + "display_font_cn": "LXGW WenKai TC", + "italic_policy": "drop_italic", + "letter_spacing_policy": "reset_letter_spacing_for_cjk_keep_latin_labels", + "mixed_run_spacing": "pangu_spacing" + }, + "extraction_confidence": { + "alignment": "inferred_from_layout", + "cjk_typography_adjustment": "inferred_from_layout", + "font_size_scale": "css_extracted_from_template_html", + "font_weight_scale": "css_extracted_from_template_html", + "hierarchy_ratio": "inferred_from_layout", + "letter_spacing_scale": "css_extracted_from_template_html", + "line_height_scale": "css_extracted_from_template_html", + "mapping_reason": "inferred_from_layout", + "max_lines": "inferred_from_layout", + "measure": "inferred_from_layout", + "paragraph_spacing": "css_extracted_from_template_html", + "role_mapping.body": "inferred_from_layout", + "role_mapping.display": "inferred_from_layout", + "role_mapping.label": "inferred_from_layout", + "role_mapping.metric": "inferred_from_layout", + "source_typography_tokens": "css_extracted_from_template_html", + "text_direction": "css_extracted_from_template_html", + "text_transform_policy": "css_extracted_from_template_html", + "word_spacing": "absent_use_default", + "wrapping_policy": "inferred_from_layout", + "writing_mode": "absent_use_default" + }, + "font_size_scale": { + "body": 20, + "display": 54, + "label": 12, + "metric": 42 + }, + "font_weight_scale": { + "body": 400, + "display": 900, + "label": 700, + "metric": 900 + }, + "hierarchy_ratio": 2.7, + "letter_spacing_scale": { + "body": 0, + "display": 0, + "label": 0.08, + "metric": 0 + }, + "line_height_scale": { + "body": 1.32, + "display": 0.9, + "label": 1.05, + "metric": 0.95 + }, + "mapping_reason": "按源模板字号/字重/行高/字距/大小写规则抽象到 960x540 Slide 画布的四个文本角色。", + "max_lines": { + "body": 5, + "display": 3, + "label": 1, + "metric": 2 + }, + "measure": { + "body": "40-70 characters or CJK equivalent", + "display": "0.55-0.78 canvas width", + "label": "short mono labels", + "metric": "short numeric/stat blocks" + }, + "paragraph_spacing": { + "body_after": 12, + "display_after": 0, + "label_after": 0, + "metric_after": 0 + }, + "role_mapping": { + "body": { + "alignment": "source_layout_dependent", + "font_role": "body", + "font_size": 20, + "font_weight": 400, + "letter_spacing": 0, + "line_height": 1.32, + "max_lines": 5, + "runtime_alias": "SVGlideBody", + "source_font": "Quicksand", + "text_transform": "preserve_source_case" + }, + "display": { + "alignment": "source_layout_dependent", + "font_role": "display", + "font_size": 54, + "font_weight": 900, + "letter_spacing": 0, + "line_height": 0.9, + "max_lines": 3, + "runtime_alias": "SVGlideDisplay", + "source_font": "Fredoka One", + "text_transform": "latin_uppercase_only" + }, + "label": { + "alignment": "source_layout_dependent", + "font_role": "label", + "font_size": 12, + "font_weight": 700, + "letter_spacing": 0.08, + "line_height": 1.05, + "max_lines": 1, + "runtime_alias": "SVGlideLabel", + "source_font": "Fredoka One", + "text_transform": "latin_uppercase_labels_reset_cjk_spacing" + }, + "metric": { + "alignment": "source_layout_dependent", + "font_role": "metric", + "font_size": 42, + "font_weight": 900, + "letter_spacing": 0, + "line_height": 0.95, + "max_lines": 2, + "runtime_alias": "SVGlideMetric", + "source_font": "Fredoka One", + "text_transform": "preserve_numbers_and_units" + } + }, + "source_refs": { + "alignment": [ + { + "path": "beautiful-html-templates/templates/daisy-days/template.html", + "raw_value": "body:'Quicksand',sans-serif; } html,body{width:100%;height:100%;overflow:hidden;font-family:var(--font-body);color:var(--text-dark);background:var(--cream)} /* ---- Slide system ---- */ .slides-container{width:100vw;height:100vh;overflow-y:scroll;scroll-snap-type:y mandatory;scroll-behavior:smooth}", + "selector_or_token": "template.css.typography" + } + ], + "cjk_typography_adjustment": [ + { + "path": "beautiful-html-templates/templates/daisy-days/template.html", + "raw_value": "body:'Quicksand',sans-serif; } html,body{width:100%;height:100%;overflow:hidden;font-family:var(--font-body);color:var(--text-dark);background:var(--cream)} /* ---- Slide system ---- */ .slides-container{width:100vw;height:100vh;overflow-y:scroll;scroll-snap-type:y mandatory;scroll-behavior:smooth}", + "selector_or_token": "template.css.typography" + } + ], + "font_size_scale": [ + { + "path": "beautiful-html-templates/templates/daisy-days/template.html", + "raw_value": "clamp(2.5rem,5vw,4.5rem); clamp(1.8rem,3.5vw,3rem); clamp(1.3rem,2vw,1.8rem); clamp(1rem,1.5vw,1.3rem); clamp(.95rem,1.3vw,1.15rem); .85rem; .8rem; clamp(3.2rem,7vw,6.5rem); clamp(1rem,1.8vw,1.4rem); clamp(1.4rem,2.5vw,2rem); clamp(.95rem,1.4vw,1.15rem); clamp(.85rem,1.3vw,1.1rem); clamp(.8rem,1.1vw,.95rem); 1.1rem; .9rem; 1.2rem", + "selector_or_token": "css.font_size_scale" + } + ], + "font_weight_scale": [ + { + "path": "beautiful-html-templates/templates/daisy-days/template.html", + "raw_value": "400; 600; 500; 700", + "selector_or_token": "css.font_weight_scale" + } + ], + "hierarchy_ratio": [ + { + "path": "beautiful-html-templates/templates/daisy-days/template.html", + "raw_value": "body:'Quicksand',sans-serif; } html,body{width:100%;height:100%;overflow:hidden;font-family:var(--font-body);color:var(--text-dark);background:var(--cream)} /* ---- Slide system ---- */ .slides-container{width:100vw;height:100vh;overflow-y:scroll;scroll-snap-type:y mandatory;scroll-behavior:smooth}", + "selector_or_token": "template.css.typography" + } + ], + "letter_spacing_scale": [ + { + "path": "beautiful-html-templates/templates/daisy-days/template.html", + "raw_value": ".02em", + "selector_or_token": "css.letter_spacing_scale" + } + ], + "line_height_scale": [ + { + "path": "beautiful-html-templates/templates/daisy-days/template.html", + "raw_value": "1.1; 1.15; 1.2; 1.3; 1.6; 1.5; 1.4; 1; 1.35; 1.45", + "selector_or_token": "css.line_height_scale" + } + ], + "mapping_reason": [ + { + "path": "beautiful-html-templates/templates/daisy-days/template.html", + "raw_value": "body:'Quicksand',sans-serif; } html,body{width:100%;height:100%;overflow:hidden;font-family:var(--font-body);color:var(--text-dark);background:var(--cream)} /* ---- Slide system ---- */ .slides-container{width:100vw;height:100vh;overflow-y:scroll;scroll-snap-type:y mandatory;scroll-behavior:smooth}", + "selector_or_token": "template.css.typography" + } + ], + "max_lines": [ + { + "path": "beautiful-html-templates/templates/daisy-days/template.html", + "raw_value": "body:'Quicksand',sans-serif; } html,body{width:100%;height:100%;overflow:hidden;font-family:var(--font-body);color:var(--text-dark);background:var(--cream)} /* ---- Slide system ---- */ .slides-container{width:100vw;height:100vh;overflow-y:scroll;scroll-snap-type:y mandatory;scroll-behavior:smooth}", + "selector_or_token": "template.css.typography" + } + ], + "measure": [ + { + "path": "beautiful-html-templates/templates/daisy-days/template.html", + "raw_value": "body:'Quicksand',sans-serif; } html,body{width:100%;height:100%;overflow:hidden;font-family:var(--font-body);color:var(--text-dark);background:var(--cream)} /* ---- Slide system ---- */ .slides-container{width:100vw;height:100vh;overflow-y:scroll;scroll-snap-type:y mandatory;scroll-behavior:smooth}", + "selector_or_token": "template.css.typography" + } + ], + "paragraph_spacing": [ + { + "path": "beautiful-html-templates/templates/daisy-days/template.html", + "raw_value": "12px; 28px; 32px; 4px; 36px; 8px; 20px; 40px; 10px; 18px; 14px; 8px; 20px; 24px; 28px; 12px; 16px; 48px", + "selector_or_token": "css.paragraph_spacing" + } + ], + "role_mapping.body": [ + { + "path": "beautiful-html-templates/templates/daisy-days/template.html", + "raw_value": "Quicksand", + "selector_or_token": "role_mapping.body.source_font" + }, + { + "path": "beautiful-html-templates/templates/daisy-days/design.md", + "raw_value": "px 3px 0 {colors.text-dark}\" text-headline-soft: \"3px 3px 0 rgba(0,0,0,0.2)\" typography: display: fontFamily: \"'Fredoka One', cursive\" fontSize: \"clamp(3.2rem, 7vw, 6.5rem)\" fontWeight: 400 lineHeight: 1.1 letterSpacing: 0.02em headline: fontFamily: \"'Fredoka One', cur", + "selector_or_token": "design.typography.roles" + } + ], + "role_mapping.display": [ + { + "path": "beautiful-html-templates/templates/daisy-days/template.html", + "raw_value": "Fredoka One", + "selector_or_token": "role_mapping.display.source_font" + }, + { + "path": "beautiful-html-templates/templates/daisy-days/design.md", + "raw_value": "px 3px 0 {colors.text-dark}\" text-headline-soft: \"3px 3px 0 rgba(0,0,0,0.2)\" typography: display: fontFamily: \"'Fredoka One', cursive\" fontSize: \"clamp(3.2rem, 7vw, 6.5rem)\" fontWeight: 400 lineHeight: 1.1 letterSpacing: 0.02em headline: fontFamily: \"'Fredoka One', cur", + "selector_or_token": "design.typography.roles" + } + ], + "role_mapping.label": [ + { + "path": "beautiful-html-templates/templates/daisy-days/template.html", + "raw_value": "Fredoka One", + "selector_or_token": "role_mapping.label.source_font" + }, + { + "path": "beautiful-html-templates/templates/daisy-days/design.md", + "raw_value": "px 3px 0 {colors.text-dark}\" text-headline-soft: \"3px 3px 0 rgba(0,0,0,0.2)\" typography: display: fontFamily: \"'Fredoka One', cursive\" fontSize: \"clamp(3.2rem, 7vw, 6.5rem)\" fontWeight: 400 lineHeight: 1.1 letterSpacing: 0.02em headline: fontFamily: \"'Fredoka One', cur", + "selector_or_token": "design.typography.roles" + } + ], + "role_mapping.metric": [ + { + "path": "beautiful-html-templates/templates/daisy-days/template.html", + "raw_value": "Fredoka One", + "selector_or_token": "role_mapping.metric.source_font" + }, + { + "path": "beautiful-html-templates/templates/daisy-days/design.md", + "raw_value": "px 3px 0 {colors.text-dark}\" text-headline-soft: \"3px 3px 0 rgba(0,0,0,0.2)\" typography: display: fontFamily: \"'Fredoka One', cursive\" fontSize: \"clamp(3.2rem, 7vw, 6.5rem)\" fontWeight: 400 lineHeight: 1.1 letterSpacing: 0.02em headline: fontFamily: \"'Fredoka One', cur", + "selector_or_token": "design.typography.roles" + } + ], + "source_typography_tokens": [ + { + "path": "beautiful-html-templates/templates/daisy-days/template.html", + "raw_value": "clamp(2.5rem,5vw,4.5rem); clamp(1.8rem,3.5vw,3rem); clamp(1.3rem,2vw,1.8rem); clamp(1rem,1.5vw,1.3rem); clamp(.95rem,1.3vw,1.15rem); .85rem; .8rem; clamp(3.2rem,7vw,6.5rem); clamp(1rem,1.8vw,1.4rem); clamp(1.4rem,2.5vw,2rem); clamp(.95rem,1.4vw,1.15rem); clamp(.85rem,1.3vw,1.1rem); clamp(.8rem,1.1vw,.95rem); 1.1rem; .9rem; 1.2rem; 400; 600; 500; 700; 1.1; 1.15; 1.2; 1.3; 1.6; 1.5; 1.4; 1; 1.35; 1.45; .02em; uppercase` on any badge/label when content is Hanzi — Chinese has no case", + "selector_or_token": "css.source_typography_tokens" + } + ], + "text_direction": [ + { + "path": "beautiful-html-templates/templates/daisy-days/template.html", + "raw_value": "column", + "selector_or_token": "css.text_direction" + } + ], + "text_transform_policy": [ + { + "path": "beautiful-html-templates/templates/daisy-days/template.html", + "raw_value": "uppercase` on any badge/label when content is Hanzi — Chinese has no case", + "selector_or_token": "css.text_transform_policy" + } + ], + "wrapping_policy": [ + { + "path": "beautiful-html-templates/templates/daisy-days/template.html", + "raw_value": "body:'Quicksand',sans-serif; } html,body{width:100%;height:100%;overflow:hidden;font-family:var(--font-body);color:var(--text-dark);background:var(--cream)} /* ---- Slide system ---- */ .slides-container{width:100vw;height:100vh;overflow-y:scroll;scroll-snap-type:y mandatory;scroll-behavior:smooth}", + "selector_or_token": "template.css.typography" + } + ] + }, "source_typography_tokens": { "font_families": [ "Fredoka One", @@ -9515,6 +10452,10 @@ "600", "700" ], + "letter_spacing": [ + "0.02em", + ".02em" + ], "line_height": [ "1.1", "1.15", @@ -9527,14 +10468,6 @@ "1.4", "1" ], - "letter_spacing": [ - "0.02em", - ".02em" - ], - "text_transform": [ - "uppercase` on any badge/label when content is Hanzi — Chinese has no case" - ], - "word_spacing": [], "paragraph_spacing": [ "12px", "28px", @@ -9555,538 +10488,44 @@ "16px", "48px" ], + "text_decoration": [], "text_direction": [ "column" ], - "writing_mode": [], - "text_decoration": [] + "text_transform": [ + "uppercase` on any badge/label when content is Hanzi — Chinese has no case" + ], + "word_spacing": [], + "writing_mode": [] }, - "role_mapping": { - "display": { - "font_role": "display", - "source_font": "Fredoka One", - "runtime_alias": "SVGlideDisplay", - "font_size": 54, - "font_weight": 900, - "line_height": 0.9, - "letter_spacing": 0, - "text_transform": "latin_uppercase_only", - "max_lines": 3, - "alignment": "source_layout_dependent" - }, - "body": { - "font_role": "body", - "source_font": "Quicksand", - "runtime_alias": "SVGlideBody", - "font_size": 20, - "font_weight": 400, - "line_height": 1.32, - "letter_spacing": 0, - "text_transform": "preserve_source_case", - "max_lines": 5, - "alignment": "source_layout_dependent" - }, - "label": { - "font_role": "label", - "source_font": "Fredoka One", - "runtime_alias": "SVGlideLabel", - "font_size": 12, - "font_weight": 700, - "line_height": 1.05, - "letter_spacing": 0.08, - "text_transform": "latin_uppercase_labels_reset_cjk_spacing", - "max_lines": 1, - "alignment": "source_layout_dependent" - }, - "metric": { - "font_role": "metric", - "source_font": "Fredoka One", - "runtime_alias": "SVGlideMetric", - "font_size": 42, - "font_weight": 900, - "line_height": 0.95, - "letter_spacing": 0, - "text_transform": "preserve_numbers_and_units", - "max_lines": 2, - "alignment": "source_layout_dependent" - } - }, - "font_size_scale": { - "display": 54, - "body": 20, - "label": 12, - "metric": 42 - }, - "font_weight_scale": { - "display": 900, - "body": 400, - "label": 700, - "metric": 900 - }, - "line_height_scale": { - "display": 0.9, - "body": 1.32, - "label": 1.05, - "metric": 0.95 - }, - "letter_spacing_scale": { - "display": 0, - "body": 0, - "label": 0.08, - "metric": 0 + "text_direction": { + "cjk": "ltr", + "default": "column" }, "text_transform_policy": { - "display": "latin_uppercase_only", "body": "preserve_source_case", + "display": "latin_uppercase_only", "label": "latin_uppercase_labels_reset_cjk_spacing", "metric": "preserve_numbers_and_units" }, - "hierarchy_ratio": 2.7, - "max_lines": { - "display": 3, - "body": 5, - "label": 1, - "metric": 2 - }, - "measure": { - "display": "0.55-0.78 canvas width", - "body": "40-70 characters or CJK equivalent", - "label": "short mono labels", - "metric": "short numeric/stat blocks" - }, - "alignment": { - "primary": "follow source composition", - "fallback": "left/top aligned unless source screenshot is centered" - }, - "cjk_typography_adjustment": { - "display_font_cn": "LXGW WenKai TC", - "body_font_cn": "ZCOOL XiaoWei", - "letter_spacing_policy": "reset_letter_spacing_for_cjk_keep_latin_labels", - "mixed_run_spacing": "pangu_spacing", - "italic_policy": "drop_italic" - }, - "mapping_reason": "按源模板字号/字重/行高/字距/大小写规则抽象到 960x540 Slide 画布的四个文本角色。", "word_spacing": { - "display": 0, "body": 0, + "display": 0, "label": 0, "metric": 0 }, - "paragraph_spacing": { - "display_after": 0, - "body_after": 12, - "label_after": 0, - "metric_after": 0 - }, "wrapping_policy": { - "display": "manual_break_or_balance", "body": "wrap_with_measure", + "display": "manual_break_or_balance", "label": "no_wrap_preferred", "metric": "no_wrap_preferred" }, - "text_direction": { - "default": "column", - "cjk": "ltr" - }, "writing_mode": { "default": "horizontal-tb", "vertical_roles": [] - }, - "extraction_confidence": { - "role_mapping.body": "inferred_from_layout", - "role_mapping.display": "inferred_from_layout", - "font_size_scale": "css_extracted_from_template_html", - "max_lines": "inferred_from_layout", - "writing_mode": "absent_use_default", - "text_direction": "css_extracted_from_template_html", - "alignment": "inferred_from_layout", - "role_mapping.label": "inferred_from_layout", - "paragraph_spacing": "css_extracted_from_template_html", - "text_transform_policy": "css_extracted_from_template_html", - "line_height_scale": "css_extracted_from_template_html", - "wrapping_policy": "inferred_from_layout", - "font_weight_scale": "css_extracted_from_template_html", - "source_typography_tokens": "css_extracted_from_template_html", - "word_spacing": "absent_use_default", - "role_mapping.metric": "inferred_from_layout", - "cjk_typography_adjustment": "inferred_from_layout", - "hierarchy_ratio": "inferred_from_layout", - "measure": "inferred_from_layout", - "mapping_reason": "inferred_from_layout", - "letter_spacing_scale": "css_extracted_from_template_html" - }, - "source_refs": { - "role_mapping.body": [ - { - "path": "beautiful-html-templates/templates/daisy-days/template.html", - "selector_or_token": "role_mapping.body.source_font", - "raw_value": "Quicksand" - }, - { - "path": "beautiful-html-templates/templates/daisy-days/design.md", - "selector_or_token": "design.typography.roles", - "raw_value": "px 3px 0 {colors.text-dark}\" text-headline-soft: \"3px 3px 0 rgba(0,0,0,0.2)\" typography: display: fontFamily: \"'Fredoka One', cursive\" fontSize: \"clamp(3.2rem, 7vw, 6.5rem)\" fontWeight: 400 lineHeight: 1.1 letterSpacing: 0.02em headline: fontFamily: \"'Fredoka One', cur" - } - ], - "role_mapping.display": [ - { - "path": "beautiful-html-templates/templates/daisy-days/template.html", - "selector_or_token": "role_mapping.display.source_font", - "raw_value": "Fredoka One" - }, - { - "path": "beautiful-html-templates/templates/daisy-days/design.md", - "selector_or_token": "design.typography.roles", - "raw_value": "px 3px 0 {colors.text-dark}\" text-headline-soft: \"3px 3px 0 rgba(0,0,0,0.2)\" typography: display: fontFamily: \"'Fredoka One', cursive\" fontSize: \"clamp(3.2rem, 7vw, 6.5rem)\" fontWeight: 400 lineHeight: 1.1 letterSpacing: 0.02em headline: fontFamily: \"'Fredoka One', cur" - } - ], - "font_size_scale": [ - { - "path": "beautiful-html-templates/templates/daisy-days/template.html", - "selector_or_token": "css.font_size_scale", - "raw_value": "clamp(2.5rem,5vw,4.5rem); clamp(1.8rem,3.5vw,3rem); clamp(1.3rem,2vw,1.8rem); clamp(1rem,1.5vw,1.3rem); clamp(.95rem,1.3vw,1.15rem); .85rem; .8rem; clamp(3.2rem,7vw,6.5rem); clamp(1rem,1.8vw,1.4rem); clamp(1.4rem,2.5vw,2rem); clamp(.95rem,1.4vw,1.15rem); clamp(.85rem,1.3vw,1.1rem); clamp(.8rem,1.1vw,.95rem); 1.1rem; .9rem; 1.2rem" - } - ], - "max_lines": [ - { - "path": "beautiful-html-templates/templates/daisy-days/template.html", - "selector_or_token": "template.css.typography", - "raw_value": "body:'Quicksand',sans-serif; } html,body{width:100%;height:100%;overflow:hidden;font-family:var(--font-body);color:var(--text-dark);background:var(--cream)} /* ---- Slide system ---- */ .slides-container{width:100vw;height:100vh;overflow-y:scroll;scroll-snap-type:y mandatory;scroll-behavior:smooth}" - } - ], - "text_direction": [ - { - "path": "beautiful-html-templates/templates/daisy-days/template.html", - "selector_or_token": "css.text_direction", - "raw_value": "column" - } - ], - "alignment": [ - { - "path": "beautiful-html-templates/templates/daisy-days/template.html", - "selector_or_token": "template.css.typography", - "raw_value": "body:'Quicksand',sans-serif; } html,body{width:100%;height:100%;overflow:hidden;font-family:var(--font-body);color:var(--text-dark);background:var(--cream)} /* ---- Slide system ---- */ .slides-container{width:100vw;height:100vh;overflow-y:scroll;scroll-snap-type:y mandatory;scroll-behavior:smooth}" - } - ], - "role_mapping.label": [ - { - "path": "beautiful-html-templates/templates/daisy-days/template.html", - "selector_or_token": "role_mapping.label.source_font", - "raw_value": "Fredoka One" - }, - { - "path": "beautiful-html-templates/templates/daisy-days/design.md", - "selector_or_token": "design.typography.roles", - "raw_value": "px 3px 0 {colors.text-dark}\" text-headline-soft: \"3px 3px 0 rgba(0,0,0,0.2)\" typography: display: fontFamily: \"'Fredoka One', cursive\" fontSize: \"clamp(3.2rem, 7vw, 6.5rem)\" fontWeight: 400 lineHeight: 1.1 letterSpacing: 0.02em headline: fontFamily: \"'Fredoka One', cur" - } - ], - "paragraph_spacing": [ - { - "path": "beautiful-html-templates/templates/daisy-days/template.html", - "selector_or_token": "css.paragraph_spacing", - "raw_value": "12px; 28px; 32px; 4px; 36px; 8px; 20px; 40px; 10px; 18px; 14px; 8px; 20px; 24px; 28px; 12px; 16px; 48px" - } - ], - "text_transform_policy": [ - { - "path": "beautiful-html-templates/templates/daisy-days/template.html", - "selector_or_token": "css.text_transform_policy", - "raw_value": "uppercase` on any badge/label when content is Hanzi — Chinese has no case" - } - ], - "line_height_scale": [ - { - "path": "beautiful-html-templates/templates/daisy-days/template.html", - "selector_or_token": "css.line_height_scale", - "raw_value": "1.1; 1.15; 1.2; 1.3; 1.6; 1.5; 1.4; 1; 1.35; 1.45" - } - ], - "wrapping_policy": [ - { - "path": "beautiful-html-templates/templates/daisy-days/template.html", - "selector_or_token": "template.css.typography", - "raw_value": "body:'Quicksand',sans-serif; } html,body{width:100%;height:100%;overflow:hidden;font-family:var(--font-body);color:var(--text-dark);background:var(--cream)} /* ---- Slide system ---- */ .slides-container{width:100vw;height:100vh;overflow-y:scroll;scroll-snap-type:y mandatory;scroll-behavior:smooth}" - } - ], - "font_weight_scale": [ - { - "path": "beautiful-html-templates/templates/daisy-days/template.html", - "selector_or_token": "css.font_weight_scale", - "raw_value": "400; 600; 500; 700" - } - ], - "source_typography_tokens": [ - { - "path": "beautiful-html-templates/templates/daisy-days/template.html", - "selector_or_token": "css.source_typography_tokens", - "raw_value": "clamp(2.5rem,5vw,4.5rem); clamp(1.8rem,3.5vw,3rem); clamp(1.3rem,2vw,1.8rem); clamp(1rem,1.5vw,1.3rem); clamp(.95rem,1.3vw,1.15rem); .85rem; .8rem; clamp(3.2rem,7vw,6.5rem); clamp(1rem,1.8vw,1.4rem); clamp(1.4rem,2.5vw,2rem); clamp(.95rem,1.4vw,1.15rem); clamp(.85rem,1.3vw,1.1rem); clamp(.8rem,1.1vw,.95rem); 1.1rem; .9rem; 1.2rem; 400; 600; 500; 700; 1.1; 1.15; 1.2; 1.3; 1.6; 1.5; 1.4; 1; 1.35; 1.45; .02em; uppercase` on any badge/label when content is Hanzi — Chinese has no case" - } - ], - "role_mapping.metric": [ - { - "path": "beautiful-html-templates/templates/daisy-days/template.html", - "selector_or_token": "role_mapping.metric.source_font", - "raw_value": "Fredoka One" - }, - { - "path": "beautiful-html-templates/templates/daisy-days/design.md", - "selector_or_token": "design.typography.roles", - "raw_value": "px 3px 0 {colors.text-dark}\" text-headline-soft: \"3px 3px 0 rgba(0,0,0,0.2)\" typography: display: fontFamily: \"'Fredoka One', cursive\" fontSize: \"clamp(3.2rem, 7vw, 6.5rem)\" fontWeight: 400 lineHeight: 1.1 letterSpacing: 0.02em headline: fontFamily: \"'Fredoka One', cur" - } - ], - "cjk_typography_adjustment": [ - { - "path": "beautiful-html-templates/templates/daisy-days/template.html", - "selector_or_token": "template.css.typography", - "raw_value": "body:'Quicksand',sans-serif; } html,body{width:100%;height:100%;overflow:hidden;font-family:var(--font-body);color:var(--text-dark);background:var(--cream)} /* ---- Slide system ---- */ .slides-container{width:100vw;height:100vh;overflow-y:scroll;scroll-snap-type:y mandatory;scroll-behavior:smooth}" - } - ], - "hierarchy_ratio": [ - { - "path": "beautiful-html-templates/templates/daisy-days/template.html", - "selector_or_token": "template.css.typography", - "raw_value": "body:'Quicksand',sans-serif; } html,body{width:100%;height:100%;overflow:hidden;font-family:var(--font-body);color:var(--text-dark);background:var(--cream)} /* ---- Slide system ---- */ .slides-container{width:100vw;height:100vh;overflow-y:scroll;scroll-snap-type:y mandatory;scroll-behavior:smooth}" - } - ], - "measure": [ - { - "path": "beautiful-html-templates/templates/daisy-days/template.html", - "selector_or_token": "template.css.typography", - "raw_value": "body:'Quicksand',sans-serif; } html,body{width:100%;height:100%;overflow:hidden;font-family:var(--font-body);color:var(--text-dark);background:var(--cream)} /* ---- Slide system ---- */ .slides-container{width:100vw;height:100vh;overflow-y:scroll;scroll-snap-type:y mandatory;scroll-behavior:smooth}" - } - ], - "mapping_reason": [ - { - "path": "beautiful-html-templates/templates/daisy-days/template.html", - "selector_or_token": "template.css.typography", - "raw_value": "body:'Quicksand',sans-serif; } html,body{width:100%;height:100%;overflow:hidden;font-family:var(--font-body);color:var(--text-dark);background:var(--cream)} /* ---- Slide system ---- */ .slides-container{width:100vw;height:100vh;overflow-y:scroll;scroll-snap-type:y mandatory;scroll-behavior:smooth}" - } - ], - "letter_spacing_scale": [ - { - "path": "beautiful-html-templates/templates/daisy-days/template.html", - "selector_or_token": "css.letter_spacing_scale", - "raw_value": ".02em" - } - ] } }, - "text_style_strategy": { - "bold": { - "source_usage": "source uses heavy display/label weights", - "mapped_weight": { - "display": 900, - "label": 700, - "metric": 900 - }, - "allowed_roles": [ - "display", - "label", - "metric" - ] - }, - "italic": { - "source_usage": "source uses italic/font-style or italic-family tokens", - "mapped_style": "latin_only_when_source_requires_else_normal", - "fallback_when_unavailable": "use color_shift or weight_shift; do not fake CJK italic", - "loss_notes": "Satori/Slide may not provide exact Google italic face; record as visual approximation." - }, - "underline": { - "source_usage": "source uses underline/text-decoration or hairline emphasis", - "mapped_decoration": "native underline only for actual text-decoration source usage", - "fallback_shape": "1px-3px rule or border accent when underline font rendering is unavailable" - }, - "line_through": { - "source_usage": "not present in source; default no line-through", - "mapped_decoration": "none", - "fallback_shape": "none" - }, - "emphasis": { - "color_shift": "use source accent color roles only", - "font_family_switch": "only switch between mapped display/body/label/metric roles from this family", - "weight_shift": "increase one role step within font_weight_scale", - "style_shift": "italic only when source_usage requires and CJK fallback is safe" - }, - "text_decoration_policy": { - "underline": { - "style": "solid", - "color": "currentColor", - "thickness": "1px" - }, - "line_through": { - "style": "none", - "color": "currentColor", - "thickness": "0px" - } - }, - "forbidden": [ - "fake_cjk_italic", - "drop_source_text_transform", - "drop_source_letter_spacing_without_loss_note", - "use_cross_family_font_motif", - "remote_font_dependency_without_receipt" - ], - "extraction_confidence": { - "text_decoration_policy.line_through.color": "absent_use_default", - "text_decoration_policy.underline.color": "css_extracted_from_template_html", - "text_decoration_policy.line_through.style": "absent_use_default", - "italic": "css_extracted_from_template_html", - "forbidden": "inferred_from_layout", - "emphasis": "inferred_from_layout", - "text_decoration_policy.underline.thickness": "css_extracted_from_template_html", - "underline": "css_extracted_from_template_html", - "text_decoration_policy.line_through.thickness": "absent_use_default", - "line_through": "absent_use_default", - "text_decoration_policy.underline.style": "css_extracted_from_template_html", - "bold": "css_extracted_from_template_html" - }, - "source_refs": { - "text_decoration_policy.underline.color": [ - { - "path": "beautiful-html-templates/templates/daisy-days/template.html", - "selector_or_token": "css.text-decoration", - "raw_value": "Principles The size ladder is the rhythm. Fredoka One does not get italicized, underlined, or rendered in alternate weights — Fredoka has one weight, full stop. Quicksand stays inside the 500 / 600 / 700 ladder; do not introduce 400 or 800 even if available. Letter-spacing on Fredoka stays at the s" - } - ], - "italic": [ - { - "path": "beautiful-html-templates/templates/daisy-days/template.html", - "selector_or_token": "css.font-style", - "raw_value": "aphic identity. Fredoka One is a chunky single-weight display face — it has no italic, no lighter variants, no condensed cuts. The display weight reads as 400 by spec but visually behaves as a heavy weight because the letterforms are so rounded and full. Every headline, every title, every step numb" - } - ], - "forbidden": [ - { - "path": "beautiful-html-templates/templates/daisy-days/template.html", - "selector_or_token": "template.css.typography", - "raw_value": "body:'Quicksand',sans-serif; } html,body{width:100%;height:100%;overflow:hidden;font-family:var(--font-body);color:var(--text-dark);background:var(--cream)} /* ---- Slide system ---- */ .slides-container{width:100vw;height:100vh;overflow-y:scroll;scroll-snap-type:y mandatory;scroll-behavior:smooth}" - } - ], - "emphasis": [ - { - "path": "beautiful-html-templates/templates/daisy-days/template.html", - "selector_or_token": "template.css.typography", - "raw_value": "body:'Quicksand',sans-serif; } html,body{width:100%;height:100%;overflow:hidden;font-family:var(--font-body);color:var(--text-dark);background:var(--cream)} /* ---- Slide system ---- */ .slides-container{width:100vw;height:100vh;overflow-y:scroll;scroll-snap-type:y mandatory;scroll-behavior:smooth}" - } - ], - "text_decoration_policy.underline.thickness": [ - { - "path": "beautiful-html-templates/templates/daisy-days/template.html", - "selector_or_token": "css.text-decoration", - "raw_value": "Principles The size ladder is the rhythm. Fredoka One does not get italicized, underlined, or rendered in alternate weights — Fredoka has one weight, full stop. Quicksand stays inside the 500 / 600 / 700 ladder; do not introduce 400 or 800 even if available. Letter-spacing on Fredoka stays at the s" - } - ], - "underline": [ - { - "path": "beautiful-html-templates/templates/daisy-days/template.html", - "selector_or_token": "css.text-decoration", - "raw_value": "Principles The size ladder is the rhythm. Fredoka One does not get italicized, underlined, or rendered in alternate weights — Fredoka has one weight, full stop. Quicksand stays inside the 500 / 600 / 700 ladder; do not introduce 400 or 800 even if available. Letter-spacing on Fredoka stays at the s" - } - ], - "text_decoration_policy.underline.style": [ - { - "path": "beautiful-html-templates/templates/daisy-days/template.html", - "selector_or_token": "css.text-decoration", - "raw_value": "Principles The size ladder is the rhythm. Fredoka One does not get italicized, underlined, or rendered in alternate weights — Fredoka has one weight, full stop. Quicksand stays inside the 500 / 600 / 700 ladder; do not introduce 400 or 800 even if available. Letter-spacing on Fredoka stays at the s" - } - ], - "bold": [ - { - "path": "beautiful-html-templates/templates/daisy-days/template.html", - "selector_or_token": "css.font-weight", - "raw_value": "400; 600; 500; 700" - } - ] - } - }, - "satori": { - "font_and_typography_constraints": [ - "italic is source-aware but CJK fake italic is forbidden; use color/weight fallback when unavailable", - "letter spacing is preserved for Latin labels and reset/softened for CJK" - ] - }, - "loss_notes": [ - "italic is source-aware but CJK fake italic is forbidden; use color/weight fallback when unavailable", - "letter spacing is preserved for Latin labels and reset/softened for CJK" - ], - "page_variant_count": 9, - "source_page_variants": [ - "cards", - "chart_bar", - "donut", - "process", - "quote", - "team", - "timeline", - "weekly", - "welcome" - ], - "page_family_source": { - "extractor": "skills/lark-slides/scripts/beautiful_template_page_family_extract.py", - "source_template_html": "beautiful-html-templates/templates/daisy-days/template.html", - "source_design_md": "beautiful-html-templates/templates/daisy-days/design.md", - "source_template_json": "beautiful-html-templates/templates/daisy-days/template.json", - "claim_boundary": "source extraction only; does not imply renderer, fidelity, quality gate, or production/default selectable status" - } - }, - { - "family_id": "editorial-forest", - "template_id": "serif-stat-editorial", - "runtime_template_id": "serif-stat-editorial", - "source_template_html": "beautiful-html-templates/templates/editorial-forest/template.html", - "source_design_md": "beautiful-html-templates/templates/editorial-forest/design.md", - "source_template_json": "beautiful-html-templates/templates/editorial-forest/template.json", - "renderer_id": "artboard_satori.serif-stat-editorial", - "renderer_module": "skills/lark-slides/scripts/artboard_renderer/templates/beautiful/serif-stat-editorial.mjs", - "golden_spec": "skills/lark-slides/scripts/fixtures/svglide_artboard/golden/serif-stat-editorial.canvas-spec.json", - "reference_screenshot": "beautiful-html-templates/screenshots/editorial-forest-1.png", - "fidelity_receipt": "skills/lark-slides/references/receipts/template-fidelity/editorial-forest.serif-stat-editorial.json", - "source_trace": [ - { - "source": "beautiful-html-templates/templates/editorial-forest/template.html", - "evidence": "source_template_html" - }, - { - "source": "beautiful-html-templates/templates/editorial-forest/design.md", - "evidence": "source_design_md" - }, - { - "source": "beautiful-html-templates/templates/editorial-forest/template.json", - "evidence": "source_template_json" - }, - { - "source": "beautiful-html-templates/screenshots/editorial-forest-1.png", - "evidence": "reference_screenshot" - }, - { - "source": "skills/lark-slides/references/absorptions/beautiful-html-templates/editorial-forest.serif-stat-editorial.json", - "evidence": "absorption_record" - } - ], "visual_contract": { - "path": "skills/lark-slides/references/visual-contracts/beautiful/editorial-forest.serif-stat-editorial.json", - "layout_rhythm": "editorial-forest: medium density, medium formality. Forest green, dusty pink, and warm cream meet Source Serif 4 in a quiet, intentional quarterly-review deck.", - "motifs": [ - "grid", - "accent line", - "card panels", - "paper texture", - "window chrome", - "poster blocks", - "quote mark", - "sticker collage" - ], - "palette_roles": [ - "accent", - "background", - "border", - "muted", - "negative", - "positive", - "primary", - "surface", - "text" - ], "do_not_simplify": [ "preserve_fonts_palette_grid_slide_classes_decorative_elements", "do_not_recolor_without_explicit_brand_override", @@ -10102,39 +10541,50 @@ "do_not_mark_production_without_renderer_golden_fidelity_receipt", "do_not_strip_identity_decorations", "do_not_recolor_without_explicit_brand_override" - ] + ], + "layout_rhythm": "daisy-days: medium density, low formality. Cheerful pastel deck with hand-drawn daisies, stars, and rainbows. Friendly, soft, and warm.", + "motifs": [ + "grid", + "accent line", + "card panels", + "poster blocks", + "quote mark", + "sticker collage" + ], + "palette_roles": [ + "accent", + "background", + "border", + "muted", + "negative", + "positive", + "primary", + "surface", + "text" + ], + "path": "skills/lark-slides/references/visual-contracts/beautiful/daisy-days.daisy-workshop-playbook.json" }, - "fidelity_gate": { - "status": "passed", - "score": 0.9627, - "threshold": 0.72, - "reference_screenshot": "/Users/bytedance/bd-projects/beautiful-html-templates/screenshots/editorial-forest-1.png", - "render_screenshot": "/Users/bytedance/bd-projects/workspaces/SVGlide/.worktrees/cli-svglide-svg-private/skills/lark-slides/scripts/fixtures/svglide_artboard/golden/serif-stat-editorial.preview.png", - "receipt_path": "skills/lark-slides/references/receipts/template-fidelity/editorial-forest.serif-stat-editorial.json", - "issues": [] - }, - "promotion_status": "needs_review", - "default_selectable": false, + "visual_contract_path": "skills/lark-slides/references/visual-contracts/beautiful/daisy-days.daisy-workshop-playbook.json" + }, + { "blocking_issues": [ - "selector_gate_missing", - "quality_gate_integration_pending", + "selector_gate_pending", + "quality_gate_pending", "production_review_pending" ], - "visual_contract_path": "skills/lark-slides/references/visual-contracts/beautiful/editorial-forest.serif-stat-editorial.json", - "planned_renderer_module": "skills/lark-slides/scripts/artboard_renderer/templates/beautiful/serif-stat-editorial.mjs", - "planned_golden_spec": "skills/lark-slides/scripts/fixtures/svglide_artboard/golden/serif-stat-editorial.canvas-spec.json", - "planned_fidelity_receipt": "skills/lark-slides/references/receipts/template-fidelity/editorial-forest.serif-stat-editorial.json", + "default_selectable": false, + "family_id": "editorial-forest", + "fidelity_gate": { + "issues": [], + "receipt_path": "skills/lark-slides/references/receipts/template-fidelity/editorial-forest.serif-stat-editorial.json", + "reference_screenshot": "/Users/bytedance/bd-projects/beautiful-html-templates/screenshots/editorial-forest-1.png", + "render_screenshot": "/Users/bytedance/bd-projects/workspaces/SVGlide/.worktrees/cli-svglide-svg-private/skills/lark-slides/scripts/fixtures/svglide_artboard/golden/serif-stat-editorial.preview.png", + "score": 0.9627, + "status": "passed", + "threshold": 0.72 + }, + "fidelity_receipt": "skills/lark-slides/references/receipts/template-fidelity/editorial-forest.serif-stat-editorial.json", "font_strategy": { - "source_fonts": [ - "JetBrains Mono", - "Source Serif 4", - "Source Serif Pro", - "LXGW WenKai TC" - ], - "slide_native_preferred": [ - "system-mono", - "system-serif-cjk" - ], "adobe_or_embedded_fallback": [ "Source Code Pro", "Source Serif Pro", @@ -10142,59 +10592,17 @@ "思源宋体" ], "cjk_fallback": "Noto Serif SC", - "role_mapping": { - "display": { - "source_font": "JetBrains Mono", - "slide_font": "Source Code Pro", - "runtime_alias": "SVGlideDisplay", - "cjk_font": "思源等宽", - "fallback_stack": [ - "system-mono", - "SVGlideDisplay" - ], - "source_only": false, - "requires_download": false, - "mapping_reason": "保留 JetBrains Mono 的语义角色,但运行时优先使用 Slide/系统可用的 Source Code Pro 与 思源等宽。" - }, - "body": { - "source_font": "Source Serif 4", - "slide_font": "Source Serif Pro", - "runtime_alias": "SVGlideBody", - "cjk_font": "思源宋体", - "fallback_stack": [ - "system-serif-cjk", - "SVGlideBody" - ], - "source_only": false, - "requires_download": false, - "mapping_reason": "保留 Source Serif 4 的语义角色,但运行时优先使用 Slide/系统可用的 Source Serif Pro 与 思源宋体。" - }, - "label": { - "source_font": "JetBrains Mono", - "slide_font": "Source Code Pro", - "runtime_alias": "SVGlideLabel", - "cjk_font": "思源等宽", - "fallback_stack": [ - "system-mono", - "SVGlideLabel" - ], - "source_only": false, - "requires_download": false, - "mapping_reason": "保留 JetBrains Mono 的语义角色,但运行时优先使用 Slide/系统可用的 Source Code Pro 与 思源等宽。" - }, - "metric": { - "source_font": "JetBrains Mono", - "slide_font": "Source Code Pro", - "runtime_alias": "SVGlideMetric", - "cjk_font": "思源等宽", - "fallback_stack": [ - "system-mono", - "SVGlideMetric" - ], - "source_only": false, - "requires_download": false, - "mapping_reason": "保留 JetBrains Mono 的语义角色,但运行时优先使用 Slide/系统可用的 Source Code Pro 与 思源等宽。" - } + "extraction_confidence": { + "adobe_or_embedded_fallback": "inferred_from_layout", + "cjk_fallback": "inferred_from_layout", + "forbidden": "inferred_from_layout", + "mapping_reason": "inferred_from_layout", + "role_mapping.body": "inferred_from_layout", + "role_mapping.display": "inferred_from_layout", + "role_mapping.label": "inferred_from_layout", + "role_mapping.metric": "inferred_from_layout", + "slide_native_preferred": "inferred_from_layout", + "source_fonts": "css_extracted_from_template_html" }, "forbidden": [ "remote_font_runtime_dependency", @@ -10203,118 +10611,686 @@ "drop_cjk_fallback" ], "mapping_reason": "根据 design.md/template.html/template.json 中的 font-family 与 typography token 提取源字体;运行时按 Slide/系统/Adobe/思源可用字体降级。", + "role_mapping": { + "body": { + "cjk_font": "思源宋体", + "fallback_stack": [ + "system-serif-cjk", + "SVGlideBody" + ], + "mapping_reason": "保留 Source Serif 4 的语义角色,但运行时优先使用 Slide/系统可用的 Source Serif Pro 与 思源宋体。", + "requires_download": false, + "runtime_alias": "SVGlideBody", + "slide_font": "Source Serif Pro", + "source_font": "Source Serif 4", + "source_only": false + }, + "display": { + "cjk_font": "思源等宽", + "fallback_stack": [ + "system-mono", + "SVGlideDisplay" + ], + "mapping_reason": "保留 JetBrains Mono 的语义角色,但运行时优先使用 Slide/系统可用的 Source Code Pro 与 思源等宽。", + "requires_download": false, + "runtime_alias": "SVGlideDisplay", + "slide_font": "Source Code Pro", + "source_font": "JetBrains Mono", + "source_only": false + }, + "label": { + "cjk_font": "思源等宽", + "fallback_stack": [ + "system-mono", + "SVGlideLabel" + ], + "mapping_reason": "保留 JetBrains Mono 的语义角色,但运行时优先使用 Slide/系统可用的 Source Code Pro 与 思源等宽。", + "requires_download": false, + "runtime_alias": "SVGlideLabel", + "slide_font": "Source Code Pro", + "source_font": "JetBrains Mono", + "source_only": false + }, + "metric": { + "cjk_font": "思源等宽", + "fallback_stack": [ + "system-mono", + "SVGlideMetric" + ], + "mapping_reason": "保留 JetBrains Mono 的语义角色,但运行时优先使用 Slide/系统可用的 Source Code Pro 与 思源等宽。", + "requires_download": false, + "runtime_alias": "SVGlideMetric", + "slide_font": "Source Code Pro", + "source_font": "JetBrains Mono", + "source_only": false + } + }, + "slide_native_preferred": [ + "system-mono", + "system-serif-cjk" + ], "source_evidence": [ "beautiful-html-templates/templates/editorial-forest/design.md", "beautiful-html-templates/templates/editorial-forest/template.html", "beautiful-html-templates/templates/editorial-forest/template.json", "beautiful-html-templates/screenshots/editorial-forest-1.png" ], - "extraction_confidence": { - "role_mapping.body": "inferred_from_layout", - "role_mapping.display": "inferred_from_layout", - "source_fonts": "css_extracted_from_template_html", - "adobe_or_embedded_fallback": "inferred_from_layout", - "cjk_fallback": "inferred_from_layout", - "role_mapping.metric": "inferred_from_layout", - "forbidden": "inferred_from_layout", - "slide_native_preferred": "inferred_from_layout", - "mapping_reason": "inferred_from_layout", - "role_mapping.label": "inferred_from_layout" - }, + "source_fonts": [ + "JetBrains Mono", + "Source Serif 4", + "Source Serif Pro", + "LXGW WenKai TC" + ], "source_refs": { - "role_mapping.body": [ - { - "path": "beautiful-html-templates/templates/editorial-forest/template.html", - "selector_or_token": "role_mapping.body.source_font", - "raw_value": "Source Serif 4" - }, - { - "path": "beautiful-html-templates/templates/editorial-forest/design.md", - "selector_or_token": "design.typography.roles", - "raw_value": "pink-deep: \"#d27e96\" cream: \"#efe7d4\" cream-2: \"#e6dcc4\" ink: \"#1a1a17\" typography: display-hero: fontFamily: \"'Source Serif 4', 'Source Serif Pro', Georgia, serif\" fontSize: 220 fontWeight: 500 lineHeight: 0.92 letterSpacing: -0.02em display: fontFamily: \"'Source" - } - ], - "role_mapping.display": [ - { - "path": "beautiful-html-templates/templates/editorial-forest/template.html", - "selector_or_token": "role_mapping.display.source_font", - "raw_value": "JetBrains Mono" - }, - { - "path": "beautiful-html-templates/templates/editorial-forest/design.md", - "selector_or_token": "design.typography.roles", - "raw_value": "pink-deep: \"#d27e96\" cream: \"#efe7d4\" cream-2: \"#e6dcc4\" ink: \"#1a1a17\" typography: display-hero: fontFamily: \"'Source Serif 4', 'Source Serif Pro', Georgia, serif\" fontSize: 220 fontWeight: 500 lineHeight: 0.92 letterSpacing: -0.02em display: fontFamily: \"'Source" - } - ], - "source_fonts": [ - { - "path": "beautiful-html-templates/templates/editorial-forest/template.html", - "selector_or_token": "css.font-family", - "raw_value": "'Source Serif 4', 'Source Serif Pro', 'LXGW WenKai TC', 'Noto Serif SC', Georgia, serif; var(--serif); var(--mono)" - } - ], "adobe_or_embedded_fallback": [ { "path": "beautiful-html-templates/templates/editorial-forest/template.html", - "selector_or_token": "css.font-family", - "raw_value": "'Source Serif 4', 'Source Serif Pro', 'LXGW WenKai TC', 'Noto Serif SC', Georgia, serif; var(--serif); var(--mono)" + "raw_value": "'Source Serif 4', 'Source Serif Pro', 'LXGW WenKai TC', 'Noto Serif SC', Georgia, serif; var(--serif); var(--mono)", + "selector_or_token": "css.font-family" } ], "cjk_fallback": [ { "path": "beautiful-html-templates/templates/editorial-forest/template.html", - "selector_or_token": "css.font-family", - "raw_value": "'Source Serif 4', 'Source Serif Pro', 'LXGW WenKai TC', 'Noto Serif SC', Georgia, serif; var(--serif); var(--mono)" - } - ], - "role_mapping.metric": [ - { - "path": "beautiful-html-templates/templates/editorial-forest/template.html", - "selector_or_token": "role_mapping.metric.source_font", - "raw_value": "JetBrains Mono" - }, - { - "path": "beautiful-html-templates/templates/editorial-forest/design.md", - "selector_or_token": "design.typography.roles", - "raw_value": "pink-deep: \"#d27e96\" cream: \"#efe7d4\" cream-2: \"#e6dcc4\" ink: \"#1a1a17\" typography: display-hero: fontFamily: \"'Source Serif 4', 'Source Serif Pro', Georgia, serif\" fontSize: 220 fontWeight: 500 lineHeight: 0.92 letterSpacing: -0.02em display: fontFamily: \"'Source" + "raw_value": "'Source Serif 4', 'Source Serif Pro', 'LXGW WenKai TC', 'Noto Serif SC', Georgia, serif; var(--serif); var(--mono)", + "selector_or_token": "css.font-family" } ], "forbidden": [ { "path": "beautiful-html-templates/templates/editorial-forest/template.html", - "selector_or_token": "css.font-family", - "raw_value": "'Source Serif 4', 'Source Serif Pro', 'LXGW WenKai TC', 'Noto Serif SC', Georgia, serif; var(--serif); var(--mono)" - } - ], - "slide_native_preferred": [ - { - "path": "beautiful-html-templates/templates/editorial-forest/template.html", - "selector_or_token": "css.font-family", - "raw_value": "'Source Serif 4', 'Source Serif Pro', 'LXGW WenKai TC', 'Noto Serif SC', Georgia, serif; var(--serif); var(--mono)" + "raw_value": "'Source Serif 4', 'Source Serif Pro', 'LXGW WenKai TC', 'Noto Serif SC', Georgia, serif; var(--serif); var(--mono)", + "selector_or_token": "css.font-family" } ], "mapping_reason": [ { "path": "beautiful-html-templates/templates/editorial-forest/template.html", - "selector_or_token": "css.font-family", - "raw_value": "'Source Serif 4', 'Source Serif Pro', 'LXGW WenKai TC', 'Noto Serif SC', Georgia, serif; var(--serif); var(--mono)" + "raw_value": "'Source Serif 4', 'Source Serif Pro', 'LXGW WenKai TC', 'Noto Serif SC', Georgia, serif; var(--serif); var(--mono)", + "selector_or_token": "css.font-family" + } + ], + "role_mapping.body": [ + { + "path": "beautiful-html-templates/templates/editorial-forest/template.html", + "raw_value": "Source Serif 4", + "selector_or_token": "role_mapping.body.source_font" + }, + { + "path": "beautiful-html-templates/templates/editorial-forest/design.md", + "raw_value": "pink-deep: \"#d27e96\" cream: \"#efe7d4\" cream-2: \"#e6dcc4\" ink: \"#1a1a17\" typography: display-hero: fontFamily: \"'Source Serif 4', 'Source Serif Pro', Georgia, serif\" fontSize: 220 fontWeight: 500 lineHeight: 0.92 letterSpacing: -0.02em display: fontFamily: \"'Source", + "selector_or_token": "design.typography.roles" + } + ], + "role_mapping.display": [ + { + "path": "beautiful-html-templates/templates/editorial-forest/template.html", + "raw_value": "JetBrains Mono", + "selector_or_token": "role_mapping.display.source_font" + }, + { + "path": "beautiful-html-templates/templates/editorial-forest/design.md", + "raw_value": "pink-deep: \"#d27e96\" cream: \"#efe7d4\" cream-2: \"#e6dcc4\" ink: \"#1a1a17\" typography: display-hero: fontFamily: \"'Source Serif 4', 'Source Serif Pro', Georgia, serif\" fontSize: 220 fontWeight: 500 lineHeight: 0.92 letterSpacing: -0.02em display: fontFamily: \"'Source", + "selector_or_token": "design.typography.roles" } ], "role_mapping.label": [ { "path": "beautiful-html-templates/templates/editorial-forest/template.html", - "selector_or_token": "role_mapping.label.source_font", - "raw_value": "JetBrains Mono" + "raw_value": "JetBrains Mono", + "selector_or_token": "role_mapping.label.source_font" }, { "path": "beautiful-html-templates/templates/editorial-forest/design.md", - "selector_or_token": "design.typography.roles", - "raw_value": "pink-deep: \"#d27e96\" cream: \"#efe7d4\" cream-2: \"#e6dcc4\" ink: \"#1a1a17\" typography: display-hero: fontFamily: \"'Source Serif 4', 'Source Serif Pro', Georgia, serif\" fontSize: 220 fontWeight: 500 lineHeight: 0.92 letterSpacing: -0.02em display: fontFamily: \"'Source" + "raw_value": "pink-deep: \"#d27e96\" cream: \"#efe7d4\" cream-2: \"#e6dcc4\" ink: \"#1a1a17\" typography: display-hero: fontFamily: \"'Source Serif 4', 'Source Serif Pro', Georgia, serif\" fontSize: 220 fontWeight: 500 lineHeight: 0.92 letterSpacing: -0.02em display: fontFamily: \"'Source", + "selector_or_token": "design.typography.roles" + } + ], + "role_mapping.metric": [ + { + "path": "beautiful-html-templates/templates/editorial-forest/template.html", + "raw_value": "JetBrains Mono", + "selector_or_token": "role_mapping.metric.source_font" + }, + { + "path": "beautiful-html-templates/templates/editorial-forest/design.md", + "raw_value": "pink-deep: \"#d27e96\" cream: \"#efe7d4\" cream-2: \"#e6dcc4\" ink: \"#1a1a17\" typography: display-hero: fontFamily: \"'Source Serif 4', 'Source Serif Pro', Georgia, serif\" fontSize: 220 fontWeight: 500 lineHeight: 0.92 letterSpacing: -0.02em display: fontFamily: \"'Source", + "selector_or_token": "design.typography.roles" + } + ], + "slide_native_preferred": [ + { + "path": "beautiful-html-templates/templates/editorial-forest/template.html", + "raw_value": "'Source Serif 4', 'Source Serif Pro', 'LXGW WenKai TC', 'Noto Serif SC', Georgia, serif; var(--serif); var(--mono)", + "selector_or_token": "css.font-family" + } + ], + "source_fonts": [ + { + "path": "beautiful-html-templates/templates/editorial-forest/template.html", + "raw_value": "'Source Serif 4', 'Source Serif Pro', 'LXGW WenKai TC', 'Noto Serif SC', Georgia, serif; var(--serif); var(--mono)", + "selector_or_token": "css.font-family" } ] } }, + "golden_spec": "skills/lark-slides/scripts/fixtures/svglide_artboard/golden/serif-stat-editorial.canvas-spec.json", + "implemented_page_variants": [ + "cover", + "agenda", + "statement", + "two-col", + "data", + "framework", + "stats", + "summary" + ], + "loss_notes": [ + "italic is source-aware but CJK fake italic is forbidden; use color/weight fallback when unavailable", + "letter spacing is preserved for Latin labels and reset/softened for CJK" + ], + "page_family_smoke": { + "covered_implemented_variant_count": 8, + "covered_role_count": 9, + "production_selectable": false, + "rendered_pages": 9, + "reuse_count": 1, + "status": "passed" + }, + "page_family_smoke_deck": "skills/lark-slides/references/page-family-smoke-decks/editorial-forest.json", + "page_family_smoke_receipt": "skills/lark-slides/references/receipts/page-family-smoke/editorial-forest.serif-stat-editorial.json", + "page_family_source": { + "claim_boundary": "source extraction only; does not imply renderer, fidelity, quality gate, or production/default selectable status", + "extractor": "skills/lark-slides/scripts/beautiful_template_page_family_extract.py", + "source_design_md": "beautiful-html-templates/templates/editorial-forest/design.md", + "source_template_html": "beautiful-html-templates/templates/editorial-forest/template.html", + "source_template_json": "beautiful-html-templates/templates/editorial-forest/template.json" + }, + "page_variant_count": 8, + "page_variant_golden_specs": { + "agenda": "skills/lark-slides/scripts/fixtures/svglide_artboard/golden/editorial-forest.agenda.canvas-spec.json", + "cover": "skills/lark-slides/scripts/fixtures/svglide_artboard/golden/editorial-forest.cover.canvas-spec.json", + "data": "skills/lark-slides/scripts/fixtures/svglide_artboard/golden/editorial-forest.data.canvas-spec.json", + "framework": "skills/lark-slides/scripts/fixtures/svglide_artboard/golden/editorial-forest.framework.canvas-spec.json", + "statement": "skills/lark-slides/scripts/fixtures/svglide_artboard/golden/editorial-forest.statement.canvas-spec.json", + "stats": "skills/lark-slides/scripts/fixtures/svglide_artboard/golden/editorial-forest.stats.canvas-spec.json", + "summary": "skills/lark-slides/scripts/fixtures/svglide_artboard/golden/editorial-forest.summary.canvas-spec.json", + "two-col": "skills/lark-slides/scripts/fixtures/svglide_artboard/golden/editorial-forest.two-col.canvas-spec.json" + }, + "planned_fidelity_receipt": "skills/lark-slides/references/receipts/template-fidelity/editorial-forest.serif-stat-editorial.json", + "planned_golden_spec": "skills/lark-slides/scripts/fixtures/svglide_artboard/golden/serif-stat-editorial.canvas-spec.json", + "planned_renderer_module": "skills/lark-slides/scripts/artboard_renderer/templates/beautiful/serif-stat-editorial.mjs", + "promotion_status": "needs_review", + "reference_screenshot": "beautiful-html-templates/screenshots/editorial-forest-1.png", + "renderer_id": "artboard_satori.serif-stat-editorial", + "renderer_module": "skills/lark-slides/scripts/artboard_renderer/templates/beautiful/serif-stat-editorial.mjs", + "renderer_stage": "page_family", + "runtime_template_id": "serif-stat-editorial", + "satori": { + "font_and_typography_constraints": [ + "italic is source-aware but CJK fake italic is forbidden; use color/weight fallback when unavailable", + "letter spacing is preserved for Latin labels and reset/softened for CJK" + ] + }, + "selection_scope": "experimental", + "source_design_md": "beautiful-html-templates/templates/editorial-forest/design.md", + "source_page_variants": [ + "cover", + "agenda", + "statement", + "two-col", + "data", + "framework", + "stats", + "summary" + ], + "source_template_html": "beautiful-html-templates/templates/editorial-forest/template.html", + "source_template_json": "beautiful-html-templates/templates/editorial-forest/template.json", + "source_trace": [ + { + "evidence": "source_template_html", + "source": "beautiful-html-templates/templates/editorial-forest/template.html" + }, + { + "evidence": "source_design_md", + "source": "beautiful-html-templates/templates/editorial-forest/design.md" + }, + { + "evidence": "source_template_json", + "source": "beautiful-html-templates/templates/editorial-forest/template.json" + }, + { + "evidence": "reference_screenshot", + "source": "beautiful-html-templates/screenshots/editorial-forest-1.png" + }, + { + "evidence": "absorption_record", + "source": "skills/lark-slides/references/absorptions/beautiful-html-templates/editorial-forest.serif-stat-editorial.json" + } + ], + "supported_page_variants": [ + "cover", + "agenda", + "statement", + "two-col", + "data", + "framework", + "stats", + "summary" + ], + "template_id": "serif-stat-editorial", + "text_style_strategy": { + "bold": { + "allowed_roles": [ + "display", + "label", + "metric" + ], + "mapped_weight": { + "display": 900, + "label": 700, + "metric": 900 + }, + "source_usage": "source uses heavy display/label weights" + }, + "emphasis": { + "color_shift": "use source accent color roles only", + "font_family_switch": "only switch between mapped display/body/label/metric roles from this family", + "style_shift": "italic only when source_usage requires and CJK fallback is safe", + "weight_shift": "increase one role step within font_weight_scale" + }, + "extraction_confidence": { + "bold": "css_extracted_from_template_html", + "emphasis": "inferred_from_layout", + "forbidden": "inferred_from_layout", + "italic": "css_extracted_from_template_html", + "line_through": "absent_use_default", + "text_decoration_policy.line_through.color": "absent_use_default", + "text_decoration_policy.line_through.style": "absent_use_default", + "text_decoration_policy.line_through.thickness": "absent_use_default", + "text_decoration_policy.underline.color": "css_extracted_from_template_html", + "text_decoration_policy.underline.style": "css_extracted_from_template_html", + "text_decoration_policy.underline.thickness": "css_extracted_from_template_html", + "underline": "css_extracted_from_template_html" + }, + "forbidden": [ + "fake_cjk_italic", + "drop_source_text_transform", + "drop_source_letter_spacing_without_loss_note", + "use_cross_family_font_motif", + "remote_font_dependency_without_receipt" + ], + "italic": { + "fallback_when_unavailable": "use color_shift or weight_shift; do not fake CJK italic", + "loss_notes": "Satori/Slide may not provide exact Google italic face; record as visual approximation.", + "mapped_style": "latin_only_when_source_requires_else_normal", + "source_usage": "source uses italic/font-style or italic-family tokens" + }, + "line_through": { + "fallback_shape": "none", + "mapped_decoration": "none", + "source_usage": "not present in source; default no line-through" + }, + "source_refs": { + "bold": [ + { + "path": "beautiful-html-templates/templates/editorial-forest/template.html", + "raw_value": "500; 400; 600", + "selector_or_token": "css.font-weight" + } + ], + "emphasis": [ + { + "path": "beautiful-html-templates/templates/editorial-forest/template.html", + "raw_value": "e; } html, body { margin: 0; padding: 0; background: #111; } deck-stage { font-family: var(--serif); color: var(--ink); } section { box-sizing: border-box; width: 1920px; height: 1080px; padding: 96px 120px; background: var(--cream); color: var(--ink); position:", + "selector_or_token": "template.css.typography" + } + ], + "forbidden": [ + { + "path": "beautiful-html-templates/templates/editorial-forest/template.html", + "raw_value": "e; } html, body { margin: 0; padding: 0; background: #111; } deck-stage { font-family: var(--serif); color: var(--ink); } section { box-sizing: border-box; width: 1920px; height: 1080px; padding: 96px 120px; background: var(--cream); color: var(--ink); position:", + "selector_or_token": "template.css.typography" + } + ], + "italic": [ + { + "path": "beautiful-html-templates/templates/editorial-forest/template.html", + "raw_value": "mono never appears at headline scale, serif never appears at axis-tick scale. Italics are not used anywhere in the system. Underline is not used. Emphasis is communicated through size and color contrast, not type variants. ## Layout ### Canvas System The system targets a fixed **1920×1080** canv", + "selector_or_token": "css.font-style" + } + ], + "text_decoration_policy.underline.color": [ + { + "path": "beautiful-html-templates/templates/editorial-forest/template.html", + "raw_value": "never appears at axis-tick scale. Italics are not used anywhere in the system. Underline is not used. Emphasis is communicated through size and color contrast, not type variants. ## Layout ### Canvas System The system targets a fixed **1920×1080** canvas. Slides are `
` elements at exact", + "selector_or_token": "css.text-decoration" + } + ], + "text_decoration_policy.underline.style": [ + { + "path": "beautiful-html-templates/templates/editorial-forest/template.html", + "raw_value": "never appears at axis-tick scale. Italics are not used anywhere in the system. Underline is not used. Emphasis is communicated through size and color contrast, not type variants. ## Layout ### Canvas System The system targets a fixed **1920×1080** canvas. Slides are `
` elements at exact", + "selector_or_token": "css.text-decoration" + } + ], + "text_decoration_policy.underline.thickness": [ + { + "path": "beautiful-html-templates/templates/editorial-forest/template.html", + "raw_value": "never appears at axis-tick scale. Italics are not used anywhere in the system. Underline is not used. Emphasis is communicated through size and color contrast, not type variants. ## Layout ### Canvas System The system targets a fixed **1920×1080** canvas. Slides are `
` elements at exact", + "selector_or_token": "css.text-decoration" + } + ], + "underline": [ + { + "path": "beautiful-html-templates/templates/editorial-forest/template.html", + "raw_value": "never appears at axis-tick scale. Italics are not used anywhere in the system. Underline is not used. Emphasis is communicated through size and color contrast, not type variants. ## Layout ### Canvas System The system targets a fixed **1920×1080** canvas. Slides are `
` elements at exact", + "selector_or_token": "css.text-decoration" + } + ] + }, + "text_decoration_policy": { + "line_through": { + "color": "currentColor", + "style": "none", + "thickness": "0px" + }, + "underline": { + "color": "currentColor", + "style": "solid", + "thickness": "1px" + } + }, + "underline": { + "fallback_shape": "1px-3px rule or border accent when underline font rendering is unavailable", + "mapped_decoration": "native underline only for actual text-decoration source usage", + "source_usage": "source uses underline/text-decoration or hairline emphasis" + } + }, "typography_strategy": { + "alignment": { + "fallback": "left/top aligned unless source screenshot is centered", + "primary": "follow source composition" + }, + "cjk_typography_adjustment": { + "body_font_cn": "Noto Sans SC", + "display_font_cn": "Noto Serif SC", + "italic_policy": "color_only_emphasis", + "letter_spacing_policy": "reset_letter_spacing_for_cjk_keep_latin_labels", + "mixed_run_spacing": "pangu_spacing" + }, + "extraction_confidence": { + "alignment": "inferred_from_layout", + "cjk_typography_adjustment": "inferred_from_layout", + "font_size_scale": "css_extracted_from_template_html", + "font_weight_scale": "css_extracted_from_template_html", + "hierarchy_ratio": "inferred_from_layout", + "letter_spacing_scale": "css_extracted_from_template_html", + "line_height_scale": "css_extracted_from_template_html", + "mapping_reason": "inferred_from_layout", + "max_lines": "inferred_from_layout", + "measure": "inferred_from_layout", + "paragraph_spacing": "css_extracted_from_template_html", + "role_mapping.body": "inferred_from_layout", + "role_mapping.display": "inferred_from_layout", + "role_mapping.label": "inferred_from_layout", + "role_mapping.metric": "inferred_from_layout", + "source_typography_tokens": "css_extracted_from_template_html", + "text_direction": "css_extracted_from_template_html", + "text_transform_policy": "css_extracted_from_template_html", + "word_spacing": "absent_use_default", + "wrapping_policy": "inferred_from_layout", + "writing_mode": "absent_use_default" + }, + "font_size_scale": { + "body": 20, + "display": 54, + "label": 12, + "metric": 42 + }, + "font_weight_scale": { + "body": 400, + "display": 900, + "label": 700, + "metric": 900 + }, + "hierarchy_ratio": 2.7, + "letter_spacing_scale": { + "body": 0, + "display": 0, + "label": 0.08, + "metric": 0 + }, + "line_height_scale": { + "body": 1.32, + "display": 0.9, + "label": 1.05, + "metric": 0.95 + }, + "mapping_reason": "按源模板字号/字重/行高/字距/大小写规则抽象到 960x540 Slide 画布的四个文本角色。", + "max_lines": { + "body": 5, + "display": 3, + "label": 1, + "metric": 2 + }, + "measure": { + "body": "40-70 characters or CJK equivalent", + "display": "0.55-0.78 canvas width", + "label": "short mono labels", + "metric": "short numeric/stat blocks" + }, + "paragraph_spacing": { + "body_after": 12, + "display_after": 0, + "label_after": 0, + "metric_after": 0 + }, + "role_mapping": { + "body": { + "alignment": "source_layout_dependent", + "font_role": "body", + "font_size": 20, + "font_weight": 400, + "letter_spacing": 0, + "line_height": 1.32, + "max_lines": 5, + "runtime_alias": "SVGlideBody", + "source_font": "Source Serif 4", + "text_transform": "preserve_source_case" + }, + "display": { + "alignment": "source_layout_dependent", + "font_role": "display", + "font_size": 54, + "font_weight": 900, + "letter_spacing": 0, + "line_height": 0.9, + "max_lines": 3, + "runtime_alias": "SVGlideDisplay", + "source_font": "JetBrains Mono", + "text_transform": "latin_uppercase_only" + }, + "label": { + "alignment": "source_layout_dependent", + "font_role": "label", + "font_size": 12, + "font_weight": 700, + "letter_spacing": 0.08, + "line_height": 1.05, + "max_lines": 1, + "runtime_alias": "SVGlideLabel", + "source_font": "JetBrains Mono", + "text_transform": "latin_uppercase_labels_reset_cjk_spacing" + }, + "metric": { + "alignment": "source_layout_dependent", + "font_role": "metric", + "font_size": 42, + "font_weight": 900, + "letter_spacing": 0, + "line_height": 0.95, + "max_lines": 2, + "runtime_alias": "SVGlideMetric", + "source_font": "JetBrains Mono", + "text_transform": "preserve_numbers_and_units" + } + }, + "source_refs": { + "alignment": [ + { + "path": "beautiful-html-templates/templates/editorial-forest/template.html", + "raw_value": "e; } html, body { margin: 0; padding: 0; background: #111; } deck-stage { font-family: var(--serif); color: var(--ink); } section { box-sizing: border-box; width: 1920px; height: 1080px; padding: 96px 120px; background: var(--cream); color: var(--ink); position:", + "selector_or_token": "template.css.typography" + } + ], + "cjk_typography_adjustment": [ + { + "path": "beautiful-html-templates/templates/editorial-forest/template.html", + "raw_value": "e; } html, body { margin: 0; padding: 0; background: #111; } deck-stage { font-family: var(--serif); color: var(--ink); } section { box-sizing: border-box; width: 1920px; height: 1080px; padding: 96px 120px; background: var(--cream); color: var(--ink); position:", + "selector_or_token": "template.css.typography" + } + ], + "font_size_scale": [ + { + "path": "beautiful-html-templates/templates/editorial-forest/template.html", + "raw_value": "26px; 28px; 220px; 96px; 56px; 84px; 24px; 140px; 44px; 30px; 32px; 68px; 80px; 110px", + "selector_or_token": "css.font_size_scale" + } + ], + "font_weight_scale": [ + { + "path": "beautiful-html-templates/templates/editorial-forest/template.html", + "raw_value": "500; 400; 600", + "selector_or_token": "css.font_weight_scale" + } + ], + "hierarchy_ratio": [ + { + "path": "beautiful-html-templates/templates/editorial-forest/template.html", + "raw_value": "e; } html, body { margin: 0; padding: 0; background: #111; } deck-stage { font-family: var(--serif); color: var(--ink); } section { box-sizing: border-box; width: 1920px; height: 1080px; padding: 96px 120px; background: var(--cream); color: var(--ink); position:", + "selector_or_token": "template.css.typography" + } + ], + "letter_spacing_scale": [ + { + "path": "beautiful-html-templates/templates/editorial-forest/template.html", + "raw_value": "0` — or a tiny positive `0.02em` if the headline feels visually packed. - **Never `text-transform: uppercase` on CJK text.** Chinese has no case; 0.18em; 0.1em; -0.02em; 0.12em; 0.14em; -0.01em; 0; 0.08em; 0.16em; -0.03em", + "selector_or_token": "css.letter_spacing_scale" + } + ], + "line_height_scale": [ + { + "path": "beautiful-html-templates/templates/editorial-forest/template.html", + "raw_value": "0.92; 0.96; 0.98; 1.32; 1.02; 1; 1.05; 1.38; 1.0; 1.34; 0.94", + "selector_or_token": "css.line_height_scale" + } + ], + "mapping_reason": [ + { + "path": "beautiful-html-templates/templates/editorial-forest/template.html", + "raw_value": "e; } html, body { margin: 0; padding: 0; background: #111; } deck-stage { font-family: var(--serif); color: var(--ink); } section { box-sizing: border-box; width: 1920px; height: 1080px; padding: 96px 120px; background: var(--cream); color: var(--ink); position:", + "selector_or_token": "template.css.typography" + } + ], + "max_lines": [ + { + "path": "beautiful-html-templates/templates/editorial-forest/template.html", + "raw_value": "e; } html, body { margin: 0; padding: 0; background: #111; } deck-stage { font-family: var(--serif); color: var(--ink); } section { box-sizing: border-box; width: 1920px; height: 1080px; padding: 96px 120px; background: var(--cream); color: var(--ink); position:", + "selector_or_token": "template.css.typography" + } + ], + "measure": [ + { + "path": "beautiful-html-templates/templates/editorial-forest/template.html", + "raw_value": "e; } html, body { margin: 0; padding: 0; background: #111; } deck-stage { font-family: var(--serif); color: var(--ink); } section { box-sizing: border-box; width: 1920px; height: 1080px; padding: 96px 120px; background: var(--cream); color: var(--ink); position:", + "selector_or_token": "template.css.typography" + } + ], + "paragraph_spacing": [ + { + "path": "beautiful-html-templates/templates/editorial-forest/template.html", + "raw_value": "32px; 8px; \"36px\" topBorder: \"2px solid {colors.green; 36px; 40px; 24px; 60px; 14px; 100px; 30px; 8px; 12px; 28px; 16px", + "selector_or_token": "css.paragraph_spacing" + } + ], + "role_mapping.body": [ + { + "path": "beautiful-html-templates/templates/editorial-forest/template.html", + "raw_value": "Source Serif 4", + "selector_or_token": "role_mapping.body.source_font" + }, + { + "path": "beautiful-html-templates/templates/editorial-forest/design.md", + "raw_value": "pink-deep: \"#d27e96\" cream: \"#efe7d4\" cream-2: \"#e6dcc4\" ink: \"#1a1a17\" typography: display-hero: fontFamily: \"'Source Serif 4', 'Source Serif Pro', Georgia, serif\" fontSize: 220 fontWeight: 500 lineHeight: 0.92 letterSpacing: -0.02em display: fontFamily: \"'Source", + "selector_or_token": "design.typography.roles" + } + ], + "role_mapping.display": [ + { + "path": "beautiful-html-templates/templates/editorial-forest/template.html", + "raw_value": "JetBrains Mono", + "selector_or_token": "role_mapping.display.source_font" + }, + { + "path": "beautiful-html-templates/templates/editorial-forest/design.md", + "raw_value": "pink-deep: \"#d27e96\" cream: \"#efe7d4\" cream-2: \"#e6dcc4\" ink: \"#1a1a17\" typography: display-hero: fontFamily: \"'Source Serif 4', 'Source Serif Pro', Georgia, serif\" fontSize: 220 fontWeight: 500 lineHeight: 0.92 letterSpacing: -0.02em display: fontFamily: \"'Source", + "selector_or_token": "design.typography.roles" + } + ], + "role_mapping.label": [ + { + "path": "beautiful-html-templates/templates/editorial-forest/template.html", + "raw_value": "JetBrains Mono", + "selector_or_token": "role_mapping.label.source_font" + }, + { + "path": "beautiful-html-templates/templates/editorial-forest/design.md", + "raw_value": "pink-deep: \"#d27e96\" cream: \"#efe7d4\" cream-2: \"#e6dcc4\" ink: \"#1a1a17\" typography: display-hero: fontFamily: \"'Source Serif 4', 'Source Serif Pro', Georgia, serif\" fontSize: 220 fontWeight: 500 lineHeight: 0.92 letterSpacing: -0.02em display: fontFamily: \"'Source", + "selector_or_token": "design.typography.roles" + } + ], + "role_mapping.metric": [ + { + "path": "beautiful-html-templates/templates/editorial-forest/template.html", + "raw_value": "JetBrains Mono", + "selector_or_token": "role_mapping.metric.source_font" + }, + { + "path": "beautiful-html-templates/templates/editorial-forest/design.md", + "raw_value": "pink-deep: \"#d27e96\" cream: \"#efe7d4\" cream-2: \"#e6dcc4\" ink: \"#1a1a17\" typography: display-hero: fontFamily: \"'Source Serif 4', 'Source Serif Pro', Georgia, serif\" fontSize: 220 fontWeight: 500 lineHeight: 0.92 letterSpacing: -0.02em display: fontFamily: \"'Source", + "selector_or_token": "design.typography.roles" + } + ], + "source_typography_tokens": [ + { + "path": "beautiful-html-templates/templates/editorial-forest/template.html", + "raw_value": "26px; 28px; 220px; 96px; 56px; 84px; 24px; 140px; 44px; 30px; 32px; 68px; 80px; 110px; 500; 400; 600; 0.92; 0.96; 0.98; 1.32; 1.02; 1; 1.05; 1.38; 1.0; 1.34; 0.94; 0` — or a tiny positive `0.02em` if the headline feels visually packed. - **Never `text-transform: uppercase` on CJK text.** Chinese has no case; 0.18em; 0.1em; -0.02em; 0.12em; 0.14em; -0.01em; 0; 0.08em; 0.16em; -0.03em; uppercase` on CJK text.** Chinese has no case; uppercase; none", + "selector_or_token": "css.source_typography_tokens" + } + ], + "text_direction": [ + { + "path": "beautiful-html-templates/templates/editorial-forest/template.html", + "raw_value": "column", + "selector_or_token": "css.text_direction" + } + ], + "text_transform_policy": [ + { + "path": "beautiful-html-templates/templates/editorial-forest/template.html", + "raw_value": "uppercase` on CJK text.** Chinese has no case; uppercase; none", + "selector_or_token": "css.text_transform_policy" + } + ], + "wrapping_policy": [ + { + "path": "beautiful-html-templates/templates/editorial-forest/template.html", + "raw_value": "e; } html, body { margin: 0; padding: 0; background: #111; } deck-stage { font-family: var(--serif); color: var(--ink); } section { box-sizing: border-box; width: 1920px; height: 1080px; padding: 96px 120px; background: var(--cream); color: var(--ink); position:", + "selector_or_token": "template.css.typography" + } + ] + }, "source_typography_tokens": { "font_families": [ "JetBrains Mono", @@ -10339,18 +11315,6 @@ "600", "400" ], - "line_height": [ - "0.92", - "1.02", - "0.96", - "1.0", - "0.98", - "1.05", - "1.32", - "1.38", - "1.34", - "1" - ], "letter_spacing": [ "-0.02em", "-0.01em", @@ -10363,12 +11327,18 @@ "0.12em", "0" ], - "text_transform": [ - "uppercase", - "uppercase` on CJK text.** Chinese has no case", - "none" + "line_height": [ + "0.92", + "1.02", + "0.96", + "1.0", + "0.98", + "1.05", + "1.32", + "1.38", + "1.34", + "1" ], - "word_spacing": [], "paragraph_spacing": [ "32px", "8px", @@ -10385,524 +11355,68 @@ "28px", "16px" ], + "text_decoration": [], "text_direction": [ "column" ], - "writing_mode": [], - "text_decoration": [] + "text_transform": [ + "uppercase", + "uppercase` on CJK text.** Chinese has no case", + "none" + ], + "word_spacing": [], + "writing_mode": [] }, - "role_mapping": { - "display": { - "font_role": "display", - "source_font": "JetBrains Mono", - "runtime_alias": "SVGlideDisplay", - "font_size": 54, - "font_weight": 900, - "line_height": 0.9, - "letter_spacing": 0, - "text_transform": "latin_uppercase_only", - "max_lines": 3, - "alignment": "source_layout_dependent" - }, - "body": { - "font_role": "body", - "source_font": "Source Serif 4", - "runtime_alias": "SVGlideBody", - "font_size": 20, - "font_weight": 400, - "line_height": 1.32, - "letter_spacing": 0, - "text_transform": "preserve_source_case", - "max_lines": 5, - "alignment": "source_layout_dependent" - }, - "label": { - "font_role": "label", - "source_font": "JetBrains Mono", - "runtime_alias": "SVGlideLabel", - "font_size": 12, - "font_weight": 700, - "line_height": 1.05, - "letter_spacing": 0.08, - "text_transform": "latin_uppercase_labels_reset_cjk_spacing", - "max_lines": 1, - "alignment": "source_layout_dependent" - }, - "metric": { - "font_role": "metric", - "source_font": "JetBrains Mono", - "runtime_alias": "SVGlideMetric", - "font_size": 42, - "font_weight": 900, - "line_height": 0.95, - "letter_spacing": 0, - "text_transform": "preserve_numbers_and_units", - "max_lines": 2, - "alignment": "source_layout_dependent" - } - }, - "font_size_scale": { - "display": 54, - "body": 20, - "label": 12, - "metric": 42 - }, - "font_weight_scale": { - "display": 900, - "body": 400, - "label": 700, - "metric": 900 - }, - "line_height_scale": { - "display": 0.9, - "body": 1.32, - "label": 1.05, - "metric": 0.95 - }, - "letter_spacing_scale": { - "display": 0, - "body": 0, - "label": 0.08, - "metric": 0 + "text_direction": { + "cjk": "ltr", + "default": "column" }, "text_transform_policy": { - "display": "latin_uppercase_only", "body": "preserve_source_case", + "display": "latin_uppercase_only", "label": "latin_uppercase_labels_reset_cjk_spacing", "metric": "preserve_numbers_and_units" }, - "hierarchy_ratio": 2.7, - "max_lines": { - "display": 3, - "body": 5, - "label": 1, - "metric": 2 - }, - "measure": { - "display": "0.55-0.78 canvas width", - "body": "40-70 characters or CJK equivalent", - "label": "short mono labels", - "metric": "short numeric/stat blocks" - }, - "alignment": { - "primary": "follow source composition", - "fallback": "left/top aligned unless source screenshot is centered" - }, - "cjk_typography_adjustment": { - "display_font_cn": "Noto Serif SC", - "body_font_cn": "Noto Sans SC", - "letter_spacing_policy": "reset_letter_spacing_for_cjk_keep_latin_labels", - "mixed_run_spacing": "pangu_spacing", - "italic_policy": "color_only_emphasis" - }, - "mapping_reason": "按源模板字号/字重/行高/字距/大小写规则抽象到 960x540 Slide 画布的四个文本角色。", "word_spacing": { - "display": 0, "body": 0, + "display": 0, "label": 0, "metric": 0 }, - "paragraph_spacing": { - "display_after": 0, - "body_after": 12, - "label_after": 0, - "metric_after": 0 - }, "wrapping_policy": { - "display": "manual_break_or_balance", "body": "wrap_with_measure", + "display": "manual_break_or_balance", "label": "no_wrap_preferred", "metric": "no_wrap_preferred" }, - "text_direction": { - "default": "column", - "cjk": "ltr" - }, "writing_mode": { "default": "horizontal-tb", "vertical_roles": [] - }, - "extraction_confidence": { - "role_mapping.body": "inferred_from_layout", - "role_mapping.display": "inferred_from_layout", - "font_size_scale": "css_extracted_from_template_html", - "max_lines": "inferred_from_layout", - "writing_mode": "absent_use_default", - "text_direction": "css_extracted_from_template_html", - "alignment": "inferred_from_layout", - "role_mapping.label": "inferred_from_layout", - "paragraph_spacing": "css_extracted_from_template_html", - "text_transform_policy": "css_extracted_from_template_html", - "line_height_scale": "css_extracted_from_template_html", - "wrapping_policy": "inferred_from_layout", - "font_weight_scale": "css_extracted_from_template_html", - "source_typography_tokens": "css_extracted_from_template_html", - "word_spacing": "absent_use_default", - "role_mapping.metric": "inferred_from_layout", - "cjk_typography_adjustment": "inferred_from_layout", - "hierarchy_ratio": "inferred_from_layout", - "measure": "inferred_from_layout", - "mapping_reason": "inferred_from_layout", - "letter_spacing_scale": "css_extracted_from_template_html" - }, - "source_refs": { - "role_mapping.body": [ - { - "path": "beautiful-html-templates/templates/editorial-forest/template.html", - "selector_or_token": "role_mapping.body.source_font", - "raw_value": "Source Serif 4" - }, - { - "path": "beautiful-html-templates/templates/editorial-forest/design.md", - "selector_or_token": "design.typography.roles", - "raw_value": "pink-deep: \"#d27e96\" cream: \"#efe7d4\" cream-2: \"#e6dcc4\" ink: \"#1a1a17\" typography: display-hero: fontFamily: \"'Source Serif 4', 'Source Serif Pro', Georgia, serif\" fontSize: 220 fontWeight: 500 lineHeight: 0.92 letterSpacing: -0.02em display: fontFamily: \"'Source" - } - ], - "role_mapping.display": [ - { - "path": "beautiful-html-templates/templates/editorial-forest/template.html", - "selector_or_token": "role_mapping.display.source_font", - "raw_value": "JetBrains Mono" - }, - { - "path": "beautiful-html-templates/templates/editorial-forest/design.md", - "selector_or_token": "design.typography.roles", - "raw_value": "pink-deep: \"#d27e96\" cream: \"#efe7d4\" cream-2: \"#e6dcc4\" ink: \"#1a1a17\" typography: display-hero: fontFamily: \"'Source Serif 4', 'Source Serif Pro', Georgia, serif\" fontSize: 220 fontWeight: 500 lineHeight: 0.92 letterSpacing: -0.02em display: fontFamily: \"'Source" - } - ], - "font_size_scale": [ - { - "path": "beautiful-html-templates/templates/editorial-forest/template.html", - "selector_or_token": "css.font_size_scale", - "raw_value": "26px; 28px; 220px; 96px; 56px; 84px; 24px; 140px; 44px; 30px; 32px; 68px; 80px; 110px" - } - ], - "max_lines": [ - { - "path": "beautiful-html-templates/templates/editorial-forest/template.html", - "selector_or_token": "template.css.typography", - "raw_value": "e; } html, body { margin: 0; padding: 0; background: #111; } deck-stage { font-family: var(--serif); color: var(--ink); } section { box-sizing: border-box; width: 1920px; height: 1080px; padding: 96px 120px; background: var(--cream); color: var(--ink); position:" - } - ], - "text_direction": [ - { - "path": "beautiful-html-templates/templates/editorial-forest/template.html", - "selector_or_token": "css.text_direction", - "raw_value": "column" - } - ], - "alignment": [ - { - "path": "beautiful-html-templates/templates/editorial-forest/template.html", - "selector_or_token": "template.css.typography", - "raw_value": "e; } html, body { margin: 0; padding: 0; background: #111; } deck-stage { font-family: var(--serif); color: var(--ink); } section { box-sizing: border-box; width: 1920px; height: 1080px; padding: 96px 120px; background: var(--cream); color: var(--ink); position:" - } - ], - "role_mapping.label": [ - { - "path": "beautiful-html-templates/templates/editorial-forest/template.html", - "selector_or_token": "role_mapping.label.source_font", - "raw_value": "JetBrains Mono" - }, - { - "path": "beautiful-html-templates/templates/editorial-forest/design.md", - "selector_or_token": "design.typography.roles", - "raw_value": "pink-deep: \"#d27e96\" cream: \"#efe7d4\" cream-2: \"#e6dcc4\" ink: \"#1a1a17\" typography: display-hero: fontFamily: \"'Source Serif 4', 'Source Serif Pro', Georgia, serif\" fontSize: 220 fontWeight: 500 lineHeight: 0.92 letterSpacing: -0.02em display: fontFamily: \"'Source" - } - ], - "paragraph_spacing": [ - { - "path": "beautiful-html-templates/templates/editorial-forest/template.html", - "selector_or_token": "css.paragraph_spacing", - "raw_value": "32px; 8px; \"36px\" topBorder: \"2px solid {colors.green; 36px; 40px; 24px; 60px; 14px; 100px; 30px; 8px; 12px; 28px; 16px" - } - ], - "text_transform_policy": [ - { - "path": "beautiful-html-templates/templates/editorial-forest/template.html", - "selector_or_token": "css.text_transform_policy", - "raw_value": "uppercase` on CJK text.** Chinese has no case; uppercase; none" - } - ], - "line_height_scale": [ - { - "path": "beautiful-html-templates/templates/editorial-forest/template.html", - "selector_or_token": "css.line_height_scale", - "raw_value": "0.92; 0.96; 0.98; 1.32; 1.02; 1; 1.05; 1.38; 1.0; 1.34; 0.94" - } - ], - "wrapping_policy": [ - { - "path": "beautiful-html-templates/templates/editorial-forest/template.html", - "selector_or_token": "template.css.typography", - "raw_value": "e; } html, body { margin: 0; padding: 0; background: #111; } deck-stage { font-family: var(--serif); color: var(--ink); } section { box-sizing: border-box; width: 1920px; height: 1080px; padding: 96px 120px; background: var(--cream); color: var(--ink); position:" - } - ], - "font_weight_scale": [ - { - "path": "beautiful-html-templates/templates/editorial-forest/template.html", - "selector_or_token": "css.font_weight_scale", - "raw_value": "500; 400; 600" - } - ], - "source_typography_tokens": [ - { - "path": "beautiful-html-templates/templates/editorial-forest/template.html", - "selector_or_token": "css.source_typography_tokens", - "raw_value": "26px; 28px; 220px; 96px; 56px; 84px; 24px; 140px; 44px; 30px; 32px; 68px; 80px; 110px; 500; 400; 600; 0.92; 0.96; 0.98; 1.32; 1.02; 1; 1.05; 1.38; 1.0; 1.34; 0.94; 0` — or a tiny positive `0.02em` if the headline feels visually packed. - **Never `text-transform: uppercase` on CJK text.** Chinese has no case; 0.18em; 0.1em; -0.02em; 0.12em; 0.14em; -0.01em; 0; 0.08em; 0.16em; -0.03em; uppercase` on CJK text.** Chinese has no case; uppercase; none" - } - ], - "role_mapping.metric": [ - { - "path": "beautiful-html-templates/templates/editorial-forest/template.html", - "selector_or_token": "role_mapping.metric.source_font", - "raw_value": "JetBrains Mono" - }, - { - "path": "beautiful-html-templates/templates/editorial-forest/design.md", - "selector_or_token": "design.typography.roles", - "raw_value": "pink-deep: \"#d27e96\" cream: \"#efe7d4\" cream-2: \"#e6dcc4\" ink: \"#1a1a17\" typography: display-hero: fontFamily: \"'Source Serif 4', 'Source Serif Pro', Georgia, serif\" fontSize: 220 fontWeight: 500 lineHeight: 0.92 letterSpacing: -0.02em display: fontFamily: \"'Source" - } - ], - "cjk_typography_adjustment": [ - { - "path": "beautiful-html-templates/templates/editorial-forest/template.html", - "selector_or_token": "template.css.typography", - "raw_value": "e; } html, body { margin: 0; padding: 0; background: #111; } deck-stage { font-family: var(--serif); color: var(--ink); } section { box-sizing: border-box; width: 1920px; height: 1080px; padding: 96px 120px; background: var(--cream); color: var(--ink); position:" - } - ], - "hierarchy_ratio": [ - { - "path": "beautiful-html-templates/templates/editorial-forest/template.html", - "selector_or_token": "template.css.typography", - "raw_value": "e; } html, body { margin: 0; padding: 0; background: #111; } deck-stage { font-family: var(--serif); color: var(--ink); } section { box-sizing: border-box; width: 1920px; height: 1080px; padding: 96px 120px; background: var(--cream); color: var(--ink); position:" - } - ], - "measure": [ - { - "path": "beautiful-html-templates/templates/editorial-forest/template.html", - "selector_or_token": "template.css.typography", - "raw_value": "e; } html, body { margin: 0; padding: 0; background: #111; } deck-stage { font-family: var(--serif); color: var(--ink); } section { box-sizing: border-box; width: 1920px; height: 1080px; padding: 96px 120px; background: var(--cream); color: var(--ink); position:" - } - ], - "mapping_reason": [ - { - "path": "beautiful-html-templates/templates/editorial-forest/template.html", - "selector_or_token": "template.css.typography", - "raw_value": "e; } html, body { margin: 0; padding: 0; background: #111; } deck-stage { font-family: var(--serif); color: var(--ink); } section { box-sizing: border-box; width: 1920px; height: 1080px; padding: 96px 120px; background: var(--cream); color: var(--ink); position:" - } - ], - "letter_spacing_scale": [ - { - "path": "beautiful-html-templates/templates/editorial-forest/template.html", - "selector_or_token": "css.letter_spacing_scale", - "raw_value": "0` — or a tiny positive `0.02em` if the headline feels visually packed. - **Never `text-transform: uppercase` on CJK text.** Chinese has no case; 0.18em; 0.1em; -0.02em; 0.12em; 0.14em; -0.01em; 0; 0.08em; 0.16em; -0.03em" - } - ] } }, - "text_style_strategy": { - "bold": { - "source_usage": "source uses heavy display/label weights", - "mapped_weight": { - "display": 900, - "label": 700, - "metric": 900 - }, - "allowed_roles": [ - "display", - "label", - "metric" - ] - }, - "italic": { - "source_usage": "source uses italic/font-style or italic-family tokens", - "mapped_style": "latin_only_when_source_requires_else_normal", - "fallback_when_unavailable": "use color_shift or weight_shift; do not fake CJK italic", - "loss_notes": "Satori/Slide may not provide exact Google italic face; record as visual approximation." - }, - "underline": { - "source_usage": "source uses underline/text-decoration or hairline emphasis", - "mapped_decoration": "native underline only for actual text-decoration source usage", - "fallback_shape": "1px-3px rule or border accent when underline font rendering is unavailable" - }, - "line_through": { - "source_usage": "not present in source; default no line-through", - "mapped_decoration": "none", - "fallback_shape": "none" - }, - "emphasis": { - "color_shift": "use source accent color roles only", - "font_family_switch": "only switch between mapped display/body/label/metric roles from this family", - "weight_shift": "increase one role step within font_weight_scale", - "style_shift": "italic only when source_usage requires and CJK fallback is safe" - }, - "text_decoration_policy": { - "underline": { - "style": "solid", - "color": "currentColor", - "thickness": "1px" - }, - "line_through": { - "style": "none", - "color": "currentColor", - "thickness": "0px" - } - }, - "forbidden": [ - "fake_cjk_italic", - "drop_source_text_transform", - "drop_source_letter_spacing_without_loss_note", - "use_cross_family_font_motif", - "remote_font_dependency_without_receipt" - ], - "extraction_confidence": { - "text_decoration_policy.line_through.color": "absent_use_default", - "text_decoration_policy.underline.color": "css_extracted_from_template_html", - "text_decoration_policy.line_through.style": "absent_use_default", - "italic": "css_extracted_from_template_html", - "forbidden": "inferred_from_layout", - "emphasis": "inferred_from_layout", - "text_decoration_policy.underline.thickness": "css_extracted_from_template_html", - "underline": "css_extracted_from_template_html", - "text_decoration_policy.line_through.thickness": "absent_use_default", - "line_through": "absent_use_default", - "text_decoration_policy.underline.style": "css_extracted_from_template_html", - "bold": "css_extracted_from_template_html" - }, - "source_refs": { - "text_decoration_policy.underline.color": [ - { - "path": "beautiful-html-templates/templates/editorial-forest/template.html", - "selector_or_token": "css.text-decoration", - "raw_value": "never appears at axis-tick scale. Italics are not used anywhere in the system. Underline is not used. Emphasis is communicated through size and color contrast, not type variants. ## Layout ### Canvas System The system targets a fixed **1920×1080** canvas. Slides are `
` elements at exact" - } - ], - "italic": [ - { - "path": "beautiful-html-templates/templates/editorial-forest/template.html", - "selector_or_token": "css.font-style", - "raw_value": "mono never appears at headline scale, serif never appears at axis-tick scale. Italics are not used anywhere in the system. Underline is not used. Emphasis is communicated through size and color contrast, not type variants. ## Layout ### Canvas System The system targets a fixed **1920×1080** canv" - } - ], - "forbidden": [ - { - "path": "beautiful-html-templates/templates/editorial-forest/template.html", - "selector_or_token": "template.css.typography", - "raw_value": "e; } html, body { margin: 0; padding: 0; background: #111; } deck-stage { font-family: var(--serif); color: var(--ink); } section { box-sizing: border-box; width: 1920px; height: 1080px; padding: 96px 120px; background: var(--cream); color: var(--ink); position:" - } - ], - "emphasis": [ - { - "path": "beautiful-html-templates/templates/editorial-forest/template.html", - "selector_or_token": "template.css.typography", - "raw_value": "e; } html, body { margin: 0; padding: 0; background: #111; } deck-stage { font-family: var(--serif); color: var(--ink); } section { box-sizing: border-box; width: 1920px; height: 1080px; padding: 96px 120px; background: var(--cream); color: var(--ink); position:" - } - ], - "text_decoration_policy.underline.thickness": [ - { - "path": "beautiful-html-templates/templates/editorial-forest/template.html", - "selector_or_token": "css.text-decoration", - "raw_value": "never appears at axis-tick scale. Italics are not used anywhere in the system. Underline is not used. Emphasis is communicated through size and color contrast, not type variants. ## Layout ### Canvas System The system targets a fixed **1920×1080** canvas. Slides are `
` elements at exact" - } - ], - "underline": [ - { - "path": "beautiful-html-templates/templates/editorial-forest/template.html", - "selector_or_token": "css.text-decoration", - "raw_value": "never appears at axis-tick scale. Italics are not used anywhere in the system. Underline is not used. Emphasis is communicated through size and color contrast, not type variants. ## Layout ### Canvas System The system targets a fixed **1920×1080** canvas. Slides are `
` elements at exact" - } - ], - "text_decoration_policy.underline.style": [ - { - "path": "beautiful-html-templates/templates/editorial-forest/template.html", - "selector_or_token": "css.text-decoration", - "raw_value": "never appears at axis-tick scale. Italics are not used anywhere in the system. Underline is not used. Emphasis is communicated through size and color contrast, not type variants. ## Layout ### Canvas System The system targets a fixed **1920×1080** canvas. Slides are `
` elements at exact" - } - ], - "bold": [ - { - "path": "beautiful-html-templates/templates/editorial-forest/template.html", - "selector_or_token": "css.font-weight", - "raw_value": "500; 400; 600" - } - ] - } - }, - "satori": { - "font_and_typography_constraints": [ - "italic is source-aware but CJK fake italic is forbidden; use color/weight fallback when unavailable", - "letter spacing is preserved for Latin labels and reset/softened for CJK" - ] - }, - "loss_notes": [ - "italic is source-aware but CJK fake italic is forbidden; use color/weight fallback when unavailable", - "letter spacing is preserved for Latin labels and reset/softened for CJK" - ], - "page_variant_count": 8, - "source_page_variants": [ - "agenda", - "cover", - "data", - "framework", - "statement", - "stats", - "summary", - "two_col" - ], - "page_family_source": { - "extractor": "skills/lark-slides/scripts/beautiful_template_page_family_extract.py", - "source_template_html": "beautiful-html-templates/templates/editorial-forest/template.html", - "source_design_md": "beautiful-html-templates/templates/editorial-forest/design.md", - "source_template_json": "beautiful-html-templates/templates/editorial-forest/template.json", - "claim_boundary": "source extraction only; does not imply renderer, fidelity, quality gate, or production/default selectable status" - } - }, - { - "family_id": "editorial-tri-tone", - "template_id": "tritone-editorial-spread", - "runtime_template_id": "tritone-editorial-spread", - "source_template_html": "beautiful-html-templates/templates/editorial-tri-tone/template.html", - "source_design_md": "beautiful-html-templates/templates/editorial-tri-tone/design.md", - "source_template_json": "beautiful-html-templates/templates/editorial-tri-tone/template.json", - "renderer_id": "artboard_satori.tritone-editorial-spread", - "renderer_module": "skills/lark-slides/scripts/artboard_renderer/templates/beautiful/tritone-editorial-spread.mjs", - "golden_spec": "skills/lark-slides/scripts/fixtures/svglide_artboard/golden/tritone-editorial-spread.canvas-spec.json", - "reference_screenshot": "beautiful-html-templates/screenshots/editorial-tri-tone-1.png", - "fidelity_receipt": "skills/lark-slides/references/receipts/template-fidelity/editorial-tri-tone.tritone-editorial-spread.json", - "source_trace": [ - { - "source": "beautiful-html-templates/templates/editorial-tri-tone/template.html", - "evidence": "source_template_html" - }, - { - "source": "beautiful-html-templates/templates/editorial-tri-tone/design.md", - "evidence": "source_design_md" - }, - { - "source": "beautiful-html-templates/templates/editorial-tri-tone/template.json", - "evidence": "source_template_json" - }, - { - "source": "beautiful-html-templates/screenshots/editorial-tri-tone-1.png", - "evidence": "reference_screenshot" - }, - { - "source": "skills/lark-slides/references/absorptions/beautiful-html-templates/editorial-tri-tone.tritone-editorial-spread.json", - "evidence": "absorption_record" - }, - { - "source": "skills/lark-slides/references/receipts/template-fidelity/editorial-tri-tone.tritone-editorial-spread.json", - "evidence": "template_fidelity_receipt" - } - ], "visual_contract": { - "path": "skills/lark-slides/references/visual-contracts/beautiful/editorial-tri-tone.tritone-editorial-spread.json", - "layout_rhythm": "editorial-tri-tone: medium density, medium-high formality. Three-color editorial system: dusty pink, mustard cream, and deep burgundy, set in Bricolage + Instrument Serif.", + "do_not_simplify": [ + "preserve_fonts_palette_grid_slide_classes_decorative_elements", + "do_not_recolor_without_explicit_brand_override", + "do_not_mix_template_families", + "extend_missing_layout_inside_same_family", + "do_not_strip_identity_decorations", + "new_palette", + "cross_family_components", + "fake_italic", + "new_decorative_motif", + "remote_font_dependency", + "do_not_replace_family_with_generic_card_shell", + "do_not_mark_production_without_renderer_golden_fidelity_receipt", + "do_not_strip_identity_decorations", + "do_not_recolor_without_explicit_brand_override" + ], + "layout_rhythm": "editorial-forest: medium density, medium formality. Forest green, dusty pink, and warm cream meet Source Serif 4 in a quiet, intentional quarterly-review deck.", "motifs": [ "grid", "accent line", "card panels", + "paper texture", "window chrome", "poster blocks", "quote mark", @@ -10919,57 +11433,29 @@ "surface", "text" ], - "do_not_simplify": [ - "preserve_fonts_palette_grid_slide_classes_decorative_elements", - "do_not_recolor_without_explicit_brand_override", - "do_not_mix_template_families", - "extend_missing_layout_inside_same_family", - "do_not_strip_identity_decorations", - "new_palette", - "cross_family_components", - "fake_italic", - "new_decorative_motif", - "remote_font_dependency", - "do_not_replace_family_with_generic_card_shell", - "do_not_mark_production_without_renderer_golden_fidelity_receipt", - "do_not_strip_identity_decorations", - "do_not_recolor_without_explicit_brand_override" - ] + "path": "skills/lark-slides/references/visual-contracts/beautiful/editorial-forest.serif-stat-editorial.json" }, - "fidelity_gate": { - "status": "passed", - "score": 0.9274, - "threshold": 0.72, - "reference_screenshot": "/Users/bytedance/bd-projects/beautiful-html-templates/screenshots/editorial-tri-tone-1.png", - "render_screenshot": "/Users/bytedance/bd-projects/workspaces/SVGlide/.worktrees/cli-svglide-svg-private/skills/lark-slides/scripts/fixtures/svglide_artboard/golden/tritone-editorial-spread.preview.png", - "receipt_path": "skills/lark-slides/references/receipts/template-fidelity/editorial-tri-tone.tritone-editorial-spread.json", - "issues": [] - }, - "promotion_status": "needs_review", - "default_selectable": false, + "visual_contract_path": "skills/lark-slides/references/visual-contracts/beautiful/editorial-forest.serif-stat-editorial.json" + }, + { "blocking_issues": [ - "selector_gate_missing", - "quality_gate_integration_pending", + "selector_gate_pending", + "quality_gate_pending", "production_review_pending" ], - "visual_contract_path": "skills/lark-slides/references/visual-contracts/beautiful/editorial-tri-tone.tritone-editorial-spread.json", - "planned_renderer_module": "skills/lark-slides/scripts/artboard_renderer/templates/beautiful/tritone-editorial-spread.mjs", - "planned_golden_spec": "skills/lark-slides/scripts/fixtures/svglide_artboard/golden/tritone-editorial-spread.canvas-spec.json", - "planned_fidelity_receipt": "skills/lark-slides/references/receipts/template-fidelity/editorial-tri-tone.tritone-editorial-spread.json", + "default_selectable": false, + "family_id": "editorial-tri-tone", + "fidelity_gate": { + "issues": [], + "receipt_path": "skills/lark-slides/references/receipts/template-fidelity/editorial-tri-tone.tritone-editorial-spread.json", + "reference_screenshot": "/Users/bytedance/bd-projects/beautiful-html-templates/screenshots/editorial-tri-tone-1.png", + "render_screenshot": "/Users/bytedance/bd-projects/workspaces/SVGlide/.worktrees/cli-svglide-svg-private/skills/lark-slides/scripts/fixtures/svglide_artboard/golden/tritone-editorial-spread.preview.png", + "score": 0.9274, + "status": "passed", + "threshold": 0.72 + }, + "fidelity_receipt": "skills/lark-slides/references/receipts/template-fidelity/editorial-tri-tone.tritone-editorial-spread.json", "font_strategy": { - "source_fonts": [ - "Bricolage Grotesque", - "Instrument Serif", - "JetBrains Mono", - "LXGW WenKai TC", - "Noto Sans Mono CJK SC", - "inherit" - ], - "slide_native_preferred": [ - "system-sans-cjk", - "system-serif-cjk", - "system-mono" - ], "adobe_or_embedded_fallback": [ "Source Sans Pro", "Source Serif Pro", @@ -10979,59 +11465,17 @@ "思源等宽" ], "cjk_fallback": "Noto Sans SC", - "role_mapping": { - "display": { - "source_font": "Bricolage Grotesque", - "slide_font": "Source Sans Pro", - "runtime_alias": "SVGlideDisplay", - "cjk_font": "思源黑体", - "fallback_stack": [ - "system-sans-cjk", - "SVGlideDisplay" - ], - "source_only": false, - "requires_download": false, - "mapping_reason": "保留 Bricolage Grotesque 的语义角色,但运行时优先使用 Slide/系统可用的 Source Sans Pro 与 思源黑体。" - }, - "body": { - "source_font": "Instrument Serif", - "slide_font": "Source Serif Pro", - "runtime_alias": "SVGlideBody", - "cjk_font": "思源宋体", - "fallback_stack": [ - "system-serif-cjk", - "SVGlideBody" - ], - "source_only": false, - "requires_download": false, - "mapping_reason": "保留 Instrument Serif 的语义角色,但运行时优先使用 Slide/系统可用的 Source Serif Pro 与 思源宋体。" - }, - "label": { - "source_font": "JetBrains Mono", - "slide_font": "Source Code Pro", - "runtime_alias": "SVGlideLabel", - "cjk_font": "思源等宽", - "fallback_stack": [ - "system-mono", - "SVGlideLabel" - ], - "source_only": false, - "requires_download": false, - "mapping_reason": "保留 JetBrains Mono 的语义角色,但运行时优先使用 Slide/系统可用的 Source Code Pro 与 思源等宽。" - }, - "metric": { - "source_font": "JetBrains Mono", - "slide_font": "Source Code Pro", - "runtime_alias": "SVGlideMetric", - "cjk_font": "思源等宽", - "fallback_stack": [ - "system-mono", - "SVGlideMetric" - ], - "source_only": false, - "requires_download": false, - "mapping_reason": "保留 JetBrains Mono 的语义角色,但运行时优先使用 Slide/系统可用的 Source Code Pro 与 思源等宽。" - } + "extraction_confidence": { + "adobe_or_embedded_fallback": "inferred_from_layout", + "cjk_fallback": "inferred_from_layout", + "forbidden": "inferred_from_layout", + "mapping_reason": "inferred_from_layout", + "role_mapping.body": "inferred_from_layout", + "role_mapping.display": "inferred_from_layout", + "role_mapping.label": "inferred_from_layout", + "role_mapping.metric": "inferred_from_layout", + "slide_native_preferred": "inferred_from_layout", + "source_fonts": "css_extracted_from_template_html" }, "forbidden": [ "remote_font_runtime_dependency", @@ -11040,118 +11484,667 @@ "drop_cjk_fallback" ], "mapping_reason": "根据 design.md/template.html/template.json 中的 font-family 与 typography token 提取源字体;运行时按 Slide/系统/Adobe/思源可用字体降级。", + "role_mapping": { + "body": { + "cjk_font": "思源宋体", + "fallback_stack": [ + "system-serif-cjk", + "SVGlideBody" + ], + "mapping_reason": "保留 Instrument Serif 的语义角色,但运行时优先使用 Slide/系统可用的 Source Serif Pro 与 思源宋体。", + "requires_download": false, + "runtime_alias": "SVGlideBody", + "slide_font": "Source Serif Pro", + "source_font": "Instrument Serif", + "source_only": false + }, + "display": { + "cjk_font": "思源黑体", + "fallback_stack": [ + "system-sans-cjk", + "SVGlideDisplay" + ], + "mapping_reason": "保留 Bricolage Grotesque 的语义角色,但运行时优先使用 Slide/系统可用的 Source Sans Pro 与 思源黑体。", + "requires_download": false, + "runtime_alias": "SVGlideDisplay", + "slide_font": "Source Sans Pro", + "source_font": "Bricolage Grotesque", + "source_only": false + }, + "label": { + "cjk_font": "思源等宽", + "fallback_stack": [ + "system-mono", + "SVGlideLabel" + ], + "mapping_reason": "保留 JetBrains Mono 的语义角色,但运行时优先使用 Slide/系统可用的 Source Code Pro 与 思源等宽。", + "requires_download": false, + "runtime_alias": "SVGlideLabel", + "slide_font": "Source Code Pro", + "source_font": "JetBrains Mono", + "source_only": false + }, + "metric": { + "cjk_font": "思源等宽", + "fallback_stack": [ + "system-mono", + "SVGlideMetric" + ], + "mapping_reason": "保留 JetBrains Mono 的语义角色,但运行时优先使用 Slide/系统可用的 Source Code Pro 与 思源等宽。", + "requires_download": false, + "runtime_alias": "SVGlideMetric", + "slide_font": "Source Code Pro", + "source_font": "JetBrains Mono", + "source_only": false + } + }, + "slide_native_preferred": [ + "system-sans-cjk", + "system-serif-cjk", + "system-mono" + ], "source_evidence": [ "beautiful-html-templates/templates/editorial-tri-tone/design.md", "beautiful-html-templates/templates/editorial-tri-tone/template.html", "beautiful-html-templates/templates/editorial-tri-tone/template.json", "beautiful-html-templates/screenshots/editorial-tri-tone-1.png" ], - "extraction_confidence": { - "role_mapping.body": "inferred_from_layout", - "role_mapping.display": "inferred_from_layout", - "source_fonts": "css_extracted_from_template_html", - "adobe_or_embedded_fallback": "inferred_from_layout", - "cjk_fallback": "inferred_from_layout", - "role_mapping.metric": "inferred_from_layout", - "forbidden": "inferred_from_layout", - "slide_native_preferred": "inferred_from_layout", - "mapping_reason": "inferred_from_layout", - "role_mapping.label": "inferred_from_layout" - }, + "source_fonts": [ + "Bricolage Grotesque", + "Instrument Serif", + "JetBrains Mono", + "LXGW WenKai TC", + "Noto Sans Mono CJK SC", + "inherit" + ], "source_refs": { - "role_mapping.body": [ - { - "path": "beautiful-html-templates/templates/editorial-tri-tone/template.html", - "selector_or_token": "role_mapping.body.source_font", - "raw_value": "Instrument Serif" - }, - { - "path": "beautiful-html-templates/templates/editorial-tri-tone/design.md", - "selector_or_token": "design.typography.roles", - "raw_value": "utter terracotta: butter navy: burgundy forest: burgundy ink: burgundy typography: display-wordmark: fontFamily: \"Bricolage Grotesque, sans-serif\" fontSize: 300px fontWeight: 800 lineHeight: 0.82 letterSpacing: -0.04em display-closer: fontFamily: \"Bricolage Grote" - } - ], - "role_mapping.display": [ - { - "path": "beautiful-html-templates/templates/editorial-tri-tone/template.html", - "selector_or_token": "role_mapping.display.source_font", - "raw_value": "Bricolage Grotesque" - }, - { - "path": "beautiful-html-templates/templates/editorial-tri-tone/design.md", - "selector_or_token": "design.typography.roles", - "raw_value": "utter terracotta: butter navy: burgundy forest: burgundy ink: burgundy typography: display-wordmark: fontFamily: \"Bricolage Grotesque, sans-serif\" fontSize: 300px fontWeight: 800 lineHeight: 0.82 letterSpacing: -0.04em display-closer: fontFamily: \"Bricolage Grote" - } - ], - "source_fonts": [ - { - "path": "beautiful-html-templates/templates/editorial-tri-tone/template.html", - "selector_or_token": "css.font-family", - "raw_value": "'Bricolage Grotesque', 'Noto Sans SC', sans-serif; 'Instrument Serif', 'LXGW WenKai TC', serif; 'JetBrains Mono', 'Noto Sans Mono CJK SC', monospace; 'Instrument Serif', serif; inherit; JetBrains Mono; \"Bricolage Grotesque\", sans-serif; \"JetBrains Mono\", monospace; \"Instrument Serif\", serif; 'JetBrains Mono', monospace" - } - ], "adobe_or_embedded_fallback": [ { "path": "beautiful-html-templates/templates/editorial-tri-tone/template.html", - "selector_or_token": "css.font-family", - "raw_value": "'Bricolage Grotesque', 'Noto Sans SC', sans-serif; 'Instrument Serif', 'LXGW WenKai TC', serif; 'JetBrains Mono', 'Noto Sans Mono CJK SC', monospace; 'Instrument Serif', serif; inherit; JetBrains Mono; \"Bricolage Grotesque\", sans-serif; \"JetBrains Mono\", monospace; \"Instrument Serif\", serif; 'JetBrains Mono', monospace" + "raw_value": "'Bricolage Grotesque', 'Noto Sans SC', sans-serif; 'Instrument Serif', 'LXGW WenKai TC', serif; 'JetBrains Mono', 'Noto Sans Mono CJK SC', monospace; 'Instrument Serif', serif; inherit; JetBrains Mono; \"Bricolage Grotesque\", sans-serif; \"JetBrains Mono\", monospace; \"Instrument Serif\", serif; 'JetBrains Mono', monospace", + "selector_or_token": "css.font-family" } ], "cjk_fallback": [ { "path": "beautiful-html-templates/templates/editorial-tri-tone/template.html", - "selector_or_token": "css.font-family", - "raw_value": "'Bricolage Grotesque', 'Noto Sans SC', sans-serif; 'Instrument Serif', 'LXGW WenKai TC', serif; 'JetBrains Mono', 'Noto Sans Mono CJK SC', monospace; 'Instrument Serif', serif; inherit; JetBrains Mono; \"Bricolage Grotesque\", sans-serif; \"JetBrains Mono\", monospace; \"Instrument Serif\", serif; 'JetBrains Mono', monospace" - } - ], - "role_mapping.metric": [ - { - "path": "beautiful-html-templates/templates/editorial-tri-tone/template.html", - "selector_or_token": "role_mapping.metric.source_font", - "raw_value": "JetBrains Mono" - }, - { - "path": "beautiful-html-templates/templates/editorial-tri-tone/design.md", - "selector_or_token": "design.typography.roles", - "raw_value": "utter terracotta: butter navy: burgundy forest: burgundy ink: burgundy typography: display-wordmark: fontFamily: \"Bricolage Grotesque, sans-serif\" fontSize: 300px fontWeight: 800 lineHeight: 0.82 letterSpacing: -0.04em display-closer: fontFamily: \"Bricolage Grote" + "raw_value": "'Bricolage Grotesque', 'Noto Sans SC', sans-serif; 'Instrument Serif', 'LXGW WenKai TC', serif; 'JetBrains Mono', 'Noto Sans Mono CJK SC', monospace; 'Instrument Serif', serif; inherit; JetBrains Mono; \"Bricolage Grotesque\", sans-serif; \"JetBrains Mono\", monospace; \"Instrument Serif\", serif; 'JetBrains Mono', monospace", + "selector_or_token": "css.font-family" } ], "forbidden": [ { "path": "beautiful-html-templates/templates/editorial-tri-tone/template.html", - "selector_or_token": "css.font-family", - "raw_value": "'Bricolage Grotesque', 'Noto Sans SC', sans-serif; 'Instrument Serif', 'LXGW WenKai TC', serif; 'JetBrains Mono', 'Noto Sans Mono CJK SC', monospace; 'Instrument Serif', serif; inherit; JetBrains Mono; \"Bricolage Grotesque\", sans-serif; \"JetBrains Mono\", monospace; \"Instrument Serif\", serif; 'JetBrains Mono', monospace" - } - ], - "slide_native_preferred": [ - { - "path": "beautiful-html-templates/templates/editorial-tri-tone/template.html", - "selector_or_token": "css.font-family", - "raw_value": "'Bricolage Grotesque', 'Noto Sans SC', sans-serif; 'Instrument Serif', 'LXGW WenKai TC', serif; 'JetBrains Mono', 'Noto Sans Mono CJK SC', monospace; 'Instrument Serif', serif; inherit; JetBrains Mono; \"Bricolage Grotesque\", sans-serif; \"JetBrains Mono\", monospace; \"Instrument Serif\", serif; 'JetBrains Mono', monospace" + "raw_value": "'Bricolage Grotesque', 'Noto Sans SC', sans-serif; 'Instrument Serif', 'LXGW WenKai TC', serif; 'JetBrains Mono', 'Noto Sans Mono CJK SC', monospace; 'Instrument Serif', serif; inherit; JetBrains Mono; \"Bricolage Grotesque\", sans-serif; \"JetBrains Mono\", monospace; \"Instrument Serif\", serif; 'JetBrains Mono', monospace", + "selector_or_token": "css.font-family" } ], "mapping_reason": [ { "path": "beautiful-html-templates/templates/editorial-tri-tone/template.html", - "selector_or_token": "css.font-family", - "raw_value": "'Bricolage Grotesque', 'Noto Sans SC', sans-serif; 'Instrument Serif', 'LXGW WenKai TC', serif; 'JetBrains Mono', 'Noto Sans Mono CJK SC', monospace; 'Instrument Serif', serif; inherit; JetBrains Mono; \"Bricolage Grotesque\", sans-serif; \"JetBrains Mono\", monospace; \"Instrument Serif\", serif; 'JetBrains Mono', monospace" + "raw_value": "'Bricolage Grotesque', 'Noto Sans SC', sans-serif; 'Instrument Serif', 'LXGW WenKai TC', serif; 'JetBrains Mono', 'Noto Sans Mono CJK SC', monospace; 'Instrument Serif', serif; inherit; JetBrains Mono; \"Bricolage Grotesque\", sans-serif; \"JetBrains Mono\", monospace; \"Instrument Serif\", serif; 'JetBrains Mono', monospace", + "selector_or_token": "css.font-family" + } + ], + "role_mapping.body": [ + { + "path": "beautiful-html-templates/templates/editorial-tri-tone/template.html", + "raw_value": "Instrument Serif", + "selector_or_token": "role_mapping.body.source_font" + }, + { + "path": "beautiful-html-templates/templates/editorial-tri-tone/design.md", + "raw_value": "utter terracotta: butter navy: burgundy forest: burgundy ink: burgundy typography: display-wordmark: fontFamily: \"Bricolage Grotesque, sans-serif\" fontSize: 300px fontWeight: 800 lineHeight: 0.82 letterSpacing: -0.04em display-closer: fontFamily: \"Bricolage Grote", + "selector_or_token": "design.typography.roles" + } + ], + "role_mapping.display": [ + { + "path": "beautiful-html-templates/templates/editorial-tri-tone/template.html", + "raw_value": "Bricolage Grotesque", + "selector_or_token": "role_mapping.display.source_font" + }, + { + "path": "beautiful-html-templates/templates/editorial-tri-tone/design.md", + "raw_value": "utter terracotta: butter navy: burgundy forest: burgundy ink: burgundy typography: display-wordmark: fontFamily: \"Bricolage Grotesque, sans-serif\" fontSize: 300px fontWeight: 800 lineHeight: 0.82 letterSpacing: -0.04em display-closer: fontFamily: \"Bricolage Grote", + "selector_or_token": "design.typography.roles" } ], "role_mapping.label": [ { "path": "beautiful-html-templates/templates/editorial-tri-tone/template.html", - "selector_or_token": "role_mapping.label.source_font", - "raw_value": "JetBrains Mono" + "raw_value": "JetBrains Mono", + "selector_or_token": "role_mapping.label.source_font" }, { "path": "beautiful-html-templates/templates/editorial-tri-tone/design.md", - "selector_or_token": "design.typography.roles", - "raw_value": "utter terracotta: butter navy: burgundy forest: burgundy ink: burgundy typography: display-wordmark: fontFamily: \"Bricolage Grotesque, sans-serif\" fontSize: 300px fontWeight: 800 lineHeight: 0.82 letterSpacing: -0.04em display-closer: fontFamily: \"Bricolage Grote" + "raw_value": "utter terracotta: butter navy: burgundy forest: burgundy ink: burgundy typography: display-wordmark: fontFamily: \"Bricolage Grotesque, sans-serif\" fontSize: 300px fontWeight: 800 lineHeight: 0.82 letterSpacing: -0.04em display-closer: fontFamily: \"Bricolage Grote", + "selector_or_token": "design.typography.roles" + } + ], + "role_mapping.metric": [ + { + "path": "beautiful-html-templates/templates/editorial-tri-tone/template.html", + "raw_value": "JetBrains Mono", + "selector_or_token": "role_mapping.metric.source_font" + }, + { + "path": "beautiful-html-templates/templates/editorial-tri-tone/design.md", + "raw_value": "utter terracotta: butter navy: burgundy forest: burgundy ink: burgundy typography: display-wordmark: fontFamily: \"Bricolage Grotesque, sans-serif\" fontSize: 300px fontWeight: 800 lineHeight: 0.82 letterSpacing: -0.04em display-closer: fontFamily: \"Bricolage Grote", + "selector_or_token": "design.typography.roles" + } + ], + "slide_native_preferred": [ + { + "path": "beautiful-html-templates/templates/editorial-tri-tone/template.html", + "raw_value": "'Bricolage Grotesque', 'Noto Sans SC', sans-serif; 'Instrument Serif', 'LXGW WenKai TC', serif; 'JetBrains Mono', 'Noto Sans Mono CJK SC', monospace; 'Instrument Serif', serif; inherit; JetBrains Mono; \"Bricolage Grotesque\", sans-serif; \"JetBrains Mono\", monospace; \"Instrument Serif\", serif; 'JetBrains Mono', monospace", + "selector_or_token": "css.font-family" + } + ], + "source_fonts": [ + { + "path": "beautiful-html-templates/templates/editorial-tri-tone/template.html", + "raw_value": "'Bricolage Grotesque', 'Noto Sans SC', sans-serif; 'Instrument Serif', 'LXGW WenKai TC', serif; 'JetBrains Mono', 'Noto Sans Mono CJK SC', monospace; 'Instrument Serif', serif; inherit; JetBrains Mono; \"Bricolage Grotesque\", sans-serif; \"JetBrains Mono\", monospace; \"Instrument Serif\", serif; 'JetBrains Mono', monospace", + "selector_or_token": "css.font-family" } ] } }, + "golden_spec": "skills/lark-slides/scripts/fixtures/svglide_artboard/golden/tritone-editorial-spread.canvas-spec.json", + "implemented_page_variants": [ + "cover", + "manifesto", + "grid", + "stat", + "timeline", + "chart", + "quote", + "closer" + ], + "loss_notes": [ + "italic is source-aware but CJK fake italic is forbidden; use color/weight fallback when unavailable", + "letter spacing is preserved for Latin labels and reset/softened for CJK" + ], + "page_family_implementation_note": "Implements the 8 source slides from editorial-tri-tone/template.html as explicit tritone-editorial-spread variants. Smoke evidence covers production role aliases by reusing manifesto once for detail, but does not promote the family.", + "page_family_smoke": { + "missing_required_roles": [], + "production_selectable": false, + "receipt_path": "skills/lark-slides/references/receipts/page-family-smoke/editorial-tri-tone.tritone-editorial-spread.json", + "rendered_pages": 9, + "reuse_count": 1, + "selection_source": "explicit_fixture", + "status": "passed" + }, + "page_family_smoke_deck": "skills/lark-slides/references/page-family-smoke-decks/editorial-tri-tone.json", + "page_family_smoke_receipt": "skills/lark-slides/references/receipts/page-family-smoke/editorial-tri-tone.tritone-editorial-spread.json", + "page_family_source": { + "claim_boundary": "source extraction only; does not imply renderer, fidelity, quality gate, or production/default selectable status", + "extractor": "skills/lark-slides/scripts/beautiful_template_page_family_extract.py", + "source_design_md": "beautiful-html-templates/templates/editorial-tri-tone/design.md", + "source_template_html": "beautiful-html-templates/templates/editorial-tri-tone/template.html", + "source_template_json": "beautiful-html-templates/templates/editorial-tri-tone/template.json" + }, + "page_variant_count": 8, + "page_variant_golden_specs": { + "chart": "skills/lark-slides/scripts/fixtures/svglide_artboard/golden/editorial-tri-tone.chart.canvas-spec.json", + "closer": "skills/lark-slides/scripts/fixtures/svglide_artboard/golden/editorial-tri-tone.closer.canvas-spec.json", + "cover": "skills/lark-slides/scripts/fixtures/svglide_artboard/golden/editorial-tri-tone.cover.canvas-spec.json", + "grid": "skills/lark-slides/scripts/fixtures/svglide_artboard/golden/editorial-tri-tone.grid.canvas-spec.json", + "manifesto": "skills/lark-slides/scripts/fixtures/svglide_artboard/golden/editorial-tri-tone.manifesto.canvas-spec.json", + "quote": "skills/lark-slides/scripts/fixtures/svglide_artboard/golden/editorial-tri-tone.quote.canvas-spec.json", + "stat": "skills/lark-slides/scripts/fixtures/svglide_artboard/golden/editorial-tri-tone.stat.canvas-spec.json", + "timeline": "skills/lark-slides/scripts/fixtures/svglide_artboard/golden/editorial-tri-tone.timeline.canvas-spec.json" + }, + "planned_fidelity_receipt": "skills/lark-slides/references/receipts/template-fidelity/editorial-tri-tone.tritone-editorial-spread.json", + "planned_golden_spec": "skills/lark-slides/scripts/fixtures/svglide_artboard/golden/tritone-editorial-spread.canvas-spec.json", + "planned_renderer_module": "skills/lark-slides/scripts/artboard_renderer/templates/beautiful/tritone-editorial-spread.mjs", + "promotion_status": "needs_review", + "reference_screenshot": "beautiful-html-templates/screenshots/editorial-tri-tone-1.png", + "renderer_id": "artboard_satori.tritone-editorial-spread", + "renderer_module": "skills/lark-slides/scripts/artboard_renderer/templates/beautiful/tritone-editorial-spread.mjs", + "renderer_stage": "page_family", + "runtime_template_id": "tritone-editorial-spread", + "satori": { + "font_and_typography_constraints": [ + "italic is source-aware but CJK fake italic is forbidden; use color/weight fallback when unavailable", + "letter spacing is preserved for Latin labels and reset/softened for CJK" + ] + }, + "selection_scope": "experimental", + "source_design_md": "beautiful-html-templates/templates/editorial-tri-tone/design.md", + "source_page_variants": [ + "cover", + "manifesto", + "grid", + "stat", + "timeline", + "chart", + "quote", + "closer" + ], + "source_template_html": "beautiful-html-templates/templates/editorial-tri-tone/template.html", + "source_template_json": "beautiful-html-templates/templates/editorial-tri-tone/template.json", + "source_trace": [ + { + "evidence": "source_template_html", + "source": "beautiful-html-templates/templates/editorial-tri-tone/template.html" + }, + { + "evidence": "source_design_md", + "source": "beautiful-html-templates/templates/editorial-tri-tone/design.md" + }, + { + "evidence": "source_template_json", + "source": "beautiful-html-templates/templates/editorial-tri-tone/template.json" + }, + { + "evidence": "reference_screenshot", + "source": "beautiful-html-templates/screenshots/editorial-tri-tone-1.png" + }, + { + "evidence": "absorption_record", + "source": "skills/lark-slides/references/absorptions/beautiful-html-templates/editorial-tri-tone.tritone-editorial-spread.json" + }, + { + "evidence": "template_fidelity_receipt", + "source": "skills/lark-slides/references/receipts/template-fidelity/editorial-tri-tone.tritone-editorial-spread.json" + } + ], + "supported_page_variants": [ + "cover", + "manifesto", + "grid", + "stat", + "timeline", + "chart", + "quote", + "closer" + ], + "template_id": "tritone-editorial-spread", + "text_style_strategy": { + "bold": { + "allowed_roles": [ + "display", + "label", + "metric" + ], + "mapped_weight": { + "display": 900, + "label": 700, + "metric": 900 + }, + "source_usage": "source uses heavy display/label weights" + }, + "emphasis": { + "color_shift": "use source accent color roles only", + "font_family_switch": "only switch between mapped display/body/label/metric roles from this family", + "style_shift": "italic only when source_usage requires and CJK fallback is safe", + "weight_shift": "increase one role step within font_weight_scale" + }, + "extraction_confidence": { + "bold": "css_extracted_from_template_html", + "emphasis": "inferred_from_layout", + "forbidden": "inferred_from_layout", + "italic": "css_extracted_from_template_html", + "line_through": "absent_use_default", + "text_decoration_policy.line_through.color": "absent_use_default", + "text_decoration_policy.line_through.style": "absent_use_default", + "text_decoration_policy.line_through.thickness": "absent_use_default", + "text_decoration_policy.underline.color": "absent_use_default", + "text_decoration_policy.underline.style": "absent_use_default", + "text_decoration_policy.underline.thickness": "absent_use_default", + "underline": "absent_use_default" + }, + "forbidden": [ + "fake_cjk_italic", + "drop_source_text_transform", + "drop_source_letter_spacing_without_loss_note", + "use_cross_family_font_motif", + "remote_font_dependency_without_receipt" + ], + "italic": { + "fallback_when_unavailable": "use color_shift or weight_shift; do not fake CJK italic", + "loss_notes": "Satori/Slide may not provide exact Google italic face; record as visual approximation.", + "mapped_style": "latin_only_when_source_requires_else_normal", + "source_usage": "source uses italic/font-style or italic-family tokens" + }, + "line_through": { + "fallback_shape": "none", + "mapped_decoration": "none", + "source_usage": "not present in source; default no line-through" + }, + "source_refs": { + "bold": [ + { + "path": "beautiful-html-templates/templates/editorial-tri-tone/template.html", + "raw_value": "700; 400; 500; 800; 600", + "selector_or_token": "css.font-weight" + } + ], + "emphasis": [ + { + "path": "beautiful-html-templates/templates/editorial-tri-tone/template.html", + "raw_value": "#7A1F35; } html, body { margin:0; padding:0; background:#7A1F35; } body { font-family: \"Bricolage Grotesque\", sans-serif; color: var(--ink); } deck-stage section { width:1920px; height:1080px; position:relative; overflow:hidden; box-sizing:border-box; } .mono { font-fam", + "selector_or_token": "template.css.typography" + } + ], + "forbidden": [ + { + "path": "beautiful-html-templates/templates/editorial-tri-tone/template.html", + "raw_value": "#7A1F35; } html, body { margin:0; padding:0; background:#7A1F35; } body { font-family: \"Bricolage Grotesque\", sans-serif; color: var(--ink); } deck-stage section { width:1920px; height:1080px; position:relative; overflow:hidden; box-sizing:border-box; } .mono { font-fam", + "selector_or_token": "template.css.typography" + } + ], + "italic": [ + { + "path": "beautiful-html-templates/templates/editorial-tri-tone/template.html", + "raw_value": "al-size axis) at extreme weights and negative letter-spacing. Instrument Serif (italic-cut only) appears as the expressive accent face for chapter numerals, pull-quotes, years, and signatures. JetBrains Mono carries all metadata, labels, and section markers at tight uppercase tracking. The aesthetic", + "selector_or_token": "css.font-style" + } + ] + }, + "text_decoration_policy": { + "line_through": { + "color": "currentColor", + "style": "none", + "thickness": "0px" + }, + "underline": { + "color": "currentColor", + "style": "none", + "thickness": "0px" + } + }, + "underline": { + "fallback_shape": "1px-3px rule or border accent when underline font rendering is unavailable", + "mapped_decoration": "native underline only for actual text-decoration source usage", + "source_usage": "not a dominant source motif" + } + }, "typography_strategy": { + "alignment": { + "fallback": "left/top aligned unless source screenshot is centered", + "primary": "follow source composition" + }, + "cjk_typography_adjustment": { + "body_font_cn": "Noto Serif SC", + "display_font_cn": "Noto Sans SC", + "italic_policy": "drop_italic", + "letter_spacing_policy": "reset_letter_spacing_for_cjk_keep_latin_labels", + "mixed_run_spacing": "pangu_spacing" + }, + "extraction_confidence": { + "alignment": "inferred_from_layout", + "cjk_typography_adjustment": "inferred_from_layout", + "font_size_scale": "css_extracted_from_template_html", + "font_weight_scale": "css_extracted_from_template_html", + "hierarchy_ratio": "inferred_from_layout", + "letter_spacing_scale": "css_extracted_from_template_html", + "line_height_scale": "css_extracted_from_template_html", + "mapping_reason": "inferred_from_layout", + "max_lines": "inferred_from_layout", + "measure": "inferred_from_layout", + "paragraph_spacing": "css_extracted_from_template_html", + "role_mapping.body": "inferred_from_layout", + "role_mapping.display": "inferred_from_layout", + "role_mapping.label": "inferred_from_layout", + "role_mapping.metric": "inferred_from_layout", + "source_typography_tokens": "css_extracted_from_template_html", + "text_direction": "css_extracted_from_template_html", + "text_transform_policy": "css_extracted_from_template_html", + "word_spacing": "absent_use_default", + "wrapping_policy": "inferred_from_layout", + "writing_mode": "absent_use_default" + }, + "font_size_scale": { + "body": 20, + "display": 54, + "label": 12, + "metric": 42 + }, + "font_weight_scale": { + "body": 400, + "display": 900, + "label": 700, + "metric": 900 + }, + "hierarchy_ratio": 2.7, + "letter_spacing_scale": { + "body": 0, + "display": 0, + "label": 0.08, + "metric": 0 + }, + "line_height_scale": { + "body": 1.32, + "display": 0.9, + "label": 1.05, + "metric": 0.95 + }, + "mapping_reason": "按源模板字号/字重/行高/字距/大小写规则抽象到 960x540 Slide 画布的四个文本角色。", + "max_lines": { + "body": 5, + "display": 3, + "label": 1, + "metric": 2 + }, + "measure": { + "body": "40-70 characters or CJK equivalent", + "display": "0.55-0.78 canvas width", + "label": "short mono labels", + "metric": "short numeric/stat blocks" + }, + "paragraph_spacing": { + "body_after": 12, + "display_after": 0, + "label_after": 0, + "metric_after": 0 + }, + "role_mapping": { + "body": { + "alignment": "source_layout_dependent", + "font_role": "body", + "font_size": 20, + "font_weight": 400, + "letter_spacing": 0, + "line_height": 1.32, + "max_lines": 5, + "runtime_alias": "SVGlideBody", + "source_font": "Instrument Serif", + "text_transform": "preserve_source_case" + }, + "display": { + "alignment": "source_layout_dependent", + "font_role": "display", + "font_size": 54, + "font_weight": 900, + "letter_spacing": 0, + "line_height": 0.9, + "max_lines": 3, + "runtime_alias": "SVGlideDisplay", + "source_font": "Bricolage Grotesque", + "text_transform": "latin_uppercase_only" + }, + "label": { + "alignment": "source_layout_dependent", + "font_role": "label", + "font_size": 12, + "font_weight": 700, + "letter_spacing": 0.08, + "line_height": 1.05, + "max_lines": 1, + "runtime_alias": "SVGlideLabel", + "source_font": "JetBrains Mono", + "text_transform": "latin_uppercase_labels_reset_cjk_spacing" + }, + "metric": { + "alignment": "source_layout_dependent", + "font_role": "metric", + "font_size": 42, + "font_weight": 900, + "letter_spacing": 0, + "line_height": 0.95, + "max_lines": 2, + "runtime_alias": "SVGlideMetric", + "source_font": "JetBrains Mono", + "text_transform": "preserve_numbers_and_units" + } + }, + "source_refs": { + "alignment": [ + { + "path": "beautiful-html-templates/templates/editorial-tri-tone/template.html", + "raw_value": "#7A1F35; } html, body { margin:0; padding:0; background:#7A1F35; } body { font-family: \"Bricolage Grotesque\", sans-serif; color: var(--ink); } deck-stage section { width:1920px; height:1080px; position:relative; overflow:hidden; box-sizing:border-box; } .mono { font-fam", + "selector_or_token": "template.css.typography" + } + ], + "cjk_typography_adjustment": [ + { + "path": "beautiful-html-templates/templates/editorial-tri-tone/template.html", + "raw_value": "#7A1F35; } html, body { margin:0; padding:0; background:#7A1F35; } body { font-family: \"Bricolage Grotesque\", sans-serif; color: var(--ink); } deck-stage section { width:1920px; height:1080px; position:relative; overflow:hidden; box-sizing:border-box; } .mono { font-fam", + "selector_or_token": "template.css.typography" + } + ], + "font_size_scale": [ + { + "path": "beautiful-html-templates/templates/editorial-tri-tone/template.html", + "raw_value": "16px; 24px; 44px; 300px; 240px; 0.35em; 56px; 28px; 64px; 76px; 40px; 540px; 220px; 30px; 84px; 200px", + "selector_or_token": "css.font_size_scale" + } + ], + "font_weight_scale": [ + { + "path": "beautiful-html-templates/templates/editorial-tri-tone/template.html", + "raw_value": "700; 400; 500; 800; 600", + "selector_or_token": "css.font_weight_scale" + } + ], + "hierarchy_ratio": [ + { + "path": "beautiful-html-templates/templates/editorial-tri-tone/template.html", + "raw_value": "#7A1F35; } html, body { margin:0; padding:0; background:#7A1F35; } body { font-family: \"Bricolage Grotesque\", sans-serif; color: var(--ink); } deck-stage section { width:1920px; height:1080px; position:relative; overflow:hidden; box-sizing:border-box; } .mono { font-fam", + "selector_or_token": "template.css.typography" + } + ], + "letter_spacing_scale": [ + { + "path": "beautiful-html-templates/templates/editorial-tri-tone/template.html", + "raw_value": "-0.02em` to `-0.06em` depending on size. - Don't add solid-color dividers on dark (burgundy) surfaces. All structural lines on dark backgrounds must use low-opacity rgba. - Don't apply box shadows. The system has none. Depth comes from surface contrast and border-radius on contrasting backgrounds. - Don't round large content containers (section panels, grid backgrounds). Rounding applies only to pill-scale and card-scale elements (value cards, chart card). - Don't use Bricolage Grotesque weight ", + "selector_or_token": "css.letter_spacing_scale" + } + ], + "line_height_scale": [ + { + "path": "beautiful-html-templates/templates/editorial-tri-tone/template.html", + "raw_value": "1; 0.82; 0.9; 1.05; 1.45; 1.4; 0.78; 0.95; 1.5; 0.6; 1.1", + "selector_or_token": "css.line_height_scale" + } + ], + "mapping_reason": [ + { + "path": "beautiful-html-templates/templates/editorial-tri-tone/template.html", + "raw_value": "#7A1F35; } html, body { margin:0; padding:0; background:#7A1F35; } body { font-family: \"Bricolage Grotesque\", sans-serif; color: var(--ink); } deck-stage section { width:1920px; height:1080px; position:relative; overflow:hidden; box-sizing:border-box; } .mono { font-fam", + "selector_or_token": "template.css.typography" + } + ], + "max_lines": [ + { + "path": "beautiful-html-templates/templates/editorial-tri-tone/template.html", + "raw_value": "#7A1F35; } html, body { margin:0; padding:0; background:#7A1F35; } body { font-family: \"Bricolage Grotesque\", sans-serif; color: var(--ink); } deck-stage section { width:1920px; height:1080px; position:relative; overflow:hidden; box-sizing:border-box; } .mono { font-fam", + "selector_or_token": "template.css.typography" + } + ], + "measure": [ + { + "path": "beautiful-html-templates/templates/editorial-tri-tone/template.html", + "raw_value": "#7A1F35; } html, body { margin:0; padding:0; background:#7A1F35; } body { font-family: \"Bricolage Grotesque\", sans-serif; color: var(--ink); } deck-stage section { width:1920px; height:1080px; position:relative; overflow:hidden; box-sizing:border-box; } .mono { font-fam", + "selector_or_token": "template.css.typography" + } + ], + "paragraph_spacing": [ + { + "path": "beautiful-html-templates/templates/editorial-tri-tone/template.html", + "raw_value": "48px; 12px; 32px; 4px; 24px; 20px; 48px card-pad: 28px 28px 30px chart-pad: 48px 48px 56px footer-bottom: 36px grid-gap: 24px endorsement-pad: 20px 0 canvas: width: 1920px height: 1080px components: pill: borderRadius: 999px padding: 0.35em 0.9em fontFamily: \"Bricolage Grotesque, sans-serif\" fontWeight: 500 lineHeight: 1.0 cover-pill: borderRadius: 999px padding: 16px 38px fontSize: 44px fontWeight: 500 closer-pill: borderRadius: 999px padding: 12px 28px fontSize: 22px value-card: borderRadius: ", + "selector_or_token": "css.paragraph_spacing" + } + ], + "role_mapping.body": [ + { + "path": "beautiful-html-templates/templates/editorial-tri-tone/template.html", + "raw_value": "Instrument Serif", + "selector_or_token": "role_mapping.body.source_font" + }, + { + "path": "beautiful-html-templates/templates/editorial-tri-tone/design.md", + "raw_value": "utter terracotta: butter navy: burgundy forest: burgundy ink: burgundy typography: display-wordmark: fontFamily: \"Bricolage Grotesque, sans-serif\" fontSize: 300px fontWeight: 800 lineHeight: 0.82 letterSpacing: -0.04em display-closer: fontFamily: \"Bricolage Grote", + "selector_or_token": "design.typography.roles" + } + ], + "role_mapping.display": [ + { + "path": "beautiful-html-templates/templates/editorial-tri-tone/template.html", + "raw_value": "Bricolage Grotesque", + "selector_or_token": "role_mapping.display.source_font" + }, + { + "path": "beautiful-html-templates/templates/editorial-tri-tone/design.md", + "raw_value": "utter terracotta: butter navy: burgundy forest: burgundy ink: burgundy typography: display-wordmark: fontFamily: \"Bricolage Grotesque, sans-serif\" fontSize: 300px fontWeight: 800 lineHeight: 0.82 letterSpacing: -0.04em display-closer: fontFamily: \"Bricolage Grote", + "selector_or_token": "design.typography.roles" + } + ], + "role_mapping.label": [ + { + "path": "beautiful-html-templates/templates/editorial-tri-tone/template.html", + "raw_value": "JetBrains Mono", + "selector_or_token": "role_mapping.label.source_font" + }, + { + "path": "beautiful-html-templates/templates/editorial-tri-tone/design.md", + "raw_value": "utter terracotta: butter navy: burgundy forest: burgundy ink: burgundy typography: display-wordmark: fontFamily: \"Bricolage Grotesque, sans-serif\" fontSize: 300px fontWeight: 800 lineHeight: 0.82 letterSpacing: -0.04em display-closer: fontFamily: \"Bricolage Grote", + "selector_or_token": "design.typography.roles" + } + ], + "role_mapping.metric": [ + { + "path": "beautiful-html-templates/templates/editorial-tri-tone/template.html", + "raw_value": "JetBrains Mono", + "selector_or_token": "role_mapping.metric.source_font" + }, + { + "path": "beautiful-html-templates/templates/editorial-tri-tone/design.md", + "raw_value": "utter terracotta: butter navy: burgundy forest: burgundy ink: burgundy typography: display-wordmark: fontFamily: \"Bricolage Grotesque, sans-serif\" fontSize: 300px fontWeight: 800 lineHeight: 0.82 letterSpacing: -0.04em display-closer: fontFamily: \"Bricolage Grote", + "selector_or_token": "design.typography.roles" + } + ], + "source_typography_tokens": [ + { + "path": "beautiful-html-templates/templates/editorial-tri-tone/template.html", + "raw_value": "16px; 24px; 44px; 300px; 240px; 0.35em; 56px; 28px; 64px; 76px; 40px; 540px; 220px; 30px; 84px; 200px; 700; 400; 500; 800; 600; 1; 0.82; 0.9; 1.05; 1.45; 1.4; 0.78; 0.95; 1.5; 0.6; 1.1; -0.02em` to `-0.06em` depending on size. - Don't add solid-color dividers on dark (burgundy) surfaces. All structural lines on dark backgrounds must use low-opacity rgba. - Don't apply box shadows. The system has none. Depth comes from surface contrast and border-radius on contrasting backgrounds. - Don't round l", + "selector_or_token": "css.source_typography_tokens" + } + ], + "text_direction": [ + { + "path": "beautiful-html-templates/templates/editorial-tri-tone/template.html", + "raw_value": "column", + "selector_or_token": "css.text_direction" + } + ], + "text_transform_policy": [ + { + "path": "beautiful-html-templates/templates/editorial-tri-tone/template.html", + "raw_value": "uppercase` on CJK text.** Chinese has no case; uppercase; none", + "selector_or_token": "css.text_transform_policy" + } + ], + "wrapping_policy": [ + { + "path": "beautiful-html-templates/templates/editorial-tri-tone/template.html", + "raw_value": "#7A1F35; } html, body { margin:0; padding:0; background:#7A1F35; } body { font-family: \"Bricolage Grotesque\", sans-serif; color: var(--ink); } deck-stage section { width:1920px; height:1080px; position:relative; overflow:hidden; box-sizing:border-box; } .mono { font-fam", + "selector_or_token": "template.css.typography" + } + ] + }, "source_typography_tokens": { "font_families": [ "Bricolage Grotesque", @@ -11180,18 +12173,6 @@ "500", "600" ], - "line_height": [ - "0.82", - "0.78", - "1.0", - "0.9", - "0.6", - "0.95", - "1.1", - "1.05", - "1.45", - "1.4" - ], "letter_spacing": [ "-0.04em", "-0.05em", @@ -11204,12 +12185,18 @@ "0.10em", "-0.02em` to `-0.06em` depending on size." ], - "text_transform": [ - "uppercase", - "none", - "uppercase` on CJK text.** Chinese has no case" + "line_height": [ + "0.82", + "0.78", + "1.0", + "0.9", + "0.6", + "0.95", + "1.1", + "1.05", + "1.45", + "1.4" ], - "word_spacing": [], "paragraph_spacing": [ "48px", "12px", @@ -11230,512 +12217,46 @@ "20px", "28px" ], + "text_decoration": [], "text_direction": [ "column" ], - "writing_mode": [], - "text_decoration": [] + "text_transform": [ + "uppercase", + "none", + "uppercase` on CJK text.** Chinese has no case" + ], + "word_spacing": [], + "writing_mode": [] }, - "role_mapping": { - "display": { - "font_role": "display", - "source_font": "Bricolage Grotesque", - "runtime_alias": "SVGlideDisplay", - "font_size": 54, - "font_weight": 900, - "line_height": 0.9, - "letter_spacing": 0, - "text_transform": "latin_uppercase_only", - "max_lines": 3, - "alignment": "source_layout_dependent" - }, - "body": { - "font_role": "body", - "source_font": "Instrument Serif", - "runtime_alias": "SVGlideBody", - "font_size": 20, - "font_weight": 400, - "line_height": 1.32, - "letter_spacing": 0, - "text_transform": "preserve_source_case", - "max_lines": 5, - "alignment": "source_layout_dependent" - }, - "label": { - "font_role": "label", - "source_font": "JetBrains Mono", - "runtime_alias": "SVGlideLabel", - "font_size": 12, - "font_weight": 700, - "line_height": 1.05, - "letter_spacing": 0.08, - "text_transform": "latin_uppercase_labels_reset_cjk_spacing", - "max_lines": 1, - "alignment": "source_layout_dependent" - }, - "metric": { - "font_role": "metric", - "source_font": "JetBrains Mono", - "runtime_alias": "SVGlideMetric", - "font_size": 42, - "font_weight": 900, - "line_height": 0.95, - "letter_spacing": 0, - "text_transform": "preserve_numbers_and_units", - "max_lines": 2, - "alignment": "source_layout_dependent" - } - }, - "font_size_scale": { - "display": 54, - "body": 20, - "label": 12, - "metric": 42 - }, - "font_weight_scale": { - "display": 900, - "body": 400, - "label": 700, - "metric": 900 - }, - "line_height_scale": { - "display": 0.9, - "body": 1.32, - "label": 1.05, - "metric": 0.95 - }, - "letter_spacing_scale": { - "display": 0, - "body": 0, - "label": 0.08, - "metric": 0 + "text_direction": { + "cjk": "ltr", + "default": "column" }, "text_transform_policy": { - "display": "latin_uppercase_only", "body": "preserve_source_case", + "display": "latin_uppercase_only", "label": "latin_uppercase_labels_reset_cjk_spacing", "metric": "preserve_numbers_and_units" }, - "hierarchy_ratio": 2.7, - "max_lines": { - "display": 3, - "body": 5, - "label": 1, - "metric": 2 - }, - "measure": { - "display": "0.55-0.78 canvas width", - "body": "40-70 characters or CJK equivalent", - "label": "short mono labels", - "metric": "short numeric/stat blocks" - }, - "alignment": { - "primary": "follow source composition", - "fallback": "left/top aligned unless source screenshot is centered" - }, - "cjk_typography_adjustment": { - "display_font_cn": "Noto Sans SC", - "body_font_cn": "Noto Serif SC", - "letter_spacing_policy": "reset_letter_spacing_for_cjk_keep_latin_labels", - "mixed_run_spacing": "pangu_spacing", - "italic_policy": "drop_italic" - }, - "mapping_reason": "按源模板字号/字重/行高/字距/大小写规则抽象到 960x540 Slide 画布的四个文本角色。", "word_spacing": { - "display": 0, "body": 0, + "display": 0, "label": 0, "metric": 0 }, - "paragraph_spacing": { - "display_after": 0, - "body_after": 12, - "label_after": 0, - "metric_after": 0 - }, "wrapping_policy": { - "display": "manual_break_or_balance", "body": "wrap_with_measure", + "display": "manual_break_or_balance", "label": "no_wrap_preferred", "metric": "no_wrap_preferred" }, - "text_direction": { - "default": "column", - "cjk": "ltr" - }, "writing_mode": { "default": "horizontal-tb", "vertical_roles": [] - }, - "extraction_confidence": { - "role_mapping.body": "inferred_from_layout", - "role_mapping.display": "inferred_from_layout", - "font_size_scale": "css_extracted_from_template_html", - "max_lines": "inferred_from_layout", - "writing_mode": "absent_use_default", - "text_direction": "css_extracted_from_template_html", - "alignment": "inferred_from_layout", - "role_mapping.label": "inferred_from_layout", - "paragraph_spacing": "css_extracted_from_template_html", - "text_transform_policy": "css_extracted_from_template_html", - "line_height_scale": "css_extracted_from_template_html", - "wrapping_policy": "inferred_from_layout", - "font_weight_scale": "css_extracted_from_template_html", - "source_typography_tokens": "css_extracted_from_template_html", - "word_spacing": "absent_use_default", - "role_mapping.metric": "inferred_from_layout", - "cjk_typography_adjustment": "inferred_from_layout", - "hierarchy_ratio": "inferred_from_layout", - "measure": "inferred_from_layout", - "mapping_reason": "inferred_from_layout", - "letter_spacing_scale": "css_extracted_from_template_html" - }, - "source_refs": { - "role_mapping.body": [ - { - "path": "beautiful-html-templates/templates/editorial-tri-tone/template.html", - "selector_or_token": "role_mapping.body.source_font", - "raw_value": "Instrument Serif" - }, - { - "path": "beautiful-html-templates/templates/editorial-tri-tone/design.md", - "selector_or_token": "design.typography.roles", - "raw_value": "utter terracotta: butter navy: burgundy forest: burgundy ink: burgundy typography: display-wordmark: fontFamily: \"Bricolage Grotesque, sans-serif\" fontSize: 300px fontWeight: 800 lineHeight: 0.82 letterSpacing: -0.04em display-closer: fontFamily: \"Bricolage Grote" - } - ], - "role_mapping.display": [ - { - "path": "beautiful-html-templates/templates/editorial-tri-tone/template.html", - "selector_or_token": "role_mapping.display.source_font", - "raw_value": "Bricolage Grotesque" - }, - { - "path": "beautiful-html-templates/templates/editorial-tri-tone/design.md", - "selector_or_token": "design.typography.roles", - "raw_value": "utter terracotta: butter navy: burgundy forest: burgundy ink: burgundy typography: display-wordmark: fontFamily: \"Bricolage Grotesque, sans-serif\" fontSize: 300px fontWeight: 800 lineHeight: 0.82 letterSpacing: -0.04em display-closer: fontFamily: \"Bricolage Grote" - } - ], - "font_size_scale": [ - { - "path": "beautiful-html-templates/templates/editorial-tri-tone/template.html", - "selector_or_token": "css.font_size_scale", - "raw_value": "16px; 24px; 44px; 300px; 240px; 0.35em; 56px; 28px; 64px; 76px; 40px; 540px; 220px; 30px; 84px; 200px" - } - ], - "max_lines": [ - { - "path": "beautiful-html-templates/templates/editorial-tri-tone/template.html", - "selector_or_token": "template.css.typography", - "raw_value": "#7A1F35; } html, body { margin:0; padding:0; background:#7A1F35; } body { font-family: \"Bricolage Grotesque\", sans-serif; color: var(--ink); } deck-stage section { width:1920px; height:1080px; position:relative; overflow:hidden; box-sizing:border-box; } .mono { font-fam" - } - ], - "text_direction": [ - { - "path": "beautiful-html-templates/templates/editorial-tri-tone/template.html", - "selector_or_token": "css.text_direction", - "raw_value": "column" - } - ], - "alignment": [ - { - "path": "beautiful-html-templates/templates/editorial-tri-tone/template.html", - "selector_or_token": "template.css.typography", - "raw_value": "#7A1F35; } html, body { margin:0; padding:0; background:#7A1F35; } body { font-family: \"Bricolage Grotesque\", sans-serif; color: var(--ink); } deck-stage section { width:1920px; height:1080px; position:relative; overflow:hidden; box-sizing:border-box; } .mono { font-fam" - } - ], - "role_mapping.label": [ - { - "path": "beautiful-html-templates/templates/editorial-tri-tone/template.html", - "selector_or_token": "role_mapping.label.source_font", - "raw_value": "JetBrains Mono" - }, - { - "path": "beautiful-html-templates/templates/editorial-tri-tone/design.md", - "selector_or_token": "design.typography.roles", - "raw_value": "utter terracotta: butter navy: burgundy forest: burgundy ink: burgundy typography: display-wordmark: fontFamily: \"Bricolage Grotesque, sans-serif\" fontSize: 300px fontWeight: 800 lineHeight: 0.82 letterSpacing: -0.04em display-closer: fontFamily: \"Bricolage Grote" - } - ], - "paragraph_spacing": [ - { - "path": "beautiful-html-templates/templates/editorial-tri-tone/template.html", - "selector_or_token": "css.paragraph_spacing", - "raw_value": "48px; 12px; 32px; 4px; 24px; 20px; 48px card-pad: 28px 28px 30px chart-pad: 48px 48px 56px footer-bottom: 36px grid-gap: 24px endorsement-pad: 20px 0 canvas: width: 1920px height: 1080px components: pill: borderRadius: 999px padding: 0.35em 0.9em fontFamily: \"Bricolage Grotesque, sans-serif\" fontWeight: 500 lineHeight: 1.0 cover-pill: borderRadius: 999px padding: 16px 38px fontSize: 44px fontWeight: 500 closer-pill: borderRadius: 999px padding: 12px 28px fontSize: 22px value-card: borderRadius: " - } - ], - "text_transform_policy": [ - { - "path": "beautiful-html-templates/templates/editorial-tri-tone/template.html", - "selector_or_token": "css.text_transform_policy", - "raw_value": "uppercase` on CJK text.** Chinese has no case; uppercase; none" - } - ], - "line_height_scale": [ - { - "path": "beautiful-html-templates/templates/editorial-tri-tone/template.html", - "selector_or_token": "css.line_height_scale", - "raw_value": "1; 0.82; 0.9; 1.05; 1.45; 1.4; 0.78; 0.95; 1.5; 0.6; 1.1" - } - ], - "wrapping_policy": [ - { - "path": "beautiful-html-templates/templates/editorial-tri-tone/template.html", - "selector_or_token": "template.css.typography", - "raw_value": "#7A1F35; } html, body { margin:0; padding:0; background:#7A1F35; } body { font-family: \"Bricolage Grotesque\", sans-serif; color: var(--ink); } deck-stage section { width:1920px; height:1080px; position:relative; overflow:hidden; box-sizing:border-box; } .mono { font-fam" - } - ], - "font_weight_scale": [ - { - "path": "beautiful-html-templates/templates/editorial-tri-tone/template.html", - "selector_or_token": "css.font_weight_scale", - "raw_value": "700; 400; 500; 800; 600" - } - ], - "source_typography_tokens": [ - { - "path": "beautiful-html-templates/templates/editorial-tri-tone/template.html", - "selector_or_token": "css.source_typography_tokens", - "raw_value": "16px; 24px; 44px; 300px; 240px; 0.35em; 56px; 28px; 64px; 76px; 40px; 540px; 220px; 30px; 84px; 200px; 700; 400; 500; 800; 600; 1; 0.82; 0.9; 1.05; 1.45; 1.4; 0.78; 0.95; 1.5; 0.6; 1.1; -0.02em` to `-0.06em` depending on size. - Don't add solid-color dividers on dark (burgundy) surfaces. All structural lines on dark backgrounds must use low-opacity rgba. - Don't apply box shadows. The system has none. Depth comes from surface contrast and border-radius on contrasting backgrounds. - Don't round l" - } - ], - "role_mapping.metric": [ - { - "path": "beautiful-html-templates/templates/editorial-tri-tone/template.html", - "selector_or_token": "role_mapping.metric.source_font", - "raw_value": "JetBrains Mono" - }, - { - "path": "beautiful-html-templates/templates/editorial-tri-tone/design.md", - "selector_or_token": "design.typography.roles", - "raw_value": "utter terracotta: butter navy: burgundy forest: burgundy ink: burgundy typography: display-wordmark: fontFamily: \"Bricolage Grotesque, sans-serif\" fontSize: 300px fontWeight: 800 lineHeight: 0.82 letterSpacing: -0.04em display-closer: fontFamily: \"Bricolage Grote" - } - ], - "cjk_typography_adjustment": [ - { - "path": "beautiful-html-templates/templates/editorial-tri-tone/template.html", - "selector_or_token": "template.css.typography", - "raw_value": "#7A1F35; } html, body { margin:0; padding:0; background:#7A1F35; } body { font-family: \"Bricolage Grotesque\", sans-serif; color: var(--ink); } deck-stage section { width:1920px; height:1080px; position:relative; overflow:hidden; box-sizing:border-box; } .mono { font-fam" - } - ], - "hierarchy_ratio": [ - { - "path": "beautiful-html-templates/templates/editorial-tri-tone/template.html", - "selector_or_token": "template.css.typography", - "raw_value": "#7A1F35; } html, body { margin:0; padding:0; background:#7A1F35; } body { font-family: \"Bricolage Grotesque\", sans-serif; color: var(--ink); } deck-stage section { width:1920px; height:1080px; position:relative; overflow:hidden; box-sizing:border-box; } .mono { font-fam" - } - ], - "measure": [ - { - "path": "beautiful-html-templates/templates/editorial-tri-tone/template.html", - "selector_or_token": "template.css.typography", - "raw_value": "#7A1F35; } html, body { margin:0; padding:0; background:#7A1F35; } body { font-family: \"Bricolage Grotesque\", sans-serif; color: var(--ink); } deck-stage section { width:1920px; height:1080px; position:relative; overflow:hidden; box-sizing:border-box; } .mono { font-fam" - } - ], - "mapping_reason": [ - { - "path": "beautiful-html-templates/templates/editorial-tri-tone/template.html", - "selector_or_token": "template.css.typography", - "raw_value": "#7A1F35; } html, body { margin:0; padding:0; background:#7A1F35; } body { font-family: \"Bricolage Grotesque\", sans-serif; color: var(--ink); } deck-stage section { width:1920px; height:1080px; position:relative; overflow:hidden; box-sizing:border-box; } .mono { font-fam" - } - ], - "letter_spacing_scale": [ - { - "path": "beautiful-html-templates/templates/editorial-tri-tone/template.html", - "selector_or_token": "css.letter_spacing_scale", - "raw_value": "-0.02em` to `-0.06em` depending on size. - Don't add solid-color dividers on dark (burgundy) surfaces. All structural lines on dark backgrounds must use low-opacity rgba. - Don't apply box shadows. The system has none. Depth comes from surface contrast and border-radius on contrasting backgrounds. - Don't round large content containers (section panels, grid backgrounds). Rounding applies only to pill-scale and card-scale elements (value cards, chart card). - Don't use Bricolage Grotesque weight " - } - ] } }, - "text_style_strategy": { - "bold": { - "source_usage": "source uses heavy display/label weights", - "mapped_weight": { - "display": 900, - "label": 700, - "metric": 900 - }, - "allowed_roles": [ - "display", - "label", - "metric" - ] - }, - "italic": { - "source_usage": "source uses italic/font-style or italic-family tokens", - "mapped_style": "latin_only_when_source_requires_else_normal", - "fallback_when_unavailable": "use color_shift or weight_shift; do not fake CJK italic", - "loss_notes": "Satori/Slide may not provide exact Google italic face; record as visual approximation." - }, - "underline": { - "source_usage": "not a dominant source motif", - "mapped_decoration": "native underline only for actual text-decoration source usage", - "fallback_shape": "1px-3px rule or border accent when underline font rendering is unavailable" - }, - "line_through": { - "source_usage": "not present in source; default no line-through", - "mapped_decoration": "none", - "fallback_shape": "none" - }, - "emphasis": { - "color_shift": "use source accent color roles only", - "font_family_switch": "only switch between mapped display/body/label/metric roles from this family", - "weight_shift": "increase one role step within font_weight_scale", - "style_shift": "italic only when source_usage requires and CJK fallback is safe" - }, - "text_decoration_policy": { - "underline": { - "style": "none", - "color": "currentColor", - "thickness": "0px" - }, - "line_through": { - "style": "none", - "color": "currentColor", - "thickness": "0px" - } - }, - "forbidden": [ - "fake_cjk_italic", - "drop_source_text_transform", - "drop_source_letter_spacing_without_loss_note", - "use_cross_family_font_motif", - "remote_font_dependency_without_receipt" - ], - "extraction_confidence": { - "text_decoration_policy.line_through.color": "absent_use_default", - "text_decoration_policy.underline.color": "absent_use_default", - "text_decoration_policy.line_through.style": "absent_use_default", - "italic": "css_extracted_from_template_html", - "forbidden": "inferred_from_layout", - "emphasis": "inferred_from_layout", - "text_decoration_policy.underline.thickness": "absent_use_default", - "underline": "absent_use_default", - "text_decoration_policy.line_through.thickness": "absent_use_default", - "line_through": "absent_use_default", - "text_decoration_policy.underline.style": "absent_use_default", - "bold": "css_extracted_from_template_html" - }, - "source_refs": { - "italic": [ - { - "path": "beautiful-html-templates/templates/editorial-tri-tone/template.html", - "selector_or_token": "css.font-style", - "raw_value": "al-size axis) at extreme weights and negative letter-spacing. Instrument Serif (italic-cut only) appears as the expressive accent face for chapter numerals, pull-quotes, years, and signatures. JetBrains Mono carries all metadata, labels, and section markers at tight uppercase tracking. The aesthetic" - } - ], - "forbidden": [ - { - "path": "beautiful-html-templates/templates/editorial-tri-tone/template.html", - "selector_or_token": "template.css.typography", - "raw_value": "#7A1F35; } html, body { margin:0; padding:0; background:#7A1F35; } body { font-family: \"Bricolage Grotesque\", sans-serif; color: var(--ink); } deck-stage section { width:1920px; height:1080px; position:relative; overflow:hidden; box-sizing:border-box; } .mono { font-fam" - } - ], - "emphasis": [ - { - "path": "beautiful-html-templates/templates/editorial-tri-tone/template.html", - "selector_or_token": "template.css.typography", - "raw_value": "#7A1F35; } html, body { margin:0; padding:0; background:#7A1F35; } body { font-family: \"Bricolage Grotesque\", sans-serif; color: var(--ink); } deck-stage section { width:1920px; height:1080px; position:relative; overflow:hidden; box-sizing:border-box; } .mono { font-fam" - } - ], - "bold": [ - { - "path": "beautiful-html-templates/templates/editorial-tri-tone/template.html", - "selector_or_token": "css.font-weight", - "raw_value": "700; 400; 500; 800; 600" - } - ] - } - }, - "satori": { - "font_and_typography_constraints": [ - "italic is source-aware but CJK fake italic is forbidden; use color/weight fallback when unavailable", - "letter spacing is preserved for Latin labels and reset/softened for CJK" - ] - }, - "loss_notes": [ - "italic is source-aware but CJK fake italic is forbidden; use color/weight fallback when unavailable", - "letter spacing is preserved for Latin labels and reset/softened for CJK" - ], - "page_variant_count": 8, - "source_page_variants": [ - "chart", - "closer", - "cover", - "grid", - "manifesto", - "quote", - "stat", - "timeline" - ], - "page_family_source": { - "extractor": "skills/lark-slides/scripts/beautiful_template_page_family_extract.py", - "source_template_html": "beautiful-html-templates/templates/editorial-tri-tone/template.html", - "source_design_md": "beautiful-html-templates/templates/editorial-tri-tone/design.md", - "source_template_json": "beautiful-html-templates/templates/editorial-tri-tone/template.json", - "claim_boundary": "source extraction only; does not imply renderer, fidelity, quality gate, or production/default selectable status" - } - }, - { - "family_id": "emerald-editorial", - "template_id": "emerald-editorial-cover", - "runtime_template_id": "emerald-editorial-cover", - "source_template_html": "beautiful-html-templates/templates/emerald-editorial/template.html", - "source_design_md": "beautiful-html-templates/templates/emerald-editorial/design.md", - "source_template_json": "beautiful-html-templates/templates/emerald-editorial/template.json", - "renderer_id": "artboard_satori.emerald-editorial-cover", - "renderer_module": "skills/lark-slides/scripts/artboard_renderer/templates/beautiful/emerald-editorial-cover.mjs", - "golden_spec": "skills/lark-slides/scripts/fixtures/svglide_artboard/golden/emerald-editorial-cover.canvas-spec.json", - "reference_screenshot": "beautiful-html-templates/screenshots/emerald-editorial-1.png", - "fidelity_receipt": "skills/lark-slides/references/receipts/template-fidelity/emerald-editorial.emerald-editorial-cover.json", - "source_trace": [ - { - "source": "beautiful-html-templates/templates/emerald-editorial/template.html", - "evidence": "source_template_html" - }, - { - "source": "beautiful-html-templates/templates/emerald-editorial/design.md", - "evidence": "source_design_md" - }, - { - "source": "beautiful-html-templates/templates/emerald-editorial/template.json", - "evidence": "source_template_json" - }, - { - "source": "beautiful-html-templates/screenshots/emerald-editorial-1.png", - "evidence": "reference_screenshot" - }, - { - "source": "skills/lark-slides/references/absorptions/beautiful-html-templates/emerald-editorial.emerald-editorial-cover.json", - "evidence": "absorption_record" - }, - { - "source": "skills/lark-slides/references/receipts/template-fidelity/emerald-editorial.emerald-editorial-cover.json", - "evidence": "template_fidelity_receipt" - } - ], "visual_contract": { - "path": "skills/lark-slides/references/visual-contracts/beautiful/emerald-editorial.emerald-editorial-cover.json", - "layout_rhythm": "emerald-editorial: medium density, medium-high formality. A magazine-cover business deck: emerald + navy + paper, double-rule masthead ornaments, and a bold Bodoni-style display serif.", - "motifs": [ - "grid", - "accent line", - "card panels", - "paper texture", - "poster blocks", - "quote mark", - "sticker collage" - ], - "palette_roles": [ - "accent", - "background", - "border", - "muted", - "negative", - "positive", - "primary", - "surface", - "text" - ], "do_not_simplify": [ "preserve_fonts_palette_grid_slide_classes_decorative_elements", "do_not_recolor_without_explicit_brand_override", @@ -11751,95 +12272,67 @@ "do_not_mark_production_without_renderer_golden_fidelity_receipt", "do_not_strip_identity_decorations", "do_not_recolor_without_explicit_brand_override" - ] + ], + "layout_rhythm": "editorial-tri-tone: medium density, medium-high formality. Three-color editorial system: dusty pink, mustard cream, and deep burgundy, set in Bricolage + Instrument Serif.", + "motifs": [ + "grid", + "accent line", + "card panels", + "window chrome", + "poster blocks", + "quote mark", + "sticker collage" + ], + "palette_roles": [ + "accent", + "background", + "border", + "muted", + "negative", + "positive", + "primary", + "surface", + "text" + ], + "path": "skills/lark-slides/references/visual-contracts/beautiful/editorial-tri-tone.tritone-editorial-spread.json" }, - "fidelity_gate": { - "status": "passed", - "score": 0.9697, - "threshold": 0.72, - "reference_screenshot": "/Users/bytedance/bd-projects/beautiful-html-templates/screenshots/emerald-editorial-1.png", - "render_screenshot": "/Users/bytedance/bd-projects/workspaces/SVGlide/.worktrees/cli-svglide-svg-private/skills/lark-slides/scripts/fixtures/svglide_artboard/golden/emerald-editorial-cover.preview.png", - "receipt_path": "skills/lark-slides/references/receipts/template-fidelity/emerald-editorial.emerald-editorial-cover.json", - "issues": [] - }, - "promotion_status": "needs_review", - "default_selectable": false, + "visual_contract_path": "skills/lark-slides/references/visual-contracts/beautiful/editorial-tri-tone.tritone-editorial-spread.json" + }, + { "blocking_issues": [ - "selector_gate_missing", - "quality_gate_integration_pending", + "selector_gate_pending", + "quality_gate_pending", "production_review_pending" ], - "visual_contract_path": "skills/lark-slides/references/visual-contracts/beautiful/emerald-editorial.emerald-editorial-cover.json", - "planned_renderer_module": "skills/lark-slides/scripts/artboard_renderer/templates/beautiful/emerald-editorial-cover.mjs", - "planned_golden_spec": "skills/lark-slides/scripts/fixtures/svglide_artboard/golden/emerald-editorial-cover.canvas-spec.json", - "planned_fidelity_receipt": "skills/lark-slides/references/receipts/template-fidelity/emerald-editorial.emerald-editorial-cover.json", + "default_selectable": false, + "family_id": "emerald-editorial", + "fidelity_gate": { + "issues": [], + "receipt_path": "skills/lark-slides/references/receipts/template-fidelity/emerald-editorial.emerald-editorial-cover.json", + "reference_screenshot": "/Users/bytedance/bd-projects/beautiful-html-templates/screenshots/emerald-editorial-1.png", + "render_screenshot": "/Users/bytedance/bd-projects/workspaces/SVGlide/.worktrees/cli-svglide-svg-private/skills/lark-slides/scripts/fixtures/svglide_artboard/golden/emerald-editorial-cover.preview.png", + "score": 0.9697, + "status": "passed", + "threshold": 0.72 + }, + "fidelity_receipt": "skills/lark-slides/references/receipts/template-fidelity/emerald-editorial.emerald-editorial-cover.json", "font_strategy": { - "source_fonts": [ - "Bodoni Moda", - "LXGW WenKai TC", - "Manrope" - ], - "slide_native_preferred": [ - "system-sans-cjk" - ], "adobe_or_embedded_fallback": [ "Source Sans Pro", "思源黑体" ], "cjk_fallback": "Noto Serif SC", - "role_mapping": { - "display": { - "source_font": "Bodoni Moda", - "slide_font": "Source Sans Pro", - "runtime_alias": "SVGlideDisplay", - "cjk_font": "思源黑体", - "fallback_stack": [ - "system-sans-cjk", - "SVGlideDisplay" - ], - "source_only": false, - "requires_download": false, - "mapping_reason": "保留 Bodoni Moda 的语义角色,但运行时优先使用 Slide/系统可用的 Source Sans Pro 与 思源黑体。" - }, - "body": { - "source_font": "LXGW WenKai TC", - "slide_font": "Source Sans Pro", - "runtime_alias": "SVGlideBody", - "cjk_font": "思源黑体", - "fallback_stack": [ - "system-sans-cjk", - "SVGlideBody" - ], - "source_only": false, - "requires_download": false, - "mapping_reason": "保留 LXGW WenKai TC 的语义角色,但运行时优先使用 Slide/系统可用的 Source Sans Pro 与 思源黑体。" - }, - "label": { - "source_font": "Bodoni Moda", - "slide_font": "Source Sans Pro", - "runtime_alias": "SVGlideLabel", - "cjk_font": "思源黑体", - "fallback_stack": [ - "system-sans-cjk", - "SVGlideLabel" - ], - "source_only": false, - "requires_download": false, - "mapping_reason": "保留 Bodoni Moda 的语义角色,但运行时优先使用 Slide/系统可用的 Source Sans Pro 与 思源黑体。" - }, - "metric": { - "source_font": "Bodoni Moda", - "slide_font": "Source Sans Pro", - "runtime_alias": "SVGlideMetric", - "cjk_font": "思源黑体", - "fallback_stack": [ - "system-sans-cjk", - "SVGlideMetric" - ], - "source_only": false, - "requires_download": false, - "mapping_reason": "保留 Bodoni Moda 的语义角色,但运行时优先使用 Slide/系统可用的 Source Sans Pro 与 思源黑体。" - } + "extraction_confidence": { + "adobe_or_embedded_fallback": "inferred_from_layout", + "cjk_fallback": "inferred_from_layout", + "forbidden": "inferred_from_layout", + "mapping_reason": "inferred_from_layout", + "role_mapping.body": "inferred_from_layout", + "role_mapping.display": "inferred_from_layout", + "role_mapping.label": "inferred_from_layout", + "role_mapping.metric": "inferred_from_layout", + "slide_native_preferred": "inferred_from_layout", + "source_fonts": "css_extracted_from_template_html" }, "forbidden": [ "remote_font_runtime_dependency", @@ -11848,119 +12341,691 @@ "drop_cjk_fallback" ], "mapping_reason": "根据 design.md/template.html/template.json 中的 font-family 与 typography token 提取源字体;运行时按 Slide/系统/Adobe/思源可用字体降级。", + "role_mapping": { + "body": { + "cjk_font": "思源黑体", + "fallback_stack": [ + "system-sans-cjk", + "SVGlideBody" + ], + "mapping_reason": "保留 LXGW WenKai TC 的语义角色,但运行时优先使用 Slide/系统可用的 Source Sans Pro 与 思源黑体。", + "requires_download": false, + "runtime_alias": "SVGlideBody", + "slide_font": "Source Sans Pro", + "source_font": "LXGW WenKai TC", + "source_only": false + }, + "display": { + "cjk_font": "思源黑体", + "fallback_stack": [ + "system-sans-cjk", + "SVGlideDisplay" + ], + "mapping_reason": "保留 Bodoni Moda 的语义角色,但运行时优先使用 Slide/系统可用的 Source Sans Pro 与 思源黑体。", + "requires_download": false, + "runtime_alias": "SVGlideDisplay", + "slide_font": "Source Sans Pro", + "source_font": "Bodoni Moda", + "source_only": false + }, + "label": { + "cjk_font": "思源黑体", + "fallback_stack": [ + "system-sans-cjk", + "SVGlideLabel" + ], + "mapping_reason": "保留 Bodoni Moda 的语义角色,但运行时优先使用 Slide/系统可用的 Source Sans Pro 与 思源黑体。", + "requires_download": false, + "runtime_alias": "SVGlideLabel", + "slide_font": "Source Sans Pro", + "source_font": "Bodoni Moda", + "source_only": false + }, + "metric": { + "cjk_font": "思源黑体", + "fallback_stack": [ + "system-sans-cjk", + "SVGlideMetric" + ], + "mapping_reason": "保留 Bodoni Moda 的语义角色,但运行时优先使用 Slide/系统可用的 Source Sans Pro 与 思源黑体。", + "requires_download": false, + "runtime_alias": "SVGlideMetric", + "slide_font": "Source Sans Pro", + "source_font": "Bodoni Moda", + "source_only": false + } + }, + "same_role_font_justification": "源模板本身以单一 sans/system family 承担多数字体角色;通过 weight/size/line-height/uppercase 区分 display/body/label/metric。", + "slide_native_preferred": [ + "system-sans-cjk" + ], "source_evidence": [ "beautiful-html-templates/templates/emerald-editorial/design.md", "beautiful-html-templates/templates/emerald-editorial/template.html", "beautiful-html-templates/templates/emerald-editorial/template.json", "beautiful-html-templates/screenshots/emerald-editorial-1.png" ], - "same_role_font_justification": "源模板本身以单一 sans/system family 承担多数字体角色;通过 weight/size/line-height/uppercase 区分 display/body/label/metric。", - "extraction_confidence": { - "role_mapping.body": "inferred_from_layout", - "role_mapping.display": "inferred_from_layout", - "source_fonts": "css_extracted_from_template_html", - "adobe_or_embedded_fallback": "inferred_from_layout", - "cjk_fallback": "inferred_from_layout", - "role_mapping.metric": "inferred_from_layout", - "forbidden": "inferred_from_layout", - "slide_native_preferred": "inferred_from_layout", - "mapping_reason": "inferred_from_layout", - "role_mapping.label": "inferred_from_layout" - }, + "source_fonts": [ + "Bodoni Moda", + "LXGW WenKai TC", + "Manrope" + ], "source_refs": { - "role_mapping.body": [ - { - "path": "beautiful-html-templates/templates/emerald-editorial/template.html", - "selector_or_token": "role_mapping.body.source_font", - "raw_value": "LXGW WenKai TC" - }, - { - "path": "beautiful-html-templates/templates/emerald-editorial/design.md", - "selector_or_token": "design.typography.roles", - "raw_value": "E9D6\" rule: \"rgba(15, 26, 92, 0.22)\" rule-strong: \"rgba(15, 26, 92, 0.85)\" typography: numeral-jumbo: fontFamily: \"'Bodoni Moda', serif\" fontSize: 460 fontWeight: 900 lineHeight: 0.9 letterSpacing: -0.04em display-section: fontFamily: \"'Bodoni Moda', serif\" fontS" - } - ], - "role_mapping.display": [ - { - "path": "beautiful-html-templates/templates/emerald-editorial/template.html", - "selector_or_token": "role_mapping.display.source_font", - "raw_value": "Bodoni Moda" - }, - { - "path": "beautiful-html-templates/templates/emerald-editorial/design.md", - "selector_or_token": "design.typography.roles", - "raw_value": "E9D6\" rule: \"rgba(15, 26, 92, 0.22)\" rule-strong: \"rgba(15, 26, 92, 0.85)\" typography: numeral-jumbo: fontFamily: \"'Bodoni Moda', serif\" fontSize: 460 fontWeight: 900 lineHeight: 0.9 letterSpacing: -0.04em display-section: fontFamily: \"'Bodoni Moda', serif\" fontS" - } - ], - "source_fonts": [ - { - "path": "beautiful-html-templates/templates/emerald-editorial/template.html", - "selector_or_token": "css.font-family", - "raw_value": "'Bodoni Moda', 'LXGW WenKai TC', 'Noto Serif SC', Georgia, serif; 'Manrope', 'Noto Sans SC', system-ui, sans-serif; 'Manrope', sans-serif; var(--display-font)" - } - ], "adobe_or_embedded_fallback": [ { "path": "beautiful-html-templates/templates/emerald-editorial/template.html", - "selector_or_token": "css.font-family", - "raw_value": "'Bodoni Moda', 'LXGW WenKai TC', 'Noto Serif SC', Georgia, serif; 'Manrope', 'Noto Sans SC', system-ui, sans-serif; 'Manrope', sans-serif; var(--display-font)" + "raw_value": "'Bodoni Moda', 'LXGW WenKai TC', 'Noto Serif SC', Georgia, serif; 'Manrope', 'Noto Sans SC', system-ui, sans-serif; 'Manrope', sans-serif; var(--display-font)", + "selector_or_token": "css.font-family" } ], "cjk_fallback": [ { "path": "beautiful-html-templates/templates/emerald-editorial/template.html", - "selector_or_token": "css.font-family", - "raw_value": "'Bodoni Moda', 'LXGW WenKai TC', 'Noto Serif SC', Georgia, serif; 'Manrope', 'Noto Sans SC', system-ui, sans-serif; 'Manrope', sans-serif; var(--display-font)" - } - ], - "role_mapping.metric": [ - { - "path": "beautiful-html-templates/templates/emerald-editorial/template.html", - "selector_or_token": "role_mapping.metric.source_font", - "raw_value": "Bodoni Moda" - }, - { - "path": "beautiful-html-templates/templates/emerald-editorial/design.md", - "selector_or_token": "design.typography.roles", - "raw_value": "E9D6\" rule: \"rgba(15, 26, 92, 0.22)\" rule-strong: \"rgba(15, 26, 92, 0.85)\" typography: numeral-jumbo: fontFamily: \"'Bodoni Moda', serif\" fontSize: 460 fontWeight: 900 lineHeight: 0.9 letterSpacing: -0.04em display-section: fontFamily: \"'Bodoni Moda', serif\" fontS" + "raw_value": "'Bodoni Moda', 'LXGW WenKai TC', 'Noto Serif SC', Georgia, serif; 'Manrope', 'Noto Sans SC', system-ui, sans-serif; 'Manrope', sans-serif; var(--display-font)", + "selector_or_token": "css.font-family" } ], "forbidden": [ { "path": "beautiful-html-templates/templates/emerald-editorial/template.html", - "selector_or_token": "css.font-family", - "raw_value": "'Bodoni Moda', 'LXGW WenKai TC', 'Noto Serif SC', Georgia, serif; 'Manrope', 'Noto Sans SC', system-ui, sans-serif; 'Manrope', sans-serif; var(--display-font)" - } - ], - "slide_native_preferred": [ - { - "path": "beautiful-html-templates/templates/emerald-editorial/template.html", - "selector_or_token": "css.font-family", - "raw_value": "'Bodoni Moda', 'LXGW WenKai TC', 'Noto Serif SC', Georgia, serif; 'Manrope', 'Noto Sans SC', system-ui, sans-serif; 'Manrope', sans-serif; var(--display-font)" + "raw_value": "'Bodoni Moda', 'LXGW WenKai TC', 'Noto Serif SC', Georgia, serif; 'Manrope', 'Noto Sans SC', system-ui, sans-serif; 'Manrope', sans-serif; var(--display-font)", + "selector_or_token": "css.font-family" } ], "mapping_reason": [ { "path": "beautiful-html-templates/templates/emerald-editorial/template.html", - "selector_or_token": "css.font-family", - "raw_value": "'Bodoni Moda', 'LXGW WenKai TC', 'Noto Serif SC', Georgia, serif; 'Manrope', 'Noto Sans SC', system-ui, sans-serif; 'Manrope', sans-serif; var(--display-font)" + "raw_value": "'Bodoni Moda', 'LXGW WenKai TC', 'Noto Serif SC', Georgia, serif; 'Manrope', 'Noto Sans SC', system-ui, sans-serif; 'Manrope', sans-serif; var(--display-font)", + "selector_or_token": "css.font-family" + } + ], + "role_mapping.body": [ + { + "path": "beautiful-html-templates/templates/emerald-editorial/template.html", + "raw_value": "LXGW WenKai TC", + "selector_or_token": "role_mapping.body.source_font" + }, + { + "path": "beautiful-html-templates/templates/emerald-editorial/design.md", + "raw_value": "E9D6\" rule: \"rgba(15, 26, 92, 0.22)\" rule-strong: \"rgba(15, 26, 92, 0.85)\" typography: numeral-jumbo: fontFamily: \"'Bodoni Moda', serif\" fontSize: 460 fontWeight: 900 lineHeight: 0.9 letterSpacing: -0.04em display-section: fontFamily: \"'Bodoni Moda', serif\" fontS", + "selector_or_token": "design.typography.roles" + } + ], + "role_mapping.display": [ + { + "path": "beautiful-html-templates/templates/emerald-editorial/template.html", + "raw_value": "Bodoni Moda", + "selector_or_token": "role_mapping.display.source_font" + }, + { + "path": "beautiful-html-templates/templates/emerald-editorial/design.md", + "raw_value": "E9D6\" rule: \"rgba(15, 26, 92, 0.22)\" rule-strong: \"rgba(15, 26, 92, 0.85)\" typography: numeral-jumbo: fontFamily: \"'Bodoni Moda', serif\" fontSize: 460 fontWeight: 900 lineHeight: 0.9 letterSpacing: -0.04em display-section: fontFamily: \"'Bodoni Moda', serif\" fontS", + "selector_or_token": "design.typography.roles" } ], "role_mapping.label": [ { "path": "beautiful-html-templates/templates/emerald-editorial/template.html", - "selector_or_token": "role_mapping.label.source_font", - "raw_value": "Bodoni Moda" + "raw_value": "Bodoni Moda", + "selector_or_token": "role_mapping.label.source_font" }, { "path": "beautiful-html-templates/templates/emerald-editorial/design.md", - "selector_or_token": "design.typography.roles", - "raw_value": "E9D6\" rule: \"rgba(15, 26, 92, 0.22)\" rule-strong: \"rgba(15, 26, 92, 0.85)\" typography: numeral-jumbo: fontFamily: \"'Bodoni Moda', serif\" fontSize: 460 fontWeight: 900 lineHeight: 0.9 letterSpacing: -0.04em display-section: fontFamily: \"'Bodoni Moda', serif\" fontS" + "raw_value": "E9D6\" rule: \"rgba(15, 26, 92, 0.22)\" rule-strong: \"rgba(15, 26, 92, 0.85)\" typography: numeral-jumbo: fontFamily: \"'Bodoni Moda', serif\" fontSize: 460 fontWeight: 900 lineHeight: 0.9 letterSpacing: -0.04em display-section: fontFamily: \"'Bodoni Moda', serif\" fontS", + "selector_or_token": "design.typography.roles" + } + ], + "role_mapping.metric": [ + { + "path": "beautiful-html-templates/templates/emerald-editorial/template.html", + "raw_value": "Bodoni Moda", + "selector_or_token": "role_mapping.metric.source_font" + }, + { + "path": "beautiful-html-templates/templates/emerald-editorial/design.md", + "raw_value": "E9D6\" rule: \"rgba(15, 26, 92, 0.22)\" rule-strong: \"rgba(15, 26, 92, 0.85)\" typography: numeral-jumbo: fontFamily: \"'Bodoni Moda', serif\" fontSize: 460 fontWeight: 900 lineHeight: 0.9 letterSpacing: -0.04em display-section: fontFamily: \"'Bodoni Moda', serif\" fontS", + "selector_or_token": "design.typography.roles" + } + ], + "slide_native_preferred": [ + { + "path": "beautiful-html-templates/templates/emerald-editorial/template.html", + "raw_value": "'Bodoni Moda', 'LXGW WenKai TC', 'Noto Serif SC', Georgia, serif; 'Manrope', 'Noto Sans SC', system-ui, sans-serif; 'Manrope', sans-serif; var(--display-font)", + "selector_or_token": "css.font-family" + } + ], + "source_fonts": [ + { + "path": "beautiful-html-templates/templates/emerald-editorial/template.html", + "raw_value": "'Bodoni Moda', 'LXGW WenKai TC', 'Noto Serif SC', Georgia, serif; 'Manrope', 'Noto Sans SC', system-ui, sans-serif; 'Manrope', sans-serif; var(--display-font)", + "selector_or_token": "css.font-family" } ] } }, + "golden_spec": "skills/lark-slides/scripts/fixtures/svglide_artboard/golden/emerald-editorial-cover.canvas-spec.json", + "implemented_page_variants": [ + "s1", + "s2", + "s3", + "s4", + "s5", + "s6", + "s7", + "s8" + ], + "loss_notes": [ + "italic is source-aware but CJK fake italic is forbidden; use color/weight fallback when unavailable", + "letter spacing is preserved for Latin labels and reset/softened for CJK" + ], + "page_family_implementation_note": "Implements the 8 source slides from emerald-editorial/template.html as explicit emerald-editorial-cover variants. Smoke evidence will cover production role aliases by reusing the statement page once for quote/emphasis, but does not promote the family.", + "page_family_smoke": { + "missing_required_roles": [], + "production_selectable": false, + "receipt_path": "skills/lark-slides/references/receipts/page-family-smoke/emerald-editorial.emerald-editorial-cover.json", + "rendered_pages": 9, + "reuse_count": 1, + "selection_source": "explicit_fixture", + "status": "passed" + }, + "page_family_smoke_deck": "skills/lark-slides/references/page-family-smoke-decks/emerald-editorial.json", + "page_family_smoke_receipt": "skills/lark-slides/references/receipts/page-family-smoke/emerald-editorial.emerald-editorial-cover.json", + "page_family_source": { + "claim_boundary": "source extraction only; does not imply renderer, fidelity, quality gate, or production/default selectable status", + "extractor": "skills/lark-slides/scripts/beautiful_template_page_family_extract.py", + "source_design_md": "beautiful-html-templates/templates/emerald-editorial/design.md", + "source_template_html": "beautiful-html-templates/templates/emerald-editorial/template.html", + "source_template_json": "beautiful-html-templates/templates/emerald-editorial/template.json" + }, + "page_variant_count": 8, + "page_variant_golden_specs": { + "s1": "skills/lark-slides/scripts/fixtures/svglide_artboard/golden/emerald-editorial.s1.canvas-spec.json", + "s2": "skills/lark-slides/scripts/fixtures/svglide_artboard/golden/emerald-editorial.s2.canvas-spec.json", + "s3": "skills/lark-slides/scripts/fixtures/svglide_artboard/golden/emerald-editorial.s3.canvas-spec.json", + "s4": "skills/lark-slides/scripts/fixtures/svglide_artboard/golden/emerald-editorial.s4.canvas-spec.json", + "s5": "skills/lark-slides/scripts/fixtures/svglide_artboard/golden/emerald-editorial.s5.canvas-spec.json", + "s6": "skills/lark-slides/scripts/fixtures/svglide_artboard/golden/emerald-editorial.s6.canvas-spec.json", + "s7": "skills/lark-slides/scripts/fixtures/svglide_artboard/golden/emerald-editorial.s7.canvas-spec.json", + "s8": "skills/lark-slides/scripts/fixtures/svglide_artboard/golden/emerald-editorial.s8.canvas-spec.json" + }, + "planned_fidelity_receipt": "skills/lark-slides/references/receipts/template-fidelity/emerald-editorial.emerald-editorial-cover.json", + "planned_golden_spec": "skills/lark-slides/scripts/fixtures/svglide_artboard/golden/emerald-editorial-cover.canvas-spec.json", + "planned_renderer_module": "skills/lark-slides/scripts/artboard_renderer/templates/beautiful/emerald-editorial-cover.mjs", + "promotion_status": "needs_review", + "reference_screenshot": "beautiful-html-templates/screenshots/emerald-editorial-1.png", + "renderer_id": "artboard_satori.emerald-editorial-cover", + "renderer_module": "skills/lark-slides/scripts/artboard_renderer/templates/beautiful/emerald-editorial-cover.mjs", + "renderer_stage": "page_family", + "runtime_template_id": "emerald-editorial-cover", + "satori": { + "font_and_typography_constraints": [ + "italic is source-aware but CJK fake italic is forbidden; use color/weight fallback when unavailable", + "letter spacing is preserved for Latin labels and reset/softened for CJK" + ] + }, + "selection_scope": "experimental", + "source_design_md": "beautiful-html-templates/templates/emerald-editorial/design.md", + "source_page_variants": [ + "s1", + "s2", + "s3", + "s4", + "s5", + "s6", + "s7", + "s8" + ], + "source_template_html": "beautiful-html-templates/templates/emerald-editorial/template.html", + "source_template_json": "beautiful-html-templates/templates/emerald-editorial/template.json", + "source_trace": [ + { + "evidence": "source_template_html", + "source": "beautiful-html-templates/templates/emerald-editorial/template.html" + }, + { + "evidence": "source_design_md", + "source": "beautiful-html-templates/templates/emerald-editorial/design.md" + }, + { + "evidence": "source_template_json", + "source": "beautiful-html-templates/templates/emerald-editorial/template.json" + }, + { + "evidence": "reference_screenshot", + "source": "beautiful-html-templates/screenshots/emerald-editorial-1.png" + }, + { + "evidence": "absorption_record", + "source": "skills/lark-slides/references/absorptions/beautiful-html-templates/emerald-editorial.emerald-editorial-cover.json" + }, + { + "evidence": "template_fidelity_receipt", + "source": "skills/lark-slides/references/receipts/template-fidelity/emerald-editorial.emerald-editorial-cover.json" + } + ], + "supported_page_variants": [ + "s1", + "s2", + "s3", + "s4", + "s5", + "s6", + "s7", + "s8" + ], + "template_id": "emerald-editorial-cover", + "text_style_strategy": { + "bold": { + "allowed_roles": [ + "display", + "label", + "metric" + ], + "mapped_weight": { + "display": 900, + "label": 700, + "metric": 900 + }, + "source_usage": "source uses heavy display/label weights" + }, + "emphasis": { + "color_shift": "use source accent color roles only", + "font_family_switch": "only switch between mapped display/body/label/metric roles from this family", + "style_shift": "italic only when source_usage requires and CJK fallback is safe", + "weight_shift": "increase one role step within font_weight_scale" + }, + "extraction_confidence": { + "bold": "css_extracted_from_template_html", + "emphasis": "inferred_from_layout", + "forbidden": "inferred_from_layout", + "italic": "css_extracted_from_template_html", + "line_through": "absent_use_default", + "text_decoration_policy.line_through.color": "absent_use_default", + "text_decoration_policy.line_through.style": "absent_use_default", + "text_decoration_policy.line_through.thickness": "absent_use_default", + "text_decoration_policy.underline.color": "css_extracted_from_template_html", + "text_decoration_policy.underline.style": "css_extracted_from_template_html", + "text_decoration_policy.underline.thickness": "css_extracted_from_template_html", + "underline": "css_extracted_from_template_html" + }, + "forbidden": [ + "fake_cjk_italic", + "drop_source_text_transform", + "drop_source_letter_spacing_without_loss_note", + "use_cross_family_font_motif", + "remote_font_dependency_without_receipt" + ], + "italic": { + "fallback_when_unavailable": "use color_shift or weight_shift; do not fake CJK italic", + "loss_notes": "Satori/Slide may not provide exact Google italic face; record as visual approximation.", + "mapped_style": "latin_only_when_source_requires_else_normal", + "source_usage": "source uses italic/font-style or italic-family tokens" + }, + "line_through": { + "fallback_shape": "none", + "mapped_decoration": "none", + "source_usage": "not present in source; default no line-through" + }, + "source_refs": { + "bold": [ + { + "path": "beautiful-html-templates/templates/emerald-editorial/template.html", + "raw_value": "900; 800; 600; 700; 500", + "selector_or_token": "css.font-weight" + } + ], + "emphasis": [ + { + "path": "beautiful-html-templates/templates/emerald-editorial/template.html", + "raw_value": "20px; height: 1080px; background: var(--bg); color: var(--ink); font-family: 'Manrope', sans-serif; overflow: hidden; position: relative; box-sizing: border-box; } /* Bold display serif — Bodoni Moda heavy */ .display { font-family: var(--display-font); fon", + "selector_or_token": "template.css.typography" + } + ], + "forbidden": [ + { + "path": "beautiful-html-templates/templates/emerald-editorial/template.html", + "raw_value": "20px; height: 1080px; background: var(--bg); color: var(--ink); font-family: 'Manrope', sans-serif; overflow: hidden; position: relative; box-sizing: border-box; } /* Bold display serif — Bodoni Moda heavy */ .display { font-family: var(--display-font); fon", + "selector_or_token": "template.css.typography" + } + ], + "italic": [ + { + "path": "beautiful-html-templates/templates/emerald-editorial/template.html", + "raw_value": "i never appears at body / label scale, Manrope never appears at display scale. Italics are loaded in the Bodoni font request but not used in the published system — keep them out unless intentionally introducing a new pattern. Underline is not used. Emphasis is communicated through size, color inver", + "selector_or_token": "css.font-style" + } + ], + "text_decoration_policy.underline.color": [ + { + "path": "beautiful-html-templates/templates/emerald-editorial/template.html", + "raw_value": "ublished system — keep them out unless intentionally introducing a new pattern. Underline is not used. Emphasis is communicated through size, color inversion, and ornamentation. ## Layout ### Canvas System The system targets a fixed **1920×1080** canvas. Slides are `
` elemen", + "selector_or_token": "css.text-decoration" + } + ], + "text_decoration_policy.underline.style": [ + { + "path": "beautiful-html-templates/templates/emerald-editorial/template.html", + "raw_value": "ublished system — keep them out unless intentionally introducing a new pattern. Underline is not used. Emphasis is communicated through size, color inversion, and ornamentation. ## Layout ### Canvas System The system targets a fixed **1920×1080** canvas. Slides are `
` elemen", + "selector_or_token": "css.text-decoration" + } + ], + "text_decoration_policy.underline.thickness": [ + { + "path": "beautiful-html-templates/templates/emerald-editorial/template.html", + "raw_value": "ublished system — keep them out unless intentionally introducing a new pattern. Underline is not used. Emphasis is communicated through size, color inversion, and ornamentation. ## Layout ### Canvas System The system targets a fixed **1920×1080** canvas. Slides are `
` elemen", + "selector_or_token": "css.text-decoration" + } + ], + "underline": [ + { + "path": "beautiful-html-templates/templates/emerald-editorial/template.html", + "raw_value": "ublished system — keep them out unless intentionally introducing a new pattern. Underline is not used. Emphasis is communicated through size, color inversion, and ornamentation. ## Layout ### Canvas System The system targets a fixed **1920×1080** canvas. Slides are `
` elemen", + "selector_or_token": "css.text-decoration" + } + ] + }, + "text_decoration_policy": { + "line_through": { + "color": "currentColor", + "style": "none", + "thickness": "0px" + }, + "underline": { + "color": "currentColor", + "style": "solid", + "thickness": "1px" + } + }, + "underline": { + "fallback_shape": "1px-3px rule or border accent when underline font rendering is unavailable", + "mapped_decoration": "native underline only for actual text-decoration source usage", + "source_usage": "source uses underline/text-decoration or hairline emphasis" + } + }, "typography_strategy": { + "alignment": { + "fallback": "left/top aligned unless source screenshot is centered", + "primary": "follow source composition" + }, + "cjk_typography_adjustment": { + "body_font_cn": "Noto Sans SC", + "display_font_cn": "Noto Serif SC", + "italic_policy": "color_only_emphasis", + "letter_spacing_policy": "reset_letter_spacing_for_cjk_keep_latin_labels", + "mixed_run_spacing": "pangu_spacing" + }, + "extraction_confidence": { + "alignment": "inferred_from_layout", + "cjk_typography_adjustment": "inferred_from_layout", + "font_size_scale": "css_extracted_from_template_html", + "font_weight_scale": "css_extracted_from_template_html", + "hierarchy_ratio": "inferred_from_layout", + "letter_spacing_scale": "css_extracted_from_template_html", + "line_height_scale": "css_extracted_from_template_html", + "mapping_reason": "inferred_from_layout", + "max_lines": "inferred_from_layout", + "measure": "inferred_from_layout", + "paragraph_spacing": "css_extracted_from_template_html", + "role_mapping.body": "inferred_from_layout", + "role_mapping.display": "inferred_from_layout", + "role_mapping.label": "inferred_from_layout", + "role_mapping.metric": "inferred_from_layout", + "source_typography_tokens": "css_extracted_from_template_html", + "text_direction": "css_extracted_from_template_html", + "text_transform_policy": "css_extracted_from_template_html", + "word_spacing": "absent_use_default", + "wrapping_policy": "inferred_from_layout", + "writing_mode": "absent_use_default" + }, + "font_size_scale": { + "body": 20, + "display": 88, + "label": 12, + "metric": 56 + }, + "font_weight_scale": { + "body": 400, + "display": 900, + "label": 700, + "metric": 900 + }, + "hierarchy_ratio": 4.4, + "letter_spacing_scale": { + "body": 0, + "display": 0, + "label": 0.08, + "metric": 0 + }, + "line_height_scale": { + "body": 1.32, + "display": 0.9, + "label": 1.05, + "metric": 0.95 + }, + "mapping_reason": "按源模板字号/字重/行高/字距/大小写规则抽象到 960x540 Slide 画布的四个文本角色。", + "max_lines": { + "body": 5, + "display": 3, + "label": 1, + "metric": 2 + }, + "measure": { + "body": "40-70 characters or CJK equivalent", + "display": "0.55-0.78 canvas width", + "label": "short mono labels", + "metric": "short numeric/stat blocks" + }, + "paragraph_spacing": { + "body_after": 12, + "display_after": 0, + "label_after": 0, + "metric_after": 0 + }, + "role_mapping": { + "body": { + "alignment": "source_layout_dependent", + "font_role": "body", + "font_size": 20, + "font_weight": 400, + "letter_spacing": 0, + "line_height": 1.32, + "max_lines": 5, + "runtime_alias": "SVGlideBody", + "source_font": "LXGW WenKai TC", + "text_transform": "preserve_source_case" + }, + "display": { + "alignment": "source_layout_dependent", + "font_role": "display", + "font_size": 88, + "font_weight": 900, + "letter_spacing": 0, + "line_height": 0.9, + "max_lines": 3, + "runtime_alias": "SVGlideDisplay", + "source_font": "Bodoni Moda", + "text_transform": "latin_uppercase_only" + }, + "label": { + "alignment": "source_layout_dependent", + "font_role": "label", + "font_size": 12, + "font_weight": 700, + "letter_spacing": 0.08, + "line_height": 1.05, + "max_lines": 1, + "runtime_alias": "SVGlideLabel", + "source_font": "Bodoni Moda", + "text_transform": "latin_uppercase_labels_reset_cjk_spacing" + }, + "metric": { + "alignment": "source_layout_dependent", + "font_role": "metric", + "font_size": 56, + "font_weight": 900, + "letter_spacing": 0, + "line_height": 0.95, + "max_lines": 2, + "runtime_alias": "SVGlideMetric", + "source_font": "Bodoni Moda", + "text_transform": "preserve_numbers_and_units" + } + }, + "source_refs": { + "alignment": [ + { + "path": "beautiful-html-templates/templates/emerald-editorial/template.html", + "raw_value": "20px; height: 1080px; background: var(--bg); color: var(--ink); font-family: 'Manrope', sans-serif; overflow: hidden; position: relative; box-sizing: border-box; } /* Bold display serif — Bodoni Moda heavy */ .display { font-family: var(--display-font); fon", + "selector_or_token": "template.css.typography" + } + ], + "cjk_typography_adjustment": [ + { + "path": "beautiful-html-templates/templates/emerald-editorial/template.html", + "raw_value": "20px; height: 1080px; background: var(--bg); color: var(--ink); font-family: 'Manrope', sans-serif; overflow: hidden; position: relative; box-sizing: border-box; } /* Bold display serif — Bodoni Moda heavy */ .display { font-family: var(--display-font); fon", + "selector_or_token": "template.css.typography" + } + ], + "font_size_scale": [ + { + "path": "beautiful-html-templates/templates/emerald-editorial/template.html", + "raw_value": "0.42em; 26px; 76px; 184px; 68px; 28px; 200px; 64px; 460px; 128px; 24px; 130px; 84px; 44px; 104px; 30px", + "selector_or_token": "css.font_size_scale" + } + ], + "font_weight_scale": [ + { + "path": "beautiful-html-templates/templates/emerald-editorial/template.html", + "raw_value": "900; 800; 600; 700; 500", + "selector_or_token": "css.font_weight_scale" + } + ], + "hierarchy_ratio": [ + { + "path": "beautiful-html-templates/templates/emerald-editorial/template.html", + "raw_value": "20px; height: 1080px; background: var(--bg); color: var(--ink); font-family: 'Manrope', sans-serif; overflow: hidden; position: relative; box-sizing: border-box; } /* Bold display serif — Bodoni Moda heavy */ .display { font-family: var(--display-font); fon", + "selector_or_token": "template.css.typography" + } + ], + "letter_spacing_scale": [ + { + "path": "beautiful-html-templates/templates/emerald-editorial/template.html", + "raw_value": "0` — or a tiny positive `0.02em` if the headline feels visually packed. - **Never `text-transform: uppercase` on CJK text.** Chinese has no case; -0.005em; 0.04em; 0.02em; 0.05em; -0.01em; 0.18em; -0.015em; 0.1em; 0.08em; -0.04em; 0.16em; 0.14em; 0.06em; 0.12em; -0.02em", + "selector_or_token": "css.letter_spacing_scale" + } + ], + "line_height_scale": [ + { + "path": "beautiful-html-templates/templates/emerald-editorial/template.html", + "raw_value": "0.95; 1; 0.92; 0.9; 1.5; 0.96; 1.05; 1.45; 1.0; 1.35; 1.4; 1.1", + "selector_or_token": "css.line_height_scale" + } + ], + "mapping_reason": [ + { + "path": "beautiful-html-templates/templates/emerald-editorial/template.html", + "raw_value": "20px; height: 1080px; background: var(--bg); color: var(--ink); font-family: 'Manrope', sans-serif; overflow: hidden; position: relative; box-sizing: border-box; } /* Bold display serif — Bodoni Moda heavy */ .display { font-family: var(--display-font); fon", + "selector_or_token": "template.css.typography" + } + ], + "max_lines": [ + { + "path": "beautiful-html-templates/templates/emerald-editorial/template.html", + "raw_value": "20px; height: 1080px; background: var(--bg); color: var(--ink); font-family: 'Manrope', sans-serif; overflow: hidden; position: relative; box-sizing: border-box; } /* Bold display serif — Bodoni Moda heavy */ .display { font-family: var(--display-font); fon", + "selector_or_token": "template.css.typography" + } + ], + "measure": [ + { + "path": "beautiful-html-templates/templates/emerald-editorial/template.html", + "raw_value": "20px; height: 1080px; background: var(--bg); color: var(--ink); font-family: 'Manrope', sans-serif; overflow: hidden; position: relative; box-sizing: border-box; } /* Bold display serif — Bodoni Moda heavy */ .display { font-family: var(--display-font); fon", + "selector_or_token": "template.css.typography" + } + ], + "paragraph_spacing": [ + { + "path": "beautiful-html-templates/templates/emerald-editorial/template.html", + "raw_value": "-2px; 30px; 18px; 24px; 14px; 10px; \"3px\" wordWeight: 800 wordFamily: \"'Bodoni Moda', serif\" ornament-vertical: description: \"An inline horizontal pair of stacked rules (each 4px tall, 8px apart) on either side of a small serif word. Used as a side bracket around connector words like prepositions.\" ruleHeight: \"4px\" ruleGap: \"8px\" barWidth: \"64px\" masthead: position: \"absolute\" placement: \"top: 56px, full-width between 80px side padding\" layout: \"flex space-between\" typography: \"{typography.labe", + "selector_or_token": "css.paragraph_spacing" + } + ], + "role_mapping.body": [ + { + "path": "beautiful-html-templates/templates/emerald-editorial/template.html", + "raw_value": "LXGW WenKai TC", + "selector_or_token": "role_mapping.body.source_font" + }, + { + "path": "beautiful-html-templates/templates/emerald-editorial/design.md", + "raw_value": "E9D6\" rule: \"rgba(15, 26, 92, 0.22)\" rule-strong: \"rgba(15, 26, 92, 0.85)\" typography: numeral-jumbo: fontFamily: \"'Bodoni Moda', serif\" fontSize: 460 fontWeight: 900 lineHeight: 0.9 letterSpacing: -0.04em display-section: fontFamily: \"'Bodoni Moda', serif\" fontS", + "selector_or_token": "design.typography.roles" + } + ], + "role_mapping.display": [ + { + "path": "beautiful-html-templates/templates/emerald-editorial/template.html", + "raw_value": "Bodoni Moda", + "selector_or_token": "role_mapping.display.source_font" + }, + { + "path": "beautiful-html-templates/templates/emerald-editorial/design.md", + "raw_value": "E9D6\" rule: \"rgba(15, 26, 92, 0.22)\" rule-strong: \"rgba(15, 26, 92, 0.85)\" typography: numeral-jumbo: fontFamily: \"'Bodoni Moda', serif\" fontSize: 460 fontWeight: 900 lineHeight: 0.9 letterSpacing: -0.04em display-section: fontFamily: \"'Bodoni Moda', serif\" fontS", + "selector_or_token": "design.typography.roles" + } + ], + "role_mapping.label": [ + { + "path": "beautiful-html-templates/templates/emerald-editorial/template.html", + "raw_value": "Bodoni Moda", + "selector_or_token": "role_mapping.label.source_font" + }, + { + "path": "beautiful-html-templates/templates/emerald-editorial/design.md", + "raw_value": "E9D6\" rule: \"rgba(15, 26, 92, 0.22)\" rule-strong: \"rgba(15, 26, 92, 0.85)\" typography: numeral-jumbo: fontFamily: \"'Bodoni Moda', serif\" fontSize: 460 fontWeight: 900 lineHeight: 0.9 letterSpacing: -0.04em display-section: fontFamily: \"'Bodoni Moda', serif\" fontS", + "selector_or_token": "design.typography.roles" + } + ], + "role_mapping.metric": [ + { + "path": "beautiful-html-templates/templates/emerald-editorial/template.html", + "raw_value": "Bodoni Moda", + "selector_or_token": "role_mapping.metric.source_font" + }, + { + "path": "beautiful-html-templates/templates/emerald-editorial/design.md", + "raw_value": "E9D6\" rule: \"rgba(15, 26, 92, 0.22)\" rule-strong: \"rgba(15, 26, 92, 0.85)\" typography: numeral-jumbo: fontFamily: \"'Bodoni Moda', serif\" fontSize: 460 fontWeight: 900 lineHeight: 0.9 letterSpacing: -0.04em display-section: fontFamily: \"'Bodoni Moda', serif\" fontS", + "selector_or_token": "design.typography.roles" + } + ], + "source_typography_tokens": [ + { + "path": "beautiful-html-templates/templates/emerald-editorial/template.html", + "raw_value": "0.42em; 26px; 76px; 184px; 68px; 28px; 200px; 64px; 460px; 128px; 24px; 130px; 84px; 44px; 104px; 30px; 900; 800; 600; 700; 500; 0.95; 1; 0.92; 0.9; 1.5; 0.96; 1.05; 1.45; 1.0; 1.35; 1.4; 1.1; 0` — or a tiny positive `0.02em` if the headline feels visually packed. - **Never `text-transform: uppercase` on CJK text.** Chinese has no case; -0.005em; 0.04em; 0.02em; 0.05em; -0.01em; 0.18em; -0.015em; 0.1em; 0.08em; -0.04em; 0.16em; 0.14em; 0.06em; 0.12em; -0.02em; uppercase` on CJK text.** Chinese h", + "selector_or_token": "css.source_typography_tokens" + } + ], + "text_direction": [ + { + "path": "beautiful-html-templates/templates/emerald-editorial/template.html", + "raw_value": "column", + "selector_or_token": "css.text_direction" + } + ], + "text_transform_policy": [ + { + "path": "beautiful-html-templates/templates/emerald-editorial/template.html", + "raw_value": "uppercase` on CJK text.** Chinese has no case; uppercase`.) - **Use Chinese full-width punctuation** (`,。:;!?「」『』()`) inside Chinese sentences, not the Latin equivalents (`,.:; uppercase` rule on CJK runs and let the geometric humanist quality of Noto Sans SC carry the chrome feel through weight and tracking alone. ### Known CJK Gap The system's commitment to Bodoni Moda weight 900 at 460px (jumbo numerals on inverse navy panels) is the hardest to translate — there is no Chinese face on the Goog", + "selector_or_token": "css.text_transform_policy" + } + ], + "wrapping_policy": [ + { + "path": "beautiful-html-templates/templates/emerald-editorial/template.html", + "raw_value": "20px; height: 1080px; background: var(--bg); color: var(--ink); font-family: 'Manrope', sans-serif; overflow: hidden; position: relative; box-sizing: border-box; } /* Bold display serif — Bodoni Moda heavy */ .display { font-family: var(--display-font); fon", + "selector_or_token": "template.css.typography" + } + ] + }, "source_typography_tokens": { "font_families": [ "Bodoni Moda", @@ -11986,18 +13051,6 @@ "500", "600" ], - "line_height": [ - "0.9", - "0.92", - "0.96", - "0.95", - "1", - "1.05", - "1.5", - "1.45", - "1.0", - "1.35" - ], "letter_spacing": [ "-0.04em", "-0.015em", @@ -12010,13 +13063,18 @@ "0.05em", "0.12em" ], - "text_transform": [ - "uppercase", - "uppercase` on CJK text.** Chinese has no case", - "uppercase`.)", - "uppercase` rule on CJK runs and let the geometric humanist quality of Noto Sans SC carry the chrome feel through weight and tracking alone." + "line_height": [ + "0.9", + "0.92", + "0.96", + "0.95", + "1", + "1.05", + "1.5", + "1.45", + "1.0", + "1.35" ], - "word_spacing": [], "paragraph_spacing": [ "-2px", "30px", @@ -12041,536 +13099,47 @@ "36px", "28px" ], + "text_decoration": [], "text_direction": [ "column" ], - "writing_mode": [], - "text_decoration": [] + "text_transform": [ + "uppercase", + "uppercase` on CJK text.** Chinese has no case", + "uppercase`.)", + "uppercase` rule on CJK runs and let the geometric humanist quality of Noto Sans SC carry the chrome feel through weight and tracking alone." + ], + "word_spacing": [], + "writing_mode": [] }, - "role_mapping": { - "display": { - "font_role": "display", - "source_font": "Bodoni Moda", - "runtime_alias": "SVGlideDisplay", - "font_size": 88, - "font_weight": 900, - "line_height": 0.9, - "letter_spacing": 0, - "text_transform": "latin_uppercase_only", - "max_lines": 3, - "alignment": "source_layout_dependent" - }, - "body": { - "font_role": "body", - "source_font": "LXGW WenKai TC", - "runtime_alias": "SVGlideBody", - "font_size": 20, - "font_weight": 400, - "line_height": 1.32, - "letter_spacing": 0, - "text_transform": "preserve_source_case", - "max_lines": 5, - "alignment": "source_layout_dependent" - }, - "label": { - "font_role": "label", - "source_font": "Bodoni Moda", - "runtime_alias": "SVGlideLabel", - "font_size": 12, - "font_weight": 700, - "line_height": 1.05, - "letter_spacing": 0.08, - "text_transform": "latin_uppercase_labels_reset_cjk_spacing", - "max_lines": 1, - "alignment": "source_layout_dependent" - }, - "metric": { - "font_role": "metric", - "source_font": "Bodoni Moda", - "runtime_alias": "SVGlideMetric", - "font_size": 56, - "font_weight": 900, - "line_height": 0.95, - "letter_spacing": 0, - "text_transform": "preserve_numbers_and_units", - "max_lines": 2, - "alignment": "source_layout_dependent" - } - }, - "font_size_scale": { - "display": 88, - "body": 20, - "label": 12, - "metric": 56 - }, - "font_weight_scale": { - "display": 900, - "body": 400, - "label": 700, - "metric": 900 - }, - "line_height_scale": { - "display": 0.9, - "body": 1.32, - "label": 1.05, - "metric": 0.95 - }, - "letter_spacing_scale": { - "display": 0, - "body": 0, - "label": 0.08, - "metric": 0 + "text_direction": { + "cjk": "ltr", + "default": "column" }, "text_transform_policy": { - "display": "latin_uppercase_only", "body": "preserve_source_case", + "display": "latin_uppercase_only", "label": "latin_uppercase_labels_reset_cjk_spacing", "metric": "preserve_numbers_and_units" }, - "hierarchy_ratio": 4.4, - "max_lines": { - "display": 3, - "body": 5, - "label": 1, - "metric": 2 - }, - "measure": { - "display": "0.55-0.78 canvas width", - "body": "40-70 characters or CJK equivalent", - "label": "short mono labels", - "metric": "short numeric/stat blocks" - }, - "alignment": { - "primary": "follow source composition", - "fallback": "left/top aligned unless source screenshot is centered" - }, - "cjk_typography_adjustment": { - "display_font_cn": "Noto Serif SC", - "body_font_cn": "Noto Sans SC", - "letter_spacing_policy": "reset_letter_spacing_for_cjk_keep_latin_labels", - "mixed_run_spacing": "pangu_spacing", - "italic_policy": "color_only_emphasis" - }, - "mapping_reason": "按源模板字号/字重/行高/字距/大小写规则抽象到 960x540 Slide 画布的四个文本角色。", "word_spacing": { - "display": 0, "body": 0, + "display": 0, "label": 0, "metric": 0 }, - "paragraph_spacing": { - "display_after": 0, - "body_after": 12, - "label_after": 0, - "metric_after": 0 - }, "wrapping_policy": { - "display": "manual_break_or_balance", "body": "wrap_with_measure", + "display": "manual_break_or_balance", "label": "no_wrap_preferred", "metric": "no_wrap_preferred" }, - "text_direction": { - "default": "column", - "cjk": "ltr" - }, "writing_mode": { "default": "horizontal-tb", "vertical_roles": [] - }, - "extraction_confidence": { - "role_mapping.body": "inferred_from_layout", - "role_mapping.display": "inferred_from_layout", - "font_size_scale": "css_extracted_from_template_html", - "max_lines": "inferred_from_layout", - "writing_mode": "absent_use_default", - "text_direction": "css_extracted_from_template_html", - "alignment": "inferred_from_layout", - "role_mapping.label": "inferred_from_layout", - "paragraph_spacing": "css_extracted_from_template_html", - "text_transform_policy": "css_extracted_from_template_html", - "line_height_scale": "css_extracted_from_template_html", - "wrapping_policy": "inferred_from_layout", - "font_weight_scale": "css_extracted_from_template_html", - "source_typography_tokens": "css_extracted_from_template_html", - "word_spacing": "absent_use_default", - "role_mapping.metric": "inferred_from_layout", - "cjk_typography_adjustment": "inferred_from_layout", - "hierarchy_ratio": "inferred_from_layout", - "measure": "inferred_from_layout", - "mapping_reason": "inferred_from_layout", - "letter_spacing_scale": "css_extracted_from_template_html" - }, - "source_refs": { - "role_mapping.body": [ - { - "path": "beautiful-html-templates/templates/emerald-editorial/template.html", - "selector_or_token": "role_mapping.body.source_font", - "raw_value": "LXGW WenKai TC" - }, - { - "path": "beautiful-html-templates/templates/emerald-editorial/design.md", - "selector_or_token": "design.typography.roles", - "raw_value": "E9D6\" rule: \"rgba(15, 26, 92, 0.22)\" rule-strong: \"rgba(15, 26, 92, 0.85)\" typography: numeral-jumbo: fontFamily: \"'Bodoni Moda', serif\" fontSize: 460 fontWeight: 900 lineHeight: 0.9 letterSpacing: -0.04em display-section: fontFamily: \"'Bodoni Moda', serif\" fontS" - } - ], - "role_mapping.display": [ - { - "path": "beautiful-html-templates/templates/emerald-editorial/template.html", - "selector_or_token": "role_mapping.display.source_font", - "raw_value": "Bodoni Moda" - }, - { - "path": "beautiful-html-templates/templates/emerald-editorial/design.md", - "selector_or_token": "design.typography.roles", - "raw_value": "E9D6\" rule: \"rgba(15, 26, 92, 0.22)\" rule-strong: \"rgba(15, 26, 92, 0.85)\" typography: numeral-jumbo: fontFamily: \"'Bodoni Moda', serif\" fontSize: 460 fontWeight: 900 lineHeight: 0.9 letterSpacing: -0.04em display-section: fontFamily: \"'Bodoni Moda', serif\" fontS" - } - ], - "font_size_scale": [ - { - "path": "beautiful-html-templates/templates/emerald-editorial/template.html", - "selector_or_token": "css.font_size_scale", - "raw_value": "0.42em; 26px; 76px; 184px; 68px; 28px; 200px; 64px; 460px; 128px; 24px; 130px; 84px; 44px; 104px; 30px" - } - ], - "max_lines": [ - { - "path": "beautiful-html-templates/templates/emerald-editorial/template.html", - "selector_or_token": "template.css.typography", - "raw_value": "20px; height: 1080px; background: var(--bg); color: var(--ink); font-family: 'Manrope', sans-serif; overflow: hidden; position: relative; box-sizing: border-box; } /* Bold display serif — Bodoni Moda heavy */ .display { font-family: var(--display-font); fon" - } - ], - "text_direction": [ - { - "path": "beautiful-html-templates/templates/emerald-editorial/template.html", - "selector_or_token": "css.text_direction", - "raw_value": "column" - } - ], - "alignment": [ - { - "path": "beautiful-html-templates/templates/emerald-editorial/template.html", - "selector_or_token": "template.css.typography", - "raw_value": "20px; height: 1080px; background: var(--bg); color: var(--ink); font-family: 'Manrope', sans-serif; overflow: hidden; position: relative; box-sizing: border-box; } /* Bold display serif — Bodoni Moda heavy */ .display { font-family: var(--display-font); fon" - } - ], - "role_mapping.label": [ - { - "path": "beautiful-html-templates/templates/emerald-editorial/template.html", - "selector_or_token": "role_mapping.label.source_font", - "raw_value": "Bodoni Moda" - }, - { - "path": "beautiful-html-templates/templates/emerald-editorial/design.md", - "selector_or_token": "design.typography.roles", - "raw_value": "E9D6\" rule: \"rgba(15, 26, 92, 0.22)\" rule-strong: \"rgba(15, 26, 92, 0.85)\" typography: numeral-jumbo: fontFamily: \"'Bodoni Moda', serif\" fontSize: 460 fontWeight: 900 lineHeight: 0.9 letterSpacing: -0.04em display-section: fontFamily: \"'Bodoni Moda', serif\" fontS" - } - ], - "paragraph_spacing": [ - { - "path": "beautiful-html-templates/templates/emerald-editorial/template.html", - "selector_or_token": "css.paragraph_spacing", - "raw_value": "-2px; 30px; 18px; 24px; 14px; 10px; \"3px\" wordWeight: 800 wordFamily: \"'Bodoni Moda', serif\" ornament-vertical: description: \"An inline horizontal pair of stacked rules (each 4px tall, 8px apart) on either side of a small serif word. Used as a side bracket around connector words like prepositions.\" ruleHeight: \"4px\" ruleGap: \"8px\" barWidth: \"64px\" masthead: position: \"absolute\" placement: \"top: 56px, full-width between 80px side padding\" layout: \"flex space-between\" typography: \"{typography.labe" - } - ], - "text_transform_policy": [ - { - "path": "beautiful-html-templates/templates/emerald-editorial/template.html", - "selector_or_token": "css.text_transform_policy", - "raw_value": "uppercase` on CJK text.** Chinese has no case; uppercase`.) - **Use Chinese full-width punctuation** (`,。:;!?「」『』()`) inside Chinese sentences, not the Latin equivalents (`,.:; uppercase` rule on CJK runs and let the geometric humanist quality of Noto Sans SC carry the chrome feel through weight and tracking alone. ### Known CJK Gap The system's commitment to Bodoni Moda weight 900 at 460px (jumbo numerals on inverse navy panels) is the hardest to translate — there is no Chinese face on the Goog" - } - ], - "line_height_scale": [ - { - "path": "beautiful-html-templates/templates/emerald-editorial/template.html", - "selector_or_token": "css.line_height_scale", - "raw_value": "0.95; 1; 0.92; 0.9; 1.5; 0.96; 1.05; 1.45; 1.0; 1.35; 1.4; 1.1" - } - ], - "wrapping_policy": [ - { - "path": "beautiful-html-templates/templates/emerald-editorial/template.html", - "selector_or_token": "template.css.typography", - "raw_value": "20px; height: 1080px; background: var(--bg); color: var(--ink); font-family: 'Manrope', sans-serif; overflow: hidden; position: relative; box-sizing: border-box; } /* Bold display serif — Bodoni Moda heavy */ .display { font-family: var(--display-font); fon" - } - ], - "font_weight_scale": [ - { - "path": "beautiful-html-templates/templates/emerald-editorial/template.html", - "selector_or_token": "css.font_weight_scale", - "raw_value": "900; 800; 600; 700; 500" - } - ], - "source_typography_tokens": [ - { - "path": "beautiful-html-templates/templates/emerald-editorial/template.html", - "selector_or_token": "css.source_typography_tokens", - "raw_value": "0.42em; 26px; 76px; 184px; 68px; 28px; 200px; 64px; 460px; 128px; 24px; 130px; 84px; 44px; 104px; 30px; 900; 800; 600; 700; 500; 0.95; 1; 0.92; 0.9; 1.5; 0.96; 1.05; 1.45; 1.0; 1.35; 1.4; 1.1; 0` — or a tiny positive `0.02em` if the headline feels visually packed. - **Never `text-transform: uppercase` on CJK text.** Chinese has no case; -0.005em; 0.04em; 0.02em; 0.05em; -0.01em; 0.18em; -0.015em; 0.1em; 0.08em; -0.04em; 0.16em; 0.14em; 0.06em; 0.12em; -0.02em; uppercase` on CJK text.** Chinese h" - } - ], - "role_mapping.metric": [ - { - "path": "beautiful-html-templates/templates/emerald-editorial/template.html", - "selector_or_token": "role_mapping.metric.source_font", - "raw_value": "Bodoni Moda" - }, - { - "path": "beautiful-html-templates/templates/emerald-editorial/design.md", - "selector_or_token": "design.typography.roles", - "raw_value": "E9D6\" rule: \"rgba(15, 26, 92, 0.22)\" rule-strong: \"rgba(15, 26, 92, 0.85)\" typography: numeral-jumbo: fontFamily: \"'Bodoni Moda', serif\" fontSize: 460 fontWeight: 900 lineHeight: 0.9 letterSpacing: -0.04em display-section: fontFamily: \"'Bodoni Moda', serif\" fontS" - } - ], - "cjk_typography_adjustment": [ - { - "path": "beautiful-html-templates/templates/emerald-editorial/template.html", - "selector_or_token": "template.css.typography", - "raw_value": "20px; height: 1080px; background: var(--bg); color: var(--ink); font-family: 'Manrope', sans-serif; overflow: hidden; position: relative; box-sizing: border-box; } /* Bold display serif — Bodoni Moda heavy */ .display { font-family: var(--display-font); fon" - } - ], - "hierarchy_ratio": [ - { - "path": "beautiful-html-templates/templates/emerald-editorial/template.html", - "selector_or_token": "template.css.typography", - "raw_value": "20px; height: 1080px; background: var(--bg); color: var(--ink); font-family: 'Manrope', sans-serif; overflow: hidden; position: relative; box-sizing: border-box; } /* Bold display serif — Bodoni Moda heavy */ .display { font-family: var(--display-font); fon" - } - ], - "measure": [ - { - "path": "beautiful-html-templates/templates/emerald-editorial/template.html", - "selector_or_token": "template.css.typography", - "raw_value": "20px; height: 1080px; background: var(--bg); color: var(--ink); font-family: 'Manrope', sans-serif; overflow: hidden; position: relative; box-sizing: border-box; } /* Bold display serif — Bodoni Moda heavy */ .display { font-family: var(--display-font); fon" - } - ], - "mapping_reason": [ - { - "path": "beautiful-html-templates/templates/emerald-editorial/template.html", - "selector_or_token": "template.css.typography", - "raw_value": "20px; height: 1080px; background: var(--bg); color: var(--ink); font-family: 'Manrope', sans-serif; overflow: hidden; position: relative; box-sizing: border-box; } /* Bold display serif — Bodoni Moda heavy */ .display { font-family: var(--display-font); fon" - } - ], - "letter_spacing_scale": [ - { - "path": "beautiful-html-templates/templates/emerald-editorial/template.html", - "selector_or_token": "css.letter_spacing_scale", - "raw_value": "0` — or a tiny positive `0.02em` if the headline feels visually packed. - **Never `text-transform: uppercase` on CJK text.** Chinese has no case; -0.005em; 0.04em; 0.02em; 0.05em; -0.01em; 0.18em; -0.015em; 0.1em; 0.08em; -0.04em; 0.16em; 0.14em; 0.06em; 0.12em; -0.02em" - } - ] } }, - "text_style_strategy": { - "bold": { - "source_usage": "source uses heavy display/label weights", - "mapped_weight": { - "display": 900, - "label": 700, - "metric": 900 - }, - "allowed_roles": [ - "display", - "label", - "metric" - ] - }, - "italic": { - "source_usage": "source uses italic/font-style or italic-family tokens", - "mapped_style": "latin_only_when_source_requires_else_normal", - "fallback_when_unavailable": "use color_shift or weight_shift; do not fake CJK italic", - "loss_notes": "Satori/Slide may not provide exact Google italic face; record as visual approximation." - }, - "underline": { - "source_usage": "source uses underline/text-decoration or hairline emphasis", - "mapped_decoration": "native underline only for actual text-decoration source usage", - "fallback_shape": "1px-3px rule or border accent when underline font rendering is unavailable" - }, - "line_through": { - "source_usage": "not present in source; default no line-through", - "mapped_decoration": "none", - "fallback_shape": "none" - }, - "emphasis": { - "color_shift": "use source accent color roles only", - "font_family_switch": "only switch between mapped display/body/label/metric roles from this family", - "weight_shift": "increase one role step within font_weight_scale", - "style_shift": "italic only when source_usage requires and CJK fallback is safe" - }, - "text_decoration_policy": { - "underline": { - "style": "solid", - "color": "currentColor", - "thickness": "1px" - }, - "line_through": { - "style": "none", - "color": "currentColor", - "thickness": "0px" - } - }, - "forbidden": [ - "fake_cjk_italic", - "drop_source_text_transform", - "drop_source_letter_spacing_without_loss_note", - "use_cross_family_font_motif", - "remote_font_dependency_without_receipt" - ], - "extraction_confidence": { - "text_decoration_policy.line_through.color": "absent_use_default", - "text_decoration_policy.underline.color": "css_extracted_from_template_html", - "text_decoration_policy.line_through.style": "absent_use_default", - "italic": "css_extracted_from_template_html", - "forbidden": "inferred_from_layout", - "emphasis": "inferred_from_layout", - "text_decoration_policy.underline.thickness": "css_extracted_from_template_html", - "underline": "css_extracted_from_template_html", - "text_decoration_policy.line_through.thickness": "absent_use_default", - "line_through": "absent_use_default", - "text_decoration_policy.underline.style": "css_extracted_from_template_html", - "bold": "css_extracted_from_template_html" - }, - "source_refs": { - "text_decoration_policy.underline.color": [ - { - "path": "beautiful-html-templates/templates/emerald-editorial/template.html", - "selector_or_token": "css.text-decoration", - "raw_value": "ublished system — keep them out unless intentionally introducing a new pattern. Underline is not used. Emphasis is communicated through size, color inversion, and ornamentation. ## Layout ### Canvas System The system targets a fixed **1920×1080** canvas. Slides are `
` elemen" - } - ], - "italic": [ - { - "path": "beautiful-html-templates/templates/emerald-editorial/template.html", - "selector_or_token": "css.font-style", - "raw_value": "i never appears at body / label scale, Manrope never appears at display scale. Italics are loaded in the Bodoni font request but not used in the published system — keep them out unless intentionally introducing a new pattern. Underline is not used. Emphasis is communicated through size, color inver" - } - ], - "forbidden": [ - { - "path": "beautiful-html-templates/templates/emerald-editorial/template.html", - "selector_or_token": "template.css.typography", - "raw_value": "20px; height: 1080px; background: var(--bg); color: var(--ink); font-family: 'Manrope', sans-serif; overflow: hidden; position: relative; box-sizing: border-box; } /* Bold display serif — Bodoni Moda heavy */ .display { font-family: var(--display-font); fon" - } - ], - "emphasis": [ - { - "path": "beautiful-html-templates/templates/emerald-editorial/template.html", - "selector_or_token": "template.css.typography", - "raw_value": "20px; height: 1080px; background: var(--bg); color: var(--ink); font-family: 'Manrope', sans-serif; overflow: hidden; position: relative; box-sizing: border-box; } /* Bold display serif — Bodoni Moda heavy */ .display { font-family: var(--display-font); fon" - } - ], - "text_decoration_policy.underline.thickness": [ - { - "path": "beautiful-html-templates/templates/emerald-editorial/template.html", - "selector_or_token": "css.text-decoration", - "raw_value": "ublished system — keep them out unless intentionally introducing a new pattern. Underline is not used. Emphasis is communicated through size, color inversion, and ornamentation. ## Layout ### Canvas System The system targets a fixed **1920×1080** canvas. Slides are `
` elemen" - } - ], - "underline": [ - { - "path": "beautiful-html-templates/templates/emerald-editorial/template.html", - "selector_or_token": "css.text-decoration", - "raw_value": "ublished system — keep them out unless intentionally introducing a new pattern. Underline is not used. Emphasis is communicated through size, color inversion, and ornamentation. ## Layout ### Canvas System The system targets a fixed **1920×1080** canvas. Slides are `
` elemen" - } - ], - "text_decoration_policy.underline.style": [ - { - "path": "beautiful-html-templates/templates/emerald-editorial/template.html", - "selector_or_token": "css.text-decoration", - "raw_value": "ublished system — keep them out unless intentionally introducing a new pattern. Underline is not used. Emphasis is communicated through size, color inversion, and ornamentation. ## Layout ### Canvas System The system targets a fixed **1920×1080** canvas. Slides are `
` elemen" - } - ], - "bold": [ - { - "path": "beautiful-html-templates/templates/emerald-editorial/template.html", - "selector_or_token": "css.font-weight", - "raw_value": "900; 800; 600; 700; 500" - } - ] - } - }, - "satori": { - "font_and_typography_constraints": [ - "italic is source-aware but CJK fake italic is forbidden; use color/weight fallback when unavailable", - "letter spacing is preserved for Latin labels and reset/softened for CJK" - ] - }, - "loss_notes": [ - "italic is source-aware but CJK fake italic is forbidden; use color/weight fallback when unavailable", - "letter spacing is preserved for Latin labels and reset/softened for CJK" - ], - "page_variant_count": 8, - "source_page_variants": [ - "s1", - "s2", - "s3", - "s4", - "s5", - "s6", - "s7", - "s8" - ], - "page_family_source": { - "extractor": "skills/lark-slides/scripts/beautiful_template_page_family_extract.py", - "source_template_html": "beautiful-html-templates/templates/emerald-editorial/template.html", - "source_design_md": "beautiful-html-templates/templates/emerald-editorial/design.md", - "source_template_json": "beautiful-html-templates/templates/emerald-editorial/template.json", - "claim_boundary": "source extraction only; does not imply renderer, fidelity, quality gate, or production/default selectable status" - } - }, - { - "family_id": "grove", - "template_id": "grove-organic-brief", - "runtime_template_id": "grove-organic-brief", - "source_template_html": "beautiful-html-templates/templates/grove/template.html", - "source_design_md": "beautiful-html-templates/templates/grove/design.md", - "source_template_json": "beautiful-html-templates/templates/grove/template.json", - "renderer_id": "artboard_satori.grove-organic-brief", - "renderer_module": "skills/lark-slides/scripts/artboard_renderer/templates/beautiful/grove-organic-brief.mjs", - "golden_spec": "skills/lark-slides/scripts/fixtures/svglide_artboard/golden/grove-organic-brief.canvas-spec.json", - "reference_screenshot": "beautiful-html-templates/screenshots/grove-1.png", - "fidelity_receipt": "skills/lark-slides/references/receipts/template-fidelity/grove.grove-organic-brief.json", - "source_trace": [ - { - "source": "beautiful-html-templates/templates/grove/template.html", - "evidence": "source_template_html" - }, - { - "source": "beautiful-html-templates/templates/grove/design.md", - "evidence": "source_design_md" - }, - { - "source": "beautiful-html-templates/templates/grove/template.json", - "evidence": "source_template_json" - }, - { - "source": "beautiful-html-templates/screenshots/grove-1.png", - "evidence": "reference_screenshot" - }, - { - "source": "skills/lark-slides/references/absorptions/beautiful-html-templates/grove.grove-organic-brief.json", - "evidence": "absorption_record" - } - ], "visual_contract": { - "path": "skills/lark-slides/references/visual-contracts/beautiful/grove.grove-organic-brief.json", - "layout_rhythm": "grove: medium density, medium-high formality. Forest-green canvas with cream type, classical Playfair serifs, and a single rust accent.", - "motifs": [ - "grid", - "accent line", - "card panels", - "paper texture", - "window chrome", - "poster blocks", - "quote mark" - ], - "palette_roles": [ - "accent", - "background", - "border", - "muted", - "negative", - "positive", - "primary", - "surface", - "text" - ], "do_not_simplify": [ "preserve_fonts_palette_grid_slide_classes_decorative_elements", "do_not_recolor_without_explicit_brand_override", @@ -12586,41 +13155,51 @@ "do_not_mark_production_without_renderer_golden_fidelity_receipt", "do_not_strip_identity_decorations", "do_not_recolor_without_explicit_brand_override" - ] + ], + "layout_rhythm": "emerald-editorial: medium density, medium-high formality. A magazine-cover business deck: emerald + navy + paper, double-rule masthead ornaments, and a bold Bodoni-style display serif.", + "motifs": [ + "grid", + "accent line", + "card panels", + "paper texture", + "poster blocks", + "quote mark", + "sticker collage" + ], + "palette_roles": [ + "accent", + "background", + "border", + "muted", + "negative", + "positive", + "primary", + "surface", + "text" + ], + "path": "skills/lark-slides/references/visual-contracts/beautiful/emerald-editorial.emerald-editorial-cover.json" }, - "fidelity_gate": { - "status": "passed", - "score": 0.8025, - "threshold": 0.72, - "reference_screenshot": "/Users/bytedance/bd-projects/beautiful-html-templates/screenshots/grove-1.png", - "render_screenshot": "/Users/bytedance/bd-projects/workspaces/SVGlide/.worktrees/cli-svglide-svg-private/skills/lark-slides/scripts/fixtures/svglide_artboard/golden/grove-organic-brief.preview.png", - "receipt_path": "skills/lark-slides/references/receipts/template-fidelity/grove.grove-organic-brief.json", - "issues": [] - }, - "promotion_status": "needs_review", - "default_selectable": false, + "visual_contract_path": "skills/lark-slides/references/visual-contracts/beautiful/emerald-editorial.emerald-editorial-cover.json" + }, + { "blocking_issues": [ - "selector_gate_missing", - "quality_gate_integration_pending", + "selector_gate_pending", + "quality_gate_pending", "production_review_pending" ], - "visual_contract_path": "skills/lark-slides/references/visual-contracts/beautiful/grove.grove-organic-brief.json", - "planned_renderer_module": "skills/lark-slides/scripts/artboard_renderer/templates/beautiful/grove-organic-brief.mjs", - "planned_golden_spec": "skills/lark-slides/scripts/fixtures/svglide_artboard/golden/grove-organic-brief.canvas-spec.json", - "planned_fidelity_receipt": "skills/lark-slides/references/receipts/template-fidelity/grove.grove-organic-brief.json", + "default_selectable": false, + "family_id": "grove", + "fidelity_gate": { + "issues": [], + "receipt_path": "skills/lark-slides/references/receipts/template-fidelity/grove.grove-organic-brief.json", + "reference_screenshot": "/Users/bytedance/bd-projects/beautiful-html-templates/screenshots/grove-1.png", + "render_screenshot": "/Users/bytedance/bd-projects/workspaces/SVGlide/.worktrees/cli-svglide-svg-private/skills/lark-slides/scripts/fixtures/svglide_artboard/golden/grove-organic-brief.preview.png", + "score": 0.8025, + "status": "passed", + "threshold": 0.72 + }, + "fidelity_receipt": "skills/lark-slides/references/receipts/template-fidelity/grove.grove-organic-brief.json", "font_strategy": { - "source_fonts": [ - "Playfair Display", - "Jost", - "LXGW WenKai TC", - "JetBrains Mono", - "Noto Sans Mono CJK SC" - ], - "slide_native_preferred": [ - "system-serif-cjk", - "system-sans-cjk", - "system-mono" - ], "adobe_or_embedded_fallback": [ "Source Serif Pro", "Source Sans Pro", @@ -12630,59 +13209,17 @@ "思源等宽" ], "cjk_fallback": "Noto Serif SC", - "role_mapping": { - "display": { - "source_font": "Playfair Display", - "slide_font": "Source Serif Pro", - "runtime_alias": "SVGlideDisplay", - "cjk_font": "思源宋体", - "fallback_stack": [ - "system-serif-cjk", - "SVGlideDisplay" - ], - "source_only": false, - "requires_download": false, - "mapping_reason": "保留 Playfair Display 的语义角色,但运行时优先使用 Slide/系统可用的 Source Serif Pro 与 思源宋体。" - }, - "body": { - "source_font": "Jost", - "slide_font": "Source Sans Pro", - "runtime_alias": "SVGlideBody", - "cjk_font": "思源黑体", - "fallback_stack": [ - "system-sans-cjk", - "SVGlideBody" - ], - "source_only": false, - "requires_download": false, - "mapping_reason": "保留 Jost 的语义角色,但运行时优先使用 Slide/系统可用的 Source Sans Pro 与 思源黑体。" - }, - "label": { - "source_font": "JetBrains Mono", - "slide_font": "Source Code Pro", - "runtime_alias": "SVGlideLabel", - "cjk_font": "思源等宽", - "fallback_stack": [ - "system-mono", - "SVGlideLabel" - ], - "source_only": false, - "requires_download": false, - "mapping_reason": "保留 JetBrains Mono 的语义角色,但运行时优先使用 Slide/系统可用的 Source Code Pro 与 思源等宽。" - }, - "metric": { - "source_font": "JetBrains Mono", - "slide_font": "Source Code Pro", - "runtime_alias": "SVGlideMetric", - "cjk_font": "思源等宽", - "fallback_stack": [ - "system-mono", - "SVGlideMetric" - ], - "source_only": false, - "requires_download": false, - "mapping_reason": "保留 JetBrains Mono 的语义角色,但运行时优先使用 Slide/系统可用的 Source Code Pro 与 思源等宽。" - } + "extraction_confidence": { + "adobe_or_embedded_fallback": "inferred_from_layout", + "cjk_fallback": "inferred_from_layout", + "forbidden": "inferred_from_layout", + "mapping_reason": "inferred_from_layout", + "role_mapping.body": "inferred_from_layout", + "role_mapping.display": "inferred_from_layout", + "role_mapping.label": "inferred_from_layout", + "role_mapping.metric": "inferred_from_layout", + "slide_native_preferred": "inferred_from_layout", + "source_fonts": "css_extracted_from_template_html" }, "forbidden": [ "remote_font_runtime_dependency", @@ -12691,118 +13228,706 @@ "drop_cjk_fallback" ], "mapping_reason": "根据 design.md/template.html/template.json 中的 font-family 与 typography token 提取源字体;运行时按 Slide/系统/Adobe/思源可用字体降级。", + "role_mapping": { + "body": { + "cjk_font": "思源黑体", + "fallback_stack": [ + "system-sans-cjk", + "SVGlideBody" + ], + "mapping_reason": "保留 Jost 的语义角色,但运行时优先使用 Slide/系统可用的 Source Sans Pro 与 思源黑体。", + "requires_download": false, + "runtime_alias": "SVGlideBody", + "slide_font": "Source Sans Pro", + "source_font": "Jost", + "source_only": false + }, + "display": { + "cjk_font": "思源宋体", + "fallback_stack": [ + "system-serif-cjk", + "SVGlideDisplay" + ], + "mapping_reason": "保留 Playfair Display 的语义角色,但运行时优先使用 Slide/系统可用的 Source Serif Pro 与 思源宋体。", + "requires_download": false, + "runtime_alias": "SVGlideDisplay", + "slide_font": "Source Serif Pro", + "source_font": "Playfair Display", + "source_only": false + }, + "label": { + "cjk_font": "思源等宽", + "fallback_stack": [ + "system-mono", + "SVGlideLabel" + ], + "mapping_reason": "保留 JetBrains Mono 的语义角色,但运行时优先使用 Slide/系统可用的 Source Code Pro 与 思源等宽。", + "requires_download": false, + "runtime_alias": "SVGlideLabel", + "slide_font": "Source Code Pro", + "source_font": "JetBrains Mono", + "source_only": false + }, + "metric": { + "cjk_font": "思源等宽", + "fallback_stack": [ + "system-mono", + "SVGlideMetric" + ], + "mapping_reason": "保留 JetBrains Mono 的语义角色,但运行时优先使用 Slide/系统可用的 Source Code Pro 与 思源等宽。", + "requires_download": false, + "runtime_alias": "SVGlideMetric", + "slide_font": "Source Code Pro", + "source_font": "JetBrains Mono", + "source_only": false + } + }, + "slide_native_preferred": [ + "system-serif-cjk", + "system-sans-cjk", + "system-mono" + ], "source_evidence": [ "beautiful-html-templates/templates/grove/design.md", "beautiful-html-templates/templates/grove/template.html", "beautiful-html-templates/templates/grove/template.json", "beautiful-html-templates/screenshots/grove-1.png" ], - "extraction_confidence": { - "role_mapping.body": "inferred_from_layout", - "role_mapping.display": "inferred_from_layout", - "source_fonts": "css_extracted_from_template_html", - "adobe_or_embedded_fallback": "inferred_from_layout", - "cjk_fallback": "inferred_from_layout", - "role_mapping.metric": "inferred_from_layout", - "forbidden": "inferred_from_layout", - "slide_native_preferred": "inferred_from_layout", - "mapping_reason": "inferred_from_layout", - "role_mapping.label": "inferred_from_layout" - }, + "source_fonts": [ + "Playfair Display", + "Jost", + "LXGW WenKai TC", + "JetBrains Mono", + "Noto Sans Mono CJK SC" + ], "source_refs": { - "role_mapping.body": [ - { - "path": "beautiful-html-templates/templates/grove/template.html", - "selector_or_token": "role_mapping.body.source_font", - "raw_value": "Jost" - }, - { - "path": "beautiful-html-templates/templates/grove/design.md", - "selector_or_token": "design.typography.roles", - "raw_value": "92b1b with bg — the green is reused as both surface and primary text-on-light\" typography: display: fontFamily: \"'Playfair Display', 'Noto Serif SC', Georgia, serif\" fontSize: \"10vw\" fontWeight: 400 lineHeight: 1 letterSpacing: -0.01em h1: fontFamily: \"'Playfair Display'" - } - ], - "role_mapping.display": [ - { - "path": "beautiful-html-templates/templates/grove/template.html", - "selector_or_token": "role_mapping.display.source_font", - "raw_value": "Playfair Display" - }, - { - "path": "beautiful-html-templates/templates/grove/design.md", - "selector_or_token": "design.typography.roles", - "raw_value": "92b1b with bg — the green is reused as both surface and primary text-on-light\" typography: display: fontFamily: \"'Playfair Display', 'Noto Serif SC', Georgia, serif\" fontSize: \"10vw\" fontWeight: 400 lineHeight: 1 letterSpacing: -0.01em h1: fontFamily: \"'Playfair Display'" - } - ], - "source_fonts": [ - { - "path": "beautiful-html-templates/templates/grove/template.html", - "selector_or_token": "css.font-family", - "raw_value": "'Playfair Display', 'LXGW WenKai TC', 'Noto Serif SC', Georgia, serif; 'Jost', 'Noto Serif SC', system-ui, sans-serif; 'JetBrains Mono', 'Noto Sans Mono CJK SC', monospace; var(--f-display); var(--f-heading); var(--f-body); var(--f-mono)" - } - ], "adobe_or_embedded_fallback": [ { "path": "beautiful-html-templates/templates/grove/template.html", - "selector_or_token": "css.font-family", - "raw_value": "'Playfair Display', 'LXGW WenKai TC', 'Noto Serif SC', Georgia, serif; 'Jost', 'Noto Serif SC', system-ui, sans-serif; 'JetBrains Mono', 'Noto Sans Mono CJK SC', monospace; var(--f-display); var(--f-heading); var(--f-body); var(--f-mono)" + "raw_value": "'Playfair Display', 'LXGW WenKai TC', 'Noto Serif SC', Georgia, serif; 'Jost', 'Noto Serif SC', system-ui, sans-serif; 'JetBrains Mono', 'Noto Sans Mono CJK SC', monospace; var(--f-display); var(--f-heading); var(--f-body); var(--f-mono)", + "selector_or_token": "css.font-family" } ], "cjk_fallback": [ { "path": "beautiful-html-templates/templates/grove/template.html", - "selector_or_token": "css.font-family", - "raw_value": "'Playfair Display', 'LXGW WenKai TC', 'Noto Serif SC', Georgia, serif; 'Jost', 'Noto Serif SC', system-ui, sans-serif; 'JetBrains Mono', 'Noto Sans Mono CJK SC', monospace; var(--f-display); var(--f-heading); var(--f-body); var(--f-mono)" - } - ], - "role_mapping.metric": [ - { - "path": "beautiful-html-templates/templates/grove/template.html", - "selector_or_token": "role_mapping.metric.source_font", - "raw_value": "JetBrains Mono" - }, - { - "path": "beautiful-html-templates/templates/grove/design.md", - "selector_or_token": "design.typography.roles", - "raw_value": "92b1b with bg — the green is reused as both surface and primary text-on-light\" typography: display: fontFamily: \"'Playfair Display', 'Noto Serif SC', Georgia, serif\" fontSize: \"10vw\" fontWeight: 400 lineHeight: 1 letterSpacing: -0.01em h1: fontFamily: \"'Playfair Display'" + "raw_value": "'Playfair Display', 'LXGW WenKai TC', 'Noto Serif SC', Georgia, serif; 'Jost', 'Noto Serif SC', system-ui, sans-serif; 'JetBrains Mono', 'Noto Sans Mono CJK SC', monospace; var(--f-display); var(--f-heading); var(--f-body); var(--f-mono)", + "selector_or_token": "css.font-family" } ], "forbidden": [ { "path": "beautiful-html-templates/templates/grove/template.html", - "selector_or_token": "css.font-family", - "raw_value": "'Playfair Display', 'LXGW WenKai TC', 'Noto Serif SC', Georgia, serif; 'Jost', 'Noto Serif SC', system-ui, sans-serif; 'JetBrains Mono', 'Noto Sans Mono CJK SC', monospace; var(--f-display); var(--f-heading); var(--f-body); var(--f-mono)" - } - ], - "slide_native_preferred": [ - { - "path": "beautiful-html-templates/templates/grove/template.html", - "selector_or_token": "css.font-family", - "raw_value": "'Playfair Display', 'LXGW WenKai TC', 'Noto Serif SC', Georgia, serif; 'Jost', 'Noto Serif SC', system-ui, sans-serif; 'JetBrains Mono', 'Noto Sans Mono CJK SC', monospace; var(--f-display); var(--f-heading); var(--f-body); var(--f-mono)" + "raw_value": "'Playfair Display', 'LXGW WenKai TC', 'Noto Serif SC', Georgia, serif; 'Jost', 'Noto Serif SC', system-ui, sans-serif; 'JetBrains Mono', 'Noto Sans Mono CJK SC', monospace; var(--f-display); var(--f-heading); var(--f-body); var(--f-mono)", + "selector_or_token": "css.font-family" } ], "mapping_reason": [ { "path": "beautiful-html-templates/templates/grove/template.html", - "selector_or_token": "css.font-family", - "raw_value": "'Playfair Display', 'LXGW WenKai TC', 'Noto Serif SC', Georgia, serif; 'Jost', 'Noto Serif SC', system-ui, sans-serif; 'JetBrains Mono', 'Noto Sans Mono CJK SC', monospace; var(--f-display); var(--f-heading); var(--f-body); var(--f-mono)" + "raw_value": "'Playfair Display', 'LXGW WenKai TC', 'Noto Serif SC', Georgia, serif; 'Jost', 'Noto Serif SC', system-ui, sans-serif; 'JetBrains Mono', 'Noto Sans Mono CJK SC', monospace; var(--f-display); var(--f-heading); var(--f-body); var(--f-mono)", + "selector_or_token": "css.font-family" + } + ], + "role_mapping.body": [ + { + "path": "beautiful-html-templates/templates/grove/template.html", + "raw_value": "Jost", + "selector_or_token": "role_mapping.body.source_font" + }, + { + "path": "beautiful-html-templates/templates/grove/design.md", + "raw_value": "92b1b with bg — the green is reused as both surface and primary text-on-light\" typography: display: fontFamily: \"'Playfair Display', 'Noto Serif SC', Georgia, serif\" fontSize: \"10vw\" fontWeight: 400 lineHeight: 1 letterSpacing: -0.01em h1: fontFamily: \"'Playfair Display'", + "selector_or_token": "design.typography.roles" + } + ], + "role_mapping.display": [ + { + "path": "beautiful-html-templates/templates/grove/template.html", + "raw_value": "Playfair Display", + "selector_or_token": "role_mapping.display.source_font" + }, + { + "path": "beautiful-html-templates/templates/grove/design.md", + "raw_value": "92b1b with bg — the green is reused as both surface and primary text-on-light\" typography: display: fontFamily: \"'Playfair Display', 'Noto Serif SC', Georgia, serif\" fontSize: \"10vw\" fontWeight: 400 lineHeight: 1 letterSpacing: -0.01em h1: fontFamily: \"'Playfair Display'", + "selector_or_token": "design.typography.roles" } ], "role_mapping.label": [ { "path": "beautiful-html-templates/templates/grove/template.html", - "selector_or_token": "role_mapping.label.source_font", - "raw_value": "JetBrains Mono" + "raw_value": "JetBrains Mono", + "selector_or_token": "role_mapping.label.source_font" }, { "path": "beautiful-html-templates/templates/grove/design.md", - "selector_or_token": "design.typography.roles", - "raw_value": "92b1b with bg — the green is reused as both surface and primary text-on-light\" typography: display: fontFamily: \"'Playfair Display', 'Noto Serif SC', Georgia, serif\" fontSize: \"10vw\" fontWeight: 400 lineHeight: 1 letterSpacing: -0.01em h1: fontFamily: \"'Playfair Display'" + "raw_value": "92b1b with bg — the green is reused as both surface and primary text-on-light\" typography: display: fontFamily: \"'Playfair Display', 'Noto Serif SC', Georgia, serif\" fontSize: \"10vw\" fontWeight: 400 lineHeight: 1 letterSpacing: -0.01em h1: fontFamily: \"'Playfair Display'", + "selector_or_token": "design.typography.roles" + } + ], + "role_mapping.metric": [ + { + "path": "beautiful-html-templates/templates/grove/template.html", + "raw_value": "JetBrains Mono", + "selector_or_token": "role_mapping.metric.source_font" + }, + { + "path": "beautiful-html-templates/templates/grove/design.md", + "raw_value": "92b1b with bg — the green is reused as both surface and primary text-on-light\" typography: display: fontFamily: \"'Playfair Display', 'Noto Serif SC', Georgia, serif\" fontSize: \"10vw\" fontWeight: 400 lineHeight: 1 letterSpacing: -0.01em h1: fontFamily: \"'Playfair Display'", + "selector_or_token": "design.typography.roles" + } + ], + "slide_native_preferred": [ + { + "path": "beautiful-html-templates/templates/grove/template.html", + "raw_value": "'Playfair Display', 'LXGW WenKai TC', 'Noto Serif SC', Georgia, serif; 'Jost', 'Noto Serif SC', system-ui, sans-serif; 'JetBrains Mono', 'Noto Sans Mono CJK SC', monospace; var(--f-display); var(--f-heading); var(--f-body); var(--f-mono)", + "selector_or_token": "css.font-family" + } + ], + "source_fonts": [ + { + "path": "beautiful-html-templates/templates/grove/template.html", + "raw_value": "'Playfair Display', 'LXGW WenKai TC', 'Noto Serif SC', Georgia, serif; 'Jost', 'Noto Serif SC', system-ui, sans-serif; 'JetBrains Mono', 'Noto Sans Mono CJK SC', monospace; var(--f-display); var(--f-heading); var(--f-body); var(--f-mono)", + "selector_or_token": "css.font-family" } ] } }, + "golden_spec": "skills/lark-slides/scripts/fixtures/svglide_artboard/golden/grove-organic-brief.canvas-spec.json", + "implemented_page_variants": [ + "cover", + "chapter", + "statement", + "split", + "stats", + "list", + "quote", + "compare", + "chapter-9", + "statement-10", + "chart", + "end" + ], + "loss_notes": [ + "italic is source-aware but CJK fake italic is forbidden; use color/weight fallback when unavailable", + "letter spacing is preserved for Latin labels and reset/softened for CJK" + ], + "page_family_implementation_note": "Implements all 12 source slides from grove/template.html as explicit grove-organic-brief variants for review. This is page-family execution evidence only and does not promote the family.", + "page_family_smoke": { + "missing_required_roles": [], + "production_selectable": false, + "receipt_path": "skills/lark-slides/references/receipts/page-family-smoke/grove.grove-organic-brief.json", + "rendered_pages": 12, + "reuse_count": 0, + "selection_source": "explicit_fixture", + "status": "passed" + }, + "page_family_smoke_deck": "skills/lark-slides/references/page-family-smoke-decks/grove.json", + "page_family_smoke_receipt": "skills/lark-slides/references/receipts/page-family-smoke/grove.grove-organic-brief.json", + "page_family_source": { + "claim_boundary": "source extraction only; does not imply renderer, fidelity, quality gate, or production/default selectable status", + "extractor": "skills/lark-slides/scripts/beautiful_template_page_family_extract.py", + "source_design_md": "beautiful-html-templates/templates/grove/design.md", + "source_template_html": "beautiful-html-templates/templates/grove/template.html", + "source_template_json": "beautiful-html-templates/templates/grove/template.json" + }, + "page_variant_count": 12, + "page_variant_golden_specs": { + "chapter": "skills/lark-slides/scripts/fixtures/svglide_artboard/golden/grove.chapter.canvas-spec.json", + "chapter-9": "skills/lark-slides/scripts/fixtures/svglide_artboard/golden/grove.chapter-9.canvas-spec.json", + "chart": "skills/lark-slides/scripts/fixtures/svglide_artboard/golden/grove.chart.canvas-spec.json", + "compare": "skills/lark-slides/scripts/fixtures/svglide_artboard/golden/grove.compare.canvas-spec.json", + "cover": "skills/lark-slides/scripts/fixtures/svglide_artboard/golden/grove.cover.canvas-spec.json", + "end": "skills/lark-slides/scripts/fixtures/svglide_artboard/golden/grove.end.canvas-spec.json", + "list": "skills/lark-slides/scripts/fixtures/svglide_artboard/golden/grove.list.canvas-spec.json", + "quote": "skills/lark-slides/scripts/fixtures/svglide_artboard/golden/grove.quote.canvas-spec.json", + "split": "skills/lark-slides/scripts/fixtures/svglide_artboard/golden/grove.split.canvas-spec.json", + "statement": "skills/lark-slides/scripts/fixtures/svglide_artboard/golden/grove.statement.canvas-spec.json", + "statement-10": "skills/lark-slides/scripts/fixtures/svglide_artboard/golden/grove.statement-10.canvas-spec.json", + "stats": "skills/lark-slides/scripts/fixtures/svglide_artboard/golden/grove.stats.canvas-spec.json" + }, + "planned_fidelity_receipt": "skills/lark-slides/references/receipts/template-fidelity/grove.grove-organic-brief.json", + "planned_golden_spec": "skills/lark-slides/scripts/fixtures/svglide_artboard/golden/grove-organic-brief.canvas-spec.json", + "planned_renderer_module": "skills/lark-slides/scripts/artboard_renderer/templates/beautiful/grove-organic-brief.mjs", + "promotion_status": "needs_review", + "reference_screenshot": "beautiful-html-templates/screenshots/grove-1.png", + "renderer_id": "artboard_satori.grove-organic-brief", + "renderer_module": "skills/lark-slides/scripts/artboard_renderer/templates/beautiful/grove-organic-brief.mjs", + "renderer_stage": "page_family", + "runtime_template_id": "grove-organic-brief", + "satori": { + "font_and_typography_constraints": [ + "italic is source-aware but CJK fake italic is forbidden; use color/weight fallback when unavailable", + "letter spacing is preserved for Latin labels and reset/softened for CJK" + ] + }, + "selection_scope": "experimental", + "source_design_md": "beautiful-html-templates/templates/grove/design.md", + "source_page_variants": [ + "cover", + "chapter", + "statement", + "split", + "stats", + "list", + "quote", + "compare", + "chapter-9", + "statement-10", + "chart", + "end" + ], + "source_template_html": "beautiful-html-templates/templates/grove/template.html", + "source_template_json": "beautiful-html-templates/templates/grove/template.json", + "source_trace": [ + { + "evidence": "source_template_html", + "source": "beautiful-html-templates/templates/grove/template.html" + }, + { + "evidence": "source_design_md", + "source": "beautiful-html-templates/templates/grove/design.md" + }, + { + "evidence": "source_template_json", + "source": "beautiful-html-templates/templates/grove/template.json" + }, + { + "evidence": "reference_screenshot", + "source": "beautiful-html-templates/screenshots/grove-1.png" + }, + { + "evidence": "absorption_record", + "source": "skills/lark-slides/references/absorptions/beautiful-html-templates/grove.grove-organic-brief.json" + } + ], + "supported_page_variants": [ + "cover", + "chapter", + "statement", + "split", + "stats", + "list", + "quote", + "compare", + "chapter-9", + "statement-10", + "chart", + "end" + ], + "template_id": "grove-organic-brief", + "text_style_strategy": { + "bold": { + "allowed_roles": [ + "display", + "label", + "metric" + ], + "mapped_weight": { + "display": 400, + "label": 700, + "metric": 900 + }, + "source_usage": "source uses heavy display/label weights" + }, + "emphasis": { + "color_shift": "use source accent color roles only", + "font_family_switch": "only switch between mapped display/body/label/metric roles from this family", + "style_shift": "italic only when source_usage requires and CJK fallback is safe", + "weight_shift": "increase one role step within font_weight_scale" + }, + "extraction_confidence": { + "bold": "css_extracted_from_template_html", + "emphasis": "inferred_from_layout", + "forbidden": "inferred_from_layout", + "italic": "css_extracted_from_template_html", + "line_through": "absent_use_default", + "text_decoration_policy.line_through.color": "absent_use_default", + "text_decoration_policy.line_through.style": "absent_use_default", + "text_decoration_policy.line_through.thickness": "absent_use_default", + "text_decoration_policy.underline.color": "css_extracted_from_template_html", + "text_decoration_policy.underline.style": "css_extracted_from_template_html", + "text_decoration_policy.underline.thickness": "css_extracted_from_template_html", + "underline": "css_extracted_from_template_html" + }, + "forbidden": [ + "fake_cjk_italic", + "drop_source_text_transform", + "drop_source_letter_spacing_without_loss_note", + "use_cross_family_font_motif", + "remote_font_dependency_without_receipt" + ], + "italic": { + "fallback_when_unavailable": "use color_shift or weight_shift; do not fake CJK italic", + "loss_notes": "Satori/Slide may not provide exact Google italic face; record as visual approximation.", + "mapped_style": "latin_only_when_source_requires_else_normal", + "source_usage": "source uses italic/font-style or italic-family tokens" + }, + "line_through": { + "fallback_shape": "none", + "mapped_decoration": "none", + "source_usage": "not present in source; default no line-through" + }, + "source_refs": { + "bold": [ + { + "path": "beautiful-html-templates/templates/grove/template.html", + "raw_value": "400; 300", + "selector_or_token": "css.font-weight" + } + ], + "emphasis": [ + { + "path": "beautiful-html-templates/templates/grove/template.html", + "raw_value": "Playfair 400 — the Grove rule: never bold on serif */ .display { font-family: var(--f-display); font-size: var(--sz-display); font-weight: 400; line-height: 1; letter-spacing: -0.01em; } .h1 { font-family: var(--f-heading); f", + "selector_or_token": "template.css.typography" + } + ], + "forbidden": [ + { + "path": "beautiful-html-templates/templates/grove/template.html", + "raw_value": "Playfair 400 — the Grove rule: never bold on serif */ .display { font-family: var(--f-display); font-size: var(--sz-display); font-weight: 400; line-height: 1; letter-spacing: -0.01em; } .h1 { font-family: var(--f-heading); f", + "selector_or_token": "template.css.typography" + } + ], + "italic": [ + { + "path": "beautiful-html-templates/templates/grove/template.html", + "raw_value": "brand book. Playfair Display at weight 400 (never bold) carries every headline, italicized in terracotta coral for accent emphasis as the signature move. Jost weight 300 carries every paragraph as the \"good paper\" body face. JetBrains Mono at weight 300 holds labels, kickers, and the thin chrome bar", + "selector_or_token": "css.font-style" + } + ], + "text_decoration_policy.underline.color": [ + { + "path": "beautiful-html-templates/templates/grove/template.html", + "raw_value": "headlines (via ``) and the quote body. Italic body paragraphs are not used. Underline is not used. Emphasis in body text is communicated by the `.accent` color utility (changes color to coral), not by italic or bold. ## Layout ### Canvas System The system targets a fluid viewport — each `.slid", + "selector_or_token": "css.text-decoration" + } + ], + "text_decoration_policy.underline.style": [ + { + "path": "beautiful-html-templates/templates/grove/template.html", + "raw_value": "headlines (via ``) and the quote body. Italic body paragraphs are not used. Underline is not used. Emphasis in body text is communicated by the `.accent` color utility (changes color to coral), not by italic or bold. ## Layout ### Canvas System The system targets a fluid viewport — each `.slid", + "selector_or_token": "css.text-decoration" + } + ], + "text_decoration_policy.underline.thickness": [ + { + "path": "beautiful-html-templates/templates/grove/template.html", + "raw_value": "headlines (via ``) and the quote body. Italic body paragraphs are not used. Underline is not used. Emphasis in body text is communicated by the `.accent` color utility (changes color to coral), not by italic or bold. ## Layout ### Canvas System The system targets a fluid viewport — each `.slid", + "selector_or_token": "css.text-decoration" + } + ], + "underline": [ + { + "path": "beautiful-html-templates/templates/grove/template.html", + "raw_value": "headlines (via ``) and the quote body. Italic body paragraphs are not used. Underline is not used. Emphasis in body text is communicated by the `.accent` color utility (changes color to coral), not by italic or bold. ## Layout ### Canvas System The system targets a fluid viewport — each `.slid", + "selector_or_token": "css.text-decoration" + } + ] + }, + "text_decoration_policy": { + "line_through": { + "color": "currentColor", + "style": "none", + "thickness": "0px" + }, + "underline": { + "color": "currentColor", + "style": "solid", + "thickness": "1px" + } + }, + "underline": { + "fallback_shape": "1px-3px rule or border accent when underline font rendering is unavailable", + "mapped_decoration": "native underline only for actual text-decoration source usage", + "source_usage": "source uses underline/text-decoration or hairline emphasis" + } + }, "typography_strategy": { + "alignment": { + "fallback": "left/top aligned unless source screenshot is centered", + "primary": "follow source composition" + }, + "cjk_typography_adjustment": { + "body_font_cn": "Noto Sans SC", + "display_font_cn": "Noto Serif SC", + "italic_policy": "drop_italic", + "letter_spacing_policy": "reset_letter_spacing_for_cjk_keep_latin_labels", + "mixed_run_spacing": "pangu_spacing" + }, + "extraction_confidence": { + "alignment": "inferred_from_layout", + "cjk_typography_adjustment": "inferred_from_layout", + "font_size_scale": "css_extracted_from_template_html", + "font_weight_scale": "css_extracted_from_template_html", + "hierarchy_ratio": "inferred_from_layout", + "letter_spacing_scale": "css_extracted_from_template_html", + "line_height_scale": "css_extracted_from_template_html", + "mapping_reason": "inferred_from_layout", + "max_lines": "inferred_from_layout", + "measure": "inferred_from_layout", + "paragraph_spacing": "css_extracted_from_template_html", + "role_mapping.body": "inferred_from_layout", + "role_mapping.display": "inferred_from_layout", + "role_mapping.label": "inferred_from_layout", + "role_mapping.metric": "inferred_from_layout", + "source_typography_tokens": "css_extracted_from_template_html", + "text_direction": "css_extracted_from_template_html", + "text_transform_policy": "css_extracted_from_template_html", + "word_spacing": "absent_use_default", + "wrapping_policy": "inferred_from_layout", + "writing_mode": "absent_use_default" + }, + "font_size_scale": { + "body": 20, + "display": 54, + "label": 12, + "metric": 42 + }, + "font_weight_scale": { + "body": 400, + "display": 400, + "label": 700, + "metric": 900 + }, + "hierarchy_ratio": 2.7, + "letter_spacing_scale": { + "body": 0, + "display": 0, + "label": 0.08, + "metric": 0 + }, + "line_height_scale": { + "body": 1.32, + "display": 0.96, + "label": 1.05, + "metric": 0.95 + }, + "mapping_reason": "按源模板字号/字重/行高/字距/大小写规则抽象到 960x540 Slide 画布的四个文本角色。", + "max_lines": { + "body": 5, + "display": 3, + "label": 1, + "metric": 2 + }, + "measure": { + "body": "40-70 characters or CJK equivalent", + "display": "0.55-0.78 canvas width", + "label": "short mono labels", + "metric": "short numeric/stat blocks" + }, + "paragraph_spacing": { + "body_after": 12, + "display_after": 0, + "label_after": 0, + "metric_after": 0 + }, + "role_mapping": { + "body": { + "alignment": "source_layout_dependent", + "font_role": "body", + "font_size": 20, + "font_weight": 400, + "letter_spacing": 0, + "line_height": 1.32, + "max_lines": 5, + "runtime_alias": "SVGlideBody", + "source_font": "Jost", + "text_transform": "preserve_source_case" + }, + "display": { + "alignment": "source_layout_dependent", + "font_role": "display", + "font_size": 54, + "font_weight": 400, + "letter_spacing": 0, + "line_height": 0.96, + "max_lines": 3, + "runtime_alias": "SVGlideDisplay", + "source_font": "Playfair Display", + "text_transform": "latin_uppercase_only" + }, + "label": { + "alignment": "source_layout_dependent", + "font_role": "label", + "font_size": 12, + "font_weight": 700, + "letter_spacing": 0.08, + "line_height": 1.05, + "max_lines": 1, + "runtime_alias": "SVGlideLabel", + "source_font": "JetBrains Mono", + "text_transform": "latin_uppercase_labels_reset_cjk_spacing" + }, + "metric": { + "alignment": "source_layout_dependent", + "font_role": "metric", + "font_size": 42, + "font_weight": 900, + "letter_spacing": 0, + "line_height": 0.95, + "max_lines": 2, + "runtime_alias": "SVGlideMetric", + "source_font": "JetBrains Mono", + "text_transform": "preserve_numbers_and_units" + } + }, + "source_refs": { + "alignment": [ + { + "path": "beautiful-html-templates/templates/grove/template.html", + "raw_value": "Playfair 400 — the Grove rule: never bold on serif */ .display { font-family: var(--f-display); font-size: var(--sz-display); font-weight: 400; line-height: 1; letter-spacing: -0.01em; } .h1 { font-family: var(--f-heading); f", + "selector_or_token": "template.css.typography" + } + ], + "cjk_typography_adjustment": [ + { + "path": "beautiful-html-templates/templates/grove/template.html", + "raw_value": "Playfair 400 — the Grove rule: never bold on serif */ .display { font-family: var(--f-display); font-size: var(--sz-display); font-weight: 400; line-height: 1; letter-spacing: -0.01em; } .h1 { font-family: var(--f-heading); f", + "selector_or_token": "template.css.typography" + } + ], + "font_size_scale": [ + { + "path": "beautiful-html-templates/templates/grove/template.html", + "raw_value": "var(--sz-display); var(--sz-h1); var(--sz-h2); var(--sz-h3); var(--sz-lead); var(--sz-body); var(--sz-caption); var(--sz-label); 18vw; 4.5vw; min(4.5vw, 7.5vh, 88px); max(1.4vw, 17px); 8vw; 3.2vw; max(1.1vw, 13px)", + "selector_or_token": "css.font_size_scale" + } + ], + "font_weight_scale": [ + { + "path": "beautiful-html-templates/templates/grove/template.html", + "raw_value": "400; 300", + "selector_or_token": "css.font_weight_scale" + } + ], + "hierarchy_ratio": [ + { + "path": "beautiful-html-templates/templates/grove/template.html", + "raw_value": "Playfair 400 — the Grove rule: never bold on serif */ .display { font-family: var(--f-display); font-size: var(--sz-display); font-weight: 400; line-height: 1; letter-spacing: -0.01em; } .h1 { font-family: var(--f-heading); f", + "selector_or_token": "template.css.typography" + } + ], + "letter_spacing_scale": [ + { + "path": "beautiful-html-templates/templates/grove/template.html", + "raw_value": "0` — or a tiny positive `0.02em` if the headline feels visually packed. - **Never `text-transform: uppercase` on CJK text.** Chinese has no case; -0.01em; 0.12em; -0.03em; -0.02em; 0.1em; 0.14em; 0.2em; 0.16em; 0.06em; 0.08em; 0.08em\" data-anim=\"fade-in\" data-delay=\"3\" > Source: [Primary Research] · [Year] · N=[sample size] across [geographies]

05 / 12

An honest assessment of where the market is, and where the opportunity lies.

An honest assessment of where the market is, and where the opportunity lies.

4.7k
Units sold in the first 90 days of launch, across 12 countries.
4.7k
Units sold in the first 90 days of launch, across 12 countries.
3.2×
Longer lifespan than the leading competitor in independent studio tests.
#1
Top-rated [product category] by Studio Supply Journal for two consecutive years.
[Studio Name] · Product Brief Design Studio
\"
Good design is as little design as possible.
Dieter Rams Designer
Why It Matters 06
The Case

What a studio tool should do for the maker.

Four principles that informed every material and dimension decision in the [product category]'s design.

  • Disappear when in use so the work takes all the attention
  • Improve output quality through surface calibration, not just feel
  • Last long enough to become a trusted part of the studio environment
  • Be honest about what it is — no branding that competes with the work
[Studio Name] · Product Brief Design Studio
Before / After 07
The Old Way

Generic [product category] from a supply catalog.

Works until it does not. Warps in heat, discolors with use, and feels like an afterthought.

  • Slips on polished surfaces without a grip layer
  • Grooves deepen and skew precision over time
  • Replaced every six months on average
The New Way

[Product Name], purpose-built.

A surface that gets better with use. The material compresses and recovers, keeping edges clean.

  • Self-heals around use lines, keeping the surface flat
  • Grip base holds any workbench without adhesives
  • 3000-use tested lifespan — typically 2 to 3 years in daily use
[Studio Name] · Product Brief Design Studio
Performance 08

Lifespan by material category.

Units: months of daily studio use
6
PVC
11
Rubber
18
Glass
30
[Product]
22
Leather
Source: Independent Material Durability Study · [Studio] Lab 2025
[Studio Name] · Product Brief Design Studio
Ready to Build

Start with the right surface.

Order the [Product Name] at [studio-website.com] or find it at select independent supply stores worldwide.

Get in touch.
hello@[studio-website.com]
@[studio] on all platforms
Available in 40+ countries
[Studio Name] · 2026 [studio-website.com]