{{define "layout.html"}} {{.Title}} {{/* The tab icon is the stamp's small-size variant — the initials rather than the two-line wordmark, which stops resolving below 32px (the thresholds are recorded in docs/assets/selfpost-proof.html). The PNG is declared first and the SVG second: a browser takes the last icon whose type it understands, so vector wins wherever it is supported and the raster catches the rest. */}} {{/* Unless told otherwise, htmx injects a stylesheet element of its own into the head for the request-indicator classes. The panel uses no hx-indicator, and that injected element would be the one thing the Content-Security-Policy has to make an exception for, so it is switched off here. */}} {{/* Two columns: the navigation on the left and the page beside it, centred together (see .shell in panel.css). The signed-out pages have no navigation and the shell holds their card alone. */}}
{{if .User}}{{template "nav" .}}{{end}} {{/* The page name travels onto
as a class so the stylesheet can size a page to what it holds — the signed-out pages are narrower than the rest (see main.page-* in panel.css). It is .Active, already carried for the navigation, rather than a second field every handler would have to remember to set. The "wide" block beside it is how a page made of data asks for the whole column instead of the reading measure; it is the page's own declaration rather than a name in the stylesheet, since .Active cannot tell the send log from a single delivery's page. */}}
{{template "content" .}} {{/* Appropriate Legal Notices (AGPL-3.0): copyright, how to read the licence, where the Corresponding Source is, and that there is no warranty. Shown on every page, including login/setup — those are interactive UIs too. The running version stays signed-in only: it is what a backup manifest is checked against on restore, and must not be advertised to the internet. */}}
{{end}} {{/* nav is the panel's navigation bar. It is rendered here, from the layout, so every authenticated page has it without the page's own template having to remember to include it; .Active names the current page so it is highlighted instead of linking to itself. Unauthenticated pages (login, setup) carry no .User and get no nav. */}} {{define "nav"}} {{end}} {{/* Whether the page takes the column whole. Empty here, so a page is held to the reading measure unless it says otherwise; the pages that are tables of data, raw log lines or side-by-side cards redefine this as the word "wide", which lands in
's class list (see main.wide in panel.css). Each page's template file is parsed after this one, so its definition replaces the empty one. */}} {{define "wide"}}{{end}} {{/* back_link — up-navigation on drill-down pages. Invoke with the "back" function, e.g. {{template "back_link" (back "/users" "Back to users")}}. Place it directly under the page

and above the cards (see .back in panel.css). TestDrillDownPagesPlaceBackLinkAboveContent guards this. */}} {{define "back_link"}} ← {{.Label}} {{end}} {{/* Navigation icons. Inline SVG rather than an icon font or sprite file: they inherit the link's colour through currentColor, cost no extra request, and need no exemption from the panel's "default-src 'self'" policy. Each is aria-hidden because the entry's own text is already the accessible name; the icon is a landmark for the eye, not a second label. Kept as separate templates so the nav above stays one readable line per page. */}} {{define "icon-status"}}{{end}} {{define "icon-domains"}}{{end}} {{define "icon-deliveries"}}{{end}} {{define "icon-mail-queue"}}{{end}} {{define "icon-system-log"}}{{end}} {{/* A filing cabinet rather than a storage box: the box read as a box, while two drawers with handles is the picture of an archive. */}} {{define "icon-backup"}}{{end}} {{define "icon-account"}}{{end}} {{/* Two people: rear as a right-side crescent (head + shoulder) so it peeks from behind; front is a full silhouette matching icon-account. Heads share one baseline; shoulder arcs share one floor — otherwise the pair looks lopsided at 16 px. */}} {{define "icon-users"}}{{end}} {{/* A gear (Feather "settings"), not a sun-with-rays: at 16 px spokes alone read as brightness, while the toothed rim is the picture of configuration. viewBox 0 0 24 matches the source path; CSS sizes the icon to 1 rem. */}} {{define "icon-settings"}}{{end}} {{/* Sign out is the one icon here that marks an action rather than a page: an open door with the arrow leading out of it. */}} {{define "icon-sign-out"}}{{end}}