import Elementary import Routes public struct PrimaryButton: HTML, Sendable { let label: String public init(label: String) { self.label = label } public var content: some HTML { button( .class(""" font-bold py-2 px-4 transition-colors bg-blue-500 enabled:hover:bg-blue-600 text-yellow-300 """) ) { label } } } public struct SecondaryButton: HTML, Sendable { let label: String public init(label: String) { self.label = label } public var content: some HTML { button( .class(""" font-bold py-2 px-4 transition-colors bg-yellow-300 enabled:hover:bg-yellow-400 text-blue-600 """) ) { label } } } public struct SubmitButton: HTML, Sendable { let label: String public init(label: String) { self.label = label } public var content: some HTML { button( .type(.submit), .class(""" w-full font-bold py-3 rounded-md transition-colors bg-yellow-300 dark:bg-blue-500 hover:bg-yellow-400 hover:dark:bg-blue-600 text-blue-500 dark:text-yellow-300 """) ) { label } } } public struct ResetButton: HTML, Sendable { let label: String public init(label: String = "Reset") { self.label = label } public var content: some HTML { button(.class(""" font-bold px-4 py-2 rounded-md transition-colors bg-blue-500 dark:bg-yellow-300 hover:bg-blue-600 hover:dark:bg-yellow-400 text-yellow-300 dark:text-blue-500 """)) { label } } } public struct Toggle: HTML { let isOn: Bool // Left hand side / 'on' label. let onLabel: String // Applied to the rhs when the toggle is consider 'off'. let onAttributes: [HTMLAttribute] // Right hand side / 'off' label. let offLabel: String // Applied to the left hand side when the toggle is consider 'on'. let offAttributes: [HTMLAttribute] public init( isOn: Bool, onLabel: String, onAttributes: [HTMLAttribute], offLabel: String, offAttributes: [HTMLAttribute] ) { self.isOn = isOn self.onLabel = onLabel self.onAttributes = onAttributes self.offLabel = offLabel self.offAttributes = offAttributes } public var content: some HTML { div(.class("flex items-center gap-x-0")) { switch isOn { case true: SecondaryButton(label: onLabel) .attributes(.class("rounded-s-lg"), .disabled) PrimaryButton(label: offLabel) .attributes(contentsOf: offAttributes + [.class("rounded-e-lg")]) case false: PrimaryButton(label: onLabel) .attributes(contentsOf: onAttributes + [.class("rounded-s-lg")]) SecondaryButton(label: offLabel) .attributes(.class("rounded-e-lg"), .disabled) } } } } public extension Array where Element == HTMLAttribute { static func hxDefaults( _ attributes: HTMLAttribute... ) -> Self { [ .hx.target("#content"), .hx.pushURL(true) ] + attributes } static func hxDefaults( get route: SiteRoute.View ) -> Self { .hxDefaults(.hx.get(route: route)) } }