import Elementary
public struct SVG: HTML, Sendable {
let color: String
let size: SVGSize
let svg: SVGType
public init(
_ svg: SVGType,
color: String,
size: SVGSize = .init()
) {
self.svg = svg
self.size = size
self.color = color
}
public init(
_ svg: SVGType,
color: Color.TextColor,
size: SVGSize = .init()
) {
self.svg = svg
self.size = size
self.color = color.color
}
public var content: some HTML {
div(.class("block \(color)")) {
svg.html(size)
}
}
}
public struct SVGSize: Sendable {
let width: Int
let height: Int
public init(width: Int = 24, height: Int? = nil) {
self.width = width
self.height = height ?? width
}
}
public enum SVGType: Sendable, CaseIterable {
case calculator
case checkCircle
case circleGauge
case droplets
case exclamation
case footprints
case funnel
case house
case leftRightArrow
case menu
case ruler
case scale
case thermometer
case thermometerSun
case wind
case zap
// swiftlint:disable cyclomatic_complexity
public func html(_ size: SVGSize) -> some HTML {
switch self {
case .calculator: return calculatorSvg(size: size)
case .checkCircle: return checkCircleSvg(size: size)
case .circleGauge: return circleGaugeSvg(size: size)
case .droplets: return dropletsSvg(size: size)
case .exclamation: return exclamationSvg(size: size)
case .footprints: return footprintsSvg(size: size)
case .funnel: return funnelSvg(size: size)
case .house: return houseSvg(size: size)
case .leftRightArrow: return leftRightArrowSvg(size: size)
case .menu: return menuSvg(size: size)
case .ruler: return rulerSvg(size: size)
case .scale: return scaleSvg(size: size)
case .thermometer: return thermometerSvg(size: size)
case .thermometerSun: return thermometerSunSvg(size: size)
case .wind: return windSvg(size: size)
case .zap: return zapSvg(size: size)
}
}
// swiftlint:enable cyclomatic_complexity
}
// MARK: - SVGs
// swiftlint:disable line_length
private func footprintsSvg(size: SVGSize) -> HTMLRaw {
HTMLRaw("""
""")
}
private func circleGaugeSvg(size: SVGSize) -> HTMLRaw {
HTMLRaw("""
""")
}
private func scaleSvg(size: SVGSize) -> HTMLRaw {
HTMLRaw("""
""")
}
private func checkCircleSvg(size: SVGSize) -> HTMLRaw {
HTMLRaw("""
""")
}
private func houseSvg(size: SVGSize) -> HTMLRaw {
HTMLRaw("""
""")
}
private func zapSvg(size: SVGSize) -> HTMLRaw {
HTMLRaw("""
""")
}
private func rulerSvg(size: SVGSize) -> HTMLRaw {
HTMLRaw("""
""")
}
private func leftRightArrowSvg(size: SVGSize) -> HTMLRaw {
HTMLRaw("""
""")
}
// TODO: Requires attribution:
// Vectors and icons by Laridae in CC Attribution License via SVG Repo
// FIX: This doesn't work, but does as a file
private func toolboxSvg(size: SVGSize) -> HTMLRaw {
HTMLRaw("""
""")
}
private func funnelSvg(size: SVGSize) -> HTMLRaw {
HTMLRaw("""
""")
}
private func dropletsSvg(size: SVGSize) -> HTMLRaw {
HTMLRaw("""
""")
}
private func thermometerSunSvg(size: SVGSize) -> HTMLRaw {
HTMLRaw("""
""")
}
private func exclamationSvg(size: SVGSize) -> HTMLRaw {
HTMLRaw("""
""")
}
private func windSvg(size: SVGSize) -> HTMLRaw {
return HTMLRaw("""
""")
}
private func calculatorSvg(size: SVGSize) -> HTMLRaw {
return HTMLRaw("""
""")
}
private func thermometerSvg(size: SVGSize) -> HTMLRaw {
HTMLRaw("""
""")
}
private func menuSvg(size: SVGSize) -> HTMLRaw {
HTMLRaw("""
""")
}
// swiftlint:enable line_length