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 ( +
+ {/* Ambient glow */} +
+
+
+ +
+ +
+
+ {/* 404 Number */} +
+ + 404 + +
+ + {/* Content */} +

+ Page not found +

+

+ The page you're looking for doesn't exist or has been moved. +

+ + {/* Actions */} +
+ + + Go Home + + + + Browse TLDs + +
+ + {/* Back Link */} + +
+
+ +
+
+ ) +} + diff --git a/frontend/src/app/tld-pricing/[tld]/page.tsx b/frontend/src/app/tld-pricing/[tld]/page.tsx index 0bf742f..ba5c613 100644 --- a/frontend/src/app/tld-pricing/[tld]/page.tsx +++ b/frontend/src/app/tld-pricing/[tld]/page.tsx @@ -235,36 +235,40 @@ function PriceChart({ filter="url(#glow)" /> - {/* Hover point */} + {/* Hover indicator */} {hoveredIndex !== null && ( - <> + - - + )} + {/* Hover dot */} + {hoveredIndex !== null && containerRef.current && ( +
+ )} + {/* Tooltip */} {hoveredIndex !== null && (

${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 ( +

+
+
+ ) +} + +/** + * Shimmer block for price/data placeholders when user is not authenticated + */ +export function ShimmerBlock({ className }: { className?: string }) { + return +} + +/** + * Shimmer text for inline text placeholders + */ +export function ShimmerText({ className }: { className?: string }) { + return +} +