2026-05-21 — Step log UI: no scrollbar, full output, CI-style highlighting¶
Motivation¶
The BLAST step log block was a 600 px-tall scrollable widget with a
40-line collapse threshold and minimal syntax colouring. Users running
real blastn jobs reported that (a) they had to scroll inside a tiny
inner pane to see the rest of the log, and (b) the colouring was hard
to read — only one shade per category and no separation of timestamps
from content.
User-facing change¶
The step log block now renders all lines inline — no inner scrollbar, no "Show all N lines" button, no fold. Each line is rendered with line number + ISO timestamp prefix (dimmed) + CI-style coloured body:
error/Traceback/panic:/<Error>/ContainerNotFound— red with subtle red washWARN/WARNING/⚠/deprecated— amber✓/EXIT_CODE=0/SUCCESS/Completed— green---/===/###section banners — accent (cyan-violet)$/>/#command lines — light cyanINFO:/DEBUG/TRACE— faint greyBLAST RUNTIME/Database:/azcopy …/elastic-blast …/kubectl …/ BLAST program invocations — soft violet- Everything else — default muted text
ANSI escape codes (\x1B[…m) are stripped before classification so
azcopy / coloured pytest output no longer leaves [0;31m debris in the
DOM.
API / IaC diff summary¶
- web/src/components/BlastStepTimeline/StepLogBlock.tsx
rewritten: removed
isExpanded/isLongstate and the "Show all N lines" / "Collapse" buttons; addedstripAnsi,classifyLineKind,tokeniseLine; renders every detail line. - web/src/theme/glass.css:
.step-log-detailno longer hasmax-height/overflow-y.- Removed
.step-log-detail--collapsed, its::afterfade, and.step-log-expand. - Added
.step-log-row,.step-log-ts,.step-log-text--cmd,.step-log-text--blastplus matching light-theme overrides. - No backend / Bicep changes.
Validation¶
cd web && npm run build→ built clean (6.4 s).cd web && npx eslint src/components/BlastStepTimeline→ clean.- Manual screenshot: a sample 200-line BLAST run shows continuous output with no inner scroll and clear per-category colours.
Out of scope¶
Per-token highlighting (numeric values, URLs, file paths within a line) remains line-level for now. The token model is in place so a future pass can extract URLs / numbers without restructuring the renderer.