- Replace event dispatchers with BookingContext (Hero, Header, FloatingContact) - Add focus trap hook for modals (SignupModal, NewsModal) - Extract shared components: CollapsibleSection, ConfirmDialog, PriceField, AdminSkeleton - Add delete confirmation dialog to ArrayEditor - Replace hardcoded colors (#050505, #0a0a0a, #c9a96e, #2ecc71) with theme tokens - Add CSS variables --color-surface-deep/dark for consistent dark surfaces - Improve contrast: muted text neutral-500 → neutral-400 in dark mode - Fix modal z-index hierarchy (modals z-60, header z-50, floats z-40) - Consolidate duplicate formatDate → shared formatting.ts - Add useMemo to TeamProfile groupMap computation - Fix typography: responsive price text in Pricing section - Add ARIA labels/expanded to FAQ, OpenDay, ArrayEditor grip handles - Hide number input spinners globally - Reorder admin sidebar: Dashboard → SEO → Bookings → site section order - Use shared PriceField in Open Day editor - Fix schedule grid first time slot (09:00) clipped by container - Fix pre-existing type errors (bookings, hero, db interfaces)
19 lines
573 B
TypeScript
19 lines
573 B
TypeScript
"use client";
|
|
|
|
/** Reusable loading skeleton for admin pages */
|
|
export function AdminSkeleton({ rows = 3 }: { rows?: number }) {
|
|
return (
|
|
<div className="space-y-6 animate-pulse">
|
|
{/* Title skeleton */}
|
|
<div className="h-8 w-48 rounded-lg bg-neutral-800" />
|
|
{/* Content skeletons */}
|
|
{Array.from({ length: rows }, (_, i) => (
|
|
<div key={i} className="space-y-3">
|
|
<div className="h-4 w-24 rounded bg-neutral-800" />
|
|
<div className="h-10 w-full rounded-lg bg-neutral-800" />
|
|
</div>
|
|
))}
|
|
</div>
|
|
);
|
|
}
|