Ariver
2026-06-30 70a1cc2e63d2c49a135bd89cec3ffb1d427d90ee
src/Apptag/PreferencesView.swift
@@ -688,6 +688,23 @@
        Color(red: 0.56, green: 0.35, blue: 0.03)
    }
    @ViewBuilder
    private func proHeaderStatusLabel(compact: Bool = false) -> some View {
        if proEntitlement.accessState == .free && !proEntitlement.isPreviewingProAppearance {
            Text(tr("settings.proStatus.freeUser"))
                .font(.system(size: compact ? 12 : 13, weight: .semibold))
                .foregroundStyle(.secondary)
                .lineLimit(1)
                .minimumScaleFactor(0.82)
        } else {
            ProStatusPill(
                text: tr(proEntitlement.compactStatusTextKey),
                style: proStatusPillStyle,
                compact: compact
            )
        }
    }
    private func centeredSettingsScrollContent<Content: View>(
        width: CGFloat,
        @ViewBuilder content: @escaping () -> Content
@@ -733,10 +750,7 @@
        compact: Bool = false
    ) -> some View {
        HStack(spacing: compact ? 8 : 12) {
            ProStatusPill(
                text: tr(proEntitlement.compactStatusTextKey),
                style: proStatusPillStyle
            )
            proHeaderStatusLabel(compact: compact)
            .layoutPriority(1)
            Text(tr(textKey))
@@ -811,7 +825,9 @@
        }
        switch selectedTab {
        case .general, .language, .about:
        case .language, .about:
            return ""
        case .general:
            return tr(proEntitlement.isUnlocked ? "settings.proBenefit.general" : "settings.proGuide.general")
        case .theme:
            return themeStatusSummary
@@ -827,43 +843,72 @@
    }
    private var shouldShowSettingsFixedProHeader: Bool {
        selectedTab != .language && selectedTab != .about
        true
    }
    private var shouldCenterUnlockedIdentityHeader: Bool {
        guard proEntitlement.isUnlocked else { return false }
        switch selectedTab {
        case .language, .pro, .about:
            return true
        case .general, .theme, .hotkeys, .tags, .data:
            return false
        }
    }
    private var settingsFixedProHeader: some View {
        HStack {
            HStack(spacing: 12) {
                if selectedTab != .pro {
                if shouldCenterUnlockedIdentityHeader {
                    Spacer(minLength: 0)
                    ProStatusPill(
                        text: tr(proEntitlement.compactStatusTextKey),
                        style: proStatusPillStyle
                        text: tr("pro.status.unlocked"),
                        style: .unlocked,
                        compact: true
                    )
                    .layoutPriority(1)
                }
                Text(settingsProHeaderText)
                    .font(.system(size: 13, weight: .medium))
                    .foregroundStyle(.secondary)
                    .lineLimit(2)
                    .fixedSize(horizontal: false, vertical: true)
                    .layoutPriority(2)
                    Text(tr("settings.proStatus.proUser"))
                        .font(.system(size: 13, weight: .medium))
                        .foregroundStyle(.secondary)
                        .lineLimit(1)
                        .fixedSize(horizontal: false, vertical: true)
                        .layoutPriority(2)
                Spacer(minLength: 8)
                if !proEntitlement.isUnlocked {
                    Button(unlockButtonTitle()) {
                        presentSettingsProPrompt(for: settingsProHeaderFeature)
                    Spacer(minLength: 0)
                } else {
                    if selectedTab != .pro {
                        proHeaderStatusLabel(compact: true)
                        .layoutPriority(1)
                    }
                    .buttonStyle(.borderedProminent)
                    .controlSize(.small)
                    .layoutPriority(3)
                    Button(tr("pro.card.restore")) {
                        proEntitlement.restorePurchases()
                    if !settingsProHeaderText.isEmpty {
                        Text(settingsProHeaderText)
                            .font(.system(size: 13, weight: .medium))
                            .foregroundStyle(.secondary)
                            .lineLimit(2)
                            .fixedSize(horizontal: false, vertical: true)
                            .layoutPriority(2)
                    }
                    .buttonStyle(.bordered)
                    .controlSize(.small)
                    .layoutPriority(3)
                    Spacer(minLength: 8)
                    if !proEntitlement.isUnlocked {
                        Button(unlockButtonTitle()) {
                            presentSettingsProPrompt(for: settingsProHeaderFeature)
                        }
                        .buttonStyle(.borderedProminent)
                        .controlSize(.small)
                        .layoutPriority(3)
                        Button(tr("pro.card.restore")) {
                            proEntitlement.restorePurchases()
                        }
                        .buttonStyle(.bordered)
                        .controlSize(.small)
                        .layoutPriority(3)
                    }
                }
            }
            .padding(.horizontal, 16)
@@ -953,7 +998,7 @@
                    Text(tr("settings.proCompare.free"))
                        .font(.system(size: 12, weight: .semibold))
                        .foregroundStyle(.secondary)
                        .frame(width: 118, alignment: .center)
                        .frame(width: 118, alignment: .leading)
                    HStack(spacing: 4) {
                        Image(systemName: "crown")
                            .font(.system(size: 12, weight: .semibold))
@@ -963,7 +1008,7 @@
                    .foregroundStyle(proAccentColor)
                    .lineLimit(1)
                    .minimumScaleFactor(0.82)
                    .frame(width: 118, alignment: .center)
                    .frame(width: 118, alignment: .leading)
                }
                ForEach(proTabComparisonFeatures) { feature in
@@ -983,14 +1028,14 @@
                            style: feature.freeStyle,
                            compact: true
                        )
                        .frame(width: 118, alignment: .center)
                        .frame(width: 118, alignment: .leading)
                        ProStatusPill(
                            text: tr(proStatusKey),
                            style: proStyle,
                            compact: true
                        )
                        .frame(width: 118, alignment: .center)
                        .frame(width: 118, alignment: .leading)
                    }
                    .padding(.horizontal, 10)
                    .padding(.vertical, 8)
@@ -1354,10 +1399,7 @@
            proUnlockedBenefitLine("pro.theme.status.unlocked", bottomPadding: 0)
        } else {
            HStack(spacing: 12) {
                ProStatusPill(
                    text: tr(proEntitlement.compactStatusTextKey),
                    style: proStatusPillStyle
                )
                proHeaderStatusLabel()
                Text(themeStatusSummary)
                    .font(.system(size: 13, weight: .medium))