'use client' import React, { useState, useRef, useEffect } from 'react' import { MagnifyingGlass, X, Folder, Calendar, Clock, Sparkle, Globe, DeviceMobile, Function as FunctionIcon, Brain } from '@phosphor-icons/react' import { motion, AnimatePresence } from 'framer-motion' interface SpotlightSearchProps { isOpen: boolean onClose: () => void onOpenApp: (appId: string) => void } interface SearchResult { id: string name: string type: 'app' | 'file' | 'setting' icon?: React.ReactNode } export function SpotlightSearch({ isOpen, onClose, onOpenApp }: SpotlightSearchProps) { const [query, setQuery] = useState('') const [results, setResults] = useState([]) const inputRef = useRef(null) const apps: SearchResult[] = [ { id: 'files', name: 'Files', type: 'app', icon:
}, { id: 'calendar', name: 'Calendar', type: 'app', icon:
}, { id: 'clock', name: 'Clock', type: 'app', icon:
}, { id: 'gemini', name: 'Gemini Chat', type: 'app', icon:
}, { id: 'flutter-editor', name: 'Flutter IDE', type: 'app', icon:
}, { id: 'latex-editor', name: 'LaTeX Studio', type: 'app', icon:
}, { id: 'quiz', name: 'Quiz Master', type: 'app', icon:
}, ] const files: SearchResult[] = [ { id: 'document', name: 'Document.pdf', type: 'file' }, { id: 'resume', name: 'Resume.docx', type: 'file' }, { id: 'budget', name: 'Budget.xlsx', type: 'file' }, { id: 'presentation', name: 'Presentation.pptx', type: 'file' }, ] const settings: SearchResult[] = [ { id: 'wallpaper', name: 'Change Wallpaper', type: 'setting' }, { id: 'theme', name: 'Dark Mode', type: 'setting' }, { id: 'display', name: 'Display Settings', type: 'setting' }, ] const allItems = [...apps, ...files, ...settings] useEffect(() => { if (isOpen) { setQuery('') setResults([]) setTimeout(() => inputRef.current?.focus(), 100) } }, [isOpen]) useEffect(() => { if (query.trim() === '') { setResults([]) return } const filtered = allItems.filter(item => item.name.toLowerCase().includes(query.toLowerCase()) ) setResults(filtered.slice(0, 8)) }, [query]) const handleSelect = (result: SearchResult) => { if (result.type === 'app') { onOpenApp(result.id) } onClose() setQuery('') } const handleKeyDown = (e: React.KeyboardEvent) => { if (e.key === 'Escape') { onClose() } else if (e.key === 'Enter' && results.length > 0) { handleSelect(results[0]) } } return ( {isOpen && ( <> {/* Backdrop */} {/* Search Box */}
setQuery(e.target.value)} onKeyDown={handleKeyDown} className="flex-1 bg-transparent text-base sm:text-xl focus:outline-none text-gray-800 placeholder-gray-400 min-w-0" placeholder="Spotlight Search" autoComplete="off" spellCheck={false} />
{/* Results */} {results.length > 0 && (
{results.map((result, index) => (
handleSelect(result)} className={`flex items-center px-2 sm:px-3 py-2 sm:py-2.5 hover:bg-blue-500 hover:text-white rounded-lg cursor-pointer transition-colors gap-2 sm:gap-3 ${index === 0 ? 'bg-blue-500/10' : '' }`} > {result.icon && (
{result.icon}
)}
{result.name} {result.type}
{result.type === 'app' && ( ⌘ Enter )}
))}
)} {/* No results */} {query.trim() !== '' && results.length === 0 && (
No results found for "{query}"
)} {/* Quick Actions (when no query) */} {query === '' && (
Suggestions
{apps.slice(0, 4).map(app => (
handleSelect(app)} className="flex items-center px-2 sm:px-3 py-1.5 sm:py-2 hover:bg-gray-100 rounded-lg cursor-pointer transition-colors" > {app.name}
))}
)}
)}
) }