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.
Split repository settings into tabs
e189a23e457b6aa01a35a4586586713cdc2d426d · Keenan Nemetz · 23h ago · parent 87ebcc5a
Split repository settings into tabs One page held four audiences and ten forms. Each part is now its own tab: General for the repository's own fields, Access for the instance-admin rules, Secrets for the values jobs read, and Danger for rename and delete. A tab is offered only to the accounts that may use it, and a viewer with one tab gets no row at all. The Access and Secrets tabs, and the failures on each, keep their own URLs so a redirect and an error land where the form was; the Access and Secrets fragments survive as deep links.
server/web/static/vole.css +5−1
| @@ -624,6 +624,11 @@ img { max-width: 100%; } | |||
| 624 | 624 | .tabs .chip-count { margin-left: 0; } | |
| 625 | 625 | .tabs a.active .chip-count { color: var(--fg-muted); } | |
| 626 | 626 | ||
| 627 | /* A tab row that sits under a page head rather than inside the repository | ||
| 628 | header: Admin and a repository's Settings. The rule belongs to the row, so | ||
| 629 | the head above it has none. */ | ||
| 630 | .page-tabs { margin-bottom: 14px; border-bottom: 1px solid var(--border); } | ||
| 631 | |||
| 627 | 632 | /* A count that moved while the reader was looking elsewhere keeps one short | |
| 628 | 633 | ring, so the change is noticed; the number itself is the answer. app.js adds | |
| 629 | 634 | the class when a poll changes a badge and drops it when the animation ends. */ | |
| @@ -2904,7 +2909,6 @@ textarea:focus-visible { | |||
| 2904 | 2909 | ||
| 2905 | 2910 | /* No rule under the header itself; the tab row keeps its rule. */ | |
| 2906 | 2911 | .status-head { border-bottom: 0; margin-bottom: 8px; } | |
| 2907 | .status-tabs { margin-bottom: 14px; border-bottom: 1px solid var(--border); } | ||
| 2908 | 2912 | .status-grid { display: grid; grid-template-columns: repeat(auto-fit, minmax(9rem, 1fr)); gap: 10px; margin: 14px 0; } | |
| 2909 | 2913 | .status-grid .card { margin: 0; display: flex; flex-direction: column; gap: 4px; } | |
| 2910 | 2914 | .status-grid strong { font-size: calc(22px * var(--font-scale)); font-weight: 600; font-variant-numeric: tabular-nums; } | |