import SwiftUI struct PrimaryButton: View { let title: String var fullWidth: Bool = true var image: Image? = nil let action: @MainActor @Sendable () -> Void var body: some View { Button(action: { action() }) { HStack { Text(title) .font(AppTypography.button) .tracking(AppTypography.buttonLetterSpacing) if let image { image } } .foregroundStyle(AppColors.textInverse) .frame(maxWidth: fullWidth ? .infinity : nil) .frame(height: 56) .background(AppColors.primary) .clipShape(RoundedRectangle(cornerRadius: AppLayout.radiusLG, style: .continuous)) } .buttonStyle(.plain) } } struct PrimaryButtonLabel: View { let title: String var fullWidth: Bool = true var body: some View { Text(title) .font(AppTypography.button) .tracking(AppTypography.buttonLetterSpacing) .foregroundStyle(AppColors.textInverse) .frame(maxWidth: fullWidth ? .infinity : nil) .frame(height: 56) .background(AppColors.primary) .clipShape(RoundedRectangle(cornerRadius: AppLayout.radiusLG, style: .continuous)) } } struct SecondaryButton: View { let title: String var fullWidth: Bool = true var image: Image? = nil let action: @MainActor @Sendable () -> Void var body: some View { Button(action: { action() }) { HStack { Text(title) .font(AppTypography.button) .tracking(AppTypography.buttonLetterSpacing) if let image { image } } .foregroundStyle(AppColors.primary) .frame(maxWidth: fullWidth ? .infinity : nil) .frame(height: 56) .background(AppColors.primary) .overlay( RoundedRectangle(cornerRadius: AppLayout.radiusLG, style: .continuous) .stroke(AppColors.primary.opacity(0.3), lineWidth: 1) ) } .buttonStyle(.plain) } }