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.
Show run durations and lazy step logs
c765ae2e18691b3f98d93b00b4eb418ce781e3f1 · Keenan Nemetz · 13d ago · parent bdf6a0de
server/web/static/vole.css +88
| @@ -20,6 +20,7 @@ | |||
| 20 | 20 | code browser and file tree the persistent tree beside the pane | |
| 21 | 21 | syntax highlighting chroma classes | |
| 22 | 22 | repository overview sidebar compact commit and run rows | |
| 23 | run detail summary cards, step timing and lazy logs | ||
| 23 | 24 | issues and changes list pages, thread, forms, metadata sidebar | |
| 24 | 25 | icons inline SVG sizing | |
| 25 | 26 | activity feed event rows for one repository and the instance | |
| @@ -1212,6 +1213,93 @@ details[open] > summary .tree-chevron { transform: rotate(90deg); } | |||
| 1212 | 1213 | .side-run-top { display: flex; align-items: baseline; gap: 6px; min-width: 0; } | |
| 1213 | 1214 | .side-run-top .status { flex: 0 0 auto; } | |
| 1214 | 1215 | ||
| 1216 | /* ---------- run detail ---------- */ | ||
| 1217 | |||
| 1218 | /* A run's summary is four facts, not a paragraph: how long it took, how long it | ||
| 1219 | waited, what it ran on, and which commit it tested. */ | ||
| 1220 | .run-summary { | ||
| 1221 | display: grid; | ||
| 1222 | grid-template-columns: repeat(auto-fit, minmax(11rem, 1fr)); | ||
| 1223 | gap: 10px; | ||
| 1224 | margin: 16px 0; | ||
| 1225 | } | ||
| 1226 | .run-summary .card { | ||
| 1227 | margin: 0; | ||
| 1228 | display: flex; | ||
| 1229 | flex-direction: column; | ||
| 1230 | gap: 3px; | ||
| 1231 | min-width: 0; | ||
| 1232 | } | ||
| 1233 | .run-summary-label { | ||
| 1234 | display: flex; | ||
| 1235 | align-items: center; | ||
| 1236 | gap: 5px; | ||
| 1237 | color: var(--fg-faint); | ||
| 1238 | font-size: 10.5px; | ||
| 1239 | font-weight: 500; | ||
| 1240 | letter-spacing: 0.04em; | ||
| 1241 | text-transform: uppercase; | ||
| 1242 | } | ||
| 1243 | .run-summary-label .icon { width: 12px; height: 12px; } | ||
| 1244 | .run-summary strong { | ||
| 1245 | font-size: 16px; | ||
| 1246 | font-weight: 600; | ||
| 1247 | font-variant-numeric: tabular-nums; | ||
| 1248 | overflow-wrap: anywhere; | ||
| 1249 | } | ||
| 1250 | .run-summary .status-note { margin: 0; } | ||
| 1251 | .run-summary code { font-size: 10.5px; overflow-wrap: anywhere; } | ||
| 1252 | |||
| 1253 | /* Step logs are loaded on demand. The details element is the trigger; the pre is | ||
| 1254 | the target, and htmx uses textContent so a log can never become markup. */ | ||
| 1255 | .run-log { | ||
| 1256 | margin: 4px 0; | ||
| 1257 | background: var(--bg-panel); | ||
| 1258 | border: 1px solid var(--border); | ||
| 1259 | border-radius: var(--radius); | ||
| 1260 | overflow: hidden; | ||
| 1261 | } | ||
| 1262 | .run-log > summary { | ||
| 1263 | display: flex; | ||
| 1264 | align-items: center; | ||
| 1265 | gap: 6px; | ||
| 1266 | padding: 6px 10px; | ||
| 1267 | color: var(--fg-muted); | ||
| 1268 | font-size: 12px; | ||
| 1269 | cursor: pointer; | ||
| 1270 | list-style: none; | ||
| 1271 | } | ||
| 1272 | .run-log > summary::-webkit-details-marker { display: none; } | ||
| 1273 | .run-log > summary:hover { color: var(--fg); background: var(--bg-hover); } | ||
| 1274 | .run-log > summary .icon { width: 12px; height: 12px; color: var(--fg-faint); } | ||
| 1275 | .run-log[open] > summary { | ||
| 1276 | color: var(--fg); | ||
| 1277 | border-bottom: 1px solid var(--border); | ||
| 1278 | } | ||
| 1279 | .run-log-text { | ||
| 1280 | margin: 0; | ||
| 1281 | padding: 10px 12px; | ||
| 1282 | border: 0; | ||
| 1283 | border-radius: 0; | ||
| 1284 | background: var(--bg); | ||
| 1285 | color: var(--fg); | ||
| 1286 | font-size: 12px; | ||
| 1287 | line-height: 1.5; | ||
| 1288 | max-height: 34rem; | ||
| 1289 | min-height: 2.5rem; | ||
| 1290 | overflow: auto; | ||
| 1291 | white-space: pre; | ||
| 1292 | } | ||
| 1293 | .run-step-log td { padding: 0 8px 8px; } | ||
| 1294 | .run-logbar { | ||
| 1295 | display: flex; | ||
| 1296 | flex-wrap: wrap; | ||
| 1297 | align-items: center; | ||
| 1298 | gap: 10px; | ||
| 1299 | margin: 8px 0; | ||
| 1300 | font-size: 12px; | ||
| 1301 | } | ||
| 1302 | |||
| 1215 | 1303 | /* ---------- issues and changes ---------- */ | |
| 1216 | 1304 | ||
| 1217 | 1305 | .page-head { | |