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.
Let source and diff cards grow to their full height
30de4a44010d926a2d6ae088cbd7effc0811dbfe · Keenan Nemetz · 8d ago · parent 87bef95c
Let source and diff cards grow to their full height The code browser capped a blob at 76vh, so a long file scrolled inside the card. A diff card was not height-capped, but `overflow: hidden` still made it a scroll container. Ctrl+F on either one found a match that moved an inner box while the page stayed put, which is how a reviewer loses the result. The source card now has no height cap, and the diff card clips with `overflow: clip` rather than `hidden`, so neither is a vertical scroll area: the page scrolls and find can reach every line. A line wider than the pane still scrolls sideways, and the file tree keeps its capped sticky scroll because it is navigation beside the pane, not the content.
server/web/static/vole.css +8−5
| @@ -975,11 +975,15 @@ pre code { background: none; border: 0; padding: 0; font-size: inherit; } | |||
| 975 | 975 | ||
| 976 | 976 | .diffsum { font-size: calc(13.2px * var(--font-scale)); margin: 10px 0; } | |
| 977 | 977 | ||
| 978 | /* A diff is read with the browser's find bar as much as with the eyes, so the | ||
| 979 | card is not a scrolling box: it grows to the full height of the patch and the | ||
| 980 | page scrolls instead. `clip` rounds the corners like `hidden` did, without | ||
| 981 | making the element a scroll container that find has to scroll separately. */ | ||
| 978 | 982 | .diff { | |
| 979 | 983 | border: 1px solid var(--border); | |
| 980 | 984 | border-radius: var(--radius-lg); | |
| 981 | 985 | margin: 12px 0; | |
| 982 | overflow: hidden; | ||
| 986 | overflow: clip; | ||
| 983 | 987 | background: var(--bg-panel); | |
| 984 | 988 | } | |
| 985 | 989 | .diff h3 { | |
| @@ -1438,7 +1442,6 @@ details[open] > summary .tree-chevron { transform: rotate(90deg); } | |||
| 1438 | 1442 | .code-main .filebody { max-width: none; } | |
| 1439 | 1443 | .code-main .readme > *, | |
| 1440 | 1444 | .code-main .filebody > * { max-width: none; } | |
| 1441 | .code-main .blob { max-height: calc(100vh - 240px); } | ||
| 1442 | 1445 | .empty-code { margin-top: 0; } | |
| 1443 | 1446 | ||
| 1444 | 1447 | .dirlist td { padding: 2px 10px; } | |
| @@ -1453,7 +1456,6 @@ details[open] > summary .tree-chevron { transform: rotate(90deg); } | |||
| 1453 | 1456 | @media (max-width: 760px) { | |
| 1454 | 1457 | .code-browser { grid-template-columns: 1fr; } | |
| 1455 | 1458 | .file-tree { position: static; max-height: 260px; } | |
| 1456 | .code-main .blob { max-height: none; } | ||
| 1457 | 1459 | } | |
| 1458 | 1460 | ||
| 1459 | 1461 | .readme > *, | |
| @@ -1472,9 +1474,10 @@ details[open] > summary .tree-chevron { transform: rotate(90deg); } | |||
| 1472 | 1474 | } | |
| 1473 | 1475 | .filebody > :first-child { margin-top: 0; } | |
| 1474 | 1476 | ||
| 1477 | /* The source card grows to the file's full height for the same reason: find has | ||
| 1478 | one scroll area, the page. Only a line too wide for the pane scrolls here. */ | ||
| 1475 | 1479 | .blob { | |
| 1476 | max-height: 76vh; | ||
| 1477 | overflow: auto; | ||
| 1480 | overflow-x: auto; | ||
| 1478 | 1481 | } | |
| 1479 | 1482 | .blob table.code { | |
| 1480 | 1483 | font-family: var(--mono); | |