v0.6.0 d5cc8fe

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 len(p.Refs) > 0 {
206				templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 19, "<dt>refs</dt><dd>")
207				if templ_7745c5c3_Err != nil {
208					return templ_7745c5c3_Err
209				}
210				for _, r := range p.Refs {
211					templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 20, "<span class=\"pill\">")
212					if templ_7745c5c3_Err != nil {
213						return templ_7745c5c3_Err
214					}
215					var templ_7745c5c3_Var10 string
216					templ_7745c5c3_Var10, templ_7745c5c3_Err = templ.JoinStringErrs(r)
217					if templ_7745c5c3_Err != nil {
218						return templ.Error{Err: templ_7745c5c3_Err, FileName: `internal/adapters/web/diff.templ`, Line: 47, Col: 29}
219					}
220					_, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(templ.EscapeString(templ_7745c5c3_Var10))
221					if templ_7745c5c3_Err != nil {
222						return templ_7745c5c3_Err
223					}
224					templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 21, "</span>")
225					if templ_7745c5c3_Err != nil {
226						return templ_7745c5c3_Err
227					}
228				}
229				templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 22, "</dd>")
230				if templ_7745c5c3_Err != nil {
231					return templ_7745c5c3_Err
232				}
233			}
234			templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 23, "</dl></header><div class=\"diff-tools\" role=\"toolbar\" aria-label=\"Diff view\"><span class=\"dim\">")
235			if templ_7745c5c3_Err != nil {
236				return templ_7745c5c3_Err
237			}
238			var templ_7745c5c3_Var11 string
239			templ_7745c5c3_Var11, templ_7745c5c3_Err = templ.JoinStringErrs(plural(p.NFiles, "file", "files"))
240			if templ_7745c5c3_Err != nil {
241				return templ.Error{Err: templ_7745c5c3_Err, FileName: `internal/adapters/web/diff.templ`, Line: 54, Col: 56}
242			}
243			_, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(templ.EscapeString(templ_7745c5c3_Var11))
244			if templ_7745c5c3_Err != nil {
245				return templ_7745c5c3_Err
246			}
247			templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 24, " · <span class=\"plus\">+")
248			if templ_7745c5c3_Err != nil {
249				return templ_7745c5c3_Err
250			}
251			var templ_7745c5c3_Var12 string
252			templ_7745c5c3_Var12, templ_7745c5c3_Err = templ.JoinStringErrs(itoa(p.Adds))
253			if templ_7745c5c3_Err != nil {
254				return templ.Error{Err: templ_7745c5c3_Err, FileName: `internal/adapters/web/diff.templ`, Line: 54, Col: 96}
255			}
256			_, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(templ.EscapeString(templ_7745c5c3_Var12))
257			if templ_7745c5c3_Err != nil {
258				return templ_7745c5c3_Err
259			}
260			templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 25, "</span> <span class=\"minus\">-")
261			if templ_7745c5c3_Err != nil {
262				return templ_7745c5c3_Err
263			}
264			var templ_7745c5c3_Var13 string
265			templ_7745c5c3_Var13, templ_7745c5c3_Err = templ.JoinStringErrs(itoa(p.Dels))
266			if templ_7745c5c3_Err != nil {
267				return templ.Error{Err: templ_7745c5c3_Err, FileName: `internal/adapters/web/diff.templ`, Line: 54, Col: 141}
268			}
269			_, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(templ.EscapeString(templ_7745c5c3_Var13))
270			if templ_7745c5c3_Err != nil {
271				return templ_7745c5c3_Err
272			}
273			templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 26, "</span></span> <span class=\"grow\"></span>")
274			if templ_7745c5c3_Err != nil {
275				return templ_7745c5c3_Err
276			}
277			templ_7745c5c3_Err = viewLink(p.DiffView, "unified", "Unified", "u", p.UnifiedHref).Render(ctx, templ_7745c5c3_Buffer)
278			if templ_7745c5c3_Err != nil {
279				return templ_7745c5c3_Err
280			}
281			templ_7745c5c3_Err = viewLink(p.DiffView, "split", "Split", "d", p.SplitHref).Render(ctx, templ_7745c5c3_Buffer)
282			if templ_7745c5c3_Err != nil {
283				return templ_7745c5c3_Err
284			}
285			templ_7745c5c3_Err = collapseButton().Render(ctx, templ_7745c5c3_Buffer)
286			if templ_7745c5c3_Err != nil {
287				return templ_7745c5c3_Err
288			}
289			templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 27, "</div>")
290			if templ_7745c5c3_Err != nil {
291				return templ_7745c5c3_Err
292			}
293			if p.Invisible {
294				templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 28, "<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>")
295				if templ_7745c5c3_Err != nil {
296					return templ_7745c5c3_Err
297				}
298			}
299			templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 29, " ")
300			if templ_7745c5c3_Err != nil {
301				return templ_7745c5c3_Err
302			}
303			if p.Note != "" {
304				templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 30, "<p class=\"notice\">")
305				if templ_7745c5c3_Err != nil {
306					return templ_7745c5c3_Err
307				}
308				var templ_7745c5c3_Var14 string
309				templ_7745c5c3_Var14, templ_7745c5c3_Err = templ.JoinStringErrs(p.Note)
310				if templ_7745c5c3_Err != nil {
311					return templ.Error{Err: templ_7745c5c3_Err, FileName: `internal/adapters/web/diff.templ`, Line: 67, Col: 29}
312				}
313				_, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(templ.EscapeString(templ_7745c5c3_Var14))
314				if templ_7745c5c3_Err != nil {
315					return templ_7745c5c3_Err
316				}
317				templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 31, "</p>")
318				if templ_7745c5c3_Err != nil {
319					return templ_7745c5c3_Err
320				}
321			}
322			templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 32, " <div id=\"diffs\"")
323			if templ_7745c5c3_Err != nil {
324				return templ_7745c5c3_Err
325			}
326			if p.Both {
327				templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 33, " data-diff=\"")
328				if templ_7745c5c3_Err != nil {
329					return templ_7745c5c3_Err
330				}
331				var templ_7745c5c3_Var15 string
332				templ_7745c5c3_Var15, templ_7745c5c3_Err = templ.ResolveAttributeValue(p.View)
333				if templ_7745c5c3_Err != nil {
334					return templ.Error{Err: templ_7745c5c3_Err, FileName: `internal/adapters/web/diff.templ`, Line: 72, Col: 22}
335				}
336				_, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(templ_7745c5c3_Var15)
337				if templ_7745c5c3_Err != nil {
338					return templ_7745c5c3_Err
339				}
340				templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 34, "\"")
341				if templ_7745c5c3_Err != nil {
342					return templ_7745c5c3_Err
343				}
344			} else {
345				templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 35, " data-view=\"")
346				if templ_7745c5c3_Err != nil {
347					return templ_7745c5c3_Err
348				}
349				var templ_7745c5c3_Var16 string
350				templ_7745c5c3_Var16, templ_7745c5c3_Err = templ.ResolveAttributeValue(p.View)
351				if templ_7745c5c3_Err != nil {
352					return templ.Error{Err: templ_7745c5c3_Err, FileName: `internal/adapters/web/diff.templ`, Line: 74, Col: 22}
353				}
354				_, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(templ_7745c5c3_Var16)
355				if templ_7745c5c3_Err != nil {
356					return templ_7745c5c3_Err
357				}
358				templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 36, "\"")
359				if templ_7745c5c3_Err != nil {
360					return templ_7745c5c3_Err
361				}
362			}
363			if p.Both && !p.Pinned {
364				templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 37, " hx-live=\"this.dataset.diff = sessionStorage.getItem('diff') || this.dataset.diff\"")
365				if templ_7745c5c3_Err != nil {
366					return templ_7745c5c3_Err
367				}
368			}
369			templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 38, ">")
370			if templ_7745c5c3_Err != nil {
371				return templ_7745c5c3_Err
372			}
373			for _, f := range p.Files {
374				templ_7745c5c3_Err = DiffFileView(f, p.DiffView).Render(ctx, templ_7745c5c3_Buffer)
375				if templ_7745c5c3_Err != nil {
376					return templ_7745c5c3_Err
377				}
378			}
379			if len(p.Files) == 0 {
380				templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 39, "<p class=\"note\">no changed files")
381				if templ_7745c5c3_Err != nil {
382					return templ_7745c5c3_Err
383				}
384				var templ_7745c5c3_Var17 string
385				templ_7745c5c3_Var17, templ_7745c5c3_Err = templ.JoinStringErrs(" ")
386				if templ_7745c5c3_Err != nil {
387					return templ.Error{Err: templ_7745c5c3_Err, FileName: `internal/adapters/web/diff.templ`, Line: 84, Col: 41}
388				}
389				_, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(templ.EscapeString(templ_7745c5c3_Var17))
390				if templ_7745c5c3_Err != nil {
391					return templ_7745c5c3_Err
392				}
393				templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 40, " ")
394				if templ_7745c5c3_Err != nil {
395					return templ_7745c5c3_Err
396				}
397				if p.Merge {
398					templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 41, "against the first parent.")
399					if templ_7745c5c3_Err != nil {
400						return templ_7745c5c3_Err
401					}
402				} else {
403					templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 42, "in this commit.")
404					if templ_7745c5c3_Err != nil {
405						return templ_7745c5c3_Err
406					}
407				}
408				templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 43, "</p>")
409				if templ_7745c5c3_Err != nil {
410					return templ_7745c5c3_Err
411				}
412			}
413			templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 44, "</div>")
414			if templ_7745c5c3_Err != nil {
415				return templ_7745c5c3_Err
416			}
417			return nil
418		})
419		templ_7745c5c3_Err = Shell(l, commitRail(p)).Render(templ.WithChildren(ctx, templ_7745c5c3_Var2), templ_7745c5c3_Buffer)
420		if templ_7745c5c3_Err != nil {
421			return templ_7745c5c3_Err
422		}
423		return nil
424	})
425}
426
427// viewLink is a button of the diff tools. It is a link, so that the split
428// layout works without JavaScript; with it, and when both layouts are in the
429// page, a click only flips the layout.
430func viewLink(p DiffView, view, label, key, href string) templ.Component {
431	return templruntime.GeneratedTemplate(func(templ_7745c5c3_Input templruntime.GeneratedComponentInput) (templ_7745c5c3_Err error) {
432		templ_7745c5c3_W, ctx := templ_7745c5c3_Input.Writer, templ_7745c5c3_Input.Context
433		if templ_7745c5c3_CtxErr := ctx.Err(); templ_7745c5c3_CtxErr != nil {
434			return templ_7745c5c3_CtxErr
435		}
436		templ_7745c5c3_Buffer, templ_7745c5c3_IsBuffer := templruntime.GetBuffer(templ_7745c5c3_W)
437		if !templ_7745c5c3_IsBuffer {
438			defer func() {
439				templ_7745c5c3_BufErr := templruntime.ReleaseBuffer(templ_7745c5c3_Buffer)
440				if templ_7745c5c3_Err == nil {
441					templ_7745c5c3_Err = templ_7745c5c3_BufErr
442				}
443			}()
444		}
445		ctx = templ.InitializeContext(ctx)
446		templ_7745c5c3_Var18 := templ.GetChildren(ctx)
447		if templ_7745c5c3_Var18 == nil {
448			templ_7745c5c3_Var18 = templ.NopComponent
449		}
450		ctx = templ.ClearChildren(ctx)
451		templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 45, "<a href=\"")
452		if templ_7745c5c3_Err != nil {
453			return templ_7745c5c3_Err
454		}
455		var templ_7745c5c3_Var19 templ.SafeURL
456		templ_7745c5c3_Var19, templ_7745c5c3_Err = templ.JoinURLErrs(templ.SafeURL(href))
457		if templ_7745c5c3_Err != nil {
458			return templ.Error{Err: templ_7745c5c3_Err, FileName: `internal/adapters/web/diff.templ`, Line: 101, Col: 28}
459		}
460		_, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(templ.EscapeString(templ_7745c5c3_Var19))
461		if templ_7745c5c3_Err != nil {
462			return templ_7745c5c3_Err
463		}
464		templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 46, "\" class=\"btn vbtn\" data-view=\"")
465		if templ_7745c5c3_Err != nil {
466			return templ_7745c5c3_Err
467		}
468		var templ_7745c5c3_Var20 string
469		templ_7745c5c3_Var20, templ_7745c5c3_Err = templ.ResolveAttributeValue(view)
470		if templ_7745c5c3_Err != nil {
471			return templ.Error{Err: templ_7745c5c3_Err, FileName: `internal/adapters/web/diff.templ`, Line: 103, Col: 18}
472		}
473		_, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(templ_7745c5c3_Var20)
474		if templ_7745c5c3_Err != nil {
475			return templ_7745c5c3_Err
476		}
477		templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 47, "\" aria-keyshortcuts=\"")
478		if templ_7745c5c3_Err != nil {
479			return templ_7745c5c3_Err
480		}
481		var templ_7745c5c3_Var21 string
482		templ_7745c5c3_Var21, templ_7745c5c3_Err = templ.ResolveAttributeValue(key)
483		if templ_7745c5c3_Err != nil {
484			return templ.Error{Err: templ_7745c5c3_Err, FileName: `internal/adapters/web/diff.templ`, Line: 104, Col: 25}
485		}
486		_, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(templ_7745c5c3_Var21)
487		if templ_7745c5c3_Err != nil {
488			return templ_7745c5c3_Err
489		}
490		templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 48, "\"")
491		if templ_7745c5c3_Err != nil {
492			return templ_7745c5c3_Err
493		}
494		if p.View == view {
495			templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 49, " aria-current=\"true\"")
496			if templ_7745c5c3_Err != nil {
497				return templ_7745c5c3_Err
498			}
499		}
500		if p.Both {
501			templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 50, " hx-on:click=\"event.preventDefault(); document.body.dispatchEvent(new CustomEvent('k-' + this.dataset.view))\" :aria-current=\"")
502			if templ_7745c5c3_Err != nil {
503				return templ_7745c5c3_Err
504			}
505			var templ_7745c5c3_Var22 string
506			templ_7745c5c3_Var22, templ_7745c5c3_Err = templ.ResolveAttributeValue("q('#diffs').attr['data-diff'] === '" + view + "' ? 'true' : false")
507			if templ_7745c5c3_Err != nil {
508				return templ.Error{Err: templ_7745c5c3_Err, FileName: `internal/adapters/web/diff.templ`, Line: 110, Col: 86}
509			}
510			_, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(templ_7745c5c3_Var22)
511			if templ_7745c5c3_Err != nil {
512				return templ_7745c5c3_Err
513			}
514			templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 51, "\"")
515			if templ_7745c5c3_Err != nil {
516				return templ_7745c5c3_Err
517			}
518		}
519		templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 52, ">")
520		if templ_7745c5c3_Err != nil {
521			return templ_7745c5c3_Err
522		}
523		var templ_7745c5c3_Var23 string
524		templ_7745c5c3_Var23, templ_7745c5c3_Err = templ.JoinStringErrs(label)
525		if templ_7745c5c3_Err != nil {
526			return templ.Error{Err: templ_7745c5c3_Err, FileName: `internal/adapters/web/diff.templ`, Line: 112, Col: 9}
527		}
528		_, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(templ.EscapeString(templ_7745c5c3_Var23))
529		if templ_7745c5c3_Err != nil {
530			return templ_7745c5c3_Err
531		}
532		templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 53, "<kbd aria-hidden=\"true\">")
533		if templ_7745c5c3_Err != nil {
534			return templ_7745c5c3_Err
535		}
536		var templ_7745c5c3_Var24 string
537		templ_7745c5c3_Var24, templ_7745c5c3_Err = templ.JoinStringErrs(key)
538		if templ_7745c5c3_Err != nil {
539			return templ.Error{Err: templ_7745c5c3_Err, FileName: `internal/adapters/web/diff.templ`, Line: 112, Col: 40}
540		}
541		_, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(templ.EscapeString(templ_7745c5c3_Var24))
542		if templ_7745c5c3_Err != nil {
543			return templ_7745c5c3_Err
544		}
545		templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 54, "</kbd></a>")
546		if templ_7745c5c3_Err != nil {
547			return templ_7745c5c3_Err
548		}
549		return nil
550	})
551}
552
553// collapseButton folds every file of the diff, or opens them all again when
554// none is open; its label follows the state.
555func collapseButton() templ.Component {
556	return templruntime.GeneratedTemplate(func(templ_7745c5c3_Input templruntime.GeneratedComponentInput) (templ_7745c5c3_Err error) {
557		templ_7745c5c3_W, ctx := templ_7745c5c3_Input.Writer, templ_7745c5c3_Input.Context
558		if templ_7745c5c3_CtxErr := ctx.Err(); templ_7745c5c3_CtxErr != nil {
559			return templ_7745c5c3_CtxErr
560		}
561		templ_7745c5c3_Buffer, templ_7745c5c3_IsBuffer := templruntime.GetBuffer(templ_7745c5c3_W)
562		if !templ_7745c5c3_IsBuffer {
563			defer func() {
564				templ_7745c5c3_BufErr := templruntime.ReleaseBuffer(templ_7745c5c3_Buffer)
565				if templ_7745c5c3_Err == nil {
566					templ_7745c5c3_Err = templ_7745c5c3_BufErr
567				}
568			}()
569		}
570		ctx = templ.InitializeContext(ctx)
571		templ_7745c5c3_Var25 := templ.GetChildren(ctx)
572		if templ_7745c5c3_Var25 == nil {
573			templ_7745c5c3_Var25 = templ.NopComponent
574		}
575		ctx = templ.ClearChildren(ctx)
576		templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 55, "<button type=\"button\" aria-keyshortcuts=\"x\" hx-on:click=\"document.body.dispatchEvent(new CustomEvent('k-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>")
577		if templ_7745c5c3_Err != nil {
578			return templ_7745c5c3_Err
579		}
580		return nil
581	})
582}
583
584func personView(pr Person) templ.Component {
585	return templruntime.GeneratedTemplate(func(templ_7745c5c3_Input templruntime.GeneratedComponentInput) (templ_7745c5c3_Err error) {
586		templ_7745c5c3_W, ctx := templ_7745c5c3_Input.Writer, templ_7745c5c3_Input.Context
587		if templ_7745c5c3_CtxErr := ctx.Err(); templ_7745c5c3_CtxErr != nil {
588			return templ_7745c5c3_CtxErr
589		}
590		templ_7745c5c3_Buffer, templ_7745c5c3_IsBuffer := templruntime.GetBuffer(templ_7745c5c3_W)
591		if !templ_7745c5c3_IsBuffer {
592			defer func() {
593				templ_7745c5c3_BufErr := templruntime.ReleaseBuffer(templ_7745c5c3_Buffer)
594				if templ_7745c5c3_Err == nil {
595					templ_7745c5c3_Err = templ_7745c5c3_BufErr
596				}
597			}()
598		}
599		ctx = templ.InitializeContext(ctx)
600		templ_7745c5c3_Var26 := templ.GetChildren(ctx)
601		if templ_7745c5c3_Var26 == nil {
602			templ_7745c5c3_Var26 = templ.NopComponent
603		}
604		ctx = templ.ClearChildren(ctx)
605		var templ_7745c5c3_Var27 string
606		templ_7745c5c3_Var27, templ_7745c5c3_Err = templ.JoinStringErrs(pr.Name)
607		if templ_7745c5c3_Err != nil {
608			return templ.Error{Err: templ_7745c5c3_Err, FileName: `internal/adapters/web/diff.templ`, Line: 124, Col: 10}
609		}
610		_, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(templ.EscapeString(templ_7745c5c3_Var27))
611		if templ_7745c5c3_Err != nil {
612			return templ_7745c5c3_Err
613		}
614		templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 56, " ")
615		if templ_7745c5c3_Err != nil {
616			return templ_7745c5c3_Err
617		}
618		if pr.WhenAt != "" {
619			var templ_7745c5c3_Var28 string
620			templ_7745c5c3_Var28, templ_7745c5c3_Err = templ.JoinStringErrs(" · ")
621			if templ_7745c5c3_Err != nil {
622				return templ.Error{Err: templ_7745c5c3_Err, FileName: `internal/adapters/web/diff.templ`, Line: 126, Col: 10}
623			}
624			_, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(templ.EscapeString(templ_7745c5c3_Var28))
625			if templ_7745c5c3_Err != nil {
626				return templ_7745c5c3_Err
627			}
628			templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 57, "<time datetime=\"")
629			if templ_7745c5c3_Err != nil {
630				return templ_7745c5c3_Err
631			}
632			var templ_7745c5c3_Var29 string
633			templ_7745c5c3_Var29, templ_7745c5c3_Err = templ.ResolveAttributeValue(pr.WhenAt)
634			if templ_7745c5c3_Err != nil {
635				return templ.Error{Err: templ_7745c5c3_Err, FileName: `internal/adapters/web/diff.templ`, Line: 126, Col: 38}
636			}
637			_, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(templ_7745c5c3_Var29)
638			if templ_7745c5c3_Err != nil {
639				return templ_7745c5c3_Err
640			}
641			templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 58, "\" title=\"")
642			if templ_7745c5c3_Err != nil {
643				return templ_7745c5c3_Err
644			}
645			var templ_7745c5c3_Var30 string
646			templ_7745c5c3_Var30, templ_7745c5c3_Err = templ.ResolveAttributeValue(pr.Abs)
647			if templ_7745c5c3_Err != nil {
648				return templ.Error{Err: templ_7745c5c3_Err, FileName: `internal/adapters/web/diff.templ`, Line: 126, Col: 55}
649			}
650			_, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(templ_7745c5c3_Var30)
651			if templ_7745c5c3_Err != nil {
652				return templ_7745c5c3_Err
653			}
654			templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 59, "\">")
655			if templ_7745c5c3_Err != nil {
656				return templ_7745c5c3_Err
657			}
658			var templ_7745c5c3_Var31 string
659			templ_7745c5c3_Var31, templ_7745c5c3_Err = templ.JoinStringErrs(pr.When)
660			if templ_7745c5c3_Err != nil {
661				return templ.Error{Err: templ_7745c5c3_Err, FileName: `internal/adapters/web/diff.templ`, Line: 126, Col: 67}
662			}
663			_, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(templ.EscapeString(templ_7745c5c3_Var31))
664			if templ_7745c5c3_Err != nil {
665				return templ_7745c5c3_Err
666			}
667			templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 60, "</time>")
668			if templ_7745c5c3_Err != nil {
669				return templ_7745c5c3_Err
670			}
671			var templ_7745c5c3_Var32 string
672			templ_7745c5c3_Var32, templ_7745c5c3_Err = templ.JoinStringErrs(" · " + pr.Abs)
673			if templ_7745c5c3_Err != nil {
674				return templ.Error{Err: templ_7745c5c3_Err, FileName: `internal/adapters/web/diff.templ`, Line: 126, Col: 93}
675			}
676			_, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(templ.EscapeString(templ_7745c5c3_Var32))
677			if templ_7745c5c3_Err != nil {
678				return templ_7745c5c3_Err
679			}
680		}
681		return nil
682	})
683}
684
685func commitRail(p CommitPage) templ.Component {
686	return templruntime.GeneratedTemplate(func(templ_7745c5c3_Input templruntime.GeneratedComponentInput) (templ_7745c5c3_Err error) {
687		templ_7745c5c3_W, ctx := templ_7745c5c3_Input.Writer, templ_7745c5c3_Input.Context
688		if templ_7745c5c3_CtxErr := ctx.Err(); templ_7745c5c3_CtxErr != nil {
689			return templ_7745c5c3_CtxErr
690		}
691		templ_7745c5c3_Buffer, templ_7745c5c3_IsBuffer := templruntime.GetBuffer(templ_7745c5c3_W)
692		if !templ_7745c5c3_IsBuffer {
693			defer func() {
694				templ_7745c5c3_BufErr := templruntime.ReleaseBuffer(templ_7745c5c3_Buffer)
695				if templ_7745c5c3_Err == nil {
696					templ_7745c5c3_Err = templ_7745c5c3_BufErr
697				}
698			}()
699		}
700		ctx = templ.InitializeContext(ctx)
701		templ_7745c5c3_Var33 := templ.GetChildren(ctx)
702		if templ_7745c5c3_Var33 == nil {
703			templ_7745c5c3_Var33 = templ.NopComponent
704		}
705		ctx = templ.ClearChildren(ctx)
706		templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 61, "<section aria-labelledby=\"r-files\"><h2 id=\"r-files\">Files <span class=\"count\">")
707		if templ_7745c5c3_Err != nil {
708			return templ_7745c5c3_Err
709		}
710		var templ_7745c5c3_Var34 string
711		templ_7745c5c3_Var34, templ_7745c5c3_Err = templ.JoinStringErrs(itoa(len(p.Files)))
712		if templ_7745c5c3_Err != nil {
713			return templ.Error{Err: templ_7745c5c3_Err, FileName: `internal/adapters/web/diff.templ`, Line: 132, Col: 65}
714		}
715		_, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(templ.EscapeString(templ_7745c5c3_Var34))
716		if templ_7745c5c3_Err != nil {
717			return templ_7745c5c3_Err
718		}
719		templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 62, "</span></h2>")
720		if templ_7745c5c3_Err != nil {
721			return templ_7745c5c3_Err
722		}
723		templ_7745c5c3_Err = FileList(p.Files).Render(ctx, templ_7745c5c3_Buffer)
724		if templ_7745c5c3_Err != nil {
725			return templ_7745c5c3_Err
726		}
727		templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 63, "</section>")
728		if templ_7745c5c3_Err != nil {
729			return templ_7745c5c3_Err
730		}
731		return nil
732	})
733}
734
735// FileList is the table of contents of a diff: status letter, path, +n -m
736// and an ASCII bar. The row of the file in view is marked.
737func FileList(files []DiffFile) templ.Component {
738	return templruntime.GeneratedTemplate(func(templ_7745c5c3_Input templruntime.GeneratedComponentInput) (templ_7745c5c3_Err error) {
739		templ_7745c5c3_W, ctx := templ_7745c5c3_Input.Writer, templ_7745c5c3_Input.Context
740		if templ_7745c5c3_CtxErr := ctx.Err(); templ_7745c5c3_CtxErr != nil {
741			return templ_7745c5c3_CtxErr
742		}
743		templ_7745c5c3_Buffer, templ_7745c5c3_IsBuffer := templruntime.GetBuffer(templ_7745c5c3_W)
744		if !templ_7745c5c3_IsBuffer {
745			defer func() {
746				templ_7745c5c3_BufErr := templruntime.ReleaseBuffer(templ_7745c5c3_Buffer)
747				if templ_7745c5c3_Err == nil {
748					templ_7745c5c3_Err = templ_7745c5c3_BufErr
749				}
750			}()
751		}
752		ctx = templ.InitializeContext(ctx)
753		templ_7745c5c3_Var35 := templ.GetChildren(ctx)
754		if templ_7745c5c3_Var35 == nil {
755			templ_7745c5c3_Var35 = templ.NopComponent
756		}
757		ctx = templ.ClearChildren(ctx)
758		templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 64, "<ol class=\"files\" aria-label=\"Changed files\">")
759		if templ_7745c5c3_Err != nil {
760			return templ_7745c5c3_Err
761		}
762		for _, f := range files {
763			templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 65, "<li><a href=\"")
764			if templ_7745c5c3_Err != nil {
765				return templ_7745c5c3_Err
766			}
767			var templ_7745c5c3_Var36 templ.SafeURL
768			templ_7745c5c3_Var36, templ_7745c5c3_Err = templ.JoinURLErrs(templ.SafeURL("#" + f.ID))
769			if templ_7745c5c3_Err != nil {
770				return templ.Error{Err: templ_7745c5c3_Err, FileName: `internal/adapters/web/diff.templ`, Line: 144, Col: 37}
771			}
772			_, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(templ.EscapeString(templ_7745c5c3_Var36))
773			if templ_7745c5c3_Err != nil {
774				return templ_7745c5c3_Err
775			}
776			templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 66, "\" :aria-current=\"")
777			if templ_7745c5c3_Err != nil {
778				return templ_7745c5c3_Err
779			}
780			var templ_7745c5c3_Var37 string
781			templ_7745c5c3_Var37, templ_7745c5c3_Err = templ.ResolveAttributeValue("(() => { let all = q('.dfile').arr(); let cur = all.filter(f => f.getBoundingClientRect().top < innerHeight / 3).at(-1) || all[0]; return cur?.id === '" + f.ID + "' ? 'true' : false })()")
782			if templ_7745c5c3_Err != nil {
783				return templ.Error{Err: templ_7745c5c3_Err, FileName: `internal/adapters/web/diff.templ`, Line: 145, Col: 209}
784			}
785			_, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(templ_7745c5c3_Var37)
786			if templ_7745c5c3_Err != nil {
787				return templ_7745c5c3_Err
788			}
789			templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 67, "\" hx-on:click=\"document.getElementById(this.hash.slice(1)).open = true\"><span class=\"st\" title=\"")
790			if templ_7745c5c3_Err != nil {
791				return templ_7745c5c3_Err
792			}
793			var templ_7745c5c3_Var38 string
794			templ_7745c5c3_Var38, templ_7745c5c3_Err = templ.ResolveAttributeValue(f.Status)
795			if templ_7745c5c3_Err != nil {
796				return templ.Error{Err: templ_7745c5c3_Err, FileName: `internal/adapters/web/diff.templ`, Line: 148, Col: 38}
797			}
798			_, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(templ_7745c5c3_Var38)
799			if templ_7745c5c3_Err != nil {
800				return templ_7745c5c3_Err
801			}
802			templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 68, "\">")
803			if templ_7745c5c3_Err != nil {
804				return templ_7745c5c3_Err
805			}
806			var templ_7745c5c3_Var39 string
807			templ_7745c5c3_Var39, templ_7745c5c3_Err = templ.JoinStringErrs(f.Status)
808			if templ_7745c5c3_Err != nil {
809				return templ.Error{Err: templ_7745c5c3_Err, FileName: `internal/adapters/web/diff.templ`, Line: 148, Col: 51}
810			}
811			_, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(templ.EscapeString(templ_7745c5c3_Var39))
812			if templ_7745c5c3_Err != nil {
813				return templ_7745c5c3_Err
814			}
815			templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 69, "</span> <span class=\"p\" title=\"")
816			if templ_7745c5c3_Err != nil {
817				return templ_7745c5c3_Err
818			}
819			var templ_7745c5c3_Var40 string
820			templ_7745c5c3_Var40, templ_7745c5c3_Err = templ.ResolveAttributeValue(f.Path)
821			if templ_7745c5c3_Err != nil {
822				return templ.Error{Err: templ_7745c5c3_Err, FileName: `internal/adapters/web/diff.templ`, Line: 149, Col: 35}
823			}
824			_, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(templ_7745c5c3_Var40)
825			if templ_7745c5c3_Err != nil {
826				return templ_7745c5c3_Err
827			}
828			templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 70, "\">")
829			if templ_7745c5c3_Err != nil {
830				return templ_7745c5c3_Err
831			}
832			var templ_7745c5c3_Var41 string
833			templ_7745c5c3_Var41, templ_7745c5c3_Err = templ.JoinStringErrs(f.Path)
834			if templ_7745c5c3_Err != nil {
835				return templ.Error{Err: templ_7745c5c3_Err, FileName: `internal/adapters/web/diff.templ`, Line: 149, Col: 46}
836			}
837			_, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(templ.EscapeString(templ_7745c5c3_Var41))
838			if templ_7745c5c3_Err != nil {
839				return templ_7745c5c3_Err
840			}
841			templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 71, "</span> <span class=\"n\"><span class=\"plus\">+")
842			if templ_7745c5c3_Err != nil {
843				return templ_7745c5c3_Err
844			}
845			var templ_7745c5c3_Var42 string
846			templ_7745c5c3_Var42, templ_7745c5c3_Err = templ.JoinStringErrs(itoa(f.Add))
847			if templ_7745c5c3_Err != nil {
848				return templ.Error{Err: templ_7745c5c3_Err, FileName: `internal/adapters/web/diff.templ`, Line: 150, Col: 54}
849			}
850			_, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(templ.EscapeString(templ_7745c5c3_Var42))
851			if templ_7745c5c3_Err != nil {
852				return templ_7745c5c3_Err
853			}
854			templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 72, "</span> <span class=\"minus\">-")
855			if templ_7745c5c3_Err != nil {
856				return templ_7745c5c3_Err
857			}
858			var templ_7745c5c3_Var43 string
859			templ_7745c5c3_Var43, templ_7745c5c3_Err = templ.JoinStringErrs(itoa(f.Del))
860			if templ_7745c5c3_Err != nil {
861				return templ.Error{Err: templ_7745c5c3_Err, FileName: `internal/adapters/web/diff.templ`, Line: 150, Col: 98}
862			}
863			_, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(templ.EscapeString(templ_7745c5c3_Var43))
864			if templ_7745c5c3_Err != nil {
865				return templ_7745c5c3_Err
866			}
867			templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 73, "</span></span> <span class=\"b\" aria-hidden=\"true\"><span class=\"plus\">")
868			if templ_7745c5c3_Err != nil {
869				return templ_7745c5c3_Err
870			}
871			var templ_7745c5c3_Var44 string
872			templ_7745c5c3_Var44, templ_7745c5c3_Err = templ.JoinStringErrs(f.Bar.Add)
873			if templ_7745c5c3_Err != nil {
874				return templ.Error{Err: templ_7745c5c3_Err, FileName: `internal/adapters/web/diff.templ`, Line: 151, Col: 70}
875			}
876			_, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(templ.EscapeString(templ_7745c5c3_Var44))
877			if templ_7745c5c3_Err != nil {
878				return templ_7745c5c3_Err
879			}
880			templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 74, "</span><span class=\"minus\">")
881			if templ_7745c5c3_Err != nil {
882				return templ_7745c5c3_Err
883			}
884			var templ_7745c5c3_Var45 string
885			templ_7745c5c3_Var45, templ_7745c5c3_Err = templ.JoinStringErrs(f.Bar.Del)
886			if templ_7745c5c3_Err != nil {
887				return templ.Error{Err: templ_7745c5c3_Err, FileName: `internal/adapters/web/diff.templ`, Line: 151, Col: 110}
888			}
889			_, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(templ.EscapeString(templ_7745c5c3_Var45))
890			if templ_7745c5c3_Err != nil {
891				return templ_7745c5c3_Err
892			}
893			templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 75, "</span>")
894			if templ_7745c5c3_Err != nil {
895				return templ_7745c5c3_Err
896			}
897			var templ_7745c5c3_Var46 string
898			templ_7745c5c3_Var46, templ_7745c5c3_Err = templ.JoinStringErrs(f.Bar.Rest)
899			if templ_7745c5c3_Err != nil {
900				return templ.Error{Err: templ_7745c5c3_Err, FileName: `internal/adapters/web/diff.templ`, Line: 151, Col: 131}
901			}
902			_, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(templ.EscapeString(templ_7745c5c3_Var46))
903			if templ_7745c5c3_Err != nil {
904				return templ_7745c5c3_Err
905			}
906			templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 76, "</span></a></li>")
907			if templ_7745c5c3_Err != nil {
908				return templ_7745c5c3_Err
909			}
910		}
911		templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 77, "</ol>")
912		if templ_7745c5c3_Err != nil {
913			return templ_7745c5c3_Err
914		}
915		return nil
916	})
917}
918
919// DiffFileView is one file of the diff: a <details> (per-file collapse). The
920// unified and the split tables are both in it; #diffs[data-diff] shows one.
921// Every changed line keeps its +/- marker, so a change is never conveyed by
922// colour alone.
923func DiffFileView(f DiffFile, p DiffView) templ.Component {
924	return templruntime.GeneratedTemplate(func(templ_7745c5c3_Input templruntime.GeneratedComponentInput) (templ_7745c5c3_Err error) {
925		templ_7745c5c3_W, ctx := templ_7745c5c3_Input.Writer, templ_7745c5c3_Input.Context
926		if templ_7745c5c3_CtxErr := ctx.Err(); templ_7745c5c3_CtxErr != nil {
927			return templ_7745c5c3_CtxErr
928		}
929		templ_7745c5c3_Buffer, templ_7745c5c3_IsBuffer := templruntime.GetBuffer(templ_7745c5c3_W)
930		if !templ_7745c5c3_IsBuffer {
931			defer func() {
932				templ_7745c5c3_BufErr := templruntime.ReleaseBuffer(templ_7745c5c3_Buffer)
933				if templ_7745c5c3_Err == nil {
934					templ_7745c5c3_Err = templ_7745c5c3_BufErr
935				}
936			}()
937		}
938		ctx = templ.InitializeContext(ctx)
939		templ_7745c5c3_Var47 := templ.GetChildren(ctx)
940		if templ_7745c5c3_Var47 == nil {
941			templ_7745c5c3_Var47 = templ.NopComponent
942		}
943		ctx = templ.ClearChildren(ctx)
944		templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 78, "<details class=\"dfile\" id=\"")
945		if templ_7745c5c3_Err != nil {
946			return templ_7745c5c3_Err
947		}
948		var templ_7745c5c3_Var48 string
949		templ_7745c5c3_Var48, templ_7745c5c3_Err = templ.ResolveAttributeValue(f.ID)
950		if templ_7745c5c3_Err != nil {
951			return templ.Error{Err: templ_7745c5c3_Err, FileName: `internal/adapters/web/diff.templ`, Line: 165, Col: 11}
952		}
953		_, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(templ_7745c5c3_Var48)
954		if templ_7745c5c3_Err != nil {
955			return templ_7745c5c3_Err
956		}
957		templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 79, "\" data-file")
958		if templ_7745c5c3_Err != nil {
959			return templ_7745c5c3_Err
960		}
961		if f.Open {
962			templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 80, " open")
963			if templ_7745c5c3_Err != nil {
964				return templ_7745c5c3_Err
965			}
966		}
967		templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 81, "><summary><span class=\"st\">")
968		if templ_7745c5c3_Err != nil {
969			return templ_7745c5c3_Err
970		}
971		var templ_7745c5c3_Var49 string
972		templ_7745c5c3_Var49, templ_7745c5c3_Err = templ.JoinStringErrs(f.Status)
973		if templ_7745c5c3_Err != nil {
974			return templ.Error{Err: templ_7745c5c3_Err, FileName: `internal/adapters/web/diff.templ`, Line: 172, Col: 30}
975		}
976		_, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(templ.EscapeString(templ_7745c5c3_Var49))
977		if templ_7745c5c3_Err != nil {
978			return templ_7745c5c3_Err
979		}
980		templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 82, "</span>")
981		if templ_7745c5c3_Err != nil {
982			return templ_7745c5c3_Err
983		}
984		var templ_7745c5c3_Var50 string
985		templ_7745c5c3_Var50, templ_7745c5c3_Err = templ.JoinStringErrs(" ")
986		if templ_7745c5c3_Err != nil {
987			return templ.Error{Err: templ_7745c5c3_Err, FileName: `internal/adapters/web/diff.templ`, Line: 172, Col: 44}
988		}
989		_, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(templ.EscapeString(templ_7745c5c3_Var50))
990		if templ_7745c5c3_Err != nil {
991			return templ_7745c5c3_Err
992		}
993		templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 83, "<span class=\"p\">")
994		if templ_7745c5c3_Err != nil {
995			return templ_7745c5c3_Err
996		}
997		var templ_7745c5c3_Var51 string
998		templ_7745c5c3_Var51, templ_7745c5c3_Err = templ.JoinStringErrs(f.Path)
999		if templ_7745c5c3_Err != nil {
1000			return templ.Error{Err: templ_7745c5c3_Err, FileName: `internal/adapters/web/diff.templ`, Line: 172, Col: 70}
1001		}
1002		_, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(templ.EscapeString(templ_7745c5c3_Var51))
1003		if templ_7745c5c3_Err != nil {
1004			return templ_7745c5c3_Err
1005		}
1006		templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 84, "</span>")
1007		if templ_7745c5c3_Err != nil {
1008			return templ_7745c5c3_Err
1009		}
1010		var templ_7745c5c3_Var52 string
1011		templ_7745c5c3_Var52, templ_7745c5c3_Err = templ.JoinStringErrs(" ")
1012		if templ_7745c5c3_Err != nil {
1013			return templ.Error{Err: templ_7745c5c3_Err, FileName: `internal/adapters/web/diff.templ`, Line: 172, Col: 84}
1014		}
1015		_, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(templ.EscapeString(templ_7745c5c3_Var52))
1016		if templ_7745c5c3_Err != nil {
1017			return templ_7745c5c3_Err
1018		}
1019		templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 85, "<span class=\"plus\">+")
1020		if templ_7745c5c3_Err != nil {
1021			return templ_7745c5c3_Err
1022		}
1023		var templ_7745c5c3_Var53 string
1024		templ_7745c5c3_Var53, templ_7745c5c3_Err = templ.JoinStringErrs(itoa(f.Add))
1025		if templ_7745c5c3_Err != nil {
1026			return templ.Error{Err: templ_7745c5c3_Err, FileName: `internal/adapters/web/diff.templ`, Line: 172, Col: 119}
1027		}
1028		_, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(templ.EscapeString(templ_7745c5c3_Var53))
1029		if templ_7745c5c3_Err != nil {
1030			return templ_7745c5c3_Err
1031		}
1032		templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 86, "</span>")
1033		if templ_7745c5c3_Err != nil {
1034			return templ_7745c5c3_Err
1035		}
1036		var templ_7745c5c3_Var54 string
1037		templ_7745c5c3_Var54, templ_7745c5c3_Err = templ.JoinStringErrs(" ")
1038		if templ_7745c5c3_Err != nil {
1039			return templ.Error{Err: templ_7745c5c3_Err, FileName: `internal/adapters/web/diff.templ`, Line: 172, Col: 133}
1040		}
1041		_, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(templ.EscapeString(templ_7745c5c3_Var54))
1042		if templ_7745c5c3_Err != nil {
1043			return templ_7745c5c3_Err
1044		}
1045		templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 87, "<span class=\"minus\">-")
1046		if templ_7745c5c3_Err != nil {
1047			return templ_7745c5c3_Err
1048		}
1049		var templ_7745c5c3_Var55 string
1050		templ_7745c5c3_Var55, templ_7745c5c3_Err = templ.JoinStringErrs(itoa(f.Del))
1051		if templ_7745c5c3_Err != nil {
1052			return templ.Error{Err: templ_7745c5c3_Err, FileName: `internal/adapters/web/diff.templ`, Line: 172, Col: 169}
1053		}
1054		_, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(templ.EscapeString(templ_7745c5c3_Var55))
1055		if templ_7745c5c3_Err != nil {
1056			return templ_7745c5c3_Err
1057		}
1058		templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 88, "</span> ")
1059		if templ_7745c5c3_Err != nil {
1060			return templ_7745c5c3_Err
1061		}
1062		if f.Note != "" {
1063			var templ_7745c5c3_Var56 string
1064			templ_7745c5c3_Var56, templ_7745c5c3_Err = templ.JoinStringErrs(" ")
1065			if templ_7745c5c3_Err != nil {
1066				return templ.Error{Err: templ_7745c5c3_Err, FileName: `internal/adapters/web/diff.templ`, Line: 174, Col: 9}
1067			}
1068			_, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(templ.EscapeString(templ_7745c5c3_Var56))
1069			if templ_7745c5c3_Err != nil {
1070				return templ_7745c5c3_Err
1071			}
1072			templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 89, "<span class=\"note\">")
1073			if templ_7745c5c3_Err != nil {
1074				return templ_7745c5c3_Err
1075			}
1076			var templ_7745c5c3_Var57 string
1077			templ_7745c5c3_Var57, templ_7745c5c3_Err = templ.JoinStringErrs(f.Note)
1078			if templ_7745c5c3_Err != nil {
1079				return templ.Error{Err: templ_7745c5c3_Err, FileName: `internal/adapters/web/diff.templ`, Line: 174, Col: 38}
1080			}
1081			_, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(templ.EscapeString(templ_7745c5c3_Var57))
1082			if templ_7745c5c3_Err != nil {
1083				return templ_7745c5c3_Err
1084			}
1085			templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 90, "</span>")
1086			if templ_7745c5c3_Err != nil {
1087				return templ_7745c5c3_Err
1088			}
1089		}
1090		templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 91, "</summary> ")
1091		if templ_7745c5c3_Err != nil {
1092			return templ_7745c5c3_Err
1093		}
1094		if len(f.Hunks) > 0 {
1095			templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 92, "<div class=\"dscroll\">")
1096			if templ_7745c5c3_Err != nil {
1097				return templ_7745c5c3_Err
1098			}
1099			if p.ShowUnified {
1100				templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 93, "<table class=\"dt uni\" aria-label=\"")
1101				if templ_7745c5c3_Err != nil {
1102					return templ_7745c5c3_Err
1103				}
1104				var templ_7745c5c3_Var58 string
1105				templ_7745c5c3_Var58, templ_7745c5c3_Err = templ.ResolveAttributeValue(f.Path + ", unified")
1106				if templ_7745c5c3_Err != nil {
1107					return templ.Error{Err: templ_7745c5c3_Err, FileName: `internal/adapters/web/diff.templ`, Line: 180, Col: 60}
1108				}
1109				_, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(templ_7745c5c3_Var58)
1110				if templ_7745c5c3_Err != nil {
1111					return templ_7745c5c3_Err
1112				}
1113				templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 94, "\">")
1114				if templ_7745c5c3_Err != nil {
1115					return templ_7745c5c3_Err
1116				}
1117				for _, h := range f.Hunks {
1118					templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 95, "<tbody><tr class=\"hunk\"><td colspan=\"4\">")
1119					if templ_7745c5c3_Err != nil {
1120						return templ_7745c5c3_Err
1121					}
1122					var templ_7745c5c3_Var59 string
1123					templ_7745c5c3_Var59, templ_7745c5c3_Err = templ.JoinStringErrs(h.Header)
1124					if templ_7745c5c3_Err != nil {
1125						return templ.Error{Err: templ_7745c5c3_Err, FileName: `internal/adapters/web/diff.templ`, Line: 183, Col: 51}
1126					}
1127					_, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(templ.EscapeString(templ_7745c5c3_Var59))
1128					if templ_7745c5c3_Err != nil {
1129						return templ_7745c5c3_Err
1130					}
1131					templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 96, "</td></tr>")
1132					if templ_7745c5c3_Err != nil {
1133						return templ_7745c5c3_Err
1134					}
1135					for _, ln := range h.Lines {
1136						var templ_7745c5c3_Var60 = []any{ln.Kind}
1137						templ_7745c5c3_Err = templ.RenderCSSItems(ctx, templ_7745c5c3_Buffer, templ_7745c5c3_Var60...)
1138						if templ_7745c5c3_Err != nil {
1139							return templ_7745c5c3_Err
1140						}
1141						templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 97, "<tr class=\"")
1142						if templ_7745c5c3_Err != nil {
1143							return templ_7745c5c3_Err
1144						}
1145						var templ_7745c5c3_Var61 string
1146						templ_7745c5c3_Var61, templ_7745c5c3_Err = templ.ResolveAttributeValue(templ.CSSClasses(templ_7745c5c3_Var60).String())
1147						if templ_7745c5c3_Err != nil {
1148							return templ.Error{Err: templ_7745c5c3_Err, FileName: `internal/adapters/web/diff.templ`, Line: 1, Col: 0}
1149						}
1150						_, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(templ_7745c5c3_Var61)
1151						if templ_7745c5c3_Err != nil {
1152							return templ_7745c5c3_Err
1153						}
1154						templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 98, "\"><td class=\"ln\">")
1155						if templ_7745c5c3_Err != nil {
1156							return templ_7745c5c3_Err
1157						}
1158						templ_7745c5c3_Err = gutter(ln.Old, ln.OldHref).Render(ctx, templ_7745c5c3_Buffer)
1159						if templ_7745c5c3_Err != nil {
1160							return templ_7745c5c3_Err
1161						}
1162						templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 99, "</td><td class=\"ln\">")
1163						if templ_7745c5c3_Err != nil {
1164							return templ_7745c5c3_Err
1165						}
1166						templ_7745c5c3_Err = gutter(ln.New, ln.NewHref).Render(ctx, templ_7745c5c3_Buffer)
1167						if templ_7745c5c3_Err != nil {
1168							return templ_7745c5c3_Err
1169						}
1170						templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 100, "</td><td class=\"m\">")
1171						if templ_7745c5c3_Err != nil {
1172							return templ_7745c5c3_Err
1173						}
1174						var templ_7745c5c3_Var62 string
1175						templ_7745c5c3_Var62, templ_7745c5c3_Err = templ.JoinStringErrs(ln.Mark)
1176						if templ_7745c5c3_Err != nil {
1177							return templ.Error{Err: templ_7745c5c3_Err, FileName: `internal/adapters/web/diff.templ`, Line: 188, Col: 33}
1178						}
1179						_, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(templ.EscapeString(templ_7745c5c3_Var62))
1180						if templ_7745c5c3_Err != nil {
1181							return templ_7745c5c3_Err
1182						}
1183						templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 101, "</td><td class=\"tx\">")
1184						if templ_7745c5c3_Err != nil {
1185							return templ_7745c5c3_Err
1186						}
1187						templ_7745c5c3_Err = codeLine(ln).Render(ctx, templ_7745c5c3_Buffer)
1188						if templ_7745c5c3_Err != nil {
1189							return templ_7745c5c3_Err
1190						}
1191						templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 102, "</td></tr>")
1192						if templ_7745c5c3_Err != nil {
1193							return templ_7745c5c3_Err
1194						}
1195						if len(ln.Notes) > 0 || ln.Form != nil {
1196							templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 103, "<tr class=\"fnote\"><td colspan=\"3\"></td><td>")
1197							if templ_7745c5c3_Err != nil {
1198								return templ_7745c5c3_Err
1199							}
1200							templ_7745c5c3_Err = lineNotes(ln.Notes, ln.Form, "").Render(ctx, templ_7745c5c3_Buffer)
1201							if templ_7745c5c3_Err != nil {
1202								return templ_7745c5c3_Err
1203							}
1204							templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 104, "</td></tr>")
1205							if templ_7745c5c3_Err != nil {
1206								return templ_7745c5c3_Err
1207							}
1208						}
1209					}
1210					templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 105, "</tbody>")
1211					if templ_7745c5c3_Err != nil {
1212						return templ_7745c5c3_Err
1213					}
1214				}
1215				templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 106, "</table>")
1216				if templ_7745c5c3_Err != nil {
1217					return templ_7745c5c3_Err
1218				}
1219			}
1220			if p.ShowSplit {
1221				templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 107, "<table class=\"dt spl\" aria-label=\"")
1222				if templ_7745c5c3_Err != nil {
1223					return templ_7745c5c3_Err
1224				}
1225				var templ_7745c5c3_Var63 string
1226				templ_7745c5c3_Var63, templ_7745c5c3_Err = templ.ResolveAttributeValue(f.Path + ", split")
1227				if templ_7745c5c3_Err != nil {
1228					return templ.Error{Err: templ_7745c5c3_Err, FileName: `internal/adapters/web/diff.templ`, Line: 203, Col: 58}
1229				}
1230				_, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(templ_7745c5c3_Var63)
1231				if templ_7745c5c3_Err != nil {
1232					return templ_7745c5c3_Err
1233				}
1234				templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 108, "\"><colgroup><col class=\"c-ln\"><col class=\"c-m\"><col><col class=\"c-ln\"><col class=\"c-m\"><col></colgroup> ")
1235				if templ_7745c5c3_Err != nil {
1236					return templ_7745c5c3_Err
1237				}
1238				for _, h := range f.Hunks {
1239					templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 109, "<tbody><tr class=\"hunk\"><td colspan=\"6\">")
1240					if templ_7745c5c3_Err != nil {
1241						return templ_7745c5c3_Err
1242					}
1243					var templ_7745c5c3_Var64 string
1244					templ_7745c5c3_Var64, templ_7745c5c3_Err = templ.JoinStringErrs(h.Header)
1245					if templ_7745c5c3_Err != nil {
1246						return templ.Error{Err: templ_7745c5c3_Err, FileName: `internal/adapters/web/diff.templ`, Line: 207, Col: 51}
1247					}
1248					_, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(templ.EscapeString(templ_7745c5c3_Var64))
1249					if templ_7745c5c3_Err != nil {
1250						return templ_7745c5c3_Err
1251					}
1252					templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 110, "</td></tr>")
1253					if templ_7745c5c3_Err != nil {
1254						return templ_7745c5c3_Err
1255					}
1256					for _, row := range h.Split {
1257						templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 111, "<tr>")
1258						if templ_7745c5c3_Err != nil {
1259							return templ_7745c5c3_Err
1260						}
1261						templ_7745c5c3_Err = splitSide(row.L, true).Render(ctx, templ_7745c5c3_Buffer)
1262						if templ_7745c5c3_Err != nil {
1263							return templ_7745c5c3_Err
1264						}
1265						templ_7745c5c3_Err = splitSide(row.R, false).Render(ctx, templ_7745c5c3_Buffer)
1266						if templ_7745c5c3_Err != nil {
1267							return templ_7745c5c3_Err
1268						}
1269						templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 112, "</tr>")
1270						if templ_7745c5c3_Err != nil {
1271							return templ_7745c5c3_Err
1272						}
1273						if notes, form := row.Notes(), row.Form(); len(notes) > 0 || form != nil {
1274							templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 113, "<tr class=\"fnote\"><td colspan=\"6\">")
1275							if templ_7745c5c3_Err != nil {
1276								return templ_7745c5c3_Err
1277							}
1278							templ_7745c5c3_Err = lineNotes(notes, form, "-s").Render(ctx, templ_7745c5c3_Buffer)
1279							if templ_7745c5c3_Err != nil {
1280								return templ_7745c5c3_Err
1281							}
1282							templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 114, "</td></tr>")
1283							if templ_7745c5c3_Err != nil {
1284								return templ_7745c5c3_Err
1285							}
1286						}
1287					}
1288					templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 115, "</tbody>")
1289					if templ_7745c5c3_Err != nil {
1290						return templ_7745c5c3_Err
1291					}
1292				}
1293				templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 116, "</table>")
1294				if templ_7745c5c3_Err != nil {
1295					return templ_7745c5c3_Err
1296				}
1297			}
1298			templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 117, "</div>")
1299			if templ_7745c5c3_Err != nil {
1300				return templ_7745c5c3_Err
1301			}
1302		} else {
1303			templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 118, "<p class=\"note pad\">")
1304			if templ_7745c5c3_Err != nil {
1305				return templ_7745c5c3_Err
1306			}
1307			if f.Note != "" {
1308				var templ_7745c5c3_Var65 string
1309				templ_7745c5c3_Var65, templ_7745c5c3_Err = templ.JoinStringErrs(f.Note)
1310				if templ_7745c5c3_Err != nil {
1311					return templ.Error{Err: templ_7745c5c3_Err, FileName: `internal/adapters/web/diff.templ`, Line: 227, Col: 13}
1312				}
1313				_, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(templ.EscapeString(templ_7745c5c3_Var65))
1314				if templ_7745c5c3_Err != nil {
1315					return templ_7745c5c3_Err
1316				}
1317			} else {
1318				templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 119, "no textual change.")
1319				if templ_7745c5c3_Err != nil {
1320					return templ_7745c5c3_Err
1321				}
1322			}
1323			templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 120, "</p>")
1324			if templ_7745c5c3_Err != nil {
1325				return templ_7745c5c3_Err
1326			}
1327		}
1328		templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 121, "</details>")
1329		if templ_7745c5c3_Err != nil {
1330			return templ_7745c5c3_Err
1331		}
1332		return nil
1333	})
1334}
1335
1336// splitSide is one half of a row of the split view; a side without a line is
1337// an empty cell.
1338func splitSide(ln *DiffLine, old bool) templ.Component {
1339	return templruntime.GeneratedTemplate(func(templ_7745c5c3_Input templruntime.GeneratedComponentInput) (templ_7745c5c3_Err error) {
1340		templ_7745c5c3_W, ctx := templ_7745c5c3_Input.Writer, templ_7745c5c3_Input.Context
1341		if templ_7745c5c3_CtxErr := ctx.Err(); templ_7745c5c3_CtxErr != nil {
1342			return templ_7745c5c3_CtxErr
1343		}
1344		templ_7745c5c3_Buffer, templ_7745c5c3_IsBuffer := templruntime.GetBuffer(templ_7745c5c3_W)
1345		if !templ_7745c5c3_IsBuffer {
1346			defer func() {
1347				templ_7745c5c3_BufErr := templruntime.ReleaseBuffer(templ_7745c5c3_Buffer)
1348				if templ_7745c5c3_Err == nil {
1349					templ_7745c5c3_Err = templ_7745c5c3_BufErr
1350				}
1351			}()
1352		}
1353		ctx = templ.InitializeContext(ctx)
1354		templ_7745c5c3_Var66 := templ.GetChildren(ctx)
1355		if templ_7745c5c3_Var66 == nil {
1356			templ_7745c5c3_Var66 = templ.NopComponent
1357		}
1358		ctx = templ.ClearChildren(ctx)
1359		if ln == nil {
1360			templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 122, "<td class=\"ln none\"></td><td class=\"m none\"></td><td class=\"tx none\"></td>")
1361			if templ_7745c5c3_Err != nil {
1362				return templ_7745c5c3_Err
1363			}
1364		} else {
1365			var templ_7745c5c3_Var67 = []any{"ln", ln.Kind}
1366			templ_7745c5c3_Err = templ.RenderCSSItems(ctx, templ_7745c5c3_Buffer, templ_7745c5c3_Var67...)
1367			if templ_7745c5c3_Err != nil {
1368				return templ_7745c5c3_Err
1369			}
1370			templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 123, "<td class=\"")
1371			if templ_7745c5c3_Err != nil {
1372				return templ_7745c5c3_Err
1373			}
1374			var templ_7745c5c3_Var68 string
1375			templ_7745c5c3_Var68, templ_7745c5c3_Err = templ.ResolveAttributeValue(templ.CSSClasses(templ_7745c5c3_Var67).String())
1376			if templ_7745c5c3_Err != nil {
1377				return templ.Error{Err: templ_7745c5c3_Err, FileName: `internal/adapters/web/diff.templ`, Line: 1, Col: 0}
1378			}
1379			_, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(templ_7745c5c3_Var68)
1380			if templ_7745c5c3_Err != nil {
1381				return templ_7745c5c3_Err
1382			}
1383			templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 124, "\">")
1384			if templ_7745c5c3_Err != nil {
1385				return templ_7745c5c3_Err
1386			}
1387			if old {
1388				templ_7745c5c3_Err = gutter(ln.Old, ln.OldHref).Render(ctx, templ_7745c5c3_Buffer)
1389				if templ_7745c5c3_Err != nil {
1390					return templ_7745c5c3_Err
1391				}
1392			} else {
1393				templ_7745c5c3_Err = gutter(ln.New, ln.NewHref).Render(ctx, templ_7745c5c3_Buffer)
1394				if templ_7745c5c3_Err != nil {
1395					return templ_7745c5c3_Err
1396				}
1397			}
1398			templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 125, "</td>")
1399			if templ_7745c5c3_Err != nil {
1400				return templ_7745c5c3_Err
1401			}
1402			var templ_7745c5c3_Var69 = []any{"m", ln.Kind}
1403			templ_7745c5c3_Err = templ.RenderCSSItems(ctx, templ_7745c5c3_Buffer, templ_7745c5c3_Var69...)
1404			if templ_7745c5c3_Err != nil {
1405				return templ_7745c5c3_Err
1406			}
1407			templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 126, "<td class=\"")
1408			if templ_7745c5c3_Err != nil {
1409				return templ_7745c5c3_Err
1410			}
1411			var templ_7745c5c3_Var70 string
1412			templ_7745c5c3_Var70, templ_7745c5c3_Err = templ.ResolveAttributeValue(templ.CSSClasses(templ_7745c5c3_Var69).String())
1413			if templ_7745c5c3_Err != nil {
1414				return templ.Error{Err: templ_7745c5c3_Err, FileName: `internal/adapters/web/diff.templ`, Line: 1, Col: 0}
1415			}
1416			_, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(templ_7745c5c3_Var70)
1417			if templ_7745c5c3_Err != nil {
1418				return templ_7745c5c3_Err
1419			}
1420			templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 127, "\">")
1421			if templ_7745c5c3_Err != nil {
1422				return templ_7745c5c3_Err
1423			}
1424			var templ_7745c5c3_Var71 string
1425			templ_7745c5c3_Var71, templ_7745c5c3_Err = templ.JoinStringErrs(ln.Mark)
1426			if templ_7745c5c3_Err != nil {
1427				return templ.Error{Err: templ_7745c5c3_Err, FileName: `internal/adapters/web/diff.templ`, Line: 251, Col: 38}
1428			}
1429			_, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(templ.EscapeString(templ_7745c5c3_Var71))
1430			if templ_7745c5c3_Err != nil {
1431				return templ_7745c5c3_Err
1432			}
1433			templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 128, "</td>")
1434			if templ_7745c5c3_Err != nil {
1435				return templ_7745c5c3_Err
1436			}
1437			var templ_7745c5c3_Var72 = []any{"tx", ln.Kind}
1438			templ_7745c5c3_Err = templ.RenderCSSItems(ctx, templ_7745c5c3_Buffer, templ_7745c5c3_Var72...)
1439			if templ_7745c5c3_Err != nil {
1440				return templ_7745c5c3_Err
1441			}
1442			templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 129, "<td class=\"")
1443			if templ_7745c5c3_Err != nil {
1444				return templ_7745c5c3_Err
1445			}
1446			var templ_7745c5c3_Var73 string
1447			templ_7745c5c3_Var73, templ_7745c5c3_Err = templ.ResolveAttributeValue(templ.CSSClasses(templ_7745c5c3_Var72).String())
1448			if templ_7745c5c3_Err != nil {
1449				return templ.Error{Err: templ_7745c5c3_Err, FileName: `internal/adapters/web/diff.templ`, Line: 1, Col: 0}
1450			}
1451			_, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(templ_7745c5c3_Var73)
1452			if templ_7745c5c3_Err != nil {
1453				return templ_7745c5c3_Err
1454			}
1455			templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 130, "\">")
1456			if templ_7745c5c3_Err != nil {
1457				return templ_7745c5c3_Err
1458			}
1459			templ_7745c5c3_Err = codeLine(*ln).Render(ctx, templ_7745c5c3_Buffer)
1460			if templ_7745c5c3_Err != nil {
1461				return templ_7745c5c3_Err
1462			}
1463			templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 131, "</td>")
1464			if templ_7745c5c3_Err != nil {
1465				return templ_7745c5c3_Err
1466			}
1467		}
1468		return nil
1469	})
1470}
1471
1472// gutter is a line number of the gutter. On a merge request that can be
1473// commented on, it links to the form that comments on that line.
1474func gutter(n, href string) templ.Component {
1475	return templruntime.GeneratedTemplate(func(templ_7745c5c3_Input templruntime.GeneratedComponentInput) (templ_7745c5c3_Err error) {
1476		templ_7745c5c3_W, ctx := templ_7745c5c3_Input.Writer, templ_7745c5c3_Input.Context
1477		if templ_7745c5c3_CtxErr := ctx.Err(); templ_7745c5c3_CtxErr != nil {
1478			return templ_7745c5c3_CtxErr
1479		}
1480		templ_7745c5c3_Buffer, templ_7745c5c3_IsBuffer := templruntime.GetBuffer(templ_7745c5c3_W)
1481		if !templ_7745c5c3_IsBuffer {
1482			defer func() {
1483				templ_7745c5c3_BufErr := templruntime.ReleaseBuffer(templ_7745c5c3_Buffer)
1484				if templ_7745c5c3_Err == nil {
1485					templ_7745c5c3_Err = templ_7745c5c3_BufErr
1486				}
1487			}()
1488		}
1489		ctx = templ.InitializeContext(ctx)
1490		templ_7745c5c3_Var74 := templ.GetChildren(ctx)
1491		if templ_7745c5c3_Var74 == nil {
1492			templ_7745c5c3_Var74 = templ.NopComponent
1493		}
1494		ctx = templ.ClearChildren(ctx)
1495		if href != "" {
1496			templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 132, "<a href=\"")
1497			if templ_7745c5c3_Err != nil {
1498				return templ_7745c5c3_Err
1499			}
1500			var templ_7745c5c3_Var75 templ.SafeURL
1501			templ_7745c5c3_Var75, templ_7745c5c3_Err = templ.JoinURLErrs(templ.SafeURL(href))
1502			if templ_7745c5c3_Err != nil {
1503				return templ.Error{Err: templ_7745c5c3_Err, FileName: `internal/adapters/web/diff.templ`, Line: 260, Col: 31}
1504			}
1505			_, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(templ.EscapeString(templ_7745c5c3_Var75))
1506			if templ_7745c5c3_Err != nil {
1507				return templ_7745c5c3_Err
1508			}
1509			templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 133, "\" title=\"comment on this line\">")
1510			if templ_7745c5c3_Err != nil {
1511				return templ_7745c5c3_Err
1512			}
1513			var templ_7745c5c3_Var76 string
1514			templ_7745c5c3_Var76, templ_7745c5c3_Err = templ.JoinStringErrs(n)
1515			if templ_7745c5c3_Err != nil {
1516				return templ.Error{Err: templ_7745c5c3_Err, FileName: `internal/adapters/web/diff.templ`, Line: 260, Col: 66}
1517			}
1518			_, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(templ.EscapeString(templ_7745c5c3_Var76))
1519			if templ_7745c5c3_Err != nil {
1520				return templ_7745c5c3_Err
1521			}
1522			templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 134, "</a>")
1523			if templ_7745c5c3_Err != nil {
1524				return templ_7745c5c3_Err
1525			}
1526		} else {
1527			var templ_7745c5c3_Var77 string
1528			templ_7745c5c3_Var77, templ_7745c5c3_Err = templ.JoinStringErrs(n)
1529			if templ_7745c5c3_Err != nil {
1530				return templ.Error{Err: templ_7745c5c3_Err, FileName: `internal/adapters/web/diff.templ`, Line: 262, Col: 5}
1531			}
1532			_, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(templ.EscapeString(templ_7745c5c3_Var77))
1533			if templ_7745c5c3_Err != nil {
1534				return templ_7745c5c3_Err
1535			}
1536		}
1537		return nil
1538	})
1539}
1540
1541var _ = 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