Design Principles
Seven core principles that guide every design decision across Web, iPad, Phone, and Touch Device products.
Every element serves a purpose. Data-heavy interfaces demand immediate legibility. When in doubt, simplify.
Lead with the metric, the next action, or the insight. Surfaces answer "what happened" and "what should I do next" first.
Show only what matters at each level. Summary first, detail on demand. Respect the user's attention budget.
All four products must work with touch. Minimum 44px touch targets. Design for fingers first, enhance for precision.
Animation communicates state changes and guides attention. It never decorates for its own sake. Respect prefers-reduced-motion.
WCAG AA compliance built in from the start. Color contrast, focus indicators, semantic markup, and keyboard navigation in every component.
The depth gradient, teal accent, Inter typeface, and solution-color system must be recognizable on every surface.
Color System
A unified palette spanning brand identity, solution verticals, semantic states, and dark/light modes.
| Pair | Ratio | Level |
|---|---|---|
| White on Deep Navy | 16.5:1 | AAA |
| Charcoal on White | 16.8:1 | AAA |
| Cyan on Midnight | 10.1:1 | AAA |
| Teal on White | 3.1:1 | Large text only |
| Error on White | 4.6:1 | AA |
Typography
Inter is the sole typeface across all products. Headlines use weight 500, subheads use weight 300.
Subheads always use weight 300 (light) at 15px with 60% opacity of the base text color.
Spacing & Layout
An 8px base grid with responsive section padding and a 12-column layout system.
Elevation & Radius
Shadow and corner radius tokens that create consistent depth across surfaces.
Motion
Duration and easing tokens for consistent, purposeful animation across all products.
Core Components
24 production-ready components with interactive previews. Each includes anatomy, states, and accessibility guidance.
Design Patterns
Reusable patterns for common interface scenarios across all products.
Forms
Single-column layout, max-width 480px. Labels above inputs.
- Validate on blur, not on keystroke
- Error: red border + message below field
- Focus first invalid field on submit
- Spinner inside submit button while loading
- Field-to-field gap: 20px (space-5)
Navigation
Platform-specific patterns for each product surface.
- Web: Fixed top bar + collapsible sidebar (240px)
- iPad: Top bar + optional bottom tabs
- Phone: Top bar + bottom tab bar (5 max)
- Touch: Minimal chrome, maximum content
- Max 7 top-level items on desktop
Error States
Specific, actionable, and never show raw errors.
- Input: Red border + message below
- Page: Centered illustration + next step
- Network: Toast with retry action
- 404/500: Illustration + link to home
- Use role="alert" for critical errors
Empty States
Guide users toward their first action.
- Muted icon (48px, 30% opacity)
- Headline: 20px, weight 500
- Description: 15px, weight 400, muted
- Primary action button below
- Centered, py-16 vertical padding
Loading States
Skeleton loaders for initial, spinners for refresh.
- Initial load: skeleton matching content layout
- Data refresh: opacity 0.5 + spinner
- Button: inline spinner replaces label
- Images: gray placeholder with fade-in
- Never block entire page with full spinner
Touch Targets
Minimum sizes per product for reliable touch input.
- Web App: 36px min, 44px recommended
- iPad App: 44px min, 48px recommended
- Phone App: 44px min, 48px recommended
- Touch Device: 48px min, 56px recommended
- Icon buttons: 8px padding around icon
Dos & Don'ts
Clear guidelines for consistent implementation across teams.
Do
- Use teal (#00BBA5) for eyebrows and interactive accents
- Use cyan (#0CF4DF) on dark backgrounds only
- Apply gradient text only on Display/H1 over dark surfaces
- Verify contrast ratios when layering opacity values
Don't
- Use teal for small body text on white (fails contrast)
- Use cyan on white or light backgrounds
- Apply gradient text on light backgrounds or body text
- Use error red for decorative elements
Do
- Use weight 500 for headlines, weight 300 for subheads
- Use uppercase + tracking for eyebrows (12px/600)
- Use clamp() for responsive headline sizing
- Keep body text at 15px across all breakpoints
Don't
- Use weight 700 (bold) for headlines
- Use uppercase for body text or headlines
- Use fixed pixel sizes for headlines across breakpoints
- Allow widows or orphans in paragraphs
Do
- Use semantic HTML (button, nav, table)
- Provide aria-label on icon-only buttons
- Trap focus inside open modals
- Animate with opacity and transform only
Don't
- Use div with click handlers for interactive elements
- Leave icon buttons without accessible names
- Animate width, height, top, left (layout thrash)
- Replay entrance animations on every scroll
Do
- Use hyphens over em dashes
- Lead with outcomes and metrics
- Keep button labels concise (1-3 words)
- Use sentence case for UI labels
Don't
- Use em dashes in any copy
- Lead with feature descriptions
- Write sentences as button labels
- Use Title Case or ALL CAPS for labels (except eyebrows)
Developer Handoff
Naming conventions, token usage, and implementation notes for all four products.
| Concern | Web App | iPad | Phone | Touch Device |
|---|---|---|---|---|
| Framework | Next.js + React | React Native / WebView | React Native / WebView | React (kiosk) |
| Min Target | 36px | 44px | 44px | 48px |
| Nav Pattern | Sidebar 240px | Bottom tabs | Bottom tabs | Minimal |
| Body Text | 15px | 16px | 16px | 18px |
| Hover States | Yes | No | No | No |