v0.25.1 7fabed9

diff_templ.go RawHistoryFolder

1// Code generated by templ - DO NOT EDIT.
2
3// templ: version: v0.3.1020
4// SPDX-License-Identifier: AGPL-3.0-or-later
5
6package web
7
8//lint:file-ignore SA4006 This context is only used if a nested component is present.
9
10import "github.com/a-h/templ"
11import templruntime "github.com/a-h/templ/runtime"
12
13// Commit is a commit: the message and facts, the diff tools, the diff.
14func Commit(l Layout, p CommitPage) templ.Component {
15	return templruntime.GeneratedTemplate(func(templ_7745c5c3_Input templruntime.GeneratedComponentInput) (templ_7745c5c3_Err error) {
16		templ_7745c5c3_W, ctx := templ_7745c5c3_Input.Writer, templ_7745c5c3_Input.Context
17		if templ_7745c5c3_CtxErr := ctx.Err(); templ_7745c5c3_CtxErr != nil {
18			return templ_7745c5c3_CtxErr
19		}
20		templ_7745c5c3_Buffer, templ_7745c5c3_IsBuffer := templruntime.GetBuffer(templ_7745c5c3_W)
21		if !templ_7745c5c3_IsBuffer {
22			defer func() {
23				templ_7745c5c3_BufErr := templruntime.ReleaseBuffer(templ_7745c5c3_Buffer)
24				if templ_7745c5c3_Err == nil {
25					templ_7745c5c3_Err = templ_7745c5c3_BufErr
26				}
27			}()
28		}
29		ctx = templ.InitializeContext(ctx)
30		templ_7745c5c3_Var1 := templ.GetChildren(ctx)
31		if templ_7745c5c3_Var1 == nil {
32			templ_7745c5c3_Var1 = templ.NopComponent
33		}
34		ctx = templ.ClearChildren(ctx)
35		templ_7745c5c3_Var2 := templruntime.GeneratedTemplate(func(templ_7745c5c3_Input templruntime.GeneratedComponentInput) (templ_7745c5c3_Err error) {
36			templ_7745c5c3_W, ctx := templ_7745c5c3_Input.Writer, templ_7745c5c3_Input.Context
37			templ_7745c5c3_Buffer, templ_7745c5c3_IsBuffer := templruntime.GetBuffer(templ_7745c5c3_W)
38			if !templ_7745c5c3_IsBuffer {
39				defer func() {
40					templ_7745c5c3_BufErr := templruntime.ReleaseBuffer(templ_7745c5c3_Buffer)
41					if templ_7745c5c3_Err == nil {
42						templ_7745c5c3_Err = templ_7745c5c3_BufErr
43					}
44				}()
45			}
46			ctx = templ.InitializeContext(ctx)
47			templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 1, "<header class=\"show\"><h1>")
48			if templ_7745c5c3_Err != nil {
49				return templ_7745c5c3_Err
50			}
51			var templ_7745c5c3_Var3 string
52			templ_7745c5c3_Var3, templ_7745c5c3_Err = templ.JoinStringErrs(p.Subject)
53			if templ_7745c5c3_Err != nil {
54				return templ.Error{Err: templ_7745c5c3_Err, FileName: `internal/adapters/web/diff.templ`, Line: 9, Col: 18}
55			}
56			_, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(templ.EscapeString(templ_7745c5c3_Var3))
57			if templ_7745c5c3_Err != nil {
58				return templ_7745c5c3_Err
59			}
60			templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 2, "</h1>")
61			if templ_7745c5c3_Err != nil {
62				return templ_7745c5c3_Err
63			}
64			if p.Body != "" {
65				templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 3, "<pre class=\"msg\">")
66				if templ_7745c5c3_Err != nil {
67					return templ_7745c5c3_Err
68				}
69				var templ_7745c5c3_Var4 string
70				templ_7745c5c3_Var4, templ_7745c5c3_Err = templ.JoinStringErrs(p.Body)
71				if templ_7745c5c3_Err != nil {
72					return templ.Error{Err: templ_7745c5c3_Err, FileName: `internal/adapters/web/diff.templ`, Line: 11, Col: 29}
73				}
74				_, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(templ.EscapeString(templ_7745c5c3_Var4))
75				if templ_7745c5c3_Err != nil {
76					return templ_7745c5c3_Err
77				}
78				templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 4, "</pre>")
79				if templ_7745c5c3_Err != nil {
80					return templ_7745c5c3_Err
81				}
82			}
83			templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 5, "<dl class=\"kv show-kv\"><dt>commit</dt><dd>")
84			if templ_7745c5c3_Err != nil {
85				return templ_7745c5c3_Err
86			}
87			var templ_7745c5c3_Var5 string
88			templ_7745c5c3_Var5, templ_7745c5c3_Err = templ.JoinStringErrs(p.SHA)
89			if templ_7745c5c3_Err != nil {
90				return templ.Error{Err: templ_7745c5c3_Err, FileName: `internal/adapters/web/diff.templ`, Line: 15, Col: 15}
91			}
92			_, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(templ.EscapeString(templ_7745c5c3_Var5))
93			if templ_7745c5c3_Err != nil {
94				return templ_7745c5c3_Err
95			}
96			templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 6, "</dd><dt>author</dt><dd>")
97			if templ_7745c5c3_Err != nil {
98				return templ_7745c5c3_Err
99			}
100			templ_7745c5c3_Err = personView(p.Author).Render(ctx, templ_7745c5c3_Buffer)
101			if templ_7745c5c3_Err != nil {
102				return templ_7745c5c3_Err
103			}
104			templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 7, "</dd>")
105			if templ_7745c5c3_Err != nil {
106				return templ_7745c5c3_Err
107			}
108			if p.Committer != nil {
109				templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 8, "<dt>committer</dt><dd>")
110				if templ_7745c5c3_Err != nil {
111					return templ_7745c5c3_Err
112				}
113				templ_7745c5c3_Err = personView(*p.Committer).Render(ctx, templ_7745c5c3_Buffer)
114				if templ_7745c5c3_Err != nil {
115					return templ_7745c5c3_Err
116				}
117				templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 9, "</dd>")
118				if templ_7745c5c3_Err != nil {
119					return templ_7745c5c3_Err
120				}
121			}
122			templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 10, "<dt>")
123			if templ_7745c5c3_Err != nil {
124				return templ_7745c5c3_Err
125			}
126			if p.Merge {
127				templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 11, "merge of")
128				if templ_7745c5c3_Err != nil {
129					return templ_7745c5c3_Err
130				}
131			} else {
132				templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 12, "parent")
133				if templ_7745c5c3_Err != nil {
134					return templ_7745c5c3_Err
135				}
136			}
137			templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 13, "</dt><dd>")
138			if templ_7745c5c3_Err != nil {
139				return templ_7745c5c3_Err
140			}
141			if p.Root {
142				templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 14, "none (root commit) ")
143				if templ_7745c5c3_Err != nil {
144					return templ_7745c5c3_Err
145				}
146			}
147			for i, par := range p.Parents {
148				if i > 0 {
149					var templ_7745c5c3_Var6 string
150					templ_7745c5c3_Var6, templ_7745c5c3_Err = templ.JoinStringErrs(" + ")
151					if templ_7745c5c3_Err != nil {
152						return templ.Error{Err: templ_7745c5c3_Err, FileName: `internal/adapters/web/diff.templ`, Line: 35, Col: 14}
153					}
154					_, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(templ.EscapeString(templ_7745c5c3_Var6))
155					if templ_7745c5c3_Err != nil {
156						return templ_7745c5c3_Err
157					}
158				}
159				templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 15, " <a href=\"")
160				if templ_7745c5c3_Err != nil {
161					return templ_7745c5c3_Err
162				}
163				var templ_7745c5c3_Var7 templ.SafeURL
164				templ_7745c5c3_Var7, templ_7745c5c3_Err = templ.JoinURLErrs(templ.SafeURL(par.Href))
165				if templ_7745c5c3_Err != nil {
166					return templ.Error{Err: templ_7745c5c3_Err, FileName: `internal/adapters/web/diff.templ`, Line: 37, Col: 39}
167				}
168				_, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(templ.EscapeString(templ_7745c5c3_Var7))
169				if templ_7745c5c3_Err != nil {
170					return templ_7745c5c3_Err
171				}
172				templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 16, "\">")
173				if templ_7745c5c3_Err != nil {
174					return templ_7745c5c3_Err
175				}
176				var templ_7745c5c3_Var8 string
177				templ_7745c5c3_Var8, templ_7745c5c3_Err = templ.JoinStringErrs(par.Label)
178				if templ_7745c5c3_Err != nil {
179					return templ.Error{Err: templ_7745c5c3_Err, FileName: `internal/adapters/web/diff.templ`, Line: 37, Col: 53}
180				}
181				_, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(templ.EscapeString(templ_7745c5c3_Var8))
182				if templ_7745c5c3_Err != nil {
183					return templ_7745c5c3_Err
184				}
185				templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 17, "</a> ")
186				if templ_7745c5c3_Err != nil {
187					return templ_7745c5c3_Err
188				}
189			}
190			if p.Merge {
191				var templ_7745c5c3_Var9 string
192				templ_7745c5c3_Var9, templ_7745c5c3_Err = templ.JoinStringErrs(" · diff against the first parent")
193				if templ_7745c5c3_Err != nil {
194					return templ.Error{Err: templ_7745c5c3_Err, FileName: `internal/adapters/web/diff.templ`, Line: 40, Col: 43}
195				}
196				_, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(templ.EscapeString(templ_7745c5c3_Var9))
197				if templ_7745c5c3_Err != nil {
198					return templ_7745c5c3_Err
199				}
200			}
201			templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 18, "</dd>")
202			if templ_7745c5c3_Err != nil {
203				return templ_7745c5c3_Err
204			}
205			if p.Checks.Total > 0 {
206				templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 19, "<dt>checks</dt><dd>")
207				if templ_7745c5c3_Err != nil {
208					return templ_7745c5c3_Err
209				}
210				templ_7745c5c3_Err = CommitChecks(p.Checks).Render(ctx, templ_7745c5c3_Buffer)
211				if templ_7745c5c3_Err != nil {
212					return templ_7745c5c3_Err
213				}
214				templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 20, "</dd>")
215				if templ_7745c5c3_Err != nil {
216					return templ_7745c5c3_Err
217				}
218			}
219			if len(p.Refs) > 0 {
220				templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 21, "<dt>refs</dt><dd>")
221				if templ_7745c5c3_Err != nil {
222					return templ_7745c5c3_Err
223				}
224				for _, r := range p.Refs {
225					templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 22, "<span class=\"pill\">")
226					if templ_7745c5c3_Err != nil {
227						return templ_7745c5c3_Err
228					}
229					var templ_7745c5c3_Var10 string
230					templ_7745c5c3_Var10, templ_7745c5c3_Err = templ.JoinStringErrs(r)
231					if templ_7745c5c3_Err != nil {
232						return templ.Error{Err: templ_7745c5c3_Err, FileName: `internal/adapters/web/diff.templ`, Line: 51, Col: 29}
233					}
234					_, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(templ.EscapeString(templ_7745c5c3_Var10))
235					if templ_7745c5c3_Err != nil {
236						return templ_7745c5c3_Err
237					}
238					templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 23, "</span>")
239					if templ_7745c5c3_Err != nil {
240						return templ_7745c5c3_Err
241					}
242				}
243				templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 24, "</dd>")
244				if templ_7745c5c3_Err != nil {
245					return templ_7745c5c3_Err
246				}
247			}
248			templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 25, "</dl></header><div class=\"diff-tools\" role=\"group\" aria-label=\"Diff view\"><span class=\"dim\">")
249			if templ_7745c5c3_Err != nil {
250				return templ_7745c5c3_Err
251			}
252			var templ_7745c5c3_Var11 string
253			templ_7745c5c3_Var11, templ_7745c5c3_Err = templ.JoinStringErrs(plural(p.NFiles, "file", "files"))
254			if templ_7745c5c3_Err != nil {
255				return templ.Error{Err: templ_7745c5c3_Err, FileName: `internal/adapters/web/diff.templ`, Line: 58, Col: 56}
256			}
257			_, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(templ.EscapeString(templ_7745c5c3_Var11))
258			if templ_7745c5c3_Err != nil {
259				return templ_7745c5c3_Err
260			}
261			templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 26, " · <span class=\"plus\">+")
262			if templ_7745c5c3_Err != nil {
263				return templ_7745c5c3_Err
264			}
265			var templ_7745c5c3_Var12 string
266			templ_7745c5c3_Var12, templ_7745c5c3_Err = templ.JoinStringErrs(itoa(p.Adds))
267			if templ_7745c5c3_Err != nil {
268				return templ.Error{Err: templ_7745c5c3_Err, FileName: `internal/adapters/web/diff.templ`, Line: 58, Col: 96}
269			}
270			_, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(templ.EscapeString(templ_7745c5c3_Var12))
271			if templ_7745c5c3_Err != nil {
272				return templ_7745c5c3_Err
273			}
274			templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 27, "</span> <span class=\"minus\">-")
275			if templ_7745c5c3_Err != nil {
276				return templ_7745c5c3_Err
277			}
278			var templ_7745c5c3_Var13 string
279			templ_7745c5c3_Var13, templ_7745c5c3_Err = templ.JoinStringErrs(itoa(p.Dels))
280			if templ_7745c5c3_Err != nil {
281				return templ.Error{Err: templ_7745c5c3_Err, FileName: `internal/adapters/web/diff.templ`, Line: 58, Col: 141}
282			}
283			_, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(templ.EscapeString(templ_7745c5c3_Var13))
284			if templ_7745c5c3_Err != nil {
285				return templ_7745c5c3_Err
286			}
287			templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 28, "</span></span> <span class=\"grow\"></span>")
288			if templ_7745c5c3_Err != nil {
289				return templ_7745c5c3_Err
290			}
291			templ_7745c5c3_Err = viewLink(p.DiffView, "unified", "Unified", "u", p.UnifiedHref).Render(ctx, templ_7745c5c3_Buffer)
292			if templ_7745c5c3_Err != nil {
293				return templ_7745c5c3_Err
294			}
295			templ_7745c5c3_Err = viewLink(p.DiffView, "split", "Split", "d", p.SplitHref).Render(ctx, templ_7745c5c3_Buffer)
296			if templ_7745c5c3_Err != nil {
297				return templ_7745c5c3_Err
298			}
299			templ_7745c5c3_Err = collapseButton().Render(ctx, templ_7745c5c3_Buffer)
300			if templ_7745c5c3_Err != nil {
301				return templ_7745c5c3_Err
302			}
303			templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 29, "</div>")
304			if templ_7745c5c3_Err != nil {
305				return templ_7745c5c3_Err
306			}
307			if p.Invisible {
308				templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 30, "<p class=\"notice\">this diff holds invisible characters (direction controls, zero-width characters). They are shown as <span class=\"inv\">&lt;U+XXXX&gt;</span> markers, never applied.</p>")
309				if templ_7745c5c3_Err != nil {
310					return templ_7745c5c3_Err
311				}
312			}
313			templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 31, " ")
314			if templ_7745c5c3_Err != nil {
315				return templ_7745c5c3_Err
316			}
317			if p.Note != "" {
318				templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 32, "<p class=\"notice\">")
319				if templ_7745c5c3_Err != nil {
320					return templ_7745c5c3_Err
321				}
322				var templ_7745c5c3_Var14 string
323				templ_7745c5c3_Var14, templ_7745c5c3_Err = templ.JoinStringErrs(p.Note)
324				if templ_7745c5c3_Err != nil {
325					return templ.Error{Err: templ_7745c5c3_Err, FileName: `internal/adapters/web/diff.templ`, Line: 71, Col: 29}
326				}
327				_, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(templ.EscapeString(templ_7745c5c3_Var14))
328				if templ_7745c5c3_Err != nil {
329					return templ_7745c5c3_Err
330				}
331				templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 33, "</p>")
332				if templ_7745c5c3_Err != nil {
333					return templ_7745c5c3_Err
334				}
335			}
336			templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 34, " <div id=\"diffs\"")
337			if templ_7745c5c3_Err != nil {
338				return templ_7745c5c3_Err
339			}
340			if p.Both {
341				templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 35, " data-diff=\"")
342				if templ_7745c5c3_Err != nil {
343					return templ_7745c5c3_Err
344				}
345				var templ_7745c5c3_Var15 string
346				templ_7745c5c3_Var15, templ_7745c5c3_Err = templ.ResolveAttributeValue(p.View)
347				if templ_7745c5c3_Err != nil {
348					return templ.Error{Err: templ_7745c5c3_Err, FileName: `internal/adapters/web/diff.templ`, Line: 76, Col: 22}
349				}
350				_, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(templ_7745c5c3_Var15)
351				if templ_7745c5c3_Err != nil {
352					return templ_7745c5c3_Err
353				}
354				templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 36, "\"")
355				if templ_7745c5c3_Err != nil {
356					return templ_7745c5c3_Err
357				}
358			} else {
359				templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 37, " data-view=\"")
360				if templ_7745c5c3_Err != nil {
361					return templ_7745c5c3_Err
362				}
363				var templ_7745c5c3_Var16 string
364				templ_7745c5c3_Var16, templ_7745c5c3_Err = templ.ResolveAttributeValue(p.View)
365				if templ_7745c5c3_Err != nil {
366					return templ.Error{Err: templ_7745c5c3_Err, FileName: `internal/adapters/web/diff.templ`, Line: 78, Col: 22}
367				}
368				_, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(templ_7745c5c3_Var16)
369				if templ_7745c5c3_Err != nil {
370					return templ_7745c5c3_Err
371				}
372				templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 38, "\"")
373				if templ_7745c5c3_Err != nil {
374					return templ_7745c5c3_Err
375				}
376			}
377			if p.Both && !p.Pinned {
378				templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 39, " hx-live=\"this.dataset.diff = sessionStorage.getItem('diff') || this.dataset.diff\"")
379				if templ_7745c5c3_Err != nil {
380					return templ_7745c5c3_Err
381				}
382			}
383			templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 40, ">")
384			if templ_7745c5c3_Err != nil {
385				return templ_7745c5c3_Err
386			}
387			for _, f := range p.Files {
388				templ_7745c5c3_Err = DiffFileView(f, p.DiffView).Render(ctx, templ_7745c5c3_Buffer)
389				if templ_7745c5c3_Err != nil {
390					return templ_7745c5c3_Err
391				}
392			}
393			if len(p.Files) == 0 {
394				templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 41, "<p class=\"note\">no changed files")
395				if templ_7745c5c3_Err != nil {
396					return templ_7745c5c3_Err
397				}
398				var templ_7745c5c3_Var17 string
399				templ_7745c5c3_Var17, templ_7745c5c3_Err = templ.JoinStringErrs(" ")
400				if templ_7745c5c3_Err != nil {
401					return templ.Error{Err: templ_7745c5c3_Err, FileName: `internal/adapters/web/diff.templ`, Line: 88, Col: 41}
402				}
403				_, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(templ.EscapeString(templ_7745c5c3_Var17))
404				if templ_7745c5c3_Err != nil {
405					return templ_7745c5c3_Err
406				}
407				templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 42, " ")
408				if templ_7745c5c3_Err != nil {
409					return templ_7745c5c3_Err
410				}
411				if p.Merge {
412					templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 43, "against the first parent.")
413					if templ_7745c5c3_Err != nil {
414						return templ_7745c5c3_Err
415					}
416				} else {
417					templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 44, "in this commit.")
418					if templ_7745c5c3_Err != nil {
419						return templ_7745c5c3_Err
420					}
421				}
422				templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 45, "</p>")
423				if templ_7745c5c3_Err != nil {
424					return templ_7745c5c3_Err
425				}
426			}
427			templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 46, "</div>")
428			if templ_7745c5c3_Err != nil {
429				return templ_7745c5c3_Err
430			}
431			return nil
432		})
433		templ_7745c5c3_Err = Shell(l, commitRail(p)).Render(templ.WithChildren(ctx, templ_7745c5c3_Var2), templ_7745c5c3_Buffer)
434		if templ_7745c5c3_Err != nil {
435			return templ_7745c5c3_Err
436		}
437		return nil
438	})
439}
440
441// viewLink is a button of the diff tools. It is a link, so that the split
442// layout works without JavaScript; with it, and when both layouts are in the
443// page, a click only flips the layout.
444func viewLink(p DiffView, view, label, key, href string) templ.Component {
445	return templruntime.GeneratedTemplate(func(templ_7745c5c3_Input templruntime.GeneratedComponentInput) (templ_7745c5c3_Err error) {
446		templ_7745c5c3_W, ctx := templ_7745c5c3_Input.Writer, templ_7745c5c3_Input.Context
447		if templ_7745c5c3_CtxErr := ctx.Err(); templ_7745c5c3_CtxErr != nil {
448			return templ_7745c5c3_CtxErr
449		}
450		templ_7745c5c3_Buffer, templ_7745c5c3_IsBuffer := templruntime.GetBuffer(templ_7745c5c3_W)
451		if !templ_7745c5c3_IsBuffer {
452			defer func() {
453				templ_7745c5c3_BufErr := templruntime.ReleaseBuffer(templ_7745c5c3_Buffer)
454				if templ_7745c5c3_Err == nil {
455					templ_7745c5c3_Err = templ_7745c5c3_BufErr
456				}
457			}()
458		}
459		ctx = templ.InitializeContext(ctx)
460		templ_7745c5c3_Var18 := templ.GetChildren(ctx)
461		if templ_7745c5c3_Var18 == nil {
462			templ_7745c5c3_Var18 = templ.NopComponent
463		}
464		ctx = templ.ClearChildren(ctx)
465		templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 47, "<a href=\"")
466		if templ_7745c5c3_Err != nil {
467			return templ_7745c5c3_Err
468		}
469		var templ_7745c5c3_Var19 templ.SafeURL
470		templ_7745c5c3_Var19, templ_7745c5c3_Err = templ.JoinURLErrs(templ.SafeURL(href))
471		if templ_7745c5c3_Err != nil {
472			return templ.Error{Err: templ_7745c5c3_Err, FileName: `internal/adapters/web/diff.templ`, Line: 105, Col: 28}
473		}
474		_, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(templ.EscapeString(templ_7745c5c3_Var19))
475		if templ_7745c5c3_Err != nil {
476			return templ_7745c5c3_Err
477		}
478		templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 48, "\" class=\"btn vbtn\" data-view=\"")
479		if templ_7745c5c3_Err != nil {
480			return templ_7745c5c3_Err
481		}
482		var templ_7745c5c3_Var20 string
483		templ_7745c5c3_Var20, templ_7745c5c3_Err = templ.ResolveAttributeValue(view)
484		if templ_7745c5c3_Err != nil {
485			return templ.Error{Err: templ_7745c5c3_Err, FileName: `internal/adapters/web/diff.templ`, Line: 107, Col: 18}
486		}
487		_, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(templ_7745c5c3_Var20)
488		if templ_7745c5c3_Err != nil {
489			return templ_7745c5c3_Err
490		}
491		templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 49, "\" aria-keyshortcuts=\"")
492		if templ_7745c5c3_Err != nil {
493			return templ_7745c5c3_Err
494		}
495		var templ_7745c5c3_Var21 string
496		templ_7745c5c3_Var21, templ_7745c5c3_Err = templ.ResolveAttributeValue(key)
497		if templ_7745c5c3_Err != nil {
498			return templ.Error{Err: templ_7745c5c3_Err, FileName: `internal/adapters/web/diff.templ`, Line: 108, Col: 25}
499		}
500		_, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(templ_7745c5c3_Var21)
501		if templ_7745c5c3_Err != nil {
502			return templ_7745c5c3_Err
503		}
504		templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 50, "\"")
505		if templ_7745c5c3_Err != nil {
506			return templ_7745c5c3_Err
507		}
508		if p.View == view {
509			templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 51, " aria-current=\"true\"")
510			if templ_7745c5c3_Err != nil {
511				return templ_7745c5c3_Err
512			}
513		}
514		if p.Both {
515			templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 52, " data-fire=\"")
516			if templ_7745c5c3_Err != nil {
517				return templ_7745c5c3_Err
518			}
519			var templ_7745c5c3_Var22 string
520			templ_7745c5c3_Var22, templ_7745c5c3_Err = templ.ResolveAttributeValue(view)
521			if templ_7745c5c3_Err != nil {
522				return templ.Error{Err: templ_7745c5c3_Err, FileName: `internal/adapters/web/diff.templ`, Line: 113, Col: 19}
523			}
524			_, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(templ_7745c5c3_Var22)
525			if templ_7745c5c3_Err != nil {
526				return templ_7745c5c3_Err
527			}
528			templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 53, "\" :aria-current=\"q('#diffs').attr['data-diff'] === this.dataset.view ? 'true' : false\"")
529			if templ_7745c5c3_Err != nil {
530				return templ_7745c5c3_Err
531			}
532		}
533		templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 54, ">")
534		if templ_7745c5c3_Err != nil {
535			return templ_7745c5c3_Err
536		}
537		var templ_7745c5c3_Var23 string
538		templ_7745c5c3_Var23, templ_7745c5c3_Err = templ.JoinStringErrs(label)
539		if templ_7745c5c3_Err != nil {
540			return templ.Error{Err: templ_7745c5c3_Err, FileName: `internal/adapters/web/diff.templ`, Line: 116, Col: 9}
541		}
542		_, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(templ.EscapeString(templ_7745c5c3_Var23))
543		if templ_7745c5c3_Err != nil {
544			return templ_7745c5c3_Err
545		}
546		templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 55, "<kbd aria-hidden=\"true\">")
547		if templ_7745c5c3_Err != nil {
548			return templ_7745c5c3_Err
549		}
550		var templ_7745c5c3_Var24 string
551		templ_7745c5c3_Var24, templ_7745c5c3_Err = templ.JoinStringErrs(key)
552		if templ_7745c5c3_Err != nil {
553			return templ.Error{Err: templ_7745c5c3_Err, FileName: `internal/adapters/web/diff.templ`, Line: 116, Col: 40}
554		}
555		_, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(templ.EscapeString(templ_7745c5c3_Var24))
556		if templ_7745c5c3_Err != nil {
557			return templ_7745c5c3_Err
558		}
559		templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 56, "</kbd></a>")
560		if templ_7745c5c3_Err != nil {
561			return templ_7745c5c3_Err
562		}
563		return nil
564	})
565}
566
567// collapseButton folds every file of the diff, or opens them all again when
568// none is open; its label follows the state.
569func collapseButton() templ.Component {
570	return templruntime.GeneratedTemplate(func(templ_7745c5c3_Input templruntime.GeneratedComponentInput) (templ_7745c5c3_Err error) {
571		templ_7745c5c3_W, ctx := templ_7745c5c3_Input.Writer, templ_7745c5c3_Input.Context
572		if templ_7745c5c3_CtxErr := ctx.Err(); templ_7745c5c3_CtxErr != nil {
573			return templ_7745c5c3_CtxErr
574		}
575		templ_7745c5c3_Buffer, templ_7745c5c3_IsBuffer := templruntime.GetBuffer(templ_7745c5c3_W)
576		if !templ_7745c5c3_IsBuffer {
577			defer func() {
578				templ_7745c5c3_BufErr := templruntime.ReleaseBuffer(templ_7745c5c3_Buffer)
579				if templ_7745c5c3_Err == nil {
580					templ_7745c5c3_Err = templ_7745c5c3_BufErr
581				}
582			}()
583		}
584		ctx = templ.InitializeContext(ctx)
585		templ_7745c5c3_Var25 := templ.GetChildren(ctx)
586		if templ_7745c5c3_Var25 == nil {
587			templ_7745c5c3_Var25 = templ.NopComponent
588		}
589		ctx = templ.ClearChildren(ctx)
590		templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 57, "<button type=\"button\" aria-keyshortcuts=\"x\" data-js data-fire=\"collapse\" class=\"btn\"><span hx-live=\"this.textContent = q('[data-file][open]').count || !q('[data-file]').count ? 'Collapse all' : 'Expand all'\">Collapse all</span><kbd aria-hidden=\"true\">x</kbd></button>")
591		if templ_7745c5c3_Err != nil {
592			return templ_7745c5c3_Err
593		}
594		return nil
595	})
596}
597
598func personView(pr Person) templ.Component {
599	return templruntime.GeneratedTemplate(func(templ_7745c5c3_Input templruntime.GeneratedComponentInput) (templ_7745c5c3_Err error) {
600		templ_7745c5c3_W, ctx := templ_7745c5c3_Input.Writer, templ_7745c5c3_Input.Context
601		if templ_7745c5c3_CtxErr := ctx.Err(); templ_7745c5c3_CtxErr != nil {
602			return templ_7745c5c3_CtxErr
603		}
604		templ_7745c5c3_Buffer, templ_7745c5c3_IsBuffer := templruntime.GetBuffer(templ_7745c5c3_W)
605		if !templ_7745c5c3_IsBuffer {
606			defer func() {
607				templ_7745c5c3_BufErr := templruntime.ReleaseBuffer(templ_7745c5c3_Buffer)
608				if templ_7745c5c3_Err == nil {
609					templ_7745c5c3_Err = templ_7745c5c3_BufErr
610				}
611			}()
612		}
613		ctx = templ.InitializeContext(ctx)
614		templ_7745c5c3_Var26 := templ.GetChildren(ctx)
615		if templ_7745c5c3_Var26 == nil {
616			templ_7745c5c3_Var26 = templ.NopComponent
617		}
618		ctx = templ.ClearChildren(ctx)
619		var templ_7745c5c3_Var27 string
620		templ_7745c5c3_Var27, templ_7745c5c3_Err = templ.JoinStringErrs(pr.Name)
621		if templ_7745c5c3_Err != nil {
622			return templ.Error{Err: templ_7745c5c3_Err, FileName: `internal/adapters/web/diff.templ`, Line: 128, Col: 10}
623		}
624		_, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(templ.EscapeString(templ_7745c5c3_Var27))
625		if templ_7745c5c3_Err != nil {
626			return templ_7745c5c3_Err
627		}
628		templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 58, " ")
629		if templ_7745c5c3_Err != nil {
630			return templ_7745c5c3_Err
631		}
632		if pr.WhenAt != "" {
633			var templ_7745c5c3_Var28 string
634			templ_7745c5c3_Var28, templ_7745c5c3_Err = templ.JoinStringErrs(" · ")
635			if templ_7745c5c3_Err != nil {
636				return templ.Error{Err: templ_7745c5c3_Err, FileName: `internal/adapters/web/diff.templ`, Line: 130, Col: 10}
637			}
638			_, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(templ.EscapeString(templ_7745c5c3_Var28))
639			if templ_7745c5c3_Err != nil {
640				return templ_7745c5c3_Err
641			}
642			templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 59, "<time datetime=\"")
643			if templ_7745c5c3_Err != nil {
644				return templ_7745c5c3_Err
645			}
646			var templ_7745c5c3_Var29 string
647			templ_7745c5c3_Var29, templ_7745c5c3_Err = templ.ResolveAttributeValue(pr.WhenAt)
648			if templ_7745c5c3_Err != nil {
649				return templ.Error{Err: templ_7745c5c3_Err, FileName: `internal/adapters/web/diff.templ`, Line: 130, Col: 38}
650			}
651			_, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(templ_7745c5c3_Var29)
652			if templ_7745c5c3_Err != nil {
653				return templ_7745c5c3_Err
654			}
655			templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 60, "\" title=\"")
656			if templ_7745c5c3_Err != nil {
657				return templ_7745c5c3_Err
658			}
659			var templ_7745c5c3_Var30 string
660			templ_7745c5c3_Var30, templ_7745c5c3_Err = templ.ResolveAttributeValue(pr.Abs)
661			if templ_7745c5c3_Err != nil {
662				return templ.Error{Err: templ_7745c5c3_Err, FileName: `internal/adapters/web/diff.templ`, Line: 130, Col: 55}
663			}
664			_, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(templ_7745c5c3_Var30)
665			if templ_7745c5c3_Err != nil {
666				return templ_7745c5c3_Err
667			}
668			templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 61, "\">")
669			if templ_7745c5c3_Err != nil {
670				return templ_7745c5c3_Err
671			}
672			var templ_7745c5c3_Var31 string
673			templ_7745c5c3_Var31, templ_7745c5c3_Err = templ.JoinStringErrs(pr.When)
674			if templ_7745c5c3_Err != nil {
675				return templ.Error{Err: templ_7745c5c3_Err, FileName: `internal/adapters/web/diff.templ`, Line: 130, Col: 67}
676			}
677			_, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(templ.EscapeString(templ_7745c5c3_Var31))
678			if templ_7745c5c3_Err != nil {
679				return templ_7745c5c3_Err
680			}
681			templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 62, "</time>")
682			if templ_7745c5c3_Err != nil {
683				return templ_7745c5c3_Err
684			}
685			var templ_7745c5c3_Var32 string
686			templ_7745c5c3_Var32, templ_7745c5c3_Err = templ.JoinStringErrs(" · " + pr.Abs)
687			if templ_7745c5c3_Err != nil {
688				return templ.Error{Err: templ_7745c5c3_Err, FileName: `internal/adapters/web/diff.templ`, Line: 130, Col: 93}
689			}
690			_, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(templ.EscapeString(templ_7745c5c3_Var32))
691			if templ_7745c5c3_Err != nil {
692				return templ_7745c5c3_Err
693			}
694		}
695		return nil
696	})
697}
698
699func commitRail(p CommitPage) templ.Component {
700	return templruntime.GeneratedTemplate(func(templ_7745c5c3_Input templruntime.GeneratedComponentInput) (templ_7745c5c3_Err error) {
701		templ_7745c5c3_W, ctx := templ_7745c5c3_Input.Writer, templ_7745c5c3_Input.Context
702		if templ_7745c5c3_CtxErr := ctx.Err(); templ_7745c5c3_CtxErr != nil {
703			return templ_7745c5c3_CtxErr
704		}
705		templ_7745c5c3_Buffer, templ_7745c5c3_IsBuffer := templruntime.GetBuffer(templ_7745c5c3_W)
706		if !templ_7745c5c3_IsBuffer {
707			defer func() {
708				templ_7745c5c3_BufErr := templruntime.ReleaseBuffer(templ_7745c5c3_Buffer)
709				if templ_7745c5c3_Err == nil {
710					templ_7745c5c3_Err = templ_7745c5c3_BufErr
711				}
712			}()
713		}
714		ctx = templ.InitializeContext(ctx)
715		templ_7745c5c3_Var33 := templ.GetChildren(ctx)
716		if templ_7745c5c3_Var33 == nil {
717			templ_7745c5c3_Var33 = templ.NopComponent
718		}
719		ctx = templ.ClearChildren(ctx)
720		templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 63, "<section aria-labelledby=\"r-files\"><h2 id=\"r-files\">Files <span class=\"count\">")
721		if templ_7745c5c3_Err != nil {
722			return templ_7745c5c3_Err
723		}
724		var templ_7745c5c3_Var34 string
725		templ_7745c5c3_Var34, templ_7745c5c3_Err = templ.JoinStringErrs(itoa(len(p.Files)))
726		if templ_7745c5c3_Err != nil {
727			return templ.Error{Err: templ_7745c5c3_Err, FileName: `internal/adapters/web/diff.templ`, Line: 136, Col: 65}
728		}
729		_, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(templ.EscapeString(templ_7745c5c3_Var34))
730		if templ_7745c5c3_Err != nil {
731			return templ_7745c5c3_Err
732		}
733		templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 64, "</span></h2>")
734		if templ_7745c5c3_Err != nil {
735			return templ_7745c5c3_Err
736		}
737		templ_7745c5c3_Err = FileList(p.Files).Render(ctx, templ_7745c5c3_Buffer)
738		if templ_7745c5c3_Err != nil {
739			return templ_7745c5c3_Err
740		}
741		templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 65, "</section>")
742		if templ_7745c5c3_Err != nil {
743			return templ_7745c5c3_Err
744		}
745		return nil
746	})
747}
748
749// FileList is the table of contents of a diff: status letter, path, +n -m
750// and an ASCII bar. The row of the file in view is marked.
751func FileList(files []DiffFile) templ.Component {
752	return templruntime.GeneratedTemplate(func(templ_7745c5c3_Input templruntime.GeneratedComponentInput) (templ_7745c5c3_Err error) {
753		templ_7745c5c3_W, ctx := templ_7745c5c3_Input.Writer, templ_7745c5c3_Input.Context
754		if templ_7745c5c3_CtxErr := ctx.Err(); templ_7745c5c3_CtxErr != nil {
755			return templ_7745c5c3_CtxErr
756		}
757		templ_7745c5c3_Buffer, templ_7745c5c3_IsBuffer := templruntime.GetBuffer(templ_7745c5c3_W)
758		if !templ_7745c5c3_IsBuffer {
759			defer func() {
760				templ_7745c5c3_BufErr := templruntime.ReleaseBuffer(templ_7745c5c3_Buffer)
761				if templ_7745c5c3_Err == nil {
762					templ_7745c5c3_Err = templ_7745c5c3_BufErr
763				}
764			}()
765		}
766		ctx = templ.InitializeContext(ctx)
767		templ_7745c5c3_Var35 := templ.GetChildren(ctx)
768		if templ_7745c5c3_Var35 == nil {
769			templ_7745c5c3_Var35 = templ.NopComponent
770		}
771		ctx = templ.ClearChildren(ctx)
772		if len(files) > fileFilterMin {
773			templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 66, "<div class=\"ffilter\"><label for=\"files-filter\" class=\"sr\">filter the changed files</label> <input id=\"files-filter\" type=\"search\" placeholder=\"Filter files…\" autocomplete=\"off\" data-pick=\".files > li\" hx-on:input=\"ermite.filter(this)\"></div>")
774			if templ_7745c5c3_Err != nil {
775				return templ_7745c5c3_Err
776			}
777		}
778		templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 67, "<ol class=\"files\" aria-label=\"Changed files\">")
779		if templ_7745c5c3_Err != nil {
780			return templ_7745c5c3_Err
781		}
782		for _, f := range files {
783			templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 68, "<li><a href=\"")
784			if templ_7745c5c3_Err != nil {
785				return templ_7745c5c3_Err
786			}
787			var templ_7745c5c3_Var36 templ.SafeURL
788			templ_7745c5c3_Var36, templ_7745c5c3_Err = templ.JoinURLErrs(templ.SafeURL("#" + f.ID))
789			if templ_7745c5c3_Err != nil {
790				return templ.Error{Err: templ_7745c5c3_Err, FileName: `internal/adapters/web/diff.templ`, Line: 161, Col: 37}
791			}
792			_, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(templ.EscapeString(templ_7745c5c3_Var36))
793			if templ_7745c5c3_Err != nil {
794				return templ_7745c5c3_Err
795			}
796			templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 69, "\" title=\"")
797			if templ_7745c5c3_Err != nil {
798				return templ_7745c5c3_Err
799			}
800			var templ_7745c5c3_Var37 string
801			templ_7745c5c3_Var37, templ_7745c5c3_Err = templ.ResolveAttributeValue(f.Path)
802			if templ_7745c5c3_Err != nil {
803				return templ.Error{Err: templ_7745c5c3_Err, FileName: `internal/adapters/web/diff.templ`, Line: 162, Col: 19}
804			}
805			_, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(templ_7745c5c3_Var37)
806			if templ_7745c5c3_Err != nil {
807				return templ_7745c5c3_Err
808			}
809			templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 70, "\" hx-on:click=\"(window.ermiteMR?.openFile || ermite.openFile)(this.hash.slice(1))\"><span class=\"st\" data-st=\"")
810			if templ_7745c5c3_Err != nil {
811				return templ_7745c5c3_Err
812			}
813			var templ_7745c5c3_Var38 string
814			templ_7745c5c3_Var38, templ_7745c5c3_Err = templ.ResolveAttributeValue(f.Status)
815			if templ_7745c5c3_Err != nil {
816				return templ.Error{Err: templ_7745c5c3_Err, FileName: `internal/adapters/web/diff.templ`, Line: 165, Col: 40}
817			}
818			_, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(templ_7745c5c3_Var38)
819			if templ_7745c5c3_Err != nil {
820				return templ_7745c5c3_Err
821			}
822			templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 71, "\" title=\"")
823			if templ_7745c5c3_Err != nil {
824				return templ_7745c5c3_Err
825			}
826			var templ_7745c5c3_Var39 string
827			templ_7745c5c3_Var39, templ_7745c5c3_Err = templ.ResolveAttributeValue(statusName(f.Status))
828			if templ_7745c5c3_Err != nil {
829				return templ.Error{Err: templ_7745c5c3_Err, FileName: `internal/adapters/web/diff.templ`, Line: 165, Col: 71}
830			}
831			_, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(templ_7745c5c3_Var39)
832			if templ_7745c5c3_Err != nil {
833				return templ_7745c5c3_Err
834			}
835			templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 72, "\">")
836			if templ_7745c5c3_Err != nil {
837				return templ_7745c5c3_Err
838			}
839			var templ_7745c5c3_Var40 string
840			templ_7745c5c3_Var40, templ_7745c5c3_Err = templ.JoinStringErrs(f.Status)
841			if templ_7745c5c3_Err != nil {
842				return templ.Error{Err: templ_7745c5c3_Err, FileName: `internal/adapters/web/diff.templ`, Line: 165, Col: 84}
843			}
844			_, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(templ.EscapeString(templ_7745c5c3_Var40))
845			if templ_7745c5c3_Err != nil {
846				return templ_7745c5c3_Err
847			}
848			templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 73, "</span> <span class=\"nm\"><span class=\"p\">")
849			if templ_7745c5c3_Err != nil {
850				return templ_7745c5c3_Err
851			}
852			var templ_7745c5c3_Var41 string
853			templ_7745c5c3_Var41, templ_7745c5c3_Err = templ.JoinStringErrs(f.Name)
854			if templ_7745c5c3_Err != nil {
855				return templ.Error{Err: templ_7745c5c3_Err, FileName: `internal/adapters/web/diff.templ`, Line: 166, Col: 46}
856			}
857			_, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(templ.EscapeString(templ_7745c5c3_Var41))
858			if templ_7745c5c3_Err != nil {
859				return templ_7745c5c3_Err
860			}
861			templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 74, "</span>")
862			if templ_7745c5c3_Err != nil {
863				return templ_7745c5c3_Err
864			}
865			var templ_7745c5c3_Var42 string
866			templ_7745c5c3_Var42, templ_7745c5c3_Err = templ.JoinStringErrs(" ")
867			if templ_7745c5c3_Err != nil {
868				return templ.Error{Err: templ_7745c5c3_Err, FileName: `internal/adapters/web/diff.templ`, Line: 166, Col: 60}
869			}
870			_, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(templ.EscapeString(templ_7745c5c3_Var42))
871			if templ_7745c5c3_Err != nil {
872				return templ_7745c5c3_Err
873			}
874			templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 75, "<span class=\"d\"><bdi>")
875			if templ_7745c5c3_Err != nil {
876				return templ_7745c5c3_Err
877			}
878			var templ_7745c5c3_Var43 string
879			templ_7745c5c3_Var43, templ_7745c5c3_Err = templ.JoinStringErrs(f.Dir)
880			if templ_7745c5c3_Err != nil {
881				return templ.Error{Err: templ_7745c5c3_Err, FileName: `internal/adapters/web/diff.templ`, Line: 166, Col: 90}
882			}
883			_, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(templ.EscapeString(templ_7745c5c3_Var43))
884			if templ_7745c5c3_Err != nil {
885				return templ_7745c5c3_Err
886			}
887			templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 76, "</bdi></span></span> ")
888			if templ_7745c5c3_Err != nil {
889				return templ_7745c5c3_Err
890			}
891			if f.OpenNotes > 0 {
892				templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 77, "<span class=\"cn\" title=\"")
893				if templ_7745c5c3_Err != nil {
894					return templ_7745c5c3_Err
895				}
896				var templ_7745c5c3_Var44 string
897				templ_7745c5c3_Var44, templ_7745c5c3_Err = templ.ResolveAttributeValue(plural(f.OpenNotes, "open comment", "open comments"))
898				if templ_7745c5c3_Err != nil {
899					return templ.Error{Err: templ_7745c5c3_Err, FileName: `internal/adapters/web/diff.templ`, Line: 168, Col: 83}
900				}
901				_, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(templ_7745c5c3_Var44)
902				if templ_7745c5c3_Err != nil {
903					return templ_7745c5c3_Err
904				}
905				templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 78, "\">")
906				if templ_7745c5c3_Err != nil {
907					return templ_7745c5c3_Err
908				}
909				var templ_7745c5c3_Var45 string
910				templ_7745c5c3_Var45, templ_7745c5c3_Err = templ.JoinStringErrs(itoa(f.OpenNotes))
911				if templ_7745c5c3_Err != nil {
912					return templ.Error{Err: templ_7745c5c3_Err, FileName: `internal/adapters/web/diff.templ`, Line: 168, Col: 105}
913				}
914				_, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(templ.EscapeString(templ_7745c5c3_Var45))
915				if templ_7745c5c3_Err != nil {
916					return templ_7745c5c3_Err
917				}
918				templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 79, "</span> ")
919				if templ_7745c5c3_Err != nil {
920					return templ_7745c5c3_Err
921				}
922			} else if f.Notes > 0 {
923				templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 80, "<span class=\"cn done\" title=\"")
924				if templ_7745c5c3_Err != nil {
925					return templ_7745c5c3_Err
926				}
927				var templ_7745c5c3_Var46 string
928				templ_7745c5c3_Var46, templ_7745c5c3_Err = templ.ResolveAttributeValue(plural(f.Notes, "resolved comment", "resolved comments"))
929				if templ_7745c5c3_Err != nil {
930					return templ.Error{Err: templ_7745c5c3_Err, FileName: `internal/adapters/web/diff.templ`, Line: 170, Col: 92}
931				}
932				_, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(templ_7745c5c3_Var46)
933				if templ_7745c5c3_Err != nil {
934					return templ_7745c5c3_Err
935				}
936				templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 81, "\">")
937				if templ_7745c5c3_Err != nil {
938					return templ_7745c5c3_Err
939				}
940				var templ_7745c5c3_Var47 string
941				templ_7745c5c3_Var47, templ_7745c5c3_Err = templ.JoinStringErrs(itoa(f.Notes))
942				if templ_7745c5c3_Err != nil {
943					return templ.Error{Err: templ_7745c5c3_Err, FileName: `internal/adapters/web/diff.templ`, Line: 170, Col: 110}
944				}
945				_, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(templ.EscapeString(templ_7745c5c3_Var47))
946				if templ_7745c5c3_Err != nil {
947					return templ_7745c5c3_Err
948				}
949				templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 82, "</span> ")
950				if templ_7745c5c3_Err != nil {
951					return templ_7745c5c3_Err
952				}
953			}
954			if f.Bin {
955				templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 83, "<span class=\"n mute\">bin</span>")
956				if templ_7745c5c3_Err != nil {
957					return templ_7745c5c3_Err
958				}
959			} else {
960				templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 84, "<span class=\"n\"><span class=\"plus\">+")
961				if templ_7745c5c3_Err != nil {
962					return templ_7745c5c3_Err
963				}
964				var templ_7745c5c3_Var48 string
965				templ_7745c5c3_Var48, templ_7745c5c3_Err = templ.JoinStringErrs(itoa(f.Add))
966				if templ_7745c5c3_Err != nil {
967					return templ.Error{Err: templ_7745c5c3_Err, FileName: `internal/adapters/web/diff.templ`, Line: 175, Col: 55}
968				}
969				_, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(templ.EscapeString(templ_7745c5c3_Var48))
970				if templ_7745c5c3_Err != nil {
971					return templ_7745c5c3_Err
972				}
973				templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 85, "</span> <span class=\"minus\">-")
974				if templ_7745c5c3_Err != nil {
975					return templ_7745c5c3_Err
976				}
977				var templ_7745c5c3_Var49 string
978				templ_7745c5c3_Var49, templ_7745c5c3_Err = templ.JoinStringErrs(itoa(f.Del))
979				if templ_7745c5c3_Err != nil {
980					return templ.Error{Err: templ_7745c5c3_Err, FileName: `internal/adapters/web/diff.templ`, Line: 175, Col: 99}
981				}
982				_, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(templ.EscapeString(templ_7745c5c3_Var49))
983				if templ_7745c5c3_Err != nil {
984					return templ_7745c5c3_Err
985				}
986				templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 86, "</span></span>")
987				if templ_7745c5c3_Err != nil {
988					return templ_7745c5c3_Err
989				}
990			}
991			templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 87, "</a></li>")
992			if templ_7745c5c3_Err != nil {
993				return templ_7745c5c3_Err
994			}
995		}
996		templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 88, "</ol>")
997		if templ_7745c5c3_Err != nil {
998			return templ_7745c5c3_Err
999		}
1000		return nil
1001	})
1002}
1003
1004// DiffFileView is one file of the diff: a <details> (per-file collapse). The
1005// unified and the split tables are both in it; #diffs[data-diff] shows one.
1006// Every changed line keeps its +/- marker, so a change is never conveyed by
1007// colour alone.
1008func DiffFileView(f DiffFile, p DiffView) templ.Component {
1009	return templruntime.GeneratedTemplate(func(templ_7745c5c3_Input templruntime.GeneratedComponentInput) (templ_7745c5c3_Err error) {
1010		templ_7745c5c3_W, ctx := templ_7745c5c3_Input.Writer, templ_7745c5c3_Input.Context
1011		if templ_7745c5c3_CtxErr := ctx.Err(); templ_7745c5c3_CtxErr != nil {
1012			return templ_7745c5c3_CtxErr
1013		}
1014		templ_7745c5c3_Buffer, templ_7745c5c3_IsBuffer := templruntime.GetBuffer(templ_7745c5c3_W)
1015		if !templ_7745c5c3_IsBuffer {
1016			defer func() {
1017				templ_7745c5c3_BufErr := templruntime.ReleaseBuffer(templ_7745c5c3_Buffer)
1018				if templ_7745c5c3_Err == nil {
1019					templ_7745c5c3_Err = templ_7745c5c3_BufErr
1020				}
1021			}()
1022		}
1023		ctx = templ.InitializeContext(ctx)
1024		templ_7745c5c3_Var50 := templ.GetChildren(ctx)
1025		if templ_7745c5c3_Var50 == nil {
1026			templ_7745c5c3_Var50 = templ.NopComponent
1027		}
1028		ctx = templ.ClearChildren(ctx)
1029		var templ_7745c5c3_Var51 = []any{"dfile", "lnw-" + itoa(f.Digits)}
1030		templ_7745c5c3_Err = templ.RenderCSSItems(ctx, templ_7745c5c3_Buffer, templ_7745c5c3_Var51...)
1031		if templ_7745c5c3_Err != nil {
1032			return templ_7745c5c3_Err
1033		}
1034		templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 89, "<details class=\"")
1035		if templ_7745c5c3_Err != nil {
1036			return templ_7745c5c3_Err
1037		}
1038		var templ_7745c5c3_Var52 string
1039		templ_7745c5c3_Var52, templ_7745c5c3_Err = templ.ResolveAttributeValue(templ.CSSClasses(templ_7745c5c3_Var51).String())
1040		if templ_7745c5c3_Err != nil {
1041			return templ.Error{Err: templ_7745c5c3_Err, FileName: `internal/adapters/web/diff.templ`, Line: 1, Col: 0}
1042		}
1043		_, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(templ_7745c5c3_Var52)
1044		if templ_7745c5c3_Err != nil {
1045			return templ_7745c5c3_Err
1046		}
1047		templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 90, "\" id=\"")
1048		if templ_7745c5c3_Err != nil {
1049			return templ_7745c5c3_Err
1050		}
1051		var templ_7745c5c3_Var53 string
1052		templ_7745c5c3_Var53, templ_7745c5c3_Err = templ.ResolveAttributeValue(f.ID)
1053		if templ_7745c5c3_Err != nil {
1054			return templ.Error{Err: templ_7745c5c3_Err, FileName: `internal/adapters/web/diff.templ`, Line: 190, Col: 11}
1055		}
1056		_, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(templ_7745c5c3_Var53)
1057		if templ_7745c5c3_Err != nil {
1058			return templ_7745c5c3_Err
1059		}
1060		templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 91, "\" data-file")
1061		if templ_7745c5c3_Err != nil {
1062			return templ_7745c5c3_Err
1063		}
1064		if f.Open {
1065			templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 92, " open")
1066			if templ_7745c5c3_Err != nil {
1067				return templ_7745c5c3_Err
1068			}
1069		}
1070		templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 93, "><summary><span class=\"st\">")
1071		if templ_7745c5c3_Err != nil {
1072			return templ_7745c5c3_Err
1073		}
1074		var templ_7745c5c3_Var54 string
1075		templ_7745c5c3_Var54, templ_7745c5c3_Err = templ.JoinStringErrs(f.Status)
1076		if templ_7745c5c3_Err != nil {
1077			return templ.Error{Err: templ_7745c5c3_Err, FileName: `internal/adapters/web/diff.templ`, Line: 197, Col: 30}
1078		}
1079		_, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(templ.EscapeString(templ_7745c5c3_Var54))
1080		if templ_7745c5c3_Err != nil {
1081			return templ_7745c5c3_Err
1082		}
1083		templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 94, "</span>")
1084		if templ_7745c5c3_Err != nil {
1085			return templ_7745c5c3_Err
1086		}
1087		var templ_7745c5c3_Var55 string
1088		templ_7745c5c3_Var55, templ_7745c5c3_Err = templ.JoinStringErrs(" ")
1089		if templ_7745c5c3_Err != nil {
1090			return templ.Error{Err: templ_7745c5c3_Err, FileName: `internal/adapters/web/diff.templ`, Line: 197, Col: 44}
1091		}
1092		_, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(templ.EscapeString(templ_7745c5c3_Var55))
1093		if templ_7745c5c3_Err != nil {
1094			return templ_7745c5c3_Err
1095		}
1096		templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 95, "<span class=\"p\">")
1097		if templ_7745c5c3_Err != nil {
1098			return templ_7745c5c3_Err
1099		}
1100		var templ_7745c5c3_Var56 string
1101		templ_7745c5c3_Var56, templ_7745c5c3_Err = templ.JoinStringErrs(f.Path)
1102		if templ_7745c5c3_Err != nil {
1103			return templ.Error{Err: templ_7745c5c3_Err, FileName: `internal/adapters/web/diff.templ`, Line: 197, Col: 70}
1104		}
1105		_, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(templ.EscapeString(templ_7745c5c3_Var56))
1106		if templ_7745c5c3_Err != nil {
1107			return templ_7745c5c3_Err
1108		}
1109		templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 96, "</span>")
1110		if templ_7745c5c3_Err != nil {
1111			return templ_7745c5c3_Err
1112		}
1113		var templ_7745c5c3_Var57 string
1114		templ_7745c5c3_Var57, templ_7745c5c3_Err = templ.JoinStringErrs(" ")
1115		if templ_7745c5c3_Err != nil {
1116			return templ.Error{Err: templ_7745c5c3_Err, FileName: `internal/adapters/web/diff.templ`, Line: 197, Col: 84}
1117		}
1118		_, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(templ.EscapeString(templ_7745c5c3_Var57))
1119		if templ_7745c5c3_Err != nil {
1120			return templ_7745c5c3_Err
1121		}
1122		templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 97, "<span class=\"plus\">+")
1123		if templ_7745c5c3_Err != nil {
1124			return templ_7745c5c3_Err
1125		}
1126		var templ_7745c5c3_Var58 string
1127		templ_7745c5c3_Var58, templ_7745c5c3_Err = templ.JoinStringErrs(itoa(f.Add))
1128		if templ_7745c5c3_Err != nil {
1129			return templ.Error{Err: templ_7745c5c3_Err, FileName: `internal/adapters/web/diff.templ`, Line: 197, Col: 119}
1130		}
1131		_, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(templ.EscapeString(templ_7745c5c3_Var58))
1132		if templ_7745c5c3_Err != nil {
1133			return templ_7745c5c3_Err
1134		}
1135		templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 98, "</span>")
1136		if templ_7745c5c3_Err != nil {
1137			return templ_7745c5c3_Err
1138		}
1139		var templ_7745c5c3_Var59 string
1140		templ_7745c5c3_Var59, templ_7745c5c3_Err = templ.JoinStringErrs(" ")
1141		if templ_7745c5c3_Err != nil {
1142			return templ.Error{Err: templ_7745c5c3_Err, FileName: `internal/adapters/web/diff.templ`, Line: 197, Col: 133}
1143		}
1144		_, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(templ.EscapeString(templ_7745c5c3_Var59))
1145		if templ_7745c5c3_Err != nil {
1146			return templ_7745c5c3_Err
1147		}
1148		templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 99, "<span class=\"minus\">-")
1149		if templ_7745c5c3_Err != nil {
1150			return templ_7745c5c3_Err
1151		}
1152		var templ_7745c5c3_Var60 string
1153		templ_7745c5c3_Var60, templ_7745c5c3_Err = templ.JoinStringErrs(itoa(f.Del))
1154		if templ_7745c5c3_Err != nil {
1155			return templ.Error{Err: templ_7745c5c3_Err, FileName: `internal/adapters/web/diff.templ`, Line: 197, Col: 169}
1156		}
1157		_, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(templ.EscapeString(templ_7745c5c3_Var60))
1158		if templ_7745c5c3_Err != nil {
1159			return templ_7745c5c3_Err
1160		}
1161		templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 100, "</span> ")
1162		if templ_7745c5c3_Err != nil {
1163			return templ_7745c5c3_Err
1164		}
1165		if f.Note != "" {
1166			var templ_7745c5c3_Var61 string
1167			templ_7745c5c3_Var61, templ_7745c5c3_Err = templ.JoinStringErrs(" ")
1168			if templ_7745c5c3_Err != nil {
1169				return templ.Error{Err: templ_7745c5c3_Err, FileName: `internal/adapters/web/diff.templ`, Line: 199, Col: 9}
1170			}
1171			_, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(templ.EscapeString(templ_7745c5c3_Var61))
1172			if templ_7745c5c3_Err != nil {
1173				return templ_7745c5c3_Err
1174			}
1175			templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 101, "<span class=\"note\">")
1176			if templ_7745c5c3_Err != nil {
1177				return templ_7745c5c3_Err
1178			}
1179			var templ_7745c5c3_Var62 string
1180			templ_7745c5c3_Var62, templ_7745c5c3_Err = templ.JoinStringErrs(f.Note)
1181			if templ_7745c5c3_Err != nil {
1182				return templ.Error{Err: templ_7745c5c3_Err, FileName: `internal/adapters/web/diff.templ`, Line: 199, Col: 38}
1183			}
1184			_, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(templ.EscapeString(templ_7745c5c3_Var62))
1185			if templ_7745c5c3_Err != nil {
1186				return templ_7745c5c3_Err
1187			}
1188			templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 102, "</span>")
1189			if templ_7745c5c3_Err != nil {
1190				return templ_7745c5c3_Err
1191			}
1192		}
1193		templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 103, "</summary> ")
1194		if templ_7745c5c3_Err != nil {
1195			return templ_7745c5c3_Err
1196		}
1197		if f.Lazy {
1198			templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 104, "   ")
1199			if templ_7745c5c3_Err != nil {
1200				return templ_7745c5c3_Err
1201			}
1202			var templ_7745c5c3_Var63 = []any{"dlazy", "dlazy-" + itoa(f.Height)}
1203			templ_7745c5c3_Err = templ.RenderCSSItems(ctx, templ_7745c5c3_Buffer, templ_7745c5c3_Var63...)
1204			if templ_7745c5c3_Err != nil {
1205				return templ_7745c5c3_Err
1206			}
1207			templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 105, "<div class=\"")
1208			if templ_7745c5c3_Err != nil {
1209				return templ_7745c5c3_Err
1210			}
1211			var templ_7745c5c3_Var64 string
1212			templ_7745c5c3_Var64, templ_7745c5c3_Err = templ.ResolveAttributeValue(templ.CSSClasses(templ_7745c5c3_Var63).String())
1213			if templ_7745c5c3_Err != nil {
1214				return templ.Error{Err: templ_7745c5c3_Err, FileName: `internal/adapters/web/diff.templ`, Line: 1, Col: 0}
1215			}
1216			_, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(templ_7745c5c3_Var64)
1217			if templ_7745c5c3_Err != nil {
1218				return templ_7745c5c3_Err
1219			}
1220			templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 106, "\" data-src=\"")
1221			if templ_7745c5c3_Err != nil {
1222				return templ_7745c5c3_Err
1223			}
1224			var templ_7745c5c3_Var65 string
1225			templ_7745c5c3_Var65, templ_7745c5c3_Err = templ.ResolveAttributeValue(f.Src)
1226			if templ_7745c5c3_Err != nil {
1227				return templ.Error{Err: templ_7745c5c3_Err, FileName: `internal/adapters/web/diff.templ`, Line: 206, Col: 69}
1228			}
1229			_, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(templ_7745c5c3_Var65)
1230			if templ_7745c5c3_Err != nil {
1231				return templ_7745c5c3_Err
1232			}
1233			templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 107, "\" data-notes=\"")
1234			if templ_7745c5c3_Err != nil {
1235				return templ_7745c5c3_Err
1236			}
1237			var templ_7745c5c3_Var66 string
1238			templ_7745c5c3_Var66, templ_7745c5c3_Err = templ.ResolveAttributeValue(f.Comments)
1239			if templ_7745c5c3_Err != nil {
1240				return templ.Error{Err: templ_7745c5c3_Err, FileName: `internal/adapters/web/diff.templ`, Line: 206, Col: 95}
1241			}
1242			_, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(templ_7745c5c3_Var66)
1243			if templ_7745c5c3_Err != nil {
1244				return templ_7745c5c3_Err
1245			}
1246			templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 108, "\"><a href=\"")
1247			if templ_7745c5c3_Err != nil {
1248				return templ_7745c5c3_Err
1249			}
1250			var templ_7745c5c3_Var67 templ.SafeURL
1251			templ_7745c5c3_Var67, templ_7745c5c3_Err = templ.JoinURLErrs(templ.SafeURL("?from=" + itoa(f.From) + "#" + f.ID))
1252			if templ_7745c5c3_Err != nil {
1253				return templ.Error{Err: templ_7745c5c3_Err, FileName: `internal/adapters/web/diff.templ`, Line: 207, Col: 65}
1254			}
1255			_, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(templ.EscapeString(templ_7745c5c3_Var67))
1256			if templ_7745c5c3_Err != nil {
1257				return templ_7745c5c3_Err
1258			}
1259			templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 109, "\">show this file</a></div>")
1260			if templ_7745c5c3_Err != nil {
1261				return templ_7745c5c3_Err
1262			}
1263		} else if len(f.Hunks) > 0 {
1264			templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 110, "<div class=\"dscroll\">")
1265			if templ_7745c5c3_Err != nil {
1266				return templ_7745c5c3_Err
1267			}
1268			if p.ShowUnified {
1269				templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 111, "<table class=\"dt uni\" aria-label=\"")
1270				if templ_7745c5c3_Err != nil {
1271					return templ_7745c5c3_Err
1272				}
1273				var templ_7745c5c3_Var68 string
1274				templ_7745c5c3_Var68, templ_7745c5c3_Err = templ.ResolveAttributeValue(f.Path + ", unified")
1275				if templ_7745c5c3_Err != nil {
1276					return templ.Error{Err: templ_7745c5c3_Err, FileName: `internal/adapters/web/diff.templ`, Line: 212, Col: 60}
1277				}
1278				_, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(templ_7745c5c3_Var68)
1279				if templ_7745c5c3_Err != nil {
1280					return templ_7745c5c3_Err
1281				}
1282				templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 112, "\">")
1283				if templ_7745c5c3_Err != nil {
1284					return templ_7745c5c3_Err
1285				}
1286				for _, h := range f.Hunks {
1287					templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 113, "<tbody>")
1288					if templ_7745c5c3_Err != nil {
1289						return templ_7745c5c3_Err
1290					}
1291					if h.Gap != nil {
1292						templ_7745c5c3_Err = gapRow(*h.Gap, 4).Render(ctx, templ_7745c5c3_Buffer)
1293						if templ_7745c5c3_Err != nil {
1294							return templ_7745c5c3_Err
1295						}
1296					}
1297					templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 114, "<tr class=\"hunk\"><td colspan=\"4\">")
1298					if templ_7745c5c3_Err != nil {
1299						return templ_7745c5c3_Err
1300					}
1301					var templ_7745c5c3_Var69 string
1302					templ_7745c5c3_Var69, templ_7745c5c3_Err = templ.JoinStringErrs(h.Header)
1303					if templ_7745c5c3_Err != nil {
1304						return templ.Error{Err: templ_7745c5c3_Err, FileName: `internal/adapters/web/diff.templ`, Line: 218, Col: 51}
1305					}
1306					_, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(templ.EscapeString(templ_7745c5c3_Var69))
1307					if templ_7745c5c3_Err != nil {
1308						return templ_7745c5c3_Err
1309					}
1310					templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 115, "</td></tr>")
1311					if templ_7745c5c3_Err != nil {
1312						return templ_7745c5c3_Err
1313					}
1314					for _, ln := range h.Lines {
1315						var templ_7745c5c3_Var70 = []any{ln.Kind}
1316						templ_7745c5c3_Err = templ.RenderCSSItems(ctx, templ_7745c5c3_Buffer, templ_7745c5c3_Var70...)
1317						if templ_7745c5c3_Err != nil {
1318							return templ_7745c5c3_Err
1319						}
1320						templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 116, "<tr class=\"")
1321						if templ_7745c5c3_Err != nil {
1322							return templ_7745c5c3_Err
1323						}
1324						var templ_7745c5c3_Var71 string
1325						templ_7745c5c3_Var71, templ_7745c5c3_Err = templ.ResolveAttributeValue(templ.CSSClasses(templ_7745c5c3_Var70).String())
1326						if templ_7745c5c3_Err != nil {
1327							return templ.Error{Err: templ_7745c5c3_Err, FileName: `internal/adapters/web/diff.templ`, Line: 1, Col: 0}
1328						}
1329						_, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(templ_7745c5c3_Var71)
1330						if templ_7745c5c3_Err != nil {
1331							return templ_7745c5c3_Err
1332						}
1333						templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 117, "\"><td class=\"ln\">")
1334						if templ_7745c5c3_Err != nil {
1335							return templ_7745c5c3_Err
1336						}
1337						templ_7745c5c3_Err = gutter(ln.Old, ln.OldHref).Render(ctx, templ_7745c5c3_Buffer)
1338						if templ_7745c5c3_Err != nil {
1339							return templ_7745c5c3_Err
1340						}
1341						templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 118, "</td><td class=\"ln\">")
1342						if templ_7745c5c3_Err != nil {
1343							return templ_7745c5c3_Err
1344						}
1345						templ_7745c5c3_Err = gutter(ln.New, ln.NewHref).Render(ctx, templ_7745c5c3_Buffer)
1346						if templ_7745c5c3_Err != nil {
1347							return templ_7745c5c3_Err
1348						}
1349						templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 119, "</td><td class=\"m\">")
1350						if templ_7745c5c3_Err != nil {
1351							return templ_7745c5c3_Err
1352						}
1353						var templ_7745c5c3_Var72 string
1354						templ_7745c5c3_Var72, templ_7745c5c3_Err = templ.JoinStringErrs(ln.Mark)
1355						if templ_7745c5c3_Err != nil {
1356							return templ.Error{Err: templ_7745c5c3_Err, FileName: `internal/adapters/web/diff.templ`, Line: 223, Col: 33}
1357						}
1358						_, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(templ.EscapeString(templ_7745c5c3_Var72))
1359						if templ_7745c5c3_Err != nil {
1360							return templ_7745c5c3_Err
1361						}
1362						templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 120, "</td><td class=\"tx chroma\">")
1363						if templ_7745c5c3_Err != nil {
1364							return templ_7745c5c3_Err
1365						}
1366						templ_7745c5c3_Err = codeLine(ln).Render(ctx, templ_7745c5c3_Buffer)
1367						if templ_7745c5c3_Err != nil {
1368							return templ_7745c5c3_Err
1369						}
1370						templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 121, "</td></tr>")
1371						if templ_7745c5c3_Err != nil {
1372							return templ_7745c5c3_Err
1373						}
1374						if len(ln.Notes) > 0 || ln.Form != nil {
1375							templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 122, "<tr class=\"fnote\"><td colspan=\"3\"></td><td>")
1376							if templ_7745c5c3_Err != nil {
1377								return templ_7745c5c3_Err
1378							}
1379							templ_7745c5c3_Err = lineNotes(ln.Notes, ln.Form, "").Render(ctx, templ_7745c5c3_Buffer)
1380							if templ_7745c5c3_Err != nil {
1381								return templ_7745c5c3_Err
1382							}
1383							templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 123, "</td></tr>")
1384							if templ_7745c5c3_Err != nil {
1385								return templ_7745c5c3_Err
1386							}
1387						}
1388					}
1389					templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 124, "</tbody> ")
1390					if templ_7745c5c3_Err != nil {
1391						return templ_7745c5c3_Err
1392					}
1393				}
1394				if f.Tail != nil {
1395					templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 125, "<tbody>")
1396					if templ_7745c5c3_Err != nil {
1397						return templ_7745c5c3_Err
1398					}
1399					templ_7745c5c3_Err = gapRow(*f.Tail, 4).Render(ctx, templ_7745c5c3_Buffer)
1400					if templ_7745c5c3_Err != nil {
1401						return templ_7745c5c3_Err
1402					}
1403					templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 126, "</tbody>")
1404					if templ_7745c5c3_Err != nil {
1405						return templ_7745c5c3_Err
1406					}
1407				}
1408				templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 127, "</table>")
1409				if templ_7745c5c3_Err != nil {
1410					return templ_7745c5c3_Err
1411				}
1412			}
1413			if p.ShowSplit {
1414				templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 128, "<table class=\"dt spl\" aria-label=\"")
1415				if templ_7745c5c3_Err != nil {
1416					return templ_7745c5c3_Err
1417				}
1418				var templ_7745c5c3_Var73 string
1419				templ_7745c5c3_Var73, templ_7745c5c3_Err = templ.ResolveAttributeValue(f.Path + ", split")
1420				if templ_7745c5c3_Err != nil {
1421					return templ.Error{Err: templ_7745c5c3_Err, FileName: `internal/adapters/web/diff.templ`, Line: 243, Col: 58}
1422				}
1423				_, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(templ_7745c5c3_Var73)
1424				if templ_7745c5c3_Err != nil {
1425					return templ_7745c5c3_Err
1426				}
1427				templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 129, "\"><colgroup><col class=\"c-ln\"><col class=\"c-m\"><col><col class=\"c-ln\"><col class=\"c-m\"><col></colgroup> ")
1428				if templ_7745c5c3_Err != nil {
1429					return templ_7745c5c3_Err
1430				}
1431				for _, h := range f.Hunks {
1432					templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 130, "<tbody>")
1433					if templ_7745c5c3_Err != nil {
1434						return templ_7745c5c3_Err
1435					}
1436					if h.Gap != nil {
1437						templ_7745c5c3_Err = gapRow(*h.Gap, 6).Render(ctx, templ_7745c5c3_Buffer)
1438						if templ_7745c5c3_Err != nil {
1439							return templ_7745c5c3_Err
1440						}
1441					}
1442					templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 131, "<tr class=\"hunk\"><td colspan=\"6\">")
1443					if templ_7745c5c3_Err != nil {
1444						return templ_7745c5c3_Err
1445					}
1446					var templ_7745c5c3_Var74 string
1447					templ_7745c5c3_Var74, templ_7745c5c3_Err = templ.JoinStringErrs(h.Header)
1448					if templ_7745c5c3_Err != nil {
1449						return templ.Error{Err: templ_7745c5c3_Err, FileName: `internal/adapters/web/diff.templ`, Line: 250, Col: 51}
1450					}
1451					_, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(templ.EscapeString(templ_7745c5c3_Var74))
1452					if templ_7745c5c3_Err != nil {
1453						return templ_7745c5c3_Err
1454					}
1455					templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 132, "</td></tr>")
1456					if templ_7745c5c3_Err != nil {
1457						return templ_7745c5c3_Err
1458					}
1459					for _, row := range h.Split {
1460						templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 133, "<tr>")
1461						if templ_7745c5c3_Err != nil {
1462							return templ_7745c5c3_Err
1463						}
1464						templ_7745c5c3_Err = splitSide(row.L, true).Render(ctx, templ_7745c5c3_Buffer)
1465						if templ_7745c5c3_Err != nil {
1466							return templ_7745c5c3_Err
1467						}
1468						templ_7745c5c3_Err = splitSide(row.R, false).Render(ctx, templ_7745c5c3_Buffer)
1469						if templ_7745c5c3_Err != nil {
1470							return templ_7745c5c3_Err
1471						}
1472						templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 134, "</tr>")
1473						if templ_7745c5c3_Err != nil {
1474							return templ_7745c5c3_Err
1475						}
1476						if notes, form := row.Notes(), row.Form(); len(notes) > 0 || form != nil {
1477							templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 135, "<tr class=\"fnote\"><td colspan=\"6\">")
1478							if templ_7745c5c3_Err != nil {
1479								return templ_7745c5c3_Err
1480							}
1481							templ_7745c5c3_Err = lineNotes(notes, form, "-s").Render(ctx, templ_7745c5c3_Buffer)
1482							if templ_7745c5c3_Err != nil {
1483								return templ_7745c5c3_Err
1484							}
1485							templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 136, "</td></tr>")
1486							if templ_7745c5c3_Err != nil {
1487								return templ_7745c5c3_Err
1488							}
1489						}
1490					}
1491					templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 137, "</tbody> ")
1492					if templ_7745c5c3_Err != nil {
1493						return templ_7745c5c3_Err
1494					}
1495				}
1496				if f.Tail != nil {
1497					templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 138, "<tbody>")
1498					if templ_7745c5c3_Err != nil {
1499						return templ_7745c5c3_Err
1500					}
1501					templ_7745c5c3_Err = gapRow(*f.Tail, 6).Render(ctx, templ_7745c5c3_Buffer)
1502					if templ_7745c5c3_Err != nil {
1503						return templ_7745c5c3_Err
1504					}
1505					templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 139, "</tbody>")
1506					if templ_7745c5c3_Err != nil {
1507						return templ_7745c5c3_Err
1508					}
1509				}
1510				templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 140, "</table>")
1511				if templ_7745c5c3_Err != nil {
1512					return templ_7745c5c3_Err
1513				}
1514			}
1515			templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 141, "</div>")
1516			if templ_7745c5c3_Err != nil {
1517				return templ_7745c5c3_Err
1518			}
1519		} else {
1520			templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 142, "<p class=\"note pad\">")
1521			if templ_7745c5c3_Err != nil {
1522				return templ_7745c5c3_Err
1523			}
1524			if f.Note != "" {
1525				var templ_7745c5c3_Var75 string
1526				templ_7745c5c3_Var75, templ_7745c5c3_Err = templ.JoinStringErrs(f.Note)
1527				if templ_7745c5c3_Err != nil {
1528					return templ.Error{Err: templ_7745c5c3_Err, FileName: `internal/adapters/web/diff.templ`, Line: 275, Col: 13}
1529				}
1530				_, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(templ.EscapeString(templ_7745c5c3_Var75))
1531				if templ_7745c5c3_Err != nil {
1532					return templ_7745c5c3_Err
1533				}
1534			} else {
1535				templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 143, "no textual change.")
1536				if templ_7745c5c3_Err != nil {
1537					return templ_7745c5c3_Err
1538				}
1539			}
1540			templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 144, "</p>")
1541			if templ_7745c5c3_Err != nil {
1542				return templ_7745c5c3_Err
1543			}
1544		}
1545		if len(f.Loose) > 0 {
1546			templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 145, "<div class=\"dloose\">")
1547			if templ_7745c5c3_Err != nil {
1548				return templ_7745c5c3_Err
1549			}
1550			for _, c := range f.Loose {
1551				templ_7745c5c3_Err = commentView(c, "").Render(ctx, templ_7745c5c3_Buffer)
1552				if templ_7745c5c3_Err != nil {
1553					return templ_7745c5c3_Err
1554				}
1555			}
1556			templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 146, "</div>")
1557			if templ_7745c5c3_Err != nil {
1558				return templ_7745c5c3_Err
1559			}
1560		}
1561		templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 147, "</details>")
1562		if templ_7745c5c3_Err != nil {
1563			return templ_7745c5c3_Err
1564		}
1565		return nil
1566	})
1567}
1568
1569// MRFiles is a window of files of a merge request, for the placeholders of
1570// the page: the files only, which replace the placeholders of the same ids.
1571func MRFiles(p MRFilesPage) templ.Component {
1572	return templruntime.GeneratedTemplate(func(templ_7745c5c3_Input templruntime.GeneratedComponentInput) (templ_7745c5c3_Err error) {
1573		templ_7745c5c3_W, ctx := templ_7745c5c3_Input.Writer, templ_7745c5c3_Input.Context
1574		if templ_7745c5c3_CtxErr := ctx.Err(); templ_7745c5c3_CtxErr != nil {
1575			return templ_7745c5c3_CtxErr
1576		}
1577		templ_7745c5c3_Buffer, templ_7745c5c3_IsBuffer := templruntime.GetBuffer(templ_7745c5c3_W)
1578		if !templ_7745c5c3_IsBuffer {
1579			defer func() {
1580				templ_7745c5c3_BufErr := templruntime.ReleaseBuffer(templ_7745c5c3_Buffer)
1581				if templ_7745c5c3_Err == nil {
1582					templ_7745c5c3_Err = templ_7745c5c3_BufErr
1583				}
1584			}()
1585		}
1586		ctx = templ.InitializeContext(ctx)
1587		templ_7745c5c3_Var76 := templ.GetChildren(ctx)
1588		if templ_7745c5c3_Var76 == nil {
1589			templ_7745c5c3_Var76 = templ.NopComponent
1590		}
1591		ctx = templ.ClearChildren(ctx)
1592		for _, f := range p.Files {
1593			templ_7745c5c3_Err = DiffFileView(f, p.DiffView).Render(ctx, templ_7745c5c3_Buffer)
1594			if templ_7745c5c3_Err != nil {
1595				return templ_7745c5c3_Err
1596			}
1597		}
1598		return nil
1599	})
1600}
1601
1602// MRFilesMoved answers a window of a diff that is not the one of the page any
1603// more: the placeholder shows it instead of a file of another diff.
1604func MRFilesMoved() templ.Component {
1605	return templruntime.GeneratedTemplate(func(templ_7745c5c3_Input templruntime.GeneratedComponentInput) (templ_7745c5c3_Err error) {
1606		templ_7745c5c3_W, ctx := templ_7745c5c3_Input.Writer, templ_7745c5c3_Input.Context
1607		if templ_7745c5c3_CtxErr := ctx.Err(); templ_7745c5c3_CtxErr != nil {
1608			return templ_7745c5c3_CtxErr
1609		}
1610		templ_7745c5c3_Buffer, templ_7745c5c3_IsBuffer := templruntime.GetBuffer(templ_7745c5c3_W)
1611		if !templ_7745c5c3_IsBuffer {
1612			defer func() {
1613				templ_7745c5c3_BufErr := templruntime.ReleaseBuffer(templ_7745c5c3_Buffer)
1614				if templ_7745c5c3_Err == nil {
1615					templ_7745c5c3_Err = templ_7745c5c3_BufErr
1616				}
1617			}()
1618		}
1619		ctx = templ.InitializeContext(ctx)
1620		templ_7745c5c3_Var77 := templ.GetChildren(ctx)
1621		if templ_7745c5c3_Var77 == nil {
1622			templ_7745c5c3_Var77 = templ.NopComponent
1623		}
1624		ctx = templ.ClearChildren(ctx)
1625		templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 148, "<p class=\"notice\" data-moved>this merge request changed since the page was loaded — <a href=\"\">reload</a></p>")
1626		if templ_7745c5c3_Err != nil {
1627			return templ_7745c5c3_Err
1628		}
1629		return nil
1630	})
1631}
1632
1633// gapRow is the row of the hidden lines before a hunk, or of the rest of the
1634// file: a button that loads them in their place (ermite.js, ermite.expand).
1635// Without scripts nothing loads them: hidden.
1636func gapRow(g DiffGap, cols int) templ.Component {
1637	return templruntime.GeneratedTemplate(func(templ_7745c5c3_Input templruntime.GeneratedComponentInput) (templ_7745c5c3_Err error) {
1638		templ_7745c5c3_W, ctx := templ_7745c5c3_Input.Writer, templ_7745c5c3_Input.Context
1639		if templ_7745c5c3_CtxErr := ctx.Err(); templ_7745c5c3_CtxErr != nil {
1640			return templ_7745c5c3_CtxErr
1641		}
1642		templ_7745c5c3_Buffer, templ_7745c5c3_IsBuffer := templruntime.GetBuffer(templ_7745c5c3_W)
1643		if !templ_7745c5c3_IsBuffer {
1644			defer func() {
1645				templ_7745c5c3_BufErr := templruntime.ReleaseBuffer(templ_7745c5c3_Buffer)
1646				if templ_7745c5c3_Err == nil {
1647					templ_7745c5c3_Err = templ_7745c5c3_BufErr
1648				}
1649			}()
1650		}
1651		ctx = templ.InitializeContext(ctx)
1652		templ_7745c5c3_Var78 := templ.GetChildren(ctx)
1653		if templ_7745c5c3_Var78 == nil {
1654			templ_7745c5c3_Var78 = templ.NopComponent
1655		}
1656		ctx = templ.ClearChildren(ctx)
1657		templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 149, "<tr class=\"gap\" data-js data-gap=\"")
1658		if templ_7745c5c3_Err != nil {
1659			return templ_7745c5c3_Err
1660		}
1661		var templ_7745c5c3_Var79 string
1662		templ_7745c5c3_Var79, templ_7745c5c3_Err = templ.ResolveAttributeValue(g.Key)
1663		if templ_7745c5c3_Err != nil {
1664			return templ.Error{Err: templ_7745c5c3_Err, FileName: `internal/adapters/web/diff.templ`, Line: 309, Col: 41}
1665		}
1666		_, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(templ_7745c5c3_Var79)
1667		if templ_7745c5c3_Err != nil {
1668			return templ_7745c5c3_Err
1669		}
1670		templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 150, "\"><td colspan=\"")
1671		if templ_7745c5c3_Err != nil {
1672			return templ_7745c5c3_Err
1673		}
1674		var templ_7745c5c3_Var80 string
1675		templ_7745c5c3_Var80, templ_7745c5c3_Err = templ.ResolveAttributeValue(itoa(cols))
1676		if templ_7745c5c3_Err != nil {
1677			return templ.Error{Err: templ_7745c5c3_Err, FileName: `internal/adapters/web/diff.templ`, Line: 310, Col: 26}
1678		}
1679		_, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(templ_7745c5c3_Var80)
1680		if templ_7745c5c3_Err != nil {
1681			return templ_7745c5c3_Err
1682		}
1683		templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 151, "\"><button type=\"button\" data-src=\"")
1684		if templ_7745c5c3_Err != nil {
1685			return templ_7745c5c3_Err
1686		}
1687		var templ_7745c5c3_Var81 string
1688		templ_7745c5c3_Var81, templ_7745c5c3_Err = templ.ResolveAttributeValue(g.Src)
1689		if templ_7745c5c3_Err != nil {
1690			return templ.Error{Err: templ_7745c5c3_Err, FileName: `internal/adapters/web/diff.templ`, Line: 311, Col: 41}
1691		}
1692		_, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(templ_7745c5c3_Var81)
1693		if templ_7745c5c3_Err != nil {
1694			return templ_7745c5c3_Err
1695		}
1696		templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 152, "\"><span aria-hidden=\"true\">⋯</span> ")
1697		if templ_7745c5c3_Err != nil {
1698			return templ_7745c5c3_Err
1699		}
1700		var templ_7745c5c3_Var82 string
1701		templ_7745c5c3_Var82, templ_7745c5c3_Err = templ.JoinStringErrs(g.Label())
1702		if templ_7745c5c3_Err != nil {
1703			return templ.Error{Err: templ_7745c5c3_Err, FileName: `internal/adapters/web/diff.templ`, Line: 312, Col: 51}
1704		}
1705		_, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(templ.EscapeString(templ_7745c5c3_Var82))
1706		if templ_7745c5c3_Err != nil {
1707			return templ_7745c5c3_Err
1708		}
1709		templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 153, "</button></td></tr>")
1710		if templ_7745c5c3_Err != nil {
1711			return templ_7745c5c3_Err
1712		}
1713		return nil
1714	})
1715}
1716
1717// DiffContext is the hidden lines of a gap, for /context: one body a layout,
1718// whose rows replace the rows of the gap in the table of that layout.
1719func DiffContext(c ContextRows) templ.Component {
1720	return templruntime.GeneratedTemplate(func(templ_7745c5c3_Input templruntime.GeneratedComponentInput) (templ_7745c5c3_Err error) {
1721		templ_7745c5c3_W, ctx := templ_7745c5c3_Input.Writer, templ_7745c5c3_Input.Context
1722		if templ_7745c5c3_CtxErr := ctx.Err(); templ_7745c5c3_CtxErr != nil {
1723			return templ_7745c5c3_CtxErr
1724		}
1725		templ_7745c5c3_Buffer, templ_7745c5c3_IsBuffer := templruntime.GetBuffer(templ_7745c5c3_W)
1726		if !templ_7745c5c3_IsBuffer {
1727			defer func() {
1728				templ_7745c5c3_BufErr := templruntime.ReleaseBuffer(templ_7745c5c3_Buffer)
1729				if templ_7745c5c3_Err == nil {
1730					templ_7745c5c3_Err = templ_7745c5c3_BufErr
1731				}
1732			}()
1733		}
1734		ctx = templ.InitializeContext(ctx)
1735		templ_7745c5c3_Var83 := templ.GetChildren(ctx)
1736		if templ_7745c5c3_Var83 == nil {
1737			templ_7745c5c3_Var83 = templ.NopComponent
1738		}
1739		ctx = templ.ClearChildren(ctx)
1740		templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 154, "<table><tbody data-for=\"uni\">")
1741		if templ_7745c5c3_Err != nil {
1742			return templ_7745c5c3_Err
1743		}
1744		for _, ln := range c.Lines {
1745			templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 155, "<tr class=\"ctx\"><td class=\"ln\">")
1746			if templ_7745c5c3_Err != nil {
1747				return templ_7745c5c3_Err
1748			}
1749			var templ_7745c5c3_Var84 string
1750			templ_7745c5c3_Var84, templ_7745c5c3_Err = templ.JoinStringErrs(ln.Old)
1751			if templ_7745c5c3_Err != nil {
1752				return templ.Error{Err: templ_7745c5c3_Err, FileName: `internal/adapters/web/diff.templ`, Line: 325, Col: 28}
1753			}
1754			_, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(templ.EscapeString(templ_7745c5c3_Var84))
1755			if templ_7745c5c3_Err != nil {
1756				return templ_7745c5c3_Err
1757			}
1758			templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 156, "</td><td class=\"ln\">")
1759			if templ_7745c5c3_Err != nil {
1760				return templ_7745c5c3_Err
1761			}
1762			var templ_7745c5c3_Var85 string
1763			templ_7745c5c3_Var85, templ_7745c5c3_Err = templ.JoinStringErrs(ln.New)
1764			if templ_7745c5c3_Err != nil {
1765				return templ.Error{Err: templ_7745c5c3_Err, FileName: `internal/adapters/web/diff.templ`, Line: 326, Col: 28}
1766			}
1767			_, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(templ.EscapeString(templ_7745c5c3_Var85))
1768			if templ_7745c5c3_Err != nil {
1769				return templ_7745c5c3_Err
1770			}
1771			templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 157, "</td><td class=\"m\">")
1772			if templ_7745c5c3_Err != nil {
1773				return templ_7745c5c3_Err
1774			}
1775			var templ_7745c5c3_Var86 string
1776			templ_7745c5c3_Var86, templ_7745c5c3_Err = templ.JoinStringErrs(ln.Mark)
1777			if templ_7745c5c3_Err != nil {
1778				return templ.Error{Err: templ_7745c5c3_Err, FileName: `internal/adapters/web/diff.templ`, Line: 327, Col: 28}
1779			}
1780			_, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(templ.EscapeString(templ_7745c5c3_Var86))
1781			if templ_7745c5c3_Err != nil {
1782				return templ_7745c5c3_Err
1783			}
1784			templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 158, "</td><td class=\"tx chroma\">")
1785			if templ_7745c5c3_Err != nil {
1786				return templ_7745c5c3_Err
1787			}
1788			templ_7745c5c3_Err = codeLine(ln).Render(ctx, templ_7745c5c3_Buffer)
1789			if templ_7745c5c3_Err != nil {
1790				return templ_7745c5c3_Err
1791			}
1792			templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 159, "</td></tr>")
1793			if templ_7745c5c3_Err != nil {
1794				return templ_7745c5c3_Err
1795			}
1796		}
1797		if c.More != nil {
1798			templ_7745c5c3_Err = gapRow(*c.More, 4).Render(ctx, templ_7745c5c3_Buffer)
1799			if templ_7745c5c3_Err != nil {
1800				return templ_7745c5c3_Err
1801			}
1802		}
1803		templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 160, "</tbody> <tbody data-for=\"spl\">")
1804		if templ_7745c5c3_Err != nil {
1805			return templ_7745c5c3_Err
1806		}
1807		for i := range c.Lines {
1808			templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 161, "<tr>")
1809			if templ_7745c5c3_Err != nil {
1810				return templ_7745c5c3_Err
1811			}
1812			templ_7745c5c3_Err = splitSide(&c.Lines[i], true).Render(ctx, templ_7745c5c3_Buffer)
1813			if templ_7745c5c3_Err != nil {
1814				return templ_7745c5c3_Err
1815			}
1816			templ_7745c5c3_Err = splitSide(&c.Lines[i], false).Render(ctx, templ_7745c5c3_Buffer)
1817			if templ_7745c5c3_Err != nil {
1818				return templ_7745c5c3_Err
1819			}
1820			templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 162, "</tr>")
1821			if templ_7745c5c3_Err != nil {
1822				return templ_7745c5c3_Err
1823			}
1824		}
1825		if c.More != nil {
1826			templ_7745c5c3_Err = gapRow(*c.More, 6).Render(ctx, templ_7745c5c3_Buffer)
1827			if templ_7745c5c3_Err != nil {
1828				return templ_7745c5c3_Err
1829			}
1830		}
1831		templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 163, "</tbody></table>")
1832		if templ_7745c5c3_Err != nil {
1833			return templ_7745c5c3_Err
1834		}
1835		return nil
1836	})
1837}
1838
1839// splitSide is one half of a row of the split view; a side without a line is
1840// an empty cell.
1841func splitSide(ln *DiffLine, old bool) templ.Component {
1842	return templruntime.GeneratedTemplate(func(templ_7745c5c3_Input templruntime.GeneratedComponentInput) (templ_7745c5c3_Err error) {
1843		templ_7745c5c3_W, ctx := templ_7745c5c3_Input.Writer, templ_7745c5c3_Input.Context
1844		if templ_7745c5c3_CtxErr := ctx.Err(); templ_7745c5c3_CtxErr != nil {
1845			return templ_7745c5c3_CtxErr
1846		}
1847		templ_7745c5c3_Buffer, templ_7745c5c3_IsBuffer := templruntime.GetBuffer(templ_7745c5c3_W)
1848		if !templ_7745c5c3_IsBuffer {
1849			defer func() {
1850				templ_7745c5c3_BufErr := templruntime.ReleaseBuffer(templ_7745c5c3_Buffer)
1851				if templ_7745c5c3_Err == nil {
1852					templ_7745c5c3_Err = templ_7745c5c3_BufErr
1853				}
1854			}()
1855		}
1856		ctx = templ.InitializeContext(ctx)
1857		templ_7745c5c3_Var87 := templ.GetChildren(ctx)
1858		if templ_7745c5c3_Var87 == nil {
1859			templ_7745c5c3_Var87 = templ.NopComponent
1860		}
1861		ctx = templ.ClearChildren(ctx)
1862		if ln == nil {
1863			templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 164, "<td class=\"ln none\"></td><td class=\"m none\"></td><td class=\"tx none\"></td>")
1864			if templ_7745c5c3_Err != nil {
1865				return templ_7745c5c3_Err
1866			}
1867		} else {
1868			var templ_7745c5c3_Var88 = []any{"ln", ln.Kind}
1869			templ_7745c5c3_Err = templ.RenderCSSItems(ctx, templ_7745c5c3_Buffer, templ_7745c5c3_Var88...)
1870			if templ_7745c5c3_Err != nil {
1871				return templ_7745c5c3_Err
1872			}
1873			templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 165, "<td class=\"")
1874			if templ_7745c5c3_Err != nil {
1875				return templ_7745c5c3_Err
1876			}
1877			var templ_7745c5c3_Var89 string
1878			templ_7745c5c3_Var89, templ_7745c5c3_Err = templ.ResolveAttributeValue(templ.CSSClasses(templ_7745c5c3_Var88).String())
1879			if templ_7745c5c3_Err != nil {
1880				return templ.Error{Err: templ_7745c5c3_Err, FileName: `internal/adapters/web/diff.templ`, Line: 1, Col: 0}
1881			}
1882			_, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(templ_7745c5c3_Var89)
1883			if templ_7745c5c3_Err != nil {
1884				return templ_7745c5c3_Err
1885			}
1886			templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 166, "\">")
1887			if templ_7745c5c3_Err != nil {
1888				return templ_7745c5c3_Err
1889			}
1890			if old {
1891				templ_7745c5c3_Err = gutter(ln.Old, ln.OldHref).Render(ctx, templ_7745c5c3_Buffer)
1892				if templ_7745c5c3_Err != nil {
1893					return templ_7745c5c3_Err
1894				}
1895			} else {
1896				templ_7745c5c3_Err = gutter(ln.New, ln.NewHref).Render(ctx, templ_7745c5c3_Buffer)
1897				if templ_7745c5c3_Err != nil {
1898					return templ_7745c5c3_Err
1899				}
1900			}
1901			templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 167, "</td>")
1902			if templ_7745c5c3_Err != nil {
1903				return templ_7745c5c3_Err
1904			}
1905			var templ_7745c5c3_Var90 = []any{"m", ln.Kind}
1906			templ_7745c5c3_Err = templ.RenderCSSItems(ctx, templ_7745c5c3_Buffer, templ_7745c5c3_Var90...)
1907			if templ_7745c5c3_Err != nil {
1908				return templ_7745c5c3_Err
1909			}
1910			templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 168, "<td class=\"")
1911			if templ_7745c5c3_Err != nil {
1912				return templ_7745c5c3_Err
1913			}
1914			var templ_7745c5c3_Var91 string
1915			templ_7745c5c3_Var91, templ_7745c5c3_Err = templ.ResolveAttributeValue(templ.CSSClasses(templ_7745c5c3_Var90).String())
1916			if templ_7745c5c3_Err != nil {
1917				return templ.Error{Err: templ_7745c5c3_Err, FileName: `internal/adapters/web/diff.templ`, Line: 1, Col: 0}
1918			}
1919			_, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(templ_7745c5c3_Var91)
1920			if templ_7745c5c3_Err != nil {
1921				return templ_7745c5c3_Err
1922			}
1923			templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 169, "\">")
1924			if templ_7745c5c3_Err != nil {
1925				return templ_7745c5c3_Err
1926			}
1927			var templ_7745c5c3_Var92 string
1928			templ_7745c5c3_Var92, templ_7745c5c3_Err = templ.JoinStringErrs(ln.Mark)
1929			if templ_7745c5c3_Err != nil {
1930				return templ.Error{Err: templ_7745c5c3_Err, FileName: `internal/adapters/web/diff.templ`, Line: 364, Col: 38}
1931			}
1932			_, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(templ.EscapeString(templ_7745c5c3_Var92))
1933			if templ_7745c5c3_Err != nil {
1934				return templ_7745c5c3_Err
1935			}
1936			templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 170, "</td>")
1937			if templ_7745c5c3_Err != nil {
1938				return templ_7745c5c3_Err
1939			}
1940			var templ_7745c5c3_Var93 = []any{"tx", "chroma", ln.Kind}
1941			templ_7745c5c3_Err = templ.RenderCSSItems(ctx, templ_7745c5c3_Buffer, templ_7745c5c3_Var93...)
1942			if templ_7745c5c3_Err != nil {
1943				return templ_7745c5c3_Err
1944			}
1945			templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 171, "<td class=\"")
1946			if templ_7745c5c3_Err != nil {
1947				return templ_7745c5c3_Err
1948			}
1949			var templ_7745c5c3_Var94 string
1950			templ_7745c5c3_Var94, templ_7745c5c3_Err = templ.ResolveAttributeValue(templ.CSSClasses(templ_7745c5c3_Var93).String())
1951			if templ_7745c5c3_Err != nil {
1952				return templ.Error{Err: templ_7745c5c3_Err, FileName: `internal/adapters/web/diff.templ`, Line: 1, Col: 0}
1953			}
1954			_, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(templ_7745c5c3_Var94)
1955			if templ_7745c5c3_Err != nil {
1956				return templ_7745c5c3_Err
1957			}
1958			templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 172, "\">")
1959			if templ_7745c5c3_Err != nil {
1960				return templ_7745c5c3_Err
1961			}
1962			templ_7745c5c3_Err = codeLine(*ln).Render(ctx, templ_7745c5c3_Buffer)
1963			if templ_7745c5c3_Err != nil {
1964				return templ_7745c5c3_Err
1965			}
1966			templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 173, "</td>")
1967			if templ_7745c5c3_Err != nil {
1968				return templ_7745c5c3_Err
1969			}
1970		}
1971		return nil
1972	})
1973}
1974
1975// gutter is a line number of the gutter. On a merge request that can be
1976// commented on, it links to the form that comments on that line.
1977func gutter(n, href string) templ.Component {
1978	return templruntime.GeneratedTemplate(func(templ_7745c5c3_Input templruntime.GeneratedComponentInput) (templ_7745c5c3_Err error) {
1979		templ_7745c5c3_W, ctx := templ_7745c5c3_Input.Writer, templ_7745c5c3_Input.Context
1980		if templ_7745c5c3_CtxErr := ctx.Err(); templ_7745c5c3_CtxErr != nil {
1981			return templ_7745c5c3_CtxErr
1982		}
1983		templ_7745c5c3_Buffer, templ_7745c5c3_IsBuffer := templruntime.GetBuffer(templ_7745c5c3_W)
1984		if !templ_7745c5c3_IsBuffer {
1985			defer func() {
1986				templ_7745c5c3_BufErr := templruntime.ReleaseBuffer(templ_7745c5c3_Buffer)
1987				if templ_7745c5c3_Err == nil {
1988					templ_7745c5c3_Err = templ_7745c5c3_BufErr
1989				}
1990			}()
1991		}
1992		ctx = templ.InitializeContext(ctx)
1993		templ_7745c5c3_Var95 := templ.GetChildren(ctx)
1994		if templ_7745c5c3_Var95 == nil {
1995			templ_7745c5c3_Var95 = templ.NopComponent
1996		}
1997		ctx = templ.ClearChildren(ctx)
1998		if href != "" {
1999			templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 174, "<a href=\"")
2000			if templ_7745c5c3_Err != nil {
2001				return templ_7745c5c3_Err
2002			}
2003			var templ_7745c5c3_Var96 templ.SafeURL
2004			templ_7745c5c3_Var96, templ_7745c5c3_Err = templ.JoinURLErrs(templ.SafeURL(href))
2005			if templ_7745c5c3_Err != nil {
2006				return templ.Error{Err: templ_7745c5c3_Err, FileName: `internal/adapters/web/diff.templ`, Line: 373, Col: 31}
2007			}
2008			_, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(templ.EscapeString(templ_7745c5c3_Var96))
2009			if templ_7745c5c3_Err != nil {
2010				return templ_7745c5c3_Err
2011			}
2012			templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 175, "\" title=\"comment on this line\">")
2013			if templ_7745c5c3_Err != nil {
2014				return templ_7745c5c3_Err
2015			}
2016			var templ_7745c5c3_Var97 string
2017			templ_7745c5c3_Var97, templ_7745c5c3_Err = templ.JoinStringErrs(n)
2018			if templ_7745c5c3_Err != nil {
2019				return templ.Error{Err: templ_7745c5c3_Err, FileName: `internal/adapters/web/diff.templ`, Line: 373, Col: 66}
2020			}
2021			_, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(templ.EscapeString(templ_7745c5c3_Var97))
2022			if templ_7745c5c3_Err != nil {
2023				return templ_7745c5c3_Err
2024			}
2025			templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 176, "</a>")
2026			if templ_7745c5c3_Err != nil {
2027				return templ_7745c5c3_Err
2028			}
2029		} else {
2030			var templ_7745c5c3_Var98 string
2031			templ_7745c5c3_Var98, templ_7745c5c3_Err = templ.JoinStringErrs(n)
2032			if templ_7745c5c3_Err != nil {
2033				return templ.Error{Err: templ_7745c5c3_Err, FileName: `internal/adapters/web/diff.templ`, Line: 375, Col: 5}
2034			}
2035			_, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(templ.EscapeString(templ_7745c5c3_Var98))
2036			if templ_7745c5c3_Err != nil {
2037				return templ_7745c5c3_Err
2038			}
2039		}
2040		return nil
2041	})
2042}
2043
2044var _ = templruntime.GeneratedTemplate

Keyboard shortcuts

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

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

Branches 2

Tags 45

↑↓ moveenter openesc close