Design Principles

Design Principles

These principles guide how we build interfaces at Frequency. They apply to dashboards, tools, and product UI — not marketing pages.

Core Principles

1. Clarity Over Complexity

Every element should serve a purpose. If removing something doesn’t change the meaning, remove it. Whitespace is a design tool — use it to separate ideas and let content breathe.

Do: Clean layouts, generous whitespaceDon’t: Decorative noise, visual clutter

2. Consistency Builds Trust

Use the same patterns, spacing, and components everywhere. Consistency reduces cognitive load and creates familiarity. If a card has 16px padding on one page, it has 16px padding on every page.

Do: Reusable components, standard spacingDon’t: One-off designs, random values

3. Accessible by Default

Design for everyone from the start. WCAG 2.1 AA is the floor, not the ceiling. Every interactive element needs visible focus states. Every color combination needs sufficient contrast. Accessibility is not a feature — it’s a quality bar.

Do: 4.5:1 contrast, visible focus ringsDon’t: Low contrast text, missing states

4. Every Choice Must Be a Choice

For every decision, you should be able to explain why. Why this layout? Why this color? Why this spacing? If your answer is “it’s common” or “it works” — you haven’t chosen, you’ve defaulted. Defaults are invisible. Invisible choices compound into generic output.

Do: Intentional decisions with rationaleDon’t: Copying templates without thought

5. Data Informs Design

Design hypotheses should be testable. Use real user behavior, not assumptions, to guide decisions. A number on screen is not design — the question is: what does this number mean to the person looking at it, and what will they do next?

Do: User testing, measurable outcomesDon’t: Guessing, designing for yourself

Surface & Depth

Professional interfaces separate themselves from amateur ones in how they handle surfaces. Study Vercel, Linear, Supabase — their elevation changes are so subtle you almost can’t see them, but you feel the hierarchy.

Surface Elevation

Surfaces stack. A dropdown sits above a card which sits above the page. Build a numbered system:

LevelRoleExample
0Base canvasApp background
1Cards, panelsSame visual plane as base
2Floating UIDropdowns, popovers
3Stacked overlaysNested dropdowns
4Highest elevationModals, command palettes

In dark mode: higher elevation = slightly lighter. In light mode: higher elevation = slightly lighter or uses shadow.

The difference between levels should be whisper-quiet — a few percentage points of lightness, not dramatic jumps.

Depth Strategy

Choose one approach and commit across the product:

StrategyFeelWhen to use
Borders onlyClean, technical, denseData-heavy tools, developer interfaces
Subtle shadowsSoft, approachableGeneral product UI
Layered shadowsPremium, dimensionalCards that need physical presence

Don’t mix strategies. A product with shadow cards and bordered tables feels inconsistent.

/* Borders-only */
border: 0.5px solid rgba(0, 0, 0, 0.08);
 
/* Subtle shadow */
box-shadow: 0 1px 3px rgba(0, 0, 0, 0.08);
 
/* Layered shadow */
box-shadow:
  0 0 0 0.5px rgba(0, 0, 0, 0.05),
  0 1px 2px rgba(0, 0, 0, 0.04),
  0 2px 4px rgba(0, 0, 0, 0.03),
  0 4px 8px rgba(0, 0, 0, 0.02);

Borders

Borders should define regions without demanding attention. They should disappear when you’re not looking for them, but be findable when you need to understand structure.

  • If borders are the first thing you notice, they’re too strong
  • If you can’t tell where regions begin and end, they’re too subtle
  • Use low opacity (0.05–0.12 alpha in dark mode, slightly higher in light)

Spacing System

Use an 8px base unit. Every spacing value is a multiple. Random values signal no system.

TokenValueUsage
xs4pxIcon gaps, tight element pairs
sm8pxRelated inline elements
md16pxDefault component padding
lg24pxSection spacing
xl32pxMajor sections
2xl48pxPage-level spacing

Padding Rules

Keep padding symmetrical. If top is 16px, sides and bottom are 16px too — unless there’s a clear structural reason.

/* Good */
padding: 16px;
padding: 12px 16px; /* Only when horizontal needs more room */
 
/* Bad — random values signal no system */
padding: 24px 16px 12px 16px;

Typography Hierarchy

Type is not a container — it IS the design. The weight of a headline, the personality of a label, the texture of a paragraph shape how the product feels before anyone reads a word.

Four Levels of Text

Don’t just have “text” and “gray text.” Use all four consistently:

LevelColorUsage
Primary#383838Default text, highest contrast
Secondary#808080Supporting text, descriptions
Tertiarygray[4]Metadata, timestamps
Muted#CCCCCCDisabled, placeholder

Type Pairing

RoleFontWeightTracking
HeadlinesMontserrat600–700-1px to -2px
BodySource Sans 3400Normal
Labels/UISource Sans 3600Normal
Data/CodeMonospace400Normal

Headlines need weight and tight tracking to feel authoritative. Body needs comfortable weight for sustained reading. Data needs monospace with font-variant-numeric: tabular-nums for column alignment.


Color Usage

Gray builds structure. Color communicates. Unmotivated color is noise.

Color Primitives

Every color in the interface should trace back to these primitives:

PrimitivePurposeFrequency Token
ForegroundText hierarchy (primary, secondary, muted)#383838, #808080, #CCCCCC
BackgroundSurface elevation (base, elevated, overlay)#FFFFFF, gray[1], #1A1A1A
BorderSeparation (default, subtle, strong)Low-opacity neutrals
BrandPrimary accent, identityblue[5] #169BDE
SemanticStatus communicationred[5], yellow[5], green[5]

Don’t invent new colors. Map everything to these primitives. No random hex values — everything traces to the system.

One Accent, Used with Intention

One accent color used purposefully beats five colors used without thought. Frequency Blue (#169BDE) is the primary accent. Violet (#7E57C2) is secondary. Use semantic colors only for their intended meaning.


Interaction States

Every interactive element needs states. Missing states feel broken.

Controls

StateVisual Treatment
DefaultBase appearance
HoverSubtle background shift or border change
Active/PressedSlightly darker than hover
FocusVisible ring (2px offset, brand color)
DisabledReduced opacity (0.5), no pointer events

Data States

StateTreatment
LoadingSkeleton placeholders, not spinners
EmptyHelpful message + clear action
ErrorRed semantic color + recovery path

Form Controls

Native <select> and <input type="date"> cannot be styled consistently. Build custom components using Mantine’s primitives instead. Every input needs: label above (not placeholder-as-label), visible error state, and helpful error messages.


Animation

Keep it fast and functional. Animation should guide attention, not perform.

TypeDurationEasing
Micro (hover, focus)~150msease-out
Transitions (modals, panels)200–250msease-out
Content entry300–500msease-out
  • No spring or bounce effects in product UI — they feel playful, not professional
  • Always respect prefers-reduced-motion
  • If you can’t explain what the animation communicates, remove it

Dark Mode

Dark interfaces have different needs. Same hierarchy, different execution.

ConcernLight ModeDark Mode
ElevationShadows or lighter surfacesLighter surfaces (shadows less visible)
BordersLow opacityLean more on borders for definition
Semantic colorsFull saturationSlightly desaturated
Text contrastDark on lightLight on dark, reduce pure white

Z-Index Scale

LayerValueUsage
Base0Default content
Dropdown10Menus, selects
Sticky20Sticky headers
Modal30Modal overlays
Popover40Tooltips, popovers
Toast50Notifications

Responsive Design

Design mobile-first, then enhance for larger screens:

BreakpointWidthTarget
sm640pxLarge phones
md768pxTablets
lg1024pxLaptops
xl1280pxDesktops
2xl1536pxLarge screens

The Craft Checklist

Before shipping any interface, run these checks:

  • The squint test: Blur your eyes at the interface. Can you still perceive hierarchy? Is anything jumping out harshly? Craft whispers.
  • The swap test: If you swapped the typeface or layout for a generic alternative, would anyone notice? Where it wouldn’t matter is where you defaulted.
  • The state test: Does every interactive element have hover, focus, active, and disabled states? Does data have loading, empty, and error states?
  • The token test: Read your CSS variables out loud. Do they trace back to the system? No random hex values?
  • The consistency test: Is spacing, padding, border radius, and depth strategy uniform across the entire interface?