Overview
HashiCorp's marketing canvas is a near-black ground that serves a multi-product portfolio without ever feeling generic. The dominant surface is {colors.canvas} (pure black) layered with {colors.surface-1} charcoal cards and 1px translucent gray hairlines. The chrome is monochrome — white pill-rounded buttons ({components.button-primary}), white type, gray secondary type — but the system is held together by a palette of per-product accent colors that signal which HashiCorp tool a given section belongs to: Terraform purple, Vault yellow, Consul red, Waypoint cyan, Vagrant blue, Nomad green, Boundary coral.
Display type is hashicorpSans at weights 600/700 with tight line-heights (1.17–1.21); body type is the same family at 500 weight with deliberately relaxed line-heights (1.50–1.71) — the contrast feels editorial, not enterprise-templated. CTAs use small {rounded.md} 8px corners rather than pills, which keeps the system reading as developer-facing rather than consumer-y.
The signature device is the product-card family — each HashiCorp product gets its own colored card variant on the home and infrastructure pages, lifting Terraform into a violet ground, Vault into yellow, Waypoint into cyan. These aren't decorative gradients — they're identity surfaces. A reader scrolling the page can tell which product a section is about from the corner of their eye.
Key Characteristics:
- Black-canvas marketing system:
{colors.canvas} is the surface for hero, body, pricing, comparison tables, and footer alike.
- Per-product color identity: Terraform
{colors.product-terraform}, Vault {colors.product-vault}, Waypoint {colors.product-waypoint}, Vagrant {colors.product-vagrant}, Consul {colors.product-consul}, Nomad {colors.product-nomad}, Boundary {colors.product-boundary} — each with its own button + card variant.
- Display headlines run hashicorpSans 600/700 with line-height 1.17–1.21 (tight); body runs the same family at 500 with 1.50–1.71 (relaxed) — the proportional gap is the brand's voice.
- CTA shape is
{rounded.md} 8px — not a pill — keeping the system reading as developer-tool rather than consumer-app.
- Charcoal surface lift (canvas → surface-1 → surface-2) instead of shadow-driven elevation.
- 1px translucent gray hairlines (
rgba(178,182,189,0.1)) define cards and dividers — the borders are felt more than seen.
- Eyebrow typography (12–13px, 600 weight, 0.6px positive tracking, uppercase) marks every section as a category label.
Colors
Source pages: hashicorp.com/en (home), /en/infrastructure-cloud, /en/products/terraform, /en/pricing, /en/resources?contentType=PDF.
Brand & Accent
- Black ({colors.primary}): The system primary surface. Canvas, footer, comparison tables, hero — all black.
- White ({colors.on-primary}): Inverse text on black; canvas of
button-primary.
- Accent Blue ({colors.accent-blue}): Hyperlinks across the marketing surface.
- Visited Purple ({colors.semantic-visited}): Visited-link state.
Surface
- Canvas ({colors.canvas}): Default page background.
- Surface 1 ({colors.surface-1}): Charcoal one step above canvas — feature cards, pricing cards, resource tiles.
- Surface 2 ({colors.surface-2}): Two steps above — featured pricing card, secondary buttons, hovered product chrome.
- Surface 3 ({colors.surface-3}): Three steps above — small chips, badges, sub-nav backgrounds.
- Hairline ({colors.hairline}): 1px borders on cards and dividers.
- Hairline Soft ({colors.hairline-soft}): Subtler dividers — comparison-table rows.
- Inverse Canvas ({colors.inverse-canvas}): Pure white — used as the surface of
button-primary only.
Text
- Ink ({colors.ink}): All headline and emphasized body type — pure white.
- Ink Muted ({colors.ink-muted}): Secondary type at #b2b6bd — meta info, footer columns.
- Ink Subtle ({colors.ink-subtle}): Tertiary type at #656a76 — form helper text, timestamps, footnotes.
Per-Product Identity (signature)
HashiCorp's marketing isn't held together by a single accent color — it's held together by a system of product-specific accents, each used to mark which tool a section represents.
- Terraform Purple ({colors.product-terraform}): Terraform sections, terraform CTAs, the violet 3D cube on the home hero.
- Terraform Bright ({colors.product-terraform-bright}): Saturated highlight — link emphasis on Terraform pages.
- Vault Yellow ({colors.product-vault}): Vault sections and CTAs.
- Consul Red ({colors.product-consul}): Consul sections.
- Waypoint Cyan ({colors.product-waypoint}): Waypoint sections, deep variant
{colors.product-waypoint-deep} for hover/active.
- Vagrant Blue ({colors.product-vagrant}): Vagrant sections.
- Nomad Green ({colors.product-nomad}): Nomad sections.
- Boundary Coral ({colors.product-boundary}): Boundary sections.
Semantic
- Success ({colors.semantic-success}): Positive states (also reused as Nomad green).
- Warning ({colors.semantic-warning}): Warning states (also Vault yellow).
- Error ({colors.semantic-error}): Error states (also Consul red).
- Amber 100 ({colors.amber-100}): Soft warm highlight — extracted but used sparingly.
- Amber 200 ({colors.amber-200}): Saturated amber for caution badges.
- Blue 7 ({colors.blue-7}): Deep navy used in unified-core gradients.
Typography
Font Family
- hashicorpSans — HashiCorp's proprietary marketing typeface. Geometric, clean, slightly humanist. Fallback stack
__hashicorpSans_Fallback_96f0ca (system font), then -apple-system, BlinkMacSystemFont, Segoe UI, helvetica, arial.
The same family carries display, body, button, and caption — no separate display + body pairing. Hierarchy is carried by weight (500 body / 600 emphasis / 700 display) and by a deliberate line-height contrast (tight on display, relaxed on body).
Hierarchy
| Token |
Size |
Weight |
Line Height |
Letter Spacing |
Use |
{typography.display-xl} |
80px |
700 |
1.17 |
-2.5px |
Largest hero headline |
{typography.display-lg} |
56px |
700 |
1.18 |
-1.6px |
Section opener headlines |
{typography.display-md} |
40px |
600 |
1.19 |
-1.0px |
Sub-section headlines |
{typography.headline} |
28px |
600 |
1.21 |
-0.6px |
Pricing tier titles, CTA banner heading |
{typography.card-title} |
22px |
600 |
1.18 |
-0.4px |
Feature card title |
{typography.subhead} |
20px |
600 |
1.35 |
-0.2px |
Long-form intro paragraphs |
{typography.body-lg} |
18px |
500 |
1.69 |
0 |
Hero subhead, lead body |
{typography.body} |
16px |
500 |
1.50 |
0 |
Default body |
{typography.body-sm} |
14px |
500 |
1.71 |
0 |
Card body, footer columns |
{typography.caption} |
13px |
500 |
1.38 |
0.2px |
Meta, comparison cell labels |
{typography.button} |
14px |
600 |
1.29 |
0 |
Pill / square CTA buttons |
{typography.eyebrow} |
12px |
600 |
1.23 |
0.6px |
Uppercase section eyebrows |
Principles
- Tight on display, relaxed on body. Display sits at line-height 1.17–1.21; body lifts to 1.50–1.71. The size + line-height contrast carries hierarchy.
- Weight hierarchy is small. 500 body / 600 emphasis / 700 display. No light / black extremes — the brand reads as engineered.
- Eyebrow positive-tracked uppercase 12px is the section header. Every meaningful section has one above the headline.
- No mono. Despite being a developer-tools brand, the marketing surface uses no monospace face — code voice is reserved for in-product surfaces.
Note on Font Substitutes
If implementing without hashicorpSans, suitable open-source substitutes include Inter (closest geometric character set), Geist Sans, or IBM Plex Sans. Inter at weights 500 / 600 / 700 closely approximates hashicorpSans's proportions; expect to manually adjust line-heights down by ~0.02 to match.
Layout
Spacing System
- Base unit: 8px (the primary increments are 4 / 8 / 12 / 16 / 24 / 32 / 48).
- Tokens (front matter):
{spacing.hair} 1px · {spacing.xxs} 4px · {spacing.xs} 8px · {spacing.sm} 12px · {spacing.md} 16px · {spacing.lg} 24px · {spacing.xl} 32px · {spacing.xxl} 48px · {spacing.section} 96px.
- Card interior padding:
{spacing.lg} 24px on product cards; {spacing.xl} 32px on pricing cards; {spacing.xxl} 48px on CTA banners.
- Button padding: 10px vertical · 18px horizontal on
{components.button-primary}.
- Universal rhythm constant:
{spacing.section} (96px) vertical gap between major sections.
Grid & Container
- Max content width sits around 1280px with side gutters scaling from
{spacing.xxl} on desktop down to {spacing.lg} on mobile.
- Product card grids are 3-up on desktop, 2-up at tablet, 1-up on mobile.
- Pricing tier grid is 3-up across desktop; comparison table beneath uses fixed-width left column.
- Resource directory (PDF library) uses 4-up dense thumbnail grid.
Whitespace Philosophy
The dark canvas IS the whitespace. Sections separate by surface lift (canvas → surface-1) rather than by gaps in white. Within a section, generous {spacing.xl} 32px gaps separate cards; {spacing.lg} 24px separates rows.
Elevation & Depth
| Level |
Treatment |
Use |
| 0 (flat) |
No shadow, no border |
Canvas-mounted display type, hero, footer |
| 1 (charcoal lift) |
{colors.surface-1} background + 1px rgba(178,182,189,0.1) border |
Default cards, resource tiles, pricing cards |
| 2 (surface-2 lift) |
{colors.surface-2} background + 1px {colors.hairline} border |
Featured pricing card, hovered cards, sub-nav |
| 3 (product chromatic) |
Per-product accent color background — Terraform purple, Vault yellow, Waypoint cyan |
Product showcase cards |
The product chromatic level isn't a "modal lift" — it's an identity device. A Terraform card sits at the same z-plane as a feature-card; the difference is meaning, not depth.
Decorative Depth
- 3D product visuals — isometric purple cubes (Terraform), translucent yellow safes (Vault), and similar product-tinted illustrations sit in the right column of hero sections.
- 1px translucent gray hairlines are the dominant edge — borders are visible without competing.
- No drop shadows on dark. Cards lift via surface change, never shadow.
Shapes
Border Radius Scale
| Token |
Value |
Use |
{rounded.xs} |
4px |
Small chips / badges |
{rounded.sm} |
6px |
Inline tag |
{rounded.md} |
8px |
All CTA buttons, form inputs, list items |
{rounded.lg} |
12px |
Feature cards, product cards, pricing cards |
{rounded.xl} |
16px |
Large illustrative tiles |
{rounded.xxl} |
24px |
CTA banner panels |
{rounded.pill} |
9999px |
Eyebrow-style product pills (small chips) |
{rounded.full} |
9999px |
Avatar circles (rare on marketing) |
Photography & Illustration Geometry
- Product 3D illustrations use full-bleed within their container — no rounded inner mask.
- Logo chips in the customer marquee sit on
{rounded.sm} 6px tiles with 1px hairline.
- Resource thumbnails use
{rounded.lg} 12px corners.
Components
Buttons
button-primary — White rounded-rect CTA. Used as primary CTA on all pages.
- Background
{colors.inverse-canvas}, text {colors.inverse-ink}, type {typography.button}, padding 10px 18px, rounded {rounded.md}.
- Pressed state lives in
button-primary-pressed.
button-secondary — Charcoal rounded-rect. Secondary CTA, "Read docs" / "Talk to sales".
- Background
{colors.surface-2}, text {colors.ink}, type {typography.button}, rounded {rounded.md}, padding 10px 18px.
button-tertiary — Bare ghost button on canvas with text-only treatment.
- Background
{colors.canvas}, text {colors.ink}, type {typography.button}, rounded {rounded.md}, padding 10px 18px.
button-product-terraform — Terraform-tinted CTA on Terraform pages.
- Background
{colors.product-terraform}, text {colors.ink}, type {typography.button}, rounded {rounded.md}, padding 10px 18px.
button-product-vault — Vault-yellow CTA.
- Background
{colors.product-vault}, text {colors.inverse-ink} (yellow needs dark text), type {typography.button}, rounded {rounded.md}, padding 10px 18px.
button-product-waypoint — Waypoint-cyan CTA.
- Background
{colors.product-waypoint}, text {colors.inverse-ink}, type {typography.button}, rounded {rounded.md}, padding 10px 18px.
(Vagrant blue, Nomad green, Consul red, Boundary coral follow the same pattern with their respective {colors.product-*} token.)
Cards & Containers
product-card — Default product showcase card — surface-1 charcoal.
- Background
{colors.surface-1}, text {colors.ink}, type {typography.body}, rounded {rounded.lg}, padding 24px.
product-card-terraform — Product card with Terraform purple ground (used as identity surface, not modal elevation).
- Background
{colors.product-terraform}, text {colors.ink}, type {typography.body}, rounded {rounded.lg}, padding 24px.
product-card-vault — Vault-yellow ground.
- Background
{colors.product-vault}, text {colors.inverse-ink}, otherwise identical structure.
product-card-waypoint — Waypoint-cyan ground.
- Background
{colors.product-waypoint}, text {colors.inverse-ink}, otherwise identical structure.
(Other product variants follow the same shape with their respective product token.)
feature-card — Generic feature highlight on surface-1.
- Background
{colors.surface-1}, text {colors.ink}, type {typography.body}, rounded {rounded.lg}, padding 24px.
pricing-card — Pricing tier on /en/pricing.
- Background
{colors.surface-1}, text {colors.ink}, type {typography.body}, rounded {rounded.lg}, padding 32px.
pricing-card-featured — Recommended tier (visually emphasized via surface lift).
- Background
{colors.surface-2}, otherwise identical structure.
resource-card — PDF / whitepaper / guide tile in the resources directory.
- Background
{colors.surface-1}, text {colors.ink}, type {typography.body-sm}, rounded {rounded.lg}, padding 16px.
Inputs & Forms
text-input + text-input-focused — Form fields on pricing seat-count and contact forms.
- Background
{colors.surface-1}, text {colors.ink}, type {typography.body}, rounded {rounded.md}, padding 10px 14px.
- Focused state retains the same surface; the focus ring is a 1px
{colors.accent-blue} outline.
Pills & Chips
product-pill — Small product-name chip used above hero headlines and on resource cards to label which product a piece of content belongs to.
- Background
{colors.surface-1}, text {colors.ink-muted}, type {typography.caption}, rounded {rounded.pill}, padding 4px 10px.
Comparison Table
comparison-row — Single row inside the pricing comparison table.
- Background
{colors.canvas}, text {colors.ink-muted}, type {typography.body-sm}. Row separator is {colors.hairline-soft}.
CTA Banner
cta-banner — Large rounded panel used at the bottom of long-form pages with a closing CTA.
- Background
{colors.surface-1}, text {colors.ink}, type {typography.subhead}, rounded {rounded.xxl}, padding 48px.
Navigation
top-nav — Sticky black bar with HashiCorp logomark left, primary nav links centered, and a button-primary ("Sign up") + button-secondary ("Sign in") pair right.
- Background
{colors.canvas}, text {colors.ink}, type {typography.body-sm}, height 64px.
- Mobile: collapses primary links into a hamburger; the primary CTA remains visible.
Footer
footer — Dense link grid on {colors.canvas} with the wordmark at left and 5–6 columns of caption-sized links.
- Background
{colors.canvas}, text {colors.ink-muted}, type {typography.caption}, padding 64px 32px.
Do's and Don'ts
Do
- Reserve
{colors.canvas} (black) and {colors.surface-1} (charcoal) as the system's two anchor surfaces. Every band of the page is one or the other.
- When introducing a section about a specific HashiCorp product, use that product's
{colors.product-*} token consistently — for the section pill, the CTA button, and (where appropriate) the showcase card background.
- Use
{rounded.md} 8px on CTA buttons; HashiCorp's brand reads as engineered, not consumer.
- Pair tight display line-heights (1.17–1.21) with relaxed body line-heights (1.50–1.71). The contrast IS the brand voice.
- Use the eyebrow typography (
{typography.eyebrow}, uppercase, 0.6px tracking) above every meaningful section.
- Use surface lift (canvas → surface-1 → surface-2) to express hierarchy on dark.
- Reserve product-chromatic cards for product identity; keep generic feature cards on
{colors.surface-1}.
Don't
- Don't ship a light-mode marketing page. HashiCorp's marketing brand IS dark.
- Don't introduce mid-tone gray text outside the documented
ink / ink-muted / ink-subtle set.
- Don't square off CTA corners — use
{rounded.md} 8px, not 0px.
- Don't use a product accent color for a CTA on a page that isn't about that product. Terraform purple on the Vault page is a brand violation.
- Don't combine multiple product accents in the same viewport — the system says "this section is about THIS tool", and mixing accents breaks that signal.
- Don't add drop shadows on dark; surface lift carries elevation.
- Don't replace
hashicorpSans with a display-only sans for headlines and a different family for body. The brand is held together by one family across the full hierarchy.
Responsive Behavior
Breakpoints
| Name |
Width |
Key Changes |
| Desktop-XL |
1440px |
Default desktop layout |
| Desktop |
1280px |
Pricing 3-up grid maintained |
| Tablet |
1024px |
Product card grid 3-up → 2-up |
| Mobile-Lg |
768px |
Pricing comparison becomes per-tier accordion; nav becomes hamburger |
| Mobile |
480px |
Single-column everything; display-xl scales 80px → ~36px |
Touch Targets
- CTA buttons (
button-primary, button-secondary) maintain ≥40px tap height across viewports.
- Product pills are 24px tall on desktop and grow to 28px on touch viewports.
- Form inputs hold ≥44px tap target on touch viewports.
Collapsing Strategy
- Nav: horizontal nav with right-anchored CTAs collapses to a hamburger overlay below 768px. The primary CTA stays visible on the bar.
- Product card grid: 3-up → 2-up at 1024px → 1-up below 768px.
- Pricing comparison table: collapses into per-tier accordions below 768px to avoid horizontal scroll.
- Display type:
{typography.display-xl} 80px scales toward {typography.display-md} 40px on mobile while preserving the negative-tracking percentage.
Image Behavior
- 3D product illustrations (cubes, safes, etc.) maintain aspect ratio and never crop; below 768px they shrink rather than reflow.
- Customer logo marquee scales horizontally and may wrap to a second row at narrow widths.
Iteration Guide
- Focus on ONE component at a time and reference it by its
components: token name.
- When introducing a new section, decide first whether it's a generic feature (surface-1) or a product-identity section (product-* color).
- Default body to
{typography.body} at 500 weight; reach for {typography.subhead} only inside CTA banners and feature cards.
- Run
npx @google/design.md lint DESIGN.md after edits.
- Add new product variants as separate component entries (
product-card-nomad, button-product-consul, etc.).
- Treat the per-product palette as identity tokens, not decoration. If you reach for a product color outside its product context, the brand is drifting.
- Eyebrow type is mandatory above every section — skipping it makes sections read as floating.
Known Gaps
- The exact product-color hex values come from the
--mds-color-* CSS variable set extracted directly; they are HashiCorp's canonical brand spec.
- Shadow tokens are not extensively documented because the dark surface system uses surface lift instead of shadow elevation.
- Form-field error and validation styling is not visible on the inspected pages.
- Dark mode is the only marketing mode — light-mode adaptation is not documented.
- Product-card variants for Consul, Nomad, Vagrant, and Boundary follow the documented Terraform / Vault / Waypoint pattern but are referenced in prose only; if they need formal entries they can be added as
product-card-consul, product-card-nomad, etc.
1---2name: hashicorp-design-analysis3description: Documents HashiCorp's marketing design system: near-black canvas, per-product accent colors, hashicorpSans typography, and charcoal card surfaces for multi-product brand identity.4---56## Overview78HashiCorp's marketing canvas is a near-black ground that serves a multi-product portfolio without ever feeling generic. The dominant surface is `{colors.canvas}` (pure black) layered with `{colors.surface-1}` charcoal cards and 1px translucent gray hairlines. The chrome is monochrome — white pill-rounded buttons (`{components.button-primary}`), white type, gray secondary type — but the system is held together by a **palette of per-product accent colors** that signal which HashiCorp tool a given section belongs to: Terraform purple, Vault yellow, Consul red, Waypoint cyan, Vagrant blue, Nomad green, Boundary coral.910Display type is **hashicorpSans** at weights 600/700 with tight line-heights (1.17–1.21); body type is the same family at 500 weight with deliberately relaxed line-heights (1.50–1.71) — the contrast feels editorial, not enterprise-templated. CTAs use small `{rounded.md}` 8px corners rather than pills, which keeps the system reading as developer-facing rather than consumer-y.1112The signature device is the **product-card** family — each HashiCorp product gets its own colored card variant on the home and infrastructure pages, lifting Terraform into a violet ground, Vault into yellow, Waypoint into cyan. These aren't decorative gradients — they're identity surfaces. A reader scrolling the page can tell which product a section is about from the corner of their eye.1314**Key Characteristics:**15- Black-canvas marketing system: `{colors.canvas}` is the surface for hero, body, pricing, comparison tables, and footer alike.16- **Per-product color identity**: Terraform `{colors.product-terraform}`, Vault `{colors.product-vault}`, Waypoint `{colors.product-waypoint}`, Vagrant `{colors.product-vagrant}`, Consul `{colors.product-consul}`, Nomad `{colors.product-nomad}`, Boundary `{colors.product-boundary}` — each with its own button + card variant.17- Display headlines run hashicorpSans 600/700 with line-height 1.17–1.21 (tight); body runs the same family at 500 with 1.50–1.71 (relaxed) — the proportional gap is the brand's voice.18- CTA shape is `{rounded.md}` 8px — not a pill — keeping the system reading as developer-tool rather than consumer-app.19- Charcoal surface lift (canvas → surface-1 → surface-2) instead of shadow-driven elevation.20- 1px translucent gray hairlines (`rgba(178,182,189,0.1)`) define cards and dividers — the borders are felt more than seen.21- Eyebrow typography (12–13px, 600 weight, 0.6px positive tracking, uppercase) marks every section as a category label.2223## Colors2425> Source pages: hashicorp.com/en (home), /en/infrastructure-cloud, /en/products/terraform, /en/pricing, /en/resources?contentType=PDF.2627### Brand & Accent28- **Black** ({colors.primary}): The system primary surface. Canvas, footer, comparison tables, hero — all black.29- **White** ({colors.on-primary}): Inverse text on black; canvas of `button-primary`.30- **Accent Blue** ({colors.accent-blue}): Hyperlinks across the marketing surface.31- **Visited Purple** ({colors.semantic-visited}): Visited-link state.3233### Surface34- **Canvas** ({colors.canvas}): Default page background.35- **Surface 1** ({colors.surface-1}): Charcoal one step above canvas — feature cards, pricing cards, resource tiles.36- **Surface 2** ({colors.surface-2}): Two steps above — featured pricing card, secondary buttons, hovered product chrome.37- **Surface 3** ({colors.surface-3}): Three steps above — small chips, badges, sub-nav backgrounds.38- **Hairline** ({colors.hairline}): 1px borders on cards and dividers.39- **Hairline Soft** ({colors.hairline-soft}): Subtler dividers — comparison-table rows.40- **Inverse Canvas** ({colors.inverse-canvas}): Pure white — used as the surface of `button-primary` only.4142### Text43- **Ink** ({colors.ink}): All headline and emphasized body type — pure white.44- **Ink Muted** ({colors.ink-muted}): Secondary type at #b2b6bd — meta info, footer columns.45- **Ink Subtle** ({colors.ink-subtle}): Tertiary type at #656a76 — form helper text, timestamps, footnotes.4647### Per-Product Identity (signature)48HashiCorp's marketing isn't held together by a single accent color — it's held together by a system of product-specific accents, each used to mark which tool a section represents.4950- **Terraform Purple** ({colors.product-terraform}): Terraform sections, terraform CTAs, the violet 3D cube on the home hero.51- **Terraform Bright** ({colors.product-terraform-bright}): Saturated highlight — link emphasis on Terraform pages.52- **Vault Yellow** ({colors.product-vault}): Vault sections and CTAs.53- **Consul Red** ({colors.product-consul}): Consul sections.54- **Waypoint Cyan** ({colors.product-waypoint}): Waypoint sections, deep variant `{colors.product-waypoint-deep}` for hover/active.55- **Vagrant Blue** ({colors.product-vagrant}): Vagrant sections.56- **Nomad Green** ({colors.product-nomad}): Nomad sections.57- **Boundary Coral** ({colors.product-boundary}): Boundary sections.5859### Semantic60- **Success** ({colors.semantic-success}): Positive states (also reused as Nomad green).61- **Warning** ({colors.semantic-warning}): Warning states (also Vault yellow).62- **Error** ({colors.semantic-error}): Error states (also Consul red).63- **Amber 100** ({colors.amber-100}): Soft warm highlight — extracted but used sparingly.64- **Amber 200** ({colors.amber-200}): Saturated amber for caution badges.65- **Blue 7** ({colors.blue-7}): Deep navy used in unified-core gradients.6667## Typography6869### Font Family7071- **hashicorpSans** — HashiCorp's proprietary marketing typeface. Geometric, clean, slightly humanist. Fallback stack `__hashicorpSans_Fallback_96f0ca` (system font), then `-apple-system, BlinkMacSystemFont, Segoe UI, helvetica, arial`.7273The same family carries display, body, button, and caption — no separate display + body pairing. Hierarchy is carried by weight (500 body / 600 emphasis / 700 display) and by a deliberate line-height contrast (tight on display, relaxed on body).7475### Hierarchy7677| Token | Size | Weight | Line Height | Letter Spacing | Use |78|---|---|---|---|---|---|79| `{typography.display-xl}` | 80px | 700 | 1.17 | -2.5px | Largest hero headline |80| `{typography.display-lg}` | 56px | 700 | 1.18 | -1.6px | Section opener headlines |81| `{typography.display-md}` | 40px | 600 | 1.19 | -1.0px | Sub-section headlines |82| `{typography.headline}` | 28px | 600 | 1.21 | -0.6px | Pricing tier titles, CTA banner heading |83| `{typography.card-title}` | 22px | 600 | 1.18 | -0.4px | Feature card title |84| `{typography.subhead}` | 20px | 600 | 1.35 | -0.2px | Long-form intro paragraphs |85| `{typography.body-lg}` | 18px | 500 | 1.69 | 0 | Hero subhead, lead body |86| `{typography.body}` | 16px | 500 | 1.50 | 0 | Default body |87| `{typography.body-sm}` | 14px | 500 | 1.71 | 0 | Card body, footer columns |88| `{typography.caption}` | 13px | 500 | 1.38 | 0.2px | Meta, comparison cell labels |89| `{typography.button}` | 14px | 600 | 1.29 | 0 | Pill / square CTA buttons |90| `{typography.eyebrow}` | 12px | 600 | 1.23 | 0.6px | Uppercase section eyebrows |9192### Principles9394- **Tight on display, relaxed on body.** Display sits at line-height 1.17–1.21; body lifts to 1.50–1.71. The size + line-height contrast carries hierarchy.95- **Weight hierarchy is small.** 500 body / 600 emphasis / 700 display. No light / black extremes — the brand reads as engineered.96- **Eyebrow positive-tracked uppercase 12px is the section header.** Every meaningful section has one above the headline.97- **No mono.** Despite being a developer-tools brand, the marketing surface uses no monospace face — code voice is reserved for in-product surfaces.9899### Note on Font Substitutes100101If implementing without hashicorpSans, suitable open-source substitutes include **Inter** (closest geometric character set), **Geist Sans**, or **IBM Plex Sans**. Inter at weights 500 / 600 / 700 closely approximates hashicorpSans's proportions; expect to manually adjust line-heights down by ~0.02 to match.102103## Layout104105### Spacing System106107- **Base unit**: 8px (the primary increments are 4 / 8 / 12 / 16 / 24 / 32 / 48).108- **Tokens (front matter)**: `{spacing.hair}` 1px · `{spacing.xxs}` 4px · `{spacing.xs}` 8px · `{spacing.sm}` 12px · `{spacing.md}` 16px · `{spacing.lg}` 24px · `{spacing.xl}` 32px · `{spacing.xxl}` 48px · `{spacing.section}` 96px.109- Card interior padding: `{spacing.lg}` 24px on product cards; `{spacing.xl}` 32px on pricing cards; `{spacing.xxl}` 48px on CTA banners.110- Button padding: 10px vertical · 18px horizontal on `{components.button-primary}`.111- Universal rhythm constant: `{spacing.section}` (96px) vertical gap between major sections.112113### Grid & Container114115- Max content width sits around 1280px with side gutters scaling from `{spacing.xxl}` on desktop down to `{spacing.lg}` on mobile.116- Product card grids are 3-up on desktop, 2-up at tablet, 1-up on mobile.117- Pricing tier grid is 3-up across desktop; comparison table beneath uses fixed-width left column.118- Resource directory (PDF library) uses 4-up dense thumbnail grid.119120### Whitespace Philosophy121122The dark canvas IS the whitespace. Sections separate by surface lift (canvas → surface-1) rather than by gaps in white. Within a section, generous `{spacing.xl}` 32px gaps separate cards; `{spacing.lg}` 24px separates rows.123124## Elevation & Depth125126| Level | Treatment | Use |127|---|---|---|128| 0 (flat) | No shadow, no border | Canvas-mounted display type, hero, footer |129| 1 (charcoal lift) | `{colors.surface-1}` background + 1px `rgba(178,182,189,0.1)` border | Default cards, resource tiles, pricing cards |130| 2 (surface-2 lift) | `{colors.surface-2}` background + 1px `{colors.hairline}` border | Featured pricing card, hovered cards, sub-nav |131| 3 (product chromatic) | Per-product accent color background — Terraform purple, Vault yellow, Waypoint cyan | Product showcase cards |132133The product chromatic level isn't a "modal lift" — it's an identity device. A Terraform card sits at the same z-plane as a feature-card; the difference is meaning, not depth.134135### Decorative Depth136137- **3D product visuals** — isometric purple cubes (Terraform), translucent yellow safes (Vault), and similar product-tinted illustrations sit in the right column of hero sections.138- **1px translucent gray hairlines** are the dominant edge — borders are visible without competing.139- **No drop shadows on dark.** Cards lift via surface change, never shadow.140141## Shapes142143### Border Radius Scale144145| Token | Value | Use |146|---|---|---|147| `{rounded.xs}` | 4px | Small chips / badges |148| `{rounded.sm}` | 6px | Inline tag |149| `{rounded.md}` | 8px | All CTA buttons, form inputs, list items |150| `{rounded.lg}` | 12px | Feature cards, product cards, pricing cards |151| `{rounded.xl}` | 16px | Large illustrative tiles |152| `{rounded.xxl}` | 24px | CTA banner panels |153| `{rounded.pill}` | 9999px | Eyebrow-style product pills (small chips) |154| `{rounded.full}` | 9999px | Avatar circles (rare on marketing) |155156### Photography & Illustration Geometry157158- Product 3D illustrations use full-bleed within their container — no rounded inner mask.159- Logo chips in the customer marquee sit on `{rounded.sm}` 6px tiles with 1px hairline.160- Resource thumbnails use `{rounded.lg}` 12px corners.161162## Components163164### Buttons165166**`button-primary`** — White rounded-rect CTA. Used as primary CTA on all pages.167- Background `{colors.inverse-canvas}`, text `{colors.inverse-ink}`, type `{typography.button}`, padding 10px 18px, rounded `{rounded.md}`.168- Pressed state lives in `button-primary-pressed`.169170**`button-secondary`** — Charcoal rounded-rect. Secondary CTA, "Read docs" / "Talk to sales".171- Background `{colors.surface-2}`, text `{colors.ink}`, type `{typography.button}`, rounded `{rounded.md}`, padding 10px 18px.172173**`button-tertiary`** — Bare ghost button on canvas with text-only treatment.174- Background `{colors.canvas}`, text `{colors.ink}`, type `{typography.button}`, rounded `{rounded.md}`, padding 10px 18px.175176**`button-product-terraform`** — Terraform-tinted CTA on Terraform pages.177- Background `{colors.product-terraform}`, text `{colors.ink}`, type `{typography.button}`, rounded `{rounded.md}`, padding 10px 18px.178179**`button-product-vault`** — Vault-yellow CTA.180- Background `{colors.product-vault}`, text `{colors.inverse-ink}` (yellow needs dark text), type `{typography.button}`, rounded `{rounded.md}`, padding 10px 18px.181182**`button-product-waypoint`** — Waypoint-cyan CTA.183- Background `{colors.product-waypoint}`, text `{colors.inverse-ink}`, type `{typography.button}`, rounded `{rounded.md}`, padding 10px 18px.184185(Vagrant blue, Nomad green, Consul red, Boundary coral follow the same pattern with their respective `{colors.product-*}` token.)186187### Cards & Containers188189**`product-card`** — Default product showcase card — surface-1 charcoal.190- Background `{colors.surface-1}`, text `{colors.ink}`, type `{typography.body}`, rounded `{rounded.lg}`, padding 24px.191192**`product-card-terraform`** — Product card with Terraform purple ground (used as identity surface, not modal elevation).193- Background `{colors.product-terraform}`, text `{colors.ink}`, type `{typography.body}`, rounded `{rounded.lg}`, padding 24px.194195**`product-card-vault`** — Vault-yellow ground.196- Background `{colors.product-vault}`, text `{colors.inverse-ink}`, otherwise identical structure.197198**`product-card-waypoint`** — Waypoint-cyan ground.199- Background `{colors.product-waypoint}`, text `{colors.inverse-ink}`, otherwise identical structure.200201(Other product variants follow the same shape with their respective product token.)202203**`feature-card`** — Generic feature highlight on surface-1.204- Background `{colors.surface-1}`, text `{colors.ink}`, type `{typography.body}`, rounded `{rounded.lg}`, padding 24px.205206**`pricing-card`** — Pricing tier on `/en/pricing`.207- Background `{colors.surface-1}`, text `{colors.ink}`, type `{typography.body}`, rounded `{rounded.lg}`, padding 32px.208209**`pricing-card-featured`** — Recommended tier (visually emphasized via surface lift).210- Background `{colors.surface-2}`, otherwise identical structure.211212**`resource-card`** — PDF / whitepaper / guide tile in the resources directory.213- Background `{colors.surface-1}`, text `{colors.ink}`, type `{typography.body-sm}`, rounded `{rounded.lg}`, padding 16px.214215### Inputs & Forms216217**`text-input`** + **`text-input-focused`** — Form fields on pricing seat-count and contact forms.218- Background `{colors.surface-1}`, text `{colors.ink}`, type `{typography.body}`, rounded `{rounded.md}`, padding 10px 14px.219- Focused state retains the same surface; the focus ring is a 1px `{colors.accent-blue}` outline.220221### Pills & Chips222223**`product-pill`** — Small product-name chip used above hero headlines and on resource cards to label which product a piece of content belongs to.224- Background `{colors.surface-1}`, text `{colors.ink-muted}`, type `{typography.caption}`, rounded `{rounded.pill}`, padding 4px 10px.225226### Comparison Table227228**`comparison-row`** — Single row inside the pricing comparison table.229- Background `{colors.canvas}`, text `{colors.ink-muted}`, type `{typography.body-sm}`. Row separator is `{colors.hairline-soft}`.230231### CTA Banner232233**`cta-banner`** — Large rounded panel used at the bottom of long-form pages with a closing CTA.234- Background `{colors.surface-1}`, text `{colors.ink}`, type `{typography.subhead}`, rounded `{rounded.xxl}`, padding 48px.235236### Navigation237238**`top-nav`** — Sticky black bar with HashiCorp logomark left, primary nav links centered, and a `button-primary` ("Sign up") + `button-secondary` ("Sign in") pair right.239- Background `{colors.canvas}`, text `{colors.ink}`, type `{typography.body-sm}`, height 64px.240- Mobile: collapses primary links into a hamburger; the primary CTA remains visible.241242### Footer243244**`footer`** — Dense link grid on `{colors.canvas}` with the wordmark at left and 5–6 columns of caption-sized links.245- Background `{colors.canvas}`, text `{colors.ink-muted}`, type `{typography.caption}`, padding 64px 32px.246247## Do's and Don'ts248249### Do250251- Reserve `{colors.canvas}` (black) and `{colors.surface-1}` (charcoal) as the system's two anchor surfaces. Every band of the page is one or the other.252- When introducing a section about a specific HashiCorp product, use that product's `{colors.product-*}` token consistently — for the section pill, the CTA button, and (where appropriate) the showcase card background.253- Use `{rounded.md}` 8px on CTA buttons; HashiCorp's brand reads as engineered, not consumer.254- Pair tight display line-heights (1.17–1.21) with relaxed body line-heights (1.50–1.71). The contrast IS the brand voice.255- Use the eyebrow typography (`{typography.eyebrow}`, uppercase, 0.6px tracking) above every meaningful section.256- Use surface lift (canvas → surface-1 → surface-2) to express hierarchy on dark.257- Reserve product-chromatic cards for product identity; keep generic feature cards on `{colors.surface-1}`.258259### Don't260261- Don't ship a light-mode marketing page. HashiCorp's marketing brand IS dark.262- Don't introduce mid-tone gray text outside the documented `ink` / `ink-muted` / `ink-subtle` set.263- Don't square off CTA corners — use `{rounded.md}` 8px, not 0px.264- Don't use a product accent color for a CTA on a page that isn't about that product. Terraform purple on the Vault page is a brand violation.265- Don't combine multiple product accents in the same viewport — the system says "this section is about THIS tool", and mixing accents breaks that signal.266- Don't add drop shadows on dark; surface lift carries elevation.267- Don't replace `hashicorpSans` with a display-only sans for headlines and a different family for body. The brand is held together by one family across the full hierarchy.268269## Responsive Behavior270271### Breakpoints272273| Name | Width | Key Changes |274|---|---|---|275| Desktop-XL | 1440px | Default desktop layout |276| Desktop | 1280px | Pricing 3-up grid maintained |277| Tablet | 1024px | Product card grid 3-up → 2-up |278| Mobile-Lg | 768px | Pricing comparison becomes per-tier accordion; nav becomes hamburger |279| Mobile | 480px | Single-column everything; display-xl scales 80px → ~36px |280281### Touch Targets282283- CTA buttons (`button-primary`, `button-secondary`) maintain ≥40px tap height across viewports.284- Product pills are 24px tall on desktop and grow to 28px on touch viewports.285- Form inputs hold ≥44px tap target on touch viewports.286287### Collapsing Strategy288289- **Nav**: horizontal nav with right-anchored CTAs collapses to a hamburger overlay below 768px. The primary CTA stays visible on the bar.290- **Product card grid**: 3-up → 2-up at 1024px → 1-up below 768px.291- **Pricing comparison table**: collapses into per-tier accordions below 768px to avoid horizontal scroll.292- **Display type**: `{typography.display-xl}` 80px scales toward `{typography.display-md}` 40px on mobile while preserving the negative-tracking percentage.293294### Image Behavior295296- 3D product illustrations (cubes, safes, etc.) maintain aspect ratio and never crop; below 768px they shrink rather than reflow.297- Customer logo marquee scales horizontally and may wrap to a second row at narrow widths.298299## Iteration Guide3003011. Focus on ONE component at a time and reference it by its `components:` token name.3022. When introducing a new section, decide first whether it's a generic feature (surface-1) or a product-identity section (product-* color).3033. Default body to `{typography.body}` at 500 weight; reach for `{typography.subhead}` only inside CTA banners and feature cards.3044. Run `npx @google/design.md lint DESIGN.md` after edits.3055. Add new product variants as separate component entries (`product-card-nomad`, `button-product-consul`, etc.).3066. Treat the per-product palette as identity tokens, not decoration. If you reach for a product color outside its product context, the brand is drifting.3077. Eyebrow type is mandatory above every section — skipping it makes sections read as floating.308309## Known Gaps310311- The exact product-color hex values come from the `--mds-color-*` CSS variable set extracted directly; they are HashiCorp's canonical brand spec.312- Shadow tokens are not extensively documented because the dark surface system uses surface lift instead of shadow elevation.313- Form-field error and validation styling is not visible on the inspected pages.314- Dark mode is the only marketing mode — light-mode adaptation is not documented.315- Product-card variants for Consul, Nomad, Vagrant, and Boundary follow the documented Terraform / Vault / Waypoint pattern but are referenced in prose only; if they need formal entries they can be added as `product-card-consul`, `product-card-nomad`, etc.