fix: save all changes to Supabase with reliable upsert
- Replace broken PATCH→POST fallback with single atomic upsert (POST +
Prefer: resolution=merge-duplicates). The old PATCH returned 200 OK
with empty body for new articles, causing silent data loss on every
first save per article.
- Fix getAllSyncedRows pagination: add explicit limit=10000 and Range
header to bypass Supabase's default 1000-row cap.
- Add fetchWithRetry helper (2 retries on 5xx/network errors).
- handleSaveRow now returns Promise<boolean> and closes EditPanel only
after a confirmed successful save.
- Add 'error' save status: failed rows turn red (border-l-red-500)
across ProductDescriptions, ArticleDetails, and PricingView.
- EditPanel shows saving spinner, disables buttons while saving, and
displays inline error message with "Retry Save" on failure.
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>