detached 475ebb6

feat(mirror): warn about failing mirrors on git push and show a badge on the repo page

commit
475ebb670b09953ca4b84b98a0a9c24981098c7a
author
brice · · 2026-10-20 05:54 UTC
committer
brice · · 2026-10-20 10:02 UTC
parent
ed419c7
signature
GPG VerifiedCD88F9E564E0102646FB6077A1A07C7C7C3E349D · arch-gpg Verified for the committer email
9 files · +501 -272
M internal/adapters/githttp/hooks.go +30 -3
@@ -37,8 +37,9 @@ type hookEntry struct {
3737 // HookServer registers the per-request hook tokens and serves the Unix
3838 // socket the hooks call back on. It implements HookTokens.
3939 type HookServer struct {
40- path string
41- hooks ports.PushHookService
40+ path string
41+ hooks ports.PushHookService
42+ mirrors ports.MirrorWarner
4243
4344 mu sync.RWMutex
4445 tokens map[string]hookEntry
@@ -56,6 +57,32 @@ func NewHookServer(path string, hooks ports.PushHookService) *HookServer {
5657 return &HookServer{path: path, hooks: hooks, tokens: make(map[string]hookEntry), conns: make(map[net.Conn]struct{})}
5758 }
5859
60+// WithMirrorWarner enables best-effort mirror warnings. Configure before serving.
61+func (s *HookServer) WithMirrorWarner(w ports.MirrorWarner) *HookServer {
62+ s.mirrors = w
63+ return s
64+}
65+
66+// mirrorWarning bounds even a source that does not honor context cancellation.
67+func (s *HookServer) mirrorWarning(ctx context.Context, repo domain.RepoName) string {
68+ if s.mirrors == nil {
69+ return ""
70+ }
71+ ctx, cancel := context.WithTimeout(ctx, 2*time.Second)
72+ defer cancel()
73+ result := make(chan string, 1)
74+ go func() { result <- s.mirrors.Warning(ctx, repo) }()
75+ select {
76+ case warning := <-result:
77+ if ctx.Err() != nil || warning == "" {
78+ return ""
79+ }
80+ return warning + "\n→ ermite mirror status " + repo.String()
81+ case <-ctx.Done():
82+ return ""
83+ }
84+}
85+
5986 // Socket returns the path of the socket.
6087 func (s *HookServer) Socket() string { return s.path }
6188
@@ -229,7 +256,7 @@ func (s *HookServer) handle(ctx context.Context, conn net.Conn) {
229256 s.reply(ctx, conn, HookReply{OK: true, Message: "ermite: the push succeeded but recording it failed"})
230257 return
231258 }
232- s.reply(ctx, conn, HookReply{OK: true})
259+ s.reply(ctx, conn, HookReply{OK: true, Message: s.mirrorWarning(rctx, entry.repo)})
233260 }
234261 }
235262
@@ -37,8 +37,9 @@ type hookEntry struct {
37 // HookServer registers the per-request hook tokens and serves the Unix37 // HookServer registers the per-request hook tokens and serves the Unix
38 // socket the hooks call back on. It implements HookTokens.38 // socket the hooks call back on. It implements HookTokens.
39 type HookServer struct {39 type HookServer struct {
40- path string40+ path string
41- hooks ports.PushHookService41+ hooks ports.PushHookService
42+ mirrors ports.MirrorWarner
42 43
43 mu sync.RWMutex44 mu sync.RWMutex
44 tokens map[string]hookEntry45 tokens map[string]hookEntry
@@ -56,6 +57,32 @@ func NewHookServer(path string, hooks ports.PushHookService) *HookServer {
56 return &HookServer{path: path, hooks: hooks, tokens: make(map[string]hookEntry), conns: make(map[net.Conn]struct{})}57 return &HookServer{path: path, hooks: hooks, tokens: make(map[string]hookEntry), conns: make(map[net.Conn]struct{})}
57 }58 }
58 59
60+// WithMirrorWarner enables best-effort mirror warnings. Configure before serving.
61+func (s *HookServer) WithMirrorWarner(w ports.MirrorWarner) *HookServer {
62+ s.mirrors = w
63+ return s
64+}
65+
66+// mirrorWarning bounds even a source that does not honor context cancellation.
67+func (s *HookServer) mirrorWarning(ctx context.Context, repo domain.RepoName) string {
68+ if s.mirrors == nil {
69+ return ""
70+ }
71+ ctx, cancel := context.WithTimeout(ctx, 2*time.Second)
72+ defer cancel()
73+ result := make(chan string, 1)
74+ go func() { result <- s.mirrors.Warning(ctx, repo) }()
75+ select {
76+ case warning := <-result:
77+ if ctx.Err() != nil || warning == "" {
78+ return ""
79+ }
80+ return warning + "\n→ ermite mirror status " + repo.String()
81+ case <-ctx.Done():
82+ return ""
83+ }
84+}
85+
59 // Socket returns the path of the socket.86 // Socket returns the path of the socket.
60 func (s *HookServer) Socket() string { return s.path }87 func (s *HookServer) Socket() string { return s.path }
61 88
@@ -229,7 +256,7 @@ func (s *HookServer) handle(ctx context.Context, conn net.Conn) {
229 s.reply(ctx, conn, HookReply{OK: true, Message: "ermite: the push succeeded but recording it failed"})256 s.reply(ctx, conn, HookReply{OK: true, Message: "ermite: the push succeeded but recording it failed"})
230 return257 return
231 }258 }
232- s.reply(ctx, conn, HookReply{OK: true})259+ s.reply(ctx, conn, HookReply{OK: true, Message: s.mirrorWarning(rctx, entry.repo)})
233 }260 }
234 }261 }
235 262
M internal/adapters/githttp/hooks_test.go +46 -0
@@ -412,3 +412,49 @@ func TestHookScriptExecsTheBinaryWithQuotedPath(t *testing.T) {
412412 require.NoError(t, err)
413413 assert.Equal(t, "line\n", string(in), "stdin reaches the binary")
414414 }
415+
416+func TestMirrorPostReceiveWarning(t *testing.T) {
417+ for _, warning := range []string{"ermite: mirror is failing: network unavailable", "ermite: mirror is paused: main diverged on remote", ""} {
418+ t.Run(warning, func(t *testing.T) {
419+ hooks := mocks.NewPushHookService(t)
420+ hooks.EXPECT().Record(mock.Anything, mock.Anything, mock.Anything, mock.Anything).Return(nil)
421+ srv, sock := startHooks(t, hooks)
422+ w := mocks.NewMirrorWarner(t)
423+ w.EXPECT().Warning(mock.Anything, repoName(t, "proj")).Return(warning)
424+ srv.WithMirrorWarner(w)
425+ token, release := srv.Register(t.Context(), repoName(t, "proj"), domain.Root())
426+ defer release()
427+ reply := raw(t, sock, `{"token":"`+token+`","hook":"post-receive","updates":[]}`)
428+ assert.True(t, reply.OK)
429+ if warning == "" {
430+ assert.Empty(t, reply.Message)
431+ } else {
432+ assert.Equal(t, warning+"\n→ ermite mirror status proj", reply.Message)
433+ }
434+ })
435+ }
436+}
437+
438+func TestMirrorPostReceiveTimeout(t *testing.T) {
439+ hooks := mocks.NewPushHookService(t)
440+ hooks.EXPECT().Record(mock.Anything, mock.Anything, mock.Anything, mock.Anything).Return(nil)
441+ srv, sock := startHooks(t, hooks)
442+ w := mocks.NewMirrorWarner(t)
443+ release := make(chan struct{})
444+ defer close(release)
445+ w.EXPECT().Warning(mock.Anything, repoName(t, "proj")).RunAndReturn(func(ctx context.Context, _ domain.RepoName) string {
446+ deadline, ok := ctx.Deadline()
447+ assert.True(t, ok)
448+ assert.LessOrEqual(t, time.Until(deadline), 2*time.Second)
449+ <-release // deliberately ignores cancellation
450+ return "late warning"
451+ })
452+ srv.WithMirrorWarner(w)
453+ token, revoke := srv.Register(t.Context(), repoName(t, "proj"), domain.Root())
454+ defer revoke()
455+ start := time.Now()
456+ reply := raw(t, sock, `{"token":"`+token+`","hook":"post-receive","updates":[]}`)
457+ assert.True(t, reply.OK)
458+ assert.Empty(t, reply.Message)
459+ assert.Less(t, time.Since(start), 2500*time.Millisecond)
460+}
@@ -412,3 +412,49 @@ func TestHookScriptExecsTheBinaryWithQuotedPath(t *testing.T) {
412 require.NoError(t, err)412 require.NoError(t, err)
413 assert.Equal(t, "line\n", string(in), "stdin reaches the binary")413 assert.Equal(t, "line\n", string(in), "stdin reaches the binary")
414 }414 }
415+
416+func TestMirrorPostReceiveWarning(t *testing.T) {
417+ for _, warning := range []string{"ermite: mirror is failing: network unavailable", "ermite: mirror is paused: main diverged on remote", ""} {
418+ t.Run(warning, func(t *testing.T) {
419+ hooks := mocks.NewPushHookService(t)
420+ hooks.EXPECT().Record(mock.Anything, mock.Anything, mock.Anything, mock.Anything).Return(nil)
421+ srv, sock := startHooks(t, hooks)
422+ w := mocks.NewMirrorWarner(t)
423+ w.EXPECT().Warning(mock.Anything, repoName(t, "proj")).Return(warning)
424+ srv.WithMirrorWarner(w)
425+ token, release := srv.Register(t.Context(), repoName(t, "proj"), domain.Root())
426+ defer release()
427+ reply := raw(t, sock, `{"token":"`+token+`","hook":"post-receive","updates":[]}`)
428+ assert.True(t, reply.OK)
429+ if warning == "" {
430+ assert.Empty(t, reply.Message)
431+ } else {
432+ assert.Equal(t, warning+"\n→ ermite mirror status proj", reply.Message)
433+ }
434+ })
435+ }
436+}
437+
438+func TestMirrorPostReceiveTimeout(t *testing.T) {
439+ hooks := mocks.NewPushHookService(t)
440+ hooks.EXPECT().Record(mock.Anything, mock.Anything, mock.Anything, mock.Anything).Return(nil)
441+ srv, sock := startHooks(t, hooks)
442+ w := mocks.NewMirrorWarner(t)
443+ release := make(chan struct{})
444+ defer close(release)
445+ w.EXPECT().Warning(mock.Anything, repoName(t, "proj")).RunAndReturn(func(ctx context.Context, _ domain.RepoName) string {
446+ deadline, ok := ctx.Deadline()
447+ assert.True(t, ok)
448+ assert.LessOrEqual(t, time.Until(deadline), 2*time.Second)
449+ <-release // deliberately ignores cancellation
450+ return "late warning"
451+ })
452+ srv.WithMirrorWarner(w)
453+ token, revoke := srv.Register(t.Context(), repoName(t, "proj"), domain.Root())
454+ defer revoke()
455+ start := time.Now()
456+ reply := raw(t, sock, `{"token":"`+token+`","hook":"post-receive","updates":[]}`)
457+ assert.True(t, reply.OK)
458+ assert.Empty(t, reply.Message)
459+ assert.Less(t, time.Since(start), 2500*time.Millisecond)
460+}
A internal/adapters/web/mirror.go +34 -0
@@ -0,0 +1,34 @@
1+// SPDX-License-Identifier: AGPL-3.0-or-later
2+
3+package web
4+
5+import (
6+ "context"
7+
8+ "bnema.dev/ermite/internal/domain"
9+ "bnema.dev/ermite/internal/ports"
10+)
11+
12+// MirrorBadge is an administrative diagnostic in the summary rail.
13+type MirrorBadge struct{ State, Reason, Command string }
14+
15+// WithMirrorWarner enables mirror badges. Configure before serving requests.
16+func (s *Server) WithMirrorWarner(w ports.MirrorWarner) *Server {
17+ s.mirrors = w
18+ return s
19+}
20+
21+// mirrorBadge selects presentation only; the source authorizes the lookup and reason.
22+//
23+//hexcheck:ignore suspicious-business-logic-in-adapter controls visibility of an administrative UI indicator
24+func (s *Server) mirrorBadge(ctx context.Context, repo domain.RepoName) *MirrorBadge {
25+ p := principal(ctx)
26+ if s.mirrors == nil || !p.Allows(domain.ScopeRepoAdmin, repo) {
27+ return nil
28+ }
29+ state, reason := s.mirrors.Badge(ctx, p, repo)
30+ if state != domain.MirrorFailing && state != domain.MirrorPaused {
31+ return nil
32+ }
33+ return &MirrorBadge{State: string(state), Reason: reason, Command: "ermite mirror status " + repo.String()}
34+}
@@ -0,0 +1,34 @@
1+// SPDX-License-Identifier: AGPL-3.0-or-later
2+
3+package web
4+
5+import (
6+ "context"
7+
8+ "bnema.dev/ermite/internal/domain"
9+ "bnema.dev/ermite/internal/ports"
10+)
11+
12+// MirrorBadge is an administrative diagnostic in the summary rail.
13+type MirrorBadge struct{ State, Reason, Command string }
14+
15+// WithMirrorWarner enables mirror badges. Configure before serving requests.
16+func (s *Server) WithMirrorWarner(w ports.MirrorWarner) *Server {
17+ s.mirrors = w
18+ return s
19+}
20+
21+// mirrorBadge selects presentation only; the source authorizes the lookup and reason.
22+//
23+//hexcheck:ignore suspicious-business-logic-in-adapter controls visibility of an administrative UI indicator
24+func (s *Server) mirrorBadge(ctx context.Context, repo domain.RepoName) *MirrorBadge {
25+ p := principal(ctx)
26+ if s.mirrors == nil || !p.Allows(domain.ScopeRepoAdmin, repo) {
27+ return nil
28+ }
29+ state, reason := s.mirrors.Badge(ctx, p, repo)
30+ if state != domain.MirrorFailing && state != domain.MirrorPaused {
31+ return nil
32+ }
33+ return &MirrorBadge{State: string(state), Reason: reason, Command: "ermite mirror status " + repo.String()}
34+}
A internal/adapters/web/mirror_test.go +53 -0
@@ -0,0 +1,53 @@
1+// SPDX-License-Identifier: AGPL-3.0-or-later
2+
3+package web
4+
5+import (
6+ "testing"
7+
8+ "github.com/stretchr/testify/assert"
9+ "github.com/stretchr/testify/mock"
10+
11+ "bnema.dev/ermite/internal/domain"
12+ "bnema.dev/ermite/internal/ports/mocks"
13+)
14+
15+func TestMirrorBadge(t *testing.T) {
16+ repo := repoName(t, "proj")
17+ admin := domain.TokenPrincipal(domain.Token{ID: "admin", Scopes: []domain.Scope{domain.ScopeRepoAdmin}, Repos: []domain.RepoName{repo}})
18+ reader := domain.TokenPrincipal(domain.Token{ID: "reader", Scopes: []domain.Scope{domain.ScopeRepoRead}})
19+ for _, tc := range []struct {
20+ name string
21+ p domain.Principal
22+ state domain.MirrorState
23+ shown bool
24+ lookup bool
25+ }{
26+ {"owner failing", domain.Owner(), domain.MirrorFailing, true, true},
27+ {"admin paused", admin, domain.MirrorPaused, true, true},
28+ {"anonymous", domain.Anonymous(), domain.MirrorFailing, false, false},
29+ {"reader", reader, domain.MirrorFailing, false, false},
30+ {"ok", admin, domain.MirrorOK, false, true},
31+ {"disabled", admin, domain.MirrorDisabled, false, true},
32+ } {
33+ t.Run(tc.name, func(t *testing.T) {
34+ w := mocks.NewMirrorWarner(t)
35+ if tc.lookup {
36+ w.EXPECT().Badge(mock.Anything, tc.p, repo).Return(tc.state, "main diverged on remote")
37+ }
38+ s := (&Server{}).WithMirrorWarner(w)
39+ badge := s.mirrorBadge(domain.ContextWithPrincipal(t.Context(), tc.p), repo)
40+ out := renderRail(t, SummaryPage{Mirror: badge})
41+ if tc.shown {
42+ assert.Contains(t, out, `aria-labelledby="r-mirror"`)
43+ assert.Contains(t, out, "Mirror "+string(tc.state))
44+ assert.Contains(t, out, "main diverged on remote")
45+ assert.Contains(t, out, "ermite mirror status proj")
46+ } else {
47+ assert.Nil(t, badge)
48+ assert.NotContains(t, out, `id="r-mirror"`)
49+ }
50+ })
51+ }
52+ assert.Nil(t, (&Server{}).mirrorBadge(domain.ContextWithPrincipal(t.Context(), domain.Owner()), repo))
53+}
@@ -0,0 +1,53 @@
1+// SPDX-License-Identifier: AGPL-3.0-or-later
2+
3+package web
4+
5+import (
6+ "testing"
7+
8+ "github.com/stretchr/testify/assert"
9+ "github.com/stretchr/testify/mock"
10+
11+ "bnema.dev/ermite/internal/domain"
12+ "bnema.dev/ermite/internal/ports/mocks"
13+)
14+
15+func TestMirrorBadge(t *testing.T) {
16+ repo := repoName(t, "proj")
17+ admin := domain.TokenPrincipal(domain.Token{ID: "admin", Scopes: []domain.Scope{domain.ScopeRepoAdmin}, Repos: []domain.RepoName{repo}})
18+ reader := domain.TokenPrincipal(domain.Token{ID: "reader", Scopes: []domain.Scope{domain.ScopeRepoRead}})
19+ for _, tc := range []struct {
20+ name string
21+ p domain.Principal
22+ state domain.MirrorState
23+ shown bool
24+ lookup bool
25+ }{
26+ {"owner failing", domain.Owner(), domain.MirrorFailing, true, true},
27+ {"admin paused", admin, domain.MirrorPaused, true, true},
28+ {"anonymous", domain.Anonymous(), domain.MirrorFailing, false, false},
29+ {"reader", reader, domain.MirrorFailing, false, false},
30+ {"ok", admin, domain.MirrorOK, false, true},
31+ {"disabled", admin, domain.MirrorDisabled, false, true},
32+ } {
33+ t.Run(tc.name, func(t *testing.T) {
34+ w := mocks.NewMirrorWarner(t)
35+ if tc.lookup {
36+ w.EXPECT().Badge(mock.Anything, tc.p, repo).Return(tc.state, "main diverged on remote")
37+ }
38+ s := (&Server{}).WithMirrorWarner(w)
39+ badge := s.mirrorBadge(domain.ContextWithPrincipal(t.Context(), tc.p), repo)
40+ out := renderRail(t, SummaryPage{Mirror: badge})
41+ if tc.shown {
42+ assert.Contains(t, out, `aria-labelledby="r-mirror"`)
43+ assert.Contains(t, out, "Mirror "+string(tc.state))
44+ assert.Contains(t, out, "main diverged on remote")
45+ assert.Contains(t, out, "ermite mirror status proj")
46+ } else {
47+ assert.Nil(t, badge)
48+ assert.NotContains(t, out, `id="r-mirror"`)
49+ }
50+ })
51+ }
52+ assert.Nil(t, (&Server{}).mirrorBadge(domain.ContextWithPrincipal(t.Context(), domain.Owner()), repo))
53+}
M internal/adapters/web/pages.templ +11 -0
@@ -92,6 +92,17 @@ templ latestTagFact(t LatestTag) {
9292 }
9393
9494 templ summaryRail(p SummaryPage) {
95+ if p.Mirror != nil {
96+ <section aria-labelledby="r-mirror">
97+ <h2 id="r-mirror">Mirror</h2>
98+ <p>⚠ Mirror { p.Mirror.State }</p>
99+ if p.Mirror.Reason != "" {
100+ <p>{ p.Mirror.Reason }</p>
101+ }
102+ <p>Run <code>{ p.Mirror.Command }</code></p>
103+ </section>
104+ }
105+
95106 <section aria-labelledby="r-clone"><h2 id="r-clone">Clone</h2>@CloneBlock(p.Clone)
96107 </section>
97108 <section aria-labelledby="r-facts">
@@ -92,6 +92,17 @@ templ latestTagFact(t LatestTag) {
92 }92 }
93 93
94 templ summaryRail(p SummaryPage) {94 templ summaryRail(p SummaryPage) {
95+ if p.Mirror != nil {
96+ <section aria-labelledby="r-mirror">
97+ <h2 id="r-mirror">Mirror</h2>
98+ <p>⚠ Mirror { p.Mirror.State }</p>
99+ if p.Mirror.Reason != "" {
100+ <p>{ p.Mirror.Reason }</p>
101+ }
102+ <p>Run <code>{ p.Mirror.Command }</code></p>
103+ </section>
104+ }
105+
95 <section aria-labelledby="r-clone"><h2 id="r-clone">Clone</h2>@CloneBlock(p.Clone)106 <section aria-labelledby="r-clone"><h2 id="r-clone">Clone</h2>@CloneBlock(p.Clone)
96 </section>107 </section>
97 <section aria-labelledby="r-facts">108 <section aria-labelledby="r-facts">
M internal/adapters/web/pages_templ.go +324 -269
@@ -438,7 +438,62 @@ func summaryRail(p SummaryPage) templ.Component {
438438 templ_7745c5c3_Var22 = templ.NopComponent
439439 }
440440 ctx = templ.ClearChildren(ctx)
441- templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 31, "<section aria-labelledby=\"r-clone\"><h2 id=\"r-clone\">Clone</h2>")
441+ if p.Mirror != nil {
442+ templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 31, "<section aria-labelledby=\"r-mirror\"><h2 id=\"r-mirror\">Mirror</h2><p>⚠ Mirror ")
443+ if templ_7745c5c3_Err != nil {
444+ return templ_7745c5c3_Err
445+ }
446+ var templ_7745c5c3_Var23 string
447+ templ_7745c5c3_Var23, templ_7745c5c3_Err = templ.JoinStringErrs(p.Mirror.State)
448+ if templ_7745c5c3_Err != nil {
449+ return templ.Error{Err: templ_7745c5c3_Err, FileName: `internal/adapters/web/pages.templ`, Line: 98, Col: 33}
450+ }
451+ _, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(templ.EscapeString(templ_7745c5c3_Var23))
452+ if templ_7745c5c3_Err != nil {
453+ return templ_7745c5c3_Err
454+ }
455+ templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 32, "</p>")
456+ if templ_7745c5c3_Err != nil {
457+ return templ_7745c5c3_Err
458+ }
459+ if p.Mirror.Reason != "" {
460+ templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 33, "<p>")
461+ if templ_7745c5c3_Err != nil {
462+ return templ_7745c5c3_Err
463+ }
464+ var templ_7745c5c3_Var24 string
465+ templ_7745c5c3_Var24, templ_7745c5c3_Err = templ.JoinStringErrs(p.Mirror.Reason)
466+ if templ_7745c5c3_Err != nil {
467+ return templ.Error{Err: templ_7745c5c3_Err, FileName: `internal/adapters/web/pages.templ`, Line: 100, Col: 24}
468+ }
469+ _, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(templ.EscapeString(templ_7745c5c3_Var24))
470+ if templ_7745c5c3_Err != nil {
471+ return templ_7745c5c3_Err
472+ }
473+ templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 34, "</p>")
474+ if templ_7745c5c3_Err != nil {
475+ return templ_7745c5c3_Err
476+ }
477+ }
478+ templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 35, "<p>Run <code>")
479+ if templ_7745c5c3_Err != nil {
480+ return templ_7745c5c3_Err
481+ }
482+ var templ_7745c5c3_Var25 string
483+ templ_7745c5c3_Var25, templ_7745c5c3_Err = templ.JoinStringErrs(p.Mirror.Command)
484+ if templ_7745c5c3_Err != nil {
485+ return templ.Error{Err: templ_7745c5c3_Err, FileName: `internal/adapters/web/pages.templ`, Line: 102, Col: 34}
486+ }
487+ _, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(templ.EscapeString(templ_7745c5c3_Var25))
488+ if templ_7745c5c3_Err != nil {
489+ return templ_7745c5c3_Err
490+ }
491+ templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 36, "</code></p></section>")
492+ if templ_7745c5c3_Err != nil {
493+ return templ_7745c5c3_Err
494+ }
495+ }
496+ templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 37, "<section aria-labelledby=\"r-clone\"><h2 id=\"r-clone\">Clone</h2>")
442497 if templ_7745c5c3_Err != nil {
443498 return templ_7745c5c3_Err
444499 }
@@ -446,25 +501,25 @@ func summaryRail(p SummaryPage) templ.Component {
446501 if templ_7745c5c3_Err != nil {
447502 return templ_7745c5c3_Err
448503 }
449- templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 32, "</section><section aria-labelledby=\"r-facts\"><h2 id=\"r-facts\">About</h2><dl class=\"kv\">")
504+ templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 38, "</section><section aria-labelledby=\"r-facts\"><h2 id=\"r-facts\">About</h2><dl class=\"kv\">")
450505 if templ_7745c5c3_Err != nil {
451506 return templ_7745c5c3_Err
452507 }
453508 for _, f := range p.Facts {
454- templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 33, "<dt>")
509+ templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 39, "<dt>")
455510 if templ_7745c5c3_Err != nil {
456511 return templ_7745c5c3_Err
457512 }
458- var templ_7745c5c3_Var23 string
459- templ_7745c5c3_Var23, templ_7745c5c3_Err = templ.JoinStringErrs(f.Key)
513+ var templ_7745c5c3_Var26 string
514+ templ_7745c5c3_Var26, templ_7745c5c3_Err = templ.JoinStringErrs(f.Key)
460515 if templ_7745c5c3_Err != nil {
461- return templ.Error{Err: templ_7745c5c3_Err, FileName: `internal/adapters/web/pages.templ`, Line: 101, Col: 15}
516+ return templ.Error{Err: templ_7745c5c3_Err, FileName: `internal/adapters/web/pages.templ`, Line: 112, Col: 15}
462517 }
463- _, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(templ.EscapeString(templ_7745c5c3_Var23))
518+ _, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(templ.EscapeString(templ_7745c5c3_Var26))
464519 if templ_7745c5c3_Err != nil {
465520 return templ_7745c5c3_Err
466521 }
467- templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 34, "</dt>")
522+ templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 40, "</dt>")
468523 if templ_7745c5c3_Err != nil {
469524 return templ_7745c5c3_Err
470525 }
@@ -479,25 +534,25 @@ func summaryRail(p SummaryPage) templ.Component {
479534 return templ_7745c5c3_Err
480535 }
481536 }
482- templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 35, "</dl></section>")
537+ templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 41, "</dl></section>")
483538 if templ_7745c5c3_Err != nil {
484539 return templ_7745c5c3_Err
485540 }
486541 if len(p.Recent) > 0 {
487- templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 36, "<section aria-labelledby=\"r-recent\"><h2 id=\"r-recent\">Recent commits <a href=\"")
542+ templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 42, "<section aria-labelledby=\"r-recent\"><h2 id=\"r-recent\">Recent commits <a href=\"")
488543 if templ_7745c5c3_Err != nil {
489544 return templ_7745c5c3_Err
490545 }
491- var templ_7745c5c3_Var24 templ.SafeURL
492- templ_7745c5c3_Var24, templ_7745c5c3_Err = templ.JoinURLErrs(templ.SafeURL(p.AllHref))
546+ var templ_7745c5c3_Var27 templ.SafeURL
547+ templ_7745c5c3_Var27, templ_7745c5c3_Err = templ.JoinURLErrs(templ.SafeURL(p.AllHref))
493548 if templ_7745c5c3_Err != nil {
494- return templ.Error{Err: templ_7745c5c3_Err, FileName: `internal/adapters/web/pages.templ`, Line: 110, Col: 105}
549+ return templ.Error{Err: templ_7745c5c3_Err, FileName: `internal/adapters/web/pages.templ`, Line: 121, Col: 105}
495550 }
496- _, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(templ.EscapeString(templ_7745c5c3_Var24))
551+ _, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(templ.EscapeString(templ_7745c5c3_Var27))
497552 if templ_7745c5c3_Err != nil {
498553 return templ_7745c5c3_Err
499554 }
500- templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 37, "\">View all</a></h2>")
555+ templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 43, "\">View all</a></h2>")
501556 if templ_7745c5c3_Err != nil {
502557 return templ_7745c5c3_Err
503558 }
@@ -505,7 +560,7 @@ func summaryRail(p SummaryPage) templ.Component {
505560 if templ_7745c5c3_Err != nil {
506561 return templ_7745c5c3_Err
507562 }
508- templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 38, "</section>")
563+ templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 44, "</section>")
509564 if templ_7745c5c3_Err != nil {
510565 return templ_7745c5c3_Err
511566 }
@@ -517,7 +572,7 @@ func summaryRail(p SummaryPage) templ.Component {
517572 }
518573 }
519574 if len(p.Outline) > 0 && p.Readme != nil {
520- templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 39, "<section aria-labelledby=\"r-outline\"><h2 id=\"r-outline\">On this page</h2>")
575+ templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 45, "<section aria-labelledby=\"r-outline\"><h2 id=\"r-outline\">On this page</h2>")
521576 if templ_7745c5c3_Err != nil {
522577 return templ_7745c5c3_Err
523578 }
@@ -525,7 +580,7 @@ func summaryRail(p SummaryPage) templ.Component {
525580 if templ_7745c5c3_Err != nil {
526581 return templ_7745c5c3_Err
527582 }
528- templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 40, "</section>")
583+ templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 46, "</section>")
529584 if templ_7745c5c3_Err != nil {
530585 return templ_7745c5c3_Err
531586 }
@@ -551,12 +606,12 @@ func Refs(l Layout, p RefsPage) templ.Component {
551606 }()
552607 }
553608 ctx = templ.InitializeContext(ctx)
554- templ_7745c5c3_Var25 := templ.GetChildren(ctx)
555- if templ_7745c5c3_Var25 == nil {
556- templ_7745c5c3_Var25 = templ.NopComponent
609+ templ_7745c5c3_Var28 := templ.GetChildren(ctx)
610+ if templ_7745c5c3_Var28 == nil {
611+ templ_7745c5c3_Var28 = templ.NopComponent
557612 }
558613 ctx = templ.ClearChildren(ctx)
559- templ_7745c5c3_Var26 := templruntime.GeneratedTemplate(func(templ_7745c5c3_Input templruntime.GeneratedComponentInput) (templ_7745c5c3_Err error) {
614+ templ_7745c5c3_Var29 := templruntime.GeneratedTemplate(func(templ_7745c5c3_Input templruntime.GeneratedComponentInput) (templ_7745c5c3_Err error) {
560615 templ_7745c5c3_W, ctx := templ_7745c5c3_Input.Writer, templ_7745c5c3_Input.Context
561616 templ_7745c5c3_Buffer, templ_7745c5c3_IsBuffer := templruntime.GetBuffer(templ_7745c5c3_W)
562617 if !templ_7745c5c3_IsBuffer {
@@ -568,7 +623,7 @@ func Refs(l Layout, p RefsPage) templ.Component {
568623 }()
569624 }
570625 ctx = templ.InitializeContext(ctx)
571- templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 41, "<div class=\"filter\"><label for=\"ref-filter\" class=\"sr\">filter</label> <input id=\"ref-filter\" type=\"search\" data-filter=\"#ref-rows > tr\" placeholder=\"Filter branches and tags…\" autocomplete=\"off\" hx-on:input=\"ermite.filter(this)\"></div><table class=\"list refs\" aria-label=\"Branches and tags\"><thead><tr><th class=\"c-kind\">kind</th><th class=\"c-name\">name</th><th class=\"c-sha\">commit</th><th class=\"c-sub\">subject</th><th class=\"c-when\">date</th></tr></thead>")
626+ templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 47, "<div class=\"filter\"><label for=\"ref-filter\" class=\"sr\">filter</label> <input id=\"ref-filter\" type=\"search\" data-filter=\"#ref-rows > tr\" placeholder=\"Filter branches and tags…\" autocomplete=\"off\" hx-on:input=\"ermite.filter(this)\"></div><table class=\"list refs\" aria-label=\"Branches and tags\"><thead><tr><th class=\"c-kind\">kind</th><th class=\"c-name\">name</th><th class=\"c-sha\">commit</th><th class=\"c-sub\">subject</th><th class=\"c-when\">date</th></tr></thead>")
572627 if templ_7745c5c3_Err != nil {
573628 return templ_7745c5c3_Err
574629 }
@@ -576,32 +631,32 @@ func Refs(l Layout, p RefsPage) templ.Component {
576631 if templ_7745c5c3_Err != nil {
577632 return templ_7745c5c3_Err
578633 }
579- templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 42, "</table>")
634+ templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 48, "</table>")
580635 if templ_7745c5c3_Err != nil {
581636 return templ_7745c5c3_Err
582637 }
583638 if p.Note != "" {
584- templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 43, "<p class=\"note\">")
639+ templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 49, "<p class=\"note\">")
585640 if templ_7745c5c3_Err != nil {
586641 return templ_7745c5c3_Err
587642 }
588- var templ_7745c5c3_Var27 string
589- templ_7745c5c3_Var27, templ_7745c5c3_Err = templ.JoinStringErrs(p.Note)
643+ var templ_7745c5c3_Var30 string
644+ templ_7745c5c3_Var30, templ_7745c5c3_Err = templ.JoinStringErrs(p.Note)
590645 if templ_7745c5c3_Err != nil {
591- return templ.Error{Err: templ_7745c5c3_Err, FileName: `internal/adapters/web/pages.templ`, Line: 143, Col: 27}
646+ return templ.Error{Err: templ_7745c5c3_Err, FileName: `internal/adapters/web/pages.templ`, Line: 154, Col: 27}
592647 }
593- _, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(templ.EscapeString(templ_7745c5c3_Var27))
648+ _, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(templ.EscapeString(templ_7745c5c3_Var30))
594649 if templ_7745c5c3_Err != nil {
595650 return templ_7745c5c3_Err
596651 }
597- templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 44, "</p>")
652+ templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 50, "</p>")
598653 if templ_7745c5c3_Err != nil {
599654 return templ_7745c5c3_Err
600655 }
601656 }
602657 return nil
603658 })
604- templ_7745c5c3_Err = Shell(l, refsRail(p)).Render(templ.WithChildren(ctx, templ_7745c5c3_Var26), templ_7745c5c3_Buffer)
659+ templ_7745c5c3_Err = Shell(l, refsRail(p)).Render(templ.WithChildren(ctx, templ_7745c5c3_Var29), templ_7745c5c3_Buffer)
605660 if templ_7745c5c3_Err != nil {
606661 return templ_7745c5c3_Err
607662 }
@@ -625,112 +680,112 @@ func refRow(kind string, r RefRow) templ.Component {
625680 }()
626681 }
627682 ctx = templ.InitializeContext(ctx)
628- templ_7745c5c3_Var28 := templ.GetChildren(ctx)
629- if templ_7745c5c3_Var28 == nil {
630- templ_7745c5c3_Var28 = templ.NopComponent
683+ templ_7745c5c3_Var31 := templ.GetChildren(ctx)
684+ if templ_7745c5c3_Var31 == nil {
685+ templ_7745c5c3_Var31 = templ.NopComponent
631686 }
632687 ctx = templ.ClearChildren(ctx)
633- templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 45, "<tr")
688+ templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 51, "<tr")
634689 if templ_7745c5c3_Err != nil {
635690 return templ_7745c5c3_Err
636691 }
637692 if r.Cursor {
638- templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 46, " data-cursor")
693+ templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 52, " data-cursor")
639694 if templ_7745c5c3_Err != nil {
640695 return templ_7745c5c3_Err
641696 }
642697 }
643- templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 47, "><td class=\"c-kind mute\">")
698+ templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 53, "><td class=\"c-kind mute\">")
644699 if templ_7745c5c3_Err != nil {
645700 return templ_7745c5c3_Err
646701 }
647- var templ_7745c5c3_Var29 string
648- templ_7745c5c3_Var29, templ_7745c5c3_Err = templ.JoinStringErrs(kind)
702+ var templ_7745c5c3_Var32 string
703+ templ_7745c5c3_Var32, templ_7745c5c3_Err = templ.JoinStringErrs(kind)
649704 if templ_7745c5c3_Err != nil {
650- return templ.Error{Err: templ_7745c5c3_Err, FileName: `internal/adapters/web/pages.templ`, Line: 150, Col: 32}
705+ return templ.Error{Err: templ_7745c5c3_Err, FileName: `internal/adapters/web/pages.templ`, Line: 161, Col: 32}
651706 }
652- _, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(templ.EscapeString(templ_7745c5c3_Var29))
707+ _, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(templ.EscapeString(templ_7745c5c3_Var32))
653708 if templ_7745c5c3_Err != nil {
654709 return templ_7745c5c3_Err
655710 }
656- templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 48, "</td><td class=\"c-name\"><a href=\"")
711+ templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 54, "</td><td class=\"c-name\"><a href=\"")
657712 if templ_7745c5c3_Err != nil {
658713 return templ_7745c5c3_Err
659714 }
660- var templ_7745c5c3_Var30 templ.SafeURL
661- templ_7745c5c3_Var30, templ_7745c5c3_Err = templ.JoinURLErrs(templ.SafeURL(r.Href))
715+ var templ_7745c5c3_Var33 templ.SafeURL
716+ templ_7745c5c3_Var33, templ_7745c5c3_Err = templ.JoinURLErrs(templ.SafeURL(r.Href))
662717 if templ_7745c5c3_Err != nil {
663- return templ.Error{Err: templ_7745c5c3_Err, FileName: `internal/adapters/web/pages.templ`, Line: 152, Col: 34}
718+ return templ.Error{Err: templ_7745c5c3_Err, FileName: `internal/adapters/web/pages.templ`, Line: 163, Col: 34}
664719 }
665- _, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(templ.EscapeString(templ_7745c5c3_Var30))
720+ _, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(templ.EscapeString(templ_7745c5c3_Var33))
666721 if templ_7745c5c3_Err != nil {
667722 return templ_7745c5c3_Err
668723 }
669- templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 49, "\">")
724+ templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 55, "\">")
670725 if templ_7745c5c3_Err != nil {
671726 return templ_7745c5c3_Err
672727 }
673- var templ_7745c5c3_Var31 string
674- templ_7745c5c3_Var31, templ_7745c5c3_Err = templ.JoinStringErrs(r.Name)
728+ var templ_7745c5c3_Var34 string
729+ templ_7745c5c3_Var34, templ_7745c5c3_Err = templ.JoinStringErrs(r.Name)
675730 if templ_7745c5c3_Err != nil {
676- return templ.Error{Err: templ_7745c5c3_Err, FileName: `internal/adapters/web/pages.templ`, Line: 152, Col: 45}
731+ return templ.Error{Err: templ_7745c5c3_Err, FileName: `internal/adapters/web/pages.templ`, Line: 163, Col: 45}
677732 }
678- _, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(templ.EscapeString(templ_7745c5c3_Var31))
733+ _, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(templ.EscapeString(templ_7745c5c3_Var34))
679734 if templ_7745c5c3_Err != nil {
680735 return templ_7745c5c3_Err
681736 }
682- templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 50, "</a> ")
737+ templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 56, "</a> ")
683738 if templ_7745c5c3_Err != nil {
684739 return templ_7745c5c3_Err
685740 }
686741 if r.Default {
687- templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 51, "<span class=\"pill\">default</span>")
742+ templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 57, "<span class=\"pill\">default</span>")
688743 if templ_7745c5c3_Err != nil {
689744 return templ_7745c5c3_Err
690745 }
691746 }
692- templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 52, "</td><td class=\"c-sha\">")
747+ templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 58, "</td><td class=\"c-sha\">")
693748 if templ_7745c5c3_Err != nil {
694749 return templ_7745c5c3_Err
695750 }
696751 if r.CHref != "" {
697- templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 53, "<a href=\"")
752+ templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 59, "<a href=\"")
698753 if templ_7745c5c3_Err != nil {
699754 return templ_7745c5c3_Err
700755 }
701- var templ_7745c5c3_Var32 templ.SafeURL
702- templ_7745c5c3_Var32, templ_7745c5c3_Err = templ.JoinURLErrs(templ.SafeURL(r.CHref))
756+ var templ_7745c5c3_Var35 templ.SafeURL
757+ templ_7745c5c3_Var35, templ_7745c5c3_Err = templ.JoinURLErrs(templ.SafeURL(r.CHref))
703758 if templ_7745c5c3_Err != nil {
704- return templ.Error{Err: templ_7745c5c3_Err, FileName: `internal/adapters/web/pages.templ`, Line: 159, Col: 36}
759+ return templ.Error{Err: templ_7745c5c3_Err, FileName: `internal/adapters/web/pages.templ`, Line: 170, Col: 36}
705760 }
706- _, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(templ.EscapeString(templ_7745c5c3_Var32))
761+ _, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(templ.EscapeString(templ_7745c5c3_Var35))
707762 if templ_7745c5c3_Err != nil {
708763 return templ_7745c5c3_Err
709764 }
710- templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 54, "\">")
765+ templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 60, "\">")
711766 if templ_7745c5c3_Err != nil {
712767 return templ_7745c5c3_Err
713768 }
714- var templ_7745c5c3_Var33 string
715- templ_7745c5c3_Var33, templ_7745c5c3_Err = templ.JoinStringErrs(r.Short)
769+ var templ_7745c5c3_Var36 string
770+ templ_7745c5c3_Var36, templ_7745c5c3_Err = templ.JoinStringErrs(r.Short)
716771 if templ_7745c5c3_Err != nil {
717- return templ.Error{Err: templ_7745c5c3_Err, FileName: `internal/adapters/web/pages.templ`, Line: 159, Col: 48}
772+ return templ.Error{Err: templ_7745c5c3_Err, FileName: `internal/adapters/web/pages.templ`, Line: 170, Col: 48}
718773 }
719- _, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(templ.EscapeString(templ_7745c5c3_Var33))
774+ _, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(templ.EscapeString(templ_7745c5c3_Var36))
720775 if templ_7745c5c3_Err != nil {
721776 return templ_7745c5c3_Err
722777 }
723- templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 55, "</a>")
778+ templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 61, "</a>")
724779 if templ_7745c5c3_Err != nil {
725780 return templ_7745c5c3_Err
726781 }
727782 } else {
728- var templ_7745c5c3_Var34 string
729- templ_7745c5c3_Var34, templ_7745c5c3_Err = templ.JoinStringErrs(r.Short)
783+ var templ_7745c5c3_Var37 string
784+ templ_7745c5c3_Var37, templ_7745c5c3_Err = templ.JoinStringErrs(r.Short)
730785 if templ_7745c5c3_Err != nil {
731- return templ.Error{Err: templ_7745c5c3_Err, FileName: `internal/adapters/web/pages.templ`, Line: 161, Col: 13}
786+ return templ.Error{Err: templ_7745c5c3_Err, FileName: `internal/adapters/web/pages.templ`, Line: 172, Col: 13}
732787 }
733- _, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(templ.EscapeString(templ_7745c5c3_Var34))
788+ _, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(templ.EscapeString(templ_7745c5c3_Var37))
734789 if templ_7745c5c3_Err != nil {
735790 return templ_7745c5c3_Err
736791 }
@@ -739,69 +794,69 @@ func refRow(kind string, r RefRow) templ.Component {
739794 if templ_7745c5c3_Err != nil {
740795 return templ_7745c5c3_Err
741796 }
742- templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 56, "</td><td class=\"c-sub\">")
797+ templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 62, "</td><td class=\"c-sub\">")
743798 if templ_7745c5c3_Err != nil {
744799 return templ_7745c5c3_Err
745800 }
746- var templ_7745c5c3_Var35 string
747- templ_7745c5c3_Var35, templ_7745c5c3_Err = templ.JoinStringErrs(r.Subject)
801+ var templ_7745c5c3_Var38 string
802+ templ_7745c5c3_Var38, templ_7745c5c3_Err = templ.JoinStringErrs(r.Subject)
748803 if templ_7745c5c3_Err != nil {
749- return templ.Error{Err: templ_7745c5c3_Err, FileName: `internal/adapters/web/pages.templ`, Line: 165, Col: 31}
804+ return templ.Error{Err: templ_7745c5c3_Err, FileName: `internal/adapters/web/pages.templ`, Line: 176, Col: 31}
750805 }
751- _, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(templ.EscapeString(templ_7745c5c3_Var35))
806+ _, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(templ.EscapeString(templ_7745c5c3_Var38))
752807 if templ_7745c5c3_Err != nil {
753808 return templ_7745c5c3_Err
754809 }
755- templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 57, "</td><td class=\"c-when dim\">")
810+ templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 63, "</td><td class=\"c-when dim\">")
756811 if templ_7745c5c3_Err != nil {
757812 return templ_7745c5c3_Err
758813 }
759814 if r.WhenAt != "" {
760- templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 58, "<time datetime=\"")
815+ templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 64, "<time datetime=\"")
761816 if templ_7745c5c3_Err != nil {
762817 return templ_7745c5c3_Err
763818 }
764- var templ_7745c5c3_Var36 string
765- templ_7745c5c3_Var36, templ_7745c5c3_Err = templ.ResolveAttributeValue(r.WhenAt)
819+ var templ_7745c5c3_Var39 string
820+ templ_7745c5c3_Var39, templ_7745c5c3_Err = templ.ResolveAttributeValue(r.WhenAt)
766821 if templ_7745c5c3_Err != nil {
767- return templ.Error{Err: templ_7745c5c3_Err, FileName: `internal/adapters/web/pages.templ`, Line: 168, Col: 29}
822+ return templ.Error{Err: templ_7745c5c3_Err, FileName: `internal/adapters/web/pages.templ`, Line: 179, Col: 29}
768823 }
769- _, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(templ_7745c5c3_Var36)
824+ _, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(templ_7745c5c3_Var39)
770825 if templ_7745c5c3_Err != nil {
771826 return templ_7745c5c3_Err
772827 }
773- templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 59, "\" title=\"")
828+ templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 65, "\" title=\"")
774829 if templ_7745c5c3_Err != nil {
775830 return templ_7745c5c3_Err
776831 }
777- var templ_7745c5c3_Var37 string
778- templ_7745c5c3_Var37, templ_7745c5c3_Err = templ.ResolveAttributeValue(r.WhenAt)
832+ var templ_7745c5c3_Var40 string
833+ templ_7745c5c3_Var40, templ_7745c5c3_Err = templ.ResolveAttributeValue(r.WhenAt)
779834 if templ_7745c5c3_Err != nil {
780- return templ.Error{Err: templ_7745c5c3_Err, FileName: `internal/adapters/web/pages.templ`, Line: 168, Col: 48}
835+ return templ.Error{Err: templ_7745c5c3_Err, FileName: `internal/adapters/web/pages.templ`, Line: 179, Col: 48}
781836 }
782- _, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(templ_7745c5c3_Var37)
837+ _, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(templ_7745c5c3_Var40)
783838 if templ_7745c5c3_Err != nil {
784839 return templ_7745c5c3_Err
785840 }
786- templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 60, "\">")
841+ templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 66, "\">")
787842 if templ_7745c5c3_Err != nil {
788843 return templ_7745c5c3_Err
789844 }
790- var templ_7745c5c3_Var38 string
791- templ_7745c5c3_Var38, templ_7745c5c3_Err = templ.JoinStringErrs(r.When)
845+ var templ_7745c5c3_Var41 string
846+ templ_7745c5c3_Var41, templ_7745c5c3_Err = templ.JoinStringErrs(r.When)
792847 if templ_7745c5c3_Err != nil {
793- return templ.Error{Err: templ_7745c5c3_Err, FileName: `internal/adapters/web/pages.templ`, Line: 168, Col: 59}
848+ return templ.Error{Err: templ_7745c5c3_Err, FileName: `internal/adapters/web/pages.templ`, Line: 179, Col: 59}
794849 }
795- _, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(templ.EscapeString(templ_7745c5c3_Var38))
850+ _, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(templ.EscapeString(templ_7745c5c3_Var41))
796851 if templ_7745c5c3_Err != nil {
797852 return templ_7745c5c3_Err
798853 }
799- templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 61, "</time>")
854+ templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 67, "</time>")
800855 if templ_7745c5c3_Err != nil {
801856 return templ_7745c5c3_Err
802857 }
803858 }
804- templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 62, "</td></tr>")
859+ templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 68, "</td></tr>")
805860 if templ_7745c5c3_Err != nil {
806861 return templ_7745c5c3_Err
807862 }
@@ -825,12 +880,12 @@ func refsRail(p RefsPage) templ.Component {
825880 }()
826881 }
827882 ctx = templ.InitializeContext(ctx)
828- templ_7745c5c3_Var39 := templ.GetChildren(ctx)
829- if templ_7745c5c3_Var39 == nil {
830- templ_7745c5c3_Var39 = templ.NopComponent
883+ templ_7745c5c3_Var42 := templ.GetChildren(ctx)
884+ if templ_7745c5c3_Var42 == nil {
885+ templ_7745c5c3_Var42 = templ.NopComponent
831886 }
832887 ctx = templ.ClearChildren(ctx)
833- templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 63, "<section aria-labelledby=\"r-refs\"><h2 id=\"r-refs\">Overview</h2>")
888+ templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 69, "<section aria-labelledby=\"r-refs\"><h2 id=\"r-refs\">Overview</h2>")
834889 if templ_7745c5c3_Err != nil {
835890 return templ_7745c5c3_Err
836891 }
@@ -838,7 +893,7 @@ func refsRail(p RefsPage) templ.Component {
838893 if templ_7745c5c3_Err != nil {
839894 return templ_7745c5c3_Err
840895 }
841- templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 64, "</section>")
896+ templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 70, "</section>")
842897 if templ_7745c5c3_Err != nil {
843898 return templ_7745c5c3_Err
844899 }
@@ -863,12 +918,12 @@ func State(l Layout, p StatePage) templ.Component {
863918 }()
864919 }
865920 ctx = templ.InitializeContext(ctx)
866- templ_7745c5c3_Var40 := templ.GetChildren(ctx)
867- if templ_7745c5c3_Var40 == nil {
868- templ_7745c5c3_Var40 = templ.NopComponent
921+ templ_7745c5c3_Var43 := templ.GetChildren(ctx)
922+ if templ_7745c5c3_Var43 == nil {
923+ templ_7745c5c3_Var43 = templ.NopComponent
869924 }
870925 ctx = templ.ClearChildren(ctx)
871- templ_7745c5c3_Var41 := templruntime.GeneratedTemplate(func(templ_7745c5c3_Input templruntime.GeneratedComponentInput) (templ_7745c5c3_Err error) {
926+ templ_7745c5c3_Var44 := templruntime.GeneratedTemplate(func(templ_7745c5c3_Input templruntime.GeneratedComponentInput) (templ_7745c5c3_Err error) {
872927 templ_7745c5c3_W, ctx := templ_7745c5c3_Input.Writer, templ_7745c5c3_Input.Context
873928 templ_7745c5c3_Buffer, templ_7745c5c3_IsBuffer := templruntime.GetBuffer(templ_7745c5c3_W)
874929 if !templ_7745c5c3_IsBuffer {
@@ -880,51 +935,51 @@ func State(l Layout, p StatePage) templ.Component {
880935 }()
881936 }
882937 ctx = templ.InitializeContext(ctx)
883- templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 65, "<section class=\"state\" aria-labelledby=\"state-title\"><p class=\"eyebrow\">")
938+ templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 71, "<section class=\"state\" aria-labelledby=\"state-title\"><p class=\"eyebrow\">")
884939 if templ_7745c5c3_Err != nil {
885940 return templ_7745c5c3_Err
886941 }
887- var templ_7745c5c3_Var42 string
888- templ_7745c5c3_Var42, templ_7745c5c3_Err = templ.JoinStringErrs(p.Code)
942+ var templ_7745c5c3_Var45 string
943+ templ_7745c5c3_Var45, templ_7745c5c3_Err = templ.JoinStringErrs(p.Code)
889944 if templ_7745c5c3_Err != nil {
890- return templ.Error{Err: templ_7745c5c3_Err, FileName: `internal/adapters/web/pages.templ`, Line: 185, Col: 30}
945+ return templ.Error{Err: templ_7745c5c3_Err, FileName: `internal/adapters/web/pages.templ`, Line: 196, Col: 30}
891946 }
892- _, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(templ.EscapeString(templ_7745c5c3_Var42))
947+ _, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(templ.EscapeString(templ_7745c5c3_Var45))
893948 if templ_7745c5c3_Err != nil {
894949 return templ_7745c5c3_Err
895950 }
896- templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 66, "</p><h1 id=\"state-title\">")
951+ templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 72, "</p><h1 id=\"state-title\">")
897952 if templ_7745c5c3_Err != nil {
898953 return templ_7745c5c3_Err
899954 }
900- var templ_7745c5c3_Var43 string
901- templ_7745c5c3_Var43, templ_7745c5c3_Err = templ.JoinStringErrs(p.Title)
955+ var templ_7745c5c3_Var46 string
956+ templ_7745c5c3_Var46, templ_7745c5c3_Err = templ.JoinStringErrs(p.Title)
902957 if templ_7745c5c3_Err != nil {
903- return templ.Error{Err: templ_7745c5c3_Err, FileName: `internal/adapters/web/pages.templ`, Line: 186, Col: 33}
958+ return templ.Error{Err: templ_7745c5c3_Err, FileName: `internal/adapters/web/pages.templ`, Line: 197, Col: 33}
904959 }
905- _, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(templ.EscapeString(templ_7745c5c3_Var43))
960+ _, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(templ.EscapeString(templ_7745c5c3_Var46))
906961 if templ_7745c5c3_Err != nil {
907962 return templ_7745c5c3_Err
908963 }
909- templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 67, "</h1>")
964+ templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 73, "</h1>")
910965 if templ_7745c5c3_Err != nil {
911966 return templ_7745c5c3_Err
912967 }
913968 for _, line := range p.Lines {
914- templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 68, "<p class=\"dim\">")
969+ templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 74, "<p class=\"dim\">")
915970 if templ_7745c5c3_Err != nil {
916971 return templ_7745c5c3_Err
917972 }
918- var templ_7745c5c3_Var44 string
919- templ_7745c5c3_Var44, templ_7745c5c3_Err = templ.JoinStringErrs(line)
973+ var templ_7745c5c3_Var47 string
974+ templ_7745c5c3_Var47, templ_7745c5c3_Err = templ.JoinStringErrs(line)
920975 if templ_7745c5c3_Err != nil {
921- return templ.Error{Err: templ_7745c5c3_Err, FileName: `internal/adapters/web/pages.templ`, Line: 188, Col: 25}
976+ return templ.Error{Err: templ_7745c5c3_Err, FileName: `internal/adapters/web/pages.templ`, Line: 199, Col: 25}
922977 }
923- _, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(templ.EscapeString(templ_7745c5c3_Var44))
978+ _, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(templ.EscapeString(templ_7745c5c3_Var47))
924979 if templ_7745c5c3_Err != nil {
925980 return templ_7745c5c3_Err
926981 }
927- templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 69, "</p>")
982+ templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 75, "</p>")
928983 if templ_7745c5c3_Err != nil {
929984 return templ_7745c5c3_Err
930985 }
@@ -935,49 +990,49 @@ func State(l Layout, p StatePage) templ.Component {
935990 return templ_7745c5c3_Err
936991 }
937992 }
938- templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 70, "<p class=\"state-back\">")
993+ templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 76, "<p class=\"state-back\">")
939994 if templ_7745c5c3_Err != nil {
940995 return templ_7745c5c3_Err
941996 }
942997 for _, b := range p.Back {
943- templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 71, "<a href=\"")
998+ templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 77, "<a href=\"")
944999 if templ_7745c5c3_Err != nil {
9451000 return templ_7745c5c3_Err
9461001 }
947- var templ_7745c5c3_Var45 templ.SafeURL
948- templ_7745c5c3_Var45, templ_7745c5c3_Err = templ.JoinURLErrs(templ.SafeURL(b.Href))
1002+ var templ_7745c5c3_Var48 templ.SafeURL
1003+ templ_7745c5c3_Var48, templ_7745c5c3_Err = templ.JoinURLErrs(templ.SafeURL(b.Href))
9491004 if templ_7745c5c3_Err != nil {
950- return templ.Error{Err: templ_7745c5c3_Err, FileName: `internal/adapters/web/pages.templ`, Line: 195, Col: 36}
1005+ return templ.Error{Err: templ_7745c5c3_Err, FileName: `internal/adapters/web/pages.templ`, Line: 206, Col: 36}
9511006 }
952- _, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(templ.EscapeString(templ_7745c5c3_Var45))
1007+ _, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(templ.EscapeString(templ_7745c5c3_Var48))
9531008 if templ_7745c5c3_Err != nil {
9541009 return templ_7745c5c3_Err
9551010 }
956- templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 72, "\">")
1011+ templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 78, "\">")
9571012 if templ_7745c5c3_Err != nil {
9581013 return templ_7745c5c3_Err
9591014 }
960- var templ_7745c5c3_Var46 string
961- templ_7745c5c3_Var46, templ_7745c5c3_Err = templ.JoinStringErrs(b.Label)
1015+ var templ_7745c5c3_Var49 string
1016+ templ_7745c5c3_Var49, templ_7745c5c3_Err = templ.JoinStringErrs(b.Label)
9621017 if templ_7745c5c3_Err != nil {
963- return templ.Error{Err: templ_7745c5c3_Err, FileName: `internal/adapters/web/pages.templ`, Line: 195, Col: 48}
1018+ return templ.Error{Err: templ_7745c5c3_Err, FileName: `internal/adapters/web/pages.templ`, Line: 206, Col: 48}
9641019 }
965- _, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(templ.EscapeString(templ_7745c5c3_Var46))
1020+ _, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(templ.EscapeString(templ_7745c5c3_Var49))
9661021 if templ_7745c5c3_Err != nil {
9671022 return templ_7745c5c3_Err
9681023 }
969- templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 73, "</a>")
1024+ templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 79, "</a>")
9701025 if templ_7745c5c3_Err != nil {
9711026 return templ_7745c5c3_Err
9721027 }
9731028 }
974- templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 74, "</p></section>")
1029+ templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 80, "</p></section>")
9751030 if templ_7745c5c3_Err != nil {
9761031 return templ_7745c5c3_Err
9771032 }
9781033 return nil
9791034 })
980- templ_7745c5c3_Err = Shell(l, nil).Render(templ.WithChildren(ctx, templ_7745c5c3_Var41), templ_7745c5c3_Buffer)
1035+ templ_7745c5c3_Err = Shell(l, nil).Render(templ.WithChildren(ctx, templ_7745c5c3_Var44), templ_7745c5c3_Buffer)
9811036 if templ_7745c5c3_Err != nil {
9821037 return templ_7745c5c3_Err
9831038 }
@@ -1006,12 +1061,12 @@ func Login(l Layout, p LoginPage) templ.Component {
10061061 }()
10071062 }
10081063 ctx = templ.InitializeContext(ctx)
1009- templ_7745c5c3_Var47 := templ.GetChildren(ctx)
1010- if templ_7745c5c3_Var47 == nil {
1011- templ_7745c5c3_Var47 = templ.NopComponent
1064+ templ_7745c5c3_Var50 := templ.GetChildren(ctx)
1065+ if templ_7745c5c3_Var50 == nil {
1066+ templ_7745c5c3_Var50 = templ.NopComponent
10121067 }
10131068 ctx = templ.ClearChildren(ctx)
1014- templ_7745c5c3_Var48 := templruntime.GeneratedTemplate(func(templ_7745c5c3_Input templruntime.GeneratedComponentInput) (templ_7745c5c3_Err error) {
1069+ templ_7745c5c3_Var51 := templruntime.GeneratedTemplate(func(templ_7745c5c3_Input templruntime.GeneratedComponentInput) (templ_7745c5c3_Err error) {
10151070 templ_7745c5c3_W, ctx := templ_7745c5c3_Input.Writer, templ_7745c5c3_Input.Context
10161071 templ_7745c5c3_Buffer, templ_7745c5c3_IsBuffer := templruntime.GetBuffer(templ_7745c5c3_W)
10171072 if !templ_7745c5c3_IsBuffer {
@@ -1023,75 +1078,75 @@ func Login(l Layout, p LoginPage) templ.Component {
10231078 }()
10241079 }
10251080 ctx = templ.InitializeContext(ctx)
1026- templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 75, "<section class=\"state\" aria-labelledby=\"state-title\"><h1 id=\"state-title\">")
1081+ templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 81, "<section class=\"state\" aria-labelledby=\"state-title\"><h1 id=\"state-title\">")
10271082 if templ_7745c5c3_Err != nil {
10281083 return templ_7745c5c3_Err
10291084 }
1030- var templ_7745c5c3_Var49 string
1031- templ_7745c5c3_Var49, templ_7745c5c3_Err = templ.JoinStringErrs(p.Title)
1085+ var templ_7745c5c3_Var52 string
1086+ templ_7745c5c3_Var52, templ_7745c5c3_Err = templ.JoinStringErrs(p.Title)
10321087 if templ_7745c5c3_Err != nil {
1033- return templ.Error{Err: templ_7745c5c3_Err, FileName: `internal/adapters/web/pages.templ`, Line: 210, Col: 33}
1088+ return templ.Error{Err: templ_7745c5c3_Err, FileName: `internal/adapters/web/pages.templ`, Line: 221, Col: 33}
10341089 }
1035- _, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(templ.EscapeString(templ_7745c5c3_Var49))
1090+ _, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(templ.EscapeString(templ_7745c5c3_Var52))
10361091 if templ_7745c5c3_Err != nil {
10371092 return templ_7745c5c3_Err
10381093 }
1039- templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 76, "</h1>")
1094+ templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 82, "</h1>")
10401095 if templ_7745c5c3_Err != nil {
10411096 return templ_7745c5c3_Err
10421097 }
10431098 for _, line := range p.Lines {
1044- templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 77, "<p class=\"dim\">")
1099+ templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 83, "<p class=\"dim\">")
10451100 if templ_7745c5c3_Err != nil {
10461101 return templ_7745c5c3_Err
10471102 }
1048- var templ_7745c5c3_Var50 string
1049- templ_7745c5c3_Var50, templ_7745c5c3_Err = templ.JoinStringErrs(line)
1103+ var templ_7745c5c3_Var53 string
1104+ templ_7745c5c3_Var53, templ_7745c5c3_Err = templ.JoinStringErrs(line)
10501105 if templ_7745c5c3_Err != nil {
1051- return templ.Error{Err: templ_7745c5c3_Err, FileName: `internal/adapters/web/pages.templ`, Line: 212, Col: 25}
1106+ return templ.Error{Err: templ_7745c5c3_Err, FileName: `internal/adapters/web/pages.templ`, Line: 223, Col: 25}
10521107 }
1053- _, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(templ.EscapeString(templ_7745c5c3_Var50))
1108+ _, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(templ.EscapeString(templ_7745c5c3_Var53))
10541109 if templ_7745c5c3_Err != nil {
10551110 return templ_7745c5c3_Err
10561111 }
1057- templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 78, "</p>")
1112+ templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 84, "</p>")
10581113 if templ_7745c5c3_Err != nil {
10591114 return templ_7745c5c3_Err
10601115 }
10611116 }
1062- templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 79, "<form class=\"state-act\" method=\"post\" action=\"")
1117+ templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 85, "<form class=\"state-act\" method=\"post\" action=\"")
10631118 if templ_7745c5c3_Err != nil {
10641119 return templ_7745c5c3_Err
10651120 }
1066- var templ_7745c5c3_Var51 templ.SafeURL
1067- templ_7745c5c3_Var51, templ_7745c5c3_Err = templ.JoinURLErrs(templ.SafeURL(p.Action))
1121+ var templ_7745c5c3_Var54 templ.SafeURL
1122+ templ_7745c5c3_Var54, templ_7745c5c3_Err = templ.JoinURLErrs(templ.SafeURL(p.Action))
10681123 if templ_7745c5c3_Err != nil {
1069- return templ.Error{Err: templ_7745c5c3_Err, FileName: `internal/adapters/web/pages.templ`, Line: 214, Col: 73}
1124+ return templ.Error{Err: templ_7745c5c3_Err, FileName: `internal/adapters/web/pages.templ`, Line: 225, Col: 73}
10701125 }
1071- _, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(templ.EscapeString(templ_7745c5c3_Var51))
1126+ _, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(templ.EscapeString(templ_7745c5c3_Var54))
10721127 if templ_7745c5c3_Err != nil {
10731128 return templ_7745c5c3_Err
10741129 }
1075- templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 80, "\" data-autosubmit><button type=\"submit\" class=\"btn primary\">")
1130+ templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 86, "\" data-autosubmit><button type=\"submit\" class=\"btn primary\">")
10761131 if templ_7745c5c3_Err != nil {
10771132 return templ_7745c5c3_Err
10781133 }
1079- var templ_7745c5c3_Var52 string
1080- templ_7745c5c3_Var52, templ_7745c5c3_Err = templ.JoinStringErrs(p.Button)
1134+ var templ_7745c5c3_Var55 string
1135+ templ_7745c5c3_Var55, templ_7745c5c3_Err = templ.JoinStringErrs(p.Button)
10811136 if templ_7745c5c3_Err != nil {
1082- return templ.Error{Err: templ_7745c5c3_Err, FileName: `internal/adapters/web/pages.templ`, Line: 215, Col: 56}
1137+ return templ.Error{Err: templ_7745c5c3_Err, FileName: `internal/adapters/web/pages.templ`, Line: 226, Col: 56}
10831138 }
1084- _, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(templ.EscapeString(templ_7745c5c3_Var52))
1139+ _, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(templ.EscapeString(templ_7745c5c3_Var55))
10851140 if templ_7745c5c3_Err != nil {
10861141 return templ_7745c5c3_Err
10871142 }
1088- templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 81, "</button></form><p class=\"state-back\"><a href=\"/\">Back to home</a></p></section>")
1143+ templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 87, "</button></form><p class=\"state-back\"><a href=\"/\">Back to home</a></p></section>")
10891144 if templ_7745c5c3_Err != nil {
10901145 return templ_7745c5c3_Err
10911146 }
10921147 return nil
10931148 })
1094- templ_7745c5c3_Err = Shell(l, nil).Render(templ.WithChildren(ctx, templ_7745c5c3_Var48), templ_7745c5c3_Buffer)
1149+ templ_7745c5c3_Err = Shell(l, nil).Render(templ.WithChildren(ctx, templ_7745c5c3_Var51), templ_7745c5c3_Buffer)
10951150 if templ_7745c5c3_Err != nil {
10961151 return templ_7745c5c3_Err
10971152 }
@@ -1117,12 +1172,12 @@ func PasskeyLogin(l Layout, p PasskeyLoginPage) templ.Component {
11171172 }()
11181173 }
11191174 ctx = templ.InitializeContext(ctx)
1120- templ_7745c5c3_Var53 := templ.GetChildren(ctx)
1121- if templ_7745c5c3_Var53 == nil {
1122- templ_7745c5c3_Var53 = templ.NopComponent
1175+ templ_7745c5c3_Var56 := templ.GetChildren(ctx)
1176+ if templ_7745c5c3_Var56 == nil {
1177+ templ_7745c5c3_Var56 = templ.NopComponent
11231178 }
11241179 ctx = templ.ClearChildren(ctx)
1125- templ_7745c5c3_Var54 := templruntime.GeneratedTemplate(func(templ_7745c5c3_Input templruntime.GeneratedComponentInput) (templ_7745c5c3_Err error) {
1180+ templ_7745c5c3_Var57 := templruntime.GeneratedTemplate(func(templ_7745c5c3_Input templruntime.GeneratedComponentInput) (templ_7745c5c3_Err error) {
11261181 templ_7745c5c3_W, ctx := templ_7745c5c3_Input.Writer, templ_7745c5c3_Input.Context
11271182 templ_7745c5c3_Buffer, templ_7745c5c3_IsBuffer := templruntime.GetBuffer(templ_7745c5c3_W)
11281183 if !templ_7745c5c3_IsBuffer {
@@ -1134,88 +1189,88 @@ func PasskeyLogin(l Layout, p PasskeyLoginPage) templ.Component {
11341189 }()
11351190 }
11361191 ctx = templ.InitializeContext(ctx)
1137- templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 82, "<section class=\"state\" aria-labelledby=\"state-title\"><h1 id=\"state-title\">")
1192+ templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 88, "<section class=\"state\" aria-labelledby=\"state-title\"><h1 id=\"state-title\">")
11381193 if templ_7745c5c3_Err != nil {
11391194 return templ_7745c5c3_Err
11401195 }
1141- var templ_7745c5c3_Var55 string
1142- templ_7745c5c3_Var55, templ_7745c5c3_Err = templ.JoinStringErrs(p.Title)
1196+ var templ_7745c5c3_Var58 string
1197+ templ_7745c5c3_Var58, templ_7745c5c3_Err = templ.JoinStringErrs(p.Title)
11431198 if templ_7745c5c3_Err != nil {
1144- return templ.Error{Err: templ_7745c5c3_Err, FileName: `internal/adapters/web/pages.templ`, Line: 227, Col: 33}
1199+ return templ.Error{Err: templ_7745c5c3_Err, FileName: `internal/adapters/web/pages.templ`, Line: 238, Col: 33}
11451200 }
1146- _, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(templ.EscapeString(templ_7745c5c3_Var55))
1201+ _, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(templ.EscapeString(templ_7745c5c3_Var58))
11471202 if templ_7745c5c3_Err != nil {
11481203 return templ_7745c5c3_Err
11491204 }
1150- templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 83, "</h1><form class=\"state-act\" data-js data-passkey-form><button type=\"submit\" class=\"btn primary\" data-passkey=\"login\" data-begin=\"")
1205+ templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 89, "</h1><form class=\"state-act\" data-js data-passkey-form><button type=\"submit\" class=\"btn primary\" data-passkey=\"login\" data-begin=\"")
11511206 if templ_7745c5c3_Err != nil {
11521207 return templ_7745c5c3_Err
11531208 }
1154- var templ_7745c5c3_Var56 string
1155- templ_7745c5c3_Var56, templ_7745c5c3_Err = templ.ResolveAttributeValue(p.Begin)
1209+ var templ_7745c5c3_Var59 string
1210+ templ_7745c5c3_Var59, templ_7745c5c3_Err = templ.ResolveAttributeValue(p.Begin)
11561211 if templ_7745c5c3_Err != nil {
1157- return templ.Error{Err: templ_7745c5c3_Err, FileName: `internal/adapters/web/pages.templ`, Line: 229, Col: 87}
1212+ return templ.Error{Err: templ_7745c5c3_Err, FileName: `internal/adapters/web/pages.templ`, Line: 240, Col: 87}
11581213 }
1159- _, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(templ_7745c5c3_Var56)
1214+ _, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(templ_7745c5c3_Var59)
11601215 if templ_7745c5c3_Err != nil {
11611216 return templ_7745c5c3_Err
11621217 }
1163- templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 84, "\" data-finish=\"")
1218+ templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 90, "\" data-finish=\"")
11641219 if templ_7745c5c3_Err != nil {
11651220 return templ_7745c5c3_Err
11661221 }
1167- var templ_7745c5c3_Var57 string
1168- templ_7745c5c3_Var57, templ_7745c5c3_Err = templ.ResolveAttributeValue(p.Finish)
1222+ var templ_7745c5c3_Var60 string
1223+ templ_7745c5c3_Var60, templ_7745c5c3_Err = templ.ResolveAttributeValue(p.Finish)
11691224 if templ_7745c5c3_Err != nil {
1170- return templ.Error{Err: templ_7745c5c3_Err, FileName: `internal/adapters/web/pages.templ`, Line: 229, Col: 112}
1225+ return templ.Error{Err: templ_7745c5c3_Err, FileName: `internal/adapters/web/pages.templ`, Line: 240, Col: 112}
11711226 }
1172- _, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(templ_7745c5c3_Var57)
1227+ _, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(templ_7745c5c3_Var60)
11731228 if templ_7745c5c3_Err != nil {
11741229 return templ_7745c5c3_Err
11751230 }
1176- templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 85, "\">")
1231+ templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 91, "\">")
11771232 if templ_7745c5c3_Err != nil {
11781233 return templ_7745c5c3_Err
11791234 }
1180- var templ_7745c5c3_Var58 string
1181- templ_7745c5c3_Var58, templ_7745c5c3_Err = templ.JoinStringErrs(p.Button)
1235+ var templ_7745c5c3_Var61 string
1236+ templ_7745c5c3_Var61, templ_7745c5c3_Err = templ.JoinStringErrs(p.Button)
11821237 if templ_7745c5c3_Err != nil {
1183- return templ.Error{Err: templ_7745c5c3_Err, FileName: `internal/adapters/web/pages.templ`, Line: 229, Col: 125}
1238+ return templ.Error{Err: templ_7745c5c3_Err, FileName: `internal/adapters/web/pages.templ`, Line: 240, Col: 125}
11841239 }
1185- _, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(templ.EscapeString(templ_7745c5c3_Var58))
1240+ _, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(templ.EscapeString(templ_7745c5c3_Var61))
11861241 if templ_7745c5c3_Err != nil {
11871242 return templ_7745c5c3_Err
11881243 }
1189- templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 86, "</button></form><p class=\"dim\" role=\"status\" aria-live=\"polite\" data-passkey-status></p>")
1244+ templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 92, "</button></form><p class=\"dim\" role=\"status\" aria-live=\"polite\" data-passkey-status></p>")
11901245 if templ_7745c5c3_Err != nil {
11911246 return templ_7745c5c3_Err
11921247 }
11931248 for _, line := range p.Lines {
1194- templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 87, "<p class=\"dim\">")
1249+ templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 93, "<p class=\"dim\">")
11951250 if templ_7745c5c3_Err != nil {
11961251 return templ_7745c5c3_Err
11971252 }
1198- var templ_7745c5c3_Var59 string
1199- templ_7745c5c3_Var59, templ_7745c5c3_Err = templ.JoinStringErrs(line)
1253+ var templ_7745c5c3_Var62 string
1254+ templ_7745c5c3_Var62, templ_7745c5c3_Err = templ.JoinStringErrs(line)
12001255 if templ_7745c5c3_Err != nil {
1201- return templ.Error{Err: templ_7745c5c3_Err, FileName: `internal/adapters/web/pages.templ`, Line: 233, Col: 25}
1256+ return templ.Error{Err: templ_7745c5c3_Err, FileName: `internal/adapters/web/pages.templ`, Line: 244, Col: 25}
12021257 }
1203- _, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(templ.EscapeString(templ_7745c5c3_Var59))
1258+ _, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(templ.EscapeString(templ_7745c5c3_Var62))
12041259 if templ_7745c5c3_Err != nil {
12051260 return templ_7745c5c3_Err
12061261 }
1207- templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 88, "</p>")
1262+ templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 94, "</p>")
12081263 if templ_7745c5c3_Err != nil {
12091264 return templ_7745c5c3_Err
12101265 }
12111266 }
1212- templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 89, "<p class=\"state-back\"><a href=\"/\">Back to home</a></p></section>")
1267+ templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 95, "<p class=\"state-back\"><a href=\"/\">Back to home</a></p></section>")
12131268 if templ_7745c5c3_Err != nil {
12141269 return templ_7745c5c3_Err
12151270 }
12161271 return nil
12171272 })
1218- templ_7745c5c3_Err = Shell(l, nil).Render(templ.WithChildren(ctx, templ_7745c5c3_Var54), templ_7745c5c3_Buffer)
1273+ templ_7745c5c3_Err = Shell(l, nil).Render(templ.WithChildren(ctx, templ_7745c5c3_Var57), templ_7745c5c3_Buffer)
12191274 if templ_7745c5c3_Err != nil {
12201275 return templ_7745c5c3_Err
12211276 }
@@ -1240,12 +1295,12 @@ func Passkeys(l Layout, p PasskeysPage) templ.Component {
12401295 }()
12411296 }
12421297 ctx = templ.InitializeContext(ctx)
1243- templ_7745c5c3_Var60 := templ.GetChildren(ctx)
1244- if templ_7745c5c3_Var60 == nil {
1245- templ_7745c5c3_Var60 = templ.NopComponent
1298+ templ_7745c5c3_Var63 := templ.GetChildren(ctx)
1299+ if templ_7745c5c3_Var63 == nil {
1300+ templ_7745c5c3_Var63 = templ.NopComponent
12461301 }
12471302 ctx = templ.ClearChildren(ctx)
1248- templ_7745c5c3_Var61 := templruntime.GeneratedTemplate(func(templ_7745c5c3_Input templruntime.GeneratedComponentInput) (templ_7745c5c3_Err error) {
1303+ templ_7745c5c3_Var64 := templruntime.GeneratedTemplate(func(templ_7745c5c3_Input templruntime.GeneratedComponentInput) (templ_7745c5c3_Err error) {
12491304 templ_7745c5c3_W, ctx := templ_7745c5c3_Input.Writer, templ_7745c5c3_Input.Context
12501305 templ_7745c5c3_Buffer, templ_7745c5c3_IsBuffer := templruntime.GetBuffer(templ_7745c5c3_W)
12511306 if !templ_7745c5c3_IsBuffer {
@@ -1257,231 +1312,231 @@ func Passkeys(l Layout, p PasskeysPage) templ.Component {
12571312 }()
12581313 }
12591314 ctx = templ.InitializeContext(ctx)
1260- templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 90, "<h2 class=\"rule-h\"><span>Passkeys</span><span class=\"count\">")
1315+ templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 96, "<h2 class=\"rule-h\"><span>Passkeys</span><span class=\"count\">")
12611316 if templ_7745c5c3_Err != nil {
12621317 return templ_7745c5c3_Err
12631318 }
1264- var templ_7745c5c3_Var62 string
1265- templ_7745c5c3_Var62, templ_7745c5c3_Err = templ.JoinStringErrs(itoa(len(p.Rows)))
1319+ var templ_7745c5c3_Var65 string
1320+ templ_7745c5c3_Var65, templ_7745c5c3_Err = templ.JoinStringErrs(itoa(len(p.Rows)))
12661321 if templ_7745c5c3_Err != nil {
1267- return templ.Error{Err: templ_7745c5c3_Err, FileName: `internal/adapters/web/pages.templ`, Line: 243, Col: 81}
1322+ return templ.Error{Err: templ_7745c5c3_Err, FileName: `internal/adapters/web/pages.templ`, Line: 254, Col: 81}
12681323 }
1269- _, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(templ.EscapeString(templ_7745c5c3_Var62))
1324+ _, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(templ.EscapeString(templ_7745c5c3_Var65))
12701325 if templ_7745c5c3_Err != nil {
12711326 return templ_7745c5c3_Err
12721327 }
1273- templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 91, "</span></h2><p class=\"dim\">A passkey signs you in from this device or your phone, without a terminal. Removing one signs every browser out.</p>")
1328+ templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 97, "</span></h2><p class=\"dim\">A passkey signs you in from this device or your phone, without a terminal. Removing one signs every browser out.</p>")
12741329 if templ_7745c5c3_Err != nil {
12751330 return templ_7745c5c3_Err
12761331 }
12771332 if len(p.Rows) > 0 {
1278- templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 92, "<table class=\"list passkeys\" aria-label=\"Passkeys\"><thead><tr><th class=\"c-name\">Name</th><th class=\"c-when\">Created</th><th class=\"c-when\">Last used</th><th class=\"c-sync\">Synced</th><th class=\"c-act\"><span class=\"sr\">Remove</span></th></tr></thead> <tbody>")
1333+ templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 98, "<table class=\"list passkeys\" aria-label=\"Passkeys\"><thead><tr><th class=\"c-name\">Name</th><th class=\"c-when\">Created</th><th class=\"c-when\">Last used</th><th class=\"c-sync\">Synced</th><th class=\"c-act\"><span class=\"sr\">Remove</span></th></tr></thead> <tbody>")
12791334 if templ_7745c5c3_Err != nil {
12801335 return templ_7745c5c3_Err
12811336 }
12821337 for _, r := range p.Rows {
1283- templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 93, "<tr><td class=\"c-name\">")
1338+ templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 99, "<tr><td class=\"c-name\">")
12841339 if templ_7745c5c3_Err != nil {
12851340 return templ_7745c5c3_Err
12861341 }
1287- var templ_7745c5c3_Var63 string
1288- templ_7745c5c3_Var63, templ_7745c5c3_Err = templ.JoinStringErrs(r.Name)
1342+ var templ_7745c5c3_Var66 string
1343+ templ_7745c5c3_Var66, templ_7745c5c3_Err = templ.JoinStringErrs(r.Name)
12891344 if templ_7745c5c3_Err != nil {
1290- return templ.Error{Err: templ_7745c5c3_Err, FileName: `internal/adapters/web/pages.templ`, Line: 259, Col: 34}
1345+ return templ.Error{Err: templ_7745c5c3_Err, FileName: `internal/adapters/web/pages.templ`, Line: 270, Col: 34}
12911346 }
1292- _, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(templ.EscapeString(templ_7745c5c3_Var63))
1347+ _, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(templ.EscapeString(templ_7745c5c3_Var66))
12931348 if templ_7745c5c3_Err != nil {
12941349 return templ_7745c5c3_Err
12951350 }
1296- templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 94, "</td><td class=\"c-when nowrap\"><time")
1351+ templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 100, "</td><td class=\"c-when nowrap\"><time")
12971352 if templ_7745c5c3_Err != nil {
12981353 return templ_7745c5c3_Err
12991354 }
13001355 if r.CreatedAt != "" {
1301- templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 95, " datetime=\"")
1356+ templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 101, " datetime=\"")
13021357 if templ_7745c5c3_Err != nil {
13031358 return templ_7745c5c3_Err
13041359 }
1305- var templ_7745c5c3_Var64 string
1306- templ_7745c5c3_Var64, templ_7745c5c3_Err = templ.ResolveAttributeValue(r.CreatedAt)
1360+ var templ_7745c5c3_Var67 string
1361+ templ_7745c5c3_Var67, templ_7745c5c3_Err = templ.ResolveAttributeValue(r.CreatedAt)
13071362 if templ_7745c5c3_Err != nil {
1308- return templ.Error{Err: templ_7745c5c3_Err, FileName: `internal/adapters/web/pages.templ`, Line: 263, Col: 32}
1363+ return templ.Error{Err: templ_7745c5c3_Err, FileName: `internal/adapters/web/pages.templ`, Line: 274, Col: 32}
13091364 }
1310- _, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(templ_7745c5c3_Var64)
1365+ _, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(templ_7745c5c3_Var67)
13111366 if templ_7745c5c3_Err != nil {
13121367 return templ_7745c5c3_Err
13131368 }
1314- templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 96, "\"")
1369+ templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 102, "\"")
13151370 if templ_7745c5c3_Err != nil {
13161371 return templ_7745c5c3_Err
13171372 }
13181373 }
1319- templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 97, ">")
1374+ templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 103, ">")
13201375 if templ_7745c5c3_Err != nil {
13211376 return templ_7745c5c3_Err
13221377 }
1323- var templ_7745c5c3_Var65 string
1324- templ_7745c5c3_Var65, templ_7745c5c3_Err = templ.JoinStringErrs(r.Created)
1378+ var templ_7745c5c3_Var68 string
1379+ templ_7745c5c3_Var68, templ_7745c5c3_Err = templ.JoinStringErrs(r.Created)
13251380 if templ_7745c5c3_Err != nil {
1326- return templ.Error{Err: templ_7745c5c3_Err, FileName: `internal/adapters/web/pages.templ`, Line: 265, Col: 20}
1381+ return templ.Error{Err: templ_7745c5c3_Err, FileName: `internal/adapters/web/pages.templ`, Line: 276, Col: 20}
13271382 }
1328- _, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(templ.EscapeString(templ_7745c5c3_Var65))
1383+ _, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(templ.EscapeString(templ_7745c5c3_Var68))
13291384 if templ_7745c5c3_Err != nil {
13301385 return templ_7745c5c3_Err
13311386 }
1332- templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 98, "</time></td><td class=\"c-when nowrap\"><time")
1387+ templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 104, "</time></td><td class=\"c-when nowrap\"><time")
13331388 if templ_7745c5c3_Err != nil {
13341389 return templ_7745c5c3_Err
13351390 }
13361391 if r.LastUsedAt != "" {
1337- templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 99, " datetime=\"")
1392+ templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 105, " datetime=\"")
13381393 if templ_7745c5c3_Err != nil {
13391394 return templ_7745c5c3_Err
13401395 }
1341- var templ_7745c5c3_Var66 string
1342- templ_7745c5c3_Var66, templ_7745c5c3_Err = templ.ResolveAttributeValue(r.LastUsedAt)
1396+ var templ_7745c5c3_Var69 string
1397+ templ_7745c5c3_Var69, templ_7745c5c3_Err = templ.ResolveAttributeValue(r.LastUsedAt)
13431398 if templ_7745c5c3_Err != nil {
1344- return templ.Error{Err: templ_7745c5c3_Err, FileName: `internal/adapters/web/pages.templ`, Line: 270, Col: 33}
1399+ return templ.Error{Err: templ_7745c5c3_Err, FileName: `internal/adapters/web/pages.templ`, Line: 281, Col: 33}
13451400 }
1346- _, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(templ_7745c5c3_Var66)
1401+ _, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(templ_7745c5c3_Var69)
13471402 if templ_7745c5c3_Err != nil {
13481403 return templ_7745c5c3_Err
13491404 }
1350- templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 100, "\"")
1405+ templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 106, "\"")
13511406 if templ_7745c5c3_Err != nil {
13521407 return templ_7745c5c3_Err
13531408 }
13541409 }
1355- templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 101, ">")
1410+ templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 107, ">")
13561411 if templ_7745c5c3_Err != nil {
13571412 return templ_7745c5c3_Err
13581413 }
1359- var templ_7745c5c3_Var67 string
1360- templ_7745c5c3_Var67, templ_7745c5c3_Err = templ.JoinStringErrs(r.LastUsed)
1414+ var templ_7745c5c3_Var70 string
1415+ templ_7745c5c3_Var70, templ_7745c5c3_Err = templ.JoinStringErrs(r.LastUsed)
13611416 if templ_7745c5c3_Err != nil {
1362- return templ.Error{Err: templ_7745c5c3_Err, FileName: `internal/adapters/web/pages.templ`, Line: 272, Col: 21}
1417+ return templ.Error{Err: templ_7745c5c3_Err, FileName: `internal/adapters/web/pages.templ`, Line: 283, Col: 21}
13631418 }
1364- _, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(templ.EscapeString(templ_7745c5c3_Var67))
1419+ _, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(templ.EscapeString(templ_7745c5c3_Var70))
13651420 if templ_7745c5c3_Err != nil {
13661421 return templ_7745c5c3_Err
13671422 }
1368- templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 102, "</time></td><td class=\"c-sync\">")
1423+ templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 108, "</time></td><td class=\"c-sync\">")
13691424 if templ_7745c5c3_Err != nil {
13701425 return templ_7745c5c3_Err
13711426 }
13721427 if r.Synced {
1373- templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 103, "yes")
1428+ templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 109, "yes")
13741429 if templ_7745c5c3_Err != nil {
13751430 return templ_7745c5c3_Err
13761431 }
13771432 } else {
1378- templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 104, "no")
1433+ templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 110, "no")
13791434 if templ_7745c5c3_Err != nil {
13801435 return templ_7745c5c3_Err
13811436 }
13821437 }
1383- templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 105, "</td><td class=\"c-act\"><form method=\"post\" action=\"")
1438+ templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 111, "</td><td class=\"c-act\"><form method=\"post\" action=\"")
13841439 if templ_7745c5c3_Err != nil {
13851440 return templ_7745c5c3_Err
13861441 }
1387- var templ_7745c5c3_Var68 templ.SafeURL
1388- templ_7745c5c3_Var68, templ_7745c5c3_Err = templ.JoinURLErrs(templ.SafeURL(r.Remove))
1442+ var templ_7745c5c3_Var71 templ.SafeURL
1443+ templ_7745c5c3_Var71, templ_7745c5c3_Err = templ.JoinURLErrs(templ.SafeURL(r.Remove))
13891444 if templ_7745c5c3_Err != nil {
1390- return templ.Error{Err: templ_7745c5c3_Err, FileName: `internal/adapters/web/pages.templ`, Line: 282, Col: 60}
1445+ return templ.Error{Err: templ_7745c5c3_Err, FileName: `internal/adapters/web/pages.templ`, Line: 293, Col: 60}
13911446 }
1392- _, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(templ.EscapeString(templ_7745c5c3_Var68))
1447+ _, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(templ.EscapeString(templ_7745c5c3_Var71))
13931448 if templ_7745c5c3_Err != nil {
13941449 return templ_7745c5c3_Err
13951450 }
1396- templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 106, "\"><button type=\"submit\" class=\"btn danger\" aria-label=\"")
1451+ templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 112, "\"><button type=\"submit\" class=\"btn danger\" aria-label=\"")
13971452 if templ_7745c5c3_Err != nil {
13981453 return templ_7745c5c3_Err
13991454 }
1400- var templ_7745c5c3_Var69 string
1401- templ_7745c5c3_Var69, templ_7745c5c3_Err = templ.ResolveAttributeValue("Remove passkey " + r.Name)
1455+ var templ_7745c5c3_Var72 string
1456+ templ_7745c5c3_Var72, templ_7745c5c3_Err = templ.ResolveAttributeValue("Remove passkey " + r.Name)
14021457 if templ_7745c5c3_Err != nil {
1403- return templ.Error{Err: templ_7745c5c3_Err, FileName: `internal/adapters/web/pages.templ`, Line: 283, Col: 89}
1458+ return templ.Error{Err: templ_7745c5c3_Err, FileName: `internal/adapters/web/pages.templ`, Line: 294, Col: 89}
14041459 }
1405- _, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(templ_7745c5c3_Var69)
1460+ _, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(templ_7745c5c3_Var72)
14061461 if templ_7745c5c3_Err != nil {
14071462 return templ_7745c5c3_Err
14081463 }
1409- templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 107, "\">Remove</button></form></td></tr>")
1464+ templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 113, "\">Remove</button></form></td></tr>")
14101465 if templ_7745c5c3_Err != nil {
14111466 return templ_7745c5c3_Err
14121467 }
14131468 }
1414- templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 108, "</tbody></table>")
1469+ templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 114, "</tbody></table>")
14151470 if templ_7745c5c3_Err != nil {
14161471 return templ_7745c5c3_Err
14171472 }
14181473 } else {
1419- templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 109, "<p class=\"lede dim\">no passkeys yet.</p>")
1474+ templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 115, "<p class=\"lede dim\">no passkeys yet.</p>")
14201475 if templ_7745c5c3_Err != nil {
14211476 return templ_7745c5c3_Err
14221477 }
14231478 }
1424- templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 110, " ")
1479+ templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 116, " ")
14251480 if templ_7745c5c3_Err != nil {
14261481 return templ_7745c5c3_Err
14271482 }
14281483 if p.Full {
1429- templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 111, "<p class=\"dim\">")
1484+ templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 117, "<p class=\"dim\">")
14301485 if templ_7745c5c3_Err != nil {
14311486 return templ_7745c5c3_Err
14321487 }
1433- var templ_7745c5c3_Var70 string
1434- templ_7745c5c3_Var70, templ_7745c5c3_Err = templ.JoinStringErrs(itoa(p.Max))
1488+ var templ_7745c5c3_Var73 string
1489+ templ_7745c5c3_Var73, templ_7745c5c3_Err = templ.JoinStringErrs(itoa(p.Max))
14351490 if templ_7745c5c3_Err != nil {
1436- return templ.Error{Err: templ_7745c5c3_Err, FileName: `internal/adapters/web/pages.templ`, Line: 294, Col: 31}
1491+ return templ.Error{Err: templ_7745c5c3_Err, FileName: `internal/adapters/web/pages.templ`, Line: 305, Col: 31}
14371492 }
1438- _, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(templ.EscapeString(templ_7745c5c3_Var70))
1493+ _, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(templ.EscapeString(templ_7745c5c3_Var73))
14391494 if templ_7745c5c3_Err != nil {
14401495 return templ_7745c5c3_Err
14411496 }
1442- templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 112, " passkeys are registered, the most there can be. Remove one to add another.</p>")
1497+ templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 118, " passkeys are registered, the most there can be. Remove one to add another.</p>")
14431498 if templ_7745c5c3_Err != nil {
14441499 return templ_7745c5c3_Err
14451500 }
14461501 } else {
1447- templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 113, "<form class=\"passkey-add\" data-js data-passkey-form><label for=\"passkey-name\" class=\"sr\">Name of the new passkey</label> <input id=\"passkey-name\" type=\"text\" placeholder=\"Name, for example Pixel 9\" autocomplete=\"off\" data-passkey-name> <button type=\"submit\" class=\"btn primary\" data-passkey=\"register\" data-begin=\"")
1502+ templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 119, "<form class=\"passkey-add\" data-js data-passkey-form><label for=\"passkey-name\" class=\"sr\">Name of the new passkey</label> <input id=\"passkey-name\" type=\"text\" placeholder=\"Name, for example Pixel 9\" autocomplete=\"off\" data-passkey-name> <button type=\"submit\" class=\"btn primary\" data-passkey=\"register\" data-begin=\"")
14481503 if templ_7745c5c3_Err != nil {
14491504 return templ_7745c5c3_Err
14501505 }
1451- var templ_7745c5c3_Var71 string
1452- templ_7745c5c3_Var71, templ_7745c5c3_Err = templ.ResolveAttributeValue(p.Begin)
1506+ var templ_7745c5c3_Var74 string
1507+ templ_7745c5c3_Var74, templ_7745c5c3_Err = templ.ResolveAttributeValue(p.Begin)
14531508 if templ_7745c5c3_Err != nil {
1454- return templ.Error{Err: templ_7745c5c3_Err, FileName: `internal/adapters/web/pages.templ`, Line: 299, Col: 90}
1509+ return templ.Error{Err: templ_7745c5c3_Err, FileName: `internal/adapters/web/pages.templ`, Line: 310, Col: 90}
14551510 }
1456- _, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(templ_7745c5c3_Var71)
1511+ _, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(templ_7745c5c3_Var74)
14571512 if templ_7745c5c3_Err != nil {
14581513 return templ_7745c5c3_Err
14591514 }
1460- templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 114, "\" data-finish=\"")
1515+ templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 120, "\" data-finish=\"")
14611516 if templ_7745c5c3_Err != nil {
14621517 return templ_7745c5c3_Err
14631518 }
1464- var templ_7745c5c3_Var72 string
1465- templ_7745c5c3_Var72, templ_7745c5c3_Err = templ.ResolveAttributeValue(p.Finish)
1519+ var templ_7745c5c3_Var75 string
1520+ templ_7745c5c3_Var75, templ_7745c5c3_Err = templ.ResolveAttributeValue(p.Finish)
14661521 if templ_7745c5c3_Err != nil {
1467- return templ.Error{Err: templ_7745c5c3_Err, FileName: `internal/adapters/web/pages.templ`, Line: 299, Col: 115}
1522+ return templ.Error{Err: templ_7745c5c3_Err, FileName: `internal/adapters/web/pages.templ`, Line: 310, Col: 115}
14681523 }
1469- _, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(templ_7745c5c3_Var72)
1524+ _, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(templ_7745c5c3_Var75)
14701525 if templ_7745c5c3_Err != nil {
14711526 return templ_7745c5c3_Err
14721527 }
1473- templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 115, "\">Add a passkey</button></form>")
1528+ templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 121, "\">Add a passkey</button></form>")
14741529 if templ_7745c5c3_Err != nil {
14751530 return templ_7745c5c3_Err
14761531 }
14771532 }
1478- templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 116, " <p class=\"dim\" role=\"status\" aria-live=\"polite\" data-passkey-status></p>")
1533+ templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 122, " <p class=\"dim\" role=\"status\" aria-live=\"polite\" data-passkey-status></p>")
14791534 if templ_7745c5c3_Err != nil {
14801535 return templ_7745c5c3_Err
14811536 }
14821537 return nil
14831538 })
1484- templ_7745c5c3_Err = Shell(l, nil).Render(templ.WithChildren(ctx, templ_7745c5c3_Var61), templ_7745c5c3_Buffer)
1539+ templ_7745c5c3_Err = Shell(l, nil).Render(templ.WithChildren(ctx, templ_7745c5c3_Var64), templ_7745c5c3_Buffer)
14851540 if templ_7745c5c3_Err != nil {
14861541 return templ_7745c5c3_Err
14871542 }
@@ -438,7 +438,62 @@ func summaryRail(p SummaryPage) templ.Component {
438 templ_7745c5c3_Var22 = templ.NopComponent438 templ_7745c5c3_Var22 = templ.NopComponent
439 }439 }
440 ctx = templ.ClearChildren(ctx)440 ctx = templ.ClearChildren(ctx)
441- templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 31, "<section aria-labelledby=\"r-clone\"><h2 id=\"r-clone\">Clone</h2>")441+ if p.Mirror != nil {
442+ templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 31, "<section aria-labelledby=\"r-mirror\"><h2 id=\"r-mirror\">Mirror</h2><p>⚠ Mirror ")
443+ if templ_7745c5c3_Err != nil {
444+ return templ_7745c5c3_Err
445+ }
446+ var templ_7745c5c3_Var23 string
447+ templ_7745c5c3_Var23, templ_7745c5c3_Err = templ.JoinStringErrs(p.Mirror.State)
448+ if templ_7745c5c3_Err != nil {
449+ return templ.Error{Err: templ_7745c5c3_Err, FileName: `internal/adapters/web/pages.templ`, Line: 98, Col: 33}
450+ }
451+ _, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(templ.EscapeString(templ_7745c5c3_Var23))
452+ if templ_7745c5c3_Err != nil {
453+ return templ_7745c5c3_Err
454+ }
455+ templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 32, "</p>")
456+ if templ_7745c5c3_Err != nil {
457+ return templ_7745c5c3_Err
458+ }
459+ if p.Mirror.Reason != "" {
460+ templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 33, "<p>")
461+ if templ_7745c5c3_Err != nil {
462+ return templ_7745c5c3_Err
463+ }
464+ var templ_7745c5c3_Var24 string
465+ templ_7745c5c3_Var24, templ_7745c5c3_Err = templ.JoinStringErrs(p.Mirror.Reason)
466+ if templ_7745c5c3_Err != nil {
467+ return templ.Error{Err: templ_7745c5c3_Err, FileName: `internal/adapters/web/pages.templ`, Line: 100, Col: 24}
468+ }
469+ _, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(templ.EscapeString(templ_7745c5c3_Var24))
470+ if templ_7745c5c3_Err != nil {
471+ return templ_7745c5c3_Err
472+ }
473+ templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 34, "</p>")
474+ if templ_7745c5c3_Err != nil {
475+ return templ_7745c5c3_Err
476+ }
477+ }
478+ templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 35, "<p>Run <code>")
479+ if templ_7745c5c3_Err != nil {
480+ return templ_7745c5c3_Err
481+ }
482+ var templ_7745c5c3_Var25 string
483+ templ_7745c5c3_Var25, templ_7745c5c3_Err = templ.JoinStringErrs(p.Mirror.Command)
484+ if templ_7745c5c3_Err != nil {
485+ return templ.Error{Err: templ_7745c5c3_Err, FileName: `internal/adapters/web/pages.templ`, Line: 102, Col: 34}
486+ }
487+ _, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(templ.EscapeString(templ_7745c5c3_Var25))
488+ if templ_7745c5c3_Err != nil {
489+ return templ_7745c5c3_Err
490+ }
491+ templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 36, "</code></p></section>")
492+ if templ_7745c5c3_Err != nil {
493+ return templ_7745c5c3_Err
494+ }
495+ }
496+ templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 37, "<section aria-labelledby=\"r-clone\"><h2 id=\"r-clone\">Clone</h2>")
442 if templ_7745c5c3_Err != nil {497 if templ_7745c5c3_Err != nil {
443 return templ_7745c5c3_Err498 return templ_7745c5c3_Err
444 }499 }
@@ -446,25 +501,25 @@ func summaryRail(p SummaryPage) templ.Component {
446 if templ_7745c5c3_Err != nil {501 if templ_7745c5c3_Err != nil {
447 return templ_7745c5c3_Err502 return templ_7745c5c3_Err
448 }503 }
449- templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 32, "</section><section aria-labelledby=\"r-facts\"><h2 id=\"r-facts\">About</h2><dl class=\"kv\">")504+ templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 38, "</section><section aria-labelledby=\"r-facts\"><h2 id=\"r-facts\">About</h2><dl class=\"kv\">")
450 if templ_7745c5c3_Err != nil {505 if templ_7745c5c3_Err != nil {
451 return templ_7745c5c3_Err506 return templ_7745c5c3_Err
452 }507 }
453 for _, f := range p.Facts {508 for _, f := range p.Facts {
454- templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 33, "<dt>")509+ templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 39, "<dt>")
455 if templ_7745c5c3_Err != nil {510 if templ_7745c5c3_Err != nil {
456 return templ_7745c5c3_Err511 return templ_7745c5c3_Err
457 }512 }
458- var templ_7745c5c3_Var23 string513+ var templ_7745c5c3_Var26 string
459- templ_7745c5c3_Var23, templ_7745c5c3_Err = templ.JoinStringErrs(f.Key)514+ templ_7745c5c3_Var26, templ_7745c5c3_Err = templ.JoinStringErrs(f.Key)
460 if templ_7745c5c3_Err != nil {515 if templ_7745c5c3_Err != nil {
461- return templ.Error{Err: templ_7745c5c3_Err, FileName: `internal/adapters/web/pages.templ`, Line: 101, Col: 15}516+ return templ.Error{Err: templ_7745c5c3_Err, FileName: `internal/adapters/web/pages.templ`, Line: 112, Col: 15}
462 }517 }
463- _, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(templ.EscapeString(templ_7745c5c3_Var23))518+ _, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(templ.EscapeString(templ_7745c5c3_Var26))
464 if templ_7745c5c3_Err != nil {519 if templ_7745c5c3_Err != nil {
465 return templ_7745c5c3_Err520 return templ_7745c5c3_Err
466 }521 }
467- templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 34, "</dt>")522+ templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 40, "</dt>")
468 if templ_7745c5c3_Err != nil {523 if templ_7745c5c3_Err != nil {
469 return templ_7745c5c3_Err524 return templ_7745c5c3_Err
470 }525 }
@@ -479,25 +534,25 @@ func summaryRail(p SummaryPage) templ.Component {
479 return templ_7745c5c3_Err534 return templ_7745c5c3_Err
480 }535 }
481 }536 }
482- templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 35, "</dl></section>")537+ templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 41, "</dl></section>")
483 if templ_7745c5c3_Err != nil {538 if templ_7745c5c3_Err != nil {
484 return templ_7745c5c3_Err539 return templ_7745c5c3_Err
485 }540 }
486 if len(p.Recent) > 0 {541 if len(p.Recent) > 0 {
487- templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 36, "<section aria-labelledby=\"r-recent\"><h2 id=\"r-recent\">Recent commits <a href=\"")542+ templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 42, "<section aria-labelledby=\"r-recent\"><h2 id=\"r-recent\">Recent commits <a href=\"")
488 if templ_7745c5c3_Err != nil {543 if templ_7745c5c3_Err != nil {
489 return templ_7745c5c3_Err544 return templ_7745c5c3_Err
490 }545 }
491- var templ_7745c5c3_Var24 templ.SafeURL546+ var templ_7745c5c3_Var27 templ.SafeURL
492- templ_7745c5c3_Var24, templ_7745c5c3_Err = templ.JoinURLErrs(templ.SafeURL(p.AllHref))547+ templ_7745c5c3_Var27, templ_7745c5c3_Err = templ.JoinURLErrs(templ.SafeURL(p.AllHref))
493 if templ_7745c5c3_Err != nil {548 if templ_7745c5c3_Err != nil {
494- return templ.Error{Err: templ_7745c5c3_Err, FileName: `internal/adapters/web/pages.templ`, Line: 110, Col: 105}549+ return templ.Error{Err: templ_7745c5c3_Err, FileName: `internal/adapters/web/pages.templ`, Line: 121, Col: 105}
495 }550 }
496- _, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(templ.EscapeString(templ_7745c5c3_Var24))551+ _, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(templ.EscapeString(templ_7745c5c3_Var27))
497 if templ_7745c5c3_Err != nil {552 if templ_7745c5c3_Err != nil {
498 return templ_7745c5c3_Err553 return templ_7745c5c3_Err
499 }554 }
500- templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 37, "\">View all</a></h2>")555+ templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 43, "\">View all</a></h2>")
501 if templ_7745c5c3_Err != nil {556 if templ_7745c5c3_Err != nil {
502 return templ_7745c5c3_Err557 return templ_7745c5c3_Err
503 }558 }
@@ -505,7 +560,7 @@ func summaryRail(p SummaryPage) templ.Component {
505 if templ_7745c5c3_Err != nil {560 if templ_7745c5c3_Err != nil {
506 return templ_7745c5c3_Err561 return templ_7745c5c3_Err
507 }562 }
508- templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 38, "</section>")563+ templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 44, "</section>")
509 if templ_7745c5c3_Err != nil {564 if templ_7745c5c3_Err != nil {
510 return templ_7745c5c3_Err565 return templ_7745c5c3_Err
511 }566 }
@@ -517,7 +572,7 @@ func summaryRail(p SummaryPage) templ.Component {
517 }572 }
518 }573 }
519 if len(p.Outline) > 0 && p.Readme != nil {574 if len(p.Outline) > 0 && p.Readme != nil {
520- templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 39, "<section aria-labelledby=\"r-outline\"><h2 id=\"r-outline\">On this page</h2>")575+ templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 45, "<section aria-labelledby=\"r-outline\"><h2 id=\"r-outline\">On this page</h2>")
521 if templ_7745c5c3_Err != nil {576 if templ_7745c5c3_Err != nil {
522 return templ_7745c5c3_Err577 return templ_7745c5c3_Err
523 }578 }
@@ -525,7 +580,7 @@ func summaryRail(p SummaryPage) templ.Component {
525 if templ_7745c5c3_Err != nil {580 if templ_7745c5c3_Err != nil {
526 return templ_7745c5c3_Err581 return templ_7745c5c3_Err
527 }582 }
528- templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 40, "</section>")583+ templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 46, "</section>")
529 if templ_7745c5c3_Err != nil {584 if templ_7745c5c3_Err != nil {
530 return templ_7745c5c3_Err585 return templ_7745c5c3_Err
531 }586 }
@@ -551,12 +606,12 @@ func Refs(l Layout, p RefsPage) templ.Component {
551 }()606 }()
552 }607 }
553 ctx = templ.InitializeContext(ctx)608 ctx = templ.InitializeContext(ctx)
554- templ_7745c5c3_Var25 := templ.GetChildren(ctx)609+ templ_7745c5c3_Var28 := templ.GetChildren(ctx)
555- if templ_7745c5c3_Var25 == nil {610+ if templ_7745c5c3_Var28 == nil {
556- templ_7745c5c3_Var25 = templ.NopComponent611+ templ_7745c5c3_Var28 = templ.NopComponent
557 }612 }
558 ctx = templ.ClearChildren(ctx)613 ctx = templ.ClearChildren(ctx)
559- templ_7745c5c3_Var26 := templruntime.GeneratedTemplate(func(templ_7745c5c3_Input templruntime.GeneratedComponentInput) (templ_7745c5c3_Err error) {614+ templ_7745c5c3_Var29 := templruntime.GeneratedTemplate(func(templ_7745c5c3_Input templruntime.GeneratedComponentInput) (templ_7745c5c3_Err error) {
560 templ_7745c5c3_W, ctx := templ_7745c5c3_Input.Writer, templ_7745c5c3_Input.Context615 templ_7745c5c3_W, ctx := templ_7745c5c3_Input.Writer, templ_7745c5c3_Input.Context
561 templ_7745c5c3_Buffer, templ_7745c5c3_IsBuffer := templruntime.GetBuffer(templ_7745c5c3_W)616 templ_7745c5c3_Buffer, templ_7745c5c3_IsBuffer := templruntime.GetBuffer(templ_7745c5c3_W)
562 if !templ_7745c5c3_IsBuffer {617 if !templ_7745c5c3_IsBuffer {
@@ -568,7 +623,7 @@ func Refs(l Layout, p RefsPage) templ.Component {
568 }()623 }()
569 }624 }
570 ctx = templ.InitializeContext(ctx)625 ctx = templ.InitializeContext(ctx)
571- templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 41, "<div class=\"filter\"><label for=\"ref-filter\" class=\"sr\">filter</label> <input id=\"ref-filter\" type=\"search\" data-filter=\"#ref-rows > tr\" placeholder=\"Filter branches and tags…\" autocomplete=\"off\" hx-on:input=\"ermite.filter(this)\"></div><table class=\"list refs\" aria-label=\"Branches and tags\"><thead><tr><th class=\"c-kind\">kind</th><th class=\"c-name\">name</th><th class=\"c-sha\">commit</th><th class=\"c-sub\">subject</th><th class=\"c-when\">date</th></tr></thead>")626+ templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 47, "<div class=\"filter\"><label for=\"ref-filter\" class=\"sr\">filter</label> <input id=\"ref-filter\" type=\"search\" data-filter=\"#ref-rows > tr\" placeholder=\"Filter branches and tags…\" autocomplete=\"off\" hx-on:input=\"ermite.filter(this)\"></div><table class=\"list refs\" aria-label=\"Branches and tags\"><thead><tr><th class=\"c-kind\">kind</th><th class=\"c-name\">name</th><th class=\"c-sha\">commit</th><th class=\"c-sub\">subject</th><th class=\"c-when\">date</th></tr></thead>")
572 if templ_7745c5c3_Err != nil {627 if templ_7745c5c3_Err != nil {
573 return templ_7745c5c3_Err628 return templ_7745c5c3_Err
574 }629 }
@@ -576,32 +631,32 @@ func Refs(l Layout, p RefsPage) templ.Component {
576 if templ_7745c5c3_Err != nil {631 if templ_7745c5c3_Err != nil {
577 return templ_7745c5c3_Err632 return templ_7745c5c3_Err
578 }633 }
579- templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 42, "</table>")634+ templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 48, "</table>")
580 if templ_7745c5c3_Err != nil {635 if templ_7745c5c3_Err != nil {
581 return templ_7745c5c3_Err636 return templ_7745c5c3_Err
582 }637 }
583 if p.Note != "" {638 if p.Note != "" {
584- templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 43, "<p class=\"note\">")639+ templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 49, "<p class=\"note\">")
585 if templ_7745c5c3_Err != nil {640 if templ_7745c5c3_Err != nil {
586 return templ_7745c5c3_Err641 return templ_7745c5c3_Err
587 }642 }
588- var templ_7745c5c3_Var27 string643+ var templ_7745c5c3_Var30 string
589- templ_7745c5c3_Var27, templ_7745c5c3_Err = templ.JoinStringErrs(p.Note)644+ templ_7745c5c3_Var30, templ_7745c5c3_Err = templ.JoinStringErrs(p.Note)
590 if templ_7745c5c3_Err != nil {645 if templ_7745c5c3_Err != nil {
591- return templ.Error{Err: templ_7745c5c3_Err, FileName: `internal/adapters/web/pages.templ`, Line: 143, Col: 27}646+ return templ.Error{Err: templ_7745c5c3_Err, FileName: `internal/adapters/web/pages.templ`, Line: 154, Col: 27}
592 }647 }
593- _, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(templ.EscapeString(templ_7745c5c3_Var27))648+ _, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(templ.EscapeString(templ_7745c5c3_Var30))
594 if templ_7745c5c3_Err != nil {649 if templ_7745c5c3_Err != nil {
595 return templ_7745c5c3_Err650 return templ_7745c5c3_Err
596 }651 }
597- templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 44, "</p>")652+ templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 50, "</p>")
598 if templ_7745c5c3_Err != nil {653 if templ_7745c5c3_Err != nil {
599 return templ_7745c5c3_Err654 return templ_7745c5c3_Err
600 }655 }
601 }656 }
602 return nil657 return nil
603 })658 })
604- templ_7745c5c3_Err = Shell(l, refsRail(p)).Render(templ.WithChildren(ctx, templ_7745c5c3_Var26), templ_7745c5c3_Buffer)659+ templ_7745c5c3_Err = Shell(l, refsRail(p)).Render(templ.WithChildren(ctx, templ_7745c5c3_Var29), templ_7745c5c3_Buffer)
605 if templ_7745c5c3_Err != nil {660 if templ_7745c5c3_Err != nil {
606 return templ_7745c5c3_Err661 return templ_7745c5c3_Err
607 }662 }
@@ -625,112 +680,112 @@ func refRow(kind string, r RefRow) templ.Component {
625 }()680 }()
626 }681 }
627 ctx = templ.InitializeContext(ctx)682 ctx = templ.InitializeContext(ctx)
628- templ_7745c5c3_Var28 := templ.GetChildren(ctx)683+ templ_7745c5c3_Var31 := templ.GetChildren(ctx)
629- if templ_7745c5c3_Var28 == nil {684+ if templ_7745c5c3_Var31 == nil {
630- templ_7745c5c3_Var28 = templ.NopComponent685+ templ_7745c5c3_Var31 = templ.NopComponent
631 }686 }
632 ctx = templ.ClearChildren(ctx)687 ctx = templ.ClearChildren(ctx)
633- templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 45, "<tr")688+ templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 51, "<tr")
634 if templ_7745c5c3_Err != nil {689 if templ_7745c5c3_Err != nil {
635 return templ_7745c5c3_Err690 return templ_7745c5c3_Err
636 }691 }
637 if r.Cursor {692 if r.Cursor {
638- templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 46, " data-cursor")693+ templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 52, " data-cursor")
639 if templ_7745c5c3_Err != nil {694 if templ_7745c5c3_Err != nil {
640 return templ_7745c5c3_Err695 return templ_7745c5c3_Err
641 }696 }
642 }697 }
643- templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 47, "><td class=\"c-kind mute\">")698+ templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 53, "><td class=\"c-kind mute\">")
644 if templ_7745c5c3_Err != nil {699 if templ_7745c5c3_Err != nil {
645 return templ_7745c5c3_Err700 return templ_7745c5c3_Err
646 }701 }
647- var templ_7745c5c3_Var29 string702+ var templ_7745c5c3_Var32 string
648- templ_7745c5c3_Var29, templ_7745c5c3_Err = templ.JoinStringErrs(kind)703+ templ_7745c5c3_Var32, templ_7745c5c3_Err = templ.JoinStringErrs(kind)
649 if templ_7745c5c3_Err != nil {704 if templ_7745c5c3_Err != nil {
650- return templ.Error{Err: templ_7745c5c3_Err, FileName: `internal/adapters/web/pages.templ`, Line: 150, Col: 32}705+ return templ.Error{Err: templ_7745c5c3_Err, FileName: `internal/adapters/web/pages.templ`, Line: 161, Col: 32}
651 }706 }
652- _, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(templ.EscapeString(templ_7745c5c3_Var29))707+ _, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(templ.EscapeString(templ_7745c5c3_Var32))
653 if templ_7745c5c3_Err != nil {708 if templ_7745c5c3_Err != nil {
654 return templ_7745c5c3_Err709 return templ_7745c5c3_Err
655 }710 }
656- templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 48, "</td><td class=\"c-name\"><a href=\"")711+ templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 54, "</td><td class=\"c-name\"><a href=\"")
657 if templ_7745c5c3_Err != nil {712 if templ_7745c5c3_Err != nil {
658 return templ_7745c5c3_Err713 return templ_7745c5c3_Err
659 }714 }
660- var templ_7745c5c3_Var30 templ.SafeURL715+ var templ_7745c5c3_Var33 templ.SafeURL
661- templ_7745c5c3_Var30, templ_7745c5c3_Err = templ.JoinURLErrs(templ.SafeURL(r.Href))716+ templ_7745c5c3_Var33, templ_7745c5c3_Err = templ.JoinURLErrs(templ.SafeURL(r.Href))
662 if templ_7745c5c3_Err != nil {717 if templ_7745c5c3_Err != nil {
663- return templ.Error{Err: templ_7745c5c3_Err, FileName: `internal/adapters/web/pages.templ`, Line: 152, Col: 34}718+ return templ.Error{Err: templ_7745c5c3_Err, FileName: `internal/adapters/web/pages.templ`, Line: 163, Col: 34}
664 }719 }
665- _, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(templ.EscapeString(templ_7745c5c3_Var30))720+ _, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(templ.EscapeString(templ_7745c5c3_Var33))
666 if templ_7745c5c3_Err != nil {721 if templ_7745c5c3_Err != nil {
667 return templ_7745c5c3_Err722 return templ_7745c5c3_Err
668 }723 }
669- templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 49, "\">")724+ templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 55, "\">")
670 if templ_7745c5c3_Err != nil {725 if templ_7745c5c3_Err != nil {
671 return templ_7745c5c3_Err726 return templ_7745c5c3_Err
672 }727 }
673- var templ_7745c5c3_Var31 string728+ var templ_7745c5c3_Var34 string
674- templ_7745c5c3_Var31, templ_7745c5c3_Err = templ.JoinStringErrs(r.Name)729+ templ_7745c5c3_Var34, templ_7745c5c3_Err = templ.JoinStringErrs(r.Name)
675 if templ_7745c5c3_Err != nil {730 if templ_7745c5c3_Err != nil {
676- return templ.Error{Err: templ_7745c5c3_Err, FileName: `internal/adapters/web/pages.templ`, Line: 152, Col: 45}731+ return templ.Error{Err: templ_7745c5c3_Err, FileName: `internal/adapters/web/pages.templ`, Line: 163, Col: 45}
677 }732 }
678- _, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(templ.EscapeString(templ_7745c5c3_Var31))733+ _, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(templ.EscapeString(templ_7745c5c3_Var34))
679 if templ_7745c5c3_Err != nil {734 if templ_7745c5c3_Err != nil {
680 return templ_7745c5c3_Err735 return templ_7745c5c3_Err
681 }736 }
682- templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 50, "</a> ")737+ templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 56, "</a> ")
683 if templ_7745c5c3_Err != nil {738 if templ_7745c5c3_Err != nil {
684 return templ_7745c5c3_Err739 return templ_7745c5c3_Err
685 }740 }
686 if r.Default {741 if r.Default {
687- templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 51, "<span class=\"pill\">default</span>")742+ templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 57, "<span class=\"pill\">default</span>")
688 if templ_7745c5c3_Err != nil {743 if templ_7745c5c3_Err != nil {
689 return templ_7745c5c3_Err744 return templ_7745c5c3_Err
690 }745 }
691 }746 }
692- templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 52, "</td><td class=\"c-sha\">")747+ templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 58, "</td><td class=\"c-sha\">")
693 if templ_7745c5c3_Err != nil {748 if templ_7745c5c3_Err != nil {
694 return templ_7745c5c3_Err749 return templ_7745c5c3_Err
695 }750 }
696 if r.CHref != "" {751 if r.CHref != "" {
697- templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 53, "<a href=\"")752+ templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 59, "<a href=\"")
698 if templ_7745c5c3_Err != nil {753 if templ_7745c5c3_Err != nil {
699 return templ_7745c5c3_Err754 return templ_7745c5c3_Err
700 }755 }
701- var templ_7745c5c3_Var32 templ.SafeURL756+ var templ_7745c5c3_Var35 templ.SafeURL
702- templ_7745c5c3_Var32, templ_7745c5c3_Err = templ.JoinURLErrs(templ.SafeURL(r.CHref))757+ templ_7745c5c3_Var35, templ_7745c5c3_Err = templ.JoinURLErrs(templ.SafeURL(r.CHref))
703 if templ_7745c5c3_Err != nil {758 if templ_7745c5c3_Err != nil {
704- return templ.Error{Err: templ_7745c5c3_Err, FileName: `internal/adapters/web/pages.templ`, Line: 159, Col: 36}759+ return templ.Error{Err: templ_7745c5c3_Err, FileName: `internal/adapters/web/pages.templ`, Line: 170, Col: 36}
705 }760 }
706- _, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(templ.EscapeString(templ_7745c5c3_Var32))761+ _, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(templ.EscapeString(templ_7745c5c3_Var35))
707 if templ_7745c5c3_Err != nil {762 if templ_7745c5c3_Err != nil {
708 return templ_7745c5c3_Err763 return templ_7745c5c3_Err
709 }764 }
710- templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 54, "\">")765+ templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 60, "\">")
711 if templ_7745c5c3_Err != nil {766 if templ_7745c5c3_Err != nil {
712 return templ_7745c5c3_Err767 return templ_7745c5c3_Err
713 }768 }
714- var templ_7745c5c3_Var33 string769+ var templ_7745c5c3_Var36 string
715- templ_7745c5c3_Var33, templ_7745c5c3_Err = templ.JoinStringErrs(r.Short)770+ templ_7745c5c3_Var36, templ_7745c5c3_Err = templ.JoinStringErrs(r.Short)
716 if templ_7745c5c3_Err != nil {771 if templ_7745c5c3_Err != nil {
717- return templ.Error{Err: templ_7745c5c3_Err, FileName: `internal/adapters/web/pages.templ`, Line: 159, Col: 48}772+ return templ.Error{Err: templ_7745c5c3_Err, FileName: `internal/adapters/web/pages.templ`, Line: 170, Col: 48}
718 }773 }
719- _, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(templ.EscapeString(templ_7745c5c3_Var33))774+ _, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(templ.EscapeString(templ_7745c5c3_Var36))
720 if templ_7745c5c3_Err != nil {775 if templ_7745c5c3_Err != nil {
721 return templ_7745c5c3_Err776 return templ_7745c5c3_Err
722 }777 }
723- templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 55, "</a>")778+ templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 61, "</a>")
724 if templ_7745c5c3_Err != nil {779 if templ_7745c5c3_Err != nil {
725 return templ_7745c5c3_Err780 return templ_7745c5c3_Err
726 }781 }
727 } else {782 } else {
728- var templ_7745c5c3_Var34 string783+ var templ_7745c5c3_Var37 string
729- templ_7745c5c3_Var34, templ_7745c5c3_Err = templ.JoinStringErrs(r.Short)784+ templ_7745c5c3_Var37, templ_7745c5c3_Err = templ.JoinStringErrs(r.Short)
730 if templ_7745c5c3_Err != nil {785 if templ_7745c5c3_Err != nil {
731- return templ.Error{Err: templ_7745c5c3_Err, FileName: `internal/adapters/web/pages.templ`, Line: 161, Col: 13}786+ return templ.Error{Err: templ_7745c5c3_Err, FileName: `internal/adapters/web/pages.templ`, Line: 172, Col: 13}
732 }787 }
733- _, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(templ.EscapeString(templ_7745c5c3_Var34))788+ _, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(templ.EscapeString(templ_7745c5c3_Var37))
734 if templ_7745c5c3_Err != nil {789 if templ_7745c5c3_Err != nil {
735 return templ_7745c5c3_Err790 return templ_7745c5c3_Err
736 }791 }
@@ -739,69 +794,69 @@ func refRow(kind string, r RefRow) templ.Component {
739 if templ_7745c5c3_Err != nil {794 if templ_7745c5c3_Err != nil {
740 return templ_7745c5c3_Err795 return templ_7745c5c3_Err
741 }796 }
742- templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 56, "</td><td class=\"c-sub\">")797+ templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 62, "</td><td class=\"c-sub\">")
743 if templ_7745c5c3_Err != nil {798 if templ_7745c5c3_Err != nil {
744 return templ_7745c5c3_Err799 return templ_7745c5c3_Err
745 }800 }
746- var templ_7745c5c3_Var35 string801+ var templ_7745c5c3_Var38 string
747- templ_7745c5c3_Var35, templ_7745c5c3_Err = templ.JoinStringErrs(r.Subject)802+ templ_7745c5c3_Var38, templ_7745c5c3_Err = templ.JoinStringErrs(r.Subject)
748 if templ_7745c5c3_Err != nil {803 if templ_7745c5c3_Err != nil {
749- return templ.Error{Err: templ_7745c5c3_Err, FileName: `internal/adapters/web/pages.templ`, Line: 165, Col: 31}804+ return templ.Error{Err: templ_7745c5c3_Err, FileName: `internal/adapters/web/pages.templ`, Line: 176, Col: 31}
750 }805 }
751- _, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(templ.EscapeString(templ_7745c5c3_Var35))806+ _, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(templ.EscapeString(templ_7745c5c3_Var38))
752 if templ_7745c5c3_Err != nil {807 if templ_7745c5c3_Err != nil {
753 return templ_7745c5c3_Err808 return templ_7745c5c3_Err
754 }809 }
755- templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 57, "</td><td class=\"c-when dim\">")810+ templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 63, "</td><td class=\"c-when dim\">")
756 if templ_7745c5c3_Err != nil {811 if templ_7745c5c3_Err != nil {
757 return templ_7745c5c3_Err812 return templ_7745c5c3_Err
758 }813 }
759 if r.WhenAt != "" {814 if r.WhenAt != "" {
760- templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 58, "<time datetime=\"")815+ templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 64, "<time datetime=\"")
761 if templ_7745c5c3_Err != nil {816 if templ_7745c5c3_Err != nil {
762 return templ_7745c5c3_Err817 return templ_7745c5c3_Err
763 }818 }
764- var templ_7745c5c3_Var36 string819+ var templ_7745c5c3_Var39 string
765- templ_7745c5c3_Var36, templ_7745c5c3_Err = templ.ResolveAttributeValue(r.WhenAt)820+ templ_7745c5c3_Var39, templ_7745c5c3_Err = templ.ResolveAttributeValue(r.WhenAt)
766 if templ_7745c5c3_Err != nil {821 if templ_7745c5c3_Err != nil {
767- return templ.Error{Err: templ_7745c5c3_Err, FileName: `internal/adapters/web/pages.templ`, Line: 168, Col: 29}822+ return templ.Error{Err: templ_7745c5c3_Err, FileName: `internal/adapters/web/pages.templ`, Line: 179, Col: 29}
768 }823 }
769- _, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(templ_7745c5c3_Var36)824+ _, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(templ_7745c5c3_Var39)
770 if templ_7745c5c3_Err != nil {825 if templ_7745c5c3_Err != nil {
771 return templ_7745c5c3_Err826 return templ_7745c5c3_Err
772 }827 }
773- templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 59, "\" title=\"")828+ templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 65, "\" title=\"")
774 if templ_7745c5c3_Err != nil {829 if templ_7745c5c3_Err != nil {
775 return templ_7745c5c3_Err830 return templ_7745c5c3_Err
776 }831 }
777- var templ_7745c5c3_Var37 string832+ var templ_7745c5c3_Var40 string
778- templ_7745c5c3_Var37, templ_7745c5c3_Err = templ.ResolveAttributeValue(r.WhenAt)833+ templ_7745c5c3_Var40, templ_7745c5c3_Err = templ.ResolveAttributeValue(r.WhenAt)
779 if templ_7745c5c3_Err != nil {834 if templ_7745c5c3_Err != nil {
780- return templ.Error{Err: templ_7745c5c3_Err, FileName: `internal/adapters/web/pages.templ`, Line: 168, Col: 48}835+ return templ.Error{Err: templ_7745c5c3_Err, FileName: `internal/adapters/web/pages.templ`, Line: 179, Col: 48}
781 }836 }
782- _, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(templ_7745c5c3_Var37)837+ _, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(templ_7745c5c3_Var40)
783 if templ_7745c5c3_Err != nil {838 if templ_7745c5c3_Err != nil {
784 return templ_7745c5c3_Err839 return templ_7745c5c3_Err
785 }840 }
786- templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 60, "\">")841+ templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 66, "\">")
787 if templ_7745c5c3_Err != nil {842 if templ_7745c5c3_Err != nil {
788 return templ_7745c5c3_Err843 return templ_7745c5c3_Err
789 }844 }
790- var templ_7745c5c3_Var38 string845+ var templ_7745c5c3_Var41 string
791- templ_7745c5c3_Var38, templ_7745c5c3_Err = templ.JoinStringErrs(r.When)846+ templ_7745c5c3_Var41, templ_7745c5c3_Err = templ.JoinStringErrs(r.When)
792 if templ_7745c5c3_Err != nil {847 if templ_7745c5c3_Err != nil {
793- return templ.Error{Err: templ_7745c5c3_Err, FileName: `internal/adapters/web/pages.templ`, Line: 168, Col: 59}848+ return templ.Error{Err: templ_7745c5c3_Err, FileName: `internal/adapters/web/pages.templ`, Line: 179, Col: 59}
794 }849 }
795- _, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(templ.EscapeString(templ_7745c5c3_Var38))850+ _, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(templ.EscapeString(templ_7745c5c3_Var41))
796 if templ_7745c5c3_Err != nil {851 if templ_7745c5c3_Err != nil {
797 return templ_7745c5c3_Err852 return templ_7745c5c3_Err
798 }853 }
799- templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 61, "</time>")854+ templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 67, "</time>")
800 if templ_7745c5c3_Err != nil {855 if templ_7745c5c3_Err != nil {
801 return templ_7745c5c3_Err856 return templ_7745c5c3_Err
802 }857 }
803 }858 }
804- templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 62, "</td></tr>")859+ templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 68, "</td></tr>")
805 if templ_7745c5c3_Err != nil {860 if templ_7745c5c3_Err != nil {
806 return templ_7745c5c3_Err861 return templ_7745c5c3_Err
807 }862 }
@@ -825,12 +880,12 @@ func refsRail(p RefsPage) templ.Component {
825 }()880 }()
826 }881 }
827 ctx = templ.InitializeContext(ctx)882 ctx = templ.InitializeContext(ctx)
828- templ_7745c5c3_Var39 := templ.GetChildren(ctx)883+ templ_7745c5c3_Var42 := templ.GetChildren(ctx)
829- if templ_7745c5c3_Var39 == nil {884+ if templ_7745c5c3_Var42 == nil {
830- templ_7745c5c3_Var39 = templ.NopComponent885+ templ_7745c5c3_Var42 = templ.NopComponent
831 }886 }
832 ctx = templ.ClearChildren(ctx)887 ctx = templ.ClearChildren(ctx)
833- templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 63, "<section aria-labelledby=\"r-refs\"><h2 id=\"r-refs\">Overview</h2>")888+ templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 69, "<section aria-labelledby=\"r-refs\"><h2 id=\"r-refs\">Overview</h2>")
834 if templ_7745c5c3_Err != nil {889 if templ_7745c5c3_Err != nil {
835 return templ_7745c5c3_Err890 return templ_7745c5c3_Err
836 }891 }
@@ -838,7 +893,7 @@ func refsRail(p RefsPage) templ.Component {
838 if templ_7745c5c3_Err != nil {893 if templ_7745c5c3_Err != nil {
839 return templ_7745c5c3_Err894 return templ_7745c5c3_Err
840 }895 }
841- templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 64, "</section>")896+ templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 70, "</section>")
842 if templ_7745c5c3_Err != nil {897 if templ_7745c5c3_Err != nil {
843 return templ_7745c5c3_Err898 return templ_7745c5c3_Err
844 }899 }
@@ -863,12 +918,12 @@ func State(l Layout, p StatePage) templ.Component {
863 }()918 }()
864 }919 }
865 ctx = templ.InitializeContext(ctx)920 ctx = templ.InitializeContext(ctx)
866- templ_7745c5c3_Var40 := templ.GetChildren(ctx)921+ templ_7745c5c3_Var43 := templ.GetChildren(ctx)
867- if templ_7745c5c3_Var40 == nil {922+ if templ_7745c5c3_Var43 == nil {
868- templ_7745c5c3_Var40 = templ.NopComponent923+ templ_7745c5c3_Var43 = templ.NopComponent
869 }924 }
870 ctx = templ.ClearChildren(ctx)925 ctx = templ.ClearChildren(ctx)
871- templ_7745c5c3_Var41 := templruntime.GeneratedTemplate(func(templ_7745c5c3_Input templruntime.GeneratedComponentInput) (templ_7745c5c3_Err error) {926+ templ_7745c5c3_Var44 := templruntime.GeneratedTemplate(func(templ_7745c5c3_Input templruntime.GeneratedComponentInput) (templ_7745c5c3_Err error) {
872 templ_7745c5c3_W, ctx := templ_7745c5c3_Input.Writer, templ_7745c5c3_Input.Context927 templ_7745c5c3_W, ctx := templ_7745c5c3_Input.Writer, templ_7745c5c3_Input.Context
873 templ_7745c5c3_Buffer, templ_7745c5c3_IsBuffer := templruntime.GetBuffer(templ_7745c5c3_W)928 templ_7745c5c3_Buffer, templ_7745c5c3_IsBuffer := templruntime.GetBuffer(templ_7745c5c3_W)
874 if !templ_7745c5c3_IsBuffer {929 if !templ_7745c5c3_IsBuffer {
@@ -880,51 +935,51 @@ func State(l Layout, p StatePage) templ.Component {
880 }()935 }()
881 }936 }
882 ctx = templ.InitializeContext(ctx)937 ctx = templ.InitializeContext(ctx)
883- templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 65, "<section class=\"state\" aria-labelledby=\"state-title\"><p class=\"eyebrow\">")938+ templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 71, "<section class=\"state\" aria-labelledby=\"state-title\"><p class=\"eyebrow\">")
884 if templ_7745c5c3_Err != nil {939 if templ_7745c5c3_Err != nil {
885 return templ_7745c5c3_Err940 return templ_7745c5c3_Err
886 }941 }
887- var templ_7745c5c3_Var42 string942+ var templ_7745c5c3_Var45 string
888- templ_7745c5c3_Var42, templ_7745c5c3_Err = templ.JoinStringErrs(p.Code)943+ templ_7745c5c3_Var45, templ_7745c5c3_Err = templ.JoinStringErrs(p.Code)
889 if templ_7745c5c3_Err != nil {944 if templ_7745c5c3_Err != nil {
890- return templ.Error{Err: templ_7745c5c3_Err, FileName: `internal/adapters/web/pages.templ`, Line: 185, Col: 30}945+ return templ.Error{Err: templ_7745c5c3_Err, FileName: `internal/adapters/web/pages.templ`, Line: 196, Col: 30}
891 }946 }
892- _, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(templ.EscapeString(templ_7745c5c3_Var42))947+ _, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(templ.EscapeString(templ_7745c5c3_Var45))
893 if templ_7745c5c3_Err != nil {948 if templ_7745c5c3_Err != nil {
894 return templ_7745c5c3_Err949 return templ_7745c5c3_Err
895 }950 }
896- templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 66, "</p><h1 id=\"state-title\">")951+ templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 72, "</p><h1 id=\"state-title\">")
897 if templ_7745c5c3_Err != nil {952 if templ_7745c5c3_Err != nil {
898 return templ_7745c5c3_Err953 return templ_7745c5c3_Err
899 }954 }
900- var templ_7745c5c3_Var43 string955+ var templ_7745c5c3_Var46 string
901- templ_7745c5c3_Var43, templ_7745c5c3_Err = templ.JoinStringErrs(p.Title)956+ templ_7745c5c3_Var46, templ_7745c5c3_Err = templ.JoinStringErrs(p.Title)
902 if templ_7745c5c3_Err != nil {957 if templ_7745c5c3_Err != nil {
903- return templ.Error{Err: templ_7745c5c3_Err, FileName: `internal/adapters/web/pages.templ`, Line: 186, Col: 33}958+ return templ.Error{Err: templ_7745c5c3_Err, FileName: `internal/adapters/web/pages.templ`, Line: 197, Col: 33}
904 }959 }
905- _, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(templ.EscapeString(templ_7745c5c3_Var43))960+ _, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(templ.EscapeString(templ_7745c5c3_Var46))
906 if templ_7745c5c3_Err != nil {961 if templ_7745c5c3_Err != nil {
907 return templ_7745c5c3_Err962 return templ_7745c5c3_Err
908 }963 }
909- templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 67, "</h1>")964+ templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 73, "</h1>")
910 if templ_7745c5c3_Err != nil {965 if templ_7745c5c3_Err != nil {
911 return templ_7745c5c3_Err966 return templ_7745c5c3_Err
912 }967 }
913 for _, line := range p.Lines {968 for _, line := range p.Lines {
914- templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 68, "<p class=\"dim\">")969+ templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 74, "<p class=\"dim\">")
915 if templ_7745c5c3_Err != nil {970 if templ_7745c5c3_Err != nil {
916 return templ_7745c5c3_Err971 return templ_7745c5c3_Err
917 }972 }
918- var templ_7745c5c3_Var44 string973+ var templ_7745c5c3_Var47 string
919- templ_7745c5c3_Var44, templ_7745c5c3_Err = templ.JoinStringErrs(line)974+ templ_7745c5c3_Var47, templ_7745c5c3_Err = templ.JoinStringErrs(line)
920 if templ_7745c5c3_Err != nil {975 if templ_7745c5c3_Err != nil {
921- return templ.Error{Err: templ_7745c5c3_Err, FileName: `internal/adapters/web/pages.templ`, Line: 188, Col: 25}976+ return templ.Error{Err: templ_7745c5c3_Err, FileName: `internal/adapters/web/pages.templ`, Line: 199, Col: 25}
922 }977 }
923- _, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(templ.EscapeString(templ_7745c5c3_Var44))978+ _, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(templ.EscapeString(templ_7745c5c3_Var47))
924 if templ_7745c5c3_Err != nil {979 if templ_7745c5c3_Err != nil {
925 return templ_7745c5c3_Err980 return templ_7745c5c3_Err
926 }981 }
927- templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 69, "</p>")982+ templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 75, "</p>")
928 if templ_7745c5c3_Err != nil {983 if templ_7745c5c3_Err != nil {
929 return templ_7745c5c3_Err984 return templ_7745c5c3_Err
930 }985 }
@@ -935,49 +990,49 @@ func State(l Layout, p StatePage) templ.Component {
935 return templ_7745c5c3_Err990 return templ_7745c5c3_Err
936 }991 }
937 }992 }
938- templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 70, "<p class=\"state-back\">")993+ templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 76, "<p class=\"state-back\">")
939 if templ_7745c5c3_Err != nil {994 if templ_7745c5c3_Err != nil {
940 return templ_7745c5c3_Err995 return templ_7745c5c3_Err
941 }996 }
942 for _, b := range p.Back {997 for _, b := range p.Back {
943- templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 71, "<a href=\"")998+ templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 77, "<a href=\"")
944 if templ_7745c5c3_Err != nil {999 if templ_7745c5c3_Err != nil {
945 return templ_7745c5c3_Err1000 return templ_7745c5c3_Err
946 }1001 }
947- var templ_7745c5c3_Var45 templ.SafeURL1002+ var templ_7745c5c3_Var48 templ.SafeURL
948- templ_7745c5c3_Var45, templ_7745c5c3_Err = templ.JoinURLErrs(templ.SafeURL(b.Href))1003+ templ_7745c5c3_Var48, templ_7745c5c3_Err = templ.JoinURLErrs(templ.SafeURL(b.Href))
949 if templ_7745c5c3_Err != nil {1004 if templ_7745c5c3_Err != nil {
950- return templ.Error{Err: templ_7745c5c3_Err, FileName: `internal/adapters/web/pages.templ`, Line: 195, Col: 36}1005+ return templ.Error{Err: templ_7745c5c3_Err, FileName: `internal/adapters/web/pages.templ`, Line: 206, Col: 36}
951 }1006 }
952- _, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(templ.EscapeString(templ_7745c5c3_Var45))1007+ _, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(templ.EscapeString(templ_7745c5c3_Var48))
953 if templ_7745c5c3_Err != nil {1008 if templ_7745c5c3_Err != nil {
954 return templ_7745c5c3_Err1009 return templ_7745c5c3_Err
955 }1010 }
956- templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 72, "\">")1011+ templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 78, "\">")
957 if templ_7745c5c3_Err != nil {1012 if templ_7745c5c3_Err != nil {
958 return templ_7745c5c3_Err1013 return templ_7745c5c3_Err
959 }1014 }
960- var templ_7745c5c3_Var46 string1015+ var templ_7745c5c3_Var49 string
961- templ_7745c5c3_Var46, templ_7745c5c3_Err = templ.JoinStringErrs(b.Label)1016+ templ_7745c5c3_Var49, templ_7745c5c3_Err = templ.JoinStringErrs(b.Label)
962 if templ_7745c5c3_Err != nil {1017 if templ_7745c5c3_Err != nil {
963- return templ.Error{Err: templ_7745c5c3_Err, FileName: `internal/adapters/web/pages.templ`, Line: 195, Col: 48}1018+ return templ.Error{Err: templ_7745c5c3_Err, FileName: `internal/adapters/web/pages.templ`, Line: 206, Col: 48}
964 }1019 }
965- _, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(templ.EscapeString(templ_7745c5c3_Var46))1020+ _, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(templ.EscapeString(templ_7745c5c3_Var49))
966 if templ_7745c5c3_Err != nil {1021 if templ_7745c5c3_Err != nil {
967 return templ_7745c5c3_Err1022 return templ_7745c5c3_Err
968 }1023 }
969- templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 73, "</a>")1024+ templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 79, "</a>")
970 if templ_7745c5c3_Err != nil {1025 if templ_7745c5c3_Err != nil {
971 return templ_7745c5c3_Err1026 return templ_7745c5c3_Err
972 }1027 }
973 }1028 }
974- templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 74, "</p></section>")1029+ templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 80, "</p></section>")
975 if templ_7745c5c3_Err != nil {1030 if templ_7745c5c3_Err != nil {
976 return templ_7745c5c3_Err1031 return templ_7745c5c3_Err
977 }1032 }
978 return nil1033 return nil
979 })1034 })
980- templ_7745c5c3_Err = Shell(l, nil).Render(templ.WithChildren(ctx, templ_7745c5c3_Var41), templ_7745c5c3_Buffer)1035+ templ_7745c5c3_Err = Shell(l, nil).Render(templ.WithChildren(ctx, templ_7745c5c3_Var44), templ_7745c5c3_Buffer)
981 if templ_7745c5c3_Err != nil {1036 if templ_7745c5c3_Err != nil {
982 return templ_7745c5c3_Err1037 return templ_7745c5c3_Err
983 }1038 }
@@ -1006,12 +1061,12 @@ func Login(l Layout, p LoginPage) templ.Component {
1006 }()1061 }()
1007 }1062 }
1008 ctx = templ.InitializeContext(ctx)1063 ctx = templ.InitializeContext(ctx)
1009- templ_7745c5c3_Var47 := templ.GetChildren(ctx)1064+ templ_7745c5c3_Var50 := templ.GetChildren(ctx)
1010- if templ_7745c5c3_Var47 == nil {1065+ if templ_7745c5c3_Var50 == nil {
1011- templ_7745c5c3_Var47 = templ.NopComponent1066+ templ_7745c5c3_Var50 = templ.NopComponent
1012 }1067 }
1013 ctx = templ.ClearChildren(ctx)1068 ctx = templ.ClearChildren(ctx)
1014- templ_7745c5c3_Var48 := templruntime.GeneratedTemplate(func(templ_7745c5c3_Input templruntime.GeneratedComponentInput) (templ_7745c5c3_Err error) {1069+ templ_7745c5c3_Var51 := templruntime.GeneratedTemplate(func(templ_7745c5c3_Input templruntime.GeneratedComponentInput) (templ_7745c5c3_Err error) {
1015 templ_7745c5c3_W, ctx := templ_7745c5c3_Input.Writer, templ_7745c5c3_Input.Context1070 templ_7745c5c3_W, ctx := templ_7745c5c3_Input.Writer, templ_7745c5c3_Input.Context
1016 templ_7745c5c3_Buffer, templ_7745c5c3_IsBuffer := templruntime.GetBuffer(templ_7745c5c3_W)1071 templ_7745c5c3_Buffer, templ_7745c5c3_IsBuffer := templruntime.GetBuffer(templ_7745c5c3_W)
1017 if !templ_7745c5c3_IsBuffer {1072 if !templ_7745c5c3_IsBuffer {
@@ -1023,75 +1078,75 @@ func Login(l Layout, p LoginPage) templ.Component {
1023 }()1078 }()
1024 }1079 }
1025 ctx = templ.InitializeContext(ctx)1080 ctx = templ.InitializeContext(ctx)
1026- templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 75, "<section class=\"state\" aria-labelledby=\"state-title\"><h1 id=\"state-title\">")1081+ templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 81, "<section class=\"state\" aria-labelledby=\"state-title\"><h1 id=\"state-title\">")
1027 if templ_7745c5c3_Err != nil {1082 if templ_7745c5c3_Err != nil {
1028 return templ_7745c5c3_Err1083 return templ_7745c5c3_Err
1029 }1084 }
1030- var templ_7745c5c3_Var49 string1085+ var templ_7745c5c3_Var52 string
1031- templ_7745c5c3_Var49, templ_7745c5c3_Err = templ.JoinStringErrs(p.Title)1086+ templ_7745c5c3_Var52, templ_7745c5c3_Err = templ.JoinStringErrs(p.Title)
1032 if templ_7745c5c3_Err != nil {1087 if templ_7745c5c3_Err != nil {
1033- return templ.Error{Err: templ_7745c5c3_Err, FileName: `internal/adapters/web/pages.templ`, Line: 210, Col: 33}1088+ return templ.Error{Err: templ_7745c5c3_Err, FileName: `internal/adapters/web/pages.templ`, Line: 221, Col: 33}
1034 }1089 }
1035- _, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(templ.EscapeString(templ_7745c5c3_Var49))1090+ _, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(templ.EscapeString(templ_7745c5c3_Var52))
1036 if templ_7745c5c3_Err != nil {1091 if templ_7745c5c3_Err != nil {
1037 return templ_7745c5c3_Err1092 return templ_7745c5c3_Err
1038 }1093 }
1039- templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 76, "</h1>")1094+ templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 82, "</h1>")
1040 if templ_7745c5c3_Err != nil {1095 if templ_7745c5c3_Err != nil {
1041 return templ_7745c5c3_Err1096 return templ_7745c5c3_Err
1042 }1097 }
1043 for _, line := range p.Lines {1098 for _, line := range p.Lines {
1044- templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 77, "<p class=\"dim\">")1099+ templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 83, "<p class=\"dim\">")
1045 if templ_7745c5c3_Err != nil {1100 if templ_7745c5c3_Err != nil {
1046 return templ_7745c5c3_Err1101 return templ_7745c5c3_Err
1047 }1102 }
1048- var templ_7745c5c3_Var50 string1103+ var templ_7745c5c3_Var53 string
1049- templ_7745c5c3_Var50, templ_7745c5c3_Err = templ.JoinStringErrs(line)1104+ templ_7745c5c3_Var53, templ_7745c5c3_Err = templ.JoinStringErrs(line)
1050 if templ_7745c5c3_Err != nil {1105 if templ_7745c5c3_Err != nil {
1051- return templ.Error{Err: templ_7745c5c3_Err, FileName: `internal/adapters/web/pages.templ`, Line: 212, Col: 25}1106+ return templ.Error{Err: templ_7745c5c3_Err, FileName: `internal/adapters/web/pages.templ`, Line: 223, Col: 25}
1052 }1107 }
1053- _, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(templ.EscapeString(templ_7745c5c3_Var50))1108+ _, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(templ.EscapeString(templ_7745c5c3_Var53))
1054 if templ_7745c5c3_Err != nil {1109 if templ_7745c5c3_Err != nil {
1055 return templ_7745c5c3_Err1110 return templ_7745c5c3_Err
1056 }1111 }
1057- templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 78, "</p>")1112+ templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 84, "</p>")
1058 if templ_7745c5c3_Err != nil {1113 if templ_7745c5c3_Err != nil {
1059 return templ_7745c5c3_Err1114 return templ_7745c5c3_Err
1060 }1115 }
1061 }1116 }
1062- templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 79, "<form class=\"state-act\" method=\"post\" action=\"")1117+ templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 85, "<form class=\"state-act\" method=\"post\" action=\"")
1063 if templ_7745c5c3_Err != nil {1118 if templ_7745c5c3_Err != nil {
1064 return templ_7745c5c3_Err1119 return templ_7745c5c3_Err
1065 }1120 }
1066- var templ_7745c5c3_Var51 templ.SafeURL1121+ var templ_7745c5c3_Var54 templ.SafeURL
1067- templ_7745c5c3_Var51, templ_7745c5c3_Err = templ.JoinURLErrs(templ.SafeURL(p.Action))1122+ templ_7745c5c3_Var54, templ_7745c5c3_Err = templ.JoinURLErrs(templ.SafeURL(p.Action))
1068 if templ_7745c5c3_Err != nil {1123 if templ_7745c5c3_Err != nil {
1069- return templ.Error{Err: templ_7745c5c3_Err, FileName: `internal/adapters/web/pages.templ`, Line: 214, Col: 73}1124+ return templ.Error{Err: templ_7745c5c3_Err, FileName: `internal/adapters/web/pages.templ`, Line: 225, Col: 73}
1070 }1125 }
1071- _, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(templ.EscapeString(templ_7745c5c3_Var51))1126+ _, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(templ.EscapeString(templ_7745c5c3_Var54))
1072 if templ_7745c5c3_Err != nil {1127 if templ_7745c5c3_Err != nil {
1073 return templ_7745c5c3_Err1128 return templ_7745c5c3_Err
1074 }1129 }
1075- templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 80, "\" data-autosubmit><button type=\"submit\" class=\"btn primary\">")1130+ templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 86, "\" data-autosubmit><button type=\"submit\" class=\"btn primary\">")
1076 if templ_7745c5c3_Err != nil {1131 if templ_7745c5c3_Err != nil {
1077 return templ_7745c5c3_Err1132 return templ_7745c5c3_Err
1078 }1133 }
1079- var templ_7745c5c3_Var52 string1134+ var templ_7745c5c3_Var55 string
1080- templ_7745c5c3_Var52, templ_7745c5c3_Err = templ.JoinStringErrs(p.Button)1135+ templ_7745c5c3_Var55, templ_7745c5c3_Err = templ.JoinStringErrs(p.Button)
1081 if templ_7745c5c3_Err != nil {1136 if templ_7745c5c3_Err != nil {
1082- return templ.Error{Err: templ_7745c5c3_Err, FileName: `internal/adapters/web/pages.templ`, Line: 215, Col: 56}1137+ return templ.Error{Err: templ_7745c5c3_Err, FileName: `internal/adapters/web/pages.templ`, Line: 226, Col: 56}
1083 }1138 }
1084- _, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(templ.EscapeString(templ_7745c5c3_Var52))1139+ _, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(templ.EscapeString(templ_7745c5c3_Var55))
1085 if templ_7745c5c3_Err != nil {1140 if templ_7745c5c3_Err != nil {
1086 return templ_7745c5c3_Err1141 return templ_7745c5c3_Err
1087 }1142 }
1088- templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 81, "</button></form><p class=\"state-back\"><a href=\"/\">Back to home</a></p></section>")1143+ templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 87, "</button></form><p class=\"state-back\"><a href=\"/\">Back to home</a></p></section>")
1089 if templ_7745c5c3_Err != nil {1144 if templ_7745c5c3_Err != nil {
1090 return templ_7745c5c3_Err1145 return templ_7745c5c3_Err
1091 }1146 }
1092 return nil1147 return nil
1093 })1148 })
1094- templ_7745c5c3_Err = Shell(l, nil).Render(templ.WithChildren(ctx, templ_7745c5c3_Var48), templ_7745c5c3_Buffer)1149+ templ_7745c5c3_Err = Shell(l, nil).Render(templ.WithChildren(ctx, templ_7745c5c3_Var51), templ_7745c5c3_Buffer)
1095 if templ_7745c5c3_Err != nil {1150 if templ_7745c5c3_Err != nil {
1096 return templ_7745c5c3_Err1151 return templ_7745c5c3_Err
1097 }1152 }
@@ -1117,12 +1172,12 @@ func PasskeyLogin(l Layout, p PasskeyLoginPage) templ.Component {
1117 }()1172 }()
1118 }1173 }
1119 ctx = templ.InitializeContext(ctx)1174 ctx = templ.InitializeContext(ctx)
1120- templ_7745c5c3_Var53 := templ.GetChildren(ctx)1175+ templ_7745c5c3_Var56 := templ.GetChildren(ctx)
1121- if templ_7745c5c3_Var53 == nil {1176+ if templ_7745c5c3_Var56 == nil {
1122- templ_7745c5c3_Var53 = templ.NopComponent1177+ templ_7745c5c3_Var56 = templ.NopComponent
1123 }1178 }
1124 ctx = templ.ClearChildren(ctx)1179 ctx = templ.ClearChildren(ctx)
1125- templ_7745c5c3_Var54 := templruntime.GeneratedTemplate(func(templ_7745c5c3_Input templruntime.GeneratedComponentInput) (templ_7745c5c3_Err error) {1180+ templ_7745c5c3_Var57 := templruntime.GeneratedTemplate(func(templ_7745c5c3_Input templruntime.GeneratedComponentInput) (templ_7745c5c3_Err error) {
1126 templ_7745c5c3_W, ctx := templ_7745c5c3_Input.Writer, templ_7745c5c3_Input.Context1181 templ_7745c5c3_W, ctx := templ_7745c5c3_Input.Writer, templ_7745c5c3_Input.Context
1127 templ_7745c5c3_Buffer, templ_7745c5c3_IsBuffer := templruntime.GetBuffer(templ_7745c5c3_W)1182 templ_7745c5c3_Buffer, templ_7745c5c3_IsBuffer := templruntime.GetBuffer(templ_7745c5c3_W)
1128 if !templ_7745c5c3_IsBuffer {1183 if !templ_7745c5c3_IsBuffer {
@@ -1134,88 +1189,88 @@ func PasskeyLogin(l Layout, p PasskeyLoginPage) templ.Component {
1134 }()1189 }()
1135 }1190 }
1136 ctx = templ.InitializeContext(ctx)1191 ctx = templ.InitializeContext(ctx)
1137- templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 82, "<section class=\"state\" aria-labelledby=\"state-title\"><h1 id=\"state-title\">")1192+ templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 88, "<section class=\"state\" aria-labelledby=\"state-title\"><h1 id=\"state-title\">")
1138 if templ_7745c5c3_Err != nil {1193 if templ_7745c5c3_Err != nil {
1139 return templ_7745c5c3_Err1194 return templ_7745c5c3_Err
1140 }1195 }
1141- var templ_7745c5c3_Var55 string1196+ var templ_7745c5c3_Var58 string
1142- templ_7745c5c3_Var55, templ_7745c5c3_Err = templ.JoinStringErrs(p.Title)1197+ templ_7745c5c3_Var58, templ_7745c5c3_Err = templ.JoinStringErrs(p.Title)
1143 if templ_7745c5c3_Err != nil {1198 if templ_7745c5c3_Err != nil {
1144- return templ.Error{Err: templ_7745c5c3_Err, FileName: `internal/adapters/web/pages.templ`, Line: 227, Col: 33}1199+ return templ.Error{Err: templ_7745c5c3_Err, FileName: `internal/adapters/web/pages.templ`, Line: 238, Col: 33}
1145 }1200 }
1146- _, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(templ.EscapeString(templ_7745c5c3_Var55))1201+ _, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(templ.EscapeString(templ_7745c5c3_Var58))
1147 if templ_7745c5c3_Err != nil {1202 if templ_7745c5c3_Err != nil {
1148 return templ_7745c5c3_Err1203 return templ_7745c5c3_Err
1149 }1204 }
1150- templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 83, "</h1><form class=\"state-act\" data-js data-passkey-form><button type=\"submit\" class=\"btn primary\" data-passkey=\"login\" data-begin=\"")1205+ templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 89, "</h1><form class=\"state-act\" data-js data-passkey-form><button type=\"submit\" class=\"btn primary\" data-passkey=\"login\" data-begin=\"")
1151 if templ_7745c5c3_Err != nil {1206 if templ_7745c5c3_Err != nil {
1152 return templ_7745c5c3_Err1207 return templ_7745c5c3_Err
1153 }1208 }
1154- var templ_7745c5c3_Var56 string1209+ var templ_7745c5c3_Var59 string
1155- templ_7745c5c3_Var56, templ_7745c5c3_Err = templ.ResolveAttributeValue(p.Begin)1210+ templ_7745c5c3_Var59, templ_7745c5c3_Err = templ.ResolveAttributeValue(p.Begin)
1156 if templ_7745c5c3_Err != nil {1211 if templ_7745c5c3_Err != nil {
1157- return templ.Error{Err: templ_7745c5c3_Err, FileName: `internal/adapters/web/pages.templ`, Line: 229, Col: 87}1212+ return templ.Error{Err: templ_7745c5c3_Err, FileName: `internal/adapters/web/pages.templ`, Line: 240, Col: 87}
1158 }1213 }
1159- _, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(templ_7745c5c3_Var56)1214+ _, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(templ_7745c5c3_Var59)
1160 if templ_7745c5c3_Err != nil {1215 if templ_7745c5c3_Err != nil {
1161 return templ_7745c5c3_Err1216 return templ_7745c5c3_Err
1162 }1217 }
1163- templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 84, "\" data-finish=\"")1218+ templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 90, "\" data-finish=\"")
1164 if templ_7745c5c3_Err != nil {1219 if templ_7745c5c3_Err != nil {
1165 return templ_7745c5c3_Err1220 return templ_7745c5c3_Err
1166 }1221 }
1167- var templ_7745c5c3_Var57 string1222+ var templ_7745c5c3_Var60 string
1168- templ_7745c5c3_Var57, templ_7745c5c3_Err = templ.ResolveAttributeValue(p.Finish)1223+ templ_7745c5c3_Var60, templ_7745c5c3_Err = templ.ResolveAttributeValue(p.Finish)
1169 if templ_7745c5c3_Err != nil {1224 if templ_7745c5c3_Err != nil {
1170- return templ.Error{Err: templ_7745c5c3_Err, FileName: `internal/adapters/web/pages.templ`, Line: 229, Col: 112}1225+ return templ.Error{Err: templ_7745c5c3_Err, FileName: `internal/adapters/web/pages.templ`, Line: 240, Col: 112}
1171 }1226 }
1172- _, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(templ_7745c5c3_Var57)1227+ _, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(templ_7745c5c3_Var60)
1173 if templ_7745c5c3_Err != nil {1228 if templ_7745c5c3_Err != nil {
1174 return templ_7745c5c3_Err1229 return templ_7745c5c3_Err
1175 }1230 }
1176- templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 85, "\">")1231+ templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 91, "\">")
1177 if templ_7745c5c3_Err != nil {1232 if templ_7745c5c3_Err != nil {
1178 return templ_7745c5c3_Err1233 return templ_7745c5c3_Err
1179 }1234 }
1180- var templ_7745c5c3_Var58 string1235+ var templ_7745c5c3_Var61 string
1181- templ_7745c5c3_Var58, templ_7745c5c3_Err = templ.JoinStringErrs(p.Button)1236+ templ_7745c5c3_Var61, templ_7745c5c3_Err = templ.JoinStringErrs(p.Button)
1182 if templ_7745c5c3_Err != nil {1237 if templ_7745c5c3_Err != nil {
1183- return templ.Error{Err: templ_7745c5c3_Err, FileName: `internal/adapters/web/pages.templ`, Line: 229, Col: 125}1238+ return templ.Error{Err: templ_7745c5c3_Err, FileName: `internal/adapters/web/pages.templ`, Line: 240, Col: 125}
1184 }1239 }
1185- _, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(templ.EscapeString(templ_7745c5c3_Var58))1240+ _, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(templ.EscapeString(templ_7745c5c3_Var61))
1186 if templ_7745c5c3_Err != nil {1241 if templ_7745c5c3_Err != nil {
1187 return templ_7745c5c3_Err1242 return templ_7745c5c3_Err
1188 }1243 }
1189- templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 86, "</button></form><p class=\"dim\" role=\"status\" aria-live=\"polite\" data-passkey-status></p>")1244+ templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 92, "</button></form><p class=\"dim\" role=\"status\" aria-live=\"polite\" data-passkey-status></p>")
1190 if templ_7745c5c3_Err != nil {1245 if templ_7745c5c3_Err != nil {
1191 return templ_7745c5c3_Err1246 return templ_7745c5c3_Err
1192 }1247 }
1193 for _, line := range p.Lines {1248 for _, line := range p.Lines {
1194- templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 87, "<p class=\"dim\">")1249+ templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 93, "<p class=\"dim\">")
1195 if templ_7745c5c3_Err != nil {1250 if templ_7745c5c3_Err != nil {
1196 return templ_7745c5c3_Err1251 return templ_7745c5c3_Err
1197 }1252 }
1198- var templ_7745c5c3_Var59 string1253+ var templ_7745c5c3_Var62 string
1199- templ_7745c5c3_Var59, templ_7745c5c3_Err = templ.JoinStringErrs(line)1254+ templ_7745c5c3_Var62, templ_7745c5c3_Err = templ.JoinStringErrs(line)
1200 if templ_7745c5c3_Err != nil {1255 if templ_7745c5c3_Err != nil {
1201- return templ.Error{Err: templ_7745c5c3_Err, FileName: `internal/adapters/web/pages.templ`, Line: 233, Col: 25}1256+ return templ.Error{Err: templ_7745c5c3_Err, FileName: `internal/adapters/web/pages.templ`, Line: 244, Col: 25}
1202 }1257 }
1203- _, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(templ.EscapeString(templ_7745c5c3_Var59))1258+ _, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(templ.EscapeString(templ_7745c5c3_Var62))
1204 if templ_7745c5c3_Err != nil {1259 if templ_7745c5c3_Err != nil {
1205 return templ_7745c5c3_Err1260 return templ_7745c5c3_Err
1206 }1261 }
1207- templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 88, "</p>")1262+ templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 94, "</p>")
1208 if templ_7745c5c3_Err != nil {1263 if templ_7745c5c3_Err != nil {
1209 return templ_7745c5c3_Err1264 return templ_7745c5c3_Err
1210 }1265 }
1211 }1266 }
1212- templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 89, "<p class=\"state-back\"><a href=\"/\">Back to home</a></p></section>")1267+ templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 95, "<p class=\"state-back\"><a href=\"/\">Back to home</a></p></section>")
1213 if templ_7745c5c3_Err != nil {1268 if templ_7745c5c3_Err != nil {
1214 return templ_7745c5c3_Err1269 return templ_7745c5c3_Err
1215 }1270 }
1216 return nil1271 return nil
1217 })1272 })
1218- templ_7745c5c3_Err = Shell(l, nil).Render(templ.WithChildren(ctx, templ_7745c5c3_Var54), templ_7745c5c3_Buffer)1273+ templ_7745c5c3_Err = Shell(l, nil).Render(templ.WithChildren(ctx, templ_7745c5c3_Var57), templ_7745c5c3_Buffer)
1219 if templ_7745c5c3_Err != nil {1274 if templ_7745c5c3_Err != nil {
1220 return templ_7745c5c3_Err1275 return templ_7745c5c3_Err
1221 }1276 }
@@ -1240,12 +1295,12 @@ func Passkeys(l Layout, p PasskeysPage) templ.Component {
1240 }()1295 }()
1241 }1296 }
1242 ctx = templ.InitializeContext(ctx)1297 ctx = templ.InitializeContext(ctx)
1243- templ_7745c5c3_Var60 := templ.GetChildren(ctx)1298+ templ_7745c5c3_Var63 := templ.GetChildren(ctx)
1244- if templ_7745c5c3_Var60 == nil {1299+ if templ_7745c5c3_Var63 == nil {
1245- templ_7745c5c3_Var60 = templ.NopComponent1300+ templ_7745c5c3_Var63 = templ.NopComponent
1246 }1301 }
1247 ctx = templ.ClearChildren(ctx)1302 ctx = templ.ClearChildren(ctx)
1248- templ_7745c5c3_Var61 := templruntime.GeneratedTemplate(func(templ_7745c5c3_Input templruntime.GeneratedComponentInput) (templ_7745c5c3_Err error) {1303+ templ_7745c5c3_Var64 := templruntime.GeneratedTemplate(func(templ_7745c5c3_Input templruntime.GeneratedComponentInput) (templ_7745c5c3_Err error) {
1249 templ_7745c5c3_W, ctx := templ_7745c5c3_Input.Writer, templ_7745c5c3_Input.Context1304 templ_7745c5c3_W, ctx := templ_7745c5c3_Input.Writer, templ_7745c5c3_Input.Context
1250 templ_7745c5c3_Buffer, templ_7745c5c3_IsBuffer := templruntime.GetBuffer(templ_7745c5c3_W)1305 templ_7745c5c3_Buffer, templ_7745c5c3_IsBuffer := templruntime.GetBuffer(templ_7745c5c3_W)
1251 if !templ_7745c5c3_IsBuffer {1306 if !templ_7745c5c3_IsBuffer {
@@ -1257,231 +1312,231 @@ func Passkeys(l Layout, p PasskeysPage) templ.Component {
1257 }()1312 }()
1258 }1313 }
1259 ctx = templ.InitializeContext(ctx)1314 ctx = templ.InitializeContext(ctx)
1260- templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 90, "<h2 class=\"rule-h\"><span>Passkeys</span><span class=\"count\">")1315+ templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 96, "<h2 class=\"rule-h\"><span>Passkeys</span><span class=\"count\">")
1261 if templ_7745c5c3_Err != nil {1316 if templ_7745c5c3_Err != nil {
1262 return templ_7745c5c3_Err1317 return templ_7745c5c3_Err
1263 }1318 }
1264- var templ_7745c5c3_Var62 string1319+ var templ_7745c5c3_Var65 string
1265- templ_7745c5c3_Var62, templ_7745c5c3_Err = templ.JoinStringErrs(itoa(len(p.Rows)))1320+ templ_7745c5c3_Var65, templ_7745c5c3_Err = templ.JoinStringErrs(itoa(len(p.Rows)))
1266 if templ_7745c5c3_Err != nil {1321 if templ_7745c5c3_Err != nil {
1267- return templ.Error{Err: templ_7745c5c3_Err, FileName: `internal/adapters/web/pages.templ`, Line: 243, Col: 81}1322+ return templ.Error{Err: templ_7745c5c3_Err, FileName: `internal/adapters/web/pages.templ`, Line: 254, Col: 81}
1268 }1323 }
1269- _, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(templ.EscapeString(templ_7745c5c3_Var62))1324+ _, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(templ.EscapeString(templ_7745c5c3_Var65))
1270 if templ_7745c5c3_Err != nil {1325 if templ_7745c5c3_Err != nil {
1271 return templ_7745c5c3_Err1326 return templ_7745c5c3_Err
1272 }1327 }
1273- templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 91, "</span></h2><p class=\"dim\">A passkey signs you in from this device or your phone, without a terminal. Removing one signs every browser out.</p>")1328+ templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 97, "</span></h2><p class=\"dim\">A passkey signs you in from this device or your phone, without a terminal. Removing one signs every browser out.</p>")
1274 if templ_7745c5c3_Err != nil {1329 if templ_7745c5c3_Err != nil {
1275 return templ_7745c5c3_Err1330 return templ_7745c5c3_Err
1276 }1331 }
1277 if len(p.Rows) > 0 {1332 if len(p.Rows) > 0 {
1278- templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 92, "<table class=\"list passkeys\" aria-label=\"Passkeys\"><thead><tr><th class=\"c-name\">Name</th><th class=\"c-when\">Created</th><th class=\"c-when\">Last used</th><th class=\"c-sync\">Synced</th><th class=\"c-act\"><span class=\"sr\">Remove</span></th></tr></thead> <tbody>")1333+ templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 98, "<table class=\"list passkeys\" aria-label=\"Passkeys\"><thead><tr><th class=\"c-name\">Name</th><th class=\"c-when\">Created</th><th class=\"c-when\">Last used</th><th class=\"c-sync\">Synced</th><th class=\"c-act\"><span class=\"sr\">Remove</span></th></tr></thead> <tbody>")
1279 if templ_7745c5c3_Err != nil {1334 if templ_7745c5c3_Err != nil {
1280 return templ_7745c5c3_Err1335 return templ_7745c5c3_Err
1281 }1336 }
1282 for _, r := range p.Rows {1337 for _, r := range p.Rows {
1283- templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 93, "<tr><td class=\"c-name\">")1338+ templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 99, "<tr><td class=\"c-name\">")
1284 if templ_7745c5c3_Err != nil {1339 if templ_7745c5c3_Err != nil {
1285 return templ_7745c5c3_Err1340 return templ_7745c5c3_Err
1286 }1341 }
1287- var templ_7745c5c3_Var63 string1342+ var templ_7745c5c3_Var66 string
1288- templ_7745c5c3_Var63, templ_7745c5c3_Err = templ.JoinStringErrs(r.Name)1343+ templ_7745c5c3_Var66, templ_7745c5c3_Err = templ.JoinStringErrs(r.Name)
1289 if templ_7745c5c3_Err != nil {1344 if templ_7745c5c3_Err != nil {
1290- return templ.Error{Err: templ_7745c5c3_Err, FileName: `internal/adapters/web/pages.templ`, Line: 259, Col: 34}1345+ return templ.Error{Err: templ_7745c5c3_Err, FileName: `internal/adapters/web/pages.templ`, Line: 270, Col: 34}
1291 }1346 }
1292- _, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(templ.EscapeString(templ_7745c5c3_Var63))1347+ _, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(templ.EscapeString(templ_7745c5c3_Var66))
1293 if templ_7745c5c3_Err != nil {1348 if templ_7745c5c3_Err != nil {
1294 return templ_7745c5c3_Err1349 return templ_7745c5c3_Err
1295 }1350 }
1296- templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 94, "</td><td class=\"c-when nowrap\"><time")1351+ templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 100, "</td><td class=\"c-when nowrap\"><time")
1297 if templ_7745c5c3_Err != nil {1352 if templ_7745c5c3_Err != nil {
1298 return templ_7745c5c3_Err1353 return templ_7745c5c3_Err
1299 }1354 }
1300 if r.CreatedAt != "" {1355 if r.CreatedAt != "" {
1301- templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 95, " datetime=\"")1356+ templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 101, " datetime=\"")
1302 if templ_7745c5c3_Err != nil {1357 if templ_7745c5c3_Err != nil {
1303 return templ_7745c5c3_Err1358 return templ_7745c5c3_Err
1304 }1359 }
1305- var templ_7745c5c3_Var64 string1360+ var templ_7745c5c3_Var67 string
1306- templ_7745c5c3_Var64, templ_7745c5c3_Err = templ.ResolveAttributeValue(r.CreatedAt)1361+ templ_7745c5c3_Var67, templ_7745c5c3_Err = templ.ResolveAttributeValue(r.CreatedAt)
1307 if templ_7745c5c3_Err != nil {1362 if templ_7745c5c3_Err != nil {
1308- return templ.Error{Err: templ_7745c5c3_Err, FileName: `internal/adapters/web/pages.templ`, Line: 263, Col: 32}1363+ return templ.Error{Err: templ_7745c5c3_Err, FileName: `internal/adapters/web/pages.templ`, Line: 274, Col: 32}
1309 }1364 }
1310- _, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(templ_7745c5c3_Var64)1365+ _, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(templ_7745c5c3_Var67)
1311 if templ_7745c5c3_Err != nil {1366 if templ_7745c5c3_Err != nil {
1312 return templ_7745c5c3_Err1367 return templ_7745c5c3_Err
1313 }1368 }
1314- templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 96, "\"")1369+ templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 102, "\"")
1315 if templ_7745c5c3_Err != nil {1370 if templ_7745c5c3_Err != nil {
1316 return templ_7745c5c3_Err1371 return templ_7745c5c3_Err
1317 }1372 }
1318 }1373 }
1319- templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 97, ">")1374+ templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 103, ">")
1320 if templ_7745c5c3_Err != nil {1375 if templ_7745c5c3_Err != nil {
1321 return templ_7745c5c3_Err1376 return templ_7745c5c3_Err
1322 }1377 }
1323- var templ_7745c5c3_Var65 string1378+ var templ_7745c5c3_Var68 string
1324- templ_7745c5c3_Var65, templ_7745c5c3_Err = templ.JoinStringErrs(r.Created)1379+ templ_7745c5c3_Var68, templ_7745c5c3_Err = templ.JoinStringErrs(r.Created)
1325 if templ_7745c5c3_Err != nil {1380 if templ_7745c5c3_Err != nil {
1326- return templ.Error{Err: templ_7745c5c3_Err, FileName: `internal/adapters/web/pages.templ`, Line: 265, Col: 20}1381+ return templ.Error{Err: templ_7745c5c3_Err, FileName: `internal/adapters/web/pages.templ`, Line: 276, Col: 20}
1327 }1382 }
1328- _, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(templ.EscapeString(templ_7745c5c3_Var65))1383+ _, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(templ.EscapeString(templ_7745c5c3_Var68))
1329 if templ_7745c5c3_Err != nil {1384 if templ_7745c5c3_Err != nil {
1330 return templ_7745c5c3_Err1385 return templ_7745c5c3_Err
1331 }1386 }
1332- templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 98, "</time></td><td class=\"c-when nowrap\"><time")1387+ templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 104, "</time></td><td class=\"c-when nowrap\"><time")
1333 if templ_7745c5c3_Err != nil {1388 if templ_7745c5c3_Err != nil {
1334 return templ_7745c5c3_Err1389 return templ_7745c5c3_Err
1335 }1390 }
1336 if r.LastUsedAt != "" {1391 if r.LastUsedAt != "" {
1337- templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 99, " datetime=\"")1392+ templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 105, " datetime=\"")
1338 if templ_7745c5c3_Err != nil {1393 if templ_7745c5c3_Err != nil {
1339 return templ_7745c5c3_Err1394 return templ_7745c5c3_Err
1340 }1395 }
1341- var templ_7745c5c3_Var66 string1396+ var templ_7745c5c3_Var69 string
1342- templ_7745c5c3_Var66, templ_7745c5c3_Err = templ.ResolveAttributeValue(r.LastUsedAt)1397+ templ_7745c5c3_Var69, templ_7745c5c3_Err = templ.ResolveAttributeValue(r.LastUsedAt)
1343 if templ_7745c5c3_Err != nil {1398 if templ_7745c5c3_Err != nil {
1344- return templ.Error{Err: templ_7745c5c3_Err, FileName: `internal/adapters/web/pages.templ`, Line: 270, Col: 33}1399+ return templ.Error{Err: templ_7745c5c3_Err, FileName: `internal/adapters/web/pages.templ`, Line: 281, Col: 33}
1345 }1400 }
1346- _, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(templ_7745c5c3_Var66)1401+ _, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(templ_7745c5c3_Var69)
1347 if templ_7745c5c3_Err != nil {1402 if templ_7745c5c3_Err != nil {
1348 return templ_7745c5c3_Err1403 return templ_7745c5c3_Err
1349 }1404 }
1350- templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 100, "\"")1405+ templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 106, "\"")
1351 if templ_7745c5c3_Err != nil {1406 if templ_7745c5c3_Err != nil {
1352 return templ_7745c5c3_Err1407 return templ_7745c5c3_Err
1353 }1408 }
1354 }1409 }
1355- templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 101, ">")1410+ templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 107, ">")
1356 if templ_7745c5c3_Err != nil {1411 if templ_7745c5c3_Err != nil {
1357 return templ_7745c5c3_Err1412 return templ_7745c5c3_Err
1358 }1413 }
1359- var templ_7745c5c3_Var67 string1414+ var templ_7745c5c3_Var70 string
1360- templ_7745c5c3_Var67, templ_7745c5c3_Err = templ.JoinStringErrs(r.LastUsed)1415+ templ_7745c5c3_Var70, templ_7745c5c3_Err = templ.JoinStringErrs(r.LastUsed)
1361 if templ_7745c5c3_Err != nil {1416 if templ_7745c5c3_Err != nil {
1362- return templ.Error{Err: templ_7745c5c3_Err, FileName: `internal/adapters/web/pages.templ`, Line: 272, Col: 21}1417+ return templ.Error{Err: templ_7745c5c3_Err, FileName: `internal/adapters/web/pages.templ`, Line: 283, Col: 21}
1363 }1418 }
1364- _, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(templ.EscapeString(templ_7745c5c3_Var67))1419+ _, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(templ.EscapeString(templ_7745c5c3_Var70))
1365 if templ_7745c5c3_Err != nil {1420 if templ_7745c5c3_Err != nil {
1366 return templ_7745c5c3_Err1421 return templ_7745c5c3_Err
1367 }1422 }
1368- templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 102, "</time></td><td class=\"c-sync\">")1423+ templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 108, "</time></td><td class=\"c-sync\">")
1369 if templ_7745c5c3_Err != nil {1424 if templ_7745c5c3_Err != nil {
1370 return templ_7745c5c3_Err1425 return templ_7745c5c3_Err
1371 }1426 }
1372 if r.Synced {1427 if r.Synced {
1373- templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 103, "yes")1428+ templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 109, "yes")
1374 if templ_7745c5c3_Err != nil {1429 if templ_7745c5c3_Err != nil {
1375 return templ_7745c5c3_Err1430 return templ_7745c5c3_Err
1376 }1431 }
1377 } else {1432 } else {
1378- templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 104, "no")1433+ templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 110, "no")
1379 if templ_7745c5c3_Err != nil {1434 if templ_7745c5c3_Err != nil {
1380 return templ_7745c5c3_Err1435 return templ_7745c5c3_Err
1381 }1436 }
1382 }1437 }
1383- templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 105, "</td><td class=\"c-act\"><form method=\"post\" action=\"")1438+ templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 111, "</td><td class=\"c-act\"><form method=\"post\" action=\"")
1384 if templ_7745c5c3_Err != nil {1439 if templ_7745c5c3_Err != nil {
1385 return templ_7745c5c3_Err1440 return templ_7745c5c3_Err
1386 }1441 }
1387- var templ_7745c5c3_Var68 templ.SafeURL1442+ var templ_7745c5c3_Var71 templ.SafeURL
1388- templ_7745c5c3_Var68, templ_7745c5c3_Err = templ.JoinURLErrs(templ.SafeURL(r.Remove))1443+ templ_7745c5c3_Var71, templ_7745c5c3_Err = templ.JoinURLErrs(templ.SafeURL(r.Remove))
1389 if templ_7745c5c3_Err != nil {1444 if templ_7745c5c3_Err != nil {
1390- return templ.Error{Err: templ_7745c5c3_Err, FileName: `internal/adapters/web/pages.templ`, Line: 282, Col: 60}1445+ return templ.Error{Err: templ_7745c5c3_Err, FileName: `internal/adapters/web/pages.templ`, Line: 293, Col: 60}
1391 }1446 }
1392- _, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(templ.EscapeString(templ_7745c5c3_Var68))1447+ _, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(templ.EscapeString(templ_7745c5c3_Var71))
1393 if templ_7745c5c3_Err != nil {1448 if templ_7745c5c3_Err != nil {
1394 return templ_7745c5c3_Err1449 return templ_7745c5c3_Err
1395 }1450 }
1396- templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 106, "\"><button type=\"submit\" class=\"btn danger\" aria-label=\"")1451+ templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 112, "\"><button type=\"submit\" class=\"btn danger\" aria-label=\"")
1397 if templ_7745c5c3_Err != nil {1452 if templ_7745c5c3_Err != nil {
1398 return templ_7745c5c3_Err1453 return templ_7745c5c3_Err
1399 }1454 }
1400- var templ_7745c5c3_Var69 string1455+ var templ_7745c5c3_Var72 string
1401- templ_7745c5c3_Var69, templ_7745c5c3_Err = templ.ResolveAttributeValue("Remove passkey " + r.Name)1456+ templ_7745c5c3_Var72, templ_7745c5c3_Err = templ.ResolveAttributeValue("Remove passkey " + r.Name)
1402 if templ_7745c5c3_Err != nil {1457 if templ_7745c5c3_Err != nil {
1403- return templ.Error{Err: templ_7745c5c3_Err, FileName: `internal/adapters/web/pages.templ`, Line: 283, Col: 89}1458+ return templ.Error{Err: templ_7745c5c3_Err, FileName: `internal/adapters/web/pages.templ`, Line: 294, Col: 89}
1404 }1459 }
1405- _, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(templ_7745c5c3_Var69)1460+ _, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(templ_7745c5c3_Var72)
1406 if templ_7745c5c3_Err != nil {1461 if templ_7745c5c3_Err != nil {
1407 return templ_7745c5c3_Err1462 return templ_7745c5c3_Err
1408 }1463 }
1409- templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 107, "\">Remove</button></form></td></tr>")1464+ templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 113, "\">Remove</button></form></td></tr>")
1410 if templ_7745c5c3_Err != nil {1465 if templ_7745c5c3_Err != nil {
1411 return templ_7745c5c3_Err1466 return templ_7745c5c3_Err
1412 }1467 }
1413 }1468 }
1414- templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 108, "</tbody></table>")1469+ templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 114, "</tbody></table>")
1415 if templ_7745c5c3_Err != nil {1470 if templ_7745c5c3_Err != nil {
1416 return templ_7745c5c3_Err1471 return templ_7745c5c3_Err
1417 }1472 }
1418 } else {1473 } else {
1419- templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 109, "<p class=\"lede dim\">no passkeys yet.</p>")1474+ templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 115, "<p class=\"lede dim\">no passkeys yet.</p>")
1420 if templ_7745c5c3_Err != nil {1475 if templ_7745c5c3_Err != nil {
1421 return templ_7745c5c3_Err1476 return templ_7745c5c3_Err
1422 }1477 }
1423 }1478 }
1424- templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 110, " ")1479+ templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 116, " ")
1425 if templ_7745c5c3_Err != nil {1480 if templ_7745c5c3_Err != nil {
1426 return templ_7745c5c3_Err1481 return templ_7745c5c3_Err
1427 }1482 }
1428 if p.Full {1483 if p.Full {
1429- templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 111, "<p class=\"dim\">")1484+ templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 117, "<p class=\"dim\">")
1430 if templ_7745c5c3_Err != nil {1485 if templ_7745c5c3_Err != nil {
1431 return templ_7745c5c3_Err1486 return templ_7745c5c3_Err
1432 }1487 }
1433- var templ_7745c5c3_Var70 string1488+ var templ_7745c5c3_Var73 string
1434- templ_7745c5c3_Var70, templ_7745c5c3_Err = templ.JoinStringErrs(itoa(p.Max))1489+ templ_7745c5c3_Var73, templ_7745c5c3_Err = templ.JoinStringErrs(itoa(p.Max))
1435 if templ_7745c5c3_Err != nil {1490 if templ_7745c5c3_Err != nil {
1436- return templ.Error{Err: templ_7745c5c3_Err, FileName: `internal/adapters/web/pages.templ`, Line: 294, Col: 31}1491+ return templ.Error{Err: templ_7745c5c3_Err, FileName: `internal/adapters/web/pages.templ`, Line: 305, Col: 31}
1437 }1492 }
1438- _, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(templ.EscapeString(templ_7745c5c3_Var70))1493+ _, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(templ.EscapeString(templ_7745c5c3_Var73))
1439 if templ_7745c5c3_Err != nil {1494 if templ_7745c5c3_Err != nil {
1440 return templ_7745c5c3_Err1495 return templ_7745c5c3_Err
1441 }1496 }
1442- templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 112, " passkeys are registered, the most there can be. Remove one to add another.</p>")1497+ templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 118, " passkeys are registered, the most there can be. Remove one to add another.</p>")
1443 if templ_7745c5c3_Err != nil {1498 if templ_7745c5c3_Err != nil {
1444 return templ_7745c5c3_Err1499 return templ_7745c5c3_Err
1445 }1500 }
1446 } else {1501 } else {
1447- templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 113, "<form class=\"passkey-add\" data-js data-passkey-form><label for=\"passkey-name\" class=\"sr\">Name of the new passkey</label> <input id=\"passkey-name\" type=\"text\" placeholder=\"Name, for example Pixel 9\" autocomplete=\"off\" data-passkey-name> <button type=\"submit\" class=\"btn primary\" data-passkey=\"register\" data-begin=\"")1502+ templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 119, "<form class=\"passkey-add\" data-js data-passkey-form><label for=\"passkey-name\" class=\"sr\">Name of the new passkey</label> <input id=\"passkey-name\" type=\"text\" placeholder=\"Name, for example Pixel 9\" autocomplete=\"off\" data-passkey-name> <button type=\"submit\" class=\"btn primary\" data-passkey=\"register\" data-begin=\"")
1448 if templ_7745c5c3_Err != nil {1503 if templ_7745c5c3_Err != nil {
1449 return templ_7745c5c3_Err1504 return templ_7745c5c3_Err
1450 }1505 }
1451- var templ_7745c5c3_Var71 string1506+ var templ_7745c5c3_Var74 string
1452- templ_7745c5c3_Var71, templ_7745c5c3_Err = templ.ResolveAttributeValue(p.Begin)1507+ templ_7745c5c3_Var74, templ_7745c5c3_Err = templ.ResolveAttributeValue(p.Begin)
1453 if templ_7745c5c3_Err != nil {1508 if templ_7745c5c3_Err != nil {
1454- return templ.Error{Err: templ_7745c5c3_Err, FileName: `internal/adapters/web/pages.templ`, Line: 299, Col: 90}1509+ return templ.Error{Err: templ_7745c5c3_Err, FileName: `internal/adapters/web/pages.templ`, Line: 310, Col: 90}
1455 }1510 }
1456- _, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(templ_7745c5c3_Var71)1511+ _, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(templ_7745c5c3_Var74)
1457 if templ_7745c5c3_Err != nil {1512 if templ_7745c5c3_Err != nil {
1458 return templ_7745c5c3_Err1513 return templ_7745c5c3_Err
1459 }1514 }
1460- templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 114, "\" data-finish=\"")1515+ templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 120, "\" data-finish=\"")
1461 if templ_7745c5c3_Err != nil {1516 if templ_7745c5c3_Err != nil {
1462 return templ_7745c5c3_Err1517 return templ_7745c5c3_Err
1463 }1518 }
1464- var templ_7745c5c3_Var72 string1519+ var templ_7745c5c3_Var75 string
1465- templ_7745c5c3_Var72, templ_7745c5c3_Err = templ.ResolveAttributeValue(p.Finish)1520+ templ_7745c5c3_Var75, templ_7745c5c3_Err = templ.ResolveAttributeValue(p.Finish)
1466 if templ_7745c5c3_Err != nil {1521 if templ_7745c5c3_Err != nil {
1467- return templ.Error{Err: templ_7745c5c3_Err, FileName: `internal/adapters/web/pages.templ`, Line: 299, Col: 115}1522+ return templ.Error{Err: templ_7745c5c3_Err, FileName: `internal/adapters/web/pages.templ`, Line: 310, Col: 115}
1468 }1523 }
1469- _, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(templ_7745c5c3_Var72)1524+ _, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(templ_7745c5c3_Var75)
1470 if templ_7745c5c3_Err != nil {1525 if templ_7745c5c3_Err != nil {
1471 return templ_7745c5c3_Err1526 return templ_7745c5c3_Err
1472 }1527 }
1473- templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 115, "\">Add a passkey</button></form>")1528+ templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 121, "\">Add a passkey</button></form>")
1474 if templ_7745c5c3_Err != nil {1529 if templ_7745c5c3_Err != nil {
1475 return templ_7745c5c3_Err1530 return templ_7745c5c3_Err
1476 }1531 }
1477 }1532 }
1478- templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 116, " <p class=\"dim\" role=\"status\" aria-live=\"polite\" data-passkey-status></p>")1533+ templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 122, " <p class=\"dim\" role=\"status\" aria-live=\"polite\" data-passkey-status></p>")
1479 if templ_7745c5c3_Err != nil {1534 if templ_7745c5c3_Err != nil {
1480 return templ_7745c5c3_Err1535 return templ_7745c5c3_Err
1481 }1536 }
1482 return nil1537 return nil
1483 })1538 })
1484- templ_7745c5c3_Err = Shell(l, nil).Render(templ.WithChildren(ctx, templ_7745c5c3_Var61), templ_7745c5c3_Buffer)1539+ templ_7745c5c3_Err = Shell(l, nil).Render(templ.WithChildren(ctx, templ_7745c5c3_Var64), templ_7745c5c3_Buffer)
1485 if templ_7745c5c3_Err != nil {1540 if templ_7745c5c3_Err != nil {
1486 return templ_7745c5c3_Err1541 return templ_7745c5c3_Err
1487 }1542 }
M internal/adapters/web/summary.go +1 -0
@@ -49,6 +49,7 @@ func (s *Server) summary(ctx context.Context, r *http.Request) (templ.Component,
4949 now := s.cfg.Now()
5050
5151 p := SummaryPage{
52+ Mirror: s.mirrorBadge(ctx, d.repo.Name),
5253 AllHref: repoHref(d.name(), "commits", ref),
5354 Clone: Clone{ID: "clone-" + d.name(), Lines: []string{"git clone " + s.cloneURL(d.name())}},
5455 }
@@ -49,6 +49,7 @@ func (s *Server) summary(ctx context.Context, r *http.Request) (templ.Component,
49 now := s.cfg.Now()49 now := s.cfg.Now()
50 50
51 p := SummaryPage{51 p := SummaryPage{
52+ Mirror: s.mirrorBadge(ctx, d.repo.Name),
52 AllHref: repoHref(d.name(), "commits", ref),53 AllHref: repoHref(d.name(), "commits", ref),
53 Clone: Clone{ID: "clone-" + d.name(), Lines: []string{"git clone " + s.cloneURL(d.name())}},54 Clone: Clone{ID: "clone-" + d.name(), Lines: []string{"git clone " + s.cloneURL(d.name())}},
54 }55 }
M internal/adapters/web/view.go +1 -0
@@ -203,6 +203,7 @@ type CommitRow struct {
203203
204204 // SummaryPage is the repository summary.
205205 type SummaryPage struct {
206+ Mirror *MirrorBadge
206207 Facts []Fact
207208 Clone Clone
208209 Recent []CommitRow
@@ -203,6 +203,7 @@ type CommitRow struct {
203 203
204 // SummaryPage is the repository summary.204 // SummaryPage is the repository summary.
205 type SummaryPage struct {205 type SummaryPage struct {
206+ Mirror *MirrorBadge
206 Facts []Fact207 Facts []Fact
207 Clone Clone208 Clone Clone
208 Recent []CommitRow209 Recent []CommitRow
M internal/adapters/web/web.go +1 -0
@@ -127,6 +127,7 @@ type Config struct {
127127
128128 // Server serves the pages. It is an http.Handler.
129129 type Server struct {
130+ mirrors ports.MirrorWarner
130131 cfg Config
131132 instance string
132133 origin string // scheme://host of the public URL, what a POST must come from
@@ -127,6 +127,7 @@ type Config struct {
127 127
128 // Server serves the pages. It is an http.Handler.128 // Server serves the pages. It is an http.Handler.
129 type Server struct {129 type Server struct {
130+ mirrors ports.MirrorWarner
130 cfg Config131 cfg Config
131 instance string132 instance string
132 origin string // scheme://host of the public URL, what a POST must come from133 origin string // scheme://host of the public URL, what a POST must come from

Keyboard shortcuts

Single-key shortcuts are on. ctrl k and esc work whatever this says.

ctrl k :
go to a section, branch, tag, file or repository
?
this list
j k
move the row cursor down / up
enter
open the row under the cursor; on Files, a directory opens or closes in place
↑ ↓ ← → home end
in the file tree (focus on a row): previous / next row, close / open a directory or go to its parent / first entry, first / last row. They never open a file
l h
on Files: open a directory or a file / close a directory or go up to its parent, then to the parent page. Elsewhere: into the side panel (on a merge request, its files) / back to the content; there j k move between its controls
g g G
first / last row
/
filter the list; on Files, find a file anywhere in the repository (esc clears, enter opens the best match)
b
switch branch or tag
g s g f g c g b g m g i g r g a
tabs: summary, files, commits, branches & tags, merge requests, issues, releases, actions (when available)
g h
home
w
wide mode: use the whole width of the screen, or not (remembered)
y
copy a permalink pinned to the commit
d u x
diff: split / unified / collapse or expand all
e E
diff: the whole file in view / every file, with the lines the hunks hide
n
merge request: next note in the diff
esc
close a dialog, leave a field

Branches 2

Tags 44

↑↓ moveenter openesc close