{
  "$schema": "https://ui.shadcn.com/schema/registry-item.json",
  "name": "tabs",
  "title": "Tabs",
  "author": "Poyraz Avsever",
  "description": "Poyraz Soft Glass tabs component with standardized floating and overlay behavior.",
  "dependencies": [
    "@radix-ui/react-tabs@^1.1.13"
  ],
  "registryDependencies": [
    "@poyraz/poyraz-utils",
    "@poyraz/poyraz-theme",
    "@poyraz/poyraz-recipes"
  ],
  "files": [
    {
      "path": "registry/poyraz/ui/phase6/molecules/tabs.tsx",
      "content": "\"use client\";\n\nimport * as React from \"react\";\nimport * as TabsPrimitive from \"@radix-ui/react-tabs\";\n\nimport { cn } from \"@/lib/utils\";\nimport { floatingSurfaceVariants, type FloatingSurfaceProps } from \"@/components/ui/recipes\";\n\ntype TabsVariant = \"line\" | \"soft\" | \"glass\";\nconst TabsStyleContext = React.createContext<{ variant: TabsVariant }>({ variant: \"line\" });\n\nconst Tabs = TabsPrimitive.Root;\n\nconst TabsList = React.forwardRef<\n  React.ElementRef<typeof TabsPrimitive.List>,\n  React.ComponentPropsWithoutRef<typeof TabsPrimitive.List> & {\n    variant?: TabsVariant;\n    radius?: \"none\" | \"sm\" | \"md\" | \"lg\" | \"full\";\n  }\n>(({ className, variant = \"line\", radius = \"lg\", children, ...props }, forwardedRef) => {\n  const listRef = React.useRef<React.ElementRef<typeof TabsPrimitive.List>>(null);\n  const [indicator, setIndicator] = React.useState({ left: 0, width: 0, visible: false });\n\n  React.useImperativeHandle(\n    forwardedRef,\n    () => listRef.current as React.ElementRef<typeof TabsPrimitive.List>,\n  );\n\n  React.useLayoutEffect(() => {\n    const list = listRef.current;\n    if (!list || variant !== \"line\") return;\n\n    const update = () => {\n      const active = list.querySelector<HTMLElement>('[role=\"tab\"][data-state=\"active\"]');\n      if (!active) {\n        setIndicator((current) => ({ ...current, visible: false }));\n        return;\n      }\n      setIndicator({ left: active.offsetLeft, width: active.offsetWidth, visible: true });\n    };\n\n    update();\n    const mutationObserver = new MutationObserver(update);\n    mutationObserver.observe(list, {\n      attributes: true,\n      subtree: true,\n      attributeFilter: [\"data-state\"],\n    });\n    const resizeObserver = new ResizeObserver(update);\n    resizeObserver.observe(list);\n    list\n      .querySelectorAll<HTMLElement>('[role=\"tab\"]')\n      .forEach((tab) => resizeObserver.observe(tab));\n\n    return () => {\n      mutationObserver.disconnect();\n      resizeObserver.disconnect();\n    };\n  }, [variant, children]);\n\n  return (\n    <TabsStyleContext.Provider value={{ variant }}>\n      <TabsPrimitive.List\n        ref={listRef}\n        className={cn(\n          \"relative inline-flex min-h-10 max-w-full items-center overflow-x-auto overflow-y-clip p-1 text-muted-foreground [scrollbar-width:none] [&::-webkit-scrollbar]:hidden\",\n          \"transition-[color,background-color,border-color] duration-[var(--poyraz-motion-duration-fast)]\",\n          variant === \"line\" && \"gap-1 border-b border-border bg-transparent px-0 pb-0\",\n          variant === \"soft\" && \"gap-1 bg-surface-subtle\",\n          variant === \"glass\" &&\n            \"gap-1 border border-glass-border-outer bg-glass shadow-sm backdrop-blur-glass\",\n          radius === \"none\" && \"rounded-none\",\n          radius === \"sm\" && \"rounded-sm\",\n          radius === \"md\" && \"rounded-md\",\n          radius === \"lg\" && \"rounded-lg\",\n          radius === \"full\" && \"rounded-full\",\n          className,\n        )}\n        {...props}\n      >\n        {children}\n        {variant === \"line\" && (\n          <span\n            aria-hidden=\"true\"\n            data-slot=\"tabs-indicator\"\n            className=\"pointer-events-none absolute bottom-0 left-0 h-0.5 rounded-full bg-primary transition-[transform,width,opacity] duration-[var(--poyraz-motion-duration-slow)] ease-[var(--poyraz-motion-ease-out)] will-change-transform motion-reduce:duration-[1ms]\"\n            style={{\n              width: indicator.width,\n              opacity: indicator.visible ? 1 : 0,\n              transform: `translate3d(${indicator.left}px, 0, 0)`,\n            }}\n          />\n        )}\n      </TabsPrimitive.List>\n    </TabsStyleContext.Provider>\n  );\n});\nTabsList.displayName = TabsPrimitive.List.displayName;\n\nconst TabsTrigger = React.forwardRef<\n  React.ElementRef<typeof TabsPrimitive.Trigger>,\n  React.ComponentPropsWithoutRef<typeof TabsPrimitive.Trigger> & {\n    size?: \"sm\" | \"md\" | \"lg\";\n    radius?: \"none\" | \"sm\" | \"md\" | \"lg\" | \"full\";\n  }\n>(({ className, size = \"md\", radius = \"md\", ...props }, ref) => {\n  const { variant } = React.useContext(TabsStyleContext);\n  return (\n    <TabsPrimitive.Trigger\n      ref={ref}\n      className={cn(\n        \"relative inline-flex shrink-0 items-center justify-center whitespace-nowrap font-medium outline-none\",\n        \"transition-[color,background-color] duration-[var(--poyraz-motion-duration-fast)] ease-[var(--poyraz-motion-ease-out)]\",\n        \"focus-visible:ring-2 focus-visible:ring-ring focus-visible:ring-offset-2 disabled:pointer-events-none disabled:opacity-50\",\n        size === \"sm\" && \"h-7 px-2.5 text-xs\",\n        size === \"md\" && \"h-8 px-3 text-sm\",\n        size === \"lg\" && \"h-10 px-4 text-sm\",\n        radius === \"none\" && \"rounded-none\",\n        radius === \"sm\" && \"rounded-sm\",\n        radius === \"md\" && \"rounded-md\",\n        radius === \"lg\" && \"rounded-lg\",\n        radius === \"full\" && \"rounded-full\",\n        variant === \"line\" && \"data-[state=active]:text-foreground\",\n        variant !== \"line\" &&\n          \"data-[state=active]:bg-background data-[state=active]:text-foreground data-[state=active]:shadow-sm\",\n        variant === \"glass\" && \"data-[state=active]:bg-background/80\",\n        className,\n      )}\n      {...props}\n    />\n  );\n});\nTabsTrigger.displayName = TabsPrimitive.Trigger.displayName;\n\nconst TabsContent = React.forwardRef<\n  React.ElementRef<typeof TabsPrimitive.Content>,\n  React.ComponentPropsWithoutRef<typeof TabsPrimitive.Content> &\n    FloatingSurfaceProps & { contained?: boolean }\n>(({ className, surface, radius, contained = false, ...props }, ref) => (\n  <TabsPrimitive.Content\n    ref={ref}\n    className={cn(\n      \"mt-3 outline-none focus-visible:ring-2 focus-visible:ring-ring focus-visible:ring-offset-2 data-[state=active]:animate-poyraz-fade-in motion-reduce:animate-none\",\n      contained && floatingSurfaceVariants({ surface, radius }),\n      contained && \"p-4\",\n      className,\n    )}\n    {...props}\n  />\n));\nTabsContent.displayName = TabsPrimitive.Content.displayName;\n\nexport { Tabs, TabsList, TabsTrigger, TabsContent };\n",
      "type": "registry:ui",
      "target": "@ui/molecules/tabs.tsx"
    }
  ],
  "meta": {
    "category": "phase-6-interactive",
    "phase": "beta"
  },
  "type": "registry:ui"
}