Tabs.jsx
1 import { useState } from 'react'; 2 3 /** 4 * Simple tab bar. 5 * tabs: [{ id, label }] 6 * children: React node (receives activeTab via render prop or just render all and hide) 7 * 8 * Usage: 9 * <Tabs tabs={[{id:'a',label:'A'},{id:'b',label:'B'}]}> 10 * {(active) => active === 'a' ? <A/> : <B/>} 11 * </Tabs> 12 */ 13 export default function Tabs({ tabs, children, defaultTab }) { 14 const [active, setActive] = useState(defaultTab ?? tabs[0]?.id); 15 return ( 16 <div> 17 <div className="flex gap-1 border-b border-slate-700 mb-6"> 18 {tabs.map(t => ( 19 <button 20 key={t.id} 21 onClick={() => setActive(t.id)} 22 className={`px-4 py-2 text-sm font-medium rounded-t-md transition-colors ${ 23 active === t.id 24 ? 'border-b-2 border-sky-400 text-sky-400' 25 : 'text-slate-400 hover:text-slate-200' 26 }`} 27 > 28 {t.label} 29 </button> 30 ))} 31 </div> 32 {typeof children === 'function' ? children(active) : children} 33 </div> 34 ); 35 }