# TheNoiseClock - Product Requirements Document

## Overview
TheNoiseClock is a SwiftUI-based iOS application that combines a customizable digital clock display with white noise playback and alarm functionality. The app is designed with a dark theme and focuses on providing a clean, distraction-free interface for time display and ambient sound management.

## Core Features

### 1. Digital Clock Display
- **Real-time clock** with automatic updates every second
- **Customizable time format**: 12-hour or 24-hour display
- **Optional seconds display** with toggle control
- **AM/PM badge** for 12-hour format (optional)
- **Segmented time display** with colon separators that adapt to orientation
- **Dynamic scaling** that maximizes available screen space usage
- **Portrait and landscape orientation support** with responsive font sizing
- **Optimal font sizing** that uses all available space efficiently
- **Immediate updates** on orientation changes and tab bar visibility changes
- **Fixed-width digit rendering** to prevent layout shifts and jumping
- **Individual digit views** with consistent spacing and alignment
- **Font customization** with family, weight, and design selection
- **Dynamic dot sizing** that matches selected font weight
- **Safe area handling** with proper Dynamic Island avoidance
- **Full-screen mode** with status bar hiding and tab bar expansion
- **Orientation-aware spacing** for optimal layout in all orientations

### 2. Clock Customization
- **Color customization**: User-selectable digit colors with color picker
- **Background color**: Customizable background with color picker
- **Glow effects**: Adjustable glow intensity (0-100%)
- **Size control**: Manual scaling (0-100%) or auto-fit mode
- **Opacity controls**: Separate opacity for clock digits and overlays
- **Random color mode**: Automatically changes digit color every minute
- **Preset themes**: Quick "Night" (black/white) and "Day" (white/black) themes
- **Font family selection**: Choose from System, San Francisco, Monaco, Courier fonts
- **Font weight options**: Ultra Light, Thin, Light, Regular, Medium, Semibold, Bold, Heavy, Black
- **Font design choices**: Default, Serif, Rounded, Monospaced designs
- **Live font preview**: Real-time preview of font changes in settings
- **Font persistence**: All font settings saved and restored automatically

### 3. Display Modes
- **Normal mode**: Standard interface with navigation and settings
- **Display mode**: Full-screen clock activated by long-press (0.6 seconds)
- **Automatic UI hiding**: Tab bar and navigation elements hide in display mode
- **Smooth transitions**: Animated transitions between modes
- **Status bar control**: Status bar automatically hidden in full-screen mode
- **Safe area expansion**: Clock expands into tab bar area when hidden
- **Dynamic Island awareness**: Proper spacing to avoid Dynamic Island overlap
- **Orientation handling**: Full-screen mode works in both portrait and landscape

### 4. Information Overlays
- **Battery level display**: Real-time battery percentage with icon
- **Date display**: Current date in "d MMMM EEE" format (e.g., "7 September Mon")
- **Overlay opacity control**: Independent opacity for battery/date overlays
- **Automatic updates**: Battery and date update in real-time

### 5. White Noise Player
- **Multiple sound options**:
  - White Noise (`white-noise.mp3`)
  - Heavy Rain White Noise (`heavy-rain-white-noise.mp3`)
  - Fan White Noise (`fan-white-noise-heater-303207.mp3`)
- **Continuous playback**: Sounds loop indefinitely
- **Simple controls**: Play/Stop button with visual feedback
- **Sound selection**: Dropdown picker for sound selection
- **JSON-based configuration**: Sound definitions loaded from external configuration
- **Bundle organization**: Sounds organized in category-based bundles
- **Shared audio player**: Singleton pattern prevents audio conflicts

### 6. Advanced Alarm System
- **Multiple alarms**: Create and manage unlimited alarms
- **Rich alarm editor**: Full-featured alarm creation and editing interface
- **Time selection**: Wheel-style date picker with optimized font sizing for maximum readability
- **Dynamic alarm sounds**: Configurable alarm sounds loaded from JSON configuration
- **Sound preview**: Play/stop functionality for testing alarm sounds before selection
- **Sound organization**: Alarm sounds organized in bundles with categories
- **Custom labels**: User-defined alarm names and descriptions
- **Repeat schedules**: Set alarms to repeat on specific weekdays or daily
- **Sound selection**: Choose from extensive system sounds with live preview
- **Volume control**: Adjustable alarm volume (0-100%)
- **Vibration settings**: Enable/disable vibration for each alarm
- **Snooze functionality**: Configurable snooze duration (5, 7, 8, 9, 10, 15, 20 minutes)
- **Smart notifications**: Automatic scheduling for one-time and repeating alarms
- **Enable/disable toggles**: Individual alarm control with instant feedback
- **Notification integration**: Uses iOS UserNotifications framework with proper scheduling
- **Persistent storage**: Alarms saved to UserDefaults with backward compatibility
- **Alarm management**: Add, edit, delete, and duplicate alarms
- **Next trigger preview**: Shows when the next alarm will fire
- **Responsive time picker**: Font sizes adapt to available space and orientation

## Advanced Clock Display Features

### Fixed-Width Digit Rendering
- **Individual digit views**: Each digit (0-9) rendered in its own view component
- **Consistent spacing**: All digits use the width of the widest digit ("8") for uniform layout
- **Height consistency**: All digits use the height of the tallest digit ("8") to prevent vertical jumping
- **Layout stability**: No shifting or jumping when time changes (e.g., "11" to "12")
- **Perfect centering**: Each digit is centered within its fixed-width container

### Font Customization System
- **Font family selection**: System, San Francisco, Monaco, Courier options
- **Weight variations**: 9 weight options from Ultra Light to Black
- **Design choices**: Default, Serif, Rounded, Monospaced designs
- **Live preview**: Real-time font preview in settings interface
- **UIFont integration**: Proper font measurement for accurate sizing
- **Weight-based dot scaling**: Colon dots automatically scale with font weight

### Dynamic Layout and Sizing
- **GeometryReader integration**: Real-time container size detection
- **Orientation-aware calculations**: Different sizing algorithms for portrait vs landscape
- **Safe area handling**: Proper Dynamic Island avoidance and tab bar expansion
- **Maximum space utilization**: Font sizes calculated to use all available space
- **Responsive updates**: Immediate recalculation on orientation or layout changes

### Advanced Spacing and Alignment
- **Orientation-aware spacing**: Different spacing values for portrait vs landscape
- **Consistent segment spacing**: Uniform spacing between hours, minutes, seconds
- **Dot weight matching**: Colon dots scale with selected font weight
- **Overflow prevention**: Spacing calculations prevent content clipping
- **Perfect centering**: All elements centered both horizontally and vertically

### Full-Screen Mode Enhancements
- **Status bar hiding**: Automatic status bar hiding in full-screen mode
- **Tab bar expansion**: Clock expands into tab bar area when hidden
- **Safe area management**: Proper handling of Dynamic Island and other safe areas
- **Smooth transitions**: Animated transitions between normal and full-screen modes
- **Orientation support**: Full-screen mode works seamlessly in all orientations

## Technical Architecture

### Code Organization Principles

**TOP PRIORITY:** The codebase must be built with the following architectural principles from the beginning:

- **True Separation of Concerns:** 
  - Many small files with focused responsibilities
  - Each module/class should have a single, well-defined purpose
  - Avoid monolithic files with mixed responsibilities

- **View Structure Requirements:**
  - **Single View Per File:** Each SwiftUI view must be in its own file
  - **No Nested Views:** Views should not contain other view structs/classes in the same file
  - **Component Extraction:** Complex views must be broken down into smaller, reusable components
  - **Clean Main Views:** Main view files should only contain the primary view logic and helper methods
  - **Component Organization:** Supporting views should be placed in appropriate `Components/` subdirectories

- **Constants and Enums:**
  - Create constants, enums, and configuration objects to avoid duplicate code or values
  - Centralize magic numbers, strings, and configuration values
  - Use enums for type safety and clarity

- **Readability and Maintainability:**
  - Code should be self-documenting with clear naming conventions
  - Easy to understand, extend, and refactor
  - Consistent patterns throughout the codebase

- **Extensibility:**
  - Design for future growth and feature additions
  - Modular architecture that allows easy integration of new components
  - Clear interfaces between modules

- **Refactorability:**
  - Code structure should make future refactoring straightforward
  - Minimize coupling between components
  - Use dependency injection and abstraction where appropriate

These principles are fundamental to the project's long-term success and must be applied consistently throughout development.

### App Structure
- **Main App**: `TheNoiseClockApp.swift` - Entry point with WindowGroup
- **Tab-based navigation**: Three main tabs (Clock, Alarms, Noise)
- **SwiftUI framework**: Modern declarative UI framework with iOS 18+ and iOS 26 features
- **Dark theme**: Preferred color scheme set to dark

### Data Models
- **ClockStyle**: @Observable class for clock customization settings
  - Time format preferences (24-hour, seconds, AM/PM)
  - Visual settings (colors, glow, scale, opacity)
  - Overlay settings (battery, date, opacity)
  - Background settings
  - Font customization (family, weight, design)
  - Color caching for performance optimization
  - Persistent storage with JSON encoding/decoding
- **Alarm**: Codable struct for comprehensive alarm data
  - UUID identifier
  - Time and enabled state
  - Custom label and description
  - Repeat schedule (weekdays)
  - Sound name with volume control
  - Vibration settings
  - Snooze duration configuration
- **Sound**: Simple struct for noise file management
  - Display name and file name
- **LegacyAlarm**: Backward compatibility struct for old alarm data

### Data Persistence
- **AppStorage**: ClockStyle settings persisted as JSON
- **UserDefaults**: Alarm data persisted as JSON
- **Bundle resources**: Audio files stored in app bundle

### Audio System
- **AVFoundation**: AVAudioPlayer for noise playback
- **@Observable NoisePlayer**: Modern state management with preloading
- **Looping playback**: Infinite loop for ambient sounds
- **Audio session management**: Proper audio session configuration
- **Error handling**: Graceful handling of missing audio files
- **AlarmTonePlayer**: Dedicated player for alarm sound previews

### Notification System
- **UserNotifications**: iOS notification framework
- **Permission handling**: Automatic permission requests
- **Smart scheduling**: One-time and repeating alarm support
- **Calendar triggers**: Precise alarm scheduling with weekday support
- **Sound customization**: System sound selection with volume control
- **Multiple notifications**: Support for repeating alarms with unique identifiers

## User Interface Design

### Navigation
- **TabView**: Three-tab interface (Clock, Alarms, Noise)
- **NavigationStack**: Modern navigation with back button support
- **Navigation destinations**: Deep linking for alarm editing
- **Toolbar integration**: Settings and add buttons in navigation bars
- **Sheet presentations**: Modal settings and alarm creation

### Visual Design
- **Rounded corners**: Modern iOS design language
- **Modern animations**: iOS 18+ smooth and bouncy animations
- **Color consistency**: Blue accent color throughout
- **Accessibility**: Proper labels and hidden decorative elements
- **Form-based layouts**: Organized sections for settings and alarm editing
- **Interactive controls**: Toggles, sliders, color pickers, and date pickers

### Settings Interface
- **Form-based layout**: Organized sections for different setting categories
- **Interactive controls**: Toggles, sliders, color pickers
- **Real-time updates**: Changes apply immediately
- **Sheet presentation**: Modal settings with detents

## File Structure and Organization

### Recommended File Organization
Following the separation of concerns principle, the codebase should be organized into focused, single-responsibility files:

```
TheNoiseClock/
├── App/
│   ├── TheNoiseClockApp.swift      # App entry point and configuration
│   └── ContentView.swift           # Main tab navigation coordinator
├── Core/
│   ├── Constants/
│   │   ├── AppConstants.swift      # App-wide constants and configuration
│   │   ├── UIConstants.swift       # UI-specific constants (colors, sizes, etc.)
│   │   └── AudioConstants.swift    # Audio-related constants
│   ├── Extensions/
│   │   ├── Color+Extensions.swift  # Color utilities and extensions
│   │   ├── Date+Extensions.swift   # Date formatting and utilities
│   │   └── View+Extensions.swift   # Common view modifiers and responsive utilities
│   └── Utilities/
│       ├── ColorUtils.swift        # Color manipulation utilities
│       ├── FontUtils.swift         # Font sizing, typography, and customization utilities
│       └── NotificationUtils.swift # Notification helper functions
├── Models/
│   ├── ClockStyle.swift            # Clock customization data model
│   ├── Alarm.swift                 # Alarm data model
│   ├── Sound.swift                 # Sound data model
│   └── LegacyAlarm.swift           # Backward compatibility model
├── ViewModels/
│   ├── ClockViewModel.swift        # Clock display logic and state
│   ├── AlarmViewModel.swift        # Alarm management logic
│   └── NoiseViewModel.swift        # Audio playback state management
├── Views/
│   ├── Clock/
│   │   ├── ClockView.swift         # Main clock display view
│   │   ├── ClockSettingsView.swift # Clock customization interface
│   │   └── Components/
│   │       ├── TimeDisplayView.swift    # Advanced segmented time display with fixed-width digits
│   │       ├── BatteryOverlayView.swift # Battery level overlay
│   │       ├── DateOverlayView.swift    # Date display overlay
│   │       └── TopOverlayView.swift     # Combined overlay container
│   ├── Alarms/
│   │   ├── AlarmView.swift         # Main alarm management view
│   │   ├── AddAlarmView.swift      # Alarm creation interface
│   │   └── Components/
│   │       ├── AlarmRowView.swift      # Individual alarm row component
│   │       ├── TimePickerSection.swift # Time selection component
│   │       ├── TimeUntilAlarmSection.swift # Time calculation display
│   │       ├── SoundSelectionView.swift   # Sound selection with preview
│   │       ├── LabelEditView.swift       # Label editing interface
│   │       └── SnoozeSelectionView.swift # Snooze duration selection
│   └── Noise/
│       ├── NoiseView.swift         # Main white noise player interface
│       └── Components/
│           ├── SoundPickerView.swift    # Sound selection component
│           └── SoundControlView.swift   # Playback controls component
├── Services/
│   ├── NoisePlayer.swift           # Audio playback service
│   ├── AlarmService.swift          # Alarm management service
│   └── NotificationService.swift   # Notification handling service
└── Resources/
    ├── sounds.json                    # Sound configuration and definitions
    ├── Ambient.bundle/                # Ambient sound category
    │   └── white-noise.mp3
    ├── Nature.bundle/                 # Nature sound category
    │   └── heavy-rain-white-noise.mp3
    ├── Mechanical.bundle/             # Mechanical sound category
    │   └── fan-white-noise-heater.mp3
    ├── AlarmSounds.bundle/            # Alarm sound category
    │   ├── digital-alarm.mp3
    │   ├── iphone-alarm.mp3
    │   ├── classic-alarm.mp3
    │   ├── beep-alarm.mp3
    │   ├── siren-alarm.mp3
    │   └── voice-wakeup.mp3
    └── Assets.xcassets/
        └── [Asset catalogs]
```

### File Naming Conventions
- **Views**: Use descriptive names ending in `View` (e.g., `ClockView`, `AlarmRowView`)
- **ViewModels**: End with `ViewModel` (e.g., `ClockViewModel`, `AlarmViewModel`)
- **Services**: End with `Service` (e.g., `AlarmService`, `NotificationService`)
- **Models**: Use noun names (e.g., `Alarm`, `Sound`, `ClockStyle`)
- **Extensions**: Use `Type+Extensions` format (e.g., `Color+Extensions`)
- **Constants**: Use descriptive names ending in `Constants` (e.g., `AppConstants`)

### Code Organization Best Practices
- **Single Responsibility**: Each file should have one clear purpose
- **Dependency Injection**: Use protocols and dependency injection for testability
- **Protocol-Oriented Design**: Define protocols for services and data sources
- **Error Handling**: Centralized error types and handling patterns
- **Testing**: Separate test targets with comprehensive coverage

### Documentation Maintenance Requirements

**CRITICAL:** The PRD must be kept up-to-date with all code changes. The following procedures are mandatory:

#### Automatic PRD Updates
- **Every code change** that affects architecture, features, or file structure **MUST** include a corresponding PRD update
- **AI Assistant Responsibility**: When making code changes, the AI assistant must automatically:
  1. **Identify PRD sections** that need updating based on the changes made
  2. **Update relevant sections** without being asked
  3. **Add new features** to the appropriate feature sections
  4. **Update file structure** when new files or components are created
  5. **Document new requirements** or architectural decisions
  6. **Maintain consistency** between code and documentation

#### PRD Update Triggers
The following changes **automatically require** PRD updates:
- **New files or components** → Update file structure section
- **New features or functionality** → Update core features section
- **Architectural changes** → Update code organization principles
- **New services or models** → Update technical architecture
- **UI/UX changes** → Update user interaction sections
- **Configuration changes** → Update technical requirements
- **Bundle or resource changes** → Update resources section

#### Documentation Standards
- **Real-time updates**: PRD updates should happen in the same conversation as code changes
- **Comprehensive coverage**: All aspects of changes must be documented
- **Version consistency**: Code and documentation must always be in sync
- **No manual requests**: Users should not need to ask for PRD updates

## Key User Interactions

### Clock Tab
1. **View time**: Real-time clock display
2. **Access settings**: Tap gear icon in navigation bar
3. **Enter display mode**: Long-press anywhere on clock (0.6 seconds)
4. **Exit display mode**: Long-press again to return to normal mode

### Settings
1. **Time format**: Toggle 24-hour, seconds, AM/PM display
2. **Appearance**: Adjust colors, glow, size, opacity
3. **Overlays**: Control battery and date display
4. **Background**: Set background color and use presets

### Alarms Tab
1. **View alarms**: List of all created alarms with labels and repeat schedules
2. **Add alarm**: Tap + button to create new alarm with full editor
3. **Edit alarm**: Tap any alarm to open comprehensive editor
4. **Toggle alarm**: Use switch to enable/disable
5. **Delete alarm**: Swipe to delete or use delete button in editor
6. **Alarm editor features**:
   - Time picker with next trigger preview
   - Custom label editing
   - Repeat schedule selection
   - Sound picker with live preview
   - Volume and vibration controls
   - Snooze duration settings

### Noise Tab
1. **Select sound**: Choose from dropdown menu
2. **Play/Stop**: Single button to control playback
3. **Continuous playback**: Sounds loop until stopped

## Technical Requirements

### iOS Compatibility
- **Minimum iOS version**: iOS 18.0+ (Latest SwiftUI features and performance optimizations)
- **Target devices**: iPhone and iPad with full adaptive layout support
- **Orientation support**: Portrait and landscape with dynamic type support
- **Accessibility**: Full VoiceOver and Dynamic Type support

### Modern iOS Technology Stack
- **SwiftUI**: Latest declarative UI framework with iOS 18+ and iOS 26 features
- **Observation Framework**: Modern @Observable pattern for state management
- **SwiftData**: Advanced data persistence with iOS 18+ SwiftData features
- **Async/Await**: Modern concurrency patterns throughout
- **Structured Concurrency**: Task groups and actors for complex operations
- **Swift 6**: Latest language features and safety improvements
- **iOS 26 Features**: Latest platform capabilities where available

### Dependencies
- **SwiftUI**: Native iOS UI framework with latest features
- **AVFoundation**: Audio playback with modern async patterns
- **UserNotifications**: Alarm notifications with rich content support
- **Combine**: Timer publishers and reactive programming
- **Observation**: Modern state management with @Observable
- **Foundation**: Core system frameworks and utilities
- **UIKit**: UIFont integration for precise text measurement and font customization

### Font and Typography Utilities
- **FontUtils.optimalFontSize()**: Calculates optimal font size for portrait orientation
- **FontUtils.maximumStretchedFontSize()**: Calculates maximum font size for stretched mode
- **FontUtils.customFont()**: Creates SwiftUI Font with custom family, weight, and design
- **FontUtils.customUIFont()**: Creates UIFont for precise text measurement
- **FontUtils.weightMultiplier()**: Calculates dot size multiplier based on font weight
- **FontUtils.calculateMaxTextWidth()**: Measures text width for fixed-width calculations
- **FontUtils.calculateMaxTextHeight()**: Measures text height for consistent digit sizing
- **FontUtils.timePickerFontSize()**: Optimized font sizing for DatePicker components

### Performance Considerations
- **Smart timer management**: Conditional timers based on settings
- **Debounced persistence**: Batched UserDefaults writes
- **Memory management**: Proper cleanup of audio players
- **Battery optimization**: Efficient update mechanisms
- **Color caching**: Avoid repeated hex-to-Color conversions
- **Dictionary lookups**: O(1) alarm access instead of linear search
- **Smooth animations**: Hardware-accelerated transitions
- **Preloaded audio**: Instant sound playback
- **Font measurement caching**: Efficient text size calculations
- **Fixed-width calculations**: Pre-calculated digit dimensions for consistent layout
- **Orientation-aware sizing**: Optimized font sizing algorithms for different orientations

## Future Enhancement Opportunities
- **Additional sound types**: More white noise variants
- **Sleep timer**: Auto-stop noise after specified time
- **Widget support**: Home screen clock widget
- **Apple Watch companion**: Watch app for quick time check
- **In-app purchases**: Premium sound packs
- **Custom sounds**: User-imported audio files
- **Multiple time zones**: World clock functionality
- **Alarm categories**: Group alarms by type (work, sleep, etc.)
- **Smart alarms**: Gradual volume increase
- **Weather integration**: Weather-based alarm sounds
- **Health integration**: Sleep tracking integration

## Development Notes

### Project Information
- **Created**: September 7, 2025
- **Framework**: SwiftUI with iOS 18.0+ target (latest stable features)
- **Architecture**: Modern SwiftUI with @Observable pattern and MVVM
- **Testing**: Comprehensive unit and UI test targets with Swift Testing
- **Version control**: Git repository with feature branch workflow
- **Performance**: Optimized for battery life and smooth operation
- **Modern iOS**: Uses latest iOS 18+ and iOS 26 features with Swift 6 language improvements

### Modern iOS Development Practices
- **Swift 6**: Latest language features including strict concurrency checking
- **Async/Await**: Modern concurrency patterns throughout the codebase
- **Observation Framework**: @Observable for reactive state management
- **SwiftUI Navigation**: Latest NavigationStack and navigation APIs with iOS 18+ features
- **Accessibility**: Full VoiceOver and Dynamic Type support with iOS 26 enhancements
- **Adaptive Layout**: Support for all device sizes and orientations
- **Performance**: Optimized for 120Hz ProMotion displays and iOS 26 performance improvements
- **Memory Management**: ARC with proper weak references and cleanup
- **Error Handling**: Result types and proper error propagation
- **Testing**: Swift Testing framework for modern test writing
- **iOS 26 Integration**: Latest platform features and capabilities where applicable

### Code Quality Standards
- **SwiftLint**: Automated code style enforcement
- **Documentation**: Comprehensive inline documentation with DocC
- **Type Safety**: Leverage Swift's type system for compile-time safety
- **Protocol-Oriented**: Use protocols for abstraction and testability
- **Dependency Injection**: Constructor injection for better testability
- **SOLID Principles**: Single responsibility, open/closed, dependency inversion
