What Blog Chart does
The Blog Chart skill is designed to generate dark-mode-compatible inline SVG data visualization charts specifically for blog posts. It supports a variety of chart types including horizontal bar, grouped bar, donut, line, lollipop, area, and radar charts. This skill is particularly useful for writers and researchers who want to visually represent data in their content while ensuring accessibility and compatibility across different platforms such as HTML and JSX/MDX.
When a user requests a chart, the skill intelligently selects the appropriate chart type based on the data pattern, ensuring that the visual representation is both effective and comprehensible. The skill enforces guidelines for chart diversity and accessibility, incorporating features like accessible markup (role=img, aria-labelledby) and transparent backgrounds to enhance usability in both light and dark themes. This means that the charts not only look good but are also functional for all users, including those with visual impairments.
The skill is invoked internally by other blog-related commands, making it a seamless part of the content creation workflow. Users can generate charts by providing a structured input format that includes the type of chart, title, data, source attribution, and the desired platform. The output is a fully compliant SVG chart that adheres to specified styling rules, ensuring consistent and professional-looking visuals for any blog post.
Overall, Blog Chart is an essential tool for anyone involved in content creation who wishes to enhance their articles with informative and visually appealing data representations, all while maintaining accessibility standards.
When to use it
Use this skill when you need to create data visualizations for blog content that are compatible with both light and dark themes.
When not to use it
This skill is not suitable for standalone chart generation outside of the blog context, as it is designed to work in conjunction with other blogging tools.
What you can build with it
Visualizing Quarterly Data
Generate a horizontal bar chart to showcase quarterly signups by product, enhancing reader engagement.
Comparing Product Performance
Use a grouped bar chart to compare before and after metrics for different products in your blog.
Displaying Market Share
Create a donut chart to illustrate market share distribution among various competitors in your industry.
How to install Blog Chart
View source1. Install with the skills CLI
npx skills add agricidaniel/claude-blog/blog-chart --agent claude-code2. Or install it manually
Download the skill folder and drop it into ~/.claude/skills/ for all projects, or .claude/skills/ to scope it to one repo. Restart Claude Code so it picks up the new skill.
Anthropic's agentic coding CLI, and the reference implementation of Agent Skills. Drop a skill folder into ~/.claude/skills and Claude Code loads it automatically whenever a task matches the skill's description. Claude Code docs
Inside SKILL.md
Written by agricidanielBlog Chart: Built-In SVG Data Visualization
Generates dark-mode-compatible inline SVG charts for blog posts. Invoked
internally by blog-write and blog-rewrite when chart-worthy data is
identified. Not a standalone user-facing command.
Styling source of truth: skills/blog/references/visual-media.md
For supported chart types, prefer the deterministic CLI:
python3 skills/blog-chart/scripts/generate_chart_svg.py --input chart.json --output chart.html --json
Input Format
The writer or researcher passes a chart request:
Chart Request:
- Type: horizontal bar
- Title: "Quarterly Signups by Product"
- Data: Product A 420, Product B 315, Product C 180
- Source: [Verified source], [publication date]
- Platform: mdx (or html)
Chart Type Selection
Select based on the data pattern. Prefer chart type diversity, but repeat a type when comparability or reader comprehension clearly benefits.
| Data Pattern | Best Chart Type |
|---|---|
| Before/after comparison | Grouped bar chart |
| Ranked factors / correlations | Lollipop chart |
| Parts of whole / market share | Donut chart |
| Trend over time | Line chart |
| Percentage improvement | Horizontal bar chart |
| Distribution / range | Area chart |
| Multi-dimensional scoring | Radar chart |
Styling Rules (Non-Negotiable)
All charts must work on both dark and light backgrounds:
Text elements: fill="currentColor"
Grid lines: stroke="currentColor" opacity="0.08"
Axis lines: stroke="currentColor" opacity="0.3"
Background: transparent (no fill on root SVG)
Subtitle text: fill="var(--chart-muted, currentColor)"
Source text: fill="var(--chart-muted, currentColor)"
Label text: fill="currentColor" opacity="0.8"
Set --chart-muted to an accessible text token in the host theme. If no token
exists, use #4b5563 on light backgrounds and #d1d5db on dark backgrounds.
Do not rely on low-opacity source or subtitle text for visible attribution.
Color Palette
| Color | Hex | Use Case |
|---|---|---|
| Orange | #f97316 | Primary / highest value |
| Sky Blue | #38bdf8 | Secondary / comparison |
| Purple | #a78bfa | Tertiary / special category |
| Green | #22c55e | Quaternary / positive indicator |
For text inside approved colored elements: use fill="#111827" with
fontWeight="800". Only use white text after checking the contrast ratio is
at least 4.5:1 against that specific fill color.
Do not rely on color alone. Add direct labels, patterns, line dashes, marker shapes, or legend text so colorblind readers can distinguish series.
Standard SVG Shell (HTML)
<svg
viewBox="0 0 560 380"
style="max-width: 100%; height: auto; font-family: 'Inter', system-ui, sans-serif"
role="img"
aria-labelledby="chart-title chart-desc"
>
<title id="chart-title">Chart Title</title>
<desc id="chart-desc">Description for screen readers with all key data points and source</desc>
<!-- Chart content -->
<text x="280" y="372" text-anchor="middle" font-size="10" fill="var(--chart-muted, currentColor)">
Source: Source Name (Year)
</text>
</svg>
JSX/MDX Shell (camelCase attributes)
<svg
viewBox="0 0 560 380"
style={{maxWidth: '100%', height: 'auto', fontFamily: "'Inter', system-ui, sans-serif"}}
role="img"
aria-labelledby="chart-title chart-desc"
>
<title id="chart-title">Chart Title</title>
<desc id="chart-desc">Description for screen readers</desc>
{/* Chart content */}
<text x="280" y="372" textAnchor="middle" fontSize="10" fill="var(--chart-muted, currentColor)">
Source: Source Name (Year)
</text>
</svg>
JSX Attribute Conversion (Required for MDX)
| HTML | JSX |
|---|---|
stroke-width | strokeWidth |
stroke-dasharray | strokeDasharray |
stroke-linecap | strokeLinecap |
text-anchor | textAnchor |
font-size | fontSize |
font-weight | fontWeight |
font-family | fontFamily |
class | className |
style="..." | style={{...}} |
Chart Type Construction
Horizontal Bar Chart
Best for: percentage improvements, single-metric comparisons.
- Define chart area: x=80, y=40, width=440, height=280
- Calculate bar height:
chartHeight / dataCount - gap(gap=8) - Calculate bar width:
(value / maxValue) * chartWidth - Position bars:
y = chartY + index * (barHeight + gap) - Label on left (right-aligned at x=75): category name
- Value label at end of bar: percentage or number
- Source text at bottom center
Grouped Bar Chart
Best for: before/after, A vs B comparisons.
- Define groups along Y axis, bars within each group
- Use 2 colors (primary + secondary) for the two series
- Add legend at top: colored square + label for each series
- Gap between groups > gap within groups
Donut Chart
Best for: parts of whole, market share.
- Center: cx=280, cy=180, outer radius=140, inner radius=80
- Calculate arc segments using cumulative angles
- Each segment:
<path d="M... A... L... A... Z" fill="color" /> - Center text: total or key label
- Legend below chart with color squares + labels + values
Line Chart
Best for: trends over time.
- X axis: time periods, evenly spaced
- Y axis: value range with 4-5 grid lines
- Draw grid lines:
stroke="currentColor" opacity="0.08" - Plot data points:
<circle cx=... cy=... r="4" fill="color" /> - Connect with:
<polyline points="..." fill="none" stroke="color" strokeWidth="2" /> - Optional: area fill below line with
opacity="0.1"
Lollipop Chart
Best for: ranked factors, correlations.
- Horizontal orientation (like bar chart but with circles)
- Thin line from axis to data point:
stroke="currentColor" opacity="0.15" strokeWidth="1" - Circle at data point:
r="6"with fill color - Value label next to circle
- Categories on Y axis (left-aligned)
Area Chart
Best for: distribution, cumulative data.
- Same as line chart but with filled area below
- Area fill:
<path d="M... L... L... Z" fill="color" opacity="0.15" /> - Line on top:
stroke="color" strokeWidth="2" fill="none" - Grid lines behind the area
Radar Chart
Best for: multi-dimensional scoring (5-7 axes).
- Center: cx=280, cy=190
- Draw concentric polygons for grid (3-4 levels)
- Calculate axis endpoints at equal angles
- Plot data points on each axis proportional to value
- Connect data points with filled polygon:
fill="color" opacity="0.2" stroke="color" - Label each axis at the outer edge
Label Rules
- Wrap long labels at word boundaries into
<tspan>lines. - Truncate only when wrapping would collide with data marks, and keep the full
label in
<desc>or adjacent prose. - Use stable chart dimensions with a responsive
max-width: 100%; height: autostyle, or choose a justified wider viewBox for dense labels. - Check mobile widths so axis labels, legends, and value labels do not overlap.
Output Format
Wrap every chart in a <figure> element:
HTML:
<figure>
<svg viewBox="0 0 560 380" style="max-width: 100%; height: auto; font-family: 'Inter', system-ui, sans-serif" role="img" aria-labelledby="chart-title chart-desc">
<title id="chart-title">[Chart Title]</title>
<desc id="chart-desc">[Full description with data points for screen readers]</desc>
<!-- chart content -->
<text x="280" y="372" text-anchor="middle" font-size="10" fill="var(--chart-muted, currentColor)">
Source: [Source Name] ([Year])
</text>
</svg>
<figcaption>Source: <a href="[Source URL]">[Source Name]</a>, [publication date].</figcaption>
</figure>
MDX:
<figure className="chart-container" style={{margin: '2.5rem 0', textAlign: 'center', padding: '1.5rem', borderRadius: '12px'}}>
<svg viewBox="0 0 560 380" style={{maxWidth: '100%', height: 'auto', fontFamily: "'Inter', system-ui, sans-serif"}} role="img" aria-labelledby="chart-title chart-desc">
<title id="chart-title">[Chart Title]</title>
<desc id="chart-desc">[Full description]</desc>
{/* chart content with camelCase attributes */}
<text x="280" y="372" textAnchor="middle" fontSize="10" fill="var(--chart-muted, currentColor)">
Source: [Source Name] ([Year])
</text>
</svg>
<figcaption>Source: <a href="[Source URL]">[Source Name]</a>, [publication date].</figcaption>
</figure>
Quality Checklist (Verify Before Returning)
- No hardcoded text colors except contrast-checked labels inside colored elements
- No white/light backgrounds (transparent or none)
- Source attribution text present at bottom and semantic
<figcaption>present -
role="img"andaria-labelledbypresent on<svg> -
<title id>and<desc id>present inside<svg> - Chart type choice supports comprehension and comparability
- If MDX: all attributes camelCased (no hyphens in attribute names)
- Data values match the source data exactly
- Color palette uses only approved colors
- ViewBox is
0 0 560 380(standard) or justified alternative - Labels, shapes, patterns, or line styles provide redundancy beyond color
Frequently asked questions about Blog Chart
Similar skills
Content Creator
Streamline your content creation with SEO and brand voice tools.
Content Production
Transform topics into polished, publish-ready content.
Content Creator
Streamline your content creation with brand voice and SEO tools.
Content Strategy
Plan impactful content that drives traffic and engagement.
Blog Post
Create structured long-form articles effortlessly.
Post to Weibo
Effortlessly publish to Weibo with Markdown support.

