import Elementary import Styleguide struct MainPage: SendableHTMLDocument where Inner: Sendable { let title = "HVAC-Toolbox" let lang = "en-US" let inner: @Sendable () -> Inner var head: some HTML { meta(.charset(.utf8)) meta(.name("viewport"), .content("width=device-width, initial-scale=1.0")) link(.rel(.stylesheet), .href("/output.css")) link( .rel(.icon), .href("/favicon-32x32.png"), .init(name: "type", value: "image/png"), .init(name: "sizes", value: "32x32") ) link( .rel(.icon), .href("/favicon-16x16.png"), .init(name: "type", value: "image/png"), .init(name: "sizes", value: "16x16") ) link( .rel(.init(rawValue: "apple-touch-icon")), .href("/apple-touch-icon.png"), .init(name: "sizes", value: "180x180") ) link(.rel(.init(rawValue: "mainifest")), .href("/site.webmanifest")) } var body: some HTML { main(.class("bg-slate-100 dark:bg-gray-800")) { div(.class("min-h-screen")) { Header() PageContent(body: inner) } } } } private struct Header: HTML { var content: some HTML { header(.class("\(bg: .blue) mb-8 flex flex-row gap-2 border \(border: .yellow)")) { a( .href(route: .index), .class("group flex flex-row gap-2 \(bg: .yellow) pe-2 rounded-e-lg \(text: .blue) hover:text-blue-600") ) { img(.src("/images/toolbox.svg"), .width(40), .height(40), .class("py-1")) div(.class("flex flex-row mt-2")) { h2(.class("text-2xl font-extrabold pe-3")) { "HVAC-Toolbox" } SVG(.wind, color: .blue) .attributes(.class("group-hover:text-blue-600")) } } nav(.class("flex flex-row gap-2 p-2 mt-2")) { // TODO: Add class active, to button that is the active route. ul(.class("flex flex-wrap gap-x-2 lg:gap-x-5 \(text: .yellow) font-bold")) { li { a(.href(route: .moldRisk(.index)), .class("hover:border-b \(border: .yellow)")) { "Mold-Risk" } } li { a(.href("#"), .class("[&:hover]:border-b \(border: .yellow)")) { "Dehumidifier-Sizing" } } } } } } } private struct PageContent: HTML where Body: Sendable { let body: () -> Body var content: some HTML { div(.class("mx-5 lg:mx-20")) { div(.class("rounded-xl shadow-lg bg-white dark:bg-slate-700 p-8")) { body() } } } } protocol SendableHTMLDocument: HTMLDocument, Sendable {}