Platform Acceleration Phase 1: - @bytelyst/sync package: Offline-first sync engine with conflict resolution - Storage adapters: LocalStorage, InMemory, MMKV - Deduplication, retry with backoff, auto-flush on reconnect - 12 comprehensive tests - @bytelyst/dashboard-components package: Shared React components - ErrorPage, NotFoundPage, LoadingSpinner, LoadingSkeleton, EmptyState, PageHeader - Theme-aware with CSS custom properties A/B Testing Framework (Complete): - Admin UI at /ops/ab-testing with experiments list, variant performance, AI suggestions - Sidebar navigation with Beaker icon - 40 tests passing in ab-testing module All 909 platform-service tests pass.
44 lines
1.3 KiB
TypeScript
44 lines
1.3 KiB
TypeScript
import type { ReactNode } from 'react';
|
|
|
|
interface NotFoundPageProps {
|
|
title?: string;
|
|
message?: string;
|
|
onBack?: () => void;
|
|
}
|
|
|
|
export function NotFoundPage({
|
|
title = 'Page Not Found',
|
|
message = 'The page you are looking for does not exist.',
|
|
onBack,
|
|
}: NotFoundPageProps): ReactNode {
|
|
return (
|
|
<div className="flex flex-col items-center justify-center min-h-[400px] p-8">
|
|
<div className="w-16 h-16 rounded-full bg-gray-100 dark:bg-gray-800 flex items-center justify-center mb-4">
|
|
<svg
|
|
className="w-8 h-8 text-gray-500"
|
|
fill="none"
|
|
stroke="currentColor"
|
|
viewBox="0 0 24 24"
|
|
>
|
|
<path
|
|
strokeLinecap="round"
|
|
strokeLinejoin="round"
|
|
strokeWidth={2}
|
|
d="M9.172 16.172a4 4 0 015.656 0M9 10h.01M15 10h.01M21 12a9 9 0 11-18 0 9 9 0 0118 0z"
|
|
/>
|
|
</svg>
|
|
</div>
|
|
<h2 className="text-xl font-semibold text-gray-900 dark:text-white mb-2">{title}</h2>
|
|
<p className="text-gray-600 dark:text-gray-400 text-center max-w-md mb-6">{message}</p>
|
|
{onBack && (
|
|
<button
|
|
onClick={onBack}
|
|
className="px-4 py-2 bg-gray-600 hover:bg-gray-700 text-white rounded-lg transition-colors"
|
|
>
|
|
Go Back
|
|
</button>
|
|
)}
|
|
</div>
|
|
);
|
|
}
|