Turn the header into a sidebar from 960px up #240
No reviewers
Labels
No labels
No milestone
No project
No assignees
5 participants
Notifications
Due date
No due date set.
Dependencies
No dependencies set.
Reference
Grandiras/Ponente!240
Loading…
Add table
Add a link
Reference in a new issue
No description provided.
Delete branch "ui-v2-sidebar"
Deleting a branch is permanent. Although the deleted branch may continue to exist for a short time before it actually gets removed, it CANNOT be undone in most cases. Continue?
The UI language v2 sidebar, signed off by the owner, on today's pages. It is the first structural piece after the foundations (#238).
What changes
BoardTitleBar) on the board, its calendar and its settings pages from 600px: the board's name, Board / Calendar as a segmented control, and Settings for its admins. The header lost them when it became a sidebar of destinations. Each page passes its own admin check, soNavHeaderno longer loads the administered boards, and the phone-viewport watcher only it used is removed.--header-h,--titlebar-h,--sidebar-w). The board, the calendar and the empty states subtract what is actually there, and the toasts centre beside the sidebar.docs/ui.mdgains The sidebar and a board's title bar.search.md,calendar.mdandboards-and-permissions.mdare updated. There is a changelog line in both locales.Specs
calendar-all.spec.jsgains the sidebar's way in and out of the general calendar.search.spec.jstrades "centred in the header" for the field fitting the sidebar and its panel spilling over the page inside the window.board.spec.jspolls the column count, because the circuit's first render briefly swaps the prerendered columns for the loading state. That happens on main too.Checked
tools/verify.shpasses (584 unit tests).Not in this PR (from the draft): a "New board" row in the sidebar and card counts beside board names. Counts would add a query to every page's header.
🤖 Generated with Claude Code
🤖 Reviewing this PR — the review will link the full session transcript.
📜 Live transcript — updating every ~5 minutes while the review runs.
🤖 Reviewing this PR — follow along in the action run; the reply will link the full session transcript.
📜 Live transcript — updating every ~5 minutes while the task runs.
✅ Verdict: approve — no blocking issues found.
The change looks good to merge. I read the diff and spot-checked two things:
Calendar.razor's newdiduse and the removed phone-viewport watcher. I did not build the project or run any tests.Calendar.razor:_canManageBoardis computed insideReloadAsyncwith thedidalready in scope, and it is re-asked on every reload.watchPhoneViewportorOnViewportChanged.One minor leftover, not blocking:
app.css(around line 6385) still has.nav-admin-links { display: none; }. The markup no longer uses that class, so the rule is dead and can go.🧠 claude-sonnet-5-5 · ⏱ 0m 18s · 4 turns · tokens: 41.0k in / 942 out (+114.4k cache-read)
📜 Full session transcript
✅ Verdict: approve — no blocking issues found.
A coherent, well-documented structural change; the risky parts check out.
What I verified:
Calendar.razor's_canManageBoard: computed insideReloadAsync, whichOnParametersSetAsyncruns on every board-to-board and all⇄board navigation, and again via theBoardChanged/BoardsChangedevents — so the title bar's Settings link can't go stale across board reuse. Stale-after-navigation is at most one frame and the target page re-checks server-side; nothing security-relevant hangs on it.CarriedState→CarriedBoard[], same key): an old persisted blob failsTryTakeFromJson<CarriedBoard[]>and falls back toLoadBoardsAsync— safe, transient.watchPhoneViewport/unwatchPhoneViewport/OnViewportChangedhave no remaining references, and nothing else needed_isPhone(it only gated the now-deleted.nav-admin-links)._selfRef/_prefsModulestay live for install/changelog..boardsubtracts--phone-nav-h/--phone-board-title-h,.empty-statelikewise),--titlebar-his only set ≥600px viabody:has(), and at ≥960px--header-h: 0matches the header leaving flow as a fixed sheet — the board, calendar and empty-state arithmetic adds up at all three widths..nav-tab-activeis only styled in the phone media, so tablet/desktop rely solely on.nav-tab-here, exactly asdocs/ui.mdnow says.--board-coloris consumed by the existing[style*="--board-color"]block, so each row's active state and mark wear their own board's colour, overriding the page tint fromBoardTint.left: 0from the base rule and dropsright, so it extends 34rem from the sidebar's field across the page — matching the new spec assertions.BOARD_KEYis a key-shape regex, so the "every row is a board page" loops inboards.spec.jscorrectly assert shape, not a specific board; the removedopenSwitcherinaccess.spec.jsleaves no dangling references (calendar-all defines its own, still used by the new 820px block).Minor, non-blocking: the phone media still carries a now-dead
.nav-admin-links { display: none; }rule (~app.css:6385) — the class no longer exists in any markup; and each board page now has two top-levelh1s (the wordmark and.board-titlebar-name), which is valid HTML but a heading-hierarchy nit if you ever care to demote the wordmark.⏱ 9m 34s · 22 steps · $0.0883 · tokens: 201.2k in / 2.9k out (+1271.4k cache-read) · Go: 5h 2% · wk 8% · mo 86%
📜 Full session transcript
@ -4908,25 +4917,61 @@ td.admin-row-actions button + button {/* ── Nav links (views + admin) ── */.nav-admin-links {The markup-side removal is complete, but the phone media still carries a rule for the deleted class:
.nav-admin-links { display: none; }at app.css:6385 is now dead code. Worth dropping in a follow-up (or here) so the next reader doesn't go looking for the markup it once hid.Thanks both. Dropped the dead
.nav-admin-linksrule. On the twoh1s: the wordmark has been anh1on every page since before this PR, and.board-header h1is styled and measured in several places, so demoting it is a separate tidy-up rather than part of the sidebar.🤖 Reviewing this PR — the review will link the full session transcript.
📜 Live transcript — updating every ~5 minutes while the review runs.
🤖 Reviewing this PR — follow along in the action run; the reply will link the full session transcript.
📜 Live transcript — updating every ~5 minutes while the task runs.
✅ Verdict: approve — no blocking issues found.
My one earlier note is resolved. The dead
.nav-admin-links { display: none; }rule in the phone block is now deleted in the diff, along with the base.nav-admin-linksrule. I re-read the diff only; I did not build or run any tests.Nothing else new stands out.
Calendar.razorcomputes the title bar's admin check on each reload. The phone-viewport watcher is gone from both the JS and the component.🧠 claude-sonnet-5-5 · ⏱ 0m 3s · 2 turns · tokens: 39.1k in / 349 out (+12.2k cache-read)
📜 Full session transcript
✅ Verdict: approve — no blocking issues found.
Good to merge. This re-review confirms the earlier pass's notes are addressed: the dead
.nav-admin-links { display: none; }rule was removed from the phone media block, and no references towatchPhoneViewport/OnViewportChangedsurvive anywhere insrc/. The structural pieces still hold up on the updated tree:Calendar.razorre-asks_canManageBoardon every reload; the persisted-state shape change degrades safely toLoadBoardsAsync; the height-token arithmetic adds up at 390/820/1440; each sidebar row re-derives its board's colour tokens from the inline--board-color; andBoardHref/ActiveSectionyield the "same page on that board" targets the specs assert. Specs, docs and both changelog locales are consistent with the code. Two non-blocking remarks remain as before: each board page has twoh1s (wordmark and.board-titlebar-name), which is valid but a heading-hierarchy nit if you ever want to demote the wordmark; andsearch.spec.jshard-codes 960 as the right window edge in the spill assertion, which is correct for now but will need touching if the sidebar breakpoint ever moves.⏱ 0m 46s · 5 steps · $0.0121 · tokens: 61.8k in / 652 out (+68.6k cache-read) · Go: 5h 2% · wk 8% · mo 86%
📜 Full session transcript