Files
openclaw/apps/shared/OpenClawKit/Sources/OpenClawChatUI/ChatTypography.swift
2026-07-03 18:45:45 -05:00

99 lines
3.2 KiB
Swift

import Foundation
import SwiftUI
#if os(macOS)
import AppKit
#endif
enum OpenClawChatTypography {
static var title3: Font {
display(size: 22, weight: .bold, relativeTo: .title2)
}
static var title3SemiBold: Font {
display(size: 22, weight: .semibold, relativeTo: .title2)
}
static var headline: Font {
display(size: 17, weight: .semibold, relativeTo: .headline)
}
static var callout: Font {
body(size: 16, weight: .regular, relativeTo: .callout)
}
static var body: Font {
body(size: 17, weight: .regular, relativeTo: .body)
}
static var footnote: Font {
body(size: 13, weight: .regular, relativeTo: .footnote)
}
static var footnoteSemiBold: Font {
body(size: 13, weight: .semibold, relativeTo: .footnote)
}
static var caption: Font {
body(size: 12, weight: .regular, relativeTo: .caption)
}
static var captionSemiBold: Font {
body(size: 12, weight: .semibold, relativeTo: .caption)
}
static var caption2: Font {
body(size: 11, weight: .regular, relativeTo: .caption2)
}
static func avatar(size: CGFloat) -> Font {
self.body(size: size, weight: .bold, relativeTo: .caption)
}
static func body(size: CGFloat, weight: Font.Weight, relativeTo textStyle: Font.TextStyle) -> Font {
#if os(iOS)
Font.custom(self.bodyPostScriptName, size: size, relativeTo: textStyle).weight(weight)
#elseif os(macOS)
Font.custom(self.macSystemFontName(size: size), size: size, relativeTo: textStyle).weight(weight)
#else
Font.system(size: size, weight: weight)
#endif
}
static func display(size: CGFloat, weight: Font.Weight, relativeTo textStyle: Font.TextStyle) -> Font {
#if os(iOS)
Font.custom(self.displayPostScriptName, size: size, relativeTo: textStyle).weight(weight)
#elseif os(macOS)
Font.custom(self.macSystemFontName(size: size), size: size, relativeTo: textStyle).weight(weight)
#else
Font.system(size: size, weight: weight)
#endif
}
static func mono(size: CGFloat, weight: Font.Weight = .regular, relativeTo textStyle: Font.TextStyle) -> Font {
#if os(iOS)
let name = weight == .semibold ? Self.monoSemiBoldPostScriptName : Self.monoPostScriptName
return Font.custom(name, size: size, relativeTo: textStyle)
#elseif os(macOS)
return Font.custom(self.macMonospacedSystemFontName(size: size), size: size, relativeTo: textStyle)
.weight(weight)
#else
return Font.system(size: size, weight: weight, design: .monospaced)
#endif
}
private static let displayPostScriptName = "RedHatDisplay-Regular"
private static let bodyPostScriptName = "Inter-Regular"
private static let monoPostScriptName = "JetBrainsMono-Regular"
private static let monoSemiBoldPostScriptName = "JetBrainsMono-SemiBold"
#if os(macOS)
private static func macSystemFontName(size: CGFloat) -> String {
NSFont.systemFont(ofSize: size).fontName
}
private static func macMonospacedSystemFontName(size: CGFloat) -> String {
NSFont.monospacedSystemFont(ofSize: size, weight: .regular).fontName
}
#endif
}