An editorial-grade design system for services firms, portfolios, and marketing sites. Structure felt, not seen.
Version v1.1Theme Dark-firstAccent Single-hue teal #66D9C2Density Generous · 4px–160pxIcons Phosphor Light/Regular · 1.5px strokeWCAG AA minimum · AAA body
§1.1
Color system
Surfaces
Page background
--color-bg
#141312
Surface default
--color-surface
#1A1918
Surface raised
--color-surface-2
#1E1D1B
Surface offset
--color-surface-offset
#222120
Surface dynamic
--color-surface-dynamic
#26251F
Text levels
Text primary
--color-text
#F5F4F0
Text muted
--color-text-muted
rgba(245,244,240,0.70)
Text faint
--color-text-faint
rgba(245,244,240,0.40)
Text inverse
--color-text-inverse
#141312
Accent — single hue, 4 states
Primary
--color-primary
#66D9C2
Hover lift
--color-primary-hover
#7EE5D0
Pressed
--color-primary-active
#55C2AC
Subtle bg tint
--color-primary-subtle
rgba(102,217,194,0.12)
Semantic trio (no info level)
Success
--color-success
#7BC97A
Warning
--color-warning
#E8B24D
Error
--color-error
#E07B6D
Accessibility verification (dark mode)
Foreground
Background
Ratio
Use case
Status
--color-text
--color-bg
15.8:1
Body text on page bg
AAA
--color-text
--color-surface
14.6:1
Body text on surface
AAA
--color-text-muted
--color-bg
10.4:1
Secondary copy
AAA
--color-text-faint
--color-bg
5.3:1
Metadata, captions
AA
--color-primary
--color-bg
9.8:1
Links, accent text
AAA
--color-text-inverse
--color-primary
9.8:1
Text on CTA button
AAA
--color-primary
--color-surface
9.1:1
Active nav, icons
AAA
--color-success
--color-bg
7.4:1
Success badges
AAA
--color-warning
--color-bg
6.1:1
Warning badges
AAA
--color-error
--color-bg
4.7:1
Error (supplement with icon)
AA
§1.2
Typography
All sizes use fluid clamp() — no fixed pixel declarations. Instrument Serif italic carries editorial emphasis; Inter handles body. Italic is reserved for display headlines and pull quotes — never body copy.
--content-wide1200px — case studies, hero compositions
--content-max1440px — full-bleed compositions
§1.4
Elevation
Default elevation via background surface shift. Shadows reserved for floating elements only. All shadows are warm — derived from the teal primary. Cold #000 rgba shadows are banned.
CSS note: The canonical spec uses oklch(from var(--color-primary) l c h / 0.08) (relative color syntax). The fallback values above are rgba equivalents for broad browser support. Both are warm — never cold rgba(0,0,0,…).
Banned: Never apply both border AND shadow to the same element (double visual weight). Never use pill-rounded corners (32px+) on cards — that belongs to Current.
§1.6
Motion
Use motion sparingly: hover state changes, scroll-spy active nav, section reveal on enter. Reduced-motion fallback: fade-only at --duration-fast.
@media (prefers-reduced-motion: reduce) {
*, *::before, *::after {
animation-duration: 0.01ms !important;
animation-iteration-count: 1 !important;
transition-duration: var(--duration-fast) !important;
}
}
/* Remove transform animations entirely — do not just shorten them */
Banned motion patterns
Parallax > 20% offset
Scroll-jacking of any kind
Animated gradient backgrounds
Bouncing micro-animations
Marquee / ticker animations
§1.7
Iconography
Phosphor (light or regular weight) is the sole icon family for Harbor. The light + regular weights carry editorial warmth and rounded character that match Harbor's serif italic display and warm oklch shadows. Stroke: 1.5px. Grid: 24px (16px for inline UI). Color: currentColor only — never hex. Line icons only — no filled icons except severity badges.
NOT Lucide. Lucide is too utilitarian — that belongs to Sentinel. Harbor requires Phosphor's editorial warmth. Substitute Iconoir (closest equivalent) only if Phosphor is unavailable in your toolchain.
Line vs filled: All Harbor icons are line weight. The Warning triangle above is the sole exception — severity badges (success/warning/error) may use the filled/solid Phosphor variant for stronger visual signal. Never use filled icons as general UI decoration.
§2
Voice & content
One primary CTA per section. Action-first verbs. Italic serif on key words only. Numbers over hyperbole. Max line: 68ch paragraphs, 56ch leads, 52ch pull quotes.
Do
"Read the case study"
Specific, verb-first, tells the reader exactly what they get.
Don't
"Learn More"
Zero specificity. AI default slop that erodes trust on first read.
Do
"Cut expense reports from 45 minutes to 3"
Numbers earn trust. Specific claims signal real experience.
Don't
"Revolutionize your workflow"
Hyperbole erodes trust. Reader immediately discounts the claim.
Do
"Upload failed. The file is over 10MB. Try compressing it."
What / Why / How formula. The reader knows exactly what to do.
Don't
"Error: Invalid file."
What happened? Why? What can I do? The reader is left stranded.
Do
We design with restraint.
Italic serif carries emphasis. One word. The sentence earns it.
Don't
WE DESIGN WITH RESTRAINT.
ALL CAPS shouts. Italic whispers meaningfully. Shouting is for billboards.
Banned CTA verbs
Learn MoreClick HereSubmitGet StartedDiscoverExploreUnlock the Power of XLet's embark on
Allowed CTA verbs
Read the case studySee how we workBook a 30-minute callSee a live demoView the portfolioDownload the brief
§3.1
Foundation components
1. Button
4 variants × 3 sizes × 6 states. Arrows ONLY on navigation CTAs — never on submit buttons. Never two primary buttons adjacent.
Variants
Sizes — primary
States
Banned: "Get Started", "Submit →", arrows on non-navigation buttons, two teal primaries adjacent
2. Icon button
sm (28px) · md (36px) · lg (44px)
aria-label required on all. Ghost by default — borders only on dense toolbars.
3. Field (text input + textarea)
Labels ALWAYS above and visible. Floating labels are banned. Hint text below. Error text replaces hint.
We'll send confirmation here.
Email format not recognized. Try name@example.com.
4. Selection controls
Dark mode
5–6. Tag / Badge / Chip
Badge variants
DesignFeaturedPublishedDraftArchived
Chip (removable / selectable)
Branding Strategy
7. Avatar
Initials only by default. Two-letter monogram on warm tint. Stock photos are banned (governance rule).
IS
IS
IS
IS
sm (24px) · md (32px) · lg (48px) · xl (96px)
§3.2
Composite components
8. Pull quote
Structure should be felt, not seen. The page reads as a composition rather than a control panel.
— Harbor Design Principles · v1.1
No quotation marks. Left rule 2px primary. max-width 52ch. Attribution in --text-sm muted, tracking-wide.
9. Card variants (7)
9a Card — Flat
Brand strategy review
Default 1px border, no shadow. 90% of Harbor cards.
9b Card — Raised
Hovering item
No border. Warm shadow-sm. surface-2 background.
9c Card — Interactive (hover me)
Rebranding a 20-year firm
Hover lifts -2px + shadow-sm. Full card is tap target.
Harbor sells marketing pages, case studies, and pricing pages that get printed. Every Harbor product ships @media print rules by default. Case studies and pricing pages must print to a single PDF that's pitch-deck quality.
Harbor rule: Print rules are included in the canonical tokens.css output of Prompt 1 — no separate print-stylesheet module needed. Case studies and pricing pages must print to a single PDF that's pitch-deck quality for clients and designers.
§3.D
Domain layer
Domain components are composed FROM Layer 1–3 using Harbor's rules. Each inherits the states and accessibility requirements of its constituent primitives. Below are 5 named examples for editorial / marketing products.
Why most rebrand projects fail before the first sketch
Three patterns we've seen across 42 projects — and what teams can do differently starting in week one.
AR
Amara Reyes·8 min read
Editorial Systems
Structure should be felt, not seen
How Harbor's single-accent rule forces composition thinking instead of decoration-by-default.
MK
Marcus Ko·5 min read
26. Author bio block
Composes: Avatar-xl (7) + body paragraph + icon buttons (2). Initials variant default — real photos only for case-study attribution.
AR
Amara Reyes
Design Director · Harbor
Amara leads editorial strategy and visual identity for Harbor's client engagements. She's worked with services firms in 8 countries over 12 years, helping them communicate with the authority their work deserves.
27. Service tier card
Composes: Card-Service (9d) + Pull quote (8) + numbered list. 2-col grid on desktop — NOT 3-col.
Editorial strategy
Positioning, narrative architecture, and content infrastructure for services firms ready to publish with authority.
Composes: Card-CaseStudy (9e) + Pull quote (8) + Card-Stat (9g). Outcome stat in display serif. No quote marks.
4:5 image
They didn't design our site. They redesigned how we talk about ourselves — and the revenue followed.
+38%
Revenue lift · 6 months post-launch
— Founder, Series B SaaS · Meridian Labs
29. Editorial newsletter inline block
Composes: CTA Block (template 06) + Field (3) + Button (1). Appears ONCE per article, after 60% scroll. Never as popup, sticky bar, or scroll-triggered modal.
We publish one editorial letter on Fridays — no noise, just the work that matters.
Success state replaces form with: Thanks. Check your inbox.
§5
Accessibility
WCAG 2.1 conformance
Body text ≥ 4.5:1 (AA). Primary body text achieves AAA (15.8:1). All Harbor default pairings verified in §1.1 table.
Large text (18pt+ or 14pt bold) ≥ 3:1. Harbor display headings meet AAA at every viewport width.
When using Prompt 1b (Bring Your Own Colors variant), your supplied palette must cover all 16 semantic roles below. Prompt 1b validates coverage before generating tokens.css.
1
Page background
Warm off-black (dark) or warm off-white (light). Never pure #000 or #FFF.
2
Surface — default
Raised one tint from page background.
3
Surface — raised
Raised two tints from page background.
4
Surface — offset
For contrast blocks, alternate sections.
5
Surface — dynamic
Warmer tone for feature blocks (e.g., metrics block background).
70% of primary text — secondary copy, card bodies.
8
Text — faint
40% of primary text — metadata, captions, eyebrows.
9
Text — inverse
Text on accent CTA buttons (dark-on-teal or white-on-dark-teal).
10
Accent — primary
The SINGLE accent hue (Harbor rule: one hue, 4 states only).
11
Accent — hover
Primary lifted ~5% lightness for hover state.
12
Accent — active
Primary darkened ~5% lightness for pressed state.
13
Accent — subtle
Primary at 12% opacity — background tint for selected states, nav active.
14
Border — divider
Hairline separator (~6% opacity of text color).
15
Border — outline
Component outlines, card borders (~12% opacity of text color).
16
Focus ring
Accent primary at 60% opacity — keyboard focus indicator.
Rejected palettes (Prompt 1b will fail)
Multi-hue ramps (more than ONE accent hue)
Pure #000 / #FFF surfaces or text colors
Indigo / purple in any role (Harbor anti-pattern — clichéd "AI startup" signal)
More than 4 accent states (Harbor rule: primary / hover / active / subtle only)
Selection
When to pick Harbor
Pick Harbor if the product is a marketing site, editorial site, brand-forward portfolio, services firm, agency site, content publication, blog, or documentation-marketing hybrid. Reader spends 1–3 minutes per session, primarily reading.
Sample adjectives that route to Harbor
Archetype-selection aid (Finding 5 demoted-adjective routing). If three or more of your brand adjectives are in this list, Harbor is likely your archetype.
Pentagram, IDEO, Instrument — most agency portfolio sites follow this pattern naturally
Do NOT pick Harbor if…
Users spend hours per session doing tasks → Sentinel (compact density, multi-ramp, data UI)
Touch targets, gestures, bottom nav matter → Current (44px enforced, mobile-first)
Information density beats whitespace → Lattice (max density, data-explorer)
Body text IS the hero (docs, long-form prose) → Meridian (utilitarian headings, body-as-hero)
You need 9-step color granularity for status / severity / charts → Sentinel
Mobile-first consumer app with bold saturation → Current
Failure modes
What breaks first when Harbor is misapplied
When teams force Harbor onto the wrong use case, predictable failures appear in this order. Use these as early-warning signs that the archetype is wrong — not as bugs to fix.
1
Data crowding (Harbor on a dashboard / data product)
Symptom: Tables collapse because Harbor's generous spacing leaves no room for rows. 5 rows visible where 50 are needed. Root cause: Harbor's spacing scale starts at 4px and goes to 160px — product UI needs density, not atmosphere.
Switch to Sentinel (compact density) or Lattice (max density).
2
Status-color exhaustion (Harbor on a workflow product)
Symptom: You start adding a "review" badge color, then "approval pending", then "blocked", then "draft" — running out of accent variants because Harbor allows ONE accent. Root cause: Single-hue rule is incompatible with multi-status workflows.
Switch to Sentinel (multi-ramp + semantic color system).
3
Touch-target failures (Harbor on mobile-first)
Symptom: Buttons feel imprecise on phones, taps miss, users complain. Harbor doesn't enforce 44px minimums. Root cause: Harbor is desktop-editorial first; mobile is a responsive afterthought, not the primary target.
Switch to Current (44px touch targets enforced throughout).
4
Editorial display crowding (Harbor on long-form docs)
Symptom: Serif italic display headlines feel showy mid-article; readers complain the page "feels marketing-y". Root cause: Harbor's display-italic emphasis is for hero moments, not body content. Using it throughout a docs page breaks the signal.
Switch to Meridian (utilitarian headings, body-as-hero, 1.7 line-height).
5
The "feels samey" failure (Harbor everywhere on a multi-page site)
Symptom: Every page reads atmospheric and slow even when the content is utilitarian (FAQ, status page, search results). Root cause: Harbor's atmospheric rhythm is great for hero surfaces, fatiguing for utility pages.
Use Harbor for hero / brand surfaces only; layer Sentinel or Meridian for utility surfaces per Hybrid Products in Governance.