{"version":3,"file":"Tabs.mjs","sources":["../../../packages/tabs/Tabs.tsx"],"sourcesContent":["import { ForwardedRef, forwardRef, useCallback, useRef } from 'react'\nimport { useIsomorphicLayoutEffect } from '../hooks'\nimport { TabsProps } from './types.js'\nimport { TabsIndicatorStyle, TabsListStyle } from './TabsStyles.js'\n\nexport const Tabs = forwardRef(\n  ({ children, ...rest }: TabsProps, ref?: ForwardedRef<HTMLDivElement>) => {\n    const listRef = useRef<HTMLDivElement | null>(null)\n    const setRefs = useCallback(\n      (node: HTMLDivElement | null) => {\n        listRef.current = node\n        if (typeof ref === 'function') {\n          ref(node)\n          return\n        }\n        if (ref) {\n          ;(ref as { current: HTMLDivElement | null }).current = node\n        }\n      },\n      [ref],\n    )\n\n    useIsomorphicLayoutEffect(() => {\n      if (typeof window === 'undefined') return undefined\n      const listNode = listRef.current\n      if (!listNode) return undefined\n      let rafId = 0\n\n      const updateIndicator = () => {\n        const activeTab = listNode.querySelector<HTMLElement>(\n          '[role=\"tab\"][aria-selected=\"true\"]',\n        )\n        if (!activeTab) {\n          listNode.style.setProperty('--tabs-indicator-left', '0px')\n          listNode.style.setProperty('--tabs-indicator-width', '0px')\n          return\n        }\n\n        const listRect = listNode.getBoundingClientRect()\n        const tabRect = activeTab.getBoundingClientRect()\n        const left = tabRect.left - listRect.left + listNode.scrollLeft\n\n        listNode.style.setProperty('--tabs-indicator-left', `${left}px`)\n        listNode.style.setProperty(\n          '--tabs-indicator-width',\n          `${tabRect.width}px`,\n        )\n      }\n\n      const scheduleUpdate = () => {\n        if (rafId) {\n          window.cancelAnimationFrame(rafId)\n        }\n        rafId = window.requestAnimationFrame(updateIndicator)\n      }\n\n      updateIndicator()\n      scheduleUpdate()\n      listNode.addEventListener('scroll', scheduleUpdate, { passive: true })\n      window.addEventListener('resize', scheduleUpdate)\n\n      const mutationObserver =\n        typeof MutationObserver === 'undefined'\n          ? null\n          : new MutationObserver(scheduleUpdate)\n\n      mutationObserver?.observe(listNode, {\n        attributes: true,\n        subtree: true,\n        attributeFilter: ['aria-selected'],\n      })\n\n      const resizeObserver =\n        typeof ResizeObserver === 'undefined'\n          ? null\n          : new ResizeObserver(scheduleUpdate)\n\n      resizeObserver?.observe(listNode)\n      listNode\n        .querySelectorAll<HTMLElement>('[role=\"tab\"]')\n        .forEach((tab) => resizeObserver?.observe(tab))\n\n      if (typeof document !== 'undefined' && 'fonts' in document) {\n        // Ensure metrics are correct after fonts are loaded.\n        void (document as Document & { fonts: FontFaceSet }).fonts.ready.then(\n          scheduleUpdate,\n        )\n      }\n\n      return () => {\n        if (rafId) {\n          window.cancelAnimationFrame(rafId)\n        }\n        listNode.removeEventListener('scroll', scheduleUpdate)\n        window.removeEventListener('resize', scheduleUpdate)\n        mutationObserver?.disconnect()\n        resizeObserver?.disconnect()\n      }\n    }, [children])\n\n    return (\n      <TabsListStyle role='tablist' ref={setRefs} {...rest}>\n        {children}\n        <TabsIndicatorStyle aria-hidden />\n      </TabsListStyle>\n    )\n  },\n)\nTabs.displayName = 'Tabs'\n"],"names":["Tabs","forwardRef","_ref","ref","children","rest","listRef","useRef","setRefs","useCallback","node","current","useIsomorphicLayoutEffect","window","undefined","listNode","rafId","updateIndicator","activeTab","querySelector","style","setProperty","listRect","getBoundingClientRect","tabRect","left","scrollLeft","width","scheduleUpdate","cancelAnimationFrame","requestAnimationFrame","addEventListener","passive","mutationObserver","MutationObserver","observe","attributes","subtree","attributeFilter","resizeObserver","ResizeObserver","querySelectorAll","forEach","tab","document","fonts","ready","then","removeEventListener","disconnect","_jsxs","TabsListStyle","role","_jsx","TabsIndicatorStyle","displayName"],"mappings":"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"}