fix(jobs): stop the due/worth line breaking mid-phrase #219

Merged
nalum merged 1 commit from fix/job-card-meta-line into main 2026-08-26 18:34:22 +00:00
Owner

From build-review-01.md: Late — was due yesterday · 22 points broke over
two lines on the deployed board, with the separator dot stranded on its own.

On web the line was four independent flex items — icon, due phrase,
separator, points — in a row that could not wrap. Flex items shrink, so at card
width the text wrapped inside a phrase and the · was free to land alone.

On Android it was worse than untidy. The twin was a plain Row with no wrap
at all, and a real-layout Robolectric test at the grid's own 270dp cell width
showed 10 points rendering above Late — was due 09:45 — inverted, not
merely wrapped. That is the kind of thing a semantics-walking test cannot see.

Both surfaces now group the line into two atomic units — icon plus due phrase,
separator plus points — each held unwrapping inside a wrapping container. A
break can only fall between the phrases, and the separator can never leave the
points it belongs to because it is inside that unit rather than beside it.

Stacking rather than shrink-to-fit, which is what §4f's own wording implies.
Measured at the 320px responsive floor and at 1.33× text scale.

The wrap was also a real height hazard: at narrow width and large text it
inflated one card by 144px against its neighbours, and equal height is
structural on a grid with no masonry.

Two tests, each confirmed failing first — a structural one on web, since jsdom
has no layout, and a real-layout one on Android that reproduced the inversion.

Also fixed while there: the Android separator was rendering in the default text
style rather than labelMedium, which the geometry test surfaced.

🤖 Generated with Claude Code

From `build-review-01.md`: `Late — was due yesterday · 22 points` broke over two lines on the deployed board, with the separator dot stranded on its own. **On web** the line was four independent flex items — icon, due phrase, separator, points — in a row that could not wrap. Flex items shrink, so at card width the text wrapped *inside* a phrase and the `·` was free to land alone. **On Android it was worse than untidy.** The twin was a plain `Row` with no wrap at all, and a real-layout Robolectric test at the grid's own 270dp cell width showed `10 points` rendering **above** `Late — was due 09:45` — inverted, not merely wrapped. That is the kind of thing a semantics-walking test cannot see. Both surfaces now group the line into two atomic units — icon plus due phrase, separator plus points — each held unwrapping inside a wrapping container. A break can only fall between the phrases, and the separator can never leave the points it belongs to because it is inside that unit rather than beside it. Stacking rather than shrink-to-fit, which is what §4f's own wording implies. Measured at the 320px responsive floor and at 1.33× text scale. The wrap was also a real height hazard: at narrow width and large text it inflated one card by 144px against its neighbours, and equal height is structural on a grid with no masonry. Two tests, each confirmed failing first — a structural one on web, since jsdom has no layout, and a real-layout one on Android that reproduced the inversion. Also fixed while there: the Android separator was rendering in the default text style rather than `labelMedium`, which the geometry test surfaced. 🤖 Generated with [Claude Code](https://claude.com/claude-code)
fix(jobs): stop the due/worth line breaking mid-phrase
Some checks failed
check / commits (pull_request) Successful in 20s
check / go (pull_request) Successful in 8m59s
check / web (pull_request) Failing after 14m37s
android / build (pull_request) Failing after 38m22s
check / report (pull_request) Successful in 4s
android / report (pull_request) Successful in 4s
a58380408f
Household report: on a real card the merged due/worth line (§4f)
wrapped inside a phrase and left the "·" separator stranded alone
between the two halves — `.job-due-worth` was a plain flex row with
no wrap handling, so a flex item's text would shrink and wrap
internally once the row ran out of width.

Group the icon+phrase and the separator+points into two flex items
instead of four, and let the ROW wrap while each item stays
`white-space: nowrap`. A wrap can now only fall between the two
whole phrases, never inside one and never between the separator and
the points it belongs to — matching §4f's "the phrase and the points
may each stay whole and stack" fallback. Mirrors the fix in
Android's JobCard (FlowRow + softWrap = false on each phrase); its
shipped Row (no wrap at all) let the due phrase's own Text wrap
internally at narrow widths and pushed "10 points" above the due
line entirely, confirmed against the pre-fix source with
JobDueWorthLayoutTest.

Also gives the Compose separator its own labelMedium style (it
inherited the larger default text style, which is why measuring "same
line" needed a pixel tolerance rather than exact equality).

Form-fragment sweep (AGENTS.md): JobCard is a board card, not a
row-grammar sheet, so the checklist's items (bare inputs, (optional)
labels, form fragments in a sheet, etc.) don't apply here — nothing
found.

Defect 1 from the same report (the accent rail) is NOT changed here:
the household confirmed the rail correctly carries the job owner's
mark colour, not a fixed accent token, so markColorVar(ownerUid)
stays as shipped.

Test report

Suite Tests Result Skipped
Unit 1435 ✅ pass 1
Integration 130 ✅ pass —

Coverage: 27.0%

Updated by the check workflow · commit 2b5fa8f90d

<!-- ci-test-report --> ## Test report | Suite | Tests | Result | Skipped | | --- | --: | --- | --: | | Unit | 1435 | ✅ pass | 1 | | Integration | 130 | ✅ pass | — | **Coverage:** 27.0% <sub>Updated by the check workflow · commit 2b5fa8f90d42ff02a265b6a6b6ef0d1e3f296d54</sub>

Android test report

Suite Tests Result Skipped
Unit (debug) ❌ 1 failed

Coverage:

Updated by the android workflow · commit 2b5fa8f90d

<!-- android-test-report --> ## Android test report | Suite | Tests | Result | Skipped | | --- | --: | --- | --: | | Unit (debug) | | ❌ 1 failed | | **Coverage:** <sub>Updated by the android workflow · commit 2b5fa8f90d42ff02a265b6a6b6ef0d1e3f296d54</sub>
nalum force-pushed fix/job-card-meta-line from a58380408f
Some checks failed
check / commits (pull_request) Successful in 20s
check / go (pull_request) Successful in 8m59s
check / web (pull_request) Failing after 14m37s
android / build (pull_request) Failing after 38m22s
check / report (pull_request) Successful in 4s
android / report (pull_request) Successful in 4s
to 2b5fa8f90d
Some checks failed
check / commits (pull_request) Successful in 18s
check / go (pull_request) Successful in 2m48s
check / web (pull_request) Failing after 2m37s
android / build (pull_request) Failing after 4m54s
check / report (pull_request) Successful in 5s
android / report (pull_request) Successful in 4s
android / build (push) Has been cancelled
android / report (push) Has been cancelled
check / commits (push) Has been cancelled
check / go (push) Has been cancelled
check / report (push) Has been cancelled
check / web (push) Has been cancelled
tag / tag (push) Has been cancelled
2026-08-26 07:04:05 +00:00
Compare
nalum changed target branch from docs/handoff-rail-and-4g to main 2026-08-26 18:34:21 +00:00
nalum merged commit 2b5fa8f90d into main 2026-08-26 18:34:22 +00:00
nalum deleted branch fix/job-card-meta-line 2026-08-26 18:34:22 +00:00
Sign in to join this conversation.
No reviewers
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
eagraiclainne/app!219
No description provided.