Float the phone's navigation: a tab bar, large titles and a column switcher #243
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!243
Loading…
Add table
Add a link
Reference in a new issue
No description provided.
Delete branch "ui-v2-phone"
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?
What
The phone navigation of UI language v2 (Figma, page Screens · Phone), below 600px. 600px and up is unchanged.
--phone-nav-his still the one height pages subtract; it is now the 62px bar plus its float gap, once below and once above.BoardPhoneBar) is a row of floating buttons: back as a pill reading "Home", Share, and the cog for its admins. Below them the board's name is a large title over its card count. Settings pages use the same bar, with the board's name in the pill and "Board settings" as the title. The page's own heading is hidden on the phone so the title is said once.--fill-1track,--bg-thumb+--shadow-smthumb) showing each column's name and count. A tap pages the board to that column. The thumb follows the board's scroll, so a swipe slides it. When the columns overflow, the track scrolls and keeps the lit segment in view. While a card is dragged, each segment is still a drop target, as the dots were.Why
The redesign is signed off; this is its phone part.
Choices worth a look
Not in this PR
The two-detent card sheet, the large title collapsing into the nav bar on scroll, the calendar's large title, Home's boards as a grouped list, and the "Drop on a column" hint.
How it was checked
tools/verify.sh: build plus 584 unit tests, green.The full Playwright suite (159 tests) ran on an isolated stack. 158 passed on the first run. The one failure,
search.spec.js› search finds a card by what is written on it…, was a desktop composer race in which the description landed in the title; it is unrelated to the phone and passed on both reruns.mobile.spec.jsnow covers:boards.spec.js,search.spec.jsandboard.spec.jsfollow the new shapes.Screenshots from a dev app with the canvas seed:
mainfor Home, a board, settings and the calendar.🤖 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 phone navigation rework looks coherent. I read the diff and spot-checked
app.css, but did not run the app or the tests, so I'm relying on your reported results (build, 584 unit tests, 158 of 159 Playwright tests on the first run)..nav-menu { transform: none }is safe. The closed sheet is hidden byopacity,visibilityandpointer-eventsin the base rule, not by the transform.board-pagination.jsis sound. Updates are batched through rAF, a ResizeObserver re-measures the thumb, andinitskips rebuilding the Sortables when the same elements and column count are already wired.docs/pages are updated with their reasons, and the Changelog entry is in both locales.Minor, non-blocking: column scroll positions are assumed to sit at
i * stride. That holds because all columns have the same width and the board's padding is symmetric, but a column with a different width or padding would put the thumb off.mobile.spec.jscovers the common case.🧠 claude-sonnet-5-5 · ⏱ 0m 17s · 3 turns · tokens: 62.6k in / 1.6k out (+85.4k cache-read)
📜 Full session transcript
🛑 Verdict: request changes — blocking issues below.
The phone redesign holds up well overall: the locale keys (
nav.columns,home.cardsviaTCount,settings.title) all exist, the height arithmetic is internally consistent (--phone-board-title-h: 118px= 56 + 2 + 41 + 1 + 18; Home's head is exactly the 4.5rem the sibling rules subtract; the evenly-divided stride matches the snap positions),Home.razor'sToday/FormatDateare pre-existing, the stacking for "sheets over the bar, face above the dim" works out (.board-useris fixed and painted after the pill, the toggle's[aria-expanded=true]z-index keeps it above the backdrop, the search's backdrop atz-index: 150with the field at 200), the reduced-motion rules disable both the slide and the transform, and no stale.board-dot/sheetRiserefs remain anywhere else. Test coverage follows the new shapes closely.One real blocker: the rename from
.board-dotto.board-segmentmissed the guard insortable-interop.js, causing a double move on every drop onto a segment — details in the finding.Minor, non-blocking:
--phone-board-title-his a global 118px, but on the settings pages the bar has no subtitle line (56 + 2 + 41 = 99px), so.board-phone-bar ~ .empty-stateover-subtracts by 19px on those min-heights — harmless in practice since those pages are in normal flow, but it means the token comment ("the large title with its line under it") doesn't hold on all pages that render the bar.⏱ 8m 34s · 19 steps · $0.0695 · tokens: 83.4k in / 2.2k out (+956.9k cache-read) · Go: 5h 4% · wk 9% · mo 87%
📜 Full session transcript
@ -70,3 +111,3 @@// and these dots are always empty. The 64px tiles need no halo.// and a segment never keeps a card. It is target enough without a halo.emptyInsertThreshold: 0,onAdd: (evt) => {This PR renames the drop targets from
.board-dotto.board-segment, but the counterpart guard injs/sortable-interop.js(line 172) still readsevt.to.classList.contains('board-dot'), so it never matches any more and its comment's promise — "handling it here too would move it twice" — is now broken.When a card is dropped on a segment, SortableJS fires both
onAddon the receiving segment (which callsOnCardMoved(cardId, from, to, 9999), appends to the end)andonEndon the source column's instance, whereevt.tois the segment. The stale guard no longer returns early, so the source instance also callsOnCardMoved(cardId, from, toSegment, evt.newIndex)— andnewIndexwithin the always-empty segment is0. Result: two server moves per drop, and the card ends up at the top of the target column (index 0) instead of the end (9999), with a doubled circuit round trip and re-render. The segments even carrydata-column-id, so the second call parses cleanly and goes through.The new touch-drag test in
mobile.spec.jsasserts the card lands in the target column but not where, which is why it passes despite the bug. Fix is one line: match.board-segment(or.board-pagination *) in the guard, and update its comment. Worth also pinning the card's position — e.g. that it lands after the target column's existing cards — so a repeat can't sneak past the tests again.Fixed in
ee69220: the guard insortable-interop.jsnow matches.board-segment(comment updated), and the touch-drag test inmobile.spec.jsnow also checks the card ends up last in the target column, which the double move broke by putting it on top.Not changed:
--phone-board-title-hon the settings pages. The bar there has no subtitle, so.board-phone-bar ~ .empty-statesubtracts 19px too much from a min-height, but those pages are in normal flow and nothing is clipped. A per-page token would cost more than the 19px.🤖 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.
Re-review: both blockers from the last pass are fixed.
Double move on a drop onto a segment — resolved.
sortable-interop.js'sonEndguard now matches.board-segment(line 172), with the comment updated, so the segment's Sortable inboard-pagination.jsis the sole mover and the card lands at the column's end (9999) with a single circuit round trip.Test coverage of drop position — resolved. The new touch-drag test in
mobile.spec.jsnow asserts the card arrives at the foot of the target column and that the segment keeps no copy, so the earlier only-checks-it-landed gap is closed and the double-move regression can't pass silently.Remaining non-blocking notes from the prior passes, unchanged in nature:
--phone-board-title-his 118px globally, but settings pages render the bar with no subtitle line (56 + 2 + 41 = 99px), so.board-phone-bar ~ .empty-stateover-subtracts by 19px. Harmless in practice since those pages are in normal flow, but the token's comment ("the large title with its line under it") doesn't hold on every page using the bar.stride()assumes equal column widths and symmetric board padding; holds today and is covered by the common case in the tests, but a differently-sized column would place the thumb off.Everything else checked out previously and still holds: locale keys exist, the height arithmetic is internally consistent, the sheets-over-bar stacking works, reduced-motion disables both the slide and the transform, and no stale
.board-dot/sheetRisereferences remain. Good to merge.⏱ 0m 12s · 4 steps · $0.0110 · tokens: 46.7k in / 778 out (+116.6k cache-read) · Go: 5h 4% · wk 9% · mo 87%
📜 Full session transcript
✅ Verdict: approve — no blocking issues found.
I found nothing new that blocks merging. My earlier pass raised no blocking issues, so there was nothing to confirm as fixed. I re-read the diff but did not run the app or the tests, so I'm relying on your reported results.
board-pagination.jsstill looks sound. Updates are batched through rAF, the ResizeObserver re-measures the thumb, andinitdoesn't rebuild the Sortables when the same elements and column count are already wired.docs/pages are updated with their reasons, and the Changelog entry is in both locales.i * stride, which holds only while all columns have the same width and the board's padding is symmetric.🧠 claude-sonnet-5-5 · ⏱ 0m 7s · 2 turns · tokens: 62.1k in / 539 out (+12.2k cache-read)
📜 Full session transcript
ee6922006c37d45bda6f🤖 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.
I found nothing new that blocks merging. My earlier passes raised no blocking issues, so there was nothing to confirm as fixed. I re-read the diff but did not run the app or the tests, so I'm relying on your reported results (build, 584 unit tests, 158 of 159 Playwright tests on the first run).
board-pagination.jsstill looks sound. Updates are batched through rAF, the ResizeObserver re-measures the thumb, andinitdoesn't rebuild the Sortables when the same elements and column count are already wired.docs/pages are updated with their reasons, and the Changelog entry is in both locales.isits ati * stride. That holds only while all columns have the same width and the board's padding is symmetric.🧠 claude-sonnet-5-5 · ⏱ 0m 5s · 2 turns · tokens: 62.6k in / 439 out (+12.2k cache-read)
📜 Full session transcript
✅ Verdict: approve — no blocking issues found.
Re-review: both blockers from the previous pass are fixed, and this is good to merge.
sortable-interop.js'sonEndguard now matches.board-segment(line 172) with the comment updated, so the segment's own Sortable (board-pagination.js) is the sole mover and the card lands at the column's end (9999) in one circuit round trip. No.board-dotreferences remain anywhere.mobile.spec.jsnow asserts the card arrives at the foot of the target column and that the segment keeps no copy, so the double-move regression cannot pass again.Also re-verified the smaller checks from earlier passes: the locale keys (
nav.columns,home.cards/home.cards.one,settings.title) exist in both locales,--brand-glowis still defined for the segment drop highlight,sheetRiseis fully gone fromapp.css, and the height arithmetic and sheets-over-bar stacking hold as before.Non-blocking notes, unchanged:
--phone-board-title-his a global 118px, but settings pages render the bar without the subtitle line (56 + 2 + 41 = 99px), so.board-phone-bar ~ .empty-stateover-subtracts by 19px there. Harmless since those pages are in normal flow, but the token's comment only holds on board pages.stride()inboard-pagination.jsassumes equal column widths and symmetric board padding; true today and covered for the common case, but a narrower column would put the thumb off.⏱ 0m 45s · 7 steps · $0.0156 · tokens: 44.8k in / 1.0k out (+246.0k cache-read) · Go: 5h 5% · wk 9% · mo 87%
📜 Full session transcript