# Brutalist App-Wide Design ## Overview Extend the Brutalist design style from home-screen-only to work app-wide. Brutalist is a **shape/typography language** that layers on top of the user's chosen **color theme** (Teal, Orbit, Clutch, etc.). **Scope:** Classic + Brutalist styles only. Other 22 styles fall back to Classic for non-home screens. ## Design Language ### What Brutalist Controls (Shape Language) | Property | Classic | Brutalist | |----------|---------|-----------| | Typography | System default | Monospaced | | Text case | Mixed case | UPPERCASE | | Letter tracking | 0 | 2-4 | | Corner radius | 8-16px | 0px | | Borders | None | 1-2px solid | | Shadows | Soft | None or harsh | | Gradients | Yes | No (flat colors) | | Dividers | Subtle lines | Perforated ticket-stub | | Labels | Plain text | Bracketed `[ SECTION ]` | ### What Theme Still Controls (Color Palette) - `Theme.warmOrange` → accent color - `Theme.routeGold` → secondary accent - `Theme.textPrimary/Secondary/Muted` → text colors - `Theme.cardBackground` → surfaces - `Theme.darkBackground1/lightBackground1` → flat backgrounds (Brutalist override) ## Architecture ### Pattern: Adaptive View Routers Each major screen has an "Adaptive" wrapper that routes to style-specific variants: ```swift struct AdaptiveTripDetailView: View { let trip: Trip var body: some View { switch DesignStyleManager.shared.currentStyle { case .brutalist: TripDetailView_Brutalist(trip: trip) default: TripDetailView_Classic(trip: trip) } } } ``` ### File Structure ``` SportsTime/Core/Design/ ├── StyleProvider.swift (protocol + implementations) SportsTime/Features/Trip/Views/ ├── AdaptiveTripDetailView.swift (router) └── Variants/ ├── Classic/TripDetailView_Classic.swift └── Brutalist/TripDetailView_Brutalist.swift SportsTime/Features/MyTrips/Views/ ├── AdaptiveMyTripsView.swift (router) └── Variants/ ├── Classic/MyTripsView_Classic.swift └── Brutalist/MyTripsView_Brutalist.swift SportsTime/Features/Schedule/Views/ ├── AdaptiveScheduleView.swift (router) └── Variants/ ├── Classic/ScheduleView_Classic.swift └── Brutalist/ScheduleView_Brutalist.swift SportsTime/Features/Settings/Views/ ├── AdaptiveSettingsView.swift (router) └── Variants/ ├── Classic/SettingsView_Classic.swift └── Brutalist/SettingsView_Brutalist.swift ``` ## StyleProvider Protocol Lightweight protocol for shared component styling within variants: ```swift protocol StyleProvider { // Shape var cornerRadius: CGFloat { get } var borderWidth: CGFloat { get } // Typography var fontDesign: Font.Design { get } var usesUppercase: Bool { get } var headerTracking: CGFloat { get } // Effects var usesGradientBackgrounds: Bool { get } var usesSoftShadows: Bool { get } // Helpers func flatBackground(_ colorScheme: ColorScheme) -> Color } struct ClassicStyle: StyleProvider { let cornerRadius: CGFloat = 12 let borderWidth: CGFloat = 0 let fontDesign: Font.Design = .default let usesUppercase = false let headerTracking: CGFloat = 0 let usesGradientBackgrounds = true let usesSoftShadows = true } struct BrutalistStyle: StyleProvider { let cornerRadius: CGFloat = 0 let borderWidth: CGFloat = 1 let fontDesign: Font.Design = .monospaced let usesUppercase = true let headerTracking: CGFloat = 2 let usesGradientBackgrounds = false let usesSoftShadows = false } ``` ## Screen Designs ### TripDetailView_Brutalist **Header:** - Date range: Monospaced, uppercase, wide tracking - Route: `DETROIT → MILWAUKEE → SALT LAKE` (arrows, no dots) - Sport badges: Bordered rectangles, monospace text **Stats row:** - Bordered boxes: `[ 7 DAYS ]` `[ 3 CITIES ]` `[ 4 GAMES ]` - Monospaced numbers, uppercase labels **Score card:** - Sharp rectangle, 2px border - Score grade uses `Theme.warmOrange` - No glow effects **Itinerary:** - Day headers: `DAY 1` large monospace - Perforated dividers between days - Game rows: Bordered boxes, monospace teams - Travel: `[ TRAVEL ] DETROIT → MILWAUKEE • 327 MI • 5H 27M` - Timeline: Solid line, square dots ### MyTripsView_Brutalist - Section headers: `[ PLANNED ]` `[ COMPLETED ]` - Trip rows: Bordered, monospace city names - Status badges: Sharp rectangles ### ScheduleView_Brutalist - Date picker: Sharp buttons, monospace dates - Game list: Bordered rows, monospace matchups - Filters: Bracketed labels `[ NBA ]` `[ NHL ]` ### SettingsView_Brutalist - Section headers: `[ APPEARANCE ]` `[ ACCOUNT ]` - Row items: Bordered, monospace labels - Toggles: Sharp rectangles ## Implementation Order 1. `StyleProvider.swift` - Protocol + Classic/Brutalist implementations 2. `TripDetailView_Brutalist.swift` + `AdaptiveTripDetailView.swift` 3. `MyTripsView_Brutalist.swift` + `AdaptiveMyTripsView.swift` 4. `ScheduleView_Brutalist.swift` + `AdaptiveScheduleView.swift` 5. `SettingsView_Brutalist.swift` + `AdaptiveSettingsView.swift` ## Files to Modify - `UIDesignStyle.swift` - Add `styleProvider` computed property - All callers of TripDetailView, MyTripsView, etc. - Switch to Adaptive versions