Brand system · v0.1

The Lore Design System

One palette, one set of marks, one voice — behind the site, the emails, and the room.

Lore sauna — thermal-treated alder woodLore cold plunge pool

Photography is the philosophy. Every image is real — our room, our water, our people. Authentic bathing, never stock.

Color

A palette on a temperature axis

190° Heat
Forest
#002b19
Dark grounds, dashed card frames, button borders. Not body text.
Beige
#f4efec
The most common section ground — sections paint it, never .page-wrapper. The body is White, and /faq, /blog and parts of / deliberately let it show. Also text on forest and other dark bands.
Orange
#ed6f2b
A spice. Announcement bar and the Best offer flag. Under 10% of a surface, one CTA per view.
46° Cold & rest
Plunge
#dce5ea
Button fills, the Every membership band, per-session pills.
Sage
#98b697
The rest temperature. The floating Book a session stamp.
Neutrals & inks
Black
#000000
All display and heading text, plus borders, dividers and rules on light. Translucent tints rebase on Black — rgba(0,0,0,α) — and stay literals, because Variables are opaque.
Muted
#6f6759
Secondary text: eyebrows, captions, notes. Never long body copy — and never substituted with Black at low opacity.
White
#ffffff
Text on forest grounds, and the purest surface where one is needed.
Line
#e2dacf
Hairlines and dividers inside cards and lists.
Rule Dotted
#b8ad9d
The 1px dotted rule that separates sections.
Inks, for text on their own ground
Orange Ink
#b34710
Section kickers and every uppercase CTA link on light. Darkened 2026-09-30 from #c14e12: now 4.81:1 on beige and 5.49:1 on white, so it passes AA at any size.
Plunge Ink
#436074
Required for text on a plunge ground. Plunge is bright enough to defeat Orange Ink (4.30:1) and Muted (4.37:1); Plunge Ink is 5.20:1. Body copy on plunge should be Black.
Measure

Spacing, shape and breakpoints

Spacing scale, 4px base
4px
Hairline gaps inside a control
8px
Label to value, chip padding
12px
List row padding
16px
Tight group separation, button gap
24px
Card padding, desktop page gutter
32px
Card padding on wide cards
48px
Section head to content
64px
Between major sections
Used unevenly on purpose: tight groups, generous separation, so rhythm carries hierarchy rather than uniform gaps. Page gutter runs 20px on mobile to 40px on desktop.
Shape
2px
Cards with the dashed forest frame
6px
Small controls
10px
Inputs, colour chips
14px
The ceiling for soft containers. Never higher
999px
Buttons, flags and chips only
Breakpoints
1440+
Base desktop. Content caps at 1440 with a 40px gutter
1280
Four-across card grids begin here
991
Tablet. Navbar collapses, three-up grids stack
767
Mobile landscape. Two-column grids go to one
478
Mobile portrait. Smaller display type, 20px gutter
Type

Louize & Chromatic Pro

The plunge still bites.

Chromatic Pro carries the body. Seventy-five minutes of heat, cold, and rest — towels, lockers and amenities included. Just bring a swimsuit.

Components

The recurring language

Bookings now available
Book now
HSA / FSA Eligible
Inline prose link

Peer-reviewed evidence sits behind every claim — see the research on cold immersion for sources.

Black, underlined 1px at 2px offset, Chromaticpro, Orange Ink on hover. Not Orange Ink at rest — it clears AA on beige at 4.81:1, but a page of orange links is noisy. The underline carries the affordance, so the colour can be Black at 18.4:1. Used on every citation link on /science.
Editorial pages

Long-form pages cap their content at 62rem and centre it. Above the heading sits a page opener: an Orange Ink kicker and a Muted lede capped at 46ch. A single full-bleed photo band — 440px desktop, 260px phone — punctuates the page where the subject changes. One per page; it is punctuation, not a gallery.

Live on /science and /protocols. Before this, both ran the full 1,320px viewport, roughly 150 characters a line.
Press strip & footer legal line

Press logos sit at 22px — 17px on phones — in grayscale at 0.72 opacity, wrapped and centred between dotted rules under a Muted label. The footer carries a quiet legal line beneath its links: Muted at .85rem, underlined, 4.89:1 on Beige.

0.55 opacity was tried first on the press strip and the lighter mastheads disappeared entirely.
Orange is a fill, Orange Ink is a text colour

Raw Orange never carries text. It measures 2.66:1 on Beige and 3.04:1 on White — below AA at any size. Star ratings, the 190° figure and every kicker use Orange Ink. White text on an orange surface needs Orange Ink as the ground (5.49:1), not Orange (3.04:1).

Fixed 2026-09-30 on .ug-stars, .ug-tstars, .pr-stars, .pr-review-stars, .dsx-deg and .pr-card-orange. Orange stays for the announcement bar, CTAs and fills.
Plunge grounds need Plunge Ink

Plunge is bright enough to defeat two tokens that pass everywhere else: Orange Ink is 4.30:1 on it and Muted is 4.37:1 — both fail. Plunge Ink is 5.20:1 and is the required ink there; body copy on a plunge ground should be Black.

Live on the home page studies link (.link-uppercase-cold) and the /splash-science kicker (.pr-kicker-cold). Separate classes, not combos: set_style replaces the whole class list and rejects multi-name lists, so there is no headless way to add a class to an element.
Translucent Beige on Forest: 0.75 is the floor

Beige at low alpha on Forest was used for small labels across the sweepstakes pages. 0.40 measures 3.30:1 and 0.50 measures 4.39:1 — both fail. 0.75 (8.14:1) is the floor for any Beige-on-Forest label.

Applied to .sb-signup-label, .sbm-lbl, .sbm-grand-value, .sbm-earn-head, .sbr-meta, .or-disclaimer and the .sb-sub-sm combo.
Minimum label size is 0.7rem

Labels at 8px and 9px were scattered through the splash pages. They are now 0.7rem (11.2px). Below that, uppercase type tracked at .22em stops being readable regardless of contrast — it is decorative, not informational.

Raised on .sbm-lbl, .sbm-earn-head, .pr-source, .pr-source-light and .sc-hero-loc.
Utility and machine-readable pages are real pages

/404, /401 and /llms-txt sat outside every audit because nothing links to them — and all three rendered in Arial. Webflow's stock utility markup carries no font-family, and /llms-txt was bare headings and paragraphs with no classes at all. Both utility pages also shipped with no h1.

.utility-page-wrap now declares the font; .llms-page grounds llms.txt in Beige at the 62rem measure. Check these explicitly — a crawl that follows links will never reach them.
Facts come from one file, never from a screenshot

Hours, prices, the address, session length — anything that appears on more than one surface — live in docs/facts.md in the repo. Copy them from there. The hours are Mon–Fri 7am–10pm, Sat–Sun 9am–10pm; a single session is $65 and memberships start at $140.

Cam's copy-deck is authoritative for voice and structure, not for numbers — it still says the club closes at 9pm. On 2026-09-30 five pages carried five different sets of hours, and the site-wide schema Google reads for the knowledge panel declared an 11pm close. Nothing failed. `node scripts/check-facts.mjs` now greps every published page for superseded values.
Marks

Brand marks

Lore badge — a bathing club for serious bathers
Center badge
Lore oval stamp — a bathing club for serious bathers, sage green
Stamp · sage
lore wordmark — primary logo
Wordmark
Lore lockup — lore wordmark with Hot. Cold. Human.
Lockup · hot.cold.human
Voice

Hot. Cold. Human.

Considered, sensory, understated. A fact, then the feeling. Every line should have a temperature.

Say
You made it through the cold.
The heat is better shared.
Not
Start your wellness journey.
Treat yourself to some me-time.

Booking day view

Live on /bookings and /membership. Replaces Arketa's seven-day scrolling embed with one day at a time, showing only sessions that can still be booked — nothing already started, nothing full. Specimens below use the real classes, so they change when the component changes.

The stock Arketa iframe stays in the page, hidden. If the schedule request fails the module removes itself and the iframe is what renders, so a failure looks like the old booking box rather than a broken page.

Day chip — default, selected, full

Band head

Morning
7:00am – 11:45am

Slot chip — default, scarcity, Members, Aufguss

Rules. Remaining counts appear only at three or fewer — “9 left” on most chips is noise. Scarcity is Orange Ink; restricted sessions take the Plunge ground with a Plunge Ink tag. Sessions are grouped by time of day, never by Arketa's session type, because those types overlap in time and produce chips out of chronological order. Day numerals set lining figures: Louize's default oldstyle 1 reads as a Roman I.