detached 7ecd377

fix(web): the merge request rail scrolls on its own, and its list of files folds (#53)

commit
7ecd37707358348a023f56fecfe5560bf05d36bd
author
brice · · 2026-10-17 23:38 UTC
committer
bnema · · 2026-10-17 23:38 UTC
parent
55a688e
signature
SSH UnverifiedSHA256:VOCA5lYARHcbKDZ7GhTV45VmcjWnJ6ZQIBazj17LivA The key is unknown
7 files · +112 -74
M internal/adapters/web/ASSETS.md +1 -1
@@ -16,7 +16,7 @@ content-hashed names. Nothing is fetched at runtime.
1616 | `static/css/*.css` | native CSS, served as one stylesheet in name order; relative `url(fonts/…)` and `url(icons/…)` become hashed URLs | written here | |
1717 | `static/fonts/atkinson-next.woff2`, `atkinson-next-italic.woff2` | Atkinson Hyperlegible Next, variable weight, latin subset (SIL OFL 1.1, `static/fonts/OFL-next.txt`) | Google Fonts | `18b2a1a39a2fa298b0ba5390aca68462669826c90925656f1c1f6796e0e1bbaf`, `4a5037bfaf6680f40147407407ec09fa42925774bde809a579283d27f9f08106` |
1818 | `static/fonts/atkinson-mono.woff2` | Atkinson Hyperlegible Mono, variable weight, latin subset (SIL OFL 1.1, `static/fonts/OFL-mono.txt`) | Google Fonts | `2706b1ee4f452e744ea91f7e4908cbde9c5d35521bf5ffffc71a382a2de89613` |
19-| `static/icons/*.svg` | interface icons, used as CSS masks; `brand.svg` is a grey picture shown as is. Only the icons in use are copied, one file each: `branch`, `search`, `tag`, `file`, `user`, `key`, `log-in`, `log-out` are Lucide 1.8 (`git-branch`, `search`, `tag`, `file-text`, `user-round`, `key-round`, `log-in`, `log-out`; ISC, https://lucide.dev/license) | Lucide; `brand.svg` written here | |
19+| `static/icons/*.svg` | interface icons, used as CSS masks; `brand.svg` is a grey picture shown as is. Only the icons in use are copied, one file each: `branch`, `search`, `tag`, `file`, `chevron`, `user`, `key`, `log-in`, `log-out` are Lucide 1.8 (`git-branch`, `search`, `tag`, `file-text`, `chevron-down`, `user-round`, `key-round`, `log-in`, `log-out`; ISC, https://lucide.dev/license) | Lucide; `brand.svg` written here | |
2020 | `static/app/*.png` | icons of the installed web app (manifest, `apple-touch-icon`), rendered from `brand.svg` with resvg; the maskable and Apple icons have the picture in the safe zone on `#181818` | generated here | |
2121 | `static/rules.json` | speculation rules: prefetch the light same-origin pages on hover (`Speculation-Rules` header); the heavy ones (tree, blob, commit, commits, compare, refs, raw, MR "since") are excluded, each costs several Git reads on the server | written here | |
2222
@@ -16,7 +16,7 @@ content-hashed names. Nothing is fetched at runtime.
16 | `static/css/*.css` | native CSS, served as one stylesheet in name order; relative `url(fonts/…)` and `url(icons/…)` become hashed URLs | written here | |16 | `static/css/*.css` | native CSS, served as one stylesheet in name order; relative `url(fonts/…)` and `url(icons/…)` become hashed URLs | written here | |
17 | `static/fonts/atkinson-next.woff2`, `atkinson-next-italic.woff2` | Atkinson Hyperlegible Next, variable weight, latin subset (SIL OFL 1.1, `static/fonts/OFL-next.txt`) | Google Fonts | `18b2a1a39a2fa298b0ba5390aca68462669826c90925656f1c1f6796e0e1bbaf`, `4a5037bfaf6680f40147407407ec09fa42925774bde809a579283d27f9f08106` |17 | `static/fonts/atkinson-next.woff2`, `atkinson-next-italic.woff2` | Atkinson Hyperlegible Next, variable weight, latin subset (SIL OFL 1.1, `static/fonts/OFL-next.txt`) | Google Fonts | `18b2a1a39a2fa298b0ba5390aca68462669826c90925656f1c1f6796e0e1bbaf`, `4a5037bfaf6680f40147407407ec09fa42925774bde809a579283d27f9f08106` |
18 | `static/fonts/atkinson-mono.woff2` | Atkinson Hyperlegible Mono, variable weight, latin subset (SIL OFL 1.1, `static/fonts/OFL-mono.txt`) | Google Fonts | `2706b1ee4f452e744ea91f7e4908cbde9c5d35521bf5ffffc71a382a2de89613` |18 | `static/fonts/atkinson-mono.woff2` | Atkinson Hyperlegible Mono, variable weight, latin subset (SIL OFL 1.1, `static/fonts/OFL-mono.txt`) | Google Fonts | `2706b1ee4f452e744ea91f7e4908cbde9c5d35521bf5ffffc71a382a2de89613` |
19-| `static/icons/*.svg` | interface icons, used as CSS masks; `brand.svg` is a grey picture shown as is. Only the icons in use are copied, one file each: `branch`, `search`, `tag`, `file`, `user`, `key`, `log-in`, `log-out` are Lucide 1.8 (`git-branch`, `search`, `tag`, `file-text`, `user-round`, `key-round`, `log-in`, `log-out`; ISC, https://lucide.dev/license) | Lucide; `brand.svg` written here | |19+| `static/icons/*.svg` | interface icons, used as CSS masks; `brand.svg` is a grey picture shown as is. Only the icons in use are copied, one file each: `branch`, `search`, `tag`, `file`, `chevron`, `user`, `key`, `log-in`, `log-out` are Lucide 1.8 (`git-branch`, `search`, `tag`, `file-text`, `chevron-down`, `user-round`, `key-round`, `log-in`, `log-out`; ISC, https://lucide.dev/license) | Lucide; `brand.svg` written here | |
20 | `static/app/*.png` | icons of the installed web app (manifest, `apple-touch-icon`), rendered from `brand.svg` with resvg; the maskable and Apple icons have the picture in the safe zone on `#181818` | generated here | |20 | `static/app/*.png` | icons of the installed web app (manifest, `apple-touch-icon`), rendered from `brand.svg` with resvg; the maskable and Apple icons have the picture in the safe zone on `#181818` | generated here | |
21 | `static/rules.json` | speculation rules: prefetch the light same-origin pages on hover (`Speculation-Rules` header); the heavy ones (tree, blob, commit, commits, compare, refs, raw, MR "since") are excluded, each costs several Git reads on the server | written here | |21 | `static/rules.json` | speculation rules: prefetch the light same-origin pages on hover (`Speculation-Rules` header); the heavy ones (tree, blob, commit, commits, compare, refs, raw, MR "since") are excluded, each costs several Git reads on the server | written here | |
22 22
M internal/adapters/web/mr.templ +6 -1
@@ -301,7 +301,12 @@ templ commentForm(f CommentForm, suffix string) {
301301
302302 templ mrRail(p MRPage) {
303303 <section aria-labelledby="r-files" class="r-files">
304- <h2 id="r-files">Files <span class="count">{ itoa(len(p.Files)) }</span><kbd aria-hidden="true">g f</kbd></h2>
304+ <h2 id="r-files">
305+ Files <span class="count">{ itoa(len(p.Files)) }</span><kbd aria-hidden="true">g f</kbd>
306+ <button type="button" class="btn icon fold" data-js aria-expanded="true" title="fold the list of files" hx-on:click="ermiteMR.foldFiles()">
307+ <span class="ico i-chevron" aria-hidden="true"></span><span class="sr">fold the list of files</span>
308+ </button>
309+ </h2>
305310 @FileList(p.Files)
306311 </section>
307312 @MRChecks(p.Checks)
@@ -301,7 +301,12 @@ templ commentForm(f CommentForm, suffix string) {
301 301
302 templ mrRail(p MRPage) {302 templ mrRail(p MRPage) {
303 <section aria-labelledby="r-files" class="r-files">303 <section aria-labelledby="r-files" class="r-files">
304- <h2 id="r-files">Files <span class="count">{ itoa(len(p.Files)) }</span><kbd aria-hidden="true">g f</kbd></h2>304+ <h2 id="r-files">
305+ Files <span class="count">{ itoa(len(p.Files)) }</span><kbd aria-hidden="true">g f</kbd>
306+ <button type="button" class="btn icon fold" data-js aria-expanded="true" title="fold the list of files" hx-on:click="ermiteMR.foldFiles()">
307+ <span class="ico i-chevron" aria-hidden="true"></span><span class="sr">fold the list of files</span>
308+ </button>
309+ </h2>
305 @FileList(p.Files)310 @FileList(p.Files)
306 </section>311 </section>
307 @MRChecks(p.Checks)312 @MRChecks(p.Checks)
M internal/adapters/web/mr_templ.go +58 -58
@@ -1699,13 +1699,13 @@ func mrRail(p MRPage) templ.Component {
16991699 var templ_7745c5c3_Var85 string
17001700 templ_7745c5c3_Var85, templ_7745c5c3_Err = templ.JoinStringErrs(itoa(len(p.Files)))
17011701 if templ_7745c5c3_Err != nil {
1702- return templ.Error{Err: templ_7745c5c3_Err, FileName: `internal/adapters/web/mr.templ`, Line: 304, Col: 65}
1702+ return templ.Error{Err: templ_7745c5c3_Err, FileName: `internal/adapters/web/mr.templ`, Line: 305, Col: 49}
17031703 }
17041704 _, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(templ.EscapeString(templ_7745c5c3_Var85))
17051705 if templ_7745c5c3_Err != nil {
17061706 return templ_7745c5c3_Err
17071707 }
1708- templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 149, "</span><kbd aria-hidden=\"true\">g f</kbd></h2>")
1708+ templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 149, "</span><kbd aria-hidden=\"true\">g f</kbd> <button type=\"button\" class=\"btn icon fold\" data-js aria-expanded=\"true\" title=\"fold the list of files\" hx-on:click=\"ermiteMR.foldFiles()\"><span class=\"ico i-chevron\" aria-hidden=\"true\"></span><span class=\"sr\">fold the list of files</span></button></h2>")
17091709 if templ_7745c5c3_Err != nil {
17101710 return templ_7745c5c3_Err
17111711 }
@@ -1728,7 +1728,7 @@ func mrRail(p MRPage) templ.Component {
17281728 var templ_7745c5c3_Var86 string
17291729 templ_7745c5c3_Var86, templ_7745c5c3_Err = templ.JoinStringErrs(itoa(len(p.Commits)))
17301730 if templ_7745c5c3_Err != nil {
1731- return templ.Error{Err: templ_7745c5c3_Err, FileName: `internal/adapters/web/mr.templ`, Line: 309, Col: 71}
1731+ return templ.Error{Err: templ_7745c5c3_Err, FileName: `internal/adapters/web/mr.templ`, Line: 314, Col: 71}
17321732 }
17331733 _, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(templ.EscapeString(templ_7745c5c3_Var86))
17341734 if templ_7745c5c3_Err != nil {
@@ -1756,7 +1756,7 @@ func mrRail(p MRPage) templ.Component {
17561756 var templ_7745c5c3_Var87 templ.SafeURL
17571757 templ_7745c5c3_Var87, templ_7745c5c3_Err = templ.JoinURLErrs(templ.SafeURL(c.Href))
17581758 if templ_7745c5c3_Err != nil {
1759- return templ.Error{Err: templ_7745c5c3_Err, FileName: `internal/adapters/web/mr.templ`, Line: 313, Col: 36}
1759+ return templ.Error{Err: templ_7745c5c3_Err, FileName: `internal/adapters/web/mr.templ`, Line: 318, Col: 36}
17601760 }
17611761 _, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(templ.EscapeString(templ_7745c5c3_Var87))
17621762 if templ_7745c5c3_Err != nil {
@@ -1769,7 +1769,7 @@ func mrRail(p MRPage) templ.Component {
17691769 var templ_7745c5c3_Var88 string
17701770 templ_7745c5c3_Var88, templ_7745c5c3_Err = templ.JoinStringErrs(c.Short)
17711771 if templ_7745c5c3_Err != nil {
1772- return templ.Error{Err: templ_7745c5c3_Err, FileName: `internal/adapters/web/mr.templ`, Line: 313, Col: 48}
1772+ return templ.Error{Err: templ_7745c5c3_Err, FileName: `internal/adapters/web/mr.templ`, Line: 318, Col: 48}
17731773 }
17741774 _, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(templ.EscapeString(templ_7745c5c3_Var88))
17751775 if templ_7745c5c3_Err != nil {
@@ -1782,7 +1782,7 @@ func mrRail(p MRPage) templ.Component {
17821782 var templ_7745c5c3_Var89 string
17831783 templ_7745c5c3_Var89, templ_7745c5c3_Err = templ.JoinStringErrs(c.Subject)
17841784 if templ_7745c5c3_Err != nil {
1785- return templ.Error{Err: templ_7745c5c3_Err, FileName: `internal/adapters/web/mr.templ`, Line: 314, Col: 32}
1785+ return templ.Error{Err: templ_7745c5c3_Err, FileName: `internal/adapters/web/mr.templ`, Line: 319, Col: 32}
17861786 }
17871787 _, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(templ.EscapeString(templ_7745c5c3_Var89))
17881788 if templ_7745c5c3_Err != nil {
@@ -1795,7 +1795,7 @@ func mrRail(p MRPage) templ.Component {
17951795 var templ_7745c5c3_Var90 string
17961796 templ_7745c5c3_Var90, templ_7745c5c3_Err = templ.JoinStringErrs(c.Author)
17971797 if templ_7745c5c3_Err != nil {
1798- return templ.Error{Err: templ_7745c5c3_Err, FileName: `internal/adapters/web/mr.templ`, Line: 316, Col: 16}
1798+ return templ.Error{Err: templ_7745c5c3_Err, FileName: `internal/adapters/web/mr.templ`, Line: 321, Col: 16}
17991799 }
18001800 _, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(templ.EscapeString(templ_7745c5c3_Var90))
18011801 if templ_7745c5c3_Err != nil {
@@ -1809,7 +1809,7 @@ func mrRail(p MRPage) templ.Component {
18091809 var templ_7745c5c3_Var91 string
18101810 templ_7745c5c3_Var91, templ_7745c5c3_Err = templ.JoinStringErrs(" · ")
18111811 if templ_7745c5c3_Err != nil {
1812- return templ.Error{Err: templ_7745c5c3_Err, FileName: `internal/adapters/web/mr.templ`, Line: 318, Col: 15}
1812+ return templ.Error{Err: templ_7745c5c3_Err, FileName: `internal/adapters/web/mr.templ`, Line: 323, Col: 15}
18131813 }
18141814 _, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(templ.EscapeString(templ_7745c5c3_Var91))
18151815 if templ_7745c5c3_Err != nil {
@@ -1822,7 +1822,7 @@ func mrRail(p MRPage) templ.Component {
18221822 var templ_7745c5c3_Var92 string
18231823 templ_7745c5c3_Var92, templ_7745c5c3_Err = templ.ResolveAttributeValue(c.WhenAt)
18241824 if templ_7745c5c3_Err != nil {
1825- return templ.Error{Err: templ_7745c5c3_Err, FileName: `internal/adapters/web/mr.templ`, Line: 318, Col: 42}
1825+ return templ.Error{Err: templ_7745c5c3_Err, FileName: `internal/adapters/web/mr.templ`, Line: 323, Col: 42}
18261826 }
18271827 _, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(templ_7745c5c3_Var92)
18281828 if templ_7745c5c3_Err != nil {
@@ -1835,7 +1835,7 @@ func mrRail(p MRPage) templ.Component {
18351835 var templ_7745c5c3_Var93 string
18361836 templ_7745c5c3_Var93, templ_7745c5c3_Err = templ.JoinStringErrs(c.When)
18371837 if templ_7745c5c3_Err != nil {
1838- return templ.Error{Err: templ_7745c5c3_Err, FileName: `internal/adapters/web/mr.templ`, Line: 318, Col: 53}
1838+ return templ.Error{Err: templ_7745c5c3_Err, FileName: `internal/adapters/web/mr.templ`, Line: 323, Col: 53}
18391839 }
18401840 _, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(templ.EscapeString(templ_7745c5c3_Var93))
18411841 if templ_7745c5c3_Err != nil {
@@ -1850,7 +1850,7 @@ func mrRail(p MRPage) templ.Component {
18501850 var templ_7745c5c3_Var94 string
18511851 templ_7745c5c3_Var94, templ_7745c5c3_Err = templ.JoinStringErrs(" · new")
18521852 if templ_7745c5c3_Err != nil {
1853- return templ.Error{Err: templ_7745c5c3_Err, FileName: `internal/adapters/web/mr.templ`, Line: 321, Col: 18}
1853+ return templ.Error{Err: templ_7745c5c3_Err, FileName: `internal/adapters/web/mr.templ`, Line: 326, Col: 18}
18541854 }
18551855 _, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(templ.EscapeString(templ_7745c5c3_Var94))
18561856 if templ_7745c5c3_Err != nil {
@@ -1880,7 +1880,7 @@ func mrRail(p MRPage) templ.Component {
18801880 var templ_7745c5c3_Var95 string
18811881 templ_7745c5c3_Var95, templ_7745c5c3_Err = templ.JoinStringErrs(p.CommitsNote)
18821882 if templ_7745c5c3_Err != nil {
1883- return templ.Error{Err: templ_7745c5c3_Err, FileName: `internal/adapters/web/mr.templ`, Line: 331, Col: 34}
1883+ return templ.Error{Err: templ_7745c5c3_Err, FileName: `internal/adapters/web/mr.templ`, Line: 336, Col: 34}
18841884 }
18851885 _, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(templ.EscapeString(templ_7745c5c3_Var95))
18861886 if templ_7745c5c3_Err != nil {
@@ -1898,7 +1898,7 @@ func mrRail(p MRPage) templ.Component {
18981898 var templ_7745c5c3_Var96 string
18991899 templ_7745c5c3_Var96, templ_7745c5c3_Err = templ.JoinStringErrs(strings.Join(p.Modes, ", "))
19001900 if templ_7745c5c3_Err != nil {
1901- return templ.Error{Err: templ_7745c5c3_Err, FileName: `internal/adapters/web/mr.templ`, Line: 338, Col: 36}
1901+ return templ.Error{Err: templ_7745c5c3_Err, FileName: `internal/adapters/web/mr.templ`, Line: 343, Col: 36}
19021902 }
19031903 _, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(templ.EscapeString(templ_7745c5c3_Var96))
19041904 if templ_7745c5c3_Err != nil {
@@ -1959,7 +1959,7 @@ func mrBar(p MRPage) templ.Component {
19591959 var templ_7745c5c3_Var98 string
19601960 templ_7745c5c3_Var98, templ_7745c5c3_Err = templ.JoinStringErrs(plural(p.NFiles, "file", "files"))
19611961 if templ_7745c5c3_Err != nil {
1962- return templ.Error{Err: templ_7745c5c3_Err, FileName: `internal/adapters/web/mr.templ`, Line: 357, Col: 55}
1962+ return templ.Error{Err: templ_7745c5c3_Err, FileName: `internal/adapters/web/mr.templ`, Line: 362, Col: 55}
19631963 }
19641964 _, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(templ.EscapeString(templ_7745c5c3_Var98))
19651965 if templ_7745c5c3_Err != nil {
@@ -1972,7 +1972,7 @@ func mrBar(p MRPage) templ.Component {
19721972 var templ_7745c5c3_Var99 string
19731973 templ_7745c5c3_Var99, templ_7745c5c3_Err = templ.JoinStringErrs(itoa(p.Adds))
19741974 if templ_7745c5c3_Err != nil {
1975- return templ.Error{Err: templ_7745c5c3_Err, FileName: `internal/adapters/web/mr.templ`, Line: 357, Col: 95}
1975+ return templ.Error{Err: templ_7745c5c3_Err, FileName: `internal/adapters/web/mr.templ`, Line: 362, Col: 95}
19761976 }
19771977 _, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(templ.EscapeString(templ_7745c5c3_Var99))
19781978 if templ_7745c5c3_Err != nil {
@@ -1985,7 +1985,7 @@ func mrBar(p MRPage) templ.Component {
19851985 var templ_7745c5c3_Var100 string
19861986 templ_7745c5c3_Var100, templ_7745c5c3_Err = templ.JoinStringErrs(itoa(p.Dels))
19871987 if templ_7745c5c3_Err != nil {
1988- return templ.Error{Err: templ_7745c5c3_Err, FileName: `internal/adapters/web/mr.templ`, Line: 357, Col: 140}
1988+ return templ.Error{Err: templ_7745c5c3_Err, FileName: `internal/adapters/web/mr.templ`, Line: 362, Col: 140}
19891989 }
19901990 _, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(templ.EscapeString(templ_7745c5c3_Var100))
19911991 if templ_7745c5c3_Err != nil {
@@ -2089,7 +2089,7 @@ func mergeMenu(p MRPage) templ.Component {
20892089 var templ_7745c5c3_Var102 string
20902090 templ_7745c5c3_Var102, templ_7745c5c3_Err = templ.JoinStringErrs(p.HeadShort)
20912091 if templ_7745c5c3_Err != nil {
2092- return templ.Error{Err: templ_7745c5c3_Err, FileName: `internal/adapters/web/mr.templ`, Line: 390, Col: 19}
2092+ return templ.Error{Err: templ_7745c5c3_Err, FileName: `internal/adapters/web/mr.templ`, Line: 395, Col: 19}
20932093 }
20942094 _, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(templ.EscapeString(templ_7745c5c3_Var102))
20952095 if templ_7745c5c3_Err != nil {
@@ -2103,7 +2103,7 @@ func mergeMenu(p MRPage) templ.Component {
21032103 var templ_7745c5c3_Var103 string
21042104 templ_7745c5c3_Var103, templ_7745c5c3_Err = templ.JoinStringErrs(p.Target)
21052105 if templ_7745c5c3_Err != nil {
2106- return templ.Error{Err: templ_7745c5c3_Err, FileName: `internal/adapters/web/mr.templ`, Line: 394, Col: 18}
2106+ return templ.Error{Err: templ_7745c5c3_Err, FileName: `internal/adapters/web/mr.templ`, Line: 399, Col: 18}
21072107 }
21082108 _, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(templ.EscapeString(templ_7745c5c3_Var103))
21092109 if templ_7745c5c3_Err != nil {
@@ -2121,7 +2121,7 @@ func mergeMenu(p MRPage) templ.Component {
21212121 var templ_7745c5c3_Var104 templ.SafeURL
21222122 templ_7745c5c3_Var104, templ_7745c5c3_Err = templ.JoinURLErrs(templ.SafeURL(p.Box.ReadyAction))
21232123 if templ_7745c5c3_Err != nil {
2124- return templ.Error{Err: templ_7745c5c3_Err, FileName: `internal/adapters/web/mr.templ`, Line: 398, Col: 80}
2124+ return templ.Error{Err: templ_7745c5c3_Err, FileName: `internal/adapters/web/mr.templ`, Line: 403, Col: 80}
21252125 }
21262126 _, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(templ.EscapeString(templ_7745c5c3_Var104))
21272127 if templ_7745c5c3_Err != nil {
@@ -2139,7 +2139,7 @@ func mergeMenu(p MRPage) templ.Component {
21392139 var templ_7745c5c3_Var105 templ.SafeURL
21402140 templ_7745c5c3_Var105, templ_7745c5c3_Err = templ.JoinURLErrs(templ.SafeURL(p.Box.MergeAction))
21412141 if templ_7745c5c3_Err != nil {
2142- return templ.Error{Err: templ_7745c5c3_Err, FileName: `internal/adapters/web/mr.templ`, Line: 402, Col: 80}
2142+ return templ.Error{Err: templ_7745c5c3_Err, FileName: `internal/adapters/web/mr.templ`, Line: 407, Col: 80}
21432143 }
21442144 _, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(templ.EscapeString(templ_7745c5c3_Var105))
21452145 if templ_7745c5c3_Err != nil {
@@ -2152,7 +2152,7 @@ func mergeMenu(p MRPage) templ.Component {
21522152 var templ_7745c5c3_Var106 string
21532153 templ_7745c5c3_Var106, templ_7745c5c3_Err = templ.ResolveAttributeValue(p.Box.Head)
21542154 if templ_7745c5c3_Err != nil {
2155- return templ.Error{Err: templ_7745c5c3_Err, FileName: `internal/adapters/web/mr.templ`, Line: 403, Col: 59}
2155+ return templ.Error{Err: templ_7745c5c3_Err, FileName: `internal/adapters/web/mr.templ`, Line: 408, Col: 59}
21562156 }
21572157 _, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(templ_7745c5c3_Var106)
21582158 if templ_7745c5c3_Err != nil {
@@ -2170,7 +2170,7 @@ func mergeMenu(p MRPage) templ.Component {
21702170 var templ_7745c5c3_Var107 string
21712171 templ_7745c5c3_Var107, templ_7745c5c3_Err = templ.ResolveAttributeValue(m.Value)
21722172 if templ_7745c5c3_Err != nil {
2173- return templ.Error{Err: templ_7745c5c3_Err, FileName: `internal/adapters/web/mr.templ`, Line: 408, Col: 55}
2173+ return templ.Error{Err: templ_7745c5c3_Err, FileName: `internal/adapters/web/mr.templ`, Line: 413, Col: 55}
21742174 }
21752175 _, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(templ_7745c5c3_Var107)
21762176 if templ_7745c5c3_Err != nil {
@@ -2193,7 +2193,7 @@ func mergeMenu(p MRPage) templ.Component {
21932193 var templ_7745c5c3_Var108 string
21942194 templ_7745c5c3_Var108, templ_7745c5c3_Err = templ.JoinStringErrs(m.Label)
21952195 if templ_7745c5c3_Err != nil {
2196- return templ.Error{Err: templ_7745c5c3_Err, FileName: `internal/adapters/web/mr.templ`, Line: 409, Col: 17}
2196+ return templ.Error{Err: templ_7745c5c3_Err, FileName: `internal/adapters/web/mr.templ`, Line: 414, Col: 17}
21972197 }
21982198 _, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(templ.EscapeString(templ_7745c5c3_Var108))
21992199 if templ_7745c5c3_Err != nil {
@@ -2211,7 +2211,7 @@ func mergeMenu(p MRPage) templ.Component {
22112211 var templ_7745c5c3_Var109 string
22122212 templ_7745c5c3_Var109, templ_7745c5c3_Err = templ.JoinStringErrs(itoa(i + 1))
22132213 if templ_7745c5c3_Err != nil {
2214- return templ.Error{Err: templ_7745c5c3_Err, FileName: `internal/adapters/web/mr.templ`, Line: 411, Col: 46}
2214+ return templ.Error{Err: templ_7745c5c3_Err, FileName: `internal/adapters/web/mr.templ`, Line: 416, Col: 46}
22152215 }
22162216 _, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(templ.EscapeString(templ_7745c5c3_Var109))
22172217 if templ_7745c5c3_Err != nil {
@@ -2239,7 +2239,7 @@ func mergeMenu(p MRPage) templ.Component {
22392239 var templ_7745c5c3_Var110 string
22402240 templ_7745c5c3_Var110, templ_7745c5c3_Err = templ.JoinStringErrs(p.Source)
22412241 if templ_7745c5c3_Err != nil {
2242- return templ.Error{Err: templ_7745c5c3_Err, FileName: `internal/adapters/web/mr.templ`, Line: 417, Col: 102}
2242+ return templ.Error{Err: templ_7745c5c3_Err, FileName: `internal/adapters/web/mr.templ`, Line: 422, Col: 102}
22432243 }
22442244 _, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(templ.EscapeString(templ_7745c5c3_Var110))
22452245 if templ_7745c5c3_Err != nil {
@@ -2257,7 +2257,7 @@ func mergeMenu(p MRPage) templ.Component {
22572257 var templ_7745c5c3_Var111 string
22582258 templ_7745c5c3_Var111, templ_7745c5c3_Err = templ.JoinStringErrs(p.Target)
22592259 if templ_7745c5c3_Err != nil {
2260- return templ.Error{Err: templ_7745c5c3_Err, FileName: `internal/adapters/web/mr.templ`, Line: 420, Col: 82}
2260+ return templ.Error{Err: templ_7745c5c3_Err, FileName: `internal/adapters/web/mr.templ`, Line: 425, Col: 82}
22612261 }
22622262 _, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(templ.EscapeString(templ_7745c5c3_Var111))
22632263 if templ_7745c5c3_Err != nil {
@@ -2311,7 +2311,7 @@ func moreMenu(p MRPage) templ.Component {
23112311 var templ_7745c5c3_Var113 templ.SafeURL
23122312 templ_7745c5c3_Var113, templ_7745c5c3_Err = templ.JoinURLErrs(templ.SafeURL(p.Box.ReadAction))
23132313 if templ_7745c5c3_Err != nil {
2314- return templ.Error{Err: templ_7745c5c3_Err, FileName: `internal/adapters/web/mr.templ`, Line: 435, Col: 64}
2314+ return templ.Error{Err: templ_7745c5c3_Err, FileName: `internal/adapters/web/mr.templ`, Line: 440, Col: 64}
23152315 }
23162316 _, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(templ.EscapeString(templ_7745c5c3_Var113))
23172317 if templ_7745c5c3_Err != nil {
@@ -2324,7 +2324,7 @@ func moreMenu(p MRPage) templ.Component {
23242324 var templ_7745c5c3_Var114 string
23252325 templ_7745c5c3_Var114, templ_7745c5c3_Err = templ.ResolveAttributeValue(p.Box.Head)
23262326 if templ_7745c5c3_Err != nil {
2327- return templ.Error{Err: templ_7745c5c3_Err, FileName: `internal/adapters/web/mr.templ`, Line: 436, Col: 59}
2327+ return templ.Error{Err: templ_7745c5c3_Err, FileName: `internal/adapters/web/mr.templ`, Line: 441, Col: 59}
23282328 }
23292329 _, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(templ_7745c5c3_Var114)
23302330 if templ_7745c5c3_Err != nil {
@@ -2342,7 +2342,7 @@ func moreMenu(p MRPage) templ.Component {
23422342 var templ_7745c5c3_Var115 templ.SafeURL
23432343 templ_7745c5c3_Var115, templ_7745c5c3_Err = templ.JoinURLErrs(templ.SafeURL(p.Box.CloseAction))
23442344 if templ_7745c5c3_Err != nil {
2345- return templ.Error{Err: templ_7745c5c3_Err, FileName: `internal/adapters/web/mr.templ`, Line: 440, Col: 64}
2345+ return templ.Error{Err: templ_7745c5c3_Err, FileName: `internal/adapters/web/mr.templ`, Line: 445, Col: 64}
23462346 }
23472347 _, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(templ.EscapeString(templ_7745c5c3_Var115))
23482348 if templ_7745c5c3_Err != nil {
@@ -2414,7 +2414,7 @@ func Compare(l Layout, p ComparePage) templ.Component {
24142414 var templ_7745c5c3_Var118 string
24152415 templ_7745c5c3_Var118, templ_7745c5c3_Err = templ.JoinStringErrs(p.Source)
24162416 if templ_7745c5c3_Err != nil {
2417- return templ.Error{Err: templ_7745c5c3_Err, FileName: `internal/adapters/web/mr.templ`, Line: 456, Col: 17}
2417+ return templ.Error{Err: templ_7745c5c3_Err, FileName: `internal/adapters/web/mr.templ`, Line: 461, Col: 17}
24182418 }
24192419 _, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(templ.EscapeString(templ_7745c5c3_Var118))
24202420 if templ_7745c5c3_Err != nil {
@@ -2427,7 +2427,7 @@ func Compare(l Layout, p ComparePage) templ.Component {
24272427 var templ_7745c5c3_Var119 string
24282428 templ_7745c5c3_Var119, templ_7745c5c3_Err = templ.JoinStringErrs(p.Target)
24292429 if templ_7745c5c3_Err != nil {
2430- return templ.Error{Err: templ_7745c5c3_Err, FileName: `internal/adapters/web/mr.templ`, Line: 456, Col: 34}
2430+ return templ.Error{Err: templ_7745c5c3_Err, FileName: `internal/adapters/web/mr.templ`, Line: 461, Col: 34}
24312431 }
24322432 _, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(templ.EscapeString(templ_7745c5c3_Var119))
24332433 if templ_7745c5c3_Err != nil {
@@ -2440,7 +2440,7 @@ func Compare(l Layout, p ComparePage) templ.Component {
24402440 var templ_7745c5c3_Var120 templ.SafeURL
24412441 templ_7745c5c3_Var120, templ_7745c5c3_Err = templ.JoinURLErrs(templ.SafeURL(p.SourceHref))
24422442 if templ_7745c5c3_Err != nil {
2443- return templ.Error{Err: templ_7745c5c3_Err, FileName: `internal/adapters/web/mr.templ`, Line: 459, Col: 45}
2443+ return templ.Error{Err: templ_7745c5c3_Err, FileName: `internal/adapters/web/mr.templ`, Line: 464, Col: 45}
24442444 }
24452445 _, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(templ.EscapeString(templ_7745c5c3_Var120))
24462446 if templ_7745c5c3_Err != nil {
@@ -2453,7 +2453,7 @@ func Compare(l Layout, p ComparePage) templ.Component {
24532453 var templ_7745c5c3_Var121 string
24542454 templ_7745c5c3_Var121, templ_7745c5c3_Err = templ.JoinStringErrs(p.Source)
24552455 if templ_7745c5c3_Err != nil {
2456- return templ.Error{Err: templ_7745c5c3_Err, FileName: `internal/adapters/web/mr.templ`, Line: 459, Col: 58}
2456+ return templ.Error{Err: templ_7745c5c3_Err, FileName: `internal/adapters/web/mr.templ`, Line: 464, Col: 58}
24572457 }
24582458 _, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(templ.EscapeString(templ_7745c5c3_Var121))
24592459 if templ_7745c5c3_Err != nil {
@@ -2466,7 +2466,7 @@ func Compare(l Layout, p ComparePage) templ.Component {
24662466 var templ_7745c5c3_Var122 templ.SafeURL
24672467 templ_7745c5c3_Var122, templ_7745c5c3_Err = templ.JoinURLErrs(templ.SafeURL(p.TargetHref))
24682468 if templ_7745c5c3_Err != nil {
2469- return templ.Error{Err: templ_7745c5c3_Err, FileName: `internal/adapters/web/mr.templ`, Line: 461, Col: 45}
2469+ return templ.Error{Err: templ_7745c5c3_Err, FileName: `internal/adapters/web/mr.templ`, Line: 466, Col: 45}
24702470 }
24712471 _, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(templ.EscapeString(templ_7745c5c3_Var122))
24722472 if templ_7745c5c3_Err != nil {
@@ -2479,7 +2479,7 @@ func Compare(l Layout, p ComparePage) templ.Component {
24792479 var templ_7745c5c3_Var123 string
24802480 templ_7745c5c3_Var123, templ_7745c5c3_Err = templ.JoinStringErrs(p.Target)
24812481 if templ_7745c5c3_Err != nil {
2482- return templ.Error{Err: templ_7745c5c3_Err, FileName: `internal/adapters/web/mr.templ`, Line: 461, Col: 58}
2482+ return templ.Error{Err: templ_7745c5c3_Err, FileName: `internal/adapters/web/mr.templ`, Line: 466, Col: 58}
24832483 }
24842484 _, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(templ.EscapeString(templ_7745c5c3_Var123))
24852485 if templ_7745c5c3_Err != nil {
@@ -2492,7 +2492,7 @@ func Compare(l Layout, p ComparePage) templ.Component {
24922492 var templ_7745c5c3_Var124 string
24932493 templ_7745c5c3_Var124, templ_7745c5c3_Err = templ.JoinStringErrs(p.AheadText)
24942494 if templ_7745c5c3_Err != nil {
2495- return templ.Error{Err: templ_7745c5c3_Err, FileName: `internal/adapters/web/mr.templ`, Line: 463, Col: 21}
2495+ return templ.Error{Err: templ_7745c5c3_Err, FileName: `internal/adapters/web/mr.templ`, Line: 468, Col: 21}
24962496 }
24972497 _, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(templ.EscapeString(templ_7745c5c3_Var124))
24982498 if templ_7745c5c3_Err != nil {
@@ -2510,7 +2510,7 @@ func Compare(l Layout, p ComparePage) templ.Component {
25102510 var templ_7745c5c3_Var125 string
25112511 templ_7745c5c3_Var125, templ_7745c5c3_Err = templ.JoinStringErrs(p.Note)
25122512 if templ_7745c5c3_Err != nil {
2513- return templ.Error{Err: templ_7745c5c3_Err, FileName: `internal/adapters/web/mr.templ`, Line: 467, Col: 29}
2513+ return templ.Error{Err: templ_7745c5c3_Err, FileName: `internal/adapters/web/mr.templ`, Line: 472, Col: 29}
25142514 }
25152515 _, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(templ.EscapeString(templ_7745c5c3_Var125))
25162516 if templ_7745c5c3_Err != nil {
@@ -2533,7 +2533,7 @@ func Compare(l Layout, p ComparePage) templ.Component {
25332533 var templ_7745c5c3_Var126 templ.SafeURL
25342534 templ_7745c5c3_Var126, templ_7745c5c3_Err = templ.JoinURLErrs(templ.SafeURL(p.Existing.Href))
25352535 if templ_7745c5c3_Err != nil {
2536- return templ.Error{Err: templ_7745c5c3_Err, FileName: `internal/adapters/web/mr.templ`, Line: 470, Col: 114}
2536+ return templ.Error{Err: templ_7745c5c3_Err, FileName: `internal/adapters/web/mr.templ`, Line: 475, Col: 114}
25372537 }
25382538 _, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(templ.EscapeString(templ_7745c5c3_Var126))
25392539 if templ_7745c5c3_Err != nil {
@@ -2546,7 +2546,7 @@ func Compare(l Layout, p ComparePage) templ.Component {
25462546 var templ_7745c5c3_Var127 string
25472547 templ_7745c5c3_Var127, templ_7745c5c3_Err = templ.JoinStringErrs(p.Existing.Label)
25482548 if templ_7745c5c3_Err != nil {
2549- return templ.Error{Err: templ_7745c5c3_Err, FileName: `internal/adapters/web/mr.templ`, Line: 470, Col: 135}
2549+ return templ.Error{Err: templ_7745c5c3_Err, FileName: `internal/adapters/web/mr.templ`, Line: 475, Col: 135}
25502550 }
25512551 _, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(templ.EscapeString(templ_7745c5c3_Var127))
25522552 if templ_7745c5c3_Err != nil {
@@ -2569,7 +2569,7 @@ func Compare(l Layout, p ComparePage) templ.Component {
25692569 var templ_7745c5c3_Var128 templ.SafeURL
25702570 templ_7745c5c3_Var128, templ_7745c5c3_Err = templ.JoinURLErrs(templ.SafeURL(p.Create.Action))
25712571 if templ_7745c5c3_Err != nil {
2572- return templ.Error{Err: templ_7745c5c3_Err, FileName: `internal/adapters/web/mr.templ`, Line: 473, Col: 83}
2572+ return templ.Error{Err: templ_7745c5c3_Err, FileName: `internal/adapters/web/mr.templ`, Line: 478, Col: 83}
25732573 }
25742574 _, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(templ.EscapeString(templ_7745c5c3_Var128))
25752575 if templ_7745c5c3_Err != nil {
@@ -2582,7 +2582,7 @@ func Compare(l Layout, p ComparePage) templ.Component {
25822582 var templ_7745c5c3_Var129 string
25832583 templ_7745c5c3_Var129, templ_7745c5c3_Err = templ.ResolveAttributeValue(p.Create.Source)
25842584 if templ_7745c5c3_Err != nil {
2585- return templ.Error{Err: templ_7745c5c3_Err, FileName: `internal/adapters/web/mr.templ`, Line: 474, Col: 62}
2585+ return templ.Error{Err: templ_7745c5c3_Err, FileName: `internal/adapters/web/mr.templ`, Line: 479, Col: 62}
25862586 }
25872587 _, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(templ_7745c5c3_Var129)
25882588 if templ_7745c5c3_Err != nil {
@@ -2595,7 +2595,7 @@ func Compare(l Layout, p ComparePage) templ.Component {
25952595 var templ_7745c5c3_Var130 string
25962596 templ_7745c5c3_Var130, templ_7745c5c3_Err = templ.ResolveAttributeValue(p.Create.Target)
25972597 if templ_7745c5c3_Err != nil {
2598- return templ.Error{Err: templ_7745c5c3_Err, FileName: `internal/adapters/web/mr.templ`, Line: 475, Col: 62}
2598+ return templ.Error{Err: templ_7745c5c3_Err, FileName: `internal/adapters/web/mr.templ`, Line: 480, Col: 62}
25992599 }
26002600 _, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(templ_7745c5c3_Var130)
26012601 if templ_7745c5c3_Err != nil {
@@ -2608,7 +2608,7 @@ func Compare(l Layout, p ComparePage) templ.Component {
26082608 var templ_7745c5c3_Var131 string
26092609 templ_7745c5c3_Var131, templ_7745c5c3_Err = templ.ResolveAttributeValue(p.Create.Title)
26102610 if templ_7745c5c3_Err != nil {
2611- return templ.Error{Err: templ_7745c5c3_Err, FileName: `internal/adapters/web/mr.templ`, Line: 477, Col: 97}
2611+ return templ.Error{Err: templ_7745c5c3_Err, FileName: `internal/adapters/web/mr.templ`, Line: 482, Col: 97}
26122612 }
26132613 _, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(templ_7745c5c3_Var131)
26142614 if templ_7745c5c3_Err != nil {
@@ -2631,7 +2631,7 @@ func Compare(l Layout, p ComparePage) templ.Component {
26312631 var templ_7745c5c3_Var132 string
26322632 templ_7745c5c3_Var132, templ_7745c5c3_Err = templ.JoinStringErrs(plural(p.NFiles, "file", "files"))
26332633 if templ_7745c5c3_Err != nil {
2634- return templ.Error{Err: templ_7745c5c3_Err, FileName: `internal/adapters/web/mr.templ`, Line: 487, Col: 57}
2634+ return templ.Error{Err: templ_7745c5c3_Err, FileName: `internal/adapters/web/mr.templ`, Line: 492, Col: 57}
26352635 }
26362636 _, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(templ.EscapeString(templ_7745c5c3_Var132))
26372637 if templ_7745c5c3_Err != nil {
@@ -2644,7 +2644,7 @@ func Compare(l Layout, p ComparePage) templ.Component {
26442644 var templ_7745c5c3_Var133 string
26452645 templ_7745c5c3_Var133, templ_7745c5c3_Err = templ.JoinStringErrs(itoa(p.Adds))
26462646 if templ_7745c5c3_Err != nil {
2647- return templ.Error{Err: templ_7745c5c3_Err, FileName: `internal/adapters/web/mr.templ`, Line: 487, Col: 97}
2647+ return templ.Error{Err: templ_7745c5c3_Err, FileName: `internal/adapters/web/mr.templ`, Line: 492, Col: 97}
26482648 }
26492649 _, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(templ.EscapeString(templ_7745c5c3_Var133))
26502650 if templ_7745c5c3_Err != nil {
@@ -2657,7 +2657,7 @@ func Compare(l Layout, p ComparePage) templ.Component {
26572657 var templ_7745c5c3_Var134 string
26582658 templ_7745c5c3_Var134, templ_7745c5c3_Err = templ.JoinStringErrs(itoa(p.Dels))
26592659 if templ_7745c5c3_Err != nil {
2660- return templ.Error{Err: templ_7745c5c3_Err, FileName: `internal/adapters/web/mr.templ`, Line: 487, Col: 142}
2660+ return templ.Error{Err: templ_7745c5c3_Err, FileName: `internal/adapters/web/mr.templ`, Line: 492, Col: 142}
26612661 }
26622662 _, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(templ.EscapeString(templ_7745c5c3_Var134))
26632663 if templ_7745c5c3_Err != nil {
@@ -2701,7 +2701,7 @@ func Compare(l Layout, p ComparePage) templ.Component {
27012701 var templ_7745c5c3_Var135 string
27022702 templ_7745c5c3_Var135, templ_7745c5c3_Err = templ.ResolveAttributeValue(p.View)
27032703 if templ_7745c5c3_Err != nil {
2704- return templ.Error{Err: templ_7745c5c3_Err, FileName: `internal/adapters/web/mr.templ`, Line: 502, Col: 23}
2704+ return templ.Error{Err: templ_7745c5c3_Err, FileName: `internal/adapters/web/mr.templ`, Line: 507, Col: 23}
27052705 }
27062706 _, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(templ_7745c5c3_Var135)
27072707 if templ_7745c5c3_Err != nil {
@@ -2719,7 +2719,7 @@ func Compare(l Layout, p ComparePage) templ.Component {
27192719 var templ_7745c5c3_Var136 string
27202720 templ_7745c5c3_Var136, templ_7745c5c3_Err = templ.ResolveAttributeValue(p.View)
27212721 if templ_7745c5c3_Err != nil {
2722- return templ.Error{Err: templ_7745c5c3_Err, FileName: `internal/adapters/web/mr.templ`, Line: 504, Col: 23}
2722+ return templ.Error{Err: templ_7745c5c3_Err, FileName: `internal/adapters/web/mr.templ`, Line: 509, Col: 23}
27232723 }
27242724 _, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(templ_7745c5c3_Var136)
27252725 if templ_7745c5c3_Err != nil {
@@ -2789,7 +2789,7 @@ func compareRail(p ComparePage) templ.Component {
27892789 var templ_7745c5c3_Var138 string
27902790 templ_7745c5c3_Var138, templ_7745c5c3_Err = templ.JoinStringErrs(itoa(len(p.Ahead)))
27912791 if templ_7745c5c3_Err != nil {
2792- return templ.Error{Err: templ_7745c5c3_Err, FileName: `internal/adapters/web/mr.templ`, Line: 520, Col: 67}
2792+ return templ.Error{Err: templ_7745c5c3_Err, FileName: `internal/adapters/web/mr.templ`, Line: 525, Col: 67}
27932793 }
27942794 _, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(templ.EscapeString(templ_7745c5c3_Var138))
27952795 if templ_7745c5c3_Err != nil {
@@ -2807,7 +2807,7 @@ func compareRail(p ComparePage) templ.Component {
28072807 var templ_7745c5c3_Var139 templ.SafeURL
28082808 templ_7745c5c3_Var139, templ_7745c5c3_Err = templ.JoinURLErrs(templ.SafeURL(c.CHref))
28092809 if templ_7745c5c3_Err != nil {
2810- return templ.Error{Err: templ_7745c5c3_Err, FileName: `internal/adapters/web/mr.templ`, Line: 524, Col: 37}
2810+ return templ.Error{Err: templ_7745c5c3_Err, FileName: `internal/adapters/web/mr.templ`, Line: 529, Col: 37}
28112811 }
28122812 _, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(templ.EscapeString(templ_7745c5c3_Var139))
28132813 if templ_7745c5c3_Err != nil {
@@ -2820,7 +2820,7 @@ func compareRail(p ComparePage) templ.Component {
28202820 var templ_7745c5c3_Var140 string
28212821 templ_7745c5c3_Var140, templ_7745c5c3_Err = templ.JoinStringErrs(c.Short)
28222822 if templ_7745c5c3_Err != nil {
2823- return templ.Error{Err: templ_7745c5c3_Err, FileName: `internal/adapters/web/mr.templ`, Line: 524, Col: 49}
2823+ return templ.Error{Err: templ_7745c5c3_Err, FileName: `internal/adapters/web/mr.templ`, Line: 529, Col: 49}
28242824 }
28252825 _, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(templ.EscapeString(templ_7745c5c3_Var140))
28262826 if templ_7745c5c3_Err != nil {
@@ -2833,7 +2833,7 @@ func compareRail(p ComparePage) templ.Component {
28332833 var templ_7745c5c3_Var141 string
28342834 templ_7745c5c3_Var141, templ_7745c5c3_Err = templ.JoinStringErrs(c.Subject)
28352835 if templ_7745c5c3_Err != nil {
2836- return templ.Error{Err: templ_7745c5c3_Err, FileName: `internal/adapters/web/mr.templ`, Line: 525, Col: 32}
2836+ return templ.Error{Err: templ_7745c5c3_Err, FileName: `internal/adapters/web/mr.templ`, Line: 530, Col: 32}
28372837 }
28382838 _, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(templ.EscapeString(templ_7745c5c3_Var141))
28392839 if templ_7745c5c3_Err != nil {
@@ -2846,7 +2846,7 @@ func compareRail(p ComparePage) templ.Component {
28462846 var templ_7745c5c3_Var142 string
28472847 templ_7745c5c3_Var142, templ_7745c5c3_Err = templ.JoinStringErrs(c.Author)
28482848 if templ_7745c5c3_Err != nil {
2849- return templ.Error{Err: templ_7745c5c3_Err, FileName: `internal/adapters/web/mr.templ`, Line: 527, Col: 16}
2849+ return templ.Error{Err: templ_7745c5c3_Err, FileName: `internal/adapters/web/mr.templ`, Line: 532, Col: 16}
28502850 }
28512851 _, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(templ.EscapeString(templ_7745c5c3_Var142))
28522852 if templ_7745c5c3_Err != nil {
@@ -2860,7 +2860,7 @@ func compareRail(p ComparePage) templ.Component {
28602860 var templ_7745c5c3_Var143 string
28612861 templ_7745c5c3_Var143, templ_7745c5c3_Err = templ.JoinStringErrs(" · ")
28622862 if templ_7745c5c3_Err != nil {
2863- return templ.Error{Err: templ_7745c5c3_Err, FileName: `internal/adapters/web/mr.templ`, Line: 529, Col: 15}
2863+ return templ.Error{Err: templ_7745c5c3_Err, FileName: `internal/adapters/web/mr.templ`, Line: 534, Col: 15}
28642864 }
28652865 _, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(templ.EscapeString(templ_7745c5c3_Var143))
28662866 if templ_7745c5c3_Err != nil {
@@ -2873,7 +2873,7 @@ func compareRail(p ComparePage) templ.Component {
28732873 var templ_7745c5c3_Var144 string
28742874 templ_7745c5c3_Var144, templ_7745c5c3_Err = templ.ResolveAttributeValue(c.WhenAt)
28752875 if templ_7745c5c3_Err != nil {
2876- return templ.Error{Err: templ_7745c5c3_Err, FileName: `internal/adapters/web/mr.templ`, Line: 529, Col: 42}
2876+ return templ.Error{Err: templ_7745c5c3_Err, FileName: `internal/adapters/web/mr.templ`, Line: 534, Col: 42}
28772877 }
28782878 _, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(templ_7745c5c3_Var144)
28792879 if templ_7745c5c3_Err != nil {
@@ -2886,7 +2886,7 @@ func compareRail(p ComparePage) templ.Component {
28862886 var templ_7745c5c3_Var145 string
28872887 templ_7745c5c3_Var145, templ_7745c5c3_Err = templ.JoinStringErrs(c.When)
28882888 if templ_7745c5c3_Err != nil {
2889- return templ.Error{Err: templ_7745c5c3_Err, FileName: `internal/adapters/web/mr.templ`, Line: 529, Col: 53}
2889+ return templ.Error{Err: templ_7745c5c3_Err, FileName: `internal/adapters/web/mr.templ`, Line: 534, Col: 53}
28902890 }
28912891 _, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(templ.EscapeString(templ_7745c5c3_Var145))
28922892 if templ_7745c5c3_Err != nil {
@@ -2914,7 +2914,7 @@ func compareRail(p ComparePage) templ.Component {
29142914 var templ_7745c5c3_Var146 string
29152915 templ_7745c5c3_Var146, templ_7745c5c3_Err = templ.JoinStringErrs(p.Target)
29162916 if templ_7745c5c3_Err != nil {
2917- return templ.Error{Err: templ_7745c5c3_Err, FileName: `internal/adapters/web/mr.templ`, Line: 536, Col: 47}
2917+ return templ.Error{Err: templ_7745c5c3_Err, FileName: `internal/adapters/web/mr.templ`, Line: 541, Col: 47}
29182918 }
29192919 _, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(templ.EscapeString(templ_7745c5c3_Var146))
29202920 if templ_7745c5c3_Err != nil {
@@ -2937,7 +2937,7 @@ func compareRail(p ComparePage) templ.Component {
29372937 var templ_7745c5c3_Var147 string
29382938 templ_7745c5c3_Var147, templ_7745c5c3_Err = templ.JoinStringErrs(itoa(len(p.Files)))
29392939 if templ_7745c5c3_Err != nil {
2940- return templ.Error{Err: templ_7745c5c3_Err, FileName: `internal/adapters/web/mr.templ`, Line: 541, Col: 66}
2940+ return templ.Error{Err: templ_7745c5c3_Err, FileName: `internal/adapters/web/mr.templ`, Line: 546, Col: 66}
29412941 }
29422942 _, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(templ.EscapeString(templ_7745c5c3_Var147))
29432943 if templ_7745c5c3_Err != nil {
@@ -1699,13 +1699,13 @@ func mrRail(p MRPage) templ.Component {
1699 var templ_7745c5c3_Var85 string1699 var templ_7745c5c3_Var85 string
1700 templ_7745c5c3_Var85, templ_7745c5c3_Err = templ.JoinStringErrs(itoa(len(p.Files)))1700 templ_7745c5c3_Var85, templ_7745c5c3_Err = templ.JoinStringErrs(itoa(len(p.Files)))
1701 if templ_7745c5c3_Err != nil {1701 if templ_7745c5c3_Err != nil {
1702- return templ.Error{Err: templ_7745c5c3_Err, FileName: `internal/adapters/web/mr.templ`, Line: 304, Col: 65}1702+ return templ.Error{Err: templ_7745c5c3_Err, FileName: `internal/adapters/web/mr.templ`, Line: 305, Col: 49}
1703 }1703 }
1704 _, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(templ.EscapeString(templ_7745c5c3_Var85))1704 _, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(templ.EscapeString(templ_7745c5c3_Var85))
1705 if templ_7745c5c3_Err != nil {1705 if templ_7745c5c3_Err != nil {
1706 return templ_7745c5c3_Err1706 return templ_7745c5c3_Err
1707 }1707 }
1708- templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 149, "</span><kbd aria-hidden=\"true\">g f</kbd></h2>")1708+ templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 149, "</span><kbd aria-hidden=\"true\">g f</kbd> <button type=\"button\" class=\"btn icon fold\" data-js aria-expanded=\"true\" title=\"fold the list of files\" hx-on:click=\"ermiteMR.foldFiles()\"><span class=\"ico i-chevron\" aria-hidden=\"true\"></span><span class=\"sr\">fold the list of files</span></button></h2>")
1709 if templ_7745c5c3_Err != nil {1709 if templ_7745c5c3_Err != nil {
1710 return templ_7745c5c3_Err1710 return templ_7745c5c3_Err
1711 }1711 }
@@ -1728,7 +1728,7 @@ func mrRail(p MRPage) templ.Component {
1728 var templ_7745c5c3_Var86 string1728 var templ_7745c5c3_Var86 string
1729 templ_7745c5c3_Var86, templ_7745c5c3_Err = templ.JoinStringErrs(itoa(len(p.Commits)))1729 templ_7745c5c3_Var86, templ_7745c5c3_Err = templ.JoinStringErrs(itoa(len(p.Commits)))
1730 if templ_7745c5c3_Err != nil {1730 if templ_7745c5c3_Err != nil {
1731- return templ.Error{Err: templ_7745c5c3_Err, FileName: `internal/adapters/web/mr.templ`, Line: 309, Col: 71}1731+ return templ.Error{Err: templ_7745c5c3_Err, FileName: `internal/adapters/web/mr.templ`, Line: 314, Col: 71}
1732 }1732 }
1733 _, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(templ.EscapeString(templ_7745c5c3_Var86))1733 _, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(templ.EscapeString(templ_7745c5c3_Var86))
1734 if templ_7745c5c3_Err != nil {1734 if templ_7745c5c3_Err != nil {
@@ -1756,7 +1756,7 @@ func mrRail(p MRPage) templ.Component {
1756 var templ_7745c5c3_Var87 templ.SafeURL1756 var templ_7745c5c3_Var87 templ.SafeURL
1757 templ_7745c5c3_Var87, templ_7745c5c3_Err = templ.JoinURLErrs(templ.SafeURL(c.Href))1757 templ_7745c5c3_Var87, templ_7745c5c3_Err = templ.JoinURLErrs(templ.SafeURL(c.Href))
1758 if templ_7745c5c3_Err != nil {1758 if templ_7745c5c3_Err != nil {
1759- return templ.Error{Err: templ_7745c5c3_Err, FileName: `internal/adapters/web/mr.templ`, Line: 313, Col: 36}1759+ return templ.Error{Err: templ_7745c5c3_Err, FileName: `internal/adapters/web/mr.templ`, Line: 318, Col: 36}
1760 }1760 }
1761 _, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(templ.EscapeString(templ_7745c5c3_Var87))1761 _, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(templ.EscapeString(templ_7745c5c3_Var87))
1762 if templ_7745c5c3_Err != nil {1762 if templ_7745c5c3_Err != nil {
@@ -1769,7 +1769,7 @@ func mrRail(p MRPage) templ.Component {
1769 var templ_7745c5c3_Var88 string1769 var templ_7745c5c3_Var88 string
1770 templ_7745c5c3_Var88, templ_7745c5c3_Err = templ.JoinStringErrs(c.Short)1770 templ_7745c5c3_Var88, templ_7745c5c3_Err = templ.JoinStringErrs(c.Short)
1771 if templ_7745c5c3_Err != nil {1771 if templ_7745c5c3_Err != nil {
1772- return templ.Error{Err: templ_7745c5c3_Err, FileName: `internal/adapters/web/mr.templ`, Line: 313, Col: 48}1772+ return templ.Error{Err: templ_7745c5c3_Err, FileName: `internal/adapters/web/mr.templ`, Line: 318, Col: 48}
1773 }1773 }
1774 _, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(templ.EscapeString(templ_7745c5c3_Var88))1774 _, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(templ.EscapeString(templ_7745c5c3_Var88))
1775 if templ_7745c5c3_Err != nil {1775 if templ_7745c5c3_Err != nil {
@@ -1782,7 +1782,7 @@ func mrRail(p MRPage) templ.Component {
1782 var templ_7745c5c3_Var89 string1782 var templ_7745c5c3_Var89 string
1783 templ_7745c5c3_Var89, templ_7745c5c3_Err = templ.JoinStringErrs(c.Subject)1783 templ_7745c5c3_Var89, templ_7745c5c3_Err = templ.JoinStringErrs(c.Subject)
1784 if templ_7745c5c3_Err != nil {1784 if templ_7745c5c3_Err != nil {
1785- return templ.Error{Err: templ_7745c5c3_Err, FileName: `internal/adapters/web/mr.templ`, Line: 314, Col: 32}1785+ return templ.Error{Err: templ_7745c5c3_Err, FileName: `internal/adapters/web/mr.templ`, Line: 319, Col: 32}
1786 }1786 }
1787 _, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(templ.EscapeString(templ_7745c5c3_Var89))1787 _, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(templ.EscapeString(templ_7745c5c3_Var89))
1788 if templ_7745c5c3_Err != nil {1788 if templ_7745c5c3_Err != nil {
@@ -1795,7 +1795,7 @@ func mrRail(p MRPage) templ.Component {
1795 var templ_7745c5c3_Var90 string1795 var templ_7745c5c3_Var90 string
1796 templ_7745c5c3_Var90, templ_7745c5c3_Err = templ.JoinStringErrs(c.Author)1796 templ_7745c5c3_Var90, templ_7745c5c3_Err = templ.JoinStringErrs(c.Author)
1797 if templ_7745c5c3_Err != nil {1797 if templ_7745c5c3_Err != nil {
1798- return templ.Error{Err: templ_7745c5c3_Err, FileName: `internal/adapters/web/mr.templ`, Line: 316, Col: 16}1798+ return templ.Error{Err: templ_7745c5c3_Err, FileName: `internal/adapters/web/mr.templ`, Line: 321, Col: 16}
1799 }1799 }
1800 _, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(templ.EscapeString(templ_7745c5c3_Var90))1800 _, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(templ.EscapeString(templ_7745c5c3_Var90))
1801 if templ_7745c5c3_Err != nil {1801 if templ_7745c5c3_Err != nil {
@@ -1809,7 +1809,7 @@ func mrRail(p MRPage) templ.Component {
1809 var templ_7745c5c3_Var91 string1809 var templ_7745c5c3_Var91 string
1810 templ_7745c5c3_Var91, templ_7745c5c3_Err = templ.JoinStringErrs(" · ")1810 templ_7745c5c3_Var91, templ_7745c5c3_Err = templ.JoinStringErrs(" · ")
1811 if templ_7745c5c3_Err != nil {1811 if templ_7745c5c3_Err != nil {
1812- return templ.Error{Err: templ_7745c5c3_Err, FileName: `internal/adapters/web/mr.templ`, Line: 318, Col: 15}1812+ return templ.Error{Err: templ_7745c5c3_Err, FileName: `internal/adapters/web/mr.templ`, Line: 323, Col: 15}
1813 }1813 }
1814 _, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(templ.EscapeString(templ_7745c5c3_Var91))1814 _, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(templ.EscapeString(templ_7745c5c3_Var91))
1815 if templ_7745c5c3_Err != nil {1815 if templ_7745c5c3_Err != nil {
@@ -1822,7 +1822,7 @@ func mrRail(p MRPage) templ.Component {
1822 var templ_7745c5c3_Var92 string1822 var templ_7745c5c3_Var92 string
1823 templ_7745c5c3_Var92, templ_7745c5c3_Err = templ.ResolveAttributeValue(c.WhenAt)1823 templ_7745c5c3_Var92, templ_7745c5c3_Err = templ.ResolveAttributeValue(c.WhenAt)
1824 if templ_7745c5c3_Err != nil {1824 if templ_7745c5c3_Err != nil {
1825- return templ.Error{Err: templ_7745c5c3_Err, FileName: `internal/adapters/web/mr.templ`, Line: 318, Col: 42}1825+ return templ.Error{Err: templ_7745c5c3_Err, FileName: `internal/adapters/web/mr.templ`, Line: 323, Col: 42}
1826 }1826 }
1827 _, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(templ_7745c5c3_Var92)1827 _, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(templ_7745c5c3_Var92)
1828 if templ_7745c5c3_Err != nil {1828 if templ_7745c5c3_Err != nil {
@@ -1835,7 +1835,7 @@ func mrRail(p MRPage) templ.Component {
1835 var templ_7745c5c3_Var93 string1835 var templ_7745c5c3_Var93 string
1836 templ_7745c5c3_Var93, templ_7745c5c3_Err = templ.JoinStringErrs(c.When)1836 templ_7745c5c3_Var93, templ_7745c5c3_Err = templ.JoinStringErrs(c.When)
1837 if templ_7745c5c3_Err != nil {1837 if templ_7745c5c3_Err != nil {
1838- return templ.Error{Err: templ_7745c5c3_Err, FileName: `internal/adapters/web/mr.templ`, Line: 318, Col: 53}1838+ return templ.Error{Err: templ_7745c5c3_Err, FileName: `internal/adapters/web/mr.templ`, Line: 323, Col: 53}
1839 }1839 }
1840 _, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(templ.EscapeString(templ_7745c5c3_Var93))1840 _, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(templ.EscapeString(templ_7745c5c3_Var93))
1841 if templ_7745c5c3_Err != nil {1841 if templ_7745c5c3_Err != nil {
@@ -1850,7 +1850,7 @@ func mrRail(p MRPage) templ.Component {
1850 var templ_7745c5c3_Var94 string1850 var templ_7745c5c3_Var94 string
1851 templ_7745c5c3_Var94, templ_7745c5c3_Err = templ.JoinStringErrs(" · new")1851 templ_7745c5c3_Var94, templ_7745c5c3_Err = templ.JoinStringErrs(" · new")
1852 if templ_7745c5c3_Err != nil {1852 if templ_7745c5c3_Err != nil {
1853- return templ.Error{Err: templ_7745c5c3_Err, FileName: `internal/adapters/web/mr.templ`, Line: 321, Col: 18}1853+ return templ.Error{Err: templ_7745c5c3_Err, FileName: `internal/adapters/web/mr.templ`, Line: 326, Col: 18}
1854 }1854 }
1855 _, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(templ.EscapeString(templ_7745c5c3_Var94))1855 _, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(templ.EscapeString(templ_7745c5c3_Var94))
1856 if templ_7745c5c3_Err != nil {1856 if templ_7745c5c3_Err != nil {
@@ -1880,7 +1880,7 @@ func mrRail(p MRPage) templ.Component {
1880 var templ_7745c5c3_Var95 string1880 var templ_7745c5c3_Var95 string
1881 templ_7745c5c3_Var95, templ_7745c5c3_Err = templ.JoinStringErrs(p.CommitsNote)1881 templ_7745c5c3_Var95, templ_7745c5c3_Err = templ.JoinStringErrs(p.CommitsNote)
1882 if templ_7745c5c3_Err != nil {1882 if templ_7745c5c3_Err != nil {
1883- return templ.Error{Err: templ_7745c5c3_Err, FileName: `internal/adapters/web/mr.templ`, Line: 331, Col: 34}1883+ return templ.Error{Err: templ_7745c5c3_Err, FileName: `internal/adapters/web/mr.templ`, Line: 336, Col: 34}
1884 }1884 }
1885 _, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(templ.EscapeString(templ_7745c5c3_Var95))1885 _, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(templ.EscapeString(templ_7745c5c3_Var95))
1886 if templ_7745c5c3_Err != nil {1886 if templ_7745c5c3_Err != nil {
@@ -1898,7 +1898,7 @@ func mrRail(p MRPage) templ.Component {
1898 var templ_7745c5c3_Var96 string1898 var templ_7745c5c3_Var96 string
1899 templ_7745c5c3_Var96, templ_7745c5c3_Err = templ.JoinStringErrs(strings.Join(p.Modes, ", "))1899 templ_7745c5c3_Var96, templ_7745c5c3_Err = templ.JoinStringErrs(strings.Join(p.Modes, ", "))
1900 if templ_7745c5c3_Err != nil {1900 if templ_7745c5c3_Err != nil {
1901- return templ.Error{Err: templ_7745c5c3_Err, FileName: `internal/adapters/web/mr.templ`, Line: 338, Col: 36}1901+ return templ.Error{Err: templ_7745c5c3_Err, FileName: `internal/adapters/web/mr.templ`, Line: 343, Col: 36}
1902 }1902 }
1903 _, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(templ.EscapeString(templ_7745c5c3_Var96))1903 _, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(templ.EscapeString(templ_7745c5c3_Var96))
1904 if templ_7745c5c3_Err != nil {1904 if templ_7745c5c3_Err != nil {
@@ -1959,7 +1959,7 @@ func mrBar(p MRPage) templ.Component {
1959 var templ_7745c5c3_Var98 string1959 var templ_7745c5c3_Var98 string
1960 templ_7745c5c3_Var98, templ_7745c5c3_Err = templ.JoinStringErrs(plural(p.NFiles, "file", "files"))1960 templ_7745c5c3_Var98, templ_7745c5c3_Err = templ.JoinStringErrs(plural(p.NFiles, "file", "files"))
1961 if templ_7745c5c3_Err != nil {1961 if templ_7745c5c3_Err != nil {
1962- return templ.Error{Err: templ_7745c5c3_Err, FileName: `internal/adapters/web/mr.templ`, Line: 357, Col: 55}1962+ return templ.Error{Err: templ_7745c5c3_Err, FileName: `internal/adapters/web/mr.templ`, Line: 362, Col: 55}
1963 }1963 }
1964 _, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(templ.EscapeString(templ_7745c5c3_Var98))1964 _, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(templ.EscapeString(templ_7745c5c3_Var98))
1965 if templ_7745c5c3_Err != nil {1965 if templ_7745c5c3_Err != nil {
@@ -1972,7 +1972,7 @@ func mrBar(p MRPage) templ.Component {
1972 var templ_7745c5c3_Var99 string1972 var templ_7745c5c3_Var99 string
1973 templ_7745c5c3_Var99, templ_7745c5c3_Err = templ.JoinStringErrs(itoa(p.Adds))1973 templ_7745c5c3_Var99, templ_7745c5c3_Err = templ.JoinStringErrs(itoa(p.Adds))
1974 if templ_7745c5c3_Err != nil {1974 if templ_7745c5c3_Err != nil {
1975- return templ.Error{Err: templ_7745c5c3_Err, FileName: `internal/adapters/web/mr.templ`, Line: 357, Col: 95}1975+ return templ.Error{Err: templ_7745c5c3_Err, FileName: `internal/adapters/web/mr.templ`, Line: 362, Col: 95}
1976 }1976 }
1977 _, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(templ.EscapeString(templ_7745c5c3_Var99))1977 _, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(templ.EscapeString(templ_7745c5c3_Var99))
1978 if templ_7745c5c3_Err != nil {1978 if templ_7745c5c3_Err != nil {
@@ -1985,7 +1985,7 @@ func mrBar(p MRPage) templ.Component {
1985 var templ_7745c5c3_Var100 string1985 var templ_7745c5c3_Var100 string
1986 templ_7745c5c3_Var100, templ_7745c5c3_Err = templ.JoinStringErrs(itoa(p.Dels))1986 templ_7745c5c3_Var100, templ_7745c5c3_Err = templ.JoinStringErrs(itoa(p.Dels))
1987 if templ_7745c5c3_Err != nil {1987 if templ_7745c5c3_Err != nil {
1988- return templ.Error{Err: templ_7745c5c3_Err, FileName: `internal/adapters/web/mr.templ`, Line: 357, Col: 140}1988+ return templ.Error{Err: templ_7745c5c3_Err, FileName: `internal/adapters/web/mr.templ`, Line: 362, Col: 140}
1989 }1989 }
1990 _, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(templ.EscapeString(templ_7745c5c3_Var100))1990 _, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(templ.EscapeString(templ_7745c5c3_Var100))
1991 if templ_7745c5c3_Err != nil {1991 if templ_7745c5c3_Err != nil {
@@ -2089,7 +2089,7 @@ func mergeMenu(p MRPage) templ.Component {
2089 var templ_7745c5c3_Var102 string2089 var templ_7745c5c3_Var102 string
2090 templ_7745c5c3_Var102, templ_7745c5c3_Err = templ.JoinStringErrs(p.HeadShort)2090 templ_7745c5c3_Var102, templ_7745c5c3_Err = templ.JoinStringErrs(p.HeadShort)
2091 if templ_7745c5c3_Err != nil {2091 if templ_7745c5c3_Err != nil {
2092- return templ.Error{Err: templ_7745c5c3_Err, FileName: `internal/adapters/web/mr.templ`, Line: 390, Col: 19}2092+ return templ.Error{Err: templ_7745c5c3_Err, FileName: `internal/adapters/web/mr.templ`, Line: 395, Col: 19}
2093 }2093 }
2094 _, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(templ.EscapeString(templ_7745c5c3_Var102))2094 _, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(templ.EscapeString(templ_7745c5c3_Var102))
2095 if templ_7745c5c3_Err != nil {2095 if templ_7745c5c3_Err != nil {
@@ -2103,7 +2103,7 @@ func mergeMenu(p MRPage) templ.Component {
2103 var templ_7745c5c3_Var103 string2103 var templ_7745c5c3_Var103 string
2104 templ_7745c5c3_Var103, templ_7745c5c3_Err = templ.JoinStringErrs(p.Target)2104 templ_7745c5c3_Var103, templ_7745c5c3_Err = templ.JoinStringErrs(p.Target)
2105 if templ_7745c5c3_Err != nil {2105 if templ_7745c5c3_Err != nil {
2106- return templ.Error{Err: templ_7745c5c3_Err, FileName: `internal/adapters/web/mr.templ`, Line: 394, Col: 18}2106+ return templ.Error{Err: templ_7745c5c3_Err, FileName: `internal/adapters/web/mr.templ`, Line: 399, Col: 18}
2107 }2107 }
2108 _, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(templ.EscapeString(templ_7745c5c3_Var103))2108 _, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(templ.EscapeString(templ_7745c5c3_Var103))
2109 if templ_7745c5c3_Err != nil {2109 if templ_7745c5c3_Err != nil {
@@ -2121,7 +2121,7 @@ func mergeMenu(p MRPage) templ.Component {
2121 var templ_7745c5c3_Var104 templ.SafeURL2121 var templ_7745c5c3_Var104 templ.SafeURL
2122 templ_7745c5c3_Var104, templ_7745c5c3_Err = templ.JoinURLErrs(templ.SafeURL(p.Box.ReadyAction))2122 templ_7745c5c3_Var104, templ_7745c5c3_Err = templ.JoinURLErrs(templ.SafeURL(p.Box.ReadyAction))
2123 if templ_7745c5c3_Err != nil {2123 if templ_7745c5c3_Err != nil {
2124- return templ.Error{Err: templ_7745c5c3_Err, FileName: `internal/adapters/web/mr.templ`, Line: 398, Col: 80}2124+ return templ.Error{Err: templ_7745c5c3_Err, FileName: `internal/adapters/web/mr.templ`, Line: 403, Col: 80}
2125 }2125 }
2126 _, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(templ.EscapeString(templ_7745c5c3_Var104))2126 _, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(templ.EscapeString(templ_7745c5c3_Var104))
2127 if templ_7745c5c3_Err != nil {2127 if templ_7745c5c3_Err != nil {
@@ -2139,7 +2139,7 @@ func mergeMenu(p MRPage) templ.Component {
2139 var templ_7745c5c3_Var105 templ.SafeURL2139 var templ_7745c5c3_Var105 templ.SafeURL
2140 templ_7745c5c3_Var105, templ_7745c5c3_Err = templ.JoinURLErrs(templ.SafeURL(p.Box.MergeAction))2140 templ_7745c5c3_Var105, templ_7745c5c3_Err = templ.JoinURLErrs(templ.SafeURL(p.Box.MergeAction))
2141 if templ_7745c5c3_Err != nil {2141 if templ_7745c5c3_Err != nil {
2142- return templ.Error{Err: templ_7745c5c3_Err, FileName: `internal/adapters/web/mr.templ`, Line: 402, Col: 80}2142+ return templ.Error{Err: templ_7745c5c3_Err, FileName: `internal/adapters/web/mr.templ`, Line: 407, Col: 80}
2143 }2143 }
2144 _, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(templ.EscapeString(templ_7745c5c3_Var105))2144 _, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(templ.EscapeString(templ_7745c5c3_Var105))
2145 if templ_7745c5c3_Err != nil {2145 if templ_7745c5c3_Err != nil {
@@ -2152,7 +2152,7 @@ func mergeMenu(p MRPage) templ.Component {
2152 var templ_7745c5c3_Var106 string2152 var templ_7745c5c3_Var106 string
2153 templ_7745c5c3_Var106, templ_7745c5c3_Err = templ.ResolveAttributeValue(p.Box.Head)2153 templ_7745c5c3_Var106, templ_7745c5c3_Err = templ.ResolveAttributeValue(p.Box.Head)
2154 if templ_7745c5c3_Err != nil {2154 if templ_7745c5c3_Err != nil {
2155- return templ.Error{Err: templ_7745c5c3_Err, FileName: `internal/adapters/web/mr.templ`, Line: 403, Col: 59}2155+ return templ.Error{Err: templ_7745c5c3_Err, FileName: `internal/adapters/web/mr.templ`, Line: 408, Col: 59}
2156 }2156 }
2157 _, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(templ_7745c5c3_Var106)2157 _, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(templ_7745c5c3_Var106)
2158 if templ_7745c5c3_Err != nil {2158 if templ_7745c5c3_Err != nil {
@@ -2170,7 +2170,7 @@ func mergeMenu(p MRPage) templ.Component {
2170 var templ_7745c5c3_Var107 string2170 var templ_7745c5c3_Var107 string
2171 templ_7745c5c3_Var107, templ_7745c5c3_Err = templ.ResolveAttributeValue(m.Value)2171 templ_7745c5c3_Var107, templ_7745c5c3_Err = templ.ResolveAttributeValue(m.Value)
2172 if templ_7745c5c3_Err != nil {2172 if templ_7745c5c3_Err != nil {
2173- return templ.Error{Err: templ_7745c5c3_Err, FileName: `internal/adapters/web/mr.templ`, Line: 408, Col: 55}2173+ return templ.Error{Err: templ_7745c5c3_Err, FileName: `internal/adapters/web/mr.templ`, Line: 413, Col: 55}
2174 }2174 }
2175 _, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(templ_7745c5c3_Var107)2175 _, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(templ_7745c5c3_Var107)
2176 if templ_7745c5c3_Err != nil {2176 if templ_7745c5c3_Err != nil {
@@ -2193,7 +2193,7 @@ func mergeMenu(p MRPage) templ.Component {
2193 var templ_7745c5c3_Var108 string2193 var templ_7745c5c3_Var108 string
2194 templ_7745c5c3_Var108, templ_7745c5c3_Err = templ.JoinStringErrs(m.Label)2194 templ_7745c5c3_Var108, templ_7745c5c3_Err = templ.JoinStringErrs(m.Label)
2195 if templ_7745c5c3_Err != nil {2195 if templ_7745c5c3_Err != nil {
2196- return templ.Error{Err: templ_7745c5c3_Err, FileName: `internal/adapters/web/mr.templ`, Line: 409, Col: 17}2196+ return templ.Error{Err: templ_7745c5c3_Err, FileName: `internal/adapters/web/mr.templ`, Line: 414, Col: 17}
2197 }2197 }
2198 _, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(templ.EscapeString(templ_7745c5c3_Var108))2198 _, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(templ.EscapeString(templ_7745c5c3_Var108))
2199 if templ_7745c5c3_Err != nil {2199 if templ_7745c5c3_Err != nil {
@@ -2211,7 +2211,7 @@ func mergeMenu(p MRPage) templ.Component {
2211 var templ_7745c5c3_Var109 string2211 var templ_7745c5c3_Var109 string
2212 templ_7745c5c3_Var109, templ_7745c5c3_Err = templ.JoinStringErrs(itoa(i + 1))2212 templ_7745c5c3_Var109, templ_7745c5c3_Err = templ.JoinStringErrs(itoa(i + 1))
2213 if templ_7745c5c3_Err != nil {2213 if templ_7745c5c3_Err != nil {
2214- return templ.Error{Err: templ_7745c5c3_Err, FileName: `internal/adapters/web/mr.templ`, Line: 411, Col: 46}2214+ return templ.Error{Err: templ_7745c5c3_Err, FileName: `internal/adapters/web/mr.templ`, Line: 416, Col: 46}
2215 }2215 }
2216 _, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(templ.EscapeString(templ_7745c5c3_Var109))2216 _, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(templ.EscapeString(templ_7745c5c3_Var109))
2217 if templ_7745c5c3_Err != nil {2217 if templ_7745c5c3_Err != nil {
@@ -2239,7 +2239,7 @@ func mergeMenu(p MRPage) templ.Component {
2239 var templ_7745c5c3_Var110 string2239 var templ_7745c5c3_Var110 string
2240 templ_7745c5c3_Var110, templ_7745c5c3_Err = templ.JoinStringErrs(p.Source)2240 templ_7745c5c3_Var110, templ_7745c5c3_Err = templ.JoinStringErrs(p.Source)
2241 if templ_7745c5c3_Err != nil {2241 if templ_7745c5c3_Err != nil {
2242- return templ.Error{Err: templ_7745c5c3_Err, FileName: `internal/adapters/web/mr.templ`, Line: 417, Col: 102}2242+ return templ.Error{Err: templ_7745c5c3_Err, FileName: `internal/adapters/web/mr.templ`, Line: 422, Col: 102}
2243 }2243 }
2244 _, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(templ.EscapeString(templ_7745c5c3_Var110))2244 _, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(templ.EscapeString(templ_7745c5c3_Var110))
2245 if templ_7745c5c3_Err != nil {2245 if templ_7745c5c3_Err != nil {
@@ -2257,7 +2257,7 @@ func mergeMenu(p MRPage) templ.Component {
2257 var templ_7745c5c3_Var111 string2257 var templ_7745c5c3_Var111 string
2258 templ_7745c5c3_Var111, templ_7745c5c3_Err = templ.JoinStringErrs(p.Target)2258 templ_7745c5c3_Var111, templ_7745c5c3_Err = templ.JoinStringErrs(p.Target)
2259 if templ_7745c5c3_Err != nil {2259 if templ_7745c5c3_Err != nil {
2260- return templ.Error{Err: templ_7745c5c3_Err, FileName: `internal/adapters/web/mr.templ`, Line: 420, Col: 82}2260+ return templ.Error{Err: templ_7745c5c3_Err, FileName: `internal/adapters/web/mr.templ`, Line: 425, Col: 82}
2261 }2261 }
2262 _, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(templ.EscapeString(templ_7745c5c3_Var111))2262 _, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(templ.EscapeString(templ_7745c5c3_Var111))
2263 if templ_7745c5c3_Err != nil {2263 if templ_7745c5c3_Err != nil {
@@ -2311,7 +2311,7 @@ func moreMenu(p MRPage) templ.Component {
2311 var templ_7745c5c3_Var113 templ.SafeURL2311 var templ_7745c5c3_Var113 templ.SafeURL
2312 templ_7745c5c3_Var113, templ_7745c5c3_Err = templ.JoinURLErrs(templ.SafeURL(p.Box.ReadAction))2312 templ_7745c5c3_Var113, templ_7745c5c3_Err = templ.JoinURLErrs(templ.SafeURL(p.Box.ReadAction))
2313 if templ_7745c5c3_Err != nil {2313 if templ_7745c5c3_Err != nil {
2314- return templ.Error{Err: templ_7745c5c3_Err, FileName: `internal/adapters/web/mr.templ`, Line: 435, Col: 64}2314+ return templ.Error{Err: templ_7745c5c3_Err, FileName: `internal/adapters/web/mr.templ`, Line: 440, Col: 64}
2315 }2315 }
2316 _, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(templ.EscapeString(templ_7745c5c3_Var113))2316 _, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(templ.EscapeString(templ_7745c5c3_Var113))
2317 if templ_7745c5c3_Err != nil {2317 if templ_7745c5c3_Err != nil {
@@ -2324,7 +2324,7 @@ func moreMenu(p MRPage) templ.Component {
2324 var templ_7745c5c3_Var114 string2324 var templ_7745c5c3_Var114 string
2325 templ_7745c5c3_Var114, templ_7745c5c3_Err = templ.ResolveAttributeValue(p.Box.Head)2325 templ_7745c5c3_Var114, templ_7745c5c3_Err = templ.ResolveAttributeValue(p.Box.Head)
2326 if templ_7745c5c3_Err != nil {2326 if templ_7745c5c3_Err != nil {
2327- return templ.Error{Err: templ_7745c5c3_Err, FileName: `internal/adapters/web/mr.templ`, Line: 436, Col: 59}2327+ return templ.Error{Err: templ_7745c5c3_Err, FileName: `internal/adapters/web/mr.templ`, Line: 441, Col: 59}
2328 }2328 }
2329 _, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(templ_7745c5c3_Var114)2329 _, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(templ_7745c5c3_Var114)
2330 if templ_7745c5c3_Err != nil {2330 if templ_7745c5c3_Err != nil {
@@ -2342,7 +2342,7 @@ func moreMenu(p MRPage) templ.Component {
2342 var templ_7745c5c3_Var115 templ.SafeURL2342 var templ_7745c5c3_Var115 templ.SafeURL
2343 templ_7745c5c3_Var115, templ_7745c5c3_Err = templ.JoinURLErrs(templ.SafeURL(p.Box.CloseAction))2343 templ_7745c5c3_Var115, templ_7745c5c3_Err = templ.JoinURLErrs(templ.SafeURL(p.Box.CloseAction))
2344 if templ_7745c5c3_Err != nil {2344 if templ_7745c5c3_Err != nil {
2345- return templ.Error{Err: templ_7745c5c3_Err, FileName: `internal/adapters/web/mr.templ`, Line: 440, Col: 64}2345+ return templ.Error{Err: templ_7745c5c3_Err, FileName: `internal/adapters/web/mr.templ`, Line: 445, Col: 64}
2346 }2346 }
2347 _, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(templ.EscapeString(templ_7745c5c3_Var115))2347 _, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(templ.EscapeString(templ_7745c5c3_Var115))
2348 if templ_7745c5c3_Err != nil {2348 if templ_7745c5c3_Err != nil {
@@ -2414,7 +2414,7 @@ func Compare(l Layout, p ComparePage) templ.Component {
2414 var templ_7745c5c3_Var118 string2414 var templ_7745c5c3_Var118 string
2415 templ_7745c5c3_Var118, templ_7745c5c3_Err = templ.JoinStringErrs(p.Source)2415 templ_7745c5c3_Var118, templ_7745c5c3_Err = templ.JoinStringErrs(p.Source)
2416 if templ_7745c5c3_Err != nil {2416 if templ_7745c5c3_Err != nil {
2417- return templ.Error{Err: templ_7745c5c3_Err, FileName: `internal/adapters/web/mr.templ`, Line: 456, Col: 17}2417+ return templ.Error{Err: templ_7745c5c3_Err, FileName: `internal/adapters/web/mr.templ`, Line: 461, Col: 17}
2418 }2418 }
2419 _, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(templ.EscapeString(templ_7745c5c3_Var118))2419 _, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(templ.EscapeString(templ_7745c5c3_Var118))
2420 if templ_7745c5c3_Err != nil {2420 if templ_7745c5c3_Err != nil {
@@ -2427,7 +2427,7 @@ func Compare(l Layout, p ComparePage) templ.Component {
2427 var templ_7745c5c3_Var119 string2427 var templ_7745c5c3_Var119 string
2428 templ_7745c5c3_Var119, templ_7745c5c3_Err = templ.JoinStringErrs(p.Target)2428 templ_7745c5c3_Var119, templ_7745c5c3_Err = templ.JoinStringErrs(p.Target)
2429 if templ_7745c5c3_Err != nil {2429 if templ_7745c5c3_Err != nil {
2430- return templ.Error{Err: templ_7745c5c3_Err, FileName: `internal/adapters/web/mr.templ`, Line: 456, Col: 34}2430+ return templ.Error{Err: templ_7745c5c3_Err, FileName: `internal/adapters/web/mr.templ`, Line: 461, Col: 34}
2431 }2431 }
2432 _, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(templ.EscapeString(templ_7745c5c3_Var119))2432 _, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(templ.EscapeString(templ_7745c5c3_Var119))
2433 if templ_7745c5c3_Err != nil {2433 if templ_7745c5c3_Err != nil {
@@ -2440,7 +2440,7 @@ func Compare(l Layout, p ComparePage) templ.Component {
2440 var templ_7745c5c3_Var120 templ.SafeURL2440 var templ_7745c5c3_Var120 templ.SafeURL
2441 templ_7745c5c3_Var120, templ_7745c5c3_Err = templ.JoinURLErrs(templ.SafeURL(p.SourceHref))2441 templ_7745c5c3_Var120, templ_7745c5c3_Err = templ.JoinURLErrs(templ.SafeURL(p.SourceHref))
2442 if templ_7745c5c3_Err != nil {2442 if templ_7745c5c3_Err != nil {
2443- return templ.Error{Err: templ_7745c5c3_Err, FileName: `internal/adapters/web/mr.templ`, Line: 459, Col: 45}2443+ return templ.Error{Err: templ_7745c5c3_Err, FileName: `internal/adapters/web/mr.templ`, Line: 464, Col: 45}
2444 }2444 }
2445 _, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(templ.EscapeString(templ_7745c5c3_Var120))2445 _, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(templ.EscapeString(templ_7745c5c3_Var120))
2446 if templ_7745c5c3_Err != nil {2446 if templ_7745c5c3_Err != nil {
@@ -2453,7 +2453,7 @@ func Compare(l Layout, p ComparePage) templ.Component {
2453 var templ_7745c5c3_Var121 string2453 var templ_7745c5c3_Var121 string
2454 templ_7745c5c3_Var121, templ_7745c5c3_Err = templ.JoinStringErrs(p.Source)2454 templ_7745c5c3_Var121, templ_7745c5c3_Err = templ.JoinStringErrs(p.Source)
2455 if templ_7745c5c3_Err != nil {2455 if templ_7745c5c3_Err != nil {
2456- return templ.Error{Err: templ_7745c5c3_Err, FileName: `internal/adapters/web/mr.templ`, Line: 459, Col: 58}2456+ return templ.Error{Err: templ_7745c5c3_Err, FileName: `internal/adapters/web/mr.templ`, Line: 464, Col: 58}
2457 }2457 }
2458 _, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(templ.EscapeString(templ_7745c5c3_Var121))2458 _, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(templ.EscapeString(templ_7745c5c3_Var121))
2459 if templ_7745c5c3_Err != nil {2459 if templ_7745c5c3_Err != nil {
@@ -2466,7 +2466,7 @@ func Compare(l Layout, p ComparePage) templ.Component {
2466 var templ_7745c5c3_Var122 templ.SafeURL2466 var templ_7745c5c3_Var122 templ.SafeURL
2467 templ_7745c5c3_Var122, templ_7745c5c3_Err = templ.JoinURLErrs(templ.SafeURL(p.TargetHref))2467 templ_7745c5c3_Var122, templ_7745c5c3_Err = templ.JoinURLErrs(templ.SafeURL(p.TargetHref))
2468 if templ_7745c5c3_Err != nil {2468 if templ_7745c5c3_Err != nil {
2469- return templ.Error{Err: templ_7745c5c3_Err, FileName: `internal/adapters/web/mr.templ`, Line: 461, Col: 45}2469+ return templ.Error{Err: templ_7745c5c3_Err, FileName: `internal/adapters/web/mr.templ`, Line: 466, Col: 45}
2470 }2470 }
2471 _, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(templ.EscapeString(templ_7745c5c3_Var122))2471 _, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(templ.EscapeString(templ_7745c5c3_Var122))
2472 if templ_7745c5c3_Err != nil {2472 if templ_7745c5c3_Err != nil {
@@ -2479,7 +2479,7 @@ func Compare(l Layout, p ComparePage) templ.Component {
2479 var templ_7745c5c3_Var123 string2479 var templ_7745c5c3_Var123 string
2480 templ_7745c5c3_Var123, templ_7745c5c3_Err = templ.JoinStringErrs(p.Target)2480 templ_7745c5c3_Var123, templ_7745c5c3_Err = templ.JoinStringErrs(p.Target)
2481 if templ_7745c5c3_Err != nil {2481 if templ_7745c5c3_Err != nil {
2482- return templ.Error{Err: templ_7745c5c3_Err, FileName: `internal/adapters/web/mr.templ`, Line: 461, Col: 58}2482+ return templ.Error{Err: templ_7745c5c3_Err, FileName: `internal/adapters/web/mr.templ`, Line: 466, Col: 58}
2483 }2483 }
2484 _, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(templ.EscapeString(templ_7745c5c3_Var123))2484 _, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(templ.EscapeString(templ_7745c5c3_Var123))
2485 if templ_7745c5c3_Err != nil {2485 if templ_7745c5c3_Err != nil {
@@ -2492,7 +2492,7 @@ func Compare(l Layout, p ComparePage) templ.Component {
2492 var templ_7745c5c3_Var124 string2492 var templ_7745c5c3_Var124 string
2493 templ_7745c5c3_Var124, templ_7745c5c3_Err = templ.JoinStringErrs(p.AheadText)2493 templ_7745c5c3_Var124, templ_7745c5c3_Err = templ.JoinStringErrs(p.AheadText)
2494 if templ_7745c5c3_Err != nil {2494 if templ_7745c5c3_Err != nil {
2495- return templ.Error{Err: templ_7745c5c3_Err, FileName: `internal/adapters/web/mr.templ`, Line: 463, Col: 21}2495+ return templ.Error{Err: templ_7745c5c3_Err, FileName: `internal/adapters/web/mr.templ`, Line: 468, Col: 21}
2496 }2496 }
2497 _, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(templ.EscapeString(templ_7745c5c3_Var124))2497 _, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(templ.EscapeString(templ_7745c5c3_Var124))
2498 if templ_7745c5c3_Err != nil {2498 if templ_7745c5c3_Err != nil {
@@ -2510,7 +2510,7 @@ func Compare(l Layout, p ComparePage) templ.Component {
2510 var templ_7745c5c3_Var125 string2510 var templ_7745c5c3_Var125 string
2511 templ_7745c5c3_Var125, templ_7745c5c3_Err = templ.JoinStringErrs(p.Note)2511 templ_7745c5c3_Var125, templ_7745c5c3_Err = templ.JoinStringErrs(p.Note)
2512 if templ_7745c5c3_Err != nil {2512 if templ_7745c5c3_Err != nil {
2513- return templ.Error{Err: templ_7745c5c3_Err, FileName: `internal/adapters/web/mr.templ`, Line: 467, Col: 29}2513+ return templ.Error{Err: templ_7745c5c3_Err, FileName: `internal/adapters/web/mr.templ`, Line: 472, Col: 29}
2514 }2514 }
2515 _, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(templ.EscapeString(templ_7745c5c3_Var125))2515 _, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(templ.EscapeString(templ_7745c5c3_Var125))
2516 if templ_7745c5c3_Err != nil {2516 if templ_7745c5c3_Err != nil {
@@ -2533,7 +2533,7 @@ func Compare(l Layout, p ComparePage) templ.Component {
2533 var templ_7745c5c3_Var126 templ.SafeURL2533 var templ_7745c5c3_Var126 templ.SafeURL
2534 templ_7745c5c3_Var126, templ_7745c5c3_Err = templ.JoinURLErrs(templ.SafeURL(p.Existing.Href))2534 templ_7745c5c3_Var126, templ_7745c5c3_Err = templ.JoinURLErrs(templ.SafeURL(p.Existing.Href))
2535 if templ_7745c5c3_Err != nil {2535 if templ_7745c5c3_Err != nil {
2536- return templ.Error{Err: templ_7745c5c3_Err, FileName: `internal/adapters/web/mr.templ`, Line: 470, Col: 114}2536+ return templ.Error{Err: templ_7745c5c3_Err, FileName: `internal/adapters/web/mr.templ`, Line: 475, Col: 114}
2537 }2537 }
2538 _, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(templ.EscapeString(templ_7745c5c3_Var126))2538 _, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(templ.EscapeString(templ_7745c5c3_Var126))
2539 if templ_7745c5c3_Err != nil {2539 if templ_7745c5c3_Err != nil {
@@ -2546,7 +2546,7 @@ func Compare(l Layout, p ComparePage) templ.Component {
2546 var templ_7745c5c3_Var127 string2546 var templ_7745c5c3_Var127 string
2547 templ_7745c5c3_Var127, templ_7745c5c3_Err = templ.JoinStringErrs(p.Existing.Label)2547 templ_7745c5c3_Var127, templ_7745c5c3_Err = templ.JoinStringErrs(p.Existing.Label)
2548 if templ_7745c5c3_Err != nil {2548 if templ_7745c5c3_Err != nil {
2549- return templ.Error{Err: templ_7745c5c3_Err, FileName: `internal/adapters/web/mr.templ`, Line: 470, Col: 135}2549+ return templ.Error{Err: templ_7745c5c3_Err, FileName: `internal/adapters/web/mr.templ`, Line: 475, Col: 135}
2550 }2550 }
2551 _, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(templ.EscapeString(templ_7745c5c3_Var127))2551 _, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(templ.EscapeString(templ_7745c5c3_Var127))
2552 if templ_7745c5c3_Err != nil {2552 if templ_7745c5c3_Err != nil {
@@ -2569,7 +2569,7 @@ func Compare(l Layout, p ComparePage) templ.Component {
2569 var templ_7745c5c3_Var128 templ.SafeURL2569 var templ_7745c5c3_Var128 templ.SafeURL
2570 templ_7745c5c3_Var128, templ_7745c5c3_Err = templ.JoinURLErrs(templ.SafeURL(p.Create.Action))2570 templ_7745c5c3_Var128, templ_7745c5c3_Err = templ.JoinURLErrs(templ.SafeURL(p.Create.Action))
2571 if templ_7745c5c3_Err != nil {2571 if templ_7745c5c3_Err != nil {
2572- return templ.Error{Err: templ_7745c5c3_Err, FileName: `internal/adapters/web/mr.templ`, Line: 473, Col: 83}2572+ return templ.Error{Err: templ_7745c5c3_Err, FileName: `internal/adapters/web/mr.templ`, Line: 478, Col: 83}
2573 }2573 }
2574 _, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(templ.EscapeString(templ_7745c5c3_Var128))2574 _, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(templ.EscapeString(templ_7745c5c3_Var128))
2575 if templ_7745c5c3_Err != nil {2575 if templ_7745c5c3_Err != nil {
@@ -2582,7 +2582,7 @@ func Compare(l Layout, p ComparePage) templ.Component {
2582 var templ_7745c5c3_Var129 string2582 var templ_7745c5c3_Var129 string
2583 templ_7745c5c3_Var129, templ_7745c5c3_Err = templ.ResolveAttributeValue(p.Create.Source)2583 templ_7745c5c3_Var129, templ_7745c5c3_Err = templ.ResolveAttributeValue(p.Create.Source)
2584 if templ_7745c5c3_Err != nil {2584 if templ_7745c5c3_Err != nil {
2585- return templ.Error{Err: templ_7745c5c3_Err, FileName: `internal/adapters/web/mr.templ`, Line: 474, Col: 62}2585+ return templ.Error{Err: templ_7745c5c3_Err, FileName: `internal/adapters/web/mr.templ`, Line: 479, Col: 62}
2586 }2586 }
2587 _, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(templ_7745c5c3_Var129)2587 _, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(templ_7745c5c3_Var129)
2588 if templ_7745c5c3_Err != nil {2588 if templ_7745c5c3_Err != nil {
@@ -2595,7 +2595,7 @@ func Compare(l Layout, p ComparePage) templ.Component {
2595 var templ_7745c5c3_Var130 string2595 var templ_7745c5c3_Var130 string
2596 templ_7745c5c3_Var130, templ_7745c5c3_Err = templ.ResolveAttributeValue(p.Create.Target)2596 templ_7745c5c3_Var130, templ_7745c5c3_Err = templ.ResolveAttributeValue(p.Create.Target)
2597 if templ_7745c5c3_Err != nil {2597 if templ_7745c5c3_Err != nil {
2598- return templ.Error{Err: templ_7745c5c3_Err, FileName: `internal/adapters/web/mr.templ`, Line: 475, Col: 62}2598+ return templ.Error{Err: templ_7745c5c3_Err, FileName: `internal/adapters/web/mr.templ`, Line: 480, Col: 62}
2599 }2599 }
2600 _, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(templ_7745c5c3_Var130)2600 _, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(templ_7745c5c3_Var130)
2601 if templ_7745c5c3_Err != nil {2601 if templ_7745c5c3_Err != nil {
@@ -2608,7 +2608,7 @@ func Compare(l Layout, p ComparePage) templ.Component {
2608 var templ_7745c5c3_Var131 string2608 var templ_7745c5c3_Var131 string
2609 templ_7745c5c3_Var131, templ_7745c5c3_Err = templ.ResolveAttributeValue(p.Create.Title)2609 templ_7745c5c3_Var131, templ_7745c5c3_Err = templ.ResolveAttributeValue(p.Create.Title)
2610 if templ_7745c5c3_Err != nil {2610 if templ_7745c5c3_Err != nil {
2611- return templ.Error{Err: templ_7745c5c3_Err, FileName: `internal/adapters/web/mr.templ`, Line: 477, Col: 97}2611+ return templ.Error{Err: templ_7745c5c3_Err, FileName: `internal/adapters/web/mr.templ`, Line: 482, Col: 97}
2612 }2612 }
2613 _, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(templ_7745c5c3_Var131)2613 _, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(templ_7745c5c3_Var131)
2614 if templ_7745c5c3_Err != nil {2614 if templ_7745c5c3_Err != nil {
@@ -2631,7 +2631,7 @@ func Compare(l Layout, p ComparePage) templ.Component {
2631 var templ_7745c5c3_Var132 string2631 var templ_7745c5c3_Var132 string
2632 templ_7745c5c3_Var132, templ_7745c5c3_Err = templ.JoinStringErrs(plural(p.NFiles, "file", "files"))2632 templ_7745c5c3_Var132, templ_7745c5c3_Err = templ.JoinStringErrs(plural(p.NFiles, "file", "files"))
2633 if templ_7745c5c3_Err != nil {2633 if templ_7745c5c3_Err != nil {
2634- return templ.Error{Err: templ_7745c5c3_Err, FileName: `internal/adapters/web/mr.templ`, Line: 487, Col: 57}2634+ return templ.Error{Err: templ_7745c5c3_Err, FileName: `internal/adapters/web/mr.templ`, Line: 492, Col: 57}
2635 }2635 }
2636 _, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(templ.EscapeString(templ_7745c5c3_Var132))2636 _, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(templ.EscapeString(templ_7745c5c3_Var132))
2637 if templ_7745c5c3_Err != nil {2637 if templ_7745c5c3_Err != nil {
@@ -2644,7 +2644,7 @@ func Compare(l Layout, p ComparePage) templ.Component {
2644 var templ_7745c5c3_Var133 string2644 var templ_7745c5c3_Var133 string
2645 templ_7745c5c3_Var133, templ_7745c5c3_Err = templ.JoinStringErrs(itoa(p.Adds))2645 templ_7745c5c3_Var133, templ_7745c5c3_Err = templ.JoinStringErrs(itoa(p.Adds))
2646 if templ_7745c5c3_Err != nil {2646 if templ_7745c5c3_Err != nil {
2647- return templ.Error{Err: templ_7745c5c3_Err, FileName: `internal/adapters/web/mr.templ`, Line: 487, Col: 97}2647+ return templ.Error{Err: templ_7745c5c3_Err, FileName: `internal/adapters/web/mr.templ`, Line: 492, Col: 97}
2648 }2648 }
2649 _, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(templ.EscapeString(templ_7745c5c3_Var133))2649 _, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(templ.EscapeString(templ_7745c5c3_Var133))
2650 if templ_7745c5c3_Err != nil {2650 if templ_7745c5c3_Err != nil {
@@ -2657,7 +2657,7 @@ func Compare(l Layout, p ComparePage) templ.Component {
2657 var templ_7745c5c3_Var134 string2657 var templ_7745c5c3_Var134 string
2658 templ_7745c5c3_Var134, templ_7745c5c3_Err = templ.JoinStringErrs(itoa(p.Dels))2658 templ_7745c5c3_Var134, templ_7745c5c3_Err = templ.JoinStringErrs(itoa(p.Dels))
2659 if templ_7745c5c3_Err != nil {2659 if templ_7745c5c3_Err != nil {
2660- return templ.Error{Err: templ_7745c5c3_Err, FileName: `internal/adapters/web/mr.templ`, Line: 487, Col: 142}2660+ return templ.Error{Err: templ_7745c5c3_Err, FileName: `internal/adapters/web/mr.templ`, Line: 492, Col: 142}
2661 }2661 }
2662 _, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(templ.EscapeString(templ_7745c5c3_Var134))2662 _, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(templ.EscapeString(templ_7745c5c3_Var134))
2663 if templ_7745c5c3_Err != nil {2663 if templ_7745c5c3_Err != nil {
@@ -2701,7 +2701,7 @@ func Compare(l Layout, p ComparePage) templ.Component {
2701 var templ_7745c5c3_Var135 string2701 var templ_7745c5c3_Var135 string
2702 templ_7745c5c3_Var135, templ_7745c5c3_Err = templ.ResolveAttributeValue(p.View)2702 templ_7745c5c3_Var135, templ_7745c5c3_Err = templ.ResolveAttributeValue(p.View)
2703 if templ_7745c5c3_Err != nil {2703 if templ_7745c5c3_Err != nil {
2704- return templ.Error{Err: templ_7745c5c3_Err, FileName: `internal/adapters/web/mr.templ`, Line: 502, Col: 23}2704+ return templ.Error{Err: templ_7745c5c3_Err, FileName: `internal/adapters/web/mr.templ`, Line: 507, Col: 23}
2705 }2705 }
2706 _, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(templ_7745c5c3_Var135)2706 _, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(templ_7745c5c3_Var135)
2707 if templ_7745c5c3_Err != nil {2707 if templ_7745c5c3_Err != nil {
@@ -2719,7 +2719,7 @@ func Compare(l Layout, p ComparePage) templ.Component {
2719 var templ_7745c5c3_Var136 string2719 var templ_7745c5c3_Var136 string
2720 templ_7745c5c3_Var136, templ_7745c5c3_Err = templ.ResolveAttributeValue(p.View)2720 templ_7745c5c3_Var136, templ_7745c5c3_Err = templ.ResolveAttributeValue(p.View)
2721 if templ_7745c5c3_Err != nil {2721 if templ_7745c5c3_Err != nil {
2722- return templ.Error{Err: templ_7745c5c3_Err, FileName: `internal/adapters/web/mr.templ`, Line: 504, Col: 23}2722+ return templ.Error{Err: templ_7745c5c3_Err, FileName: `internal/adapters/web/mr.templ`, Line: 509, Col: 23}
2723 }2723 }
2724 _, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(templ_7745c5c3_Var136)2724 _, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(templ_7745c5c3_Var136)
2725 if templ_7745c5c3_Err != nil {2725 if templ_7745c5c3_Err != nil {
@@ -2789,7 +2789,7 @@ func compareRail(p ComparePage) templ.Component {
2789 var templ_7745c5c3_Var138 string2789 var templ_7745c5c3_Var138 string
2790 templ_7745c5c3_Var138, templ_7745c5c3_Err = templ.JoinStringErrs(itoa(len(p.Ahead)))2790 templ_7745c5c3_Var138, templ_7745c5c3_Err = templ.JoinStringErrs(itoa(len(p.Ahead)))
2791 if templ_7745c5c3_Err != nil {2791 if templ_7745c5c3_Err != nil {
2792- return templ.Error{Err: templ_7745c5c3_Err, FileName: `internal/adapters/web/mr.templ`, Line: 520, Col: 67}2792+ return templ.Error{Err: templ_7745c5c3_Err, FileName: `internal/adapters/web/mr.templ`, Line: 525, Col: 67}
2793 }2793 }
2794 _, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(templ.EscapeString(templ_7745c5c3_Var138))2794 _, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(templ.EscapeString(templ_7745c5c3_Var138))
2795 if templ_7745c5c3_Err != nil {2795 if templ_7745c5c3_Err != nil {
@@ -2807,7 +2807,7 @@ func compareRail(p ComparePage) templ.Component {
2807 var templ_7745c5c3_Var139 templ.SafeURL2807 var templ_7745c5c3_Var139 templ.SafeURL
2808 templ_7745c5c3_Var139, templ_7745c5c3_Err = templ.JoinURLErrs(templ.SafeURL(c.CHref))2808 templ_7745c5c3_Var139, templ_7745c5c3_Err = templ.JoinURLErrs(templ.SafeURL(c.CHref))
2809 if templ_7745c5c3_Err != nil {2809 if templ_7745c5c3_Err != nil {
2810- return templ.Error{Err: templ_7745c5c3_Err, FileName: `internal/adapters/web/mr.templ`, Line: 524, Col: 37}2810+ return templ.Error{Err: templ_7745c5c3_Err, FileName: `internal/adapters/web/mr.templ`, Line: 529, Col: 37}
2811 }2811 }
2812 _, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(templ.EscapeString(templ_7745c5c3_Var139))2812 _, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(templ.EscapeString(templ_7745c5c3_Var139))
2813 if templ_7745c5c3_Err != nil {2813 if templ_7745c5c3_Err != nil {
@@ -2820,7 +2820,7 @@ func compareRail(p ComparePage) templ.Component {
2820 var templ_7745c5c3_Var140 string2820 var templ_7745c5c3_Var140 string
2821 templ_7745c5c3_Var140, templ_7745c5c3_Err = templ.JoinStringErrs(c.Short)2821 templ_7745c5c3_Var140, templ_7745c5c3_Err = templ.JoinStringErrs(c.Short)
2822 if templ_7745c5c3_Err != nil {2822 if templ_7745c5c3_Err != nil {
2823- return templ.Error{Err: templ_7745c5c3_Err, FileName: `internal/adapters/web/mr.templ`, Line: 524, Col: 49}2823+ return templ.Error{Err: templ_7745c5c3_Err, FileName: `internal/adapters/web/mr.templ`, Line: 529, Col: 49}
2824 }2824 }
2825 _, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(templ.EscapeString(templ_7745c5c3_Var140))2825 _, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(templ.EscapeString(templ_7745c5c3_Var140))
2826 if templ_7745c5c3_Err != nil {2826 if templ_7745c5c3_Err != nil {
@@ -2833,7 +2833,7 @@ func compareRail(p ComparePage) templ.Component {
2833 var templ_7745c5c3_Var141 string2833 var templ_7745c5c3_Var141 string
2834 templ_7745c5c3_Var141, templ_7745c5c3_Err = templ.JoinStringErrs(c.Subject)2834 templ_7745c5c3_Var141, templ_7745c5c3_Err = templ.JoinStringErrs(c.Subject)
2835 if templ_7745c5c3_Err != nil {2835 if templ_7745c5c3_Err != nil {
2836- return templ.Error{Err: templ_7745c5c3_Err, FileName: `internal/adapters/web/mr.templ`, Line: 525, Col: 32}2836+ return templ.Error{Err: templ_7745c5c3_Err, FileName: `internal/adapters/web/mr.templ`, Line: 530, Col: 32}
2837 }2837 }
2838 _, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(templ.EscapeString(templ_7745c5c3_Var141))2838 _, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(templ.EscapeString(templ_7745c5c3_Var141))
2839 if templ_7745c5c3_Err != nil {2839 if templ_7745c5c3_Err != nil {
@@ -2846,7 +2846,7 @@ func compareRail(p ComparePage) templ.Component {
2846 var templ_7745c5c3_Var142 string2846 var templ_7745c5c3_Var142 string
2847 templ_7745c5c3_Var142, templ_7745c5c3_Err = templ.JoinStringErrs(c.Author)2847 templ_7745c5c3_Var142, templ_7745c5c3_Err = templ.JoinStringErrs(c.Author)
2848 if templ_7745c5c3_Err != nil {2848 if templ_7745c5c3_Err != nil {
2849- return templ.Error{Err: templ_7745c5c3_Err, FileName: `internal/adapters/web/mr.templ`, Line: 527, Col: 16}2849+ return templ.Error{Err: templ_7745c5c3_Err, FileName: `internal/adapters/web/mr.templ`, Line: 532, Col: 16}
2850 }2850 }
2851 _, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(templ.EscapeString(templ_7745c5c3_Var142))2851 _, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(templ.EscapeString(templ_7745c5c3_Var142))
2852 if templ_7745c5c3_Err != nil {2852 if templ_7745c5c3_Err != nil {
@@ -2860,7 +2860,7 @@ func compareRail(p ComparePage) templ.Component {
2860 var templ_7745c5c3_Var143 string2860 var templ_7745c5c3_Var143 string
2861 templ_7745c5c3_Var143, templ_7745c5c3_Err = templ.JoinStringErrs(" · ")2861 templ_7745c5c3_Var143, templ_7745c5c3_Err = templ.JoinStringErrs(" · ")
2862 if templ_7745c5c3_Err != nil {2862 if templ_7745c5c3_Err != nil {
2863- return templ.Error{Err: templ_7745c5c3_Err, FileName: `internal/adapters/web/mr.templ`, Line: 529, Col: 15}2863+ return templ.Error{Err: templ_7745c5c3_Err, FileName: `internal/adapters/web/mr.templ`, Line: 534, Col: 15}
2864 }2864 }
2865 _, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(templ.EscapeString(templ_7745c5c3_Var143))2865 _, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(templ.EscapeString(templ_7745c5c3_Var143))
2866 if templ_7745c5c3_Err != nil {2866 if templ_7745c5c3_Err != nil {
@@ -2873,7 +2873,7 @@ func compareRail(p ComparePage) templ.Component {
2873 var templ_7745c5c3_Var144 string2873 var templ_7745c5c3_Var144 string
2874 templ_7745c5c3_Var144, templ_7745c5c3_Err = templ.ResolveAttributeValue(c.WhenAt)2874 templ_7745c5c3_Var144, templ_7745c5c3_Err = templ.ResolveAttributeValue(c.WhenAt)
2875 if templ_7745c5c3_Err != nil {2875 if templ_7745c5c3_Err != nil {
2876- return templ.Error{Err: templ_7745c5c3_Err, FileName: `internal/adapters/web/mr.templ`, Line: 529, Col: 42}2876+ return templ.Error{Err: templ_7745c5c3_Err, FileName: `internal/adapters/web/mr.templ`, Line: 534, Col: 42}
2877 }2877 }
2878 _, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(templ_7745c5c3_Var144)2878 _, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(templ_7745c5c3_Var144)
2879 if templ_7745c5c3_Err != nil {2879 if templ_7745c5c3_Err != nil {
@@ -2886,7 +2886,7 @@ func compareRail(p ComparePage) templ.Component {
2886 var templ_7745c5c3_Var145 string2886 var templ_7745c5c3_Var145 string
2887 templ_7745c5c3_Var145, templ_7745c5c3_Err = templ.JoinStringErrs(c.When)2887 templ_7745c5c3_Var145, templ_7745c5c3_Err = templ.JoinStringErrs(c.When)
2888 if templ_7745c5c3_Err != nil {2888 if templ_7745c5c3_Err != nil {
2889- return templ.Error{Err: templ_7745c5c3_Err, FileName: `internal/adapters/web/mr.templ`, Line: 529, Col: 53}2889+ return templ.Error{Err: templ_7745c5c3_Err, FileName: `internal/adapters/web/mr.templ`, Line: 534, Col: 53}
2890 }2890 }
2891 _, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(templ.EscapeString(templ_7745c5c3_Var145))2891 _, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(templ.EscapeString(templ_7745c5c3_Var145))
2892 if templ_7745c5c3_Err != nil {2892 if templ_7745c5c3_Err != nil {
@@ -2914,7 +2914,7 @@ func compareRail(p ComparePage) templ.Component {
2914 var templ_7745c5c3_Var146 string2914 var templ_7745c5c3_Var146 string
2915 templ_7745c5c3_Var146, templ_7745c5c3_Err = templ.JoinStringErrs(p.Target)2915 templ_7745c5c3_Var146, templ_7745c5c3_Err = templ.JoinStringErrs(p.Target)
2916 if templ_7745c5c3_Err != nil {2916 if templ_7745c5c3_Err != nil {
2917- return templ.Error{Err: templ_7745c5c3_Err, FileName: `internal/adapters/web/mr.templ`, Line: 536, Col: 47}2917+ return templ.Error{Err: templ_7745c5c3_Err, FileName: `internal/adapters/web/mr.templ`, Line: 541, Col: 47}
2918 }2918 }
2919 _, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(templ.EscapeString(templ_7745c5c3_Var146))2919 _, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(templ.EscapeString(templ_7745c5c3_Var146))
2920 if templ_7745c5c3_Err != nil {2920 if templ_7745c5c3_Err != nil {
@@ -2937,7 +2937,7 @@ func compareRail(p ComparePage) templ.Component {
2937 var templ_7745c5c3_Var147 string2937 var templ_7745c5c3_Var147 string
2938 templ_7745c5c3_Var147, templ_7745c5c3_Err = templ.JoinStringErrs(itoa(len(p.Files)))2938 templ_7745c5c3_Var147, templ_7745c5c3_Err = templ.JoinStringErrs(itoa(len(p.Files)))
2939 if templ_7745c5c3_Err != nil {2939 if templ_7745c5c3_Err != nil {
2940- return templ.Error{Err: templ_7745c5c3_Err, FileName: `internal/adapters/web/mr.templ`, Line: 541, Col: 66}2940+ return templ.Error{Err: templ_7745c5c3_Err, FileName: `internal/adapters/web/mr.templ`, Line: 546, Col: 66}
2941 }2941 }
2942 _, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(templ.EscapeString(templ_7745c5c3_Var147))2942 _, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(templ.EscapeString(templ_7745c5c3_Var147))
2943 if templ_7745c5c3_Err != nil {2943 if templ_7745c5c3_Err != nil {
M internal/adapters/web/static/css/20-shell.css +1 -0
@@ -20,6 +20,7 @@
2020 .i-branch { --i: url(icons/branch.svg); }
2121 .i-search { --i: url(icons/search.svg); }
2222 .i-file { --i: url(icons/file.svg); }
23+ .i-chevron { --i: url(icons/chevron.svg); }
2324 .i-tag { --i: url(icons/tag.svg); }
2425 .i-user { --i: url(icons/user.svg); }
2526 .i-key { --i: url(icons/key.svg); }
@@ -20,6 +20,7 @@
20 .i-branch { --i: url(icons/branch.svg); }20 .i-branch { --i: url(icons/branch.svg); }
21 .i-search { --i: url(icons/search.svg); }21 .i-search { --i: url(icons/search.svg); }
22 .i-file { --i: url(icons/file.svg); }22 .i-file { --i: url(icons/file.svg); }
23+ .i-chevron { --i: url(icons/chevron.svg); }
23 .i-tag { --i: url(icons/tag.svg); }24 .i-tag { --i: url(icons/tag.svg); }
24 .i-user { --i: url(icons/user.svg); }25 .i-user { --i: url(icons/user.svg); }
25 .i-key { --i: url(icons/key.svg); }26 .i-key { --i: url(icons/key.svg); }
M internal/adapters/web/static/css/60-mr.css +16 -11
@@ -75,20 +75,19 @@
7575 & .clone code { white-space: pre-wrap; overflow-wrap: anywhere; }
7676 }
7777
78- /* the rail of a merge request: the list of files on top, which follows the
79- review and scrolls on its own; checks, commits and settings scroll with
80- the page. Only on a two-column layout. */
78+ /* the rail of a merge request follows the review: it sticks under the
79+ header, one screen high, and scrolls on its own to its checks, commits
80+ and settings. The list of files keeps its own scroll, under a height, so
81+ that the blocks below it stay in reach. Only on a two-column layout. */
8182 @media (min-width: 1081px) {
82- /* the rail runs the height of the content, so that its first block can
83- stick all along the diff */
84- .work.has-rail:has(.r-files) { align-items: stretch; }
85- .rail:has(.r-files) { align-self: stretch; }
86- .rail .r-files {
87- position: sticky; top: calc(var(--hdr-h, 0px) + var(--s4)); z-index: 3;
88- display: flex; flex-direction: column;
83+ .rail:has(.r-files) {
84+ position: sticky; top: calc(var(--hdr-h, 0px) + var(--s4));
8985 max-height: calc(100dvh - var(--hdr-h, 0px) - var(--s4) * 2);
86+ overflow-y: auto; overscroll-behavior: contain; scrollbar-width: thin;
9087 }
91- .rail .r-files > .files { overflow-y: auto; overscroll-behavior: contain; scrollbar-width: thin; min-height: 0; }
88+ /* the blocks keep their height: the rail scrolls, it does not squeeze them */
89+ .rail:has(.r-files) > * { flex: none; }
90+ .rail .r-files > .files { max-height: 55dvh; overflow-y: auto; overscroll-behavior: contain; scrollbar-width: thin; }
9291 }
9392 /* on one column the rail goes under the diff: the list of files keeps its
9493 own scroll, under a height */
@@ -97,6 +96,12 @@
9796 }
9897 .r-files {
9998 & > h2 kbd { margin-left: auto; }
99+ & > h2 .fold { width: 24px; height: 24px; margin: -2px -6px -2px 0; background: none; border-color: transparent; color: var(--ink-dim); }
100+ & > h2 .fold:hover { color: var(--ink-hi); border-color: var(--border-strong); }
101+ & > h2 .fold .ico { transition: transform .15s; }
102+ &[data-folded] > h2 { border-bottom: 0; }
103+ &[data-folded] > h2 .fold .ico { transform: rotate(-90deg); }
104+ &[data-folded] > :not(h2) { display: none; }
100105 & > .ffilter { margin: var(--s2) var(--s3) 0; }
101106 & > .ffilter input {
102107 width: 100%; height: 30px; padding: 0 var(--s2); font: inherit; font-size: var(--fs-s); color: inherit;
@@ -75,20 +75,19 @@
75 & .clone code { white-space: pre-wrap; overflow-wrap: anywhere; }75 & .clone code { white-space: pre-wrap; overflow-wrap: anywhere; }
76 }76 }
77 77
78- /* the rail of a merge request: the list of files on top, which follows the78+ /* the rail of a merge request follows the review: it sticks under the
79- review and scrolls on its own; checks, commits and settings scroll with79+ header, one screen high, and scrolls on its own to its checks, commits
80- the page. Only on a two-column layout. */80+ and settings. The list of files keeps its own scroll, under a height, so
81+ that the blocks below it stay in reach. Only on a two-column layout. */
81 @media (min-width: 1081px) {82 @media (min-width: 1081px) {
82- /* the rail runs the height of the content, so that its first block can83+ .rail:has(.r-files) {
83- stick all along the diff */84+ position: sticky; top: calc(var(--hdr-h, 0px) + var(--s4));
84- .work.has-rail:has(.r-files) { align-items: stretch; }
85- .rail:has(.r-files) { align-self: stretch; }
86- .rail .r-files {
87- position: sticky; top: calc(var(--hdr-h, 0px) + var(--s4)); z-index: 3;
88- display: flex; flex-direction: column;
89 max-height: calc(100dvh - var(--hdr-h, 0px) - var(--s4) * 2);85 max-height: calc(100dvh - var(--hdr-h, 0px) - var(--s4) * 2);
86+ overflow-y: auto; overscroll-behavior: contain; scrollbar-width: thin;
90 }87 }
91- .rail .r-files > .files { overflow-y: auto; overscroll-behavior: contain; scrollbar-width: thin; min-height: 0; }88+ /* the blocks keep their height: the rail scrolls, it does not squeeze them */
89+ .rail:has(.r-files) > * { flex: none; }
90+ .rail .r-files > .files { max-height: 55dvh; overflow-y: auto; overscroll-behavior: contain; scrollbar-width: thin; }
92 }91 }
93 /* on one column the rail goes under the diff: the list of files keeps its92 /* on one column the rail goes under the diff: the list of files keeps its
94 own scroll, under a height */93 own scroll, under a height */
@@ -97,6 +96,12 @@
97 }96 }
98 .r-files {97 .r-files {
99 & > h2 kbd { margin-left: auto; }98 & > h2 kbd { margin-left: auto; }
99+ & > h2 .fold { width: 24px; height: 24px; margin: -2px -6px -2px 0; background: none; border-color: transparent; color: var(--ink-dim); }
100+ & > h2 .fold:hover { color: var(--ink-hi); border-color: var(--border-strong); }
101+ & > h2 .fold .ico { transition: transform .15s; }
102+ &[data-folded] > h2 { border-bottom: 0; }
103+ &[data-folded] > h2 .fold .ico { transform: rotate(-90deg); }
104+ &[data-folded] > :not(h2) { display: none; }
100 & > .ffilter { margin: var(--s2) var(--s3) 0; }105 & > .ffilter { margin: var(--s2) var(--s3) 0; }
101 & > .ffilter input {106 & > .ffilter input {
102 width: 100%; height: 30px; padding: 0 var(--s2); font: inherit; font-size: var(--fs-s); color: inherit;107 width: 100%; height: 30px; padding: 0 var(--s2); font: inherit; font-size: var(--fs-s); color: inherit;
A internal/adapters/web/static/icons/chevron.svg +1 -0
@@ -0,0 +1,1 @@
1+<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24" fill="none" stroke="#000" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"><path d="m6 9 6 6 6-6"/></svg>
@@ -0,0 +1,1 @@
1+<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24" fill="none" stroke="#000" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"><path d="m6 9 6 6 6-6"/></svg>
M internal/adapters/web/static/js/mr.js +29 -3
@@ -9,8 +9,9 @@
99 // on its button, 1-9 pick a mode, D toggles the branch deletion, Enter
1010 // submits (the browser does it: the focus is on the button), Esc closes.
1111 // R marks the head read. Nothing merges on one key.
12-// 3. g f puts the focus in the list of files; j / k move in it, Enter opens
13-// the file, Esc goes back to the diff.
12+// 3. g f puts the focus in the list of files (opening it when folded); j / k
13+// move in it, Enter opens the file, Esc goes back to the diff. The button
14+// of its header folds the list, and the choice is remembered.
1415 //
1516 // Nothing runs on a page without #diffs[data-mr]. window.ermiteMR.core is pure
1617 // (jstest/mr.test.mjs).
@@ -196,6 +197,7 @@ window.ermiteMR = (() => {
196197 // The list of files by keyboard: g f focuses the current file.
197198 const links = () => $$('.r-files .files > li:not([hidden]) > a');
198199 function focusFiles() {
200+ foldFiles(false);
199201 const all = links();
200202 if (!all.length) return false;
201203 const cur = all.find((a) => a.getAttribute('aria-current') === 'true') || all[0];
@@ -219,6 +221,27 @@ window.ermiteMR = (() => {
219221 return true;
220222 }
221223
224+ // foldFiles folds the list of files to its header, or opens it again:
225+ // toggles without an argument. The choice is kept for the next pages.
226+ function foldFiles(fold) {
227+ const sec = $('.r-files');
228+ const btn = sec && $('button.fold', sec);
229+ if (!btn) return;
230+ if (fold === undefined) fold = !sec.hasAttribute('data-folded');
231+ sec.toggleAttribute('data-folded', fold);
232+ btn.setAttribute('aria-expanded', String(!fold));
233+ btn.title = fold ? 'open the list of files' : 'fold the list of files';
234+ $('.sr', btn).textContent = btn.title;
235+ // The list did not follow the review while folded: show its current file,
236+ // moving the list only (never the page).
237+ const box = !fold && $('.files', sec);
238+ const a = box && $('a[aria-current="true"]', box);
239+ if (a && (a.offsetTop < box.scrollTop || a.offsetTop + a.offsetHeight > box.scrollTop + box.clientHeight)) {
240+ box.scrollTop = a.offsetTop - (box.clientHeight - a.offsetHeight) / 2;
241+ }
242+ try { localStorage.setItem('mr-files-folded', fold ? '1' : ''); } catch { /* storage refused: holds for this page */ }
243+ }
244+
222245 // openFile opens the file of a link of the list (and loads it first).
223246 function openFile(id) {
224247 const f = document.getElementById(id);
@@ -228,6 +251,9 @@ window.ermiteMR = (() => {
228251
229252 function start() {
230253 if (!$('#diffs[data-mr]')) return;
254+ let folded = false;
255+ try { folded = localStorage.getItem('mr-files-folded') === '1'; } catch { /* no storage: open */ }
256+ if (folded) foldFiles(true);
231257 watch();
232258 // A link to a file or a comment that is not loaded yet.
233259 const hash = () => {
@@ -242,7 +268,7 @@ window.ermiteMR = (() => {
242268 });
243269 }
244270
245- return { core, start, load, reveal, openMerge, closeMenus, menuKey, markRead, focusFiles, stepFiles, leaveFiles, openFile };
271+ return { core, start, load, reveal, openMerge, closeMenus, menuKey, markRead, focusFiles, stepFiles, leaveFiles, foldFiles, openFile };
246272 })();
247273
248274 if (document.readyState === 'loading') document.addEventListener('DOMContentLoaded', () => window.ermiteMR.start());
@@ -9,8 +9,9 @@
9 // on its button, 1-9 pick a mode, D toggles the branch deletion, Enter9 // on its button, 1-9 pick a mode, D toggles the branch deletion, Enter
10 // submits (the browser does it: the focus is on the button), Esc closes.10 // submits (the browser does it: the focus is on the button), Esc closes.
11 // R marks the head read. Nothing merges on one key.11 // R marks the head read. Nothing merges on one key.
12-// 3. g f puts the focus in the list of files; j / k move in it, Enter opens12+// 3. g f puts the focus in the list of files (opening it when folded); j / k
13-// the file, Esc goes back to the diff.13+// move in it, Enter opens the file, Esc goes back to the diff. The button
14+// of its header folds the list, and the choice is remembered.
14 //15 //
15 // Nothing runs on a page without #diffs[data-mr]. window.ermiteMR.core is pure16 // Nothing runs on a page without #diffs[data-mr]. window.ermiteMR.core is pure
16 // (jstest/mr.test.mjs).17 // (jstest/mr.test.mjs).
@@ -196,6 +197,7 @@ window.ermiteMR = (() => {
196 // The list of files by keyboard: g f focuses the current file.197 // The list of files by keyboard: g f focuses the current file.
197 const links = () => $$('.r-files .files > li:not([hidden]) > a');198 const links = () => $$('.r-files .files > li:not([hidden]) > a');
198 function focusFiles() {199 function focusFiles() {
200+ foldFiles(false);
199 const all = links();201 const all = links();
200 if (!all.length) return false;202 if (!all.length) return false;
201 const cur = all.find((a) => a.getAttribute('aria-current') === 'true') || all[0];203 const cur = all.find((a) => a.getAttribute('aria-current') === 'true') || all[0];
@@ -219,6 +221,27 @@ window.ermiteMR = (() => {
219 return true;221 return true;
220 }222 }
221 223
224+ // foldFiles folds the list of files to its header, or opens it again:
225+ // toggles without an argument. The choice is kept for the next pages.
226+ function foldFiles(fold) {
227+ const sec = $('.r-files');
228+ const btn = sec && $('button.fold', sec);
229+ if (!btn) return;
230+ if (fold === undefined) fold = !sec.hasAttribute('data-folded');
231+ sec.toggleAttribute('data-folded', fold);
232+ btn.setAttribute('aria-expanded', String(!fold));
233+ btn.title = fold ? 'open the list of files' : 'fold the list of files';
234+ $('.sr', btn).textContent = btn.title;
235+ // The list did not follow the review while folded: show its current file,
236+ // moving the list only (never the page).
237+ const box = !fold && $('.files', sec);
238+ const a = box && $('a[aria-current="true"]', box);
239+ if (a && (a.offsetTop < box.scrollTop || a.offsetTop + a.offsetHeight > box.scrollTop + box.clientHeight)) {
240+ box.scrollTop = a.offsetTop - (box.clientHeight - a.offsetHeight) / 2;
241+ }
242+ try { localStorage.setItem('mr-files-folded', fold ? '1' : ''); } catch { /* storage refused: holds for this page */ }
243+ }
244+
222 // openFile opens the file of a link of the list (and loads it first).245 // openFile opens the file of a link of the list (and loads it first).
223 function openFile(id) {246 function openFile(id) {
224 const f = document.getElementById(id);247 const f = document.getElementById(id);
@@ -228,6 +251,9 @@ window.ermiteMR = (() => {
228 251
229 function start() {252 function start() {
230 if (!$('#diffs[data-mr]')) return;253 if (!$('#diffs[data-mr]')) return;
254+ let folded = false;
255+ try { folded = localStorage.getItem('mr-files-folded') === '1'; } catch { /* no storage: open */ }
256+ if (folded) foldFiles(true);
231 watch();257 watch();
232 // A link to a file or a comment that is not loaded yet.258 // A link to a file or a comment that is not loaded yet.
233 const hash = () => {259 const hash = () => {
@@ -242,7 +268,7 @@ window.ermiteMR = (() => {
242 });268 });
243 }269 }
244 270
245- return { core, start, load, reveal, openMerge, closeMenus, menuKey, markRead, focusFiles, stepFiles, leaveFiles, openFile };271+ return { core, start, load, reveal, openMerge, closeMenus, menuKey, markRead, focusFiles, stepFiles, leaveFiles, foldFiles, openFile };
246 })();272 })();
247 273
248 if (document.readyState === 'loading') document.addEventListener('DOMContentLoaded', () => window.ermiteMR.start());274 if (document.readyState === 'loading') document.addEventListener('DOMContentLoaded', () => window.ermiteMR.start());

Keyboard shortcuts

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

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

Branches 2

Tags 44

↑↓ moveenter openesc close