import * as TabsPrimitive from "@radix-ui/react-tabs"; import * as React from "react"; import { cn } from "@/shared/lib/cn"; export function Tabs({ className, ...props }: React.ComponentProps) { return ; } type IndicatorGeometry = { left: number; top: number; width: number; height: number }; export const TabsList = React.forwardRef, React.ComponentPropsWithoutRef>( function TabsList({ className, children, ...props }, forwardedRef) { const listRef = React.useRef | null>(null); const [indicator, setIndicator] = React.useState(null); const setListRef = React.useCallback((node: React.ElementRef | null) => { listRef.current = node; if (typeof forwardedRef === "function") forwardedRef(node); else if (forwardedRef) (forwardedRef as React.MutableRefObject | null>).current = node; }, [forwardedRef]); const updateIndicator = React.useCallback(() => { const list = listRef.current; const active = list?.querySelector('[role="tab"][data-state="active"]'); if (!list || !active) { setIndicator(null); return; } const next = { left: active.offsetLeft, top: active.offsetTop, width: active.offsetWidth, height: active.offsetHeight }; setIndicator((current) => current && current.left === next.left && current.top === next.top && current.width === next.width && current.height === next.height ? current : next); }, []); React.useLayoutEffect(() => { const list = listRef.current; if (!list) return; updateIndicator(); const mutationObserver = new MutationObserver(updateIndicator); mutationObserver.observe(list, { attributes: true, childList: true, subtree: true, attributeFilter: ["data-state"] }); const resizeObserver = typeof ResizeObserver === "undefined" ? null : new ResizeObserver(updateIndicator); resizeObserver?.observe(list); list.querySelectorAll('[role="tab"]').forEach((tab) => resizeObserver?.observe(tab)); window.addEventListener("resize", updateIndicator); return () => { mutationObserver.disconnect(); resizeObserver?.disconnect(); window.removeEventListener("resize", updateIndicator); }; }, [updateIndicator]); return ( {indicator ? ( ); }, ); export function TabsTrigger({ className, ...props }: React.ComponentProps) { return ( ); } export function TabsContent({ className, ...props }: React.ComponentProps) { return ; }