Organic, mechanical and abstract forms drawn together on a single 24×24 construction grid. Every glyph lives inside a 20×20 live area with 2px optical padding, 1.65px stroke, round caps and joins, 1.2px corner radius. Circles are 0.4px oversized to match the weight of squares.
All marks are authored path geometry — no fonts, no raster, no <image>. Coordinates rounded to 2 decimals, no transforms, no empty groups. Optical correction applied: 6.8r circles vs 8.6 square, buoy water-line lowered 0.6px to feel centred.
Hover to see code • all symbols carry <title>
Two-period swell with spray tick
#icon-swellThree gusts with barbs
#icon-windWaxing gibbous, 12% shadow
#icon-moonCloud + three drops
#icon-rainFour grounded strata
#icon-fogBulb + stem with ticks
#icon-thermometerThree-cup hub on mast
#icon-anemometerBeacon + waterline
#icon-buoyPile + graduated staff
#icon-tide-gaugeAnchor with chain eye
#icon-anchorFunnel with mid-line
#icon-filterTray + out-arrow
#icon-exportWarning triangle
#icon-alertClock with rewind arc
#icon-historyTwo windows + exchange
#icon-compareHeart — save station
#icon-favouriteLocation pin
#icon-locationGear — calibration
#icon-settingsNo alternate simplified form needed: 1.65pt stroke thins to 1.4 at 96px for display weight parity. Tested at 16px with pixel-snapped horizontals (wind, fog) kept on half-pixels.
Themeable via color + stroke-width in CSS. Set .icon{stroke:currentColor; stroke-width:1.65} once.
sprite + <use> • accessible
<!-- 1. Sprite is already in the page (hidden SVG) -->
<svg class="icon" aria-hidden="true">
<use href="#icon-buoy"></use>
</svg>
<!-- Meaningful icon: name it -->
<button aria-label="Export tide data">
<svg class="icon" aria-hidden="true"><use href="#icon-export"/></svg>
Export
</button>
<!-- Decorative icon: hide it -->
<span>
<svg class="icon" aria-hidden="true"><use href="#icon-swell"/></svg>
Swell 1.8m
</span>
<!-- Theme: one rule -->
.icon{
width:24px; height:24px;
stroke:currentColor; /* inherits text color */
stroke-width:1.65; /* survives CSS override */
stroke-linecap:round;
stroke-linejoin:round;
fill:none;
}