// // Typogprahy+Styles.swift // VDS // // Created by Matt Bruce on 7/21/23. // import Foundation import UIKit import VDSCoreTokens //MARK: Definitions extension TextStyle { // Static properties for different text styles public static let boldFeatureXLarge = TextStyle(rawValue: "boldFeatureXLarge", fontFace: .edsBold, pointSize: UIDevice.isIPad ? VDSTypography.fontSizeFeature144 : VDSTypography.fontSizeFeature96, lineHeight: UIDevice.isIPad ? VDSTypography.lineHeightFeature136 : VDSTypography.lineHeightFeature88, edgeInsets: .bottom(UIDevice.isIPad ? -6: -4)) public static let featureXLarge = TextStyle(rawValue: "featureXLarge", fontFace: .dsLight, pointSize: UIDevice.isIPad ? VDSTypography.fontSizeFeature144 : VDSTypography.fontSizeFeature96, lineHeight: UIDevice.isIPad ? VDSTypography.lineHeightFeature136 : VDSTypography.lineHeightFeature88, letterSpacing: VDSTypography.letterSpacingSemiwide, edgeInsets: .bottom(UIDevice.isIPad ? -6: -4)) public static let boldFeatureLarge = TextStyle(rawValue: "boldFeatureLarge", fontFace: .edsBold, pointSize: UIDevice.isIPad ? VDSTypography.fontSizeFeature128 : VDSTypography.fontSizeFeature80, lineHeight: UIDevice.isIPad ? VDSTypography.lineHeightFeature120 : VDSTypography.lineHeightFeature76, edgeInsets: .bottom(UIDevice.isIPad ? -6: -2)) public static let featureLarge = TextStyle(rawValue: "featureLarge", fontFace: .dsLight, pointSize: UIDevice.isIPad ? VDSTypography.fontSizeFeature128 : VDSTypography.fontSizeFeature80, lineHeight: UIDevice.isIPad ? VDSTypography.lineHeightFeature120 : VDSTypography.lineHeightFeature76, letterSpacing: VDSTypography.letterSpacingSemiwide, edgeInsets: .bottom(UIDevice.isIPad ? -6: -2)) public static let boldFeatureMedium = TextStyle(rawValue: "boldFeatureMedium", fontFace: .edsBold, pointSize: UIDevice.isIPad ? VDSTypography.fontSizeFeature96 : VDSTypography.fontSizeFeature64, lineHeight: UIDevice.isIPad ? VDSTypography.lineHeightFeature88 : VDSTypography.lineHeightFeature64, edgeInsets: .bottom(UIDevice.isIPad ? -4: -2)) public static let featureMedium = TextStyle(rawValue: "featureMedium", fontFace: .dsLight, pointSize: UIDevice.isIPad ? VDSTypography.fontSizeFeature96 : VDSTypography.fontSizeFeature64, lineHeight: UIDevice.isIPad ? VDSTypography.lineHeightFeature88 : VDSTypography.lineHeightFeature64, letterSpacing: VDSTypography.letterSpacingSemiwide, edgeInsets: .bottom(UIDevice.isIPad ? -4: -2)) public static let boldFeatureSmall = TextStyle(rawValue: "boldFeatureSmall", fontFace: .edsBold, pointSize: UIDevice.isIPad ? VDSTypography.fontSizeFeature80 : VDSTypography.fontSizeFeature48, lineHeight: UIDevice.isIPad ? VDSTypography.lineHeightFeature76 : VDSTypography.lineHeightFeature48, edgeInsets: .bottom(UIDevice.isIPad ? -2: 0)) public static let featureSmall = TextStyle(rawValue: "featureSmall", fontFace: .dsLight, pointSize: UIDevice.isIPad ? VDSTypography.fontSizeFeature80 : VDSTypography.fontSizeFeature48, lineHeight: UIDevice.isIPad ? VDSTypography.lineHeightFeature76 : VDSTypography.lineHeightFeature48, letterSpacing: VDSTypography.letterSpacingSemiwide, edgeInsets: .bottom(UIDevice.isIPad ? -2: 0)) public static let boldFeatureXSmall = TextStyle(rawValue: "boldFeatureXSmall", fontFace: .edsBold, pointSize: UIDevice.isIPad ? VDSTypography.fontSizeFeature64 : VDSTypography.fontSizeFeature40, lineHeight: UIDevice.isIPad ? VDSTypography.lineHeightFeature64 : VDSTypography.lineHeightFeature40, edgeInsets: .bottom(UIDevice.isIPad ? -2: 0)) public static let featureXSmall = TextStyle(rawValue: "featureXSmall", fontFace: .dsLight, pointSize: UIDevice.isIPad ? VDSTypography.fontSizeFeature64 : VDSTypography.fontSizeFeature40, lineHeight: UIDevice.isIPad ? VDSTypography.lineHeightFeature64 : VDSTypography.lineHeightFeature40, letterSpacing: VDSTypography.letterSpacingSemiwide, edgeInsets: .bottom(UIDevice.isIPad ? -2: 0)) public static let boldTitle2XLarge = TextStyle(rawValue: "boldTitle2XLarge", fontFace: .edsBold, pointSize: UIDevice.isIPad ? VDSTypography.fontSizeTitle64 : VDSTypography.fontSizeTitle40, lineHeight: UIDevice.isIPad ? VDSTypography.lineHeightTitle64 : VDSTypography.lineHeightTitle40, edgeInsets: .bottom(UIDevice.isIPad ? -2: 0)) public static let title2XLarge = TextStyle(rawValue: "title2XLarge", fontFace: .dsLight, pointSize: UIDevice.isIPad ? VDSTypography.fontSizeTitle64 : VDSTypography.fontSizeTitle40, lineHeight: UIDevice.isIPad ? VDSTypography.lineHeightTitle64 : VDSTypography.lineHeightTitle40, letterSpacing: VDSTypography.letterSpacingSemiwide, edgeInsets: .bottom(UIDevice.isIPad ? -2: 0)) public static let boldTitleXLarge = TextStyle(rawValue: "boldTitleXLarge", fontFace: .edsBold, pointSize: UIDevice.isIPad ? VDSTypography.fontSizeTitle48 : VDSTypography.fontSizeTitle32, lineHeight: UIDevice.isIPad ? VDSTypography.lineHeightTitle48 : VDSTypography.lineHeightTitle36) public static let titleXLarge = TextStyle(rawValue: "titleXLarge", fontFace: .dsLight, pointSize: UIDevice.isIPad ? VDSTypography.fontSizeTitle48 : VDSTypography.fontSizeTitle32, lineHeight: UIDevice.isIPad ? VDSTypography.lineHeightTitle48 : VDSTypography.lineHeightTitle36, letterSpacing: VDSTypography.letterSpacingSemiwide) public static let boldTitleLarge = TextStyle(rawValue: "boldTitleLarge", fontFace: .edsBold, pointSize: UIDevice.isIPad ? VDSTypography.fontSizeTitle32 : VDSTypography.fontSizeTitle24, lineHeight: UIDevice.isIPad ? VDSTypography.lineHeightTitle36 : VDSTypography.lineHeightTitle28) public static let titleLarge = TextStyle(rawValue: "titleLarge", fontFace: UIDevice.isIPad ? .dsLight : .edsRegular, pointSize: UIDevice.isIPad ? VDSTypography.fontSizeTitle32 : VDSTypography.fontSizeTitle24, lineHeight: UIDevice.isIPad ? VDSTypography.lineHeightTitle36 : VDSTypography.lineHeightTitle28, letterSpacing: UIDevice.isIPad ? VDSTypography.letterSpacingSemiwide : 0) public static let boldTitleMedium = TextStyle(rawValue: "boldTitleMedium", fontFace: .edsBold, pointSize: UIDevice.isIPad ? VDSTypography.fontSizeTitle24 : VDSTypography.fontSizeTitle20, lineHeight: UIDevice.isIPad ? VDSTypography.lineHeightTitle28 : VDSTypography.lineHeightTitle24) public static let titleMedium = TextStyle(rawValue: "titleMedium", fontFace: .edsRegular, pointSize: UIDevice.isIPad ? VDSTypography.fontSizeTitle24 : VDSTypography.fontSizeTitle20, lineHeight: UIDevice.isIPad ? VDSTypography.lineHeightTitle28 : VDSTypography.lineHeightTitle24) public static let boldTitleSmall = TextStyle(rawValue: "boldTitleSmall", fontFace: .edsBold, pointSize: UIDevice.isIPad ? VDSTypography.fontSizeTitle20 : VDSTypography.fontSizeTitle16, lineHeight: UIDevice.isIPad ? VDSTypography.lineHeightTitle24 : VDSTypography.lineHeightTitle20) public static let titleSmall = TextStyle(rawValue: "titleSmall", fontFace: .edsRegular, pointSize: UIDevice.isIPad ? VDSTypography.fontSizeTitle20 : VDSTypography.fontSizeTitle16, lineHeight: UIDevice.isIPad ? VDSTypography.lineHeightTitle24 : VDSTypography.lineHeightTitle20) public static let boldBodyLarge = TextStyle(rawValue: "boldBodyLarge", fontFace: .edsBold, pointSize: VDSTypography.fontSizeBody16, lineHeight: VDSTypography.lineHeightBody20, letterSpacing: VDSTypography.letterSpacingWide) public static let bodyLarge = TextStyle(rawValue: "bodyLarge", fontFace: .edsRegular, pointSize: VDSTypography.fontSizeBody16, lineHeight: VDSTypography.lineHeightBody20, letterSpacing:VDSTypography.letterSpacingWide) public static let boldBodyMedium = TextStyle(rawValue: "boldBodyMedium", fontFace: .edsBold, pointSize: VDSTypography.fontSizeBody14, lineHeight: VDSTypography.lineHeightBody18, letterSpacing: VDSTypography.letterSpacingWide) public static let bodyMedium = TextStyle(rawValue: "bodyMedium", fontFace: .edsRegular, pointSize: VDSTypography.fontSizeBody14, lineHeight: VDSTypography.lineHeightBody18, letterSpacing: VDSTypography.letterSpacingWide) public static let boldBodySmall = TextStyle(rawValue: "boldBodySmall", fontFace: .etxBold, pointSize: VDSTypography.fontSizeBody12, lineHeight: VDSTypography.lineHeightBody16) public static let bodySmall = TextStyle(rawValue: "bodySmall", fontFace: .etxRegular, pointSize: VDSTypography.fontSizeBody12, lineHeight: VDSTypography.lineHeightBody16) public static let boldMicro = TextStyle(rawValue: "boldMicro", fontFace: .etxBold, pointSize: VDSTypography.fontSizeMicro11, lineHeight: VDSTypography.lineHeightMicro16) public static let micro = TextStyle(rawValue: "micro", fontFace: .etxRegular, pointSize: VDSTypography.fontSizeMicro11, lineHeight: VDSTypography.lineHeightMicro16) public static var allCases: [TextStyle] { return [ featureXLarge, boldFeatureXLarge, featureLarge, boldFeatureLarge, featureMedium, boldFeatureMedium, featureSmall, boldFeatureSmall, featureXSmall, boldFeatureXSmall, title2XLarge, boldTitle2XLarge, titleXLarge, boldTitleXLarge, titleLarge, boldTitleLarge, titleMedium, boldTitleMedium, titleSmall, boldTitleSmall, bodyLarge, boldBodyLarge, bodyMedium, boldBodyMedium, bodySmall, boldBodySmall, micro, boldMicro ] } public static func convert(font: UIFont) -> TextStyle { guard let found = allCases.first(where: { font.fontName == $0.fontFace.fontName && font.pointSize == $0.pointSize} ) else { return TextStyle(rawValue: "Custom\(font.fontName)", fontFace: .custom(font), pointSize: font.pointSize) } return found } } extension TextStyle { /// Enum used to describe the naming convention for the Typography. public enum StandardStyle: String, CaseIterable { case featureXLarge, featureLarge, featureMedium, featureSmall, featureXSmall, title2XLarge, titleXLarge, titleLarge, titleMedium, titleSmall, bodyLarge, bodyMedium, bodySmall, micro /// The bold version for this Standard Style. public var bold: TextStyle { return TextStyle(rawValue: "bold\(rawValue.prefix(1).uppercased())\(rawValue.dropFirst())")! } /// The regular version for this Standard Style. public var regular: TextStyle { TextStyle(rawValue: rawValue)! } } /// The converting a TextStyle to a StandardStyle. public func toStandardStyle() -> StandardStyle { var rawName = rawValue if rawName.hasPrefix("bold") { let updatedRaw = rawName.replacingOccurrences(of: "bold", with: "") rawName = updatedRaw.prefix(1).lowercased() + updatedRaw.dropFirst() } return StandardStyle(rawValue: rawName)! } }