Files
distromatch/design_guidelines.md
T
2025-12-17 13:31:08 +00:00

5.4 KiB
Raw Blame History

DistroMatch Design Guidelines

Design Philosophy

Create a premium, desktop-first "Tinder for Linux Distros" experience that feels cinematic and playful. Reject traditional survey-based tools in favor of visceral, swipe-based discovery using landscape desktop screenshots.

Layout System

Core Structure:

  • Single-page application with centered card stack as focal point
  • Cards positioned in absolute center of viewport
  • Use Tailwind spacing: p-4, p-6, p-8 for consistent padding
  • Container max-width: 1200px for card stack area

Card Dimensions:

  • Landscape orientation (16:9 aspect ratio) - NEVER vertical/portrait
  • Recommended size: 900px width × 506px height (or proportional)
  • Card stack: 3-5 cards visible with z-index layering
  • Cards behind should be slightly offset and scaled down (scale-95)

Component Architecture

1. Card Stack System:

  • Top card: Full size, draggable, z-index highest
  • Second card: scale-95, slight vertical offset (8px down)
  • Third+ cards: scale-90, progressive offsets
  • Empty state when deck is finished

2. Card Component Structure:

Card Container (rounded-2xl, shadow-2xl)
├── Screenshot Area (16:9, covers top 75% of card)
│   └── High-quality Linux desktop screenshot
└── Info Bar (bottom 25%, elegant dark overlay)
    ├── Witty Title (text-xl, font-bold)
    ├── Distro Name (text-sm, muted)
    └── Optional: Quick stats or tags

3. Info Bar Design:

  • Semi-transparent dark background (bg-black/80 backdrop-blur-md)
  • Padding: px-8 py-6
  • Text must never overlap screenshot
  • Rounded bottom corners matching card (rounded-b-2xl)

Typography

Fonts via Google Fonts:

  • Primary: Inter (headings, UI elements) - weights 400, 600, 700
  • Secondary: Space Grotesk (witty card titles) - weights 500, 700

Hierarchy:

  • Card titles: text-2xl font-bold (witty personality descriptions)
  • Distro names: text-lg font-semibold
  • UI labels: text-sm font-medium
  • Metadata: text-xs text-gray-400

Interaction Design

Swipe Mechanics:

  • Drag threshold: 150px horizontal movement to trigger decision
  • Swipe right (>150px) = LIKE
  • Swipe left (<-150px) = DISLIKE
  • Visual feedback: Rotate card based on drag distance (max ±15deg)
  • On release: Physics-based throw animation if threshold met

Animation Requirements (Framer Motion):

  • Front card drag: Follow cursor with spring physics
  • Background card: Scale from 95 to 100 as front card moves
  • Throw animation: Smooth exit with rotation matching swipe direction
  • New card entrance: Fade in and scale up from 90 to 100
  • Background gradient: Smooth color transition (300ms ease)

Button Controls:

  • Bottom center: Two action buttons (Dislike/Like)
  • Style: Large rounded buttons (w-16 h-16 rounded-full)
  • Icons: X (dislike), Heart (like) from Lucide-React
  • Hover states: Subtle scale-110 and shadow increase

Background Treatment

Dynamic Gradient:

  • Full viewport background
  • Blur effect: backdrop-blur-3xl
  • Color extraction: Sample dominant colors from current card screenshot
  • Create radial gradient with extracted colors at 30% opacity
  • Transition smoothly between cards (animate gradient-shift)
  • Fallback: Subtle purple-to-blue gradient

Data Structure

Card Data Model:

interface DistroCard {
  id: string
  distroName: string
  screenshot: string (URL or path)
  wittyTitle: string (e.g., "Terminal is life", "Mac envy approved")
  desktopEnvironment: string
  tags: string[]
  colorPalette?: string[] (for background gradient)
}

Sample Witty Titles:

  • "Terminalden çıkmam" (Never leaves terminal)
  • "Mac gibi olsun" (Make it Mac-like)
  • "Sadece çalışsın yeter" (Just make it work)
  • "Özelleştirme canavarı" (Customization beast)

Images

Screenshot Requirements:

  • High-resolution desktop screenshots (1920×1080 minimum)
  • Various Linux distributions and desktop environments
  • Clean, representative workspace examples
  • Showcase different aesthetics (minimal, maximal, professional, gaming)
  • 15-20 diverse examples covering: GNOME, KDE, i3, XFCE, Cinnamon, etc.

Placement:

  • Each card features one full-bleed screenshot covering 75% of card height
  • Aspect ratio strictly maintained at 16:9
  • No hero section - app focuses entirely on card interaction

Responsive Considerations

Desktop-First (Primary):

  • Optimized for 1440px+ displays
  • Cards remain landscape and centered
  • Maximum engagement with large viewport

Tablet (1024px):

  • Slightly smaller cards (700px width)
  • Maintain landscape orientation
  • Buttons remain accessible

Mobile (768px and below):

  • Cards scale down but NEVER become vertical
  • May need horizontal scrolling or reduced card size
  • Swipe gestures remain primary interaction

Special States

Loading State:

  • Skeleton cards with shimmer effect
  • Maintain card stack layout

End of Deck:

  • "Recommendations ready!" message
  • Reset or view results buttons
  • Celebratory micro-animation

Swipe Indicators:

  • Subtle overlay on card during drag showing LIKE (green) or NOPE (red)
  • Opacity increases with drag distance
  • Icon appears in drag direction

Modular Architecture

File Structure:

  • /components/CardStack.tsx - Main card container
  • /components/SwipeCard.tsx - Individual draggable card
  • /components/ActionButtons.tsx - Like/Dislike controls
  • /data/distros.ts - Card data array
  • /utils/colorExtractor.ts - Background gradient logic
  • /hooks/useSwipe.ts - Swipe gesture management