@@ -137,87 +137,80 @@ extension HTML where Tag: HTMLTrait.Attributes.Global {
137137 }
138138}
139139
140- struct StyleSheetGenerator : Sendable {
141- private struct Storage {
142- var styles = OrderedSet < InlineStyle > ( )
143- var rulesets = OrderedDictionary < InlineStyle . MediaQuery ? , OrderedDictionary < String , String > > ( )
144- var render : _SendableAnyHTMLBox ?
145- var rendered : String ?
146- }
140+ struct StyleSheetGenerator : Sendable , DependencyKey {
141+ let generateClassName : @Sendable ( InlineStyle ) -> String
142+ let renderStyleSheet : @Sendable ( ) -> String
143+ let addElements : @Sendable ( @Sendable ( ) -> any HTML ) -> Void
144+ let renderedElements : @Sendable ( ) -> String
145+
146+ static var liveValue : StyleSheetGenerator {
147+ struct Storage {
148+ var styles = OrderedSet < InlineStyle > ( )
149+ var rulesets = OrderedDictionary < InlineStyle . MediaQuery ? , OrderedDictionary < String , String > > ( )
150+ var render : _SendableAnyHTMLBox ?
151+ var rendered : String ?
152+ }
147153
148- private let storage = LockIsolated ( Storage ( ) )
154+ let storage = LockIsolated ( Storage ( ) )
149155
150- @Sendable
151- fileprivate func generateClassName( _ style: InlineStyle ) -> String {
152- self . storage. withValue { `self` in
153- let index = self . styles. firstIndex ( of: style) ?? self . styles. append ( style) . index
154- #if DEBUG
155- let className = " \( style. property) - \( index) "
156- #else
157- let className = " c \( index) "
158- #endif
156+ return StyleSheetGenerator { style in
157+ storage. withValue { `self` in
158+ let index = self . styles. firstIndex ( of: style) ?? self . styles. append ( style) . index
159+ #if DEBUG
160+ let className = " \( style. property) - \( index) "
161+ #else
162+ let className = " c \( index) "
163+ #endif
159164
160- let selector = " \( style. pre. flatMap { $0 + " " } ?? " " ) . \( className) \( style. pseudo? . rawValue ?? " " ) \( style. post. flatMap { " " + $0 } ?? " " ) "
165+ let selector = " \( style. pre. flatMap { $0 + " " } ?? " " ) . \( className) \( style. pseudo? . rawValue ?? " " ) \( style. post. flatMap { " " + $0 } ?? " " ) "
161166
162- if self . rulesets [ style. media, default: [ : ] ] [ selector] == nil {
163- self . rulesets [ style. media, default: [ : ] ] [ selector] = " \( style. property) : \( style. value) ; "
164- }
167+ if self . rulesets [ style. media, default: [ : ] ] [ selector] == nil {
168+ self . rulesets [ style. media, default: [ : ] ] [ selector] = " \( style. property) : \( style. value) ; "
169+ }
165170
166- return className
167- }
168- }
171+ return className
172+ }
173+ } renderStyleSheet: {
174+ guard let rendered = storage. render? . tryTake ( ) ? . render ( ) else {
175+ return " "
176+ }
169177
170- @Sendable
171- func renderStyleSheet( ) -> String {
172- guard let rendered = storage. render? . tryTake ( ) ? . render ( ) else {
173- return " "
174- }
178+ storage. withValue { $0. rendered = rendered }
175179
176- self . storage. withValue { $0. rendered = rendered }
180+ var sheet = " "
181+ for (mediaQuery, styles) in storage. rulesets. sorted ( by: { $0. key == nil ? $1. key != nil : false } ) {
182+ if let mediaQuery {
183+ sheet. append ( " @media \( mediaQuery. rawValue) { " )
184+ }
177185
178- var sheet = " "
179- for (mediaQuery , styles ) in storage . rulesets . sorted ( by : { $0 . key == nil ? $1 . key != nil : false } ) {
180- if let mediaQuery {
181- sheet . append ( " @media \( mediaQuery . rawValue ) { " )
182- }
186+ defer {
187+ if mediaQuery != nil {
188+ sheet . append ( " } " )
189+ }
190+ }
183191
184- defer {
185- if mediaQuery != nil {
186- sheet . append ( " } " )
192+ for (className , style ) in styles {
193+ sheet . append ( " \( className ) { \( style ) } " )
194+ }
187195 }
196+ return sheet
197+ } addElements: { html in
198+ storage. withValue { `self` in
199+ self . render = _SendableAnyHTMLBox ( html ( ) )
188200 }
189-
190- for (className, style) in styles {
191- sheet. append ( " \( className) { \( style) } " )
192- }
193- }
194- return sheet
195- }
196-
197- func addElements( @HTMLBuilder _ html: @Sendable ( ) -> some HTML ) {
198- self . storage. withValue { `self` in
199- self . render = _SendableAnyHTMLBox ( html ( ) )
200- }
201- }
202-
203- func renderedElements( ) -> String {
204- self . storage. withValue { `self` in
205- self . rendered ?? " "
201+ } renderedElements: {
202+ storage. rendered ?? " "
206203 }
207204 }
208205}
209206
210207extension DependencyValues {
211208 var styleSheetGenerator : StyleSheetGenerator {
212- get { self [ StyleSheetGeneratorKey . self] }
213- set { self [ StyleSheetGeneratorKey . self] = newValue }
209+ get { self [ StyleSheetGenerator . self] }
210+ set { self [ StyleSheetGenerator . self] = newValue }
214211 }
215212}
216213
217- private enum StyleSheetGeneratorKey : DependencyKey {
218- static var liveValue : StyleSheetGenerator { StyleSheetGenerator ( ) }
219- }
220-
221214struct InlineStyle : Sendable , Hashable {
222215 let property : String
223216 let value : String
0 commit comments