Sign in

Search issue titles and bodies, change requests and comments. Private repositories you cannot read are not included.

vole
Clone

Read only, no credentials:

https://rodent.software/git/vole.git

Write over SSH with a registered key:

git clone ssh://git@0.0.0.0:2222/vole.git

A free and open-source forge that lives in your Git repo.

Add repository search, list pagination, and theme/a11y polish

5cab7b18548e5263c01549cb61415fd7777d1758 · Keenan Nemetz · 15d ago · parent 0b26547e

Add repository search, list pagination, and theme/a11y polish

The chrome and the index page search repository names and descriptions after the same read filter, so a private repository cannot appear. Issues and changes paginate at 25 rows with filters and HTMX navigation preserved.

Polish from the UI plan: a light token block follows prefers-color-scheme, a skip link and focus-visible outlines help keyboard users, panels scroll horizontally on narrow screens, and the empty index/search states explain what is visible. Also fixes a flaky key assertion in the admin users test.

server/web/templates/layout.html +6−2

@@ -4,7 +4,7 @@
4 4 <meta charset="utf-8">
5 5 <meta name="viewport" content="width=device-width,initial-scale=1">
6 6 <meta name="csrf" content="{{.CSRF}}">
7 <meta name="color-scheme" content="dark">
7 <meta name="color-scheme" content="dark light">
8 8 <title>{{.Title}} · Vole</title>
9 9 <link rel="icon" href="/static/favicon.svg" type="image/svg+xml">
10 10 <link rel="stylesheet" href="/static/vole.css">
@@ -20,6 +20,9 @@
20 20 <a href="/runners">{{icon "server"}}Runners</a>
21 21 {{if .InstanceAdmin}}<a href="/admin">{{icon "sliders-horizontal"}}Admin</a>{{end}}
22 22 </nav>
23 <form class="topsearch" method="get" action="/" role="search">
24 <input type="search" name="q" value="{{.Query}}" placeholder="Search repositories" aria-label="Search repositories">
25 </form>
23 26 <div class="topright">
24 27 {{if .LoggedIn}}
25 28 <a class="account" href="/account">{{icon "user"}}{{.User}}</a>
@@ -28,7 +31,8 @@
28 31 {{else}}{{if .DevLogin}}<a href="/dev/login">Dev login</a> · {{end}}<a href="/login">Log in</a>{{end}}
29 32 </div>
30 33 </header>
31 <main class="page">
34 <a class="skip-link" href="#main">Skip to content</a>
35 <main class="page" id="main">
32 36 {{if .Error}}<div class="flash bad">{{.Error}}</div>{{end}}
33 37 {{end}}
34 38