Builds a self-contained HTML page (chart, table, diagram, dashboard) to show inline in a thread. Use before calling show_html_page, html_preview or html_render, or whenever an answer reads better as a page than as prose.
89%
Does it follow best practices?
Run evals on this skill
Adds up to 20 points to the overall score
Passed
No findings from the security scan
A page shown inline sits beside a reply, in the reader's theme, and is read in a few seconds. It earns its place only by being clearer than the paragraph it replaces. This skill owns what is particular to such a page. The data work belongs to data-scientist and the design work to frontend: load those skills for their parts instead of improvising them here.
Do these in order. Never show a page you have not looked at.
data-scientist. Compute every figure at its source, at the grain the reader needs: SQL in the database when the data lives in one, DuckDB or Polars over files, and only the aggregate the chart draws comes back. Follow its references/visualization.md for which chart answers which question, where a day starts, and the cross-check. Keep the query: every number on the page must trace back to it.frontend. Use it for hierarchy, type, spacing and states. frontend exempts an inline page from its DESIGN.md gate, Lighthouse audit and research lanes, and the constraints below replace them: the page brings no palette or fonts of its own and uses the theme the host injects.frontend. Give each role its own class name, prefixed or scoped under its chart's parent selector: a short global class such as .k that a KPI grid and a bar segment share styles both, and lifted every cache bar off its baseline in one shipped page.bun $SKILL_DIR/../frontend/scripts/perfection/check-draft-guard.ts <page file>, where $SKILL_DIR is this skill's own directory, the folder containing this SKILL.md (the script ships with frontend, next to this skill; write a page you built as a string to a file first). Exit 1 means a coloured edge bar, an accent outline, promotional filler copy, an emoji icon, a hype badge, or a hard-coded vanity stat is in the page: remove it and rerun. Nothing is previewed or shown until it exits 0.html_preview in dark and in light, at the reply's width and at 390 px: all four views every time, because a page checked in one theme or one width ships broken in another. In each view, measure two things on every chart: the largest bar's rendered height against value ÷ axis maximum × plot height, and each legend swatch's computed colour against its series' colour. Then check that the first and last axis labels are whole. The draft-guard lint cannot catch a misdrawn bar; only these measurements do. Read the screenshot and the console, fix what you see, and preview again. Where html_preview is not offered, open the page file in a browser through the browser skill and capture the same four views.show_html_page (OmO) or html_render (other hosts), with the height the preview measured. Then write only what the page does not already say.data: URIs); the sandbox blocks every request, so a CDN library leaves a blank chart. Draw with hand-written SVG when a library cannot be inlined.--background, --foreground, --muted, --muted-foreground, --card, --border, --primary, --accent, --destructive, --warning, --success, the series colors --chart-1 to --chart-6, and --font-sans, --font-mono, --radius. They hold in both themes and change live; a literal color does neither. A page opened outside the app gets only a few of them, so give each a fallback for both themes: var(--chart-2, light-dark(#0d9488, #2dd4bf)). light-dark() follows the theme only when the page declares :root { color-scheme: light dark; }; without it every fallback renders its light value in the dark theme.preserveAspectRatio="none", which stretches its text and strokes too. Put axis labels in HTML, positioned by percentage: centre the inner labels on their tick, but align the first label's left edge and the last label's right edge to the chart's edges, or both clip at 390 px.code-yeongyu/oh-my-openagent
687f5af
If you maintain this skill, you can claim it as your own. Once claimed, you can manage eval scenarios, bundle related skills, attach documentation or rules, and ensure cross-agent compatibility.