---
name: oh-my-ppt-chart
description: Must be read before adding or modifying Oh My PPT slide charts. Defines chart-selection rules, product-safe Chart.js usage, canvas layout constraints, axis label rules, and retry fixes.
---
# Oh My PPT Chart
For deeper examples (chart selection, frame height guide, category axis patterns, layout integration tips), read `references/chart.md`.
## When to use
- Adding a chart to a new or existing slide
- Modifying chart type, data, or options
- Repairing a blank or broken chart canvas
## When not to use
- Pure visual micro-edits that don't change chart structure (e.g. adjusting a single color value). These still follow chart skill hard rules, but don't require reading the full reference.
- A page without a source-grounded quantitative relationship. Course maps, agendas, processes, equal-status topic groups, hierarchies, and qualitative comparisons are page-native diagrams, not Chart.js charts.
## 30-second decision checklist
Before deciding to write chart HTML, answer these in order:
1. **Chart gate**: does the source provide a real numeric, temporal, compositional, profile, or correlation relationship? If not, use a page-native diagram and stop.
2. **Visual question**: is the message comparison, trend, composition, profile, or correlation? Choose the chart form for that question; never create numbers or proportions just to use a chart.
3. **Content slot**: how much vertical space remains for the chart zone after title, outer padding, gaps, notes, and reserve?
4. **Support budget**: if metric cards, insight rails, legends, or footnotes share that zone, subtract their height first. Start with a small support set (often 0-2 items) around a main chart; add more when the reading path, hierarchy, and chart budget remain clear.
5. **Final chart height**: hero / standard / compact? Pick one final px height for the chart frame. The `h-[Npx]` class must equal this final number.
6. **Data semantics**: one value axis = one unit/meaning. Do not mix counts, percentages, money, or "new role" labels in one numeric dataset.
7. **Takeaway**: what should the audience conclude from the chart? Write one visible interpretation sentence or a compact annotation rail; the chart cannot be the whole argument by itself.
8. **Data shape**: labels + datasets. Are there enough data points for the chosen type?
9. **Script event**: DOMContentLoaded only — the runtime loads Chart.js before this event fires.
## Chart selection
Use Chart.js only for a real source-grounded relationship:
- **Category comparison or ranking**: use a bar chart; use horizontal bars for long labels.
- **Ordered time or continuous change**: use a line chart; use an area only when cumulative magnitude is the message.
- **Verified, mutually exclusive parts of one stated whole**: use a doughnut or pie with 4-6 slices. Values must add to the displayed total or 100%; a list of topics or an invented time split is not a whole.
- **Same-scale scores across shared dimensions**: use a radar chart sparingly; every axis must share a meaningful scale.
- **Two or three numeric variables**: use scatter or bubble for correlation/distribution.
- **No data chart**: use a page-native route, four-part map, process, hierarchy, relationship diagram, or comparison layout for agendas, course maps, stages, concepts, or unquantified topic groups.
## How to create a chart
Every chart needs exactly two parts: an HTML frame with explicit height, and a script block using DOMContentLoaded + PPT.createChart.
### 1. HTML — chart frame with explicit height
Before writing the chart frame, you MUST calculate the chart slot and then choose the actual chart frame height. Write the calculation as an HTML comment immediately before the chart frame, include the dedicated marker `@ppt-chart-height=N`, and make the marker, the **final chart height**, and the `h-[Npx]` value all use the same number. Never put `@ppt-chart-height=...` as visible text inside `.ppt-chart-frame`. Do NOT write a comment that ends with one number and a frame height that uses another number. Two terms: **content slot** = current canvas height − padding − title − gaps − reserve (the area for the chart plus its support modules); **chart slot** = content slot − support modules. The final `h-[Npx]` MUST equal the chart slot, never the content slot.
```html
```
The final number in the comment and `h-[Npx]` MUST match. If the comment ends with `chart height = 420`, the div MUST say `h-[420px]`; never write `chart height = 420` and then use `h-[240px]`.
Use this exact comment structure for generated charts:
```html
```
Calculation steps:
1. Start from the current canvas height stated by the layout/canvas prompt (runtime page root has no default padding)
2. Subtract outer padding (p-6=48, p-8=64)
3. Subtract all modules above the chart: title, subtitle, metrics row, legends
4. Subtract all gaps between modules
5. If chart is inside a card: subtract card padding and card title
6. Subtract a 24-40px safety reserve (use 40px on dense data slides)
7. This gives the **content slot** for the chart zone.
8. Subtract only sibling modules stacked above/below the chart inside the same column or vertical zone. Side-by-side modules in other columns share width, not height; do **not** divide the content slot by column count, and do not subtract a left metric rail from a right-column chart height.
9. Choose the chart frame height from the chart slot (do not stop short and leave an empty band):
- Hero/main chart (dominant zone): 380–560px only when the chart is the primary evidence
- Standard chart beside/under a compact support set: 280–360px, with an actual nonzero gap around independent support modules
- Compact supporting chart (one small module in a dense layout): 220–280px, with other modules kept concise
- If the computed chart slot is 600px+ and the chart is the primary evidence, use the top of the hero/main range (usually 520–560px). Do not calculate a 600+ slot and then choose 340px for the primary chart.
10. If the chart slot is below the space needed for its labels, axes, and intended reading distance (often around 220px on a 1600×900 canvas), redesign the chart/support relationship and run the layout width/height self-check again.
Column budget rule: columns share width, not height. If the page uses `grid-cols-2`, the chart column still receives the full post-title vertical content slot. A bad calc is `content slot = 732; left metrics = 732/2; right side = 366`; the correct calc is `right column content slot = 732`, then subtract only the right-column heading, insight card, gaps, padding, and reserve.
Avoid a two-row bottom card grid when it competes with a standard/tall chart. If the slide has 4-6 additional facts, choose in-chart annotations, an evidence rail, a compact table, a grouped list, or a compact aligned data mosaic with an explicit budget. A main chart usually starts with 0-2 support items; a larger set is valid when the chart remains dominant and the reading path stays clear.
Axis-heavy charts need extra space. For horizontal bars with 6+ categories, long labels, negative+positive ranges, or wide tick labels such as percentages, reserve 40-60px inside the chart options for the x-axis/tick area (`layout.padding.bottom`, tick padding, and a modest `maxTicksLimit`). If that would push support modules into a second row, redesign the support area as a side rail, annotation band, compact table, or in-chart callouts instead of shrinking the plot.
Only the `.ppt-chart-frame` owns chart size. The `