Eighteen glyphs for stations that watch the sea.
One family across three kinds of form — organic readings, mechanical instruments and abstract interface actions — drawn on a single 24-unit grid with one stroke, one cap, one afternoon.
All eighteen at 24px, one line
The family test: organic, mechanical and interface marks side by side. If one glyph reads heavier, lighter or foreign here, it goes back to the drawing board.
The set
Toggle Construction grid in the header to inspect any glyph against the unit grid and the 2-unit live-area padding.
Organic — the readings
Mechanical — the instruments
Interface — the actions
One grid, one hand
Barometer on the construction grid. The dial is Ø17 units — one unit wider than the square interface forms — because a circle drawn to the same nominal size as a square reads smaller. Round forms overshoot; nobody measures, everybody sees.
- Grid
viewBox="0 0 24 24"· 20×20 live area · 2-unit padding, dashed. Nothing but optically-overshooting rounds may cross it. - Stroke1.5px, centred on whole or half units. Round caps and round joins everywhere — corner radius comes from the join, never from drawn fillets.
- TerminalsStrokes end horizontal or vertical where the form allows. Dots (alert, thermometer) are Ø≈2.6 stroked circles, so they fatten with stroke width.
- DensityOne primary silhouette, one tier of secondary detail. Water always sits on the same baseline (y≈16–19); verticals centre on x=12 unless the form forbids it.
- Economy≤24 path commands per symbol, coordinates to 0.01, no transforms, no groups, no fills. This page’s sprite is the ship artefact.
- PaintSymbols carry zero paint attributes.
fill,strokeandstroke-widthinherit from CSS through<use>, so colour and weight are themed from outside.
16px to 96px
Strokes hold from chip size to splash size. At 96px the round joins and the curl of the swell do the talking; at 16px two symbols swap to reduced forms.
Tide gauge, 16px form. Four staff ticks collapse to two longer ones; the wavelets open up. #i-gauge-16
Rainfall, 16px form. Three streaks become two so the cloud keeps its air. #i-rain-16
One sprite, any surface
Every mark is currentColor: the set takes the text
colour of wherever it lands. Stroke weight is ordinary CSS, inherited into the shadow
of <use> — set it per context, not per asset.
Station card
A plausible fragment of the dashboard the set was drawn for: thirteen of the eighteen glyphs at working size, doing real jobs.
rising · low 20:47
-
Icon-only controls — the favourite, export, filter and compare buttons carry
aria-label; the svg inside isaria-hidden. -
Standalone meaning — the moon glyph has no text beside it, so it is exposed as
role="img"with its own label. - Decorative in sentences — the advisory icon repeats what the text says, so it is hidden from assistive technology.
-
One paint source — chips mute their icons via
color, the advisory tints amber, the sparkline takes the accent. Same symbols throughout.
Drop-in
The sprite at the top of this document is the one rendering this page — view source and lift it verbatim.
<!-- sprite: include once per page --> <svg xmlns="http://www.w3.org/2000/svg" style="display:none" aria-hidden="true"> <symbol id="i-swell" viewBox="0 0 24 24"> <title>Swell</title> <path d="M3 14.4C6.5 9 11 8.6 13.7 11.9 …"/> </symbol> <!-- …19 more symbols… --> </svg> <!-- decorative: hidden from assistive tech --> <svg class="icon" aria-hidden="true"><use href="#i-wind"/></svg> <!-- meaningful: the icon is the content --> <svg class="icon" role="img" aria-label="Gale warning"> <use href="#i-alert"/> </svg>
/* the whole paint system: symbols carry no fill/stroke attributes, so all of this inherits through <use> */ .icon { width: 24px; height: 24px; /* or 1em to follow type */ fill: none; stroke: currentColor; /* light or dark, free */ stroke-width: 1.5; /* override per context */ stroke-linecap: round; stroke-linejoin: round; } /* denser toolbar? heavier stroke, same sprite */ .toolbar .icon { stroke-width: 1.25; width: 20px; height: 20px; }
At 16px and below, reference #i-gauge-16 and #i-rain-16 in place of their full forms. All twenty symbols live in the same sprite and share the same paint rules.