13 KiB

Keep Design System

Version: 1.0 Created: 2026-01-17 Status: Active


Overview

This design system defines the visual language for Keep application. It ensures consistency across all components and screens while supporting multiple themes (light, dark, midnight, sepia).

Key Principles:

  • Consistent spacing using 4px base unit
  • Clear visual hierarchy
  • Accessible color contrast (WCAG 2.1 AA)
  • Theme-agnostic design
  • Responsive breakpoints
  • 44x44px minimum touch targets

Design Tokens

Spacing Scale (4px Base Unit)

All spacing uses the standard Tailwind spacing scale:

Token Value Pixels Usage
p-1 / gap-1 0.25rem 4px Tiny gaps, icon padding
p-2 / gap-2 0.5rem 8px Small padding, badges
p-3 / gap-3 0.75rem 12px Button padding, small inputs
p-4 / gap-4 1rem 16px Card padding, standard gap
p-6 / gap-6 1.5rem 24px Section padding
p-8 2rem 32px Large containers

Standards:

  • Cards: p-4 (16px)
  • Buttons: px-4 py-2 (16px/8px)
  • Inputs: px-3 py-2 (12px/8px)
  • Badges: px-2 py-0.5 (8px/2px)
  • Form sections: gap-4 (16px)

Border Radius

Consistent corner rounding across all components:

Token Value Pixels Usage
rounded 0.25rem 4px Small elements, icon buttons
rounded-md 0.375rem 6px Inputs, small buttons
rounded-lg 0.5rem 8px Cards, buttons (default)
rounded-xl 0.75rem 12px Modals, large containers
rounded-2xl 1rem 16px Hero elements, search bars
rounded-full 9999px Circular Avatars, pill badges

Standards:

  • Cards/NoteCards: rounded-lg (8px)
  • Buttons: rounded-md (6px)
  • Inputs: rounded-md (6px)
  • Badges (text): rounded-full (pills)
  • Search bars: rounded-lg (8px)
  • Icons: rounded-full (circular)
  • Modals/Dialogs: rounded-xl (12px)

Shadow/Elevation

Clear elevation hierarchy for depth perception:

Token Value Usage
shadow-sm 0 1px 2px Cards (base), buttons (hover)
shadow 0 1px 3px Default elevation
shadow-md 0 4px 6px Cards (hover), dropdowns
shadow-lg 0 10px 15px Modals, elevated content

Standards:

  • Cards: shadow-sm (base), hover:shadow-md (interactive)
  • Buttons: No shadow (flat), hover:shadow-sm (optional)
  • Modals: shadow-lg (elevated)
  • Dropdowns: shadow-lg (elevated)

Typography Scale

Consistent font sizes and weights using Tailwind defaults:

Font Sizes

Token Value Pixels Usage
text-xs 0.75rem 12px Labels, small text, badges, metadata
text-sm 0.875rem 14px Body text, buttons, inputs
text-base 1rem 16px Card titles, emphasized text
text-lg 1.125rem 18px Section headers
text-xl 1.25rem 20px Page titles
text-2xl 1.5rem 24px Large headings

Font Weights

Token Value Usage
font-normal 400 Body text
font-medium 500 Emphasized text, button labels
font-semibold 600 Section titles
font-bold 700 Major headings

Typography Hierarchy

H1: text-2xl font-bold (24px) - Page titles
H2: text-xl font-semibold (20px) - Section headers
H3: text-lg font-medium (18px) - Card titles
Body: text-sm text-gray-700 (14px) - Body text
Button: text-sm font-medium (14px) - Button labels
Label: text-xs font-medium (12px) - Labels/badges
Metadata: text-xs text-gray-500 (12px) - Metadata, dates

Color System

The design uses CSS custom properties defined in globals.css for theme support.

Semantic Colors (CSS Variables)

/* Primary Actions */
--primary: oklch(0.205 0 0)
--primary-foreground: oklch(0.985 0 0)

/* Secondary Elements */
--secondary: oklch(0.97 0 0)
--secondary-foreground: oklch(0.205 0 0)

/* Accent/Highlight */
--accent: oklch(0.97 0 0)
--accent-foreground: oklch(0.205 0 0)

/* Destructive Actions */
--destructive: oklch(0.577 0.245 27.325)

/* Foreground/Background */
--background: oklch(1 0 0)
--foreground: oklch(0.145 0 0)

/* Card Background */
--card: oklch(1 0 0)
--card-foreground: oklch(0.145 0 0)

/* Muted Text */
--muted: oklch(0.97 0 0)
--muted-foreground: oklch(0.556 0 0)

/* Borders & Inputs */
--border: oklch(0.922 0 0)
--input: oklch(0.922 0 0)

/* Focus Ring */
--ring: oklch(0.708 0 0)

Functional Color Patterns

/* Text Colors */
text-foreground       - Primary text
text-muted-foreground - Secondary text, metadata
text-destructive      - Error messages, delete actions
text-primary         - Primary action text

/* Background Colors */
bg-background      - Main background
bg-card           - Card background
bg-secondary       - Secondary elements
bg-accent         - Highlight/active states
bg-destructive    - Error backgrounds

/* Border Colors */
border-border     - Default borders
border-input      - Input fields

Rule: Always use semantic color classes (e.g., bg-primary, text-foreground) instead of hardcoded colors (e.g., bg-blue-500) to support theming.


Transitions

Consistent transition values for smooth interactions:

Token Value Usage
transition-colors duration-200 200ms Color changes (hover states)
transition-all duration-200 200ms Multiple property changes
transition-opacity duration-150 150ms Fade in/out
transition-transform duration-200 200ms Movement/position

Standards:

  • Buttons/hover states: transition-colors duration-200
  • Cards: transition-all duration-200
  • Modals/overlays: transition-opacity duration-150

Focus States

All interactive elements must have visible focus indicators:

/* Focus Ring Pattern */
focus-visible:border-ring
focus-visible:ring-ring/50
focus-visible:ring-[3px]

Rule: Use focus-visible: instead of focus: to only show focus when navigating with keyboard.


Component Standards

Button

Default Size:

<Button className="h-9 px-4 py-2 text-sm font-medium rounded-md transition-colors duration-200">
  Button Label
</Button>

Small Size:

<Button size="sm" className="h-8 px-3 text-sm rounded-md">
  Small Button
</Button>

Variants:

  • default: Primary action (bg-primary text-primary-foreground)
  • secondary: Secondary action (bg-secondary text-secondary-foreground)
  • outline: Outlined button (border bg-background)
  • ghost: Transparent button (hover:bg-accent)
  • destructive: Delete/danger action (bg-destructive text-white)

Input

Standard Input:

<Input className="h-9 px-3 py-2 text-sm rounded-md border border-input focus-visible:ring-2 focus-visible:ring-ring/50" />

With Error State:

<Input className="border-destructive focus-visible:ring-destructive/50" />

Card

Standard Card:

<Card className="rounded-xl border p-4 shadow-sm hover:shadow-md transition-all duration-200">
  <CardHeader>
    <CardTitle className="text-lg font-medium">Card Title</CardTitle>
  </CardHeader>
  <CardContent>
    Card content
  </CardContent>
</Card>

Badge

Standard Badge:

<Badge variant="default" className="rounded-full px-2 py-0.5 text-xs font-medium">
  Badge Label
</Badge>

Variants:

  • default: Primary badge
  • secondary: Secondary badge
  • outline: Outlined badge
  • destructive: Error badge

NoteCard

Standard NoteCard:

<Card className="note-card group rounded-lg border p-4 shadow-sm hover:shadow-md transition-all duration-200">
  {/* Note content */}
</Card>

Accessibility Standards

Touch Targets

Minimum Size: 44x44px (WCAG 2.1 AA)

/* Icon Buttons - Ensure 44x44px on mobile */
<Button className="min-h-[44px] min-w-[44px] md:h-8 md:w-8">
  <Icon className="h-5 w-5" />
</Button>

Color Contrast

Minimum Ratios:

  • Normal text: 4.5:1 (WCAG AA)
  • Large text (18px+): 3:1 (WCAG AA)
  • UI components: 3:1 (WCAG AA)

Validation: Use WAVE browser extension or axe DevTools

Focus Indicators

All interactive elements must have visible focus states:

<button className="focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring/50 focus-visible:ring-offset-2">
  Button
</button>

Keyboard Navigation

  • All interactive elements must be keyboard accessible
  • Tab order must be logical
  • Escape key should close modals/dropdowns
  • Enter/Space should activate buttons

Responsive Breakpoints

Tailwind default breakpoints:

Breakpoint Minimum Width Usage
sm 640px Small tablets
md 768px Tablets
lg 1024px Desktops
xl 1280px Large desktops
2xl 1536px Extra large screens

Pattern: Mobile-first, use md:, lg:, etc. to override for larger screens.


Theme Support

The design system supports multiple themes:

Available Themes

  1. Light (default) - Clean, bright interface
  2. Dark - Dark mode for low-light environments
  3. Midnight - Custom dark theme with blue tint
  4. Sepia - Warm, book-like reading experience

Theme Implementation

Themes use CSS custom properties in globals.css:

[data-theme='midnight'] {
  --background: oklch(0.18 0.04 260);
  --foreground: oklch(0.985 0 0);
  /* ... */
}

Rule: Use semantic color variables (--primary, --foreground) instead of hardcoded colors to support all themes.


Anti-Patterns

Don't Do

/* Hardcoded colors - breaks theming */
<div className="bg-blue-500 text-white">
  Blue background
</div>

/* Custom font sizes - breaks typography scale */
<p className="text-[10px]">
  Tiny text
</p>

/* Inconsistent spacing */
<div className="p-2.5">
  Odd padding
</div>

/* No focus state */
<button className="hover:bg-gray-100">
  Button
</button>

/* Touch target too small */
<button className="h-6 w-6">
  <Icon className="h-4 w-4" />
</button>

Do Instead

/* Semantic colors - supports theming */
<div className="bg-primary text-primary-foreground">
  Primary background
</div>

/* Standard font sizes */
<p className="text-xs">
  Small text
</p>

/* Consistent spacing (4px base unit) */
<div className="p-2">
  Standard padding
</div>

/* Visible focus state */
<button className="hover:bg-accent focus-visible:ring-2 focus-visible:ring-ring/50">
  Button
</button>

/* Minimum 44x44px touch target */
<button className="min-h-[44px] min-w-[44px]">
  <Icon className="h-5 w-5" />
</button>

Component Checklist

When creating or updating components, ensure:

  • Spacing uses 4px base unit (p-2, gap-4, etc.)
  • Border radius follows standard (rounded-md, rounded-lg, etc.)
  • Typography follows hierarchy (text-sm, text-lg, etc.)
  • Colors use semantic variables (bg-primary, text-foreground)
  • Transitions use standard durations (duration-200, duration-150)
  • Focus states are visible (focus-visible:ring-2)
  • Touch targets are minimum 44x44px on mobile
  • Color contrast meets WCAG 2.1 AA standards
  • Dark mode works correctly (no hardcoded colors)
  • All themes work (light, dark, midnight, sepia)

Migration Guide

Converting Existing Components

  1. Identify hardcoded colors:

    // Before
    className="bg-blue-100 text-blue-600"
    
    // After
    className="bg-accent text-primary"
    
  2. Standardize spacing:

    // Before
    className="p-2.5 mb-3"
    
    // After
    className="p-3 mb-4"
    
  3. Use standard border radius:

    // Before
    className="rounded-[10px]"
    
    // After
    className="rounded-lg"
    
  4. Update typography:

    // Before
    className="text-[10px] font-bold"
    
    // After
    className="text-xs font-semibold"
    
  5. Add focus states:

    // Before
    <button className="hover:bg-gray-100">Click</button>
    
    // After
    <button className="hover:bg-accent focus-visible:ring-2 focus-visible:ring-ring/50">Click</button>
    

Testing

Visual Regression Testing

  1. Take screenshots of all major screens
  2. Compare before/after changes
  3. Verify no broken layouts
  4. Check responsive breakpoints

Cross-Browser Testing

Test in:

  • Chrome (latest)
  • Firefox (latest)
  • Safari (latest)
  • Edge (latest)

Accessibility Testing

Use tools:

  • WAVE browser extension
  • axe DevTools
  • Screen reader testing (NVDA, VoiceOver)
  • Keyboard navigation testing

Mobile Testing

Test on:

  • iOS Safari
  • Chrome Android
  • Responsive breakpoints (sm, md, lg, xl)

Resources


Last Updated: 2026-01-17 Maintained By: Development Team Status: Active