Spaces:
Running
Running
deploy(hf): sync szl-holdings/a11oy@main derived COPY set
Browse filesReusable Dockerfile-COPY-derived deploy from szl-holdings/a11oy main.
Files: 1050 Pruned: 0
Derived from Dockerfile COPY sources (NO hand-maintained allowlist).
Signed-off-by: SZL Holdings <noreply@szlholdings.ai>
Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
- console/index.html +169 -52
console/index.html
CHANGED
|
@@ -173,6 +173,50 @@ details.raw[open] summary{color:var(--muted);}
|
|
| 173 |
.tl-graphbox{height:380px;background:#080808;border:1px solid var(--gold-line);border-radius:10px}
|
| 174 |
.ln-dagbox{height:440px;background:#080808;border:1px solid var(--gold-line);border-radius:10px}
|
| 175 |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 176 |
</style>
|
| 177 |
</head>
|
| 178 |
<body>
|
|
@@ -195,58 +239,11 @@ details.raw[open] summary{color:var(--muted);}
|
|
| 195 |
<div class="app">
|
| 196 |
<aside class="side">
|
| 197 |
<div class="brand"><div class="mark">A</div><div><div class="nm">a11oy</div><div class="role">orchestrating brain</div></div></div>
|
| 198 |
-
<
|
| 199 |
-
<div class="nav-
|
| 200 |
-
<div class="
|
| 201 |
-
<div class="nav-
|
| 202 |
-
<div class="
|
| 203 |
-
<div class="nav-item" data-view="fleet" onclick="go('fleet')"><span class="ico">⊟</span>System Health</div>
|
| 204 |
-
<div class="nav-item" data-view="mesh" onclick="go('mesh')"><span class="ico">⊹</span>Live System Map</div>
|
| 205 |
-
<div class="nav-group">The Brain (3D)</div>
|
| 206 |
-
<div class="nav-item" data-view="organism" onclick="go('organism')"><span class="ico">❋</span>Living Organism</div>
|
| 207 |
-
<div class="nav-item" data-view="ayni" onclick="go('ayni')"><span class="ico">♺</span>Reciprocity</div>
|
| 208 |
-
<div class="nav-item" data-view="chain" onclick="go('chain')"><span class="ico">⛓</span>Receipt Chain</div>
|
| 209 |
-
<div class="nav-item" data-view="pulse" onclick="go('pulse')"><span class="ico">◍</span>Global Pulse</div>
|
| 210 |
-
<div class="nav-item" data-view="trustspace" onclick="go('trustspace')"><span class="ico">⁂</span>Trust Space</div>
|
| 211 |
-
<div class="nav-item" data-view="ontology" onclick="go('ontology')"><span class="ico">⌗</span>Service Map</div>
|
| 212 |
-
<div class="nav-group">Knowledge Base</div>
|
| 213 |
-
<div class="nav-item" data-view="knowledge" onclick="go('knowledge')"><span class="ico">⬡</span>Knowledge Ontology</div>
|
| 214 |
-
<div class="nav-item" data-view="kbformulas" onclick="go('kbformulas')"><span class="ico">∑</span>Formulas</div>
|
| 215 |
-
<div class="nav-item" data-view="policies" onclick="go('policies')"><span class="ico">▤</span>Vertical Policies</div>
|
| 216 |
-
<div class="nav-group">Decide & Govern</div>
|
| 217 |
-
<div class="nav-item" data-view="lambda" onclick="go('lambda')"><span class="ico">◔</span>Trust Score</div>
|
| 218 |
-
<div class="nav-item" data-view="decision" onclick="go('decision')"><span class="ico">◈</span>Governed Decision</div>
|
| 219 |
-
<div class="nav-item" data-view="gates" onclick="go('gates')"><span class="ico">⊠</span>Safety Gates</div>
|
| 220 |
-
<div class="nav-item" data-view="feed" onclick="go('feed')"><span class="ico">∿</span>Live Decisions</div>
|
| 221 |
-
<div class="nav-item" data-view="govern" onclick="go('govern')"><span class="ico">✓</span>Readiness & Compliance</div>
|
| 222 |
-
<div class="nav-item" data-view="chat" onclick="go('chat')"><span class="ico">✦</span>Governed AI Chat</div>
|
| 223 |
-
<div class="nav-item" data-view="forecast" onclick="go('forecast')"><span class="ico">↗</span>Forecast</div>
|
| 224 |
-
<div class="nav-group">Prove & Verify</div>
|
| 225 |
-
<div class="nav-item" data-view="receipts" onclick="go('receipts')"><span class="ico">⎙</span>Signed Receipts</div>
|
| 226 |
-
<div class="nav-item" data-view="arena" onclick="go('arena')"><span class="ico">⊜</span>Eval Arena</div>
|
| 227 |
-
<div class="nav-item" data-view="threats" onclick="go('threats')"><span class="ico">☠</span>Threat Library</div>
|
| 228 |
-
<div class="nav-group">World & Threat Intel</div>
|
| 229 |
-
<div class="nav-item" data-view="cve" onclick="go('cve')"><span class="ico">⚠</span>CVE Watch</div>
|
| 230 |
-
<div class="nav-item" data-view="kev" onclick="go('kev')"><span class="ico">⊕</span>Known-Exploited</div>
|
| 231 |
-
<div class="nav-item" data-view="attack" onclick="go('attack')"><span class="ico">⚔</span>Adversary Techniques</div>
|
| 232 |
-
<div class="nav-group">Business & Ecosystem</div>
|
| 233 |
-
<div class="nav-item" data-view="business" onclick="go('business')"><span class="ico">◑</span>Business Observability</div>
|
| 234 |
-
<div class="nav-item" data-view="verticals" onclick="go('verticals')"><span class="ico">▦</span>Vertical-Pack Ecosystem</div>
|
| 235 |
-
<div class="nav-group">Models & Tools</div>
|
| 236 |
-
<div class="nav-item" data-view="llm" onclick="go('llm')"><span class="ico">⚇</span>Model Router</div>
|
| 237 |
-
<div class="nav-item" data-view="mcp" onclick="go('mcp')"><span class="ico">⚙</span>Agent Tools</div>
|
| 238 |
-
<div class="nav-item" data-view="honest" onclick="go('honest')"><span class="ico">⊘</span>What We Claim</div>
|
| 239 |
-
<div class="nav-group">Leader-Grade (NEW)</div>
|
| 240 |
-
<div class="nav-item" data-view="ledger3d" onclick="go('ledger3d')"><span class="ico">◈</span>Trust Ledger</div>
|
| 241 |
-
<div class="nav-item" data-view="lineage" onclick="go('lineage')"><span class="ico">⚛</span>Knowledge Lineage</div>
|
| 242 |
-
<div class="nav-item" data-view="mission" onclick="go('mission')"><span class="ico">⬢</span>Mission Health</div>
|
| 243 |
-
<div class="nav-item" data-view="replay" onclick="go('replay')"><span class="ico">◷</span>Reasoning Replay</div>
|
| 244 |
-
<div class="nav-group">Doctrine</div>
|
| 245 |
-
<div class="nav-item" data-view="gpd" onclick="go('gpd')"><span class="ico">⟁</span>Governed Post-Determinism</div>
|
| 246 |
-
<div class="nav-group">Experimental (CI-green)</div>
|
| 247 |
-
<div class="nav-item" data-view="experimental" onclick="go('experimental')"><span class="ico">⚗</span>Experimental Tier</div>
|
| 248 |
-
<div class="nav-item" onclick="window.open('/proven-formulas','_blank')" style="cursor:pointer"><span class="ico">∿</span>Wave9/10 Formulas ↗</div>
|
| 249 |
-
<div class="nav-item" onclick="window.open('/frontier','_blank')" style="cursor:pointer"><span class="ico">◌</span>Frontier Showcase ↗</div>
|
| 250 |
<div class="side-foot">Trust score = research conjecture<br>8 formulas formally proven<br>SLSA L1 honest · L2 build-attested (Rekor) · L3+ roadmap · 5 services<br>Verifiable receipts · honest by design<br><span style="color:#c9a05f;font-size:9px">+ 80+ EXPERIMENTAL · CI-green</span></div>
|
| 251 |
</aside>
|
| 252 |
|
|
@@ -1592,6 +1589,7 @@ function go(view){
|
|
| 1592 |
v.render(el('vbody'));
|
| 1593 |
if(history.replaceState)history.replaceState(null,'','#'+view);
|
| 1594 |
if(window.innerWidth<=820)document.querySelector('.side').classList.remove('open');
|
|
|
|
| 1595 |
}
|
| 1596 |
const start=(location.hash||'#command').slice(1);
|
| 1597 |
go(VIEWS[start]?start:'command');
|
|
@@ -1945,5 +1943,124 @@ async function operate_run(){
|
|
| 1945 |
window.operate_run=operate_run;
|
| 1946 |
|
| 1947 |
</script>
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1948 |
</body>
|
| 1949 |
</html>
|
|
|
|
| 173 |
.tl-graphbox{height:380px;background:#080808;border:1px solid var(--gold-line);border-radius:10px}
|
| 174 |
.ln-dagbox{height:440px;background:#080808;border:1px solid var(--gold-line);border-radius:10px}
|
| 175 |
|
| 176 |
+
|
| 177 |
+
/* ===== IA REDESIGN — domain rail + flagships + command palette ===== */
|
| 178 |
+
/* Collapses the flat ~40-item nav into a persistent 7-domain rail + a featured
|
| 179 |
+
flagship row + a fuzzy ⌘K palette. Every view stays reachable. Static CSS. */
|
| 180 |
+
.cmdk-btn{display:flex;align-items:center;gap:.5rem;width:100%;margin:.1rem 0 .3rem;padding:.55rem .6rem;border-radius:8px;
|
| 181 |
+
border:1px solid var(--gold-line);background:var(--panel);color:var(--paragraph);font-family:var(--mono);font-size:11px;cursor:pointer;transition:.15s;letter-spacing:.03em;text-align:left;}
|
| 182 |
+
.cmdk-btn:hover{border-color:var(--teal-line);color:var(--cream);background:var(--teal-soft);}
|
| 183 |
+
.cmdk-btn .ico{font-size:13px;color:var(--teal);}
|
| 184 |
+
.cmdk-btn .kbd{margin-left:auto;font-size:9px;color:var(--dim);border:1px solid var(--gold-line);border-radius:4px;padding:.05rem .32rem;}
|
| 185 |
+
/* flagships (max 5) */
|
| 186 |
+
.featured{display:grid;grid-template-columns:1fr 1fr;gap:.42rem;margin:.15rem .05rem .35rem;}
|
| 187 |
+
.flag-card{display:flex;align-items:center;gap:.45rem;padding:.5rem .55rem;border-radius:8px;cursor:pointer;
|
| 188 |
+
border:1px solid var(--gold-line);background:linear-gradient(135deg,rgba(201,183,135,.07),rgba(95,179,163,.05));
|
| 189 |
+
color:var(--cream);font-size:11.5px;transition:.15s;border-left:2px solid var(--gold-line);}
|
| 190 |
+
.flag-card:hover{border-color:var(--teal-line);background:var(--teal-soft);}
|
| 191 |
+
.flag-card.active{border-color:var(--teal);border-left-color:var(--teal);color:var(--teal);}
|
| 192 |
+
.flag-card .ico{font-size:12px;color:var(--gold);}
|
| 193 |
+
.flag-card.full{grid-column:1 / -1;}
|
| 194 |
+
/* domain rail (accordion) */
|
| 195 |
+
.dom{display:flex;align-items:center;gap:.55rem;padding:.5rem .6rem;border-radius:7px;cursor:pointer;color:var(--cream);
|
| 196 |
+
font-size:12.5px;font-weight:500;transition:.15s;border:1px solid transparent;}
|
| 197 |
+
.dom:hover{background:var(--gold-soft);}
|
| 198 |
+
.dom.open{color:var(--teal);}
|
| 199 |
+
.dom .ico{width:16px;text-align:center;color:var(--teal);font-size:13px;}
|
| 200 |
+
.dom .count{font-family:var(--mono);font-size:9px;color:var(--dim);margin-left:.15rem;}
|
| 201 |
+
.dom .chev{margin-left:auto;color:var(--dim);font-size:10px;transition:transform .15s;}
|
| 202 |
+
.dom.open .chev{transform:rotate(90deg);color:var(--teal);}
|
| 203 |
+
.domidx{display:none;margin:.05rem 0 .45rem .55rem;padding-left:.35rem;border-left:1px solid var(--gold-line);}
|
| 204 |
+
.domidx.open{display:block;}
|
| 205 |
+
/* ⌘K command palette overlay */
|
| 206 |
+
.pal-ov{position:fixed;inset:0;z-index:200;background:rgba(4,4,4,.72);backdrop-filter:blur(3px);display:none;align-items:flex-start;justify-content:center;}
|
| 207 |
+
.pal-ov.open{display:flex;}
|
| 208 |
+
.palette{margin-top:9vh;width:min(640px,92vw);background:var(--panel);border:1px solid var(--teal-line);border-radius:12px;overflow:hidden;box-shadow:0 24px 80px rgba(0,0,0,.6);}
|
| 209 |
+
.palette input{width:100%;box-sizing:border-box;padding:1rem 1.1rem;background:var(--panel2);border:none;border-bottom:1px solid var(--gold-line);
|
| 210 |
+
color:var(--cream);font-family:var(--mono);font-size:14px;outline:none;}
|
| 211 |
+
.palette input::placeholder{color:var(--dim);}
|
| 212 |
+
.pal-hint{display:flex;gap:1rem;flex-wrap:wrap;padding:.4rem 1.1rem;font-family:var(--mono);font-size:9px;color:var(--dim);letter-spacing:.1em;text-transform:uppercase;border-bottom:1px solid var(--gold-soft);}
|
| 213 |
+
.pal-list{max-height:56vh;overflow:auto;padding:.4rem;}
|
| 214 |
+
.pal-item{display:flex;align-items:center;gap:.7rem;padding:.55rem .7rem;border-radius:8px;cursor:pointer;color:var(--paragraph);font-size:13px;}
|
| 215 |
+
.pal-item .ico{width:16px;text-align:center;color:var(--teal);}
|
| 216 |
+
.pal-item .dom-tag{margin-left:auto;font-family:var(--mono);font-size:9px;color:var(--dim);letter-spacing:.08em;text-transform:uppercase;}
|
| 217 |
+
.pal-item.sel,.pal-item:hover{background:var(--teal-soft);color:var(--cream);}
|
| 218 |
+
.pal-empty{padding:1.2rem;text-align:center;color:var(--dim);font-family:var(--mono);font-size:11px;}
|
| 219 |
+
|
| 220 |
</style>
|
| 221 |
</head>
|
| 222 |
<body>
|
|
|
|
| 239 |
<div class="app">
|
| 240 |
<aside class="side">
|
| 241 |
<div class="brand"><div class="mark">A</div><div><div class="nm">a11oy</div><div class="role">orchestrating brain</div></div></div>
|
| 242 |
+
<button class="cmdk-btn" onclick="openPalette()" title="Search every view — ⌘K / Ctrl-K"><span class="ico">⌕</span>Search all views<span class="kbd">⌘K</span></button>
|
| 243 |
+
<div class="nav-group">Flagships</div>
|
| 244 |
+
<div class="featured" id="featured"></div>
|
| 245 |
+
<div class="nav-group">Domains</div>
|
| 246 |
+
<div class="rail" id="rail"></div>
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 247 |
<div class="side-foot">Trust score = research conjecture<br>8 formulas formally proven<br>SLSA L1 honest · L2 build-attested (Rekor) · L3+ roadmap · 5 services<br>Verifiable receipts · honest by design<br><span style="color:#c9a05f;font-size:9px">+ 80+ EXPERIMENTAL · CI-green</span></div>
|
| 248 |
</aside>
|
| 249 |
|
|
|
|
| 1589 |
v.render(el('vbody'));
|
| 1590 |
if(history.replaceState)history.replaceState(null,'','#'+view);
|
| 1591 |
if(window.innerWidth<=820)document.querySelector('.side').classList.remove('open');
|
| 1592 |
+
if(window.syncRail)window.syncRail(view);
|
| 1593 |
}
|
| 1594 |
const start=(location.hash||'#command').slice(1);
|
| 1595 |
go(VIEWS[start]?start:'command');
|
|
|
|
| 1943 |
window.operate_run=operate_run;
|
| 1944 |
|
| 1945 |
</script>
|
| 1946 |
+
<div class="pal-ov" id="pal-ov" onclick="if(event.target===this)closePalette()">
|
| 1947 |
+
<div class="palette" role="dialog" aria-label="Command palette — search all views">
|
| 1948 |
+
<input id="pal-input" type="text" placeholder="Search all views… type to filter · ↑↓ move · ↵ open · Esc close" autocomplete="off" spellcheck="false" aria-label="Search all views"/>
|
| 1949 |
+
<div class="pal-hint"><span>⌘K / Ctrl-K</span><span>↑↓ navigate</span><span>↵ open</span><span>Esc close</span></div>
|
| 1950 |
+
<div class="pal-list" id="pal-list"></div>
|
| 1951 |
+
</div>
|
| 1952 |
+
</div>
|
| 1953 |
+
|
| 1954 |
+
<script>
|
| 1955 |
+
/* ============================================================================
|
| 1956 |
+
IA REDESIGN — persistent 7-domain rail + 5 flagships + ⌘K command palette
|
| 1957 |
+
Collapses the flat ~40-item nav WITHOUT removing any view. Every VIEWS entry
|
| 1958 |
+
stays reachable via its domain index panel AND the fuzzy palette. External
|
| 1959 |
+
links (/proven-formulas, /frontier) are preserved in the Doctrine domain and
|
| 1960 |
+
the palette. Static HTML/JS only — no framework. Honest labels + doctrine bar
|
| 1961 |
+
are untouched. Palantir/Anduril command-center IA: hierarchy + persistent
|
| 1962 |
+
context over a flat wall of pills.
|
| 1963 |
+
============================================================================ */
|
| 1964 |
+
(function(){
|
| 1965 |
+
const DOMAINS=[
|
| 1966 |
+
{id:'ops',icon:'◎',label:'Ops & Fleet',full:'Operations & Fleet — command center, governed run-loop, service health & live system maps',views:['command','ask','operate','demo','fleet','mesh','mission','business']},
|
| 1967 |
+
{id:'brain',icon:'❋',label:'Brain & Memory',full:'Brain & Memory — living organism, knowledge ontology, receipt chain, lineage, pulse & trust space',views:['organism','knowledge','chain','pulse','trustspace','ontology','kbformulas','lineage']},
|
| 1968 |
+
{id:'reason',icon:'⚇',label:'Reasoning & Agents',full:'Reasoning & Agents — model router, agent tools, governed chat, eval arena, replay & forecast',views:['llm','mcp','chat','arena','replay','forecast']},
|
| 1969 |
+
{id:'govern',icon:'⊠',label:'Governance & Assurance',full:'Governance & Assurance — governed decisions, safety gates, policies, readiness, live decisions & reciprocity',views:['govern','decision','lambda','gates','feed','policies','ayni']},
|
| 1970 |
+
{id:'proof',icon:'⎙',label:'Proof & Attestation',full:'Proof & Attestation — signed receipts & the verifiable trust ledger',views:['receipts','ledger3d']},
|
| 1971 |
+
{id:'threat',icon:'⚔',label:'World & Threat Intel',full:'World & Threat Intel — threat library, CVE watch, known-exploited & adversary techniques',views:['threats','cve','kev','attack']},
|
| 1972 |
+
{id:'doctrine',icon:'⟁',label:'Doctrine & Frontier',full:'Doctrine & Frontier — what we claim, governed post-determinism, vertical-pack ecosystem & experimental tier',views:['honest','gpd','verticals','experimental'],ext:[{label:'Wave9/10 Formulas',href:'/proven-formulas',icon:'∿'},{label:'Frontier Showcase',href:'/frontier',icon:'◌'}]}
|
| 1973 |
+
];
|
| 1974 |
+
const FLAGSHIPS=[
|
| 1975 |
+
{view:'command',label:'Ops Command',hero:true,tip:'Command Center — one pane of glass over the whole governed-AI platform'},
|
| 1976 |
+
{view:'organism',label:'Living Body',tip:'Living Organism — the platform as one breathing 3D organism'},
|
| 1977 |
+
{view:'knowledge',label:'Knowledge Graph',tip:'Knowledge Ontology — axioms → theorems → formulas, loaded live'},
|
| 1978 |
+
{view:'govern',label:'Governance',tip:'Readiness & Compliance — governed decisions & assurance posture'},
|
| 1979 |
+
{view:'chain',label:'Proof Chain',tip:'Receipt Chain — SHA-256 hash-chained proof-of-governance'}
|
| 1980 |
+
];
|
| 1981 |
+
window.__IA_DOMAINS=DOMAINS;
|
| 1982 |
+
const V=function(){return window.VIEWS||{};};
|
| 1983 |
+
const T=function(id){var v=V()[id];return (v&&v.title)||id;};
|
| 1984 |
+
const SUB=function(id){var v=V()[id];return (v&&v.sub)||'';};
|
| 1985 |
+
const domOf={}; DOMAINS.forEach(function(d){d.views.forEach(function(v){domOf[v]=d;});});
|
| 1986 |
+
// orphan safety net: any VIEWS key not placed in a domain is appended to the
|
| 1987 |
+
// last domain so no view can ever become unreachable if the registry drifts.
|
| 1988 |
+
try{Object.keys(V()).forEach(function(v){if(!domOf[v]){var last=DOMAINS[DOMAINS.length-1];last.views.push(v);domOf[v]=last;}});}catch(e){}
|
| 1989 |
+
function attr(s){return String(s==null?'':s).replace(/"/g,'"');}
|
| 1990 |
+
function navItem(v){
|
| 1991 |
+
var tip=(T(v)+' — '+SUB(v)).slice(0,190);
|
| 1992 |
+
return '<div class="nav-item" data-view="'+v+'" title="'+attr(tip)+'" onclick="go(\''+v+'\')"><span class="ico">▸</span>'+T(v)+'</div>';
|
| 1993 |
+
}
|
| 1994 |
+
function buildRail(){
|
| 1995 |
+
var feat=document.getElementById('featured');
|
| 1996 |
+
if(feat)feat.innerHTML=FLAGSHIPS.map(function(f){
|
| 1997 |
+
return '<div class="flag-card'+(f.hero?' full':'')+'" data-view="'+f.view+'" title="'+attr(f.tip)+'" onclick="go(\''+f.view+'\')"><span class="ico">★</span>'+f.label+'</div>';
|
| 1998 |
+
}).join('');
|
| 1999 |
+
var rail=document.getElementById('rail');
|
| 2000 |
+
if(rail)rail.innerHTML=DOMAINS.map(function(d){
|
| 2001 |
+
var items=d.views.map(navItem).join('');
|
| 2002 |
+
var ext=(d.ext||[]).map(function(e){return '<div class="nav-item" title="opens '+attr(e.href)+' in a new tab" onclick="window.open(\''+e.href+'\',\'_blank\')" style="cursor:pointer"><span class="ico">'+e.icon+'</span>'+e.label+' ↗</div>';}).join('');
|
| 2003 |
+
var n=d.views.length+(d.ext?d.ext.length:0);
|
| 2004 |
+
return '<div class="dom" data-dom="'+d.id+'" title="'+attr(d.full)+'" onclick="toggleDom(\''+d.id+'\')"><span class="ico">'+d.icon+'</span>'+d.label+'<span class="count">'+n+'</span><span class="chev">▸</span></div>'
|
| 2005 |
+
+'<div class="domidx" id="domidx-'+d.id+'">'+items+ext+'</div>';
|
| 2006 |
+
}).join('');
|
| 2007 |
+
}
|
| 2008 |
+
window.toggleDom=function(id){
|
| 2009 |
+
var p=document.getElementById('domidx-'+id);
|
| 2010 |
+
var willOpen=p&&!p.classList.contains('open');
|
| 2011 |
+
document.querySelectorAll('.domidx').forEach(function(x){x.classList.toggle('open',willOpen&&x.id==='domidx-'+id);});
|
| 2012 |
+
document.querySelectorAll('.dom').forEach(function(h){h.classList.toggle('open',willOpen&&h.dataset.dom===id);});
|
| 2013 |
+
};
|
| 2014 |
+
function openDomFor(view){
|
| 2015 |
+
var d=domOf[view];if(!d)return;
|
| 2016 |
+
document.querySelectorAll('.domidx').forEach(function(p){p.classList.toggle('open',p.id==='domidx-'+d.id);});
|
| 2017 |
+
document.querySelectorAll('.dom').forEach(function(h){h.classList.toggle('open',h.dataset.dom===d.id);});
|
| 2018 |
+
}
|
| 2019 |
+
window.syncRail=function(view){
|
| 2020 |
+
document.querySelectorAll('.side .nav-item, .flag-card').forEach(function(n){n.classList.toggle('active',n.dataset.view===view);});
|
| 2021 |
+
openDomFor(view);
|
| 2022 |
+
};
|
| 2023 |
+
|
| 2024 |
+
/* ---- ⌘K command palette (fuzzy over ALL views + external links) ---- */
|
| 2025 |
+
var PAL=[],selIdx=0;
|
| 2026 |
+
function palItems(){
|
| 2027 |
+
var arr=[];
|
| 2028 |
+
DOMAINS.forEach(function(d){
|
| 2029 |
+
d.views.forEach(function(v){arr.push({type:'view',id:v,label:T(v),dom:d.label,icon:'▸',hay:(v+' '+T(v)+' '+d.label+' '+SUB(v)).toLowerCase()});});
|
| 2030 |
+
(d.ext||[]).forEach(function(e){arr.push({type:'ext',href:e.href,label:e.label+' ↗',dom:d.label,icon:e.icon,hay:(e.label+' '+e.href+' '+d.label).toLowerCase()});});
|
| 2031 |
+
});
|
| 2032 |
+
return arr;
|
| 2033 |
+
}
|
| 2034 |
+
function renderPal(q){
|
| 2035 |
+
var list=document.getElementById('pal-list');if(!list)return;
|
| 2036 |
+
var terms=(q||'').trim().toLowerCase().split(/\s+/).filter(Boolean);
|
| 2037 |
+
PAL=palItems().filter(function(it){return terms.every(function(t){return it.hay.indexOf(t)>=0;});});
|
| 2038 |
+
selIdx=0;
|
| 2039 |
+
if(!PAL.length){list.innerHTML='<div class="pal-empty">no matching view</div>';return;}
|
| 2040 |
+
list.innerHTML=PAL.map(function(it,i){return '<div class="pal-item'+(i===0?' sel':'')+'" data-i="'+i+'" onmouseover="palHover('+i+')" onclick="palGo('+i+')"><span class="ico">'+it.icon+'</span>'+attr(it.label)+'<span class="dom-tag">'+attr(it.dom)+'</span></div>';}).join('');
|
| 2041 |
+
}
|
| 2042 |
+
window.palHover=function(i){selIdx=i;document.querySelectorAll('.pal-item').forEach(function(e,j){e.classList.toggle('sel',j===i);});};
|
| 2043 |
+
window.palGo=function(i){var it=PAL[i];if(!it)return;closePalette();if(it.type==='ext')window.open(it.href,'_blank');else go(it.id);};
|
| 2044 |
+
window.openPalette=function(){var ov=document.getElementById('pal-ov');if(!ov)return;ov.classList.add('open');var inp=document.getElementById('pal-input');if(inp){inp.value='';renderPal('');setTimeout(function(){inp.focus();},20);}};
|
| 2045 |
+
window.closePalette=function(){var ov=document.getElementById('pal-ov');if(ov)ov.classList.remove('open');};
|
| 2046 |
+
document.addEventListener('keydown',function(e){
|
| 2047 |
+
if((e.metaKey||e.ctrlKey)&&(e.key==='k'||e.key==='K')){e.preventDefault();openPalette();return;}
|
| 2048 |
+
var ov=document.getElementById('pal-ov');if(!ov||!ov.classList.contains('open'))return;
|
| 2049 |
+
if(e.key==='Escape'){closePalette();}
|
| 2050 |
+
else if(e.key==='ArrowDown'){e.preventDefault();selIdx=Math.min(selIdx+1,PAL.length-1);palHover(selIdx);var s=document.querySelector('.pal-item.sel');if(s)s.scrollIntoView({block:'nearest'});}
|
| 2051 |
+
else if(e.key==='ArrowUp'){e.preventDefault();selIdx=Math.max(selIdx-1,0);palHover(selIdx);var s2=document.querySelector('.pal-item.sel');if(s2)s2.scrollIntoView({block:'nearest'});}
|
| 2052 |
+
else if(e.key==='Enter'){e.preventDefault();palGo(selIdx);}
|
| 2053 |
+
});
|
| 2054 |
+
|
| 2055 |
+
function init(){
|
| 2056 |
+
buildRail();
|
| 2057 |
+
var cur=(location.hash||'#command').slice(1);
|
| 2058 |
+
window.syncRail(V()[cur]?cur:'command');
|
| 2059 |
+
var inp=document.getElementById('pal-input');if(inp)inp.addEventListener('input',function(e){renderPal(e.target.value);});
|
| 2060 |
+
}
|
| 2061 |
+
if(document.readyState!=='loading')init();else document.addEventListener('DOMContentLoaded',init);
|
| 2062 |
+
})();
|
| 2063 |
+
</script>
|
| 2064 |
+
|
| 2065 |
</body>
|
| 2066 |
</html>
|