OXYGENHUB

Flow and file pages: use the theme's ink and mute colours (--text does not exist), plain code for state hashes af9c6ca11c49

Author
Andy McCall @andymccall <[email protected]>
When
· 2026-09-28 11:57 UTC
Signature
✔ signed by Andy McCall
Hash
af9c6ca11c49bbc6b129307fcf16edfebac25f722fff4b5a8eb2636017b846c5
Depends on
42fa95540468 6ae41081ccd3 d23464c0ac60
Depended on by
d9b3b84605a4 745d225de344 4f6925337848 1edac4b68c6d a0d4bbfbedd1
In bookmarks
api-unknown-fields cancel-landed-runs clear-waiting close-proposal-140 diffusion-pin-bookmark draft-ready image-check job-waits main oh-comment-body-file proposal-list-fast run-one-job wiki-says-so
In tags
v0.1.0 v0.2.0 v0.3.0 v0.3.1 v0.4.0 v0.4.1 v0.4.2 v0.5.0 v0.5.1 v0.5.2 v0.6.0 v0.6.1 v0.7.0 v0.8.0 v0.9.0 v0.9.1 v0.9.11 v0.9.15 v0.9.16 v0.9.19 v0.9.2 v0.9.20 v0.9.21 v0.9.22 v0.9.23 v0.9.24 v0.9.3 v0.9.4 v0.9.5 v0.9.6 v0.9.7 v0.9.8 v0.9.9
Edits
9 atoms, 0 tree operations, 3 files

Browse the tree at this change

modified templates/flow_run.html +1 −1
…
6 unchanged lines
7 7
{% block content %}
8 8
<div class="head">
9 9
  <h1><span class="flow-glyph st-{{ run.status }}" data-run-glyph>{{ crate::web::flow::glyph(run.status) }}</span> Run #{{ run.id }} <small data-run-status>{{ run.status }}</small></h1>
10 -
  <p class="small mute"><span class="lbl lbl-bm">{{ run.bookmark }}</span> at <a class="px" href="{{ repo.url }}/tree/{{ run.heads }}" title="{{ run.state }}">{{ run.state|short }}</a> · pushed by {{ run.actor }} <time title="{{ run.created_ms|when_i }}">{{ run.created_ms|ago_i }}</time> · {{ duration }}{% if !run.pipeline_hash.is_empty() %} · pipeline <code title="{{ run.pipeline_hash }}">{{ run.pipeline_hash|short }}</code>{% endif %} · <a href="{{ repo.url }}/file/{{ run.heads }}/.flow/pipeline.kdl">.flow/pipeline.kdl</a> · <a href="{{ repo.url }}/flow">all runs</a></p>
10 +
  <p class="small mute"><span class="lbl lbl-bm">{{ run.bookmark }}</span> at <a href="{{ repo.url }}/tree/{{ run.heads }}" title="state {{ run.state }}"><code>{{ run.state|short }}</code></a> · pushed by {{ run.actor }} <time title="{{ run.created_ms|when_i }}">{{ run.created_ms|ago_i }}</time> · {{ duration }}{% if !run.pipeline_hash.is_empty() %} · pipeline <code title="{{ run.pipeline_hash }}">{{ run.pipeline_hash|short }}</code>{% endif %} · <a href="{{ repo.url }}/file/{{ run.heads }}/.flow/pipeline.kdl">.flow/pipeline.kdl</a> · <a href="{{ repo.url }}/flow">all runs</a></p>
11 11
</div>
12 12
{% if run.status == "error" %}
13 13
<section class="panel"><div class="strip bad">The pipeline is not valid, so nothing ran.</div><pre class="snippet">{{ run.error }}</pre><p class="small mute">Run <code>flow check</code> locally to see the same problems.</p></section>
…
26 unchanged lines
modified templates/flow_runs.html +1 −1
…
34 unchanged lines
35 35
    <td><a href="{{ repo.url }}/flow/{{ row.r.id }}"><strong>#{{ row.r.id }}</strong></a> <span class="small mute">{{ row.r.status }}</span></td>
36 36
    <td class="flow-dots">{% for (n, s) in row.jobs %}<span class="flow-glyph st-{{ s }}" title="{{ n }}: {{ s }}">{{ crate::web::flow::glyph(s) }}</span>{% endfor %}{% if row.r.status == "error" %}<span class="small bad">pipeline invalid</span>{% endif %}</td>
37 37
    <td><span class="lbl lbl-bm">{{ row.r.bookmark }}</span></td>
38 -
    <td><a class="px" href="{{ repo.url }}/tree/{{ row.r.heads }}" title="{{ row.r.state }}">{{ row.r.state|short }}</a></td>
38 +
    <td><a href="{{ repo.url }}/tree/{{ row.r.heads }}" title="state {{ row.r.state }}"><code>{{ row.r.state|short }}</code></a></td>
39 39
    <td>{{ row.r.actor }}</td>
40 40
    <td><time title="{{ row.r.created_ms|when_i }}">{{ row.r.created_ms|ago_i }}</time></td>
41 41
    <td class="small mute">{{ row.duration }}</td>
…
7 unchanged lines
modified templates/style.css +8 −7
…
389 unchanged lines
390 390
.file-side { position: sticky; top: 12px; max-height: calc(100vh - 24px); overflow: auto; font-size: 13px; background: var(--panel); border: 1px solid var(--line); padding: 8px 0; }
391 391
.file-side .side-root { display: block; padding: 2px 12px 6px; font-weight: 600; }
392 392
.file-side ul { list-style: none; margin: 0; padding: 0; }
393 -
.file-side li a { display: block; padding: 2px 12px 2px calc(12px + var(--d, 0) * 14px); color: var(--text); white-space: nowrap; overflow: hidden; text-overflow: ellipsis; }
393 +
.file-side li a { display: block; padding: 2px 12px 2px calc(12px + var(--d, 0) * 14px); color: var(--ink); white-space: nowrap; overflow: hidden; text-overflow: ellipsis; }
394 394
.file-side li a:hover { background: var(--soft); text-decoration: none; }
395 395
.file-side li.here a { background: color-mix(in srgb, var(--acc) 16%, transparent); font-weight: 600; box-shadow: inset 3px 0 0 var(--acc); }
396 396
.file-side .glyph { color: var(--dim); font-size: 10px; }
…
19 unchanged lines
416 416
.flow-glyph.st-passed, .node.st-passed .g { color: var(--ok); fill: var(--ok); }
417 417
.flow-glyph.st-failed, .flow-glyph.st-error, .node.st-failed .g, .node.st-error .g { color: var(--bad); fill: var(--bad); }
418 418
.flow-glyph.st-running, .node.st-running .g { color: var(--acc); fill: var(--acc); }
419 -
.flow-glyph.st-queued, .flow-glyph.st-skipped, .node.st-queued .g, .node.st-skipped .g { color: var(--dim); fill: var(--dim); }
419 +
.flow-glyph.st-queued, .flow-glyph.st-skipped, .node.st-queued .g, .node.st-skipped .g { color: var(--mute); fill: var(--mute); }
420 420
.flow-glyph.st-running, .node.st-running .g { animation: flow-pulse 1.2s ease-in-out infinite; }
421 421
@keyframes flow-pulse { 50% { opacity: .35; } }
422 422
@media (prefers-reduced-motion: reduce) { .flow-glyph.st-running, .node.st-running .g { animation: none; } }
…
10 unchanged lines
433 433
.flow-graph .node.st-running rect { stroke: var(--acc); fill: color-mix(in srgb, var(--acc) 8%, var(--panel)); }
434 434
.flow-graph .node.st-skipped rect { stroke-dasharray: 4 3; }
435 435
.flow-graph .node .g { font-size: 18px; }
436 -
.flow-graph .node .name { fill: var(--text); font-size: 14px; font-weight: 600; }
437 -
.flow-graph .node .meta { fill: var(--dim); font-size: 11px; }
436 +
.flow-graph text { font-family: "Barlow", sans-serif; stroke: none; }
437 +
.flow-graph .node .name { fill: var(--ink); font-size: 14px; font-weight: 600; }
438 +
.flow-graph .node .meta { fill: var(--mute); font-size: 11.5px; font-weight: 400; }
438 439
details.flow-job { padding: 0; margin-top: 10px; }
439 440
details.flow-job > summary { padding: 10px 12px; cursor: pointer; list-style-position: inside; }
440 441
details.flow-job .pad { padding: 0 12px 10px; margin: 0; }
441 442
pre.flow-log { margin: 0; padding: 8px 0; max-height: 70vh; overflow: auto; border-top: 1px solid var(--line); background: var(--soft); font-size: 12.5px; line-height: 1.5; }
442 443
pre.flow-log:empty { display: none; }
443 444
pre.flow-log .ln { display: block; padding: 0 12px; white-space: pre-wrap; word-break: break-word; }
444 -
pre.flow-log .t { display: inline-block; min-width: 5.5em; color: var(--dim); user-select: none; }
445 -
pre.flow-log .s-err { color: color-mix(in srgb, var(--bad) 75%, var(--text)); }
446 -
pre.flow-log .s-flow, pre.flow-log .s-console { color: var(--dim); font-style: italic; }
445 +
pre.flow-log .t { display: inline-block; min-width: 5.5em; color: var(--mute); user-select: none; }
446 +
pre.flow-log .s-err { color: color-mix(in srgb, var(--bad) 75%, var(--ink)); }
447 +
pre.flow-log .s-flow, pre.flow-log .s-console { color: var(--mute); font-style: italic; }
447 448
table.flow-runs td.st { width: 1.5em; }