Fixes two issues found during manual verification:
- fragments/toast.html was missing class="toast-container" on the
swapped-in element, so the container lost its fixed-position
styling after the first swap.
- htmx:oobAfterSwap's event.detail.target is the *old* element that
just got replaced (outerHTML oob-swaps detach it), so the dismiss
timer must look up the live #toast-container by id instead of
trusting that stale reference.
Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
Mirrors the dashboard's row update: "Sync now" on the account page
refreshes the status block in place and shows a toast, instead of
navigating to a separate result page.
Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
These render the initial dashboard page today and will also be
rendered standalone by the sync routes in the next commits, so the
same markup drives both the full page and the post-sync response.
Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
Adds a self-hosted stylesheet (no CDN dependencies) with a card-based
dashboard and color-coded status badges, and shows the last 10 sync
runs per user on the detail page.