43 lines
1.3 KiB
Go
43 lines
1.3 KiB
Go
// Package webui embeds the HTML templates and static assets.
|
|
//
|
|
// It lives at the repository root next to the files it embeds, because Go's
|
|
// embed directive cannot reach outside its own directory. The HTTP handlers
|
|
// that consume these assets live in internal/web.
|
|
//
|
|
// Everything the browser needs — Bootstrap, Bootstrap Icons and their web
|
|
// font, and Chart.js — is vendored here rather than loaded from a CDN, so the
|
|
// management interface works on a network with no Internet access. That is not
|
|
// a hypothetical: a DNS server whose own UI needs working DNS to render is
|
|
// unusable in exactly the situation an administrator most needs it.
|
|
package webui
|
|
|
|
import (
|
|
"embed"
|
|
"io/fs"
|
|
)
|
|
|
|
//go:embed templates
|
|
var templatesFS embed.FS
|
|
|
|
//go:embed static
|
|
var staticFS embed.FS
|
|
|
|
// Templates returns the template tree rooted at the templates directory.
|
|
func Templates() fs.FS {
|
|
sub, err := fs.Sub(templatesFS, "templates")
|
|
if err != nil {
|
|
// Unreachable: the directory is embedded at build time.
|
|
panic("webui: templates directory is missing from the binary: " + err.Error())
|
|
}
|
|
return sub
|
|
}
|
|
|
|
// Static returns the static asset tree rooted at the static directory.
|
|
func Static() fs.FS {
|
|
sub, err := fs.Sub(staticFS, "static")
|
|
if err != nil {
|
|
panic("webui: static directory is missing from the binary: " + err.Error())
|
|
}
|
|
return sub
|
|
}
|