AlphabetRail.swift 45 lignes · 1745 octets
import SwiftUI

// Port of ui/carnet/AlphabetRail.kt — A–Z + '#' rail; letters with contacts
// are ink and tappable, the others muted.

private let railLetters: [Character] = Array("ABCDEFGHIJKLMNOPQRSTUVWXYZ#")

struct AlphabetRail: View {
    let presentLetters: Set<Character>
    let onLetter: (Character) -> Void

    var body: some View {
        GeometryReader { _ in
            VStack(alignment: .center, spacing: 0) {
                ForEach(railLetters, id: \.self) { letter in
                    let present = presentLetters.contains(letter)
                    Group {
                        if present {
                            Button {
                                onLetter(letter)
                            } label: {
                                Text(String(letter))
                                    .font(C2VFont.labelSmall)
                                    .foregroundColor(C2VColor.ink)
                                    // Enlarged tap target: the whole rail width is tappable.
                                    .frame(maxWidth: .infinity)
                                    .contentShape(Rectangle())
                            }
                            .buttonStyle(.plain)
                        } else {
                            Text(String(letter))
                                .font(C2VFont.labelSmall)
                                .foregroundColor(C2VColor.body)
                        }
                    }
                    .frame(maxHeight: .infinity)
                    .padding(.vertical, 2)
                }
            }
            .frame(maxWidth: .infinity, maxHeight: .infinity)
        }
        .frame(width: 32)
        .padding(.vertical, 4)
    }
}