Brand system

Evolve

The visual system behind Evolve: The Restoration Mastermind, documented as it is actually built — every value below was read out of the shipping HTML, not specified for it. Counts show how many times each value appears across the 28 pages.


Foundation

How the system works

Four constraints shape every decision in this system. They are not incidental — they explain why the brand is expressed as copied CSS rather than a shared stylesheet.

No build step

Every page is a self-contained HTML file with inline <style> and <script>. Open it in a browser and it works.

HubSpot CMS is the target

Pages carry HubSpot template tags and are pasted into the CMS. The theme fights back, so overrides are defensive.

Tokens are copied, not imported

The :root block is duplicated per page. This is the system's single biggest source of drift.

No JS dependencies

All interactivity is vanilla JavaScript. Nothing is pulled from a package registry.


Logo

The mark, and how to get it

Every file below downloads on click. The white lockup is the master — the site is dark-ground-first, so it is the version in the nav on all 28 pages. The navy, blue and black versions are the same artwork recoloured for grounds the white one cannot sit on.

Primary lockup

Mark on its own

Banner — mark as watermark

Using it

The lockup is raster-only, at 268×80

There is no vector artwork anywhere on the site — every placement, including the nav, uses the same 268×80 raster. It holds up on screen and falls apart above roughly 270px wide. Anything printed, embroidered, or put on a banner needs vector art that does not currently exist in this library.

The app icon's navy is not a brand token

The favicon sits on #102B72, a blue that appears nowhere else in the system — --blue-navy is #0D2240. It is the one place the identity steps outside its own ramp.


Color

Blue is the whole identity

The palette is a single hue ramp from near-black navy to pale sky. There is no secondary brand color — contrast and depth come from position on the ramp, never from a competing hue.

Neutral ramp

A cool grey scale carries all body copy on light grounds. It runs slightly blue, which is why it sits under the accent without muddying.

50100200300400 500600700800900

Semantic aliases

Eight pages add a naming layer on top of the raw tokens. This is the more maintainable pattern and is worth extending to the rest — it lets a page change meaning without changing hex values.

AliasResolves toRole
--color-accent--blue-primaryLinks, primary actions
--color-accent-hover--blue-lightHover on accent
--color-text-primary--gray-800Body copy on light
--color-text-secondary--gray-600Supporting copy
--color-text-muted--gray-500Captions, meta
--color-bg-section--gray-50Alternating section ground
--color-bg-dark--blue-darkerDark section ground
--color-border--gray-200Dividers, card edges

Typeface

Poppins, doing every job

One family across the entire site. Both --font-display and --font-body resolve to Poppins, so hierarchy is built from weight, size, case and tracking alone — never from a second typeface. This page is set in it.

Get the font

The archive holds the full family — Thin through Black, every weight with its italic — plus the license. Six of those faces carry the site: Regular, Italic, Medium, SemiBold, Bold and ExtraBold. Install at least those, because the brand builds its hierarchy from weight alone, and a missing weight shows up immediately as a synthesized, slightly-wrong face.

18 faces · TrueType · 1.4 MB · SIL Open Font License 1.1 — free to install, embed and redistribute.

How it is loaded

A single identical request sits at the top of the <style> block on all 31 HTML files. There is no <link> tag and no preconnect anywhere in the site.

@import url('https://fonts.googleapis.com/css2?family=Poppins:ital,wght@0,300;0,400;0,500;0,600;0,700;0,800;1,400;1,500;1,600&display=swap');
FaceWeightRequestedActually used
Light300Yesnever used
Regular400Yes25 declarations
Medium500Yes91 declarations
SemiBold600Yes231 declarations
Bold700Yes87 declarations
ExtraBold800Yes66 declarations
Regular Italic400iYes20 declarations
Medium Italic500iYesnever used
SemiBold Italic600iYesnever used

Nine faces are requested; six carry the entire site. SemiBold 600 alone accounts for roughly two in five weight declarations — it is the true workhorse of the brand.

Specimen

800 · ExtraBold — display & section headings Restoration owners scale here ABCDEFGHIJKLMNOPQRSTUVWXYZ abcdefghijklmnopqrstuvwxyz 0123456789
700 · Bold — card titles, emphasis inside headings Built for the trade ABCDEFGHIJKLMNOPQRSTUVWXYZ abcdefghijklmnopqrstuvwxyz 0123456789
600 · SemiBold — buttons, eyebrows, labels · most-used weight Book a strategy session ABCDEFGHIJKLMNOPQRSTUVWXYZ abcdefghijklmnopqrstuvwxyz 0123456789
500 · Medium — nav links, stat labels, secondary UI Programs · Events · Resources ABCDEFGHIJKLMNOPQRSTUVWXYZ abcdefghijklmnopqrstuvwxyz 0123456789
400 · Regular — body copy, subtitles A mastermind ecosystem for restoration business owners who want to grow past the ceiling they have hit. ABCDEFGHIJKLMNOPQRSTUVWXYZ abcdefghijklmnopqrstuvwxyz 0123456789

Declaration & fallback

DeclarationWhereUses
'Poppins', sans-serifComponent-level rules69
'Poppins', sans-serif !importantbody, body * — HubSpot guard29

The font request is render-blocking

Poppins is pulled with @import from inside the page's own <style> block. The browser cannot discover the font stylesheet until it has downloaded and started parsing the page CSS, so the two requests run in sequence rather than in parallel. A <link> in the <head> would start the fetch immediately.

No preconnect to the font host

Not one page carries <link rel="preconnect" href="https://fonts.gstatic.com" crossorigin>. That leaves a full DNS lookup, TCP handshake and TLS negotiation on the critical path before the first glyph can download.

The fallback is a bare generic

The stack ends at sans-serif. With display=swap set, text paints first in whatever generic sans the OS picks — metrically nothing like Poppins, which is geometric with a tall x-height. The result is a visible reflow on every first load. A metric-compatible fallback would absorb most of it.

Three faces download unused

Light 300, Medium Italic 500 and SemiBold Italic 600 are requested but appear nowhere in the CSS. Trimming them from the URL is a free reduction with no visual consequence.


Text styles

How size, case and color combine

The system has one governing rule, and it is consistent enough across the site to be treated as law: as type gets smaller, it gets more uppercase and more letterspaced; as it gets larger, it gets tighter and stays sentence case. Nothing in between is uppercase.

4rem · 800 · sentence · -0.02emScale past the ceiling
2rem · 700 · sentence · -0.02emBuilt for the trade
1rem · 400 · sentence · normalBody copy sits at the neutral centre of the scale.
0.85rem · 600 · UPPERCASE · 0.15emWhy Evolve

Role specification

Every named text role in the system, as built. Where a role appears on both dark and light grounds, both colors are given — the site is dark-ground-first, so the dark value is the primary one.

RoleSizeWtCaseTrackingColor
Hero headlineclamp(2.5rem, 5vw, 3.5rem)800 Sentence uppercase on 6 heroes-0.02em--white
Hero eyebrow0.9rem500 Uppercase0.15em--blue-light
Hero subtitle1.25rem400 Sentencenormal--white / 70%
Section headingclamp(2rem, 4vw, 3rem)700–800 Sentence-0.02em--white · --blue-dark
Section eyebrow0.85rem600 Uppercase0.15em--blue-primary · --blue-accent
Section lede1.1rem400 Sentencenormal--gray-600
Card title1.35–1.4rem700 Sentencenormal--white · --blue-dark
Stat number4rem800 normal--white
Stat label1rem500 Sentencenormal--white / 85%
FAQ question1.05rem600 Sentencenormal--blue-dark
Button label1rem600 Sentencenormal--blue-dark on white
Nav CTA label0.9rem600 Sentencenormal--blue-dark on white
Nav link0.95rem500 Sentencenormal--white / 90%
Footer link0.95rem400 Sentencenormal--white / 80%
Body copy1rem400 Sentencenormal--gray-600 · --gray-800

Case rules

Of 132 text-transform declarations across the site, 118 are plain uppercase and they cluster almost entirely on labels at 0.85–0.9rem. The remainder are deliberate exceptions.

Eyebrow tracking is split two ways

.section-eyebrow and .section-label are the same component with two names, and their tracking is inconsistent: 0.15em on some pages, 0.1em on others, with 0.05em, 0.08em and 0.25em also in circulation. Pick one — 0.15em is the most common — and collapse the two class names into it.


In composition

The stacks, as they really appear

Individual roles matter less than the combinations they form. Every block below is a pattern that repeats across the site, built with the real specifications and set in real copy taken from the live pages. Colors are literal brand values, not this document's theme — each scene shows what a visitor actually sees.

The Restoration Mastermind

Double Your Restoration Business Without Burning Out

Scale with systems. Lead with confidence.

Book a Strategy Session
Hero · dark ground — eyebrow 0.9/500/caps/0.15em → headline clamp(2.5–3.5rem)/800/-0.02em → subtitle 1.25/400/70% → pill 1rem/600 inverted
Made for restoration owners

Find the Right Evolve Program for Your Stage of Growth

Tactical playbooks, weekly coaching, and a peer community built around the way restoration businesses actually grow.

Section header · light ground — label 0.85/600/caps/0.15em in --blue-primary → heading clamp(2–3rem)/700/-0.02em in --blue-dark → lede 1.1/400/lh 1.8 in --gray-600
Client Wins

Built by Restoration Owners, For Restoration Owners

The same header stack, inverted. Only two things change: the label moves to --blue-accent and the heading goes white.

Section header · dark ground — identical geometry to the light variant; label swaps to --blue-accent, heading to --white, lede to white at 70%
2xAverage Revenue Growth
35%Average Margin Improvement
100+Restoration Owners Coached
15+Years Industry Experience
Proof row — number 4rem/800/lh 1 → label 1rem/500 at 85% white. The only place 800 weight appears without a heading around it.

Accelerator Program

Tactical playbooks, weekly coaching, and a peer community for owners building their first systems.

Boardroom Program

Executive-level strategy and elite peer advisory built for the complexity of the $5MM–$20MM stage.

Card pair · tinted ground — title 1.35rem/700 in --blue-dark → body 1rem/400/lh 1.7 in --gray-600. No eyebrow inside cards — the section header carries it.
Pod Size6–8 Members3 Accelerator + 3–5 Evolve
Frequency2x / Month20 minutes per session
FacilitatorMatt BalducciExpanding to community
Spec block — the three-tier pattern: caps eyebrow 0.75/600/0.15em → value 1.25rem/600 white → detail 0.85rem/400 at 60%. Used wherever a program is described in facts.
What happens on a strategy session?+

Thirty minutes with a coach who has run a restoration business. You leave with a written next step, whether or not you join a program.

FAQ item — question 1.05rem/600 in --blue-dark → answer 1rem/400/lh 1.7 in --gray-600. Question and answer sit only 0.05rem apart in size; weight alone separates them.

Ready to scale past the ceiling?

Clarity, focus, and momentum — without distraction.

Book a Strategy Session
Closing CTA band · 135° gradient — heading clamp(2–2.75rem)/800 white → subtitle 1.15rem/400 at 85% → white pill. No eyebrow: the band is terminal, so nothing labels it.

Contrast of these combinations

Measured on the real pairs above against WCAG 2.1 AA — 4.5:1 for text under 24px, 3:1 for larger or bold display type.

CombinationRatioRequiredResult
Hero eyebrow --blue-light on navy3.874.5fails AA
Section label --blue-accent on navy4.834.5passes
Section eyebrow --blue-primary on white6.164.5passes
Hero subtitle, white 70% on navy8.403.0passes
Nav link, white 90% on darker13.954.5passes
Footer link, white 80% on darker11.284.5passes
Body --gray-600 on white7.564.5passes
Body --gray-600 on --off-white7.224.5passes
Button label --blue-dark on white pill14.484.5passes
White on --blue-primary6.164.5passes

The hero eyebrow is the one failing combination

--blue-light #3b7dd8 at 0.9rem on --blue-navy measures 3.87:1 against a 4.5:1 requirement. The fix is already in the system: the same role on section headers uses --blue-accent #4a90e2, which measures 4.83:1. Switching hero eyebrows to --blue-accent resolves it with no new color and no visible change in character.


Layout

One container, two breakpoints

Content sits in a 1200px container. The system has two real breakpoints — 1200px where the nav collapses, and 768px where everything stacks. A handful of pages introduce others; treat those as exceptions, not options.

TokenValueRoleUses
Container1200pxStandard content width118
Wide container1400pxFull-bleed galleries, marquees20
Reading column700–900pxProse, forms, legal pages63
Breakpoint · tablet1200pxNav collapses to hamburger28
Breakpoint · mobile768pxGrids stack to single column72
Section rhythm5rem / 6rem / 8remVertical padding, light to heavy17

Shape & depth

Pills and soft cards

Two shape ideas carry the whole system: fully-round pills for anything actionable, and generously rounded rectangles for anything containing content.

RadiusApplied toUses
50pxButtons, badges, pills — the signature shape81
50%Avatars, icon circles, play buttons66
16pxLarge cards, feature panels63
12pxStandard cards, inputs, media63
20pxOversized feature panels27
8pxSmall chips, inline elements13

Elevation

Shadows are pure black at low alpha, blurred wide and offset down. They read as depth against dark grounds rather than as drop shadows.

LevelValueUses
Subtle0 4px 30px rgba(0,0,0,.15)15
Card0 8px 25px rgba(0,0,0,.2)21
Raised0 10px 40px rgba(0,0,0,.3)25
Modal0 15px 40px rgba(0,0,0,.3)8
Overlay0 24px 48px rgba(0,0,0,.4)6

Gradients

Always 135°, always within the ramp

Gradients move along the blue ramp at a consistent 135° diagonal. They never cross hues.

--blue-primary → --blue-dark · 16 uses · primary CTA bands
--blue-dark → --blue-darker · 8 uses · deep section grounds
#1a1f26 → #0d1117 · 6 uses · charcoal, hardcoded

Image overlays use a separate pattern — linear-gradient(to top, var(--blue-navy), transparent) — to seat photography into a dark section without a hard edge.


Components

The recurring pieces

Buttons

One shape, three treatments. Pill radius, 1rem 2rem padding, weight 600, 0.3s ease transition. On dark grounds the primary button inverts to white with dark text — that inversion is the system's most recognizable move.

Primary on light Inverted on dark Ghost

Eyebrow label

0.85rem, weight 600, uppercase, 0.1em tracking, accent blue, 1rem margin below. Precedes almost every section heading.

Navigation

Fixed, rgba(--blue-darker, .95) with a 10px backdrop blur and a 1px white-10% bottom border. Logo at 40px, 30px on mobile.

Partners marquee

Cards cloned in JS to fill the viewport, widths measured, keyframes generated at runtime. Pauses on hover and on mobile tap.

FAQ accordion

Click toggles an .open class. Height animates; the chevron rotates. No library.

Video lightbox

Modal overlay with a circular play button at border-radius: 50%, play/pause toggle, click-outside to close.

Payment overlay

Slides up from the bottom edge carrying the HubSpot payments iframe. Radius 24px 24px 0 0.


Motion

Enter once, then hold still

Motion is reserved for entrances. Content fades up as it scrolls into view, driven by an Intersection Observer toggling a .visible class. Nothing loops except the partners marquee.

PropertyValue
Scroll entranceopacity 0→1, translateY(40px)→0
Entrance timing0.8s cubic-bezier(0.16, 1, 0.3, 1)
Interactive transitionall 0.3s ease
Slow transitionall 0.4s ease
Marqueeinfinite linear translateX, keyframes built in JS

Platform

Surviving the HubSpot theme

HubSpot's theme CSS loads after the page's own styles and will override them. These defensive rules are mandatory, not stylistic.


Audit

Where the system has drifted

Because tokens are copy-pasted rather than imported, pages have fallen out of sync. None of these break anything today — they are the places where the next change will cost more than it should.

One token, two values

--off-white is #f8fafc on 23 pages and #FDF8F3 on event-couples_2026.html — a cool grey and a warm cream sharing a name. Rename the warm one.

An undocumented second palette

event-couples_2026.html also introduces --gold #C9A227, --gold-dark #A68520 and --tan #C4B5A5. If that palette is intentional for couples events, it belongs in this document as a named sub-brand. If not, it should go.

Charcoal is not tokenized

The #1a1f26 → #0d1117 gradient appears on 6 pages as raw hex with no variable behind it. It is effectively a fourth dark ground operating outside the ramp.

Token coverage is uneven

--blue-darker is defined on 29 pages but --blue-primary on only 25, and the semantic alias layer on just 8. Pages are not starting from the same base.

Fifteen button classes, two designs

cta-btn, btn-primary, final-cta-btn, team-card-btn, resource-card-btn and ten more mostly render the same pill. One .btn base with modifiers would collapse them.

No shadow scale

Over 25 distinct box-shadow values are in use where five levels would cover every case. Only one page defines --shadow-sm/md/lg.

Breakpoints beyond the documented two

Alongside 1200px and 768px, the site uses 900, 968, 1000, 700, 650, 600 and 480px. Each one is a place where layout can break without anyone noticing.