Adds the missing editable fields from spec §6.6 metadata sidebar.
The mutation path already existed (used by the keyboard culling
shortcuts) — this just surfaces the controls.
- Title: text input. Save on Enter or blur. Esc reverts.
- Notes: textarea, 3 rows. Save on blur.
- Color label: 6-dot picker (red/orange/yellow/green/blue/purple)
with a clear button. Click an active dot to clear, or use the X.
- Local "draft" state for the text fields so typing stays
responsive and stale refetches don't clobber in-progress edits.
Drafts re-sync on photo.id change.
- Sends null for empty string so the backend stores NULL instead
of an empty string (cleaner for FTS5 / future filtering).
api.ts: widens photos.update() signature to match the backend
PhotoUpdate schema — accepts user_title/user_notes/color_label
(nullable) plus is_picked/is_discarded/taken_at, which were
missing despite already being used by other call sites.
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>