{{define "header"}}
{{template "header-insert" .}}
{{/* Signed-in user area: username · Sign out. The username itself is the link to the Settings page (/settings, docs/ui/user-settings.md) — styled as a .nav-link like the left-side Library/Upload tabs, only on the right. The voluntary change-password control and the theme switcher live on that page; the forced first-run password change still uses #passModal below. It's a plain so the shell router treats it as in-shell navigation; its text is filled in by auth.js. */}} {{/* Both controls always exist (auth.js toggles them on a session edge), but the server sets the correct initial state so there's no FOUC: a signed-in load paints the username + Log out straight away, never "Sign in" first. */}} {{template "header-actions-extra" .}}
{{/* About modal — opened from the About menu's Version entry (about-menu.js). Lives in the header partial so it ships on every page that has the header, with no per-page include. Version/Commit come from internal/version; an em-dash shows when the value was unknown at build time. */}} {{end}} {{define "auth-modals"}}
{{end}} {{define "header-insert"}}{{end}} {{define "header-actions-extra"}}{{end}} {{/* The listening section's subtab bar (shared .subtabs / .subtab component). Music (the artist/album browse at "/") and Playlists today; Most played / Recently added / Podcasts can be added as more entries + their routes. Rendered at the top of
on each library subtab page, so the shell swaps it with the page and the server-rendered active state (.Page) stays correct after a client-side navigation. */}} {{define "library-subnav"}} {{end}} {{/* player-bar: the shared audio player markup driven by player.js. Include it on any page that wants playback, then create the player in JS. Carries its own