Disables submit buttons after first click to prevent race conditions
that could corrupt card data via concurrent writes.
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
The get() function doesn't work with relative paths on public stores.
Use list() to find the blob URL, then fetch it directly.
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
The new Vercel Blob store is public, so private access is not allowed.
Switch cards read/write to public access.
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
Show inline error banners when card save/delete fails instead of
crashing. Prevent writes to local filesystem on Vercel where it would
silently fail by validating BLOB_READ_WRITE_TOKEN presence.
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>