124 lines
5.3 KiB
Swift
124 lines
5.3 KiB
Swift
//
|
|
// Typogprahy+Styles.swift
|
|
// VDS
|
|
//
|
|
// Created by Matt Bruce on 7/21/23.
|
|
//
|
|
|
|
import Foundation
|
|
import UIKit
|
|
import VDSCoreTokens
|
|
|
|
//MARK: Definitions
|
|
extension TextStyle {
|
|
internal enum Style: String, CaseIterable {
|
|
case boldFeatureXLarge
|
|
case featureXLarge
|
|
case boldFeatureLarge
|
|
case featureLarge
|
|
case boldFeatureMedium
|
|
case featureMedium
|
|
case boldFeatureSmall
|
|
case featureSmall
|
|
case boldFeatureXSmall
|
|
case featureXSmall
|
|
case boldTitle2XLarge
|
|
case title2XLarge
|
|
case boldTitleXLarge
|
|
case titleXLarge
|
|
case boldTitleLarge
|
|
case titleLarge
|
|
case boldTitleMedium
|
|
case titleMedium
|
|
case boldTitleSmall
|
|
case titleSmall
|
|
case boldBodyLarge
|
|
case bodyLarge
|
|
case boldBodyMedium
|
|
case bodyMedium
|
|
case boldBodySmall
|
|
case bodySmall
|
|
case boldMicro
|
|
case micro
|
|
}
|
|
|
|
// Static properties for different text styles
|
|
public static var boldFeatureXLarge: TextStyle { Provider.style(for: .boldFeatureXLarge) }
|
|
public static var featureXLarge: TextStyle { Provider.style(for: .featureXLarge) }
|
|
public static var boldFeatureLarge: TextStyle { Provider.style(for: .boldFeatureLarge) }
|
|
public static var featureLarge: TextStyle { Provider.style(for: .featureLarge) }
|
|
public static var boldFeatureMedium: TextStyle { Provider.style(for: .boldFeatureMedium) }
|
|
public static var featureMedium: TextStyle { Provider.style(for: .featureMedium) }
|
|
public static var boldFeatureSmall: TextStyle { Provider.style(for: .boldFeatureSmall) }
|
|
public static var featureSmall: TextStyle { Provider.style(for: .featureSmall) }
|
|
public static var boldFeatureXSmall: TextStyle { Provider.style(for: .boldFeatureXSmall) }
|
|
public static var featureXSmall: TextStyle { Provider.style(for: .featureXSmall) }
|
|
public static var boldTitle2XLarge: TextStyle { Provider.style(for: .boldTitle2XLarge) }
|
|
public static var title2XLarge: TextStyle { Provider.style(for: .title2XLarge) }
|
|
public static var boldTitleXLarge: TextStyle { Provider.style(for: .boldTitleXLarge) }
|
|
public static var titleXLarge: TextStyle { Provider.style(for: .titleXLarge) }
|
|
public static var boldTitleLarge: TextStyle { Provider.style(for: .boldTitleLarge) }
|
|
public static var titleLarge: TextStyle { Provider.style(for: .titleLarge) }
|
|
public static var boldTitleMedium: TextStyle { Provider.style(for: .boldTitleMedium) }
|
|
public static var titleMedium: TextStyle { Provider.style(for: .titleMedium) }
|
|
public static var boldTitleSmall: TextStyle { Provider.style(for: .boldTitleSmall) }
|
|
public static var titleSmall: TextStyle { Provider.style(for: .titleSmall) }
|
|
public static var boldBodyLarge: TextStyle { Provider.style(for: .boldBodyLarge) }
|
|
public static var bodyLarge: TextStyle { Provider.style(for: .bodyLarge) }
|
|
public static var boldBodyMedium: TextStyle { Provider.style(for: .boldBodyMedium) }
|
|
public static var bodyMedium: TextStyle { Provider.style(for: .bodyMedium) }
|
|
public static var boldBodySmall: TextStyle { Provider.style(for: .boldBodySmall) }
|
|
public static var bodySmall: TextStyle { Provider.style(for: .bodySmall) }
|
|
public static var boldMicro: TextStyle { Provider.style(for: .boldMicro) }
|
|
public static var micro: TextStyle { Provider.style(for: .micro) }
|
|
|
|
public static var allCases: [TextStyle] { Style.allCases.compactMap { Provider.style(for: $0) } }
|
|
|
|
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, lineHeight: min(font.lineHeight, 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)!
|
|
}
|
|
}
|