feat(admin): shell + Overview — regrouped rail, header band, meters #326

Merged
Cordy merged 9 commits from feat/admin-shell into main 2026-08-27 16:24:33 +00:00
Owner

Admin redesign, slice A of four — ported from admin-mockup.html. Sets the pattern the remaining twelve topics follow.

Rail: five groups → three

"Federation" and "Billing" each held a single item; a label that names a group of one says nothing. Per the operator's call, Federation joins access and sharing (Access, sharing & federation: Users, Encryption, Sharing, Spaces, Peering) and Billing keeps its own group with Licensing. Instance is unchanged. The groups now match the Overview's section headings, so rail and page agree on how the instance is divided.

Exit moves out of the rail

"← Files" was a nav item for leaving the mode — easy to miss, and the wrong column for the action. It becomes "Exit to files" in a labelled header band (shield crumb → Administration / topic, title, description). Same #admin-back id, so the existing closeAdmin binding is untouched. The description reserves two lines, so moving between thirteen topics never shifts where content starts.

Overview: three stat cards → two meters + grouped status rows

Only a quantity with a denominator earns a tile. Of the shipped three, peers had none (a tile reading "0") and version is a string. Now:

  • Meters for storage (used / total, with a real fill) and seats (used / licensed) — each rendered only when the denominator exists, falling back to a status row otherwise.
  • Status rows grouped under Instance / Access, sharing and federation / Billing, using the file-list chip component (ok / off / link) instead of the parallel .kvbadge vocabulary, and the 3-column key/value/state grid so the state column lines up down the page.
  • Peering now reads "N peers registered" rather than a bare count with no denominator.
  • .ovlabel's uppercase + .09em tracking is gone with the cards — the same "generated" tell removed from the file-list headers.

New i18n keys (en/de/fr/it): adminExit, admGrpAccess, admGrpBilling, admSecInstance, admSecAccess, admSecBilling, ovSeats, ovStorageUsed, ovOfN, ovFree, ovUnassigned, ovPeersN.

Verification

node --check on all script blocks; eight anchored splices, each guarded at count=1; asserted the meters builder exists, the exit control appears exactly once, and three rail groups remain. Operator check: avatar → Administration.

Deliberately not in this slice

  • The attention strip (.notice, "an update is available") — the update check lives in the Updates topic and isn't loaded on Overview; wiring it needs that data path, so it lands with slice D rather than inventing a banner.
  • Several Overview facts the mockup shows have no API behind them yet (audit event count, active-link count, retention floor, storage driver name) — omitted rather than faked. Recorded below.
  • .ovcard/.ovcards/.ovlabel/.ovnum/.kvbadge CSS is now dead but left in place; .kvbadge may still be referenced elsewhere, so removal belongs in the selector-sweep pass.
Admin redesign, slice A of four — ported from `admin-mockup.html`. Sets the pattern the remaining twelve topics follow. ## Rail: five groups → three "Federation" and "Billing" each held a single item; a label that names a group of one says nothing. Per the operator's call, Federation joins access and sharing (**Access, sharing & federation**: Users, Encryption, Sharing, Spaces, Peering) and **Billing** keeps its own group with Licensing. **Instance** is unchanged. The groups now match the Overview's section headings, so rail and page agree on how the instance is divided. ## Exit moves out of the rail "← Files" was a nav item for leaving the mode — easy to miss, and the wrong column for the action. It becomes **"Exit to files"** in a labelled header band (shield crumb → *Administration / topic*, title, description). Same `#admin-back` id, so the existing `closeAdmin` binding is untouched. The description reserves two lines, so moving between thirteen topics never shifts where content starts. ## Overview: three stat cards → two meters + grouped status rows Only a quantity with a denominator earns a tile. Of the shipped three, **peers** had none (a tile reading "0") and **version** is a string. Now: - **Meters** for storage (used / total, with a real fill) and seats (used / licensed) — each rendered *only when the denominator exists*, falling back to a status row otherwise. - **Status rows** grouped under Instance / Access, sharing and federation / Billing, using the file-list `chip` component (`ok` / `off` / `link`) instead of the parallel `.kvbadge` vocabulary, and the 3-column key/value/state grid so the state column lines up down the page. - Peering now reads "*N* peers registered" rather than a bare count with no denominator. - `.ovlabel`'s uppercase + `.09em` tracking is gone with the cards — the same "generated" tell removed from the file-list headers. New i18n keys (en/de/fr/it): adminExit, admGrpAccess, admGrpBilling, admSecInstance, admSecAccess, admSecBilling, ovSeats, ovStorageUsed, ovOfN, ovFree, ovUnassigned, ovPeersN. ## Verification `node --check` on all script blocks; eight anchored splices, each guarded at count=1; asserted the meters builder exists, the exit control appears exactly once, and three rail groups remain. Operator check: avatar → Administration. ## Deliberately not in this slice - **The attention strip** (`.notice`, "an update is available") — the update check lives in the Updates topic and isn't loaded on Overview; wiring it needs that data path, so it lands with slice D rather than inventing a banner. - Several Overview facts the mockup shows have **no API behind them yet** (audit event count, active-link count, retention floor, storage driver name) — omitted rather than faked. Recorded below. - `.ovcard/.ovcards/.ovlabel/.ovnum/.kvbadge` CSS is now dead but left in place; `.kvbadge` may still be referenced elsewhere, so removal belongs in the selector-sweep pass.
Cordy merged commit 79b62bfac6 into main 2026-08-27 16:24:33 +00:00
Sign in to join this conversation.
No reviewers
No labels
No milestone
No project
No assignees
1 participant
Notifications
Due date
The due date is invalid or out of range. Please use the format "yyyy-mm-dd".

No due date set.

Dependencies

No dependencies set.

Reference: Cordy/Cairn#326
No description provided.