Claude-blog blog-chart
install
source · Clone the upstream repo
git clone https://github.com/AgriciDaniel/claude-blog
Claude Code · Install into ~/.claude/skills/
T=$(mktemp -d) && git clone --depth=1 https://github.com/AgriciDaniel/claude-blog "$T" && mkdir -p ~/.claude/skills && cp -r "$T/skills/blog-chart" ~/.claude/skills/agricidaniel-claude-blog-blog-chart && rm -rf "$T"
manifest:
skills/blog-chart/SKILL.mdsource content
Blog 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:
references/visual-media.md
Input Format
The writer or researcher passes a chart request:
Chart Request: - Type: horizontal bar - Title: "AI Citation Sources by Platform" - Data: ChatGPT 43.8%, Perplexity 6.6%, Google AI Overviews 2.2%, Reddit 7.15% - Source: Ahrefs, December 2025 - Platform: mdx (or html)
Chart Type Selection
Select based on the data pattern. Diversity is mandatory - never repeat a type within one post.
| 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="currentColor" opacity="0.45" Source text: fill="currentColor" opacity="0.35" Label text: fill="currentColor" opacity="0.8"
Color Palette
| Color | Hex | Use Case |
|---|---|---|
| Orange | | Primary / highest value |
| Sky Blue | | Secondary / comparison |
| Purple | | Tertiary / special category |
| Green | | Quaternary / positive indicator |
For text inside colored elements:
fill="white" with fontWeight="800".
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-label="Chart description with key data point" > <title>Chart Title</title> <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="currentColor" opacity="0.35"> 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-label="Chart description" > <title>Chart Title</title> <desc>Description for screen readers</desc> {/* Chart content */} <text x="280" y="372" textAnchor="middle" fontSize="10" fill="currentColor" opacity="0.35"> Source: Source Name (Year) </text> </svg>
JSX Attribute Conversion (Required for MDX)
| HTML | JSX |
|---|---|
| |
| |
| |
| |
| |
| |
| |
| |
| |
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:
(gap=8)chartHeight / dataCount - gap - 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:
with fill colorr="6" - 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
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-label="[description]"> <title>[Chart Title]</title> <desc>[Full description with data points for screen readers]</desc> <!-- chart content --> <text x="280" y="372" text-anchor="middle" font-size="10" fill="currentColor" opacity="0.35"> Source: [Source Name] ([Year]) </text> </svg> </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-label="[description]"> <title>[Chart Title]</title> <desc>[Full description]</desc> {/* chart content with camelCase attributes */} <text x="280" y="372" textAnchor="middle" fontSize="10" fill="currentColor" opacity="0.35"> Source: [Source Name] ([Year]) </text> </svg> </figure>
Quality Checklist (Verify Before Returning)
- No hardcoded text colors (all use
)currentColor - No white/light backgrounds (transparent or none)
- Source attribution text present at bottom
-
androle="img"
present onaria-label<svg> -
and<title>
present inside<desc><svg> - Chart type not already used in this post
- 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
(standard) or justified alternative0 0 560 380