/** * Provider Tabs Component * * Premium tab bar for switching between imageboard providers (4chan, 7chan, etc.) */ import { useState, useEffect } from 'react' import { motion, AnimatePresence } from 'framer-motion' import { Plus, Settings as SettingsIcon, X } from 'lucide-react' import { providerRegistry } from '../../providers' import { useProviderStore } from '../../stores/providerStore' import Settings from '../common/Settings' export default function ProviderTabs() { const { activeProviderId, setActiveProvider } = useProviderStore() const providers = providerRegistry.getAll() const [showAddMenu, setShowAddMenu] = useState(false) const [showSettings, setShowSettings] = useState(false) // Ctrl+, keyboard shortcut for Settings useEffect(() => { const handleKeyDown = (e: KeyboardEvent) => { if ((e.ctrlKey || e.metaKey) && e.key === ',') { e.preventDefault() setShowSettings(s => !s) } } window.addEventListener('keydown', handleKeyDown) return () => window.removeEventListener('keydown', handleKeyDown) }, []) return ( <> setShowSettings(false)} />
{/* Provider Tabs */}
{providers.map((provider, index) => { const isActive = provider.id === activeProviderId return ( setActiveProvider(provider.id)} className={` relative flex items-center gap-1.5 px-3 py-1.5 rounded-t-lg transition-all duration-200 text-sm font-medium border-t border-l border-r ${isActive ? 'text-white bg-zinc-800 border-zinc-700 -mb-[1px] z-10' : 'text-zinc-500 hover:text-zinc-300 bg-transparent border-transparent hover:bg-zinc-800/50' } `} whileHover={{ y: isActive ? 0 : -1 }} whileTap={{ scale: 0.98 }} > {/* Active indicator line */} {isActive && ( )} {/* Provider Icon */} {provider.icon} {/* Provider Name */} {provider.shortName} ) })} {/* Add Provider Button */}
{/* Add Menu Dropdown */} {showAddMenu && ( <> {/* Backdrop */}
setShowAddMenu(false)} />
Switch Chan
{providers.map((provider) => ( ))}
)}
{/* Spacer */}
{/* App Branding */}
C
ChanDesk Pro
{/* Settings */}
) }