Skip to content
InsightCharts

Search

Search guides and components

Visual essay

A long article read by scrolling. It has a headline, then an ordered list of blocks in a reading column, then a source note. The blocks are prose, figures, charts with a callout, scrolly sequences, pull quotes, stat rows, small multiples and chapter breaks. Exhibits can be wider than the column.

Use when
Use it for a finding that takes several charts and some text to explain. State the main finding with its number in the headline. Put the main figure within the first screen. Alternate text and charts, with two or three short paragraphs before each exhibit. In a scrolly block change one thing per step, such as the highlight, the year or an annotation. Use one accent colour for the subject in every chart.
Avoid when
A summary for someone who will not scroll (use executive brief). Reference material read out of order (use report page). More than one or two scrolly blocks. Use one only where the chart changes between steps.

Preview

A template is a whole page, so the preview scrolls inside its frame. Expand it to read it in place, or open it full screen.

Full screen

Energy transition

Solar supplied 11.1% of EU electricity in 2024, more than coal's 9.8%

Solar's share was 2.9% in 2015. Coal's share was 24.6% in 2015.

By the data desk

Solar supplied 2.9% of the EU's electricity in 2015. Hydro supplied 11.5%.

In 2024 solar supplied 11.1%. It was the first full year in which solar generated more electricity than coal.

Solar's share rose from 2.9% to 11.1% between 2015 and 2024

Share of EU electricity generation, 2015 to 2024

Source: Ember, European Electricity Review 2025

Coal's share was 15.8% in 2022. It fell to 12.3% in 2023 and 9.8% in 2024. Solar's share rose from 7.0% to 11.1% in the same two years.

Step 01 of 03: Solar module prices, 2010 to 2024

A module cost $2.00 a watt in 2010. It cost $0.11 a watt in 2024.

Solar module prices fell from $2.00 to $0.11 a watt between 2010 and 2024

Average price of crystalline silicon solar modules, US dollars per watt

Source: IRENA and BloombergNEF (rounded)
Solar capacity installed in the EU, end of 2024
338 GW
+66 GW in 2024
Solar generation, 2024
304 TWh
+22% vs 2023
Coal generation, 2024
269 TWh
−16% vs 2023

Step 02 of 03: EU electricity generation by source, 2015 and 2024

Scroll to see the shares in 2015 and then in 2024.

EU electricity generation by source, 2015

Share of electricity generation

Source: Ember, European Electricity Review 2025
2015

In 2015 nuclear and coal together supplied 51% of the EU's electricity.

Coal supplied 24.6% in 2015. It was the second-largest source after nuclear.

2024

Coal supplied 9.8% in 2024. Plants closed in Germany, Spain and Portugal.

Solar supplied 11.1% in 2024. It supplied 2.9% in 2015. Wind supplied 17.4% in 2024 and gas 15.7%.

“Solar was 1% of Dutch generation in 2015. It was 18% in 2024. We have had to change how we run the grid at midday.”

Marit de VriesHead of system operations at a Dutch grid operator

Step 03 of 03: Solar share by country

Greece had the highest share in 2024 at 22.1%. Spain had 21.0%. France had 4.6%.

Solar's share in the Netherlands rose from 1.0% to 17.9% between 2015 and 2024

Solar share of electricity generation, 2015 to 2024, same scale in every panel

Source: Ember (country series rounded, illustrative)

Poland's solar share rose from 0.0% in 2015 to 10.8% in 2024. Retail electricity prices in the Netherlands and Poland rose after 2022. At those prices a rooftop system paid for itself in under seven years without subsidy.

France has cheap nuclear power and slow permitting. Its solar share was 4.6% in 2024. Germany's was 14.7%.

Sources
Ember, European Electricity Review 2025; IRENA Renewable Power Generation Costs; BloombergNEF
Data
2010 to 2024, annual
Method
Generation shares are of total net generation in the EU-27. Module prices are annual averages in nominal dollars.
Note
EU totals are approximate, rounded for illustration. Country series and the quotation are illustrative.
Credit
Analysis and charts by the data desk

Composition

Built from

The visual essay template is assembled from 4 molecules and 13 atoms, 5 of which it reaches only through a molecule. Any slot also takes any other component.

Molecules

4

A scroll-driven story from JSON: one base chart spec and a list of steps, each with narration and a patch of chart props applied while that step is active.

Two to five key figures in one row separated by hairlines, collapsing to two columns and then one as the container narrows.

Atoms

13

The opening block of a piece or section: kicker, title, one-sentence deck and a byline/date line.

A readable block of narration at a 45-75 character measure, for the text between charts.

Directly, and throughScrolly chart

Repeats one small line, area or bar chart per value of a facet field on a shared scale, each panel titled.

A sourcing footer for a whole piece: sources with optional links, the period covered, method, caveats and credit.

A numbered chapter or step heading ("01 — Electricity sources in 2015") for sequencing the sections of a story.

A featured statistic with its label, change and the context that gives it meaning.

ThroughStat row

A boxed statement of fact with a short bold lead and a sentence of explanation. The tone is marked by icon and tint.

A compact, bordered KPI tile: label, value, change against a baseline and an optional trend graphic.

ThroughStat row

Installation

$ pnpm dlx shadcn@latest add @insightcharts/visual-essay

The CLI copies the source into your project and needs the @insightcharts registry in components.json; see installation. With the package, import it by name:

import { VisualEssay } from "insightcharts";

Examples

Transport: a shorter essay without a scrolly

Cities

Cycling accounts for 11.2% of trips in Paris and cars for 4.3%

Bicycle counts in 2024 were 3.2 times the 2015 level. The city made 50 km of temporary pandemic cycle lanes permanent.

By the transport desk

Permanent counters in Paris recorded 3.2 times as many bicycles in 2024 as in 2015. The count rose 47% between 2019 and 2020.

Bicycle counts in Paris in 2024 were 3.2 times the 2015 level

Bicycle counts at permanent counters, index (2015 = 100)

Source: City of Paris counter data (rounded, illustrative)

The index rose from 154 in 2019 to 226 in 2020, when the city opened 50 km of temporary lanes. The city kept those lanes and built 130 km more. The index reached 317 in 2024.

“Counts went up on the streets where we built protected lanes. They stayed up after the lockdowns ended.”

A city transport planner

Cycling's share of trips within Paris is 2.6 times the car's

Share of trips within Paris by main mode, 2023

Source: Institut Paris Region mobility survey

These shares are for trips within the city. In the suburbs the car accounts for one trip in three.

Sources
City of Paris open data; Institut Paris Region
Data
2015 to 2024
Note
Counter index is illustrative. Mode shares are approximate, for illustration.

Props

PropTypeDefaultDescription
titlerequiredstringThe essay's main finding, as one plain sentence with the number and the period in it.
kickerstringSmall label above the title.
deckstringOne-sentence standfirst.
bylinestringAuthor line.
datestringPublication date. ISO dates are formatted for the locale.
blocksrequired(Block | Slot)[]The story in reading order. Each block has a kind: prose { text, lead? }; figure { chart, caption? }; callout { chart, lead, body, label?, tone?, side? }; scrolly { chart, steps, cumulative?, scrollMode?, side?, stepHeight? } (the props of scrolly-chart); quote { quote, attribution?, role? }; stats { items, title? }; multiples { facet, ... } (props of small-multiples, or of small-multiple-grid when it has a chart); break { title, step?, total?, text? }. Any block takes width: "text" | "wide" | "full" and an id. A bare chart spec is treated as a wide figure.
measurenumber680Width of the reading column in px.
textSize"md" | "lg"Body text size. Default 18px, 16px in narrow containers.
sourcesstring | { name, url? } | (string | { name, url? })[]Where the data comes from, shown in the closing source note. Entries with a url are linked.
periodstringThe period the data covers.
methodstringHow the numbers were produced: definitions, adjustments, exclusions.
notestringCaveats the reader should know, e.g. "Illustrative data".
creditstringWho made the piece.
level1 | 2 | 3 | 4 | 5 | 61Heading level of the title; section headings follow one level down.
maxWidthnumber | stringWidest the piece may get. It is centred in wider containers.
themeThemeInputTheme override, passed on to everything inside.
mode"auto" | "system" | "light" | "dark""auto"Colour mode, passed on to everything inside.