FD4 Style Guide
Last updated Feb 1, 2026 | Back to site

FD4.AI Design System

Warm Dusk

The visual language of fd4.ai. A system built around ink-dark navy, warm parchment, Stripe Press-inspired book textures, and the tension between editorial serif and modern geometric sans-serif.

1. Guiding Principles

FD4 feels like a private library at dusk: warm, textured, and intellectually inviting. Every choice serves this mood.

Quiet Authority

No hero images. No decorative illustrations. The books themselves are the visual identity. Typography, color, and texture do all the heavy lifting.

Tactile Craft

Cloth-bound book textures, grain overlays, 3D perspective, and real page edges create a sense of physical materiality in a digital medium.

Glass Morphism

Buttons and cards use translucent backgrounds with visible borders rather than solid fills. Interactions feel light, layered, and precise.

Dual Theme, One Soul

Dark and light modes share identical structure but different palettes. Dark mode is the default (the dusk mood). Light mode is warm parchment, never clinical white.

2. Color Palette

Two theme palettes built from three material references: ink-dark navy, warm parchment, and ember-orange. Both themes share the same accent hues but at different saturation levels.

Dark Theme (Default) — Warm Dusk

Base
#1a1a2e
Surface
rgba(255,255,255, 0.04)
Text Primary
#f0eee6
Text Secondary
#b8b5ad
Text Muted
#8b8b9e
Text Subtle
#6b6b80
Accent Orange
#e8884e
Accent Pink
#f4b8c1

Light Theme — Warm Parchment

Base
#f8f6f1
Surface
rgba(0,0,0, 0.03)
Text Primary
#1a1a2e
Text Secondary
#4a4a5a
Accent Orange
#d07038
Accent Pink
#c4707e

Logo Gradient

The FD4 circle icon uses a four-stop vertical gradient from warm amber to deep rust.

0%: #e8884e
30%: #e87040
65%: #d65a3a
100%: #bf4530

Detail View Palette (Always Light)

When a book is opened, the detail view always uses a light parchment background regardless of the current theme. This ensures book covers maintain their visual impact.

Detail Background
#f8f6f1
Detail Text
#1a1a2e
Detail CTA
#d07038

CSS Custom Properties

--bg-base: #1a1a2e; /* Main background */ --bg-surface: rgba(255,255,255,0.04); /* Card/surface fill */ --bg-surface-hover: rgba(255,255,255,0.07); --bg-overlay: rgba(26,26,46,0.95); /* Modal overlays */ --text-primary: #f0eee6; /* Headings, body */ --text-secondary: #b8b5ad; /* Descriptions */ --text-muted: #8b8b9e; /* Captions, labels */ --text-subtle: #6b6b80; /* Watermarks, hints */ --accent-orange: #e8884e; /* Primary accent */ --accent-pink: #f4b8c1; /* Secondary accent */ --border-subtle: rgba(255,255,255,0.08); --grain-opacity: 0.03; /* Film grain strength */

3. Typography

Two typeface families create the editorial tension at the heart of FD4: a literary serif for presence and a geometric sans-serif for clarity.

Newsreader (Serif) — Voice & Emotion

Used for all headings, hero text, book titles, taglines, and article body copy. Variable optical sizing from 6pt to 72pt. Loaded from Google Fonts.

Newsreader 400 · 48px · Hero heading
Ideas for building marketing that matters
Newsreader 500 · 36px · Detail title
How Box Created and Led the Cloud Content Management Category
Newsreader 400 Italic · 18px · Tagline / subtitle
CMO Wingman for the AI era
Newsreader 400 · 19px / 1.75 · Article body
When Box decided to build the cloud content management category instead of fighting for position in legacy enterprise software spaces, they invested heavily in analyst relations, picked a simple descriptive name, and defined the rules that would let them dominate the market.

Satoshi (Geometric Sans) — Precision & Function

Used for body text (non-article), navigation, buttons, labels, and UI elements. Loaded from Fontshare. Weights: 400, 500, 700.

Satoshi 700 · 14px · Uppercase label
Featured Article
Satoshi 500 · 14px · Button / CTA
Take the Assessment
Satoshi 400 · 17px / 1.6 · Description text
A collection of frameworks, guides, and insights from two decades of B2B marketing leadership.
Satoshi 400 · 14px · Navigation link
Advisory    Newsletter    About

Type Pairing Rules

ContextFamilyWeightSizeNotes
Page headingNewsreader400clamp(28px, 4vw, 42px)Hero H1, never bold
Section headingNewsreader400–50028–36pxDetail titles
Book cover titleNewsreader50034pxStanding book detail view
Spine titleNewsreader50022px desktop / 15px mobileMax 2 lines, center-aligned
Article bodyNewsreader40019px / 1.75Blog content only
Body textSatoshi40017px / 1.6Descriptions, cards
Category labelSatoshi500–70012pxUppercase, 2px tracking
Button textSatoshi50014pxCTA buttons
NavigationSatoshi40014px60% opacity, hover 100%
Footer / metaSatoshi40014pxMuted color

Font Loading

<!-- Newsreader: Google Fonts --> <link href="https://fonts.googleapis.com/css2?family=Newsreader:ital,opsz,wght@0,6..72,400;0,6..72,500;1,6..72,400&display=swap" rel="stylesheet"> <!-- Satoshi: Fontshare --> <link href="https://api.fontshare.com/v2/css?f[]=satoshi@400,500,700&display=swap" rel="stylesheet">

4. Textures & Material

Inspired by Stripe Press cloth-bound books. Every book cover uses a base canvas weave plus an optional variant layer. The overall page has a subtle film grain.

Film Grain (Full Page)

A fixed-position SVG noise filter covers the entire viewport. Opacity differs by theme: 3% dark, 2% light. Creates a warm, analog film quality.

background-image: url("data:image/svg+xml,...feTurbulence type='fractalNoise' baseFrequency='0.8'..."); opacity: var(--grain-opacity); /* 0.03 dark, 0.02 light */ pointer-events: none; z-index: 1000; /* Always on top of everything */

Book Cover Textures

Four texture variants that simulate real cloth-bound book finishes. Each combines a base canvas weave (6px crosshatch grid) with an optional second layer.

Base Canvas

Default weave. Tight 6px crosshatch grid with cloth noise.

Grainy

Heavier weave threads (1.1px vs 0.9px) and stronger noise (28% vs 22%).

Molluscan

Canvas weave + scattered white dot particles + dual radial glow (orange/pink).

Matter

Canvas weave with dominant horizontal fibers (thicker horizontal strokes, thinner vertical).

Cover Light Effects

Each book cover has a ::after pseudo-element that adds a subtle top-to-bottom lighting gradient, simulating real overhead lighting hitting a physical book.

/* Light gradient overlay on every cover */ .book-cover::after { background: linear-gradient( 180deg, rgba(255,255,255, 0.15) 0%, /* highlight at top */ rgba(255,255,255, 0.04) 25%, /* fading */ transparent 50%, /* neutral middle */ rgba(0,0,0, 0.15) 100% /* shadow at bottom */ ); }

Scroll Glow Effects

Two fixed-position radial gradient layers create warm ambient light pools as the user scrolls through the library. Different intensities for dark/light themes.

Glow 1: Orange at 25% left, Pink at 75% left
Dark: 10%/5% opacity
Light: 4%/2% opacity

5. Components

Buttons — Glass Style

All buttons use a translucent tinted background with a visible colored border. Never solid fills. Hover lifts by 2px with a soft glow shadow.

/* Glass button pattern */ background: rgba(232, 136, 78, 0.08); /* 8% orange tint */ border: 1px solid rgba(232, 136, 78, 0.4); /* 40% orange border */ color: #e8884e; border-radius: 8px; padding: 14px 28px; /* Hover: increase tint + border + lift */ :hover { background: rgba(232, 136, 78, 0.14); border-color: rgba(232, 136, 78, 0.55); transform: translateY(-2px); box-shadow: 0 4px 16px rgba(232, 136, 78, 0.12); }

Glass Cards

Surface-level containers with backdrop blur and subtle borders. Featured cards get a stronger orange accent border.

Standard Card

Background: surface + backdrop blur. Border: subtle. Hover: surface-hover + orange border.

/* Standard glass card */ background: var(--bg-surface); backdrop-filter: blur(12px); border: 1px solid var(--border-subtle); border-radius: 16px; padding: 32px; /* Featured variant */ border: 2px solid rgba(232, 136, 78, 0.5);

Theme Toggle

40px rounded square button. Shows sun icon in dark mode (click for light), moon in light mode (click for dark). Stored in localStorage('fd4-theme').

Dark mode active (sun icon visible)
Light mode active (moon icon visible)

Navigation Dots

Vertical progress indicators fixed to the left viewport edge. Thin orange bars that expand on hover/active state.

3px wide, 16px inactive / 24px active, orange glow on active

Capsules & Badges

Small label elements used to tag content types, categories, and status. Always uppercase Satoshi with wide letter-spacing. Three roles: colored type badges, eyebrow category labels, and neutral metadata tags.

Type Badges (colored, small)
Landing Blog Framework Newsletter Draft

10px / 600 weight / 3px 8px padding / 4px radius. Orange for landing/interactive content. Pink for articles/blog. Muted for neutral status.

Category Capsules (medium)
Strategy Interactive Assessment Featured Article Guide

12px / 600 weight / 4px 12px padding / 4px radius. For larger contexts like card headers or filter bars.

Eyebrow Labels (text-only)
Strategy Featured Article CMO Wingman Services

12px / 500 weight / 2px letter-spacing / no background. Used above headlines in detail views and page heroes. Muted by default, accent orange for emphasis.

VariantSizePaddingWeightBackgroundUsage
Type badge (sm)10px3px 8px600Translucent tint + 1px borderBook type, content status
Category (md)12px4px 12px600Translucent tint + 1px borderCard headers, filter pills
Eyebrow label12pxnone500none (text-only)Above headlines, section intros
/* Type badge (small, colored) */ font-family: 'Satoshi', system-ui, sans-serif; font-size: 10px; font-weight: 600; text-transform: uppercase; letter-spacing: 0.08em; padding: 3px 8px; border-radius: 4px; /* Orange variant */ background: rgba(232, 136, 78, 0.08); color: #e8884e; /* dark */ | #d07038 /* light */ border: 1px solid rgba(232, 136, 78, 0.2); /* Pink variant */ background: rgba(244, 184, 193, 0.06); color: #f4b8c1; /* dark */ | #c4707e /* light */ border: 1px solid rgba(244, 184, 193, 0.2); /* Eyebrow label (no background) */ font-size: 12px; font-weight: 500; letter-spacing: 2px; text-transform: uppercase; color: var(--text-muted); /* or var(--accent-orange) for emphasis */

Side Icons

Circular 40px icons fixed to the bottom-left of the viewport. Surface background with current-color SVG fill.

LinkedIn, Calendly — scale(1.1) on hover

6. Layout & Spacing

Spatial System

TokenValueUsage
Page padding48px / 24px mobileAll horizontal page padding
Section gap150pxBetween book cards in the library
Component gap80pxBetween book and detail text
Card padding32pxInterior padding for glass cards
Content max-width880pxLibrary book stack
Detail max-width1300pxDetail view hero area
Article max-width740pxBlog article column
Header padding24px 48pxFixed header spacing

Page Anatomy

The homepage has two states that toggle without page navigation: Library View (scrollable book stack) and Detail View (fixed overlay with book + content).

Library View
Library View

Fixed elements: Header, nav dots, side icons, grain, scroll glows
Scrollable: Hero section → Book stack (150px gap) → Footer
Background: Themed (dark/light via data-theme)

Detail View
Detail View

Fixed overlay: Standing book (left) + text (right), centered
Blog mode: Scrollable column — hero at top, article below
Background: Always #f8f6f1 (warm parchment), ignores theme

Breakpoints

BreakpointBehavior
> 900pxFull desktop: sidebar nav dots, side icons, desktop nav, 48px padding
≤ 900pxMobile: hamburger menu, 24px padding, stacked detail view, hidden nav dots + side icons, smaller book dimensions

7. 3D Book System

The books are the visual centerpiece. Two distinct 3D presentations: flat-laying library view and upright detail view, both using CSS 3D transforms.

Library Book (Horizontal / Flat-Lying)

PropertyValue
Aspect ratio5.625 : 1
Max width720px
Perspective1200px
RotationrotateX(55deg) at center, dynamic 42°–118° based on scroll position
Spine height90px desktop / 60px mobile
Hover effecttranslateY(-8px) lift, enhanced shadow
Scroll animationScroll-based rotateX interpolation with IntersectionObserver fade-in

Detail Book (Standing / Upright)

PropertyValue
Dimensions420 × 570px desktop / 260 × 350px mobile
Perspective1200px
RotationrotateY(-25deg) rotateX(5deg)
Hover rotationrotateY(-15deg) rotateX(3deg) translateY(-10px)
Spine width65px
Page edges65px bottom, multi-stop beige gradient
Cover typographyTitle 34px/500, Subtitle 15px uppercase, Author 18px
Shadow8px 8px 30px rgba(0,0,0,0.3), 20px 20px 60px rgba(0,0,0,0.2)

Page Edges

The standing book bottom edge uses a multi-stop gradient to simulate stacked paper pages.

background: linear-gradient(to bottom, #f5f5f0 0%, /* top page */ #e8e8e0 20%, /* shadow line */ #f0f0e8 40%, /* page */ #e5e5dd 60%, /* shadow line */ #f2f2ea 80%, /* page */ #f5f5f0 100% /* bottom page */ );

Book Color System

Each book stores 6 color values in the database. Cover and spine have independent primary/secondary gradients and text colors, allowing full creative control per book.

FieldUsage
color_primaryCover gradient start
color_secondaryCover gradient end
color_textCover title/subtitle/author color
color_spine_primarySpine gradient start
color_spine_secondarySpine gradient end
color_spine_textSpine title/author color

8. Blog Article Typography

Blog-type books display their article content below the hero. The reading experience uses a distinct serif-first type stack optimized for long-form content.

Article Type Stack

ElementFamilySizeLine HeightNotes
Body textNewsreader19px / 17px mobile1.75Max-width 740px, auto margins
H2Newsreader 50028px / 24px mobile1.348px top / 20px bottom margin
H3Newsreader 50022px1.3536px top / 16px bottom margin
ParagraphNewsreader 40019px1.7524px bottom margin
BlockquoteNewsreader 400 italic19px1.753px orange left border, 24px left padding
LinksinheritinheritinheritOrange color, underline, 3px offset
Horizontal rule1px rgba(0,0,0,0.1), 40px vertical margin
Source linkSatoshi 50014pxOrange, below 1px border-top

9. Motion & Transitions

Motion is subtle and purposeful. Everything eases gently, never bounces or overshoots. The goal is fluidity, not flashiness.

Transition Defaults

ContextDurationEasing
Hover effects (buttons, icons)0.2s–0.3sease
Theme switching (bg, color)0.6sease
View transitions (library/detail)0.5sease
Book hover lift0.4sease
Standing book hover0.6scubic-bezier(0.23, 1, 0.32, 1)
Scroll reveal (books)0.8sease
Hero text entrance0.8sease, staggered 0.2s

Key Animations

/* Entrance animation (hero text, page elements) */ @keyframes fadeUp { from { opacity: 0; transform: translateY(20px); } to { opacity: 1; transform: translateY(0); } } /* Book scroll reveal */ .book-wrapper { opacity: 0; transform: translateY(40px); transition: opacity 0.8s ease, transform 0.8s ease; } .book-wrapper.visible { opacity: 1; transform: translateY(0); } /* Detail view entrance */ .detail-content { opacity: 0; transform: translateY(20px); transition: opacity 0.5s ease 0.3s, transform 0.5s ease 0.3s; } /* Theme toggle hover */ .theme-toggle:hover svg { transform: rotate(15deg); }

10. Brand Mark & Logo

FD4 Circle Mark

The logo is a pure SVG circle with gradient fill, horizontal stripe motif, and bold "FD4" lettering. Three sizes are used across the site.

FD4
Header (36px)
FD4
Footer (32px)
FD4
Book spine (28px)

The spine variant uses currentColor instead of a gradient, so it inherits the book's spine text color.

Logo Lockup

FD4 François Dufour CMO Wingman for the AI era

Name in Newsreader 500 at 15px. Tagline in Newsreader 400 italic at 14px, 60% opacity. Tagline hidden on mobile (shown below logo on wrap).

Favicon

SVG favicon: ink-navy circle with orange accent stripes and parchment-colored "FD4" text. Inverted from the main logo to read well at small sizes.

<link rel="icon" type="image/svg+xml" href="/favicon.svg"> /* Navy bg (#1e2040 → #14162a), orange stripes at 25% opacity, parchment text (#e8ddd0) */

11. Technical Stack

Frontend

ToolPurposeNotes
Vanilla HTML/CSS/JSHomepage, detail viewsNo framework. Pure CSS custom properties for theming.
Alpine.jsAdmin panel reactivityCDN loaded. x-data, x-model, x-show directives.
Tailwind CSS (CDN)CMO Wingman pageRuntime CDN only. Custom config extends Satoshi + base colors.
marked.jsMarkdown renderingCDN loaded. Used for blog article content.
SortableJSAdmin drag-and-dropCDN loaded. Book ordering in admin panel.

Backend & Infrastructure

ToolPurpose
VercelHosting + serverless API functions (Hobby plan, 60s max timeout for ingest)
Supabase (PostgreSQL)Books, blog posts, palettes. Row-level data.
Anthropic SDKClaude Haiku for AI-powered article cleanup during ingestion

Theme Implementation

<!-- Must run before CSS to prevent flash of wrong theme --> <script> (function() { const saved = localStorage.getItem('fd4-theme'); const theme = saved || 'dark'; // Dark is always the default document.documentElement.setAttribute('data-theme', theme); })(); </script> /* CSS: all colors via custom properties */ :root { /* dark values */ } [data-theme="light"] { /* light overrides */ } /* Theme switch transitions */ body { transition: background 0.6s ease, color 0.6s ease; }

12. Do & Don't

Do

  • Use translucent glass backgrounds, never solid fills
  • Keep Newsreader for emotional/editorial content
  • Keep Satoshi for functional/UI text
  • Use the orange accent sparingly (borders, links, active states)
  • Maintain the warm parchment (#f8f6f1) for light backgrounds
  • Apply grain overlay to every page
  • Persist dark as default, light as the alternative
  • Use 3D perspective on book elements
  • Keep transitions subtle (0.2–0.6s, ease curve)

Don't

  • Use pure white (#fff) or pure black (#000) as backgrounds
  • Use solid-fill buttons (always glass/translucent)
  • Use bright saturated colors outside the defined palette
  • Use stock photography or decorative illustrations
  • Apply bounce or spring animations
  • Make the light theme feel clinical (it's warm parchment)
  • Skip the grain overlay
  • Use more than two typeface families
  • Use bold weight (700+) on Newsreader headings