[object Object]

← back to Agentabrams Viewer

viewer UI: 3-way status dots (Basic/login/open) + per-dot tooltip

814faa8a083bd90040dfcaa867c7314cc2c21e6e · 2026-07-25 10:18:06 -0700 · Steve Abrams

Front-end now reads authType from /api/status: amber=Basic un/pw, blue=login/SSO,
green=open(no auth), red=down/pw-rejected. Legend + hover tooltip updated so 'is this
protected, and how' is answerable at a glance.

Files touched

Diff

commit 814faa8a083bd90040dfcaa867c7314cc2c21e6e
Author: Steve Abrams <steve@designerwallcoverings.com>
Date:   Sat Jul 25 10:18:06 2026 -0700

    viewer UI: 3-way status dots (Basic/login/open) + per-dot tooltip
    
    Front-end now reads authType from /api/status: amber=Basic un/pw, blue=login/SSO,
    green=open(no auth), red=down/pw-rejected. Legend + hover tooltip updated so 'is this
    protected, and how' is answerable at a glance.
---
 public/index.html | 19 ++++++++++++++++---
 1 file changed, 16 insertions(+), 3 deletions(-)

diff --git a/public/index.html b/public/index.html
index aa6dfc4..9ad6f20 100644
--- a/public/index.html
+++ b/public/index.html
@@ -23,6 +23,7 @@
   .dot { width:8px; height:8px; border-radius:50%; flex:none; background:#555; }
   .dot.up { background:#3fbf6f; }
   .dot.auth { background:#d9a53a; }
+  .dot.login { background:#4a90e2; }
   .dot.down { background:#d95555; }
   .name { flex:1; overflow:hidden; text-overflow:ellipsis; white-space:nowrap; }
   .name b { color:var(--accent); font-weight:600; }
@@ -48,7 +49,7 @@
       <input id="q" type="search" placeholder="Filter domains…" autocomplete="off">
     </header>
     <div id="list"></div>
-    <div id="foot">click a domain → loads in the right panel (unified admin pw auto-applied) · dot: <span style="color:#3fbf6f">up</span> / <span style="color:#d9a53a">auth-gated</span> / <span style="color:#d95555">down or pw rejected</span></div>
+    <div id="foot">click a domain → loads in the right panel (unified admin pw auto-applied) · dot: <span style="color:#d9a53a">Basic un/pw</span> / <span style="color:#4a90e2">login·SSO</span> / <span style="color:#3fbf6f">open (no auth)</span> / <span style="color:#d95555">down or pw rejected</span></div>
   </div>
   <div id="main">
     <div id="bar">
@@ -79,10 +80,22 @@ function render() {
     const s = status[d];
     const row = document.createElement('div');
     row.className = 'item' + (d === current ? ' active' : '');
-    const dotCls = !s ? '' : s.authFail ? 'down' : s.gated ? 'auth' : s.up ? 'up' : 'down';
+    // authType: basic (amber) | login (blue) | open (green) | down/authFail (red).
+    // Falls back to the old gated/up logic if authType is absent.
+    const dotCls = !s ? '' : s.authFail ? 'down'
+      : s.authType === 'basic' ? 'auth'
+      : s.authType === 'login' ? 'login'
+      : s.authType === 'down'  ? 'down'
+      : s.authType === 'open'  ? 'up'
+      : s.gated ? 'auth' : s.up ? 'up' : 'down';
+    const tip = !s ? '' : s.authFail ? 'auth wall — unified pw REJECTED'
+      : s.authType === 'basic' ? 'HTTP Basic un/pw wall'
+      : s.authType === 'login' ? 'app login / SSO (redirect or password form)'
+      : s.authType === 'open'  ? 'OPEN — no auth'
+      : s.authType === 'down'  ? 'unreachable' : '';
     const ed = esc(d);
     const label = f ? ed.replace(esc(f), m => `<b>${m}</b>`) : ed;
-    row.innerHTML = `<span class="dot ${dotCls}"></span><span class="name">${label}</span>` +
+    row.innerHTML = `<span class="dot ${dotCls}" title="${tip}"></span><span class="name">${label}</span>` +
       (s && s.up ? `<span class="ms">${s.ms}ms</span>` : s ? `<span class="ms">—</span>` : '');
     row.onclick = () => select(d);
     list.appendChild(row);

← a983e0c Fix self-XSS in domain search filter: escape filter + labels  ·  back to Agentabrams Viewer  ·  chore: lint (loadDomains try/catch), (session close) ea8bb3a →