Shop Checkout

Shop Checkout

by dockui

A modern SwiftUI checkout screen with shipping address, payment method, order summary, and a place order button. Clean layout with reusable, modular components.

Platform
SwiftUI
Code
Native Swift
Format
Screen
Access
Free

Code Snippet

import SwiftUI

struct ShopCheckoutTemplate: View {
    var body: some View {
        NavigationView {
            ScrollView {
                VStack(spacing: 32) {
                    // Shipping Address
                    HStack {
                        VStack(alignment: .leading, spacing: 8) {
                            HStack {
                                Image(systemName: "house.fill")
                                    .foregroundColor(.blue)
                                Text("Shipping Address")
                                    .font(.headline)
                            }
                            Text("John Doe\n123 Main St\nSan Francisco, CA 94101")
                                .font(.subheadline)
                                .foregroundColor(.secondary)
                            Button(action: {}) {
                                Text("Change")
                                    .font(.caption)
                                    .foregroundColor(.blue)
                            }
                        }
                        .frame(maxWidth: .infinity, alignment: .leading)
                    }
                    .padding()
                    .frame(maxWidth: .infinity, alignment: .leading)
                    .background(
                        RoundedRectangle(cornerRadius: 16, style: .continuous)
                            .fill(Color(.systemBackground).opacity(0.7))
                    )

                    // Payment Method
                    HStack {
                        VStack(alignment: .leading, spacing: 8) {
                            HStack {
                                Image(systemName: "creditcard.fill")
                                    .foregroundColor(.purple)
                                Text("Payment Method")
                                    .font(.headline)
                            }
                            HStack(spacing: 12) {
                                Image(systemName: "creditcard")
                                    .foregroundColor(.secondary)
                                Text("Visa **** 4242")
                                    .font(.subheadline)
                                    .foregroundColor(.secondary)
                            }
                            Button(action: {}) {
                                Text("Change")
                                    .font(.caption)
                                    .foregroundColor(.blue)
                            }
                        }
                        .frame(maxWidth: .infinity, alignment: .leading)
                    }
                    .padding()
                    .frame(maxWidth: .infinity, alignment: .leading)
                    .background(
                        RoundedRectangle(cornerRadius: 16, style: .continuous)
                            .fill(Color(.systemBackground).opacity(0.7))
                    )

                    // Order Summary
                    VStack(alignment: .leading, spacing: 0) {
                        HStack {
                            Text("Order Summary")
                                .font(.headline)
                            Spacer()
                        }
                        .padding(.bottom, 8)
                        ForEach(checkoutItems) { item in
                            CheckoutItemRow(item: item)
                            Divider()
                        }
                        HStack {
                            Text("Subtotal")
                                .foregroundColor(.secondary)
                            Spacer()
                            Text("$210.00")
                        }
                        .padding(.top, 8)
                        HStack {
                            Text("Shipping")
                                .foregroundColor(.secondary)
                            Spacer()
                            Text("$10.00")
                        }
                        Divider()
                        HStack {
                            Text("Total")
                                .font(.headline)
                            Spacer()
                            Text("$220.00")
                                .font(.headline)
                        }
                    }
                    .padding()
                    .background(
                        RoundedRectangle(cornerRadius: 16, style: .continuous)
                            .fill(Color(.systemBackground).opacity(0.7))
                    )
                    .padding(.horizontal)

                    // Place Order Button
                    Button(action: {}) {
                        Text("Place Order")
                            .font(.headline)
                            .foregroundColor(.white)
                            .frame(maxWidth: .infinity)
                            .padding()
                            .background(Color.blue)
                            .cornerRadius(16)
                    }
                    .padding(.horizontal)
                }
                .padding(.vertical, 32)
            }
            .navigationTitle("Checkout")
            .background(
                LinearGradient(gradient: Gradient(colors: [Color.blue.opacity(0.10), Color.purple.opacity(0.08)]), startPoint: .top, endPoint: .bottom)
                    .ignoresSafeArea()
            )
        }
    }
}

// MARK: - Checkout Items
struct CheckoutItem: Identifiable {
    let id = UUID()
    let name: String
    let icon: String // SF Symbol or image name
    let qty: Int
    let price: Double
}

let checkoutItems: [CheckoutItem] = [
    .init(name: "Wireless Earbuds", icon: "earbuds", qty: 1, price: 150.0),
    .init(name: "Charging Cable", icon: "cable.connector", qty: 2, price: 30.0)
]

struct CheckoutItemRow: View {
    let item: CheckoutItem
    var body: some View {
        HStack(spacing: 12) {
            ZStack {
                RoundedRectangle(cornerRadius: 8, style: .continuous)
                    .fill(Color(.systemGray6))
                    .frame(width: 36, height: 36)
                Image(systemName: item.icon)
                    .font(.system(size: 20))
                    .foregroundColor(.blue)
            }
            VStack(alignment: .leading, spacing: 2) {
                Text(item.name)
                    .font(.subheadline)
                Text("\(item.qty)x")
                    .font(.caption)
                    .foregroundColor(.secondary)
            }
            Spacer()
            Text(String(format: "$%.2f", item.price * Double(item.qty)))
                .font(.subheadline)
        }
        .padding(.vertical, 4)
    }
}

More Templates

Similar Blogs

View All Articles
How to Translate Xcode String Catalogs with AI

How to Translate Xcode String Catalogs with AI

Learn how to efficiently translate Xcode string catalogs using AI fast, streamlining localization for your iOS and SwiftUI applications.

by dockui
May 4
How to optimize your SwiftUI app in 2026

How to optimize your SwiftUI app in 2026

Discover top strategies to optimize your SwiftUI app in 2026, enhancing performance, responsiveness, and maintainability with modern concurrency.

by dockui
Apr 29
SwiftUI: iOS Confirmation Alert (Confirm + Cancel)

SwiftUI: iOS Confirmation Alert (Confirm + Cancel)

SwiftUI iOS confirmation alert with Confirm and Cancel buttons. Beginners guide to building safe actions, destructive deletes, and commit dialogs.

by dockui
Nov 11
SwiftUI: IOS Haptic Feedback Guide 2026

SwiftUI: IOS Haptic Feedback Guide 2026

Add click to vibrate haptic feedback in SwiftUI. Full guide to UIImpactFeedbackgenerator, success, error, selection, and tap vibration patterns with code.

by dockui
Nov 11

Code copied to clipboard!