Tabs.tsx 1.1 KB

12345678910111213141516171819202122232425262728293031
  1. import * as React from 'react';
  2. interface TabsProps<T extends string> {
  3. tabs: T[] | readonly T[];
  4. activeTab: T;
  5. onTabClick: (tab: T) => void;
  6. labels?: Record<T, string>;
  7. }
  8. export const Tabs = <T extends string>({ tabs, activeTab, onTabClick, labels }: TabsProps<T>) => {
  9. return (
  10. <div className="border-b border-gray-700">
  11. <nav className="-mb-px flex space-x-8" aria-label="Tabs">
  12. {tabs.map(tab => (
  13. <button
  14. key={tab}
  15. onClick={() => onTabClick(tab)}
  16. className={
  17. `${(activeTab === tab
  18. ? 'border-brand-primary text-brand-primary'
  19. : 'border-transparent text-gray-400 hover:text-gray-300 hover:border-gray-500')}
  20. whitespace-nowrap py-4 px-1 border-b-2 font-medium text-sm capitalize transition-colors`
  21. }
  22. >
  23. {labels ? labels[tab] : tab}
  24. </button>
  25. ))}
  26. </nav>
  27. </div>
  28. );
  29. };