feat: page tutorials for Today & Workout, FAB fix, quadrant color consistency

- Add first-visit tutorial cards for TodayView (3 steps) and WorkoutView (3 steps) using new InViewTutorialCard component; each has independent AppStorage completion flag
- Fix FAB hidden behind custom tab bar in MatrixView by moving NavigationStack inside outer ZStack so FAB sits at the correct safe area level
- Fix task colors throughout app to use quadrant.color/softColor instead of taskColor — tasks now consistently show orange/yellow/blue/green matching their matrix quadrant in Today timeline, calendar dots, and day view
- Fix WorkoutView background (move ignoresSafeArea out of ZStack children into .background modifier)

Co-Authored-By: Kutesir <tqwyy79vzn@privaterelay.appleid.com>
This commit is contained in:
Robin Kutesa
2026-06-01 19:40:00 +03:00
parent f96f09ec29
commit 070dd77b4e
6 changed files with 202 additions and 37 deletions

View File

@@ -62,6 +62,7 @@ struct WorkoutView: View {
@State private var showManage = false
@State private var showAddSection = false
@State private var isReordering = false
@ObservedObject private var tm = TutorialManager.shared
private let restTick = Timer.publish(every: 1, on: .main, in: .common).autoconnect()
private var headerDate: String {
@@ -71,8 +72,6 @@ struct WorkoutView: View {
var body: some View {
ZStack(alignment: .bottomTrailing) {
AppColors.background(cs).ignoresSafeArea()
if isReordering {
Color.black.opacity(0.001)
.ignoresSafeArea()
@@ -219,7 +218,23 @@ struct WorkoutView: View {
.foregroundColor(AppColors.accent)
}
}
if tm.workoutIsActive {
VStack {
Spacer()
InViewTutorialCard(
tips: tm.workoutTips,
step: $tm.workoutStep,
onAdvance: { tm.advanceWorkout() },
onSkip: { tm.skipWorkout() }
)
.padding(.bottom, 84)
}
.transition(.opacity)
.zIndex(10)
}
}
.background(AppColors.background(cs).ignoresSafeArea())
.overlay(alignment: .top) {
if isReordering {
Button {