Files
canon/web/templates/pages/login.html
T
cdnutterandClaude Opus 5.5 e9a75a968a Initial TopDeck: self-hosted ranked favorites
A single Go binary with SQLite that serves a public page of the owner's
ranked lists (movies, TV, albums, songs, video games, theater) and a
login-gated editor.

- Lists of 1–65,535 entries (100 recommended), several per category
- Search-to-add via TMDB, TheTVDB, IGDB, Deezer/MusicBrainz, Wikipedia;
  manual entry as a fallback
- Theater entries carry a production (Broadway, tour, …), venue and cast
- Artwork cached locally; URL override and uploads
- Drag, arrow and type-a-rank reordering; paginated for long lists
- 12 theme presets plus custom CSS
- First-run setup code or env-provided admin; bcrypt, rate-limited login,
  CSRF-guarded JSON API
- Dockerfile and docker-compose.yml

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-09-24 16:54:19 -07:00

23 lines
973 B
HTML

{{define "bodyclass"}}page-auth{{end}}
{{define "content"}}
<section class="auth-card">
<div class="auth-mark">{{icon "lock"}}</div>
<h1>Sign in</h1>
<p class="muted">Manage your lists, art and theme.</p>
{{with .Data.Error}}<p class="alert alert--error" role="alert">{{icon "alert"}}{{.}}</p>{{end}}
<form method="post" action="/login" class="stack">
<input type="hidden" name="next" value="{{.Data.Next}}">
<label class="field">
<span class="field-label">Username</span>
<input name="username" autocomplete="username" required autofocus value="{{.Data.Username}}">
</label>
<label class="field">
<span class="field-label">Password</span>
<input name="password" type="password" autocomplete="current-password" required>
</label>
<button class="btn btn--primary btn--block" type="submit">Sign in</button>
</form>
<a class="auth-back" href="/">{{icon "arrow-left"}}Back to {{.Site.Title}}</a>
</section>
{{end}}