Merge site-ui-5 40ea28ae into master (gate: green on 40ea28ae, recorded by tools/ci/pre-push.sh; the full gate runs in CI on this merge)
|
Before Width: | Height: | Size: 1.1 MiB After Width: | Height: | Size: 1.1 MiB |
|
Before Width: | Height: | Size: 586 KiB After Width: | Height: | Size: 586 KiB |
BIN
docs/plans/site-ui-5-shots/home-pending__375-dark.png
Normal file
|
After Width: | Height: | Size: 267 KiB |
BIN
docs/plans/site-ui-5-shots/home-sheet-open__390-dark.png
Normal file
|
After Width: | Height: | Size: 82 KiB |
|
Before Width: | Height: | Size: 1.2 MiB After Width: | Height: | Size: 844 KiB |
|
Before Width: | Height: | Size: 558 KiB After Width: | Height: | Size: 558 KiB |
|
Before Width: | Height: | Size: 547 KiB After Width: | Height: | Size: 414 KiB |
|
Before Width: | Height: | Size: 455 KiB After Width: | Height: | Size: 378 KiB |
|
Before Width: | Height: | Size: 677 KiB After Width: | Height: | Size: 571 KiB |
|
Before Width: | Height: | Size: 477 KiB After Width: | Height: | Size: 402 KiB |
|
Before Width: | Height: | Size: 571 KiB After Width: | Height: | Size: 676 KiB |
|
Before Width: | Height: | Size: 427 KiB After Width: | Height: | Size: 429 KiB |
|
|
@ -31,8 +31,8 @@
|
|||
@font-face{font-family:'Plex Mono Fallback';src:local('Courier New'),local('Menlo');size-adjust:100%;ascent-override:102.5%;descent-override:27.5%;line-gap-override:0%}
|
||||
</style>
|
||||
<script>
|
||||
/* theme before first paint: ?theme=light|dark for one view (the capture tool), else the stored choice under igneum-theme, else the system setting */
|
||||
(function(){var t=null;try{t=new URLSearchParams(location.search).get("theme");}catch(e){}if(t!=="light"&&t!=="dark"){try{t=localStorage.getItem("igneum-theme");}catch(e){t=null;}}if(t!=="light"&&t!=="dark")t=window.matchMedia&&window.matchMedia("(prefers-color-scheme: light)").matches?"light":"dark";document.documentElement.setAttribute("data-theme",t);})();
|
||||
/* theme before first paint: ?theme=light|dark for one view (the capture tool), else the stored choice under igneum-theme, else the system setting; ?motion=off marks the page data-motion=off so every .reveal is drawn at once (a headless render never scrolls) */
|
||||
(function(){var t=null;try{t=new URLSearchParams(location.search).get("theme");}catch(e){}if(t!=="light"&&t!=="dark"){try{t=localStorage.getItem("igneum-theme");}catch(e){t=null;}}if(t!=="light"&&t!=="dark")t=window.matchMedia&&window.matchMedia("(prefers-color-scheme: light)").matches?"light":"dark";document.documentElement.setAttribute("data-theme",t);try{if(new URLSearchParams(location.search).get("motion")==="off")document.documentElement.setAttribute("data-motion","off");}catch(e){}})();
|
||||
</script>
|
||||
<!-- head:end -->
|
||||
<style>
|
||||
|
|
|
|||
|
|
@ -47,8 +47,8 @@
|
|||
@font-face{font-family:'Plex Mono Fallback';src:local('Courier New'),local('Menlo');size-adjust:100%;ascent-override:102.5%;descent-override:27.5%;line-gap-override:0%}
|
||||
</style>
|
||||
<script>
|
||||
/* theme before first paint: ?theme=light|dark for one view (the capture tool), else the stored choice under igneum-theme, else the system setting */
|
||||
(function(){var t=null;try{t=new URLSearchParams(location.search).get("theme");}catch(e){}if(t!=="light"&&t!=="dark"){try{t=localStorage.getItem("igneum-theme");}catch(e){t=null;}}if(t!=="light"&&t!=="dark")t=window.matchMedia&&window.matchMedia("(prefers-color-scheme: light)").matches?"light":"dark";document.documentElement.setAttribute("data-theme",t);})();
|
||||
/* theme before first paint: ?theme=light|dark for one view (the capture tool), else the stored choice under igneum-theme, else the system setting; ?motion=off marks the page data-motion=off so every .reveal is drawn at once (a headless render never scrolls) */
|
||||
(function(){var t=null;try{t=new URLSearchParams(location.search).get("theme");}catch(e){}if(t!=="light"&&t!=="dark"){try{t=localStorage.getItem("igneum-theme");}catch(e){t=null;}}if(t!=="light"&&t!=="dark")t=window.matchMedia&&window.matchMedia("(prefers-color-scheme: light)").matches?"light":"dark";document.documentElement.setAttribute("data-theme",t);try{if(new URLSearchParams(location.search).get("motion")==="off")document.documentElement.setAttribute("data-motion","off");}catch(e){}})();
|
||||
</script>
|
||||
<!-- head:end -->
|
||||
<style>
|
||||
|
|
|
|||
|
|
@ -49,8 +49,8 @@
|
|||
@font-face{font-family:'Plex Mono Fallback';src:local('Courier New'),local('Menlo');size-adjust:100%;ascent-override:102.5%;descent-override:27.5%;line-gap-override:0%}
|
||||
</style>
|
||||
<script>
|
||||
/* theme before first paint: ?theme=light|dark for one view (the capture tool), else the stored choice under igneum-theme, else the system setting */
|
||||
(function(){var t=null;try{t=new URLSearchParams(location.search).get("theme");}catch(e){}if(t!=="light"&&t!=="dark"){try{t=localStorage.getItem("igneum-theme");}catch(e){t=null;}}if(t!=="light"&&t!=="dark")t=window.matchMedia&&window.matchMedia("(prefers-color-scheme: light)").matches?"light":"dark";document.documentElement.setAttribute("data-theme",t);})();
|
||||
/* theme before first paint: ?theme=light|dark for one view (the capture tool), else the stored choice under igneum-theme, else the system setting; ?motion=off marks the page data-motion=off so every .reveal is drawn at once (a headless render never scrolls) */
|
||||
(function(){var t=null;try{t=new URLSearchParams(location.search).get("theme");}catch(e){}if(t!=="light"&&t!=="dark"){try{t=localStorage.getItem("igneum-theme");}catch(e){t=null;}}if(t!=="light"&&t!=="dark")t=window.matchMedia&&window.matchMedia("(prefers-color-scheme: light)").matches?"light":"dark";document.documentElement.setAttribute("data-theme",t);try{if(new URLSearchParams(location.search).get("motion")==="off")document.documentElement.setAttribute("data-motion","off");}catch(e){}})();
|
||||
</script>
|
||||
<!-- head:end -->
|
||||
<style>
|
||||
|
|
|
|||
|
|
@ -49,8 +49,8 @@
|
|||
@font-face{font-family:'Plex Mono Fallback';src:local('Courier New'),local('Menlo');size-adjust:100%;ascent-override:102.5%;descent-override:27.5%;line-gap-override:0%}
|
||||
</style>
|
||||
<script>
|
||||
/* theme before first paint: ?theme=light|dark for one view (the capture tool), else the stored choice under igneum-theme, else the system setting */
|
||||
(function(){var t=null;try{t=new URLSearchParams(location.search).get("theme");}catch(e){}if(t!=="light"&&t!=="dark"){try{t=localStorage.getItem("igneum-theme");}catch(e){t=null;}}if(t!=="light"&&t!=="dark")t=window.matchMedia&&window.matchMedia("(prefers-color-scheme: light)").matches?"light":"dark";document.documentElement.setAttribute("data-theme",t);})();
|
||||
/* theme before first paint: ?theme=light|dark for one view (the capture tool), else the stored choice under igneum-theme, else the system setting; ?motion=off marks the page data-motion=off so every .reveal is drawn at once (a headless render never scrolls) */
|
||||
(function(){var t=null;try{t=new URLSearchParams(location.search).get("theme");}catch(e){}if(t!=="light"&&t!=="dark"){try{t=localStorage.getItem("igneum-theme");}catch(e){t=null;}}if(t!=="light"&&t!=="dark")t=window.matchMedia&&window.matchMedia("(prefers-color-scheme: light)").matches?"light":"dark";document.documentElement.setAttribute("data-theme",t);try{if(new URLSearchParams(location.search).get("motion")==="off")document.documentElement.setAttribute("data-motion","off");}catch(e){}})();
|
||||
</script>
|
||||
<!-- head:end -->
|
||||
<style>
|
||||
|
|
|
|||
|
|
@ -47,8 +47,8 @@
|
|||
@font-face{font-family:'Plex Mono Fallback';src:local('Courier New'),local('Menlo');size-adjust:100%;ascent-override:102.5%;descent-override:27.5%;line-gap-override:0%}
|
||||
</style>
|
||||
<script>
|
||||
/* theme before first paint: ?theme=light|dark for one view (the capture tool), else the stored choice under igneum-theme, else the system setting */
|
||||
(function(){var t=null;try{t=new URLSearchParams(location.search).get("theme");}catch(e){}if(t!=="light"&&t!=="dark"){try{t=localStorage.getItem("igneum-theme");}catch(e){t=null;}}if(t!=="light"&&t!=="dark")t=window.matchMedia&&window.matchMedia("(prefers-color-scheme: light)").matches?"light":"dark";document.documentElement.setAttribute("data-theme",t);})();
|
||||
/* theme before first paint: ?theme=light|dark for one view (the capture tool), else the stored choice under igneum-theme, else the system setting; ?motion=off marks the page data-motion=off so every .reveal is drawn at once (a headless render never scrolls) */
|
||||
(function(){var t=null;try{t=new URLSearchParams(location.search).get("theme");}catch(e){}if(t!=="light"&&t!=="dark"){try{t=localStorage.getItem("igneum-theme");}catch(e){t=null;}}if(t!=="light"&&t!=="dark")t=window.matchMedia&&window.matchMedia("(prefers-color-scheme: light)").matches?"light":"dark";document.documentElement.setAttribute("data-theme",t);try{if(new URLSearchParams(location.search).get("motion")==="off")document.documentElement.setAttribute("data-motion","off");}catch(e){}})();
|
||||
</script>
|
||||
<!-- head:end -->
|
||||
<style>
|
||||
|
|
|
|||
|
|
@ -49,8 +49,8 @@
|
|||
@font-face{font-family:'Plex Mono Fallback';src:local('Courier New'),local('Menlo');size-adjust:100%;ascent-override:102.5%;descent-override:27.5%;line-gap-override:0%}
|
||||
</style>
|
||||
<script>
|
||||
/* theme before first paint: ?theme=light|dark for one view (the capture tool), else the stored choice under igneum-theme, else the system setting */
|
||||
(function(){var t=null;try{t=new URLSearchParams(location.search).get("theme");}catch(e){}if(t!=="light"&&t!=="dark"){try{t=localStorage.getItem("igneum-theme");}catch(e){t=null;}}if(t!=="light"&&t!=="dark")t=window.matchMedia&&window.matchMedia("(prefers-color-scheme: light)").matches?"light":"dark";document.documentElement.setAttribute("data-theme",t);})();
|
||||
/* theme before first paint: ?theme=light|dark for one view (the capture tool), else the stored choice under igneum-theme, else the system setting; ?motion=off marks the page data-motion=off so every .reveal is drawn at once (a headless render never scrolls) */
|
||||
(function(){var t=null;try{t=new URLSearchParams(location.search).get("theme");}catch(e){}if(t!=="light"&&t!=="dark"){try{t=localStorage.getItem("igneum-theme");}catch(e){t=null;}}if(t!=="light"&&t!=="dark")t=window.matchMedia&&window.matchMedia("(prefers-color-scheme: light)").matches?"light":"dark";document.documentElement.setAttribute("data-theme",t);try{if(new URLSearchParams(location.search).get("motion")==="off")document.documentElement.setAttribute("data-motion","off");}catch(e){}})();
|
||||
</script>
|
||||
<!-- head:end -->
|
||||
<style>
|
||||
|
|
|
|||
|
|
@ -49,8 +49,8 @@
|
|||
@font-face{font-family:'Plex Mono Fallback';src:local('Courier New'),local('Menlo');size-adjust:100%;ascent-override:102.5%;descent-override:27.5%;line-gap-override:0%}
|
||||
</style>
|
||||
<script>
|
||||
/* theme before first paint: ?theme=light|dark for one view (the capture tool), else the stored choice under igneum-theme, else the system setting */
|
||||
(function(){var t=null;try{t=new URLSearchParams(location.search).get("theme");}catch(e){}if(t!=="light"&&t!=="dark"){try{t=localStorage.getItem("igneum-theme");}catch(e){t=null;}}if(t!=="light"&&t!=="dark")t=window.matchMedia&&window.matchMedia("(prefers-color-scheme: light)").matches?"light":"dark";document.documentElement.setAttribute("data-theme",t);})();
|
||||
/* theme before first paint: ?theme=light|dark for one view (the capture tool), else the stored choice under igneum-theme, else the system setting; ?motion=off marks the page data-motion=off so every .reveal is drawn at once (a headless render never scrolls) */
|
||||
(function(){var t=null;try{t=new URLSearchParams(location.search).get("theme");}catch(e){}if(t!=="light"&&t!=="dark"){try{t=localStorage.getItem("igneum-theme");}catch(e){t=null;}}if(t!=="light"&&t!=="dark")t=window.matchMedia&&window.matchMedia("(prefers-color-scheme: light)").matches?"light":"dark";document.documentElement.setAttribute("data-theme",t);try{if(new URLSearchParams(location.search).get("motion")==="off")document.documentElement.setAttribute("data-motion","off");}catch(e){}})();
|
||||
</script>
|
||||
<!-- head:end -->
|
||||
<style>
|
||||
|
|
|
|||
|
|
@ -49,8 +49,8 @@
|
|||
@font-face{font-family:'Plex Mono Fallback';src:local('Courier New'),local('Menlo');size-adjust:100%;ascent-override:102.5%;descent-override:27.5%;line-gap-override:0%}
|
||||
</style>
|
||||
<script>
|
||||
/* theme before first paint: ?theme=light|dark for one view (the capture tool), else the stored choice under igneum-theme, else the system setting */
|
||||
(function(){var t=null;try{t=new URLSearchParams(location.search).get("theme");}catch(e){}if(t!=="light"&&t!=="dark"){try{t=localStorage.getItem("igneum-theme");}catch(e){t=null;}}if(t!=="light"&&t!=="dark")t=window.matchMedia&&window.matchMedia("(prefers-color-scheme: light)").matches?"light":"dark";document.documentElement.setAttribute("data-theme",t);})();
|
||||
/* theme before first paint: ?theme=light|dark for one view (the capture tool), else the stored choice under igneum-theme, else the system setting; ?motion=off marks the page data-motion=off so every .reveal is drawn at once (a headless render never scrolls) */
|
||||
(function(){var t=null;try{t=new URLSearchParams(location.search).get("theme");}catch(e){}if(t!=="light"&&t!=="dark"){try{t=localStorage.getItem("igneum-theme");}catch(e){t=null;}}if(t!=="light"&&t!=="dark")t=window.matchMedia&&window.matchMedia("(prefers-color-scheme: light)").matches?"light":"dark";document.documentElement.setAttribute("data-theme",t);try{if(new URLSearchParams(location.search).get("motion")==="off")document.documentElement.setAttribute("data-motion","off");}catch(e){}})();
|
||||
</script>
|
||||
<!-- head:end -->
|
||||
<style>
|
||||
|
|
|
|||
|
|
@ -49,8 +49,8 @@
|
|||
@font-face{font-family:'Plex Mono Fallback';src:local('Courier New'),local('Menlo');size-adjust:100%;ascent-override:102.5%;descent-override:27.5%;line-gap-override:0%}
|
||||
</style>
|
||||
<script>
|
||||
/* theme before first paint: ?theme=light|dark for one view (the capture tool), else the stored choice under igneum-theme, else the system setting */
|
||||
(function(){var t=null;try{t=new URLSearchParams(location.search).get("theme");}catch(e){}if(t!=="light"&&t!=="dark"){try{t=localStorage.getItem("igneum-theme");}catch(e){t=null;}}if(t!=="light"&&t!=="dark")t=window.matchMedia&&window.matchMedia("(prefers-color-scheme: light)").matches?"light":"dark";document.documentElement.setAttribute("data-theme",t);})();
|
||||
/* theme before first paint: ?theme=light|dark for one view (the capture tool), else the stored choice under igneum-theme, else the system setting; ?motion=off marks the page data-motion=off so every .reveal is drawn at once (a headless render never scrolls) */
|
||||
(function(){var t=null;try{t=new URLSearchParams(location.search).get("theme");}catch(e){}if(t!=="light"&&t!=="dark"){try{t=localStorage.getItem("igneum-theme");}catch(e){t=null;}}if(t!=="light"&&t!=="dark")t=window.matchMedia&&window.matchMedia("(prefers-color-scheme: light)").matches?"light":"dark";document.documentElement.setAttribute("data-theme",t);try{if(new URLSearchParams(location.search).get("motion")==="off")document.documentElement.setAttribute("data-motion","off");}catch(e){}})();
|
||||
</script>
|
||||
<!-- head:end -->
|
||||
<style>
|
||||
|
|
|
|||
|
|
@ -46,8 +46,8 @@
|
|||
@font-face{font-family:'Plex Mono Fallback';src:local('Courier New'),local('Menlo');size-adjust:100%;ascent-override:102.5%;descent-override:27.5%;line-gap-override:0%}
|
||||
</style>
|
||||
<script>
|
||||
/* theme before first paint: ?theme=light|dark for one view (the capture tool), else the stored choice under igneum-theme, else the system setting */
|
||||
(function(){var t=null;try{t=new URLSearchParams(location.search).get("theme");}catch(e){}if(t!=="light"&&t!=="dark"){try{t=localStorage.getItem("igneum-theme");}catch(e){t=null;}}if(t!=="light"&&t!=="dark")t=window.matchMedia&&window.matchMedia("(prefers-color-scheme: light)").matches?"light":"dark";document.documentElement.setAttribute("data-theme",t);})();
|
||||
/* theme before first paint: ?theme=light|dark for one view (the capture tool), else the stored choice under igneum-theme, else the system setting; ?motion=off marks the page data-motion=off so every .reveal is drawn at once (a headless render never scrolls) */
|
||||
(function(){var t=null;try{t=new URLSearchParams(location.search).get("theme");}catch(e){}if(t!=="light"&&t!=="dark"){try{t=localStorage.getItem("igneum-theme");}catch(e){t=null;}}if(t!=="light"&&t!=="dark")t=window.matchMedia&&window.matchMedia("(prefers-color-scheme: light)").matches?"light":"dark";document.documentElement.setAttribute("data-theme",t);try{if(new URLSearchParams(location.search).get("motion")==="off")document.documentElement.setAttribute("data-motion","off");}catch(e){}})();
|
||||
</script>
|
||||
<!-- head:end -->
|
||||
<style>
|
||||
|
|
|
|||
|
|
@ -45,8 +45,8 @@
|
|||
@font-face{font-family:'Plex Mono Fallback';src:local('Courier New'),local('Menlo');size-adjust:100%;ascent-override:102.5%;descent-override:27.5%;line-gap-override:0%}
|
||||
</style>
|
||||
<script>
|
||||
/* theme before first paint: ?theme=light|dark for one view (the capture tool), else the stored choice under igneum-theme, else the system setting */
|
||||
(function(){var t=null;try{t=new URLSearchParams(location.search).get("theme");}catch(e){}if(t!=="light"&&t!=="dark"){try{t=localStorage.getItem("igneum-theme");}catch(e){t=null;}}if(t!=="light"&&t!=="dark")t=window.matchMedia&&window.matchMedia("(prefers-color-scheme: light)").matches?"light":"dark";document.documentElement.setAttribute("data-theme",t);})();
|
||||
/* theme before first paint: ?theme=light|dark for one view (the capture tool), else the stored choice under igneum-theme, else the system setting; ?motion=off marks the page data-motion=off so every .reveal is drawn at once (a headless render never scrolls) */
|
||||
(function(){var t=null;try{t=new URLSearchParams(location.search).get("theme");}catch(e){}if(t!=="light"&&t!=="dark"){try{t=localStorage.getItem("igneum-theme");}catch(e){t=null;}}if(t!=="light"&&t!=="dark")t=window.matchMedia&&window.matchMedia("(prefers-color-scheme: light)").matches?"light":"dark";document.documentElement.setAttribute("data-theme",t);try{if(new URLSearchParams(location.search).get("motion")==="off")document.documentElement.setAttribute("data-motion","off");}catch(e){}})();
|
||||
</script>
|
||||
<!-- head:end -->
|
||||
<style>
|
||||
|
|
|
|||
|
|
@ -51,8 +51,8 @@
|
|||
@font-face{font-family:'Plex Mono Fallback';src:local('Courier New'),local('Menlo');size-adjust:100%;ascent-override:102.5%;descent-override:27.5%;line-gap-override:0%}
|
||||
</style>
|
||||
<script>
|
||||
/* theme before first paint: ?theme=light|dark for one view (the capture tool), else the stored choice under igneum-theme, else the system setting */
|
||||
(function(){var t=null;try{t=new URLSearchParams(location.search).get("theme");}catch(e){}if(t!=="light"&&t!=="dark"){try{t=localStorage.getItem("igneum-theme");}catch(e){t=null;}}if(t!=="light"&&t!=="dark")t=window.matchMedia&&window.matchMedia("(prefers-color-scheme: light)").matches?"light":"dark";document.documentElement.setAttribute("data-theme",t);})();
|
||||
/* theme before first paint: ?theme=light|dark for one view (the capture tool), else the stored choice under igneum-theme, else the system setting; ?motion=off marks the page data-motion=off so every .reveal is drawn at once (a headless render never scrolls) */
|
||||
(function(){var t=null;try{t=new URLSearchParams(location.search).get("theme");}catch(e){}if(t!=="light"&&t!=="dark"){try{t=localStorage.getItem("igneum-theme");}catch(e){t=null;}}if(t!=="light"&&t!=="dark")t=window.matchMedia&&window.matchMedia("(prefers-color-scheme: light)").matches?"light":"dark";document.documentElement.setAttribute("data-theme",t);try{if(new URLSearchParams(location.search).get("motion")==="off")document.documentElement.setAttribute("data-motion","off");}catch(e){}})();
|
||||
</script>
|
||||
<!-- head:end -->
|
||||
<style>
|
||||
|
|
@ -198,7 +198,7 @@
|
|||
<!-- nav:end -->
|
||||
|
||||
<main id="main">
|
||||
<section class="fold" aria-label="Igneum">
|
||||
<section class="fold pending" id="fold" aria-label="Igneum">
|
||||
<div class="fold-scene" aria-hidden="true"><canvas id="dag" aria-label="The live devnet's block graph, one lane per miner, drawn from the observer"></canvas><div class="tip" id="dag-tip" hidden></div></div>
|
||||
<div class="fold-body">
|
||||
<div class="fold-coin"><span class="fold-glow"></span><svg viewBox="0 0 1024 1024" aria-hidden="true"><rect width="1024" height="1024" rx="230" fill="#0C0C0E"></rect><g transform="translate(166.95 166.95) scale(6.901)"><polygon points="50,4 74,34 67,58 80,54 61,96 39,96 20,54 33,58 26,34" fill="#F2541B"></polygon><polygon points="50,42 59,58 50,82 41,58" fill="#0C0C0E"></polygon></g></svg></div>
|
||||
|
|
@ -332,7 +332,7 @@ document.addEventListener('DOMContentLoaded',function(){
|
|||
var fmtN=function(v){return v===null||v===undefined?'pending':Number(v).toLocaleString('en-GB');};
|
||||
function fmtHash(h){if(h===null||h===undefined||!(h>0))return 'pending';return h>=1e9?(h/1e9).toFixed(1)+' GH/s':(h/1e6).toFixed(1)+' MH/s';}
|
||||
var st=document.getElementById('dag-state');
|
||||
function onState(s,r){if(!st)return;st.className='pill fold-state'+(s==='live'?' warm':'');st.innerHTML='<span class="dot"></span>'+(s==='live'?'live devnet':s==='connecting'?'connecting':(r||s));}
|
||||
function onState(s,r){var f=document.getElementById('fold');if(f)f.classList.toggle('pending',s!=='live'&&s!=='stale');if(!st)return;st.className='pill fold-state'+(s==='live'?' warm':'');st.innerHTML='<span class="dot"></span>'+(s==='live'?'live devnet':s==='connecting'?'connecting':(r||s));}
|
||||
function onData(d){var s=d.state||{},fn=d.finality;
|
||||
document.getElementById('f-hash').textContent=fmtHash(s.hashes_per_second_estimate);
|
||||
document.getElementById('f-keys').textContent=fmtN(s.miners_10m!==null&&s.miners_10m!==undefined?s.miners_10m:(d.miners||[]).length);
|
||||
|
|
@ -344,7 +344,8 @@ document.addEventListener('DOMContentLoaded',function(){
|
|||
else{lock.textContent='pending';}
|
||||
var note=document.getElementById('facts-note');note.textContent='One node is read every 2 s.'+(d.proving&&d.proving.active&&d.proving.median_proof_lag_s?' Proofs land a median '+Math.round(d.proving.median_proof_lag_s)+' s behind the tip.':'');}
|
||||
var c=document.getElementById('dag'),dag=null;
|
||||
if(c&&window.IgneumFeed&&window.IgneumDag){dag=IgneumDag.mount(c,{poll:false,window:60,fps:60,tooltip:document.getElementById('dag-tip'),onState:onState});
|
||||
var feedOff=false;try{feedOff=new URLSearchParams(location.search).get('feed')==='off';}catch(e){}
|
||||
if(c&&window.IgneumFeed&&window.IgneumDag&&!feedOff){dag=IgneumDag.mount(c,{poll:false,window:60,fps:60,tooltip:document.getElementById('dag-tip'),onState:onState});
|
||||
IgneumFeed.start({window:300,subs:[dag],onState:onState,onData:onData});}
|
||||
});
|
||||
</script>
|
||||
|
|
|
|||
|
|
@ -49,8 +49,8 @@
|
|||
@font-face{font-family:'Plex Mono Fallback';src:local('Courier New'),local('Menlo');size-adjust:100%;ascent-override:102.5%;descent-override:27.5%;line-gap-override:0%}
|
||||
</style>
|
||||
<script>
|
||||
/* theme before first paint: ?theme=light|dark for one view (the capture tool), else the stored choice under igneum-theme, else the system setting */
|
||||
(function(){var t=null;try{t=new URLSearchParams(location.search).get("theme");}catch(e){}if(t!=="light"&&t!=="dark"){try{t=localStorage.getItem("igneum-theme");}catch(e){t=null;}}if(t!=="light"&&t!=="dark")t=window.matchMedia&&window.matchMedia("(prefers-color-scheme: light)").matches?"light":"dark";document.documentElement.setAttribute("data-theme",t);})();
|
||||
/* theme before first paint: ?theme=light|dark for one view (the capture tool), else the stored choice under igneum-theme, else the system setting; ?motion=off marks the page data-motion=off so every .reveal is drawn at once (a headless render never scrolls) */
|
||||
(function(){var t=null;try{t=new URLSearchParams(location.search).get("theme");}catch(e){}if(t!=="light"&&t!=="dark"){try{t=localStorage.getItem("igneum-theme");}catch(e){t=null;}}if(t!=="light"&&t!=="dark")t=window.matchMedia&&window.matchMedia("(prefers-color-scheme: light)").matches?"light":"dark";document.documentElement.setAttribute("data-theme",t);try{if(new URLSearchParams(location.search).get("motion")==="off")document.documentElement.setAttribute("data-motion","off");}catch(e){}})();
|
||||
</script>
|
||||
<!-- head:end -->
|
||||
<style>
|
||||
|
|
@ -254,14 +254,14 @@
|
|||
<article class="record"><div class="record-top"><time datetime="2026-10-05">5 Oct 2026</time><span class="badge">log</span></div><h3>Live devnet: real transactions, the first non-empty shard proven and…</h3><p>Live devnet: real transactions, the first non-empty shard proven and paid, and the exporter's block structure fixed</p></article>
|
||||
<article class="record"><div class="record-top"><time datetime="2026-10-05">5 Oct 2026</time><span class="badge">log</span></div><h3>The program id split</h3><p>The program id split: why the Apple M5 Max rejected the RTX 5090 Windows rig's proofs, and the verifier at 114 s</p></article>
|
||||
<article class="record"><div class="record-top"><time datetime="2026-10-05">5 Oct 2026</time><span class="badge">log</span></div><h3>Live devnet: the first shards proven, verified and paid</h3></article>
|
||||
<article class="record"><div class="record-top"><time datetime="2026-10-04">4 Oct 2026</time><span class="badge">log</span></div><h3>Economy simulation: mining versus proving under stress</h3><p>Sim/economy: mining versus proving under stress, agent-based</p></article>
|
||||
<article class="record"><div class="record-top"><time datetime="2026-10-04">4 Oct 2026</time><span class="badge">log</span></div><h3>Difficulty rule attacked seven ways</h3><p>Difficulty rule under attack: pool hopping, pulsed rental, timestamp stretching, short-lane oscillation, epoch games, polluted window, block flood</p></article>
|
||||
<article class="record"><div class="record-top"><time datetime="2026-10-04">4 Oct 2026</time><span class="badge">log</span></div><h3>Timestamp attack on the difficulty rule fixed</h3><p>Difficulty rule: timestamp attack fixed , simulator regression, 3-node forger test</p></article>
|
||||
<article class="record"><div class="record-top"><time datetime="2026-10-04">4 Oct 2026</time><span class="badge">log</span></div><h3>Devnet v4: nine branches merged into one node</h3><p>Devnet-v4 integration: nine branches merged, 3-node test network on the merged node, Windows cross-build</p></article>
|
||||
<article class="record"><div class="record-top"><time datetime="2026-10-04">4 Oct 2026</time><span class="badge">log</span></div><h3>Generator v2 adopted: every hash does 128 distinct reads</h3><p>Generator version 2 adopted: exact load count, fresh-source loads, program acceptance; every vector re-cut, three workers re-checked, 20,000-program census, devnet-v4 binaries rebuilt</p></article>
|
||||
<article class="record"><div class="record-top"><time datetime="2026-10-04">4 Oct 2026</time><span class="badge">log</span></div><h3>First GPU proof of an Igneum block: 1.4 s on an RTX 5090</h3><p>Proving v0 on the RTX 5090: first GPU proof of an Igneum block</p></article>
|
||||
<article class="record"><div class="record-top"><time datetime="2026-10-04">4 Oct 2026</time><span class="badge">log</span></div><h3>Devnet v4 live: generator v2, two-thirds floor, fresh chain</h3><p>Devnet v4 cut-over: generator v2, 2/3 floor, three nodes and a seed on a fresh chain</p></article>
|
||||
<article class="record"><div class="record-top"><time datetime="2026-10-04">4 Oct 2026</time><span class="badge">log</span></div><h3>First live hourly swap: no pause on Mac, NVIDIA or AMD</h3><p>First hourly program swap on the live devnet: compile-ahead, no pause, two cards</p></article></div>
|
||||
<article class="record"><div class="record-top"><time datetime="2026-10-04">4 Oct 2026</time><span class="badge">log</span></div><h3>One-click Windows workers</h3><p>One-click Windows workers: what the Apple M5 Max could measure</p></article>
|
||||
<article class="record"><div class="record-top"><time datetime="2026-10-04">4 Oct 2026</time><span class="badge">log</span></div><h3>Proving: devnet v4 shards on the Apple M5 Max CPU, loaded machine</h3></article>
|
||||
<article class="record"><div class="record-top"><time datetime="2026-10-04">4 Oct 2026</time><span class="badge">log</span></div><h3>First live finality lock: 77.4% of weight, 17 voters</h3><p>First finality lock on the live devnet: checkpoint 242 at 77.4% of all weight, two hours after genesis</p></article>
|
||||
<article class="record"><div class="record-top"><time datetime="2026-10-04">4 Oct 2026</time><span class="badge">log</span></div><h3>The gfx1036 worker fault and what the Apple M5 Max could and could…</h3><p>The gfx1036 worker fault and what the Apple M5 Max could and could not reproduce</p></article>
|
||||
<article class="record"><div class="record-top"><time datetime="2026-10-04">4 Oct 2026</time><span class="badge">log</span></div><h3>A node 60 s behind the clock is silently dead</h3></article>
|
||||
<article class="record"><div class="record-top"><time datetime="2026-10-04">4 Oct 2026</time><span class="badge">log</span></div><h3>First machine on the one-click app: a 5090 at 118 MH/s</h3><p>First machine on the Igneum Miner app: the RTX 5090 Windows rig's RTX 5090 at 118 MH/s, via Setup.exe</p></article>
|
||||
<article class="record"><div class="record-top"><time datetime="2026-10-04">4 Oct 2026</time><span class="badge">log</span></div><h3>Difficulty rule v2</h3><p>Difficulty rule v2: the live oscillation, its cause, the DAG replay, the fix behind a height switch</p></article>
|
||||
<article class="record"><div class="record-top"><time datetime="2026-10-04">4 Oct 2026</time><span class="badge">log</span></div><h3>The observer stored nothing for 78 minutes, then 7,022 blocks in two…</h3><p>The observer stored nothing for 78 minutes, then 7,022 blocks in two minutes</p></article></div>
|
||||
<p class="empty-state" data-filter-empty="log" hidden>Nothing in the log matches that.</p>
|
||||
<p class="note">Every entry is a dated heading of <a href="/bench">the engineering log</a>, where the commands and the hardware are. The phases and their gates are the litepaper’s <a href="/litepaper#roadmap">roadmap</a>.</p>
|
||||
<div class="onward"><a href="/bench" class="btn">The engineering log</a><a href="/evidence" class="btn">Every claim and its status</a><a href="/live" class="btn">The live devnet</a></div>
|
||||
|
|
|
|||
|
|
@ -212,43 +212,43 @@
|
|||
},
|
||||
{
|
||||
"date": "2026-10-04",
|
||||
"text": "Sim/economy: mining versus proving under stress, agent-based",
|
||||
"short": "Economy simulation: mining versus proving under stress"
|
||||
"text": "One-click Windows workers: what the Apple M5 Max could measure",
|
||||
"short": "One-click Windows workers"
|
||||
},
|
||||
{
|
||||
"date": "2026-10-04",
|
||||
"text": "Difficulty rule under attack: pool hopping, pulsed rental, timestamp stretching, short-lane oscillation, epoch games, polluted window, block flood",
|
||||
"short": "Difficulty rule attacked seven ways"
|
||||
"text": "Proving: devnet v4 shards on the Apple M5 Max CPU, loaded machine",
|
||||
"short": "Proving: devnet v4 shards on the Apple M5 Max CPU, loaded machine"
|
||||
},
|
||||
{
|
||||
"date": "2026-10-04",
|
||||
"text": "Difficulty rule: timestamp attack fixed , simulator regression, 3-node forger test",
|
||||
"short": "Timestamp attack on the difficulty rule fixed"
|
||||
"text": "First finality lock on the live devnet: checkpoint 242 at 77.4% of all weight, two hours after genesis",
|
||||
"short": "First live finality lock: 77.4% of weight, 17 voters"
|
||||
},
|
||||
{
|
||||
"date": "2026-10-04",
|
||||
"text": "Devnet-v4 integration: nine branches merged, 3-node test network on the merged node, Windows cross-build",
|
||||
"short": "Devnet v4: nine branches merged into one node"
|
||||
"text": "The gfx1036 worker fault and what the Apple M5 Max could and could not reproduce",
|
||||
"short": "The gfx1036 worker fault and what the Apple M5 Max could and could…"
|
||||
},
|
||||
{
|
||||
"date": "2026-10-04",
|
||||
"text": "Generator version 2 adopted: exact load count, fresh-source loads, program acceptance; every vector re-cut, three workers re-checked, 20,000-program census, devnet-v4 binaries rebuilt",
|
||||
"short": "Generator v2 adopted: every hash does 128 distinct reads"
|
||||
"text": "A node 60 s behind the clock is silently dead",
|
||||
"short": "A node 60 s behind the clock is silently dead"
|
||||
},
|
||||
{
|
||||
"date": "2026-10-04",
|
||||
"text": "Proving v0 on the RTX 5090: first GPU proof of an Igneum block",
|
||||
"short": "First GPU proof of an Igneum block: 1.4 s on an RTX 5090"
|
||||
"text": "First machine on the Igneum Miner app: the RTX 5090 Windows rig's RTX 5090 at 118 MH/s, via Setup.exe",
|
||||
"short": "First machine on the one-click app: a 5090 at 118 MH/s"
|
||||
},
|
||||
{
|
||||
"date": "2026-10-04",
|
||||
"text": "Devnet v4 cut-over: generator v2, 2/3 floor, three nodes and a seed on a fresh chain",
|
||||
"short": "Devnet v4 live: generator v2, two-thirds floor, fresh chain"
|
||||
"text": "Difficulty rule v2: the live oscillation, its cause, the DAG replay, the fix behind a height switch",
|
||||
"short": "Difficulty rule v2"
|
||||
},
|
||||
{
|
||||
"date": "2026-10-04",
|
||||
"text": "First hourly program swap on the live devnet: compile-ahead, no pause, two cards",
|
||||
"short": "First live hourly swap: no pause on Mac, NVIDIA or AMD"
|
||||
"text": "The observer stored nothing for 78 minutes, then 7,022 blocks in two minutes",
|
||||
"short": "The observer stored nothing for 78 minutes, then 7,022 blocks in two…"
|
||||
}
|
||||
]
|
||||
}
|
||||
|
|
|
|||
|
|
@ -47,8 +47,8 @@
|
|||
@font-face{font-family:'Plex Mono Fallback';src:local('Courier New'),local('Menlo');size-adjust:100%;ascent-override:102.5%;descent-override:27.5%;line-gap-override:0%}
|
||||
</style>
|
||||
<script>
|
||||
/* theme before first paint: ?theme=light|dark for one view (the capture tool), else the stored choice under igneum-theme, else the system setting */
|
||||
(function(){var t=null;try{t=new URLSearchParams(location.search).get("theme");}catch(e){}if(t!=="light"&&t!=="dark"){try{t=localStorage.getItem("igneum-theme");}catch(e){t=null;}}if(t!=="light"&&t!=="dark")t=window.matchMedia&&window.matchMedia("(prefers-color-scheme: light)").matches?"light":"dark";document.documentElement.setAttribute("data-theme",t);})();
|
||||
/* theme before first paint: ?theme=light|dark for one view (the capture tool), else the stored choice under igneum-theme, else the system setting; ?motion=off marks the page data-motion=off so every .reveal is drawn at once (a headless render never scrolls) */
|
||||
(function(){var t=null;try{t=new URLSearchParams(location.search).get("theme");}catch(e){}if(t!=="light"&&t!=="dark"){try{t=localStorage.getItem("igneum-theme");}catch(e){t=null;}}if(t!=="light"&&t!=="dark")t=window.matchMedia&&window.matchMedia("(prefers-color-scheme: light)").matches?"light":"dark";document.documentElement.setAttribute("data-theme",t);try{if(new URLSearchParams(location.search).get("motion")==="off")document.documentElement.setAttribute("data-motion","off");}catch(e){}})();
|
||||
</script>
|
||||
<!-- head:end -->
|
||||
<style>
|
||||
|
|
|
|||
|
|
@ -50,8 +50,8 @@
|
|||
@font-face{font-family:'Plex Mono Fallback';src:local('Courier New'),local('Menlo');size-adjust:100%;ascent-override:102.5%;descent-override:27.5%;line-gap-override:0%}
|
||||
</style>
|
||||
<script>
|
||||
/* theme before first paint: ?theme=light|dark for one view (the capture tool), else the stored choice under igneum-theme, else the system setting */
|
||||
(function(){var t=null;try{t=new URLSearchParams(location.search).get("theme");}catch(e){}if(t!=="light"&&t!=="dark"){try{t=localStorage.getItem("igneum-theme");}catch(e){t=null;}}if(t!=="light"&&t!=="dark")t=window.matchMedia&&window.matchMedia("(prefers-color-scheme: light)").matches?"light":"dark";document.documentElement.setAttribute("data-theme",t);})();
|
||||
/* theme before first paint: ?theme=light|dark for one view (the capture tool), else the stored choice under igneum-theme, else the system setting; ?motion=off marks the page data-motion=off so every .reveal is drawn at once (a headless render never scrolls) */
|
||||
(function(){var t=null;try{t=new URLSearchParams(location.search).get("theme");}catch(e){}if(t!=="light"&&t!=="dark"){try{t=localStorage.getItem("igneum-theme");}catch(e){t=null;}}if(t!=="light"&&t!=="dark")t=window.matchMedia&&window.matchMedia("(prefers-color-scheme: light)").matches?"light":"dark";document.documentElement.setAttribute("data-theme",t);try{if(new URLSearchParams(location.search).get("motion")==="off")document.documentElement.setAttribute("data-motion","off");}catch(e){}})();
|
||||
</script>
|
||||
<!-- head:end -->
|
||||
<style>
|
||||
|
|
|
|||
|
|
@ -49,8 +49,8 @@
|
|||
@font-face{font-family:'Plex Mono Fallback';src:local('Courier New'),local('Menlo');size-adjust:100%;ascent-override:102.5%;descent-override:27.5%;line-gap-override:0%}
|
||||
</style>
|
||||
<script>
|
||||
/* theme before first paint: ?theme=light|dark for one view (the capture tool), else the stored choice under igneum-theme, else the system setting */
|
||||
(function(){var t=null;try{t=new URLSearchParams(location.search).get("theme");}catch(e){}if(t!=="light"&&t!=="dark"){try{t=localStorage.getItem("igneum-theme");}catch(e){t=null;}}if(t!=="light"&&t!=="dark")t=window.matchMedia&&window.matchMedia("(prefers-color-scheme: light)").matches?"light":"dark";document.documentElement.setAttribute("data-theme",t);})();
|
||||
/* theme before first paint: ?theme=light|dark for one view (the capture tool), else the stored choice under igneum-theme, else the system setting; ?motion=off marks the page data-motion=off so every .reveal is drawn at once (a headless render never scrolls) */
|
||||
(function(){var t=null;try{t=new URLSearchParams(location.search).get("theme");}catch(e){}if(t!=="light"&&t!=="dark"){try{t=localStorage.getItem("igneum-theme");}catch(e){t=null;}}if(t!=="light"&&t!=="dark")t=window.matchMedia&&window.matchMedia("(prefers-color-scheme: light)").matches?"light":"dark";document.documentElement.setAttribute("data-theme",t);try{if(new URLSearchParams(location.search).get("motion")==="off")document.documentElement.setAttribute("data-motion","off");}catch(e){}})();
|
||||
</script>
|
||||
<!-- head:end -->
|
||||
<style>
|
||||
|
|
@ -118,7 +118,7 @@
|
|||
.insp dd.hot{color:var(--molten-text)}
|
||||
.icol .note{font-size:12px;margin-top:14px;padding-top:12px;border-top:var(--hair)}
|
||||
.insp-empty{color:var(--ash);font-size:13px;line-height:1.5;padding:6px 0 2px}
|
||||
.mstats{display:grid;grid-template-columns:repeat(4,minmax(0,1fr));border-bottom:var(--hair);background:var(--row)}
|
||||
.mstats{display:grid;grid-template-columns:repeat(3,minmax(0,1fr));border-bottom:var(--hair);background:var(--row)}
|
||||
.mstats>div{padding:22px 25px;border-right:var(--hair);min-width:0}
|
||||
.mstats>div:last-child{border-right:0}
|
||||
.mstats .mk{font:10px var(--mono);letter-spacing:.1em;text-transform:uppercase;color:var(--ash)}
|
||||
|
|
@ -369,7 +369,6 @@ details.tablebar summary{display:flex;align-items:center}
|
|||
<section class="panel" aria-label="The block graph">
|
||||
<div class="mstats">
|
||||
<div><div class="mk">Blocks in window</div><div class="mv"><b id="m-blocks">0</b><small id="m-win">last 90 s</small></div><div class="mf" id="m-keys">waiting for the observer</div></div>
|
||||
<div><div class="mk">Your blocks</div><div class="mv"><b id="m-mine" class="own">0</b><small>in this window</small></div><div class="mf">Key <span class="mono" id="m-key">not set</span> · <button type="button" class="linkish" id="mine-btn">Mark my key</button></div></div>
|
||||
<div><div class="mk">Proven blocks</div><div class="mv"><b id="m-proven">0</b><small id="m-proven-pct">reading</small></div><div class="mf">of the last 10 minutes, every shard verified or paid</div></div>
|
||||
<div><div class="mk">Latest checkpoint</div><div class="mv"><b id="m-cp">None</b><small id="m-cp-w"></small></div><div class="mf" id="m-cp-note">no checkpoint in the reply</div></div>
|
||||
</div>
|
||||
|
|
@ -379,7 +378,6 @@ details.tablebar summary{display:flex;align-items:center}
|
|||
<div class="tabs" role="tablist" aria-label="Which blocks">
|
||||
<button type="button" class="tab on" data-filter="all" aria-pressed="true">All blocks</button>
|
||||
<button type="button" class="tab" data-filter="chain" aria-pressed="false">Selected chain</button>
|
||||
<button type="button" class="tab" data-filter="mine" aria-pressed="false">Your blocks</button>
|
||||
</div>
|
||||
<div class="right">
|
||||
<span class="chip" id="lane-caption">keys</span>
|
||||
|
|
@ -397,7 +395,6 @@ details.tablebar summary{display:flex;align-items:center}
|
|||
<span><i class="lgi" style="border:1.5px solid var(--included)"></i>Included</span>
|
||||
<span><i class="lgi" style="border:1.5px solid var(--excluded)"></i>Excluded</span>
|
||||
<span><i class="lgi" style="border:1.5px solid var(--ember);background:var(--ember-12)"></i>Selected chain</span>
|
||||
<span><i class="lgi" style="border:1.5px dashed var(--molten)"></i>Your block</span>
|
||||
<span><i class="lgi tick"></i>Proven</span>
|
||||
<span><i class="lgi" style="border:1.5px solid var(--ember);border-radius:50%"></i>Locked checkpoint</span>
|
||||
</div>
|
||||
|
|
@ -431,7 +428,7 @@ details.tablebar summary{display:flex;align-items:center}
|
|||
<section class="motion">
|
||||
<h2>Motion, with meaning.</h2>
|
||||
<div class="beats">
|
||||
<div><span class="num">01</span><h3>A block arrives.</h3><p>A brief signal traces its real parent edges. Your blocks take a molten frame.</p></div>
|
||||
<div><span class="num">01</span><h3>A block arrives.</h3><p>A brief signal traces its real parent edges.</p></div>
|
||||
<div><span class="num">02</span><h3>The proof takes shape.</h3><p>Shard tiles follow the planned, proving, verified and paid states the observer reports.</p></div>
|
||||
<div><span class="num">03</span><h3>A checkpoint locks.</h3><p>A pending marker becomes a solid band only when the observer reports it locked.</p></div>
|
||||
</div>
|
||||
|
|
@ -564,8 +561,8 @@ details.tablebar summary{display:flex;align-items:center}
|
|||
// a number that changed glows for a frame: motion only from a real change
|
||||
function set(id,text){var el=$(id);if(!el||el.textContent===text)return;el.textContent=text;el.classList.add('flash');setTimeout(function(){el.classList.remove('flash');},60);}
|
||||
var seen={},shardState={},cpState={},evSeen={},evList=[],ready=false,sel=null,lastD=null,dag=null;
|
||||
var mine=(function(){try{return localStorage.getItem('igneum-my-key')||'';}catch(e){return '';}})();
|
||||
document.addEventListener('click',function(e){var t=e.target;if(t&&t.id==='mine-btn'){var v=prompt('Your vote key’s short id, the first 8 hex characters shown in the app or the explorer:',mine||'');if(v!==null){mine=v.trim().toLowerCase();try{if(mine)localStorage.setItem('igneum-my-key',mine);else localStorage.removeItem('igneum-my-key');}catch(x){}remount();if(lastD)render(lastD);}}
|
||||
var mine='';
|
||||
document.addEventListener('click',function(e){var t=e.target;
|
||||
var row=t&&t.closest?t.closest('tr[data-hash]'):null;if(row&&dag){dag.select(row.getAttribute('data-hash'),'table');}});
|
||||
function render(d){var s=d.state,pv=d.proving,fn=d.finality,now=new Date(d.now).getTime();lastD=d;
|
||||
// the weight leaderboard (the finality weights the observer relays) and the census by client (the miners' engines)
|
||||
|
|
@ -628,7 +625,7 @@ details.tablebar summary{display:flex;align-items:center}
|
|||
// the four stats above the graph, from the module's own window
|
||||
function miner(st){if(!dag)return;var cps=dag.getCheckpoints(),cp=cps.length?cps[cps.length-1]:null;
|
||||
$('m-blocks').textContent=fmtN(st.blocks);$('m-win').textContent='last '+st.window+' s';$('m-keys').textContent=st.minerKeys+' miner keys · not a card count';$('lane-caption').textContent=st.minerKeys+' keys';
|
||||
$('m-mine').textContent=mine?fmtN(st.own):'0';$('m-mine').classList.toggle('dim',!mine);$('m-key').textContent=mine||'not set';
|
||||
|
||||
// the Proven tile reads its own 600 s window every 10 s (provenTile below): proofs land minutes after the block, so the scene's short window would read zero
|
||||
$('m-cp').textContent=cp?(cp.state==='locked'?'Locked':'Pending'):'None';$('m-cp-w').textContent=cp&&cp.fraction_total!==null&&cp.fraction_total!==undefined?Math.round(cp.fraction_total*100)+'% weight':'';$('m-cp-note').textContent=cp?'#'+fmtN(cp.index)+' · blue score '+fmtN(cp.blue_score):'no checkpoint in the reply';
|
||||
$('c-count').textContent=st.blocks+' blocks';var r=dag.getViewRange(),lo=null,hi=null;dag.getBlocks().forEach(function(b){if(b.ts>=r.start&&b.ts<=r.end){if(lo===null||b.blue_score<lo)lo=b.blue_score;if(hi===null||b.blue_score>hi)hi=b.blue_score;}});$('blue-range').textContent=lo===null?'blue score pending':'blue score '+fmtN(lo)+' to '+fmtN(hi);}
|
||||
|
|
|
|||
|
|
@ -49,8 +49,8 @@
|
|||
@font-face{font-family:'Plex Mono Fallback';src:local('Courier New'),local('Menlo');size-adjust:100%;ascent-override:102.5%;descent-override:27.5%;line-gap-override:0%}
|
||||
</style>
|
||||
<script>
|
||||
/* theme before first paint: ?theme=light|dark for one view (the capture tool), else the stored choice under igneum-theme, else the system setting */
|
||||
(function(){var t=null;try{t=new URLSearchParams(location.search).get("theme");}catch(e){}if(t!=="light"&&t!=="dark"){try{t=localStorage.getItem("igneum-theme");}catch(e){t=null;}}if(t!=="light"&&t!=="dark")t=window.matchMedia&&window.matchMedia("(prefers-color-scheme: light)").matches?"light":"dark";document.documentElement.setAttribute("data-theme",t);})();
|
||||
/* theme before first paint: ?theme=light|dark for one view (the capture tool), else the stored choice under igneum-theme, else the system setting; ?motion=off marks the page data-motion=off so every .reveal is drawn at once (a headless render never scrolls) */
|
||||
(function(){var t=null;try{t=new URLSearchParams(location.search).get("theme");}catch(e){}if(t!=="light"&&t!=="dark"){try{t=localStorage.getItem("igneum-theme");}catch(e){t=null;}}if(t!=="light"&&t!=="dark")t=window.matchMedia&&window.matchMedia("(prefers-color-scheme: light)").matches?"light":"dark";document.documentElement.setAttribute("data-theme",t);try{if(new URLSearchParams(location.search).get("motion")==="off")document.documentElement.setAttribute("data-motion","off");}catch(e){}})();
|
||||
</script>
|
||||
<!-- head:end -->
|
||||
<style>
|
||||
|
|
|
|||
|
|
@ -49,8 +49,8 @@
|
|||
@font-face{font-family:'Plex Mono Fallback';src:local('Courier New'),local('Menlo');size-adjust:100%;ascent-override:102.5%;descent-override:27.5%;line-gap-override:0%}
|
||||
</style>
|
||||
<script>
|
||||
/* theme before first paint: ?theme=light|dark for one view (the capture tool), else the stored choice under igneum-theme, else the system setting */
|
||||
(function(){var t=null;try{t=new URLSearchParams(location.search).get("theme");}catch(e){}if(t!=="light"&&t!=="dark"){try{t=localStorage.getItem("igneum-theme");}catch(e){t=null;}}if(t!=="light"&&t!=="dark")t=window.matchMedia&&window.matchMedia("(prefers-color-scheme: light)").matches?"light":"dark";document.documentElement.setAttribute("data-theme",t);})();
|
||||
/* theme before first paint: ?theme=light|dark for one view (the capture tool), else the stored choice under igneum-theme, else the system setting; ?motion=off marks the page data-motion=off so every .reveal is drawn at once (a headless render never scrolls) */
|
||||
(function(){var t=null;try{t=new URLSearchParams(location.search).get("theme");}catch(e){}if(t!=="light"&&t!=="dark"){try{t=localStorage.getItem("igneum-theme");}catch(e){t=null;}}if(t!=="light"&&t!=="dark")t=window.matchMedia&&window.matchMedia("(prefers-color-scheme: light)").matches?"light":"dark";document.documentElement.setAttribute("data-theme",t);try{if(new URLSearchParams(location.search).get("motion")==="off")document.documentElement.setAttribute("data-motion","off");}catch(e){}})();
|
||||
</script>
|
||||
<!-- head:end -->
|
||||
<style>
|
||||
|
|
@ -229,9 +229,8 @@ pre b{color:var(--molten-text);font-weight:500}
|
|||
</div>
|
||||
<figure class="app-window reveal" style="margin:0">
|
||||
<div class="window-top"><i></i><i></i><i></i><span><span data-product="app">Igneum Miner</span> / live devnet</span><svg class="icon" viewBox="0 0 24 24" aria-hidden="true"><rect x="5" y="10" width="14" height="11" rx="2"/><path d="M8 10V7a4 4 0 0 1 8 0v3m-4 4v3"/></svg></div>
|
||||
<img src="/img/miner-dashboard.webp" width="2880" height="1800" class="shot img-dark" alt="The Mine page of Igneum Miner 0.3.14 on a three-card rig: the Stop mining button, 169 MH/s at 532 W, 84 blocks this run, and one row per card: an RTX 5090 at 122 MH/s and 222 W, an RTX 4070 at 28.7 MH/s and 76 W, an RX 9070 XT at 18.9 MH/s, each with its tune line, Tune button and switch" fetchpriority="high" decoding="async">
|
||||
<img src="/img/app-overview-light.webp" width="1440" height="912" class="shot img-light" alt="The Overview page of 0.3.16 in light mode: an RTX 5090 at 103 MH/s and 317 W, 0.32 MH/W, 62 blocks this run, the chain drawn live with this rig's blocks ringed" fetchpriority="high" decoding="async">
|
||||
<figcaption><span class="cap-dark">The shipped app, mining on the three-card Windows rig: an RTX 5090, an RTX 4070 and an RX 9070 XT, live devnet, 6 October 2026.</span><span class="cap-light">0.3.16, rendered from the RTX 5090 Windows rig’s live state at 23:33 UK, 6 October 2026.</span></figcaption>
|
||||
<img src="/img/miner-dashboard.webp" width="2880" height="1800" class="shot" alt="The Mine page of Igneum Miner 0.3.14 on a three-card rig: the Stop mining button, 169 MH/s at 532 W, 84 blocks this run, and one row per card: an RTX 5090 at 122 MH/s and 222 W, an RTX 4070 at 28.7 MH/s and 76 W, an RX 9070 XT at 18.9 MH/s, each with its tune line, Tune button and switch" fetchpriority="high" decoding="async">
|
||||
<figcaption>The shipped app, mining on the three-card Windows rig: an RTX 5090, an RTX 4070 and an RX 9070 XT, live devnet, 6 October 2026.</figcaption>
|
||||
</figure>
|
||||
</div>
|
||||
</div>
|
||||
|
|
@ -376,26 +375,23 @@ pre b{color:var(--molten-text);font-weight:500}
|
|||
<div class="container">
|
||||
<div class="section-head">
|
||||
<div><div class="eyebrow"><span class="line"></span>The app</div><h2>Four pages. Every card is one row.</h2></div>
|
||||
<p>Your rate, what it costs a day, and the chain drawn live with your own blocks ringed. <a href="/app">Every page of the app</a>, light and dark.</p>
|
||||
<p>Your rate, what it costs a day, and the chain drawn live with your own blocks ringed. <a href="/app">Every page of the app</a>.</p>
|
||||
</div>
|
||||
<div class="shots3">
|
||||
<figure class="frame">
|
||||
<div class="bar"><i></i><i></i><i></i><b><span class="cap-dark">Overview</span><span class="cap-light">Earnings</span></b></div>
|
||||
<img src="/img/app-overview-dark.webp" width="1440" height="912" class="img-dark" alt="The Overview page of 0.3.16: an RTX 5090 at 103 MH/s and 317 W, 0.32 MH/W, 62 blocks this run and 91,521 lifetime, the Stop mining button, the chain drawn live with this rig's blocks ringed and locked checkpoints, the node synced with 5 peers" loading="lazy" decoding="async">
|
||||
<img src="/img/app-earnings-light.webp" width="1440" height="908" class="img-light" alt="The Earnings page of 0.3.16 in light mode: pounds earned with the devnet reason, IGN from proofs, blocks lifetime, the dev fee switch and the rewards address" loading="lazy" decoding="async">
|
||||
<figcaption><span class="cap-dark">0.3.16, rendered from the RTX 5090 Windows rig’s live state at 23:33 UK, 6 October 2026.</span><span class="cap-light">0.3.16 on the team’s Apple M5 Max, paused, 6 October 2026. Pounds earned reads 0.00 on devnet and says why.</span></figcaption>
|
||||
<div class="bar"><i></i><i></i><i></i><b>Overview</b></div>
|
||||
<img src="/img/app-overview-dark.webp" width="1440" height="912" class="shot" alt="The Overview page of 0.3.16: an RTX 5090 at 103 MH/s and 317 W, 0.32 MH/W, 62 blocks this run and 91,521 lifetime, the Stop mining button, the chain drawn live with this rig's blocks ringed and locked checkpoints, the node synced with 5 peers" loading="lazy" decoding="async">
|
||||
<figcaption>0.3.16, rendered from the RTX 5090 Windows rig’s live state at 23:33 UK, 6 October 2026.</figcaption>
|
||||
</figure>
|
||||
<figure class="frame">
|
||||
<div class="bar"><i></i><i></i><i></i><b>Cards</b></div>
|
||||
<img src="/img/app-cards-dark.webp" width="1440" height="1381" class="img-dark" alt="The Cards page: Ember Tune with Efficiency, Balanced and Maximum goals; one row per card with its rate, watts, hashes per watt, cost a day and temperature; the RTX 5090's details open with its power cap, goal, Retune and the tune curve" loading="lazy" decoding="async">
|
||||
<img src="/img/app-cards-light.webp" width="1440" height="912" class="img-light" alt="The Cards page of 0.3.16 in light mode: Ember Tune, the RTX 5090 at 103 MH/s, 322 to 317 W, 68 degrees, its tune line and Retune button; the integrated AMD graphics off" loading="lazy" decoding="async">
|
||||
<figcaption><span class="cap-dark">The Cards page, from the app in development.</span><span class="cap-light">0.3.16, rendered from the RTX 5090 Windows rig’s live state at 23:33 UK, 6 October 2026.</span></figcaption>
|
||||
<img src="/img/app-cards-dark.webp" width="1440" height="1381" class="shot" alt="The Cards page: Ember Tune with Efficiency, Balanced and Maximum goals; one row per card with its rate, watts, hashes per watt, cost a day and temperature; the RTX 5090's details open with its power cap, goal, Retune and the tune curve" loading="lazy" decoding="async">
|
||||
<figcaption>The Cards page, from the app in development.</figcaption>
|
||||
</figure>
|
||||
<figure class="frame">
|
||||
<div class="bar"><i></i><i></i><i></i><b>Overview · Mac</b></div>
|
||||
<img src="/img/app-overview-mac-dark.webp" width="1440" height="900" class="img-dark" alt="The Overview page on an Apple M5 Max: 18.3 MH/s, 6,789 blocks this run, the chain drawn live with this Mac's blocks in the lane marked you, locked checkpoints at 71% of weight, the node synced with 4 peers" loading="lazy" decoding="async">
|
||||
<img src="/img/app-overview-mac-light.webp" width="1440" height="1259" class="img-light" alt="The Overview page in light mode: 511 MH/s from one of three cards mining, 629 W, £4.23 a day of electricity, 6,784 blocks this run, the chain drawn live with this rig's blocks marked you, the node line and the activity log" loading="lazy" decoding="async">
|
||||
<figcaption><span class="cap-dark">An Apple M5 Max mining at 18.3 MH/s, from the app in development.</span><span class="cap-light">A three-card rig at 511 MH/s, from the app in development.</span></figcaption>
|
||||
<img src="/img/app-overview-mac-dark.webp" width="1440" height="900" class="shot" alt="The Overview page on an Apple M5 Max: 18.3 MH/s, 6,789 blocks this run, the chain drawn live with this Mac's blocks in the lane marked you, locked checkpoints at 71% of weight, the node synced with 4 peers" loading="lazy" decoding="async">
|
||||
<figcaption>An Apple M5 Max mining at 18.3 MH/s, from the app in development.</figcaption>
|
||||
</figure>
|
||||
</div>
|
||||
</div>
|
||||
|
|
|
|||
|
|
@ -49,8 +49,8 @@
|
|||
@font-face{font-family:'Plex Mono Fallback';src:local('Courier New'),local('Menlo');size-adjust:100%;ascent-override:102.5%;descent-override:27.5%;line-gap-override:0%}
|
||||
</style>
|
||||
<script>
|
||||
/* theme before first paint: ?theme=light|dark for one view (the capture tool), else the stored choice under igneum-theme, else the system setting */
|
||||
(function(){var t=null;try{t=new URLSearchParams(location.search).get("theme");}catch(e){}if(t!=="light"&&t!=="dark"){try{t=localStorage.getItem("igneum-theme");}catch(e){t=null;}}if(t!=="light"&&t!=="dark")t=window.matchMedia&&window.matchMedia("(prefers-color-scheme: light)").matches?"light":"dark";document.documentElement.setAttribute("data-theme",t);})();
|
||||
/* theme before first paint: ?theme=light|dark for one view (the capture tool), else the stored choice under igneum-theme, else the system setting; ?motion=off marks the page data-motion=off so every .reveal is drawn at once (a headless render never scrolls) */
|
||||
(function(){var t=null;try{t=new URLSearchParams(location.search).get("theme");}catch(e){}if(t!=="light"&&t!=="dark"){try{t=localStorage.getItem("igneum-theme");}catch(e){t=null;}}if(t!=="light"&&t!=="dark")t=window.matchMedia&&window.matchMedia("(prefers-color-scheme: light)").matches?"light":"dark";document.documentElement.setAttribute("data-theme",t);try{if(new URLSearchParams(location.search).get("motion")==="off")document.documentElement.setAttribute("data-motion","off");}catch(e){}})();
|
||||
</script>
|
||||
<!-- head:end -->
|
||||
<style>
|
||||
|
|
|
|||
|
|
@ -18,6 +18,6 @@
|
|||
@font-face{font-family:'Plex Mono Fallback';src:local('Courier New'),local('Menlo');size-adjust:100%;ascent-override:102.5%;descent-override:27.5%;line-gap-override:0%}
|
||||
</style>
|
||||
<script>
|
||||
/* theme before first paint: ?theme=light|dark for one view (the capture tool), else the stored choice under igneum-theme, else the system setting */
|
||||
(function(){var t=null;try{t=new URLSearchParams(location.search).get("theme");}catch(e){}if(t!=="light"&&t!=="dark"){try{t=localStorage.getItem("igneum-theme");}catch(e){t=null;}}if(t!=="light"&&t!=="dark")t=window.matchMedia&&window.matchMedia("(prefers-color-scheme: light)").matches?"light":"dark";document.documentElement.setAttribute("data-theme",t);})();
|
||||
/* theme before first paint: ?theme=light|dark for one view (the capture tool), else the stored choice under igneum-theme, else the system setting; ?motion=off marks the page data-motion=off so every .reveal is drawn at once (a headless render never scrolls) */
|
||||
(function(){var t=null;try{t=new URLSearchParams(location.search).get("theme");}catch(e){}if(t!=="light"&&t!=="dark"){try{t=localStorage.getItem("igneum-theme");}catch(e){t=null;}}if(t!=="light"&&t!=="dark")t=window.matchMedia&&window.matchMedia("(prefers-color-scheme: light)").matches?"light":"dark";document.documentElement.setAttribute("data-theme",t);try{if(new URLSearchParams(location.search).get("motion")==="off")document.documentElement.setAttribute("data-motion","off");}catch(e){}})();
|
||||
</script>
|
||||
|
|
@ -49,8 +49,8 @@
|
|||
@font-face{font-family:'Plex Mono Fallback';src:local('Courier New'),local('Menlo');size-adjust:100%;ascent-override:102.5%;descent-override:27.5%;line-gap-override:0%}
|
||||
</style>
|
||||
<script>
|
||||
/* theme before first paint: ?theme=light|dark for one view (the capture tool), else the stored choice under igneum-theme, else the system setting */
|
||||
(function(){var t=null;try{t=new URLSearchParams(location.search).get("theme");}catch(e){}if(t!=="light"&&t!=="dark"){try{t=localStorage.getItem("igneum-theme");}catch(e){t=null;}}if(t!=="light"&&t!=="dark")t=window.matchMedia&&window.matchMedia("(prefers-color-scheme: light)").matches?"light":"dark";document.documentElement.setAttribute("data-theme",t);})();
|
||||
/* theme before first paint: ?theme=light|dark for one view (the capture tool), else the stored choice under igneum-theme, else the system setting; ?motion=off marks the page data-motion=off so every .reveal is drawn at once (a headless render never scrolls) */
|
||||
(function(){var t=null;try{t=new URLSearchParams(location.search).get("theme");}catch(e){}if(t!=="light"&&t!=="dark"){try{t=localStorage.getItem("igneum-theme");}catch(e){t=null;}}if(t!=="light"&&t!=="dark")t=window.matchMedia&&window.matchMedia("(prefers-color-scheme: light)").matches?"light":"dark";document.documentElement.setAttribute("data-theme",t);try{if(new URLSearchParams(location.search).get("motion")==="off")document.documentElement.setAttribute("data-motion","off");}catch(e){}})();
|
||||
</script>
|
||||
<!-- head:end -->
|
||||
<style>
|
||||
|
|
|
|||
|
|
@ -49,8 +49,8 @@
|
|||
@font-face{font-family:'Plex Mono Fallback';src:local('Courier New'),local('Menlo');size-adjust:100%;ascent-override:102.5%;descent-override:27.5%;line-gap-override:0%}
|
||||
</style>
|
||||
<script>
|
||||
/* theme before first paint: ?theme=light|dark for one view (the capture tool), else the stored choice under igneum-theme, else the system setting */
|
||||
(function(){var t=null;try{t=new URLSearchParams(location.search).get("theme");}catch(e){}if(t!=="light"&&t!=="dark"){try{t=localStorage.getItem("igneum-theme");}catch(e){t=null;}}if(t!=="light"&&t!=="dark")t=window.matchMedia&&window.matchMedia("(prefers-color-scheme: light)").matches?"light":"dark";document.documentElement.setAttribute("data-theme",t);})();
|
||||
/* theme before first paint: ?theme=light|dark for one view (the capture tool), else the stored choice under igneum-theme, else the system setting; ?motion=off marks the page data-motion=off so every .reveal is drawn at once (a headless render never scrolls) */
|
||||
(function(){var t=null;try{t=new URLSearchParams(location.search).get("theme");}catch(e){}if(t!=="light"&&t!=="dark"){try{t=localStorage.getItem("igneum-theme");}catch(e){t=null;}}if(t!=="light"&&t!=="dark")t=window.matchMedia&&window.matchMedia("(prefers-color-scheme: light)").matches?"light":"dark";document.documentElement.setAttribute("data-theme",t);try{if(new URLSearchParams(location.search).get("motion")==="off")document.documentElement.setAttribute("data-motion","off");}catch(e){}})();
|
||||
</script>
|
||||
<!-- head:end -->
|
||||
<style>
|
||||
|
|
|
|||
|
|
@ -30,8 +30,8 @@
|
|||
@font-face{font-family:'Plex Mono Fallback';src:local('Courier New'),local('Menlo');size-adjust:100%;ascent-override:102.5%;descent-override:27.5%;line-gap-override:0%}
|
||||
</style>
|
||||
<script>
|
||||
/* theme before first paint: ?theme=light|dark for one view (the capture tool), else the stored choice under igneum-theme, else the system setting */
|
||||
(function(){var t=null;try{t=new URLSearchParams(location.search).get("theme");}catch(e){}if(t!=="light"&&t!=="dark"){try{t=localStorage.getItem("igneum-theme");}catch(e){t=null;}}if(t!=="light"&&t!=="dark")t=window.matchMedia&&window.matchMedia("(prefers-color-scheme: light)").matches?"light":"dark";document.documentElement.setAttribute("data-theme",t);})();
|
||||
/* theme before first paint: ?theme=light|dark for one view (the capture tool), else the stored choice under igneum-theme, else the system setting; ?motion=off marks the page data-motion=off so every .reveal is drawn at once (a headless render never scrolls) */
|
||||
(function(){var t=null;try{t=new URLSearchParams(location.search).get("theme");}catch(e){}if(t!=="light"&&t!=="dark"){try{t=localStorage.getItem("igneum-theme");}catch(e){t=null;}}if(t!=="light"&&t!=="dark")t=window.matchMedia&&window.matchMedia("(prefers-color-scheme: light)").matches?"light":"dark";document.documentElement.setAttribute("data-theme",t);try{if(new URLSearchParams(location.search).get("motion")==="off")document.documentElement.setAttribute("data-motion","off");}catch(e){}})();
|
||||
</script>
|
||||
<!-- head:end -->
|
||||
<style>
|
||||
|
|
|
|||
|
|
@ -372,7 +372,7 @@ html.nav-locked,html.nav-locked body{overflow:hidden}
|
|||
.burger{display:inline-flex}
|
||||
.devnet{display:none}
|
||||
.nav .cta{display:inline-flex}
|
||||
.nav-sheet{display:block;position:fixed;left:0;right:0;top:var(--nav-h);bottom:0;z-index:38;background:var(--obsidian);border-top:1px solid var(--line);padding:0;max-height:none;overflow:hidden}
|
||||
.nav-sheet,.nav.open .nav-sheet{display:block;position:absolute;left:0;right:0;top:100%;height:calc(100vh - var(--nav-h));height:calc(100dvh - var(--nav-h));z-index:38;background:var(--obsidian);border-top:1px solid var(--line);padding:0;max-height:none;overflow:hidden;grid-template-columns:none}
|
||||
.sheet-scroll{height:100%;overflow:auto;-webkit-overflow-scrolling:touch;padding:12px 16px 32px}
|
||||
.sheet-group{padding:10px 0 6px;border-bottom:1px solid var(--line)}
|
||||
.sheet-head{font:500 11px/1.7 var(--mono);letter-spacing:.16em;text-transform:uppercase;color:var(--ember-text);padding:6px 14px 4px}
|
||||
|
|
@ -412,6 +412,8 @@ td .badge[data-mark].mini{margin-right:10px}
|
|||
.fold{position:relative;overflow:hidden;min-height:calc(100vh - var(--nav-h));min-height:calc(100svh - var(--nav-h));display:flex;flex-direction:column}
|
||||
.fold-scene{position:absolute;inset:0;z-index:0}
|
||||
.fold-scene canvas{display:block;width:100%;height:100%}
|
||||
.fold-scene{transition:opacity .6s ease}
|
||||
.fold.pending .fold-scene{opacity:0}
|
||||
.fold-scene::after{content:"";position:absolute;inset:0;background:linear-gradient(180deg,color-mix(in srgb,var(--obsidian) 55%,transparent) 0%,color-mix(in srgb,var(--obsidian) 62%,transparent) 36%,color-mix(in srgb,var(--obsidian) 30%,transparent) 64%,var(--obsidian) 100%);pointer-events:none}
|
||||
.fold-body{position:relative;z-index:1;flex:1;display:flex;flex-direction:column;align-items:center;justify-content:center;text-align:center;padding:40px 20px 56px;gap:0}
|
||||
.fold-coin{position:relative;width:132px;height:132px;display:flex;align-items:center;justify-content:center;margin-bottom:26px;flex:0 0 auto}
|
||||
|
|
|
|||
|
|
@ -49,8 +49,8 @@
|
|||
@font-face{font-family:'Plex Mono Fallback';src:local('Courier New'),local('Menlo');size-adjust:100%;ascent-override:102.5%;descent-override:27.5%;line-gap-override:0%}
|
||||
</style>
|
||||
<script>
|
||||
/* theme before first paint: ?theme=light|dark for one view (the capture tool), else the stored choice under igneum-theme, else the system setting */
|
||||
(function(){var t=null;try{t=new URLSearchParams(location.search).get("theme");}catch(e){}if(t!=="light"&&t!=="dark"){try{t=localStorage.getItem("igneum-theme");}catch(e){t=null;}}if(t!=="light"&&t!=="dark")t=window.matchMedia&&window.matchMedia("(prefers-color-scheme: light)").matches?"light":"dark";document.documentElement.setAttribute("data-theme",t);})();
|
||||
/* theme before first paint: ?theme=light|dark for one view (the capture tool), else the stored choice under igneum-theme, else the system setting; ?motion=off marks the page data-motion=off so every .reveal is drawn at once (a headless render never scrolls) */
|
||||
(function(){var t=null;try{t=new URLSearchParams(location.search).get("theme");}catch(e){}if(t!=="light"&&t!=="dark"){try{t=localStorage.getItem("igneum-theme");}catch(e){t=null;}}if(t!=="light"&&t!=="dark")t=window.matchMedia&&window.matchMedia("(prefers-color-scheme: light)").matches?"light":"dark";document.documentElement.setAttribute("data-theme",t);try{if(new URLSearchParams(location.search).get("motion")==="off")document.documentElement.setAttribute("data-motion","off");}catch(e){}})();
|
||||
</script>
|
||||
<!-- head:end -->
|
||||
<style>
|
||||
|
|
@ -232,8 +232,7 @@
|
|||
</div>
|
||||
<div class="wallet-card reveal"><div class="eyebrow"><em>IGNEUM WALLET</em><span style="margin-left:auto">0.1.5</span></div><figure class="frame" style="margin:18px 0 0">
|
||||
<div class="bar"></div>
|
||||
<img src="/img/wallet-home-dark.webp" width="2240" height="1560" class="img-dark" alt="The wallet window, Home: a balance of 31.6321 IGN with the devnet note that coins have no value, an example address with Copy, Send and Receive, the node line synced to the miner app's node and verified to a checkpoint, and the recent transfers with their state words" fetchpriority="high" decoding="async">
|
||||
<img src="/img/wallet-home-light.webp" width="2240" height="1560" class="img-light" alt="The wallet window, Home, in light mode: a balance of 31.6321 IGN, an example address with Copy, Send and Receive, the node line and the recent transfers" fetchpriority="high" decoding="async">
|
||||
<img src="/img/wallet-home-dark.webp" width="2240" height="1560" class="shot" alt="The wallet window, Home: a balance of 31.6321 IGN with the devnet note that coins have no value, an example address with Copy, Send and Receive, the node line synced to the miner app's node and verified to a checkpoint, and the recent transfers with their state words" fetchpriority="high" decoding="async">
|
||||
</figure><p class="shot-cap">Igneum Wallet 0.1.5, rendered from the wallet’s own mock state: example keys, 7 October 2026.</p></div>
|
||||
</div>
|
||||
</div>
|
||||
|
|
@ -252,8 +251,7 @@
|
|||
</div>
|
||||
<figure class="frame reveal" style="margin:25px 0 0;max-width:880px">
|
||||
<div class="bar"><i></i><i></i><i></i><b>History</b></div>
|
||||
<img src="/img/wallet-history-dark.webp" width="2240" height="1560" class="img-dark" alt="The wallet's History page: every transfer with the node's word, pending, proven, executed, finalised under a checkpoint verified here, and one failed with the fee still paid" loading="lazy" decoding="async">
|
||||
<img src="/img/wallet-history-light.webp" width="2240" height="1560" class="img-light" alt="The wallet's History page in light mode: every transfer with the node's word, pending, proven, executed, finalised under a checkpoint verified here" loading="lazy" decoding="async">
|
||||
<img src="/img/wallet-history-dark.webp" width="2240" height="1560" class="shot" alt="The wallet's History page: every transfer with the node's word, pending, proven, executed, finalised under a checkpoint verified here, and one failed with the fee still paid" loading="lazy" decoding="async">
|
||||
<figcaption>Every transfer with the node’s word: pending, proven, executed, finalised under a checkpoint this wallet verified. Igneum Wallet 0.1.5, rendered from its mock state with example keys, 7 October 2026.</figcaption>
|
||||
</figure>
|
||||
<div class="reveal" style="margin-top:var(--s-5)">
|
||||
|
|
|
|||
|
|
@ -78,6 +78,7 @@ tree_checks() {
|
|||
run "internal link check of site/*.html" node tools/ci/link-check.mjs
|
||||
run "every served page carries the slim bar (mark, Mine, Network, Learn, Download) with every route in its panels and the sheet (self-test, then the tree)" bash -c 'node tools/ci/site-nav-check.mjs --self-test && node tools/ci/site-nav-check.mjs'
|
||||
run "vendor marks: site/lib/marks.mjs is brand/marks/vendor-marks.mjs byte for byte (the app and the site draw one set)" cmp brand/marks/vendor-marks.mjs site/lib/marks.mjs
|
||||
run "the phone menu opens and is seen at 390 px on every page (self-test first; needs the box or CI browser, says so without one)" node tools/site/sheet-test.mjs --self-test
|
||||
run "ledger sentences present verbatim on their public pages" node tools/ci/ledger-text-check.mjs
|
||||
never_push_checks
|
||||
run "shell inside .github/workflows parses (bash -n, the PowerShell 5.1 rule)" node tools/ci/check-workflow-shell.mjs
|
||||
|
|
|
|||
|
|
@ -29,7 +29,7 @@ shot() { # <route> <width> <theme>
|
|||
local file="${name}__${width}-${theme}.png"
|
||||
"$CHROME" --headless --no-sandbox --disable-gpu --hide-scrollbars --force-device-scale-factor=2 \
|
||||
--window-size="$width,$height" --virtual-time-budget=12000 --run-all-compositor-stages-before-draw \
|
||||
--screenshot="$OUT/$file" "http://127.0.0.1:$PORT$route?theme=$theme" > "$OUT/$file.log" 2>&1 || { echo "FAILED $file"; cat "$OUT/$file.log"; return 1; }
|
||||
--screenshot="$OUT/$file" "http://127.0.0.1:$PORT$route?theme=$theme&motion=off" > "$OUT/$file.log" 2>&1 || { echo "FAILED $file"; cat "$OUT/$file.log"; return 1; }
|
||||
echo "$file $(stat -c %s "$OUT/$file" 2>/dev/null || stat -f %z "$OUT/$file") B"
|
||||
}
|
||||
for r in $ROUTES; do for w in $WIDTHS; do for t in $THEMES; do shot "$r" "$w" "$t"; done; done; done
|
||||
|
|
|
|||
|
|
@ -15,8 +15,14 @@ function file(p) { try { return existsSync(p) && statSync(p).isFile() ? p : null
|
|||
http.createServer((req, res) => {
|
||||
const u = new URL(req.url, 'http://x');
|
||||
if (u.pathname.startsWith('/api/')) {
|
||||
const r = https.request(api + u.pathname + u.search, { method: 'GET', headers: { accept: 'application/json' } }, pr => { res.writeHead(pr.statusCode || 502, { 'content-type': pr.headers['content-type'] || 'application/json', 'cache-control': 'no-store' }); pr.pipe(res); });
|
||||
r.on('error', () => { res.writeHead(502, { 'content-type': 'application/json' }); res.end('{"ok":false,"error":"upstream"}'); }); r.end(); return;
|
||||
// an http: origin (or one that refuses) answers 502 so the pages render their pending state; the server itself never dies
|
||||
const fail = () => { if (!res.headersSent) res.writeHead(502, { 'content-type': 'application/json' }); res.end('{"ok":false,"error":"upstream"}'); };
|
||||
try {
|
||||
const mod = api.startsWith('http:') ? http : https;
|
||||
const r = mod.request(api + u.pathname + u.search, { method: 'GET', headers: { accept: 'application/json' } }, pr => { res.writeHead(pr.statusCode || 502, { 'content-type': pr.headers['content-type'] || 'application/json', 'cache-control': 'no-store' }); pr.pipe(res); });
|
||||
r.on('error', fail); r.end();
|
||||
} catch (e) { fail(); }
|
||||
return;
|
||||
}
|
||||
let p = u.pathname.replace(/\/+$/, '') || '/';
|
||||
if (/^\/block\/[^/]+$/.test(p)) p = '/block'; else if (/^\/address\/[^/]+$/.test(p)) p = '/address'; else if (p === '/benchmarks') p = '/miners';
|
||||
|
|
|
|||
67
tools/site/sheet-test.mjs
Normal file
|
|
@ -0,0 +1,67 @@
|
|||
#!/usr/bin/env node
|
||||
// The phone menu opens and is seen (site-ui-5, 7 October 2026, the project lead's "mobile nav does not work"): at 390 px every served
|
||||
// page's burger opens the sheet, and the sheet's first link is on screen and on top (a hit-test at its centre returns that
|
||||
// link, not the page beneath). The failed case this guards: the sheet was position:fixed inside the bar, whose
|
||||
// backdrop-filter is a containing block for fixed descendants, so top and bottom resolved against the 60 px bar and the
|
||||
// sheet opened with zero height while aria-expanded said true.
|
||||
//
|
||||
// node tools/site/sheet-test.mjs [site-dir] every page; exit 1 listing each page whose sheet is not seen
|
||||
// node tools/site/sheet-test.mjs --self-test [dir] known-failed first: a page with the sheet forced to zero height is
|
||||
// caught, then the real pages pass
|
||||
//
|
||||
// Needs a browser: Playwright from this tree's node_modules, $IGNEUM_PLAYWRIGHT_DIR, or /srv/builds/_bin/overlap on a build
|
||||
// box (the overlap sweep's install). Without one it says so and exits 0 (CI installs Playwright; the box has it; the Mac
|
||||
// renders nothing). The site is served by tools/site/serve.mjs on a port of its own with /api answering nothing.
|
||||
import { readdirSync, existsSync } from 'node:fs';
|
||||
import { createRequire } from 'node:module';
|
||||
import { join, dirname } from 'node:path';
|
||||
import { fileURLToPath } from 'node:url';
|
||||
import { spawn } from 'node:child_process';
|
||||
import http from 'node:http';
|
||||
const here = dirname(fileURLToPath(import.meta.url));
|
||||
const args = process.argv.slice(2);
|
||||
const selfTest = args.includes('--self-test');
|
||||
const site = args.filter(a => !a.startsWith('--'))[0] || join(here, '..', '..', 'site');
|
||||
function playwright() {
|
||||
const req = createRequire(import.meta.url);
|
||||
for (const root of [join(here, '..', '..'), process.env.IGNEUM_PLAYWRIGHT_DIR, '/srv/builds/_bin/overlap'].filter(Boolean)) {
|
||||
try { return createRequire(join(root, 'package.json'))('playwright'); } catch (e) { /* next */ }
|
||||
}
|
||||
try { return req('playwright'); } catch (e) { return null; }
|
||||
}
|
||||
const pw = playwright();
|
||||
if (!pw) { console.log('sheet-test: no Playwright here (the box and CI have it); nothing checked'); process.exit(0); }
|
||||
const port = 4700 + Math.floor(Math.random() * 300);
|
||||
const server = spawn(process.execPath, [join(here, 'serve.mjs'), String(port), site, 'http://127.0.0.1:1'], { stdio: 'ignore' });
|
||||
await new Promise((res, rej) => { let n = 0; const t = setInterval(() => { http.get(`http://127.0.0.1:${port}/`, r => { clearInterval(t); res(); }).on('error', () => { if (++n > 80) { clearInterval(t); rej(new Error('serve.mjs did not answer')); } }); }, 100); });
|
||||
const pages = readdirSync(site).filter(f => f.endsWith('.html')).map(f => f.replace(/\.html$/, '')).map(n => n === 'index' ? '/' : '/' + n);
|
||||
const browser = await pw.chromium.launch({ headless: true, args: ['--no-sandbox'] });
|
||||
async function check(route, breakIt) {
|
||||
const ctx = await browser.newContext({ viewport: { width: 390, height: 844 }, deviceScaleFactor: 1, reducedMotion: 'reduce' });
|
||||
const page = await ctx.newPage();
|
||||
await page.goto(`http://127.0.0.1:${port}${route}`, { waitUntil: 'load' });
|
||||
if (breakIt) await page.addStyleTag({ content: '.nav .nav-sheet{height:0!important}' });
|
||||
await page.click('#nav-burger');
|
||||
const r = await page.evaluate(() => {
|
||||
const b = document.getElementById('nav-burger'), s = document.getElementById('nav-sheet'), a = s && s.querySelector('a');
|
||||
if (!b || !s || !a) return { ok: false, why: 'no burger, sheet or first link' };
|
||||
const box = a.getBoundingClientRect(), vis = box.width > 0 && box.height > 0 && box.top >= 0 && box.bottom <= innerHeight && box.left >= 0 && box.right <= innerWidth;
|
||||
const hit = document.elementFromPoint(box.left + box.width / 2, box.top + box.height / 2), onTop = !!hit && (hit === a || a.contains(hit));
|
||||
return { ok: b.getAttribute('aria-expanded') === 'true' && !s.hidden && vis && onTop, why: `aria-expanded ${b.getAttribute('aria-expanded')}, hidden ${s.hidden}, link ${Math.round(box.width)}x${Math.round(box.height)} at ${Math.round(box.top)}, on top ${onTop}` };
|
||||
});
|
||||
await ctx.close();
|
||||
return r;
|
||||
}
|
||||
let bad = [];
|
||||
try {
|
||||
if (selfTest) {
|
||||
const broken = await check('/', true);
|
||||
if (broken.ok) { console.error('sheet-test self-test: a sheet forced to zero height passed'); process.exitCode = 1; }
|
||||
else console.log('sheet-test self-test: the zero-height sheet is caught (' + broken.why + ')');
|
||||
}
|
||||
if (!process.exitCode) {
|
||||
for (const route of pages) { const r = await check(route, false); if (!r.ok) bad.push(`${route}: ${r.why}`); }
|
||||
if (bad.length) { console.error('sheet-test: ' + bad.length + ' pages whose phone menu is not seen\n' + bad.join('\n')); process.exitCode = 1; }
|
||||
else console.log(`sheet-test: ${pages.length} pages open the phone menu at 390 px with the first link on screen and on top`);
|
||||
}
|
||||
} finally { await browser.close(); server.kill(); }
|
||||