mirror of
https://github.com/yusufipk/distromatch.git
synced 2026-09-11 10:46:07 +00:00
5.4 KiB
5.4 KiB
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