Shapes
Organic, hand-drawn SVG shapes give our design system its handmade character. They're used across the site in hero sections, diagrams, and decorative elements – always rendered as filled forms that can carry textures or blend with one another.
Circles
The core building blocks of our shape system. Circle variants appear in Venn diagrams and hero sections – each has a subtly different organic contour, so using different variants together avoids visual repetition.
circle
Primary circle. Default shape in OverlappingCircles.
circle2
Second variant. Typically the right circle in Venn diagrams.
circle3
Third variant. Used as the centre circle in three-circle layouts.
Rectangles
Blocky organic forms with varying proportions. Used in hero sections and layout compositions to provide geometric contrast alongside circles.
rectangle
Primary rectangle.
rectangle2
Wider variant.
rectangle3
Square-proportioned variant.
rectangle4
Taller, portrait-oriented variant.
Polygons
Angular organic forms that add directional energy and visual variety to compositions.
triangle
Hand-drawn triangle with organic edges.
pentagon
Five-sided organic shape.
Symbols
Expressive marks with strong visual weight. Each retains the hand-drawn quality of the broader shape library.
cross
Organic X mark.
tick
Organic checkmark.
Compound shapes
Multi-element compositions rendered as a single SVG path. Useful for richer visual arrangements in hero sections and decorative contexts.
threecircles
Three circles in a horizontal row.
sixcircles
Six circles in a cluster arrangement.
threerectangles
Three rectangles side by side.
Where shapes are used
- PageHero – The animated shape in landing page heroes. Accepts any
ShapeTypevia theshapeprop. - OverlappingCircles – Venn diagram component. Each circle can use a different shape variant (typically circle, circle2, circle3) via the per-circle
shapeprop. - CircleCluster – Connected nodes diagram. All nodes share a single shape (default: circle2), set via the
shapeprop. - QuoteBlock – A pair of speech marks, filled with texture. The path is defined inline in the component rather than in the library, as it's specific to that context.
- Section borders – Organic top and bottom edges on sections, rendered by the
Bordercomponent. Border shapes (paint and torn edges) live insrc/assets/borders/as their own SVGs rather than in the main shape library, but follow the same hand-drawn aesthetic. Used via theborderTopandborderBottomprops onSectionandQuoteBlock.
See also
- Diagrams – How shapes are composed into interactive Venn and cluster diagrams.
- Textures – Overlay textures that can be clipped to shapes.
- Device screenshots – A separate visual system for device frames and composite layouts.
Adding a new shape
- Create the shape in Illustrator with an organic, hand-drawn aesthetic.
- Export as SVG with these settings: Presentation Attributes styling, Layer Names for IDs, 2 decimal places, minified, responsive (uses viewBox).
- Clean up the exported SVG – remove
<title>,<desc>,<metadata>, anyfillorstyleattributes. The result should be a single<path>inside an<svg>with aviewBox. - Save to
src/assets/shapes/[name].svg. - Add the new name to the
ShapeTypeunion insrc/data/shapes.ts.
Target SVG structure
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 255 725">
<path d="M254.77,362.43c0,10.66..."/>
</svg> Technical details
Shapes are imported at build time using Vite's ?raw loader and parsed by parseSvg()
in src/data/shapes.ts. This extracts the viewBox and path data,
which components render as inline SVG. Colours are applied at render time via the fill
attribute – never baked into the SVG file.