Skip to content

Commit ad47e5e

Browse files
committed
Refactor DarkModeColor to use swift-css-standard sRGB conversions
- Add swift-css-standard dependency for CSS Color → sRGB conversion - Replace custom toSRGB() with standard IEC_61966.2.1.sRGB.init - Delete ~65 lines of duplicate color conversion code - Named color mapping now uses complete W3C Color Level 4 spec (147 colors) - LAB/LCH/Oklab/Oklch conversions now properly supported
1 parent 3894973 commit ad47e5e

25 files changed

Lines changed: 23 additions & 5977 deletions

Package.swift

Lines changed: 5 additions & 19 deletions
Original file line numberDiff line numberDiff line change
@@ -14,19 +14,16 @@ extension Target.Dependency {
1414
}
1515

1616
extension Target.Dependency {
17-
static var htmlStandard: Self { .product(name: "HTML Standard", package: "swift-html-standard") }
1817
static var htmlRendering: Self { .product(name: "HTML Rendering", package: "swift-html-rendering") }
1918
static var htmlRenderableTestSupport: Self { .product(name: "HTML Rendering TestSupport", package: "swift-html-rendering") }
2019
static var markdownHtmlRendering: Self { .product(name: "Markdown HTML Rendering", package: "swift-markdown-html-rendering") }
2120
static var css: Self { .product(name: "CSS", package: "swift-css") }
2221
static var cssTheming: Self { .product(name: "CSS Theming", package: "swift-css") }
23-
static var orderedCollections: Self { .product(name: "OrderedCollections", package: "swift-collections") }
2422
static var translating: Self { .product(name: "Translating", package: "swift-translating") }
2523
static var standards: Self { .product(name: "Standards", package: "swift-standards") }
2624
static var colorStandard: Self { .product(name: "Color Standard", package: "swift-color-standard") }
27-
static var incits4_1986: Self { .product(name: "INCITS 4 1986", package: "swift-incits-4-1986") }
25+
static var cssStandard: Self { .product(name: "CSS Standard", package: "swift-css-standard") }
2826
static var rfc4648: Self { .product(name: "RFC 4648", package: "swift-rfc-4648") }
29-
static var iso9899: Self { .product(name: "ISO 9899", package: "swift-iso-9899") }
3027
static var whatwgFormURLEncoded: Self { .product(name: "WHATWG Form URL Encoded", package: "swift-whatwg-url") }
3128
static var standardsTestSupport: Self { .product(name: "StandardsTestSupport", package: "swift-standards") }
3229
}
@@ -41,11 +38,7 @@ let package = Package(
4138
.macCatalyst(.v26)
4239
],
4340
products: [
44-
// Individual targets
4541
.library(name: .html, targets: [.html]),
46-
.library(name: .htmlComponents, targets: [.htmlComponents]),
47-
// Convenience product with common features
48-
.library(name: .htmlKit, targets: [.html, .htmlComponents])
4942
],
5043
traits: [
5144
.trait(
@@ -54,34 +47,28 @@ let package = Package(
5447
)
5548
],
5649
dependencies: [
57-
.package(url: "https://github.com/apple/swift-collections", from: "1.3.0"),
5850
.package(url: "https://github.com/coenttb/swift-html-rendering", from: "0.1.14"),
5951
.package(url: "https://github.com/coenttb/swift-markdown-html-rendering", from: "0.1.2"),
6052
.package(url: "https://github.com/coenttb/swift-css", from: "0.5.0"),
6153
.package(url: "https://github.com/coenttb/swift-svg", from: "0.3.0"),
6254
.package(url: "https://github.com/coenttb/swift-translating", from: "0.3.0"),
63-
.package(url: "https://github.com/swift-standards/swift-html-standard", from: "0.1.6"),
6455
.package(url: "https://github.com/swift-standards/swift-standards", from: "0.20.0"),
65-
.package(url: "https://github.com/swift-standards/swift-incits-4-1986", from: "0.7.1"),
6656
.package(url: "https://github.com/swift-standards/swift-rfc-4648", from: "0.6.0"),
67-
.package(url: "https://github.com/swift-standards/swift-iso-9899", from: "0.2.3"),
6857
.package(url: "https://github.com/swift-standards/swift-whatwg-url", from: "0.2.5"),
69-
.package(url: "https://github.com/swift-standards/swift-color-standard", from: "0.1.0")
58+
.package(url: "https://github.com/swift-standards/swift-color-standard", from: "0.1.0"),
59+
.package(url: "https://github.com/swift-standards/swift-css-standard", from: "0.1.7")
7060
],
7161
targets: [
7262
.target(
7363
name: .html,
7464
dependencies: [
7565
.htmlRendering,
7666
.css,
67+
.cssStandard,
7768
.markdownHtmlRendering,
78-
.htmlStandard,
79-
.orderedCollections,
8069
.standards,
8170
.colorStandard,
82-
.incits4_1986,
8371
.rfc4648,
84-
.iso9899,
8572
.whatwgFormURLEncoded,
8673
.product(name: "SVG", package: "swift-svg"),
8774
.product(
@@ -99,8 +86,7 @@ let package = Package(
9986
dependencies: [
10087
.html,
10188
.markdownHtmlRendering,
102-
.cssTheming,
103-
.orderedCollections
89+
.cssTheming
10490
]
10591
),
10692
.testTarget(
File renamed without changes.
File renamed without changes.

Sources/HTML/HTML Enhancements/HTMLColor.swift renamed to Sources/HTML/DarkModeColor.swift

Lines changed: 18 additions & 77 deletions
Original file line numberDiff line numberDiff line change
@@ -5,11 +5,18 @@
55
// Created by Coen ten Thije Boonkkamp on 17/09/2024.
66
//
77

8-
import Color_Standard
8+
import CSS
9+
import CSS_Standard
10+
11+
/// Backward-compatible typealias for DarkModeColor.
12+
/// HTMLColor was the previous name, now unified as DarkModeColor in CSS module.
13+
@available(*, deprecated, renamed: "DarkModeColor")
14+
public typealias HTMLColor = DarkModeColor
15+
916

1017
// MARK: - Text Color Definitions
1118

12-
// extension HTMLColor {
19+
// extension DarkModeColor {
1320
// public static let buttonText: Self = .primary.reverse()
1421
// public static let primary: Self = .black.withDarkColor(.white)
1522
// public static let text: Self = primary
@@ -19,12 +26,12 @@ import Color_Standard
1926

2027
// MARK: - Background Color Definitions
2128
//
22-
// extension HTMLColor {
29+
// extension DarkModeColor {
2330
// public static let offBackground: Self = .offWhite.withDarkColor(.offBlack)
2431
// public static let background: Self = .white.withDarkColor(.black)
2532
// }
2633

27-
// MARK: - HTMLColor Extensions
34+
// MARK: - DarkModeColor Extensions
2835

2936
extension DarkModeColor {
3037
private typealias sRGB = IEC_61966.`2`.`1`.sRGB
@@ -38,7 +45,7 @@ extension DarkModeColor {
3845
_ c1: CSS_Standard.Color.Value,
3946
_ c2: CSS_Standard.Color.Value
4047
) -> CSS_Standard.Color.Value? {
41-
guard let srgb1 = toSRGB(c1), let srgb2 = toSRGB(c2) else { return nil }
48+
guard let srgb1 = sRGB(c1), let srgb2 = sRGB(c2) else { return nil }
4249

4350
let midR = (srgb1.r255 + srgb2.r255) / 2
4451
let midG = (srgb1.g255 + srgb2.g255) / 2
@@ -55,7 +62,7 @@ extension DarkModeColor {
5562
}
5663

5764
public static func readablePrimaryColor(on backgroundColor: DarkModeColor) -> Self {
58-
guard let srgb = toSRGB(backgroundColor.light) else {
65+
guard let srgb = sRGB(backgroundColor.light) else {
5966
return .init(.hex("000000"))
6067
}
6168
// Perceived brightness using ITU-R BT.601 coefficients
@@ -71,8 +78,8 @@ extension DarkModeColor {
7178
extension HTML.View {
7279
/// Applies a gradient background to the HTML element
7380
public func gradient(
74-
bottom: HTMLColor,
75-
top: HTMLColor
81+
bottom: DarkModeColor,
82+
top: DarkModeColor
7683
) -> some HTML.View {
7784
self
7885
.css
@@ -89,9 +96,9 @@ extension HTML.View {
8996
}
9097

9198
public func gradient(
92-
bottom: HTMLColor,
93-
middle: HTMLColor,
94-
top: HTMLColor
99+
bottom: DarkModeColor,
100+
middle: DarkModeColor,
101+
top: DarkModeColor
95102
) -> some HTML.View {
96103
self
97104
.css
@@ -107,69 +114,3 @@ extension HTML.View {
107114
}
108115
}
109116
}
110-
111-
// MARK: - Private Helper Functions
112-
113-
extension DarkModeColor {
114-
fileprivate static func toSRGB(_ color: CSS_Standard.Color.Value) -> IEC_61966.`2`.`1`.sRGB? {
115-
typealias sRGB = IEC_61966.`2`.`1`.sRGB
116-
117-
switch color {
118-
case .named(let namedColor):
119-
return namedColor.toSRGB()
120-
case .hex(let hexColor):
121-
return sRGB(hex: hexColor.value)
122-
case .rgb(let r, let g, let b):
123-
return sRGB(r255: r, g255: g, b255: b)
124-
case .rgba(let r, let g, let b, _):
125-
return sRGB(r255: r, g255: g, b255: b)
126-
case .hsl(let h, let s, let l):
127-
return sRGB(h: h.normalizedDegrees(), s: s / 100, l: l / 100)
128-
case .hsla(let h, let s, let l, _):
129-
return sRGB(h: h.normalizedDegrees(), s: s / 100, l: l / 100)
130-
case .hwb(let h, let w, let b):
131-
return sRGB(hue: h.normalizedDegrees(), whiteness: w / 100, blackness: b / 100)
132-
case .lab(let l, let a, let b):
133-
return Color.LAB(l: l, a: a, b: b).converted(to: sRGB.self)
134-
case .lch(let l, let c, let h):
135-
return Color.LCH(l: l, c: c, h: h).converted(to: sRGB.self)
136-
case .oklab(let l, let a, let b):
137-
return Color.Oklab(l: l, a: a, b: b).converted(to: sRGB.self)
138-
case .oklch(let l, let c, let h):
139-
return Color.Oklch(l: l, c: c, h: h).converted(to: sRGB.self)
140-
default:
141-
return nil
142-
}
143-
}
144-
}
145-
146-
// MARK: - Named Color sRGB Mapping
147-
148-
extension W3C_CSS_Values.NamedColor {
149-
/// Maps CSS named colors to sRGB values
150-
fileprivate func toSRGB() -> IEC_61966.`2`.`1`.sRGB? {
151-
typealias sRGB = IEC_61966.`2`.`1`.sRGB
152-
153-
switch self {
154-
case .black: return .black
155-
case .white: return .white
156-
case .red: return .red
157-
case .green: return sRGB(r255: 0, g255: 128, b255: 0)
158-
case .lime: return sRGB(r255: 0, g255: 255, b255: 0)
159-
case .blue: return .blue
160-
case .yellow: return sRGB(r255: 255, g255: 255, b255: 0)
161-
case .cyan: return sRGB(r255: 0, g255: 255, b255: 255)
162-
case .magenta: return sRGB(r255: 255, g255: 0, b255: 255)
163-
case .silver: return sRGB(r255: 192, g255: 192, b255: 192)
164-
case .gray: return sRGB(r255: 128, g255: 128, b255: 128)
165-
case .maroon: return sRGB(r255: 128, g255: 0, b255: 0)
166-
case .purple: return sRGB(r255: 128, g255: 0, b255: 128)
167-
case .fuchsia: return sRGB(r255: 255, g255: 0, b255: 255)
168-
case .olive: return sRGB(r255: 128, g255: 128, b255: 0)
169-
case .navy: return sRGB(r255: 0, g255: 0, b255: 128)
170-
case .teal: return sRGB(r255: 0, g255: 128, b255: 128)
171-
case .aqua: return sRGB(r255: 0, g255: 255, b255: 255)
172-
default: return nil
173-
}
174-
}
175-
}

0 commit comments

Comments
 (0)