Skip to content
silverpoint

v0.8.0 · MIT · React · Vue · Angular · Reflex

Charts drawn in silverpoint

A charting library whose visual language is historical drawing technique. The first ground reproduces Renaissance silverpoint: a prepared middle-tone substrate, a fine silver line, tone built from hatching, and white heightening reserved for the live value. The second, cyanotype, prints a white line on Prussian blue. Since 0.3 the same hand draws buttons, inputs, tabs and alerts too, 0.6 adds a second catalog — distributions, hierarchies, fields and networks — and 0.7 palettes, overlays and a timeline.

OrdersOrders
Orders
pointvalue
1118
2124
3121
4132
5140
6136
7129
8142
9151
10147
11155
12162
13158
14171
CapacityCapacity
Capacity
measurevalue
Capacity used72%
Hits per hourHits per hour
Hits per hour
hourhitsbaseline
001822
021418
041115
061617
083430
105848
127160
146662
167464
188870
206255
224140

One chart, four frameworks

Seven packages share one version. The engine, @silverpoint/core, computes every scale and arc; the adapters only translate its geometry into JSX, Vue nodes or Angular templates, so the three render the same SVG, compared as trees in CI.

React

<LineChart /> · react and react-dom 18.2+ or 19; @knight-lab/timelinejs ^3.9.13 (optional, for SpTimeline)

shell
npm install @silverpoint/react @silverpoint/grounds @silverpoint/fonts

Vite and Next.js (App Router, React Server Components) are validated.

React guide →

Vue

<SpLineChart /> · vue ^3.5.0; @knight-lab/timelinejs ^3.9.13 (optional, for SpTimeline)

shell
npm install @silverpoint/vue @silverpoint/grounds @silverpoint/fonts

Vite is validated; SSR is verified with @vue/server-renderer. Nuxt works but is not a validated integration.

Vue guide →

Angular

<sp-line-chart /> · @angular/core, @angular/common and @angular/forms >=21 <23; @knight-lab/timelinejs ^3.9.13 (optional)

shell
npm install @silverpoint/angular @silverpoint/grounds @silverpoint/fonts

The Angular CLI (@angular/build, on Vite) is validated, including @angular/ssr.

Angular guide →

Reflex (Python)

line_chart() · reflex >= 0.10.0 (React 19), Python 3.11+

shell
pip install reflex-silverpoint-react

A Reflex custom component wrapping @silverpoint/react 0.8; Reflex installs the npm side for you. Every chart, UI component, composed component, overlay and the timeline is the npm component, with a snake_case Python API.

Reflex (Python) guide →
tsx
import '@silverpoint/fonts/fonts.css';
import '@silverpoint/grounds/styles.css';
import { LineChart } from '@silverpoint/react/line-chart';

<LineChart data={data} xKey="hour" valueKey="hits" title="Hits per hour" />

From the gallery

See all 60 charts →
new in 0.7

Palettes, overlays and a timeline

Twenty-one more components in the same hand — tables, pagination, statistics, collapse panels, and overlays on the platform's own <dialog> and Popover API: modal, drawer, popover, tooltip, select, menu and toast — for 38 UI components in all. Six palettes named after drawing media re-colour everything without re-rendering it, and Knight Lab's TimelineJS is drawn in silverpoint. In React, Vue and Angular, and in Python with reflex-silverpoint-react.

Revenue$48.2k+8.2 %
Churn2.1%−0.4 %
  1. 09:12DrawnThe ground is prepared.
  2. 10:40InkedHatching and heightening.
  3. 11:05ReviewedPrecision mode checked.
  4. —PublishedWaiting for the release.
What is silverpoint?

A fine silver line on a prepared ground.

And cyanotype?

A white line on Prussian blue; tone is its weight.

Precision mode

The inking switched off: exact rules only.

new in 0.6

The second catalog: 27 new charts

Histograms, box plots, violins, ridgelines and beeswarms whose statistics the core derives; dumbbells, slopes, bumps and diverging bars; squarified treemaps and sunbursts that drill down under your control; parallel coordinates, contours, Voronoi cells, vector fields and a seeded force-laid network. The same exact geometry, the same hand.

Response time by serviceResponse time by service
Response time by service
servicenminq1medianq3maxoutliers
Search60134161.75178.5189.5229—
Checkout60116141200.5258.5311—
Profile48100113.75120128.5148246, 250, 287, 290
Reports36303316.25344.5367443464, 464, 518
Login247683.758895.75109—
Response time by serviceResponse time by service
Response time by service
servicenmedianpeak
Search60178.5182.41
Checkout60200.5138.06
Profile48120115.88
Reports36344.5308.09
Login248886.31
City budgetCity budget
City budget
nodeamount
City budget69,364
City budget › Public works19,197, 27.7% of City budget
City budget › Public works › Street lighting8,015, 41.8% of Public works
City budget › Public works › Bridges6,154, 32.1% of Public works
City budget › Public works › Water mains2,878, 15% of Public works
City budget › Public works › Water mains › Water mains: staff2,069, 71.9% of Water mains
City budget › Public works › Water mains › Water mains: materials809, 28.1% of Water mains
City budget › Public works › Roads2,150, 11.2% of Public works
City budget › Public works › Roads › Roads: staff1,760, 81.9% of Roads
City budget › Public works › Roads › Roads: materials390, 18.1% of Roads
City budget › Administration18,611, 26.8% of City budget
City budget › Administration › IT services8,252, 44.3% of Administration
City budget › Administration › Payroll6,768, 36.4% of Administration
City budget › Administration › Records3,591, 19.3% of Administration
City budget › Administration › Records › Records: staff3,281, 91.4% of Records
City budget › Administration › Records › Records: materials310, 8.6% of Records
City budget › Safety13,294, 19.2% of City budget
City budget › Safety › Emergency planning6,265, 47.1% of Safety
City budget › Safety › Lifeguards5,224, 39.3% of Safety
City budget › Safety › Lifeguards › Lifeguards: materials2,953, 56.5% of Lifeguards
City budget › Safety › Lifeguards › Lifeguards: staff2,271, 43.5% of Lifeguards
City budget › Safety › Fire service1,805, 13.6% of Safety
City budget › Parks10,626, 15.3% of City budget
City budget › Parks › Playgrounds5,030, 47.3% of Parks
City budget › Parks › Playgrounds › Playgrounds: materials2,865, 57% of Playgrounds
City budget › Parks › Playgrounds › Playgrounds: staff2,165, 43% of Playgrounds
City budget › Parks › Tree care2,835, 26.7% of Parks
City budget › Parks › Sports fields2,761, 26% of Parks
City budget › Parks › Sports fields › Sports fields: staff2,455, 88.9% of Sports fields
City budget › Parks › Sports fields › Sports fields: materials306, 11.1% of Sports fields
City budget › Culture7,636, 11% of City budget
City budget › Culture › Libraries3,177, 41.6% of Culture
City budget › Culture › Libraries › Libraries: materials2,265, 71.3% of Libraries
City budget › Culture › Libraries › Libraries: staff912, 28.7% of Libraries
City budget › Culture › Museum2,999, 39.3% of Culture
City budget › Culture › Festivals1,460, 19.1% of Culture
City budget › Culture › Festivals › Festivals: staff1,275, 87.3% of Festivals
City budget › Culture › Festivals › Festivals: materials185, 12.7% of Festivals
Point densityPoint density
Point density
densityband
BicyclesBicycles
Bicycles
modelmassgearspricerangerating
Model 0113.9153,4341251.5
Model 028.6223,897293.8
Model 0319.5133,202622.9
Model 0412.7152,760282.2
Model 0522.821485392.9
Model 0620.1221,178603.1
Model 0722.583,952404.8
Model 0822.6161,4071331.7
Model 0918.3182,9821263.4
Model 1019.1112,060242.1
Model 1113.992,430782.5
Model 1218.4111,046421.3
Model 1395343554
Model 1416.7133,837364
Model 1520.8183,6441074.8
Model 1616.2144,053281.5
Model 1715.9131,6641141.3
Model 1810.443,600751.9
Model 1920.6141,0521243.5
Model 201742,367503.5
Model 212162,545963.1
Model 2220.1223,6741153.2
Model 2318.7132,6861081.8
Model 2421.47863602.6
Model 2512.8124,163952.4
Model 2622.933,1481353.5
Model 2712.6123,1041244.2
Model 2818.2102,7651312.3
Model 2918.389221063.9
Model 3099886322
Library networkLibrary network
Library network
nodegroupdegreeweight
Archive 1Archive3
Archive 2Archive9
Archive 3Archive5
Archive 4Archive8
Archive 5Archive5
Archive 6Archive6
Archive 7Archive6
Archive 8Archive3
Archive 9Archive5
Archive 10Archive6
Studio 1Studio3
Studio 2Studio4
Studio 3Studio3
Studio 4Studio3
Studio 5Studio7
Studio 6Studio4
Studio 7Studio4
Studio 8Studio4
Studio 9Studio6
Studio 10Studio3
Lab 1Lab5
Lab 2Lab5
Lab 3Lab1
Lab 4Lab2
Lab 5Lab2
Lab 6Lab4
Lab 7Lab2
Lab 8Lab4
Lab 9Lab4
Lab 10Lab2
Press 1Press6
Press 2Press4
Press 3Press10
Press 4Press6
Press 5Press1
Press 6Press5
Press 7Press6
Press 8Press7
Press 9Press3
Press 10Press4
Studio 5 – Studio 25
Press 10 – Archive 61
Press 1 – Press 75
Studio 6 – Studio 41
Press 3 – Lab 61
Studio 8 – Studio 55
Archive 5 – Archive 72
Press 2 – Press 13
Archive 4 – Archive 25
Lab 8 – Studio 82
Archive 4 – Archive 11
Press 3 – Studio 95
Lab 1 – Studio 55
Studio 7 – Studio 94
Press 1 – Press 45
Archive 2 – Archive 91
Archive 3 – Archive 52
Press 10 – Press 83
Press 4 – Archive 101
Press 4 – Press 102
Lab 10 – Studio 94
Lab 6 – Lab 24
Archive 1 – Studio 34
Lab 9 – Lab 22
Press 3 – Press 62
Press 6 – Press 14
Studio 8 – Studio 24
Archive 9 – Archive 83
Lab 2 – Lab 13
Archive 3 – Studio 103
Press 9 – Press 23
Press 4 – Press 71
Studio 6 – Studio 54
Studio 3 – Studio 55
Archive 10 – Archive 43
Studio 1 – Studio 91
Archive 2 – Archive 73
Studio 8 – Studio 94
Archive 6 – Archive 41
Press 3 – Press 12
Studio 7 – Studio 54
Archive 2 – Archive 51
Press 8 – Press 14
Archive 2 – Archive 12
Studio 6 – Studio 75
Archive 4 – Press 83
Studio 4 – Studio 11
Press 3 – Archive 102
Archive 3 – Archive 61
Studio 1 – Studio 24
Archive 5 – Archive 104
Lab 7 – Lab 41
Archive 4 – Archive 52
Archive 7 – Studio 43
Press 7 – Lab 83
Press 2 – Press 33
Lab 9 – Lab 45
Press 8 – Archive 61
Lab 6 – Lab 92
Press 9 – Press 83
Studio 10 – Lab 53
Press 8 – Press 33
Studio 9 – Studio 104
Lab 1 – Lab 35
Archive 3 – Archive 24
Lab 6 – Lab 53
Lab 2 – Studio 72
Archive 8 – Archive 41
Press 4 – Archive 32
Lab 8 – Archive 74
Press 5 – Press 35
Press 6 – Press 92
Press 7 – Press 103
Archive 6 – Archive 24
Archive 9 – Archive 41
Lab 1 – Archive 101
Press 8 – Press 64
Archive 2 – Archive 105
Lab 2 – Lab 105
Archive 8 – Archive 72
Press 3 – Studio 62
Press 4 – Press 63
Lab 8 – Studio 54
Studio 2 – Studio 33
Lab 9 – Lab 14
Archive 9 – Archive 65
Press 7 – Press 32
Press 7 – Press 21
Archive 7 – Archive 95
Lab 7 – Archive 24
since 0.3

17 form and display components, drawn by the same hand

Buttons, inputs, checkboxes, switches, sliders, tabs, steps, cards, tags, badges, progress, alerts and skeletons, with frames hand-drawn by each ground's own inker. A native control underneath every one: forms submit, the keyboard follows the WAI-ARIA patterns, and precision mode switches the inking off. Every control on this site is one of them.

silverpoint

cream
Period
  1. Draw
  2. Ink
  3. Ship
Published
Every package reached npm.

cyanotype

prussian
Period
  1. Draw
  2. Ink
  3. Ship
Published
Every package reached npm.

Why silverpoint

Exact data, drawn ornament

The hand irregularity lives only in strokes that carry no data. Every encoded vertex is exact.

A precision mode

mode="precision" switches the inking off. Charts switch by themselves under prefers-contrast and forced-colors.

Deterministic

No Math.random on the render path: the seed derives from the id, so the same props draw the same strokes, on server and client.

Accessible

An accessible name and description, a hidden data table, keyboard exploration and announced readouts.

Server-rendered

React Server Components, @vue/server-renderer and @angular/ssr, hydrating without a mismatch.

Pay for what you use

One subpath per chart, a framework-free core, tree-shakeable. The core's full bundle stays under 45 kB.

Two grounds

Tone is hatch density on the silverpoint ground, and line weight on cyanotype. No chart code changes between them: ground="cyanotype" on a chart, the provider or a dashboard.

Grounds & substrates →
silverpoint · creamsilverpoint · cream
silverpoint · cream
xvalue
Mon32
Tue45
Wed41
Thu58
Fri66
Sat38
Sun29
cyanotype · prussiancyanotype · prussian
cyanotype · prussian
xvalue
Mon32
Tue45
Wed41
Thu58
Fri66
Sat38
Sun29

Also in Python, with Reflex

reflex-silverpoint-react wraps @silverpoint/react as a Reflex custom component: the 60 charts, the Dashboard, the 17 UI components, the provider, events, custom readouts and SVG export, as Python, and the palettes, 21 composed components and overlays and the Knight Lab timeline of silverpoint 0.7. Version 0.8.0 wraps @silverpoint/react 0.8.0. This site is built with it.

python
import reflex as rx
from reflex_silverpoint_react import donut_chart, radar_chart

rx.hstack(
    donut_chart(data=budget, name_key="name", value_key="value", title="Budget"),
    radar_chart(data=profile, subject_key="subject", value_key="value", title="Profile"),
)
BudgetBudget
Budget
namevalueshare
Rent3838%
Food2222%
Savings1515%
Transport1414%
Leisure1111%
ProfileProfile
Profile
subjectvalue
Speed8
Range6
Comfort7
Safety9
Cost4
Style6
WindWind
Wind
directionshare< 55–1010–1515–20≥ 20
N11%1%5%4%0%0%
NNE7%1%3%2%0%0%
NE4%0%2%1%0%0%
ENE4%1%3%1%0%0%
E13%0%7%5%0%0%
ESE5%0%2%3%0%0%
SE4%0%1%2%1%0%
SSE6%0%3%1%1%0%
S7%0%2%2%1%1%
SSW5%0%1%3%0%1%
SW3%0%1%1%1%0%
WSW2%0%1%1%0%0%
W3%1%1%1%0%0%
WNW6%0%1%2%1%1%
NW11%0%3%4%3%1%
NNW6%0%3%3%1%0%

Made by Ernesto Crespo

silverpoint is designed and developed by Ernesto Crespo, released under the MIT license. Found a bug or a chart that draws wrong? Report it.