mcpbeat Sign in

Blog Chart Skill for Claude

> Generate dark-mode-compatible inline SVG data visualization charts for blog posts. Supports horizontal bar, grouped bar, donut, line, lollipop, area, and radar charts with automatic platform detection (HTML vs JSX/MDX). Enforces chart type diversity, accessible markup (role=img, aria-labelledby), source attribution, and transparent backgrounds. Use when user says "blog chart", "generate chart", "data visualization", "svg chart", "blog graph", or "visualize data".

9k tokens
context cost
the whole folder, loaded on every use
2
files
ships runnable scripts
0
copies elsewhere
how many repositories repackaged it
1556
stars on the repo
on the repository, not the skill itself

Install

one command, takes just this skill from the repository
npx skills add https://github.com/AgriciDaniel/claude-blog --skill blog-chart

The instruction itself

19 sections, as written by the author

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: 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: auto

style, 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" and aria-labelledby present 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

Other skills for the same job

different authors, same section of the catalogue
XLSX
by anthropics
vendor ×15

Comprehensive spreadsheet creation, editing, and analysis with support for formulas, formatting, data analysis, and visualization. When Claude needs to work with spreadsheets (.xlsx, .xlsm, .csv, .tsv, etc) for: (1) Creating new spreadsheets with formulas and formatting, (2) Reading or analyzing data, (3) Modify existing spreadsheets while preserving formulas, (4) Data analysis and visualization in spreadsheets, or (5) Recalculating formulas

5k tokens scripts
XLSX
by w95
×7

Use this skill any time a spreadsheet file is the primary input or output. This means any task where the user wants to: open, read, edit, or fix an existing .xlsx, .xlsm, .csv, or .tsv file (e.g., adding columns, computing formulas, formatting, charting, cleaning messy data); create a new spreadsheet from scratch or from other data sources; or convert between tabular file formats. Trigger especially when the user references a spreadsheet file by name or path — even casually (like \"the xlsx in my downloads\") — and wants something done to it or produced from it. Also trigger for cleaning or restructuring messy tabular data files (malformed rows, misplaced headers, junk data) into proper spreadsheets. The deliverable must be a spreadsheet file. Do NOT trigger when the primary deliverable is a Word document, HTML report, standalone Python script, database pipeline, or Google Sheets API integration, even if tabular data is involved.

3k tokens
Raffle Winner Picker
by frostant
×5

Picks random winners from lists, spreadsheets, or Google Sheets for giveaways, raffles, and contests. Ensures fair, unbiased selection with transparency.

949 tokens
Fda Database
by christophacham
×4

Query openFDA API for drugs, devices, adverse events, recalls, regulatory submissions (510k, PMA), substance identification (UNII), for FDA regulatory data analysis and safety research.

32k tokens scripts
Matlab
by christophacham
×4

MATLAB and GNU Octave numerical computing for matrix operations, data analysis, visualization, and scientific computing. Use when writing MATLAB/Octave scripts for linear algebra, signal processing, image processing, differential equations, optimization, statistics, or creating scientific visualizations. Also use when the user needs help with MATLAB syntax, functions, or wants to convert between MATLAB and Python code. Scripts can be executed with MATLAB or the open-source GNU Octave interpreter.

25k tokens
Umap Learn
by ComeOnOliver
×4

UMAP dimensionality reduction. Fast nonlinear manifold learning for 2D/3D visualization, clustering preprocessing (HDBSCAN), supervised/parametric UMAP, for high-dimensional data.

14k tokens
D3 Viz
by chrisvoncsefalvay
×3

Creating interactive data visualisations using d3.js. This skill should be used when creating custom charts, graphs, network diagrams, geographic visualisations, or any complex SVG-based data visualisation that requires fine-grained control over visual elements, transitions, or interactions. Use this for bespoke visualisations beyond standard charting libraries, whether in React, Vue, Svelte, vanilla JavaScript, or any other environment.

20k tokens
Alphafold Database
by christophacham
×3

Access AlphaFold 200M+ AI-predicted protein structures. Retrieve structures by UniProt ID, download PDB/mmCIF files, analyze confidence metrics (pLDDT, PAE), for drug discovery and structural biology.

7k tokens

How to use it

Copy the folder

Take agricidaniel/claude-blog-blog-chart from the repository into ~/.claude/skills for personal use, or into .claude/skills inside a project.

Check the name does not clash

The agent identifies a skill by the name field in its header. Two skills with the same name cannot sit side by side — one of them will be ignored.