feat(ui): the field row both redesigns compose from #211
No reviewers
Labels
No labels
adr
android
area/calendar
area/design-system
area/i18n
area/jobs
area/offline
area/server
area/testing
bug
ci
duplicate
enhancement
help wanted
invalid
notifications
question
reliability
security
severity/low
severity/medium
tracking
web
wontfix
No milestone
No project
No assignees
2 participants
Notifications
Due date
No due date set.
Dependencies
No dependencies set
Reference
eagraiclainne/app!211
Loading…
Reference in a new issue
No description provided.
Delete branch "feat/field-row"
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?
Closes #171.
Both surfaces ship a job sheet you read, then press Edit, then fill in a
form, then Save. Every field waits on every other field, and a
half-finished form is a decision about all of them. The redesigns replace
that with rows that are their own controls — so the row has to exist
before any screen can be rebuilt on it.
The affordance rule is enforced by the type, not by convention. The
edit prop is a union: the picker variant can only open something and
always draws the chevron; the in-place variant can only edit here and
never draws one. Neither surface can express the other arrangement, so
"a chevron means a picker opens" cannot drift.
Four states at one height — resting, editing, just committed, will not
commit. Each is a fill plus an inset ring, never a border, so nothing
below the row moves when typing starts; the goldens pin identical heights
across all four. The commit flashes once and raises a snackbar with Undo,
because a persistent tick on a screen where every row saves is noise.
Undo restores the value and reopens the row: a wrong edit is usually a
mistyped one. An invalid value traps the field and never the screen —
close and Escape still work and discard that row alone.
The offline queue is part of the component's contract, not each
caller's problem:
lies about latency and SyncChip stays the honest in-flight signal;
it is still pending, and tells the caller
dequeued=falsewhen it hasalready flushed so they compensate instead of the component pretending;
snackbar it belongs to left minutes ago.
An open row ignores live updates while everything around it keeps
refreshing, a commit that overwrote someone says whose change it replaced,
and a record that vanishes while open collapses to a note rather than
disappearing.
Reduced motion drops the movement and keeps the moment on both surfaces:
the flash becomes an instant state held for the same span, paced
explicitly rather than by an animation event that a zeroed duration would
fire after one frame.
Nothing consumes it yet —
Jobs.tsxandItemSheets.ktare untouched onpurpose. #172 is the first screen to compose from it.
conformance/render-field-row.jsonholds both surfaces to the same stringinventory; goldens are the next commit.
🤖 Generated with Claude Code
Test report
Coverage: 27.0%
Updated by the check workflow · commit
c797007deaAndroid test report
Coverage:
Updated by the android workflow · commit
c797007dea50e6ceb006ada0df8701Force-pushed: the goldens are back in this commit.
The earlier split into #212 made this branch red on
check / webandandroid / build. Both jobs verify goldens —npm run test:screensandverifyRoborazziDebug— and this commit adds 54 new gallery cases per surface,so without their images it could not pass. #212 was green precisely because it
carried them.
The repo rule about re-recording goldens in a separate commit covers changing an
existing component, where the code commit still has the old images to compare
against. A new component has nothing to fall back on. One commit it is.
ada0df87016f1d4ec3d46f1d4ec3d4c797007dea