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.
Draw every tab row rule at the content edge
973fb80906d6a1ec79ecd6b449e2e51e9cfb77d5 · Keenan Nemetz · 22h ago · parent e189a23e
Draw every tab row rule at the content edge The strip of tabs pulls itself 10px left so the first label's text sits on the content edge, but Settings and Admin put the row's border on that same element, so their rule hung 10px past the repository header's. The rule now belongs to a wrapper in every case: the repository header already had one, and a page's tabs and a change's sections wrap the same strip in .tabrow. The change sections also stop carrying their own copy of the tab styles, which differed by a pixel of padding and a point of icon size.
server/web/static/vole.css +11−25
| @@ -624,10 +624,13 @@ 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); } | ||
| 627 | /* The rule under a tab row belongs to a wrapper, not to the strip that carries | ||
| 628 | the labels: `.tabs` pulls itself 10px left so the first label's text sits on | ||
| 629 | the content edge, and a border on that element would hang 10px past it. The | ||
| 630 | repository header keeps its rule on `.repohead`; a page's tabs and a change's | ||
| 631 | sections wrap the same strip in this class, so every row starts and ends on | ||
| 632 | the content edges together. */ | ||
| 633 | .tabrow { margin-bottom: 14px; border-bottom: 1px solid var(--border); } | ||
| 631 | 634 | ||
| 632 | 635 | /* A count that moved while the reader was looking elsewhere keeps one short | |
| 633 | 636 | ring, so the change is noticed; the number itself is the answer. app.js adds | |
| @@ -1832,27 +1835,10 @@ details[open] > summary .tree-chevron { transform: rotate(90deg); } | |||
| 1832 | 1835 | .page-head h1 { font-size: calc(24.2px * var(--font-scale)); } | |
| 1833 | 1836 | } | |
| 1834 | 1837 | ||
| 1835 | /* Secondary navigation inside a change: conversation and the review files. */ | ||
| 1836 | .subtabs { | ||
| 1837 | display: flex; | ||
| 1838 | gap: 2px; | ||
| 1839 | margin: -2px 0 14px; | ||
| 1840 | border-bottom: 1px solid var(--border); | ||
| 1841 | } | ||
| 1842 | .subtabs a { | ||
| 1843 | display: inline-flex; | ||
| 1844 | align-items: center; | ||
| 1845 | gap: 6px; | ||
| 1846 | padding: 7px 10px; | ||
| 1847 | margin-bottom: -1px; | ||
| 1848 | border-bottom: 2px solid transparent; | ||
| 1849 | color: var(--fg-muted); | ||
| 1850 | font-size: calc(13.75px * var(--font-scale)); | ||
| 1851 | } | ||
| 1852 | .subtabs a:hover { color: var(--fg); text-decoration: none; } | ||
| 1853 | .subtabs a.active { color: var(--fg); border-bottom-color: var(--accent); } | ||
| 1854 | .subtabs .icon { width: 13px; height: 13px; } | ||
| 1855 | .subtabs .chip-count { margin-left: 0; } | ||
| 1838 | /* Secondary navigation inside a change: conversation and the review files. It is | ||
| 1839 | the same `.tabrow` and `.tabs` as every other row, pulled up against the | ||
| 1840 | request header. */ | ||
| 1841 | .subtabs { margin-top: -2px; } | ||
| 1856 | 1842 | ||
| 1857 | 1843 | .state { | |
| 1858 | 1844 | display: inline-flex; | |