Skip to main content

Design System

How does every element on this site earn its place?

This is the living style guide for mm.dreamineering.com. Every color, typeface, spacing value, and component documented here is extracted from what's actually shipping — not aspirational.


Brand Identity

The Dreamineering logo is a P&ID (Process & Instrumentation Diagram) — the same visual language used to draw factories. Four shapes form a feedback loop that doubles as a question mark.

ShapeP&ID ElementFunctionAsset
TrapezoidHopperCapturedrmg-dream.svg
TrianglePumpActdrmg-act.svg
CircleGaugeMeasuredrmg-measure.svg
CurveControllerQuestiondrmg-learn.svg

Logo Variants

FileUse
logo.svgFull mark, currentColor fill
logo-home-red.svgWhite shapes on red — homepage nav
logo-home-white.svgRed shapes on white
logo-white.svgWhite fill — dark backgrounds

All assets at /static/img/brand/.

The logo is a diagram, not decoration. Every appearance should feel like a system, not a brand mark.


Color Tokens

Single source of truth: src/css/custom.css @theme block.

Semantic Palette

TokenHexTailwind ClassRole
--color-ink#111827bg-ink, text-inkDark backgrounds, primary text
--color-paper-cool#f9fafbbg-paper-coolLight section backgrounds
--color-paper-muted#f3f4f6bg-paper-mutedSecondary surfaces
--color-brand#b91c1cbg-brand, text-brandCrimson accent, CTAs
--color-brand-dark#991b1bbg-brand-darkHover state
--color-brand-light#dc2626text-brand-lightLabels on dark backgrounds

Text Colors

ContextTokenHexClass
Primary on light--color-ink#111827text-ink
Secondary on light--color-ink-muted#4b5563text-ink-muted
Tertiary on light--color-ink-subtle#6b7280text-ink-subtle
Disabled on light--color-ink-disabled#9ca3aftext-ink-disabled
Primary on dark--color-chalk#f9fafbtext-chalk
Secondary on dark--color-chalk-muted#d1d5dbtext-chalk-muted
Tertiary on dark--color-chalk-subtle#9ca3aftext-chalk-subtle
White (CTA text)--color-chalk-light#fffffftext-chalk-light

Borders

TokenHexClassUse
--color-edge#e5e7ebborder-edgeDefault borders, dividers
--color-edge-strong#d1d5dbborder-edge-strongEmphasized borders

Focus

TokenHexUse
--color-focus#2563ebFocus ring via :focus-visible

Background Alternation

Landing page sections alternate to create visual rhythm:

bg-ink       → Hero, CTA (dark bookends)
white → Primary content sections
bg-stone-50 → Alternating content sections (warm gray)

bg-stone-50 is a Tailwind default, not a custom token. Used for warmth over bg-gray-50.


Typography

Font Stack

TokenFamilyWeight RangeUse
--font-sansInter400-700All body and heading text
--font-monoJetBrains Mono400-500Code, labels, accent text

Both loaded via Google Fonts with display=swap.

Type Scale

ElementSizeWeightLine HeightClass Pattern
Hero H136-72pxBold (700)1.1text-4xl sm:text-5xl md:text-6xl lg:text-7xl font-bold tracking-tight leading-[1.1]
Section H224-30pxBold (700)tighttext-2xl md:text-3xl font-bold tracking-tight
Body large18-20pxRegular (400)relaxedtext-lg md:text-xl leading-relaxed
Body16-18pxRegular (400)relaxedtext-base md:text-lg leading-relaxed
Small/caption14-16pxRegular (400)normaltext-sm md:text-base
Mono label14pxRegular (400)normalfont-mono text-sm tracking-[0.15em] uppercase

Text Patterns

Section label (mono, uppercase, tracked):

font-mono text-sm tracking-[0.15em] uppercase

On light: text-brand. On dark: text-brand-light.

Section heading (via SectionHeader):

text-2xl md:text-3xl font-bold tracking-tight

On light: text-ink. On dark: text-chalk.

Body description (via SectionHeader):

text-base md:text-lg leading-relaxed

On light: text-ink-muted. On dark: text-chalk-muted.

Cultural anchor (mono, subtle):

font-mono text-ink-subtle text-sm md:text-base tracking-wide

Spacing

Base Unit

4px (0.25rem). All spacing is a multiple of this base.

Section Spacing

Controlled by the Section component:

PropMobileDesktopUse
none00Hero only
sm24px32pxTransitional elements
md32px48pxVisual transitions (diagram)
lg48px64pxStandard content sections
xl64px80pxMajor divisions

Default is lg. All standard sections use lg.

Container Widths

Controlled by the Container component:

PropMax WidthUse
sm640pxCTA section (tight focus)
md768pxAll standard sections
lg1024pxDocumentation content
xl1280pxFull-width layouts

Default for landing page is md. Horizontal padding: px-4 md:px-6.

Content Gaps

PatternValueUse
space-y-832pxBetween section header and content
space-y-416pxBetween heading and description
space-y-312pxWithin SectionHeader (label/heading/description)
gap-416pxInline elements (logo + wordmark)

Components

Three design system primitives. All landing page sections compose from these.

Section

Vertical padding wrapper. Outputs <section>.

<Section spacing="lg" className="bg-stone-50">
{children}
</Section>

Container

Max-width + horizontal padding wrapper. Outputs <div>.

<Container size="md">
{children}
</Container>

SectionHeader

Label + heading + description in consistent sizing and spacing.

<SectionHeader
label="The Tight Five"
heading="Five questions that change everything."
description="Optional supporting text."
dark={false}
/>

Renders: label (mono uppercase) → <h2> (bold) → <p> (muted). Centered, max-width xl (576px).

Button

Rounded pill buttons with four variants.

<Button variant="primary" size="lg" to="/docs/">
Explore the mental model &rarr;
</Button>
VariantBackgroundTextBorderUse
primarybg-brandwhitenoneMain CTA
secondarybg-paper-mutedtext-inknoneSupporting actions
ghosttransparenttext-inknoneTertiary actions
outlinetransparenttext-inkborder-edgeAlternative actions

Sizes: sm (px-4 py-2), md (px-6 py-3), lg (px-8 py-4). All use rounded-full.


Landing Page Pattern

Every section follows this exact structure:

<Section spacing="lg" className={/* bg-stone-50 for alternating */}>
<Container size="md">
<div className="space-y-8">
<SectionHeader label="..." heading="..." description="..." />
{/* section content */}
</div>
</Container>
</Section>

Section Sequence

#SectionRoleBackground
1HeroHookbg-ink
2EnemyFearwhite
3ProblemTensionwhite
4LoopVisual transitionwhite
5Control SystemFramebg-stone-50
6Tight FiveProtocolwhite
7BeingsEdgebg-stone-50
8BelongingCommunitywhite
9FactoriesProofbg-stone-50
10CTAActionbg-ink

Narrative arc: problem → mechanism → framework → application → community → action.


Global

All links: font-weight: 600, no underline by default. On hover: color: brand, underline 2px with 3px offset.

On Dark Backgrounds

text-chalk underline hover:text-chalk-light

Links on bg-ink sections are always underlined (no other affordance on dark).

text-brand hover:underline font-medium

Used inline where the link IS the emphasis.

All rounded-full elements suppress underline on hover via CSS override.


Docusaurus Integration

IFM Variable Mapping

Design tokens map to Docusaurus's Infima variables in :root:

Our TokenMaps To
--color-brand--ifm-color-primary
--color-brand-dark--ifm-color-primary-dark
--color-brand-light--ifm-color-primary-light
--font-sans--ifm-font-family-base
--font-mono--ifm-font-family-monospace
--color-ink--ifm-link-color
--color-brand--ifm-link-hover-color

Infima Cascade Fix

Infima's unlayered CSS rules override Tailwind's @layer utilities. Compound selectors with !important are required for headings and links on landing pages:

h1.text-chalk { color: var(--color-chalk) !important; }
a.text-brand { color: var(--color-brand) !important; }

These live in custom.css. Do not remove them.

Light Mode Only

Dark mode is disabled. The color mode toggle is hidden via CSS. No dark: classes are used anywhere.


Technical Architecture

CSS Load Order

@import "tailwindcss"       ← Framework first (required)
@source "..." ← Content paths
@theme { } ← Design tokens (generates utilities)
Infima cascade fix ← !important overrides
:root { } ← IFM variable mapping
Component styles ← Navbar, footer, links

@import "tailwindcss" MUST be first. If @theme comes first, tokens are defined but Tailwind never processes them — utilities resolve to transparent.

Token Flow

@theme block (custom.css)
|
+-- Tailwind utilities: bg-ink, text-chalk, border-edge
+-- Infima overrides: var(--color-*) !important
+-- IFM mapping: var(--color-*) -> --ifm-*
+-- Component styles: var(--color-*)

Every color in the codebase references @theme tokens via var(). The only raw hex values are inside the @theme block itself and four Docusaurus IFM shades with no design system equivalent.


Checklist

Before shipping any UI change:

  • Colors use semantic tokens (text-ink, bg-brand), not raw hex or Tailwind defaults (text-gray-900)
  • Text contrast passes 4.5:1 (use Chrome DevTools color picker)
  • Touch targets are 44px minimum
  • Spacing uses the scale (multiples of 4px), no arbitrary values
  • Landing page sections use Section spacing="lg" + Container size="md"
  • Section headers use SectionHeader component, not hand-rolled markup
  • Links on dark backgrounds are underlined
  • Focus states visible (:focus-visible with --color-focus ring)
  • No dark: classes (light mode only)
  • Fonts render as Inter / JetBrains Mono, not system fallbacks

Context