v0.1.0 3f267b5

components.templ RawHistoryFolder

1// SPDX-License-Identifier: AGPL-3.0-or-later
2
3package web
4
5// Facts is a key/value block on an 11ch key column.
6templ Facts(facts []Fact) {
7	<dl class="kv">
8		for _, f := range facts {
9			<dt>{ f.Key }</dt>
10			@FactValue(f)
11		}
12	</dl>
13}
14
15// CloneBlock is a block of copyable shell lines; each has its own [copy]
16// button, whose label says "copied" for 1.5 s.
17templ CloneBlock(c Clone) {
18	<div class="clone" id={ c.ID }>
19		for _, line := range c.Lines {
20			<div class="clone-line">
21				<span class="mute" aria-hidden="true">$ </span><code>{ line }</code>
22				<button
23					type="button"
24					class="copy"
25					data-label="[copy]"
26					aria-label={ "copy: " + line }
27					hx-on:click="navigator.clipboard?.writeText(closest('.clone-line').querySelector('code').textContent); this.textContent = '[copied]'; await timeout('1500ms'); this.textContent = this.dataset.label"
28				>[copy]</button>
29			</div>
30		}
31	</div>
32}
33
34// HomeRow is one row of the home list. Its id is the target of SSE swaps.
35templ HomeRowView(r HomeRow) {
36	<tr id={ r.ID } data-cursor?={ r.Cursor }>
37		<td class="cur" aria-hidden="true"></td>
38		<td class="c-name">
39			<a href={ templ.SafeURL(r.Href) }>{ r.Name }</a>
40			if r.Fresh {
41				<span class="tagged">● new push</span>
42			}
43		</td>
44		<td class="c-desc dim">{ r.Desc }</td>
45		<td class="c-when nowrap">
46			<time
47				if r.PushedAt != "" {
48					datetime={ r.PushedAt }
49				}
50			>{ r.Pushed }</time>
51		</td>
52		<td class="c-ref">{ r.Branch }</td>
53	</tr>
54}
55
56// Outline is the README outline; levels indent by 2ch, the h1 is bold.
57templ Outline(headings []Heading) {
58	<nav class="outline" aria-label="Outline">
59		for _, h := range headings {
60			<a class={ "l" + itoa(h.Level) } href={ templ.SafeURL("#" + h.ID) }>{ h.Text }</a>
61		}
62	</nav>
63}
64
65// ReadmeView is a rendered README. Its HTML comes from the Markdown
66// renderer, which drops raw HTML and filters URLs.
67templ ReadmeView(r Readme) {
68	<article class="prose" aria-label={ r.Name }>
69		if r.Note != "" {
70			<p class="dim">{ r.Note }</p>
71		} else {
72			@templ.Raw(r.HTML)
73		}
74	</article>
75}
76
77// CommitRows is a cursor table of commits: sha, subject with inline refs,
78// author, relative date (absolute in the title).
79templ CommitRows(rows []CommitRow) {
80	<table class="list commits" aria-label="Commits">
81		<tbody data-rows>
82			for _, c := range rows {
83				<tr
84					if c.ID != "" {
85						id={ c.ID }
86					}
87					data-cursor?={ c.Cursor }
88				>
89					<td class="cur" aria-hidden="true"></td>
90					<td class="c-sha mute">{ c.Short }</td>
91					<td class="c-subject">
92						<a href={ templ.SafeURL(c.CHref) }>{ c.Subject }</a>
93						if c.Merge {
94							<span class="tagged">(merge)</span>
95						}
96						for _, b := range c.Branches {
97							<span class="tagged">[{ b }]</span>
98						}
99						for _, t := range c.Tags {
100							<span class="tagged">[tag: { t }]</span>
101						}
102					</td>
103					<td class="c-who dim">{ c.Author }</td>
104					<td class="c-when nowrap dim"><time datetime={ c.WhenAt } title={ c.WhenAt }>{ c.When }</time></td>
105				</tr>
106			}
107		</tbody>
108	</table>
109}

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