From 6a52175d70a33283690c9fa5706d29dd34cf5264 Mon Sep 17 00:00:00 2001 From: Evan Jarrett Date: Tue, 3 Feb 2026 20:32:03 -0600 Subject: [PATCH] add theme overrides --- cmd/appview/main.go | 10 ++- pkg/appview/config.go | 4 ++ pkg/appview/themes.go | 28 ++++++++ themes/seamark/embed.go | 67 ++++++++++++++++++ themes/seamark/public/apple-touch-icon.png | Bin 0 -> 5629 bytes themes/seamark/public/favicon-96x96.png | Bin 0 -> 4979 bytes themes/seamark/public/favicon.ico | Bin 0 -> 15086 bytes themes/seamark/public/favicon.svg | 51 +++++++++++++ themes/seamark/public/icons.svg | 43 +++++++++++ themes/seamark/public/robots.txt | 33 +++++++++ themes/seamark/public/site.webmanifest | 21 ++++++ themes/seamark/public/sitemap-static.xml | 28 ++++++++ themes/seamark/public/sitemap.xml | 14 ++++ .../public/web-app-manifest-192x192.png | Bin 0 -> 6123 bytes .../public/web-app-manifest-512x512.png | Bin 0 -> 17825 bytes themes/seamark/theme.css | 14 ++++ 16 files changed, 312 insertions(+), 1 deletion(-) create mode 100644 pkg/appview/themes.go create mode 100644 themes/seamark/embed.go create mode 100644 themes/seamark/public/apple-touch-icon.png create mode 100644 themes/seamark/public/favicon-96x96.png create mode 100644 themes/seamark/public/favicon.ico create mode 100644 themes/seamark/public/favicon.svg create mode 100644 themes/seamark/public/icons.svg create mode 100644 themes/seamark/public/robots.txt create mode 100644 themes/seamark/public/site.webmanifest create mode 100644 themes/seamark/public/sitemap-static.xml create mode 100644 themes/seamark/public/sitemap.xml create mode 100644 themes/seamark/public/web-app-manifest-192x192.png create mode 100644 themes/seamark/public/web-app-manifest-512x512.png create mode 100644 themes/seamark/theme.css diff --git a/cmd/appview/main.go b/cmd/appview/main.go index c12345e..8d07f03 100644 --- a/cmd/appview/main.go +++ b/cmd/appview/main.go @@ -13,6 +13,9 @@ import ( // Register our custom middleware _ "atcr.io/pkg/appview/middleware" + + // Register built-in themes + _ "atcr.io/themes/seamark" ) var configFile string @@ -79,7 +82,12 @@ func serveRegistry(cmd *cobra.Command, args []string) error { return fmt.Errorf("failed to load config: %w", err) } - server, err := appview.NewAppViewServer(cfg, nil) + branding, err := appview.LookupTheme(cfg.UI.Theme) + if err != nil { + return err + } + + server, err := appview.NewAppViewServer(cfg, branding) if err != nil { return fmt.Errorf("failed to initialize server: %w", err) } diff --git a/pkg/appview/config.go b/pkg/appview/config.go index 910b912..fd5e02e 100644 --- a/pkg/appview/config.go +++ b/pkg/appview/config.go @@ -65,6 +65,9 @@ type ServerConfig struct { type UIConfig struct { // SQLite database path. DatabasePath string `yaml:"database_path" comment:"SQLite database for OAuth sessions, stars, pull counts, and device approvals."` + + // Visual theme name (e.g. "seamark"). Empty string uses default atcr.io branding. + Theme string `yaml:"theme" comment:"Visual theme name (e.g. \"seamark\"). Empty uses default atcr.io branding."` } // HealthConfig defines health check and cache settings @@ -136,6 +139,7 @@ func setDefaults(v *viper.Viper) { // UI defaults v.SetDefault("ui.database_path", "/var/lib/atcr/ui.db") + v.SetDefault("ui.theme", "") // Health defaults v.SetDefault("health.cache_ttl", "15m") diff --git a/pkg/appview/themes.go b/pkg/appview/themes.go new file mode 100644 index 0000000..3993a6e --- /dev/null +++ b/pkg/appview/themes.go @@ -0,0 +1,28 @@ +package appview + +import "fmt" + +// themeRegistry maps theme names to their BrandingOverrides constructors. +var themeRegistry = make(map[string]func() *BrandingOverrides) + +// RegisterTheme registers a named theme. Call from init() in theme packages. +func RegisterTheme(name string, fn func() *BrandingOverrides) { + if _, exists := themeRegistry[name]; exists { + panic(fmt.Sprintf("theme %q already registered", name)) + } + themeRegistry[name] = fn +} + +// LookupTheme returns BrandingOverrides for a registered theme name. +// Returns nil for empty name (default branding). Returns an error for +// unknown theme names. +func LookupTheme(name string) (*BrandingOverrides, error) { + if name == "" { + return nil, nil + } + fn, ok := themeRegistry[name] + if !ok { + return nil, fmt.Errorf("unknown theme %q", name) + } + return fn(), nil +} diff --git a/themes/seamark/embed.go b/themes/seamark/embed.go new file mode 100644 index 0000000..639b216 --- /dev/null +++ b/themes/seamark/embed.go @@ -0,0 +1,67 @@ +// Package seamark provides the Seamark visual theme for the ATCR AppView. +// Import with a blank identifier to register: _ "atcr.io/themes/seamark" +// Enable with ATCR_UI_THEME=seamark. +package seamark + +import ( + "embed" + "io/fs" + + "atcr.io/pkg/appview" +) + +//go:embed public +var publicFS embed.FS + +//go:embed theme.css +var themeCSS string + +func init() { + appview.RegisterTheme("seamark", branding) +} + +func branding() *appview.BrandingOverrides { + // Strip the leading "public" directory so the overlay FS matches the + // structure expected by resolvePublicFS (which looks under "public/"). + pubSub, err := fs.Sub(publicFS, "public") + if err != nil { + panic("seamark: bad embed layout: " + err.Error()) + } + + return &appview.BrandingOverrides{ + PublicFS: prefixFS{sub: pubSub}, + ExtraCSS: themeCSS, + } +} + +// prefixFS re-adds the "public/" prefix so the overlay FS works with +// atcr.io's resolvePublicFS which opens paths like "public/favicon.svg". +type prefixFS struct{ sub fs.FS } + +func (p prefixFS) Open(name string) (fs.File, error) { + const prefix = "public/" + if len(name) > len(prefix) && name[:len(prefix)] == prefix { + return p.sub.Open(name[len(prefix):]) + } + // Non-public paths: return not-found so the overlay falls through. + return nil, &fs.PathError{Op: "open", Path: name, Err: fs.ErrNotExist} +} + +func (p prefixFS) ReadDir(name string) ([]fs.DirEntry, error) { + const prefix = "public/" + if name == "public" { + return fs.ReadDir(p.sub, ".") + } + if len(name) > len(prefix) && name[:len(prefix)] == prefix { + return fs.ReadDir(p.sub, name[len(prefix):]) + } + return nil, &fs.PathError{Op: "readdir", Path: name, Err: fs.ErrNotExist} +} + +func (p prefixFS) ReadFile(name string) ([]byte, error) { + const prefix = "public/" + if len(name) > len(prefix) && name[:len(prefix)] == prefix { + return fs.ReadFile(p.sub, name[len(prefix):]) + } + return nil, &fs.PathError{Op: "readfile", Path: name, Err: fs.ErrNotExist} +} diff --git a/themes/seamark/public/apple-touch-icon.png b/themes/seamark/public/apple-touch-icon.png new file mode 100644 index 0000000000000000000000000000000000000000..53ec455db0a76daed044daf3d8cbd38c9b4369bc GIT binary patch literal 5629 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 ZqRG6W8U6-kcVpdq8mc-fRZ4He{~xeox#R!< literal 0 HcmV?d00001 diff --git a/themes/seamark/public/favicon-96x96.png b/themes/seamark/public/favicon-96x96.png new file mode 100644 index 0000000000000000000000000000000000000000..3650661e18144cfa8685c61f89a580ad999b9870 GIT binary patch literal 4979 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 rW2`5%hurg+_TpQ78}h$B(m9ni30j0# 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 TQ9>0diOncV5lMpD#)|&~%6bV7 literal 0 HcmV?d00001 diff --git a/themes/seamark/public/favicon.svg b/themes/seamark/public/favicon.svg new file mode 100644 index 0000000..c4d9e17 --- /dev/null +++ b/themes/seamark/public/favicon.svg @@ -0,0 +1,51 @@ + + + + + + + + + + + + + + + + diff --git a/themes/seamark/public/icons.svg b/themes/seamark/public/icons.svg new file mode 100644 index 0000000..cb8b9ca --- /dev/null +++ b/themes/seamark/public/icons.svg @@ -0,0 +1,43 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/themes/seamark/public/robots.txt b/themes/seamark/public/robots.txt new file mode 100644 index 0000000..74aea2d --- /dev/null +++ b/themes/seamark/public/robots.txt @@ -0,0 +1,33 @@ +# Seamark Container Registry - robots.txt + +User-agent: * + +# Allow public pages +Allow: / +Allow: /r/ +Allow: /u/ +Allow: /search +Allow: /install +Allow: /privacy +Allow: /terms + +# Block API endpoints +Disallow: /api/ +Disallow: /v2/ + +# Block auth and session pages +Disallow: /auth/ +Disallow: /login +Disallow: /settings +Disallow: /device/ + +# Block OG image generation endpoints +Disallow: /og/ + +# Block static assets from indexing (optional, saves crawl budget) +Disallow: /js/ +Disallow: /css/ +Disallow: /static/ + +# Sitemap +Sitemap: https://seamark.dev/sitemap.xml diff --git a/themes/seamark/public/site.webmanifest b/themes/seamark/public/site.webmanifest new file mode 100644 index 0000000..848e499 --- /dev/null +++ b/themes/seamark/public/site.webmanifest @@ -0,0 +1,21 @@ +{ + "name": "Seamark", + "short_name": "Seamark", + "icons": [ + { + "src": "/web-app-manifest-192x192.png", + "sizes": "192x192", + "type": "image/png", + "purpose": "maskable" + }, + { + "src": "/web-app-manifest-512x512.png", + "sizes": "512x512", + "type": "image/png", + "purpose": "maskable" + } + ], + "theme_color": "#274b70", + "background_color": "#274b70", + "display": "standalone" +} \ No newline at end of file diff --git a/themes/seamark/public/sitemap-static.xml b/themes/seamark/public/sitemap-static.xml new file mode 100644 index 0000000..de43324 --- /dev/null +++ b/themes/seamark/public/sitemap-static.xml @@ -0,0 +1,28 @@ + + + + https://seamark.dev/ + daily + 1.0 + + + https://seamark.dev/search + daily + 0.8 + + + https://seamark.dev/install + monthly + 0.9 + + + https://seamark.dev/privacy + yearly + 0.3 + + + https://seamark.dev/terms + yearly + 0.3 + + diff --git a/themes/seamark/public/sitemap.xml b/themes/seamark/public/sitemap.xml new file mode 100644 index 0000000..d463e44 --- /dev/null +++ b/themes/seamark/public/sitemap.xml @@ -0,0 +1,14 @@ + + + + https://seamark.dev/sitemap-static.xml + + + diff --git a/themes/seamark/public/web-app-manifest-192x192.png b/themes/seamark/public/web-app-manifest-192x192.png new file mode 100644 index 0000000000000000000000000000000000000000..6fd4f4d7c75f64bfdf5d7c9f70e30102d17fb1a0 GIT binary patch literal 6123 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 JE2Pan{TCHvr=0)* literal 0 HcmV?d00001 diff --git a/themes/seamark/public/web-app-manifest-512x512.png b/themes/seamark/public/web-app-manifest-512x512.png new file mode 100644 index 0000000000000000000000000000000000000000..25350ec86d33cbb4550018f03e856f75c7fea03b GIT binary patch literal 17825 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 literal 0 HcmV?d00001 diff --git a/themes/seamark/theme.css b/themes/seamark/theme.css new file mode 100644 index 0000000..ca0cd67 --- /dev/null +++ b/themes/seamark/theme.css @@ -0,0 +1,14 @@ +/* Seamark color overrides (injected after atcr.io's compiled stylesheet) */ +[data-theme="dark"] { + --color-secondary: oklch(90% 0.182 98.111); + --color-secondary-content: oklch(30% 0.182 98.111); + --color-accent: oklch(66.6% 0.121 28); + --color-accent-content: oklch(28% 0.121 28); +} + +[data-theme="light"] { + --color-secondary: oklch(76% 0.095 76.1); + --color-secondary-content: oklch(27.1% 0.026 76.4); + --color-accent: oklch(66.6% 0.121 28); + --color-accent-content: oklch(28% 0.121 28); +}