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.
Update the change page as live regions, not one sidebar swap
707dfd10f309461a77a4a8f73dcce74b07c91fd6 · Keenan Nemetz · 10d ago · parent 9f5efa3c
Update the change page as live regions, not one sidebar swap The 20-second poll replaced the entire sidebar, so every new widget needed its own reason to opt out and live updates stopped while it was in use. The sidebar is now a set of regions: review status, changes, approvals, checks, and the combined result are data-only live regions returned with hx-swap-oob; the target picker, issue search, and composers are outside every polled swap. Approval and the other multi-region writes use the same out-of-band group, and the page action group refreshes from the write without replacing unrelated state.
server/web/static/vole.css +2−1
| @@ -1395,6 +1395,7 @@ details[open] > summary .tree-chevron { transform: rotate(90deg); } | |||
| 1395 | 1395 | .request-issue form button:hover { color: var(--bad); } | |
| 1396 | 1396 | .request-unlink { display: inline-grid; place-items: center; width: 22px; min-height: 22px; border-radius: var(--radius); } | |
| 1397 | 1397 | .request-unlink:hover { background: var(--bg-hover); text-decoration: none; } | |
| 1398 | #request-combined[hidden], #request-merge-note[hidden] { display: none; } | ||
| 1398 | 1399 | .request-issue-picker { position: relative; margin-top: 8px; } | |
| 1399 | 1400 | .thread-side .request-issue-picker form { margin: 0; } | |
| 1400 | 1401 | .request-issue-search input { width: 100%; font-size: calc(12.65px * var(--font-scale)); } | |
| @@ -1697,7 +1698,7 @@ details[open] > summary .tree-chevron { transform: rotate(90deg); } | |||
| 1697 | 1698 | } | |
| 1698 | 1699 | .thread-main { min-width: 0; } | |
| 1699 | 1700 | .thread-side section { padding: 12px 0 14px; border-bottom: 1px solid var(--border); } | |
| 1700 | .thread-side #request-sidebar > section:first-child { padding-top: 0; } | ||
| 1701 | .thread-side #request-sidebar > #request-review { padding-top: 0; } | ||
| 1701 | 1702 | .thread-side > section:last-child, | |
| 1702 | 1703 | .thread-side #request-sidebar > section:last-child { border-bottom: 0; } | |
| 1703 | 1704 | .thread-side h2 { margin: 0 0 8px; } | |