diff --git a/docs/iconography-proposal.md b/docs/iconography-proposal.md index fdf4195..6bf7df1 100644 --- a/docs/iconography-proposal.md +++ b/docs/iconography-proposal.md @@ -52,7 +52,8 @@ decorative for assistive technology. | `zds.nav.about` | About | | `zds.account.passkeys` | Fingerprint | | `zds.account.app-passwords` | Key | -| `zds.account.email` | Envelope | +| `zds.account.email` | Envelope (account settings and overview) | +| `zds.account.spaces` | Four spaces (overview) | | `zds.account.status` | Power | | `zds.header.brand` | ZDS brand | | `zds.header.source` | Source forge | diff --git a/src/internal/web/account-appearance.css b/src/internal/web/account-appearance.css index debc7f4..e297185 100644 --- a/src/internal/web/account-appearance.css +++ b/src/internal/web/account-appearance.css @@ -63,3 +63,14 @@ html[data-theme="dark"]{color-scheme:dark;--bg:#070807;--panel:#18221b;--line:#6 html[data-theme="light"]{--bg:#f6f4ed;--panel:#fffdf7;--line:#847866;--text:#161412;--muted:#4f493f;--accent:#1d4ed8;--accent-text:#fffdf7;--green:#17683a;--field:#fffaf1;--bad:#9f1d1d;--warn:#735f00;--focus:#5a3fc0;color-scheme:light} html[data-theme="light"] #view-sessions{--access-surface:#fff;--access-text:#142319;--access-muted:#485c4d;--access-line:#a8baac} html[data-theme="dark"] #view-sessions{--access-surface:#1b251e;--access-text:#f4f7f0;--access-muted:#bac8bd;--access-line:#435749} + +.session-toolbar {display:flex;align-items:center;justify-content:space-between;gap:16px;margin:16px 0} +.panel:not(:has(.resident.on)) .session-toolbar:has(.status:empty) {display:none} +.session-toolbar .status {margin:0;min-width:0;flex:1} +.session-toolbar .resident-actions {display:none;flex:none} +.panel:has(.resident.on) .session-toolbar .resident-actions {display:flex} +.glance-item {display:flex;align-items:center;gap:16px;padding:20px 0;border-bottom:1px solid var(--line)} +.glance-item .icon {width:40px;height:40px;flex:none;color:var(--accent)} +.glance-item .drawing-icon {filter:drop-shadow(0 0 1px #fffdf7)} +.glance-item h4 {margin:0 0 4px;font-size:1rem} +.glance-item .hint {margin:0} diff --git a/src/internal/web/account.html b/src/internal/web/account.html index 792d468..ea2968c 100644 --- a/src/internal/web/account.html +++ b/src/internal/web/account.html @@ -120,9 +120,8 @@ SOFTWARE. -

+

-
Signed in as-
Status-
@@ -139,7 +138,7 @@ SOFTWARE.

Overview

This PDS stores your public repo, private permissioned-space records, blobs, credentials, and app access state. Use the sections above to manage what this server can control.

Experimental data tools: Browse permissioned spaces.

-

At a glance

+

At a glance

Email

—

App access

—

Direct API tokens

—

Permissioned spaces

—

App access

@@ -198,7 +197,7 @@ document.addEventListener('click',e=>{ }); addEventListener('popstate',()=>showView(viewName(),resident.classList.contains('on'))); function updateHeader(){ $('account-handle').textContent=account.handle; $('account-did').textContent=account.did; $('account-status').textContent=account.status||'active'; $('account-email-state').textContent=account.emailConfirmed?'verified':'needs verification'; $('email-copy').textContent=`Current email: ${account.email}${account.emailConfirmed?' (verified)':' (not verified)'}`; $('verify-email-block').classList.toggle('hidden',!!account.emailConfirmed); } -function quickChecks(sessions){const rows=[['email',account.emailConfirmed?'verified':'needs verification',account.emailConfirmed?'active':'inactive'],['app access',`${(sessions.oauthGrants||[]).filter(g=>g.active).length} active`, 'active'],['direct API tokens',`${(sessions.sessions||[]).filter(s=>s.active).length} active`, 'active'],['permissioned spaces',`${spaces.length}`, spaces.length?'active':'inactive']];$('home-checks').innerHTML=rows.map(([a,b,c])=>`
${esc(a)}
${esc(b)}
`).join('')} +function quickChecks(sessions){$('glance-email').textContent=account.emailConfirmed?'verified':'needs verification';$('glance-apps').textContent=`${(sessions.oauthGrants||[]).filter(g=>g.active).length} active`;$('glance-tokens').textContent=`${(sessions.sessions||[]).filter(s=>s.active).length} active`;$('glance-spaces').textContent=String(spaces.length)} const b64ToBuf=(v)=>{const b64=v.replace(/-/g,'+').replace(/_/g,'/');const bin=atob(b64+'==='.slice((b64.length+3)%4));const out=new Uint8Array(bin.length);for(let i=0;ibtoa(String.fromCharCode(...new Uint8Array(buf))).replace(/\+/g,'-').replace(/\//g,'_').replace(/=+$/,''); const prepCreate=(o)=>{const p=o.publicKey;p.challenge=b64ToBuf(p.challenge);p.user.id=b64ToBuf(p.user.id);p.excludeCredentials=(p.excludeCredentials||[]).map(c=>({...c,id:b64ToBuf(c.id)}));return o}; diff --git a/src/internal/web/icons/slots.zig b/src/internal/web/icons/slots.zig index 47f5e04..d2de478 100644 --- a/src/internal/web/icons/slots.zig +++ b/src/internal/web/icons/slots.zig @@ -1,9 +1,9 @@ const std = @import("std"); pub const names = [_][]const u8{ - "zds.nav.home", "zds.nav.account", "zds.nav.apps", "zds.nav.about", - "zds.account.passkeys", "zds.account.app-passwords", "zds.account.email", "zds.account.status", - "zds.header.brand", "zds.header.source", "zds.header.zat", "zds.header.atproto", - "zds.header.menu", "zds.header.preferences", + "zds.nav.home", "zds.nav.account", "zds.nav.apps", "zds.nav.about", + "zds.account.passkeys", "zds.account.app-passwords", "zds.account.email", "zds.account.status", + "zds.header.brand", "zds.header.source", "zds.header.zat", "zds.header.atproto", + "zds.account.spaces", "zds.header.menu", "zds.header.preferences", }; pub fn contains(name: []const u8) bool { for (names) |candidate| if (std.mem.eql(u8, name, candidate)) return true;