import SwiftUI import WidgetKit // A launcher complication: a static button on the watch face that opens the // Workouts app. It carries no data, so the timeline is a single entry that // never refreshes. Tapping any accessory widget launches its containing app, // so no deep link or App Group is needed. private struct LauncherEntry: TimelineEntry { let date: Date } private struct LauncherProvider: TimelineProvider { func placeholder(in context: Context) -> LauncherEntry { LauncherEntry(date: .now) } func getSnapshot(in context: Context, completion: @escaping (LauncherEntry) -> Void) { completion(LauncherEntry(date: .now)) } func getTimeline(in context: Context, completion: @escaping (Timeline) -> Void) { // Nothing ever changes — one entry, never reload. completion(Timeline(entries: [LauncherEntry(date: .now)], policy: .never)) } } private struct LauncherView: View { @Environment(\.widgetFamily) private var family private let glyph = "dumbbell.fill" // The app icon's dumbbell runs lower-left to upper-right; tilt the glyph // counter-clockwise to match (SwiftUI rotates clockwise for positive angles). // `.widgetAccentable()` puts it in the accent group so the watch face tints // it with its main color instead of leaving it white. private var dumbbell: some View { Image(systemName: glyph) .rotationEffect(.degrees(-35)) .widgetAccentable() } var body: some View { switch family { case .accessoryInline: // Inline templates render the symbol upright next to text; leave as-is. Label("Workouts", systemImage: glyph) case .accessoryRectangular: HStack(spacing: 6) { dumbbell.font(.title3) Text("Workouts").font(.headline) } .frame(maxWidth: .infinity, maxHeight: .infinity, alignment: .leading) case .accessoryCorner: dumbbell .font(.title2) .widgetLabel("Workouts") default: // .accessoryCircular and any future families ZStack { AccessoryWidgetBackground() dumbbell .font(.title3) } } } } struct WorkoutsLauncherComplication: Widget { private let kind = "WorkoutsLauncher" var body: some WidgetConfiguration { StaticConfiguration(kind: kind, provider: LauncherProvider()) { _ in LauncherView() .containerBackground(.clear, for: .widget) } .configurationDisplayName("Open Workouts") .description("Tap to open the Workouts app.") .supportedFamilies([ .accessoryCircular, .accessoryCorner, .accessoryInline, .accessoryRectangular, ]) } } @main struct WorkoutsWatchWidgetBundle: WidgetBundle { var body: some Widget { WorkoutsLauncherComplication() } }