import SwiftUI enum Tj { enum Palette { static let ink = Color(red: 0.165, green: 0.153, blue: 0.137) static let ink2 = Color(red: 0.286, green: 0.275, blue: 0.251) static let inkSoft = Color(red: 0.459, green: 0.447, blue: 0.424) static let sand = Color(red: 0.976, green: 0.969, blue: 0.949) static let sand2 = Color(red: 0.929, green: 0.918, blue: 0.886) static let sand3 = Color(red: 0.878, green: 0.859, blue: 0.816) static let paper = Color(red: 0.992, green: 0.988, blue: 0.973) static let line = Color(red: 0.875, green: 0.863, blue: 0.831) static let lineSoft = Color(red: 0.925, green: 0.918, blue: 0.890) static let text = Color(red: 0.149, green: 0.137, blue: 0.118) static let text2 = Color(red: 0.420, green: 0.408, blue: 0.384) static let text3 = Color(red: 0.616, green: 0.604, blue: 0.580) static let brick = Color(red: 0.886, green: 0.388, blue: 0.314) static let brickSoft = Color(red: 0.976, green: 0.863, blue: 0.824) static let amber = Color(red: 0.871, green: 0.627, blue: 0.314) static let leaf = Color(red: 0.180, green: 0.357, blue: 0.518) static let leafSoft = Color(red: 0.867, green: 0.910, blue: 0.941) static let darkBg = Color(red: 0.051, green: 0.063, blue: 0.059) } enum Radius { static let xs: CGFloat = 8 static let sm: CGFloat = 14 static let md: CGFloat = 20 static let lg: CGFloat = 28 static let xl: CGFloat = 36 static let pill: CGFloat = 999 } enum Shadow { static func card() -> some View { Color.clear } } } extension Font { static func tjTitle(_ size: CGFloat = 30) -> Font { .system(size: size, weight: .bold, design: .default) } static func tjH2(_ size: CGFloat = 18) -> Font { .system(size: size, weight: .bold, design: .default) } static func tjMono(_ size: CGFloat = 11) -> Font { .system(size: size, weight: .regular, design: .monospaced) } static func tjSerifBody(_ size: CGFloat = 17) -> Font { .system(size: size, weight: .regular, design: .default) } } extension View { func tjCard(bordered: Bool = false, radius: CGFloat = Tj.Radius.md) -> some View { self .background( RoundedRectangle(cornerRadius: radius, style: .continuous) .fill(Tj.Palette.paper) ) .overlay( RoundedRectangle(cornerRadius: radius, style: .continuous) .strokeBorder(Tj.Palette.lineSoft, lineWidth: bordered ? 1 : 0) ) .shadow(color: bordered ? .clear : Color(red: 0.196, green: 0.157, blue: 0.098).opacity(0.05), radius: 2, x: 0, y: 1) } }