v2.0 · June 2026

The field notebook
of a scientist who trusts you.

One visual language across the store, the website, and every BioDwell surface: cream paper, navy ink, a single rubber-stamp green, and the warmth of a hand-stamped letter wrapped around lab-notebook rigor.

Principles

Four pillars, one personality tic

The system is flat, calm, and restrained, with a single Memphis-flavored signature: the chunky offset stamp that appears when you press a button. Restraint with a personality tic.

Trustworthy

Every element earns trust. Full borders, honest numbers, transparent service framing.

Scientific

Mono labels, structured grids, exact numbers. PhD-led interpretation reflected in every detail.

Warm

We test homes, not patients. Cream paper, never hospital white. Approachable, human, never clinical.

Consistent

Store and website share one token dialect, byte-for-byte. Change one, backport to the other.

Color

Cream paper, navy ink, one green stamp

Brand green is held in reserve for CTAs and decisive accents. Per-category hues identify, they don't dominate, and they never leave their own sections.

The Brand Green

BioDwell Green
#33CC66  ·  hsl(136, 56%, 54%)  ·  rgb(73, 204, 108)
Sampled from the logo, canonical as of 2026-06-12. The stamp color: primary CTA fills, the eyebrow dot, decisive accents. Never headlines, never backgrounds, never body text on light surfaces.
#3ED878 · dark-mode lift
Green brightens slightly on dark surfaces for perceived contrast.
Migration shipped 2026-06-12: both repos now carry #33CC66 everywhere. The old #33CC66/#3ED878 pair is retired; contrast-derived tokens were re-verified.

Readable green: the text tokens

Bright brand green fails WCAG AA as small text on cream. Green text on light surfaces always uses the darkened tokens; both revert to the bright green in dark mode (already ~10:1 there).

--color-bd-green-text
#1B7232 · body-size green text
5.7:1 on cream · WCAG AA
--color-bd-green-accent
#2A8C44 · large accents
4.0:1 · WCAG AA Large
both, in dark mode
#3ED878 · reverts to bright
10.3:1 on deep navy

Structure · theme-aware ink & paper

Navy
#1A1F2E

Headings, borders, stamp shadows. The structural ink.

Charcoal
#32373C

Body copy.

Cream
#FAF8F5

THE page surface. Never sterile white.

White
#FFFFFF

Elevated surfaces only: cards, drawers, modals.

Navy Deep
#05080F

Reserved for dark-mode depth.

Theme-aware vs theme-fixed: the architecture rule. The --color-bd-* tokens are semantic and FLIP in dark mode (navy means "the ink," cream means "the paper"). The --color-navy-fixed / --color-cream-fixed tokens stay literal; use them for surfaces that must stay their color (hero video scrim, footer, final-CTA bands) and for text sitting on those surfaces or on green fills. When a surface is theme-fixed, its text must be theme-fixed too.

Test Categories · "Earthy Natural"

Chosen 2026-06-09 so Mold, Water, and Drug Residue no longer collide in the blue-purple range. The store runs five worlds (Mold & Mycotoxins merged); the website keeps a sixth moss token for mycotoxin content.

Water
#44749D steel
Drug Residue
#8A6BA8 plum
Allergen
#C99A3B ochre
Mold
#5B8A5A sage
Mycotoxin
#4F6F3C moss
Radon
#BC5B3C terracotta
.mesh-water
.mesh-drugs
.mesh-allergen
.mesh-mold
.mesh-radon

Category banner meshes are always-dark: the hue is blended toward fixed navy and never inverts. Text on a mesh uses cream-fixed.

Supporting

Amber
#B07A1F → #FCD34D dark
Star Gold
#F4B400 ratings
Error
#991b1b / #dc2626
Semantic set
success/warn/error/info
Dark Mode

Opt-in only, semantic inversion

Dark mode activates only via the header toggle (data-theme="dark", persisted to localStorage). System prefers-color-scheme is deliberately ignored; light is BioDwell's first impression.

Light (default)
Navy ink on cream paper

Charcoal body copy. White cards. Bright green stamps.

#1A1F2E #FAF8F5 green
Dark (toggle)
Cream-tan ink on blue-black

Warm-gray body. Elevated #181F2D cards. Lifted green.

#EAE4D4 #181F2D #3ED878
TokenLightDarkMeaning
--color-bd-navy#1A1F2E#EAE4D4the ink: structure, headings, borders
--color-bd-charcoal#32373C#B5AFA9body copy
--color-bd-cream#FAF8F5#0D121Bthe paper: page background
--color-bd-white#FFFFFF#181F2Delevated surface
--color-bd-green#33CC66#3ED878the stamp — shipped both repos 2026-06-12
--color-navy-fixed / --color-cream-fixednever flipvideo scrims, footers, text-on-green

Product photos get filter: brightness(0.95) saturate(0.95) in dark mode. Every UI change ships with a verified dark-mode pass; both modes are real.

Typography

Three faces, three jobs

A printed title plate, a fountain-penned paragraph, a stenciled stamp underneath.

Display
DM Serif Display
italic is the accent voice

All h1–h5. Line-height 1.05, tracking −0.015em. Headlines set one word in italic <em> for emphasis ("Know what's in"). The .mega scale reaches clamp(2.75rem, 13vw, 13rem).

Body
DM Sans
variable, wght 100–1000

Everything else: body at 1rem/1.6, buttons at 600, titles at 600/1.125rem. Cap line length at 65–75ch. Titles use sans, not serif; serif at title scale reads decorative.

Label
JetBrains Mono
0.75rem · 600 · 0.2em · UPPERCASE

Mono-as-Stencil rule: eyebrows, lab numbers, kit IDs, category tags, stat sources. Never body copy, never CTA labels, never headlines; anything else is costume.

The Section Cadence

Eyebrow · mono, navy, green dot
Then the headline speaks.

Then body copy in DM Sans carries the substance. Every section that introduces a new topic runs this cadence: eyebrow → headline → body. The eyebrow is a section badge, not scaffolding; don't repeat it above every block.

store eyebrow carries the 8px green dot · website version uses surface modifiers (--on-dark mixes to 78% cream)

Font loading: the store self-hosts all three faces as woff2 (variable). The website still loads static weights from Google Fonts; close the parity gap when touched.

Never: Plus Jakarta, Inter, Anton, or any generic AI-tool face. The brand owns these three.

Buttons

Pills with the Lift & Ring

Every button is a full pill: 999px radius, 2px navy border, 1rem × 1.75rem padding, DM Sans 600. Hover any of these: the signature gesture lifts the pill −8px up-left, stamps a 10px hard navy shadow into the space it vacated, and rings it in brand green at +4px offset. 280ms exponential ease-out.

transform: translate(-8px,-8px) · box-shadow: 10px 10px 0 navy · outline: green @ +4px · cubic-bezier(0.16, 1, 0.3, 1)

VariantFill / Text / BorderRole
.btn-primarygreen / navy-fixed / navyTHE decisive CTA; text pinned so dark mode can't break it (navy-on-green ≈ 7.9:1 AAA)
.btnnavy-fixed / cream-fixed / navydefault secondary on light surfaces
.btn-outlinetransparent / navy / navylow-emphasis on light; hover inverts to navy fill
.btn-on-darkgreen / navy-fixed / cream-fixedCTA over navy-fixed surfaces; stamp shadow turns cream
.btn-on-dark-outlinetransparent / cream-fixed / cream-fixedlow-emphasis on dark; hover inverts to cream fill
.btn-ghostnone / navy / nonetext link: underline on hover, no lift, no stamp
.btn-largepadding 1.25rem 2.25rem · 1remhero scale only

Keyboard focus gets the same lift + stamp but a solid 3px navy outline (cream on dark surfaces) so the indicator holds 3:1+ contrast on every surface. Hero CTA pattern: exactly two: one .btn-primary + one .btn-on-dark-outline. Never three competing CTAs.

Elevation

Flat at rest, stamped on action

No diffuse drop shadows. No glassmorphism. Surfaces sit on the cream paper with full borders or nothing; depth arrives only when you act on something.

Offset stamp · hover me

Cards: 2px navy border, 18px radius, then translate(-4px,-4px) + 8px 8px 0 navy on hover. Buttons go −8px/10px. Chips use the 4px small stamp.

On-dark stamp

Same gesture, inverted ink: the shadow is cream (10px 10px 0 #FAF8F5) when the surface is navy-fixed.

Forbidden

box-shadow: 0 4px 24px rgba(0,0,0,.12) belongs to a different design system. If a hover needs more weight, deepen the offset, never add blur.

Stamp-On-Action rule: the offset shadow responds to hover and focus. A surface wearing it at rest reads as a clip-art badge.

Components

The shared vocabulary

Building blocks that mirror byte-for-byte between the store and the website.

Sticker & markers

Free shipping PhD-reviewed service
Water Testing .cdot marker
Mold & Mycotoxins
Radon
link-pop underline gesture scaleX sweep, 280ms

Product card anatomy

Water

City Water — Citycheck Deluxe

★★★★★ 4.9 (164)
$295

Circular photo + category-colored ring + wash background. Stars are gold #F4B400. Photography-forward: real kit photos, never abstract CSS art.

Inputs

Cream surface, 2px navy border, 10px radius. Focus = 3px navy outline at 3px offset (same treatment as buttons). Error = #dc2626 border + message below.

Get 10% off your first kit with WELCOME10

Promo bar

Navy-fixed bar, cream text, green code. 44px close target, session-dismissed. The exit-intent popup must never stack with the cookie banner.

Hero pattern (store): full-bleed autoplay video under a navy-fixed gradient scrim, sticker badge, italic-accent headline, two CTAs, credibility card, and a 44px pause control on every video (WCAG 2.2.2). Category icons: Icons8 3D Fluency set at /icons/icon-<cat>-3d.png; UI icons stay inline SVG line icons, stroke-width 2.

Motion

Deliberate, manual, stamped

Motion sells the hand-stamped promise: short, decisive, exponential ease-out. Nothing floats aimlessly.

--duration-fast160mscolor/opacity hovers
--duration-base220mscard lift, most UI
--duration-enter320msdrawers, modals
--easing-standardcubic-bezier(0.4, 0, 0.2, 1)default easing
Lift & Ring280ms cubic-bezier(0.16, 1, 0.3, 1)the button gesture
.reveal800ms fade + 30px risescroll entrance via IntersectionObserver
Reduced motion is honored in full. prefers-reduced-motion kills animations, transitions, smooth scroll, scroll-reveals, and hides autoplay hero/category videos entirely (WCAG 2.2.2 / 2.3.3).
Accessibility

WCAG AA, verified in both modes

The 2026-04 audit fails are resolved: green-on-light text tokens shipped, button text pinned navy-on-green, video pause controls and reduced-motion live.

7.9:1AAANavy text on brand green: why .btn-primary is navy-on-green
5.7:1AAgreen-text token on cream: the only green allowed as small text
2.1:1FailWhite on brand green: never ship white-on-green text
9.8:1AAACharcoal body on cream
13+:1AAADark mode ink on dark page
44px

Touch targets

All interactive elements ≥ 44×44px, including video pause, promo close, chat send.

Focus visible

Global: 3px green outline at 3px offset. Buttons: lift + stamp + 3px navy (cream on dark). Keyboard-only via :focus-visible.

Skip to content

Skip link & reflow

Visible on Tab. Page uses overflow-x: clip so 400% zoom reflow survives (WCAG 1.4.10).

Named Rules

The laws of the notebook

Each of these exists because something broke or drifted without it.

The One Stamp Rule

Green is the rubber stamp: primary CTA, eyebrow dot, decisive accents. One or two green elements per page; never a green section, headline, or background.

The Theme-Fixed Exception

Theme-fixed surface → theme-fixed text. bd-navy flips to cream-tan in dark mode; on green that's 1.3:1 and unreadable. Pin with navy-fixed/cream-fixed.

The Per-Category Quarantine

Category hues live inside their own sections, never on global chrome. The shop's category nav is the single named exception. Never two hues in one section unless it's an explicit comparison.

Stamp-On-Action / No-Diffuse

The offset shadow answers hover and focus, never decorates rest states. Blur shadows are banned everywhere; deepen the offset instead.

Mono-as-Stencil / Eyebrow Hierarchy

Mono is stamped on top of warmth: labels, IDs, eyebrows only. The eyebrow→headline→body cadence opens sections; it isn't repeated as scaffolding.

Light is the first impression

Dark mode is a deliberate user opt-in, not a system default, and every change is verified in both modes before it ships.

Voice & framing

Do

  • "Know what's in your home" · direct, personal
  • "Every result, read and interpreted in writing by Dr. Mark Arvin's team" · the service IS the product
  • "Lab tests anyone can mail order" · plain-language confidence
  • "Shop tests", "Find your test" · calm verbs, no pressure

Don't

  • Clinical/healthcare framing: no PHI, HIPAA, or clinician-referral language. We test buildings.
  • Drop the word "service": it's never just a lab report
  • Position the customer as an inspector: sample collection only, no meters or cameras
  • Health-outcome attribution, fear-mongering all-caps warnings, "Buy Now"

Also banned: emojis in UI, gradient text, colored accent stripes thicker than 1px, em dashes in site copy, hand-authored illustrative SVG that hasn't been rasterized and honestly evaluated.

Tokens

The canonical token block

Mirrors the live source of truth: biodwell-astro-v4/src/styles/global.css (store) and biodwell.com/apps/web/src/styles/global.css (website).

/* ═══ BioDwell Design Tokens v2.0 — 2026-06 ═══ */
@theme {
  /* Brand core — semantic, INVERT in dark mode */
  --color-bd-green:    #33CC66;  /* canonical logo green — shipped both repos 2026-06-12 */
  --color-bd-navy:     #1A1F2E;  /* the ink */
  --color-bd-charcoal: #32373C;  /* body copy */
  --color-bd-cream:    #FAF8F5;  /* the paper */
  --color-bd-white:    #FFFFFF;  /* elevated surfaces */

  /* Fixed — identical in both modes */
  --color-navy-fixed:     #1A1F2E;
  --color-cream-fixed:    #FAF8F5;
  --color-charcoal-fixed: #32373C;

  /* Accessible green text (light surfaces; revert to bright in dark) */
  --color-bd-green-text:   #1B7232;  /* 5.7:1 on cream, AA */
  --color-bd-green-accent: #2A8C44;  /* 4.0:1, AA Large */

  /* Derived */
  --color-bd-green-tint:  color-mix(in srgb, var(--color-bd-green) 85%, #FFFFFF);
  --color-bd-green-shade: color-mix(in srgb, var(--color-bd-green) 88%, #1A1F2E);
  --color-bd-navy-deep:   color-mix(in srgb, #1A1F2E 70%, #000000);

  /* Category — "Earthy Natural" (2026-06-09) */
  --color-water:    #44749D;  /* steel blue */
  --color-drugs:    #8A6BA8;  /* plum */
  --color-allergen: #C99A3B;  /* ochre */
  --color-mold:     #5B8A5A;  /* sage */
  --color-radon:    #BC5B3C;  /* terracotta */
  /* website also carries: --color-category-mycotoxin: #4F6F3C (moss) */
  /* per-category washes: color-mix(in srgb,  12%, #FFFFFF) — 20% toward #181F2D in dark */

  /* Status */
  --color-bd-amber: #B07A1F;   /* #FCD34D in dark */
  --color-star:     #F4B400;
  --color-error:    #991b1b;  --color-error-border: #dc2626;

  /* Type */
  --font-display: 'DM Serif Display', Georgia, serif;
  --font-body:    'DM Sans Variable', 'DM Sans', -apple-system, sans-serif;
  --font-mono:    'JetBrains Mono Variable', 'JetBrains Mono', 'SF Mono', Menlo, monospace;

  /* Radius */
  --radius-sm: 10px;  --radius-md: 16px;  --radius-lg: 20px;  --radius-pill: 999px;

  /* Motion */
  --duration-fast: 160ms;  --duration-base: 220ms;  --duration-enter: 320ms;
  --easing-standard: cubic-bezier(0.4, 0, 0.2, 1);
  /* Lift & Ring: 0.28s cubic-bezier(0.16, 1, 0.3, 1) */

  /* Offset stamps — reference bd-navy so they auto-invert */
  --shadow-offset:    6px 6px 0 var(--color-bd-navy);
  --shadow-offset-sm: 4px 4px 0 var(--color-bd-navy);
}

/* Dark mode — opt-in only via html[data-theme="dark"] (header toggle) */
:root[data-theme="dark"] {
  --color-bd-navy:     #EAE4D4;   /* ink goes warm cream-tan */
  --color-bd-charcoal: #B5AFA9;
  --color-bd-cream:    #0D121B;   /* paper goes deep blue-black */
  --color-bd-white:    #181F2D;
  --color-bd-green:    #3ED878;   /* green lifts */
  --color-bd-green-text:   #3ED878;
  --color-bd-green-accent: #3ED878;
  --color-bd-amber:    #FCD34D;
  color-scheme: dark;
}

Layout: .container-wide 1440px · .container-narrow 960px · .section clamp(3rem, 6vw, 6rem) · website header 90px. Full written canon: Brain → projects/biodwell-ecommerce/design-system.md.