{
  "$schema": "https://ui.shadcn.com/schema/registry-item.json",
  "name": "scroll-area",
  "title": "Scroll Area",
  "description": "A custom scroll area built on Base UI.",
  "dependencies": [
    "@base-ui/react@^1.4.1"
  ],
  "registryDependencies": [
    "@retab/utils"
  ],
  "files": [
    {
      "path": "registry/new-york-v4/ui/scroll-area.tsx",
      "content": "\"use client\";\n\nimport type React from \"react\";\nimport { ScrollArea as ScrollAreaPrimitive } from \"@base-ui/react/scroll-area\";\n\nimport { cn } from \"@/lib/utils\";\n\nexport function ScrollArea({\n  className,\n  children,\n  orientation = \"both\",\n  nativeScrollbar = false,\n  scrollFade = false,\n  scrollbarGutter = false,\n  scrollbarOverflowOnly = false,\n  viewportClassName,\n  viewportProps,\n  viewportRef,\n  ...props\n}: ScrollAreaPrimitive.Root.Props & {\n  orientation?: \"vertical\" | \"horizontal\" | \"both\";\n  nativeScrollbar?: boolean;\n  scrollFade?: boolean;\n  scrollbarGutter?: boolean;\n  scrollbarOverflowOnly?: boolean;\n  viewportClassName?: string;\n  viewportProps?: ScrollAreaPrimitive.Viewport.Props;\n  viewportRef?: React.Ref<HTMLDivElement>;\n}): React.ReactElement {\n  const {\n    className: viewportPropsClassName,\n    key: viewportKey,\n    ref: viewportPropsRef,\n    ...resolvedViewportProps\n  } = viewportProps ?? {};\n  const rootClassName = cn(\n    \"size-full min-h-0\",\n    scrollbarOverflowOnly && \"scrollbar-overflow-only\",\n    className,\n  );\n  const resolvedViewportClassName = cn(\n    \"transition-shadows h-full rounded-[inherit] outline-none focus-visible:ring-2 focus-visible:ring-ring focus-visible:ring-offset-1 focus-visible:ring-offset-background data-has-overflow-x:overscroll-x-contain data-has-overflow-y:overscroll-y-contain\",\n    scrollFade &&\n      \"mask-t-from-[calc(100%-min(var(--fade-size),var(--scroll-area-overflow-y-start)))] mask-r-from-[calc(100%-min(var(--fade-size),var(--scroll-area-overflow-x-end)))] mask-b-from-[calc(100%-min(var(--fade-size),var(--scroll-area-overflow-y-end)))] mask-l-from-[calc(100%-min(var(--fade-size),var(--scroll-area-overflow-x-start)))] [--fade-size:1.5rem]\",\n    scrollbarGutter && \"data-has-overflow-x:pb-2.5 data-has-overflow-y:pe-2.5\",\n    viewportPropsClassName,\n    viewportClassName,\n  );\n\n  if (nativeScrollbar || !canUsePrimitiveScrollArea()) {\n    const { style: rootStyle, ...rootProps } = props;\n    const { style: viewportStyle, ...viewportHtmlProps } =\n      resolvedViewportProps;\n\n    return (\n      <div\n        className={rootClassName}\n        style={typeof rootStyle === \"function\" ? undefined : rootStyle}\n        {...rootProps}\n      >\n        <div\n          key={viewportKey}\n          {...viewportHtmlProps}\n          ref={composeRefs(viewportPropsRef, viewportRef)}\n          className={cn(\"overflow-auto\", resolvedViewportClassName)}\n          data-slot=\"scroll-area-viewport\"\n          style={\n            typeof viewportStyle === \"function\" ? undefined : viewportStyle\n          }\n        >\n          {children}\n        </div>\n      </div>\n    );\n  }\n\n  return (\n    <ScrollAreaPrimitive.Root className={rootClassName} {...props}>\n      <ScrollAreaPrimitive.Viewport\n        key={viewportKey}\n        {...resolvedViewportProps}\n        ref={composeRefs(viewportPropsRef, viewportRef)}\n        className={resolvedViewportClassName}\n        data-slot=\"scroll-area-viewport\"\n      >\n        {children}\n      </ScrollAreaPrimitive.Viewport>\n      {orientation !== \"horizontal\" ? (\n        <ScrollBar orientation=\"vertical\" />\n      ) : null}\n      {orientation !== \"vertical\" ? (\n        <ScrollBar orientation=\"horizontal\" />\n      ) : null}\n      {orientation === \"both\" ? (\n        <ScrollAreaPrimitive.Corner data-slot=\"scroll-area-corner\" />\n      ) : null}\n    </ScrollAreaPrimitive.Root>\n  );\n}\n\nlet checkedResizeObserver: typeof ResizeObserver | undefined;\nlet isPrimitiveScrollAreaUsable = true;\n\nfunction canUsePrimitiveScrollArea() {\n  const ResizeObserverCtor = globalThis.ResizeObserver;\n  if (typeof ResizeObserverCtor === \"undefined\") return true;\n  if (checkedResizeObserver === ResizeObserverCtor) {\n    return isPrimitiveScrollAreaUsable;\n  }\n  checkedResizeObserver = ResizeObserverCtor;\n  try {\n    const observer = new ResizeObserverCtor(() => {});\n    try {\n      if (typeof document !== \"undefined\") {\n        observer.observe(document.createElement(\"div\"));\n      }\n      isPrimitiveScrollAreaUsable = true;\n    } finally {\n      observer.disconnect();\n    }\n  } catch {\n    isPrimitiveScrollAreaUsable = false;\n  }\n  return isPrimitiveScrollAreaUsable;\n}\n\nfunction composeRefs<T>(\n  ...refs: Array<React.Ref<T> | undefined>\n): React.RefCallback<T> {\n  return (node) => {\n    refs.forEach((ref) => {\n      if (!ref) return;\n      if (typeof ref === \"function\") {\n        ref(node);\n        return;\n      }\n      ref.current = node;\n    });\n  };\n}\n\nexport function ScrollBar({\n  className,\n  orientation = \"vertical\",\n  ...props\n}: ScrollAreaPrimitive.Scrollbar.Props): React.ReactElement {\n  return (\n    <ScrollAreaPrimitive.Scrollbar\n      className={cn(\n        \"m-1 flex opacity-0 transition-opacity delay-300 data-hovering:opacity-100 data-hovering:delay-0 data-hovering:duration-100 data-scrolling:opacity-100 data-scrolling:delay-0 data-scrolling:duration-100 data-[orientation=horizontal]:h-1.5 data-[orientation=horizontal]:flex-col data-[orientation=vertical]:w-1.5\",\n        className,\n      )}\n      data-slot=\"scroll-area-scrollbar\"\n      orientation={orientation}\n      {...props}\n    >\n      <ScrollAreaPrimitive.Thumb\n        className=\"bg-foreground/20 relative flex-1 rounded-full\"\n        data-slot=\"scroll-area-thumb\"\n      />\n    </ScrollAreaPrimitive.Scrollbar>\n  );\n}\n\nexport { ScrollAreaPrimitive };\n",
      "type": "registry:ui",
      "target": "@ui/scroll-area.tsx"
    }
  ],
  "type": "registry:ui"
}