Tweak mobile board view to have less padding overall while still not appearing crowded #188

Closed
opened 2026-09-11 00:40:16 +00:00 by Grandiras · 5 comments
Owner

We're right now wasting a lot of space on mobile

We're right now wasting a lot of space on mobile
Collaborator

🤖 On it — follow along in the action run; the reply will link the full session transcript.

📜 Live transcript — updating every ~5 minutes while the task runs.

🤖 On it — follow along in [the action run](https://git.grandiras.net/Grandiras/claude-bot/actions/runs/462); the reply will link the full session transcript. <!-- claude-run:comment --> 📜 [Live transcript](https://git.grandiras.net/Grandiras/claude-bot/src/branch/claude-logs/transcripts/Grandiras/Ponente/issue-188/run-462.md) — updating every ~5 minutes while the task runs.
Collaborator

The work is done and pushed. Here's my report:


The phone board was spending a quarter of the screen on nothing, and it was three insets doing it, not one: the board's padding, the column's rail, and the card's own padding — each worth about 1.15rem, stacked, before the first letter of a card. That figure is fine on a desktop, where it comes out of a 320px column with a page around it; on a 412px phone the column is the page, so the same three came to 98px and titles wrapped to two lines that had no need to. On top of that, the phone block was padding .card at 1.1rem — more than the desktop — filed under "touch targets", though the target is the whole 130px tile.

All three shrink together (0.5rem / 0.7rem / 0.85rem), rather than one of them being cut hard. That's the part the issue's "while still not appearing crowded" is about: what makes a board readable at a glance is that the steps page → column → card are visible, and a column whose cards touch its edges is what crowded actually looks like. Each step is still there, just smaller.

Phone board before (left) and after (right), Pixel 7 viewport

Text now starts at 32.8px instead of 48.8px — 32px more line — and a card is about 20% shorter. The column header also stops padding around its own 2.25rem filter button.

One cleanup the change forced. The column's inset was four copies of 1.15rem in four places that have to agree: the header's label, the hairline under it, the cards, and the add-card button. Making one of them narrower on a phone would have left the column with two left edges — so it is now a --column-rail token, overridden once in the phone block. The hairline is the one that would have been missed: it's an absolutely positioned ::after carrying its own copy of the number.

What I verified (compose isn't available in this container, so I ran the app directly against a local Postgres and drove it with Playwright):

  • dotnet build and dotnet test green — 477 passing, including DocumentationTests.
  • mobile.spec.js, board.spec.js, filter.spec.js pass against the running app. The new assertions in mobile.spec.js fail on the old CSS (48.78 < 37.5 → false), so they're a real pin, not a tautology.
  • Desktop (1440px) and tablet (768px) renders are pixel-identical to before — 2 and 36 antialiasing pixels out of 1.3M and 786K.
  • The pagination pill's clearance under the column is unchanged to within half a pixel. It used to be folded into a bare 3rem on .column's max-height; I wrote it out as padding + pill so shrinking the padding couldn't silently eat it.

docs/frontend.md gets two bullets — the rail token and why it's a token, and the three-inset reasoning including why cutting one to zero was the wrong answer. Changelog.Unreleased gets a line in both locales.

One caveat, stated plainly: in one combined run, mobile.spec.js's "the card dialog fills the phone, and only its pickable chips are targets" failed once. I re-ran that exact file ordering twice more plus the test in isolation — all passed — and I discarded the artifact before reading the assertion, so I can't say what it was. It touches nothing my diff changes (the modal sheet and the chip min-heights are untouched), but I'd rather flag it than not.

Branch pushed: claude/issue-188.


⏱ 20m 20s · 114 turns · tokens: 154.2k in / 44.8k out (+11383.0k cache-read)
📜 Full session transcript
→ Opened PR: #189

The work is done and pushed. Here's my report: --- The phone board was spending a quarter of the screen on nothing, and it was three insets doing it, not one: the board's padding, the column's rail, and the card's own padding — each worth about `1.15rem`, stacked, before the first letter of a card. That figure is fine on a desktop, where it comes out of a 320px column with a page around it; on a 412px phone the column *is* the page, so the same three came to 98px and titles wrapped to two lines that had no need to. On top of that, the phone block was padding `.card` at `1.1rem` — *more* than the desktop — filed under "touch targets", though the target is the whole 130px tile. **All three shrink together** (`0.5rem` / `0.7rem` / `0.85rem`), rather than one of them being cut hard. That's the part the issue's "while still not appearing crowded" is about: what makes a board readable at a glance is that the steps page → column → card are visible, and a column whose cards touch its edges is what crowded actually looks like. Each step is still there, just smaller. ![Phone board before (left) and after (right), Pixel 7 viewport](https://git.grandiras.net/attachments/16fcbc88-880c-4e23-b3d5-987911c24e7d) Text now starts at 32.8px instead of 48.8px — 32px more line — and a card is about 20% shorter. The column header also stops padding around its own 2.25rem filter button. **One cleanup the change forced.** The column's inset was four copies of `1.15rem` in four places that have to agree: the header's label, the hairline under it, the cards, and the add-card button. Making one of them narrower on a phone would have left the column with two left edges — so it is now a `--column-rail` token, overridden once in the phone block. The hairline is the one that would have been missed: it's an absolutely positioned `::after` carrying its own copy of the number. **What I verified** (compose isn't available in this container, so I ran the app directly against a local Postgres and drove it with Playwright): - `dotnet build` and `dotnet test` green — 477 passing, including `DocumentationTests`. - `mobile.spec.js`, `board.spec.js`, `filter.spec.js` pass against the running app. The new assertions in `mobile.spec.js` fail on the old CSS (`48.78 < 37.5` → false), so they're a real pin, not a tautology. - Desktop (1440px) and tablet (768px) renders are pixel-identical to before — 2 and 36 antialiasing pixels out of 1.3M and 786K. - The pagination pill's clearance under the column is unchanged to within half a pixel. It used to be folded into a bare `3rem` on `.column`'s max-height; I wrote it out as padding + pill so shrinking the padding couldn't silently eat it. `docs/frontend.md` gets two bullets — the rail token and why it's a token, and the three-inset reasoning including why cutting one to zero was the wrong answer. `Changelog.Unreleased` gets a line in both locales. One caveat, stated plainly: in one combined run, `mobile.spec.js`'s *"the card dialog fills the phone, and only its pickable chips are targets"* failed once. I re-ran that exact file ordering twice more plus the test in isolation — all passed — and I discarded the artifact before reading the assertion, so I can't say what it was. It touches nothing my diff changes (the modal sheet and the chip min-heights are untouched), but I'd rather flag it than not. Branch pushed: **`claude/issue-188`**. --- ⏱ 20m 20s · 114 turns · tokens: 154.2k in / 44.8k out (+11383.0k cache-read) 📜 [Full session transcript](https://git.grandiras.net/Grandiras/claude-bot/src/branch/claude-logs/transcripts/Grandiras/Ponente/issue-188/run-462.md) → Opened PR: https://git.grandiras.net/Grandiras/Ponente/pulls/189
Author
Owner

@claude-bot Please align the column header with the start of the cards to make it look more consistent. Also, please move the page indicator at the bottom a few pixels down to make it have the same space between it and both the nav bar and the board column.

@claude-bot Please align the column header with the start of the cards to make it look more consistent. Also, please move the page indicator at the bottom a few pixels down to make it have the same space between it and both the nav bar and the board column.
Collaborator

🤖 On it — follow along in the action run; the reply will link the full session transcript.

📜 Live transcript — updating every ~5 minutes while the task runs.

🤖 On it — follow along in [the action run](https://git.grandiras.net/Grandiras/claude-bot/actions/runs/465); the reply will link the full session transcript. <!-- claude-run:comment --> 📜 [Live transcript](https://git.grandiras.net/Grandiras/claude-bot/src/branch/claude-logs/transcripts/Grandiras/Ponente/issue-188/run-465.md) — updating every ~5 minutes while the task runs.
Collaborator

Both done and pushed to the same branch, so they land on PR #189.

The header. It was already on --column-rail — the line the card tiles start from — which is why the previous change treated it as aligned. But the label is text, and the text under it (every card title) sits one card-padding further in, so the heading hung 13.6px out to the left of the whole stack. The phone block now pads it to calc(var(--column-rail) + var(--card-inset)): To Do starts exactly where Design the invite flow does (32.80px vs 32.78px measured).

Only the left edge moves. On the right there is no text line to join — just the tiles' right edge — and the count badge and the filter button are already on it, so moving them in would have broken a line that was right. The hairline under the header stays on the rail with the tiles for the same reason.

The page indicator. The pill is position: fixed above the nav bar, while the column above it is sized by a max-height that has to leave room for it — two unrelated declarations deciding one strip. They had drifted: 0.4px above the pill, 9.6px below it, which is why it read as resting on the column. The strip is now --phone-pager-h plus two --phone-pager-gap; the column subtracts the whole strip and the pill is placed one gap up from the bar, so the two are equal by construction rather than by two numbers happening to agree. Measured after: 5px and 5px. The column doesn't move at all — the pill drops 4.6px, which is the "few pixels down" you asked for.

Phone board before and after: column header and page indicator, Pixel 7 viewport

Verified (compose isn't available here, so the app ran directly against a local Postgres, driven by Playwright):

  • dotnet build and dotnet test green — 477 passing, DocumentationTests included.
  • mobile.spec.js gained an assertion for each change, and I checked both fail on the pre-change CSS: the label one reports 19.19 against 32.78, the pill one 0.40625 is not > 2. Real pins, not tautologies.
  • mobile.spec.js, board.spec.js, filter.spec.js, boards.spec.js all pass.
  • Desktop (1440px) and tablet (768px) are untouched: .card now reads its inline padding from --card-inset, whose :root value is the same 1.15rem it had, and the computed padding is 16px 18.4px at both widths as before.

docs/frontend.md gets the reasoning for both (the two lines a column has, and why the pager strip is two tokens); the unreleased changelog line gains a clause about the column name in both locales — the pill's 4.6px isn't worth a member's line.

One thing I deliberately left alone, and you should decide it: the same 18.4px offset exists on desktop and tablet, where the header label is also on the tile edge rather than the title line. I scoped the fix to the phone block because that's what this issue is about and because a desktop column reads differently — it's a 320px panel in a row of panels, so its label brackets the panel rather than heading a page. If you want it everywhere, it's a one-line change to the base .column-header, plus a pass over every desktop frame on the canvas. Say the word.

One caveat: boards.spec.js's "the nav switches boards…" failed once on its teardown (the test's own board not disappearing from /admin/boards), then passed on a re-run of the whole file. It's in the cleanup path and touches nothing this diff changes, but I'd rather name it.


⏱ 14m 16s · 84 turns · tokens: 100.2k in / 38.5k out (+5970.8k cache-read)
📜 Full session transcript

Both done and pushed to the same branch, so they land on PR #189. **The header.** It was already on `--column-rail` — the line the card *tiles* start from — which is why the previous change treated it as aligned. But the label is text, and the text under it (every card title) sits one card-padding further in, so the heading hung 13.6px out to the left of the whole stack. The phone block now pads it to `calc(var(--column-rail) + var(--card-inset))`: `To Do` starts exactly where `Design the invite flow` does (32.80px vs 32.78px measured). Only the **left** edge moves. On the right there is no text line to join — just the tiles' right edge — and the count badge and the filter button are already on it, so moving them in would have broken a line that was right. The hairline under the header stays on the rail with the tiles for the same reason. **The page indicator.** The pill is `position: fixed` above the nav bar, while the column above it is sized by a `max-height` that has to leave room for it — two unrelated declarations deciding one strip. They had drifted: **0.4px above the pill, 9.6px below it**, which is why it read as resting on the column. The strip is now `--phone-pager-h` plus two `--phone-pager-gap`; the column subtracts the whole strip and the pill is placed one gap up from the bar, so the two are equal by construction rather than by two numbers happening to agree. Measured after: **5px and 5px**. The column doesn't move at all — the pill drops 4.6px, which is the "few pixels down" you asked for. ![Phone board before and after: column header and page indicator, Pixel 7 viewport](https://git.grandiras.net/attachments/38b89b70-ed3e-4dd9-b336-c5c2d5f101c4) **Verified** (compose isn't available here, so the app ran directly against a local Postgres, driven by Playwright): - `dotnet build` and `dotnet test` green — 477 passing, `DocumentationTests` included. - `mobile.spec.js` gained an assertion for each change, and I checked both fail on the pre-change CSS: the label one reports `19.19` against `32.78`, the pill one `0.40625` is not `> 2`. Real pins, not tautologies. - `mobile.spec.js`, `board.spec.js`, `filter.spec.js`, `boards.spec.js` all pass. - Desktop (1440px) and tablet (768px) are untouched: `.card` now reads its inline padding from `--card-inset`, whose `:root` value is the same `1.15rem` it had, and the computed padding is `16px 18.4px` at both widths as before. `docs/frontend.md` gets the reasoning for both (the two lines a column has, and why the pager strip is two tokens); the unreleased changelog line gains a clause about the column name in both locales — the pill's 4.6px isn't worth a member's line. **One thing I deliberately left alone, and you should decide it:** the same 18.4px offset exists on desktop and tablet, where the header label is also on the tile edge rather than the title line. I scoped the fix to the phone block because that's what this issue is about and because a desktop column reads differently — it's a 320px panel in a row of panels, so its label brackets the panel rather than heading a page. If you want it everywhere, it's a one-line change to the base `.column-header`, plus a pass over every desktop frame on the canvas. Say the word. One caveat: `boards.spec.js`'s *"the nav switches boards…"* failed once on its teardown (the test's own board not disappearing from `/admin/boards`), then passed on a re-run of the whole file. It's in the cleanup path and touches nothing this diff changes, but I'd rather name it. --- ⏱ 14m 16s · 84 turns · tokens: 100.2k in / 38.5k out (+5970.8k cache-read) 📜 [Full session transcript](https://git.grandiras.net/Grandiras/claude-bot/src/branch/claude-logs/transcripts/Grandiras/Ponente/issue-188/run-465.md)
Sign in to join this conversation.
No labels
No milestone
No project
No assignees
2 participants
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
Grandiras/Ponente#188
No description provided.