agentsclimarketplace

En

Skill myunwang/ppt-report-skills/i18n/en

Report deck generator / data-report presentation builder — turns a data report into a 16:9 web-based slide deck (1600×900 design canvas, auto-scaled to the browser), playable fullscreen with one-click PDF export. Per-slide split source + physical data separation + switchable themes + ECharts charts. **Always use this skill** when the user asks to "make a monthly/quarterly report", "make a work-report deck", "turn data into a web/PDF presentation", or wants to reuse a "one file per slide, data stored separately, themes switchable" deck template. Even if the user never says "PPT" or "slides", any time the task is to turn "several datasets + conclusions" into a presentable/shareable web report, follow this skill's workflow.From its SKILL.md

Install
npx -y skills add myunwang/ppt-report-skills --skill en

Assembled from the repository path, not quoted from the project. Check it against their README if it does not work.

One thing to look at

  • runs commandsInstructs the agent to run 4 commands, including `python3 build.py` and 3 more.

SKILL.md

10.8 KB, ~2.6k tokens by cl100k_base, as published. Nobody here has run it

PPT Report Generator (web-based slide deck template)

Turn "several business datasets + interim conclusions" into a 16:9 web-based deck that plays fullscreen in a browser and exports to PDF with one click.

Core promises (design goals)

  1. One slide = three files: slides/slide-N.html + scripts/slide-N.js + styles/slide-N.css, bundled into a single HTML by build.py. Editing one slide touches only that slide — saves tokens, avoids conflicts.
  2. Data physically separated from rendering: all chart/table data lives in data/slide-N.{xlsx,csv,json}, auto-converted to JSON and injected at build time. Edit data in Excel day-to-day; rendering code stays untouched.
  3. Chart selection has rules: each data shape maps to one chart type (see references/chart-mapping.md) — don't pick charts on a whim. Default to ECharts.
  4. Information hierarchy has hard rules: label / title / subtitle (conclusion) / section title / card title / body / caption / helper text — 8 levels, each with fixed font size, weight, and color (see references/design-system.md).
  5. Switchable themes: 5 presets (modern-light / dark-tech / warm-business / brand-blue / minimal-mono), switched via the data-theme attribute (see references/themes.md).

When to use this skill

Trigger conditions (any one is enough):

  • The user says: "make a monthly/quarterly/project report", "make a work report", "make a data-report deck", "turn this data into a presentable web page"
  • The user provides raw data (xlsx / multiple tables / a written description of conclusions) and wants a "report" produced
  • The user already has a project with this structure (src/slides/, build.py, shell.html) and wants to add a slide or change the theme
  • The user wants to "save this deck so it can be reused next time"

Workflow (standard steps)

Step 1 — Understand input and output

  • Ask (if unknown): How many slides? What does each slide say? Where is the key data? Who is the target reader? Is PDF needed?
  • Don't start drawing charts. First list each slide's (label, title, subtitle/conclusion, body type) and confirm with the user.

Step 2 — Pick a template (per slide)

Open assets/slides-templates/ and pick a starting point by the slide's "body type":

Body typeTemplateUsage
Monthly delivery overview (multi-section × multi-card)kpi-overview.htmlSlide 1, summary-style page
Two subjects side by side (e.g. two countries)two-country.htmlKPI row + dual-card metric table
Three-phase loop + multiple chartsthree-phase.htmlTimeline + multiple chart-cards
Multi-subject time trendmulti-trend.html4-country / 4-channel line chart + milestone markers
Categorical bars + trend line combosupply-bars.htmlMaterial/category mini-bars + overall trend

Templates are skeletons — copy, then change copy, data, and IDs.

Special-graphic templates (currently Chinese-docs only). Four more templates ship in assets/slides-templates/ for harder page types — landscape-map.html (industry/competitor landscape, 3-tier), value-chain.html (value-flow horizontal axis for physical industries), matrix-2x2.html (McKinsey/BCG 2×2 strategic matrix), and human-portrait.html (data-driven human-silhouette persona: write a labels array, and scripts/silhouette.js's renderHumanPortrait() auto-draws the silhouette, body-part dots, and leader lines). Their design specs live in references/{landscape-skeleton,landscape-qa,matrix-2x2,svg-aesthetics,human-portrait}.md, which are not yet translated — read the root (Chinese) versions for now.

Step 3 — Put data into src/data/slide-N.{xlsx,csv,json}

This step matters most. Day-to-day, prefer Excel/CSV; build auto-converts to JSON and injects into window.__DATA_N__.

All three formats supported (priority .json > .xlsx > .csv; with the same name only one is used):

FormatUse caseConversion result
.xlsxRecommended for daily use — data is already in ExcelWith multiple sheets: each sheet name → one top-level JSON key
.csvSingle-table data, exported from somewhereWhole file → one top-level JSON array
.jsonMachine-generated / complex nested structureRead directly

Conventions (see the "Data format" section in references/architecture.md):

  • Row 1 of each sheet / csv is the header; each subsequent row → one object ([{col: val}, ...])
  • Sheet names / column names starting with _ are skipped (used for notes, helper calculations)
  • Numeric cells auto-convert to number; others stay string

xlsx example: src/data/slide-3.xlsx contains 2 sheets "kpis" and "trend" → accessed in JS as:

function initSlide3() {
  const D = window.__DATA_3__;
  // D.kpis  = [{label: 'DAU', value: 12.4, unit: '万'}, ...]
  // D.trend = [{week: 'W1', na: 12.1, eu: 8.4}, ...]
}

Updating data next time: just edit and save in Excel, rerun python3 build.py — rendering code stays completely untouched.

Standalone debugging: python3 xlsx2json.py src/data/slide-3.xlsx runs the conversion alone to inspect the JSON output.

Step 4 — Pick a chart (see references/chart-mapping.md)

Don't just pick the chart you feel like drawing. Look up the decision table by data shape:

  • Time series → line chart (with milestone vertical-line plugin)
  • Before/after of a comparison experiment → 100% stacked bars
  • Object ranking (Top 20) → horizontal mini-bars (custom div, no chart library)
  • Multi-subject single-period comparison → grouped bars
  • Share / composition → no pie chart; use 100% stacked bars or a treemap

Step 5 — Information hierarchy (see references/design-system.md)

Every piece of text must answer "which level am I?". The slide-label / slide-title / slide-subtitle trio is a mandatory top structure. Key numbers in the conclusion must be wrapped in <strong> or <span class="pos|neg|warn"> for highlight.

Step 6 — Build and preview

python3 build.py            # bundle the final HTML (output filename configurable in CONFIG at top of build.py)
open *.html                 # open in browser, ←/→ to navigate
python3 export_pdf.py       # (optional) export PDF

Step 7 — Theme switching (optional)

If the user wants a different style, don't rewrite the CSS. Just change the attribute on <body data-theme="dark-tech">. See references/themes.md.

Golden rules (violations get rejected in review)

  1. Don't hardcode data in rendering code. Data goes into data/slide-N.json or a top const variable; render functions only take parameters.
  2. Don't let one slide's HTML exceed 200 lines. If it does, split into sub-components or move to JS rendering.
  3. Don't pile on font sizes freely. Use only the 8 levels --fs-label / --fs-title / --fs-subtitle / --fs-h2 / --fs-h3 / --fs-body / --fs-caption / --fs-mini.
  4. Don't use a pie chart for 5+ share items. Use 100% stacked bars instead.
  5. Don't hardcode colors. Use theme variables like var(--accent), var(--accent2), so theme switching doesn't break.
  6. Every slide must have the slide-label, slide-title, slide-subtitle trio. The subtitle must be a one-sentence conclusion containing key numbers.
  7. The design canvas is fixed at 1600×900. Size every element in these pixels; browser auto-fit is handled by transform: scale(--fit). Don't use vw/vh.
  8. Don't manually edit the build output. Always edit src/, then run python3 build.py.
  9. Each slide answers one question and has one visual anchor. More than 12 body elements on a slide = split into two (see references/layout-principles.md sections 6/10).
  10. The whole deck needs rhythm. Don't make 6 straight high-density data slides; interleave low-density "overview/breather/closing" slides (see layout-principles.md section 11 "story curve").
  11. Card boundaries must be strictly aligned: same-row cards share a bottom edge, same-column cards share left/right edges. Use grid 1fr 1fr + children flex:1 1 0; min-height:0 + a flexible spacer (e.g. phase-arrow-v) to absorb differences — don't hardcode height (see layout-principles.md section 7b).

Detailed reference docs

Read in any order as needed:

Asset list

Everything under assets/ is a ready-to-copy production file:

  • shell.html — HTML skeleton (with {{STYLES}} {{SLIDES}} {{SCRIPTS}} placeholders)
  • build.py — bundle script (concatenates in slide-number order)
  • export_pdf.py — PDF export (playwright + img2pdf)
  • styles/common.css — global styles + 5 theme variables
  • styles/components.css — common components
  • scripts/common.js — adaptive fit, navigation, ECharts helper
  • scripts/theme-switcher.js — theme switching UI
  • data/slide-N.json — data samples
  • slides-templates/*.html — 5 page templates

Initializing a new project (recommended flow)

mkdir my-report && cd my-report
# 1. Copy the whole assets directory into the project as src/
cp -r <skill_path>/assets src
# 2. Copy build.py / export_pdf.py to the project root
cp <skill_path>/assets/build.py <skill_path>/assets/export_pdf.py .
# 3. Pick templates as needed, rename to slide-1.html / slide-2.html ...
# 4. Write data → edit copy → build → preview

What ships with it: 7 files

53.3 KB alongside SKILL.md

Keep looking

Skills are one crate of 325,949. Ordering is by how many stacks a row turns up in, so the top of any crate is what has actually been picked rather than what has the most stars.