Millbrook Riverside Park
Eleven hectares of railway sidings returned to the river.
Samla / Style Guide 1.0
Every token, primitive, component, section and pattern in Samla, rendered from the production CSS and JavaScript. Nothing on this page is a demonstration copy.
Try a brand colour
Global decisions every other layer is built from. Defined in assets/css/foundations/.
Raw tokens define the palette. Components never use them directly: they read semantic tokens, which each surface remaps. Contrast is measured against each token's usual background.
Semantic tokens (what components read)
| Token | Role | Default | Dark | Brand |
|---|---|---|---|---|
| --surface-bg | Background | paper | ink | brand |
| --surface-text | Text | ink | on-dark | white |
| --surface-muted | Text muted | muted | muted-on-dark | white |
| --surface-line | Border, hairline | line | ink-line | white 50% |
| --surface-line-strong | Input and control borders | border-strong | #75736D | white |
| --surface-rule | Section-opening rule | ink | on-dark | white |
| --surface-subtle | Surface alternate, fills | stone | ink-raised | white 12% |
| --action-bg / --action-text | Primary action (brand contrast) | ink / paper | paper / ink | white / brand |
| --feedback-error | Error | error | #E9A08E | white + icon |
| --focus | Focus ring | ink | on-dark | white |
Put data-surface on any section or element. Descendants inherit background, text, muted text, borders, actions and focus. The markup in each panel below is identical.
Plan your next launch with confidence.
Muted text on this surface. An inline link.
Plan your next launch with confidence.
Muted text on this surface. An inline link.
Plan your next launch with confidence.
Muted text on this surface. An inline link.
Plan your next launch with confidence.
Muted text on this surface. An inline link.
Plan your next launch with confidence.
Muted text on this surface. An inline link.
Plan your next launch with confidence.
Text on a photograph always sits on a scrim. An inline link.
Eight visual roles, two weights, two families. Classes are text-{role}, tokens are --text-{role}. Sizes are fluid between the mobile and desktop values with clamp().
Structure and style are separate
Choose the element from the document outline, then apply the style the design needs. An h2 can be a Page Title in one place and a Section Heading in another. Never change a heading level to change a size.
| Element | Style | Where |
|---|---|---|
<h1> | Display | Homepage hero statement |
<h1> | Page Title | Inner page headers |
<h2> | Section Heading | Section titles |
<h2> | Page Title | Closing CTA statements |
<h3> | Card Title | Cards within a section |
<h3> | Section Heading | Principles, values (feature rows) |
<p> | Lead | Intros under a heading |
<figcaption> | Caption | Media captions |
A 4px base scale for elements and components, plus three fluid roles for sections, headings and panels.
| Role token | Mobile to desktop | Use |
|---|---|---|
| --space-section | 80 to 128 | Section padding |
| --space-heading | 32 to 56 | Section header to content |
| --space-component | 24 to 32 | Padding inside panels and cards |
| --grid-gap | 16, 20, 24 | Column and grid gaps |
| --page-gutter | 20, 40, 48, 64 | Page margins |
Section labels hang in columns 1 to 3; headings and copy start at column 4. On mobile, labels stack above content. The live grid below uses the current viewport's column count.
| Viewport | Query | Columns | Gutter | Margin |
|---|---|---|---|---|
| Mobile | < 48em (768) | 4 | 16 | 20 |
| Tablet | ≥ 48em | 8 | 20 | 40 |
| Laptop | ≥ 64em (1024) | 12 | 24 | 48 |
| Desktop | ≥ 90em (1440) | 12 | 24 | 64 |
Containers: data-width
Radius
Surfaces, cards and media are square. Controls and tags use 4px. Full rounding is for status dots and avatars only.
Line and shadow
No decorative shadows. --shadow-overlay is reserved for menus and dialogs that float above the page.
Aspect ratios: data-ratio
square 1:1, portrait 4:5, standard 4:3, photo 3:2, video 16:9, cinema 21:9
| --duration-fast | 120ms, hover and press |
|---|---|
| --duration-base | 200ms, state changes |
| --duration-slow | 320ms, drawers, dialogs |
| --ease-standard | cubic-bezier(.2, 0, 0, 1) |
| Reduced motion | All durations 0, no movement |
Focus: 2px outline, 2px offset, surface text colour
Press Tab anywhere on this page to see real focus states.
| --z-raised | 1 |
|---|---|
| --z-dropdown | 100 |
| --z-sticky | 200 |
| --z-overlay | 300 |
| --z-dialog | 400 |
| --z-toast | 500 |
Inline SVG, 1.5px stroke in currentColor, on a 16px grid. Decorative icons carry aria-hidden="true"; an icon-only control needs an aria-label. Sizes: data-size 12, 14, 16, 20, 24.
Small, generic interface elements. They know nothing about case studies, people or posts. Defined in assets/css/primitives/.
grid data-columns="4" (2 on tablet, 1 on mobile)
grid with data-span / data-start (64em+)
button-group data-stack="mobile": full-width 52px stack below 48em
Read the accessibility statement before you start.
Read the accessibility statement before you start.
We only use this to send release notes.
Enter a full address, including https://
We only use this to send release notes.
Enter a full address, including https://
form data-validate: submit empty to see the error summary and inline errors
Yes. Replace the brand and surface tokens and every component follows.
No. Pages render as static HTML.
Any. Implementations keep the same class names and contracts.
For dense lists such as footnotes or specifications.
Omit the name attribute.
Rules, hover fill and focus come from the surface.
Eleven hectares of former railway sidings returned to the river.
Five terraces built from ballast and spoil already on site.
A thirty-year plan agreed with the council's parks team.
tabs (horizontal, line). The homepage code viewer uses data-orientation="vertical" data-variant="contained".
Landscapes can store carbon, cool cities and support wildlife, but only if they are designed with care.
Running text with an inline link, strong emphasis, emphasis, inline code and Ctrl + P.
A tree planted in the right soil will outlive every other decision on the drawing.
<div class="prose">…</div>
| Surface | 2020 | 2025 |
|---|---|---|
| Concrete paving | 82 | 61 |
| Natural stone | 64 | 48 |
Small print after a rule.
Reusable combinations of primitives, with finite variants. Defined in assets/css/components/.
Principles
An optional intro sits under the heading, in the same column.
data-align="hang" (default)
Stacked
data-align="stack"
Centred
data-align="center" data-rule="none", dark
Eleven hectares of railway sidings returned to the river.
plain, with tags
Shade, water and soil: what a decade of heatwaves has taught us.
panel, no media, with person and action
Street redesigns that make walking the obvious choice.
bordered, service
profile: portrait media, meta after title
A community meadow made permanent.
overlay: text over media on a scrim
Cards inherit the surface.
Shade, water and soil: what a decade of heatwaves has taught us about the parks we design.
data-layout="horizontal" data-size="large": featured items
An ink hairline above, mono index, small text.
Card Title and body text.
Filled with the surface's subtle colour.
A brand rule marks the current item.
Row layout, xlarge: principles, values and service lists.
Row layout, large, with a link.
Streetsfeature-list with data-layout="row"
We kept every tree that could be kept. The oldest birch is now the centre of the play area.
I drew the planting plan for a park I now walk through on my way to work.
Fieldwork listened longer than anyone we have worked with. The park works because the people who use it helped design it.
data-size="large" on dark: testimonial sections
Studio closed 24 December
We reopen on 2 January.
Enquiry sent
A partner will reply within two working days.
Path closed for planting
Use the river entrance until March.
Upload failed
Files must be under 20 MB.
data-logo="left" data-behaviour="static", with a dropdown (Services) and a mega menu (Practice)
Mobile variants are live in the responsive previews: the Samla site uses dropdown, Fieldwork templates use drawer, the landing page uses fullscreen. The sticky variant is the header at the top of this page.
/* Rebrand a project: override raw tokens only */
@layer project {
:root {
--color-brand: #2B45C9;
--font-sans: 'Inter', system-ui, sans-serif;
}
}
Page bands. Every band is a .section with data-surface and data-spacing, containing a section header and a layout block. Card grids, feature grids, stats, testimonials and related content are compositions, not separate sections. Defined in assets/css/sections/.
| Section | Composition |
|---|---|
| Intro, rich content | section + section-header + section__body[data-indent] + prose |
| Card grid, related content | section + section-header + grid[data-columns] of cards |
| Feature grid, steps | section + section-header + grid of features |
| Stats, results | section + section-header + stat-list (+ quote) |
| Testimonials | section[dark] + quote[large], or a carousel of quote panels |
| Logo grid | section + section-header + logo-list[grid] |
| Video | section + section-header + media[video] with play |
| FAQ, contact | section + split (header aside, accordion or form main) |
| Newsletter | section + cta with a subscribe form |
data-layout="text" / alternate
Public spaces designed to be used.
Title across the grid, facts in columns 1 to 4, lead and actions from column 7.
data-layout="split"
Parks and open space
Content left, media right. Here the title uses Page Title instead of Display.
data-layout="media" / image
Learn landscape by building one.
The image fills the band behind a scrim that guarantees contrast.
data-layout="centered" / brand
One set of components, any brand.
A centred stack for campaigns and landing pages.
data-width="narrow" / dark
A narrower title column for shorter statements.
The studio
Designers, ecologists and engineers at one table.
Media in columns 1 to 6, content from column 8.
How we workdata-media="end"
Chartership, paid for and planned in.
FAQ
Before you apply.
No. Show us how you look at places.
Both. You choose a home studio.
Most graduates stay.
Have a site in mind?
data-layout="inline" on brand.
Get the next essay by email.
data-layout="centered" with a subscribe form, on dark.
Stacked
Every project on this page started with a conversation.
Trusted by
Opinionated arrangements for particular content. A site may use none, some or many. Defined in assets/css/patterns/.
Case study / stacked
Millbrook Riverside Park
Label and facts hang in columns 1 to 3; title and lead start at column 4.
Job / split
Senior Landscape Architect
Lead park projects from brief to opening day in our Glasgow studio.
Event / centered
Millbrook one year on: a guided walk
In the summer of 2022, the temperature on a play area we had opened three years earlier reached 58°C at ground level.
That afternoon changed how we design. Shade is now the first layer we draw, before paths or play.
Founding partner
Ruth Hallam
Ruth co-founded Fieldwork in 2009 and leads the studio's park projects.
Compositions of existing parts. No new CSS.
Careers index: link-list with meta
Events index: link-list with dates
Location: bordered card + meta-list
Case study results: stat-list + quote
The park works because the people who use it helped design it.
Reference compositions for a fictional landscape practice, Fieldwork. Examples of composition, not fixed layouts.
Live pages at phone and tablet widths. The menus work: each shows a different data-mobile variant.