import React, { useState, useRef, useLayoutEffect } from 'react'; import cn from 'classnames'; type Item = { id: string; title: string; children: React.ReactNode; }; type Props = { items: Item[]; }; export const Tabs: React.FC = ({ items }: Props) => { const [activeTab, setActiveTab] = useState(); const tabsRef = useRef(); const sliderRef = useRef(); const changeTab = (i: number) => { let leftOffset = 0; let sliderWidth = 0; tabsRef.current .querySelectorAll('.bfo-tabs__item-wrapper') .forEach((tab, index) => { if (index < i) { const { width } = tab.getBoundingClientRect(); leftOffset += width; } if (index === i) { const { width } = tab .querySelector('.bfo-tabs__item') .getBoundingClientRect(); sliderWidth = width; } }); sliderRef.current.style.width = `${sliderWidth}px`; sliderRef.current.style.left = `${leftOffset}px`; setActiveTab(i); }; useLayoutEffect(() => { setTimeout(() => { changeTab(0); }, 100); }, []); const tabs = items.map((item, i) => { const isActive = activeTab === i; return (
changeTab(i)} onKeyUp={() => changeTab(i)} >

{item.title}

); }); const content = items.map((item, i) => (
{item.children}
)); return (
{tabs}
{content}
); };