22 KiB
UI Design Specification for FocusBuddy
Version: 1.0
Target Platforms: iOS & Android (responsive)
Framework: Flutter-friendly
Design Philosophy: Calm • Gentle • Accessible • Neurodivergent-Friendly
1. Core Principles
- Low Stimulation: Avoid bright colors, sharp edges, fast animations
- Emotional Safety: No red error messages, no countdown pressure
- Clarity Over Cleverness: One primary action per screen
- Offline-First UX: Assume no internet; no loading spinners
2. Color Palette
| Role | Hex | Usage |
|---|---|---|
| Primary (Calm Green) | #A7C4BC |
Main buttons, active states |
| Background | #F8F6F2 |
App background (warm off-white) |
| Text Primary | #5B6D6D |
Headings, large numbers |
| Text Secondary | #8A9B9B |
Descriptions, helper text |
| Distraction Button | #E0E0E0 |
“I got distracted” button |
| Success | #88C9A1 |
Achievement unlocked |
🎨 All colors pass WCAG AA contrast ratio for accessibility.
3. Typography
| Element | Font | Size | Weight |
|---|---|---|---|
| App Title | Nunito | 24px | Bold |
| Timer Display | Nunito | 64px | ExtraBold |
| Buttons | Nunito | 18px | SemiBold |
| Body Text | Nunito | 16px | Regular |
| Helper Text | Nunito | 14px | Light |
💡 Font Source: Google Fonts – Nunito (free, supports Latin + basic Unicode)
4. Core Screens
4.1 Home Screen (Start Focus)
Layout:
┌─────────────────────────────────┐
│ │
│ FocusBuddy │ ← App title (24px, centered)
│ │
│ │
│ [ 25 minutes ] │ ← Duration selector (slider below)
│ ◀─────────▶ │ ← Slider: 5min - 60min (step: 5)
│ │
│ │
│ ┌───────────────────────┐ │
│ │ Start Focusing │ │ ← Primary button (#A7C4BC)
│ │ ▶ │ │ ← 56px height, rounded 16px
│ └───────────────────────┘ │
│ │
│ "Tap 'I got distracted' │ ← Helper text (#8A9B9B)
│ anytime — no guilt." │ ← 14px, centered
│ │
│ │
│ 📊 History ⚙️ Settings │ ← Bottom navigation (icons only)
└─────────────────────────────────┘
Interactions:
- Slider adjusts duration in real-time (haptic feedback on iOS)
- "Start Focusing" button: Scale animation (0.95 → 1.0) on press
- Transitions to "During Focus" screen with fade-in (300ms)
Animation:
- Subtle particle floating in background (Lottie:
calm-particles.json) - Particles: 5-8 dots, opacity 0.1-0.3, slow drift upward
4.2 During Focus Screen
Layout:
┌─────────────────────────────────┐
│ │
│ 24:37 │ ← Timer (64px, #5B6D6D)
│ │ ← Breathing animation (scale 1.0-1.02)
│ │
│ │
│ ┌───────────────────────┐ │
│ │ I got distracted │ │ ← Secondary button (#E0E0E0)
│ │ 🤚 │ │ ← 48px height, rounded 12px
│ └───────────────────────┘ │
│ │
│ ┌───────────────────────┐ │
│ │ ⏸ Pause │ │ ← Tertiary button (outlined)
│ └───────────────────────┘ │ ← Border: 1px #A7C4BC
│ │
│ │
│ 🎵 White Noise: Rain ▼ │ ← Dropdown (bottom sheet)
│ │
└─────────────────────────────────┘
Interactions:
- Timer: Count-down display, updates every second
- "I got distracted" → Opens bottom sheet with 4 options
- Pause → Shows "Resume" button + elapsed time badge
- White Noise → Bottom sheet: Off / Rain / Keyboard / Forest
Bottom Sheet: Distraction Types
┌─────────────────────────────────┐
│ What pulled you away? │ ← Title (16px, #5B6D6D)
│ │
│ 📱 Scrolling social media │ ← Option 1 (tap to select)
│ 👥 Got interrupted │ ← Option 2
│ 😰 Felt overwhelmed │ ← Option 3
│ 💭 Just zoned out │ ← Option 4
│ │
│ [Skip this time] │ ← Text button (optional)
└─────────────────────────────────┘
Feedback after selection:
- Toast message: "It happens. Let's gently come back." (3s)
- Soft haptic pulse
- Auto-dismiss bottom sheet
- Timer continues running
4.3 Focus Complete Screen
Layout:
┌─────────────────────────────────┐
│ │
│ ✨ │ ← Success icon (animated)
│ │
│ You focused for │ ← Headline (20px, #5B6D6D)
│ 24 minutes │ ← Large number (32px, bold)
│ │
│ ┌─────────────────────────┐ │
│ │ Total Today: 47 mins │ │ ← Stats card (#F8F6F2 bg)
│ │ Distractions: 2 times │ │ ← Body text (16px)
│ │ │ │
│ │ "Showing up is half │ │ ← Random encouragement
│ │ the battle." │ │ ← Italic, #8A9B9B
│ └─────────────────────────┘ │
│ │
│ 🎁 Achievement Unlocked! │ ← Conditional (if milestone hit)
│ "Calm Cloud" theme │ ← Badge animation
│ │
│ ┌───────────────────────┐ │
│ │ Start Another │ │ ← Primary button
│ └───────────────────────┘ │
│ │
│ [View Full Report] │ ← Text link
└─────────────────────────────────┘
Interactions:
- Success icon: Lottie animation (plays once, 2s)
- "Start Another" → Resets to Home screen
- "View Full Report" → Navigates to History tab
Achievement Badge:
- Slides up from bottom with bounce effect
- Shimmer animation (gradient sweep)
- If ad required: Shows "Watch ad to unlock" button
4.4 History/Report Screen
Layout:
┌─────────────────────────────────┐
│ 📊 Your Focus Journey │ ← Header (24px)
│ │
│ ┌─ Today ──────────────────┐ │
│ │ │ │
│ │ Total: 47 mins │ │ ← Daily summary card
│ │ Sessions: 2 │ │
│ │ Distractions: 3 │ │
│ │ │ │
│ │ ▓▓▓▓▓░░░░░ 60% │ │ ← Progress bar
│ │ (Goal: 75 mins/day) │ │
│ └──────────────────────────┘ │
│ │
│ ┌─ This Week ─────────────┐ │
│ │ Mon ■■■ 24 mins │ │ ← Bar chart (simplified)
│ │ Tue ■■■■ 32 mins │ │
│ │ Wed ■■ 15 mins │ │
│ │ Thu ■■■■■ 47 mins ← │ │ ← Today highlighted
│ └──────────────────────────┘ │
│ │
│ 📈 Top Distraction: │
│ 📱 Social media (60%) │ ← Insight card
│ │
│ [Export PDF Report] │ ← Secondary button (outlined)
│ │
└─────────────────────────────────┘
Interactions:
- Pull-to-refresh: Animates header particles
- Bar chart: Tap day → Shows session details
- Export PDF: Generates report with past 7 days data
- Requires storage permission (Android)
- iOS: Share sheet
PDF Report Content:
- Logo + Date range
- Total focus time
- Session breakdown by day
- Distraction type distribution (pie chart)
- Encouragement message
- Footer: "Generated by FocusBuddy"
4.5 Settings Screen
Layout:
┌─────────────────────────────────┐
│ ⚙️ Settings │
│ │
│ ┌─ Appearance ──────────────┐ │
│ │ Theme: Calm Cloud ▼ │ │ ← Dropdown
│ │ [Preview] │ │
│ │ │ │
│ │ 🔓 Unlock More Themes │ │ ← Ad button
│ └───────────────────────────┘ │
│ │
│ ┌─ Focus Settings ──────────┐ │
│ │ Default Duration: 25 min │ │
│ │ White Noise: Rain │ │
│ │ Daily Goal: 75 mins │ │
│ └───────────────────────────┘ │
│ │
│ ┌─ Notifications ───────────┐ │
│ │ Focus Reminders [ON] │ │ ← Toggle
│ │ Encourage Messages [ON] │ │
│ └───────────────────────────┘ │
│ │
│ 💎 Remove Ads ($2.99) │ ← IAP button (highlighted)
│ │
│ Privacy Policy │ ← Links (text buttons)
│ About FocusBuddy │
│ │
└─────────────────────────────────┘
Interactions:
- Theme preview: Shows timer screen with selected theme
- "Unlock Themes": Shows rewarded ad → Unlocks next theme
- IAP button: Opens native purchase dialog
- Toggles: Animated switch with haptic feedback
5. Component Specifications
5.1 Primary Button
Visual:
- Background:
#A7C4BC - Text:
#FFFFFF, 18px, SemiBold - Height: 56px
- Border radius: 16px
- Shadow: 0px 4px 12px rgba(167, 196, 188, 0.3)
States:
Normal: opacity 1.0, scale 1.0
Pressed: opacity 0.9, scale 0.95 (150ms ease-out)
Disabled: opacity 0.5, grayscale 100%
Flutter Example:
ElevatedButton(
style: ElevatedButton.styleFrom(
backgroundColor: Color(0xFFA7C4BC),
minimumSize: Size(double.infinity, 56),
shape: RoundedRectangleBorder(
borderRadius: BorderRadius.circular(16),
),
elevation: 4,
),
child: Text('Start Focusing'),
)
5.2 Secondary Button (Distraction Button)
Visual:
- Background:
#E0E0E0 - Text:
#5B6D6D, 18px, SemiBold - Height: 48px
- Border radius: 12px
- No shadow (flat design)
States:
Normal: background #E0E0E0
Pressed: background #D5D5D5
5.3 Timer Display
Visual:
- Font: Nunito ExtraBold
- Size: 64px
- Color:
#5B6D6D - Letter spacing: 2px (monospace feel)
Animation:
- Breathing effect: Scale 1.0 → 1.02 → 1.0 (4s loop, ease-in-out)
- On last 10 seconds: Pulse glow (0.3 opacity) around text
Flutter Example:
AnimatedScale(
scale: _breathingAnimation.value,
duration: Duration(seconds: 4),
curve: Curves.easeInOut,
child: Text(
'24:37',
style: TextStyle(
fontSize: 64,
fontWeight: FontWeight.w800,
letterSpacing: 2,
),
),
)
5.4 Bottom Sheet (Distraction Selector)
Visual:
- Background:
#FFFFFF - Border radius: 24px 24px 0 0
- Height: 60% of screen (max 400px)
- Drag handle: 4px × 32px rounded bar,
#E0E0E0
Options:
- Each row: 56px height
- Icon: 24px,
#8A9B9B - Text: 16px Regular,
#5B6D6D - Divider: 1px,
#F0F0F0
Animation:
- Slide up: 300ms ease-out
- Backdrop: Fade to 0.5 opacity black
5.5 Achievement Badge
Visual:
┌─────────────────┐
│ 🎁 Unlocked! │ ← Emoji + text (14px)
│ │
│ Calm Cloud │ ← Theme name (18px Bold)
│ ▓▓▓▓▓▓▓▓▓▓ │ ← Preview gradient bar
└─────────────────┘
Animation:
- Slide up from bottom: 400ms spring
- Shimmer sweep: 2s loop (gradient -100% → +100% X)
- Auto-dismiss after 5s (slide down)
Colors:
- Background:
#FFFFFF - Border: 2px
#88C9A1(success color) - Shadow: 0px 8px 24px rgba(136, 201, 161, 0.4)
6. Animations & Micro-interactions
6.1 Loading States
When app launches:
- Logo fade-in: 500ms
- Particles appear one by one (staggered 100ms)
- Total: 1s to interactive
When switching screens:
- Cross-fade: 300ms ease-in-out
- No slide transitions (avoid motion sickness)
6.2 Haptic Feedback
iOS UIFeedbackGenerator:
- Slider adjustment:
.selection - Button press:
.light - Timer complete:
.success - Distraction logged:
.soft(custom if available)
Android:
- Use
HapticFeedback.lightImpact() - Intensity: 30% (gentle)
6.3 Sound Effects
Audio Files (CC Licensed):
button_tap.mp3: Soft click (50ms)distraction_logged.mp3: Gentle chime (200ms)focus_complete.mp3: Warm bell (1s)white_noise_rain.mp3: 10min loopwhite_noise_keyboard.mp3: 10min loop
Volume:
- Default: 60%
- User adjustable in settings
- Respect system silent mode
7. Responsive Design
7.1 Screen Sizes
Small (< 5.5"):
- Timer: 56px (reduce from 64px)
- Button height: 48px (reduce from 56px)
- Padding: 16px (reduce from 24px)
Large (> 6.5"):
- Keep default sizes
- Max content width: 400px (centered)
Tablet (7"+):
- Use 2-column layout for History screen
- Timer centered with max 500px container
7.2 Safe Areas
iOS:
- Respect notch: Use
SafeAreawidget - Bottom nav: 20px padding above home indicator
Android:
- Edge-to-edge: Use
WindowInsets - Navigation bar: Semi-transparent overlay
8. Accessibility
8.1 Screen Reader Support
Labels:
- Timer: "24 minutes and 37 seconds remaining"
- Distraction button: "Record a distraction, no penalty"
- Slider: "Focus duration, 25 minutes, adjustable from 5 to 60"
Announcements:
- Focus start: "Focus session started"
- Distraction logged: "Distraction recorded. It happens."
- Focus complete: "Session complete. You focused for 24 minutes."
8.2 High Contrast Mode
When system high contrast enabled:
- Increase all borders to 2px
- Button text: Pure black
#000000 - Background: Pure white
#FFFFFF - Disable shadows and gradients
8.3 Font Scaling
Support dynamic type:
- Small: 0.85× base sizes
- Large: 1.2× base sizes
- Max: 1.5× (prevent overflow)
Test at:
- iOS: Settings → Accessibility → Display → Text Size
- Android: Settings → Accessibility → Font size
9. Dark Mode (Future Enhancement)
Not in MVP, but color mappings ready:
| Light Mode | Dark Mode |
|---|---|
#F8F6F2 (bg) |
#1A1A1A |
#A7C4BC (primary) |
#88A89F (dimmer) |
#5B6D6D (text) |
#E0E0E0 |
#FFFFFF (cards) |
#2A2A2A |
10. Design Assets Checklist
10.1 Required Lottie Files
calm-particles.json(background animation)success-sparkle.json(focus complete)achievement-shimmer.json(badge unlock)
Source: LottieFiles (search "calm", "gentle", "success")
10.2 App Icons
Sizes needed:
- iOS: 1024×1024 (App Store), 180×180, 120×120, 87×87, 80×80, 60×60
- Android: 512×512 (Play Store), 192×192, 144×144, 96×96, 72×72, 48×48
Design:
- Main symbol: Gentle wave or breathing circle
- Background:
#A7C4BCgradient to#88C9A1 - Style: Minimal, rounded, approachable
10.3 Screenshots (for stores)
Required shots (6.5" iPhone):
- Home screen with "Start Focusing" button
- During focus with timer + distraction button
- Focus complete with achievement badge
- History screen with weekly chart
- Settings with theme preview
- (Optional) User testimonial overlay
Text overlays:
- "Focus without guilt"
- "Track gently, improve naturally"
- "Made for neurodivergent minds"
11. Implementation Notes
11.1 Flutter Packages
dependencies:
flutter:
sdk: flutter
hive: ^2.2.3 # Local storage
hive_flutter: ^1.1.0
flutter_local_notifications: ^17.0.0
workmanager: ^0.5.2 # Background tasks
lottie: ^3.0.0 # Animations
just_audio: ^0.9.36 # White noise
google_mobile_ads: ^4.0.0 # AdMob
path_provider: ^2.1.0
pdf: ^3.10.0 # Report export
11.2 Folder Structure
lib/
├── main.dart
├── screens/
│ ├── home_screen.dart
│ ├── focus_screen.dart
│ ├── complete_screen.dart
│ ├── history_screen.dart
│ └── settings_screen.dart
├── widgets/
│ ├── primary_button.dart
│ ├── timer_display.dart
│ ├── distraction_sheet.dart
│ └── achievement_badge.dart
├── models/
│ ├── focus_session.dart
│ └── distraction.dart
├── services/
│ ├── storage_service.dart
│ ├── notification_service.dart
│ └── audio_service.dart
├── theme/
│ ├── app_colors.dart
│ └── app_text_styles.dart
└── assets/
├── animations/
├── sounds/
└── fonts/
11.3 Theme Definition
// lib/theme/app_colors.dart
class AppColors {
static const primary = Color(0xFFA7C4BC);
static const background = Color(0xFFF8F6F2);
static const textPrimary = Color(0xFF5B6D6D);
static const textSecondary = Color(0xFF8A9B9B);
static const distractionButton = Color(0xFFE0E0E0);
static const success = Color(0xFF88C9A1);
}
// lib/theme/app_text_styles.dart
class AppTextStyles {
static const appTitle = TextStyle(
fontFamily: 'Nunito',
fontSize: 24,
fontWeight: FontWeight.bold,
color: AppColors.textPrimary,
);
static const timerDisplay = TextStyle(
fontFamily: 'Nunito',
fontSize: 64,
fontWeight: FontWeight.w800,
letterSpacing: 2,
color: AppColors.textPrimary,
);
static const buttonText = TextStyle(
fontFamily: 'Nunito',
fontSize: 18,
fontWeight: FontWeight.w600,
color: Colors.white,
);
static const bodyText = TextStyle(
fontFamily: 'Nunito',
fontSize: 16,
fontWeight: FontWeight.normal,
color: AppColors.textPrimary,
);
static const helperText = TextStyle(
fontFamily: 'Nunito',
fontSize: 14,
fontWeight: FontWeight.w300,
color: AppColors.textSecondary,
);
}
12. Quality Assurance Checklist
12.1 Visual QA
- All colors match design system
- Fonts render correctly on iOS/Android
- Animations run at 60fps
- No pixel shifts when rotating
- Safe areas respected on all devices
12.2 Interaction QA
- Buttons have press states
- Haptics fire at correct moments
- Sound effects play (and respect mute)
- Timer counts down accurately
- Bottom sheet dismisses on backdrop tap
12.3 Accessibility QA
- Screen reader announces all elements
- High contrast mode works
- Font scaling doesn't break layout
- Minimum touch target: 44×44 (iOS) / 48×48 (Android)
Appendix: Encouragement Messages Library
Store in assets/encouragements.json:
[
"Showing up is half the battle.",
"Every minute counts.",
"You're learning, not failing.",
"Gentleness is strength.",
"Progress over perfection.",
"Your effort matters.",
"Small steps, big journey.",
"Be kind to your brain.",
"You're doing your best.",
"One moment at a time.",
"Focus is a practice, not a trait.",
"It's okay to take breaks.",
"You came back — that's what matters.",
"Celebrate trying, not just succeeding.",
"Your attention is valid."
]
Usage: Randomly select one message per focus completion.
Document Status: ✅ Complete Last Updated: November 22, 2025 Next Steps: Create Figma prototype → Share with ADHD community for feedback