Eldur Studio Design System Living style guide · source of truth: styles.css

01 — Brand

Eldur is Icelandic for fire.

A hot orange-on-black system for a B2B agency that installs AI agents. Confident, warm, technical. The wordmark is set in Kamura; everything else is Basier Circle. Orange (--orange) is the single accent — used sparingly against deep black and clean light-gray surfaces.

Wordmark on black
Eldur Studio
Wordmark on light
Eldur Studio

02 — Color

Palette & tokens

Every color is a CSS variable in :root. Reach for the token, never a raw hex. The flame gradient is reserved for the loudest moments (hero install, key CTAs, the timeline spine).

--gradient (flame)

03 — Typography

Type scale

Two families: Kamura (serif display — wordmark only) and Basier Circle (everything else, weights 400–700). Headlines run tight (-0.03em); body is a comfortable 1.65.

Hero headline
Basier 700
clamp 38–62px
Put an AI agent to work this week
Section title
Basier 700
clamp 28–42px
Agents that earn their seat
Lead
Basier 400
18px / 1.6
We design, build, and install custom agents into your stack — monitored, qualified, and reporting from day one.
Body
Basier 400
16px / 1.65
The workhorse paragraph size. Used in cards, FAQ answers, and long-form copy across the site. Readable, unhurried, never cramped.

04 — Spacing & Radii

Rhythm & corners

Generous vertical rhythm — sections breathe at 96px (64px compact). Three corner radii cover everything; the pill is now reserved for tags only.

Corner radii
12px
default
20px
cards
100px
tags only
TokenValueUse
--radius12pxButtons, inputs, install CTA, callouts
--radius-lg20pxCards, panels, modals
--max-w1160pxPage container
.section96pxVertical section padding (64px compact)

05 — Buttons

Buttons · updated

The pill is retired. Buttons are now a confident 12px rounded rectangle — bigger (16/30 padding, 17px → wait 16px/700), they lift 2px on hover with a flame glow, and a trailing icon nudges right. New .btn--gradient for flame moments.

Before → after
Schedule a call
Old · 100px pill
Schedule a call
New · 12px · lifts
Nav button (compact)
ClassUse
.btn--primaryMain action — orange fill, flame glow on hover
.btn--gradientLoud moments — flame orange→red (new)
.btn--ghostSecondary on dark (e.g. “View packages”)
.btn--outline-whiteTertiary on dark
.btn--whiteOn orange / CTA blocks
.btn--navCompact nav CTA (keeps small size)

Wrap a trailing icon in <span class="btn__ico"> so it nudges on hover.

06 — Install Agent

Install Agent CTA · new

The hero call-to-action. A bot with personality plus a built-in install animation: the flame gradient sweeps left→right, a percentage counts up, then it settles into “Agent installed ✓” and the bot bounces. Click a button below to play it.

Hero pairing — primary + secondary
View packages

Direction B (default .ia2--dark): black button, flame gradient fill.

Variants
States (driven via the JS API)

idle · installing (frozen mid-sweep) · done

StateMainSub
idleInstall agentSelf-service guided setup
installingInstalling…Provisioning your agent
doneAgent installedSetup complete
<!-- Hero: opens Stripe on click (no animation) --> <a class="ia2 ia2--dark" data-install-agent data-href href="…stripe…">…</a> // Setup page (post-payment): drive it from your code EldurInstallAgent.setState(el, 'installing'); // provisioning EldurInstallAgent.setState(el, 'done'); // guided setup complete

Real flow: hero = Stripe link → checkout → on success route to the setup page, which renders the controlled button and calls setState('installing') then setState('done'). A plain <button data-install-agent> with no data-href/data-controlled self-demos on click. Honors prefers-reduced-motion.

07 — Cards

Cards

Calm at rest. White (or --dark on black sections) with a hairline border and 20px radius. On hover the border turns orange; link cards now also lift.

outline · dark

Outline card. The default content surface — hairline border, white fill, generous 32px padding.

Dark card

For black sections. Muted body, yellow emphasis when needed.

08 — Agent Cards

Agent cards · updated

The icon tile now does the agent-bot wiggle on hover and the card lifts — the one sanctioned bit of personality, carried over from the Install Agent bot. Hover a card.

hover state (pinned)

Pinned hover

Orange border + soft orange shadow + 3px lift. The icon wiggle plays only on a real pointer hover.

09 — Buyable Agent

Buyable agent cards · new

Agents you can install without a conversation. .card--buy sits between .card--agent (illustrative, unpriced) and .card--package (priced, but needs a conversation). .buy-row puts the priced spotlight beside the free ones, which use .card--try. Both reuse .agent__icon and .ia2. Side by side above 900px, stacked below.

Hierarchy is deliberate. The spotlight keeps the orange left edge, the larger price and the solid .ia2--dark; .card--try drops the edge and steps down to .ia2--outline. Adding an orange edge to a .card--try flattens the two and defeats the row.

Self-service

Watchtower New

An agent that keeps a Webflow site up to date. It checks the site every week, fixes what it safely can on a private copy, and waits for your approval before anything goes live. Two change requests a month, by email.

Free

B2B Messaging Workshop

Build the messaging foundation your whole company can reuse. It guides you through company context, customer problems, competitive alternatives, personas, value, positioning, and proof: one focused question at a time.

$0
Install in CodexFree to install
<div class="buy-row"> <!-- priced spotlight --> <div class="card card--buy"> <div class="buy__main"> <div class="buy__head"> <div class="agent__icon">…</div> <div> <p class="buy__badge">…</p> <h3 class="buy__name">Watchtower <span class="badge-new">New</span></h3> </div> </div> <p class="buy__body">…</p> </div> <div class="buy__aside"> <div class="buy__price">$299<span class="buy__price-unit">/month</span></div> <a class="ia2 ia2--dark" data-install-agent data-href href="…" data-label="Install Watchtower" data-sublabel="Start with a free audit">…</a> </div> </div> <!-- free, one per extra agent --> <div class="card card--try"> <div class="agent__icon">…</div> <p class="buy__badge">Free</p> <h3 class="try__name">…</h3> <p class="try__body">…</p> <div class="try__price">$0</div> <a class="ia2 ia2--outline" data-install-agent data-href href="…" data-label="Install in Codex" data-sublabel="Free to install">…</a> </div> </div>

Set data-label and data-sublabel. On mount, install-agent.js rewrites .ia2-main / .ia2-sub from those attributes, falling back to “Install agent” — so custom copy written only into the markup gets overwritten. The icon uses currentColor and is tinted by the component, not a hard-coded hex.

.buy-row is a 1.5fr / 1fr grid. A second .card--try needs the columns widening (1.5fr 1fr 1fr) or it will squeeze the spotlight; past three, move the free agents to their own .cards row below.

badge-new — on a light and a dark surface
Watchtower New
Watchtower New

The label is color: inherit, so it takes the surrounding text colour and works on both surfaces unchanged. Orange text at 10px would sit near 2.9:1 against this tint and fail contrast, so the brand lives in the fill and the ring instead.

10 — Testimonial

Quote card · new

Deliberately plain. .quote adds only an attribution block to .card--outline, so it inherits the surface, border and hover already in the system. No avatars, no logos, no carousel: the quote is the content.

“We had a tight timeline and Eldur Studio helped us find the best solution and launch on time, without sacrificing results.”
Jay Crystal CEO, Configure 8
“Eldur Studio helped us stretch Webflow’s limits and has proven to be a fast and trustworthy partner. The quality of the work has been consistently great, the team is collaborative and has often helped us take our idea to the next level.”
Mirco Mattevi CPO, Scalapay
<figure class="card card--outline quote"> <blockquote class="quote__text">“…”</blockquote> <figcaption class="quote__by"> <span class="quote__name">Name</span> <span class="quote__role">Title, Company</span> </figcaption> </figure>

Note the two quotes above are different lengths but the names still line up. .quote__by uses margin-top: auto, so the attribution is pinned to the bottom of the card whatever the quote does. Use <figure> / <figcaption>, not a bare div: it is the correct pairing for a quote and its source, and screen readers announce the attribution with the quote.

11 — Packages

Pricing tiers

Package cards live on black. The featured tier swaps to an orange border over a warm tint.

01

Single Agent

2–3 weeks
  • One agent, fully installed
  • Monitored + reporting
  • 30-day tuning window

12 — Chips · Highlight

Small components

Chip (with left accent)
Auditable. Every decision the agent makes is logged.
Installed. Runs in your stack, not a dashboard.
Highlight callout
Agents don’t replace your team — they take the work no one had time for.

13 — Timeline

Process timeline

Week 1
Map
We find the highest-leverage agent for your funnel.
Week 2–3
Build
Designed, built, and tested against your real data.
Week 4
Install
Live in your stack, monitored and reporting.

14 — FAQ

FAQ (native accordion)

How long until an agent is live?

Most single agents are installed within 2–3 weeks, including a tuning window against your real data.

Does it run in our stack?

Yes — agents are installed into your tools and workflows, not a separate dashboard you have to babysit.