diff --git a/src/pages/Search.tsx b/src/pages/Search.tsx
new file mode 100644
index 00000000..af9b1cb6
--- /dev/null
+++ b/src/pages/Search.tsx
@@ -0,0 +1,233 @@
+import { useState, useEffect } from 'react';
+import { useSearchParams, useNavigate } from 'react-router-dom';
+import { Header } from '@/components/layout/Header';
+import { Card, CardContent } from '@/components/ui/card';
+import { Badge } from '@/components/ui/badge';
+import { Button } from '@/components/ui/button';
+import { Tabs, TabsContent, TabsList, TabsTrigger } from '@/components/ui/tabs';
+import { Search, MapPin, Zap, Star } from 'lucide-react';
+import { AutocompleteSearch } from '@/components/search/AutocompleteSearch';
+import { useSearch, SearchResult } from '@/hooks/useSearch';
+
+export default function SearchPage() {
+ const [searchParams] = useSearchParams();
+ const navigate = useNavigate();
+ const initialQuery = searchParams.get('q') || '';
+
+ const [activeTab, setActiveTab] = useState('all');
+ const {
+ query,
+ setQuery,
+ results,
+ loading,
+ search
+ } = useSearch({
+ types: ['park', 'ride', 'company'],
+ limit: 50
+ });
+
+ useEffect(() => {
+ if (initialQuery) {
+ setQuery(initialQuery);
+ }
+ }, [initialQuery, setQuery]);
+
+ const filteredResults = results.filter(result =>
+ activeTab === 'all' || result.type === activeTab
+ );
+
+ const resultCounts = {
+ all: results.length,
+ park: results.filter(r => r.type === 'park').length,
+ ride: results.filter(r => r.type === 'ride').length,
+ company: results.filter(r => r.type === 'company').length
+ };
+
+ const handleResultClick = (result: SearchResult) => {
+ switch (result.type) {
+ case 'park':
+ navigate(`/parks/${result.slug || result.id}`);
+ break;
+ case 'ride':
+ navigate(`/rides/${result.id}`);
+ break;
+ case 'company':
+ navigate(`/companies/${result.id}`);
+ break;
+ }
+ };
+
+ const getTypeIcon = (type: string) => {
+ switch (type) {
+ case 'park': return '🏰';
+ case 'ride': return '🎢';
+ case 'company': return '🏭';
+ default: return '🔍';
+ }
+ };
+
+ const getTypeColor = (type: string) => {
+ switch (type) {
+ case 'park':
+ return 'bg-primary/10 text-primary border-primary/20';
+ case 'ride':
+ return 'bg-secondary/10 text-secondary border-secondary/20';
+ case 'company':
+ return 'bg-accent/10 text-accent border-accent/20';
+ default:
+ return 'bg-muted text-muted-foreground';
+ }
+ };
+
+ return (
+
+
+
+
+ {/* Search Header */}
+
+
+
+
Search Results
+
+
+ {query && (
+
+ Results for "{query}"
+
+ )}
+
+ {/* Search Bar */}
+
+
{
+ const params = new URLSearchParams();
+ params.set('q', newQuery);
+ navigate(`/search?${params.toString()}`, { replace: true });
+ }}
+ />
+
+
+
+ {/* Results */}
+ {query && (
+ <>
+ {/* Filter Tabs */}
+
+
+
+ All ({resultCounts.all})
+
+
+ Parks ({resultCounts.park})
+
+
+ Rides ({resultCounts.ride})
+
+
+ Companies ({resultCounts.company})
+
+
+
+
+ {/* Loading State */}
+ {loading && (
+
+ )}
+
+ {/* Results Grid */}
+ {!loading && filteredResults.length > 0 && (
+
+ {filteredResults.map((result) => (
+
handleResultClick(result)}
+ className="group cursor-pointer hover:shadow-lg hover:shadow-primary/10 transition-all duration-300 border-border/50 hover:border-primary/50"
+ >
+
+
+
{getTypeIcon(result.type)}
+
+
+
+ {result.title}
+
+
+ {result.type}
+
+
+
+
+ {result.subtitle}
+
+
+
+
+ {result.type === 'park' && (
+
+
+
+ )}
+ {result.type === 'ride' && (
+
+
+
+ )}
+
+
+ {result.rating && result.rating > 0 && (
+
+
+ {result.rating.toFixed(1)}
+
+ )}
+
+
+
+
+
+ ))}
+
+ )}
+
+ {/* No Results */}
+ {!loading && query && filteredResults.length === 0 && (
+
+
🔍
+
No results found
+
+ Try searching for something else or adjust your search terms
+
+
+
+ )}
+ >
+ )}
+
+ {/* Initial State */}
+ {!query && (
+
+
🔍
+
Start your search
+
+ Search for theme parks, rides, or companies to get started
+
+
+ )}
+
+
+ );
+}
\ No newline at end of file