Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
24 changes: 24 additions & 0 deletions CHANGELOG.md
Original file line number Diff line number Diff line change
Expand Up @@ -11,6 +11,30 @@ per the process in [`docs/dev/releasing.md`](docs/dev/releasing.md).

## [Unreleased]

## [1.13.0] - 2026-07-22

### Added

- Mine cart train (#748): a pixel-art strip under the hero band retelling the chart window as
cargo — one cart per interval, token coins for what landed (orange ɱ per share interval, a
pair for a found block, a purple gem per confirmed Tari payout, a blue X per XvB raffle win),
with a tipple, a sleeping cat, and drifting clouds. Static under reduced motion. `/api/state`
gains a `payouts` key: confirmed payouts per chain as `{x, amount}` timeline points, gated on
the payout-confirmation flags.

### Changed

- Earnings calculator standardized (#748): every tab presents its estimate in one
Day / Month / Year table with a shared-precision coin column and a `≈` fiat column once the
price is known. Tari gains month/year spans, XvB gains the published current-tier reward
table, Energy gains Revenue (est.) / Power Cost / Net columns. Net figures carry the one
judgment colour — green in profit, red in loss.
- Dashboard panel round (#748): stat-heavy cards open collapsed to their headline stats with a
"Show all" toggle, the Advanced grid gains Your Stack / The Wider Pool section labels, the
workers table gains tabular numerics + row hover with offline-red scoped to the rig name,
chart active chips move from green to accent, and the topology diagram gains zone tints and
marching-ants on live routes.

## [1.12.0] - 2026-07-22

### Added
Expand Down
2 changes: 1 addition & 1 deletion VERSION
Original file line number Diff line number Diff line change
@@ -1 +1 @@
1.12.0
1.13.0
4 changes: 2 additions & 2 deletions build/dashboard/mining_dashboard/web/static/chart.mjs
Original file line number Diff line number Diff line change
Expand Up @@ -464,7 +464,7 @@ export class ChartCard extends Component {
return html`
<div class="card">
<div class="chart-controls" role="group" aria-label="Chart range">
<span class="text-muted text-small mr-1">Range:</span>
<span class="chart-control-label text-small mr-1">Range:</span>
${RANGES.map(
// Real buttons like the Avg/legend siblings (#657); the ?range= deep link
// survives because setRange writes it via history.replaceState.
Expand All @@ -481,7 +481,7 @@ export class ChartCard extends Component {
}
</div>
<div class="chart-controls" role="group" aria-label="Hashrate averaging window">
<span class="text-muted text-small mr-1" title="Which hashrate-averaging window the chart plots (#168)">Avg:</span>
<span class="chart-control-label text-small mr-1" title="Which hashrate-averaging window the chart plots (#168)">Avg:</span>
${WINDOWS.map(
([w, label]) => html`<button type="button"
class=${"btn-range" + (props.avgWindow === w ? " active" : "")}
Expand Down
244 changes: 178 additions & 66 deletions build/dashboard/mining_dashboard/web/static/components.mjs

Large diffs are not rendered by default.

166 changes: 164 additions & 2 deletions build/dashboard/mining_dashboard/web/static/dashboard.css
Original file line number Diff line number Diff line change
Expand Up @@ -96,6 +96,18 @@ body {
gap: 20px;
margin-bottom: 20px;
}
/* Section label inside the Advanced card grid (#159): the grid itself has no visual grouping, so
* these mark the "mine" -> "the world" transition the layout comment describes. Spans the full
* grid row; typography matches .est-heading (the other muted section marker in this stylesheet). */
.grid-section-label {
grid-column: 1 / -1;
margin-top: 6px;
font-size: 0.7rem;
font-weight: 600;
color: var(--text-muted);
text-transform: uppercase;
letter-spacing: 0.5px;
}
.card {
background: var(--card);
border: 1px solid var(--border);
Expand Down Expand Up @@ -164,6 +176,11 @@ body {
padding: 16px 18px;
text-align: center;
}
/* Total Hashrate (always first — heroKpis, logic.mjs) gets an accent cue so the strip reads with
* a clear headline instead of six equally-weighted numbers. */
.hero-band .hero-kpi:first-child {
border-top: 2px solid var(--accent);
}
.hero-value {
font-size: 1.6rem;
font-weight: 700;
Expand All @@ -178,6 +195,18 @@ body {
color: var(--text-muted);
}

/* Mine cart train (pixel art) under the hero band: purely decorative — the chart above shows
* the same data — so it stays short and quiet. The canvas draws at a 2× logical scale; height
* matches the renderer's 44-logical-px strip. */
.minecart-strip {
margin: -4px 0 16px 0;
}
.minecart-strip canvas {
display: block;
width: 100%;
height: 88px;
}

/* Typography */
h2 {
margin: 0;
Expand Down Expand Up @@ -241,6 +270,26 @@ h3 {
.col-span-2 {
grid-column: span 2;
}
/* Progressive disclosure ("show more") toggle for a stat-grid card: a real <button>, muted like
* the other secondary controls (.egress-details summary) so it doesn't compete with the stats
* themselves, but left-aligned under the grid rather than centred like a primary action. */
.more-stats-toggle {
background: none;
border: none;
color: var(--text-muted);
font-family: inherit;
font-size: 0.8rem;
cursor: pointer;
padding: 8px 0 0 0;
text-align: left;
}
.more-stats-toggle:hover {
color: var(--text);
}
.more-stats-toggle:focus-visible {
outline: 2px solid var(--accent);
outline-offset: 2px;
}

/* Earnings calculator what-if input (Issue #12) */
.earnings-subtitle {
Expand Down Expand Up @@ -406,6 +455,47 @@ td {
tr:last-child td {
border-bottom: none;
}

/* Standardized estimate tables: the one Day/Month/Year shape every earnings tab uses.
* Builds on the generic table/th/td rules above (borders, muted uppercase headers) and only
* overrides typography and alignment: numeric columns right-aligned with tabular figures so
* the shared-precision rows line up, label column flush left, digits never break mid-number
* (the .est-scroll wrapper pans instead on narrow screens). */
.est-table {
margin-bottom: 12px;
}
.est-table th {
font-size: 0.7rem;
text-align: right;
padding: 4px 0 4px 12px;
}
.est-table tbody th,
.est-table thead th:first-child {
text-align: left;
padding-left: 0;
}
.est-table td {
text-align: right;
font-weight: 600;
font-size: 0.95rem;
padding: 5px 0 5px 12px;
font-variant-numeric: tabular-nums;
white-space: nowrap;
}
.est-table tr:last-child th {
border-bottom: none; /* match the generic tr:last-child td rule for the row-label column */
}
.est-scroll {
overflow-x: auto;
}
.est-heading {
margin: 14px 0 6px 0;
font-size: 0.7rem;
font-weight: 600;
color: var(--text-muted);
text-transform: uppercase;
}

/* Pool-wide proxy share totals under the Workers table (Issue #82). */
.proxy-totals {
margin-top: 12px;
Expand Down Expand Up @@ -433,6 +523,42 @@ tr:last-child td {
.table-scroll td {
white-space: nowrap;
}
/* Numeric columns (1m / 10m / Accepted / Rejected — WORKER_COLUMNS indices 3-6, logic.mjs)
* right-align with tabular figures, the same treatment as .est-table td, so the digits line up
* instead of ragging left like the text columns beside them. */
.table-scroll th:nth-child(4),
.table-scroll th:nth-child(5),
.table-scroll th:nth-child(6),
.table-scroll th:nth-child(7),
.table-scroll td:nth-child(4),
.table-scroll td:nth-child(5),
.table-scroll td:nth-child(6),
.table-scroll td:nth-child(7) {
text-align: right;
}
.table-scroll td:nth-child(4),
.table-scroll td:nth-child(5),
.table-scroll td:nth-child(6),
.table-scroll td:nth-child(7) {
font-variant-numeric: tabular-nums;
}
/* Row hover (Workers Alive): a quiet raised-surface cue that a row is under the pointer. */
.table-scroll tbody tr:hover td {
background: var(--elevated);
}
/* An offline row's status-bad class colours the whole <tr> (color is inherited down every td) —
* that read as eight cells of red text. Reset the row to normal text colour and let only the name
* cell (which already carries the worker name + status context) carry the ok/bad tint. */
.table-scroll tbody tr.status-ok > td,
.table-scroll tbody tr.status-bad > td {
color: var(--text);
}
.table-scroll tbody tr.status-ok > td:first-child {
color: var(--ok);
}
.table-scroll tbody tr.status-bad > td:first-child {
color: var(--bad);
}

/* The audit trail's title + its hour/day/month grouping select (#530), side by side. */
.card-header-row {
Expand Down Expand Up @@ -577,14 +703,22 @@ button.upgrade-btn {
border-color: var(--text-muted);
color: var(--text);
}
/* Accent, not --ok: --ok is the app-wide "healthy" signal (status-ok, badge-ok, the sync
* gauge) — reusing it for "this range/window is selected" collided with that meaning. Accent
* matches .btn-toggle.active, the sibling Simple/Advanced control. */
.btn-range.active {
background-color: var(--ok);
background-color: var(--accent);
color: #fff;
border-color: var(--ok);
border-color: var(--accent);
}
.btn-reset {
margin-left: 8px;
}
/* "Range:" / "Avg:" prefixes (chart.mjs): full text colour, not text-muted, so the two control
* rows read as separate labelled groups instead of blurring into one muted line. */
.chart-control-label {
color: var(--text);
}

/* Series show/hide toggles (Issue #47): a quiet legend; click a chip to toggle that series.
* A hidden series is dimmed + struck through. Swatch colours track the theme palette. */
Expand Down Expand Up @@ -846,6 +980,7 @@ button.upgrade-btn {
gap: 12px;
background: var(--card);
border: 1px solid var(--border);
border-left: 3px solid var(--accent);
border-radius: 6px;
padding: 8px 12px;
margin-bottom: 15px;
Expand Down Expand Up @@ -1066,17 +1201,44 @@ button.upgrade-btn {
fill: var(--text);
font-size: 11px;
}
/* Tor hub: tint the fill with the same green as its stroke (instead of the flat --bg every other
* node uses) so the trust anchor reads as a distinct zone at a glance, not just a thicker border. */
.topo-hub rect {
fill: var(--ok);
fill-opacity: 0.12;
stroke: var(--ok);
stroke-width: 1.5;
}
/* Host-zone nodes (xmrig-proxy/caddy/dashboard/p2pool/monerod/tari/docker): a faint accent tint —
* "this stack" — same zone-tint treatment as the Tor hub above. Excludes .topo-hub (tor) and
* .topo-ext (lan/internet, which stay the deliberately hollow/dashed "external" look below). */
.topo-node:not(.topo-hub):not(.topo-ext) rect {
fill: var(--accent);
fill-opacity: 0.06;
}
.topo-ext rect {
fill: transparent;
stroke-dasharray: 3 2;
}
.topo-ext text {
fill: var(--text-muted);
}
/* Marching ants on active, non-muted edges (Tor/clearnet — never the grey local/inactive routes):
* a moving dash pattern reads as "live traffic" versus the static routes. Dashes alone (no motion)
* render for prefers-reduced-motion, so the distinction still exists without the animation. */
.topo-edge-ants {
stroke-dasharray: 6 4;
}
@media (prefers-reduced-motion: no-preference) {
.topo-edge-ants {
animation: topo-ants-dash 0.8s linear infinite;
}
}
@keyframes topo-ants-dash {
to {
stroke-dashoffset: -10;
}
}
/* The per-component egress list, demoted to an expandable drawer under the topology map. */
.egress-details {
margin-top: 0.6rem;
Expand Down
Loading