import { marked } from "marked"; import React, { useEffect, useRef, useState } from "react"; marked.use({ mangle: false, headerIds: false, }); const Tabs = ({ children }: { children: React.ReactElement }) => { const [active, setActive] = useState(0); const [defaultFocus, setDefaultFocus] = useState(false); const tabRefs: React.RefObject = useRef([]); useEffect(() => { if (defaultFocus) { //@ts-ignore tabRefs.current[active]?.focus(); } else { setDefaultFocus(true); } }, [active]); const tabLinks = Array.from( children.props.value.matchAll( /]*>(.*?)<\/div>/gs, ), (match: RegExpMatchArray) => ({ name: match[1], children: match[0] }), ); const handleKeyDown = ( event: React.KeyboardEvent, index: number, ) => { if (event.key === "Enter" || event.key === " ") { setActive(index); } else if (event.key === "ArrowRight") { setActive((active + 1) % tabLinks.length); } else if (event.key === "ArrowLeft") { setActive((active - 1 + tabLinks.length) % tabLinks.length); } }; return (
    {tabLinks.map( (item: { name: string; children: string }, index: number) => (
  • handleKeyDown(event, index)} onClick={() => setActive(index)} //@ts-ignore ref={(ref) => (tabRefs.current[index] = ref)} > {item.name}
  • ), )}
{tabLinks.map((item: { name: string; children: string }, i: number) => (
))}
); }; export default Tabs;