import SwiftUI

/// # Typography — the SF type ramp (FROZEN public surface)
///
/// All font choices come from `DS.Typography`. The ramp maps to Apple's
/// semantic text styles so everything scales with Dynamic Type (the a11y
/// audit's "keep it scalable" point). Numbers/dimensions/cost/`cols×rows`/
/// timestamps use `mono(_:)` — SF Mono with tabular figures — so columns line
/// up and digits don't jitter as values change (matches the existing
/// `TelemetryChips`/`Timeline` convention, now centralized).
extension DS {
    enum Typography {

        // ── Proportional ramp (Dynamic-Type scaling, semantic styles) ───────

        /// Screen hero title.
        static let largeTitle = Font.largeTitle
        /// Section / prominent title.
        static let title = Font.title2
        /// Emphasis / card heading.
        static let headline = Font.headline
        /// Default body text.
        static let body = Font.body
        /// Slightly smaller body (secondary actions).
        static let callout = Font.callout
        /// Meta / caption text.
        static let caption = Font.caption

        // ── Monospaced (numbers, dimensions, timestamps) ────────────────────

        /// SF Mono + tabular figures at the given text style (default `.body`).
        /// Use for anything numeric that must align or not jump: `cols×rows`,
        /// device/client counts, `$cost`, context %, relative timestamps.
        static func mono(_ style: Font.TextStyle = .body) -> Font {
            .system(style, design: .monospaced).monospacedDigit()
        }

        /// The canonical meta-number font: caption-sized mono + tabular.
        static let metaMono = mono(.caption)
    }
}

// MARK: - MetaText style

/// Secondary + monospaced-tabular styling for a row's numeric meta line
/// ("N 台设备在看 · 161×50"). Apply via `.dsMetaText()`.
struct MetaText: ViewModifier {
    func body(content: Content) -> some View {
        content
            .font(DS.Typography.metaMono)
            .foregroundStyle(DS.Palette.textSecondary)
    }
}

extension View {
    /// Style a meta/number line as secondary monospaced-tabular text.
    func dsMetaText() -> some View {
        modifier(MetaText())
    }
}
