// Original path: src/renderer/src/components/CollapsibleSearchBar.tsx import { Search } from 'lucide-react' import { motion } from 'motion/react' import React, { memo, useCallback, useEffect, useRef, useState } from 'react' import { Input } from '../../primitives/input' import { Tooltip } from '../../primitives/tooltip' interface CollapsibleSearchBarProps { onSearch: (text: string) => void placeholder?: string tooltip?: string icon?: React.ReactNode maxWidth?: string | number style?: React.CSSProperties } /** * A collapsible search bar for list headers * Renders as an icon initially, expands to full search input when clicked */ const CollapsibleSearchBar = ({ onSearch, placeholder = 'Search', tooltip = 'Search', icon = , maxWidth = '100%', style }: CollapsibleSearchBarProps) => { const [searchVisible, setSearchVisible] = useState(false) const [searchText, setSearchText] = useState('') const inputRef = useRef(null) const handleTextChange = useCallback( (text: string) => { setSearchText(text) onSearch(text) }, [onSearch] ) const handleClear = useCallback(() => { setSearchText('') setSearchVisible(false) onSearch('') }, [onSearch]) useEffect(() => { if (searchVisible && inputRef.current) { inputRef.current.focus() } }, [searchVisible]) return (
handleTextChange(e.target.value)} onKeyDown={(e) => { if (e.key === 'Escape') { e.stopPropagation() handleTextChange('') if (!searchText) setSearchVisible(false) } }} onBlur={() => { if (!searchText) setSearchVisible(false) }} onClear={handleClear} style={{ width: '100%', ...style }} /> setSearchVisible(true)}> {icon}
) } export default memo(CollapsibleSearchBar)