{{/*
Shared chrome partials. The dot must expose the chrome.Page fields — either
a Page itself or a view struct embedding one.
srht-env-banner renders the non-production warning strip; place it first in
<body>. srht-nav renders the navbar INNER content (brand + switcher + login
box); the service's layout owns the <nav> element itself so it can keep its
own classes.
*/}}
{{/*
srht-head-links renders the two <link> elements every service's <head>
carries: the built stylesheet and the favicon. Both are guarded rather than
emitted empty, because <link href=""> re-requests the page it is on — one
extra page load per page load, for nothing.
*/}}
{{define "srht-head-links" -}}
{{if .StyleHref}}<link rel="stylesheet" href="{{.StyleHref}}">{{end}}
{{if .FaviconHref}}<link rel="icon" href="{{.FaviconHref}}">{{end}}
{{- end}}
{{define "srht-env-banner" -}}
{{if .ShowBanner}}
<div style="background: #228800; color: white; font-weight: bold; width: 100%; text-align: center">
{{.Environment}} ENVIRONMENT
</div>
{{end}}
{{- end}}
{{/*
srht-repo-list renders a listing of projects (repos, databases, spaces) as
the family's event-list cards. Dot is a chrome.RepoList. The rules the four
services converged on: h4 title link; visibility as small muted text on the
right, non-public only, lowercase; description as a paragraph when present.
*/}}
{{define "srht-repo-list" -}}
{{if .Items}}
<div class="event-list">
{{range .Items}}
<div class="event">
<h4>
<a href="{{.Href}}">{{.Title}}</a>
{{if and .Visibility (ne .Visibility "PUBLIC")}}
<small class="pull-right">{{if eq .Visibility "UNLISTED"}}unlisted{{else}}private{{end}}</small>
{{end}}
</h4>
{{if .Description}}
<p>{{.Description}}</p>
{{end}}
{{if or (not .Updated.IsZero) .Meta}}
<small class="text-muted">
{{if not .Updated.IsZero}}<span title="{{abstime .Updated}}">{{reltime .Updated}}</span>{{end}}
{{range .Meta}}<span>{{.}}</span>{{end}}
</small>
{{end}}
</div>
{{end}}
</div>
{{else}}
<p class="text-muted">{{.Empty}}</p>
{{end}}
{{- end}}
{{/*
srht-repo-table is the same listing as aligned columns, for a service whose
list is long enough to scan rather than read. Dot is a chrome.RepoList, so a
service can switch between the two partials without touching its handler.
The columns after the name render only when the data carries them: a service
with no timestamp in its schema (dolt) gets a two-column table rather than a
column of blanks.
*/}}
{{define "srht-repo-table" -}}
{{if .Items}}
<table class="table">
<tbody>
{{range .Items}}
<tr>
<td>
<a href="{{.Href}}">{{.Title}}</a>
{{if and .Visibility (ne .Visibility "PUBLIC")}}
<small class="text-muted">{{if eq .Visibility "UNLISTED"}}unlisted{{else}}private{{end}}</small>
{{end}}
{{if .Description}}<br><small class="text-muted">{{.Description}}</small>{{end}}
</td>
{{range .Meta}}<td class="text-muted">{{.}}</td>{{end}}
{{if not .Updated.IsZero}}
<td class="text-right text-muted" title="{{abstime .Updated}}">{{reltime .Updated}}</td>
{{end}}
</tr>
{{end}}
</tbody>
</table>
{{else}}
<p class="text-muted">{{.Empty}}</p>
{{end}}
{{- end}}
{{define "srht-nav" -}}
{{/*
The brand carries a fixed min-width so the service switcher starts at the
same x-coordinate on every service: without it the menu shifts by the width
of the red service label ("dolt" vs "compare") when hopping between
services. Sized for the longest label on the instance; inline because the
services build their CSS from the shared core tree and ecore ships none.
Two links, not one. Upstream core.sr.ht makes the whole brand a single link
and has to choose: with hub configured it points the site name at hub and
drops the service label entirely, without hub it keeps the label and points
at the service root. Neither half is expendable — hub is excluded from the
switcher, so the brand is the only route to it, and a page that does not
name the service it belongs to is worse chrome. So the site name goes to
hub (falling back to the service root when the instance has no hub) and the
red label goes to the service root.
The label stays wrapped in its own <span class="text-danger"> rather than
becoming a red <a>: the theme colors ".navbar-light .navbar-brand a", which
outranks .text-danger and would repaint the label white in dark mode.
*/}}
<span class="navbar-brand" style="min-width: 15rem">
<span class="icon icon-circle" aria-hidden="true"><svg width="22" height="22" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 512 512"><path d="M256 8C119 8 8 119 8 256s111 248 248 248 248-111 248-248S393 8 256 8zm0 448c-110.5 0-200-89.5-200-200S145.5 56 256 56s200 89.5 200 200-89.5 200-200 200z"/></svg></span>
<a href="{{if .HubOrigin}}{{.HubOrigin}}{{else}}/{{end}}">{{.SiteName}}</a>
<a href="/"><span class="text-danger">{{.SiteLabel}}</span></a>
</span>
<ul class="navbar-nav">
{{if .Username}}
{{range .Nav}}
<li class="nav-item {{if .Active}}active{{end}}">
<a class="nav-link" href="{{.Origin}}">{{.Name}}</a>
</li>
{{end}}
{{range .ExtraNav}}
<li class="nav-item {{if .Active}}active{{end}}">
<a class="nav-link" href="{{.Origin}}">{{.Name}}</a>
</li>
{{end}}
{{end}}
</ul>
<div class="login">
{{if .Username}}
<span class="navbar-text">
Logged in as
<a href="{{.ProfileURL}}">{{.Username}}</a>
—
<a href="{{.LogoutURL}}">Log out</a>
</span>
{{else}}
<span class="navbar-text">
<a href="{{.LoginURL}}" rel="nofollow">Log in</a>
—
<a href="{{.RegisterURL}}">Register</a>
</span>
{{end}}
</div>
{{- end}}