Commit Graph
2 Commits
Author SHA1 Message Date
steveandClaude Opus 4.8 73fa34cb81 Polish: clear-bed, keyboard nudging, empty states, titles, 404 (#18)
Build image / build-and-push (push) Successful in 7s
Gadfly review (reusable) / review (pull_request) Successful in 12m58s
Adversarial Review (Gadfly) / review (pull_request) Successful in 12m58s
- Clear bed: a "Clear (N)" action on a focused plantable object → confirm modal
  (ClearBedModal) → soft-removes every active plop (useClearObject loops PATCHes,
  invalidates once); rows kept with removed_at.
- Keyboard nudging (desktop): arrows move the selected object/plop 1cm, Shift
  10cm; the PATCH is debounced ~400ms on key-idle. Plops nudge in the object's
  local frame and clamp to its bounds; ignored while typing in a field.
- Empty states: hint to place a first bed on an empty field, and to add a plant
  in an empty focused bed (both non-interactive overlays).
- Paper cuts: per-route document titles (usePageTitle on every page), an emoji
  favicon, and a 404 catch-all route (NotFound) inside the app shell.
- Mobile: plop tap targets stay ≥~44px at low zoom via a transparent hit circle.
- Ownership check hoisted to the authoritative ownerId==me so the nudge handler
  can gate on canEdit before the loading early-returns.

Imperial coverage verified across inspectors/forms/cards/picker (all via the
unit-aware helpers); conversion helpers stay in lib/units.ts (their home since #8).

tsc --noEmit clean; 24/24 vitest; production build green.

Co-Authored-By: Claude Opus 4.8 (1M context) <[email protected]>
Claude-Session: https://claude.ai/code/session_01JdQpdYYsTgtkJBxbcpAszi
2026-07-19 00:22:32 -04:00
steveandClaude Opus 4.8 91da9ff945 Phase 0: backend + frontend scaffold, single-binary build
Gadfly review (reusable) / review (pull_request) Successful in 10m8s
Adversarial Review (Gadfly) / review (pull_request) Successful in 10m9s
Implements the Pansy v1 scaffold (epic #20, phase 0).

#1 Backend: Go module (pure-Go, builds with CGO_ENABLED=0), env config,
   gin server with slog + recovery + /api/v1/healthz, modernc SQLite store
   with WAL/busy_timeout/foreign_keys pragmas, embedded numbered-migration
   runner, full initial schema (users, sessions, gardens, garden_shares,
   garden_objects, plants, plantings), domain structs + sentinel errors,
   graceful shutdown.

#2 Frontend: Vite + React 19 + TS (strict) + Tailwind 4 + TanStack
   Router/Query, typed /api/v1 fetch wrapper (ApiError carries status +
   body so later issues can read 409 conflict rows), dev proxy /api -> :8080,
   responsive app shell with stub pages for all five routes.

#3 Single binary: //go:embed of the web build with a committed placeholder,
   SPA fallback (deep links, immutable asset caching, JSON 404 for unmatched
   /api and missing assets), Makefile (web/build/dev/test), README quickstart
   + env var table.

Verified: go build/vet/test clean (CGO off); binary migrates idempotently and
serves healthz; web tsc + build clean; integrated binary serves the SPA, deep
links, and correct cache headers; app mounts and navigates all five routes at
desktop and 375px widths.

Co-Authored-By: Claude Opus 4.8 (1M context) <[email protected]>
Claude-Session: https://claude.ai/code/session_01JdQpdYYsTgtkJBxbcpAszi
2026-07-18 14:52:05 -04:00