diff --git a/hscontrol/assets/assets.go b/hscontrol/assets/assets.go new file mode 100644 index 00000000..13904247 --- /dev/null +++ b/hscontrol/assets/assets.go @@ -0,0 +1,24 @@ +// Package assets provides embedded static assets for Headscale. +// All static files (favicon, CSS, SVG) are embedded here for +// centralized asset management. +package assets + +import ( + _ "embed" +) + +// Favicon is the embedded favicon.png file served at /favicon.ico +// +//go:embed favicon.png +var Favicon []byte + +// CSS is the embedded style.css stylesheet used in HTML templates. +// Contains Material for MkDocs design system styles. +// +//go:embed style.css +var CSS string + +// SVG is the embedded headscale.svg logo used in HTML templates. +// +//go:embed headscale.svg +var SVG string diff --git a/hscontrol/templates/headscale.svg b/hscontrol/assets/headscale.svg similarity index 99% rename from hscontrol/templates/headscale.svg rename to hscontrol/assets/headscale.svg index 42aa0e9e..caf19697 100644 --- a/hscontrol/templates/headscale.svg +++ b/hscontrol/assets/headscale.svg @@ -1 +1 @@ - \ No newline at end of file + diff --git a/hscontrol/templates/style.css b/hscontrol/assets/style.css similarity index 92% rename from hscontrol/templates/style.css rename to hscontrol/assets/style.css index 933c208a..d82bea12 100644 --- a/hscontrol/templates/style.css +++ b/hscontrol/assets/style.css @@ -9,10 +9,12 @@ --md-primary-fg-color: #4051b5; --md-accent-fg-color: #526cfe; --md-typeset-a-color: var(--md-primary-fg-color); - --md-text-font: "Roboto", -apple-system, BlinkMacSystemFont, "Segoe UI", - "Helvetica Neue", Arial, sans-serif; - --md-code-font: "Roboto Mono", "SF Mono", Monaco, "Cascadia Code", Consolas, - "Courier New", monospace; + --md-text-font: + "Roboto", -apple-system, BlinkMacSystemFont, "Segoe UI", "Helvetica Neue", + Arial, sans-serif; + --md-code-font: + "Roboto Mono", "SF Mono", Monaco, "Cascadia Code", Consolas, "Courier New", + monospace; } /* Base Typography */ diff --git a/hscontrol/handlers.go b/hscontrol/handlers.go index 87d69038..8af9f76e 100644 --- a/hscontrol/handlers.go +++ b/hscontrol/handlers.go @@ -2,7 +2,6 @@ package hscontrol import ( "bytes" - _ "embed" "encoding/json" "errors" "fmt" @@ -14,6 +13,7 @@ import ( "github.com/chasefleming/elem-go/styles" "github.com/gorilla/mux" + "github.com/juanfont/headscale/hscontrol/assets" "github.com/juanfont/headscale/hscontrol/templates" "github.com/juanfont/headscale/hscontrol/types" "github.com/rs/zerolog/log" @@ -278,12 +278,9 @@ func (a *AuthProviderWeb) RegisterHandler( writer.Write([]byte(templates.RegisterWeb(registrationId).Render())) } -//go:embed assets/favicon.png -var favicon []byte - func FaviconHandler(writer http.ResponseWriter, req *http.Request) { writer.Header().Set("Content-Type", "image/png") - http.ServeContent(writer, req, "favicon.ico", time.Unix(0, 0), bytes.NewReader(favicon)) + http.ServeContent(writer, req, "favicon.ico", time.Unix(0, 0), bytes.NewReader(assets.Favicon)) } // BlankHandler returns a blank page with favicon linked. diff --git a/hscontrol/templates/general.go b/hscontrol/templates/general.go index f779063e..ccc5a360 100644 --- a/hscontrol/templates/general.go +++ b/hscontrol/templates/general.go @@ -1,22 +1,15 @@ package templates import ( - _ "embed" - "github.com/chasefleming/elem-go" "github.com/chasefleming/elem-go/attrs" "github.com/chasefleming/elem-go/styles" + "github.com/juanfont/headscale/hscontrol/assets" ) -//go:embed style.css -var headscaleCSS string - -//go:embed headscale.svg -var headscaleSVG string - // mdTypesetBody creates a body element with md-typeset styling // that matches the official Headscale documentation design. -// Uses CSS classes with styles defined in headscaleCSS. +// Uses CSS classes with styles defined in assets.CSS. func mdTypesetBody(children ...elem.Node) *elem.Element { return elem.Body(attrs.Props{ attrs.Style: styles.Props{ @@ -41,7 +34,7 @@ func mdTypesetBody(children ...elem.Node) *elem.Element { // Styled Element Wrappers // These functions wrap elem-go elements using CSS classes. -// Styling is handled by the CSS in headscaleCSS. +// Styling is handled by the CSS in assets.CSS. // H1 creates a H1 element styled by .md-typeset h1 func H1(children ...elem.Node) *elem.Element { @@ -126,7 +119,7 @@ func contentContainer(children ...elem.Node) *elem.Element { // The logo is styled by the .headscale-logo CSS class. func headscaleLogo() elem.Node { // Return the embedded SVG as-is - return elem.Raw(headscaleSVG) + return elem.Raw(assets.SVG) } // pageFooter creates a consistent footer for all pages. @@ -198,7 +191,7 @@ func HtmlStructure(head, body *elem.Element) *elem.Element { attrs.Href: "https://fonts.googleapis.com/css2?family=Roboto:wght@300;400;500;700&family=Roboto+Mono:wght@400;700&display=swap", }), // Material for MkDocs CSS styles - elem.Style(attrs.Props{attrs.Type: "text/css"}, elem.Raw(headscaleCSS)), + elem.Style(attrs.Props{attrs.Type: "text/css"}, elem.Raw(assets.CSS)), head, ), body,