Dashi PPT
Dashi PPT generates static HTML horizontal page-turning PPTs. When using this skill, first organize the user's natural language requirements into a JSON plan, then call the local project generator to output index.html and assets/.
Version
Current version: 0.4.14
Each time you complete a user request and are about to prepare the final reply, run:
node <skill-root>/scripts/check_latest_version.mjs
If the script produces output, append the output to the end of the final reply to remind the user to update; if the script produces no output or the check fails, remain silent and do not mention the version check.
Skill Directory
The current directory where SKILL.md is located is the Skill root directory, referred to below as <skill-root>.
Built-in generator directory:
<skill-root>/project
Render script:
- macOS / Linux:
<skill-root>/scripts/render_goal_deck.sh - Windows PowerShell:
<skill-root>/scripts/render_goal_deck.ps1
Version check script:
<skill-root>/scripts/check_latest_version.mjs
Generation Principles
This Skill generates 3 template options and 1 Agent-customized option for each logical page, outputting an HTML PPT that can be opened offline.
The first three template options use "lock the template, fill in the copy": retain the original visuals, structure, quantity, visibility, emphasis, color scheme, chart type, and image slots of the selected page components, and only replace the visible text content. Unless the user explicitly requests adjusting page properties, do not change any non-copy props. The fourth option is customized by the Agent within the current theme's visual language according to the content of this page, and is not a template candidate.
Acceptance of the result is the default process. After each generation, judge whether the final output meets the user's goal; by default, check the goal, content, structure, obvious visible issues, and delivery completeness, do not do screenshot-based aesthetic refinement, and do not repeatedly rework due to ordinary line breaks. Only when the user explicitly requests "visual refinement", "100% inspection", or "help me tune it until I'm satisfied" should it be expanded to visual QA.
Usage Rules
- Running the generator requires Node.js 20+ and npm; on first generation, the render script will install dependencies in the Skill's built-in
project/directory. On Windows userender_goal_deck.ps1(directly PowerShell, not via WSL/bash); on macOS / Linux userender_goal_deck.sh. - Style selection question: the user-visible reply must embed the Markdown image of
<skill-root>/assets/skill/theme-style-grid.png, first expanding the absolute path; this is a built-in style image for display in the reply and must not be written intogoal.jsonor any media field; list the currently selectable styles and a minimal "suitable for/audience", and do not mention the style image only in internal progress prompts. - Confirm two things before starting work: theme style, and whether images/videos are needed. If the user has not clearly expressed this and it is not an overall delegation, ask first and wait for the answer, and do not choose on their behalf; only in environments where asking is impossible (scripts/batch processing) should you choose yourself, and list the choices and reasons in the delivery notes.
- Delegation mode: only when the user clearly delegates the overall task ("you decide everything", "no need to ask, just start") should you choose the theme yourself, default to HTML, and by default not use image-gen, and explain the assumptions in the final notes. When the user only says the content/copy is "up to you" or "make it up", only make up the content; style, page count, media, etc. that have already been given must not be changed without authorization, and anything not given should be asked about first according to the previous item.
- For non-interactive/one-time execution (when follow-up questions are impossible): if no style is specified, choose an already-accepted theme according to the content topic; if there are no real materials and images cannot be generated, prefer media-free pages and do not call image-gen; explain all assumptions in the final notes.
- Deck language follows the user's communication language: for non-Chinese users, add at the top level of
goal.jsonthe"language": "en"All copy fields must be written in the target language; the page's built-in default Chinese copy (including decorative fields such as "Thanks for reading" on the ending page) must be overridden in every case, with no Chinese remaining. The editor interface language automatically follows the opener's system language and can be switched manually in the upper right corner; no handling is needed at generation time. - Delivery format: HTML by default; "generate PPT", "make a PPT", "create a PPT", and "produce ppt" indicate the PPT presentation form. Only when explicitly
PPTX、PowerPoint、可编辑 PPTX、导出 PPTX、PPT 格式or "the format/file type is PPT/PPTX" should a PPTX file be delivered. - PPTX files: still generate HTML first and start the local preview service, then call the local HTTP export service; in the end, provide only the PPTX file path or the download result.
- Currently available styles:
theme01Soft Neumorphism,theme02Neon Purple-Green Glow,theme03Light-Dark Code,theme04Glass Candy,theme05Spectrum Chart,theme06Dark Graph,theme07Cool White Research,theme08Black Gold Lab,theme09Deep Blue Magazine,theme10Golden Index,theme11High-Energy Growth,theme12Soundwave Neon. - Normal automatic selection does not choose
theme10; use it only when the user explicitly specifies it, or when the content is strongly related to finance/investment indices and inspect confirms it can be filled. <!-- theme-choice-hints:start -->theme01Soft Neumorphism | Suitable for: product introductions / corporate reports | Audience: startup teams / product managerstheme02Neon Purple-Green Glow | Suitable for: tech launches / AI, autonomous driving, and robotics themes | Audience: tech company founders / technical leadstheme03Light-Dark Code | Suitable for: technical solutions / developer conferences | Audience: engineers / technical managerstheme04Glass Candy | Suitable for: youth-oriented brands / consumer products | Audience: brand teams / designerstheme05Spectrum Chart | Suitable for: data reports / market analysis | Audience: data analysts / consulting advisorstheme06Dark Graph | Suitable for: high-density data display / strategic analysis | Audience: strategy teams / investorstheme07Cool White Research | Suitable for: research reports / white papers | Audience: research institutions / consulting teamstheme08Black Gold Lab | Suitable for: high-end launches / brand proposals | Audience: high-end brands / creative directorstheme09Deep Blue Magazine | Suitable for: brand stories / interviews | Audience: PR teams / media editorstheme10Golden Index | Suitable for: financial data / investment reports | Audience: investment institutions / financial analyststheme11High-Energy Growth | Suitable for: growth retrospectives / business plans | Audience: entrepreneurs / growth teamstheme12Soundwave Neon | Suitable for: music and entertainment / trend events | Audience: entertainment brands / event planners <!-- theme-choice-hints:end -->
- Do not use old tokens, old themes, old media slots, old style branches, or old entrance animation controls.
- For page selection, first use
npm --prefix <skill-root>/project run layout:query -- --theme <themePack> --role <role> --limit 8 --seed <randomSeed>:slide-<n>; the 3 template options for each logical page must be layouts with different structural fingerprints. The same seed and input must be stable, and do not always use only the first three items of an unshuffled list. Reuse across logical pages is allowed when candidates are scarce, with repetition reduced by the existing cross-page layout/combination/family soft penalties. When media slots are needed, add--needs-media、--planned-images <n>、--provided-images <n>or--image-gen. - If fields are unclear, objects/arrays/count, images/media: first run
npm --prefix <skill-root>/project run inspect:layout -- --compact <layout...>to inspect the 3 template options for that page; when writing props for a single layout, runprops:safe; for schema v2 structural projection goal, run goal spec validation, do not useprops:safe --writeto backfill props. - When piping the JSON of
layout:query/inspect:layoutto a program for parsing, switch tonode <skill-root>/project/scripts/layout-query.mjs/node <skill-root>/project/scripts/inspect-layout.mjs:npm runwill print a lifecycle banner before stdout, polluting the JSON. - Standard 3+1 deck: you must first write
output/<deck-name>/page-content-pack.jsonpage by page, each page using a stable id and the following complete PageContentPack structure; then runnpm --prefix <skill-root>/project run goal:scaffold -- --title <title> --goal <goal> --theme <themePack> --pages <n> --layout-variants 3 --content-plan output/<deck-name>/page-content-pack.json --seed <randomSeed> --chunk-size 5 --out output/<deck-name>/goal.json. The 3 template options of schema v2 and the v4 bespoke option must be generated from that content plan; when there is no--content-plan, do not use--layout-variants 3。{ "pages": [{ "id": "page-1", "presentation": { "pageIntent": "cover", "coreMessage": "本页唯一核心结论", "title": {"full": "完整标题", "short": "短标题"}, "summary": {"full": "完整摘要", "short": "短摘要"}, "items": [{"id": "fact-1", "label": "指标名称", "detail": {"full": "完整说明", "short": "短说明"}, "value": 42, "displayValue": "42", "unit": "%", "required": true, "priority": "high"}], "chartData": [{"id": "fact-1", "label": "指标名称", "value": 42, "displayValue": "42", "unit": "%"}], "media": [{"src": "assets/example.png", "kind": "image", "type": "image/png", "alt": "图片说明"}] } }] } - Copy length and array counts: prefer writing according to
fillPlan.text[].maxChars、fillPlan.arrays[].visibleCount、fillPlan.arrays[].nestedArrays;display/metricfields should only contain short words, short phrases, or numbers. - Html fields (such as
headlineHtml/quoteHtml) for copy should only use<br>for line breaks plus<b>/<em>for inline emphasis; free HTML such as<span>is forbidden; the<span class>in theme defaults depends on theme CSS and is only a placeholder, do not copy it.validate:goal-specwill block free HTML. - Visible array items must contain real copy; trailing items hidden by count/visibility control may keep the "Please enter text" placeholder.
- Element entrance animations use the native effects built into the page component.
- Page transition animations can be adjusted in the preview control panel.
- Decks delivered to users do not show style/theme switching options by default; style switching is kept only on internal debugging demo pages. When the user explicitly asks to keep theme switching, write
preview: {"themeSwitcher": true}at the top level of the goal. - Do not hand-write free HTML slides. Newly generated decks use
schemaVersion: 2; each logical page stores only one copy ofcontent, the first three items store only the structural goal and source binding of{kind:"template", layout, contentMap, projection}, and the fourth item stores the grid/type/style and source binding of{kind:"bespoke", adjustable:false, composition, contentMap, projection}; the goal does not persist template props or bespoke copy, metrics, lists, charts, media src/alt business copies. v4 does not writelayout、propsorcontrols. - For each theme, the first 5 pages
themeXX_page001tothemeXX_page005are all cover candidates. A deck can have only 1 logical cover page; in the standard PageContentPack 3+1,pageIntent=covershould preferentially use a cover candidate that can carry it; only when the first 5 pages can form 3 real templates with different structures should the cover layout be used for the whole page, otherwise the whole page falls back to a real body layout from page 6 onward; the same logical page is forbidden from mixing cover and body layouts. - The 3 template options for the same logical page must be structurally different; do not merely change the page number or mirror the same structure. Across logical pages, 3N layouts are not required to be absolutely unique; keep the scaffold's existing soft penalties for layout, composition, and family reuse.
- Decks delivered to users must not rely on page default copy. Unless the user explicitly wants the default demo, every page's business content must first be written into PageContentPack, not written directly into variant props/composition.
slide.content.presentationis the single source of business truth; templates generate props at runtime according tocontentMap + projection.structure, and bespoke according tocontentMap + itemBindings/chartBindings/mediaBindingsInstant injection composition. After modifying canonical content, all 4 schemes must be updated together.- v4 must independently analyze the user's goals, audience, narrative role of this page, key information, and current theme characteristics before designing; inherit theme colors, fonts, spacing, shapes, media, and chart language, use restricted
compositionelements, do not add new facts, do not write free HTML/JSX, and it is not a minor modification of the first three templates. When generation fails, still output a safekind:"bespoke"combination. - v4
compositionwritedesignIntent, theme background semantics, and 12×8 grid elements; element types only usetext/metric/list/quote/media/shape/chart. - The visible copy slots of each of the 3 template schemes must be bound to canonical content by
contentMaporprojection.structure; unused slots must be explicitly closed or emptied by the structural projection; omissions will deliver template demo copy. - Prefer writing only the copy fields exposed by
layout:query/inspect:layout. When a field is an object or array, fill the internal key according tofillPlanandpropShapes.copyKeyshas expanded nested paths (such ascopy.quote、items[].label), fill directly according to the listed paths. inspect:layoutmarkscontentLocked: truepage body text is fixed by the component and props cannot fill it: switch to a layout whose body text can be filled on another page, or use it only when the user accepts its default body text. Fill arrays with visible items according tofillPlan.arrays[].visibleCount;decorativeKeysis a decorative slot, do not fill it.- Do not modify page metadata, component source code, className, CSS, style fields, or default visual structure to complete content filling. schema v2 business content only writes PageContentPack; structural targets and binding are generated by scaffold.
- It is allowed to use top-level
textto override visible text slots, but only to replace text content. Do not start browser batch extraction of all page text slots in ordinary generation; only do runtime slot extraction when the user explicitly requests “thoroughly clear all template default copy/proofread visible copy page by page”. - It is forbidden to reuse old
output/. Each request must create a new output directory and a new JSON plan for this time. - The output directory is written in the current session working directory, do not write it into
goal.jsonor old HTML already in<skill-root>/project/output. - HTML delivery: for the user's preview address, provide only
http://127.0.0.1:<port>/(do not provide https or .local variants); local HTTP can export HTML/PDF/PPTX, local HTML orfile://cannot export editable PPTX. Do not returntheme-preview. When generating in an Agent APP with its own browser (such as Codex), remind the user to open that address in the system browser before exporting PDF/PPTX. - PPTX delivery: call
/api/export-editable-pptx; in the end provide only the PPTX file path or download result. - When there is no browser session, direct script invocation, or the preview export interface returns 403/5xx: switch to
npm run export:pptx -- <deck>/ppt <out.pptx>(for PDF useexport:pdf) to directly produce the file, without needing to start a browser session first. - If default copy unrelated to the user's theme appears in the output body text, such as AI Capital / investment and financing / SoundWave / sound waves / Key Metrics / Roadmap / End of Report, etc., you must rewrite the JSON and re-render; it cannot be delivered.
Media workflow
- Media fields only write the slots of
mediaSlots[].canPresetMedia: true, and write paths according to that slot'spresetProp/fieldPath;goal.jsononly references relative media paths within the deck, and must not reference temporary directories, external absolute paths,file://or a remote URL. - For visual asset tasks, first determine the intent: if there is no image but visual assets are needed, first ask whether to reserve image slots; if there are no real assets and images cannot be generated, prefer no-media pages. If the user provides an asset library/asset directory path, treat it as image intent: select at least 2 pages with media slots and fill in appropriate assets. If the asset path is inaccessible, switch to no-media pages and state this in the delivery notes; do not leave placeholder hint text inside the page. If the user agrees to use
--planned-images <n>/--needs-media, if the user provides assets use--provided-images <n>/--provided-media, when the user explicitly requests original visual images/generated images, in the Codex environment use image-gen to generate images and add--image-gen; if image generation is not explicitly requested, ask the user first.plannedImages/needsVisual/imageGenonly indicates page-selection intent; unless the user explicitly chooses to reserve empty slots, real media paths must be written before delivery, and empty media slots or fabricated paths must not be delivered. - For user local images/videos, first run
npm --prefix <skill-root>/project run media:stage -- <deck-output-dir-or-ppt-dir> <media-file...>, use the returnedrelativepath; AVIF will be converted to a browser-usable format. image-gen output is also first placed in the current deck directory. - After rendering, verify each image/video referenced by the goal:
ppt/<relative>exists and the HTML contains the filename; when missing, only supplement the finalppt/assetsand rerun validation. Each image/video asset may be used at most once; the 4 options on the same logical page share the same asset, counted as 1 logical use, and different logical pages must not repeatedly fill in the same asset. After assets are used up, leave media slots empty or switch to pages with no media slots. - When image-gen needs to generate 2 or more independent images, use multiple subagents to generate them in parallel; do not wait serially image by image; generate each image independently, and do not use one composite image/asset board and then split it. subagents are only used for image generation, not for topic selection, copywriting, page selection, or validation.
Workflow
- Refine the user goal:
title、goal、audience、owner, page count, content focus, and final deliverable format; at the same time form an acceptance checklist, recording the user's explicit requirements, confirmed options, and necessary assumptions. If the user does not specify the page count, default to about 10 pages, no fewer than 8 pages. - Confirm
themePack. If the user does not specify, ask about the style first; after the user selects, generaterandomSeed, for example<主题>-<日期>-<3位随机词>, ensuring random page selection is reproducible. - Determine image intent: if there is no image but visual assets are needed, first ask whether to reserve image slots; if the user provides local assets, first
media:stage; when image generation is explicit, use image-gen. - First, according to the above
{"pages":[...]}JSON skeleton and the per-page semantic brief, write the completeoutput/<deck-name>/page-content-pack.json, then pass that JSON and--seed <randomSeed>through--content-plantogoal:scaffold; do not take a separate handwritten 3+1 skeleton path. - Each page carries only one primary information role. Business values are written only once to PageContentPack; scaffold only stores the structural projection/source binding of the 3 templates and the structural composition/source binding of v4; do not manually copy props, copy, metrics, lists, charts, or media values.
- scaffold writes the schema v2 JSON into the current working directory's
output/<deck-name>/goal.json; each page containsselectedVariant: "v1"and exactly 3 template + 1 bespoke. Run goal spec validation before rendering; do not runprops:safe --writeon that structural projection goal, to avoid writing runtime props back into the storage model. - After filling in their own data on chart pages, the in-page insight/chart-reading/conclusion copy fields must be rewritten together based on the new data; do not keep default conclusions.
- Run the rendering script to output
output/<deck-name>/ppt/index.html; the script will use the Skill built-in generator, do not switch back to an external project directory. - After rendering, verify asset paths; when missing, supplement the final
ppt/assets。 - Confirm the script completes
validate:swissandvalidate:goal-copyvalidation. - The render script will start a local HTTP preview service and output
http://127.0.0.1:<port>/; when a port needs to be specified, setDASHI_PPT_PREVIEW_PORTbefore running the script (use ports in the 5200-5999 range; 4178/4300/4400 are reserved for users and unavailable). Only this preview service may be used; do not substitute static servers such aspython -m http.server、npx serve: static servers do not have export and autosave interfaces. Under the preview service, edits are automatically saved toindex.htmlitself;file://local files opened do not autosave and must be exported before delivery. - Perform acceptance on the final artifact: by default, comparison should output all 4N pages continuously by logical page, and selected-only should output N pages; check group by group that the 4 proposals have consistent content and different compositions, and confirm that v4 has no template property controls but can be selected, saved, and exported.
- When the status is "Needs revision", locate the nonconforming pages, modify the copy/data/media, and if necessary replace the layout or regenerate the corresponding pages; re-render, run all validations, and recheck.
- Run
node <skill-root>/scripts/check_latest_version.mjsfor a silent version check. - After acceptance passes, reply according to the delivery format: for HTML provide only
http://127.0.0.1:<port>/; for PPTX call/api/export-editable-pptxand then provide only the file path or download result.
Artifact Acceptance and Rework
Passing machine validation is only the technical baseline, not proof that the artifact meets the standard. Final acceptance is based on the user's original requirements, confirmed options, explicit assumptions, and the final rendered artifact:
- Goal consistency: the Deck answers the user's core question, and the focus, conclusions, and tone suit the target audience.
- Content coverage: the specified topic, required points, page count, style, language, media, and artifact format have all been implemented, with no off-topic content, missing items, or irrelevant template copy.
- Page-by-page check: every page serves the overall goal; titles, body text, data, charts, and insights are consistent with one another, with no duplication, gaps, blank pages, or obviously mismatched layouts.
- Narrative completeness: the opening, argument/development, and conclusion/action are in a clear order, with logical continuity between pages.
- Delivery completeness: the final file exists and can be opened, the page count and format are correct, the assets are usable, and the first and last pages are not blank.
When browser capability is available, the final round must open the preview page by page and check that content is visible, media works normally, and there is no obvious overflow, occlusion, or cropping; do not create a dedicated Chrome profile, and do not perform screenshot-based aesthetic polishing by default. In scripted/batch environments without browser capability, at least recheck goal.json, the validation results, and the output files, and do not claim that visual acceptance has been completed.
Acceptance statuses are only "Passed", "Needs revision", and "Blocked". If any nonconforming item is found, mark it "Needs revision": when copy, data, insight, or media is wrong, change the corresponding props; when the page information role or capacity does not match, re- layout:query and replace the layout; when content is missing, supplement it or regenerate the corresponding page. After correction, rerun everything from props:safe、validate:goal-spec, rendering, asset checking,validate:swiss、validate:goal-copy through artifact acceptance.
By default, at most 2 rounds of correction. Delivery may occur only after acceptance passes; if it still does not pass after two rounds, mark it "Blocked", explain the unmet items and blocking reasons, and do not describe it as a completed artifact.
Example commands (macOS / Linux):
<skill-root>/scripts/render_goal_deck.sh \
output/client-review/goal.json \
output/client-review/ppt/index.html
Windows PowerShell:
& "<skill-root>/scripts/render_goal_deck.ps1" `
"output/client-review/goal.json" `
"output/client-review/ppt/index.html"
JSON Structure
{
"schemaVersion": 2,
"title": "美国 AI 融资调研",
"goal": "面向投资团队汇报 2024-2026 年美国 AI 大额融资结构、资本流向和后续判断",
"audience": "投资团队 / 产业研究团队",
"owner": "研究团队",
"randomSeed": "ai-funding-20260609-a7k",
"pageCount": 1,
"themePack": "theme01",
"variantOutputMode": "comparison",
"slides": [
{
"id": "s1",
"content": {
"section": "融资调研",
"title": "美国 AI 融资调研",
"titleTop": "美国 AI",
"titleBottom": "融资调研",
"summary": "2024-2026 年大额融资结构、资本流向与后续判断",
"year": "2026",
"points": ["融资结构", "资本流向", "后续判断"]
},
"selectedVariant": "v1",
"variants": [
{"id": "v1", "kind": "template", "layout": "theme01_page001", "props": {}, "contentMap": {"kicker": "section", "titleTop": "titleTop", "titleBottom": "titleBottom", "lead": "summary"}},
{"id": "v2", "kind": "template", "layout": "theme01_page002", "props": {}, "contentMap": {"enKicker": "section", "titleTop": "titleTop", "titleBottom": "titleBottom", "subtitle": "summary"}},
{"id": "v3", "kind": "template", "layout": "theme01_page003", "props": {}, "contentMap": {"kicker": "section", "titleTop": "titleTop", "titleBottom": "titleBottom", "bigNumber": "year"}},
{
"id": "v4",
"kind": "bespoke",
"adjustable": false,
"composition": {
"designIntent": {
"objective": "快速建立调研范围",
"audience": "投资团队",
"narrativeRole": "封面定调",
"emphasis": "研究对象与决策价值",
"rationale": "用单一标题中心和三项范围提示缩短理解路径"
},
"background": "dark",
"elements": [
{"id": "title", "type": "text", "grid": {"column": 1, "row": 1, "width": 10, "height": 2}, "role": "title", "text": ""},
{"id": "scope", "type": "list", "grid": {"column": 1, "row": 4, "width": 7, "height": 3}, "items": []}
]
},
"contentMap": {"elements[0].text": "title", "elements[1].items": "points"}
}
]
}
]
}
If slides is empty,pageCount is only suitable for temporary draft previews. Before a newly generated deck is delivered to users, it must be finalized as schema v2's 3 template + 1 bespoke; old single-layout and old 3-candidate goal can still be read.
Page Roles
role Only used for draft page selection; the first three options in the final JSON must become concrete layout, and v4 must become a bespoke composition without layout. For role descriptions, see references/layout-roles.md; the actual template candidates are determined by the output of layout:query .
For single-layout drafts, cover can only be selected from the first 5 pages of the current theme; standard PageContentPack 3+1 selects a homogeneous template pool according to the actual candidate carrying rules above.image / media Candidates are based on actual mediaSlots, not page title keywords. Dynamic background pages may use ambient as ambience pages or section pages.
You can directly specify pages:
{"layout": "theme01_page030", "props": {"title": "典型案例"}}
Delivery capabilities
After generation, the preview page by default expands N logical pages into 4N option pages. The right-side panel can jump between the 4 pages in the same group or mark the final option; the first three template options can have props adjusted, and v4 is displayed as a fixed Agent custom option.variantOutputMode:"comparison" exports 4N pages,"selected-only" exports N pages. Pages delivered to users do not display page number indicators, page-turn guidance, dot navigation, or index hints at the bottom.
Page property contract
Normal generation should not read layout-manifest.json. First use the candidate summary output by layout:query . Only when a finer contract is needed, use npm --prefix <skill-root>/project run inspect:layout -- --compact <layout...> to view the page contract:
copyKeys: copy/data fields that can be safely rewritten.copyBudgets: copy length budget;display/metricthat are too long will be blocked by the goal spec.propShapes:copyKeys/ the internal shape of array fields; when writing object fields such ascopy、cells、items、rows, use only the keys listed here.fillPlan.arrays[].itemFields[].enum: this field is a structural enum and can only choose from the listed values, not free-form copy.mediaSlots: image/video write fields, count key, default count, and maximum count.countBindings: the binding between count parameters and array fields.fillPlanFor numeric fields, seenumericBoundsto fill in numbers:enforced:falseare hints and actual data may exceed them,enforced:truemust be obeyed,semantics:'normalized'fill in a 0-1 ratio; for fixed-length nested arrays, seefixedLength/fixedLengthsfill by index without trial and error.controlKeys: fields operable in the right-side panel, not a general content-filling checklist; use only when the user explicitly requests adjusting page properties. By default, only fillcopyKeys, visible arrays, and real media slots.
Validation
- Before rendering, you must run
validate:goal-spec. - After output, you must run
validate:swiss. - After output, you must run
validate:goal-copy. - After changing the display demo, run
npm run showcase:update。