+ Page not found +
++ The page you're looking for doesn't exist or has been moved. +
+ + {/* Actions */} +diff --git a/frontend/src/app/not-found.tsx b/frontend/src/app/not-found.tsx new file mode 100644 index 0000000..5feb5e4 --- /dev/null +++ b/frontend/src/app/not-found.tsx @@ -0,0 +1,68 @@ +'use client' + +import Link from 'next/link' +import { Header } from '@/components/Header' +import { Footer } from '@/components/Footer' +import { Home, Search, ArrowLeft } from 'lucide-react' + +export default function NotFound() { + return ( +
+ The page you're looking for doesn't exist or has been moved. +
+ + {/* Actions */} +${data[hoveredIndex].price.toFixed(2)} diff --git a/frontend/src/components/Shimmer.tsx b/frontend/src/components/Shimmer.tsx new file mode 100644 index 0000000..40c552e --- /dev/null +++ b/frontend/src/components/Shimmer.tsx @@ -0,0 +1,46 @@ +'use client' + +import clsx from 'clsx' + +interface ShimmerProps { + className?: string + variant?: 'default' | 'text' | 'card' +} + +/** + * Unified Shimmer component for loading/locked states + * Use throughout the app for consistent loading UI + */ +export function Shimmer({ className, variant = 'default' }: ShimmerProps) { + return ( +