With the core loop complete (#15), this pass makes pansy feel good day-to-day — especially on a phone in the garden with dirty hands. Grab-bag by design, but every item is small and shippable independently; check them off as they land.
Scope
Imperial sweep: audit every place a measurement appears (inspectors, forms, labels, garden dims) — a garden with unit_pref: imperial shows ft/in everywhere, inputs accept ft/in, storage stays cm. Consolidate any stray conversion helpers into web/src/lib/geometry.ts.
Mobile ergonomics: touch targets ≥44px (handles, palette, plop selection at low zoom — enlarge hit areas beyond visual size via transparent hit circles); bottom-sheet inspector drag-to-dismiss + snap points; palette as a thumb-reachable bar; touch-action/overscroll audit so the browser never scrolls/refreshes mid-gesture; test with DevTools throttling and a real phone.
Clear bed: action on a focused plantable object — confirm dialog ("Clear N plantings from ?") → sets removed_at on all its active plantings (loop of PATCHes is fine; a bulk endpoint arrives with #19's ClearObject — use it if already merged).
Keyboard nudging (desktop): arrows move the selected object/plop 1cm, Shift+arrows 10cm; PATCH debounced on key-idle (~400ms) so held keys don't spam.
Empty states: no gardens (→ create prompt, exists per #8 — verify), empty garden (hint to drag from palette), empty bed in focus (hint to plant), /plants search with no hits.
Small paper cuts: favicon + page titles per route; loading/error states for the editor query; a 404 route.
Out of scope
New features (undo/redo, grid snapping, background images — all post-v1). Anything backend beyond what clear-bed needs.
Key files & patterns
Touches most of web/src/editor/; unit helpers in web/src/lib/geometry.ts.
Phone walkthrough of the full core scenario (create garden → bed → plant → share-view) feels deliberate, with no accidental browser scrolls, missed taps, or unreadably small targets.
An imperial garden never leaks a metric value anywhere in the UI; a metric garden never shows ft/in.
Clear-bed empties a bed after confirm and survives reload; nudging moves precisely and persists.
Part of epic #20 · Design: [DESIGN.md](https://gitea.stevedudenhoeffer.com/steve/pansy/src/branch/main/DESIGN.md)
## Context
With the core loop complete (#15), this pass makes pansy feel good day-to-day — especially on a phone in the garden with dirty hands. Grab-bag by design, but every item is small and shippable independently; check them off as they land.
## Scope
- [ ] **Imperial sweep**: audit every place a measurement appears (inspectors, forms, labels, garden dims) — a garden with `unit_pref: imperial` shows ft/in everywhere, inputs accept ft/in, storage stays cm. Consolidate any stray conversion helpers into `web/src/lib/geometry.ts`.
- [ ] **Mobile ergonomics**: touch targets ≥44px (handles, palette, plop selection at low zoom — enlarge hit areas beyond visual size via transparent hit circles); bottom-sheet inspector drag-to-dismiss + snap points; palette as a thumb-reachable bar; `touch-action`/overscroll audit so the browser never scrolls/refreshes mid-gesture; test with DevTools throttling and a real phone.
- [ ] **Clear bed**: action on a focused plantable object — confirm dialog ("Clear N plantings from <name>?") → sets `removed_at` on all its active plantings (loop of PATCHes is fine; a bulk endpoint arrives with #19's ClearObject — use it if already merged).
- [ ] **Keyboard nudging** (desktop): arrows move the selected object/plop 1cm, Shift+arrows 10cm; PATCH debounced on key-idle (~400ms) so held keys don't spam.
- [ ] **Empty states**: no gardens (→ create prompt, exists per #8 — verify), empty garden (hint to drag from palette), empty bed in focus (hint to plant), `/plants` search with no hits.
- [ ] **Small paper cuts**: favicon + page titles per route; loading/error states for the editor query; a 404 route.
## Out of scope
- New features (undo/redo, grid snapping, background images — all post-v1). Anything backend beyond what clear-bed needs.
## Key files & patterns
- Touches most of `web/src/editor/`; unit helpers in `web/src/lib/geometry.ts`.
## Dependencies
Blocked by #15.
## Acceptance criteria
- Phone walkthrough of the full core scenario (create garden → bed → plant → share-view) feels deliberate, with no accidental browser scrolls, missed taps, or unreadably small targets.
- An imperial garden never leaks a metric value anywhere in the UI; a metric garden never shows ft/in.
- Clear-bed empties a bed after confirm and survives reload; nudging moves precisely and persists.
Blocking a user prevents them from interacting with repositories, such as opening or commenting on pull requests or issues. Learn more about blocking a user.
Part of epic #20 · Design: DESIGN.md
Context
With the core loop complete (#15), this pass makes pansy feel good day-to-day — especially on a phone in the garden with dirty hands. Grab-bag by design, but every item is small and shippable independently; check them off as they land.
Scope
unit_pref: imperialshows ft/in everywhere, inputs accept ft/in, storage stays cm. Consolidate any stray conversion helpers intoweb/src/lib/geometry.ts.touch-action/overscroll audit so the browser never scrolls/refreshes mid-gesture; test with DevTools throttling and a real phone.removed_aton all its active plantings (loop of PATCHes is fine; a bulk endpoint arrives with #19's ClearObject — use it if already merged)./plantssearch with no hits.Out of scope
Key files & patterns
web/src/editor/; unit helpers inweb/src/lib/geometry.ts.Dependencies
Blocked by #15.
Acceptance criteria