Split the admin surface into four bookmarkable pages with a nav row #138

Closed
opened 2026-08-21 16:39:16 +07:00 by sulthan · 1 comment
Owner

Parent

Spec #134 (admin dashboard: pages, Lane observability, poll pass log, per-Series intervention).

What to build

The owner can bookmark a part of the admin surface instead of scrolling one long page. /admin becomes four addresses -- Overview, Lanes, Readers, Series -- each carrying one nav row of four display-face tabs with the active tab underlined, and a right-aligned topbar cluster holding Library and Log out. The roster moves off the landing page onto its own page, keeping both of its existing actions at their current top-level addresses (renaming them for symmetry edits working templates for no gain).

This ticket also lands the shared visual foundation the later pages build on, ported from the Claude Design project BookmarkManager Web UI (969ac210-fe02-4c01-ae1b-9a271dcc779a), file admin.css. The three-variant sketch on branch prototype/admin-surface-122 is superseded exploration -- variant B won; port from the design project, not from that branch.

Foundation: one new token --measure-wide: 1080px, admin-only, both colour branches touched together; the 760px reading measure unchanged. Section heads are mono uppercase led by a 34px patina tick, not a full-width hairline. Tables are aligned borderless columns -- one CSS grid per table, a hairline header of mono uppercase labels, hairline row rules, no vertical rules, no card backgrounds, no corners. Gutters are cell padding, never a column gap, because a gap slices the row rule into segments. Actions are right-aligned 12px ghosts hovering in the patina accent. No ember anywhere on admin: patina is the accent, danger is for lane trouble and destruction.

Overview, Lanes and Series are shells here -- the Lanes page hosts the existing self-refreshing block unchanged, and the other two get their content in later tickets. Access model is untouched: requireOwner stays the entire model, and every new route joins adminRoutes rather than checking inside itself, so the gate and the route list cannot drift.

Acceptance criteria

  • GET /admin, GET /admin/lanes, GET /admin/readers and GET /admin/series all render, and all four are registered through adminRoutes so AdminPatterns covers them by construction
  • A non-owner session is refused on every new route by the existing pattern-driven gate test, with no per-route test case added
  • The nav row appears on all four pages with the current tab marked; Library and Log out group as a right-aligned topbar cluster
  • The Readers page renders the existing roster, and both Reader actions still answer at their current addresses with freshly rendered markup
  • The Lanes page hosts the existing Lanes block, still refreshing on its own 30s timer, with no other timer anywhere on the surface
  • --measure-wide is defined in both colour branches and no admin style references the ember tokens
  • Phone: every table stacks at the documented breakpoint, stacked rows flex-wrap with the title full-width and actions pushed right
  • go test ./... green

Blocked by

None — can start immediately.

## Parent Spec #134 (admin dashboard: pages, Lane observability, poll pass log, per-Series intervention). ## What to build The owner can bookmark a part of the admin surface instead of scrolling one long page. `/admin` becomes four addresses -- Overview, Lanes, Readers, Series -- each carrying one nav row of four display-face tabs with the active tab underlined, and a right-aligned topbar cluster holding Library and Log out. The roster moves off the landing page onto its own page, keeping both of its existing actions at their current top-level addresses (renaming them for symmetry edits working templates for no gain). This ticket also lands the shared visual foundation the later pages build on, ported from the Claude Design project `BookmarkManager Web UI` (`969ac210-fe02-4c01-ae1b-9a271dcc779a`), file `admin.css`. The three-variant sketch on branch `prototype/admin-surface-122` is superseded exploration -- variant B won; port from the design project, not from that branch. Foundation: one new token `--measure-wide: 1080px`, admin-only, both colour branches touched together; the 760px reading measure unchanged. Section heads are mono uppercase led by a 34px patina tick, not a full-width hairline. Tables are aligned borderless columns -- one CSS grid per table, a hairline header of mono uppercase labels, hairline row rules, no vertical rules, no card backgrounds, no corners. Gutters are cell padding, never a column gap, because a gap slices the row rule into segments. Actions are right-aligned 12px ghosts hovering in the patina accent. No ember anywhere on admin: patina is the accent, danger is for lane trouble and destruction. Overview, Lanes and Series are shells here -- the Lanes page hosts the existing self-refreshing block unchanged, and the other two get their content in later tickets. Access model is untouched: `requireOwner` stays the entire model, and every new route joins `adminRoutes` rather than checking inside itself, so the gate and the route list cannot drift. ## Acceptance criteria - [ ] `GET /admin`, `GET /admin/lanes`, `GET /admin/readers` and `GET /admin/series` all render, and all four are registered through `adminRoutes` so `AdminPatterns` covers them by construction - [ ] A non-owner session is refused on every new route by the existing pattern-driven gate test, with no per-route test case added - [ ] The nav row appears on all four pages with the current tab marked; Library and Log out group as a right-aligned topbar cluster - [ ] The Readers page renders the existing roster, and both Reader actions still answer at their current addresses with freshly rendered markup - [ ] The Lanes page hosts the existing Lanes block, still refreshing on its own 30s timer, with no other timer anywhere on the surface - [ ] `--measure-wide` is defined in both colour branches and no admin style references the ember tokens - [ ] Phone: every table stacks at the documented breakpoint, stacked rows flex-wrap with the title full-width and actions pushed right - [ ] `go test ./...` green ## Blocked by None — can start immediately.
sulthan added the ready-for-agent label 2026-08-21 16:39:16 +07:00
Author
Owner

Verified against HEAD 030ffdc (feat: split admin surface into bookmarkable pages): all eight acceptance criteria are implemented. adminRoutes/AdminPatterns gate all four pages, navigation and active state render, Reader actions stay on their existing endpoints, only Lanes has the 30s timer, admin.css defines measure-wide in both color branches with no ember references, responsive rules stack rows, and go test ./... passes (450 tests in 10 packages). Closing as complete.

Verified against HEAD 030ffdc (feat: split admin surface into bookmarkable pages): all eight acceptance criteria are implemented. adminRoutes/AdminPatterns gate all four pages, navigation and active state render, Reader actions stay on their existing endpoints, only Lanes has the 30s timer, admin.css defines measure-wide in both color branches with no ember references, responsive rules stack rows, and go test ./... passes (450 tests in 10 packages). Closing as complete.
Sign in to join this conversation.
1 Participants
Notifications
Due Date
No due date set.
Dependencies

No dependencies set.

Reference: sulthan/mangaBookmark#138