Design system / Components

Components

Every shared component on the site, live, with markup to copy. The styles live in one file, assets/felloh.css; build new pages from these pieces and add a component here when a second page needs it.

Tokens

Defined once in :root, assets/felloh.css

Use the variables, never the raw values. Purple is the only accent; green and red are reserved for status.

Backgroundvar(--bg)
Inkvar(--ink)
Ink 2 · secondaryvar(--ink-2)
Ink 3 · mutedvar(--ink-3)
Hairline · dashed rulesvar(--hairline)
Gridline · hero gridvar(--gridline)
Accent · purplevar(--accent)
Accent soft · hovervar(--accent-soft)
OK · settledvar(--ok)
Warn · action neededvar(--warn)
Display · var(--font-display) · Inter Tight 650
Every pound, traced
Body · var(--font-body) · Inter 400/500
felloh captures the payment with the booking reference attached and keeps the trail auditable.
Mono · var(--font-mono) · IBM Plex Mono 400/500
// 01 — Labels, data and buttons
ElementDesktopMobile (≤640px)
h1 (inner page)clamp(38px, 4.6vw, 64px) · line-height 1.06clamp(34px, 9.5vw, 44px)
h2clamp(30px, 3.4vw, 46px) · line-height 1.1same clamp
.sub17.5px · ink-317.5px
Breakpoints1000px: nav collapses, grids stack · 700px: forms one column · 640px: tighter gutters (20px)

Buttons

.btnUsed on 236 pages: atol, customers, how-it-works, index …

Two weights only. Solid for the one action a section wants; ghost for the alternative. Mono, uppercase, square corners.

Markup
<div class="hero-ctas">
  <a class="btn btn-solid" href="#">Book a walkthrough</a>
  <a class="btn btn-ghost" href="#">See how it works</a>
</div>

Status labels inside ledgers and panels. Neutral by default; ok (green) for a settled state, warn (red) for one that needs action.

Pending In trust Awaiting balance
Markup
<span class="chips">
  <span class="chip">Pending</span>
  <span class="chip chip-ok">In trust</span>
  <span class="chip chip-warn">Awaiting balance</span>
</span>

Inner-page hero

.page-heroUsed on 235 pages: atol, customers, how-it-works, integrations …

The top of every inner page: breadcrumb, h1 with the muted <em> half and the purple caret, sub-copy, calls to action. The right column takes a ledger, a flow diagram or nothing. One terminal mark only: no full stop before the caret.

Solutions / Financial visibility

See the cash position behind every booking

One line that says who this page is for and what they get.

Markup
<section class="page-hero">
  <div class="wrap page-hero-grid">
    <div class="page-hero-left">
      <div class="crumb"><a href="#">Solutions</a>&nbsp;/&nbsp;Financial visibility</div>
      <h1>See the cash position behind <em>every booking</em><span class="caret" aria-hidden="true">_</span></h1>
      <p class="sub">One line that says who this page is for and what they get.</p>
      <div class="hero-ctas">
        <a class="btn btn-solid" href="#">Book a walkthrough</a>
        <a class="btn btn-ghost" href="#">Secondary action</a>
      </div>
    </div>
    <div class="page-hero-right">
      <!-- a .ledger, a .flow diagram, or leave empty -->
    </div>
  </div>
</section>

Section and section head

.sec-headUsed on 190 pages: atol, customers, how-it-works, index …

Every content band is a section.block with a wrap. The head pairs the h2 with a mono side label numbered in page order; sec-intro is the optional lead paragraph under it.

The money trail,
step by step.

// 01 — How it works

An optional lead paragraph. Keep it to two or three lines.

Markup
<section class="block">
  <div class="wrap">
    <div class="sec-head">
      <h2>The money trail,<br>step by step.</h2>
      <div class="side">// 01 — How it works</div>
    </div>
    <p class="sec-intro">An optional lead paragraph. Keep it to two or three lines.</p>
    <!-- section content -->
  </div>
</section>

Closing call to action

.ctaUsed on 235 pages: atol, customers, how-it-works, index …

The last band before the footer on most pages. The purple span carries the turn of the sentence.

See how this works around your bookings.

Bring one payment, reporting or cash-position problem. We will show how felloh connects the booking-level money trail behind it.

Book a walkthrough
Markup
<section class="cta">
  <div class="wrap">
    <h2>See how this works around <span>your bookings.</span></h2>
    <p>Bring one payment, reporting or cash-position problem. We will show how felloh connects the booking-level money trail behind it.</p>
    <a class="btn btn-solid" href="#">Book a walkthrough</a>
  </div>
</section>

Cards

.cardsUsed on 43 pages: atol, how-it-works, index, resources …

Three linked routes into deeper pages. Three across on desktop, stacked on mobile. Each card: tag, h3, one paragraph, a "more" link.

Collect

Payment Collection

Capture customer payments in whatever form they take, each one tied to its booking from the moment it arrives.

Explore payment collection
Operate

Financial Operations

Reconciliation, protected funds, settlements and supplier obligations in one booking-level ledger.

Explore financial operations
Optimise

Payment Optimisation

Tune cost and friction across the money trail.

Explore payment optimisation
Markup
<div class="cards">
  <div class="card">
    <div class="tag">Collect</div>
    <h3>Payment Collection</h3>
    <p>Capture customer payments in whatever form they take, each one tied to its booking from the moment it arrives.</p>
    <a class="more" href="#">Explore payment collection</a>
  </div>
  <div class="card">
    <div class="tag">Operate</div>
    <h3>Financial Operations</h3>
    <p>Reconciliation, protected funds, settlements and supplier obligations in one booking-level ledger.</p>
    <a class="more" href="#">Explore financial operations</a>
  </div>
  <div class="card">
    <div class="tag">Optimise</div>
    <h3>Payment Optimisation</h3>
    <p>Tune cost and friction across the money trail.</p>
    <a class="more" href="#">Explore payment optimisation</a>
  </div>
</div>

Numbered problems

.numsUsed on 68 pages: atol, index, resources, travel-payment-solutions …

Three numbered statements, usually the problem a page answers. No links.

01

First problem

One or two sentences on why it matters.

02

Second problem

One or two sentences on why it matters.

03

Third problem

One or two sentences on why it matters.

Markup
<div class="nums">
  <div class="num-cell"><div class="n">01</div><h3>First problem</h3><p>One or two sentences on why it matters.</p></div>
  <div class="num-cell"><div class="n">02</div><h3>Second problem</h3><p>One or two sentences on why it matters.</p></div>
  <div class="num-cell"><div class="n">03</div><h3>Third problem</h3><p>One or two sentences on why it matters.</p></div>
</div>

Numbered rows with a heading, a paragraph and mono key–value facts. Use for four or so parallel capabilities.

01

ATOL Reporting

ATOL and APC returns draw their figures from the booking-level payment and departure record.

Reportable value — Per bookingDrill-down — Live
02

Trustee Reporting

The protected portion of every customer payment stays visible at booking level.

Protected balance — LiveRelease events — Logged
Markup
<div class="states">
  <div class="state">
    <span class="s-num">01</span>
    <h3>ATOL Reporting</h3>
    <p>ATOL and APC returns draw their figures from the booking-level payment and departure record.</p>
    <div class="s-meta"><span>Reportable value — <b>Per booking</b></span><span>Drill-down — <b>Live</b></span></div>
  </div>
  <div class="state">
    <span class="s-num">02</span>
    <h3>Trustee Reporting</h3>
    <p>The protected portion of every customer payment stays visible at booking level.</p>
    <div class="s-meta"><span>Protected balance — <b>Live</b></span><span>Release events — <b>Logged</b></span></div>
  </div>
</div>

Steps

.stepsUsed on 1 page: how-it-works

Like the state list, for a sequence: the numbers mean order. Used for the process on How it works.

01

Capture

The customer pays through a link or checkout that already carries the booking reference.

Reference — Attached at capture
02

Match

Because the reference travels with the payment, allocation is automatic.

Allocation — Automatic
Markup
<div class="steps">
  <div class="step">
    <span class="s-num">01</span>
    <h3>Capture</h3>
    <p>The customer pays through a link or checkout that already carries the booking reference.</p>
    <div class="s-meta"><span>Reference — <b>Attached at capture</b></span></div>
  </div>
  <div class="step">
    <span class="s-num">02</span>
    <h3>Match</h3>
    <p>Because the reference travels with the payment, allocation is automatic.</p>
    <div class="s-meta"><span>Allocation — <b>Automatic</b></span></div>
  </div>
</div>

Replaces table

.sys-tableUsed on 1 page: how-it-works

What felloh replaces: the old way, the new way, and a status pair. Gone states are red with a cross; new states purple with a tick.

Bulk settlements allocated across bookings by hand Payments arrive already matched to the booking ManualAutomatic
The ATOL model that lives in one person's spreadsheet The return is a report anyone on the team can run Key-person riskShared
Markup
<div class="sys-table">
  <div class="sys-row">
    <span class="old">Bulk settlements allocated across bookings by hand</span>
    <span class="new">Payments arrive already matched to the booking</span>
    <span class="st gone">Manual</span><span class="st ok">Automatic</span>
  </div>
  <div class="sys-row">
    <span class="old">The ATOL model that lives in one person's spreadsheet</span>
    <span class="new">The return is a report anyone on the team can run</span>
    <span class="st gone">Key-person risk</span><span class="st ok">Shared</span>
  </div>
</div>

Question and answer pairs, side by side on desktop. Keep the FAQ JSON-LD in the page head in step with the visible questions.

How is available cash different from the balance in our bank account?

A bank balance mixes customer money with operating cash. felloh separates what has been received from what is protected or committed.

Can we trace a report figure back to individual bookings?

Yes. Every summary figure drills down to the booking-level movements that produced it.

Markup
<div class="faq">
  <div class="faq-item">
    <h3>How is available cash different from the balance in our bank account?</h3>
    <p>A bank balance mixes customer money with operating cash. felloh separates what has been received from what is protected or committed.</p>
  </div>
  <div class="faq-item">
    <h3>Can we trace a report figure back to individual bookings?</h3>
    <p>Yes. Every summary figure drills down to the booking-level movements that produced it.</p>
  </div>
</div>

Metric band

.metricsUsed on 1 page: integrations

A full-width band of three short claims under a hero. The purple span is the emphasis. Use words, not unsupported numbers.

API-first
Booking-system friendly
Receipt ✓
Payment data written back
Ledger ✓
Settlement context retained
Markup
<section class="metrics" aria-label="At a glance">
  <div class="wrap metrics-grid">
    <div class="metric"><div class="n">API<span>-first</span></div><div class="l">Booking-system friendly</div></div>
    <div class="metric"><div class="n">Receipt<span>&nbsp;✓</span></div><div class="l">Payment data written back</div></div>
    <div class="metric"><div class="n">Ledger<span>&nbsp;✓</span></div><div class="l">Settlement context retained</div></div>
  </div>
</section>

Principles

.principlesUsed on 1 page: integrations

Four short numbered principles, four across.

01

API-first when needed

Use APIs and webhooks to connect payments, bookings and finance systems.

02

Manual-friendly when useful

Start with payment links before investing in deeper automation.

03

Designed for finance control

Keep the payment evidence available for reporting.

04

Future-proof by design

Keep the identifier your team trusts at the centre.

Markup
<div class="principles">
  <div class="prin"><div class="n">01</div><h3>API-first when needed</h3><p>Use APIs and webhooks to connect payments, bookings and finance systems.</p></div>
  <div class="prin"><div class="n">02</div><h3>Manual-friendly when useful</h3><p>Start with payment links before investing in deeper automation.</p></div>
  <div class="prin"><div class="n">03</div><h3>Designed for finance control</h3><p>Keep the payment evidence available for reporting.</p></div>
  <div class="prin"><div class="n">04</div><h3>Future-proof by design</h3><p>Keep the identifier your team trusts at the centre.</p></div>
</div>

Booking ledger

.ledgerUsed on 62 pages: customers, how-it-works, resources, travel-payment-solutions …

The signature panel: one booking, its status chips, four money cells, the movements behind a figure, an optional timeline and a caption. Figures are illustrative; say so in the caption.

Markup
<div class="ledger" role="img" aria-label="Sample booking ledger: describe the figures here">
  <div class="ledger-head">
    <span class="id">BK-24-1187 — Canadian Rockies · 12 nights</span>
    <span class="chips"><span class="chip chip-ok">In trust</span><span class="chip chip-warn">Awaiting balance</span></span>
  </div>
  <div class="ledger-sub">J. Mitchell + 1 · 14 Sep – 26 Sep · Total £8,420</div>
  <div class="ledger-cells">
    <div class="lc"><span class="l">Received</span><span class="v">£4,210</span><span class="d">Collected to date</span></div>
    <div class="lc"><span class="l">Protected</span><span class="v">£2,940</span><span class="d">In trust until departure</span></div>
    <div class="lc"><span class="l">Committed</span><span class="v">£950</span><span class="d">Paid to suppliers</span></div>
    <div class="lc"><span class="l">Available</span><span class="v accent">£320</span><span class="d">Margin recognised</span></div>
  </div>
  <div class="movs">
    <div class="movs-h">Movements feeding “Received · £4,210”</div>
    <div class="mov"><span class="d-date">14 Jun</span><span class="d-desc">Deposit received — card payment · placed in trust</span><span class="d-amt">+£4,210</span></div>
  </div>
  <div class="ledger-time">
    <div class="tstep done">14 Jun<b>Booking created</b></div>
    <div class="tstep done">14 Jun<b>Deposit received</b></div>
    <div class="tstep done">18 Jun<b>Supplier deposit</b></div>
    <div class="tstep done">18 Jun<b>Margin recognised</b></div>
    <div class="tstep now">17 Aug<b>Balance due</b></div>
    <div class="tstep">12 Sep<b>Final supplier</b></div>
    <div class="tstep">14 Sep<b>Departure</b></div>
    <div class="tstep">26 Sep<b>Funds release</b></div>
  </div>
  <div class="ledger-cap">Sample booking — figures are illustrative</div>
</div>

Flow diagram

.flowUsed on 10 pages: atol, how-it-works, index, integrations …

The animated sources → felloh → outputs diagram. Do not hand-write this markup: add the page's wording to scripts/lib/flows.mjs (FLOWS for generated pages, HAND_FLOWS for hand-built ones) and the build draws it, with its CSS and pause-off-screen script.

FIG. 01 — From payment received to money put to work.
How to add it
// scripts/lib/flows.mjs
'platform/overview.html': {
  aria: 'Animated diagram: … describe the whole flow for screen readers',
  left: { label: 'SOURCES', cards: [BANK, ACQ, BOOK] },
  hub: { ref: 'BK-20417', chip: '✓ MATCHED' },
  back: { text: '⇄ STATUS BACK TO THE BOOKING' },   // or null
  right: { label: 'PUT TO WORK', cards: [
    { lab: 'LIVE RECONCILIATION', val: '£1,240 matched', chip: '● LIVE', tone: 'acc' },
    { lab: 'EVIDENCE TRAIL', val: 'Drill to the source', chip: '✓ CONNECTED' },
    { lab: 'PLAYBOOKS', val: 'Next step triggered', chip: '✓ AUTOMATED' },
  ] },
  cap: 'FIG. 01 — From payment received to money put to work.',
},
// then: node scripts/generate.mjs  (generated pages)
//       node scripts/apply-flows.mjs (hand-built pages)

Trail

.trailUsed on 1 page: walkthrough

A vertical spine of numbered steps; the last node is highlighted. Used beside the walkthrough form.

Caption for the trail
Markup
<div class="trail" role="img" aria-label="Steps: describe them here">
  <div class="trail-step"><span class="dot">01</span><div class="trail-node"><div class="t">Choose one booking</div><div class="d">A payment, refund or reporting problem</div></div></div>
  <div class="trail-step"><span class="dot">02</span><div class="trail-node"><div class="t">Trace the money trail</div><div class="d">Booking · bank · acquirer</div></div></div>
  <div class="trail-step"><span class="dot">03</span><div class="trail-node"><div class="t">Decide the next step</div><div class="d">No obligation</div></div></div>
</div>
<div class="trail-cap">Caption for the trail</div>

Form fields

.form-gridUsed on 1 page: walkthrough

A two-column grid of fields that collapses to one column under 700px. Add .full for a field that spans both columns. Selects carry the purple chevron, set in from the edge; an unanswered required select shows its placeholder muted.

A note under the form, for example how the data is used.

Markup
<form class="form-grid" action="#" onsubmit="return false">
  <div class="field"><label for="x-name">Your name</label><input id="x-name" name="name" autocomplete="name"></div>
  <div class="field"><label for="x-email">Work email</label><input id="x-email" name="email" type="email" autocomplete="email"></div>
  <div class="field"><label for="x-role">Your role</label><select id="x-role" name="role" required><option value="">Select…</option><option>Finance</option><option>Operations</option></select></div>
  <div class="field"><label for="x-sys">Booking system</label><select id="x-sys" name="system"><option>Travelgenix</option><option>Moonstride</option></select></div>
  <div class="field full"><label for="x-note">The one booking or workflow</label><textarea id="x-note" name="note" placeholder="Describe the problem you want us to trace."></textarea></div>
</form>
<p class="form-note">A note under the form, for example how the data is used.</p>

Library grid

.lib-gridUsed on 118 pages: integrations, resources/blog, resources/glossary, resources/knowledge-base …

Linked tiles for blog, knowledge base, glossary and integrations: four across, two on tablets. A group-h heads each group; an optional thumb sits at the top of a tile.

Markup
<div class="library">
  <div class="group-h"><span>A</span><span class="count">2</span></div>
  <div class="lib-grid" style="border-top:none">
    <a class="lib-cell" href="#"><span class="ty">Glossary term</span><h3>Acquirer</h3><span class="de">The provider that enables a merchant to accept card payments.</span><span class="go">Read term</span></a>
    <a class="lib-cell" href="#"><span class="ty">Glossary term</span><h3>APC</h3><span class="de">The ATOL Protection Contribution paid per protected passenger.</span><span class="go">Read term</span></a>
    <a class="lib-cell" href="#"><span class="ty">Guide</span><h3>Soft declines</h3><span class="de">Why a card is declined and when to retry.</span><span class="go">Read</span></a>
    <a class="lib-cell" href="#"><span class="ty">Guide</span><h3>Refund management</h3><span class="de">Keeping refunds tied to the booking.</span><span class="go">Read</span></a>
  </div>
</div>

Prose, jump links and figure

.proseUsed on 166 pages: company/cookie-policy, company/privacy-policy, company/team/adam-clark, company/team/april-wang …

Long-form article bodies. Jump links sit under the hero; figures carry a mono caption.

A section heading

Body copy at a comfortable measure, with inline links and inline code.

  • A list item
  • Another list item
A pulled quote or callout.
Travel by B Corp research
Insights — 2026-04-08 — Will Bicknell
Markup
<div class="jump"><a href="#">Why it matters</a><a href="#">How it works</a><a href="#">In felloh</a></div>
<div class="prose">
  <h2>A section heading</h2>
  <p>Body copy at a comfortable measure, with <a href="#">inline links</a> and <code>inline code</code>.</p>
  <ul><li>A list item</li><li>Another list item</li></ul>
  <blockquote>A pulled quote or callout.</blockquote>
</div>
<figure class="fig"><img src="assets/blog/travel-by-b-corp-research.jpg" alt="Travel by B Corp research"><figcaption class="fig-cap">Insights — 2026-04-08 — Will Bicknell</figcaption></figure>

Navigation and footer

The header, mega menus, mobile menu and footer at the top and bottom of this page are the real ones. Generated pages take them from scripts/lib/template.html; the hand-built pages (index.html, how-it-works.html, integrations.html, walkthrough.html, solutions/*.html) carry their own copy, so change those too when the menu changes. The current section is marked with class="nav-item current" and aria-current="page".

Page-only patterns

These live in a page's own <style> block because only one page uses them. Promote one into felloh.css, and add it here, the moment a second page needs it.

index.htmlHomepage hero and systems illustration (hero, sysx, sx-*), logo wall (logos, logo-grid), certifications strip (certs), outcomes grid, problem grid, pipeline (pipe)
how-it-works.htmlTwo-column cards variant and its ledger layout
integrations.htmlIntegration grid tiles where the type label is the title
solutions/*.htmlHero grid proportions and footer grid tweaks