{"version":3,"file":"table-BA2BijtZ.mjs","names":[],"sources":["../src/table/components/base-table.tsx","../src/table/hooks/use-data-table.ts","../src/table/utils.ts","../src/table/components/data-table-column-header.tsx","../src/table/components/data-table-pagination.tsx","../src/table/components/data-table-virtual-body.tsx","../src/table/components/row-drag-handle.tsx","../src/table/components/data-table.tsx","../src/table/components/data-table-view-options.tsx","../src/table/components/data-table-toolbar.tsx","../src/table/components/row-expand-toggle.tsx"],"sourcesContent":["\"use client\";\n\nimport * as React from \"react\";\n\nimport { cn } from \"../../../lib\";\n\nfunction Table({ className, ...props }: React.ComponentProps<\"table\">) {\n  return (\n    <div\n      data-slot=\"table-container\"\n      className=\"relative w-full overflow-x-auto\"\n    >\n      <table\n        data-slot=\"table\"\n        className={cn(\"w-full caption-bottom text-sm\", className)}\n        {...props}\n      />\n    </div>\n  );\n}\n\nfunction TableHeader({ className, ...props }: React.ComponentProps<\"thead\">) {\n  return (\n    <thead\n      data-slot=\"table-header\"\n      className={cn(\"[&_tr]:border-b\", className)}\n      {...props}\n    />\n  );\n}\n\nfunction TableBody({ className, ...props }: React.ComponentProps<\"tbody\">) {\n  return (\n    <tbody\n      data-slot=\"table-body\"\n      className={cn(\"[&_tr:last-child]:border-0\", className)}\n      {...props}\n    />\n  );\n}\n\nfunction TableFooter({ className, ...props }: React.ComponentProps<\"tfoot\">) {\n  return (\n    <tfoot\n      data-slot=\"table-footer\"\n      className={cn(\n        \"bg-muted/50 border-t font-medium [&>tr]:last:border-b-0\",\n        className,\n      )}\n      {...props}\n    />\n  );\n}\n\nfunction TableRow({ className, ...props }: React.ComponentProps<\"tr\">) {\n  return (\n    <tr\n      data-slot=\"table-row\"\n      className={cn(\n        \"hover:bg-muted/50 data-[state=selected]:bg-muted border-b transition-colors\",\n        className,\n      )}\n      {...props}\n    />\n  );\n}\n\nfunction TableHead({ className, ...props }: React.ComponentProps<\"th\">) {\n  return (\n    <th\n      data-slot=\"table-head\"\n      className={cn(\n        \"text-foreground h-10 whitespace-nowrap px-2 text-left align-middle font-medium [&:has([role=checkbox])]:pr-0\",\n        className,\n      )}\n      {...props}\n    />\n  );\n}\n\nfunction TableCell({ className, ...props }: React.ComponentProps<\"td\">) {\n  return (\n    <td\n      data-slot=\"table-cell\"\n      className={cn(\n        \"whitespace-nowrap p-2 align-middle [&:has([role=checkbox])]:pr-0\",\n        className,\n      )}\n      {...props}\n    />\n  );\n}\n\nfunction TableCaption({\n  className,\n  ...props\n}: React.ComponentProps<\"caption\">) {\n  return (\n    <caption\n      data-slot=\"table-caption\"\n      className={cn(\"text-muted-foreground mt-4 text-sm\", className)}\n      {...props}\n    />\n  );\n}\n\nexport {\n  Table,\n  TableBody,\n  TableCaption,\n  TableCell,\n  TableFooter,\n  TableHead,\n  TableHeader,\n  TableRow,\n};\n","\"use client\";\n\nimport {\n  type ColumnFiltersState,\n  type ColumnOrderState,\n  type ColumnPinningState,\n  type ExpandedState,\n  getCoreRowModel,\n  getExpandedRowModel,\n  getFilteredRowModel,\n  getPaginationRowModel,\n  getSortedRowModel,\n  type PaginationState,\n  type RowSelectionState,\n  type SortingState,\n  type TableOptions,\n  useReactTable,\n  type VisibilityState,\n} from \"@tanstack/react-table\";\nimport { useEffect, useState } from \"react\";\nimport type {\n  DataTableColumn,\n  DataTableFeatures,\n  DataTableState,\n  DataTableStateHandlers,\n  ScrollShadowState,\n} from \"../type\";\n\nconst DEFAULT_FEATURES: Required<DataTableFeatures> = {\n  sorting: true,\n  multiSort: false,\n  filtering: true,\n  globalFilter: false,\n  pagination: true,\n  rowSelection: false,\n  columnVisibility: true,\n  columnOrdering: false,\n  columnPinning: false,\n  columnResizing: false,\n  rowDnd: false,\n  expanding: false,\n};\n\ntype UseDataTableOptions<TData, TValue> = {\n  data: TData[];\n  columns: DataTableColumn<TData, TValue>[];\n  features?: DataTableFeatures;\n  state?: DataTableState;\n  initialState?: DataTableState;\n  onStateChange?: DataTableStateHandlers;\n  /**\n   * 透传至底层 useReactTable 的额外配置,会与内部配置浅合并\n   *\n   * 常用于服务端模式:`manualPagination` / `pageCount` / `rowCount` /\n   * `manualSorting` / `manualFiltering`,以及 `meta` 等\n   */\n  tableOptions?: Partial<TableOptions<TData>>;\n};\n\ntype Updater<T> = T | ((prev: T) => T);\n\nfunction applyUpdater<T>(updater: Updater<T>, prev: T): T {\n  return typeof updater === \"function\"\n    ? (updater as (p: T) => T)(prev)\n    : updater;\n}\n\n/**\n * 选取受控值,若未传则回退到非受控\n *\n * setter 同时支持值和函数式 updater,以避免一帧内多次更新拿到旧 snapshot\n */\nfunction useControlled<T>(\n  controlled: T | undefined,\n  initial: T,\n  onChange?: (value: T) => void,\n): [T, (updater: Updater<T>) => void] {\n  const isControlled = controlled !== undefined;\n  const [internal, setInternal] = useState<T>(initial);\n  const value = isControlled ? (controlled as T) : internal;\n\n  const setValue = (updater: Updater<T>) => {\n    if (isControlled) {\n      const next = applyUpdater(updater, controlled as T);\n      onChange?.(next);\n      return;\n    }\n    setInternal((prev) => {\n      const next = applyUpdater(updater, prev);\n      onChange?.(next);\n      return next;\n    });\n  };\n\n  return [value, setValue];\n}\n\n/**\n * 构造 TanStack 表格实例,并按需开启各项功能\n */\nexport function useDataTable<TData, TValue = unknown>({\n  data,\n  columns,\n  features,\n  state,\n  initialState,\n  onStateChange,\n  tableOptions,\n}: UseDataTableOptions<TData, TValue>) {\n  const mergedFeatures = { ...DEFAULT_FEATURES, ...features };\n\n  const [sorting, setSorting] = useControlled<SortingState>(\n    state?.sorting,\n    initialState?.sorting ?? [],\n    onStateChange?.onSortingChange,\n  );\n  const [columnFilters, setColumnFilters] = useControlled<ColumnFiltersState>(\n    state?.columnFilters,\n    initialState?.columnFilters ?? [],\n    onStateChange?.onColumnFiltersChange,\n  );\n  const [columnVisibility, setColumnVisibility] =\n    useControlled<VisibilityState>(\n      state?.columnVisibility,\n      initialState?.columnVisibility ?? {},\n      onStateChange?.onColumnVisibilityChange,\n    );\n  const [columnOrder, setColumnOrder] = useControlled<ColumnOrderState>(\n    state?.columnOrder,\n    initialState?.columnOrder ?? [],\n    onStateChange?.onColumnOrderChange,\n  );\n  const [columnPinning, setColumnPinning] = useControlled<ColumnPinningState>(\n    state?.columnPinning,\n    initialState?.columnPinning ?? {},\n    onStateChange?.onColumnPinningChange,\n  );\n  const [rowSelection, setRowSelection] = useControlled<RowSelectionState>(\n    state?.rowSelection,\n    initialState?.rowSelection ?? {},\n    onStateChange?.onRowSelectionChange,\n  );\n  const [pagination, setPagination] = useControlled<PaginationState>(\n    state?.pagination,\n    initialState?.pagination ?? { pageIndex: 0, pageSize: 10 },\n    onStateChange?.onPaginationChange,\n  );\n  const [globalFilter, setGlobalFilter] = useControlled<string>(\n    state?.globalFilter,\n    initialState?.globalFilter ?? \"\",\n    onStateChange?.onGlobalFilterChange,\n  );\n  const [expanded, setExpanded] = useControlled<ExpandedState>(\n    state?.expanded,\n    initialState?.expanded ?? {},\n    onStateChange?.onExpandedChange,\n  );\n\n  const table = useReactTable<TData>({\n    data,\n    columns,\n    state: {\n      sorting,\n      columnFilters,\n      columnVisibility,\n      columnOrder,\n      columnPinning,\n      rowSelection,\n      pagination,\n      globalFilter,\n      expanded,\n    },\n    enableSorting: mergedFeatures.sorting,\n    enableMultiSort: mergedFeatures.multiSort,\n    enableFilters: mergedFeatures.filtering,\n    enableGlobalFilter: mergedFeatures.globalFilter,\n    enableRowSelection: mergedFeatures.rowSelection,\n    enableHiding: mergedFeatures.columnVisibility,\n    enableColumnPinning: mergedFeatures.columnPinning,\n    enableColumnResizing: mergedFeatures.columnResizing,\n    columnResizeMode: \"onChange\",\n    onSortingChange: setSorting,\n    onColumnFiltersChange: setColumnFilters,\n    onColumnVisibilityChange: setColumnVisibility,\n    onColumnOrderChange: setColumnOrder,\n    onColumnPinningChange: setColumnPinning,\n    onRowSelectionChange: setRowSelection,\n    onPaginationChange: setPagination,\n    onGlobalFilterChange: setGlobalFilter,\n    onExpandedChange: setExpanded,\n    getCoreRowModel: getCoreRowModel(),\n    getSortedRowModel: mergedFeatures.sorting ? getSortedRowModel() : undefined,\n    getFilteredRowModel:\n      mergedFeatures.filtering || mergedFeatures.globalFilter\n        ? getFilteredRowModel()\n        : undefined,\n    getPaginationRowModel:\n      mergedFeatures.pagination && !tableOptions?.manualPagination\n        ? getPaginationRowModel()\n        : undefined,\n    getExpandedRowModel: mergedFeatures.expanding\n      ? getExpandedRowModel()\n      : undefined,\n    ...tableOptions,\n  });\n\n  return { table, features: mergedFeatures };\n}\n\n/**\n * 监听容器横向滚动,返回左右阴影显示状态\n *\n * 用于固定列阴影提示\n */\nexport function useScrollShadow(\n  wrapperRef: React.RefObject<HTMLElement | null>,\n  containerSelector = '[data-slot=\"table-container\"]',\n) {\n  const [scrollShadow, setScrollShadow] = useState<ScrollShadowState>({\n    left: false,\n    right: false,\n  });\n\n  useEffect(() => {\n    const scrollContainer =\n      wrapperRef.current?.querySelector<HTMLElement>(containerSelector);\n    if (!scrollContainer) return;\n\n    const update = () => {\n      const scrollLeft = scrollContainer.scrollLeft;\n      const maxScrollLeft = Math.max(\n        0,\n        scrollContainer.scrollWidth - scrollContainer.clientWidth,\n      );\n      const next: ScrollShadowState = {\n        left: scrollLeft > 1,\n        right: maxScrollLeft - scrollLeft > 1,\n      };\n      setScrollShadow((current) =>\n        current.left === next.left && current.right === next.right\n          ? current\n          : next,\n      );\n    };\n\n    update();\n    scrollContainer.addEventListener(\"scroll\", update, { passive: true });\n\n    const resizeObserver = new ResizeObserver(update);\n    resizeObserver.observe(scrollContainer);\n    const tableElement = scrollContainer.querySelector(\"table\");\n    if (tableElement) resizeObserver.observe(tableElement);\n\n    return () => {\n      scrollContainer.removeEventListener(\"scroll\", update);\n      resizeObserver.disconnect();\n    };\n  }, [wrapperRef, containerSelector]);\n\n  return scrollShadow;\n}\n","import type { Row } from \"@tanstack/react-table\";\nimport type { CSSProperties } from \"react\";\nimport { cn } from \"../../lib\";\nimport type { AnyColumn, CellMergeMeta, ScrollShadowState } from \"./type\";\n\n/**\n * 展开面板 row 的 DOM id 协议\n *\n * `DataTable` 渲染面板 row 时把这个 id 设到 `<tr id>` 上,\n * `RowExpandToggle` 把它写进按钮的 `aria-controls`,二者必须保持一致\n */\nexport const panelIdFor = (rowId: string) => `data-table-row-${rowId}-panel`;\n\n/**\n * 计算固定列(sticky)需要的样式\n */\nexport function getCommonPinningStyles<TData>(\n  column: AnyColumn<TData>,\n): CSSProperties {\n  const isPinned = column.getIsPinned();\n\n  return {\n    left: isPinned === \"left\" ? `${column.getStart(\"left\")}px` : undefined,\n    opacity: isPinned ? 0.98 : 1,\n    position: isPinned ? \"sticky\" : \"relative\",\n    right: isPinned === \"right\" ? `${column.getAfter(\"right\")}px` : undefined,\n    width: `${column.getSize()}px`,\n    zIndex: isPinned ? 1 : 0,\n  };\n}\n\n/**\n * 计算固定列阴影 className\n */\nexport function getColumnPinningClassName<TData>(\n  column: AnyColumn<TData>,\n  scrollShadow: ScrollShadowState,\n): string {\n  const isPinned = column.getIsPinned();\n  const isLastLeftPinnedColumn =\n    isPinned === \"left\" && column.getIsLastColumn(\"left\");\n  const isFirstRightPinnedColumn =\n    isPinned === \"right\" && column.getIsFirstColumn(\"right\");\n\n  let styles = \"bg-background after:transition-all\";\n\n  if (isLastLeftPinnedColumn) {\n    styles = cn(\n      styles,\n      \"after:absolute after:bottom-0 after:top-0 after:right-0 after:w-[30px] after:translate-x-full after:content-[''] after:shadow-[inset_15px_0_8px_-8px_#0000000d] dark:after:shadow-[inset_15px_0_8px_-8px_#ffffff0d]\",\n    );\n  }\n  if (isLastLeftPinnedColumn && !scrollShadow.left) {\n    styles = cn(styles, \"after:shadow-[inset_15px_0_8px_-8px_#00000000]\");\n  }\n  if (isFirstRightPinnedColumn) {\n    styles = cn(\n      styles,\n      \"after:absolute after:bottom-0 after:top-0 after:left-0 after:w-[30px] after:-translate-x-full after:content-[''] after:shadow-[inset_-15px_0_8px_-8px_#0000000d] dark:after:shadow-[inset_-15px_0_8px_-8px_#ffffff0d]\",\n    );\n  }\n  if (isFirstRightPinnedColumn && !scrollShadow.right) {\n    styles = cn(styles, \"after:shadow-[inset_-15px_0_8px_-8px_#00000000]\");\n  }\n\n  return styles;\n}\n\n/** 单元格合并跨度 */\nexport type CellSpan = { rowSpan: number; colSpan: number };\n\n/** 内部存储:每行每列对应的跨度 */\nexport type CellSpanMap = Map<number, Map<string, CellSpan>>;\n\nfunction ensureRow(map: CellSpanMap, rowIndex: number): Map<string, CellSpan> {\n  let entry = map.get(rowIndex);\n  if (!entry) {\n    entry = new Map();\n    map.set(rowIndex, entry);\n  }\n  return entry;\n}\n\nfunction setSpan(\n  map: CellSpanMap,\n  rowIndex: number,\n  columnId: string,\n  next: Partial<CellSpan>,\n) {\n  const row = ensureRow(map, rowIndex);\n  const previous = row.get(columnId) ?? { rowSpan: 1, colSpan: 1 };\n  row.set(columnId, { ...previous, ...next });\n}\n\n/**\n * 根据每列 `meta.rowSpan` / `meta.colSpan` 计算每行每列的合并跨度\n *\n * `0` 表示该单元格不应渲染(被合并掉了)\n */\nexport function computeCellSpans<TData>(\n  rows: Row<TData>[],\n  columns: AnyColumn<TData>[],\n): CellSpanMap {\n  const map: CellSpanMap = new Map();\n  if (rows.length === 0) return map;\n\n  // 第一遍:列级行合并(auto 或函数)\n  columns.forEach((column) => {\n    const meta = column.columnDef.meta as CellMergeMeta<TData> | undefined;\n    const rowSpanCfg = meta?.rowSpan;\n    if (!rowSpanCfg) return;\n\n    if (rowSpanCfg === true || rowSpanCfg === \"auto\") {\n      const parentKey = meta?.rowSpanParent;\n      let index = 0;\n      while (index < rows.length) {\n        const value = rows[index].getValue(column.id);\n        const parentValue = parentKey\n          ? rows[index].getValue(parentKey)\n          : undefined;\n        let span = 1;\n        while (index + span < rows.length) {\n          const nextValue = rows[index + span].getValue(column.id);\n          const nextParent = parentKey\n            ? rows[index + span].getValue(parentKey)\n            : undefined;\n          if (\n            Object.is(nextValue, value) &&\n            (!parentKey || Object.is(nextParent, parentValue))\n          ) {\n            span += 1;\n          } else break;\n        }\n        if (span > 1) {\n          setSpan(map, index, column.id, { rowSpan: span });\n          for (let offset = 1; offset < span; offset += 1) {\n            setSpan(map, index + offset, column.id, {\n              rowSpan: 0,\n              colSpan: 0,\n            });\n          }\n        }\n        index += span;\n      }\n    } else if (typeof rowSpanCfg === \"function\") {\n      rows.forEach((row, rowIndex) => {\n        const span = rowSpanCfg({\n          row,\n          rows,\n          rowIndex,\n          value: row.getValue(column.id),\n        });\n        const existing = map.get(rowIndex)?.get(column.id);\n        if (existing && existing.rowSpan === 0) return;\n        if (span === 0) {\n          setSpan(map, rowIndex, column.id, { rowSpan: 0, colSpan: 0 });\n        } else if (span > 1) {\n          setSpan(map, rowIndex, column.id, { rowSpan: span });\n          for (let offset = 1; offset < span; offset += 1) {\n            setSpan(map, rowIndex + offset, column.id, {\n              rowSpan: 0,\n              colSpan: 0,\n            });\n          }\n        }\n      });\n    }\n  });\n\n  // 第二遍:单元格级列合并(按行扫描,跨度内的后续单元格自动跳过)\n  rows.forEach((row, rowIndex) => {\n    const cells = row.getVisibleCells();\n    let skipUntil = -1;\n    cells.forEach((cell, cellIndex) => {\n      const columnId = cell.column.id;\n      const rowMap = ensureRow(map, rowIndex);\n      const existing = rowMap.get(columnId);\n\n      // 已被上方行合并掉\n      if (existing && existing.rowSpan === 0) return;\n      // 在同一行被左侧 colSpan 跨过\n      if (cellIndex <= skipUntil) {\n        rowMap.set(columnId, {\n          rowSpan: existing?.rowSpan ?? 1,\n          colSpan: 0,\n        });\n        return;\n      }\n\n      const meta = cell.column.columnDef.meta as\n        | CellMergeMeta<TData>\n        | undefined;\n      const colSpanCfg = meta?.colSpan;\n      if (typeof colSpanCfg === \"function\") {\n        const colSpan = colSpanCfg({\n          row,\n          rows,\n          rowIndex,\n          column: cell.column,\n        });\n        if (colSpan === 0) {\n          rowMap.set(columnId, {\n            rowSpan: existing?.rowSpan ?? 1,\n            colSpan: 0,\n          });\n        } else if (colSpan > 1) {\n          rowMap.set(columnId, {\n            rowSpan: existing?.rowSpan ?? 1,\n            colSpan,\n          });\n          skipUntil = cellIndex + colSpan - 1;\n        }\n      }\n    });\n  });\n\n  return map;\n}\n","\"use client\";\n\nimport { flexRender, type Header } from \"@tanstack/react-table\";\nimport { ChevronDownIcon, ChevronUpIcon } from \"lucide-react\";\nimport { cn } from \"../../../lib\";\nimport type { ScrollShadowState } from \"../type\";\nimport { getColumnPinningClassName, getCommonPinningStyles } from \"../utils\";\nimport { TableHead } from \"./base-table\";\n\ntype DataTableColumnHeaderProps<TData> = {\n  header: Header<TData, unknown>;\n  resizable?: boolean;\n  scrollShadow: ScrollShadowState;\n};\n\n/**\n * 表头单元格,封装排序、列宽拖拽、固定列阴影\n */\nexport function DataTableColumnHeader<TData>({\n  header,\n  resizable,\n  scrollShadow,\n}: DataTableColumnHeaderProps<TData>) {\n  const canSort = header.column.getCanSort();\n  const isSorted = header.column.getIsSorted();\n  const canResize = resizable && header.column.getCanResize();\n\n  return (\n    <TableHead\n      data-slot=\"data-table-column-header\"\n      colSpan={header.colSpan}\n      style={getCommonPinningStyles(header.column)}\n      className={getColumnPinningClassName(header.column, scrollShadow)}\n    >\n      {header.isPlaceholder ? null : (\n        <div className=\"flex items-center gap-1\">\n          <div\n            className={cn(\n              \"flex flex-1 items-center gap-1\",\n              canSort && \"cursor-pointer select-none\",\n            )}\n            onClick={\n              canSort ? header.column.getToggleSortingHandler() : undefined\n            }\n          >\n            {flexRender(header.column.columnDef.header, header.getContext())}\n            {canSort && (\n              <span className=\"flex flex-col items-center\">\n                <ChevronUpIcon\n                  className={cn(\n                    \"text-muted-foreground -mb-1 size-[1em] transition\",\n                    isSorted === \"asc\" && \"text-foreground\",\n                  )}\n                />\n                <ChevronDownIcon\n                  className={cn(\n                    \"text-muted-foreground -mt-1 size-[1em] transition\",\n                    isSorted === \"desc\" && \"text-foreground\",\n                  )}\n                />\n              </span>\n            )}\n          </div>\n          {canResize && (\n            <span\n              onDoubleClick={header.column.resetSize}\n              onMouseDown={header.getResizeHandler()}\n              onTouchStart={header.getResizeHandler()}\n              className={cn(\n                \"ml-auto h-[stretch] w-px cursor-col-resize touch-none select-none\",\n                \"hover:bg-primary/40 data-[resizing=true]:bg-primary\",\n              )}\n              data-resizing={header.column.getIsResizing() || undefined}\n            />\n          )}\n        </div>\n      )}\n    </TableHead>\n  );\n}\n","\"use client\";\n\nimport type { Table as TanstackTable } from \"@tanstack/react-table\";\nimport {\n  ChevronLeftIcon,\n  ChevronRightIcon,\n  ChevronsLeftIcon,\n  ChevronsRightIcon,\n} from \"lucide-react\";\nimport { Button } from \"../../button\";\nimport { NativeSelect, NativeSelectOption } from \"../../native-select\";\n\nconst DEFAULT_PAGE_SIZE_OPTIONS = [10, 20, 30, 50, 100];\n\ntype DataTablePaginationProps<TData> = {\n  table: TanstackTable<TData>;\n  pageSizeOptions?: number[];\n  /** 是否显示已选择行数,默认 true */\n  showSelectionCount?: boolean;\n};\n\n/**\n * 表格分页栏:总行数 / 每页数量 / 页码跳转\n */\nexport function DataTablePagination<TData>({\n  table,\n  pageSizeOptions = DEFAULT_PAGE_SIZE_OPTIONS,\n  showSelectionCount = true,\n}: DataTablePaginationProps<TData>) {\n  const pagination = table.getState().pagination;\n  const selectedCount = Object.keys(table.getState().rowSelection).length;\n  const totalRows = table.getRowCount();\n  const pageCount = table.getPageCount();\n\n  return (\n    <div className=\"text-muted-foreground flex flex-wrap items-center justify-between gap-2 py-2 text-sm\">\n      <div className=\"flex-1\">\n        {showSelectionCount && selectedCount > 0\n          ? `已选择 ${selectedCount} / ${totalRows} 条`\n          : `共 ${totalRows} 条`}\n      </div>\n      <div className=\"flex items-center gap-2\">\n        <span>每页</span>\n        <NativeSelect\n          size=\"sm\"\n          value={pagination.pageSize}\n          onChange={(event) => table.setPageSize(Number(event.target.value))}\n        >\n          {pageSizeOptions.map((size) => (\n            <NativeSelectOption key={size} value={size}>\n              {size}\n            </NativeSelectOption>\n          ))}\n        </NativeSelect>\n      </div>\n      <div className=\"flex items-center gap-1\">\n        <span className=\"px-2\">\n          第 {pagination.pageIndex + 1} / {Math.max(pageCount, 1)} 页\n        </span>\n        <Button\n          variant=\"outline\"\n          size=\"icon-sm\"\n          aria-label=\"第一页\"\n          onClick={() => table.setPageIndex(0)}\n          disabled={!table.getCanPreviousPage()}\n        >\n          <ChevronsLeftIcon />\n        </Button>\n        <Button\n          variant=\"outline\"\n          size=\"icon-sm\"\n          aria-label=\"上一页\"\n          onClick={() => table.previousPage()}\n          disabled={!table.getCanPreviousPage()}\n        >\n          <ChevronLeftIcon />\n        </Button>\n        <Button\n          variant=\"outline\"\n          size=\"icon-sm\"\n          aria-label=\"下一页\"\n          onClick={() => table.nextPage()}\n          disabled={!table.getCanNextPage()}\n        >\n          <ChevronRightIcon />\n        </Button>\n        <Button\n          variant=\"outline\"\n          size=\"icon-sm\"\n          aria-label=\"最后一页\"\n          onClick={() => table.setPageIndex(pageCount - 1)}\n          disabled={!table.getCanNextPage()}\n        >\n          <ChevronsRightIcon />\n        </Button>\n      </div>\n    </div>\n  );\n}\n","\"use client\";\n\nimport { flexRender, type Table as TanstackTable } from \"@tanstack/react-table\";\nimport { useVirtualizer } from \"@tanstack/react-virtual\";\nimport { ChevronDownIcon, ChevronUpIcon } from \"lucide-react\";\nimport { type ReactNode, useRef } from \"react\";\nimport { cn } from \"../../../lib\";\nimport { Skeleton } from \"../../skeleton\";\nimport type { DataTableVirtualOptions } from \"../type\";\n\nconst DEFAULT_ROW_HEIGHT = 36;\nconst DEFAULT_MAX_HEIGHT = 480;\nconst DEFAULT_OVERSCAN = 10;\n\ntype DataTableVirtualBodyProps<TData> = {\n  table: TanstackTable<TData>;\n  loading?: boolean;\n  empty?: ReactNode;\n  options?: DataTableVirtualOptions;\n  /** 是否显示纵向边框 */\n  bordered?: boolean;\n  className?: string;\n};\n\n/**\n * 行虚拟滚动表格:使用 grid 布局 + `useVirtualizer` 仅渲染可视区域\n *\n * 因表格采用 grid 布局,固定列 / 多级表头暂不支持\n */\nexport function DataTableVirtualBody<TData>({\n  table,\n  loading,\n  empty = \"暂无数据\",\n  options,\n  bordered = false,\n  className,\n}: DataTableVirtualBodyProps<TData>) {\n  const estimateRowHeight = options?.estimateRowHeight ?? DEFAULT_ROW_HEIGHT;\n  const maxHeight = options?.maxHeight ?? DEFAULT_MAX_HEIGHT;\n  const overscan = options?.overscan ?? DEFAULT_OVERSCAN;\n\n  const containerRef = useRef<HTMLDivElement>(null);\n  const rows = table.getRowModel().rows;\n  const totalWidth = table.getTotalSize();\n\n  const virtualizer = useVirtualizer({\n    count: rows.length,\n    getScrollElement: () => containerRef.current,\n    estimateSize: () => estimateRowHeight,\n    overscan,\n  });\n\n  const virtualItems = virtualizer.getVirtualItems();\n  const showEmpty = !loading && rows.length === 0;\n  const skeletonRowCount = Math.max(\n    1,\n    Math.floor(\n      (typeof maxHeight === \"number\" ? maxHeight : 480) / estimateRowHeight,\n    ),\n  );\n\n  return (\n    <div\n      ref={containerRef}\n      data-slot=\"table-container\"\n      className={cn(\n        \"bg-background relative overflow-auto rounded-md\",\n        bordered && \"border\",\n        className,\n      )}\n      style={{\n        height: typeof maxHeight === \"number\" ? `${maxHeight}px` : maxHeight,\n      }}\n    >\n      <table\n        data-slot=\"table\"\n        className=\"grid text-sm\"\n        style={{ width: `${totalWidth}px`, minWidth: \"100%\" }}\n      >\n        <thead\n          data-slot=\"table-header\"\n          className=\"bg-background sticky top-0 z-10 grid border-b\"\n        >\n          {table.getHeaderGroups().map((headerGroup) => (\n            <tr key={headerGroup.id} className=\"flex w-full\">\n              {headerGroup.headers.map((header, headerIndex) => {\n                const canSort = header.column.getCanSort();\n                const isSorted = header.column.getIsSorted();\n                const isLast = headerIndex === headerGroup.headers.length - 1;\n                return (\n                  <th\n                    key={header.id}\n                    data-slot=\"table-head\"\n                    className={cn(\n                      \"text-foreground flex h-10 shrink-0 items-center gap-1 px-2 text-left font-medium\",\n                      canSort && \"cursor-pointer select-none\",\n                      bordered && !isLast && \"border-r\",\n                    )}\n                    style={{ width: `${header.getSize()}px` }}\n                    onClick={\n                      canSort\n                        ? header.column.getToggleSortingHandler()\n                        : undefined\n                    }\n                  >\n                    {header.isPlaceholder\n                      ? null\n                      : flexRender(\n                          header.column.columnDef.header,\n                          header.getContext(),\n                        )}\n                    {canSort && (\n                      <span className=\"ml-1 flex flex-col items-center\">\n                        <ChevronUpIcon\n                          className={cn(\n                            \"text-muted-foreground -mb-1 size-3 transition\",\n                            isSorted === \"asc\" && \"text-foreground\",\n                          )}\n                        />\n                        <ChevronDownIcon\n                          className={cn(\n                            \"text-muted-foreground -mt-1 size-3 transition\",\n                            isSorted === \"desc\" && \"text-foreground\",\n                          )}\n                        />\n                      </span>\n                    )}\n                  </th>\n                );\n              })}\n            </tr>\n          ))}\n        </thead>\n        <tbody\n          data-slot=\"table-body\"\n          className=\"relative grid\"\n          style={{\n            height: loading\n              ? `${skeletonRowCount * estimateRowHeight}px`\n              : `${virtualizer.getTotalSize()}px`,\n          }}\n        >\n          {loading ? (\n            Array.from({ length: skeletonRowCount }).map((_, rowIndex) => {\n              const leafColumns = table.getVisibleLeafColumns();\n              return (\n                <tr\n                  key={`loading-${rowIndex}`}\n                  className=\"flex w-full border-b\"\n                  style={{ height: `${estimateRowHeight}px` }}\n                >\n                  {leafColumns.map((column, columnIndex) => {\n                    const isLast = columnIndex === leafColumns.length - 1;\n                    return (\n                      <td\n                        key={column.id}\n                        className={cn(\n                          \"flex items-center px-2\",\n                          bordered && !isLast && \"border-r\",\n                        )}\n                        style={{ width: `${column.getSize()}px` }}\n                      >\n                        <Skeleton className=\"h-4 w-full\" />\n                      </td>\n                    );\n                  })}\n                </tr>\n              );\n            })\n          ) : showEmpty ? (\n            <tr className=\"flex w-full\">\n              <td\n                colSpan={table.getVisibleLeafColumns().length}\n                className=\"text-muted-foreground flex h-24 w-full items-center justify-center\"\n              >\n                {empty}\n              </td>\n            </tr>\n          ) : (\n            virtualItems.map((virtualRow) => {\n              const row = rows[virtualRow.index];\n              const cells = row.getVisibleCells();\n              return (\n                <tr\n                  key={row.id}\n                  data-index={virtualRow.index}\n                  data-state={row.getIsSelected() ? \"selected\" : undefined}\n                  ref={(node) => virtualizer.measureElement(node)}\n                  className=\"hover:bg-muted/50 data-[state=selected]:bg-muted absolute flex w-full border-b\"\n                  style={{\n                    transform: `translateY(${virtualRow.start}px)`,\n                  }}\n                >\n                  {cells.map((cell, cellIndex) => {\n                    const isLast = cellIndex === cells.length - 1;\n                    return (\n                      <td\n                        key={cell.id}\n                        data-slot=\"table-cell\"\n                        className={cn(\n                          \"text-foreground flex items-center px-2\",\n                          bordered && !isLast && \"border-r\",\n                        )}\n                        style={{\n                          width: `${cell.column.getSize()}px`,\n                          height: `${estimateRowHeight}px`,\n                        }}\n                      >\n                        {flexRender(\n                          cell.column.columnDef.cell,\n                          cell.getContext(),\n                        )}\n                      </td>\n                    );\n                  })}\n                </tr>\n              );\n            })\n          )}\n        </tbody>\n      </table>\n    </div>\n  );\n}\n","\"use client\";\n\nimport type {\n  DraggableAttributes,\n  DraggableSyntheticListeners,\n} from \"@dnd-kit/core\";\nimport { GripVerticalIcon } from \"lucide-react\";\nimport {\n  createContext,\n  useContext,\n  type ComponentProps,\n  type Ref,\n} from \"react\";\nimport { cn } from \"../../../lib\";\n\n/**\n * SortableRow 通过此 context 向其内部 cell 暴露 dnd-kit 的激活器/监听器\n *\n * 用 context 而非 prop 钻透,因为 cell 是用户自定义渲染函数,触不到 SortableRow 的局部变量\n */\nexport type RowDragHandleContextValue = {\n  attributes: DraggableAttributes;\n  listeners: DraggableSyntheticListeners | undefined;\n  setActivatorNodeRef: Ref<HTMLElement>;\n  isDragging: boolean;\n} | null;\n\nexport const RowDragHandleContext =\n  createContext<RowDragHandleContextValue>(null);\n\n/** 在 cell 内任意位置放此组件即可成为行拖拽手柄 */\nexport function RowDragHandle({\n  className,\n  ...props\n}: Omit<\n  ComponentProps<\"button\">,\n  \"ref\" | \"onMouseDown\" | \"onKeyDown\" | \"onTouchStart\"\n>) {\n  const handle = useContext(RowDragHandleContext);\n  if (!handle) return null;\n  return (\n    <button\n      type=\"button\"\n      ref={handle.setActivatorNodeRef as Ref<HTMLButtonElement>}\n      aria-label=\"拖动排序\"\n      className={cn(\n        \"text-muted-foreground hover:text-foreground inline-flex size-6 cursor-grab items-center justify-center rounded-md focus-visible:outline-none active:cursor-grabbing\",\n        className,\n      )}\n      // eslint-disable-next-line react-hooks/refs\n      {...handle.attributes}\n      // eslint-disable-next-line react-hooks/refs\n      {...handle.listeners}\n      {...props}\n    >\n      <GripVerticalIcon className=\"size-4\" />\n    </button>\n  );\n}\n","\"use client\";\n\nimport {\n  closestCenter,\n  DndContext,\n  type DragEndEvent,\n  KeyboardSensor,\n  PointerSensor,\n  useSensor,\n  useSensors,\n} from \"@dnd-kit/core\";\nimport { restrictToVerticalAxis } from \"@dnd-kit/modifiers\";\nimport {\n  arrayMove,\n  SortableContext,\n  sortableKeyboardCoordinates,\n  useSortable,\n  verticalListSortingStrategy,\n} from \"@dnd-kit/sortable\";\nimport { CSS } from \"@dnd-kit/utilities\";\nimport {\n  type ColumnDef,\n  flexRender,\n  type Row,\n  type Table as TanstackTable,\n} from \"@tanstack/react-table\";\nimport {\n  type CSSProperties,\n  forwardRef,\n  Fragment,\n  type ReactElement,\n  type ReactNode,\n  type Ref,\n  type RefAttributes,\n  useEffect,\n  useImperativeHandle,\n  useMemo,\n  useRef,\n} from \"react\";\nimport { cn } from \"../../../lib\";\nimport { Skeleton } from \"../../skeleton\";\nimport { useDataTable, useScrollShadow } from \"../hooks/use-data-table\";\nimport type { DataTablePropsType, DataTableVirtualOptions } from \"../type\";\nimport {\n  computeCellSpans,\n  getColumnPinningClassName,\n  getCommonPinningStyles,\n  panelIdFor,\n} from \"../utils\";\nimport {\n  Table,\n  TableBody,\n  TableCell,\n  TableHeader,\n  TableRow,\n} from \"./base-table\";\nimport { DataTableColumnHeader } from \"./data-table-column-header\";\nimport { DataTablePagination } from \"./data-table-pagination\";\nimport { DataTableVirtualBody } from \"./data-table-virtual-body\";\nimport { RowDragHandle, RowDragHandleContext } from \"./row-drag-handle\";\n\nconst ROW_DND_HANDLE_COLUMN_ID = \"__row_dnd_handle__\";\nconst DEFAULT_SKELETON_ROWS = 8;\n\n/** ReactNode 但语义上等同于\"不渲染\"的值(null / undefined / boolean) */\nfunction isRenderablePanel(value: unknown): value is ReactNode {\n  return value !== null && value !== undefined && typeof value !== \"boolean\";\n}\n\n/**\n * 渲染一行 cells —— 处理列合并 / 跨列 / 固定列样式\n *\n * 抽成共享函数,sortable 与非 sortable 两条路径都用同一份单元格生成逻辑\n */\nfunction renderRowCells<TData>(\n  row: Row<TData>,\n  rowIndex: number,\n  cellSpans: ReturnType<typeof computeCellSpans>,\n  scrollShadow: ReturnType<typeof useScrollShadow>,\n) {\n  return row.getVisibleCells().map((cell) => {\n    const span = cellSpans.get(rowIndex)?.get(cell.column.id);\n    const rowSpan = span?.rowSpan ?? 1;\n    const colSpan = span?.colSpan ?? 1;\n    if (rowSpan === 0 || colSpan === 0) return null;\n    return (\n      <TableCell\n        key={cell.id}\n        rowSpan={rowSpan > 1 ? rowSpan : undefined}\n        colSpan={colSpan > 1 ? colSpan : undefined}\n        style={getCommonPinningStyles(cell.column)}\n        className={getColumnPinningClassName(cell.column, scrollShadow)}\n      >\n        {flexRender(cell.column.columnDef.cell, cell.getContext())}\n      </TableCell>\n    );\n  });\n}\n\n/** 渲染展开面板 row —— 跨满全列的单格 TableRow */\nfunction renderExpandedPanel({\n  rowId,\n  panel,\n  visibleColumnCount,\n  isSelected,\n  style,\n  isDragging,\n}: {\n  rowId: string;\n  panel: ReactNode;\n  visibleColumnCount: number;\n  isSelected: boolean;\n  style?: CSSProperties;\n  isDragging?: boolean;\n}) {\n  return (\n    <TableRow\n      id={panelIdFor(rowId)}\n      data-slot=\"data-table-expanded-row\"\n      data-state={isSelected ? \"selected\" : undefined}\n      style={style}\n      className={cn(\"bg-muted/30 hover:bg-muted/30\", isDragging && \"shadow-md\")}\n    >\n      <TableCell colSpan={visibleColumnCount} className=\"p-4\">\n        {panel}\n      </TableCell>\n    </TableRow>\n  );\n}\n\nfunction buildRowDndColumn<TData>(): ColumnDef<TData> {\n  return {\n    id: ROW_DND_HANDLE_COLUMN_ID,\n    size: 36,\n    enableSorting: false,\n    enableHiding: false,\n    enableResizing: false,\n    enableColumnFilter: false,\n    enablePinning: false,\n    header: \"\",\n    cell: () => <RowDragHandle />,\n  };\n}\n\n/** 单行 sortable 包装,把 dnd-kit 属性透传到 TableRow + Context */\nfunction SortableTableRow<TData>({\n  row,\n  rowIndex,\n  cellSpans,\n  scrollShadow,\n  onRowClick,\n  expandedPanel,\n  visibleColumnCount,\n}: {\n  row: Row<TData>;\n  rowIndex: number;\n  cellSpans: ReturnType<typeof computeCellSpans>;\n  scrollShadow: ReturnType<typeof useScrollShadow>;\n  onRowClick?: (row: TData) => void;\n  expandedPanel?: ReactNode;\n  visibleColumnCount: number;\n}) {\n  const {\n    attributes,\n    listeners,\n    setNodeRef,\n    setActivatorNodeRef,\n    transform,\n    transition,\n    isDragging,\n  } = useSortable({ id: row.id });\n\n  const style: CSSProperties = {\n    transform: CSS.Transform.toString(transform),\n    transition,\n    position: isDragging ? \"relative\" : undefined,\n    zIndex: isDragging ? 1 : undefined,\n  };\n  const isSelected = row.getIsSelected();\n  const showPanel = expandedPanel !== undefined;\n\n  return (\n    <RowDragHandleContext.Provider\n      value={{ attributes, listeners, setActivatorNodeRef, isDragging }}\n    >\n      <TableRow\n        ref={setNodeRef}\n        style={style}\n        data-state={isSelected ? \"selected\" : undefined}\n        className={cn(\n          isDragging && \"bg-muted/70 shadow-md\",\n          onRowClick && \"cursor-pointer\",\n        )}\n        onClick={onRowClick ? () => onRowClick(row.original) : undefined}\n      >\n        {renderRowCells(row, rowIndex, cellSpans, scrollShadow)}\n      </TableRow>\n      {showPanel\n        ? renderExpandedPanel({\n            rowId: row.id,\n            panel: expandedPanel,\n            visibleColumnCount,\n            isSelected,\n            style,\n            isDragging,\n          })\n        : null}\n    </RowDragHandleContext.Provider>\n  );\n}\n\n/**\n * DataTable 暴露给 ref 的命令式 handle —— 就是底层 TanStack table 实例\n *\n * 通过 `ref` 即可拿到完整的 TanStack `table` API:`setPageIndex`、`getSelectedRowModel`、\n * `resetSorting`、`getState` 等。配合受控状态使用更顺手\n */\nexport type DataTableHandle<TData> = TanstackTable<TData>;\n\n/**\n * 全功能数据表格\n *\n * 在 `Table` 基础组件之上,基于 `@tanstack/react-table`\n * 提供排序、筛选、分页、行选择、列显隐 / 拖拽 / 固定 / 调宽、行虚拟滚动、行拖拽排序等能力\n *\n * 可通过 `ref` 拿到底层 TanStack `table` 实例 ([[DataTableHandle]]) 进行命令式操作\n */\nfunction DataTableInner<TData, TValue = unknown>(\n  {\n    columns,\n    data,\n    loading,\n    state,\n    initialState,\n    onStateChange,\n    features,\n    renderToolbar,\n    renderPagination,\n    empty = \"暂无数据\",\n    pageSizeOptions,\n    className,\n    tableClassName,\n    onRowClick,\n    onRowOrderChange,\n    rowDndHandle = \"auto\",\n    tableOptions,\n    virtual = false,\n    bordered = false,\n    expandedRowRender,\n  }: DataTablePropsType<TData, TValue>,\n  ref: Ref<DataTableHandle<TData>>,\n) {\n  const virtualEnabled = Boolean(virtual);\n  const virtualOptions: DataTableVirtualOptions | undefined =\n    virtual && typeof virtual === \"object\" ? virtual : undefined;\n\n  const rowDndEnabled = !virtualEnabled && Boolean(features?.rowDnd);\n  const autoHandle = rowDndEnabled && rowDndHandle === \"auto\";\n  const expandedRowRenderEffective = virtualEnabled\n    ? undefined\n    : expandedRowRender;\n\n  const virtualConflicts =\n    virtualEnabled &&\n    Boolean(features?.rowDnd || features?.expanding || expandedRowRender);\n  const rowDndMissingGetRowId = rowDndEnabled && !tableOptions?.getRowId;\n  useEffect(() => {\n    if (virtualConflicts) {\n      console.warn(\n        \"[DataTable] virtual 模式与 rowDnd / expanding / expandedRowRender 不兼容,已自动忽略相关功能\",\n      );\n    }\n    if (rowDndMissingGetRowId) {\n      console.warn(\n        \"[DataTable] 启用 features.rowDnd 时,请通过 tableOptions.getRowId 提供稳定的行 id,否则拖拽顺序会错乱\",\n      );\n    }\n  }, [virtualConflicts, rowDndMissingGetRowId]);\n\n  const effectiveFeatures = virtualEnabled\n    ? { ...features, pagination: false, rowDnd: false, expanding: false }\n    : features;\n\n  // 仅当 rowDnd 启用 且 手柄模式为 auto 时,自动在最左侧追加一列拖拽手柄\n  const effectiveColumns = useMemo(\n    () =>\n      autoHandle && !columns.some((c) => c.id === ROW_DND_HANDLE_COLUMN_ID)\n        ? [buildRowDndColumn<TData>(), ...columns]\n        : columns,\n    [columns, autoHandle],\n  );\n\n  // 传了 expandedRowRender 但用户没自定义 getRowCanExpand 时,默认所有行都可展开\n  const effectiveTableOptions = useMemo(() => {\n    if (!expandedRowRenderEffective) return tableOptions;\n    if (tableOptions?.getRowCanExpand) return tableOptions;\n    return { ...tableOptions, getRowCanExpand: () => true };\n  }, [tableOptions, expandedRowRenderEffective]);\n\n  const { table, features: mergedFeatures } = useDataTable<TData, TValue>({\n    data,\n    columns: effectiveColumns,\n    features: effectiveFeatures,\n    state,\n    initialState,\n    onStateChange,\n    tableOptions: effectiveTableOptions,\n  });\n\n  // 把 TanStack table 实例直接作为命令式 handle 暴露给外部 ref\n  useImperativeHandle(ref, () => table, [table]);\n\n  const wrapperRef = useRef<HTMLDivElement>(null);\n  const scrollShadow = useScrollShadow(wrapperRef);\n\n  const visibleLeafColumns = table.getVisibleLeafColumns();\n  const visibleColumnCount = visibleLeafColumns.length;\n  const rows = table.getRowModel().rows;\n  // 显式重算:TanStack 每次 getRowModel/getVisibleLeafColumns 都返回新引用,\n  // useMemo 的依赖永远变;改让 React Compiler 自行决定是否缓存\n  const cellSpans = computeCellSpans(rows, visibleLeafColumns);\n\n  // 行拖拽 sortable id 列表(行 id 由 tableOptions.getRowId 决定,缺省时为索引)\n  const rowIds = rows.map((row) => row.id);\n  const sensors = useSensors(\n    useSensor(PointerSensor, { activationConstraint: { distance: 5 } }),\n    useSensor(KeyboardSensor, {\n      coordinateGetter: sortableKeyboardCoordinates,\n    }),\n  );\n\n  const handleDragEnd = (event: DragEndEvent) => {\n    const { active, over } = event;\n    if (!over || active.id === over.id) return;\n    const oldIndex = rows.findIndex((row) => row.id === String(active.id));\n    const newIndex = rows.findIndex((row) => row.id === String(over.id));\n    if (oldIndex === -1 || newIndex === -1) return;\n    const nextData = arrayMove(data, oldIndex, newIndex);\n    onRowOrderChange?.(nextData, {\n      oldIndex,\n      newIndex,\n      activeId: String(active.id),\n      overId: String(over.id),\n    });\n  };\n\n  const toolbarNode = renderToolbar?.(table);\n\n  const skeletonRowCount = mergedFeatures.pagination\n    ? table.getState().pagination.pageSize\n    : DEFAULT_SKELETON_ROWS;\n\n  const bodyContent = loading ? (\n    Array.from({ length: skeletonRowCount }).map((_, rowIndex) => (\n      <TableRow key={`loading-${rowIndex}`}>\n        {table.getVisibleLeafColumns().map((column) => (\n          <TableCell\n            key={column.id}\n            style={getCommonPinningStyles(column)}\n            className={getColumnPinningClassName(column, scrollShadow)}\n          >\n            <Skeleton className=\"h-4 w-full\" />\n          </TableCell>\n        ))}\n      </TableRow>\n    ))\n  ) : rows.length ? (\n    rows.map((row, rowIndex) => {\n      const rawPanel =\n        expandedRowRenderEffective && row.getIsExpanded()\n          ? expandedRowRenderEffective(row)\n          : undefined;\n      const expandedPanel = isRenderablePanel(rawPanel) ? rawPanel : undefined;\n      const isSelected = row.getIsSelected();\n\n      if (rowDndEnabled) {\n        return (\n          <SortableTableRow\n            key={row.id}\n            row={row}\n            rowIndex={rowIndex}\n            cellSpans={cellSpans}\n            scrollShadow={scrollShadow}\n            onRowClick={onRowClick}\n            expandedPanel={expandedPanel}\n            visibleColumnCount={visibleColumnCount}\n          />\n        );\n      }\n\n      // 无展开面板:直接返回带 key 的 TableRow,避免无意义的 Fragment 包裹\n      if (expandedPanel === undefined) {\n        return (\n          <TableRow\n            key={row.id}\n            data-state={isSelected ? \"selected\" : undefined}\n            className={onRowClick ? \"cursor-pointer\" : undefined}\n            onClick={onRowClick ? () => onRowClick(row.original) : undefined}\n          >\n            {renderRowCells(row, rowIndex, cellSpans, scrollShadow)}\n          </TableRow>\n        );\n      }\n\n      // 有展开面板:主行 + 面板 row 作为兄弟节点共用一个 Fragment key\n      return (\n        <Fragment key={row.id}>\n          <TableRow\n            data-state={isSelected ? \"selected\" : undefined}\n            className={onRowClick ? \"cursor-pointer\" : undefined}\n            onClick={onRowClick ? () => onRowClick(row.original) : undefined}\n          >\n            {renderRowCells(row, rowIndex, cellSpans, scrollShadow)}\n          </TableRow>\n          {renderExpandedPanel({\n            rowId: row.id,\n            panel: expandedPanel,\n            visibleColumnCount,\n            isSelected,\n          })}\n        </Fragment>\n      );\n    })\n  ) : (\n    <TableRow>\n      <TableCell\n        colSpan={visibleColumnCount}\n        className=\"text-muted-foreground h-24 text-center\"\n      >\n        {empty}\n      </TableCell>\n    </TableRow>\n  );\n\n  const standardBody = (\n    <div\n      ref={wrapperRef}\n      className={cn(\n        \"rounded-md\",\n        bordered &&\n          \"border [&_td]:border-r [&_th]:border-r [&_tr>*:last-child]:border-r-0\",\n        tableClassName,\n      )}\n    >\n      <Table\n        className=\"min-w-max\"\n        style={\n          mergedFeatures.columnResizing\n            ? { width: table.getTotalSize() }\n            : undefined\n        }\n      >\n        <TableHeader>\n          {table.getHeaderGroups().map((headerGroup) => (\n            <TableRow key={headerGroup.id}>\n              {headerGroup.headers.map((header) => (\n                <DataTableColumnHeader\n                  key={header.id}\n                  header={header}\n                  resizable={mergedFeatures.columnResizing}\n                  scrollShadow={scrollShadow}\n                />\n              ))}\n            </TableRow>\n          ))}\n        </TableHeader>\n        <TableBody>\n          {rowDndEnabled ? (\n            <SortableContext\n              items={rowIds}\n              strategy={verticalListSortingStrategy}\n            >\n              {bodyContent}\n            </SortableContext>\n          ) : (\n            bodyContent\n          )}\n        </TableBody>\n      </Table>\n    </div>\n  );\n\n  const bodyNode = virtualEnabled ? (\n    <DataTableVirtualBody\n      table={table}\n      loading={loading}\n      empty={empty}\n      options={virtualOptions}\n      bordered={bordered}\n      className={tableClassName}\n    />\n  ) : rowDndEnabled ? (\n    <DndContext\n      sensors={sensors}\n      collisionDetection={closestCenter}\n      modifiers={[restrictToVerticalAxis]}\n      onDragEnd={handleDragEnd}\n    >\n      {standardBody}\n    </DndContext>\n  ) : (\n    standardBody\n  );\n\n  return (\n    <div data-slot=\"data-table\" className={cn(\"flex flex-col\", className)}>\n      {toolbarNode}\n      {bodyNode}\n      {mergedFeatures.pagination &&\n        (renderPagination !== undefined ? (\n          renderPagination(table)\n        ) : (\n          <DataTablePagination\n            table={table}\n            pageSizeOptions={pageSizeOptions}\n          />\n        ))}\n    </div>\n  );\n}\n\n/**\n * forwardRef 包装,泛型用 cast 保留 —— 否则会被 forwardRef 的签名擦除成 unknown\n */\nconst DataTable = forwardRef(DataTableInner) as <TData, TValue = unknown>(\n  props: DataTablePropsType<TData, TValue> &\n    RefAttributes<DataTableHandle<TData>>,\n) => ReactElement | null;\n\nexport { DataTable };\n","\"use client\";\n\nimport {\n  closestCenter,\n  DndContext,\n  type DragEndEvent,\n  KeyboardSensor,\n  PointerSensor,\n  useSensor,\n  useSensors,\n} from \"@dnd-kit/core\";\nimport { restrictToVerticalAxis } from \"@dnd-kit/modifiers\";\nimport {\n  arrayMove,\n  SortableContext,\n  sortableKeyboardCoordinates,\n  useSortable,\n  verticalListSortingStrategy,\n} from \"@dnd-kit/sortable\";\nimport { CSS } from \"@dnd-kit/utilities\";\nimport type { Table as TanstackTable } from \"@tanstack/react-table\";\nimport { GripVerticalIcon, Settings2Icon } from \"lucide-react\";\nimport {\n  type CSSProperties,\n  type MouseEvent,\n  type ReactElement,\n  type ReactNode,\n} from \"react\";\nimport { cn } from \"../../../lib\";\nimport { Button } from \"../../button\";\nimport {\n  DropdownMenu,\n  DropdownMenuCheckboxItem,\n  DropdownMenuContent,\n  DropdownMenuGroup,\n  DropdownMenuLabel,\n  DropdownMenuSeparator,\n  DropdownMenuTrigger,\n} from \"../../dropdown-menu\";\nimport type { AnyColumn } from \"../type\";\n\ntype DataTableViewOptionsProps<TData> = {\n  table: TanstackTable<TData>;\n  /** 是否允许列拖拽排序,默认 false */\n  enableOrdering?: boolean;\n  /** 是否允许列固定操作,默认 false */\n  enablePinning?: boolean;\n  /** 触发按钮自定义,默认 \"视图\" */\n  trigger?: ReactElement;\n};\n\n/**\n * 列显隐 / 排序 / 固定 设置面板\n *\n * 通过 DropdownMenu 弹出列表,内置 DnD-Kit 排序与固定按钮\n */\nexport function DataTableViewOptions<TData>({\n  table,\n  enableOrdering = false,\n  enablePinning = false,\n  trigger,\n}: DataTableViewOptionsProps<TData>) {\n  const draggableColumns = table\n    .getAllLeafColumns()\n    .filter((column) => column.getCanHide());\n  const draggableColumnIds = draggableColumns.map((column) => column.id);\n\n  const sensors = useSensors(\n    useSensor(PointerSensor, { activationConstraint: { distance: 5 } }),\n    useSensor(KeyboardSensor, {\n      coordinateGetter: sortableKeyboardCoordinates,\n    }),\n  );\n\n  const handleDragEnd = ({ active, over }: DragEndEvent) => {\n    if (!over || active.id === over.id) return;\n    const currentOrder = table.getState().columnOrder;\n    const allColumnIds = table.getAllLeafColumns().map((column) => column.id);\n    const orderedColumnIds = currentOrder.length\n      ? currentOrder.filter((columnId) => allColumnIds.includes(columnId))\n      : allColumnIds;\n    const nextOrder = [\n      ...orderedColumnIds,\n      ...allColumnIds.filter(\n        (columnId) => !orderedColumnIds.includes(columnId),\n      ),\n    ];\n    const oldIndex = nextOrder.indexOf(String(active.id));\n    const newIndex = nextOrder.indexOf(String(over.id));\n    if (oldIndex === -1 || newIndex === -1) return;\n    table.setColumnOrder(arrayMove(nextOrder, oldIndex, newIndex));\n  };\n\n  const items = enableOrdering ? draggableColumnIds : [];\n\n  return (\n    <DropdownMenu>\n      <DropdownMenuTrigger\n        render={\n          trigger ?? (\n            <Button variant=\"outline\" size=\"sm\">\n              <Settings2Icon />\n              视图\n            </Button>\n          )\n        }\n      />\n      <DropdownMenuContent align=\"end\" className=\"min-w-56\">\n        <DropdownMenuGroup>\n          <DropdownMenuLabel>显示的列</DropdownMenuLabel>\n        </DropdownMenuGroup>\n        <DropdownMenuSeparator />\n        {enableOrdering ? (\n          <DndContext\n            sensors={sensors}\n            collisionDetection={closestCenter}\n            modifiers={[restrictToVerticalAxis]}\n            onDragEnd={handleDragEnd}\n          >\n            <SortableContext\n              items={items}\n              strategy={verticalListSortingStrategy}\n            >\n              {draggableColumns.map((column) => (\n                <SortableColumnItem\n                  key={column.id}\n                  column={column}\n                  enablePinning={enablePinning}\n                />\n              ))}\n            </SortableContext>\n          </DndContext>\n        ) : (\n          draggableColumns.map((column) => (\n            <ColumnVisibilityItem\n              key={column.id}\n              column={column}\n              enablePinning={enablePinning}\n            />\n          ))\n        )}\n      </DropdownMenuContent>\n    </DropdownMenu>\n  );\n}\n\ntype ColumnItemProps<TData> = {\n  column: AnyColumn<TData>;\n  enablePinning?: boolean;\n};\n\n/**\n * 列设置项内部统一渲染:复选 + 列名 + 可选固定操作\n */\nfunction ColumnItemBody<TData>({\n  column,\n  enablePinning,\n  dragHandle,\n}: ColumnItemProps<TData> & { dragHandle?: ReactNode }) {\n  const pinned = column.getIsPinned();\n  const canPin = enablePinning && column.getCanPin();\n\n  const handlePinClick = (\n    event: MouseEvent<HTMLButtonElement>,\n    position: \"left\" | \"right\" | false,\n  ) => {\n    event.preventDefault();\n    event.stopPropagation();\n    column.pin(position);\n  };\n\n  return (\n    <DropdownMenuCheckboxItem\n      className=\"capitalize\"\n      checked={column.getIsVisible()}\n      onCheckedChange={(value) => column.toggleVisibility(!!value)}\n    >\n      {dragHandle}\n      <span className=\"min-w-20 flex-1\">{column.id}</span>\n      {canPin && (\n        <span\n          className=\"ml-auto mr-5 flex items-center gap-1 normal-case\"\n          onClick={(event) => event.stopPropagation()}\n          onPointerDown={(event) => event.stopPropagation()}\n        >\n          <Button\n            type=\"button\"\n            variant={pinned === \"left\" ? \"default\" : \"ghost\"}\n            size=\"xs\"\n            onClick={(event) => handlePinClick(event, \"left\")}\n          >\n            左\n          </Button>\n          <Button\n            type=\"button\"\n            variant={pinned ? \"ghost\" : \"default\"}\n            size=\"xs\"\n            onClick={(event) => handlePinClick(event, false)}\n          >\n            无\n          </Button>\n          <Button\n            type=\"button\"\n            variant={pinned === \"right\" ? \"default\" : \"ghost\"}\n            size=\"xs\"\n            onClick={(event) => handlePinClick(event, \"right\")}\n          >\n            右\n          </Button>\n        </span>\n      )}\n    </DropdownMenuCheckboxItem>\n  );\n}\n\nfunction ColumnVisibilityItem<TData>({\n  column,\n  enablePinning,\n}: ColumnItemProps<TData>) {\n  return <ColumnItemBody column={column} enablePinning={enablePinning} />;\n}\n\nfunction SortableColumnItem<TData>({\n  column,\n  enablePinning,\n}: ColumnItemProps<TData>) {\n  const {\n    attributes,\n    listeners,\n    setActivatorNodeRef,\n    setNodeRef,\n    transform,\n    transition,\n    isDragging,\n  } = useSortable({ id: column.id });\n\n  const style: CSSProperties = {\n    transform: CSS.Transform.toString(transform),\n    transition,\n  };\n\n  return (\n    <div\n      ref={setNodeRef}\n      style={style}\n      className={cn(isDragging && \"relative z-10 opacity-80\")}\n    >\n      <ColumnItemBody\n        column={column}\n        enablePinning={enablePinning}\n        dragHandle={\n          <span\n            ref={setActivatorNodeRef}\n            className=\"cursor-grab active:cursor-grabbing\"\n            aria-label={`Reorder ${column.id} column`}\n            onClick={(event) => event.stopPropagation()}\n            {...attributes}\n            {...listeners}\n          >\n            <GripVerticalIcon className=\"size-[1em]\" />\n          </span>\n        }\n      />\n    </div>\n  );\n}\n","\"use client\";\n\nimport type { Table as TanstackTable } from \"@tanstack/react-table\";\nimport { SearchIcon, XIcon } from \"lucide-react\";\nimport { type ReactNode } from \"react\";\nimport { cn } from \"../../../lib\";\nimport { Button } from \"../../button\";\nimport { Input } from \"../../input\";\nimport { DataTableViewOptions } from \"./data-table-view-options\";\n\ntype DataTableToolbarProps<TData> = {\n  table: TanstackTable<TData>;\n  /** 绑定搜索输入框的列 id;留空则使用全局过滤 */\n  searchColumnId?: string;\n  /** 输入框 placeholder */\n  searchPlaceholder?: string;\n  /** 是否展示视图配置(列显隐),默认 true */\n  showViewOptions?: boolean;\n  /** 是否启用列拖拽 */\n  enableColumnOrdering?: boolean;\n  /** 是否启用列固定 */\n  enableColumnPinning?: boolean;\n  /** 工具栏右侧追加内容 */\n  extra?: ReactNode;\n  className?: string;\n};\n\n/**\n * 表格工具栏:搜索 + 视图配置 + 自定义扩展\n */\nexport function DataTableToolbar<TData>({\n  table,\n  searchColumnId,\n  searchPlaceholder = \"搜索...\",\n  showViewOptions = true,\n  enableColumnOrdering,\n  enableColumnPinning,\n  extra,\n  className,\n}: DataTableToolbarProps<TData>) {\n  const searchColumn = searchColumnId\n    ? table.getColumn(searchColumnId)\n    : undefined;\n  const useGlobalFilter = !searchColumn;\n  const value = useGlobalFilter\n    ? table.getState().globalFilter\n    : (searchColumn?.getFilterValue() as string | undefined);\n  const hasValue = Boolean(value);\n\n  const handleChange = (next: string) => {\n    if (useGlobalFilter) {\n      table.setGlobalFilter(next);\n    } else {\n      searchColumn?.setFilterValue(next || undefined);\n    }\n  };\n\n  return (\n    <div\n      data-slot=\"data-table-toolbar\"\n      className={cn(\"flex flex-wrap items-center gap-2 py-3\", className)}\n    >\n      <div className=\"relative max-w-sm flex-1\">\n        <SearchIcon className=\"text-muted-foreground pointer-events-none absolute left-2.5 top-1/2 size-4 -translate-y-1/2\" />\n        <Input\n          placeholder={searchPlaceholder}\n          value={value ?? \"\"}\n          onChange={(event) => handleChange(event.target.value)}\n          className=\"pl-8 pr-8\"\n        />\n        {hasValue && (\n          <Button\n            type=\"button\"\n            variant=\"ghost\"\n            size=\"icon-xs\"\n            className=\"absolute right-1 top-1/2 -translate-y-1/2\"\n            aria-label=\"清除搜索\"\n            onClick={() => handleChange(\"\")}\n          >\n            <XIcon />\n          </Button>\n        )}\n      </div>\n      <div className=\"ml-auto flex items-center gap-2\">\n        {extra}\n        {showViewOptions && (\n          <DataTableViewOptions\n            table={table}\n            enableOrdering={enableColumnOrdering}\n            enablePinning={enableColumnPinning}\n          />\n        )}\n      </div>\n    </div>\n  );\n}\n","\"use client\";\n\nimport type { Row } from \"@tanstack/react-table\";\nimport { ChevronRightIcon } from \"lucide-react\";\nimport type { ComponentProps } from \"react\";\nimport { cn } from \"../../../lib\";\nimport { panelIdFor } from \"../utils\";\n\ntype RowExpandTogglePropsType<TData> = Omit<\n  ComponentProps<\"button\">,\n  \"onClick\" | \"children\"\n> & {\n  /** 当前行实例 */\n  row: Row<TData>;\n  /**\n   * 嵌套树场景下,每层缩进的像素数;设为 0 关闭自动缩进\n   *\n   * 默认 16,即每深一层缩进 16px\n   */\n  indent?: number;\n  /** 当行无可展开子项时是否仍占位渲染(保持对齐),默认 true */\n  placeholder?: boolean;\n};\n\n/**\n * 行展开切换按钮:基于 `row.getToggleExpandedHandler` + `row.depth` 自动缩进\n *\n * 配合 `features.expanding` 与 `tableOptions.getSubRows`(嵌套树),或 `expandedRowRender`(展开面板)使用\n */\nexport function RowExpandToggle<TData>({\n  row,\n  indent = 16,\n  placeholder = true,\n  className,\n  ...props\n}: RowExpandTogglePropsType<TData>) {\n  const paddingLeft = indent > 0 ? row.depth * indent : 0;\n  const canExpand = row.getCanExpand();\n  const isExpanded = row.getIsExpanded();\n\n  if (!canExpand) {\n    if (!placeholder) return null;\n    return (\n      <span\n        aria-hidden\n        className=\"inline-flex size-6 shrink-0\"\n        style={paddingLeft ? { marginLeft: paddingLeft } : undefined}\n      />\n    );\n  }\n\n  // 嵌套树场景下,展开生成的是子行而非面板;只有\"叶子但可展开\"(即 expandedRowRender 场景)\n  // 才有对应的面板 row,此时才有 aria-controls 目标\n  const hasPanelTarget = row.subRows.length === 0;\n\n  return (\n    <button\n      type=\"button\"\n      aria-label={isExpanded ? \"收起\" : \"展开\"}\n      aria-expanded={isExpanded}\n      aria-controls={\n        isExpanded && hasPanelTarget ? panelIdFor(row.id) : undefined\n      }\n      onClick={row.getToggleExpandedHandler()}\n      className={cn(\n        \"text-muted-foreground hover:text-foreground inline-flex size-6 shrink-0 cursor-pointer items-center justify-center rounded-md transition-colors focus-visible:outline-none\",\n        className,\n      )}\n      style={paddingLeft ? { marginLeft: paddingLeft } : undefined}\n      {...props}\n    >\n      <ChevronRightIcon\n        className={cn(\n          \"size-4 transition-transform\",\n          isExpanded ? \"rotate-90\" : \"rotate-0\",\n        )}\n      />\n    </button>\n  );\n}\n"],"mappings":"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"}