fix(design): drop cyberpunk category gradients and decorative warm colors - #15
Merged
Conversation
The auto-generated scene manifest declared an empty UISceneDelegateClassName, which prevented UIKit from installing a scene delegate and left the app on a black launch screen on iOS 26 simulators. Removing the manifest lets SwiftUI's WindowGroup attach directly. Co-authored-by: opencode-agent <noreply@opencode.ai>
The mascot was rendered with the ember product accent, which the design system reserves for ordinary product actions. Identity yellow is for brand moments only, so the mascot now mirrors the BetterFit mark (three compressed ovals in identity yellow with black features for contrast) and a new `identity` token lives in BFColors alongside identityInk and identitySurface. The profile header swaps its generic avatar for the new EmberMascot, and athlete illustrations on workout cards stay on the ember product accent (correct per the posture rule). Co-authored-by: opencode-agent <noreply@opencode.ai>
Restructure Workout home and Plan to follow the design-system flow rule: lead with the next action or conclusion, then support it; do not fill the screen with metrics. Workout home: - greeting 'Hello! Demo' -> 'Hello, Demo' (proper comma, single voice, no debug-flag feel) - workout overview collapses seven metrics into one conclusion line + recovery %; the category split was an echo of the heatmap below - workout preview reads from the currently-displayed suggested workout, so Target Muscles stays in sync with Up Next - Apple Health banner collapses two icon buttons into a single tappable card; long-press exposes Dismiss Plan: - page padding 16 -> 20 per spec - empty-day state becomes a clear 'Add exercises' primary CTA on a 16pt card instead of a dashed ghost button - recovery row corner radius aligned to BFRadius.card Co-authored-by: opencode-agent <noreply@opencode.ai>
Adds a polished README with: - tagline and identity copy - retina (@2x) iOS screenshots in a comparison grid - 'why BetterFit' principles aligned to the design system - feature overview table - install, run, and docs links Co-authored-by: opencode-agent <noreply@opencode.ai>
…lors The exercise timeline previews used per-category gradient pairs (blue/cyan, purple/pink, red/orange, green/teal) that don't exist in the design system and read as a neon-fitness aesthetic. Both StaticTimelineRow and UnifiedExerciseTimeline now use a single tinted ember surface with SF Symbol differentiation, so exercise categories stay visually distinct without inventing colors that fight the recovery palette. ProfileView health stats were using .red, .orange, .blue, .purple arbitrarily. Re-aligned: - BMI 'Normal' -> success (green, semantic for healthy range) - Strength Score 'Advanced' -> brandAccent (ember, positive tier) - Resting HR -> text secondary (was red, now neutral; HR isn't a status signal) - Active Cal 'Today' -> brandAccent (active state) - Real-stats icons (Total Workouts / Total Volume / Time Active) -> brandAccent instead of mixed orange/blue/purple Consequences: better visual coherence with the design system. Recovers, destructive actions, and the streak indicator are unchanged; ember and red still appear in their semantic roles (action and recovery: sore / destructive). Co-authored-by: opencode-agent <noreply@opencode.ai>
johnnyhuy
added a commit
that referenced
this pull request
Aug 9, 2026
…lors (#15) * fix(iOS): remove invalid UIApplicationSceneManifest blocking launch The auto-generated scene manifest declared an empty UISceneDelegateClassName, which prevented UIKit from installing a scene delegate and left the app on a black launch screen on iOS 26 simulators. Removing the manifest lets SwiftUI's WindowGroup attach directly. Co-authored-by: opencode-agent[bot] <219766164+opencode-agent[bot]@users.noreply.github.com> * feat(design): add identity tokens and BetterFit mark mascot The mascot was rendered with the ember product accent, which the design system reserves for ordinary product actions. Identity yellow is for brand moments only, so the mascot now mirrors the BetterFit mark (three compressed ovals in identity yellow with black features for contrast) and a new `identity` token lives in BFColors alongside identityInk and identitySurface. The profile header swaps its generic avatar for the new EmberMascot, and athlete illustrations on workout cards stay on the ember product accent (correct per the posture rule). Co-authored-by: opencode-agent[bot] <219766164+opencode-agent[bot]@users.noreply.github.com> * feat(ios): lead with next action and tighten Workout/Plan layouts Restructure Workout home and Plan to follow the design-system flow rule: lead with the next action or conclusion, then support it; do not fill the screen with metrics. Workout home: - greeting 'Hello! Demo' -> 'Hello, Demo' (proper comma, single voice, no debug-flag feel) - workout overview collapses seven metrics into one conclusion line + recovery %; the category split was an echo of the heatmap below - workout preview reads from the currently-displayed suggested workout, so Target Muscles stays in sync with Up Next - Apple Health banner collapses two icon buttons into a single tappable card; long-press exposes Dismiss Plan: - page padding 16 -> 20 per spec - empty-day state becomes a clear 'Add exercises' primary CTA on a 16pt card instead of a dashed ghost button - recovery row corner radius aligned to BFRadius.card Co-authored-by: opencode-agent[bot] <219766164+opencode-agent[bot]@users.noreply.github.com> * docs(readme): add screenshots and marketing showcase Adds a polished README with: - tagline and identity copy - retina (@2x) iOS screenshots in a comparison grid - 'why BetterFit' principles aligned to the design system - feature overview table - install, run, and docs links Co-authored-by: opencode-agent[bot] <219766164+opencode-agent[bot]@users.noreply.github.com> * fix(design): drop cyberpunk category gradients and decorative warm colors The exercise timeline previews used per-category gradient pairs (blue/cyan, purple/pink, red/orange, green/teal) that don't exist in the design system and read as a neon-fitness aesthetic. Both StaticTimelineRow and UnifiedExerciseTimeline now use a single tinted ember surface with SF Symbol differentiation, so exercise categories stay visually distinct without inventing colors that fight the recovery palette. ProfileView health stats were using .red, .orange, .blue, .purple arbitrarily. Re-aligned: - BMI 'Normal' -> success (green, semantic for healthy range) - Strength Score 'Advanced' -> brandAccent (ember, positive tier) - Resting HR -> text secondary (was red, now neutral; HR isn't a status signal) - Active Cal 'Today' -> brandAccent (active state) - Real-stats icons (Total Workouts / Total Volume / Time Active) -> brandAccent instead of mixed orange/blue/purple Consequences: better visual coherence with the design system. Recovers, destructive actions, and the streak indicator are unchanged; ember and red still appear in their semantic roles (action and recovery: sore / destructive). Co-authored-by: opencode-agent[bot] <219766164+opencode-agent[bot]@users.noreply.github.com> --------- Co-authored-by: opencode-agent[bot] <219766164+opencode-agent[bot]@users.noreply.github.com>
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
Summary
Aligns two more surfaces with the design system's color rules.
StaticTimelineRowandUnifiedExerciseTimeline) drop per-category gradient pairs (blue/cyan, purple/pink, orange/yellow, yellow/orange, red/orange, green/teal). These weren't in the design system and read as a neon-fitness aesthetic that fights the recovery palette. Both now use a single tinted ember surface with SF Symbol differentiation, so categories stay visually distinct without inventing colors.ProfileViewwere using arbitrary per-stat colors (.red,.orange,.blue,.purple). Now aligned:BFColors.success(semantic for healthy range)BFColors.brandAccent(positive tier accent, not warning amber)BFColors.textSecondary(was red, now neutral — HR isn't a status signal)BFColors.brandAccent(active state)brandAccentinstead of mixed orange/blue/purpleConsequences
recovery: sore(recovery dots, destructive actions). The warm-tone overlap only happens where one of those two roles is appropriate.gradientColorsper timeline) and acategoryColorswitch.Testing
Co-authored-by: opencode-agent noreply@opencode.ai