detached e95eebd

feat(web): the home page lists repositories as cards (#56)

commit
e95eebda317302f13d3d13c1fc33a5477e4bfa1b
author
brice · · 2026-10-18 06:17 UTC
committer
bnema · · 2026-10-18 06:17 UTC
parent
8e01339
signature
SSH UnverifiedSHA256:VOCA5lYARHcbKDZ7GhTV45VmcjWnJ6ZQIBazj17LivA The key is unknown
14 files · +770 -672
M internal/adapters/web/components.templ +24 -15
@@ -32,26 +32,35 @@ templ CloneBlock(c Clone) {
3232 </div>
3333 }
3434
35-// HomeRow is one row of the home list. Its id is the target of SSE swaps.
35+// HomeRowView is the card of a repository in the home list. Its id is the
36+// target of SSE swaps; the name link comes first, `enter` follows it.
3637 templ HomeRowView(r HomeRow) {
37- <tr id={ r.ID } data-cursor?={ r.Cursor }>
38- <td class="cur" aria-hidden="true"></td>
39- <td class="c-name">
38+ <li id={ r.ID } class="repo" data-cursor?={ r.Cursor }>
39+ <h2 class="repo-name">
4040 <a href={ templ.SafeURL(r.Href) }>{ r.Name }</a>
41+ if r.Private {
42+ <span class="pill">private</span>
43+ }
4144 if r.Fresh {
4245 <span class="pill new">new push</span>
4346 }
44- </td>
45- <td class="c-desc dim">{ r.Desc }</td>
46- <td class="c-when nowrap">
47- <time
48- if r.PushedAt != "" {
49- datetime={ r.PushedAt }
50- }
51- >{ r.Pushed }</time>
52- </td>
53- <td class="c-ref">{ r.Branch }</td>
54- </tr>
47+ </h2>
48+ if r.Desc != "" {
49+ <p class="repo-desc">{ r.Desc }</p>
50+ } else {
51+ <p class="repo-desc mute">no description</p>
52+ }
53+ <p class="repo-meta">
54+ if r.Branch != "" {
55+ <span class="repo-branch"><span class="ico i-branch" aria-hidden="true"></span>{ r.Branch }</span>
56+ }
57+ if r.PushedAt != "" {
58+ <span>pushed <time datetime={ r.PushedAt } title={ r.PushedAt }>{ r.Pushed }</time></span>
59+ } else {
60+ <span>never pushed</span>
61+ }
62+ </p>
63+ </li>
5564 }
5665
5766 // Outline is the README outline; levels indent by 2ch, the h1 is bold.
@@ -32,26 +32,35 @@ templ CloneBlock(c Clone) {
32 </div>32 </div>
33 }33 }
34 34
35-// HomeRow is one row of the home list. Its id is the target of SSE swaps.35+// HomeRowView is the card of a repository in the home list. Its id is the
36+// target of SSE swaps; the name link comes first, `enter` follows it.
36 templ HomeRowView(r HomeRow) {37 templ HomeRowView(r HomeRow) {
37- <tr id={ r.ID } data-cursor?={ r.Cursor }>38+ <li id={ r.ID } class="repo" data-cursor?={ r.Cursor }>
38- <td class="cur" aria-hidden="true"></td>39+ <h2 class="repo-name">
39- <td class="c-name">
40 <a href={ templ.SafeURL(r.Href) }>{ r.Name }</a>40 <a href={ templ.SafeURL(r.Href) }>{ r.Name }</a>
41+ if r.Private {
42+ <span class="pill">private</span>
43+ }
41 if r.Fresh {44 if r.Fresh {
42 <span class="pill new">new push</span>45 <span class="pill new">new push</span>
43 }46 }
44- </td>47+ </h2>
45- <td class="c-desc dim">{ r.Desc }</td>48+ if r.Desc != "" {
46- <td class="c-when nowrap">49+ <p class="repo-desc">{ r.Desc }</p>
47- <time50+ } else {
48- if r.PushedAt != "" {51+ <p class="repo-desc mute">no description</p>
49- datetime={ r.PushedAt }52+ }
50- }53+ <p class="repo-meta">
51- >{ r.Pushed }</time>54+ if r.Branch != "" {
52- </td>55+ <span class="repo-branch"><span class="ico i-branch" aria-hidden="true"></span>{ r.Branch }</span>
53- <td class="c-ref">{ r.Branch }</td>56+ }
54- </tr>57+ if r.PushedAt != "" {
58+ <span>pushed <time datetime={ r.PushedAt } title={ r.PushedAt }>{ r.Pushed }</time></span>
59+ } else {
60+ <span>never pushed</span>
61+ }
62+ </p>
63+ </li>
55 }64 }
56 65
57 // Outline is the README outline; levels indent by 2ch, the h1 is bold.66 // Outline is the README outline; levels indent by 2ch, the h1 is bold.
M internal/adapters/web/components_templ.go +206 -160 generated file: collapsed
M internal/adapters/web/events.go +1 -1
@@ -45,7 +45,7 @@ import (
4545 //
4646 // Events, each with the id of the Watch event it comes from:
4747 //
48-// home-list data: <tr id="repo-<name>">…</tr>, or <tr id="repo-<name>" data-gone></tr>
48+// home-list data: <li id="repo-<name>">…</li>, or <li id="repo-<name>" data-gone></li>
4949 // for a repository that is deleted or no longer visible
5050 // repo-last-push data: <dd id="last-push-<name>">…</dd>
5151 // refs-list data: <tbody id="ref-rows">…</tbody>, and again with
@@ -45,7 +45,7 @@ import (
45 //45 //
46 // Events, each with the id of the Watch event it comes from:46 // Events, each with the id of the Watch event it comes from:
47 //47 //
48-// home-list data: <tr id="repo-<name>">…</tr>, or <tr id="repo-<name>" data-gone></tr>48+// home-list data: <li id="repo-<name>">…</li>, or <li id="repo-<name>" data-gone></li>
49 // for a repository that is deleted or no longer visible49 // for a repository that is deleted or no longer visible
50 // repo-last-push data: <dd id="last-push-<name>">…</dd>50 // repo-last-push data: <dd id="last-push-<name>">…</dd>
51 // refs-list data: <tbody id="ref-rows">…</tbody>, and again with51 // refs-list data: <tbody id="ref-rows">…</tbody>, and again with
M internal/adapters/web/fragments.go +1 -1
@@ -116,7 +116,7 @@ func (l *liveStream) home(ctx context.Context, we ports.WatchEvent) ([]fragment,
116116 case err != nil:
117117 return nil, err
118118 }
119- row := homeRow(view, l.s.cfg.Now(), false)
119+ row := homeRow(view, l.s.cfg.Now(), false, SignedIn(ctx))
120120 row.Fresh = fresh
121121 f, err := renderFragment(ctx, "home-list", HomeRowView(row))
122122 return []fragment{f}, err
@@ -116,7 +116,7 @@ func (l *liveStream) home(ctx context.Context, we ports.WatchEvent) ([]fragment,
116 case err != nil:116 case err != nil:
117 return nil, err117 return nil, err
118 }118 }
119- row := homeRow(view, l.s.cfg.Now(), false)119+ row := homeRow(view, l.s.cfg.Now(), false, SignedIn(ctx))
120 row.Fresh = fresh120 row.Fresh = fresh
121 f, err := renderFragment(ctx, "home-list", HomeRowView(row))121 f, err := renderFragment(ctx, "home-list", HomeRowView(row))
122 return []fragment{f}, err122 return []fragment{f}, err
M internal/adapters/web/fragments.templ +2 -2
@@ -21,10 +21,10 @@ templ FactValue(f Fact) {
2121 </dd>
2222 }
2323
24-// RepoGone replaces the row of a repository that is deleted or not visible
24+// RepoGone replaces the card of a repository that is deleted or not visible
2525 // any more; the page removes the element.
2626 templ RepoGone(id string) {
27- <tr id={ id } data-gone hidden></tr>
27+ <li id={ id } data-gone hidden></li>
2828 }
2929
3030 // RefsBody is the rows of the refs table.
@@ -21,10 +21,10 @@ templ FactValue(f Fact) {
21 </dd>21 </dd>
22 }22 }
23 23
24-// RepoGone replaces the row of a repository that is deleted or not visible24+// RepoGone replaces the card of a repository that is deleted or not visible
25 // any more; the page removes the element.25 // any more; the page removes the element.
26 templ RepoGone(id string) {26 templ RepoGone(id string) {
27- <tr id={ id } data-gone hidden></tr>27+ <li id={ id } data-gone hidden></li>
28 }28 }
29 29
30 // RefsBody is the rows of the refs table.30 // RefsBody is the rows of the refs table.
M internal/adapters/web/fragments_templ.go +3 -3 generated file: collapsed
M internal/adapters/web/home.go +29 -21
@@ -11,6 +11,7 @@ import (
1111
1212 "github.com/a-h/templ"
1313
14+ "bnema.dev/ermite/internal/domain"
1415 "bnema.dev/ermite/internal/ports"
1516 )
1617
@@ -48,14 +49,16 @@ func (s *Server) listRepos(ctx context.Context) ([]ports.RepoView, error) {
4849 return repos, nil
4950 }
5051
51-// homeCols are the sortable columns of the home list, in order.
52-var homeCols = []struct{ key, label, class string }{
53- {"name", "name", "c-name"},
54- {"desc", "description", "c-desc"},
55- {"push", "last push", "c-when"},
56- {"branch", "branch", "c-ref"},
52+// homeSorts are the orders the home list offers, in order. The query also
53+// accepts "desc" and "branch", which the page does not link to.
54+var homeSorts = []struct{ key, label string }{
55+ {"push", "last push"},
56+ {"name", "name"},
5757 }
5858
59+// homeKeys are the keys of ?sort= that sortRepos knows.
60+var homeKeys = []string{"push", "name", "desc", "branch"}
61+
5962 // sortRepos orders repos by the column key; ties keep the order by name.
6063 func sortRepos(repos []ports.RepoView, key string, desc bool) {
6164 less := func(a, b ports.RepoView) bool {
@@ -85,9 +88,9 @@ func (s *Server) home(ctx context.Context, r *http.Request) (templ.Component, in
8588 return nil, 0, err
8689 }
8790 key, desc := "push", true
88- for _, c := range homeCols {
89- if r.URL.Query().Get("sort") == c.key {
90- key, desc = c.key, c.key == "push"
91+ for _, k := range homeKeys {
92+ if r.URL.Query().Get("sort") == k {
93+ key, desc = k, k == "push"
9194 }
9295 }
9396 if d := r.URL.Query().Get("dir"); d == "asc" || d == "desc" {
@@ -96,23 +99,26 @@ func (s *Server) home(ctx context.Context, r *http.Request) (templ.Component, in
9699 sortRepos(repos, key, desc)
97100
98101 now := s.cfg.Now()
102+ signed := SignedIn(ctx)
99103 p := HomePage{}
100- for _, c := range homeCols {
101- sc := SortCol{Label: c.label, Class: c.class, Dir: "none"}
104+ for _, c := range homeSorts {
105+ sl := SortLink{Label: c.label}
102106 next := "asc"
107+ if c.key == "push" {
108+ next = "desc"
109+ }
103110 if c.key == key {
104- sc.Dir, sc.Mark = "ascending", "▲"
111+ sl.Mark, sl.State = "▲", "ascending, select for descending"
112+ next = "desc"
105113 if desc {
106- sc.Dir, sc.Mark = "descending", "▼"
107- } else {
108- next = "desc"
114+ sl.Mark, sl.State, next = "▼", "descending, select for ascending", "asc"
109115 }
110116 }
111- sc.Href = "/?sort=" + c.key + "&dir=" + next
112- p.Cols = append(p.Cols, sc)
117+ sl.Href = "/?sort=" + c.key + "&dir=" + next
118+ p.Sorts = append(p.Sorts, sl)
113119 }
114120 for i, repo := range repos {
115- p.Rows = append(p.Rows, homeRow(repo, now, i == 0))
121+ p.Rows = append(p.Rows, homeRow(repo, now, i == 0, signed))
116122 }
117123
118124 l := s.base()
@@ -122,12 +128,14 @@ func (s *Server) home(ctx context.Context, r *http.Request) (templ.Component, in
122128 return Home(l, p), http.StatusOK, nil
123129 }
124130
125-// homeRow is the row of a repository in the home list.
126-func homeRow(r ports.RepoView, now time.Time, cursor bool) HomeRow {
131+// homeRow is the card of a repository in the home list. The private badge is
132+// for a signed-in visitor: an anonymous one never gets a private repository.
133+func homeRow(r ports.RepoView, now time.Time, cursor, signed bool) HomeRow {
127134 name := r.Name.String()
128135 row := HomeRow{
129136 ID: "repo-" + name, Name: name, Href: repoHref(name),
130- Desc: r.Description, Pushed: "never", Branch: r.DefaultBranch, Cursor: cursor,
137+ Desc: r.Description, Branch: r.DefaultBranch, Cursor: cursor,
138+ Private: signed && r.Visibility == domain.VisibilityPrivate,
131139 }
132140 if !r.PushedAt.IsZero() {
133141 row.Pushed, row.PushedAt = ago(now, r.PushedAt), rfc3339(r.PushedAt)
@@ -11,6 +11,7 @@ import (
11 11
12 "github.com/a-h/templ"12 "github.com/a-h/templ"
13 13
14+ "bnema.dev/ermite/internal/domain"
14 "bnema.dev/ermite/internal/ports"15 "bnema.dev/ermite/internal/ports"
15 )16 )
16 17
@@ -48,14 +49,16 @@ func (s *Server) listRepos(ctx context.Context) ([]ports.RepoView, error) {
48 return repos, nil49 return repos, nil
49 }50 }
50 51
51-// homeCols are the sortable columns of the home list, in order.52+// homeSorts are the orders the home list offers, in order. The query also
52-var homeCols = []struct{ key, label, class string }{53+// accepts "desc" and "branch", which the page does not link to.
53- {"name", "name", "c-name"},54+var homeSorts = []struct{ key, label string }{
54- {"desc", "description", "c-desc"},55+ {"push", "last push"},
55- {"push", "last push", "c-when"},56+ {"name", "name"},
56- {"branch", "branch", "c-ref"},
57 }57 }
58 58
59+// homeKeys are the keys of ?sort= that sortRepos knows.
60+var homeKeys = []string{"push", "name", "desc", "branch"}
61+
59 // sortRepos orders repos by the column key; ties keep the order by name.62 // sortRepos orders repos by the column key; ties keep the order by name.
60 func sortRepos(repos []ports.RepoView, key string, desc bool) {63 func sortRepos(repos []ports.RepoView, key string, desc bool) {
61 less := func(a, b ports.RepoView) bool {64 less := func(a, b ports.RepoView) bool {
@@ -85,9 +88,9 @@ func (s *Server) home(ctx context.Context, r *http.Request) (templ.Component, in
85 return nil, 0, err88 return nil, 0, err
86 }89 }
87 key, desc := "push", true90 key, desc := "push", true
88- for _, c := range homeCols {91+ for _, k := range homeKeys {
89- if r.URL.Query().Get("sort") == c.key {92+ if r.URL.Query().Get("sort") == k {
90- key, desc = c.key, c.key == "push"93+ key, desc = k, k == "push"
91 }94 }
92 }95 }
93 if d := r.URL.Query().Get("dir"); d == "asc" || d == "desc" {96 if d := r.URL.Query().Get("dir"); d == "asc" || d == "desc" {
@@ -96,23 +99,26 @@ func (s *Server) home(ctx context.Context, r *http.Request) (templ.Component, in
96 sortRepos(repos, key, desc)99 sortRepos(repos, key, desc)
97 100
98 now := s.cfg.Now()101 now := s.cfg.Now()
102+ signed := SignedIn(ctx)
99 p := HomePage{}103 p := HomePage{}
100- for _, c := range homeCols {104+ for _, c := range homeSorts {
101- sc := SortCol{Label: c.label, Class: c.class, Dir: "none"}105+ sl := SortLink{Label: c.label}
102 next := "asc"106 next := "asc"
107+ if c.key == "push" {
108+ next = "desc"
109+ }
103 if c.key == key {110 if c.key == key {
104- sc.Dir, sc.Mark = "ascending", "▲"111+ sl.Mark, sl.State = "▲", "ascending, select for descending"
112+ next = "desc"
105 if desc {113 if desc {
106- sc.Dir, sc.Mark = "descending", "▼"114+ sl.Mark, sl.State, next = "▼", "descending, select for ascending", "asc"
107- } else {
108- next = "desc"
109 }115 }
110 }116 }
111- sc.Href = "/?sort=" + c.key + "&dir=" + next117+ sl.Href = "/?sort=" + c.key + "&dir=" + next
112- p.Cols = append(p.Cols, sc)118+ p.Sorts = append(p.Sorts, sl)
113 }119 }
114 for i, repo := range repos {120 for i, repo := range repos {
115- p.Rows = append(p.Rows, homeRow(repo, now, i == 0))121+ p.Rows = append(p.Rows, homeRow(repo, now, i == 0, signed))
116 }122 }
117 123
118 l := s.base()124 l := s.base()
@@ -122,12 +128,14 @@ func (s *Server) home(ctx context.Context, r *http.Request) (templ.Component, in
122 return Home(l, p), http.StatusOK, nil128 return Home(l, p), http.StatusOK, nil
123 }129 }
124 130
125-// homeRow is the row of a repository in the home list.131+// homeRow is the card of a repository in the home list. The private badge is
126-func homeRow(r ports.RepoView, now time.Time, cursor bool) HomeRow {132+// for a signed-in visitor: an anonymous one never gets a private repository.
133+func homeRow(r ports.RepoView, now time.Time, cursor, signed bool) HomeRow {
127 name := r.Name.String()134 name := r.Name.String()
128 row := HomeRow{135 row := HomeRow{
129 ID: "repo-" + name, Name: name, Href: repoHref(name),136 ID: "repo-" + name, Name: name, Href: repoHref(name),
130- Desc: r.Description, Pushed: "never", Branch: r.DefaultBranch, Cursor: cursor,137+ Desc: r.Description, Branch: r.DefaultBranch, Cursor: cursor,
138+ Private: signed && r.Visibility == domain.VisibilityPrivate,
131 }139 }
132 if !r.PushedAt.IsZero() {140 if !r.PushedAt.IsZero() {
133 row.Pushed, row.PushedAt = ago(now, r.PushedAt), rfc3339(r.PushedAt)141 row.Pushed, row.PushedAt = ago(now, r.PushedAt), rfc3339(r.PushedAt)
M internal/adapters/web/pages.templ +39 -32
@@ -5,42 +5,49 @@ package web
55 // Home is the repository list.
66 templ Home(l Layout, p HomePage) {
77 @Shell(l, nil) {
8- <div class="filter">
9- <label for="home-filter" class="sr">filter</label>
10- <input
11- id="home-filter"
12- type="search"
13- data-filter="#repo-rows > tr"
14- placeholder="Filter repositories…"
15- autocomplete="off"
16- hx-on:input="ermite.filter(this)"
17- />
18- </div>
19- <table class="list home" aria-label="Repositories">
20- <thead>
21- <tr>
22- <th class="cur"></th>
23- for _, c := range p.Cols {
24- <th class={ c.Class } aria-sort={ c.Dir }>
25- <a href={ templ.SafeURL(c.Href) }>
26- { c.Label }
27- if c.Mark != "" {
28- <span aria-hidden="true">{ c.Mark }</span>
8+ <h1 class="sr">Repositories</h1>
9+ <div class="home">
10+ <section class="home-repos" aria-label="Repositories">
11+ <div class="home-bar">
12+ <div class="filter">
13+ <label for="home-filter" class="sr">filter</label>
14+ <input
15+ id="home-filter"
16+ type="search"
17+ data-filter="#repo-rows > li"
18+ placeholder="Filter repositories…"
19+ autocomplete="off"
20+ hx-on:input="ermite.filter(this)"
21+ />
22+ </div>
23+ <nav class="sort" aria-label="Sort repositories">
24+ <span class="mute">sort</span>
25+ for _, s := range p.Sorts {
26+ <a
27+ href={ templ.SafeURL(s.Href) }
28+ if s.Mark != "" {
29+ aria-current="true"
30+ }
31+ >
32+ { s.Label }
33+ if s.Mark != "" {
34+ <span aria-hidden="true">{ s.Mark }</span>
35+ <span class="sr">{ ", " + s.State }</span>
2936 }
3037 </a>
31- </th>
38+ }
39+ </nav>
40+ </div>
41+ <ul class="repos" id="repo-rows" data-rows>
42+ for _, r := range p.Rows {
43+ @HomeRowView(r)
3244 }
33- </tr>
34- </thead>
35- <tbody id="repo-rows" data-rows>
36- for _, r := range p.Rows {
37- @HomeRowView(r)
45+ </ul>
46+ if len(p.Rows) == 0 {
47+ <p class="lede dim">no repositories yet.</p>
3848 }
39- </tbody>
40- </table>
41- if len(p.Rows) == 0 {
42- <p class="lede dim">no repositories yet.</p>
43- }
49+ </section>
50+ </div>
4451 }
4552 }
4653
@@ -5,42 +5,49 @@ package web
5 // Home is the repository list.5 // Home is the repository list.
6 templ Home(l Layout, p HomePage) {6 templ Home(l Layout, p HomePage) {
7 @Shell(l, nil) {7 @Shell(l, nil) {
8- <div class="filter">8+ <h1 class="sr">Repositories</h1>
9- <label for="home-filter" class="sr">filter</label>9+ <div class="home">
10- <input10+ <section class="home-repos" aria-label="Repositories">
11- id="home-filter"11+ <div class="home-bar">
12- type="search"12+ <div class="filter">
13- data-filter="#repo-rows > tr"13+ <label for="home-filter" class="sr">filter</label>
14- placeholder="Filter repositories…"14+ <input
15- autocomplete="off"15+ id="home-filter"
16- hx-on:input="ermite.filter(this)"16+ type="search"
17- />17+ data-filter="#repo-rows > li"
18- </div>18+ placeholder="Filter repositories…"
19- <table class="list home" aria-label="Repositories">19+ autocomplete="off"
20- <thead>20+ hx-on:input="ermite.filter(this)"
21- <tr>21+ />
22- <th class="cur"></th>22+ </div>
23- for _, c := range p.Cols {23+ <nav class="sort" aria-label="Sort repositories">
24- <th class={ c.Class } aria-sort={ c.Dir }>24+ <span class="mute">sort</span>
25- <a href={ templ.SafeURL(c.Href) }>25+ for _, s := range p.Sorts {
26- { c.Label }26+ <a
27- if c.Mark != "" {27+ href={ templ.SafeURL(s.Href) }
28- <span aria-hidden="true">{ c.Mark }</span>28+ if s.Mark != "" {
29+ aria-current="true"
30+ }
31+ >
32+ { s.Label }
33+ if s.Mark != "" {
34+ <span aria-hidden="true">{ s.Mark }</span>
35+ <span class="sr">{ ", " + s.State }</span>
29 }36 }
30 </a>37 </a>
31- </th>38+ }
39+ </nav>
40+ </div>
41+ <ul class="repos" id="repo-rows" data-rows>
42+ for _, r := range p.Rows {
43+ @HomeRowView(r)
32 }44 }
33- </tr>45+ </ul>
34- </thead>46+ if len(p.Rows) == 0 {
35- <tbody id="repo-rows" data-rows>47+ <p class="lede dim">no repositories yet.</p>
36- for _, r := range p.Rows {
37- @HomeRowView(r)
38 }48 }
39- </tbody>49+ </section>
40- </table>50+ </div>
41- if len(p.Rows) == 0 {
42- <p class="lede dim">no repositories yet.</p>
43- }
44 }51 }
45 }52 }
46 53
M internal/adapters/web/pages_templ.go +369 -373
@@ -44,65 +44,44 @@ func Home(l Layout, p HomePage) templ.Component {
4444 }()
4545 }
4646 ctx = templ.InitializeContext(ctx)
47- templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 1, "<div class=\"filter\"><label for=\"home-filter\" class=\"sr\">filter</label> <input id=\"home-filter\" type=\"search\" data-filter=\"#repo-rows > tr\" placeholder=\"Filter repositories…\" autocomplete=\"off\" hx-on:input=\"ermite.filter(this)\"></div><table class=\"list home\" aria-label=\"Repositories\"><thead><tr><th class=\"cur\"></th>")
47+ templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 1, "<h1 class=\"sr\">Repositories</h1><div class=\"home\"><section class=\"home-repos\" aria-label=\"Repositories\"><div class=\"home-bar\"><div class=\"filter\"><label for=\"home-filter\" class=\"sr\">filter</label> <input id=\"home-filter\" type=\"search\" data-filter=\"#repo-rows > li\" placeholder=\"Filter repositories…\" autocomplete=\"off\" hx-on:input=\"ermite.filter(this)\"></div><nav class=\"sort\" aria-label=\"Sort repositories\"><span class=\"mute\">sort</span> ")
4848 if templ_7745c5c3_Err != nil {
4949 return templ_7745c5c3_Err
5050 }
51- for _, c := range p.Cols {
52- var templ_7745c5c3_Var3 = []any{c.Class}
53- templ_7745c5c3_Err = templ.RenderCSSItems(ctx, templ_7745c5c3_Buffer, templ_7745c5c3_Var3...)
51+ for _, s := range p.Sorts {
52+ templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 2, "<a href=\"")
5453 if templ_7745c5c3_Err != nil {
5554 return templ_7745c5c3_Err
5655 }
57- templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 2, "<th class=\"")
56+ var templ_7745c5c3_Var3 templ.SafeURL
57+ templ_7745c5c3_Var3, templ_7745c5c3_Err = templ.JoinURLErrs(templ.SafeURL(s.Href))
5858 if templ_7745c5c3_Err != nil {
59- return templ_7745c5c3_Err
60- }
61- var templ_7745c5c3_Var4 string
62- templ_7745c5c3_Var4, templ_7745c5c3_Err = templ.ResolveAttributeValue(templ.CSSClasses(templ_7745c5c3_Var3).String())
63- if templ_7745c5c3_Err != nil {
64- return templ.Error{Err: templ_7745c5c3_Err, FileName: `internal/adapters/web/pages.templ`, Line: 1, Col: 0}
65- }
66- _, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(templ_7745c5c3_Var4)
67- if templ_7745c5c3_Err != nil {
68- return templ_7745c5c3_Err
69- }
70- templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 3, "\" aria-sort=\"")
71- if templ_7745c5c3_Err != nil {
72- return templ_7745c5c3_Err
59+ return templ.Error{Err: templ_7745c5c3_Err, FileName: `internal/adapters/web/pages.templ`, Line: 27, Col: 36}
7360 }
74- var templ_7745c5c3_Var5 string
75- templ_7745c5c3_Var5, templ_7745c5c3_Err = templ.ResolveAttributeValue(c.Dir)
76- if templ_7745c5c3_Err != nil {
77- return templ.Error{Err: templ_7745c5c3_Err, FileName: `internal/adapters/web/pages.templ`, Line: 24, Col: 45}
78- }
79- _, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(templ_7745c5c3_Var5)
61+ _, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(templ.EscapeString(templ_7745c5c3_Var3))
8062 if templ_7745c5c3_Err != nil {
8163 return templ_7745c5c3_Err
8264 }
83- templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 4, "\"><a href=\"")
65+ templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 3, "\"")
8466 if templ_7745c5c3_Err != nil {
8567 return templ_7745c5c3_Err
8668 }
87- var templ_7745c5c3_Var6 templ.SafeURL
88- templ_7745c5c3_Var6, templ_7745c5c3_Err = templ.JoinURLErrs(templ.SafeURL(c.Href))
89- if templ_7745c5c3_Err != nil {
90- return templ.Error{Err: templ_7745c5c3_Err, FileName: `internal/adapters/web/pages.templ`, Line: 25, Col: 38}
91- }
92- _, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(templ.EscapeString(templ_7745c5c3_Var6))
93- if templ_7745c5c3_Err != nil {
94- return templ_7745c5c3_Err
69+ if s.Mark != "" {
70+ templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 4, " aria-current=\"true\"")
71+ if templ_7745c5c3_Err != nil {
72+ return templ_7745c5c3_Err
73+ }
9574 }
96- templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 5, "\">")
75+ templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 5, ">")
9776 if templ_7745c5c3_Err != nil {
9877 return templ_7745c5c3_Err
9978 }
100- var templ_7745c5c3_Var7 string
101- templ_7745c5c3_Var7, templ_7745c5c3_Err = templ.JoinStringErrs(c.Label)
79+ var templ_7745c5c3_Var4 string
80+ templ_7745c5c3_Var4, templ_7745c5c3_Err = templ.JoinStringErrs(s.Label)
10281 if templ_7745c5c3_Err != nil {
103- return templ.Error{Err: templ_7745c5c3_Err, FileName: `internal/adapters/web/pages.templ`, Line: 26, Col: 17}
82+ return templ.Error{Err: templ_7745c5c3_Err, FileName: `internal/adapters/web/pages.templ`, Line: 32, Col: 17}
10483 }
105- _, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(templ.EscapeString(templ_7745c5c3_Var7))
84+ _, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(templ.EscapeString(templ_7745c5c3_Var4))
10685 if templ_7745c5c3_Err != nil {
10786 return templ_7745c5c3_Err
10887 }
@@ -110,31 +89,44 @@ func Home(l Layout, p HomePage) templ.Component {
11089 if templ_7745c5c3_Err != nil {
11190 return templ_7745c5c3_Err
11291 }
113- if c.Mark != "" {
92+ if s.Mark != "" {
11493 templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 7, "<span aria-hidden=\"true\">")
11594 if templ_7745c5c3_Err != nil {
11695 return templ_7745c5c3_Err
11796 }
118- var templ_7745c5c3_Var8 string
119- templ_7745c5c3_Var8, templ_7745c5c3_Err = templ.JoinStringErrs(c.Mark)
97+ var templ_7745c5c3_Var5 string
98+ templ_7745c5c3_Var5, templ_7745c5c3_Err = templ.JoinStringErrs(s.Mark)
12099 if templ_7745c5c3_Err != nil {
121- return templ.Error{Err: templ_7745c5c3_Err, FileName: `internal/adapters/web/pages.templ`, Line: 28, Col: 42}
100+ return templ.Error{Err: templ_7745c5c3_Err, FileName: `internal/adapters/web/pages.templ`, Line: 34, Col: 42}
122101 }
123- _, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(templ.EscapeString(templ_7745c5c3_Var8))
102+ _, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(templ.EscapeString(templ_7745c5c3_Var5))
124103 if templ_7745c5c3_Err != nil {
125104 return templ_7745c5c3_Err
126105 }
127- templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 8, "</span>")
106+ templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 8, "</span> <span class=\"sr\">")
107+ if templ_7745c5c3_Err != nil {
108+ return templ_7745c5c3_Err
109+ }
110+ var templ_7745c5c3_Var6 string
111+ templ_7745c5c3_Var6, templ_7745c5c3_Err = templ.JoinStringErrs(", " + s.State)
112+ if templ_7745c5c3_Err != nil {
113+ return templ.Error{Err: templ_7745c5c3_Err, FileName: `internal/adapters/web/pages.templ`, Line: 35, Col: 42}
114+ }
115+ _, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(templ.EscapeString(templ_7745c5c3_Var6))
116+ if templ_7745c5c3_Err != nil {
117+ return templ_7745c5c3_Err
118+ }
119+ templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 9, "</span>")
128120 if templ_7745c5c3_Err != nil {
129121 return templ_7745c5c3_Err
130122 }
131123 }
132- templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 9, "</a></th>")
124+ templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 10, "</a>")
133125 if templ_7745c5c3_Err != nil {
134126 return templ_7745c5c3_Err
135127 }
136128 }
137- templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 10, "</tr></thead> <tbody id=\"repo-rows\" data-rows>")
129+ templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 11, "</nav></div><ul class=\"repos\" id=\"repo-rows\" data-rows>")
138130 if templ_7745c5c3_Err != nil {
139131 return templ_7745c5c3_Err
140132 }
@@ -144,16 +136,20 @@ func Home(l Layout, p HomePage) templ.Component {
144136 return templ_7745c5c3_Err
145137 }
146138 }
147- templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 11, "</tbody></table>")
139+ templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 12, "</ul>")
148140 if templ_7745c5c3_Err != nil {
149141 return templ_7745c5c3_Err
150142 }
151143 if len(p.Rows) == 0 {
152- templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 12, "<p class=\"lede dim\">no repositories yet.</p>")
144+ templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 13, "<p class=\"lede dim\">no repositories yet.</p>")
153145 if templ_7745c5c3_Err != nil {
154146 return templ_7745c5c3_Err
155147 }
156148 }
149+ templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 14, "</section></div>")
150+ if templ_7745c5c3_Err != nil {
151+ return templ_7745c5c3_Err
152+ }
157153 return nil
158154 })
159155 templ_7745c5c3_Err = Shell(l, nil).Render(templ.WithChildren(ctx, templ_7745c5c3_Var2), templ_7745c5c3_Buffer)
@@ -182,12 +178,12 @@ func Summary(l Layout, p SummaryPage) templ.Component {
182178 }()
183179 }
184180 ctx = templ.InitializeContext(ctx)
185- templ_7745c5c3_Var9 := templ.GetChildren(ctx)
186- if templ_7745c5c3_Var9 == nil {
187- templ_7745c5c3_Var9 = templ.NopComponent
181+ templ_7745c5c3_Var7 := templ.GetChildren(ctx)
182+ if templ_7745c5c3_Var7 == nil {
183+ templ_7745c5c3_Var7 = templ.NopComponent
188184 }
189185 ctx = templ.ClearChildren(ctx)
190- templ_7745c5c3_Var10 := templruntime.GeneratedTemplate(func(templ_7745c5c3_Input templruntime.GeneratedComponentInput) (templ_7745c5c3_Err error) {
186+ templ_7745c5c3_Var8 := templruntime.GeneratedTemplate(func(templ_7745c5c3_Input templruntime.GeneratedComponentInput) (templ_7745c5c3_Err error) {
191187 templ_7745c5c3_W, ctx := templ_7745c5c3_Input.Writer, templ_7745c5c3_Input.Context
192188 templ_7745c5c3_Buffer, templ_7745c5c3_IsBuffer := templruntime.GetBuffer(templ_7745c5c3_W)
193189 if !templ_7745c5c3_IsBuffer {
@@ -207,7 +203,7 @@ func Summary(l Layout, p SummaryPage) templ.Component {
207203 }
208204 return nil
209205 })
210- templ_7745c5c3_Err = Shell(l, summaryRail(p)).Render(templ.WithChildren(ctx, templ_7745c5c3_Var10), templ_7745c5c3_Buffer)
206+ templ_7745c5c3_Err = Shell(l, summaryRail(p)).Render(templ.WithChildren(ctx, templ_7745c5c3_Var8), templ_7745c5c3_Buffer)
211207 if templ_7745c5c3_Err != nil {
212208 return templ_7745c5c3_Err
213209 }
@@ -234,132 +230,132 @@ func latestTagFact(t LatestTag) templ.Component {
234230 }()
235231 }
236232 ctx = templ.InitializeContext(ctx)
237- templ_7745c5c3_Var11 := templ.GetChildren(ctx)
238- if templ_7745c5c3_Var11 == nil {
239- templ_7745c5c3_Var11 = templ.NopComponent
233+ templ_7745c5c3_Var9 := templ.GetChildren(ctx)
234+ if templ_7745c5c3_Var9 == nil {
235+ templ_7745c5c3_Var9 = templ.NopComponent
240236 }
241237 ctx = templ.ClearChildren(ctx)
242- templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 13, "<dt>latest tag</dt><dd class=\"latest-tag\">")
238+ templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 15, "<dt>latest tag</dt><dd class=\"latest-tag\">")
243239 if templ_7745c5c3_Err != nil {
244240 return templ_7745c5c3_Err
245241 }
246242 if t.Name != "" {
247- templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 14, "<a class=\"tag-name\" href=\"")
243+ templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 16, "<a class=\"tag-name\" href=\"")
248244 if templ_7745c5c3_Err != nil {
249245 return templ_7745c5c3_Err
250246 }
251- var templ_7745c5c3_Var12 templ.SafeURL
252- templ_7745c5c3_Var12, templ_7745c5c3_Err = templ.JoinURLErrs(templ.SafeURL(t.Href))
247+ var templ_7745c5c3_Var10 templ.SafeURL
248+ templ_7745c5c3_Var10, templ_7745c5c3_Err = templ.JoinURLErrs(templ.SafeURL(t.Href))
253249 if templ_7745c5c3_Err != nil {
254- return templ.Error{Err: templ_7745c5c3_Err, FileName: `internal/adapters/web/pages.templ`, Line: 64, Col: 51}
250+ return templ.Error{Err: templ_7745c5c3_Err, FileName: `internal/adapters/web/pages.templ`, Line: 71, Col: 51}
255251 }
256- _, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(templ.EscapeString(templ_7745c5c3_Var12))
252+ _, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(templ.EscapeString(templ_7745c5c3_Var10))
257253 if templ_7745c5c3_Err != nil {
258254 return templ_7745c5c3_Err
259255 }
260- templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 15, "\" title=\"")
256+ templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 17, "\" title=\"")
261257 if templ_7745c5c3_Err != nil {
262258 return templ_7745c5c3_Err
263259 }
264- var templ_7745c5c3_Var13 string
265- templ_7745c5c3_Var13, templ_7745c5c3_Err = templ.ResolveAttributeValue(t.Subject)
260+ var templ_7745c5c3_Var11 string
261+ templ_7745c5c3_Var11, templ_7745c5c3_Err = templ.ResolveAttributeValue(t.Subject)
266262 if templ_7745c5c3_Err != nil {
267- return templ.Error{Err: templ_7745c5c3_Err, FileName: `internal/adapters/web/pages.templ`, Line: 64, Col: 71}
263+ return templ.Error{Err: templ_7745c5c3_Err, FileName: `internal/adapters/web/pages.templ`, Line: 71, Col: 71}
268264 }
269- _, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(templ_7745c5c3_Var13)
265+ _, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(templ_7745c5c3_Var11)
270266 if templ_7745c5c3_Err != nil {
271267 return templ_7745c5c3_Err
272268 }
273- templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 16, "\"><span class=\"ico i-tag\" aria-hidden=\"true\"></span>")
269+ templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 18, "\"><span class=\"ico i-tag\" aria-hidden=\"true\"></span>")
274270 if templ_7745c5c3_Err != nil {
275271 return templ_7745c5c3_Err
276272 }
277- var templ_7745c5c3_Var14 string
278- templ_7745c5c3_Var14, templ_7745c5c3_Err = templ.JoinStringErrs(t.Name)
273+ var templ_7745c5c3_Var12 string
274+ templ_7745c5c3_Var12, templ_7745c5c3_Err = templ.JoinStringErrs(t.Name)
279275 if templ_7745c5c3_Err != nil {
280- return templ.Error{Err: templ_7745c5c3_Err, FileName: `internal/adapters/web/pages.templ`, Line: 64, Col: 132}
276+ return templ.Error{Err: templ_7745c5c3_Err, FileName: `internal/adapters/web/pages.templ`, Line: 71, Col: 132}
281277 }
282- _, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(templ.EscapeString(templ_7745c5c3_Var14))
278+ _, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(templ.EscapeString(templ_7745c5c3_Var12))
283279 if templ_7745c5c3_Err != nil {
284280 return templ_7745c5c3_Err
285281 }
286- templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 17, "</a> ")
282+ templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 19, "</a> ")
287283 if templ_7745c5c3_Err != nil {
288284 return templ_7745c5c3_Err
289285 }
290286 if t.WhenAt != "" {
291- templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 18, "<time class=\"dim\" datetime=\"")
287+ templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 20, "<time class=\"dim\" datetime=\"")
292288 if templ_7745c5c3_Err != nil {
293289 return templ_7745c5c3_Err
294290 }
295- var templ_7745c5c3_Var15 string
296- templ_7745c5c3_Var15, templ_7745c5c3_Err = templ.ResolveAttributeValue(t.WhenAt)
291+ var templ_7745c5c3_Var13 string
292+ templ_7745c5c3_Var13, templ_7745c5c3_Err = templ.ResolveAttributeValue(t.WhenAt)
297293 if templ_7745c5c3_Err != nil {
298- return templ.Error{Err: templ_7745c5c3_Err, FileName: `internal/adapters/web/pages.templ`, Line: 66, Col: 41}
294+ return templ.Error{Err: templ_7745c5c3_Err, FileName: `internal/adapters/web/pages.templ`, Line: 73, Col: 41}
299295 }
300- _, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(templ_7745c5c3_Var15)
296+ _, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(templ_7745c5c3_Var13)
301297 if templ_7745c5c3_Err != nil {
302298 return templ_7745c5c3_Err
303299 }
304- templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 19, "\" title=\"")
300+ templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 21, "\" title=\"")
305301 if templ_7745c5c3_Err != nil {
306302 return templ_7745c5c3_Err
307303 }
308- var templ_7745c5c3_Var16 string
309- templ_7745c5c3_Var16, templ_7745c5c3_Err = templ.ResolveAttributeValue(t.WhenAt)
304+ var templ_7745c5c3_Var14 string
305+ templ_7745c5c3_Var14, templ_7745c5c3_Err = templ.ResolveAttributeValue(t.WhenAt)
310306 if templ_7745c5c3_Err != nil {
311- return templ.Error{Err: templ_7745c5c3_Err, FileName: `internal/adapters/web/pages.templ`, Line: 66, Col: 60}
307+ return templ.Error{Err: templ_7745c5c3_Err, FileName: `internal/adapters/web/pages.templ`, Line: 73, Col: 60}
312308 }
313- _, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(templ_7745c5c3_Var16)
309+ _, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(templ_7745c5c3_Var14)
314310 if templ_7745c5c3_Err != nil {
315311 return templ_7745c5c3_Err
316312 }
317- templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 20, "\">")
313+ templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 22, "\">")
318314 if templ_7745c5c3_Err != nil {
319315 return templ_7745c5c3_Err
320316 }
321- var templ_7745c5c3_Var17 string
322- templ_7745c5c3_Var17, templ_7745c5c3_Err = templ.JoinStringErrs(t.When)
317+ var templ_7745c5c3_Var15 string
318+ templ_7745c5c3_Var15, templ_7745c5c3_Err = templ.JoinStringErrs(t.When)
323319 if templ_7745c5c3_Err != nil {
324- return templ.Error{Err: templ_7745c5c3_Err, FileName: `internal/adapters/web/pages.templ`, Line: 66, Col: 71}
320+ return templ.Error{Err: templ_7745c5c3_Err, FileName: `internal/adapters/web/pages.templ`, Line: 73, Col: 71}
325321 }
326- _, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(templ.EscapeString(templ_7745c5c3_Var17))
322+ _, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(templ.EscapeString(templ_7745c5c3_Var15))
327323 if templ_7745c5c3_Err != nil {
328324 return templ_7745c5c3_Err
329325 }
330- templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 21, "</time> ")
326+ templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 23, "</time> ")
331327 if templ_7745c5c3_Err != nil {
332328 return templ_7745c5c3_Err
333329 }
334330 }
335331 }
336- templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 22, "<a class=\"all-tags\" href=\"")
332+ templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 24, "<a class=\"all-tags\" href=\"")
337333 if templ_7745c5c3_Err != nil {
338334 return templ_7745c5c3_Err
339335 }
340- var templ_7745c5c3_Var18 templ.SafeURL
341- templ_7745c5c3_Var18, templ_7745c5c3_Err = templ.JoinURLErrs(templ.SafeURL(t.RefsHref))
336+ var templ_7745c5c3_Var16 templ.SafeURL
337+ templ_7745c5c3_Var16, templ_7745c5c3_Err = templ.JoinURLErrs(templ.SafeURL(t.RefsHref))
342338 if templ_7745c5c3_Err != nil {
343- return templ.Error{Err: templ_7745c5c3_Err, FileName: `internal/adapters/web/pages.templ`, Line: 69, Col: 54}
339+ return templ.Error{Err: templ_7745c5c3_Err, FileName: `internal/adapters/web/pages.templ`, Line: 76, Col: 54}
344340 }
345- _, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(templ.EscapeString(templ_7745c5c3_Var18))
341+ _, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(templ.EscapeString(templ_7745c5c3_Var16))
346342 if templ_7745c5c3_Err != nil {
347343 return templ_7745c5c3_Err
348344 }
349- templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 23, "\">")
345+ templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 25, "\">")
350346 if templ_7745c5c3_Err != nil {
351347 return templ_7745c5c3_Err
352348 }
353- var templ_7745c5c3_Var19 string
354- templ_7745c5c3_Var19, templ_7745c5c3_Err = templ.JoinStringErrs(plural(t.Count, "tag", "tags"))
349+ var templ_7745c5c3_Var17 string
350+ templ_7745c5c3_Var17, templ_7745c5c3_Err = templ.JoinStringErrs(plural(t.Count, "tag", "tags"))
355351 if templ_7745c5c3_Err != nil {
356- return templ.Error{Err: templ_7745c5c3_Err, FileName: `internal/adapters/web/pages.templ`, Line: 69, Col: 89}
352+ return templ.Error{Err: templ_7745c5c3_Err, FileName: `internal/adapters/web/pages.templ`, Line: 76, Col: 89}
357353 }
358- _, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(templ.EscapeString(templ_7745c5c3_Var19))
354+ _, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(templ.EscapeString(templ_7745c5c3_Var17))
359355 if templ_7745c5c3_Err != nil {
360356 return templ_7745c5c3_Err
361357 }
362- templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 24, "</a></dd>")
358+ templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 26, "</a></dd>")
363359 if templ_7745c5c3_Err != nil {
364360 return templ_7745c5c3_Err
365361 }
@@ -383,12 +379,12 @@ func summaryRail(p SummaryPage) templ.Component {
383379 }()
384380 }
385381 ctx = templ.InitializeContext(ctx)
386- templ_7745c5c3_Var20 := templ.GetChildren(ctx)
387- if templ_7745c5c3_Var20 == nil {
388- templ_7745c5c3_Var20 = templ.NopComponent
382+ templ_7745c5c3_Var18 := templ.GetChildren(ctx)
383+ if templ_7745c5c3_Var18 == nil {
384+ templ_7745c5c3_Var18 = templ.NopComponent
389385 }
390386 ctx = templ.ClearChildren(ctx)
391- templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 25, "<section aria-labelledby=\"r-clone\"><h2 id=\"r-clone\">Clone</h2>")
387+ templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 27, "<section aria-labelledby=\"r-clone\"><h2 id=\"r-clone\">Clone</h2>")
392388 if templ_7745c5c3_Err != nil {
393389 return templ_7745c5c3_Err
394390 }
@@ -396,25 +392,25 @@ func summaryRail(p SummaryPage) templ.Component {
396392 if templ_7745c5c3_Err != nil {
397393 return templ_7745c5c3_Err
398394 }
399- templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 26, "</section><section aria-labelledby=\"r-facts\"><h2 id=\"r-facts\">About</h2><dl class=\"kv\">")
395+ templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 28, "</section><section aria-labelledby=\"r-facts\"><h2 id=\"r-facts\">About</h2><dl class=\"kv\">")
400396 if templ_7745c5c3_Err != nil {
401397 return templ_7745c5c3_Err
402398 }
403399 for _, f := range p.Facts {
404- templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 27, "<dt>")
400+ templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 29, "<dt>")
405401 if templ_7745c5c3_Err != nil {
406402 return templ_7745c5c3_Err
407403 }
408- var templ_7745c5c3_Var21 string
409- templ_7745c5c3_Var21, templ_7745c5c3_Err = templ.JoinStringErrs(f.Key)
404+ var templ_7745c5c3_Var19 string
405+ templ_7745c5c3_Var19, templ_7745c5c3_Err = templ.JoinStringErrs(f.Key)
410406 if templ_7745c5c3_Err != nil {
411- return templ.Error{Err: templ_7745c5c3_Err, FileName: `internal/adapters/web/pages.templ`, Line: 80, Col: 15}
407+ return templ.Error{Err: templ_7745c5c3_Err, FileName: `internal/adapters/web/pages.templ`, Line: 87, Col: 15}
412408 }
413- _, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(templ.EscapeString(templ_7745c5c3_Var21))
409+ _, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(templ.EscapeString(templ_7745c5c3_Var19))
414410 if templ_7745c5c3_Err != nil {
415411 return templ_7745c5c3_Err
416412 }
417- templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 28, "</dt>")
413+ templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 30, "</dt>")
418414 if templ_7745c5c3_Err != nil {
419415 return templ_7745c5c3_Err
420416 }
@@ -429,25 +425,25 @@ func summaryRail(p SummaryPage) templ.Component {
429425 return templ_7745c5c3_Err
430426 }
431427 }
432- templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 29, "</dl></section>")
428+ templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 31, "</dl></section>")
433429 if templ_7745c5c3_Err != nil {
434430 return templ_7745c5c3_Err
435431 }
436432 if len(p.Recent) > 0 {
437- templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 30, "<section aria-labelledby=\"r-recent\"><h2 id=\"r-recent\">Recent commits <a href=\"")
433+ templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 32, "<section aria-labelledby=\"r-recent\"><h2 id=\"r-recent\">Recent commits <a href=\"")
438434 if templ_7745c5c3_Err != nil {
439435 return templ_7745c5c3_Err
440436 }
441- var templ_7745c5c3_Var22 templ.SafeURL
442- templ_7745c5c3_Var22, templ_7745c5c3_Err = templ.JoinURLErrs(templ.SafeURL(p.AllHref))
437+ var templ_7745c5c3_Var20 templ.SafeURL
438+ templ_7745c5c3_Var20, templ_7745c5c3_Err = templ.JoinURLErrs(templ.SafeURL(p.AllHref))
443439 if templ_7745c5c3_Err != nil {
444- return templ.Error{Err: templ_7745c5c3_Err, FileName: `internal/adapters/web/pages.templ`, Line: 89, Col: 105}
440+ return templ.Error{Err: templ_7745c5c3_Err, FileName: `internal/adapters/web/pages.templ`, Line: 96, Col: 105}
445441 }
446- _, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(templ.EscapeString(templ_7745c5c3_Var22))
442+ _, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(templ.EscapeString(templ_7745c5c3_Var20))
447443 if templ_7745c5c3_Err != nil {
448444 return templ_7745c5c3_Err
449445 }
450- templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 31, "\">View all</a></h2>")
446+ templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 33, "\">View all</a></h2>")
451447 if templ_7745c5c3_Err != nil {
452448 return templ_7745c5c3_Err
453449 }
@@ -455,7 +451,7 @@ func summaryRail(p SummaryPage) templ.Component {
455451 if templ_7745c5c3_Err != nil {
456452 return templ_7745c5c3_Err
457453 }
458- templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 32, "</section>")
454+ templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 34, "</section>")
459455 if templ_7745c5c3_Err != nil {
460456 return templ_7745c5c3_Err
461457 }
@@ -467,7 +463,7 @@ func summaryRail(p SummaryPage) templ.Component {
467463 }
468464 }
469465 if len(p.Outline) > 0 && p.Readme != nil {
470- templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 33, "<section aria-labelledby=\"r-outline\"><h2 id=\"r-outline\">On this page</h2>")
466+ templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 35, "<section aria-labelledby=\"r-outline\"><h2 id=\"r-outline\">On this page</h2>")
471467 if templ_7745c5c3_Err != nil {
472468 return templ_7745c5c3_Err
473469 }
@@ -475,7 +471,7 @@ func summaryRail(p SummaryPage) templ.Component {
475471 if templ_7745c5c3_Err != nil {
476472 return templ_7745c5c3_Err
477473 }
478- templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 34, "</section>")
474+ templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 36, "</section>")
479475 if templ_7745c5c3_Err != nil {
480476 return templ_7745c5c3_Err
481477 }
@@ -501,12 +497,12 @@ func Refs(l Layout, p RefsPage) templ.Component {
501497 }()
502498 }
503499 ctx = templ.InitializeContext(ctx)
504- templ_7745c5c3_Var23 := templ.GetChildren(ctx)
505- if templ_7745c5c3_Var23 == nil {
506- templ_7745c5c3_Var23 = templ.NopComponent
500+ templ_7745c5c3_Var21 := templ.GetChildren(ctx)
501+ if templ_7745c5c3_Var21 == nil {
502+ templ_7745c5c3_Var21 = templ.NopComponent
507503 }
508504 ctx = templ.ClearChildren(ctx)
509- templ_7745c5c3_Var24 := templruntime.GeneratedTemplate(func(templ_7745c5c3_Input templruntime.GeneratedComponentInput) (templ_7745c5c3_Err error) {
505+ templ_7745c5c3_Var22 := templruntime.GeneratedTemplate(func(templ_7745c5c3_Input templruntime.GeneratedComponentInput) (templ_7745c5c3_Err error) {
510506 templ_7745c5c3_W, ctx := templ_7745c5c3_Input.Writer, templ_7745c5c3_Input.Context
511507 templ_7745c5c3_Buffer, templ_7745c5c3_IsBuffer := templruntime.GetBuffer(templ_7745c5c3_W)
512508 if !templ_7745c5c3_IsBuffer {
@@ -518,7 +514,7 @@ func Refs(l Layout, p RefsPage) templ.Component {
518514 }()
519515 }
520516 ctx = templ.InitializeContext(ctx)
521- templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 35, "<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=\"cur\"></th><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>")
517+ templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 37, "<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=\"cur\"></th><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>")
522518 if templ_7745c5c3_Err != nil {
523519 return templ_7745c5c3_Err
524520 }
@@ -526,32 +522,32 @@ func Refs(l Layout, p RefsPage) templ.Component {
526522 if templ_7745c5c3_Err != nil {
527523 return templ_7745c5c3_Err
528524 }
529- templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 36, "</table>")
525+ templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 38, "</table>")
530526 if templ_7745c5c3_Err != nil {
531527 return templ_7745c5c3_Err
532528 }
533529 if p.Note != "" {
534- templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 37, "<p class=\"note\">")
530+ templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 39, "<p class=\"note\">")
535531 if templ_7745c5c3_Err != nil {
536532 return templ_7745c5c3_Err
537533 }
538- var templ_7745c5c3_Var25 string
539- templ_7745c5c3_Var25, templ_7745c5c3_Err = templ.JoinStringErrs(p.Note)
534+ var templ_7745c5c3_Var23 string
535+ templ_7745c5c3_Var23, templ_7745c5c3_Err = templ.JoinStringErrs(p.Note)
540536 if templ_7745c5c3_Err != nil {
541- return templ.Error{Err: templ_7745c5c3_Err, FileName: `internal/adapters/web/pages.templ`, Line: 122, Col: 27}
537+ return templ.Error{Err: templ_7745c5c3_Err, FileName: `internal/adapters/web/pages.templ`, Line: 129, Col: 27}
542538 }
543- _, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(templ.EscapeString(templ_7745c5c3_Var25))
539+ _, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(templ.EscapeString(templ_7745c5c3_Var23))
544540 if templ_7745c5c3_Err != nil {
545541 return templ_7745c5c3_Err
546542 }
547- templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 38, "</p>")
543+ templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 40, "</p>")
548544 if templ_7745c5c3_Err != nil {
549545 return templ_7745c5c3_Err
550546 }
551547 }
552548 return nil
553549 })
554- templ_7745c5c3_Err = Shell(l, refsRail(p)).Render(templ.WithChildren(ctx, templ_7745c5c3_Var24), templ_7745c5c3_Buffer)
550+ templ_7745c5c3_Err = Shell(l, refsRail(p)).Render(templ.WithChildren(ctx, templ_7745c5c3_Var22), templ_7745c5c3_Buffer)
555551 if templ_7745c5c3_Err != nil {
556552 return templ_7745c5c3_Err
557553 }
@@ -575,112 +571,112 @@ func refRow(kind string, r RefRow) templ.Component {
575571 }()
576572 }
577573 ctx = templ.InitializeContext(ctx)
578- templ_7745c5c3_Var26 := templ.GetChildren(ctx)
579- if templ_7745c5c3_Var26 == nil {
580- templ_7745c5c3_Var26 = templ.NopComponent
574+ templ_7745c5c3_Var24 := templ.GetChildren(ctx)
575+ if templ_7745c5c3_Var24 == nil {
576+ templ_7745c5c3_Var24 = templ.NopComponent
581577 }
582578 ctx = templ.ClearChildren(ctx)
583- templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 39, "<tr")
579+ templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 41, "<tr")
584580 if templ_7745c5c3_Err != nil {
585581 return templ_7745c5c3_Err
586582 }
587583 if r.Cursor {
588- templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 40, " data-cursor")
584+ templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 42, " data-cursor")
589585 if templ_7745c5c3_Err != nil {
590586 return templ_7745c5c3_Err
591587 }
592588 }
593- templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 41, "><td class=\"cur\" aria-hidden=\"true\"></td><td class=\"c-kind mute\">")
589+ templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 43, "><td class=\"cur\" aria-hidden=\"true\"></td><td class=\"c-kind mute\">")
594590 if templ_7745c5c3_Err != nil {
595591 return templ_7745c5c3_Err
596592 }
597- var templ_7745c5c3_Var27 string
598- templ_7745c5c3_Var27, templ_7745c5c3_Err = templ.JoinStringErrs(kind)
593+ var templ_7745c5c3_Var25 string
594+ templ_7745c5c3_Var25, templ_7745c5c3_Err = templ.JoinStringErrs(kind)
599595 if templ_7745c5c3_Err != nil {
600- return templ.Error{Err: templ_7745c5c3_Err, FileName: `internal/adapters/web/pages.templ`, Line: 130, Col: 32}
596+ return templ.Error{Err: templ_7745c5c3_Err, FileName: `internal/adapters/web/pages.templ`, Line: 137, Col: 32}
601597 }
602- _, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(templ.EscapeString(templ_7745c5c3_Var27))
598+ _, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(templ.EscapeString(templ_7745c5c3_Var25))
603599 if templ_7745c5c3_Err != nil {
604600 return templ_7745c5c3_Err
605601 }
606- templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 42, "</td><td class=\"c-name\"><a href=\"")
602+ templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 44, "</td><td class=\"c-name\"><a href=\"")
607603 if templ_7745c5c3_Err != nil {
608604 return templ_7745c5c3_Err
609605 }
610- var templ_7745c5c3_Var28 templ.SafeURL
611- templ_7745c5c3_Var28, templ_7745c5c3_Err = templ.JoinURLErrs(templ.SafeURL(r.Href))
606+ var templ_7745c5c3_Var26 templ.SafeURL
607+ templ_7745c5c3_Var26, templ_7745c5c3_Err = templ.JoinURLErrs(templ.SafeURL(r.Href))
612608 if templ_7745c5c3_Err != nil {
613- return templ.Error{Err: templ_7745c5c3_Err, FileName: `internal/adapters/web/pages.templ`, Line: 132, Col: 34}
609+ return templ.Error{Err: templ_7745c5c3_Err, FileName: `internal/adapters/web/pages.templ`, Line: 139, Col: 34}
614610 }
615- _, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(templ.EscapeString(templ_7745c5c3_Var28))
611+ _, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(templ.EscapeString(templ_7745c5c3_Var26))
616612 if templ_7745c5c3_Err != nil {
617613 return templ_7745c5c3_Err
618614 }
619- templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 43, "\">")
615+ templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 45, "\">")
620616 if templ_7745c5c3_Err != nil {
621617 return templ_7745c5c3_Err
622618 }
623- var templ_7745c5c3_Var29 string
624- templ_7745c5c3_Var29, templ_7745c5c3_Err = templ.JoinStringErrs(r.Name)
619+ var templ_7745c5c3_Var27 string
620+ templ_7745c5c3_Var27, templ_7745c5c3_Err = templ.JoinStringErrs(r.Name)
625621 if templ_7745c5c3_Err != nil {
626- return templ.Error{Err: templ_7745c5c3_Err, FileName: `internal/adapters/web/pages.templ`, Line: 132, Col: 45}
622+ return templ.Error{Err: templ_7745c5c3_Err, FileName: `internal/adapters/web/pages.templ`, Line: 139, Col: 45}
627623 }
628- _, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(templ.EscapeString(templ_7745c5c3_Var29))
624+ _, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(templ.EscapeString(templ_7745c5c3_Var27))
629625 if templ_7745c5c3_Err != nil {
630626 return templ_7745c5c3_Err
631627 }
632- templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 44, "</a> ")
628+ templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 46, "</a> ")
633629 if templ_7745c5c3_Err != nil {
634630 return templ_7745c5c3_Err
635631 }
636632 if r.Default {
637- templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 45, "<span class=\"pill\">default</span>")
633+ templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 47, "<span class=\"pill\">default</span>")
638634 if templ_7745c5c3_Err != nil {
639635 return templ_7745c5c3_Err
640636 }
641637 }
642- templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 46, "</td><td class=\"c-sha\">")
638+ templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 48, "</td><td class=\"c-sha\">")
643639 if templ_7745c5c3_Err != nil {
644640 return templ_7745c5c3_Err
645641 }
646642 if r.CHref != "" {
647- templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 47, "<a href=\"")
643+ templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 49, "<a href=\"")
648644 if templ_7745c5c3_Err != nil {
649645 return templ_7745c5c3_Err
650646 }
651- var templ_7745c5c3_Var30 templ.SafeURL
652- templ_7745c5c3_Var30, templ_7745c5c3_Err = templ.JoinURLErrs(templ.SafeURL(r.CHref))
647+ var templ_7745c5c3_Var28 templ.SafeURL
648+ templ_7745c5c3_Var28, templ_7745c5c3_Err = templ.JoinURLErrs(templ.SafeURL(r.CHref))
653649 if templ_7745c5c3_Err != nil {
654- return templ.Error{Err: templ_7745c5c3_Err, FileName: `internal/adapters/web/pages.templ`, Line: 139, Col: 36}
650+ return templ.Error{Err: templ_7745c5c3_Err, FileName: `internal/adapters/web/pages.templ`, Line: 146, Col: 36}
655651 }
656- _, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(templ.EscapeString(templ_7745c5c3_Var30))
652+ _, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(templ.EscapeString(templ_7745c5c3_Var28))
657653 if templ_7745c5c3_Err != nil {
658654 return templ_7745c5c3_Err
659655 }
660- templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 48, "\">")
656+ templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 50, "\">")
661657 if templ_7745c5c3_Err != nil {
662658 return templ_7745c5c3_Err
663659 }
664- var templ_7745c5c3_Var31 string
665- templ_7745c5c3_Var31, templ_7745c5c3_Err = templ.JoinStringErrs(r.Short)
660+ var templ_7745c5c3_Var29 string
661+ templ_7745c5c3_Var29, templ_7745c5c3_Err = templ.JoinStringErrs(r.Short)
666662 if templ_7745c5c3_Err != nil {
667- return templ.Error{Err: templ_7745c5c3_Err, FileName: `internal/adapters/web/pages.templ`, Line: 139, Col: 48}
663+ return templ.Error{Err: templ_7745c5c3_Err, FileName: `internal/adapters/web/pages.templ`, Line: 146, Col: 48}
668664 }
669- _, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(templ.EscapeString(templ_7745c5c3_Var31))
665+ _, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(templ.EscapeString(templ_7745c5c3_Var29))
670666 if templ_7745c5c3_Err != nil {
671667 return templ_7745c5c3_Err
672668 }
673- templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 49, "</a>")
669+ templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 51, "</a>")
674670 if templ_7745c5c3_Err != nil {
675671 return templ_7745c5c3_Err
676672 }
677673 } else {
678- var templ_7745c5c3_Var32 string
679- templ_7745c5c3_Var32, templ_7745c5c3_Err = templ.JoinStringErrs(r.Short)
674+ var templ_7745c5c3_Var30 string
675+ templ_7745c5c3_Var30, templ_7745c5c3_Err = templ.JoinStringErrs(r.Short)
680676 if templ_7745c5c3_Err != nil {
681- return templ.Error{Err: templ_7745c5c3_Err, FileName: `internal/adapters/web/pages.templ`, Line: 141, Col: 13}
677+ return templ.Error{Err: templ_7745c5c3_Err, FileName: `internal/adapters/web/pages.templ`, Line: 148, Col: 13}
682678 }
683- _, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(templ.EscapeString(templ_7745c5c3_Var32))
679+ _, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(templ.EscapeString(templ_7745c5c3_Var30))
684680 if templ_7745c5c3_Err != nil {
685681 return templ_7745c5c3_Err
686682 }
@@ -689,69 +685,69 @@ func refRow(kind string, r RefRow) templ.Component {
689685 if templ_7745c5c3_Err != nil {
690686 return templ_7745c5c3_Err
691687 }
692- templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 50, "</td><td class=\"c-sub\">")
688+ templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 52, "</td><td class=\"c-sub\">")
693689 if templ_7745c5c3_Err != nil {
694690 return templ_7745c5c3_Err
695691 }
696- var templ_7745c5c3_Var33 string
697- templ_7745c5c3_Var33, templ_7745c5c3_Err = templ.JoinStringErrs(r.Subject)
692+ var templ_7745c5c3_Var31 string
693+ templ_7745c5c3_Var31, templ_7745c5c3_Err = templ.JoinStringErrs(r.Subject)
698694 if templ_7745c5c3_Err != nil {
699- return templ.Error{Err: templ_7745c5c3_Err, FileName: `internal/adapters/web/pages.templ`, Line: 145, Col: 31}
695+ return templ.Error{Err: templ_7745c5c3_Err, FileName: `internal/adapters/web/pages.templ`, Line: 152, Col: 31}
700696 }
701- _, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(templ.EscapeString(templ_7745c5c3_Var33))
697+ _, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(templ.EscapeString(templ_7745c5c3_Var31))
702698 if templ_7745c5c3_Err != nil {
703699 return templ_7745c5c3_Err
704700 }
705- templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 51, "</td><td class=\"c-when dim\">")
701+ templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 53, "</td><td class=\"c-when dim\">")
706702 if templ_7745c5c3_Err != nil {
707703 return templ_7745c5c3_Err
708704 }
709705 if r.WhenAt != "" {
710- templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 52, "<time datetime=\"")
706+ templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 54, "<time datetime=\"")
711707 if templ_7745c5c3_Err != nil {
712708 return templ_7745c5c3_Err
713709 }
714- var templ_7745c5c3_Var34 string
715- templ_7745c5c3_Var34, templ_7745c5c3_Err = templ.ResolveAttributeValue(r.WhenAt)
710+ var templ_7745c5c3_Var32 string
711+ templ_7745c5c3_Var32, templ_7745c5c3_Err = templ.ResolveAttributeValue(r.WhenAt)
716712 if templ_7745c5c3_Err != nil {
717- return templ.Error{Err: templ_7745c5c3_Err, FileName: `internal/adapters/web/pages.templ`, Line: 148, Col: 29}
713+ return templ.Error{Err: templ_7745c5c3_Err, FileName: `internal/adapters/web/pages.templ`, Line: 155, Col: 29}
718714 }
719- _, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(templ_7745c5c3_Var34)
715+ _, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(templ_7745c5c3_Var32)
720716 if templ_7745c5c3_Err != nil {
721717 return templ_7745c5c3_Err
722718 }
723- templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 53, "\" title=\"")
719+ templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 55, "\" title=\"")
724720 if templ_7745c5c3_Err != nil {
725721 return templ_7745c5c3_Err
726722 }
727- var templ_7745c5c3_Var35 string
728- templ_7745c5c3_Var35, templ_7745c5c3_Err = templ.ResolveAttributeValue(r.WhenAt)
723+ var templ_7745c5c3_Var33 string
724+ templ_7745c5c3_Var33, templ_7745c5c3_Err = templ.ResolveAttributeValue(r.WhenAt)
729725 if templ_7745c5c3_Err != nil {
730- return templ.Error{Err: templ_7745c5c3_Err, FileName: `internal/adapters/web/pages.templ`, Line: 148, Col: 48}
726+ return templ.Error{Err: templ_7745c5c3_Err, FileName: `internal/adapters/web/pages.templ`, Line: 155, Col: 48}
731727 }
732- _, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(templ_7745c5c3_Var35)
728+ _, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(templ_7745c5c3_Var33)
733729 if templ_7745c5c3_Err != nil {
734730 return templ_7745c5c3_Err
735731 }
736- templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 54, "\">")
732+ templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 56, "\">")
737733 if templ_7745c5c3_Err != nil {
738734 return templ_7745c5c3_Err
739735 }
740- var templ_7745c5c3_Var36 string
741- templ_7745c5c3_Var36, templ_7745c5c3_Err = templ.JoinStringErrs(r.When)
736+ var templ_7745c5c3_Var34 string
737+ templ_7745c5c3_Var34, templ_7745c5c3_Err = templ.JoinStringErrs(r.When)
742738 if templ_7745c5c3_Err != nil {
743- return templ.Error{Err: templ_7745c5c3_Err, FileName: `internal/adapters/web/pages.templ`, Line: 148, Col: 59}
739+ return templ.Error{Err: templ_7745c5c3_Err, FileName: `internal/adapters/web/pages.templ`, Line: 155, Col: 59}
744740 }
745- _, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(templ.EscapeString(templ_7745c5c3_Var36))
741+ _, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(templ.EscapeString(templ_7745c5c3_Var34))
746742 if templ_7745c5c3_Err != nil {
747743 return templ_7745c5c3_Err
748744 }
749- templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 55, "</time>")
745+ templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 57, "</time>")
750746 if templ_7745c5c3_Err != nil {
751747 return templ_7745c5c3_Err
752748 }
753749 }
754- templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 56, "</td></tr>")
750+ templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 58, "</td></tr>")
755751 if templ_7745c5c3_Err != nil {
756752 return templ_7745c5c3_Err
757753 }
@@ -775,12 +771,12 @@ func refsRail(p RefsPage) templ.Component {
775771 }()
776772 }
777773 ctx = templ.InitializeContext(ctx)
778- templ_7745c5c3_Var37 := templ.GetChildren(ctx)
779- if templ_7745c5c3_Var37 == nil {
780- templ_7745c5c3_Var37 = templ.NopComponent
774+ templ_7745c5c3_Var35 := templ.GetChildren(ctx)
775+ if templ_7745c5c3_Var35 == nil {
776+ templ_7745c5c3_Var35 = templ.NopComponent
781777 }
782778 ctx = templ.ClearChildren(ctx)
783- templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 57, "<section aria-labelledby=\"r-refs\"><h2 id=\"r-refs\">Overview</h2>")
779+ templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 59, "<section aria-labelledby=\"r-refs\"><h2 id=\"r-refs\">Overview</h2>")
784780 if templ_7745c5c3_Err != nil {
785781 return templ_7745c5c3_Err
786782 }
@@ -788,7 +784,7 @@ func refsRail(p RefsPage) templ.Component {
788784 if templ_7745c5c3_Err != nil {
789785 return templ_7745c5c3_Err
790786 }
791- templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 58, "</section>")
787+ templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 60, "</section>")
792788 if templ_7745c5c3_Err != nil {
793789 return templ_7745c5c3_Err
794790 }
@@ -813,12 +809,12 @@ func State(l Layout, p StatePage) templ.Component {
813809 }()
814810 }
815811 ctx = templ.InitializeContext(ctx)
816- templ_7745c5c3_Var38 := templ.GetChildren(ctx)
817- if templ_7745c5c3_Var38 == nil {
818- templ_7745c5c3_Var38 = templ.NopComponent
812+ templ_7745c5c3_Var36 := templ.GetChildren(ctx)
813+ if templ_7745c5c3_Var36 == nil {
814+ templ_7745c5c3_Var36 = templ.NopComponent
819815 }
820816 ctx = templ.ClearChildren(ctx)
821- templ_7745c5c3_Var39 := templruntime.GeneratedTemplate(func(templ_7745c5c3_Input templruntime.GeneratedComponentInput) (templ_7745c5c3_Err error) {
817+ templ_7745c5c3_Var37 := templruntime.GeneratedTemplate(func(templ_7745c5c3_Input templruntime.GeneratedComponentInput) (templ_7745c5c3_Err error) {
822818 templ_7745c5c3_W, ctx := templ_7745c5c3_Input.Writer, templ_7745c5c3_Input.Context
823819 templ_7745c5c3_Buffer, templ_7745c5c3_IsBuffer := templruntime.GetBuffer(templ_7745c5c3_W)
824820 if !templ_7745c5c3_IsBuffer {
@@ -830,51 +826,51 @@ func State(l Layout, p StatePage) templ.Component {
830826 }()
831827 }
832828 ctx = templ.InitializeContext(ctx)
833- templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 59, "<section class=\"state\" aria-labelledby=\"state-title\"><p class=\"eyebrow\">")
829+ templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 61, "<section class=\"state\" aria-labelledby=\"state-title\"><p class=\"eyebrow\">")
834830 if templ_7745c5c3_Err != nil {
835831 return templ_7745c5c3_Err
836832 }
837- var templ_7745c5c3_Var40 string
838- templ_7745c5c3_Var40, templ_7745c5c3_Err = templ.JoinStringErrs(p.Code)
833+ var templ_7745c5c3_Var38 string
834+ templ_7745c5c3_Var38, templ_7745c5c3_Err = templ.JoinStringErrs(p.Code)
839835 if templ_7745c5c3_Err != nil {
840- return templ.Error{Err: templ_7745c5c3_Err, FileName: `internal/adapters/web/pages.templ`, Line: 165, Col: 30}
836+ return templ.Error{Err: templ_7745c5c3_Err, FileName: `internal/adapters/web/pages.templ`, Line: 172, Col: 30}
841837 }
842- _, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(templ.EscapeString(templ_7745c5c3_Var40))
838+ _, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(templ.EscapeString(templ_7745c5c3_Var38))
843839 if templ_7745c5c3_Err != nil {
844840 return templ_7745c5c3_Err
845841 }
846- templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 60, "</p><h1 id=\"state-title\">")
842+ templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 62, "</p><h1 id=\"state-title\">")
847843 if templ_7745c5c3_Err != nil {
848844 return templ_7745c5c3_Err
849845 }
850- var templ_7745c5c3_Var41 string
851- templ_7745c5c3_Var41, templ_7745c5c3_Err = templ.JoinStringErrs(p.Title)
846+ var templ_7745c5c3_Var39 string
847+ templ_7745c5c3_Var39, templ_7745c5c3_Err = templ.JoinStringErrs(p.Title)
852848 if templ_7745c5c3_Err != nil {
853- return templ.Error{Err: templ_7745c5c3_Err, FileName: `internal/adapters/web/pages.templ`, Line: 166, Col: 33}
849+ return templ.Error{Err: templ_7745c5c3_Err, FileName: `internal/adapters/web/pages.templ`, Line: 173, Col: 33}
854850 }
855- _, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(templ.EscapeString(templ_7745c5c3_Var41))
851+ _, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(templ.EscapeString(templ_7745c5c3_Var39))
856852 if templ_7745c5c3_Err != nil {
857853 return templ_7745c5c3_Err
858854 }
859- templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 61, "</h1>")
855+ templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 63, "</h1>")
860856 if templ_7745c5c3_Err != nil {
861857 return templ_7745c5c3_Err
862858 }
863859 for _, line := range p.Lines {
864- templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 62, "<p class=\"dim\">")
860+ templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 64, "<p class=\"dim\">")
865861 if templ_7745c5c3_Err != nil {
866862 return templ_7745c5c3_Err
867863 }
868- var templ_7745c5c3_Var42 string
869- templ_7745c5c3_Var42, templ_7745c5c3_Err = templ.JoinStringErrs(line)
864+ var templ_7745c5c3_Var40 string
865+ templ_7745c5c3_Var40, templ_7745c5c3_Err = templ.JoinStringErrs(line)
870866 if templ_7745c5c3_Err != nil {
871- return templ.Error{Err: templ_7745c5c3_Err, FileName: `internal/adapters/web/pages.templ`, Line: 168, Col: 25}
867+ return templ.Error{Err: templ_7745c5c3_Err, FileName: `internal/adapters/web/pages.templ`, Line: 175, Col: 25}
872868 }
873- _, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(templ.EscapeString(templ_7745c5c3_Var42))
869+ _, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(templ.EscapeString(templ_7745c5c3_Var40))
874870 if templ_7745c5c3_Err != nil {
875871 return templ_7745c5c3_Err
876872 }
877- templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 63, "</p>")
873+ templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 65, "</p>")
878874 if templ_7745c5c3_Err != nil {
879875 return templ_7745c5c3_Err
880876 }
@@ -885,49 +881,49 @@ func State(l Layout, p StatePage) templ.Component {
885881 return templ_7745c5c3_Err
886882 }
887883 }
888- templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 64, "<p class=\"state-back\">")
884+ templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 66, "<p class=\"state-back\">")
889885 if templ_7745c5c3_Err != nil {
890886 return templ_7745c5c3_Err
891887 }
892888 for _, b := range p.Back {
893- templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 65, "<a href=\"")
889+ templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 67, "<a href=\"")
894890 if templ_7745c5c3_Err != nil {
895891 return templ_7745c5c3_Err
896892 }
897- var templ_7745c5c3_Var43 templ.SafeURL
898- templ_7745c5c3_Var43, templ_7745c5c3_Err = templ.JoinURLErrs(templ.SafeURL(b.Href))
893+ var templ_7745c5c3_Var41 templ.SafeURL
894+ templ_7745c5c3_Var41, templ_7745c5c3_Err = templ.JoinURLErrs(templ.SafeURL(b.Href))
899895 if templ_7745c5c3_Err != nil {
900- return templ.Error{Err: templ_7745c5c3_Err, FileName: `internal/adapters/web/pages.templ`, Line: 175, Col: 36}
896+ return templ.Error{Err: templ_7745c5c3_Err, FileName: `internal/adapters/web/pages.templ`, Line: 182, Col: 36}
901897 }
902- _, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(templ.EscapeString(templ_7745c5c3_Var43))
898+ _, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(templ.EscapeString(templ_7745c5c3_Var41))
903899 if templ_7745c5c3_Err != nil {
904900 return templ_7745c5c3_Err
905901 }
906- templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 66, "\">")
902+ templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 68, "\">")
907903 if templ_7745c5c3_Err != nil {
908904 return templ_7745c5c3_Err
909905 }
910- var templ_7745c5c3_Var44 string
911- templ_7745c5c3_Var44, templ_7745c5c3_Err = templ.JoinStringErrs(b.Label)
906+ var templ_7745c5c3_Var42 string
907+ templ_7745c5c3_Var42, templ_7745c5c3_Err = templ.JoinStringErrs(b.Label)
912908 if templ_7745c5c3_Err != nil {
913- return templ.Error{Err: templ_7745c5c3_Err, FileName: `internal/adapters/web/pages.templ`, Line: 175, Col: 48}
909+ return templ.Error{Err: templ_7745c5c3_Err, FileName: `internal/adapters/web/pages.templ`, Line: 182, Col: 48}
914910 }
915- _, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(templ.EscapeString(templ_7745c5c3_Var44))
911+ _, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(templ.EscapeString(templ_7745c5c3_Var42))
916912 if templ_7745c5c3_Err != nil {
917913 return templ_7745c5c3_Err
918914 }
919- templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 67, "</a>")
915+ templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 69, "</a>")
920916 if templ_7745c5c3_Err != nil {
921917 return templ_7745c5c3_Err
922918 }
923919 }
924- templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 68, "</p></section>")
920+ templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 70, "</p></section>")
925921 if templ_7745c5c3_Err != nil {
926922 return templ_7745c5c3_Err
927923 }
928924 return nil
929925 })
930- templ_7745c5c3_Err = Shell(l, nil).Render(templ.WithChildren(ctx, templ_7745c5c3_Var39), templ_7745c5c3_Buffer)
926+ templ_7745c5c3_Err = Shell(l, nil).Render(templ.WithChildren(ctx, templ_7745c5c3_Var37), templ_7745c5c3_Buffer)
931927 if templ_7745c5c3_Err != nil {
932928 return templ_7745c5c3_Err
933929 }
@@ -956,12 +952,12 @@ func Login(l Layout, p LoginPage) templ.Component {
956952 }()
957953 }
958954 ctx = templ.InitializeContext(ctx)
959- templ_7745c5c3_Var45 := templ.GetChildren(ctx)
960- if templ_7745c5c3_Var45 == nil {
961- templ_7745c5c3_Var45 = templ.NopComponent
955+ templ_7745c5c3_Var43 := templ.GetChildren(ctx)
956+ if templ_7745c5c3_Var43 == nil {
957+ templ_7745c5c3_Var43 = templ.NopComponent
962958 }
963959 ctx = templ.ClearChildren(ctx)
964- templ_7745c5c3_Var46 := templruntime.GeneratedTemplate(func(templ_7745c5c3_Input templruntime.GeneratedComponentInput) (templ_7745c5c3_Err error) {
960+ templ_7745c5c3_Var44 := templruntime.GeneratedTemplate(func(templ_7745c5c3_Input templruntime.GeneratedComponentInput) (templ_7745c5c3_Err error) {
965961 templ_7745c5c3_W, ctx := templ_7745c5c3_Input.Writer, templ_7745c5c3_Input.Context
966962 templ_7745c5c3_Buffer, templ_7745c5c3_IsBuffer := templruntime.GetBuffer(templ_7745c5c3_W)
967963 if !templ_7745c5c3_IsBuffer {
@@ -973,75 +969,75 @@ func Login(l Layout, p LoginPage) templ.Component {
973969 }()
974970 }
975971 ctx = templ.InitializeContext(ctx)
976- templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 69, "<section class=\"state\" aria-labelledby=\"state-title\"><h1 id=\"state-title\">")
972+ templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 71, "<section class=\"state\" aria-labelledby=\"state-title\"><h1 id=\"state-title\">")
977973 if templ_7745c5c3_Err != nil {
978974 return templ_7745c5c3_Err
979975 }
980- var templ_7745c5c3_Var47 string
981- templ_7745c5c3_Var47, templ_7745c5c3_Err = templ.JoinStringErrs(p.Title)
976+ var templ_7745c5c3_Var45 string
977+ templ_7745c5c3_Var45, templ_7745c5c3_Err = templ.JoinStringErrs(p.Title)
982978 if templ_7745c5c3_Err != nil {
983- return templ.Error{Err: templ_7745c5c3_Err, FileName: `internal/adapters/web/pages.templ`, Line: 190, Col: 33}
979+ return templ.Error{Err: templ_7745c5c3_Err, FileName: `internal/adapters/web/pages.templ`, Line: 197, Col: 33}
984980 }
985- _, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(templ.EscapeString(templ_7745c5c3_Var47))
981+ _, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(templ.EscapeString(templ_7745c5c3_Var45))
986982 if templ_7745c5c3_Err != nil {
987983 return templ_7745c5c3_Err
988984 }
989- templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 70, "</h1>")
985+ templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 72, "</h1>")
990986 if templ_7745c5c3_Err != nil {
991987 return templ_7745c5c3_Err
992988 }
993989 for _, line := range p.Lines {
994- templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 71, "<p class=\"dim\">")
990+ templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 73, "<p class=\"dim\">")
995991 if templ_7745c5c3_Err != nil {
996992 return templ_7745c5c3_Err
997993 }
998- var templ_7745c5c3_Var48 string
999- templ_7745c5c3_Var48, templ_7745c5c3_Err = templ.JoinStringErrs(line)
994+ var templ_7745c5c3_Var46 string
995+ templ_7745c5c3_Var46, templ_7745c5c3_Err = templ.JoinStringErrs(line)
1000996 if templ_7745c5c3_Err != nil {
1001- return templ.Error{Err: templ_7745c5c3_Err, FileName: `internal/adapters/web/pages.templ`, Line: 192, Col: 25}
997+ return templ.Error{Err: templ_7745c5c3_Err, FileName: `internal/adapters/web/pages.templ`, Line: 199, Col: 25}
1002998 }
1003- _, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(templ.EscapeString(templ_7745c5c3_Var48))
999+ _, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(templ.EscapeString(templ_7745c5c3_Var46))
10041000 if templ_7745c5c3_Err != nil {
10051001 return templ_7745c5c3_Err
10061002 }
1007- templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 72, "</p>")
1003+ templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 74, "</p>")
10081004 if templ_7745c5c3_Err != nil {
10091005 return templ_7745c5c3_Err
10101006 }
10111007 }
1012- templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 73, "<form class=\"state-act\" method=\"post\" action=\"")
1008+ templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 75, "<form class=\"state-act\" method=\"post\" action=\"")
10131009 if templ_7745c5c3_Err != nil {
10141010 return templ_7745c5c3_Err
10151011 }
1016- var templ_7745c5c3_Var49 templ.SafeURL
1017- templ_7745c5c3_Var49, templ_7745c5c3_Err = templ.JoinURLErrs(templ.SafeURL(p.Action))
1012+ var templ_7745c5c3_Var47 templ.SafeURL
1013+ templ_7745c5c3_Var47, templ_7745c5c3_Err = templ.JoinURLErrs(templ.SafeURL(p.Action))
10181014 if templ_7745c5c3_Err != nil {
1019- return templ.Error{Err: templ_7745c5c3_Err, FileName: `internal/adapters/web/pages.templ`, Line: 194, Col: 73}
1015+ return templ.Error{Err: templ_7745c5c3_Err, FileName: `internal/adapters/web/pages.templ`, Line: 201, Col: 73}
10201016 }
1021- _, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(templ.EscapeString(templ_7745c5c3_Var49))
1017+ _, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(templ.EscapeString(templ_7745c5c3_Var47))
10221018 if templ_7745c5c3_Err != nil {
10231019 return templ_7745c5c3_Err
10241020 }
1025- templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 74, "\" data-autosubmit><button type=\"submit\" class=\"btn primary\">")
1021+ templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 76, "\" data-autosubmit><button type=\"submit\" class=\"btn primary\">")
10261022 if templ_7745c5c3_Err != nil {
10271023 return templ_7745c5c3_Err
10281024 }
1029- var templ_7745c5c3_Var50 string
1030- templ_7745c5c3_Var50, templ_7745c5c3_Err = templ.JoinStringErrs(p.Button)
1025+ var templ_7745c5c3_Var48 string
1026+ templ_7745c5c3_Var48, templ_7745c5c3_Err = templ.JoinStringErrs(p.Button)
10311027 if templ_7745c5c3_Err != nil {
1032- return templ.Error{Err: templ_7745c5c3_Err, FileName: `internal/adapters/web/pages.templ`, Line: 195, Col: 56}
1028+ return templ.Error{Err: templ_7745c5c3_Err, FileName: `internal/adapters/web/pages.templ`, Line: 202, Col: 56}
10331029 }
1034- _, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(templ.EscapeString(templ_7745c5c3_Var50))
1030+ _, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(templ.EscapeString(templ_7745c5c3_Var48))
10351031 if templ_7745c5c3_Err != nil {
10361032 return templ_7745c5c3_Err
10371033 }
1038- templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 75, "</button></form><p class=\"state-back\"><a href=\"/\">Back to home</a></p></section>")
1034+ templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 77, "</button></form><p class=\"state-back\"><a href=\"/\">Back to home</a></p></section>")
10391035 if templ_7745c5c3_Err != nil {
10401036 return templ_7745c5c3_Err
10411037 }
10421038 return nil
10431039 })
1044- templ_7745c5c3_Err = Shell(l, nil).Render(templ.WithChildren(ctx, templ_7745c5c3_Var46), templ_7745c5c3_Buffer)
1040+ templ_7745c5c3_Err = Shell(l, nil).Render(templ.WithChildren(ctx, templ_7745c5c3_Var44), templ_7745c5c3_Buffer)
10451041 if templ_7745c5c3_Err != nil {
10461042 return templ_7745c5c3_Err
10471043 }
@@ -1067,12 +1063,12 @@ func PasskeyLogin(l Layout, p PasskeyLoginPage) templ.Component {
10671063 }()
10681064 }
10691065 ctx = templ.InitializeContext(ctx)
1070- templ_7745c5c3_Var51 := templ.GetChildren(ctx)
1071- if templ_7745c5c3_Var51 == nil {
1072- templ_7745c5c3_Var51 = templ.NopComponent
1066+ templ_7745c5c3_Var49 := templ.GetChildren(ctx)
1067+ if templ_7745c5c3_Var49 == nil {
1068+ templ_7745c5c3_Var49 = templ.NopComponent
10731069 }
10741070 ctx = templ.ClearChildren(ctx)
1075- templ_7745c5c3_Var52 := templruntime.GeneratedTemplate(func(templ_7745c5c3_Input templruntime.GeneratedComponentInput) (templ_7745c5c3_Err error) {
1071+ templ_7745c5c3_Var50 := templruntime.GeneratedTemplate(func(templ_7745c5c3_Input templruntime.GeneratedComponentInput) (templ_7745c5c3_Err error) {
10761072 templ_7745c5c3_W, ctx := templ_7745c5c3_Input.Writer, templ_7745c5c3_Input.Context
10771073 templ_7745c5c3_Buffer, templ_7745c5c3_IsBuffer := templruntime.GetBuffer(templ_7745c5c3_W)
10781074 if !templ_7745c5c3_IsBuffer {
@@ -1084,88 +1080,88 @@ func PasskeyLogin(l Layout, p PasskeyLoginPage) templ.Component {
10841080 }()
10851081 }
10861082 ctx = templ.InitializeContext(ctx)
1087- templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 76, "<section class=\"state\" aria-labelledby=\"state-title\"><h1 id=\"state-title\">")
1083+ templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 78, "<section class=\"state\" aria-labelledby=\"state-title\"><h1 id=\"state-title\">")
10881084 if templ_7745c5c3_Err != nil {
10891085 return templ_7745c5c3_Err
10901086 }
1091- var templ_7745c5c3_Var53 string
1092- templ_7745c5c3_Var53, templ_7745c5c3_Err = templ.JoinStringErrs(p.Title)
1087+ var templ_7745c5c3_Var51 string
1088+ templ_7745c5c3_Var51, templ_7745c5c3_Err = templ.JoinStringErrs(p.Title)
10931089 if templ_7745c5c3_Err != nil {
1094- return templ.Error{Err: templ_7745c5c3_Err, FileName: `internal/adapters/web/pages.templ`, Line: 207, Col: 33}
1090+ return templ.Error{Err: templ_7745c5c3_Err, FileName: `internal/adapters/web/pages.templ`, Line: 214, Col: 33}
10951091 }
1096- _, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(templ.EscapeString(templ_7745c5c3_Var53))
1092+ _, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(templ.EscapeString(templ_7745c5c3_Var51))
10971093 if templ_7745c5c3_Err != nil {
10981094 return templ_7745c5c3_Err
10991095 }
1100- templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 77, "</h1><form class=\"state-act\" data-js data-passkey-form><button type=\"submit\" class=\"btn primary\" data-passkey=\"login\" data-begin=\"")
1096+ templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 79, "</h1><form class=\"state-act\" data-js data-passkey-form><button type=\"submit\" class=\"btn primary\" data-passkey=\"login\" data-begin=\"")
11011097 if templ_7745c5c3_Err != nil {
11021098 return templ_7745c5c3_Err
11031099 }
1104- var templ_7745c5c3_Var54 string
1105- templ_7745c5c3_Var54, templ_7745c5c3_Err = templ.ResolveAttributeValue(p.Begin)
1100+ var templ_7745c5c3_Var52 string
1101+ templ_7745c5c3_Var52, templ_7745c5c3_Err = templ.ResolveAttributeValue(p.Begin)
11061102 if templ_7745c5c3_Err != nil {
1107- return templ.Error{Err: templ_7745c5c3_Err, FileName: `internal/adapters/web/pages.templ`, Line: 209, Col: 87}
1103+ return templ.Error{Err: templ_7745c5c3_Err, FileName: `internal/adapters/web/pages.templ`, Line: 216, Col: 87}
11081104 }
1109- _, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(templ_7745c5c3_Var54)
1105+ _, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(templ_7745c5c3_Var52)
11101106 if templ_7745c5c3_Err != nil {
11111107 return templ_7745c5c3_Err
11121108 }
1113- templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 78, "\" data-finish=\"")
1109+ templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 80, "\" data-finish=\"")
11141110 if templ_7745c5c3_Err != nil {
11151111 return templ_7745c5c3_Err
11161112 }
1117- var templ_7745c5c3_Var55 string
1118- templ_7745c5c3_Var55, templ_7745c5c3_Err = templ.ResolveAttributeValue(p.Finish)
1113+ var templ_7745c5c3_Var53 string
1114+ templ_7745c5c3_Var53, templ_7745c5c3_Err = templ.ResolveAttributeValue(p.Finish)
11191115 if templ_7745c5c3_Err != nil {
1120- return templ.Error{Err: templ_7745c5c3_Err, FileName: `internal/adapters/web/pages.templ`, Line: 209, Col: 112}
1116+ return templ.Error{Err: templ_7745c5c3_Err, FileName: `internal/adapters/web/pages.templ`, Line: 216, Col: 112}
11211117 }
1122- _, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(templ_7745c5c3_Var55)
1118+ _, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(templ_7745c5c3_Var53)
11231119 if templ_7745c5c3_Err != nil {
11241120 return templ_7745c5c3_Err
11251121 }
1126- templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 79, "\">")
1122+ templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 81, "\">")
11271123 if templ_7745c5c3_Err != nil {
11281124 return templ_7745c5c3_Err
11291125 }
1130- var templ_7745c5c3_Var56 string
1131- templ_7745c5c3_Var56, templ_7745c5c3_Err = templ.JoinStringErrs(p.Button)
1126+ var templ_7745c5c3_Var54 string
1127+ templ_7745c5c3_Var54, templ_7745c5c3_Err = templ.JoinStringErrs(p.Button)
11321128 if templ_7745c5c3_Err != nil {
1133- return templ.Error{Err: templ_7745c5c3_Err, FileName: `internal/adapters/web/pages.templ`, Line: 209, Col: 125}
1129+ return templ.Error{Err: templ_7745c5c3_Err, FileName: `internal/adapters/web/pages.templ`, Line: 216, Col: 125}
11341130 }
1135- _, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(templ.EscapeString(templ_7745c5c3_Var56))
1131+ _, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(templ.EscapeString(templ_7745c5c3_Var54))
11361132 if templ_7745c5c3_Err != nil {
11371133 return templ_7745c5c3_Err
11381134 }
1139- templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 80, "</button></form><p class=\"dim\" role=\"status\" aria-live=\"polite\" data-passkey-status></p>")
1135+ templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 82, "</button></form><p class=\"dim\" role=\"status\" aria-live=\"polite\" data-passkey-status></p>")
11401136 if templ_7745c5c3_Err != nil {
11411137 return templ_7745c5c3_Err
11421138 }
11431139 for _, line := range p.Lines {
1144- templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 81, "<p class=\"dim\">")
1140+ templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 83, "<p class=\"dim\">")
11451141 if templ_7745c5c3_Err != nil {
11461142 return templ_7745c5c3_Err
11471143 }
1148- var templ_7745c5c3_Var57 string
1149- templ_7745c5c3_Var57, templ_7745c5c3_Err = templ.JoinStringErrs(line)
1144+ var templ_7745c5c3_Var55 string
1145+ templ_7745c5c3_Var55, templ_7745c5c3_Err = templ.JoinStringErrs(line)
11501146 if templ_7745c5c3_Err != nil {
1151- return templ.Error{Err: templ_7745c5c3_Err, FileName: `internal/adapters/web/pages.templ`, Line: 213, Col: 25}
1147+ return templ.Error{Err: templ_7745c5c3_Err, FileName: `internal/adapters/web/pages.templ`, Line: 220, Col: 25}
11521148 }
1153- _, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(templ.EscapeString(templ_7745c5c3_Var57))
1149+ _, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(templ.EscapeString(templ_7745c5c3_Var55))
11541150 if templ_7745c5c3_Err != nil {
11551151 return templ_7745c5c3_Err
11561152 }
1157- templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 82, "</p>")
1153+ templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 84, "</p>")
11581154 if templ_7745c5c3_Err != nil {
11591155 return templ_7745c5c3_Err
11601156 }
11611157 }
1162- templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 83, "<p class=\"state-back\"><a href=\"/\">Back to home</a></p></section>")
1158+ templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 85, "<p class=\"state-back\"><a href=\"/\">Back to home</a></p></section>")
11631159 if templ_7745c5c3_Err != nil {
11641160 return templ_7745c5c3_Err
11651161 }
11661162 return nil
11671163 })
1168- templ_7745c5c3_Err = Shell(l, nil).Render(templ.WithChildren(ctx, templ_7745c5c3_Var52), templ_7745c5c3_Buffer)
1164+ templ_7745c5c3_Err = Shell(l, nil).Render(templ.WithChildren(ctx, templ_7745c5c3_Var50), templ_7745c5c3_Buffer)
11691165 if templ_7745c5c3_Err != nil {
11701166 return templ_7745c5c3_Err
11711167 }
@@ -1190,12 +1186,12 @@ func Passkeys(l Layout, p PasskeysPage) templ.Component {
11901186 }()
11911187 }
11921188 ctx = templ.InitializeContext(ctx)
1193- templ_7745c5c3_Var58 := templ.GetChildren(ctx)
1194- if templ_7745c5c3_Var58 == nil {
1195- templ_7745c5c3_Var58 = templ.NopComponent
1189+ templ_7745c5c3_Var56 := templ.GetChildren(ctx)
1190+ if templ_7745c5c3_Var56 == nil {
1191+ templ_7745c5c3_Var56 = templ.NopComponent
11961192 }
11971193 ctx = templ.ClearChildren(ctx)
1198- templ_7745c5c3_Var59 := templruntime.GeneratedTemplate(func(templ_7745c5c3_Input templruntime.GeneratedComponentInput) (templ_7745c5c3_Err error) {
1194+ templ_7745c5c3_Var57 := templruntime.GeneratedTemplate(func(templ_7745c5c3_Input templruntime.GeneratedComponentInput) (templ_7745c5c3_Err error) {
11991195 templ_7745c5c3_W, ctx := templ_7745c5c3_Input.Writer, templ_7745c5c3_Input.Context
12001196 templ_7745c5c3_Buffer, templ_7745c5c3_IsBuffer := templruntime.GetBuffer(templ_7745c5c3_W)
12011197 if !templ_7745c5c3_IsBuffer {
@@ -1207,231 +1203,231 @@ func Passkeys(l Layout, p PasskeysPage) templ.Component {
12071203 }()
12081204 }
12091205 ctx = templ.InitializeContext(ctx)
1210- templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 84, "<h2 class=\"rule-h\"><span>Passkeys</span><span class=\"count\">")
1206+ templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 86, "<h2 class=\"rule-h\"><span>Passkeys</span><span class=\"count\">")
12111207 if templ_7745c5c3_Err != nil {
12121208 return templ_7745c5c3_Err
12131209 }
1214- var templ_7745c5c3_Var60 string
1215- templ_7745c5c3_Var60, templ_7745c5c3_Err = templ.JoinStringErrs(itoa(len(p.Rows)))
1210+ var templ_7745c5c3_Var58 string
1211+ templ_7745c5c3_Var58, templ_7745c5c3_Err = templ.JoinStringErrs(itoa(len(p.Rows)))
12161212 if templ_7745c5c3_Err != nil {
1217- return templ.Error{Err: templ_7745c5c3_Err, FileName: `internal/adapters/web/pages.templ`, Line: 223, Col: 81}
1213+ return templ.Error{Err: templ_7745c5c3_Err, FileName: `internal/adapters/web/pages.templ`, Line: 230, Col: 81}
12181214 }
1219- _, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(templ.EscapeString(templ_7745c5c3_Var60))
1215+ _, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(templ.EscapeString(templ_7745c5c3_Var58))
12201216 if templ_7745c5c3_Err != nil {
12211217 return templ_7745c5c3_Err
12221218 }
1223- templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 85, "</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>")
1219+ templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 87, "</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>")
12241220 if templ_7745c5c3_Err != nil {
12251221 return templ_7745c5c3_Err
12261222 }
12271223 if len(p.Rows) > 0 {
1228- templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 86, "<table class=\"list passkeys\" aria-label=\"Passkeys\"><thead><tr><th class=\"cur\"></th><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>")
1224+ templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 88, "<table class=\"list passkeys\" aria-label=\"Passkeys\"><thead><tr><th class=\"cur\"></th><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>")
12291225 if templ_7745c5c3_Err != nil {
12301226 return templ_7745c5c3_Err
12311227 }
12321228 for _, r := range p.Rows {
1233- templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 87, "<tr><td class=\"cur\" aria-hidden=\"true\"></td><td class=\"c-name\">")
1229+ templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 89, "<tr><td class=\"cur\" aria-hidden=\"true\"></td><td class=\"c-name\">")
12341230 if templ_7745c5c3_Err != nil {
12351231 return templ_7745c5c3_Err
12361232 }
1237- var templ_7745c5c3_Var61 string
1238- templ_7745c5c3_Var61, templ_7745c5c3_Err = templ.JoinStringErrs(r.Name)
1233+ var templ_7745c5c3_Var59 string
1234+ templ_7745c5c3_Var59, templ_7745c5c3_Err = templ.JoinStringErrs(r.Name)
12391235 if templ_7745c5c3_Err != nil {
1240- return templ.Error{Err: templ_7745c5c3_Err, FileName: `internal/adapters/web/pages.templ`, Line: 241, Col: 34}
1236+ return templ.Error{Err: templ_7745c5c3_Err, FileName: `internal/adapters/web/pages.templ`, Line: 248, Col: 34}
12411237 }
1242- _, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(templ.EscapeString(templ_7745c5c3_Var61))
1238+ _, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(templ.EscapeString(templ_7745c5c3_Var59))
12431239 if templ_7745c5c3_Err != nil {
12441240 return templ_7745c5c3_Err
12451241 }
1246- templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 88, "</td><td class=\"c-when nowrap\"><time")
1242+ templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 90, "</td><td class=\"c-when nowrap\"><time")
12471243 if templ_7745c5c3_Err != nil {
12481244 return templ_7745c5c3_Err
12491245 }
12501246 if r.CreatedAt != "" {
1251- templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 89, " datetime=\"")
1247+ templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 91, " datetime=\"")
12521248 if templ_7745c5c3_Err != nil {
12531249 return templ_7745c5c3_Err
12541250 }
1255- var templ_7745c5c3_Var62 string
1256- templ_7745c5c3_Var62, templ_7745c5c3_Err = templ.ResolveAttributeValue(r.CreatedAt)
1251+ var templ_7745c5c3_Var60 string
1252+ templ_7745c5c3_Var60, templ_7745c5c3_Err = templ.ResolveAttributeValue(r.CreatedAt)
12571253 if templ_7745c5c3_Err != nil {
1258- return templ.Error{Err: templ_7745c5c3_Err, FileName: `internal/adapters/web/pages.templ`, Line: 245, Col: 32}
1254+ return templ.Error{Err: templ_7745c5c3_Err, FileName: `internal/adapters/web/pages.templ`, Line: 252, Col: 32}
12591255 }
1260- _, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(templ_7745c5c3_Var62)
1256+ _, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(templ_7745c5c3_Var60)
12611257 if templ_7745c5c3_Err != nil {
12621258 return templ_7745c5c3_Err
12631259 }
1264- templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 90, "\"")
1260+ templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 92, "\"")
12651261 if templ_7745c5c3_Err != nil {
12661262 return templ_7745c5c3_Err
12671263 }
12681264 }
1269- templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 91, ">")
1265+ templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 93, ">")
12701266 if templ_7745c5c3_Err != nil {
12711267 return templ_7745c5c3_Err
12721268 }
1273- var templ_7745c5c3_Var63 string
1274- templ_7745c5c3_Var63, templ_7745c5c3_Err = templ.JoinStringErrs(r.Created)
1269+ var templ_7745c5c3_Var61 string
1270+ templ_7745c5c3_Var61, templ_7745c5c3_Err = templ.JoinStringErrs(r.Created)
12751271 if templ_7745c5c3_Err != nil {
1276- return templ.Error{Err: templ_7745c5c3_Err, FileName: `internal/adapters/web/pages.templ`, Line: 247, Col: 20}
1272+ return templ.Error{Err: templ_7745c5c3_Err, FileName: `internal/adapters/web/pages.templ`, Line: 254, Col: 20}
12771273 }
1278- _, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(templ.EscapeString(templ_7745c5c3_Var63))
1274+ _, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(templ.EscapeString(templ_7745c5c3_Var61))
12791275 if templ_7745c5c3_Err != nil {
12801276 return templ_7745c5c3_Err
12811277 }
1282- templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 92, "</time></td><td class=\"c-when nowrap\"><time")
1278+ templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 94, "</time></td><td class=\"c-when nowrap\"><time")
12831279 if templ_7745c5c3_Err != nil {
12841280 return templ_7745c5c3_Err
12851281 }
12861282 if r.LastUsedAt != "" {
1287- templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 93, " datetime=\"")
1283+ templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 95, " datetime=\"")
12881284 if templ_7745c5c3_Err != nil {
12891285 return templ_7745c5c3_Err
12901286 }
1291- var templ_7745c5c3_Var64 string
1292- templ_7745c5c3_Var64, templ_7745c5c3_Err = templ.ResolveAttributeValue(r.LastUsedAt)
1287+ var templ_7745c5c3_Var62 string
1288+ templ_7745c5c3_Var62, templ_7745c5c3_Err = templ.ResolveAttributeValue(r.LastUsedAt)
12931289 if templ_7745c5c3_Err != nil {
1294- return templ.Error{Err: templ_7745c5c3_Err, FileName: `internal/adapters/web/pages.templ`, Line: 252, Col: 33}
1290+ return templ.Error{Err: templ_7745c5c3_Err, FileName: `internal/adapters/web/pages.templ`, Line: 259, Col: 33}
12951291 }
1296- _, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(templ_7745c5c3_Var64)
1292+ _, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(templ_7745c5c3_Var62)
12971293 if templ_7745c5c3_Err != nil {
12981294 return templ_7745c5c3_Err
12991295 }
1300- templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 94, "\"")
1296+ templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 96, "\"")
13011297 if templ_7745c5c3_Err != nil {
13021298 return templ_7745c5c3_Err
13031299 }
13041300 }
1305- templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 95, ">")
1301+ templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 97, ">")
13061302 if templ_7745c5c3_Err != nil {
13071303 return templ_7745c5c3_Err
13081304 }
1309- var templ_7745c5c3_Var65 string
1310- templ_7745c5c3_Var65, templ_7745c5c3_Err = templ.JoinStringErrs(r.LastUsed)
1305+ var templ_7745c5c3_Var63 string
1306+ templ_7745c5c3_Var63, templ_7745c5c3_Err = templ.JoinStringErrs(r.LastUsed)
13111307 if templ_7745c5c3_Err != nil {
1312- return templ.Error{Err: templ_7745c5c3_Err, FileName: `internal/adapters/web/pages.templ`, Line: 254, Col: 21}
1308+ return templ.Error{Err: templ_7745c5c3_Err, FileName: `internal/adapters/web/pages.templ`, Line: 261, Col: 21}
13131309 }
1314- _, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(templ.EscapeString(templ_7745c5c3_Var65))
1310+ _, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(templ.EscapeString(templ_7745c5c3_Var63))
13151311 if templ_7745c5c3_Err != nil {
13161312 return templ_7745c5c3_Err
13171313 }
1318- templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 96, "</time></td><td class=\"c-sync\">")
1314+ templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 98, "</time></td><td class=\"c-sync\">")
13191315 if templ_7745c5c3_Err != nil {
13201316 return templ_7745c5c3_Err
13211317 }
13221318 if r.Synced {
1323- templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 97, "yes")
1319+ templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 99, "yes")
13241320 if templ_7745c5c3_Err != nil {
13251321 return templ_7745c5c3_Err
13261322 }
13271323 } else {
1328- templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 98, "no")
1324+ templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 100, "no")
13291325 if templ_7745c5c3_Err != nil {
13301326 return templ_7745c5c3_Err
13311327 }
13321328 }
1333- templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 99, "</td><td class=\"c-act\"><form method=\"post\" action=\"")
1329+ templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 101, "</td><td class=\"c-act\"><form method=\"post\" action=\"")
13341330 if templ_7745c5c3_Err != nil {
13351331 return templ_7745c5c3_Err
13361332 }
1337- var templ_7745c5c3_Var66 templ.SafeURL
1338- templ_7745c5c3_Var66, templ_7745c5c3_Err = templ.JoinURLErrs(templ.SafeURL(r.Remove))
1333+ var templ_7745c5c3_Var64 templ.SafeURL
1334+ templ_7745c5c3_Var64, templ_7745c5c3_Err = templ.JoinURLErrs(templ.SafeURL(r.Remove))
13391335 if templ_7745c5c3_Err != nil {
1340- return templ.Error{Err: templ_7745c5c3_Err, FileName: `internal/adapters/web/pages.templ`, Line: 264, Col: 60}
1336+ return templ.Error{Err: templ_7745c5c3_Err, FileName: `internal/adapters/web/pages.templ`, Line: 271, Col: 60}
13411337 }
1342- _, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(templ.EscapeString(templ_7745c5c3_Var66))
1338+ _, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(templ.EscapeString(templ_7745c5c3_Var64))
13431339 if templ_7745c5c3_Err != nil {
13441340 return templ_7745c5c3_Err
13451341 }
1346- templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 100, "\"><button type=\"submit\" class=\"btn danger\" aria-label=\"")
1342+ templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 102, "\"><button type=\"submit\" class=\"btn danger\" aria-label=\"")
13471343 if templ_7745c5c3_Err != nil {
13481344 return templ_7745c5c3_Err
13491345 }
1350- var templ_7745c5c3_Var67 string
1351- templ_7745c5c3_Var67, templ_7745c5c3_Err = templ.ResolveAttributeValue("Remove passkey " + r.Name)
1346+ var templ_7745c5c3_Var65 string
1347+ templ_7745c5c3_Var65, templ_7745c5c3_Err = templ.ResolveAttributeValue("Remove passkey " + r.Name)
13521348 if templ_7745c5c3_Err != nil {
1353- return templ.Error{Err: templ_7745c5c3_Err, FileName: `internal/adapters/web/pages.templ`, Line: 265, Col: 89}
1349+ return templ.Error{Err: templ_7745c5c3_Err, FileName: `internal/adapters/web/pages.templ`, Line: 272, Col: 89}
13541350 }
1355- _, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(templ_7745c5c3_Var67)
1351+ _, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(templ_7745c5c3_Var65)
13561352 if templ_7745c5c3_Err != nil {
13571353 return templ_7745c5c3_Err
13581354 }
1359- templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 101, "\">Remove</button></form></td></tr>")
1355+ templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 103, "\">Remove</button></form></td></tr>")
13601356 if templ_7745c5c3_Err != nil {
13611357 return templ_7745c5c3_Err
13621358 }
13631359 }
1364- templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 102, "</tbody></table>")
1360+ templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 104, "</tbody></table>")
13651361 if templ_7745c5c3_Err != nil {
13661362 return templ_7745c5c3_Err
13671363 }
13681364 } else {
1369- templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 103, "<p class=\"lede dim\">no passkeys yet.</p>")
1365+ templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 105, "<p class=\"lede dim\">no passkeys yet.</p>")
13701366 if templ_7745c5c3_Err != nil {
13711367 return templ_7745c5c3_Err
13721368 }
13731369 }
1374- templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 104, " ")
1370+ templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 106, " ")
13751371 if templ_7745c5c3_Err != nil {
13761372 return templ_7745c5c3_Err
13771373 }
13781374 if p.Full {
1379- templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 105, "<p class=\"dim\">")
1375+ templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 107, "<p class=\"dim\">")
13801376 if templ_7745c5c3_Err != nil {
13811377 return templ_7745c5c3_Err
13821378 }
1383- var templ_7745c5c3_Var68 string
1384- templ_7745c5c3_Var68, templ_7745c5c3_Err = templ.JoinStringErrs(itoa(p.Max))
1379+ var templ_7745c5c3_Var66 string
1380+ templ_7745c5c3_Var66, templ_7745c5c3_Err = templ.JoinStringErrs(itoa(p.Max))
13851381 if templ_7745c5c3_Err != nil {
1386- return templ.Error{Err: templ_7745c5c3_Err, FileName: `internal/adapters/web/pages.templ`, Line: 276, Col: 31}
1382+ return templ.Error{Err: templ_7745c5c3_Err, FileName: `internal/adapters/web/pages.templ`, Line: 283, Col: 31}
13871383 }
1388- _, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(templ.EscapeString(templ_7745c5c3_Var68))
1384+ _, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(templ.EscapeString(templ_7745c5c3_Var66))
13891385 if templ_7745c5c3_Err != nil {
13901386 return templ_7745c5c3_Err
13911387 }
1392- templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 106, " passkeys are registered, the most there can be. Remove one to add another.</p>")
1388+ templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 108, " passkeys are registered, the most there can be. Remove one to add another.</p>")
13931389 if templ_7745c5c3_Err != nil {
13941390 return templ_7745c5c3_Err
13951391 }
13961392 } else {
1397- templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 107, "<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=\"")
1393+ templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 109, "<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=\"")
13981394 if templ_7745c5c3_Err != nil {
13991395 return templ_7745c5c3_Err
14001396 }
1401- var templ_7745c5c3_Var69 string
1402- templ_7745c5c3_Var69, templ_7745c5c3_Err = templ.ResolveAttributeValue(p.Begin)
1397+ var templ_7745c5c3_Var67 string
1398+ templ_7745c5c3_Var67, templ_7745c5c3_Err = templ.ResolveAttributeValue(p.Begin)
14031399 if templ_7745c5c3_Err != nil {
1404- return templ.Error{Err: templ_7745c5c3_Err, FileName: `internal/adapters/web/pages.templ`, Line: 281, Col: 90}
1400+ return templ.Error{Err: templ_7745c5c3_Err, FileName: `internal/adapters/web/pages.templ`, Line: 288, Col: 90}
14051401 }
1406- _, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(templ_7745c5c3_Var69)
1402+ _, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(templ_7745c5c3_Var67)
14071403 if templ_7745c5c3_Err != nil {
14081404 return templ_7745c5c3_Err
14091405 }
1410- templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 108, "\" data-finish=\"")
1406+ templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 110, "\" data-finish=\"")
14111407 if templ_7745c5c3_Err != nil {
14121408 return templ_7745c5c3_Err
14131409 }
1414- var templ_7745c5c3_Var70 string
1415- templ_7745c5c3_Var70, templ_7745c5c3_Err = templ.ResolveAttributeValue(p.Finish)
1410+ var templ_7745c5c3_Var68 string
1411+ templ_7745c5c3_Var68, templ_7745c5c3_Err = templ.ResolveAttributeValue(p.Finish)
14161412 if templ_7745c5c3_Err != nil {
1417- return templ.Error{Err: templ_7745c5c3_Err, FileName: `internal/adapters/web/pages.templ`, Line: 281, Col: 115}
1413+ return templ.Error{Err: templ_7745c5c3_Err, FileName: `internal/adapters/web/pages.templ`, Line: 288, Col: 115}
14181414 }
1419- _, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(templ_7745c5c3_Var70)
1415+ _, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(templ_7745c5c3_Var68)
14201416 if templ_7745c5c3_Err != nil {
14211417 return templ_7745c5c3_Err
14221418 }
1423- templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 109, "\">Add a passkey</button></form>")
1419+ templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 111, "\">Add a passkey</button></form>")
14241420 if templ_7745c5c3_Err != nil {
14251421 return templ_7745c5c3_Err
14261422 }
14271423 }
1428- templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 110, " <p class=\"dim\" role=\"status\" aria-live=\"polite\" data-passkey-status></p>")
1424+ templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 112, " <p class=\"dim\" role=\"status\" aria-live=\"polite\" data-passkey-status></p>")
14291425 if templ_7745c5c3_Err != nil {
14301426 return templ_7745c5c3_Err
14311427 }
14321428 return nil
14331429 })
1434- templ_7745c5c3_Err = Shell(l, nil).Render(templ.WithChildren(ctx, templ_7745c5c3_Var59), templ_7745c5c3_Buffer)
1430+ templ_7745c5c3_Err = Shell(l, nil).Render(templ.WithChildren(ctx, templ_7745c5c3_Var57), templ_7745c5c3_Buffer)
14351431 if templ_7745c5c3_Err != nil {
14361432 return templ_7745c5c3_Err
14371433 }
@@ -44,65 +44,44 @@ func Home(l Layout, p HomePage) templ.Component {
44 }()44 }()
45 }45 }
46 ctx = templ.InitializeContext(ctx)46 ctx = templ.InitializeContext(ctx)
47- templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 1, "<div class=\"filter\"><label for=\"home-filter\" class=\"sr\">filter</label> <input id=\"home-filter\" type=\"search\" data-filter=\"#repo-rows > tr\" placeholder=\"Filter repositories…\" autocomplete=\"off\" hx-on:input=\"ermite.filter(this)\"></div><table class=\"list home\" aria-label=\"Repositories\"><thead><tr><th class=\"cur\"></th>")47+ templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 1, "<h1 class=\"sr\">Repositories</h1><div class=\"home\"><section class=\"home-repos\" aria-label=\"Repositories\"><div class=\"home-bar\"><div class=\"filter\"><label for=\"home-filter\" class=\"sr\">filter</label> <input id=\"home-filter\" type=\"search\" data-filter=\"#repo-rows > li\" placeholder=\"Filter repositories…\" autocomplete=\"off\" hx-on:input=\"ermite.filter(this)\"></div><nav class=\"sort\" aria-label=\"Sort repositories\"><span class=\"mute\">sort</span> ")
48 if templ_7745c5c3_Err != nil {48 if templ_7745c5c3_Err != nil {
49 return templ_7745c5c3_Err49 return templ_7745c5c3_Err
50 }50 }
51- for _, c := range p.Cols {51+ for _, s := range p.Sorts {
52- var templ_7745c5c3_Var3 = []any{c.Class}52+ templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 2, "<a href=\"")
53- templ_7745c5c3_Err = templ.RenderCSSItems(ctx, templ_7745c5c3_Buffer, templ_7745c5c3_Var3...)
54 if templ_7745c5c3_Err != nil {53 if templ_7745c5c3_Err != nil {
55 return templ_7745c5c3_Err54 return templ_7745c5c3_Err
56 }55 }
57- templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 2, "<th class=\"")56+ var templ_7745c5c3_Var3 templ.SafeURL
57+ templ_7745c5c3_Var3, templ_7745c5c3_Err = templ.JoinURLErrs(templ.SafeURL(s.Href))
58 if templ_7745c5c3_Err != nil {58 if templ_7745c5c3_Err != nil {
59- return templ_7745c5c3_Err59+ return templ.Error{Err: templ_7745c5c3_Err, FileName: `internal/adapters/web/pages.templ`, Line: 27, Col: 36}
60- }
61- var templ_7745c5c3_Var4 string
62- templ_7745c5c3_Var4, templ_7745c5c3_Err = templ.ResolveAttributeValue(templ.CSSClasses(templ_7745c5c3_Var3).String())
63- if templ_7745c5c3_Err != nil {
64- return templ.Error{Err: templ_7745c5c3_Err, FileName: `internal/adapters/web/pages.templ`, Line: 1, Col: 0}
65- }
66- _, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(templ_7745c5c3_Var4)
67- if templ_7745c5c3_Err != nil {
68- return templ_7745c5c3_Err
69- }
70- templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 3, "\" aria-sort=\"")
71- if templ_7745c5c3_Err != nil {
72- return templ_7745c5c3_Err
73 }60 }
74- var templ_7745c5c3_Var5 string61+ _, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(templ.EscapeString(templ_7745c5c3_Var3))
75- templ_7745c5c3_Var5, templ_7745c5c3_Err = templ.ResolveAttributeValue(c.Dir)
76- if templ_7745c5c3_Err != nil {
77- return templ.Error{Err: templ_7745c5c3_Err, FileName: `internal/adapters/web/pages.templ`, Line: 24, Col: 45}
78- }
79- _, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(templ_7745c5c3_Var5)
80 if templ_7745c5c3_Err != nil {62 if templ_7745c5c3_Err != nil {
81 return templ_7745c5c3_Err63 return templ_7745c5c3_Err
82 }64 }
83- templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 4, "\"><a href=\"")65+ templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 3, "\"")
84 if templ_7745c5c3_Err != nil {66 if templ_7745c5c3_Err != nil {
85 return templ_7745c5c3_Err67 return templ_7745c5c3_Err
86 }68 }
87- var templ_7745c5c3_Var6 templ.SafeURL69+ if s.Mark != "" {
88- templ_7745c5c3_Var6, templ_7745c5c3_Err = templ.JoinURLErrs(templ.SafeURL(c.Href))70+ templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 4, " aria-current=\"true\"")
89- if templ_7745c5c3_Err != nil {71+ if templ_7745c5c3_Err != nil {
90- return templ.Error{Err: templ_7745c5c3_Err, FileName: `internal/adapters/web/pages.templ`, Line: 25, Col: 38}72+ return templ_7745c5c3_Err
91- }73+ }
92- _, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(templ.EscapeString(templ_7745c5c3_Var6))
93- if templ_7745c5c3_Err != nil {
94- return templ_7745c5c3_Err
95 }74 }
96- templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 5, "\">")75+ templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 5, ">")
97 if templ_7745c5c3_Err != nil {76 if templ_7745c5c3_Err != nil {
98 return templ_7745c5c3_Err77 return templ_7745c5c3_Err
99 }78 }
100- var templ_7745c5c3_Var7 string79+ var templ_7745c5c3_Var4 string
101- templ_7745c5c3_Var7, templ_7745c5c3_Err = templ.JoinStringErrs(c.Label)80+ templ_7745c5c3_Var4, templ_7745c5c3_Err = templ.JoinStringErrs(s.Label)
102 if templ_7745c5c3_Err != nil {81 if templ_7745c5c3_Err != nil {
103- return templ.Error{Err: templ_7745c5c3_Err, FileName: `internal/adapters/web/pages.templ`, Line: 26, Col: 17}82+ return templ.Error{Err: templ_7745c5c3_Err, FileName: `internal/adapters/web/pages.templ`, Line: 32, Col: 17}
104 }83 }
105- _, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(templ.EscapeString(templ_7745c5c3_Var7))84+ _, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(templ.EscapeString(templ_7745c5c3_Var4))
106 if templ_7745c5c3_Err != nil {85 if templ_7745c5c3_Err != nil {
107 return templ_7745c5c3_Err86 return templ_7745c5c3_Err
108 }87 }
@@ -110,31 +89,44 @@ func Home(l Layout, p HomePage) templ.Component {
110 if templ_7745c5c3_Err != nil {89 if templ_7745c5c3_Err != nil {
111 return templ_7745c5c3_Err90 return templ_7745c5c3_Err
112 }91 }
113- if c.Mark != "" {92+ if s.Mark != "" {
114 templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 7, "<span aria-hidden=\"true\">")93 templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 7, "<span aria-hidden=\"true\">")
115 if templ_7745c5c3_Err != nil {94 if templ_7745c5c3_Err != nil {
116 return templ_7745c5c3_Err95 return templ_7745c5c3_Err
117 }96 }
118- var templ_7745c5c3_Var8 string97+ var templ_7745c5c3_Var5 string
119- templ_7745c5c3_Var8, templ_7745c5c3_Err = templ.JoinStringErrs(c.Mark)98+ templ_7745c5c3_Var5, templ_7745c5c3_Err = templ.JoinStringErrs(s.Mark)
120 if templ_7745c5c3_Err != nil {99 if templ_7745c5c3_Err != nil {
121- return templ.Error{Err: templ_7745c5c3_Err, FileName: `internal/adapters/web/pages.templ`, Line: 28, Col: 42}100+ return templ.Error{Err: templ_7745c5c3_Err, FileName: `internal/adapters/web/pages.templ`, Line: 34, Col: 42}
122 }101 }
123- _, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(templ.EscapeString(templ_7745c5c3_Var8))102+ _, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(templ.EscapeString(templ_7745c5c3_Var5))
124 if templ_7745c5c3_Err != nil {103 if templ_7745c5c3_Err != nil {
125 return templ_7745c5c3_Err104 return templ_7745c5c3_Err
126 }105 }
127- templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 8, "</span>")106+ templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 8, "</span> <span class=\"sr\">")
107+ if templ_7745c5c3_Err != nil {
108+ return templ_7745c5c3_Err
109+ }
110+ var templ_7745c5c3_Var6 string
111+ templ_7745c5c3_Var6, templ_7745c5c3_Err = templ.JoinStringErrs(", " + s.State)
112+ if templ_7745c5c3_Err != nil {
113+ return templ.Error{Err: templ_7745c5c3_Err, FileName: `internal/adapters/web/pages.templ`, Line: 35, Col: 42}
114+ }
115+ _, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(templ.EscapeString(templ_7745c5c3_Var6))
116+ if templ_7745c5c3_Err != nil {
117+ return templ_7745c5c3_Err
118+ }
119+ templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 9, "</span>")
128 if templ_7745c5c3_Err != nil {120 if templ_7745c5c3_Err != nil {
129 return templ_7745c5c3_Err121 return templ_7745c5c3_Err
130 }122 }
131 }123 }
132- templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 9, "</a></th>")124+ templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 10, "</a>")
133 if templ_7745c5c3_Err != nil {125 if templ_7745c5c3_Err != nil {
134 return templ_7745c5c3_Err126 return templ_7745c5c3_Err
135 }127 }
136 }128 }
137- templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 10, "</tr></thead> <tbody id=\"repo-rows\" data-rows>")129+ templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 11, "</nav></div><ul class=\"repos\" id=\"repo-rows\" data-rows>")
138 if templ_7745c5c3_Err != nil {130 if templ_7745c5c3_Err != nil {
139 return templ_7745c5c3_Err131 return templ_7745c5c3_Err
140 }132 }
@@ -144,16 +136,20 @@ func Home(l Layout, p HomePage) templ.Component {
144 return templ_7745c5c3_Err136 return templ_7745c5c3_Err
145 }137 }
146 }138 }
147- templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 11, "</tbody></table>")139+ templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 12, "</ul>")
148 if templ_7745c5c3_Err != nil {140 if templ_7745c5c3_Err != nil {
149 return templ_7745c5c3_Err141 return templ_7745c5c3_Err
150 }142 }
151 if len(p.Rows) == 0 {143 if len(p.Rows) == 0 {
152- templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 12, "<p class=\"lede dim\">no repositories yet.</p>")144+ templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 13, "<p class=\"lede dim\">no repositories yet.</p>")
153 if templ_7745c5c3_Err != nil {145 if templ_7745c5c3_Err != nil {
154 return templ_7745c5c3_Err146 return templ_7745c5c3_Err
155 }147 }
156 }148 }
149+ templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 14, "</section></div>")
150+ if templ_7745c5c3_Err != nil {
151+ return templ_7745c5c3_Err
152+ }
157 return nil153 return nil
158 })154 })
159 templ_7745c5c3_Err = Shell(l, nil).Render(templ.WithChildren(ctx, templ_7745c5c3_Var2), templ_7745c5c3_Buffer)155 templ_7745c5c3_Err = Shell(l, nil).Render(templ.WithChildren(ctx, templ_7745c5c3_Var2), templ_7745c5c3_Buffer)
@@ -182,12 +178,12 @@ func Summary(l Layout, p SummaryPage) templ.Component {
182 }()178 }()
183 }179 }
184 ctx = templ.InitializeContext(ctx)180 ctx = templ.InitializeContext(ctx)
185- templ_7745c5c3_Var9 := templ.GetChildren(ctx)181+ templ_7745c5c3_Var7 := templ.GetChildren(ctx)
186- if templ_7745c5c3_Var9 == nil {182+ if templ_7745c5c3_Var7 == nil {
187- templ_7745c5c3_Var9 = templ.NopComponent183+ templ_7745c5c3_Var7 = templ.NopComponent
188 }184 }
189 ctx = templ.ClearChildren(ctx)185 ctx = templ.ClearChildren(ctx)
190- templ_7745c5c3_Var10 := templruntime.GeneratedTemplate(func(templ_7745c5c3_Input templruntime.GeneratedComponentInput) (templ_7745c5c3_Err error) {186+ templ_7745c5c3_Var8 := templruntime.GeneratedTemplate(func(templ_7745c5c3_Input templruntime.GeneratedComponentInput) (templ_7745c5c3_Err error) {
191 templ_7745c5c3_W, ctx := templ_7745c5c3_Input.Writer, templ_7745c5c3_Input.Context187 templ_7745c5c3_W, ctx := templ_7745c5c3_Input.Writer, templ_7745c5c3_Input.Context
192 templ_7745c5c3_Buffer, templ_7745c5c3_IsBuffer := templruntime.GetBuffer(templ_7745c5c3_W)188 templ_7745c5c3_Buffer, templ_7745c5c3_IsBuffer := templruntime.GetBuffer(templ_7745c5c3_W)
193 if !templ_7745c5c3_IsBuffer {189 if !templ_7745c5c3_IsBuffer {
@@ -207,7 +203,7 @@ func Summary(l Layout, p SummaryPage) templ.Component {
207 }203 }
208 return nil204 return nil
209 })205 })
210- templ_7745c5c3_Err = Shell(l, summaryRail(p)).Render(templ.WithChildren(ctx, templ_7745c5c3_Var10), templ_7745c5c3_Buffer)206+ templ_7745c5c3_Err = Shell(l, summaryRail(p)).Render(templ.WithChildren(ctx, templ_7745c5c3_Var8), templ_7745c5c3_Buffer)
211 if templ_7745c5c3_Err != nil {207 if templ_7745c5c3_Err != nil {
212 return templ_7745c5c3_Err208 return templ_7745c5c3_Err
213 }209 }
@@ -234,132 +230,132 @@ func latestTagFact(t LatestTag) templ.Component {
234 }()230 }()
235 }231 }
236 ctx = templ.InitializeContext(ctx)232 ctx = templ.InitializeContext(ctx)
237- templ_7745c5c3_Var11 := templ.GetChildren(ctx)233+ templ_7745c5c3_Var9 := templ.GetChildren(ctx)
238- if templ_7745c5c3_Var11 == nil {234+ if templ_7745c5c3_Var9 == nil {
239- templ_7745c5c3_Var11 = templ.NopComponent235+ templ_7745c5c3_Var9 = templ.NopComponent
240 }236 }
241 ctx = templ.ClearChildren(ctx)237 ctx = templ.ClearChildren(ctx)
242- templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 13, "<dt>latest tag</dt><dd class=\"latest-tag\">")238+ templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 15, "<dt>latest tag</dt><dd class=\"latest-tag\">")
243 if templ_7745c5c3_Err != nil {239 if templ_7745c5c3_Err != nil {
244 return templ_7745c5c3_Err240 return templ_7745c5c3_Err
245 }241 }
246 if t.Name != "" {242 if t.Name != "" {
247- templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 14, "<a class=\"tag-name\" href=\"")243+ templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 16, "<a class=\"tag-name\" href=\"")
248 if templ_7745c5c3_Err != nil {244 if templ_7745c5c3_Err != nil {
249 return templ_7745c5c3_Err245 return templ_7745c5c3_Err
250 }246 }
251- var templ_7745c5c3_Var12 templ.SafeURL247+ var templ_7745c5c3_Var10 templ.SafeURL
252- templ_7745c5c3_Var12, templ_7745c5c3_Err = templ.JoinURLErrs(templ.SafeURL(t.Href))248+ templ_7745c5c3_Var10, templ_7745c5c3_Err = templ.JoinURLErrs(templ.SafeURL(t.Href))
253 if templ_7745c5c3_Err != nil {249 if templ_7745c5c3_Err != nil {
254- return templ.Error{Err: templ_7745c5c3_Err, FileName: `internal/adapters/web/pages.templ`, Line: 64, Col: 51}250+ return templ.Error{Err: templ_7745c5c3_Err, FileName: `internal/adapters/web/pages.templ`, Line: 71, Col: 51}
255 }251 }
256- _, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(templ.EscapeString(templ_7745c5c3_Var12))252+ _, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(templ.EscapeString(templ_7745c5c3_Var10))
257 if templ_7745c5c3_Err != nil {253 if templ_7745c5c3_Err != nil {
258 return templ_7745c5c3_Err254 return templ_7745c5c3_Err
259 }255 }
260- templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 15, "\" title=\"")256+ templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 17, "\" title=\"")
261 if templ_7745c5c3_Err != nil {257 if templ_7745c5c3_Err != nil {
262 return templ_7745c5c3_Err258 return templ_7745c5c3_Err
263 }259 }
264- var templ_7745c5c3_Var13 string260+ var templ_7745c5c3_Var11 string
265- templ_7745c5c3_Var13, templ_7745c5c3_Err = templ.ResolveAttributeValue(t.Subject)261+ templ_7745c5c3_Var11, templ_7745c5c3_Err = templ.ResolveAttributeValue(t.Subject)
266 if templ_7745c5c3_Err != nil {262 if templ_7745c5c3_Err != nil {
267- return templ.Error{Err: templ_7745c5c3_Err, FileName: `internal/adapters/web/pages.templ`, Line: 64, Col: 71}263+ return templ.Error{Err: templ_7745c5c3_Err, FileName: `internal/adapters/web/pages.templ`, Line: 71, Col: 71}
268 }264 }
269- _, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(templ_7745c5c3_Var13)265+ _, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(templ_7745c5c3_Var11)
270 if templ_7745c5c3_Err != nil {266 if templ_7745c5c3_Err != nil {
271 return templ_7745c5c3_Err267 return templ_7745c5c3_Err
272 }268 }
273- templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 16, "\"><span class=\"ico i-tag\" aria-hidden=\"true\"></span>")269+ templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 18, "\"><span class=\"ico i-tag\" aria-hidden=\"true\"></span>")
274 if templ_7745c5c3_Err != nil {270 if templ_7745c5c3_Err != nil {
275 return templ_7745c5c3_Err271 return templ_7745c5c3_Err
276 }272 }
277- var templ_7745c5c3_Var14 string273+ var templ_7745c5c3_Var12 string
278- templ_7745c5c3_Var14, templ_7745c5c3_Err = templ.JoinStringErrs(t.Name)274+ templ_7745c5c3_Var12, templ_7745c5c3_Err = templ.JoinStringErrs(t.Name)
279 if templ_7745c5c3_Err != nil {275 if templ_7745c5c3_Err != nil {
280- return templ.Error{Err: templ_7745c5c3_Err, FileName: `internal/adapters/web/pages.templ`, Line: 64, Col: 132}276+ return templ.Error{Err: templ_7745c5c3_Err, FileName: `internal/adapters/web/pages.templ`, Line: 71, Col: 132}
281 }277 }
282- _, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(templ.EscapeString(templ_7745c5c3_Var14))278+ _, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(templ.EscapeString(templ_7745c5c3_Var12))
283 if templ_7745c5c3_Err != nil {279 if templ_7745c5c3_Err != nil {
284 return templ_7745c5c3_Err280 return templ_7745c5c3_Err
285 }281 }
286- templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 17, "</a> ")282+ templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 19, "</a> ")
287 if templ_7745c5c3_Err != nil {283 if templ_7745c5c3_Err != nil {
288 return templ_7745c5c3_Err284 return templ_7745c5c3_Err
289 }285 }
290 if t.WhenAt != "" {286 if t.WhenAt != "" {
291- templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 18, "<time class=\"dim\" datetime=\"")287+ templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 20, "<time class=\"dim\" datetime=\"")
292 if templ_7745c5c3_Err != nil {288 if templ_7745c5c3_Err != nil {
293 return templ_7745c5c3_Err289 return templ_7745c5c3_Err
294 }290 }
295- var templ_7745c5c3_Var15 string291+ var templ_7745c5c3_Var13 string
296- templ_7745c5c3_Var15, templ_7745c5c3_Err = templ.ResolveAttributeValue(t.WhenAt)292+ templ_7745c5c3_Var13, templ_7745c5c3_Err = templ.ResolveAttributeValue(t.WhenAt)
297 if templ_7745c5c3_Err != nil {293 if templ_7745c5c3_Err != nil {
298- return templ.Error{Err: templ_7745c5c3_Err, FileName: `internal/adapters/web/pages.templ`, Line: 66, Col: 41}294+ return templ.Error{Err: templ_7745c5c3_Err, FileName: `internal/adapters/web/pages.templ`, Line: 73, Col: 41}
299 }295 }
300- _, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(templ_7745c5c3_Var15)296+ _, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(templ_7745c5c3_Var13)
301 if templ_7745c5c3_Err != nil {297 if templ_7745c5c3_Err != nil {
302 return templ_7745c5c3_Err298 return templ_7745c5c3_Err
303 }299 }
304- templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 19, "\" title=\"")300+ templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 21, "\" title=\"")
305 if templ_7745c5c3_Err != nil {301 if templ_7745c5c3_Err != nil {
306 return templ_7745c5c3_Err302 return templ_7745c5c3_Err
307 }303 }
308- var templ_7745c5c3_Var16 string304+ var templ_7745c5c3_Var14 string
309- templ_7745c5c3_Var16, templ_7745c5c3_Err = templ.ResolveAttributeValue(t.WhenAt)305+ templ_7745c5c3_Var14, templ_7745c5c3_Err = templ.ResolveAttributeValue(t.WhenAt)
310 if templ_7745c5c3_Err != nil {306 if templ_7745c5c3_Err != nil {
311- return templ.Error{Err: templ_7745c5c3_Err, FileName: `internal/adapters/web/pages.templ`, Line: 66, Col: 60}307+ return templ.Error{Err: templ_7745c5c3_Err, FileName: `internal/adapters/web/pages.templ`, Line: 73, Col: 60}
312 }308 }
313- _, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(templ_7745c5c3_Var16)309+ _, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(templ_7745c5c3_Var14)
314 if templ_7745c5c3_Err != nil {310 if templ_7745c5c3_Err != nil {
315 return templ_7745c5c3_Err311 return templ_7745c5c3_Err
316 }312 }
317- templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 20, "\">")313+ templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 22, "\">")
318 if templ_7745c5c3_Err != nil {314 if templ_7745c5c3_Err != nil {
319 return templ_7745c5c3_Err315 return templ_7745c5c3_Err
320 }316 }
321- var templ_7745c5c3_Var17 string317+ var templ_7745c5c3_Var15 string
322- templ_7745c5c3_Var17, templ_7745c5c3_Err = templ.JoinStringErrs(t.When)318+ templ_7745c5c3_Var15, templ_7745c5c3_Err = templ.JoinStringErrs(t.When)
323 if templ_7745c5c3_Err != nil {319 if templ_7745c5c3_Err != nil {
324- return templ.Error{Err: templ_7745c5c3_Err, FileName: `internal/adapters/web/pages.templ`, Line: 66, Col: 71}320+ return templ.Error{Err: templ_7745c5c3_Err, FileName: `internal/adapters/web/pages.templ`, Line: 73, Col: 71}
325 }321 }
326- _, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(templ.EscapeString(templ_7745c5c3_Var17))322+ _, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(templ.EscapeString(templ_7745c5c3_Var15))
327 if templ_7745c5c3_Err != nil {323 if templ_7745c5c3_Err != nil {
328 return templ_7745c5c3_Err324 return templ_7745c5c3_Err
329 }325 }
330- templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 21, "</time> ")326+ templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 23, "</time> ")
331 if templ_7745c5c3_Err != nil {327 if templ_7745c5c3_Err != nil {
332 return templ_7745c5c3_Err328 return templ_7745c5c3_Err
333 }329 }
334 }330 }
335 }331 }
336- templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 22, "<a class=\"all-tags\" href=\"")332+ templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 24, "<a class=\"all-tags\" href=\"")
337 if templ_7745c5c3_Err != nil {333 if templ_7745c5c3_Err != nil {
338 return templ_7745c5c3_Err334 return templ_7745c5c3_Err
339 }335 }
340- var templ_7745c5c3_Var18 templ.SafeURL336+ var templ_7745c5c3_Var16 templ.SafeURL
341- templ_7745c5c3_Var18, templ_7745c5c3_Err = templ.JoinURLErrs(templ.SafeURL(t.RefsHref))337+ templ_7745c5c3_Var16, templ_7745c5c3_Err = templ.JoinURLErrs(templ.SafeURL(t.RefsHref))
342 if templ_7745c5c3_Err != nil {338 if templ_7745c5c3_Err != nil {
343- return templ.Error{Err: templ_7745c5c3_Err, FileName: `internal/adapters/web/pages.templ`, Line: 69, Col: 54}339+ return templ.Error{Err: templ_7745c5c3_Err, FileName: `internal/adapters/web/pages.templ`, Line: 76, Col: 54}
344 }340 }
345- _, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(templ.EscapeString(templ_7745c5c3_Var18))341+ _, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(templ.EscapeString(templ_7745c5c3_Var16))
346 if templ_7745c5c3_Err != nil {342 if templ_7745c5c3_Err != nil {
347 return templ_7745c5c3_Err343 return templ_7745c5c3_Err
348 }344 }
349- templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 23, "\">")345+ templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 25, "\">")
350 if templ_7745c5c3_Err != nil {346 if templ_7745c5c3_Err != nil {
351 return templ_7745c5c3_Err347 return templ_7745c5c3_Err
352 }348 }
353- var templ_7745c5c3_Var19 string349+ var templ_7745c5c3_Var17 string
354- templ_7745c5c3_Var19, templ_7745c5c3_Err = templ.JoinStringErrs(plural(t.Count, "tag", "tags"))350+ templ_7745c5c3_Var17, templ_7745c5c3_Err = templ.JoinStringErrs(plural(t.Count, "tag", "tags"))
355 if templ_7745c5c3_Err != nil {351 if templ_7745c5c3_Err != nil {
356- return templ.Error{Err: templ_7745c5c3_Err, FileName: `internal/adapters/web/pages.templ`, Line: 69, Col: 89}352+ return templ.Error{Err: templ_7745c5c3_Err, FileName: `internal/adapters/web/pages.templ`, Line: 76, Col: 89}
357 }353 }
358- _, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(templ.EscapeString(templ_7745c5c3_Var19))354+ _, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(templ.EscapeString(templ_7745c5c3_Var17))
359 if templ_7745c5c3_Err != nil {355 if templ_7745c5c3_Err != nil {
360 return templ_7745c5c3_Err356 return templ_7745c5c3_Err
361 }357 }
362- templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 24, "</a></dd>")358+ templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 26, "</a></dd>")
363 if templ_7745c5c3_Err != nil {359 if templ_7745c5c3_Err != nil {
364 return templ_7745c5c3_Err360 return templ_7745c5c3_Err
365 }361 }
@@ -383,12 +379,12 @@ func summaryRail(p SummaryPage) templ.Component {
383 }()379 }()
384 }380 }
385 ctx = templ.InitializeContext(ctx)381 ctx = templ.InitializeContext(ctx)
386- templ_7745c5c3_Var20 := templ.GetChildren(ctx)382+ templ_7745c5c3_Var18 := templ.GetChildren(ctx)
387- if templ_7745c5c3_Var20 == nil {383+ if templ_7745c5c3_Var18 == nil {
388- templ_7745c5c3_Var20 = templ.NopComponent384+ templ_7745c5c3_Var18 = templ.NopComponent
389 }385 }
390 ctx = templ.ClearChildren(ctx)386 ctx = templ.ClearChildren(ctx)
391- templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 25, "<section aria-labelledby=\"r-clone\"><h2 id=\"r-clone\">Clone</h2>")387+ templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 27, "<section aria-labelledby=\"r-clone\"><h2 id=\"r-clone\">Clone</h2>")
392 if templ_7745c5c3_Err != nil {388 if templ_7745c5c3_Err != nil {
393 return templ_7745c5c3_Err389 return templ_7745c5c3_Err
394 }390 }
@@ -396,25 +392,25 @@ func summaryRail(p SummaryPage) templ.Component {
396 if templ_7745c5c3_Err != nil {392 if templ_7745c5c3_Err != nil {
397 return templ_7745c5c3_Err393 return templ_7745c5c3_Err
398 }394 }
399- templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 26, "</section><section aria-labelledby=\"r-facts\"><h2 id=\"r-facts\">About</h2><dl class=\"kv\">")395+ templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 28, "</section><section aria-labelledby=\"r-facts\"><h2 id=\"r-facts\">About</h2><dl class=\"kv\">")
400 if templ_7745c5c3_Err != nil {396 if templ_7745c5c3_Err != nil {
401 return templ_7745c5c3_Err397 return templ_7745c5c3_Err
402 }398 }
403 for _, f := range p.Facts {399 for _, f := range p.Facts {
404- templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 27, "<dt>")400+ templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 29, "<dt>")
405 if templ_7745c5c3_Err != nil {401 if templ_7745c5c3_Err != nil {
406 return templ_7745c5c3_Err402 return templ_7745c5c3_Err
407 }403 }
408- var templ_7745c5c3_Var21 string404+ var templ_7745c5c3_Var19 string
409- templ_7745c5c3_Var21, templ_7745c5c3_Err = templ.JoinStringErrs(f.Key)405+ templ_7745c5c3_Var19, templ_7745c5c3_Err = templ.JoinStringErrs(f.Key)
410 if templ_7745c5c3_Err != nil {406 if templ_7745c5c3_Err != nil {
411- return templ.Error{Err: templ_7745c5c3_Err, FileName: `internal/adapters/web/pages.templ`, Line: 80, Col: 15}407+ return templ.Error{Err: templ_7745c5c3_Err, FileName: `internal/adapters/web/pages.templ`, Line: 87, Col: 15}
412 }408 }
413- _, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(templ.EscapeString(templ_7745c5c3_Var21))409+ _, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(templ.EscapeString(templ_7745c5c3_Var19))
414 if templ_7745c5c3_Err != nil {410 if templ_7745c5c3_Err != nil {
415 return templ_7745c5c3_Err411 return templ_7745c5c3_Err
416 }412 }
417- templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 28, "</dt>")413+ templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 30, "</dt>")
418 if templ_7745c5c3_Err != nil {414 if templ_7745c5c3_Err != nil {
419 return templ_7745c5c3_Err415 return templ_7745c5c3_Err
420 }416 }
@@ -429,25 +425,25 @@ func summaryRail(p SummaryPage) templ.Component {
429 return templ_7745c5c3_Err425 return templ_7745c5c3_Err
430 }426 }
431 }427 }
432- templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 29, "</dl></section>")428+ templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 31, "</dl></section>")
433 if templ_7745c5c3_Err != nil {429 if templ_7745c5c3_Err != nil {
434 return templ_7745c5c3_Err430 return templ_7745c5c3_Err
435 }431 }
436 if len(p.Recent) > 0 {432 if len(p.Recent) > 0 {
437- templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 30, "<section aria-labelledby=\"r-recent\"><h2 id=\"r-recent\">Recent commits <a href=\"")433+ templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 32, "<section aria-labelledby=\"r-recent\"><h2 id=\"r-recent\">Recent commits <a href=\"")
438 if templ_7745c5c3_Err != nil {434 if templ_7745c5c3_Err != nil {
439 return templ_7745c5c3_Err435 return templ_7745c5c3_Err
440 }436 }
441- var templ_7745c5c3_Var22 templ.SafeURL437+ var templ_7745c5c3_Var20 templ.SafeURL
442- templ_7745c5c3_Var22, templ_7745c5c3_Err = templ.JoinURLErrs(templ.SafeURL(p.AllHref))438+ templ_7745c5c3_Var20, templ_7745c5c3_Err = templ.JoinURLErrs(templ.SafeURL(p.AllHref))
443 if templ_7745c5c3_Err != nil {439 if templ_7745c5c3_Err != nil {
444- return templ.Error{Err: templ_7745c5c3_Err, FileName: `internal/adapters/web/pages.templ`, Line: 89, Col: 105}440+ return templ.Error{Err: templ_7745c5c3_Err, FileName: `internal/adapters/web/pages.templ`, Line: 96, Col: 105}
445 }441 }
446- _, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(templ.EscapeString(templ_7745c5c3_Var22))442+ _, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(templ.EscapeString(templ_7745c5c3_Var20))
447 if templ_7745c5c3_Err != nil {443 if templ_7745c5c3_Err != nil {
448 return templ_7745c5c3_Err444 return templ_7745c5c3_Err
449 }445 }
450- templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 31, "\">View all</a></h2>")446+ templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 33, "\">View all</a></h2>")
451 if templ_7745c5c3_Err != nil {447 if templ_7745c5c3_Err != nil {
452 return templ_7745c5c3_Err448 return templ_7745c5c3_Err
453 }449 }
@@ -455,7 +451,7 @@ func summaryRail(p SummaryPage) templ.Component {
455 if templ_7745c5c3_Err != nil {451 if templ_7745c5c3_Err != nil {
456 return templ_7745c5c3_Err452 return templ_7745c5c3_Err
457 }453 }
458- templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 32, "</section>")454+ templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 34, "</section>")
459 if templ_7745c5c3_Err != nil {455 if templ_7745c5c3_Err != nil {
460 return templ_7745c5c3_Err456 return templ_7745c5c3_Err
461 }457 }
@@ -467,7 +463,7 @@ func summaryRail(p SummaryPage) templ.Component {
467 }463 }
468 }464 }
469 if len(p.Outline) > 0 && p.Readme != nil {465 if len(p.Outline) > 0 && p.Readme != nil {
470- templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 33, "<section aria-labelledby=\"r-outline\"><h2 id=\"r-outline\">On this page</h2>")466+ templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 35, "<section aria-labelledby=\"r-outline\"><h2 id=\"r-outline\">On this page</h2>")
471 if templ_7745c5c3_Err != nil {467 if templ_7745c5c3_Err != nil {
472 return templ_7745c5c3_Err468 return templ_7745c5c3_Err
473 }469 }
@@ -475,7 +471,7 @@ func summaryRail(p SummaryPage) templ.Component {
475 if templ_7745c5c3_Err != nil {471 if templ_7745c5c3_Err != nil {
476 return templ_7745c5c3_Err472 return templ_7745c5c3_Err
477 }473 }
478- templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 34, "</section>")474+ templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 36, "</section>")
479 if templ_7745c5c3_Err != nil {475 if templ_7745c5c3_Err != nil {
480 return templ_7745c5c3_Err476 return templ_7745c5c3_Err
481 }477 }
@@ -501,12 +497,12 @@ func Refs(l Layout, p RefsPage) templ.Component {
501 }()497 }()
502 }498 }
503 ctx = templ.InitializeContext(ctx)499 ctx = templ.InitializeContext(ctx)
504- templ_7745c5c3_Var23 := templ.GetChildren(ctx)500+ templ_7745c5c3_Var21 := templ.GetChildren(ctx)
505- if templ_7745c5c3_Var23 == nil {501+ if templ_7745c5c3_Var21 == nil {
506- templ_7745c5c3_Var23 = templ.NopComponent502+ templ_7745c5c3_Var21 = templ.NopComponent
507 }503 }
508 ctx = templ.ClearChildren(ctx)504 ctx = templ.ClearChildren(ctx)
509- templ_7745c5c3_Var24 := templruntime.GeneratedTemplate(func(templ_7745c5c3_Input templruntime.GeneratedComponentInput) (templ_7745c5c3_Err error) {505+ templ_7745c5c3_Var22 := templruntime.GeneratedTemplate(func(templ_7745c5c3_Input templruntime.GeneratedComponentInput) (templ_7745c5c3_Err error) {
510 templ_7745c5c3_W, ctx := templ_7745c5c3_Input.Writer, templ_7745c5c3_Input.Context506 templ_7745c5c3_W, ctx := templ_7745c5c3_Input.Writer, templ_7745c5c3_Input.Context
511 templ_7745c5c3_Buffer, templ_7745c5c3_IsBuffer := templruntime.GetBuffer(templ_7745c5c3_W)507 templ_7745c5c3_Buffer, templ_7745c5c3_IsBuffer := templruntime.GetBuffer(templ_7745c5c3_W)
512 if !templ_7745c5c3_IsBuffer {508 if !templ_7745c5c3_IsBuffer {
@@ -518,7 +514,7 @@ func Refs(l Layout, p RefsPage) templ.Component {
518 }()514 }()
519 }515 }
520 ctx = templ.InitializeContext(ctx)516 ctx = templ.InitializeContext(ctx)
521- templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 35, "<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=\"cur\"></th><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>")517+ templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 37, "<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=\"cur\"></th><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>")
522 if templ_7745c5c3_Err != nil {518 if templ_7745c5c3_Err != nil {
523 return templ_7745c5c3_Err519 return templ_7745c5c3_Err
524 }520 }
@@ -526,32 +522,32 @@ func Refs(l Layout, p RefsPage) templ.Component {
526 if templ_7745c5c3_Err != nil {522 if templ_7745c5c3_Err != nil {
527 return templ_7745c5c3_Err523 return templ_7745c5c3_Err
528 }524 }
529- templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 36, "</table>")525+ templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 38, "</table>")
530 if templ_7745c5c3_Err != nil {526 if templ_7745c5c3_Err != nil {
531 return templ_7745c5c3_Err527 return templ_7745c5c3_Err
532 }528 }
533 if p.Note != "" {529 if p.Note != "" {
534- templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 37, "<p class=\"note\">")530+ templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 39, "<p class=\"note\">")
535 if templ_7745c5c3_Err != nil {531 if templ_7745c5c3_Err != nil {
536 return templ_7745c5c3_Err532 return templ_7745c5c3_Err
537 }533 }
538- var templ_7745c5c3_Var25 string534+ var templ_7745c5c3_Var23 string
539- templ_7745c5c3_Var25, templ_7745c5c3_Err = templ.JoinStringErrs(p.Note)535+ templ_7745c5c3_Var23, templ_7745c5c3_Err = templ.JoinStringErrs(p.Note)
540 if templ_7745c5c3_Err != nil {536 if templ_7745c5c3_Err != nil {
541- return templ.Error{Err: templ_7745c5c3_Err, FileName: `internal/adapters/web/pages.templ`, Line: 122, Col: 27}537+ return templ.Error{Err: templ_7745c5c3_Err, FileName: `internal/adapters/web/pages.templ`, Line: 129, Col: 27}
542 }538 }
543- _, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(templ.EscapeString(templ_7745c5c3_Var25))539+ _, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(templ.EscapeString(templ_7745c5c3_Var23))
544 if templ_7745c5c3_Err != nil {540 if templ_7745c5c3_Err != nil {
545 return templ_7745c5c3_Err541 return templ_7745c5c3_Err
546 }542 }
547- templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 38, "</p>")543+ templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 40, "</p>")
548 if templ_7745c5c3_Err != nil {544 if templ_7745c5c3_Err != nil {
549 return templ_7745c5c3_Err545 return templ_7745c5c3_Err
550 }546 }
551 }547 }
552 return nil548 return nil
553 })549 })
554- templ_7745c5c3_Err = Shell(l, refsRail(p)).Render(templ.WithChildren(ctx, templ_7745c5c3_Var24), templ_7745c5c3_Buffer)550+ templ_7745c5c3_Err = Shell(l, refsRail(p)).Render(templ.WithChildren(ctx, templ_7745c5c3_Var22), templ_7745c5c3_Buffer)
555 if templ_7745c5c3_Err != nil {551 if templ_7745c5c3_Err != nil {
556 return templ_7745c5c3_Err552 return templ_7745c5c3_Err
557 }553 }
@@ -575,112 +571,112 @@ func refRow(kind string, r RefRow) templ.Component {
575 }()571 }()
576 }572 }
577 ctx = templ.InitializeContext(ctx)573 ctx = templ.InitializeContext(ctx)
578- templ_7745c5c3_Var26 := templ.GetChildren(ctx)574+ templ_7745c5c3_Var24 := templ.GetChildren(ctx)
579- if templ_7745c5c3_Var26 == nil {575+ if templ_7745c5c3_Var24 == nil {
580- templ_7745c5c3_Var26 = templ.NopComponent576+ templ_7745c5c3_Var24 = templ.NopComponent
581 }577 }
582 ctx = templ.ClearChildren(ctx)578 ctx = templ.ClearChildren(ctx)
583- templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 39, "<tr")579+ templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 41, "<tr")
584 if templ_7745c5c3_Err != nil {580 if templ_7745c5c3_Err != nil {
585 return templ_7745c5c3_Err581 return templ_7745c5c3_Err
586 }582 }
587 if r.Cursor {583 if r.Cursor {
588- templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 40, " data-cursor")584+ templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 42, " data-cursor")
589 if templ_7745c5c3_Err != nil {585 if templ_7745c5c3_Err != nil {
590 return templ_7745c5c3_Err586 return templ_7745c5c3_Err
591 }587 }
592 }588 }
593- templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 41, "><td class=\"cur\" aria-hidden=\"true\"></td><td class=\"c-kind mute\">")589+ templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 43, "><td class=\"cur\" aria-hidden=\"true\"></td><td class=\"c-kind mute\">")
594 if templ_7745c5c3_Err != nil {590 if templ_7745c5c3_Err != nil {
595 return templ_7745c5c3_Err591 return templ_7745c5c3_Err
596 }592 }
597- var templ_7745c5c3_Var27 string593+ var templ_7745c5c3_Var25 string
598- templ_7745c5c3_Var27, templ_7745c5c3_Err = templ.JoinStringErrs(kind)594+ templ_7745c5c3_Var25, templ_7745c5c3_Err = templ.JoinStringErrs(kind)
599 if templ_7745c5c3_Err != nil {595 if templ_7745c5c3_Err != nil {
600- return templ.Error{Err: templ_7745c5c3_Err, FileName: `internal/adapters/web/pages.templ`, Line: 130, Col: 32}596+ return templ.Error{Err: templ_7745c5c3_Err, FileName: `internal/adapters/web/pages.templ`, Line: 137, Col: 32}
601 }597 }
602- _, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(templ.EscapeString(templ_7745c5c3_Var27))598+ _, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(templ.EscapeString(templ_7745c5c3_Var25))
603 if templ_7745c5c3_Err != nil {599 if templ_7745c5c3_Err != nil {
604 return templ_7745c5c3_Err600 return templ_7745c5c3_Err
605 }601 }
606- templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 42, "</td><td class=\"c-name\"><a href=\"")602+ templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 44, "</td><td class=\"c-name\"><a href=\"")
607 if templ_7745c5c3_Err != nil {603 if templ_7745c5c3_Err != nil {
608 return templ_7745c5c3_Err604 return templ_7745c5c3_Err
609 }605 }
610- var templ_7745c5c3_Var28 templ.SafeURL606+ var templ_7745c5c3_Var26 templ.SafeURL
611- templ_7745c5c3_Var28, templ_7745c5c3_Err = templ.JoinURLErrs(templ.SafeURL(r.Href))607+ templ_7745c5c3_Var26, templ_7745c5c3_Err = templ.JoinURLErrs(templ.SafeURL(r.Href))
612 if templ_7745c5c3_Err != nil {608 if templ_7745c5c3_Err != nil {
613- return templ.Error{Err: templ_7745c5c3_Err, FileName: `internal/adapters/web/pages.templ`, Line: 132, Col: 34}609+ return templ.Error{Err: templ_7745c5c3_Err, FileName: `internal/adapters/web/pages.templ`, Line: 139, Col: 34}
614 }610 }
615- _, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(templ.EscapeString(templ_7745c5c3_Var28))611+ _, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(templ.EscapeString(templ_7745c5c3_Var26))
616 if templ_7745c5c3_Err != nil {612 if templ_7745c5c3_Err != nil {
617 return templ_7745c5c3_Err613 return templ_7745c5c3_Err
618 }614 }
619- templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 43, "\">")615+ templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 45, "\">")
620 if templ_7745c5c3_Err != nil {616 if templ_7745c5c3_Err != nil {
621 return templ_7745c5c3_Err617 return templ_7745c5c3_Err
622 }618 }
623- var templ_7745c5c3_Var29 string619+ var templ_7745c5c3_Var27 string
624- templ_7745c5c3_Var29, templ_7745c5c3_Err = templ.JoinStringErrs(r.Name)620+ templ_7745c5c3_Var27, templ_7745c5c3_Err = templ.JoinStringErrs(r.Name)
625 if templ_7745c5c3_Err != nil {621 if templ_7745c5c3_Err != nil {
626- return templ.Error{Err: templ_7745c5c3_Err, FileName: `internal/adapters/web/pages.templ`, Line: 132, Col: 45}622+ return templ.Error{Err: templ_7745c5c3_Err, FileName: `internal/adapters/web/pages.templ`, Line: 139, Col: 45}
627 }623 }
628- _, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(templ.EscapeString(templ_7745c5c3_Var29))624+ _, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(templ.EscapeString(templ_7745c5c3_Var27))
629 if templ_7745c5c3_Err != nil {625 if templ_7745c5c3_Err != nil {
630 return templ_7745c5c3_Err626 return templ_7745c5c3_Err
631 }627 }
632- templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 44, "</a> ")628+ templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 46, "</a> ")
633 if templ_7745c5c3_Err != nil {629 if templ_7745c5c3_Err != nil {
634 return templ_7745c5c3_Err630 return templ_7745c5c3_Err
635 }631 }
636 if r.Default {632 if r.Default {
637- templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 45, "<span class=\"pill\">default</span>")633+ templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 47, "<span class=\"pill\">default</span>")
638 if templ_7745c5c3_Err != nil {634 if templ_7745c5c3_Err != nil {
639 return templ_7745c5c3_Err635 return templ_7745c5c3_Err
640 }636 }
641 }637 }
642- templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 46, "</td><td class=\"c-sha\">")638+ templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 48, "</td><td class=\"c-sha\">")
643 if templ_7745c5c3_Err != nil {639 if templ_7745c5c3_Err != nil {
644 return templ_7745c5c3_Err640 return templ_7745c5c3_Err
645 }641 }
646 if r.CHref != "" {642 if r.CHref != "" {
647- templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 47, "<a href=\"")643+ templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 49, "<a href=\"")
648 if templ_7745c5c3_Err != nil {644 if templ_7745c5c3_Err != nil {
649 return templ_7745c5c3_Err645 return templ_7745c5c3_Err
650 }646 }
651- var templ_7745c5c3_Var30 templ.SafeURL647+ var templ_7745c5c3_Var28 templ.SafeURL
652- templ_7745c5c3_Var30, templ_7745c5c3_Err = templ.JoinURLErrs(templ.SafeURL(r.CHref))648+ templ_7745c5c3_Var28, templ_7745c5c3_Err = templ.JoinURLErrs(templ.SafeURL(r.CHref))
653 if templ_7745c5c3_Err != nil {649 if templ_7745c5c3_Err != nil {
654- return templ.Error{Err: templ_7745c5c3_Err, FileName: `internal/adapters/web/pages.templ`, Line: 139, Col: 36}650+ return templ.Error{Err: templ_7745c5c3_Err, FileName: `internal/adapters/web/pages.templ`, Line: 146, Col: 36}
655 }651 }
656- _, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(templ.EscapeString(templ_7745c5c3_Var30))652+ _, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(templ.EscapeString(templ_7745c5c3_Var28))
657 if templ_7745c5c3_Err != nil {653 if templ_7745c5c3_Err != nil {
658 return templ_7745c5c3_Err654 return templ_7745c5c3_Err
659 }655 }
660- templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 48, "\">")656+ templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 50, "\">")
661 if templ_7745c5c3_Err != nil {657 if templ_7745c5c3_Err != nil {
662 return templ_7745c5c3_Err658 return templ_7745c5c3_Err
663 }659 }
664- var templ_7745c5c3_Var31 string660+ var templ_7745c5c3_Var29 string
665- templ_7745c5c3_Var31, templ_7745c5c3_Err = templ.JoinStringErrs(r.Short)661+ templ_7745c5c3_Var29, templ_7745c5c3_Err = templ.JoinStringErrs(r.Short)
666 if templ_7745c5c3_Err != nil {662 if templ_7745c5c3_Err != nil {
667- return templ.Error{Err: templ_7745c5c3_Err, FileName: `internal/adapters/web/pages.templ`, Line: 139, Col: 48}663+ return templ.Error{Err: templ_7745c5c3_Err, FileName: `internal/adapters/web/pages.templ`, Line: 146, Col: 48}
668 }664 }
669- _, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(templ.EscapeString(templ_7745c5c3_Var31))665+ _, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(templ.EscapeString(templ_7745c5c3_Var29))
670 if templ_7745c5c3_Err != nil {666 if templ_7745c5c3_Err != nil {
671 return templ_7745c5c3_Err667 return templ_7745c5c3_Err
672 }668 }
673- templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 49, "</a>")669+ templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 51, "</a>")
674 if templ_7745c5c3_Err != nil {670 if templ_7745c5c3_Err != nil {
675 return templ_7745c5c3_Err671 return templ_7745c5c3_Err
676 }672 }
677 } else {673 } else {
678- var templ_7745c5c3_Var32 string674+ var templ_7745c5c3_Var30 string
679- templ_7745c5c3_Var32, templ_7745c5c3_Err = templ.JoinStringErrs(r.Short)675+ templ_7745c5c3_Var30, templ_7745c5c3_Err = templ.JoinStringErrs(r.Short)
680 if templ_7745c5c3_Err != nil {676 if templ_7745c5c3_Err != nil {
681- return templ.Error{Err: templ_7745c5c3_Err, FileName: `internal/adapters/web/pages.templ`, Line: 141, Col: 13}677+ return templ.Error{Err: templ_7745c5c3_Err, FileName: `internal/adapters/web/pages.templ`, Line: 148, Col: 13}
682 }678 }
683- _, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(templ.EscapeString(templ_7745c5c3_Var32))679+ _, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(templ.EscapeString(templ_7745c5c3_Var30))
684 if templ_7745c5c3_Err != nil {680 if templ_7745c5c3_Err != nil {
685 return templ_7745c5c3_Err681 return templ_7745c5c3_Err
686 }682 }
@@ -689,69 +685,69 @@ func refRow(kind string, r RefRow) templ.Component {
689 if templ_7745c5c3_Err != nil {685 if templ_7745c5c3_Err != nil {
690 return templ_7745c5c3_Err686 return templ_7745c5c3_Err
691 }687 }
692- templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 50, "</td><td class=\"c-sub\">")688+ templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 52, "</td><td class=\"c-sub\">")
693 if templ_7745c5c3_Err != nil {689 if templ_7745c5c3_Err != nil {
694 return templ_7745c5c3_Err690 return templ_7745c5c3_Err
695 }691 }
696- var templ_7745c5c3_Var33 string692+ var templ_7745c5c3_Var31 string
697- templ_7745c5c3_Var33, templ_7745c5c3_Err = templ.JoinStringErrs(r.Subject)693+ templ_7745c5c3_Var31, templ_7745c5c3_Err = templ.JoinStringErrs(r.Subject)
698 if templ_7745c5c3_Err != nil {694 if templ_7745c5c3_Err != nil {
699- return templ.Error{Err: templ_7745c5c3_Err, FileName: `internal/adapters/web/pages.templ`, Line: 145, Col: 31}695+ return templ.Error{Err: templ_7745c5c3_Err, FileName: `internal/adapters/web/pages.templ`, Line: 152, Col: 31}
700 }696 }
701- _, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(templ.EscapeString(templ_7745c5c3_Var33))697+ _, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(templ.EscapeString(templ_7745c5c3_Var31))
702 if templ_7745c5c3_Err != nil {698 if templ_7745c5c3_Err != nil {
703 return templ_7745c5c3_Err699 return templ_7745c5c3_Err
704 }700 }
705- templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 51, "</td><td class=\"c-when dim\">")701+ templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 53, "</td><td class=\"c-when dim\">")
706 if templ_7745c5c3_Err != nil {702 if templ_7745c5c3_Err != nil {
707 return templ_7745c5c3_Err703 return templ_7745c5c3_Err
708 }704 }
709 if r.WhenAt != "" {705 if r.WhenAt != "" {
710- templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 52, "<time datetime=\"")706+ templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 54, "<time datetime=\"")
711 if templ_7745c5c3_Err != nil {707 if templ_7745c5c3_Err != nil {
712 return templ_7745c5c3_Err708 return templ_7745c5c3_Err
713 }709 }
714- var templ_7745c5c3_Var34 string710+ var templ_7745c5c3_Var32 string
715- templ_7745c5c3_Var34, templ_7745c5c3_Err = templ.ResolveAttributeValue(r.WhenAt)711+ templ_7745c5c3_Var32, templ_7745c5c3_Err = templ.ResolveAttributeValue(r.WhenAt)
716 if templ_7745c5c3_Err != nil {712 if templ_7745c5c3_Err != nil {
717- return templ.Error{Err: templ_7745c5c3_Err, FileName: `internal/adapters/web/pages.templ`, Line: 148, Col: 29}713+ return templ.Error{Err: templ_7745c5c3_Err, FileName: `internal/adapters/web/pages.templ`, Line: 155, Col: 29}
718 }714 }
719- _, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(templ_7745c5c3_Var34)715+ _, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(templ_7745c5c3_Var32)
720 if templ_7745c5c3_Err != nil {716 if templ_7745c5c3_Err != nil {
721 return templ_7745c5c3_Err717 return templ_7745c5c3_Err
722 }718 }
723- templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 53, "\" title=\"")719+ templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 55, "\" title=\"")
724 if templ_7745c5c3_Err != nil {720 if templ_7745c5c3_Err != nil {
725 return templ_7745c5c3_Err721 return templ_7745c5c3_Err
726 }722 }
727- var templ_7745c5c3_Var35 string723+ var templ_7745c5c3_Var33 string
728- templ_7745c5c3_Var35, templ_7745c5c3_Err = templ.ResolveAttributeValue(r.WhenAt)724+ templ_7745c5c3_Var33, templ_7745c5c3_Err = templ.ResolveAttributeValue(r.WhenAt)
729 if templ_7745c5c3_Err != nil {725 if templ_7745c5c3_Err != nil {
730- return templ.Error{Err: templ_7745c5c3_Err, FileName: `internal/adapters/web/pages.templ`, Line: 148, Col: 48}726+ return templ.Error{Err: templ_7745c5c3_Err, FileName: `internal/adapters/web/pages.templ`, Line: 155, Col: 48}
731 }727 }
732- _, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(templ_7745c5c3_Var35)728+ _, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(templ_7745c5c3_Var33)
733 if templ_7745c5c3_Err != nil {729 if templ_7745c5c3_Err != nil {
734 return templ_7745c5c3_Err730 return templ_7745c5c3_Err
735 }731 }
736- templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 54, "\">")732+ templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 56, "\">")
737 if templ_7745c5c3_Err != nil {733 if templ_7745c5c3_Err != nil {
738 return templ_7745c5c3_Err734 return templ_7745c5c3_Err
739 }735 }
740- var templ_7745c5c3_Var36 string736+ var templ_7745c5c3_Var34 string
741- templ_7745c5c3_Var36, templ_7745c5c3_Err = templ.JoinStringErrs(r.When)737+ templ_7745c5c3_Var34, templ_7745c5c3_Err = templ.JoinStringErrs(r.When)
742 if templ_7745c5c3_Err != nil {738 if templ_7745c5c3_Err != nil {
743- return templ.Error{Err: templ_7745c5c3_Err, FileName: `internal/adapters/web/pages.templ`, Line: 148, Col: 59}739+ return templ.Error{Err: templ_7745c5c3_Err, FileName: `internal/adapters/web/pages.templ`, Line: 155, Col: 59}
744 }740 }
745- _, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(templ.EscapeString(templ_7745c5c3_Var36))741+ _, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(templ.EscapeString(templ_7745c5c3_Var34))
746 if templ_7745c5c3_Err != nil {742 if templ_7745c5c3_Err != nil {
747 return templ_7745c5c3_Err743 return templ_7745c5c3_Err
748 }744 }
749- templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 55, "</time>")745+ templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 57, "</time>")
750 if templ_7745c5c3_Err != nil {746 if templ_7745c5c3_Err != nil {
751 return templ_7745c5c3_Err747 return templ_7745c5c3_Err
752 }748 }
753 }749 }
754- templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 56, "</td></tr>")750+ templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 58, "</td></tr>")
755 if templ_7745c5c3_Err != nil {751 if templ_7745c5c3_Err != nil {
756 return templ_7745c5c3_Err752 return templ_7745c5c3_Err
757 }753 }
@@ -775,12 +771,12 @@ func refsRail(p RefsPage) templ.Component {
775 }()771 }()
776 }772 }
777 ctx = templ.InitializeContext(ctx)773 ctx = templ.InitializeContext(ctx)
778- templ_7745c5c3_Var37 := templ.GetChildren(ctx)774+ templ_7745c5c3_Var35 := templ.GetChildren(ctx)
779- if templ_7745c5c3_Var37 == nil {775+ if templ_7745c5c3_Var35 == nil {
780- templ_7745c5c3_Var37 = templ.NopComponent776+ templ_7745c5c3_Var35 = templ.NopComponent
781 }777 }
782 ctx = templ.ClearChildren(ctx)778 ctx = templ.ClearChildren(ctx)
783- templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 57, "<section aria-labelledby=\"r-refs\"><h2 id=\"r-refs\">Overview</h2>")779+ templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 59, "<section aria-labelledby=\"r-refs\"><h2 id=\"r-refs\">Overview</h2>")
784 if templ_7745c5c3_Err != nil {780 if templ_7745c5c3_Err != nil {
785 return templ_7745c5c3_Err781 return templ_7745c5c3_Err
786 }782 }
@@ -788,7 +784,7 @@ func refsRail(p RefsPage) templ.Component {
788 if templ_7745c5c3_Err != nil {784 if templ_7745c5c3_Err != nil {
789 return templ_7745c5c3_Err785 return templ_7745c5c3_Err
790 }786 }
791- templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 58, "</section>")787+ templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 60, "</section>")
792 if templ_7745c5c3_Err != nil {788 if templ_7745c5c3_Err != nil {
793 return templ_7745c5c3_Err789 return templ_7745c5c3_Err
794 }790 }
@@ -813,12 +809,12 @@ func State(l Layout, p StatePage) templ.Component {
813 }()809 }()
814 }810 }
815 ctx = templ.InitializeContext(ctx)811 ctx = templ.InitializeContext(ctx)
816- templ_7745c5c3_Var38 := templ.GetChildren(ctx)812+ templ_7745c5c3_Var36 := templ.GetChildren(ctx)
817- if templ_7745c5c3_Var38 == nil {813+ if templ_7745c5c3_Var36 == nil {
818- templ_7745c5c3_Var38 = templ.NopComponent814+ templ_7745c5c3_Var36 = templ.NopComponent
819 }815 }
820 ctx = templ.ClearChildren(ctx)816 ctx = templ.ClearChildren(ctx)
821- templ_7745c5c3_Var39 := templruntime.GeneratedTemplate(func(templ_7745c5c3_Input templruntime.GeneratedComponentInput) (templ_7745c5c3_Err error) {817+ templ_7745c5c3_Var37 := templruntime.GeneratedTemplate(func(templ_7745c5c3_Input templruntime.GeneratedComponentInput) (templ_7745c5c3_Err error) {
822 templ_7745c5c3_W, ctx := templ_7745c5c3_Input.Writer, templ_7745c5c3_Input.Context818 templ_7745c5c3_W, ctx := templ_7745c5c3_Input.Writer, templ_7745c5c3_Input.Context
823 templ_7745c5c3_Buffer, templ_7745c5c3_IsBuffer := templruntime.GetBuffer(templ_7745c5c3_W)819 templ_7745c5c3_Buffer, templ_7745c5c3_IsBuffer := templruntime.GetBuffer(templ_7745c5c3_W)
824 if !templ_7745c5c3_IsBuffer {820 if !templ_7745c5c3_IsBuffer {
@@ -830,51 +826,51 @@ func State(l Layout, p StatePage) templ.Component {
830 }()826 }()
831 }827 }
832 ctx = templ.InitializeContext(ctx)828 ctx = templ.InitializeContext(ctx)
833- templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 59, "<section class=\"state\" aria-labelledby=\"state-title\"><p class=\"eyebrow\">")829+ templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 61, "<section class=\"state\" aria-labelledby=\"state-title\"><p class=\"eyebrow\">")
834 if templ_7745c5c3_Err != nil {830 if templ_7745c5c3_Err != nil {
835 return templ_7745c5c3_Err831 return templ_7745c5c3_Err
836 }832 }
837- var templ_7745c5c3_Var40 string833+ var templ_7745c5c3_Var38 string
838- templ_7745c5c3_Var40, templ_7745c5c3_Err = templ.JoinStringErrs(p.Code)834+ templ_7745c5c3_Var38, templ_7745c5c3_Err = templ.JoinStringErrs(p.Code)
839 if templ_7745c5c3_Err != nil {835 if templ_7745c5c3_Err != nil {
840- return templ.Error{Err: templ_7745c5c3_Err, FileName: `internal/adapters/web/pages.templ`, Line: 165, Col: 30}836+ return templ.Error{Err: templ_7745c5c3_Err, FileName: `internal/adapters/web/pages.templ`, Line: 172, Col: 30}
841 }837 }
842- _, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(templ.EscapeString(templ_7745c5c3_Var40))838+ _, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(templ.EscapeString(templ_7745c5c3_Var38))
843 if templ_7745c5c3_Err != nil {839 if templ_7745c5c3_Err != nil {
844 return templ_7745c5c3_Err840 return templ_7745c5c3_Err
845 }841 }
846- templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 60, "</p><h1 id=\"state-title\">")842+ templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 62, "</p><h1 id=\"state-title\">")
847 if templ_7745c5c3_Err != nil {843 if templ_7745c5c3_Err != nil {
848 return templ_7745c5c3_Err844 return templ_7745c5c3_Err
849 }845 }
850- var templ_7745c5c3_Var41 string846+ var templ_7745c5c3_Var39 string
851- templ_7745c5c3_Var41, templ_7745c5c3_Err = templ.JoinStringErrs(p.Title)847+ templ_7745c5c3_Var39, templ_7745c5c3_Err = templ.JoinStringErrs(p.Title)
852 if templ_7745c5c3_Err != nil {848 if templ_7745c5c3_Err != nil {
853- return templ.Error{Err: templ_7745c5c3_Err, FileName: `internal/adapters/web/pages.templ`, Line: 166, Col: 33}849+ return templ.Error{Err: templ_7745c5c3_Err, FileName: `internal/adapters/web/pages.templ`, Line: 173, Col: 33}
854 }850 }
855- _, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(templ.EscapeString(templ_7745c5c3_Var41))851+ _, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(templ.EscapeString(templ_7745c5c3_Var39))
856 if templ_7745c5c3_Err != nil {852 if templ_7745c5c3_Err != nil {
857 return templ_7745c5c3_Err853 return templ_7745c5c3_Err
858 }854 }
859- templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 61, "</h1>")855+ templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 63, "</h1>")
860 if templ_7745c5c3_Err != nil {856 if templ_7745c5c3_Err != nil {
861 return templ_7745c5c3_Err857 return templ_7745c5c3_Err
862 }858 }
863 for _, line := range p.Lines {859 for _, line := range p.Lines {
864- templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 62, "<p class=\"dim\">")860+ templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 64, "<p class=\"dim\">")
865 if templ_7745c5c3_Err != nil {861 if templ_7745c5c3_Err != nil {
866 return templ_7745c5c3_Err862 return templ_7745c5c3_Err
867 }863 }
868- var templ_7745c5c3_Var42 string864+ var templ_7745c5c3_Var40 string
869- templ_7745c5c3_Var42, templ_7745c5c3_Err = templ.JoinStringErrs(line)865+ templ_7745c5c3_Var40, templ_7745c5c3_Err = templ.JoinStringErrs(line)
870 if templ_7745c5c3_Err != nil {866 if templ_7745c5c3_Err != nil {
871- return templ.Error{Err: templ_7745c5c3_Err, FileName: `internal/adapters/web/pages.templ`, Line: 168, Col: 25}867+ return templ.Error{Err: templ_7745c5c3_Err, FileName: `internal/adapters/web/pages.templ`, Line: 175, Col: 25}
872 }868 }
873- _, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(templ.EscapeString(templ_7745c5c3_Var42))869+ _, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(templ.EscapeString(templ_7745c5c3_Var40))
874 if templ_7745c5c3_Err != nil {870 if templ_7745c5c3_Err != nil {
875 return templ_7745c5c3_Err871 return templ_7745c5c3_Err
876 }872 }
877- templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 63, "</p>")873+ templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 65, "</p>")
878 if templ_7745c5c3_Err != nil {874 if templ_7745c5c3_Err != nil {
879 return templ_7745c5c3_Err875 return templ_7745c5c3_Err
880 }876 }
@@ -885,49 +881,49 @@ func State(l Layout, p StatePage) templ.Component {
885 return templ_7745c5c3_Err881 return templ_7745c5c3_Err
886 }882 }
887 }883 }
888- templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 64, "<p class=\"state-back\">")884+ templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 66, "<p class=\"state-back\">")
889 if templ_7745c5c3_Err != nil {885 if templ_7745c5c3_Err != nil {
890 return templ_7745c5c3_Err886 return templ_7745c5c3_Err
891 }887 }
892 for _, b := range p.Back {888 for _, b := range p.Back {
893- templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 65, "<a href=\"")889+ templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 67, "<a href=\"")
894 if templ_7745c5c3_Err != nil {890 if templ_7745c5c3_Err != nil {
895 return templ_7745c5c3_Err891 return templ_7745c5c3_Err
896 }892 }
897- var templ_7745c5c3_Var43 templ.SafeURL893+ var templ_7745c5c3_Var41 templ.SafeURL
898- templ_7745c5c3_Var43, templ_7745c5c3_Err = templ.JoinURLErrs(templ.SafeURL(b.Href))894+ templ_7745c5c3_Var41, templ_7745c5c3_Err = templ.JoinURLErrs(templ.SafeURL(b.Href))
899 if templ_7745c5c3_Err != nil {895 if templ_7745c5c3_Err != nil {
900- return templ.Error{Err: templ_7745c5c3_Err, FileName: `internal/adapters/web/pages.templ`, Line: 175, Col: 36}896+ return templ.Error{Err: templ_7745c5c3_Err, FileName: `internal/adapters/web/pages.templ`, Line: 182, Col: 36}
901 }897 }
902- _, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(templ.EscapeString(templ_7745c5c3_Var43))898+ _, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(templ.EscapeString(templ_7745c5c3_Var41))
903 if templ_7745c5c3_Err != nil {899 if templ_7745c5c3_Err != nil {
904 return templ_7745c5c3_Err900 return templ_7745c5c3_Err
905 }901 }
906- templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 66, "\">")902+ templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 68, "\">")
907 if templ_7745c5c3_Err != nil {903 if templ_7745c5c3_Err != nil {
908 return templ_7745c5c3_Err904 return templ_7745c5c3_Err
909 }905 }
910- var templ_7745c5c3_Var44 string906+ var templ_7745c5c3_Var42 string
911- templ_7745c5c3_Var44, templ_7745c5c3_Err = templ.JoinStringErrs(b.Label)907+ templ_7745c5c3_Var42, templ_7745c5c3_Err = templ.JoinStringErrs(b.Label)
912 if templ_7745c5c3_Err != nil {908 if templ_7745c5c3_Err != nil {
913- return templ.Error{Err: templ_7745c5c3_Err, FileName: `internal/adapters/web/pages.templ`, Line: 175, Col: 48}909+ return templ.Error{Err: templ_7745c5c3_Err, FileName: `internal/adapters/web/pages.templ`, Line: 182, Col: 48}
914 }910 }
915- _, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(templ.EscapeString(templ_7745c5c3_Var44))911+ _, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(templ.EscapeString(templ_7745c5c3_Var42))
916 if templ_7745c5c3_Err != nil {912 if templ_7745c5c3_Err != nil {
917 return templ_7745c5c3_Err913 return templ_7745c5c3_Err
918 }914 }
919- templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 67, "</a>")915+ templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 69, "</a>")
920 if templ_7745c5c3_Err != nil {916 if templ_7745c5c3_Err != nil {
921 return templ_7745c5c3_Err917 return templ_7745c5c3_Err
922 }918 }
923 }919 }
924- templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 68, "</p></section>")920+ templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 70, "</p></section>")
925 if templ_7745c5c3_Err != nil {921 if templ_7745c5c3_Err != nil {
926 return templ_7745c5c3_Err922 return templ_7745c5c3_Err
927 }923 }
928 return nil924 return nil
929 })925 })
930- templ_7745c5c3_Err = Shell(l, nil).Render(templ.WithChildren(ctx, templ_7745c5c3_Var39), templ_7745c5c3_Buffer)926+ templ_7745c5c3_Err = Shell(l, nil).Render(templ.WithChildren(ctx, templ_7745c5c3_Var37), templ_7745c5c3_Buffer)
931 if templ_7745c5c3_Err != nil {927 if templ_7745c5c3_Err != nil {
932 return templ_7745c5c3_Err928 return templ_7745c5c3_Err
933 }929 }
@@ -956,12 +952,12 @@ func Login(l Layout, p LoginPage) templ.Component {
956 }()952 }()
957 }953 }
958 ctx = templ.InitializeContext(ctx)954 ctx = templ.InitializeContext(ctx)
959- templ_7745c5c3_Var45 := templ.GetChildren(ctx)955+ templ_7745c5c3_Var43 := templ.GetChildren(ctx)
960- if templ_7745c5c3_Var45 == nil {956+ if templ_7745c5c3_Var43 == nil {
961- templ_7745c5c3_Var45 = templ.NopComponent957+ templ_7745c5c3_Var43 = templ.NopComponent
962 }958 }
963 ctx = templ.ClearChildren(ctx)959 ctx = templ.ClearChildren(ctx)
964- templ_7745c5c3_Var46 := templruntime.GeneratedTemplate(func(templ_7745c5c3_Input templruntime.GeneratedComponentInput) (templ_7745c5c3_Err error) {960+ templ_7745c5c3_Var44 := templruntime.GeneratedTemplate(func(templ_7745c5c3_Input templruntime.GeneratedComponentInput) (templ_7745c5c3_Err error) {
965 templ_7745c5c3_W, ctx := templ_7745c5c3_Input.Writer, templ_7745c5c3_Input.Context961 templ_7745c5c3_W, ctx := templ_7745c5c3_Input.Writer, templ_7745c5c3_Input.Context
966 templ_7745c5c3_Buffer, templ_7745c5c3_IsBuffer := templruntime.GetBuffer(templ_7745c5c3_W)962 templ_7745c5c3_Buffer, templ_7745c5c3_IsBuffer := templruntime.GetBuffer(templ_7745c5c3_W)
967 if !templ_7745c5c3_IsBuffer {963 if !templ_7745c5c3_IsBuffer {
@@ -973,75 +969,75 @@ func Login(l Layout, p LoginPage) templ.Component {
973 }()969 }()
974 }970 }
975 ctx = templ.InitializeContext(ctx)971 ctx = templ.InitializeContext(ctx)
976- templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 69, "<section class=\"state\" aria-labelledby=\"state-title\"><h1 id=\"state-title\">")972+ templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 71, "<section class=\"state\" aria-labelledby=\"state-title\"><h1 id=\"state-title\">")
977 if templ_7745c5c3_Err != nil {973 if templ_7745c5c3_Err != nil {
978 return templ_7745c5c3_Err974 return templ_7745c5c3_Err
979 }975 }
980- var templ_7745c5c3_Var47 string976+ var templ_7745c5c3_Var45 string
981- templ_7745c5c3_Var47, templ_7745c5c3_Err = templ.JoinStringErrs(p.Title)977+ templ_7745c5c3_Var45, templ_7745c5c3_Err = templ.JoinStringErrs(p.Title)
982 if templ_7745c5c3_Err != nil {978 if templ_7745c5c3_Err != nil {
983- return templ.Error{Err: templ_7745c5c3_Err, FileName: `internal/adapters/web/pages.templ`, Line: 190, Col: 33}979+ return templ.Error{Err: templ_7745c5c3_Err, FileName: `internal/adapters/web/pages.templ`, Line: 197, Col: 33}
984 }980 }
985- _, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(templ.EscapeString(templ_7745c5c3_Var47))981+ _, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(templ.EscapeString(templ_7745c5c3_Var45))
986 if templ_7745c5c3_Err != nil {982 if templ_7745c5c3_Err != nil {
987 return templ_7745c5c3_Err983 return templ_7745c5c3_Err
988 }984 }
989- templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 70, "</h1>")985+ templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 72, "</h1>")
990 if templ_7745c5c3_Err != nil {986 if templ_7745c5c3_Err != nil {
991 return templ_7745c5c3_Err987 return templ_7745c5c3_Err
992 }988 }
993 for _, line := range p.Lines {989 for _, line := range p.Lines {
994- templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 71, "<p class=\"dim\">")990+ templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 73, "<p class=\"dim\">")
995 if templ_7745c5c3_Err != nil {991 if templ_7745c5c3_Err != nil {
996 return templ_7745c5c3_Err992 return templ_7745c5c3_Err
997 }993 }
998- var templ_7745c5c3_Var48 string994+ var templ_7745c5c3_Var46 string
999- templ_7745c5c3_Var48, templ_7745c5c3_Err = templ.JoinStringErrs(line)995+ templ_7745c5c3_Var46, templ_7745c5c3_Err = templ.JoinStringErrs(line)
1000 if templ_7745c5c3_Err != nil {996 if templ_7745c5c3_Err != nil {
1001- return templ.Error{Err: templ_7745c5c3_Err, FileName: `internal/adapters/web/pages.templ`, Line: 192, Col: 25}997+ return templ.Error{Err: templ_7745c5c3_Err, FileName: `internal/adapters/web/pages.templ`, Line: 199, Col: 25}
1002 }998 }
1003- _, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(templ.EscapeString(templ_7745c5c3_Var48))999+ _, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(templ.EscapeString(templ_7745c5c3_Var46))
1004 if templ_7745c5c3_Err != nil {1000 if templ_7745c5c3_Err != nil {
1005 return templ_7745c5c3_Err1001 return templ_7745c5c3_Err
1006 }1002 }
1007- templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 72, "</p>")1003+ templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 74, "</p>")
1008 if templ_7745c5c3_Err != nil {1004 if templ_7745c5c3_Err != nil {
1009 return templ_7745c5c3_Err1005 return templ_7745c5c3_Err
1010 }1006 }
1011 }1007 }
1012- templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 73, "<form class=\"state-act\" method=\"post\" action=\"")1008+ templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 75, "<form class=\"state-act\" method=\"post\" action=\"")
1013 if templ_7745c5c3_Err != nil {1009 if templ_7745c5c3_Err != nil {
1014 return templ_7745c5c3_Err1010 return templ_7745c5c3_Err
1015 }1011 }
1016- var templ_7745c5c3_Var49 templ.SafeURL1012+ var templ_7745c5c3_Var47 templ.SafeURL
1017- templ_7745c5c3_Var49, templ_7745c5c3_Err = templ.JoinURLErrs(templ.SafeURL(p.Action))1013+ templ_7745c5c3_Var47, templ_7745c5c3_Err = templ.JoinURLErrs(templ.SafeURL(p.Action))
1018 if templ_7745c5c3_Err != nil {1014 if templ_7745c5c3_Err != nil {
1019- return templ.Error{Err: templ_7745c5c3_Err, FileName: `internal/adapters/web/pages.templ`, Line: 194, Col: 73}1015+ return templ.Error{Err: templ_7745c5c3_Err, FileName: `internal/adapters/web/pages.templ`, Line: 201, Col: 73}
1020 }1016 }
1021- _, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(templ.EscapeString(templ_7745c5c3_Var49))1017+ _, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(templ.EscapeString(templ_7745c5c3_Var47))
1022 if templ_7745c5c3_Err != nil {1018 if templ_7745c5c3_Err != nil {
1023 return templ_7745c5c3_Err1019 return templ_7745c5c3_Err
1024 }1020 }
1025- templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 74, "\" data-autosubmit><button type=\"submit\" class=\"btn primary\">")1021+ templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 76, "\" data-autosubmit><button type=\"submit\" class=\"btn primary\">")
1026 if templ_7745c5c3_Err != nil {1022 if templ_7745c5c3_Err != nil {
1027 return templ_7745c5c3_Err1023 return templ_7745c5c3_Err
1028 }1024 }
1029- var templ_7745c5c3_Var50 string1025+ var templ_7745c5c3_Var48 string
1030- templ_7745c5c3_Var50, templ_7745c5c3_Err = templ.JoinStringErrs(p.Button)1026+ templ_7745c5c3_Var48, templ_7745c5c3_Err = templ.JoinStringErrs(p.Button)
1031 if templ_7745c5c3_Err != nil {1027 if templ_7745c5c3_Err != nil {
1032- return templ.Error{Err: templ_7745c5c3_Err, FileName: `internal/adapters/web/pages.templ`, Line: 195, Col: 56}1028+ return templ.Error{Err: templ_7745c5c3_Err, FileName: `internal/adapters/web/pages.templ`, Line: 202, Col: 56}
1033 }1029 }
1034- _, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(templ.EscapeString(templ_7745c5c3_Var50))1030+ _, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(templ.EscapeString(templ_7745c5c3_Var48))
1035 if templ_7745c5c3_Err != nil {1031 if templ_7745c5c3_Err != nil {
1036 return templ_7745c5c3_Err1032 return templ_7745c5c3_Err
1037 }1033 }
1038- templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 75, "</button></form><p class=\"state-back\"><a href=\"/\">Back to home</a></p></section>")1034+ templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 77, "</button></form><p class=\"state-back\"><a href=\"/\">Back to home</a></p></section>")
1039 if templ_7745c5c3_Err != nil {1035 if templ_7745c5c3_Err != nil {
1040 return templ_7745c5c3_Err1036 return templ_7745c5c3_Err
1041 }1037 }
1042 return nil1038 return nil
1043 })1039 })
1044- templ_7745c5c3_Err = Shell(l, nil).Render(templ.WithChildren(ctx, templ_7745c5c3_Var46), templ_7745c5c3_Buffer)1040+ templ_7745c5c3_Err = Shell(l, nil).Render(templ.WithChildren(ctx, templ_7745c5c3_Var44), templ_7745c5c3_Buffer)
1045 if templ_7745c5c3_Err != nil {1041 if templ_7745c5c3_Err != nil {
1046 return templ_7745c5c3_Err1042 return templ_7745c5c3_Err
1047 }1043 }
@@ -1067,12 +1063,12 @@ func PasskeyLogin(l Layout, p PasskeyLoginPage) templ.Component {
1067 }()1063 }()
1068 }1064 }
1069 ctx = templ.InitializeContext(ctx)1065 ctx = templ.InitializeContext(ctx)
1070- templ_7745c5c3_Var51 := templ.GetChildren(ctx)1066+ templ_7745c5c3_Var49 := templ.GetChildren(ctx)
1071- if templ_7745c5c3_Var51 == nil {1067+ if templ_7745c5c3_Var49 == nil {
1072- templ_7745c5c3_Var51 = templ.NopComponent1068+ templ_7745c5c3_Var49 = templ.NopComponent
1073 }1069 }
1074 ctx = templ.ClearChildren(ctx)1070 ctx = templ.ClearChildren(ctx)
1075- templ_7745c5c3_Var52 := templruntime.GeneratedTemplate(func(templ_7745c5c3_Input templruntime.GeneratedComponentInput) (templ_7745c5c3_Err error) {1071+ templ_7745c5c3_Var50 := templruntime.GeneratedTemplate(func(templ_7745c5c3_Input templruntime.GeneratedComponentInput) (templ_7745c5c3_Err error) {
1076 templ_7745c5c3_W, ctx := templ_7745c5c3_Input.Writer, templ_7745c5c3_Input.Context1072 templ_7745c5c3_W, ctx := templ_7745c5c3_Input.Writer, templ_7745c5c3_Input.Context
1077 templ_7745c5c3_Buffer, templ_7745c5c3_IsBuffer := templruntime.GetBuffer(templ_7745c5c3_W)1073 templ_7745c5c3_Buffer, templ_7745c5c3_IsBuffer := templruntime.GetBuffer(templ_7745c5c3_W)
1078 if !templ_7745c5c3_IsBuffer {1074 if !templ_7745c5c3_IsBuffer {
@@ -1084,88 +1080,88 @@ func PasskeyLogin(l Layout, p PasskeyLoginPage) templ.Component {
1084 }()1080 }()
1085 }1081 }
1086 ctx = templ.InitializeContext(ctx)1082 ctx = templ.InitializeContext(ctx)
1087- templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 76, "<section class=\"state\" aria-labelledby=\"state-title\"><h1 id=\"state-title\">")1083+ templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 78, "<section class=\"state\" aria-labelledby=\"state-title\"><h1 id=\"state-title\">")
1088 if templ_7745c5c3_Err != nil {1084 if templ_7745c5c3_Err != nil {
1089 return templ_7745c5c3_Err1085 return templ_7745c5c3_Err
1090 }1086 }
1091- var templ_7745c5c3_Var53 string1087+ var templ_7745c5c3_Var51 string
1092- templ_7745c5c3_Var53, templ_7745c5c3_Err = templ.JoinStringErrs(p.Title)1088+ templ_7745c5c3_Var51, templ_7745c5c3_Err = templ.JoinStringErrs(p.Title)
1093 if templ_7745c5c3_Err != nil {1089 if templ_7745c5c3_Err != nil {
1094- return templ.Error{Err: templ_7745c5c3_Err, FileName: `internal/adapters/web/pages.templ`, Line: 207, Col: 33}1090+ return templ.Error{Err: templ_7745c5c3_Err, FileName: `internal/adapters/web/pages.templ`, Line: 214, Col: 33}
1095 }1091 }
1096- _, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(templ.EscapeString(templ_7745c5c3_Var53))1092+ _, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(templ.EscapeString(templ_7745c5c3_Var51))
1097 if templ_7745c5c3_Err != nil {1093 if templ_7745c5c3_Err != nil {
1098 return templ_7745c5c3_Err1094 return templ_7745c5c3_Err
1099 }1095 }
1100- templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 77, "</h1><form class=\"state-act\" data-js data-passkey-form><button type=\"submit\" class=\"btn primary\" data-passkey=\"login\" data-begin=\"")1096+ templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 79, "</h1><form class=\"state-act\" data-js data-passkey-form><button type=\"submit\" class=\"btn primary\" data-passkey=\"login\" data-begin=\"")
1101 if templ_7745c5c3_Err != nil {1097 if templ_7745c5c3_Err != nil {
1102 return templ_7745c5c3_Err1098 return templ_7745c5c3_Err
1103 }1099 }
1104- var templ_7745c5c3_Var54 string1100+ var templ_7745c5c3_Var52 string
1105- templ_7745c5c3_Var54, templ_7745c5c3_Err = templ.ResolveAttributeValue(p.Begin)1101+ templ_7745c5c3_Var52, templ_7745c5c3_Err = templ.ResolveAttributeValue(p.Begin)
1106 if templ_7745c5c3_Err != nil {1102 if templ_7745c5c3_Err != nil {
1107- return templ.Error{Err: templ_7745c5c3_Err, FileName: `internal/adapters/web/pages.templ`, Line: 209, Col: 87}1103+ return templ.Error{Err: templ_7745c5c3_Err, FileName: `internal/adapters/web/pages.templ`, Line: 216, Col: 87}
1108 }1104 }
1109- _, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(templ_7745c5c3_Var54)1105+ _, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(templ_7745c5c3_Var52)
1110 if templ_7745c5c3_Err != nil {1106 if templ_7745c5c3_Err != nil {
1111 return templ_7745c5c3_Err1107 return templ_7745c5c3_Err
1112 }1108 }
1113- templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 78, "\" data-finish=\"")1109+ templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 80, "\" data-finish=\"")
1114 if templ_7745c5c3_Err != nil {1110 if templ_7745c5c3_Err != nil {
1115 return templ_7745c5c3_Err1111 return templ_7745c5c3_Err
1116 }1112 }
1117- var templ_7745c5c3_Var55 string1113+ var templ_7745c5c3_Var53 string
1118- templ_7745c5c3_Var55, templ_7745c5c3_Err = templ.ResolveAttributeValue(p.Finish)1114+ templ_7745c5c3_Var53, templ_7745c5c3_Err = templ.ResolveAttributeValue(p.Finish)
1119 if templ_7745c5c3_Err != nil {1115 if templ_7745c5c3_Err != nil {
1120- return templ.Error{Err: templ_7745c5c3_Err, FileName: `internal/adapters/web/pages.templ`, Line: 209, Col: 112}1116+ return templ.Error{Err: templ_7745c5c3_Err, FileName: `internal/adapters/web/pages.templ`, Line: 216, Col: 112}
1121 }1117 }
1122- _, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(templ_7745c5c3_Var55)1118+ _, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(templ_7745c5c3_Var53)
1123 if templ_7745c5c3_Err != nil {1119 if templ_7745c5c3_Err != nil {
1124 return templ_7745c5c3_Err1120 return templ_7745c5c3_Err
1125 }1121 }
1126- templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 79, "\">")1122+ templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 81, "\">")
1127 if templ_7745c5c3_Err != nil {1123 if templ_7745c5c3_Err != nil {
1128 return templ_7745c5c3_Err1124 return templ_7745c5c3_Err
1129 }1125 }
1130- var templ_7745c5c3_Var56 string1126+ var templ_7745c5c3_Var54 string
1131- templ_7745c5c3_Var56, templ_7745c5c3_Err = templ.JoinStringErrs(p.Button)1127+ templ_7745c5c3_Var54, templ_7745c5c3_Err = templ.JoinStringErrs(p.Button)
1132 if templ_7745c5c3_Err != nil {1128 if templ_7745c5c3_Err != nil {
1133- return templ.Error{Err: templ_7745c5c3_Err, FileName: `internal/adapters/web/pages.templ`, Line: 209, Col: 125}1129+ return templ.Error{Err: templ_7745c5c3_Err, FileName: `internal/adapters/web/pages.templ`, Line: 216, Col: 125}
1134 }1130 }
1135- _, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(templ.EscapeString(templ_7745c5c3_Var56))1131+ _, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(templ.EscapeString(templ_7745c5c3_Var54))
1136 if templ_7745c5c3_Err != nil {1132 if templ_7745c5c3_Err != nil {
1137 return templ_7745c5c3_Err1133 return templ_7745c5c3_Err
1138 }1134 }
1139- templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 80, "</button></form><p class=\"dim\" role=\"status\" aria-live=\"polite\" data-passkey-status></p>")1135+ templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 82, "</button></form><p class=\"dim\" role=\"status\" aria-live=\"polite\" data-passkey-status></p>")
1140 if templ_7745c5c3_Err != nil {1136 if templ_7745c5c3_Err != nil {
1141 return templ_7745c5c3_Err1137 return templ_7745c5c3_Err
1142 }1138 }
1143 for _, line := range p.Lines {1139 for _, line := range p.Lines {
1144- templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 81, "<p class=\"dim\">")1140+ templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 83, "<p class=\"dim\">")
1145 if templ_7745c5c3_Err != nil {1141 if templ_7745c5c3_Err != nil {
1146 return templ_7745c5c3_Err1142 return templ_7745c5c3_Err
1147 }1143 }
1148- var templ_7745c5c3_Var57 string1144+ var templ_7745c5c3_Var55 string
1149- templ_7745c5c3_Var57, templ_7745c5c3_Err = templ.JoinStringErrs(line)1145+ templ_7745c5c3_Var55, templ_7745c5c3_Err = templ.JoinStringErrs(line)
1150 if templ_7745c5c3_Err != nil {1146 if templ_7745c5c3_Err != nil {
1151- return templ.Error{Err: templ_7745c5c3_Err, FileName: `internal/adapters/web/pages.templ`, Line: 213, Col: 25}1147+ return templ.Error{Err: templ_7745c5c3_Err, FileName: `internal/adapters/web/pages.templ`, Line: 220, Col: 25}
1152 }1148 }
1153- _, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(templ.EscapeString(templ_7745c5c3_Var57))1149+ _, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(templ.EscapeString(templ_7745c5c3_Var55))
1154 if templ_7745c5c3_Err != nil {1150 if templ_7745c5c3_Err != nil {
1155 return templ_7745c5c3_Err1151 return templ_7745c5c3_Err
1156 }1152 }
1157- templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 82, "</p>")1153+ templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 84, "</p>")
1158 if templ_7745c5c3_Err != nil {1154 if templ_7745c5c3_Err != nil {
1159 return templ_7745c5c3_Err1155 return templ_7745c5c3_Err
1160 }1156 }
1161 }1157 }
1162- templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 83, "<p class=\"state-back\"><a href=\"/\">Back to home</a></p></section>")1158+ templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 85, "<p class=\"state-back\"><a href=\"/\">Back to home</a></p></section>")
1163 if templ_7745c5c3_Err != nil {1159 if templ_7745c5c3_Err != nil {
1164 return templ_7745c5c3_Err1160 return templ_7745c5c3_Err
1165 }1161 }
1166 return nil1162 return nil
1167 })1163 })
1168- templ_7745c5c3_Err = Shell(l, nil).Render(templ.WithChildren(ctx, templ_7745c5c3_Var52), templ_7745c5c3_Buffer)1164+ templ_7745c5c3_Err = Shell(l, nil).Render(templ.WithChildren(ctx, templ_7745c5c3_Var50), templ_7745c5c3_Buffer)
1169 if templ_7745c5c3_Err != nil {1165 if templ_7745c5c3_Err != nil {
1170 return templ_7745c5c3_Err1166 return templ_7745c5c3_Err
1171 }1167 }
@@ -1190,12 +1186,12 @@ func Passkeys(l Layout, p PasskeysPage) templ.Component {
1190 }()1186 }()
1191 }1187 }
1192 ctx = templ.InitializeContext(ctx)1188 ctx = templ.InitializeContext(ctx)
1193- templ_7745c5c3_Var58 := templ.GetChildren(ctx)1189+ templ_7745c5c3_Var56 := templ.GetChildren(ctx)
1194- if templ_7745c5c3_Var58 == nil {1190+ if templ_7745c5c3_Var56 == nil {
1195- templ_7745c5c3_Var58 = templ.NopComponent1191+ templ_7745c5c3_Var56 = templ.NopComponent
1196 }1192 }
1197 ctx = templ.ClearChildren(ctx)1193 ctx = templ.ClearChildren(ctx)
1198- templ_7745c5c3_Var59 := templruntime.GeneratedTemplate(func(templ_7745c5c3_Input templruntime.GeneratedComponentInput) (templ_7745c5c3_Err error) {1194+ templ_7745c5c3_Var57 := templruntime.GeneratedTemplate(func(templ_7745c5c3_Input templruntime.GeneratedComponentInput) (templ_7745c5c3_Err error) {
1199 templ_7745c5c3_W, ctx := templ_7745c5c3_Input.Writer, templ_7745c5c3_Input.Context1195 templ_7745c5c3_W, ctx := templ_7745c5c3_Input.Writer, templ_7745c5c3_Input.Context
1200 templ_7745c5c3_Buffer, templ_7745c5c3_IsBuffer := templruntime.GetBuffer(templ_7745c5c3_W)1196 templ_7745c5c3_Buffer, templ_7745c5c3_IsBuffer := templruntime.GetBuffer(templ_7745c5c3_W)
1201 if !templ_7745c5c3_IsBuffer {1197 if !templ_7745c5c3_IsBuffer {
@@ -1207,231 +1203,231 @@ func Passkeys(l Layout, p PasskeysPage) templ.Component {
1207 }()1203 }()
1208 }1204 }
1209 ctx = templ.InitializeContext(ctx)1205 ctx = templ.InitializeContext(ctx)
1210- templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 84, "<h2 class=\"rule-h\"><span>Passkeys</span><span class=\"count\">")1206+ templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 86, "<h2 class=\"rule-h\"><span>Passkeys</span><span class=\"count\">")
1211 if templ_7745c5c3_Err != nil {1207 if templ_7745c5c3_Err != nil {
1212 return templ_7745c5c3_Err1208 return templ_7745c5c3_Err
1213 }1209 }
1214- var templ_7745c5c3_Var60 string1210+ var templ_7745c5c3_Var58 string
1215- templ_7745c5c3_Var60, templ_7745c5c3_Err = templ.JoinStringErrs(itoa(len(p.Rows)))1211+ templ_7745c5c3_Var58, templ_7745c5c3_Err = templ.JoinStringErrs(itoa(len(p.Rows)))
1216 if templ_7745c5c3_Err != nil {1212 if templ_7745c5c3_Err != nil {
1217- return templ.Error{Err: templ_7745c5c3_Err, FileName: `internal/adapters/web/pages.templ`, Line: 223, Col: 81}1213+ return templ.Error{Err: templ_7745c5c3_Err, FileName: `internal/adapters/web/pages.templ`, Line: 230, Col: 81}
1218 }1214 }
1219- _, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(templ.EscapeString(templ_7745c5c3_Var60))1215+ _, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(templ.EscapeString(templ_7745c5c3_Var58))
1220 if templ_7745c5c3_Err != nil {1216 if templ_7745c5c3_Err != nil {
1221 return templ_7745c5c3_Err1217 return templ_7745c5c3_Err
1222 }1218 }
1223- templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 85, "</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>")1219+ templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 87, "</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>")
1224 if templ_7745c5c3_Err != nil {1220 if templ_7745c5c3_Err != nil {
1225 return templ_7745c5c3_Err1221 return templ_7745c5c3_Err
1226 }1222 }
1227 if len(p.Rows) > 0 {1223 if len(p.Rows) > 0 {
1228- templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 86, "<table class=\"list passkeys\" aria-label=\"Passkeys\"><thead><tr><th class=\"cur\"></th><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>")1224+ templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 88, "<table class=\"list passkeys\" aria-label=\"Passkeys\"><thead><tr><th class=\"cur\"></th><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>")
1229 if templ_7745c5c3_Err != nil {1225 if templ_7745c5c3_Err != nil {
1230 return templ_7745c5c3_Err1226 return templ_7745c5c3_Err
1231 }1227 }
1232 for _, r := range p.Rows {1228 for _, r := range p.Rows {
1233- templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 87, "<tr><td class=\"cur\" aria-hidden=\"true\"></td><td class=\"c-name\">")1229+ templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 89, "<tr><td class=\"cur\" aria-hidden=\"true\"></td><td class=\"c-name\">")
1234 if templ_7745c5c3_Err != nil {1230 if templ_7745c5c3_Err != nil {
1235 return templ_7745c5c3_Err1231 return templ_7745c5c3_Err
1236 }1232 }
1237- var templ_7745c5c3_Var61 string1233+ var templ_7745c5c3_Var59 string
1238- templ_7745c5c3_Var61, templ_7745c5c3_Err = templ.JoinStringErrs(r.Name)1234+ templ_7745c5c3_Var59, templ_7745c5c3_Err = templ.JoinStringErrs(r.Name)
1239 if templ_7745c5c3_Err != nil {1235 if templ_7745c5c3_Err != nil {
1240- return templ.Error{Err: templ_7745c5c3_Err, FileName: `internal/adapters/web/pages.templ`, Line: 241, Col: 34}1236+ return templ.Error{Err: templ_7745c5c3_Err, FileName: `internal/adapters/web/pages.templ`, Line: 248, Col: 34}
1241 }1237 }
1242- _, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(templ.EscapeString(templ_7745c5c3_Var61))1238+ _, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(templ.EscapeString(templ_7745c5c3_Var59))
1243 if templ_7745c5c3_Err != nil {1239 if templ_7745c5c3_Err != nil {
1244 return templ_7745c5c3_Err1240 return templ_7745c5c3_Err
1245 }1241 }
1246- templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 88, "</td><td class=\"c-when nowrap\"><time")1242+ templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 90, "</td><td class=\"c-when nowrap\"><time")
1247 if templ_7745c5c3_Err != nil {1243 if templ_7745c5c3_Err != nil {
1248 return templ_7745c5c3_Err1244 return templ_7745c5c3_Err
1249 }1245 }
1250 if r.CreatedAt != "" {1246 if r.CreatedAt != "" {
1251- templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 89, " datetime=\"")1247+ templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 91, " datetime=\"")
1252 if templ_7745c5c3_Err != nil {1248 if templ_7745c5c3_Err != nil {
1253 return templ_7745c5c3_Err1249 return templ_7745c5c3_Err
1254 }1250 }
1255- var templ_7745c5c3_Var62 string1251+ var templ_7745c5c3_Var60 string
1256- templ_7745c5c3_Var62, templ_7745c5c3_Err = templ.ResolveAttributeValue(r.CreatedAt)1252+ templ_7745c5c3_Var60, templ_7745c5c3_Err = templ.ResolveAttributeValue(r.CreatedAt)
1257 if templ_7745c5c3_Err != nil {1253 if templ_7745c5c3_Err != nil {
1258- return templ.Error{Err: templ_7745c5c3_Err, FileName: `internal/adapters/web/pages.templ`, Line: 245, Col: 32}1254+ return templ.Error{Err: templ_7745c5c3_Err, FileName: `internal/adapters/web/pages.templ`, Line: 252, Col: 32}
1259 }1255 }
1260- _, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(templ_7745c5c3_Var62)1256+ _, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(templ_7745c5c3_Var60)
1261 if templ_7745c5c3_Err != nil {1257 if templ_7745c5c3_Err != nil {
1262 return templ_7745c5c3_Err1258 return templ_7745c5c3_Err
1263 }1259 }
1264- templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 90, "\"")1260+ templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 92, "\"")
1265 if templ_7745c5c3_Err != nil {1261 if templ_7745c5c3_Err != nil {
1266 return templ_7745c5c3_Err1262 return templ_7745c5c3_Err
1267 }1263 }
1268 }1264 }
1269- templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 91, ">")1265+ templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 93, ">")
1270 if templ_7745c5c3_Err != nil {1266 if templ_7745c5c3_Err != nil {
1271 return templ_7745c5c3_Err1267 return templ_7745c5c3_Err
1272 }1268 }
1273- var templ_7745c5c3_Var63 string1269+ var templ_7745c5c3_Var61 string
1274- templ_7745c5c3_Var63, templ_7745c5c3_Err = templ.JoinStringErrs(r.Created)1270+ templ_7745c5c3_Var61, templ_7745c5c3_Err = templ.JoinStringErrs(r.Created)
1275 if templ_7745c5c3_Err != nil {1271 if templ_7745c5c3_Err != nil {
1276- return templ.Error{Err: templ_7745c5c3_Err, FileName: `internal/adapters/web/pages.templ`, Line: 247, Col: 20}1272+ return templ.Error{Err: templ_7745c5c3_Err, FileName: `internal/adapters/web/pages.templ`, Line: 254, Col: 20}
1277 }1273 }
1278- _, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(templ.EscapeString(templ_7745c5c3_Var63))1274+ _, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(templ.EscapeString(templ_7745c5c3_Var61))
1279 if templ_7745c5c3_Err != nil {1275 if templ_7745c5c3_Err != nil {
1280 return templ_7745c5c3_Err1276 return templ_7745c5c3_Err
1281 }1277 }
1282- templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 92, "</time></td><td class=\"c-when nowrap\"><time")1278+ templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 94, "</time></td><td class=\"c-when nowrap\"><time")
1283 if templ_7745c5c3_Err != nil {1279 if templ_7745c5c3_Err != nil {
1284 return templ_7745c5c3_Err1280 return templ_7745c5c3_Err
1285 }1281 }
1286 if r.LastUsedAt != "" {1282 if r.LastUsedAt != "" {
1287- templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 93, " datetime=\"")1283+ templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 95, " datetime=\"")
1288 if templ_7745c5c3_Err != nil {1284 if templ_7745c5c3_Err != nil {
1289 return templ_7745c5c3_Err1285 return templ_7745c5c3_Err
1290 }1286 }
1291- var templ_7745c5c3_Var64 string1287+ var templ_7745c5c3_Var62 string
1292- templ_7745c5c3_Var64, templ_7745c5c3_Err = templ.ResolveAttributeValue(r.LastUsedAt)1288+ templ_7745c5c3_Var62, templ_7745c5c3_Err = templ.ResolveAttributeValue(r.LastUsedAt)
1293 if templ_7745c5c3_Err != nil {1289 if templ_7745c5c3_Err != nil {
1294- return templ.Error{Err: templ_7745c5c3_Err, FileName: `internal/adapters/web/pages.templ`, Line: 252, Col: 33}1290+ return templ.Error{Err: templ_7745c5c3_Err, FileName: `internal/adapters/web/pages.templ`, Line: 259, Col: 33}
1295 }1291 }
1296- _, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(templ_7745c5c3_Var64)1292+ _, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(templ_7745c5c3_Var62)
1297 if templ_7745c5c3_Err != nil {1293 if templ_7745c5c3_Err != nil {
1298 return templ_7745c5c3_Err1294 return templ_7745c5c3_Err
1299 }1295 }
1300- templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 94, "\"")1296+ templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 96, "\"")
1301 if templ_7745c5c3_Err != nil {1297 if templ_7745c5c3_Err != nil {
1302 return templ_7745c5c3_Err1298 return templ_7745c5c3_Err
1303 }1299 }
1304 }1300 }
1305- templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 95, ">")1301+ templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 97, ">")
1306 if templ_7745c5c3_Err != nil {1302 if templ_7745c5c3_Err != nil {
1307 return templ_7745c5c3_Err1303 return templ_7745c5c3_Err
1308 }1304 }
1309- var templ_7745c5c3_Var65 string1305+ var templ_7745c5c3_Var63 string
1310- templ_7745c5c3_Var65, templ_7745c5c3_Err = templ.JoinStringErrs(r.LastUsed)1306+ templ_7745c5c3_Var63, templ_7745c5c3_Err = templ.JoinStringErrs(r.LastUsed)
1311 if templ_7745c5c3_Err != nil {1307 if templ_7745c5c3_Err != nil {
1312- return templ.Error{Err: templ_7745c5c3_Err, FileName: `internal/adapters/web/pages.templ`, Line: 254, Col: 21}1308+ return templ.Error{Err: templ_7745c5c3_Err, FileName: `internal/adapters/web/pages.templ`, Line: 261, Col: 21}
1313 }1309 }
1314- _, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(templ.EscapeString(templ_7745c5c3_Var65))1310+ _, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(templ.EscapeString(templ_7745c5c3_Var63))
1315 if templ_7745c5c3_Err != nil {1311 if templ_7745c5c3_Err != nil {
1316 return templ_7745c5c3_Err1312 return templ_7745c5c3_Err
1317 }1313 }
1318- templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 96, "</time></td><td class=\"c-sync\">")1314+ templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 98, "</time></td><td class=\"c-sync\">")
1319 if templ_7745c5c3_Err != nil {1315 if templ_7745c5c3_Err != nil {
1320 return templ_7745c5c3_Err1316 return templ_7745c5c3_Err
1321 }1317 }
1322 if r.Synced {1318 if r.Synced {
1323- templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 97, "yes")1319+ templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 99, "yes")
1324 if templ_7745c5c3_Err != nil {1320 if templ_7745c5c3_Err != nil {
1325 return templ_7745c5c3_Err1321 return templ_7745c5c3_Err
1326 }1322 }
1327 } else {1323 } else {
1328- templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 98, "no")1324+ templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 100, "no")
1329 if templ_7745c5c3_Err != nil {1325 if templ_7745c5c3_Err != nil {
1330 return templ_7745c5c3_Err1326 return templ_7745c5c3_Err
1331 }1327 }
1332 }1328 }
1333- templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 99, "</td><td class=\"c-act\"><form method=\"post\" action=\"")1329+ templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 101, "</td><td class=\"c-act\"><form method=\"post\" action=\"")
1334 if templ_7745c5c3_Err != nil {1330 if templ_7745c5c3_Err != nil {
1335 return templ_7745c5c3_Err1331 return templ_7745c5c3_Err
1336 }1332 }
1337- var templ_7745c5c3_Var66 templ.SafeURL1333+ var templ_7745c5c3_Var64 templ.SafeURL
1338- templ_7745c5c3_Var66, templ_7745c5c3_Err = templ.JoinURLErrs(templ.SafeURL(r.Remove))1334+ templ_7745c5c3_Var64, templ_7745c5c3_Err = templ.JoinURLErrs(templ.SafeURL(r.Remove))
1339 if templ_7745c5c3_Err != nil {1335 if templ_7745c5c3_Err != nil {
1340- return templ.Error{Err: templ_7745c5c3_Err, FileName: `internal/adapters/web/pages.templ`, Line: 264, Col: 60}1336+ return templ.Error{Err: templ_7745c5c3_Err, FileName: `internal/adapters/web/pages.templ`, Line: 271, Col: 60}
1341 }1337 }
1342- _, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(templ.EscapeString(templ_7745c5c3_Var66))1338+ _, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(templ.EscapeString(templ_7745c5c3_Var64))
1343 if templ_7745c5c3_Err != nil {1339 if templ_7745c5c3_Err != nil {
1344 return templ_7745c5c3_Err1340 return templ_7745c5c3_Err
1345 }1341 }
1346- templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 100, "\"><button type=\"submit\" class=\"btn danger\" aria-label=\"")1342+ templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 102, "\"><button type=\"submit\" class=\"btn danger\" aria-label=\"")
1347 if templ_7745c5c3_Err != nil {1343 if templ_7745c5c3_Err != nil {
1348 return templ_7745c5c3_Err1344 return templ_7745c5c3_Err
1349 }1345 }
1350- var templ_7745c5c3_Var67 string1346+ var templ_7745c5c3_Var65 string
1351- templ_7745c5c3_Var67, templ_7745c5c3_Err = templ.ResolveAttributeValue("Remove passkey " + r.Name)1347+ templ_7745c5c3_Var65, templ_7745c5c3_Err = templ.ResolveAttributeValue("Remove passkey " + r.Name)
1352 if templ_7745c5c3_Err != nil {1348 if templ_7745c5c3_Err != nil {
1353- return templ.Error{Err: templ_7745c5c3_Err, FileName: `internal/adapters/web/pages.templ`, Line: 265, Col: 89}1349+ return templ.Error{Err: templ_7745c5c3_Err, FileName: `internal/adapters/web/pages.templ`, Line: 272, Col: 89}
1354 }1350 }
1355- _, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(templ_7745c5c3_Var67)1351+ _, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(templ_7745c5c3_Var65)
1356 if templ_7745c5c3_Err != nil {1352 if templ_7745c5c3_Err != nil {
1357 return templ_7745c5c3_Err1353 return templ_7745c5c3_Err
1358 }1354 }
1359- templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 101, "\">Remove</button></form></td></tr>")1355+ templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 103, "\">Remove</button></form></td></tr>")
1360 if templ_7745c5c3_Err != nil {1356 if templ_7745c5c3_Err != nil {
1361 return templ_7745c5c3_Err1357 return templ_7745c5c3_Err
1362 }1358 }
1363 }1359 }
1364- templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 102, "</tbody></table>")1360+ templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 104, "</tbody></table>")
1365 if templ_7745c5c3_Err != nil {1361 if templ_7745c5c3_Err != nil {
1366 return templ_7745c5c3_Err1362 return templ_7745c5c3_Err
1367 }1363 }
1368 } else {1364 } else {
1369- templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 103, "<p class=\"lede dim\">no passkeys yet.</p>")1365+ templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 105, "<p class=\"lede dim\">no passkeys yet.</p>")
1370 if templ_7745c5c3_Err != nil {1366 if templ_7745c5c3_Err != nil {
1371 return templ_7745c5c3_Err1367 return templ_7745c5c3_Err
1372 }1368 }
1373 }1369 }
1374- templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 104, " ")1370+ templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 106, " ")
1375 if templ_7745c5c3_Err != nil {1371 if templ_7745c5c3_Err != nil {
1376 return templ_7745c5c3_Err1372 return templ_7745c5c3_Err
1377 }1373 }
1378 if p.Full {1374 if p.Full {
1379- templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 105, "<p class=\"dim\">")1375+ templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 107, "<p class=\"dim\">")
1380 if templ_7745c5c3_Err != nil {1376 if templ_7745c5c3_Err != nil {
1381 return templ_7745c5c3_Err1377 return templ_7745c5c3_Err
1382 }1378 }
1383- var templ_7745c5c3_Var68 string1379+ var templ_7745c5c3_Var66 string
1384- templ_7745c5c3_Var68, templ_7745c5c3_Err = templ.JoinStringErrs(itoa(p.Max))1380+ templ_7745c5c3_Var66, templ_7745c5c3_Err = templ.JoinStringErrs(itoa(p.Max))
1385 if templ_7745c5c3_Err != nil {1381 if templ_7745c5c3_Err != nil {
1386- return templ.Error{Err: templ_7745c5c3_Err, FileName: `internal/adapters/web/pages.templ`, Line: 276, Col: 31}1382+ return templ.Error{Err: templ_7745c5c3_Err, FileName: `internal/adapters/web/pages.templ`, Line: 283, Col: 31}
1387 }1383 }
1388- _, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(templ.EscapeString(templ_7745c5c3_Var68))1384+ _, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(templ.EscapeString(templ_7745c5c3_Var66))
1389 if templ_7745c5c3_Err != nil {1385 if templ_7745c5c3_Err != nil {
1390 return templ_7745c5c3_Err1386 return templ_7745c5c3_Err
1391 }1387 }
1392- templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 106, " passkeys are registered, the most there can be. Remove one to add another.</p>")1388+ templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 108, " passkeys are registered, the most there can be. Remove one to add another.</p>")
1393 if templ_7745c5c3_Err != nil {1389 if templ_7745c5c3_Err != nil {
1394 return templ_7745c5c3_Err1390 return templ_7745c5c3_Err
1395 }1391 }
1396 } else {1392 } else {
1397- templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 107, "<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=\"")1393+ templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 109, "<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=\"")
1398 if templ_7745c5c3_Err != nil {1394 if templ_7745c5c3_Err != nil {
1399 return templ_7745c5c3_Err1395 return templ_7745c5c3_Err
1400 }1396 }
1401- var templ_7745c5c3_Var69 string1397+ var templ_7745c5c3_Var67 string
1402- templ_7745c5c3_Var69, templ_7745c5c3_Err = templ.ResolveAttributeValue(p.Begin)1398+ templ_7745c5c3_Var67, templ_7745c5c3_Err = templ.ResolveAttributeValue(p.Begin)
1403 if templ_7745c5c3_Err != nil {1399 if templ_7745c5c3_Err != nil {
1404- return templ.Error{Err: templ_7745c5c3_Err, FileName: `internal/adapters/web/pages.templ`, Line: 281, Col: 90}1400+ return templ.Error{Err: templ_7745c5c3_Err, FileName: `internal/adapters/web/pages.templ`, Line: 288, Col: 90}
1405 }1401 }
1406- _, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(templ_7745c5c3_Var69)1402+ _, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(templ_7745c5c3_Var67)
1407 if templ_7745c5c3_Err != nil {1403 if templ_7745c5c3_Err != nil {
1408 return templ_7745c5c3_Err1404 return templ_7745c5c3_Err
1409 }1405 }
1410- templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 108, "\" data-finish=\"")1406+ templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 110, "\" data-finish=\"")
1411 if templ_7745c5c3_Err != nil {1407 if templ_7745c5c3_Err != nil {
1412 return templ_7745c5c3_Err1408 return templ_7745c5c3_Err
1413 }1409 }
1414- var templ_7745c5c3_Var70 string1410+ var templ_7745c5c3_Var68 string
1415- templ_7745c5c3_Var70, templ_7745c5c3_Err = templ.ResolveAttributeValue(p.Finish)1411+ templ_7745c5c3_Var68, templ_7745c5c3_Err = templ.ResolveAttributeValue(p.Finish)
1416 if templ_7745c5c3_Err != nil {1412 if templ_7745c5c3_Err != nil {
1417- return templ.Error{Err: templ_7745c5c3_Err, FileName: `internal/adapters/web/pages.templ`, Line: 281, Col: 115}1413+ return templ.Error{Err: templ_7745c5c3_Err, FileName: `internal/adapters/web/pages.templ`, Line: 288, Col: 115}
1418 }1414 }
1419- _, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(templ_7745c5c3_Var70)1415+ _, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(templ_7745c5c3_Var68)
1420 if templ_7745c5c3_Err != nil {1416 if templ_7745c5c3_Err != nil {
1421 return templ_7745c5c3_Err1417 return templ_7745c5c3_Err
1422 }1418 }
1423- templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 109, "\">Add a passkey</button></form>")1419+ templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 111, "\">Add a passkey</button></form>")
1424 if templ_7745c5c3_Err != nil {1420 if templ_7745c5c3_Err != nil {
1425 return templ_7745c5c3_Err1421 return templ_7745c5c3_Err
1426 }1422 }
1427 }1423 }
1428- templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 110, " <p class=\"dim\" role=\"status\" aria-live=\"polite\" data-passkey-status></p>")1424+ templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 112, " <p class=\"dim\" role=\"status\" aria-live=\"polite\" data-passkey-status></p>")
1429 if templ_7745c5c3_Err != nil {1425 if templ_7745c5c3_Err != nil {
1430 return templ_7745c5c3_Err1426 return templ_7745c5c3_Err
1431 }1427 }
1432 return nil1428 return nil
1433 })1429 })
1434- templ_7745c5c3_Err = Shell(l, nil).Render(templ.WithChildren(ctx, templ_7745c5c3_Var59), templ_7745c5c3_Buffer)1430+ templ_7745c5c3_Err = Shell(l, nil).Render(templ.WithChildren(ctx, templ_7745c5c3_Var57), templ_7745c5c3_Buffer)
1435 if templ_7745c5c3_Err != nil {1431 if templ_7745c5c3_Err != nil {
1436 return templ_7745c5c3_Err1432 return templ_7745c5c3_Err
1437 }1433 }
M internal/adapters/web/static/css/30-list.css +40 -6
@@ -28,13 +28,47 @@
2828 & .c-sub { color: var(--ink-dim); }
2929 }
3030
31+ /* home: the repositories as cards in a grid (one column on a phone); the
32+ page is a stack of sections, so others can sit beside or below */
3133 .home {
32- & .c-name { width: 26%; font-family: var(--mono); font-weight: 700; }
33- & th.c-name { font-family: var(--font); }
34- & .c-desc { width: auto; }
35- & .c-when { width: 130px; }
36- & .c-ref { width: 120px; }
37- & .c-lang { width: 120px; }
34+ display: flex; flex-direction: column; gap: var(--s5);
35+ & .home-bar { display: flex; flex-wrap: wrap; align-items: center; justify-content: space-between; gap: var(--s3) var(--s4); margin-bottom: var(--s4); }
36+ & .home-bar .filter { flex: 1 1 260px; }
37+ & .sort { display: flex; align-items: center; gap: var(--s1); font-size: var(--fs-s); }
38+ & .sort > .mute { margin-right: var(--s1); }
39+ & .sort a {
40+ display: inline-flex; align-items: center; gap: 4px; height: 28px; padding: 0 var(--s2);
41+ color: var(--ink-dim); text-decoration: none; border: 1px solid transparent; border-radius: var(--r-s);
42+ }
43+ & .sort a:hover { color: var(--ink-hi); background: var(--bg-raised); }
44+ & .sort a[aria-current="true"] { color: var(--ink-hi); background: var(--bg-raised); border-color: var(--border-strong); }
45+ }
46+ .repos {
47+ display: grid; grid-template-columns: repeat(auto-fill, minmax(min(100%, 380px), 1fr)); gap: var(--s3);
48+ margin: 0; padding: 0; list-style: none;
49+ & .repo {
50+ position: relative; display: flex; flex-direction: column; gap: var(--s2); min-width: 0;
51+ padding: var(--s4); background: var(--bg-surface); border: 1px solid var(--border); border-radius: var(--r);
52+ }
53+ & .repo:hover { background: var(--bg-raised); border-color: var(--border-strong); }
54+ & .repo[data-cursor] { background: var(--bg-raised); border-color: var(--ink-mute); box-shadow: inset 3px 0 0 var(--ink-hi); }
55+ & .repo[hidden] { display: none; }
56+ & .repo-name { display: flex; align-items: center; flex-wrap: wrap; gap: var(--s1) var(--s2); font-size: 17px; line-height: 26px; overflow-wrap: anywhere; }
57+ & .repo-name a { color: var(--ink-hi); text-decoration: none; }
58+ /* the whole card is the target of the name link */
59+ & .repo-name a::after { content: ""; position: absolute; inset: 0; border-radius: var(--r); }
60+ & .repo-name a:focus-visible { outline: none; }
61+ & .repo-name a:focus-visible::after { outline: 2px solid var(--focus); outline-offset: 1px; }
62+ & .repo:hover .repo-name a, & .repo[data-cursor] .repo-name a { text-decoration: underline; }
63+ & .repo-name .pill { margin-left: 0; }
64+ & .repo-desc {
65+ flex: 1; color: var(--ink-dim);
66+ display: -webkit-box; -webkit-box-orient: vertical; -webkit-line-clamp: 2; line-clamp: 2; overflow: hidden;
67+ }
68+ & .repo-desc.mute { color: var(--ink-mute); font-style: italic; }
69+ & .repo-meta { display: flex; flex-wrap: wrap; align-items: center; gap: var(--s1) var(--s4); font-size: var(--fs-s); color: var(--ink-mute); }
70+ & .repo-meta time { color: var(--ink-dim); }
71+ & .repo-branch { display: inline-flex; align-items: center; gap: 6px; font-family: var(--mono); color: var(--ink-dim); }
3872 }
3973 .list.tree {
4074 & .c-kind { width: 36px; color: var(--ink-mute); padding-right: 0; text-align: center; }
@@ -28,13 +28,47 @@
28 & .c-sub { color: var(--ink-dim); }28 & .c-sub { color: var(--ink-dim); }
29 }29 }
30 30
31+ /* home: the repositories as cards in a grid (one column on a phone); the
32+ page is a stack of sections, so others can sit beside or below */
31 .home {33 .home {
32- & .c-name { width: 26%; font-family: var(--mono); font-weight: 700; }34+ display: flex; flex-direction: column; gap: var(--s5);
33- & th.c-name { font-family: var(--font); }35+ & .home-bar { display: flex; flex-wrap: wrap; align-items: center; justify-content: space-between; gap: var(--s3) var(--s4); margin-bottom: var(--s4); }
34- & .c-desc { width: auto; }36+ & .home-bar .filter { flex: 1 1 260px; }
35- & .c-when { width: 130px; }37+ & .sort { display: flex; align-items: center; gap: var(--s1); font-size: var(--fs-s); }
36- & .c-ref { width: 120px; }38+ & .sort > .mute { margin-right: var(--s1); }
37- & .c-lang { width: 120px; }39+ & .sort a {
40+ display: inline-flex; align-items: center; gap: 4px; height: 28px; padding: 0 var(--s2);
41+ color: var(--ink-dim); text-decoration: none; border: 1px solid transparent; border-radius: var(--r-s);
42+ }
43+ & .sort a:hover { color: var(--ink-hi); background: var(--bg-raised); }
44+ & .sort a[aria-current="true"] { color: var(--ink-hi); background: var(--bg-raised); border-color: var(--border-strong); }
45+ }
46+ .repos {
47+ display: grid; grid-template-columns: repeat(auto-fill, minmax(min(100%, 380px), 1fr)); gap: var(--s3);
48+ margin: 0; padding: 0; list-style: none;
49+ & .repo {
50+ position: relative; display: flex; flex-direction: column; gap: var(--s2); min-width: 0;
51+ padding: var(--s4); background: var(--bg-surface); border: 1px solid var(--border); border-radius: var(--r);
52+ }
53+ & .repo:hover { background: var(--bg-raised); border-color: var(--border-strong); }
54+ & .repo[data-cursor] { background: var(--bg-raised); border-color: var(--ink-mute); box-shadow: inset 3px 0 0 var(--ink-hi); }
55+ & .repo[hidden] { display: none; }
56+ & .repo-name { display: flex; align-items: center; flex-wrap: wrap; gap: var(--s1) var(--s2); font-size: 17px; line-height: 26px; overflow-wrap: anywhere; }
57+ & .repo-name a { color: var(--ink-hi); text-decoration: none; }
58+ /* the whole card is the target of the name link */
59+ & .repo-name a::after { content: ""; position: absolute; inset: 0; border-radius: var(--r); }
60+ & .repo-name a:focus-visible { outline: none; }
61+ & .repo-name a:focus-visible::after { outline: 2px solid var(--focus); outline-offset: 1px; }
62+ & .repo:hover .repo-name a, & .repo[data-cursor] .repo-name a { text-decoration: underline; }
63+ & .repo-name .pill { margin-left: 0; }
64+ & .repo-desc {
65+ flex: 1; color: var(--ink-dim);
66+ display: -webkit-box; -webkit-box-orient: vertical; -webkit-line-clamp: 2; line-clamp: 2; overflow: hidden;
67+ }
68+ & .repo-desc.mute { color: var(--ink-mute); font-style: italic; }
69+ & .repo-meta { display: flex; flex-wrap: wrap; align-items: center; gap: var(--s1) var(--s4); font-size: var(--fs-s); color: var(--ink-mute); }
70+ & .repo-meta time { color: var(--ink-dim); }
71+ & .repo-branch { display: inline-flex; align-items: center; gap: 6px; font-family: var(--mono); color: var(--ink-dim); }
38 }72 }
39 .list.tree {73 .list.tree {
40 & .c-kind { width: 36px; color: var(--ink-mute); padding-right: 0; text-align: center; }74 & .c-kind { width: 36px; color: var(--ink-mute); padding-right: 0; text-align: center; }
M internal/adapters/web/view.go +10 -8
@@ -83,25 +83,27 @@ type HomeRow struct {
8383 Pushed string
8484 PushedAt string // RFC 3339, "" when never pushed
8585 Branch string
86- Tag string
8786 Cursor bool
87+ // Private marks a private repository; only set for a signed-in visitor.
88+ Private bool
8889 // Fresh marks a row that a push just updated (live updates only).
8990 Fresh bool
9091 }
9192
92-// SortCol is a column header of the home list; it links to its sort order.
93-type SortCol struct {
93+// SortLink is one way to order the home list; it links to that order.
94+type SortLink struct {
9495 Label string
9596 Href string
96- Dir string // "ascending" | "descending" | "none"
97- Mark string
98- Class string
97+ Mark string // "▲" or "▼" on the current order, "" otherwise
98+ // State says the current direction and what the link does, for screen
99+ // readers (the mark is hidden from them); "" off the current order.
100+ State string
99101 }
100102
101103 // HomePage is the repository list.
102104 type HomePage struct {
103- Cols []SortCol
104- Rows []HomeRow
105+ Sorts []SortLink
106+ Rows []HomeRow
105107 }
106108
107109 // Fact is one key/value row of the facts block.
@@ -83,25 +83,27 @@ type HomeRow struct {
83 Pushed string83 Pushed string
84 PushedAt string // RFC 3339, "" when never pushed84 PushedAt string // RFC 3339, "" when never pushed
85 Branch string85 Branch string
86- Tag string
87 Cursor bool86 Cursor bool
87+ // Private marks a private repository; only set for a signed-in visitor.
88+ Private bool
88 // Fresh marks a row that a push just updated (live updates only).89 // Fresh marks a row that a push just updated (live updates only).
89 Fresh bool90 Fresh bool
90 }91 }
91 92
92-// SortCol is a column header of the home list; it links to its sort order.93+// SortLink is one way to order the home list; it links to that order.
93-type SortCol struct {94+type SortLink struct {
94 Label string95 Label string
95 Href string96 Href string
96- Dir string // "ascending" | "descending" | "none"97+ Mark string // "▲" or "▼" on the current order, "" otherwise
97- Mark string98+ // State says the current direction and what the link does, for screen
98- Class string99+ // readers (the mark is hidden from them); "" off the current order.
100+ State string
99 }101 }
100 102
101 // HomePage is the repository list.103 // HomePage is the repository list.
102 type HomePage struct {104 type HomePage struct {
103- Cols []SortCol105+ Sorts []SortLink
104- Rows []HomeRow106+ Rows []HomeRow
105 }107 }
106 108
107 // Fact is one key/value row of the facts block.109 // Fact is one key/value row of the facts block.
M internal/app/testdata/web/home.html +39 -46
@@ -49,58 +49,51 @@
4949 </header>
5050 <div class="work">
5151 <main id="main" tabindex="-1">
52+<h1 class="sr">Repositories</h1>
53+<div class="home">
54+<section class="home-repos" aria-label="Repositories">
55+<div class="home-bar">
5256 <div class="filter">
5357 <label for="home-filter" class="sr">filter</label>
54-<input id="home-filter" type="search" data-filter="#repo-rows > tr" placeholder="Filter repositories…" autocomplete="off" hx-on:input="ermite.filter(this)">
58+<input id="home-filter" type="search" data-filter="#repo-rows > li" placeholder="Filter repositories…" autocomplete="off" hx-on:input="ermite.filter(this)">
5559 </div>
56-<table class="list home" aria-label="Repositories">
57-<thead>
58-<tr>
59-<th class="cur">
60-</th>
61-<th class="c-name" aria-sort="none">
62-<a href="/?sort=name&amp;dir=asc">name </a>
63-</th>
64-<th class="c-desc" aria-sort="none">
65-<a href="/?sort=desc&amp;dir=asc">description </a>
66-</th>
67-<th class="c-when" aria-sort="descending">
68-<a href="/?sort=push&amp;dir=asc">last push <span aria-hidden="true">▼</span>
60+<nav class="sort" aria-label="Sort repositories">
61+<span class="mute">sort</span>
62+<a href="/?sort=push&amp;dir=asc" aria-current="true">last push <span aria-hidden="true">▼</span>
63+<span class="sr">, descending, select for ascending</span>
6964 </a>
70-</th>
71-<th class="c-ref" aria-sort="none">
72-<a href="/?sort=branch&amp;dir=asc">branch </a>
73-</th>
74-</tr>
75-</thead>
76-<tbody id="repo-rows" data-rows>
77-<tr id="repo-demo" data-cursor>
78-<td class="cur" aria-hidden="true">
79-</td>
80-<td class="c-name">
65+<a href="/?sort=name&amp;dir=asc">name </a>
66+</nav>
67+</div>
68+<ul class="repos" id="repo-rows" data-rows>
69+<li id="repo-demo" class="repo" data-cursor>
70+<h2 class="repo-name">
8171 <a href="/demo">demo</a>
82-</td>
83-<td class="c-desc dim">A demo repository</td>
84-<td class="c-when nowrap">
85-<time datetime="STAMP">AGO</time>
86-</td>
87-<td class="c-ref">main</td>
88-</tr>
89-<tr id="repo-quiet">
90-<td class="cur" aria-hidden="true">
91-</td>
92-<td class="c-name">
72+</h2>
73+<p class="repo-desc">A demo repository</p>
74+<p class="repo-meta">
75+<span class="repo-branch">
76+<span class="ico i-branch" aria-hidden="true">
77+</span>main</span>
78+<span>pushed <time datetime="STAMP" title="STAMP">AGO</time>
79+</span>
80+</p>
81+</li>
82+<li id="repo-quiet" class="repo">
83+<h2 class="repo-name">
9384 <a href="/quiet">quiet</a>
94-</td>
95-<td class="c-desc dim">
96-</td>
97-<td class="c-when nowrap">
98-<time>never</time>
99-</td>
100-<td class="c-ref">main</td>
101-</tr>
102-</tbody>
103-</table>
85+</h2>
86+<p class="repo-desc mute">no description</p>
87+<p class="repo-meta">
88+<span class="repo-branch">
89+<span class="ico i-branch" aria-hidden="true">
90+</span>main</span>
91+<span>never pushed</span>
92+</p>
93+</li>
94+</ul>
95+</section>
96+</div>
10497 </main>
10598 </div>
10699 <footer class="foot">
@@ -49,58 +49,51 @@
49 </header>49 </header>
50 <div class="work">50 <div class="work">
51 <main id="main" tabindex="-1">51 <main id="main" tabindex="-1">
52+<h1 class="sr">Repositories</h1>
53+<div class="home">
54+<section class="home-repos" aria-label="Repositories">
55+<div class="home-bar">
52 <div class="filter">56 <div class="filter">
53 <label for="home-filter" class="sr">filter</label>57 <label for="home-filter" class="sr">filter</label>
54-<input id="home-filter" type="search" data-filter="#repo-rows > tr" placeholder="Filter repositories…" autocomplete="off" hx-on:input="ermite.filter(this)">58+<input id="home-filter" type="search" data-filter="#repo-rows > li" placeholder="Filter repositories…" autocomplete="off" hx-on:input="ermite.filter(this)">
55 </div>59 </div>
56-<table class="list home" aria-label="Repositories">60+<nav class="sort" aria-label="Sort repositories">
57-<thead>61+<span class="mute">sort</span>
58-<tr>62+<a href="/?sort=push&amp;dir=asc" aria-current="true">last push <span aria-hidden="true">▼</span>
59-<th class="cur">63+<span class="sr">, descending, select for ascending</span>
60-</th>
61-<th class="c-name" aria-sort="none">
62-<a href="/?sort=name&amp;dir=asc">name </a>
63-</th>
64-<th class="c-desc" aria-sort="none">
65-<a href="/?sort=desc&amp;dir=asc">description </a>
66-</th>
67-<th class="c-when" aria-sort="descending">
68-<a href="/?sort=push&amp;dir=asc">last push <span aria-hidden="true">▼</span>
69 </a>64 </a>
70-</th>65+<a href="/?sort=name&amp;dir=asc">name </a>
71-<th class="c-ref" aria-sort="none">66+</nav>
72-<a href="/?sort=branch&amp;dir=asc">branch </a>67+</div>
73-</th>68+<ul class="repos" id="repo-rows" data-rows>
74-</tr>69+<li id="repo-demo" class="repo" data-cursor>
75-</thead>70+<h2 class="repo-name">
76-<tbody id="repo-rows" data-rows>
77-<tr id="repo-demo" data-cursor>
78-<td class="cur" aria-hidden="true">
79-</td>
80-<td class="c-name">
81 <a href="/demo">demo</a>71 <a href="/demo">demo</a>
82-</td>72+</h2>
83-<td class="c-desc dim">A demo repository</td>73+<p class="repo-desc">A demo repository</p>
84-<td class="c-when nowrap">74+<p class="repo-meta">
85-<time datetime="STAMP">AGO</time>75+<span class="repo-branch">
86-</td>76+<span class="ico i-branch" aria-hidden="true">
87-<td class="c-ref">main</td>77+</span>main</span>
88-</tr>78+<span>pushed <time datetime="STAMP" title="STAMP">AGO</time>
89-<tr id="repo-quiet">79+</span>
90-<td class="cur" aria-hidden="true">80+</p>
91-</td>81+</li>
92-<td class="c-name">82+<li id="repo-quiet" class="repo">
83+<h2 class="repo-name">
93 <a href="/quiet">quiet</a>84 <a href="/quiet">quiet</a>
94-</td>85+</h2>
95-<td class="c-desc dim">86+<p class="repo-desc mute">no description</p>
96-</td>87+<p class="repo-meta">
97-<td class="c-when nowrap">88+<span class="repo-branch">
98-<time>never</time>89+<span class="ico i-branch" aria-hidden="true">
99-</td>90+</span>main</span>
100-<td class="c-ref">main</td>91+<span>never pushed</span>
101-</tr>92+</p>
102-</tbody>93+</li>
103-</table>94+</ul>
95+</section>
96+</div>
104 </main>97 </main>
105 </div>98 </div>
106 <footer class="foot">99 <footer class="foot">
M internal/app/web_events_test.go +4 -4
@@ -122,7 +122,7 @@ func TestWebEventsHome(t *testing.T) {
122122 assert.Less(t, time.Since(start), 2*time.Second)
123123 assert.Equal(t, "home-list", ev.name)
124124 assert.NotEmpty(t, ev.id)
125- assert.Contains(t, ev.data, `<tr id="repo-pub"`)
125+ assert.Contains(t, ev.data, `<li id="repo-pub"`)
126126 assert.Contains(t, ev.data, `new push`)
127127 assert.Contains(t, ev.data, `href="/pub"`)
128128
@@ -131,7 +131,7 @@ func TestWebEventsHome(t *testing.T) {
131131 require.NoError(t, err)
132132 ev = s.next(t, watchWait)
133133 assert.Equal(t, "home-list", ev.name)
134- assert.Contains(t, ev.data, `<tr id="repo-fresh"`)
134+ assert.Contains(t, ev.data, `<li id="repo-fresh"`)
135135 assert.Contains(t, ev.data, "a &lt;b&gt;fresh&lt;/b&gt; one", "text is escaped")
136136 assert.NotContains(t, ev.data, "new push")
137137
@@ -141,13 +141,13 @@ func TestWebEventsHome(t *testing.T) {
141141 require.NoError(t, err)
142142 ev = s.next(t, watchWait)
143143 assert.Equal(t, "home-list", ev.name)
144- assert.Contains(t, ev.data, `<tr id="repo-fresh" data-gone`)
144+ assert.Contains(t, ev.data, `<li id="repo-fresh" data-gone`)
145145 assert.NotContains(t, ev.data, "fresh one")
146146
147147 // And a deleted one.
148148 require.NoError(t, h.forge.Repos.Delete(h.ctx, domain.Root(), h.name("pub")))
149149 ev = s.next(t, watchWait)
150- assert.Contains(t, ev.data, `<tr id="repo-pub" data-gone`)
150+ assert.Contains(t, ev.data, `<li id="repo-pub" data-gone`)
151151 }
152152
153153 // AC5: the stream of a repository carries its last push; the refs page its
@@ -122,7 +122,7 @@ func TestWebEventsHome(t *testing.T) {
122 assert.Less(t, time.Since(start), 2*time.Second)122 assert.Less(t, time.Since(start), 2*time.Second)
123 assert.Equal(t, "home-list", ev.name)123 assert.Equal(t, "home-list", ev.name)
124 assert.NotEmpty(t, ev.id)124 assert.NotEmpty(t, ev.id)
125- assert.Contains(t, ev.data, `<tr id="repo-pub"`)125+ assert.Contains(t, ev.data, `<li id="repo-pub"`)
126 assert.Contains(t, ev.data, `new push`)126 assert.Contains(t, ev.data, `new push`)
127 assert.Contains(t, ev.data, `href="/pub"`)127 assert.Contains(t, ev.data, `href="/pub"`)
128 128
@@ -131,7 +131,7 @@ func TestWebEventsHome(t *testing.T) {
131 require.NoError(t, err)131 require.NoError(t, err)
132 ev = s.next(t, watchWait)132 ev = s.next(t, watchWait)
133 assert.Equal(t, "home-list", ev.name)133 assert.Equal(t, "home-list", ev.name)
134- assert.Contains(t, ev.data, `<tr id="repo-fresh"`)134+ assert.Contains(t, ev.data, `<li id="repo-fresh"`)
135 assert.Contains(t, ev.data, "a &lt;b&gt;fresh&lt;/b&gt; one", "text is escaped")135 assert.Contains(t, ev.data, "a &lt;b&gt;fresh&lt;/b&gt; one", "text is escaped")
136 assert.NotContains(t, ev.data, "new push")136 assert.NotContains(t, ev.data, "new push")
137 137
@@ -141,13 +141,13 @@ func TestWebEventsHome(t *testing.T) {
141 require.NoError(t, err)141 require.NoError(t, err)
142 ev = s.next(t, watchWait)142 ev = s.next(t, watchWait)
143 assert.Equal(t, "home-list", ev.name)143 assert.Equal(t, "home-list", ev.name)
144- assert.Contains(t, ev.data, `<tr id="repo-fresh" data-gone`)144+ assert.Contains(t, ev.data, `<li id="repo-fresh" data-gone`)
145 assert.NotContains(t, ev.data, "fresh one")145 assert.NotContains(t, ev.data, "fresh one")
146 146
147 // And a deleted one.147 // And a deleted one.
148 require.NoError(t, h.forge.Repos.Delete(h.ctx, domain.Root(), h.name("pub")))148 require.NoError(t, h.forge.Repos.Delete(h.ctx, domain.Root(), h.name("pub")))
149 ev = s.next(t, watchWait)149 ev = s.next(t, watchWait)
150- assert.Contains(t, ev.data, `<tr id="repo-pub" data-gone`)150+ assert.Contains(t, ev.data, `<li id="repo-pub" data-gone`)
151 }151 }
152 152
153 // AC5: the stream of a repository carries its last push; the refs page its153 // AC5: the stream of a repository carries its last push; the refs page its
M internal/app/web_session_test.go +3 -0
@@ -118,6 +118,7 @@ func TestWebLoginEndToEnd(t *testing.T) {
118118 assert.Equal(t, "no-cache", home.hdr.Get("Cache-Control"))
119119 assert.Equal(t, []string{"Accept-Encoding"}, home.hdr.Values("Vary"), "no Cookie in the Vary of a public page")
120120 assert.NotContains(t, home.body, `action="/-/logout"`)
121+ assert.NotContains(t, home.body, `>private</span>`, "an anonymous visitor sees no private badge")
121122 assert.Equal(t, 404, b.get("/secret", nil).status)
122123
123124 // The CLI asks for a link and prints it; stderr says when it ends.
@@ -199,6 +200,8 @@ func TestWebLoginEndToEnd(t *testing.T) {
199200 }
200201 home = b.get("/", as(token))
201202 assert.Contains(t, home.body, "secret")
203+ assert.Equal(t, 1, strings.Count(home.body, `<span class="pill">private</span>`), "only the private repository has the badge")
204+ assert.Regexp(t, `(?s)<li id="repo-secret".*?<span class="pill">private</span>.*?</li>\s*<li id="repo-pub"|<li id="repo-pub".*?</li>\s*<li id="repo-secret".*?<span class="pill">private</span>`, home.body)
202205 assert.Contains(t, home.body, `<form class="owner" method="post" action="/-/logout">`)
203206 assert.Contains(t, b.get("/secret/blob/main/notes.txt", as(token)).body, "notes.txt")
204207 raw := b.get("/secret/raw/main/notes.txt", as(token))
@@ -118,6 +118,7 @@ func TestWebLoginEndToEnd(t *testing.T) {
118 assert.Equal(t, "no-cache", home.hdr.Get("Cache-Control"))118 assert.Equal(t, "no-cache", home.hdr.Get("Cache-Control"))
119 assert.Equal(t, []string{"Accept-Encoding"}, home.hdr.Values("Vary"), "no Cookie in the Vary of a public page")119 assert.Equal(t, []string{"Accept-Encoding"}, home.hdr.Values("Vary"), "no Cookie in the Vary of a public page")
120 assert.NotContains(t, home.body, `action="/-/logout"`)120 assert.NotContains(t, home.body, `action="/-/logout"`)
121+ assert.NotContains(t, home.body, `>private</span>`, "an anonymous visitor sees no private badge")
121 assert.Equal(t, 404, b.get("/secret", nil).status)122 assert.Equal(t, 404, b.get("/secret", nil).status)
122 123
123 // The CLI asks for a link and prints it; stderr says when it ends.124 // The CLI asks for a link and prints it; stderr says when it ends.
@@ -199,6 +200,8 @@ func TestWebLoginEndToEnd(t *testing.T) {
199 }200 }
200 home = b.get("/", as(token))201 home = b.get("/", as(token))
201 assert.Contains(t, home.body, "secret")202 assert.Contains(t, home.body, "secret")
203+ assert.Equal(t, 1, strings.Count(home.body, `<span class="pill">private</span>`), "only the private repository has the badge")
204+ assert.Regexp(t, `(?s)<li id="repo-secret".*?<span class="pill">private</span>.*?</li>\s*<li id="repo-pub"|<li id="repo-pub".*?</li>\s*<li id="repo-secret".*?<span class="pill">private</span>`, home.body)
202 assert.Contains(t, home.body, `<form class="owner" method="post" action="/-/logout">`)205 assert.Contains(t, home.body, `<form class="owner" method="post" action="/-/logout">`)
203 assert.Contains(t, b.get("/secret/blob/main/notes.txt", as(token)).body, "notes.txt")206 assert.Contains(t, b.get("/secret/blob/main/notes.txt", as(token)).body, "notes.txt")
204 raw := b.get("/secret/raw/main/notes.txt", as(token))207 raw := b.get("/secret/raw/main/notes.txt", as(token))

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 45

↑↓ moveenter openesc close