Spaces:
Running
Running
| /* SZL Living Anatomy — Evidence Bay. | |
| * Clean-room, SZL-native industrial evidence surface. Zero CDN and read-only. | |
| * Transport, evidence, verification, and authority remain separate dimensions. | |
| */ | |
| (function (root) { | |
| 'use strict'; | |
| var API = '/api/anatomy/v1'; | |
| var state = { manifest:null, capabilities:null, evidence:null, tab:'overview', busy:false }; | |
| var previousFocus = null; | |
| function esc(value) { | |
| return String(value == null ? '' : value).replace(/[&<>"']/g, function (c) { | |
| return {'&':'&','<':'<','>':'>','"':'"',"'":'''}[c]; | |
| }); | |
| } | |
| function fetchJSON(url, opts, timeout) { | |
| var ctl = typeof AbortController !== 'undefined' ? new AbortController() : null; | |
| var timer = ctl ? setTimeout(function(){ ctl.abort(); }, timeout || 10000) : null; | |
| opts = opts || {}; opts.cache = 'no-store'; if (ctl) opts.signal = ctl.signal; | |
| return fetch(url, opts).then(function (r) { | |
| if (timer) clearTimeout(timer); | |
| return r.json().then(function (data) { return {ok:r.ok,status:r.status,data:data}; }); | |
| }).catch(function (error) { | |
| if (timer) clearTimeout(timer); | |
| return {ok:false,status:0,data:null,error:String(error && error.message || error)}; | |
| }); | |
| } | |
| var css = [ | |
| '#fa-launch{position:fixed;z-index:197;right:18px;top:50%;transform:translateY(-50%);width:132px;text-align:left;background:rgba(7,11,16,.94);color:#dce8ea;border:1px solid rgba(101,169,174,.38);border-right:2px solid #63d4cf;box-shadow:0 18px 50px rgba(0,0,0,.42);padding:10px 12px;cursor:pointer;font-family:var(--font-m,monospace);text-transform:uppercase;letter-spacing:.10em;backdrop-filter:blur(14px)}', | |
| '#fa-launch:hover,#fa-launch:focus-visible{border-color:#63d4cf;color:#fff;outline:none;box-shadow:0 0 0 2px rgba(99,212,207,.18),0 18px 50px rgba(0,0,0,.55)}', | |
| '#fa-launch .fa-l1{display:flex;align-items:center;gap:8px;font-size:9px;font-weight:800}#fa-launch .fa-l2{display:block;margin-top:5px;color:#829195;font-size:8px;letter-spacing:.06em;text-transform:none}', | |
| '.fa-signal{width:7px;height:7px;border-radius:1px;background:#63d4cf;box-shadow:0 0 12px rgba(99,212,207,.7)}', | |
| '#fa-scrim{position:fixed;z-index:198;inset:0;background:rgba(0,0,0,.52);opacity:0;pointer-events:none;transition:opacity .2s ease}#fa-scrim.open{opacity:1;pointer-events:auto}', | |
| '#fa-panel{position:fixed;z-index:199;right:0;top:0;height:100%;width:min(570px,100vw);display:flex;flex-direction:column;background:linear-gradient(180deg,#0b1015 0%,#070b0f 100%);color:#dce5e6;border-left:1px solid #273237;box-shadow:-30px 0 90px rgba(0,0,0,.62);transform:translateX(102%);transition:transform .24s cubic-bezier(.2,.8,.2,1);font-family:var(--font-d,system-ui);pointer-events:auto}#fa-panel.open{transform:translateX(0)}', | |
| 'body.fa-open #ux-tabbar,body.fa-open #ux-more-menu,body.fa-open #dissect-fab{opacity:0!important;pointer-events:none!important}', | |
| '.fa-top{padding:18px 20px 14px;border-bottom:1px solid #273237;background:#0d1318}.fa-kicker{display:flex;align-items:center;gap:8px;color:#78d9d4;font:800 9px/1 var(--font-m,monospace);letter-spacing:.20em;text-transform:uppercase}.fa-kicker:before{content:"";width:18px;height:1px;background:#78d9d4}', | |
| '.fa-title-row{display:flex;justify-content:space-between;align-items:flex-start;gap:16px;margin-top:10px}.fa-title{margin:0;font-size:25px;line-height:1.05;font-weight:620;letter-spacing:-.025em;color:#f2f7f7}.fa-subtitle{margin:7px 0 0;color:#8e9da0;font:11px/1.5 var(--font-m,monospace);max-width:46ch}', | |
| '.fa-close{flex:0 0 auto;width:34px;height:34px;color:#aebbbd;background:#11191e;border:1px solid #334047;cursor:pointer;font-size:18px}.fa-close:hover,.fa-close:focus-visible{color:#fff;border-color:#78d9d4;outline:none}', | |
| '.fa-rail{display:grid;grid-template-columns:repeat(4,1fr);border-bottom:1px solid #273237;background:#080d11}.fa-dim{padding:10px 11px;border-right:1px solid #20292e;min-width:0}.fa-dim:last-child{border-right:0}.fa-dim-label{display:block;color:#647277;font:8px/1.2 var(--font-m,monospace);letter-spacing:.12em;text-transform:uppercase}.fa-dim-value{display:block;margin-top:5px;color:#c7d2d4;font:800 9px/1.2 var(--font-m,monospace);white-space:nowrap;overflow:hidden;text-overflow:ellipsis}', | |
| '.fa-dim-value.live,.fa-dim-value.computed,.fa-dim-value.reachable,.fa-dim-value.available{color:#78d9d4}.fa-dim-value.mixed,.fa-dim-value.structural_only,.fa-dim-value.snapshot,.fa-dim-value.modeled{color:#e1bd71}.fa-dim-value.unavailable,.fa-dim-value.failed,.fa-dim-value.unreachable,.fa-dim-value.missing{color:#e37d8f}', | |
| '.fa-tabs{display:flex;padding:0 20px;border-bottom:1px solid #273237;background:#0b1015;overflow:auto}.fa-tab{appearance:none;border:0;border-bottom:2px solid transparent;background:transparent;color:#718086;padding:12px 11px 10px;font:800 9px/1 var(--font-m,monospace);letter-spacing:.12em;text-transform:uppercase;cursor:pointer;white-space:nowrap}.fa-tab:hover{color:#cad5d7}.fa-tab.active{color:#78d9d4;border-bottom-color:#78d9d4}.fa-tab:focus-visible{outline:1px solid #78d9d4;outline-offset:-3px}', | |
| '.fa-body{flex:1;overflow:auto;padding:20px 20px 90px;scrollbar-color:#334047 #0b1015}.fa-section{margin:0 0 24px}.fa-section-head{display:flex;align-items:center;justify-content:space-between;gap:12px;margin:0 0 11px}.fa-section h3{margin:0;color:#aebbbd;font:800 9px/1.2 var(--font-m,monospace);letter-spacing:.15em;text-transform:uppercase}.fa-rule{height:1px;flex:1;background:#273237}', | |
| '.fa-lede{margin:0;color:#d6dfe0;font-size:15px;line-height:1.55;letter-spacing:-.005em}.fa-callout{border-left:2px solid #78d9d4;background:#0d1519;padding:12px 13px;margin-top:14px;color:#9daaad;font:11px/1.55 var(--font-m,monospace)}', | |
| '.fa-grid{display:grid;grid-template-columns:repeat(2,minmax(0,1fr));gap:8px}.fa-stat{background:#0d1318;border:1px solid #273237;padding:12px;min-height:88px}.fa-stat .k{color:#6f7e82;font:8px/1.2 var(--font-m,monospace);letter-spacing:.12em;text-transform:uppercase}.fa-stat .v{margin-top:9px;color:#edf3f3;font:800 12px/1.2 var(--font-m,monospace)}.fa-stat p{margin:8px 0 0;color:#79888c;font-size:10px;line-height:1.4}', | |
| '.fa-actions{display:flex;flex-wrap:wrap;gap:7px;margin-top:14px}.fa-btn,.fa-link{display:inline-flex;align-items:center;justify-content:center;min-height:34px;padding:0 11px;border:1px solid #35444a;background:#10181d;color:#bdc9cb;text-decoration:none;cursor:pointer;font:800 9px/1 var(--font-m,monospace);letter-spacing:.08em;text-transform:uppercase}.fa-btn.primary{border-color:#2b8c8a;background:#12302f;color:#9ff1ec}.fa-btn:hover,.fa-link:hover,.fa-btn:focus-visible,.fa-link:focus-visible{border-color:#78d9d4;color:#fff;outline:none}.fa-btn:disabled{opacity:.45;cursor:wait}', | |
| '.fa-cap{border:1px solid #273237;background:#0b1115;margin:0 0 9px}.fa-cap summary{list-style:none;display:grid;grid-template-columns:30px 1fr auto;align-items:center;gap:10px;padding:12px 13px;cursor:pointer}.fa-cap summary::-webkit-details-marker{display:none}.fa-cap summary:hover{background:#0f171c}.fa-num{color:#536267;font:800 9px/1 var(--font-m,monospace)}.fa-cap-name{color:#e4ebec;font-size:13px;font-weight:650}.fa-cap-id{display:block;margin-top:3px;color:#617075;font:8px/1.2 var(--font-m,monospace)}', | |
| '.fa-badge{display:inline-block;border:1px solid #3c4a4f;color:#8e9c9f;padding:3px 6px;font:800 8px/1 var(--font-m,monospace);letter-spacing:.06em;text-transform:uppercase}.fa-badge.live,.fa-badge.computed,.fa-badge.available,.fa-badge.pass{border-color:#286d6b;color:#78d9d4;background:rgba(40,109,107,.13)}.fa-badge.snapshot,.fa-badge.mixed,.fa-badge.modeled,.fa-badge.structural-only,.fa-badge.structural_only,.fa-badge.unavailable,.fa-badge.read_only{border-color:#685937;color:#e1bd71;background:rgba(104,89,55,.12)}.fa-badge.fail,.fa-badge.failed,.fa-badge.missing,.fa-badge.unreachable{border-color:#663640;color:#e37d8f;background:rgba(102,54,64,.12)}', | |
| '.fa-cap-body{border-top:1px solid #273237;padding:13px}.fa-field{display:grid;grid-template-columns:86px 1fr;gap:12px;padding:8px 0;border-bottom:1px solid #1e272b}.fa-field:last-child{border-bottom:0}.fa-field dt{color:#657378;font:800 8px/1.4 var(--font-m,monospace);letter-spacing:.12em;text-transform:uppercase}.fa-field dd{margin:0;color:#aebabc;font-size:11px;line-height:1.52;min-width:0}.fa-field ul,.fa-field ol{margin:0;padding-left:17px}.fa-field li+li{margin-top:5px}', | |
| '.fa-code{display:block;margin-top:5px;padding:8px;background:#070b0e;border:1px solid #202b30;color:#8ed6d2;font:9px/1.5 var(--font-m,monospace);word-break:break-all}.fa-refs{display:flex;flex-wrap:wrap;gap:5px;margin-top:7px}.fa-ref{color:#8ec6c4;text-decoration:none;border-bottom:1px solid #31504f;font:9px/1.4 var(--font-m,monospace)}.fa-ref:hover{color:#fff;border-color:#78d9d4}', | |
| '.fa-dep{display:grid;grid-template-columns:1fr auto;gap:10px;padding:12px 0;border-bottom:1px solid #20292e}.fa-dep:last-child{border-bottom:0}.fa-dep-name{color:#d8e1e2;font-size:12px;font-weight:650}.fa-dep-purpose{display:block;margin-top:4px;color:#718084;font-size:10px;line-height:1.4}.fa-dep-meta{display:block;margin-top:5px;color:#4f6065;font:8px/1.3 var(--font-m,monospace);word-break:break-all}.fa-dep-state{text-align:right;min-width:88px}.fa-http{display:block;margin-top:5px;color:#66757a;font:8px/1 var(--font-m,monospace)}', | |
| '.fa-output{margin-top:12px;background:#070b0e;border:1px solid #273237;padding:11px;color:#9caaad;font:10px/1.55 var(--font-m,monospace);word-break:break-word}.fa-output.good{border-color:#286d6b;color:#9be2de}.fa-output.bad{border-color:#663640;color:#e3a0ab}', | |
| '.fa-endpoint{padding:12px 0;border-bottom:1px solid #20292e}.fa-endpoint:last-child{border-bottom:0}.fa-endpoint a{color:#c8d5d6;text-decoration:none;font:700 10px/1.4 var(--font-m,monospace)}.fa-endpoint a:hover{color:#78d9d4}.fa-endpoint p{margin:5px 0 0;color:#6f7d81;font-size:10px;line-height:1.45}', | |
| '.fa-loading{padding:28px 0;color:#6e7b7f;font:10px/1.5 var(--font-m,monospace);text-transform:uppercase;letter-spacing:.12em}.fa-loading:before{content:"";display:inline-block;width:7px;height:7px;margin-right:9px;background:#e1bd71;animation:fa-pulse .9s ease-in-out infinite}@keyframes fa-pulse{50%{opacity:.25}}', | |
| '@media(max-width:760px){#fa-launch{right:8px;top:auto;bottom:76px;transform:none;width:auto;padding:9px 11px}#fa-launch .fa-l2{display:none}#fa-panel{width:100vw}.fa-grid{grid-template-columns:1fr}.fa-body{padding:16px 15px 100px}.fa-top{padding:16px 15px 13px}.fa-tabs{padding:0 10px}.fa-rail{grid-template-columns:repeat(2,1fr)}.fa-dim:nth-child(2){border-right:0}.fa-dim:nth-child(-n+2){border-bottom:1px solid #20292e}.fa-field{grid-template-columns:72px 1fr}}', | |
| '@media(prefers-reduced-motion:reduce){#fa-panel,#fa-scrim{transition:none}.fa-loading:before{animation:none}}' | |
| ].join(''); | |
| function injectStyle(){ if(document.getElementById('fa-style'))return; var s=document.createElement('style');s.id='fa-style';s.textContent=css;document.head.appendChild(s); } | |
| function badge(value){var label=String(value||'UNKNOWN');return '<span class="fa-badge '+esc(label.toLowerCase())+'">'+esc(label.replace(/_/g,'-'))+'</span>';} | |
| function dim(label,value){var v=String(value||'UNKNOWN');return '<div class="fa-dim"><span class="fa-dim-label">'+esc(label)+'</span><span class="fa-dim-value '+esc(v.toLowerCase())+'">'+esc(v.replace(/_/g,'-'))+'</span></div>';} | |
| function list(values,ordered){if(!Array.isArray(values)||!values.length)return '<span>None declared.</span>';var tag=ordered?'ol':'ul';return '<'+tag+'>'+values.map(function(v){return '<li>'+esc(v)+'</li>';}).join('')+'</'+tag+'>';} | |
| function links(values){if(!Array.isArray(values)||!values.length)return '';return '<div class="fa-refs">'+values.map(function(url,i){return '<a class="fa-ref" href="'+esc(url)+'" target="_blank" rel="noopener">source '+(i+1)+' ↗</a>';}).join('')+'</div>';} | |
| function sectionHead(title){return '<div class="fa-section-head"><h3>'+esc(title)+'</h3><span class="fa-rule"></span></div>';} | |
| function updateRail(){ | |
| var d=state.manifest&&state.manifest.state_dimensions||{}; | |
| if(state.evidence)d=Object.assign({},d,{evidence_state:state.evidence.evidence_state,verification_state:state.evidence.verification_state==='AVAILABLE'?'AVAILABLE':d.verification_state}); | |
| var rail=document.getElementById('fa-rail');if(rail)rail.innerHTML=dim('transport',d.transport_state)+dim('evidence',d.evidence_state)+dim('verification',d.verification_state)+dim('authority',d.authority_state); | |
| var sub=document.querySelector('#fa-launch .fa-l2');if(sub)sub.textContent=(d.evidence_state||'loading')+' evidence · read-only'; | |
| } | |
| function overviewHTML(){ | |
| var m=state.manifest||{},d=m.state_dimensions||{}; | |
| return '<section class="fa-section">'+sectionHead('Mission contract')+'<p class="fa-lede">'+esc(m.purpose||'Read-only spatial evidence map of the governed-agent substrate.')+'</p><div class="fa-callout">One green light is not enough. Transport, evidence, verification, and authority are independent dimensions; this console refuses to collapse them into a single “healthy” claim.</div></section>'+ | |
| '<section class="fa-section">'+sectionHead('Current posture')+'<div class="fa-grid"><div class="fa-stat"><div class="k">Transport</div><div class="v">'+esc(d.transport_state||'—')+'</div><p>Can this Space answer a request?</p></div><div class="fa-stat"><div class="k">Evidence</div><div class="v">'+esc(state.evidence&&state.evidence.evidence_state||d.evidence_state||'—')+'</div><p>Live, computed, snapshot, modeled, or unavailable?</p></div><div class="fa-stat"><div class="k">Verification</div><div class="v">'+esc(d.verification_state||'—')+'</div><p>The local receipt is unsigned and structural-only.</p></div><div class="fa-stat"><div class="k">Authority</div><div class="v">'+esc(d.authority_state||'—')+'</div><p>Anatomy reads and explains; it cannot actuate.</p></div></div><div class="fa-actions"><button class="fa-btn primary" id="fa-verify-bundle">Verify deployed bundle</button><button class="fa-btn" id="fa-refresh">Refresh live evidence</button><a class="fa-link" href="/.well-known/szl-source.json" target="_blank" rel="noopener">Source attestation ↗</a></div><div id="fa-overview-output" aria-live="polite"></div></section>'+ | |
| '<section class="fa-section">'+sectionHead('Honest boundary')+list(m.limits||[],false)+'</section>'; | |
| } | |
| function capabilitiesHTML(){ | |
| var rows=state.capabilities&&state.capabilities.capabilities||[];if(!rows.length)return '<div class="fa-loading">Capability contract unavailable</div>'; | |
| return '<section class="fa-section">'+sectionHead('Five-part capability shell')+'<p class="fa-lede" style="font-size:12px">Every surface declares Purpose, Try, Evidence, Limits, and Reproduce before it earns a place in the body.</p></section>'+rows.map(function(cap,i){ | |
| var ev=cap.evidence||{},t=cap.try||{},r=cap.reproduce||{}; | |
| return '<details class="fa-cap"'+(i===0?' open':'')+'><summary><span class="fa-num">'+String(i+1).padStart(2,'0')+'</span><span class="fa-cap-name">'+esc(cap.name)+'<span class="fa-cap-id">'+esc(cap.id)+'</span></span>'+badge(ev.state)+'</summary><div class="fa-cap-body"><dl><div class="fa-field"><dt>Purpose</dt><dd>'+esc(cap.purpose)+'</dd></div><div class="fa-field"><dt>Try</dt><dd>'+esc(t.action||'')+'<code class="fa-code">'+esc((t.method||'')+' '+(t.path||''))+'</code></dd></div><div class="fa-field"><dt>Evidence</dt><dd>'+badge(ev.state)+' '+esc(ev.basis||'')+'</dd></div><div class="fa-field"><dt>Limits</dt><dd>'+list(cap.limits,false)+'</dd></div><div class="fa-field"><dt>Reproduce</dt><dd>'+list(r.steps,true)+'</dd></div><div class="fa-field"><dt>Authority</dt><dd>'+badge(cap.authority_state)+'</dd></div><div class="fa-field"><dt>Formula refs</dt><dd>'+(cap.formula_refs&&cap.formula_refs.length?esc(cap.formula_refs.join(' · ')):'None — visual capability only.')+links(cap.provenance)+'</dd></div></dl></div></details>'; | |
| }).join(''); | |
| } | |
| function evidenceHTML(){ | |
| if(!state.evidence)return '<div class="fa-loading">Measuring declared dependencies</div>';var e=state.evidence; | |
| return '<section class="fa-section">'+sectionHead('Measured dependency plane')+'<p class="fa-lede" style="font-size:12px">'+esc(e.scope)+'</p><div class="fa-callout">Observed '+esc(e.observed_at)+' · '+esc(e.summary&&e.summary.live)+'/'+esc(e.summary&&e.summary.total)+' declared contracts available.</div>'+(e.dependencies||[]).map(function(dep){return '<div class="fa-dep"><div><span class="fa-dep-name">'+esc(dep.id)+'</span><span class="fa-dep-purpose">'+esc(dep.purpose)+'</span><span class="fa-dep-meta">'+esc(dep.method+' '+dep.url)+'</span></div><div class="fa-dep-state">'+badge(dep.contract_state)+'<span class="fa-http">HTTP '+esc(dep.http_status==null?'—':dep.http_status)+'</span></div></div>';}).join('')+'<div class="fa-actions"><button class="fa-btn primary" id="fa-refresh">Re-probe now</button><a class="fa-link" href="https://huggingface.co/spaces/SZLHOLDINGS/governed-receipt-verifier" target="_blank" rel="noopener">Independent verifier ↗</a></div></section><section class="fa-section">'+sectionHead('Interpretation limits')+list(e.limits,false)+'</section>'; | |
| } | |
| function reproduceHTML(){ | |
| var ep=state.manifest&&state.manifest.endpoints||{},desc={version:'Exact GitHub source and deployed Space revision.',evidence_index:'Release identity, structural bundle receipt, and dependency evidence index.',manifest:'Contract, vocabulary, doctrine boundary, and limits.',capabilities:'Purpose / Try / Evidence / Limits / Reproduce for each capability.',evidence:'Fresh server-side probes of declared upstream contracts.',receipt:'Deterministic SHA-256 receipt over the deployed artifact set.',verify_receipt:'POST a local anatomy receipt; structural integrity only.',source:'GitHub base, measured HF revision, artifact digest, and alignment state.'}; | |
| return '<section class="fa-section">'+sectionHead('Machine-readable contract')+Object.keys(ep).map(function(k){var p=ep[k];return '<div class="fa-endpoint"><a href="'+esc(p.replace('?refresh=1',''))+'" target="_blank" rel="noopener">'+esc(p)+' ↗</a><p>'+esc(desc[k]||'')+'</p></div>';}).join('')+'</section><section class="fa-section">'+sectionHead('Receipt replay')+'<p class="fa-lede" style="font-size:12px">Generate the receipt, then submit the unchanged object to the local verifier. A byte or digest mutation must produce FAIL.</p><code class="fa-code">GET /api/anatomy/v1/receipt<br>POST /api/anatomy/v1/verify/receipt</code><div class="fa-actions"><button class="fa-btn primary" id="fa-verify-bundle">Run replay now</button><a class="fa-link" href="https://github.com/szl-holdings/anatomy" target="_blank" rel="noopener">GitHub source ↗</a></div><div id="fa-overview-output" aria-live="polite"></div></section>'; | |
| } | |
| function bodyHTML(){if(!state.manifest||!state.capabilities)return '<div class="fa-loading">Loading anatomy contract</div>';if(state.tab==='capabilities')return capabilitiesHTML();if(state.tab==='evidence')return evidenceHTML();if(state.tab==='reproduce')return reproduceHTML();return overviewHTML();} | |
| function render(){updateRail();var body=document.getElementById('fa-body');if(body)body.innerHTML=bodyHTML();document.querySelectorAll('.fa-tab').forEach(function(b){b.classList.toggle('active',b.getAttribute('data-tab')===state.tab);b.setAttribute('aria-selected',b.classList.contains('active')?'true':'false');});wireBodyActions();} | |
| function setOutput(html,kind){var out=document.getElementById('fa-overview-output');if(out)out.innerHTML='<div class="fa-output '+esc(kind||'')+'">'+html+'</div>';} | |
| function verifyBundle(){ | |
| if(state.busy)return;state.busy=true;setOutput('Hashing the deployed artifact set and replaying the receipt…',''); | |
| fetchJSON(API+'/receipt').then(function(res){if(!res.ok)return res;return fetchJSON(API+'/verify/receipt',{method:'POST',headers:{'Content-Type':'application/json'},body:JSON.stringify(res.data)});}).then(function(res){state.busy=false;if(!res||!res.ok||!res.data){setOutput('Verifier unavailable. No verdict was inferred.','bad');return;}var checks=(res.data.checks||[]).map(function(c){return esc(c.name)+'='+esc(c.status);}).join(' · ');setOutput('<strong>'+esc(res.data.verdict)+'</strong><br>'+checks+'<br><span style="color:#66777a">'+esc(res.data.limits)+'</span>',res.data.verdict==='FAIL'?'bad':'good');}); | |
| } | |
| function loadEvidence(force){fetchJSON(API+'/evidence'+(force?'?refresh=1':''),{},16000).then(function(res){state.evidence=res.ok?res.data:{evidence_state:'UNAVAILABLE',verification_state:'UNAVAILABLE',scope:'Evidence endpoint unavailable.',summary:{live:0,total:0},dependencies:[],limits:['No dependency state was inferred.']};render();});} | |
| function wireBodyActions(){document.querySelectorAll('#fa-refresh').forEach(function(b){b.addEventListener('click',function(){b.disabled=true;if(state.tab==='evidence'){state.evidence=null;render();}loadEvidence(true);});});document.querySelectorAll('#fa-verify-bundle').forEach(function(b){b.addEventListener('click',verifyBundle);});} | |
| function open(){previousFocus=document.activeElement;document.body.classList.add('fa-open');document.getElementById('fa-panel').classList.add('open');document.getElementById('fa-panel').setAttribute('aria-hidden','false');document.getElementById('fa-scrim').classList.add('open');document.getElementById('fa-launch').setAttribute('aria-expanded','true');document.getElementById('fa-close').focus();} | |
| function close(){document.body.classList.remove('fa-open');document.getElementById('fa-panel').classList.remove('open');document.getElementById('fa-panel').setAttribute('aria-hidden','true');document.getElementById('fa-scrim').classList.remove('open');document.getElementById('fa-launch').setAttribute('aria-expanded','false');if(previousFocus&&previousFocus.focus)previousFocus.focus();} | |
| function mount(){ | |
| if(document.getElementById('fa-panel'))return;injectStyle(); | |
| var launch=document.createElement('button');launch.id='fa-launch';launch.type='button';launch.setAttribute('aria-controls','fa-panel');launch.setAttribute('aria-expanded','false');launch.innerHTML='<span class="fa-l1"><i class="fa-signal"></i>Evidence bay</span><span class="fa-l2">loading contract · read-only</span>'; | |
| var scrim=document.createElement('div');scrim.id='fa-scrim';var panel=document.createElement('aside');panel.id='fa-panel';panel.setAttribute('role','dialog');panel.setAttribute('aria-modal','false');panel.setAttribute('aria-hidden','true');panel.setAttribute('aria-label','Anatomy evidence bay');panel.innerHTML='<header class="fa-top"><div class="fa-kicker">Anatomy contract 1.0</div><div class="fa-title-row"><div><h2 class="fa-title">Evidence Bay</h2><p class="fa-subtitle">Purpose · Try · Evidence · Limits · Reproduce</p></div><button class="fa-close" id="fa-close" type="button" aria-label="Close evidence bay">×</button></div></header><div class="fa-rail" id="fa-rail">'+dim('transport','LOADING')+dim('evidence','LOADING')+dim('verification','LOADING')+dim('authority','READ_ONLY')+'</div><nav class="fa-tabs" role="tablist" aria-label="Evidence Bay sections"><button class="fa-tab active" role="tab" data-tab="overview">Overview</button><button class="fa-tab" role="tab" data-tab="capabilities">Capabilities</button><button class="fa-tab" role="tab" data-tab="evidence">Evidence</button><button class="fa-tab" role="tab" data-tab="reproduce">Reproduce</button></nav><main class="fa-body" id="fa-body"><div class="fa-loading">Loading anatomy contract</div></main>'; | |
| document.body.appendChild(launch);document.body.appendChild(scrim);document.body.appendChild(panel);launch.addEventListener('click',open);scrim.addEventListener('click',close);document.getElementById('fa-close').addEventListener('click',close);document.querySelectorAll('.fa-tab').forEach(function(b){b.addEventListener('click',function(){state.tab=b.getAttribute('data-tab');render();document.getElementById('fa-body').scrollTop=0;});});document.addEventListener('keydown',function(e){if(e.key==='Escape'&&panel.classList.contains('open'))close();}); | |
| Promise.all([fetchJSON(API+'/manifest'),fetchJSON(API+'/capabilities')]).then(function(results){if(results[0].ok)state.manifest=results[0].data;if(results[1].ok)state.capabilities=results[1].data;render();loadEvidence(false);}); | |
| } | |
| root.SZL_ANATOMY_EVIDENCE_BAY={mount:mount,open:open,close:close,refresh:function(){loadEvidence(true);},verifyBundle:verifyBundle}; | |
| if(document.readyState==='loading')document.addEventListener('DOMContentLoaded',mount);else mount(); | |
| })(typeof window!=='undefined'?window:this); | |