← Experiments

A study after bonfirestudios.com

Keepers of the Flame

Pulse-pounding thrill, the warmth of belonging – Bonfire's whole brand is one metaphor carried through copy, palette, and motion without breaking stride.

Study 01 · Diorama hero

Teardown

What the source actually says

Everything below is read straight from the shipped CSS and JS bundles, not guessed from screenshots. The site is Next.js + DatoCMS + Mux video, animated with GSAP, ScrollTrigger, and Lenis.

01

One color does everything

Candlelight cream #fdecb4 appears 90 times in the CSS – text, buttons, focus rings, selection. The darks are warm browns (#402b2b, #1d1d20), never a cold black. Even the favicon swaps per color scheme.

02

Zero @keyframes in the CSS

Every entrance, parallax, and scroll effect is orchestrated in JS – one source of truth for choreography. CSS keeps only micro-state transitions (underline wipes, icon inverts). Grep the bundles: no @keyframes at all.

03

The hero is a diorama, not a shader

A streamed video base, CMS-positioned parallax layers driven by --posX/--posY/--order custom properties, a scrim, the logo. Depth from stacking. The real h1 sits screen-reader-only under the logo image.

04

Fluid type with a lock

clamp(min, calc(min + Δ·(100vw − 80rem)/40), max) – sizes interpolate only between 1280 and 1920 px and hold still everywhere else. No tiny phone text, no runaway ultrawide headlines.

05

Two typefaces, strict roles

Petit Serif for uppercase display (tight -0.02em tracking), PP Fragment Sans Light for everything else. Eyebrows get an extreme 0.5em letter-spacing – the quiet luxury signal. Titles mix in a smaller raised word via inline <i>.

06

Scrims are a component

G06Gradient takes color as RGB channel variables and direction/size as data-position / data-size attributes – twelve explicit stops instead of ad-hoc one-off gradients scattered through the codebase.

07

Atomic grammar, CMS-fed

Components are named A00PrimaryButton, M12VerticalBanner, C01ImmersiveHero, G06Gradient – atoms, molecules, sections, globals. The CMS feeds layout through custom properties, not through markup changes.

08

Hygiene you can't see

Logical properties throughout (inline-size, inset-block-start), content-visibility: auto on the hero, will-change only on animated nodes, focus outlines offset 10 px, a strict CSP header, disabled buttons that keep contrast.

Recreation

The type system

Instrument Serif and Geist Light stand in for Petit Serif and PP Fragment Sans Light. The heading below uses Bonfire's exact clamp formula – resize the window and watch the readout: it only moves between 1280 and 1920 px.

Eyebrow · letter-spacing 0.5em

Warmth is a design token

font-size: clamp(2rem, calc(2rem + 1 · (100vw − 80rem) / 40), 3rem) → currently

Body copy stays in the light sans with a positive 0.02em tracking – slightly airy, never crowded, and it holds the same cream at 62% opacity so hierarchy comes from tone, not from extra font weights.

Recreation

The primary button

Rebuilt 1:1 from A00PrimaryButton: the underline wipes in from the left and exits to the right (transform-origin flips between states), and the circled arrow inverts. The disabled state keeps its shape with an inset keyline instead of fading away.

Recreation

Scrims as a component

Bonfire's G06Gradient ships twelve explicit stops with the color split into RGB channel variables. Compare a naive two-stop fade, the shipped twelve-stop linear ramp, and an eased variant – watch the top edge of the scrim, where the two-stop version draws a visible line.

Detailed game artwork used as a scrim test subject

Recreation

The vertical banner

From M12VerticalBanner: a 4:5 card inside a preserve-3d tilt wrapper, a bottom scrim from the component above, and an uppercase serif title glowing through text-shadow: 0 0 40px #000. Move your cursor over the card.