Skip to main content

Textures

Textures add organic, handcrafted warmth to the design system as luminance masks: the file says where a grain colour shows, the fill underneath is never touched, and one file works on any colour scheme and in either theme.

All fourteen textures are single-channel JPEGs in public/textures/, configured in src/data/textures.ts. A worked comparison of any shape or section – fill, texture, grain colour, strength – lives in the Texture Lab.

Fine grain

iron

Weathered metal, mottled

Dimensions
900 × 900
Made from
iron-limestone.jpg (existing site texture)
Code example
<PageHero texture="iron" textureOpacity="medium" />

concrete

Scraped, patchy render

Dimensions
1600 × 1600
Made from
Cowork brand-folder photo
Code example
<PageHero texture="concrete" textureOpacity="medium" />

plaster

Fine stipple with trowel marks

Dimensions
1600 × 1601
Made from
Cowork brand-folder photo
Code example
<PageHero texture="plaster" textureOpacity="medium" />

paper

Crumpled sheet, creases as the figure

Dimensions
1800 × 2400
Made from
Cowork brand-folder photo
Code example
<PageHero texture="paper" textureOpacity="medium" />

splatter

Brushed concrete with paint flecks

Dimensions
1600 × 1143
Made from
painted-concrete.jpg (existing site texture), converted with scripts/textures ink mode
Code example
<PageHero texture="splatter" textureOpacity="medium" />

Broad texture

ink

Broad, organic ink wash

Dimensions
2419 × 1593
Made from
ink2.jpg (existing site texture)
Code example
<PageHero texture="ink" textureOpacity="medium" />

wall

Peeling painted wall

Dimensions
1600 × 1600
Made from
wall01.jpg (existing site texture; also retires the smaller wall.jpg)
Code example
<PageHero texture="wall" textureOpacity="medium" />

acrylic

Cloudy, mottled acrylic paint

Dimensions
1536 × 1536
Made from
acrylic-paint.jpg (existing site texture)
Code example
<PageHero texture="acrylic" textureOpacity="medium" />

strata

Horizontal watercolour bands, hard edges

Dimensions
3000 × 1947
Made from
Cowork brand-folder photo (blue watercolour)
Code example
<PageHero texture="strata" textureOpacity="medium" />

paint

Fluid paint streaks

Dimensions
1600 × 1600
Made from
paint.jpg (existing site texture), converted with scripts/textures ink mode, inverted
Code example
<PageHero texture="paint" textureOpacity="medium" />

smoke

Wisps of smoke

Dimensions
1600 × 1600
Made from
smoke.jpg (existing site texture), converted with scripts/textures ink mode, inverted
Code example
<PageHero texture="smoke" textureOpacity="medium" />

Soft wash

watercolour

Soft pooled wash

Dimensions
3000 × 2000
Made from
watercolour.jpg (existing site texture)
Code example
<PageHero texture="watercolour" textureOpacity="medium" />

brush

Fibrous, brushed watercolour streaks

Dimensions
1600 × 1600
Made from
Cowork brand-folder photo (fibrous watercolour)
Code example
<PageHero texture="brush" textureOpacity="medium" />

cloud

Soft cloudy watercolour wash

Dimensions
3000 × 2000
Made from
Cowork brand-folder photo (magenta watercolour)
Code example
<PageHero texture="cloud" textureOpacity="medium" />

Opacity presets

Named opacity values provide consistency and semantic meaning – each is multiplied by the texture's own gain so a preset reads as roughly the same amount of grain on every texture. You can also use numeric values (0-1) for fine control.

subtle

Value: 0.1

light

Value: 0.18

medium

Value: 0.3

strong

Value: 0.45

prominent

Value: 0.7

Code example
// Using preset names
<PageHero texture="ink" textureOpacity="subtle" />
<DiagramCircle texture="wall" textureOpacity="medium" />

// Using numeric values for fine control
<PageHero texture="ink" textureOpacity={0.12} />

Usage guidelines

Where textures are used

  • Hero sections with animated shapes (PageHero)
  • Full-section backgrounds (Section, ProductFeature)
  • Diagram circles, flow nodes and Venn diagrams
  • Device frame decorations, and decorative quote marks

How it works

Each texture is a greyscale JPEG read as a luminance mask: white shows the grain colour, black shows the fill underneath. In SVG contexts the shape is drawn twice – once in the fill colour, once in the grain colour masked by the texture. In CSS section backgrounds, a ::before layer in the grain colour is masked the same way with mask-image.

TypeScript support

Import types from @data/textures for autocomplete and type safety:

import type { TextureName, TextureOpacityPreset } from '@data/textures';