| 123456789101112131415161718192021222324252627282930313233343536373839 |
- // LoopFollow
- // OnboardingStepHeader.swift
- import SwiftUI
- /// Consistent icon + title + subtitle header used at the top of each step body.
- ///
- /// The header deliberately carries no horizontal margin: it shares whatever
- /// leading edge its container uses, so it lines up exactly with the content
- /// below it — the section cards in a `Form`, or the `.padding(.horizontal)`
- /// cards in a plain `VStack`. Callers add their own horizontal padding to match.
- struct OnboardingStepHeader: View {
- let systemImage: String
- let title: String
- let subtitle: String
- var body: some View {
- // Left-aligned: justified/centered body copy is harder to read, so the
- // header reads as a natural top-down intro.
- VStack(alignment: .leading, spacing: 12) {
- Image(systemName: systemImage)
- .font(.system(size: 44, weight: .semibold))
- .foregroundStyle(Color.accentColor)
- .padding(.bottom, 2)
- Text(title)
- .font(.title2.weight(.bold))
- .multilineTextAlignment(.leading)
- Text(subtitle)
- .font(.subheadline)
- .foregroundColor(.secondary)
- .multilineTextAlignment(.leading)
- }
- .frame(maxWidth: .infinity, alignment: .leading)
- .padding(.top, 8)
- }
- }
|