{{/* viewer — GET /d/{sqid} and GET /s/{token}, the paged viewer. One file for all three audiences (viewer.go's modeOwner, modeMember, modeLink). The mode decides what the handler PUTS in the view data — the notes, the owner's buttons, the filmstrip's links — and this template only ever asks whether a field is there. That is the whole reason it is not two templates: a second file is a second place for "does this reader get the speaker notes?" to be answered, and the two answers would drift. render.go builds it twice, as "viewer" (with the account menu) and as "viewer_link" (with a sign-in link instead), because nobody reading a deck over a share link has an account to show. Present is task 6's surface in its scriptless form: one slide, two links, nothing else on the page. §8's floor, and the thing the fullscreen presenter will be an enhancement OF rather than a replacement for. */}} {{/* The slide's own stylesheet, on the screens that render a slide and nowhere else: it is a document's look, not the app's chrome, and every other screen would pay for it without using it. */}} {{define "page-head"}} {{end}} {{define "content"}} {{if .Present}}
{{.Slide}}
{{else}}
{{if .BackHref}}{{template "back-nav" dict "Href" .BackHref "Label" .BackLabel}}{{end}} {{template "page-header" dict "Title" .Title}} {{if or .EditHref .SettingsHref .ShareHref .NotesHref .ExportHref .PresentHref .PresentAction .FollowHref}} {{end}} {{if .HasSlides}}
{{.Slide}}
{{if .HasNotes}}
{{.NotesLabel}} {{.Notes}}
{{end}} {{else}}
{{template "empty-state" dict "Title" .EmptyTitle "Body" .EmptyBody "ActionHref" .EditHref "ActionLabel" .EditLabel}}
{{end}}
{{end}} {{end}}