Repository navigation
feat(web): shared shell with one nav, a sourced status line and a /settings page - #829
Merged
Merged
Conversation
…ttings page Every page now carries only `<header class="topbar" data-shell>` and mounts web/static/js/shell.mjs, which renders the brand (linked to /), one nav order (Supervisor, Cockpit, Chat, Orchestration, Threads, More: Usage, Warehouse, Settings), the theme switch and a status line fed by GET /api/shell-status: link, daemon state with its reason, provider, and what needs the operator (open human questions + NEEDS_HUMAN parks, in timetable yellow). - 390px: the nav scrolls on its own row with edge fades that show which side still has links; the active item is centred into view. Active tab is white on the navy band with a 3px underline. - --topbar-h follows the measured header height (ResizeObserver), so layouts that reserve it no longer sit under a wrapped header. - The web-token form moves out of Usage and Warehouse into /settings, which reports the daemon's verdict instead of "saved" and refuses an empty Apply. - scripts/check-dashboard-responsive.ts covers /usage and /settings and asserts the reserved height equals the header.
unohee
added a commit
that referenced
this pull request
Oct 19, 2026
…es, defined terms) (#832) Redesign step 7, plus the first P1 from the 2026-10-19 audit of /app, /chat and /orchestration. - One time format: format.mjs gains formatClock / formatDateTime / formatHour (en-US, reader's zone). Chat and Orchestration printed "[오후 7:07:42]" through toLocaleTimeString(); Usage and Warehouse hard-coded ko-KR. - Usage and Warehouse are in English, and Usage's 403 now points to Settings, where the token form lives since #829. - Cockpit sidebar: sessions seeded from /api/work/sessions were grouped by their worktree's issue UUID because seed() skipped repoRootFromPath(); they now group by repository, and runs without one read "No repository recorded". Regression test verified to fail without the fix. - Long ids (issue UUIDs, git cell keys) show short with the full value behind a Copy button (idChip.mjs); Threads uses it for related tasks and repositories. - Orchestration stat chips and graph tiers, and Chat's CHAT/SYSTEM badges, say what they mean on hover. - Cockpit footer: the /health dot was labelled "daemon" and shone green under a status line saying "dashboard only"; it is now "server", which is what it measures. - Korean comments in supervisor.js translated.
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
Dashboard redesign, step 5 (common shell: distill → adapt). Follows #827 (harden) and #828 (PRODUCT/DESIGN/tokens).
What
web/static/js/shell.mjsrenders brand (→/), one nav order (Supervisor · Cockpit · Chat · Orchestration · Threads · More ▸ Usage, Warehouse, Settings), theme switch and a status line into every page's<header class="topbar" data-shell>.GET /api/shell-status(src/support/webShellStatus.ts): link / daemon state + reason / provider / needs-you (pending human questions +NEEDS_HUMANparks). In-process state only, polled every 15s.--topbar-hnow follows the measured header height, so no layout sits under a wrapped header./settings(removed from Usage and Warehouse). Apply reports the daemon's verdict; empty Apply is refused.dashboardHtml.ts) mounts the same shell; its own migration is step 6.Verification
tests/web/shell.test.ts,tests/web/settings.test.ts,src/support/webShellStatus.test.ts(new);tokens.test.tsnow asserts every page mounts the shell and shell.mjs names every route.scripts/check-dashboard-responsive.ts(now incl. /usage, /settings, and--topbar-h == header height): 80/80 PASS at 320/390/768/1024/1440 × light/dark.Note for later edits
--topbar-hmust stay measured (ResizeObserver inmountShell). The header row count varies by width, page controls and even font-load timing (Barlow arriving widens text and can wrap page actions: observed 123px vs 167px for the same page at 390px). Reverting it to a constant reintroduces content under the header.