feat: add error boundaries, loading skeletons, page transitions, and empty states

- ErrorBoundary: global error boundary with ShieldAI branding, retry/report
- Skeleton: SkeletonText, SkeletonCard, SkeletonAvatar, SkeletonTable
- PageTransition: fade-in + translate-y on route change, respects reduced motion
- EmptyState: reusable component with icon, title, description, action
- Button: add ariaLabel prop support
- Toast: add aria-live=polite region
- Dashboard: replace pulse divs with SkeletonCard fallbacks
- Service pages: add skeleton layouts, empty states, mutation loading states
- 404 page: polished with ShieldAI branding and home navigation
- app.tsx: add ErrorBoundary, PageTransition, skip-to-content link
- app.css: add page-enter animation with prefers-reduced-motion support
This commit is contained in:
2026-05-25 18:05:29 -04:00
parent c02457c66a
commit 20dc5bf785
18 changed files with 771 additions and 179 deletions

View File

@@ -27,7 +27,7 @@ export default function SettingsPage() {
<Sidebar open={sidebarOpen()} onClose={() => setSidebarOpen(false)} />
<div class="flex-1 flex flex-col min-w-0">
<TopBar onMenuToggle={() => setSidebarOpen(v => !v)} />
<main class="flex-1 overflow-y-auto p-6">
<main id="main-content" class="flex-1 overflow-y-auto p-6">
<div class="max-w-2xl mx-auto">
<h1 class="text-2xl font-bold text-[var(--color-text-primary)] mb-6">Settings</h1>