Archivo
Headlines, interface and body copy. The system speaking.
Leapshot brand system
01Principles
A brand system is a short list of decisions, applied everywhere. These are ours.
An arc and a dot: the leap and the shot. The same curve plots the five layers and sweeps the hero, so the logo is never just a logo.
Archivo is a variable font with a width axis. Headlines stretch from condensed to expanded, the way one idea is resized for every placement.
Flat ink, flat colour, hairline rules, square corners. No gradients, no glows, no glass. Anything you can press is a pill.
Leap Yellow is a highlighter, not wallpaper. It marks the one thing that matters on a surface, and takes over a full band once or twice a page.
Archivo is the system speaking. Newsreader is people speaking. Geist Mono is what machines read. Blue marks the machine layer.
Things move when a change travels: a headline widening, a record reaching five surfaces. Nothing fades in for decoration, and reduced motion is respected everywhere.
02Logo
The mark is a quarter arc that ends in a dot: a leap, and the shot at the top of it. The dot is always Leap Yellow or ink, never anything else.
<Logo />
<Logo variant="mark" size="lg" label="Leapshot" /> 03Colour
Two neutrals do nearly all the work. Leap Yellow is used the way a highlighter is. Agent Blue appears only where a machine is reading.
The page. A near-white with a little warmth, never cream.
Text, rules and the dark surface. A warm black, never pure #000.
Leap Yellow, the one signature colour. It is the dot at the top of the mark.
Agent Blue marks anything a machine reads: the agent view, data sources, code. Green and red are kept for confirmation and error states, where they colour the mark and never the words.
A surface is a background plus everything that sits on it. Components never name a colour; they ask the surface for a role such as text, rule or action. Put any component on any surface and it re-colours itself.
Default. Most of every page.
Your team, multiplied.
Secondary text sits one step back. Links underline, and highlight on hover.
Quiet alternate band.
Your team, multiplied.
Secondary text sits one step back. Links underline, and highlight on hover.
The machine room: demos, data, the agent layer.
Your team, multiplied.
Secondary text sits one step back. Links underline, and highlight on hover.
Full-bleed yellow. One or two moments per page, never more.
Your team, multiplied.
Secondary text sits one step back. Links underline, and highlight on hover.
Every text and background pair the system allows, measured against WCAG 2 at build time. If a token change drops any pair below AA, the build fails.
| Sample | Pair | Ratio |
|---|---|---|
| Body text text on surface | 18.3 AAA | |
| Secondary text text-muted on surface | 7.1 AAA | |
| Labels and captions text-subtle on surface | 4.9 AA | |
| Button label on-action on action | 18.3 AAA | |
| Button label, hover on-action-hover on action-hover | 14.4 AAA | |
| Text on accent on-accent on accent | 14.4 AAA | |
| Highlighted text on-highlight on highlight | 15.9 AAA | |
| Machine-layer text machine on surface | 6.3 AA | |
| Focus ring focus on surface | 18.3 AAA | |
| Confirmation mark positive on surface | 4.8 AA | |
| Error mark critical on surface | 5.1 AA |
| Sample | Pair | Ratio |
|---|---|---|
| Body text text on surface | 16.9 AAA | |
| Secondary text text-muted on surface | 6.6 AA | |
| Labels and captions text-subtle on surface | 6.6 AA | |
| Button label on-action on action | 18.3 AAA | |
| Button label, hover on-action-hover on action-hover | 14.4 AAA | |
| Text on accent on-accent on accent | 14.4 AAA | |
| Highlighted text on-highlight on highlight | 15.9 AAA | |
| Machine-layer text machine on surface | 5.8 AA | |
| Focus ring focus on surface | 16.9 AAA | |
| Confirmation mark positive on surface | 4.4 AA Large | |
| Error mark critical on surface | 4.7 AA |
| Sample | Pair | Ratio |
|---|---|---|
| Body text text on surface | 18.3 AAA | |
| Secondary text text-muted on surface | 10.8 AAA | |
| Labels and captions text-subtle on surface | 6.5 AA | |
| Button label on-action on action | 14.4 AAA | |
| Button label, hover on-action-hover on action-hover | 18.3 AAA | |
| Text on accent on-accent on accent | 14.4 AAA | |
| Highlighted text on-highlight on highlight | 14.4 AAA | |
| Machine-layer text machine on surface | 9.3 AAA | |
| Focus ring focus on surface | 14.4 AAA | |
| Confirmation mark positive on surface | 18.3 AAA | |
| Error mark critical on surface | 18.3 AAA |
| Sample | Pair | Ratio |
|---|---|---|
| Body text text on surface | 14.4 AAA | |
| Secondary text text-muted on surface | 11.3 AAA | |
| Labels and captions text-subtle on surface | 8.4 AAA | |
| Button label on-action on action | 18.3 AAA | |
| Button label, hover on-action-hover on action-hover | 18.3 AAA | |
| Text on accent on-accent on accent | 14.4 AAA | |
| Highlighted text on-highlight on highlight | 18.3 AAA | |
| Machine-layer text machine on surface | 14.4 AAA | |
| Focus ring focus on surface | 14.4 AAA | |
| Confirmation mark positive on surface | 14.4 AAA | |
| Error mark critical on surface | 14.4 AAA |
04Typography
Archivo is a variable font with a width axis. The same file sets a condensed story and an expanded billboard, which is exactly what the studio does with a brand.
Headlines, interface and body copy. The system speaking.
Ledes, quotes and answers. People speaking.
Labels, data and code. What agents read.
Twelve fluid steps. Each one interpolates between a phone size and a desktop size, so there are no type breakpoints.
| Token | Value | Preview | Use |
|---|---|---|---|
| --text-7xl | clamp(3.25rem, 0.5rem + 12.2222vw, 11.5rem) | 52px on a phone, 184px on a desktop | |
| --text-6xl | clamp(2.875rem, 1.0833rem + 7.963vw, 8.25rem) | 46px on a phone, 132px on a desktop | |
| --text-5xl | clamp(2.5rem, 1.3333rem + 5.1852vw, 6rem) | 40px on a phone, 96px on a desktop | |
| --text-4xl | clamp(2.125rem, 1.4167rem + 3.1481vw, 4.25rem) | 34px on a phone, 68px on a desktop | |
| --text-3xl | clamp(1.75rem, 1.3333rem + 1.8519vw, 3rem) | 28px on a phone, 48px on a desktop | |
| --text-2xl | clamp(1.5rem, 1.25rem + 1.1111vw, 2.25rem) | 24px on a phone, 36px on a desktop | |
| --text-xl | clamp(1.3125rem, 1.1667rem + 0.6481vw, 1.75rem) | 21px on a phone, 28px on a desktop | |
| --text-lg | clamp(1.125rem, 1.0417rem + 0.3704vw, 1.375rem) | 18px on a phone, 22px on a desktop | |
| --text-md | clamp(1rem, 0.9583rem + 0.1852vw, 1.125rem) | 16px on a phone, 18px on a desktop | |
| --text-sm | clamp(0.875rem, 0.8542rem + 0.0926vw, 0.9375rem) | 14px on a phone, 15px on a desktop | |
| --text-xs | clamp(0.75rem, 0.7292rem + 0.0926vw, 0.8125rem) | 12px on a phone, 13px on a desktop | |
| --text-2xs | 0.6875rem | 11px |
Regular 400
Medium 500
Semibold 600
Bold 700
Heavy 800
Headings use text-wrap: balance and running text uses text-wrap: pretty. On top of that, Heading, Text, Lede and Quote run their content through typeset(), which binds the last two words of a block and ties short words such as a, to and of to the word that follows.
Emphasis switches to the serif voice: like this, never a slanted sans.
05Spacing
A fixed scale for the inside of components, and a fluid one for the page, so whitespace grows with the screen.
| Token | Value | Preview | Use |
|---|---|---|---|
| --space-0 | 0px | None | |
| --space-1 | 4px | 1 x the 4px base | |
| --space-2 | 8px | 2 x the 4px base | |
| --space-3 | 12px | 3 x the 4px base | |
| --space-4 | 16px | 4 x the 4px base | |
| --space-5 | 24px | 6 x the 4px base | |
| --space-6 | 32px | 8 x the 4px base | |
| --space-7 | 48px | 12 x the 4px base | |
| --space-8 | 64px | 16 x the 4px base | |
| --space-9 | 96px | 24 x the 4px base | |
| --space-10 | 128px | 32 x the 4px base | |
| --space-11 | 160px | 40 x the 4px base |
| Token | Value | Preview | Use |
|---|---|---|---|
| --space-margin | 20 to 72px | Page margin, left and right of every container. | |
| --space-gutter | 16 to 24px | Gap between grid columns. | |
| --space-section | 72 to 152px | Vertical padding of a full section. | |
| --space-section-sm | 48 to 96px | Vertical padding of a compact section. | |
| --space-block | 32 to 64px | Gap between a section header and its content. |
06Shape
Containers are square, like print. Anything you can press is a pill. Shadows are kept for things that float.
| Token | Value | Preview | Use |
|---|---|---|---|
| --radius-none | 0 | Sections, cards, frames. Containers are square, like print. | |
| --radius-xs | 2px | Inputs, code blocks, swatches. | |
| --radius-sm | 6px | Small media and thumbnails. | |
| --radius-md | 12px | Chat bubbles only. | |
| --radius-pill | 999px | Anything you press: buttons, chips, badges, toggles. |
| Token | Value | Preview | Use |
|---|---|---|---|
| --border-hairline | 1px | Dividers and outlines. | |
| --border-rule | 2px | Section rules, buttons, focus rings. | |
| --border-heavy | 4px | The accent bar on cards. |
| Token | Value | Preview | Use |
|---|---|---|---|
| --shadow-0 | none | Default. Hierarchy comes from rules and surfaces, not shadows. | |
| --shadow-1 | 0 1px 0 rgb(14 14 12 / 0.06), 0 2px 6px -2px rgb(14 14 12 / 0.12) | Sticky bars once content scrolls beneath them. | |
| --shadow-2 | 0 2px 4px -2px rgb(14 14 12 / 0.12), 0 12px 28px -12px rgb(14 14 12 / 0.28) | Raised cards and menus. | |
| --shadow-3 | 0 4px 8px -4px rgb(14 14 12 / 0.16), 0 32px 72px -24px rgb(14 14 12 / 0.45) | Floating panels: the agent view. |
07Motion
Things move when a change travels: a headline widening, a record reaching five surfaces, a dot landing. With reduced motion switched on, everything simply arrives.
Things that move from A to B.
Things arriving. Fast start, long settle.
Things leaving. Slow start, fast finish.
The signature. A small overshoot, like landing a jump.
Continuous loops and progress only.
Colour and opacity feedback on press.
Hover states.
Most transitions: reveals, toggles, accordions.
Panels and anything that crosses the page.
Signature moments only: the headline widening, the curve drawing.
08Grid
One grid, with a gutter and a margin that grow with the viewport. Layouts change at four breakpoints and nowhere else.
| Token | Value | Use |
|---|---|---|
| --grid-columns | 12 | 12 columns from the lg breakpoint; content stacks below it. |
| --container-prose | 40rem | Long-form reading. |
| --container-narrow | 64rem | Focused pages. |
| --container-wide | 90rem | The default page width. |
| --container-full | 100% | Edge to edge. |
| breakpoint sm | 30rem | Written literally in media queries. |
| breakpoint md | 48rem | Written literally in media queries. |
| breakpoint lg | 64rem | Written literally in media queries. |
| breakpoint xl | 80rem | Written literally in media queries. |
09Components
Anything you can press, and the small signals that sit beside it.
<Button href="/enquire" icon="arrow-up-right">Enquire</Button>
<Button variant="secondary">See the system</Button> An inline link sits in running text.
An arrow link stands alone A quiet link underlines on hover /content.json<Link href="/system/" variant="arrow">Design system</Link> <Chip ask="How is it priced?">How is it priced?</Chip> <Badge variant="accent" live>Live</Badge> This one is live: it opens the agent view.
<Switch label="Agent view" data-agent-toggle /> <Icon name="arrow-up-right" /> 10Components
The three voices, as components. Level and size are separate, so the outline stays right whatever the look.
Display
Extra large
Large heading
Medium heading
Small heading
Extra small heading
Smallest heading
<Heading level={2} size="xl">One source of truth.</Heading> Condensed, for tall formats
Narrow, for tight columns
Normal, for most things
Wide, for emphasis
<Heading width="expanded">multiplied.</Heading> We build creative automation systems that let your team do the work of a much bigger one.
A muted lede, for a quieter opening line.
<Lede size="lg">We build creative automation systems.</Lede> Sans is the system speaking: interface and body copy.
Serif is people speaking: ledes, quotes and answers.
Mono is what machines read: labels, data, code.
Muted, for secondary information.
<Text voice="serif" tone="muted" measure>…</Text> A plain label
01With an index
With the dot
<Eyebrow index="01">The studio</Eyebrow> <List marker="plus" items={pkg.includes} /> Own the layer that is hard to copy, rent everything else.
<Quote attribution="The Wildfield principle">Own the layer that is hard to copy.</Quote> <Rule weight="rule" /> 11Components
Containers for the things the studio actually has to say: packages, facts, answers and data.
The default. A hairline, square corners.
Hover to draw the yellow bar.
Drops into the page.
Pass surface to flip the colours.
<Card variant="raised" href="/system/">…</Card> A lean, fast site that people and AI agents can both read and act on.
<PackageCard index="01" name={pkg.name} summary={pkg.summary}
includes={pkg.includes} pricing={pkg.pricing}
cta={{ label: 'Enquire', href }} /> <Stat value="5" label="Layers, built in order" /> <Field label="Your name" name="name" required />
<Field label="What is it about?" name="package" options={options} /> A setup fee to build the system, then a monthly retainer to run and improve it. We do not sell hours. Every build is scoped to your tools and data, so enquire and we will come back with a custom quote.
No. The point is your team, multiplied. We build the system, then train your people to run it, approve it and extend it.
Your content is structured so AI assistants can read it and act on it: schema (JSON-LD) on every page, an llms.txt file, and an /ask or MCP endpoint. This site is a small example. Switch on Agent view in the menu to see what an agent reads.
<Accordion items={faqs} /> :root {
--color-ink-950: #0E0E0C;
--color-leap-500: #FFDD21;
--font-sans: "Archivo", sans-serif;
--ease-leap: cubic-bezier(0.34, 1.56, 0.64, 1);
} <CodeBlock label="tokens.css" code={css} /> <EnquiryForm options={enquiryOptions} email={contactEmail} /> The same form in a modal. The link chooses what the enquiry is about, and still goes to the enquiry page when there is no JavaScript.
<EnquiryDialog options={enquiryOptions} email={contactEmail} />
<Button href="/enquire/?package=agent-ready-site">Enquire</Button> 12Components
Pages never write CSS. They arrange content with these six primitives, which carry the grid and spacing tokens.
<Grid cols={{ base: 1, md: 2, xl: 4 }} ruled>…</Grid> <Split ratio="7/5">
<Lede>…</Lede>
<Stack slot="aside">…</Stack>
</Split> <Stack gap="5">…</Stack> <Cluster gap="3">…</Cluster> Section is a full-width band: it sets the surface, the vertical rhythm and a Container. Container centres content, applies the page margin and caps the width at wide, narrow or prose. Every page on this site is a stack of Sections.
<Section surface="ink" id="system" aria-labelledby="system-title">
<SectionHeader id="system-title" index="02" eyebrow="The system">One source of truth.</SectionHeader>
</Section> 13Components
The larger compositions the homepage is made of. Each one here is the real component, running.
Nav is the bar at the top of this page: logo, links, the agent-view switch and one call to action. Below the lg breakpoint the links move into a menu opened by a real button. Footer is shown below, at the size of its frame.
<Nav links={nav} cta={{ label: 'Enquire', href }} agentSwitch="Agent view" /> 03How it gets built
The running head that opens every section: a rule, an indexed label, a heading and a lede.
<SectionHeader index="03" eyebrow="How it gets built" meta="Built in order">
Five layers, built in order.
<Lede slot="lede">…</Lede>
</SectionHeader> <Hero lines={['Your team,', 'multiplied.']} eyebrow="Creative automation systems">…</Hero> Source of truth content.json
Brand system tokens + components
Website01
Chatbot02
What is new?
Agent-ready site. A site people and AI agents can both read. Enquire
Ads03
Email04
AI agents05
{
"@type": "Service",
"name": "Agent-ready site",
"description": "A site people and AI agents can both read",
"provider": "Leapshot",
"potentialAction": "Enquire"
} <SystemMap records={records} /> Tokens, logo, type, motion recipes and rules, built so AI tools can read and follow them.
Motion ads, social creative and AI UGC produced from the brand system, with approvals built in.
Structured content that feeds your site, ads, email and AI assistants from one place.
A conversational front door wired to live data, plus the automations behind it.
Your people learn to run, approve and extend the system. The system multiplies them; it does not replace them.
<LayerCurve layers={content.process} /> No model, no black box. Every answer names the content key it came from.
<ChatPanel suggestions={['How is it priced?']} /> The agent view shows what an AI agent reads: the page's JSON-LD, content.json, llms.txt and tokens.json. While it is open, every element with a data-source attribute is outlined with its content key.
<AgentPanel sources={sources} />
<Switch label="Agent view" data-agent-toggle /> <HairlineFigure figure="hub"
caption="One record at the centre."
label="A hub with eight tiles…" /> <HairlineFigure figure="stack"
caption="Five layers."
label="A stack of five frames…" /> <Section surface="ink">
<NotFound />
</Section> HairlineFigure draws an isometric line figure from @lucasmarkes/hairline that answers the pointer, with a one-line caption. It fills its column at 5:4 and, with play on, walks through its motion until someone points at it. Its colours are surface roles, so the plate always matches the band it sits on.
| Token | Value | Use |
|---|---|---|
| --hairline-stroke | 1px | Stroke width of the line figures, in CSS pixels at any size. Matches --border-hairline. |
| --hairline-plate | surface | The plate fill. Always the surface the figure sits on. |
| --hairline-hi | ink, or yellow on ink | What the figure lights. |
| --hairline-edge | ink 700, or paper on ink | Silhouettes. |
| --hairline-mid | ink 400 | Every other stroke. |
| --hairline-lo | one step from the surface | What recedes. |
<FormatFrames lines={['Your team,', 'multiplied.']} /> Positioning, naming and the system that AI tools consume.
Brand motion language and ads resized and versioned for every placement.
Content systems with strategy, approvals and community voice baked in.
Offer, angle and test discipline, with disclosure and compliance handled.
<IndexList items={content.services} /> <CTABand title="Ready to multiply your team?">
<Button href={href} size="lg">Enquire</Button>
</CTABand> <Footer tagline="Your team, multiplied." groups={groups} legal={legal} />