Files
palette/cmd/palette/main.go
T
fen dcf2d66a82
CI / test (pull_request) Successful in 25s
CI / docker (pull_request) Skipped
Theme pairs with dark mode toggle, gear active state, PALETTE_DEFAULT_DARK (#127)
- Collapse the 10 theme cards into 5 pairs: light swatches top row, dark bottom row
- Dark mode toggle in settings and topbar (sun/moon inline SVG)
- Toggling dark mode switches to the other variant of the selected pair
- Persist pair id in localStorage palette-theme, dark flag in palette-dark
- Head script resolves base+dark to variant; URL ?theme= accepts both ids and wins
- Settings gear highlights like nav tabs on /settings
- PALETTE_DEFAULT_DARK env var sets server default dark state (default on)
- Server-side resolution helpers + tests
2026-09-09 22:17:50 -05:00

50 lines
1.3 KiB
Go

// Command palette is the palette pastebin server entrypoint: flag parsing
// and wiring of the store, API, and web packages.
package main
import (
"log"
"os"
"net/http"
"time"
"palette/internal/api"
"palette/internal/store"
"palette/internal/web"
)
func main() {
// #40: --reset-admin-key regenerates the admin key and exits.
if len(os.Args) > 1 && os.Args[1] == "--reset-admin-key" {
api.HandleResetAdminKey(api.EnvOr("PALETTE_DB", "palette.db"))
return
}
cfg := api.Config{
Addr: api.EnvOr("PALETTE_ADDR", ":8080"),
DBPath: api.EnvOr("PALETTE_DB", "palette.db"),
MaxTextBytes: int64(api.EnvIntOr("PALETTE_MAX_TEXT", 5*1024*1024)),
MaxItemBytes: int64(api.EnvIntOr("PALETTE_MAX_ITEM", 25*1024*1024)),
}
st, err := store.OpenStore(cfg.DBPath)
if err != nil {
log.Fatal(err)
}
adminKey, err := api.ResolveAdminKey(cfg.DBPath)
if err != nil {
log.Fatal(err)
}
ss := api.LoadSettingsStore(cfg.DBPath, cfg)
st.StartSweeper(time.Minute, ss.Get().CustomSlugReservationDays)
ui, err := web.New()
if err != nil {
log.Fatal(err)
}
web.SetDefaultDark(os.Getenv("PALETTE_DEFAULT_DARK"))
srv := api.NewServer(st, cfg, ui, ss, adminKey)
log.Printf("palette listening on %s", cfg.Addr)
log.Fatal(http.ListenAndServe(cfg.Addr, srv.Routes()))
}