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.

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; }