{
  "$schema": "https://ui.shadcn.com/schema/registry-item.json",
  "name": "data-table",
  "title": "Data Table",
  "description": "A virtualized data table with row and column virtualization.",
  "dependencies": [
    "@virtuoso.dev/data-table"
  ],
  "files": [
    {
      "path": "registry/new-york/data-table/data-table.tsx",
      "content": "'use client'\n\nimport * as React from 'react'\n\nimport {\n  VirtuosoDataTable,\n  Column,\n  ColumnHeader,\n  HeaderEdge,\n  HeaderEnd,\n  HeaderOverlay,\n  HeaderStart,\n  Cell,\n  GroupHeaderCell,\n  ColumnGroup,\n  ColumnGroupHeader,\n  setColumnSticky$,\n  loadingState$,\n  useVirtuosoLocation,\n  useCurrentlyRenderedData,\n  useVirtuosoLoadingState,\n} from '@virtuoso.dev/data-table'\nimport { reorderColumns$ } from '@virtuoso.dev/data-table/column-reorder'\nimport { AlertCircle, Loader2 } from 'lucide-react'\nimport '@virtuoso.dev/data-table/styles.css'\nimport { cn } from '@/lib/utils'\n\nimport type {\n  VirtuosoDataTableProps,\n  CellRenderParams,\n  CellRenderFunction,\n  ColumnHeaderChildren,\n  ColumnHeaderRenderParams,\n  ColumnHeaderRenderFunction,\n  ColumnHeaderCustomComponent,\n  HeaderSlotRenderParams,\n  HeaderSlotRenderFunction,\n  HeaderSlotCustomComponent,\n  ColumnState,\n  ColumnInfo,\n  RowLocation,\n  ListScrollLocation,\n  Row,\n  GroupHeaderCellProps,\n  GroupHeaderRenderParams,\n  GroupHeaderRenderFunction,\n  GroupHeaderCustomComponent,\n  ColumnGroupInfo,\n  ColumnGroupHeaderRenderParams,\n  ColumnGroupHeaderRenderFunction,\n  ColumnGroupHeaderCustomComponent,\n  SetColumnStickyPayload,\n  DataTableComponents,\n  RowComponentProps,\n  StickyHeaderComponentProps,\n  StickyColumnContainerComponentProps,\n  LoadingComponentProps,\n  DataTableLoadingState,\n} from '@virtuoso.dev/data-table'\nimport type { ReorderColumnsPayload } from '@virtuoso.dev/data-table/column-reorder'\n\nconst TableRow = React.forwardRef<HTMLDivElement, RowComponentProps & { context?: unknown }>(function TableRow(\n  { context: _context, ...props },\n  ref\n) {\n  return (\n    <div\n      ref={ref}\n      className={cn(\n        'border-b border-transparent bg-clip-padding transition-colors hover:bg-[var(--data-table-row-hover)]',\n        'after:content-[\"\"] after:absolute after:-bottom-px after:inset-x-0 after:h-px after:bg-[var(--data-table-border)] after:z-3'\n      )}\n      {...props}\n    />\n  )\n})\n\nconst TableStickyHeader = React.forwardRef<HTMLDivElement, StickyHeaderComponentProps & { context?: unknown }>(function TableStickyHeader(\n  { context: _context, style, ...props },\n  ref\n) {\n  const mergedStyle = React.useMemo(() => ({ position: 'sticky' as const, top: 0, zIndex: 1, ...style }), [style])\n  return <div ref={ref} className=\"border-b border-[var(--data-table-border)] bg-[var(--data-table-bg)]\" style={mergedStyle} {...props} />\n})\n\nconst TableStickyColumnContainer = React.forwardRef<HTMLDivElement, StickyColumnContainerComponentProps & { context?: unknown }>(\n  function TableStickyColumnContainer({ context: _context, ...props }, ref) {\n    return <div ref={ref} className=\"bg-[var(--data-table-bg)] transition-colors\" {...props} />\n  }\n)\n\nfunction TableLoadingOverlay({ loadingState }: LoadingComponentProps) {\n  const isError = loadingState.refresh.status === 'error'\n  const message = isError ? (loadingState.refresh.errorMessage ?? 'Update failed') : 'Refreshing rows...'\n\n  return (\n    <div aria-live=\"polite\" className=\"flex justify-center px-3 pt-3\" role=\"status\">\n      <div className=\"inline-flex items-center gap-2 rounded-full border border-[var(--data-table-border)] bg-[color-mix(in_oklch,var(--data-table-bg)_90%,transparent)] px-3 py-1.5 text-xs text-[var(--data-table-muted-fg)] shadow-sm backdrop-blur-xs\">\n        {isError ? <AlertCircle className=\"size-3.5\" /> : <Loader2 className=\"size-3.5 animate-spin\" />}\n        <span>{message}</span>\n      </div>\n    </div>\n  )\n}\n\nfunction TableLoadingPlaceholder({ loadingState }: LoadingComponentProps) {\n  const isError = loadingState.initial.status === 'error'\n  const message = isError ? (loadingState.initial.errorMessage ?? 'Failed to load rows') : 'Loading rows...'\n\n  return (\n    <div aria-live=\"polite\" className=\"px-3 py-4\" role=\"status\">\n      <div className=\"rounded-xl border border-[var(--data-table-border)] bg-[color-mix(in_oklch,var(--data-table-muted)_20%,transparent)] p-4 shadow-xs\">\n        <div className=\"mb-4 inline-flex items-center gap-2 rounded-full border border-[var(--data-table-border)] bg-[var(--data-table-bg)] px-3 py-1.5 text-xs text-[var(--data-table-muted-fg)]\">\n          {isError ? <AlertCircle className=\"size-3.5\" /> : <Loader2 className=\"size-3.5 animate-spin\" />}\n          <span>{message}</span>\n        </div>\n        {!isError ? (\n          <div className=\"space-y-3\">\n            {Array.from({ length: 6 }, (_, index) => (\n              <div key={index} className=\"grid grid-cols-[minmax(0,1.2fr)_minmax(0,0.8fr)_minmax(0,0.6fr)] gap-3\">\n                <div className=\"h-4 animate-pulse rounded bg-[var(--data-table-muted)]\" />\n                <div className=\"h-4 animate-pulse rounded bg-[color-mix(in_oklch,var(--data-table-muted)_80%,transparent)]\" />\n                <div className=\"h-4 animate-pulse rounded bg-[color-mix(in_oklch,var(--data-table-muted)_60%,transparent)]\" />\n              </div>\n            ))}\n          </div>\n        ) : null}\n      </div>\n    </div>\n  )\n}\n\nfunction TableLoadingFooter({ loadingState }: LoadingComponentProps) {\n  const isError = loadingState.end.status === 'error'\n  const message = isError ? (loadingState.end.errorMessage ?? 'Failed to load more rows') : 'Loading more rows...'\n\n  return (\n    <div\n      aria-live=\"polite\"\n      className=\"flex min-h-10 items-center justify-center border-t border-[var(--data-table-border)] bg-[color-mix(in_oklch,var(--data-table-bg)_95%,transparent)] px-3 py-2 text-xs text-[var(--data-table-muted-fg)]\"\n      role=\"status\"\n    >\n      <div className=\"inline-flex items-center gap-2 rounded-full border border-[var(--data-table-border)] bg-[color-mix(in_oklch,var(--data-table-muted)_60%,transparent)] px-3 py-1 shadow-xs\">\n        {isError ? <AlertCircle className=\"size-3.5\" /> : <Loader2 className=\"size-3.5 animate-spin\" />}\n        <span>{message}</span>\n      </div>\n    </div>\n  )\n}\n\nconst TABLE_COMPONENTS: DataTableComponents = {\n  Row: TableRow,\n  StickyHeader: TableStickyHeader,\n  StickyColumnContainer: TableStickyColumnContainer,\n  LoadingPlaceholder: TableLoadingPlaceholder,\n  LoadingOverlay: TableLoadingOverlay,\n  LoadingFooter: TableLoadingFooter,\n}\n\nfunction DataTable<Data, Context = unknown, Group = unknown>({\n  className,\n  components,\n  ...props\n}: VirtuosoDataTableProps<Data, Context, Group> & { className?: string }) {\n  const mergedComponents = React.useMemo(() => ({ ...TABLE_COMPONENTS, ...components }) as DataTableComponents<Context>, [components])\n\n  return (\n    <VirtuosoDataTable\n      className={cn(\n        'relative w-full overflow-hidden rounded-md border border-[var(--data-table-border)] bg-[var(--data-table-bg)] text-[var(--data-table-fg)] text-sm',\n        '[--data-table-bg:hsl(var(--background))]',\n        '[--data-table-border:hsl(var(--border))]',\n        '[--data-table-fg:hsl(var(--foreground))]',\n        '[--data-table-muted:hsl(var(--muted))]',\n        '[--data-table-muted-fg:hsl(var(--muted-foreground))]',\n        '[--data-table-row-hover:hsl(var(--muted)/0.5)]',\n        '[--data-table-sticky-hover:color-mix(in_oklch,var(--data-table-muted)_50%,var(--data-table-bg))]',\n        '**:data-[scope=colgroup]:border-b **:data-[scope=colgroup]:border-[var(--data-table-border)]',\n        '**:data-group-row:bg-[var(--data-table-muted)] **:data-group-row:font-medium',\n        '[&_[data-table-element-role=row]:hover_[data-sticky]]:bg-[var(--data-table-sticky-hover)]',\n        className\n      )}\n      components={mergedComponents}\n      {...props}\n    />\n  )\n}\n\nfunction DataTableColumn(props: Column.Props) {\n  return <Column {...props} />\n}\n\ninterface DataTableColumnHeaderProps {\n  children?: unknown\n  component?: ColumnHeaderCustomComponent\n  className?: string\n}\n\nfunction DataTableColumnHeader(props: DataTableColumnHeaderProps) {\n  const measureClassName = 'flex h-10 items-center px-2 align-middle text-sm font-medium text-[var(--data-table-fg)]'\n  const contentClassName = cn('flex min-w-0 items-center overflow-hidden truncate', props.className)\n\n  if (props.component) {\n    return <ColumnHeader className={cn(measureClassName, props.className)} component={props.component} />\n  }\n\n  const wrapRender =\n    (render: ColumnHeaderRenderFunction): ColumnHeaderRenderFunction =>\n    (params) => <div className={contentClassName}>{render(params)}</div>\n\n  if (\n    props.children === null ||\n    props.children === undefined ||\n    typeof props.children === 'string' ||\n    typeof props.children === 'number' ||\n    typeof props.children === 'function'\n  ) {\n    const userRender = props.children\n    return (\n      <ColumnHeader className={measureClassName}>\n        {wrapRender((params) => (typeof userRender === 'function' ? userRender(params) : userRender))}\n      </ColumnHeader>\n    )\n  }\n\n  const wrapChildren = (children: unknown): unknown => {\n    if (Array.isArray(children)) {\n      return children.map(wrapChildren)\n    }\n    if (React.isValidElement(children) && children.type === React.Fragment) {\n      return wrapChildren((children.props as { children?: unknown }).children)\n    }\n    if (typeof children === 'function') {\n      return wrapRender(children as ColumnHeaderRenderFunction)\n    }\n    return children\n  }\n\n  return <ColumnHeader className={measureClassName}>{wrapChildren(props.children) as ColumnHeaderChildren}</ColumnHeader>\n}\n\nfunction DataTableCell(props: CellDefinitionProps) {\n  const { children, className } = props\n  return (\n    <Cell className={cn('min-w-0 overflow-hidden truncate p-2 align-middle text-sm', className)}>\n      {(params) => (typeof children === 'function' ? children(params) : children)}\n    </Cell>\n  )\n}\n\ninterface CellDefinitionProps {\n  children: CellRenderFunction | React.ReactNode\n  className?: string\n}\n\nfunction DataTableGroupHeader(props: GroupHeaderCellProps) {\n  const className = cn(\n    'border-b border-[var(--data-table-border)] bg-[var(--data-table-muted)] px-2 py-2 text-sm font-medium text-[var(--data-table-fg)]',\n    props.className\n  )\n\n  if ('component' in props) {\n    return <GroupHeaderCell className={className} component={props.component} />\n  }\n\n  return <GroupHeaderCell className={className}>{props.children}</GroupHeaderCell>\n}\n\nexport {\n  DataTable,\n  DataTableColumn,\n  DataTableColumnHeader,\n  DataTableCell,\n  DataTableGroupHeader,\n  // Re-export types\n  type VirtuosoDataTableProps,\n  type CellRenderParams,\n  type CellRenderFunction,\n  type ColumnHeaderChildren,\n  type ColumnHeaderRenderParams,\n  type ColumnHeaderRenderFunction,\n  type ColumnHeaderCustomComponent,\n  type HeaderSlotRenderParams,\n  type HeaderSlotRenderFunction,\n  type HeaderSlotCustomComponent,\n  type ColumnState,\n  type ColumnInfo,\n  type RowLocation,\n  type ListScrollLocation,\n  type Row,\n  type GroupHeaderRenderParams,\n  type GroupHeaderRenderFunction,\n  type GroupHeaderCustomComponent,\n  type ColumnGroupInfo,\n  type ColumnGroupHeaderRenderParams,\n  type ColumnGroupHeaderRenderFunction,\n  type ColumnGroupHeaderCustomComponent,\n  type SetColumnStickyPayload,\n  type ReorderColumnsPayload,\n  type DataTableComponents,\n  type RowComponentProps,\n  type StickyHeaderComponentProps,\n  type StickyColumnContainerComponentProps,\n  type LoadingComponentProps,\n  type DataTableLoadingState,\n  // Re-export components and utilities\n  GroupHeaderCell,\n  ColumnGroup,\n  ColumnGroupHeader,\n  HeaderStart,\n  HeaderEnd,\n  HeaderEdge,\n  HeaderOverlay,\n  setColumnSticky$,\n  reorderColumns$,\n  loadingState$,\n  useVirtuosoLocation,\n  useCurrentlyRenderedData,\n  useVirtuosoLoadingState,\n}\n",
      "type": "registry:component",
      "target": "@ui/data-table/index.tsx"
    }
  ],
  "type": "registry:component"
}