miner-ui-3: variant C is the default (the fleet rate big, the button a bar under it; Earnings the same shape); every strip on the brand tokens

the project lead picked C. The Mine hero is the fleet rate at 84 px on a graphite-to-obsidian fade with W, £ a day and blocks
beside it, Start/Stop as a full-width bar under it; Earnings carries the same shape with the £ figure big. The
?variant switch is gone. Every strip, ask and clock card is one component: the row surface, a 1 px ember hairline on
top, ash text, ember only on the dot and the chevron; no filled brown or mustard field anywhere in the app (the rail's
active item, the pill, the ghost-on button, the option, the ring, the log hit and mark lost their tints). The update
strip and the job strip share .notice. 36 UI tests pass.

Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
This commit is contained in:
igneum-labs 2026-10-06 18:09:55 +00:00
parent 40528b4cb5
commit f8322bcbaa
15 changed files with 81 additions and 85 deletions

View file

@ -61,7 +61,7 @@ input,textarea{font-variant-numeric:tabular-nums}
.btn.tiny{min-height:26px;padding:2px 10px;font-size:var(--t-sm);border-radius:7px;font-family:var(--mono);font-weight:500}
.btn.ghost{border-color:transparent;color:var(--ink-2)}
.btn.ghost:hover{border-color:var(--line-2);color:var(--bone)}
.btn.ghost.on{color:var(--molten);border-color:var(--molten-40);background:var(--molten-10)}
.btn.ghost.on{color:var(--molten);border-color:var(--molten-40)}
.btn.danger:hover{color:var(--ember);border-color:var(--ember)}
:focus-visible{outline:2px solid var(--ember);outline-offset:3px;border-radius:6px}
@media (prefers-reduced-motion:reduce){.btn{transition:none}}
@ -77,7 +77,7 @@ body.mac .rail-brand{padding-top:30px}
.nav svg{width:19px;height:19px;flex:0 0 19px;fill:none;stroke:currentColor;stroke-width:1.9;stroke-linecap:round;stroke-linejoin:round;color:var(--ash);transition:color .15s ease}
.nav:hover{background:var(--hover);color:var(--bone)}
.nav:hover svg{color:var(--ink-2)}
.nav.on{background:var(--ember-12);border-color:var(--ember-40);color:var(--bone);font-weight:600}
.nav.on{background:var(--hover);border-color:var(--line);color:var(--bone);font-weight:600}
.nav.on svg{color:var(--ember)}
.nav.on::before{content:"";position:absolute;left:-13px;top:10px;bottom:10px;width:3px;border-radius:0 3px 3px 0;background:var(--ember)}
.nav.small{min-height:36px;font-size:var(--t-base);color:var(--ash)}
@ -106,8 +106,8 @@ body.has-rail .top{align-items:baseline;padding-top:19px}
.top-right{display:flex;align-items:center;gap:var(--s-3);flex:0 0 auto;min-width:0}
.pill{display:inline-flex;align-items:baseline;gap:var(--s-2);font-family:var(--sans);font-size:var(--t-base);font-weight:600;color:var(--ash);border:1px solid var(--line);border-radius:999px;padding:5px 12px 5px 10px;background:var(--graphite);white-space:nowrap;font-variant-numeric:tabular-nums;justify-content:center;line-height:1.3}
.pill .dot{position:relative;top:-1px}
.pill.on{color:var(--molten);border-color:var(--molten-40);background:var(--molten-10)}
.pill.warn{color:var(--ember);border-color:var(--ember-40);background:var(--ember-12)}
.pill.on{color:var(--molten);border-color:var(--molten-40)}
.pill.warn{color:var(--ember);border-color:var(--ember-40)}
.dot{width:8px;height:8px;border-radius:50%;background:var(--ash);display:inline-block;flex:0 0 8px}
.on .dot,.dot.live{background:var(--molten);animation:pulse 2s ease-in-out infinite}
.warn .dot,.dot.bad{background:var(--ember);animation:none}
@ -118,30 +118,31 @@ body.has-rail .top{align-items:baseline;padding-top:19px}
top moves once per change with a 150 ms transition (layoutStrip), never per poll. */
.notices{position:fixed;top:var(--top);left:0;right:0;z-index:19}
body.has-rail .notices{left:var(--rail)}
.notice{display:flex;flex-wrap:wrap;align-items:center;gap:var(--s-2) var(--s-4);padding:8px calc(var(--gutter) - 6px) 8px var(--gutter);background:var(--molten-10);border-bottom:1px solid var(--molten-40);font-size:var(--t-base);line-height:1.4;color:var(--bone)}
.notice.bad{background:var(--ember-12);border-bottom-color:var(--ember-40)}
.notice.warn{background:var(--molten-10);border-bottom-color:var(--molten-40)}
.notice.update-urgent{background:rgba(242,84,27,.55);border-bottom-color:var(--ember);color:#fff;font-weight:600}
.notice{display:flex;flex-wrap:wrap;align-items:center;gap:var(--s-2) var(--s-3);padding:9px calc(var(--gutter) - 6px) 9px var(--gutter);background:var(--row);border-bottom:1px solid var(--line);box-shadow:inset 0 1px 0 var(--ember);font-size:var(--t-base);line-height:1.4;color:var(--ash)}
.notice-dot{width:7px;height:7px;border-radius:50%;background:var(--ember);flex:0 0 7px;display:inline-block}
.notice.bad .notice-text,.notice.update-urgent .notice-text{color:var(--bone)}
.notice.update-urgent .notice-text{font-weight:600}
.notice .notice-text b{color:var(--bone);font-weight:600}
.notice-text{flex:1 1 320px;min-width:0}
.notice-actions{display:flex;align-items:center;gap:var(--s-2);flex:0 0 auto}
.notice-actions:empty{display:none}
.notice-close{flex:0 0 auto;width:30px;height:30px;border-radius:8px;border:1px solid transparent;background:transparent;color:var(--ash);font-size:20px;line-height:1;cursor:pointer;display:inline-flex;align-items:center;justify-content:center;padding:0}
.notice-close:hover{color:var(--bone);border-color:var(--line-2)}
.notice.update-urgent .notice-close{color:#fff}
.notice-more{flex:0 0 auto;width:30px;height:30px;border-radius:8px;border:1px solid transparent;background:transparent;color:var(--ash);cursor:pointer;display:inline-flex;align-items:center;justify-content:center;padding:0}
.notice-more:hover{color:var(--bone);border-color:var(--line-2)}
.notice-more .chev{width:8px;height:8px;transform:rotate(45deg) translateY(-2px)}
.notice-more.open .chev{transform:rotate(225deg) translateY(-2px)}
.notice-detail{flex-basis:100%;font-family:var(--mono);font-size:var(--t-sm);color:var(--ink-2);white-space:normal;word-break:break-word;margin-top:-2px;user-select:text;-webkit-user-select:text}
.notice .prog{flex-basis:100%;height:3px;background:rgba(127,127,127,.2);border-radius:2px;overflow:hidden;margin-top:-3px}
.notice .prog{flex-basis:100%;height:2px;background:var(--line);border-radius:2px;overflow:hidden;margin-top:-3px}
.notice .prog i{display:block;height:100%;width:0;background:var(--ember);transition:width .5s linear}
/* a question in place of a dialog: the quit strip over the page, the inline asks inside a card */
.ask-wrap{position:fixed;left:0;right:0;bottom:0;z-index:36;display:flex;justify-content:center;padding:0 var(--s-4) var(--s-4);pointer-events:none}
body.has-rail .ask-wrap{left:var(--rail)}
.ask{display:flex;align-items:center;gap:var(--s-3);flex-wrap:wrap;background:var(--graphite);border:1px solid var(--ember-40);border-radius:14px;padding:12px 16px;box-shadow:0 14px 40px var(--shadow);pointer-events:auto;max-width:720px;animation:rise .2s ease}
.ask{display:flex;align-items:center;gap:var(--s-3);flex-wrap:wrap;background:var(--row);border:1px solid var(--line);border-radius:14px;padding:12px 16px;box-shadow:inset 0 1px 0 var(--ember),0 14px 40px var(--shadow);pointer-events:auto;max-width:720px;animation:rise .2s ease}
.ask-text{flex:1 1 260px;font-size:var(--t-md);min-width:0}
.ask.inline{box-shadow:none;background:var(--ember-12);margin-top:var(--s-3);animation:none}
.ask.inline{box-shadow:inset 0 1px 0 var(--ember);background:var(--row);margin-top:var(--s-3);animation:none}
/* screens and pages */
main{position:absolute;top:var(--top);bottom:var(--bottom);left:0;right:0;overflow:auto;padding:0 var(--gutter);overscroll-behavior:contain;transition:top .15s ease}
@ -220,7 +221,7 @@ body[data-phase="welcome"] #screen-welcome,body[data-phase="cards"] #screen-card
.toggle-big .ts{font-family:var(--mono);font-size:var(--t-xs);letter-spacing:.06em;opacity:.8;white-space:nowrap;overflow:hidden;text-overflow:ellipsis;max-width:100%}
.toggle-big.stop{background:var(--graphite);border-color:var(--line-2);color:var(--bone)}
.toggle-big.stop:hover{border-color:var(--ash);background:var(--row)}
.toggle-big.stop .ring{background:var(--ember-12);color:var(--ember)}
.toggle-big.stop .ring{background:var(--obsidian);border:1px solid var(--line-2);color:var(--ember)}
.toggle-big.stop .ts{color:var(--molten);opacity:1}
.totals{display:grid;grid-template-columns:repeat(4,minmax(0,1fr));gap:var(--s-3);background:var(--graphite);border:1px solid var(--line);border-radius:14px;padding:18px 20px;min-width:0}
.tot{display:flex;flex-direction:column;min-width:0;padding-left:var(--s-4);border-left:1px solid var(--line)}
@ -356,18 +357,14 @@ table{border-collapse:collapse;width:100%;font-size:var(--t-base)}
#s-jobs-history td{padding:6px 6px 6px 0;border-top:1px solid var(--line);vertical-align:top}
#s-jobs-history tr.failed td,#s-jobs-history tr.timeout td,#s-jobs-history tr.aborted td{color:var(--ember)}
#s-jobs-history tr.running td{color:var(--molten)}
.clock-card{border:1px solid var(--ember-40);background:var(--ember-12);border-radius:12px;padding:12px 14px;display:flex;flex-direction:column;gap:var(--s-2)}
.clock-card.warn{border-color:var(--molten-40);background:var(--molten-10)}
.clock-card{border:1px solid var(--line);background:var(--row);box-shadow:inset 0 1px 0 var(--ember);border-radius:12px;padding:12px 14px;display:flex;flex-direction:column;gap:var(--s-2)}
.clock-card.warn{box-shadow:inset 0 1px 0 var(--molten)}
.clock-msg{font-size:var(--t-md);color:var(--bone);line-height:1.45}
.clock-card .note{margin-top:0}
/* earnings: money first */
.money{display:flex;flex-direction:column;margin-bottom:var(--s-2)}
.money-row{display:flex;align-items:baseline;gap:var(--s-3);padding:8px 0;border-bottom:1px solid var(--line);flex-wrap:wrap}
.money-row:last-child{border-bottom:0}
.money-row .v{font-family:var(--head);font-weight:700;font-size:var(--t-hero);line-height:1.1;white-space:nowrap;letter-spacing:-.01em;min-width:200px}
.money-row .v.small{font-size:var(--t-num)}
.money-row .s{font-size:var(--t-base);color:var(--ash);min-width:0}
.money-row .v{font-family:var(--head);font-weight:700;letter-spacing:-.01em}
.money-row .s{color:var(--ash);min-width:0}
/* prove */
.tier-list{list-style:none;margin:var(--s-3) 0 0;padding:0;display:flex;flex-direction:column;gap:6px;font-size:var(--t-md);color:var(--ink-2)}
@ -379,7 +376,7 @@ table{border-collapse:collapse;width:100%;font-size:var(--t-base)}
.options{display:flex;flex-direction:column;gap:var(--s-3);margin-top:6px}
.option{display:flex;gap:var(--s-4);align-items:flex-start;background:var(--graphite);border:1px solid var(--line);border-radius:var(--card-r);padding:20px 22px;cursor:pointer;transition:border-color .15s ease,background .15s ease}
.option:hover{border-color:var(--line-2)}
.option.on{border-color:var(--ember);background:var(--ember-12)}
.option.on{border-color:var(--ember);background:var(--row)}
.option input[type=radio]{position:absolute;opacity:0;width:0;height:0}
.option .radio{width:20px;height:20px;border-radius:50%;border:2px solid var(--line-2);flex:0 0 20px;margin-top:2px;position:relative}
.option.on .radio{border-color:var(--ember)}
@ -513,8 +510,8 @@ body.drawer-drag main{pointer-events:none}
.log .src.app{color:var(--ember)}
.log .src.watch{color:var(--ash)}
.log .e,.log .e .src{color:var(--ember)}
.log .ln.hit{background:rgba(255,179,92,.18);box-shadow:inset 3px 0 0 var(--molten);margin:0 calc(-1 * var(--gutter));padding:0 var(--gutter)}
.log mark{background:rgba(255,179,92,.3);color:var(--bone);border-radius:2px;padding:0 1px}
.log .ln.hit{background:var(--hover);box-shadow:inset 3px 0 0 var(--molten);margin:0 calc(-1 * var(--gutter));padding:0 var(--gutter)}
.log mark{background:transparent;color:var(--bone);text-decoration:underline;text-decoration-color:var(--ember);text-underline-offset:2px}
.log-empty{position:absolute;inset:0;display:flex;align-items:center;justify-content:center;color:var(--ash);font-size:var(--t-sm);padding:0 var(--gutter);text-align:center}
.log-jump{position:absolute;right:calc(var(--gutter) + 14px);bottom:14px;background:var(--graphite);border-color:var(--molten-40);color:var(--molten);box-shadow:0 8px 24px var(--shadow);z-index:2;gap:6px;padding:6px 12px}
.log-jump:hover{border-color:var(--molten)}
@ -615,58 +612,41 @@ body.drawer-open .toast{bottom:calc(var(--drawer-h) + 16px)}
.toggle-big{min-height:96px}
}
/* variant A, quieter: fewer borders, type carries the hierarchy */
body[data-variant="a"] .card{border-color:transparent;padding:28px}
body[data-variant="a"] .card h3{font-size:20px}
body[data-variant="a"] .gpu-list{gap:0}
body[data-variant="a"] .gpu-line{border:0;border-radius:0;background:transparent;border-bottom:1px solid var(--line)}
body[data-variant="a"] .gpu-line:last-child{border-bottom:0}
body[data-variant="a"] .gl-main{padding:16px 0}
body[data-variant="a"] .gl-tune,body[data-variant="a"] .gl-details{border-top:0;padding-left:60px;padding-right:0;padding-top:0}
body[data-variant="a"] .gl-details{padding-bottom:16px}
body[data-variant="a"] .totals{border-color:transparent}
body[data-variant="a"] .toggle-big.stop{border-color:transparent}
body[data-variant="a"] .tot{border-left:0}
body[data-variant="a"] .num .v{font-size:22px}
body[data-variant="a"] .seg{border-color:transparent}
body[data-variant="a"] #dag{border:0}
/* variant B, denser: one line per card, numbers right-aligned in fixed tabular columns, a slim total bar */
body[data-variant="b"] .hero-row{grid-template-columns:auto 1fr;gap:var(--s-3)}
body[data-variant="b"] .toggle-big{min-height:64px;flex-direction:row;align-items:center;gap:14px;padding:12px 18px}
body[data-variant="b"] .toggle-big .ring{margin:0}
body[data-variant="b"] .toggle-big .ts{display:none}
body[data-variant="b"] .totals{padding:10px 20px;align-items:center}
body[data-variant="b"] .tot .v{font-size:22px}
body[data-variant="b"] .tot .k{display:inline;margin:0 0 0 6px}
body[data-variant="b"] .tot .s{margin-top:0}
body[data-variant="b"] .card{padding:16px 20px}
body[data-variant="b"] .card-head{margin-bottom:8px}
body[data-variant="b"] .gpu-list{gap:0;border:1px solid var(--line);border-radius:var(--row-r);overflow:hidden}
body[data-variant="b"] .gpu-line{border:0;border-radius:0;border-top:1px solid var(--line)}
body[data-variant="b"] .gpu-line:first-child{border-top:0}
body[data-variant="b"] .gl-main{padding:8px 12px;gap:var(--s-3);grid-template-columns:32px minmax(140px,1fr) auto auto}
body[data-variant="b"] .badge{width:32px;height:32px;flex-basis:32px;border-radius:8px;font-size:9px}
body[data-variant="b"] .gpu-line .name{font-size:var(--t-base)}
body[data-variant="b"] .gpu-line .msg{display:none}
body[data-variant="b"] .nums{gap:0;flex-wrap:nowrap}
body[data-variant="b"] .num{min-width:92px;padding-left:8px}
body[data-variant="b"] .num .v{font-size:16px;font-family:var(--mono);font-weight:500}
body[data-variant="b"] .num .k{font-size:9px}
body[data-variant="b"] .gl-tune{padding:0 12px 6px 56px;border-top:0;font-size:var(--t-xs)}
body[data-variant="b"] .gl-tune .bar{height:2px}
body[data-variant="b"] .gl-details{padding-left:56px}
body[data-variant="b"] #dag{height:72px}
body[data-variant="b"] .feed>div{padding:4px 0}
/* variant C, the hero number: the fleet total big, the button a bar under it, the cards below */
body[data-variant="c"] .hero-row{grid-template-columns:1fr}
body[data-variant="c"] .totals{order:1;grid-template-columns:2fr 1fr 1fr 1fr;align-items:end;padding:28px 28px 24px;border-color:transparent;background:linear-gradient(180deg,var(--graphite),var(--obsidian))}
body[data-variant="c"] .tot:first-child .v{font-size:84px;line-height:.95;letter-spacing:-.03em}
body[data-variant="c"] .tot:first-child .k{font-size:var(--t-sm);margin-top:10px}
body[data-variant="c"] .tot:first-child .s{font-size:var(--t-md)}
body[data-variant="c"] .tot .v{font-size:30px}
body[data-variant="c"] .tot{border-left:0}
body[data-variant="c"] .toggle-big{order:2;min-height:64px;flex-direction:row;align-items:center;gap:14px;padding:12px 20px}
body[data-variant="c"] .toggle-big .ring{margin:0}
body[data-variant="c"] .toggle-big .ts{margin-left:auto}
body[data-variant="c"] .gl-main{padding:10px 14px}
body[data-variant="c"] .num .v{font-size:18px}
/* the Mine hero (the project lead, 6 October 2026: "I love C"): the fleet rate big, the button a bar under it, the cards below */
.hero-row{grid-template-columns:1fr}
.totals{order:1;grid-template-columns:2fr 1fr 1fr 1fr;align-items:end;padding:28px 28px 24px;border-color:transparent;background:linear-gradient(180deg,var(--graphite),var(--obsidian))}
.tot{border-left:0;padding-left:0}
.tot:first-child .v{font-size:84px;line-height:.95;letter-spacing:-.03em}
.tot:first-child .k{font-size:var(--t-sm);margin-top:10px}
.tot:first-child .s{font-size:var(--t-md)}
.tot .v{font-size:30px}
.toggle-big{order:2;min-height:64px;flex-direction:row;align-items:center;gap:14px;padding:12px 20px}
.toggle-big .ring{margin:0}
.toggle-big .ts{margin-left:auto}
.gl-main{padding:10px 14px}
.num .v{font-size:18px}
/* Earnings in the same direction: the money figure big on the same fade, the other three beside it */
.money-hero{display:grid;grid-template-columns:2fr 1fr 1fr 1fr;align-items:end;gap:var(--s-4);margin:calc(-1 * var(--card-pad)) calc(-1 * var(--card-pad)) var(--s-3);padding:28px var(--card-pad) 24px;background:linear-gradient(180deg,var(--graphite),var(--obsidian));border-radius:var(--card-r) var(--card-r) 0 0}
.money-row{display:flex;flex-direction:column;align-items:flex-start;gap:4px;padding:0;border:0;min-width:0}
.money-row .v{font-size:28px;min-width:0;max-width:100%;line-height:1.1}
.money-row .v.small{font-size:28px}
.money-row:first-child .v{font-size:84px;line-height:.95;letter-spacing:-.03em}
.money-row:first-child .s{font-size:var(--t-md)}
.money-row .s{font-size:var(--t-sm)}
#page-earnings .card:first-child{overflow:hidden}
@media (max-width:1180px){
.totals{grid-template-columns:1fr 1fr 1fr 1fr}
.tot:first-child .v{font-size:64px}
.money-hero{grid-template-columns:1fr 1fr 1fr 1fr}
.money-row:first-child .v{font-size:64px}
}
@media (max-width:860px){
.totals,.money-hero{grid-template-columns:1fr 1fr;row-gap:var(--s-4)}
.tot:first-child,.money-row:first-child{grid-column:1 / -1}
.tot:nth-child(3){padding-left:0}
}
@media (max-width:720px){
.tot:first-child .v,.money-row:first-child .v{font-size:56px}
.toggle-big .ts{display:none}
.money-hero{padding:20px var(--s-4) 16px}
}

View file

@ -707,7 +707,6 @@ if (typeof document !== 'undefined') (function () {
var forcedUpdate = params.get('update'); // a sample update state for screenshots: available|downloading|ready|waiting|applying|urgent|manual|error|updated
var forcedJob = params.get('job'); // a sample remote job for screenshots: running|done|failed
if (params.get('host') === 'mac') document.body.classList.add('mac');
if (params.get('variant')) document.body.dataset.variant = params.get('variant'); // ?variant=a|b|c: the Mine layouts of the 6 October polish round
// ?debug=1 prints a budget line every 5 s (ms of JS per second in the canvas, the state render and the log) and
// exposes the counters as window.__igneumPerf
var debug = params.get('debug') === '1';
@ -1480,11 +1479,11 @@ if (typeof document !== 'undefined') (function () {
function renderEarnings(s) {
var a = s.address || {}, m = s.mining, pv = s.proving || {}, price = priceNow();
var ign = pv.paid_wei && Number(pv.paid_wei) ? (Number(pv.paid_wei) / 1e18).toFixed(4) : '0.0000';
setText('e-ign', ign + ' IGN'); setText('e-ign-sub', 'from ' + (pv.paid || 0) + ' proof' + (pv.paid === 1 ? '' : 's') + (pv.segments_paid ? ' and ' + pv.segments_paid + ' segment' + (pv.segments_paid === 1 ? '' : 's') : ''));
setText('e-blocks', withCommas(m.accepted_total) + ' block' + (m.accepted_total === 1 ? '' : 's')); setText('e-blocks-sub', 'lifetime · ' + withCommas(m.accepted_session) + ' this run, ' + uptime(s.uptime_s));
setText('e-ign', ign); setText('e-ign-sub', 'IGN from ' + (pv.paid || 0) + ' proof' + (pv.paid === 1 ? '' : 's') + (pv.segments_paid ? ' and ' + pv.segments_paid + ' segment' + (pv.segments_paid === 1 ? '' : 's') : ''));
setText('e-blocks', withCommas(m.accepted_total)); setText('e-blocks-sub', 'block' + (m.accepted_total === 1 ? '' : 's') + ' lifetime · ' + withCommas(m.accepted_session) + ' this run');
var watts = View.wattsTotal(m.cards), ppd = View.poundsPerDay(watts, price);
setText('e-cost', ppd === null ? (watts > 0 ? Math.round(watts) + ' W' : 'no draw') : money(ppd) + ' a day');
setText('e-cost-sub', ppd === null ? (watts > 0 ? 'electricity: set a price to see the cost' : 'electricity: no card reports its draw') : 'electricity at ' + price + 'p/kWh for ' + Math.round(watts) + ' W');
setText('e-cost', ppd === null ? (watts > 0 ? Math.round(watts) + ' W' : 'no draw') : money(ppd));
setText('e-cost-sub', ppd === null ? (watts > 0 ? 'electricity: set a price for the cost' : 'electricity: no card reports its draw') : 'a day in electricity at ' + price + 'p/kWh, ' + Math.round(watts) + ' W');
setHidden('e-price-btn', !(watts > 0 && ppd === null));
if (document.activeElement !== $('s-devfee')) $('s-devfee').checked = !!(s.settings && s.settings.dev_fee);
setText('s-devfee-text', s.settings.dev_fee ? 'Dev fee: 1 block in 100 pays the miner software’s author' : 'Dev fee off: every block pays your address');

View file

@ -48,6 +48,7 @@
<!-- the status strip: one notice at a time (app.js, Notices) -->
<div class="notices" id="notices" hidden>
<div class="notice" id="notice" role="status" aria-live="polite">
<i class="notice-dot" aria-hidden="true"></i>
<span class="notice-text" id="notice-text"></span>
<span class="notice-actions" id="notice-actions"></span>
<button class="notice-more" id="notice-more" data-act="more" title="The technical line" aria-label="Show the technical line" aria-expanded="false" hidden><span class="chev"></span></button>
@ -247,7 +248,7 @@
<!-- Earnings -->
<section class="page" id="page-earnings" data-page="earnings" hidden>
<div class="card">
<div class="money">
<div class="money-hero">
<div class="money-row"><span class="v" id="e-earned">£0.00</span><span class="s" id="e-earned-sub">earned: nothing is bought or sold on devnet</span></div>
<div class="money-row"><span class="v small" id="e-ign">0.0000 IGN</span><span class="s" id="e-ign-sub">from 0 proofs</span></div>
<div class="money-row"><span class="v small" id="e-blocks">0 blocks</span><span class="s" id="e-blocks-sub">lifetime</span></div>

View file

@ -292,3 +292,19 @@ re-read the manifest and install now (...) done after 0 min. Report uploaded." B
Screenshots: `p01-mine-variant-a-quieter.png`, `p02-mine-variant-b-denser.png`, `p03-mine-variant-c-hero.png` (full
page, the rig at 28p/kWh, the 5090 tuned), `p04`/`p05` the plain job strip closed and open, `p06` the updated strip,
`p07` the header paused, `p08` the activity feed, `p09`/`p12` light, `p10`/`p11` 390 px. Tests: 36 pass.
## 15. the project lead's pick and the strip's look (6 October 2026, evening)
the project lead: "I love C". C is the default: the fleet rate at 84 px on a graphite-to-obsidian fade with W, £ a day and blocks
beside it, Start/Stop as a full-width bar under it, the cards below. Earnings carries the same shape: the £ figure big
on the same fade, IGN, blocks and the electricity £ a day beside it. The `?variant=` switch is gone.
The strip's look (the project lead: the brown and amber band read off-brand): every strip, ask and clock card is one component
on the brand tokens: the row surface (one step lighter than the page), a 1 px ember hairline along the top, ash text,
ember only on the state dot and the chevron. No filled brown or mustard field anywhere: `.nav.on`, `.pill.on`,
`.btn.ghost.on`, `.option.on`, `.toggle-big.stop .ring`, `.clock-card`, `.ask`, the log's search hit and `mark` lost
their tints (the only remaining tint is `::selection`). The update strip and the job strip share the one `.notice`.
Screenshots: `q01-mine-strip-dark.png`, `q02-mine-strip-light.png` (the job strip over the C hero), `q03` the strip
open, `q04` the update strip, `q05`/`q06` Earnings dark and light, `q07` the Mac paused (the ember Start bar),
`q08`/`q09` 390 px, `q10` the quit ask, `q11` the clock card. Tests: 36 pass.

Binary file not shown.

After

Width:  |  Height:  |  Size: 277 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 281 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 265 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 214 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 205 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 208 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 214 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 129 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 153 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 236 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 221 KiB