From 576afad25802a8721b80d3098615d78ac731ede5 Mon Sep 17 00:00:00 2001 From: Matt Bruce Date: Mon, 26 Jan 2026 18:29:41 -0600 Subject: [PATCH] Signed-off-by: Matt Bruce --- .../Views/History/HistoryDayDetailSheet.swift | 1 - Andromida/App/Views/History/HistoryView.swift | 2 +- .../Components/InsightDetailSheet.swift | 1 - ...cDetailSheet.swift => ArcDetailView.swift} | 83 +++++++++---------- .../App/Views/Rituals/RitualDetailView.swift | 8 +- .../Rituals/Sheets/ArcRenewalSheet.swift | 1 - .../Rituals/Sheets/PresetLibrarySheet.swift | 2 - .../Rituals/Sheets/RitualEditSheet.swift | 3 - .../Views/Settings/CategoryEditSheet.swift | 1 - Andromida/App/Views/Today/TodayView.swift | 2 +- 10 files changed, 44 insertions(+), 60 deletions(-) rename Andromida/App/Views/Rituals/{Sheets/ArcDetailSheet.swift => ArcDetailView.swift} (86%) diff --git a/Andromida/App/Views/History/HistoryDayDetailSheet.swift b/Andromida/App/Views/History/HistoryDayDetailSheet.swift index f698ab6..5e1dcb0 100644 --- a/Andromida/App/Views/History/HistoryDayDetailSheet.swift +++ b/Andromida/App/Views/History/HistoryDayDetailSheet.swift @@ -78,7 +78,6 @@ struct HistoryDayDetailSheet: View { .presentationBackground(AppSurface.primary) .presentationDetents([.medium, .large]) .presentationDragIndicator(.visible) - .presentationSizing(.form) } private var emptyState: some View { diff --git a/Andromida/App/Views/History/HistoryView.swift b/Andromida/App/Views/History/HistoryView.swift index c92e1c4..a7a51f6 100644 --- a/Andromida/App/Views/History/HistoryView.swift +++ b/Andromida/App/Views/History/HistoryView.swift @@ -90,7 +90,7 @@ struct HistoryView: View { ritualPicker // Month calendars - 2-column grid on iPad/landscape - LazyVGrid(columns: monthColumns, alignment: .leading, spacing: Design.Spacing.large) { + LazyVGrid(columns: monthColumns, alignment: .top, spacing: Design.Spacing.large) { ForEach(months, id: \.self) { month in HistoryMonthView( month: month, diff --git a/Andromida/App/Views/Insights/Components/InsightDetailSheet.swift b/Andromida/App/Views/Insights/Components/InsightDetailSheet.swift index ba9a90d..b7c6d69 100644 --- a/Andromida/App/Views/Insights/Components/InsightDetailSheet.swift +++ b/Andromida/App/Views/Insights/Components/InsightDetailSheet.swift @@ -74,7 +74,6 @@ struct InsightDetailSheet: View { } } } - .presentationSizing(.form) } // MARK: - Header Section diff --git a/Andromida/App/Views/Rituals/Sheets/ArcDetailSheet.swift b/Andromida/App/Views/Rituals/ArcDetailView.swift similarity index 86% rename from Andromida/App/Views/Rituals/Sheets/ArcDetailSheet.swift rename to Andromida/App/Views/Rituals/ArcDetailView.swift index 3b77f10..7e1a976 100644 --- a/Andromida/App/Views/Rituals/Sheets/ArcDetailSheet.swift +++ b/Andromida/App/Views/Rituals/ArcDetailView.swift @@ -1,5 +1,5 @@ // -// ArcDetailSheet.swift +// ArcDetailView.swift // Andromida // // A detailed view of a completed arc showing per-habit breakdown, @@ -15,12 +15,12 @@ private struct ArcIdentifiableDate: Identifiable { let date: Date } -/// Sheet displaying detailed analytics for a completed arc. -struct ArcDetailSheet: View { +/// View displaying detailed analytics for a completed arc. +/// Presented via NavigationLink push from RitualDetailView. +struct ArcDetailView: View { @Bindable var store: RitualStore let arc: RitualArc let ritual: Ritual - @Environment(\.dismiss) private var dismiss @State private var selectedDateItem: ArcIdentifiableDate? private let calendar = Calendar.current @@ -61,42 +61,37 @@ struct ArcDetailSheet: View { } var body: some View { - NavigationStack { - ScrollView { - VStack(alignment: .leading, spacing: Design.Spacing.large) { - // Header - headerSection - - // Stats overview - statsSection - - // Habit breakdown - habitBreakdownSection - - // Calendar history - calendarSection - } - .padding(Design.Spacing.large) - } - .background(AppSurface.primary) - .navigationTitle(String(localized: "Arc \(arc.arcNumber) Details")) - .navigationBarTitleDisplayMode(.inline) - .toolbar { - ToolbarItem(placement: .confirmationAction) { - Button(String(localized: "Done")) { - dismiss() - } - } - } - .sheet(item: $selectedDateItem) { item in - HistoryDayDetailSheet( - date: item.date, - completions: arcHabitCompletions(for: item.date), - store: store - ) + ScrollView { + VStack(alignment: .leading, spacing: Design.Spacing.large) { + // Header + headerSection + + // Stats overview + statsSection + + // Habit breakdown + habitBreakdownSection + + // Calendar history + calendarSection } + .padding(Design.Spacing.large) + .adaptiveContentWidth() + } + .background(LinearGradient( + colors: [AppSurface.primary, AppSurface.secondary], + startPoint: .topLeading, + endPoint: .bottomTrailing + )) + .navigationTitle(String(localized: "Arc \(arc.arcNumber) Details")) + .navigationBarTitleDisplayMode(.inline) + .sheet(item: $selectedDateItem) { item in + HistoryDayDetailSheet( + date: item.date, + completions: arcHabitCompletions(for: item.date), + store: store + ) } - .presentationSizing(.form) } /// Returns habit completions for a specific date within this arc @@ -333,9 +328,11 @@ struct ArcDetailSheet: View { } #Preview { - ArcDetailSheet( - store: RitualStore.preview, - arc: RitualStore.preview.rituals.first!.latestArc!, - ritual: RitualStore.preview.rituals.first! - ) + NavigationStack { + ArcDetailView( + store: RitualStore.preview, + arc: RitualStore.preview.rituals.first!.latestArc!, + ritual: RitualStore.preview.rituals.first! + ) + } } diff --git a/Andromida/App/Views/Rituals/RitualDetailView.swift b/Andromida/App/Views/Rituals/RitualDetailView.swift index 1bb6f71..7effbcd 100644 --- a/Andromida/App/Views/Rituals/RitualDetailView.swift +++ b/Andromida/App/Views/Rituals/RitualDetailView.swift @@ -12,7 +12,6 @@ struct RitualDetailView: View { @State private var showingDeleteConfirmation = false @State private var showingEndArcConfirmation = false @State private var showingStartArcConfirmation = false - @State private var selectedArcForDetail: RitualArc? init(store: RitualStore, categoryStore: CategoryStore, ritual: Ritual) { self.store = store @@ -142,9 +141,6 @@ struct RitualDetailView: View { .sheet(isPresented: $showingEditSheet) { RitualEditSheet(store: store, categoryStore: categoryStore, ritual: ritual) } - .sheet(item: $selectedArcForDetail) { arc in - ArcDetailSheet(store: store, arc: arc, ritual: ritual) - } .alert(String(localized: "Delete Ritual?"), isPresented: $showingDeleteConfirmation) { Button(String(localized: "Cancel"), role: .cancel) {} Button(String(localized: "Delete"), role: .destructive) { @@ -400,8 +396,8 @@ struct RitualDetailView: View { let possibleCheckIns = habits.count * arc.durationDays let completionRate = possibleCheckIns > 0 ? Int(Double(totalCheckIns) / Double(possibleCheckIns) * 100) : 0 - return Button { - selectedArcForDetail = arc + return NavigationLink { + ArcDetailView(store: store, arc: arc, ritual: ritual) } label: { HStack { VStack(alignment: .leading, spacing: Design.Spacing.xSmall) { diff --git a/Andromida/App/Views/Rituals/Sheets/ArcRenewalSheet.swift b/Andromida/App/Views/Rituals/Sheets/ArcRenewalSheet.swift index 2cbe4ab..85d73e8 100644 --- a/Andromida/App/Views/Rituals/Sheets/ArcRenewalSheet.swift +++ b/Andromida/App/Views/Rituals/Sheets/ArcRenewalSheet.swift @@ -58,7 +58,6 @@ struct ArcRenewalSheet: View { .sheet(isPresented: $showingEditSheet) { RitualEditSheet(store: store, categoryStore: categoryStore, ritual: ritual) } - .presentationSizing(.form) } private var celebrationHeader: some View { diff --git a/Andromida/App/Views/Rituals/Sheets/PresetLibrarySheet.swift b/Andromida/App/Views/Rituals/Sheets/PresetLibrarySheet.swift index d6d933e..6bfa67c 100644 --- a/Andromida/App/Views/Rituals/Sheets/PresetLibrarySheet.swift +++ b/Andromida/App/Views/Rituals/Sheets/PresetLibrarySheet.swift @@ -47,7 +47,6 @@ struct PresetLibrarySheet: View { } .presentationDetents([.large]) .presentationDragIndicator(.visible) - .presentationSizing(.form) } // MARK: - Category Picker @@ -197,7 +196,6 @@ struct PresetDetailSheet: View { } .presentationDetents([.medium, .large]) .presentationDragIndicator(.visible) - .presentationSizing(.form) } private var headerSection: some View { diff --git a/Andromida/App/Views/Rituals/Sheets/RitualEditSheet.swift b/Andromida/App/Views/Rituals/Sheets/RitualEditSheet.swift index 43e3e65..323aea2 100644 --- a/Andromida/App/Views/Rituals/Sheets/RitualEditSheet.swift +++ b/Andromida/App/Views/Rituals/Sheets/RitualEditSheet.swift @@ -93,7 +93,6 @@ struct RitualEditSheet: View { } .presentationDetents([.large]) .presentationDragIndicator(.visible) - .presentationSizing(.form) } // MARK: - Form Sections @@ -557,7 +556,6 @@ struct IconPickerSheet: View { } .presentationDetents([.medium, .large]) .presentationDragIndicator(.visible) - .presentationSizing(.form) } private func iconButton(_ icon: String) -> some View { @@ -674,7 +672,6 @@ struct HabitIconPickerSheet: View { } .presentationDetents([.medium, .large]) .presentationDragIndicator(.visible) - .presentationSizing(.form) } private func iconButton(_ icon: String) -> some View { diff --git a/Andromida/App/Views/Settings/CategoryEditSheet.swift b/Andromida/App/Views/Settings/CategoryEditSheet.swift index cc10070..09c321c 100644 --- a/Andromida/App/Views/Settings/CategoryEditSheet.swift +++ b/Andromida/App/Views/Settings/CategoryEditSheet.swift @@ -120,7 +120,6 @@ struct CategoryEditSheet: View { } } .presentationDetents([.medium]) - .presentationSizing(.form) } private func loadCategory() { diff --git a/Andromida/App/Views/Today/TodayView.swift b/Andromida/App/Views/Today/TodayView.swift index 42471de..a6bcd95 100644 --- a/Andromida/App/Views/Today/TodayView.swift +++ b/Andromida/App/Views/Today/TodayView.swift @@ -51,7 +51,7 @@ struct TodayView: View { } } else { // Use 2-column grid on iPad/landscape when multiple rituals - LazyVGrid(columns: ritualColumns, alignment: .leading, spacing: Design.Spacing.large) { + LazyVGrid(columns: ritualColumns, alignment: .top, spacing: Design.Spacing.large) { ForEach(todayRituals) { ritual in TodayRitualSectionView( focusTitle: ritual.title,