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.
Show people as portraits in the lists and the bar
0fbeca853d0174030973a4019bd54071cafa77dd · Keenan Nemetz · 7d ago · parent aceaabbf
Show people as portraits in the lists and the bar The account menu now carries the signed-in account's mark instead of a generic user icon, and the issue and change tables show the person rather than the name: the author is one portrait, and an issue's assignees are the portraits beside it. The issue's assignee labels moved out of the title cell, so a row is title plus people. A table cell is the one place where the portrait is not decoration — there is no printed name beside it — so those calls use avatarOnly: it keeps the profile link and the aria-label, and does not hide itself from a screen reader the way an avatar beside a name does. The contributor list already used the shared avatar template, so it picked up the new marks with the rest; checked in a browser rather than assumed.
server/web/templates/chrome.html +2−2
| @@ -45,7 +45,7 @@ | |||
| 45 | 45 | {{if .LoggedIn}} | |
| 46 | 46 | <details class="account-menu"> | |
| 47 | 47 | <summary> | |
| 48 | {{icon "user"}}<span class="account-name">{{.User}}</span> | ||
| 48 | {{template "avatar" (avatar .User)}}<span class="account-name">{{.User}}</span> | ||
| 49 | 49 | {{if .DevLogin}}<span class="label" title="Development sign-in">dev</span>{{end}} | |
| 50 | 50 | <span class="account-caret">{{icon "chevron-right"}}</span> | |
| 51 | 51 | </summary> | |
| @@ -177,7 +177,7 @@ | |||
| 177 | 177 | that leads to a 404. Use `who` instead where a link would be wrong: inside | |
| 178 | 178 | another link, inside a button, in an <option>, or in an attribute. */}} | |
| 179 | 179 | {{define "userlink"}}{{if .Known}}<a class="user" href="{{.Href}}">{{.Name}}</a>{{else}}{{.Name}}{{end}}{{end}} | |
| 180 | {{define "avatar"}}{{if .Href}}<a class="avatar c{{.Tone}}" href="{{.Href}}" tabindex="-1" aria-hidden="true" data-avatar="{{.Name}}">{{.Initial}}</a>{{else}}<span class="avatar c{{.Tone}}" aria-hidden="true" data-avatar="{{.Name}}">{{.Initial}}</span>{{end}}{{end}} | ||
| 180 | {{define "avatar"}}{{if .Href}}<a class="avatar c{{.Tone}}" href="{{.Href}}" data-avatar="{{.Name}}"{{if .Label}} aria-label="{{.Label}}"{{else}} tabindex="-1" aria-hidden="true"{{end}}>{{.Initial}}</a>{{else}}<span class="avatar c{{.Tone}}" data-avatar="{{.Name}}"{{if .Label}} role="img" aria-label="{{.Label}}"{{else}} aria-hidden="true"{{end}}>{{.Initial}}</span>{{end}}{{end}} | ||
| 181 | 181 | ||
| 182 | 182 | {{/* The command palette's initial state and the rows HTMX swaps in. The dialog | |
| 183 | 183 | shell above carries both, so they live beside the chrome that owns them. */}} | |