{
  "$schema": "https://ui.shadcn.com/schema/registry-item.json",
  "name": "tabs",
  "title": "TabsField",
  "description": "Tabs field for BuzzForm v2.",
  "registryDependencies": [
    "@buzzform/init",
    "tabs",
    "badge"
  ],
  "files": [
    {
      "path": "registry/shadcn/fields/tabs.tsx",
      "content": "\"use client\";\n\nimport type { TabsField as TabsFieldDef } from \"@buildnbuzz/form-react\";\nimport {\n  useLayoutField,\n  RenderFields,\n  useNestedErrorCount,\n  toDotNotation,\n  type FieldInput,\n} from \"@buildnbuzz/form-react\";\nimport { Tabs, TabsContent, TabsList, TabsTrigger } from \"@/components/ui/tabs\";\nimport { Badge } from \"@/components/ui/badge\";\nimport { cn } from \"@/lib/utils\";\n\n// ---------------------------------------------------------------------------\n// UI options\n// ---------------------------------------------------------------------------\n\ninterface TabsUi {\n  /** Default active tab (index or label). Defaults to first enabled tab. */\n  defaultTab?: number | string;\n  /** Visual variant. Default: \"default\". */\n  variant?: \"default\" | \"line\";\n  /** Content spacing. Default: \"md\". */\n  spacing?: \"sm\" | \"md\" | \"lg\";\n  /** Show error badge on tabs. Default: true. */\n  showErrorBadge?: boolean;\n}\n\n// ---------------------------------------------------------------------------\n// Helpers\n// ---------------------------------------------------------------------------\n\nconst spacingClass: Record<NonNullable<TabsUi[\"spacing\"]>, string> = {\n  sm: \"space-y-3\",\n  md: \"space-y-4\",\n  lg: \"space-y-6\",\n};\n\n// ---------------------------------------------------------------------------\n// Per-tab trigger with reactive error badge\n// ---------------------------------------------------------------------------\n\nfunction TabTriggerWithBadge({\n  label,\n  value,\n  disabled,\n  fields,\n  basePath,\n  showErrorBadge,\n}: {\n  label: string;\n  value: string;\n  disabled: boolean;\n  fields: readonly FieldInput[];\n  basePath: string;\n  showErrorBadge: boolean;\n}) {\n  const errorCount = useNestedErrorCount(fields, basePath);\n  return (\n    <TabsTrigger value={value} disabled={disabled}>\n      <span className=\"flex items-center gap-1.5\">\n        <span>{label}</span>\n        {showErrorBadge && errorCount > 0 && (\n          <Badge variant=\"destructive\" className=\"h-5 px-1.5 text-xs\">\n            {errorCount}\n          </Badge>\n        )}\n      </span>\n    </TabsTrigger>\n  );\n}\n\n// ---------------------------------------------------------------------------\n// TabsField\n// ---------------------------------------------------------------------------\n\nexport function TabsField() {\n  const { form, fieldPath, resolvedTabs, field } =\n    useLayoutField<TabsFieldDef>();\n\n  if (resolvedTabs.length === 0) return null;\n\n  const ui = field.ui as TabsUi | undefined;\n  const variant = ui?.variant ?? \"default\";\n  const spacing = ui?.spacing ?? \"md\";\n  const showErrorBadge = ui?.showErrorBadge !== false;\n\n  // Resolve defaultTab\n  const rawDefault = ui?.defaultTab;\n  let defaultValue: string;\n  if (typeof rawDefault === \"string\") {\n    // Match by label\n    defaultValue = resolvedTabs.some((t) => t.label === rawDefault)\n      ? rawDefault\n      : (resolvedTabs[0]?.label ?? \"\");\n  } else if (typeof rawDefault === \"number\") {\n    defaultValue =\n      resolvedTabs[rawDefault]?.label ?? resolvedTabs[0]?.label ?? \"\";\n  } else {\n    // First non-disabled tab\n    const firstEnabled = resolvedTabs.findIndex((t) => !t.disabled);\n    defaultValue =\n      resolvedTabs[firstEnabled >= 0 ? firstEnabled : 0]?.label ?? \"\";\n  }\n\n  const basePath = toDotNotation(fieldPath);\n\n  return (\n    <Tabs defaultValue={defaultValue} className=\"w-full\">\n      <TabsList variant={variant} className=\"w-full justify-start\">\n        {resolvedTabs.map((tab, i) => {\n          const rawTab = (field as TabsFieldDef).tabs[i];\n          return (\n            <TabTriggerWithBadge\n              key={i}\n              label={tab.label}\n              value={tab.label}\n              disabled={tab.disabled}\n              showErrorBadge={showErrorBadge}\n              fields={rawTab?.fields ?? []}\n              basePath={basePath}\n            />\n          );\n        })}\n      </TabsList>\n\n      {resolvedTabs.map((tab, i) => {\n        const rawTab = (field as TabsFieldDef).tabs[i];\n        return (\n          <TabsContent\n            key={i}\n            value={tab.label}\n            className={cn(\"mt-4\", spacingClass[spacing])}\n          >\n            <RenderFields\n              fields={rawTab?.fields ?? []}\n              form={form}\n              basePath={basePath}\n            />\n          </TabsContent>\n        );\n      })}\n    </Tabs>\n  );\n}\n",
      "type": "registry:component",
      "target": "components/buzzform/fields/tabs.tsx"
    }
  ],
  "type": "registry:ui"
}