Book a Demo!
CoCalc Logo Icon
StoreFeaturesDocsShareSupportNewsAboutPoliciesSign UpSign In
signalapp
GitHub Repository: signalapp/Signal-iOS
Path: blob/main/Signal/Registration/UserInterface/RegistrationUIStyles.swift
1 views
//
// Copyright 2025 Signal Messenger, LLC
// SPDX-License-Identifier: AGPL-3.0-only
//

import Foundation
import SignalServiceKit
import SwiftUI

extension Registration {

    enum UI {

        private static func primaryButtonStyle() -> some PrimitiveButtonStyle {
            if #available(iOS 26, *) {
                return GlassProminentButtonStyle.glassProminent
            } else {
                return BorderedProminentButtonStyle.borderedProminent
            }
        }

        private static func secondaryButtonStyle() -> some PrimitiveButtonStyle {
            if #available(iOS 26, *) {
                return GlassProminentButtonStyle.glassProminent
            } else {
                return PlainButtonStyle.plain
            }
        }

        private static var largeButtonContentPadding: EdgeInsets {
            // SwiftUI wants there to be 7pt smaller than NSDirectionalEdgeInsets.largeButtonContentInsets
            // in order to achieve exactly the same button size.
            EdgeInsets(top: 8, leading: 10, bottom: 8, trailing: 10)
        }

        private static var mediumButtonContentPadding: EdgeInsets {
            // SwiftUI wants there to be 7pt smaller than NSDirectionalEdgeInsets.mediumButtonContentInsets
            // in order to achieve exactly the same button size.
            EdgeInsets(top: 5, leading: 10, bottom: 5, trailing: 10)
        }

        private static func buttonBorderShape() -> ButtonBorderShape {
            if #available(iOS 26, *) {
                return ButtonBorderShape.capsule
            } else {
                return ButtonBorderShape.roundedRectangle(radius: 14)
            }
        }

        private static func primaryButtonForegroundColor() -> Color {
            return .white
        }

        private static func secondaryButtonForegroundColor() -> Color {
            if #available(iOS 26, *) {
                return .Signal.label
            } else {
                return .Signal.accent
            }
        }

        struct LargePrimaryButtonStyle: PrimitiveButtonStyle {
            @ViewBuilder
            func makeBody(configuration: Configuration) -> some View {
                Button(action: configuration.trigger) {
                    HStack {
                        Spacer()
                        configuration.label
                            .font(.headline)
                            .foregroundColor(UI.primaryButtonForegroundColor())
                        Spacer()
                    }
                    .padding(UI.largeButtonContentPadding)
                }
                .buttonStyle(UI.primaryButtonStyle())
                .buttonBorderShape(UI.buttonBorderShape())
                .tint(Color.Signal.accent)
            }
        }

        struct LargeSecondaryButtonStyle: PrimitiveButtonStyle {
            @ViewBuilder
            func makeBody(configuration: Configuration) -> some View {
                Button(action: configuration.trigger) {
                    HStack {
                        Spacer()
                        configuration.label
                            .font(.headline)
                            .foregroundColor(UI.secondaryButtonForegroundColor())
                        Spacer()
                    }
                    .padding(UI.largeButtonContentPadding)
                }
                .buttonStyle(UI.secondaryButtonStyle())
                .buttonBorderShape(UI.buttonBorderShape())
                .tint(.clear)
            }
        }

        struct MediumSecondaryButtonStyle: PrimitiveButtonStyle {
            @ViewBuilder
            func makeBody(configuration: Configuration) -> some View {
                Button(action: configuration.trigger) {
                    configuration.label
                        .font(.headline)
                        .foregroundColor(UI.secondaryButtonForegroundColor())
                        .padding(UI.mediumButtonContentPadding)
                }
                .buttonStyle(UI.secondaryButtonStyle())
                .buttonBorderShape(UI.buttonBorderShape())
                .tint(.clear)
            }
        }
    }
}