app/dusk-design-guidelines.md

348 lines
12 KiB
Markdown
Executable File
Raw Permalink Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

Discord-like Chat App — Design Specification
1. Overview
This chat application embodies a minimalist, high-contrast aesthetic rooted in Dutch modernism and the systematic rigor of Wim Crouwel and De Stijl. The design employs a bold grotesque sans-serif for hierarchy paired with monospace type for technical details, creating a visual language that feels both contemporary and utilitarian.
International orange serves as the sole accent color—a deliberate, high-energy choice that activates the otherwise austere black-and-white foundation. The layout is governed by a strict modular grid, ensuring every element aligns to a mathematically consistent rhythm. Motion design follows Motion principles (https://motion.dev/): smooth, purposeful, and never gratuitous.
Navigation transforms the experience through a full-screen overlay menu, reinforcing the app's bold, confident spatial decisions. Every interaction is deliberate, every transition calculated, every whitespace meaningful.
2. Visual System
Typography Hierarchy
Primary Typeface: Space Grotesk (Bold Grotesque)
Weights: 400 (Regular), 500 (Medium), 700 (Bold)
Usage:
Display/Headers: 700 weight, tight letter-spacing (-0.02em)
Body text: 400 weight, normal spacing
UI labels: 500 weight, uppercase with +0.05em tracking
Interactive elements: 500 weight
Secondary Typeface: JetBrains Mono (Monospace)
Weights: 400 (Regular), 500 (Medium)
Usage:
Timestamps: 400 weight, 12px
User IDs / technical metadata: 400 weight
Code blocks or system messages: 400 weight
Status indicators: 500 weight, uppercase
Scale (Desktop):
Display: 48px / 56px line-height
H1: 32px / 40px
H2: 24px / 32px
H3: 20px / 28px
Body: 16px / 24px
Small: 14px / 20px
Micro: 12px / 16px
Scale (Mobile):
Display: 32px / 40px
H1: 24px / 32px
H2: 20px / 28px
Body: 16px / 24px
Small: 14px / 20px
Micro: 12px / 16px
Color Palette
Base Colors:
Pure Black: #000000 — primary background, text on light surfaces
Off White: #FAFAFA — light background variant, cards
True White: #FFFFFF — text on dark surfaces, highest contrast elements
Contrast Layers:
Gray 900: #0A0A0A — secondary dark surface
Gray 800: #1A1A1A — elevated dark surface
Gray 200: #E5E5E5 — borders on light mode
Gray 300: #D4D4D4 — subtle dividers
Accent:
International Orange: #FF4F00 — primary accent for CTAs, active states, highlights
Orange Hover: #E64500 — hover state darkening
Orange Muted: #FF4F0015 — 8% opacity backgrounds for subtle emphasis
Semantic Colors:
Success: #00FF00 — online status, success states
Warning: #FFFF00 — warnings
Error: #FF0000 — errors, destructive actions
Spacing + Grid Philosophy
Base Unit: 8px
Spacing Scale:
xs: 4px
sm: 8px
md: 16px
lg: 24px
xl: 32px
2xl: 48px
3xl: 64px
4xl: 96px
Grid System:
Desktop: 12-column grid, 24px gutter, 1440px max-width container
Tablet: 8-column grid, 16px gutter, 100% width
Mobile: 4-column grid, 16px gutter, 100% width
Modular Rhythm:
All components snap to 8px vertical rhythm. Section padding follows 64px (desktop) / 48px (tablet) / 32px (mobile) increments.
Iconography + Motifs
Icon System: Lucide Vue
Stroke Width: 2px (consistent with grotesque weight)
Size Scale: 16px, 20px, 24px, 32px
Style: Sharp, geometric, minimal
Geometric Motifs:
45° diagonal elements for dynamic composition
Perfect squares and circles for buttons/avatars
2px solid borders (never rounded corners on containers)
Right angles maintained throughout
Avatar System:
Perfect circles for user avatars (only curved element)
32px (small), 40px (medium), 48px (large), 64px (profile)
Status indicator: 8px circle, bottom-right overlap with 2px white border 3. Layout Design
Page Structure
Three-Column Layout (Desktop):
┌────────────┬─────────────────────────┬────────────┐
│ Server │ Main Chat Area │ Sidebar │
│ List │ │ (Users/ │
│ 64px │ Fluid │ Info) │
│ │ │ 280px │
└────────────┴─────────────────────────┴────────────┘
Two-Column Layout (Tablet):
┌────────────┬─────────────────────────┐
│ Channel │ Main Chat Area │
│ List │ │
│ 240px │ Fluid │
│ │ │
└────────────┴─────────────────────────┘
Single-Column Layout (Mobile):
Full-screen chat view
Hamburger menu reveals server/channel navigation as full-screen overlay
Swipe gestures for quick navigation
Component Designs
Server List (Left Sidebar - Desktop)
64px fixed width
Black background #000000
Server icons: 48px squares, 8px margin top/bottom
Active server: 4px international orange border-left
Hover: subtle scale to 1.05, 200ms ease-out
Channel List (Secondary Sidebar)
240px width on desktop, collapses on tablet
Background: #0A0A0A
Section headers: uppercase, 500 weight, 12px, #FFFFFF at 60% opacity
Channel items:
16px font, 400 weight
40px height, 8px padding-left
Hover: #1A1A1A background
Active: international orange left border (4px), #FFFFFF text
Unread indicator: 6px orange circle, right-aligned
Main Chat Area
Background: #000000
Messages:
Avatar: 40px circle, left-aligned
Username: 500 weight, 16px, #FFFFFF
Timestamp: JetBrains Mono, 12px, #FFFFFF at 50% opacity
Message text: 400 weight, 16px, #FFFFFF at 90% opacity
Spacing: 16px between messages, 8px between text lines
Hover: #0A0A0A background on entire message block
Message Input
Fixed bottom position
Height: 64px
Background: #1A1A1A
Border-top: 1px solid #FFFFFF at 10% opacity
Input field:
Background: #000000
Border: 2px solid #FFFFFF at 20% opacity
Focus: 2px solid international orange
Padding: 12px 16px
Placeholder: JetBrains Mono, #FFFFFF at 40% opacity
Buttons
Primary (Orange):
Background: #FF4F00
Text: #FFFFFF, 500 weight, uppercase, +0.05em tracking
Padding: 12px 24px
Height: 48px
Border: none
Hover: #E64500 background, scale 0.98
Active: scale 0.96
Secondary (Ghost):
Background: transparent
Border: 2px solid #FFFFFF
Text: #FFFFFF, 500 weight, uppercase
Hover: background #FFFFFF, text #000000
Icon Button:
40px × 40px square
Background: #1A1A1A
Hover: background #FF4F00, icon color #FFFFFF
Cards/Modals
Background: #0A0A0A
Border: 2px solid #FFFFFF at 20% opacity
Padding: 32px
Shadow: none (rely on borders for hierarchy)
Title: 24px, 700 weight, #FFFFFF
Dividers: 1px solid #FFFFFF at 10% opacity
Navigation Overlay (Full-Screen Menu)
Background: #000000
Z-index: 1000
Menu items:
48px font, 700 weight, #FFFFFF
Hover: international orange color, translate-x 16px
Stagger animation on entrance (100ms delay per item)
Close button: top-right, 48px × 48px, white X icon
Backdrop blur: none (solid black)
User Sidebar (Right - Desktop)
280px width
Background: #0A0A0A
Member list:
Role headers: uppercase, JetBrains Mono, 12px, orange
User items: 40px height, avatar + name
Status dot: 8px, green/yellow/gray
Hover: #1A1A1A background
Responsive Variations
Desktop (1440px+):
Full three-column layout
All interactions visible
Spacious padding (32px standard)
Tablet (768px - 1439px):
Two-column: channels + chat
Right sidebar accessible via icon toggle
Reduced padding (24px)
Mobile (< 768px):
Single column, full-screen chat
Hamburger menu triggers full-screen overlay for navigation
Server list becomes horizontal scrollable bar at top (48px height)
Swipe right: open channel list
Swipe left: open user list
Message input remains fixed bottom
Padding: 16px 4. Interaction + Motion
Entrance Animations (Motion)
Page Load:
Server list fades in from left: opacity 0 1, x: -20 0, 400ms ease-out
Channel list follows: 100ms delay, same animation
Chat messages stagger in: 50ms delay per message, opacity 0 1, y: 10 0, 300ms ease-out
Right sidebar: 200ms delay, fade + slide from right
New Message:
opacity 0 1, y: 20 0, 300ms ease-out
Scale in from 0.95 1.0 simultaneously
Modal/Overlay:
Background: opacity 0 1, 200ms
Content: scale 0.95 1, opacity 0 1, 300ms, 100ms delay after background
Hover States
All Interactive Elements:
Transition duration: 200ms
Easing: cubic-bezier(0.4, 0.0, 0.2, 1) [ease-out]
Specific Behaviors:
Buttons: scale 0.98, background color shift
Links/Text: color shift to orange, no underline
Cards: border color brightens to #FFFFFF at 40% opacity
Icons: rotate 90° (for settings/options icons), color shift to orange
Server icons: scale 1.05, subtle glow effect (box-shadow)
Transition Behavior
Route Changes:
Current view: fade out + scale down to 0.98, 250ms
New view: fade in + scale up from 0.98, 300ms, 100ms delay
Sidebar Toggle:
Slide animation: 400ms ease-in-out
Content reflow: 400ms synchronized with slide
Expandable Sections:
Height: auto-animate with max-height trick
Duration: 300ms ease-out
Icon rotation: 180° synchronized
Overlay Menu Behavior
Open Animation:
Background fills from top: 400ms ease-out
Menu items stagger in (100ms delay each): opacity 0 1, x: -30 0, 400ms ease-out
Close button fades in: 300ms, 200ms delay
Close Animation:
Menu items stagger out in reverse: opacity 1 0, x: 0 -30, 300ms ease-in
Background fades: 300ms, begins after items start
Total duration: 600ms
Navigation Interaction:
Click item: orange color + translate-x 16px (200ms)
300ms delay before route transition initiates
Menu closes as new view loads
Microinteractions
Typing Indicator:
Three dots: 4px circles, international orange
Sequential scale animation: 0.8 1.2 0.8, 600ms loop, 150ms delay per dot
Unread Badge:
Pop in: scale 0 1 with bounce (spring physics)
Pulse every 3s: scale 1 1.1 1, opacity 1 0.8 1
Message Reactions:
Hover: scale 1.1, 150ms
Click: scale 0.9 1.2 with spring, add counter increment animation
Status Indicator:
State change: scale 0.8 1.2 1, color crossfade 300ms 5. Implementation Notes
Tailwind Configuration
Custom Theme Extension:
theme: {
extend: {
colors: {
'orange': '#FF4F00',
'orange-hover': '#E64500',
'orange-muted': '#FF4F0015',
'gray-900': '#0A0A0A',
'gray-800': '#1A1A1A',
},
fontFamily: {
'sans': ['Space Grotesk', 'system-ui', 'sans-serif'],
'mono': ['JetBrains Mono', 'monospace'],
},
spacing: {
// 8px base unit system already default in Tailwind
},
maxWidth: {
'container': '1440px',
},
},
}
CSS Custom Properties
:root {
--color-bg-primary: #000000;
--color-bg-secondary: #0A0A0A;
--color-bg-tertiary: #1A1A1A;
--color-text-primary: #FFFFFF;
--color-text-secondary: rgba(255, 255, 255, 0.6);
--color-accent: #FF4F00;
--color-accent-hover: #E64500;
--spacing-unit: 8px;
--transition-fast: 200ms cubic-bezier(0.4, 0.0, 0.2, 1);
--transition-base: 300ms cubic-bezier(0.4, 0.0, 0.2, 1);
--transition-slow: 400ms cubic-bezier(0.4, 0.0, 0.2, 1);
}
Conclusion
This design system delivers a bold, systematic visual language rooted in Dutch modernism while maintaining contemporary usability standards. Every element serves the dual purpose of aesthetic clarity and functional efficiency. The international orange accent provides the necessary energy and wayfinding without compromising the minimalist foundation.
Implementation should prioritize: grid alignment, smooth Motion-powered animations (https://motion.dev/), strict typography hierarchy, and real-time functionality via WebSocket connections. The result will be a chat application that feels simultaneously timeless and cutting-edgeconfident, fast, and unmistakably modern.