lynote-ui 0.0.10 → 0.0.12

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (82) hide show
  1. package/dist/attachment/index.d.ts +24 -0
  2. package/dist/attachment/index.js +118 -0
  3. package/dist/attachment/index.js.map +1 -0
  4. package/dist/attachment/index.mjs +107 -0
  5. package/dist/attachment/index.mjs.map +1 -0
  6. package/dist/bubble/index.d.ts +17 -0
  7. package/dist/bubble/index.js +81 -0
  8. package/dist/bubble/index.js.map +1 -0
  9. package/dist/bubble/index.mjs +75 -0
  10. package/dist/bubble/index.mjs.map +1 -0
  11. package/dist/button/index.d.ts +4 -2
  12. package/dist/button/index.js +32 -7
  13. package/dist/button/index.js.map +1 -1
  14. package/dist/button/index.mjs +32 -7
  15. package/dist/button/index.mjs.map +1 -1
  16. package/dist/calendar/index.js +1 -1
  17. package/dist/calendar/index.js.map +1 -1
  18. package/dist/calendar/index.mjs +1 -1
  19. package/dist/calendar/index.mjs.map +1 -1
  20. package/dist/carousel/index.d.ts +2 -2
  21. package/dist/carousel/index.js +4 -2
  22. package/dist/carousel/index.js.map +1 -1
  23. package/dist/carousel/index.mjs +4 -2
  24. package/dist/carousel/index.mjs.map +1 -1
  25. package/dist/combobox/index.js +6 -3
  26. package/dist/combobox/index.js.map +1 -1
  27. package/dist/combobox/index.mjs +6 -3
  28. package/dist/combobox/index.mjs.map +1 -1
  29. package/dist/dialog/index.js +2 -1
  30. package/dist/dialog/index.js.map +1 -1
  31. package/dist/dialog/index.mjs +2 -1
  32. package/dist/dialog/index.mjs.map +1 -1
  33. package/dist/index.d.ts +5 -0
  34. package/dist/index.js +40 -2
  35. package/dist/index.mjs +8 -3
  36. package/dist/input-group/index.d.ts +3 -2
  37. package/dist/input-group/index.js +22 -8
  38. package/dist/input-group/index.js.map +1 -1
  39. package/dist/input-group/index.mjs +22 -8
  40. package/dist/input-group/index.mjs.map +1 -1
  41. package/dist/marker/index.d.ts +11 -0
  42. package/dist/marker/index.js +51 -0
  43. package/dist/marker/index.js.map +1 -0
  44. package/dist/marker/index.mjs +45 -0
  45. package/dist/marker/index.mjs.map +1 -0
  46. package/dist/message/index.d.ts +10 -0
  47. package/dist/message/index.js +59 -0
  48. package/dist/message/index.js.map +1 -0
  49. package/dist/message/index.mjs +51 -0
  50. package/dist/message/index.mjs.map +1 -0
  51. package/dist/message-scroller/index.d.ts +10 -0
  52. package/dist/message-scroller/index.js +74 -0
  53. package/dist/message-scroller/index.js.map +1 -0
  54. package/dist/message-scroller/index.mjs +63 -0
  55. package/dist/message-scroller/index.mjs.map +1 -0
  56. package/dist/pagination/index.d.ts +2 -2
  57. package/dist/pagination/index.js +4 -1
  58. package/dist/pagination/index.js.map +1 -1
  59. package/dist/pagination/index.mjs +4 -1
  60. package/dist/pagination/index.mjs.map +1 -1
  61. package/dist/sheet/index.js +2 -1
  62. package/dist/sheet/index.js.map +1 -1
  63. package/dist/sheet/index.mjs +2 -1
  64. package/dist/sheet/index.mjs.map +1 -1
  65. package/dist/sidebar/index.js +1 -1
  66. package/dist/sidebar/index.mjs +1 -1
  67. package/dist/{sidebar-BO_ns2qp.mjs → sidebar-CA70yQe2.mjs} +3 -2
  68. package/dist/sidebar-CA70yQe2.mjs.map +1 -0
  69. package/dist/{sidebar-KSjzFqo5.js → sidebar-CU5Hn9h7.js} +3 -2
  70. package/dist/sidebar-CU5Hn9h7.js.map +1 -0
  71. package/dist/style.css +697 -5
  72. package/dist/table/index.js +1 -1
  73. package/dist/table/index.mjs +1 -1
  74. package/dist/{table-BA2BijtZ.mjs → table-D3oTrmZn.mjs} +11 -6
  75. package/dist/table-D3oTrmZn.mjs.map +1 -0
  76. package/dist/{table-FocfdaF7.js → table-qqE4Wtic.js} +11 -6
  77. package/dist/table-qqE4Wtic.js.map +1 -0
  78. package/package.json +27 -1
  79. package/dist/sidebar-BO_ns2qp.mjs.map +0 -1
  80. package/dist/sidebar-KSjzFqo5.js.map +0 -1
  81. package/dist/table-BA2BijtZ.mjs.map +0 -1
  82. package/dist/table-FocfdaF7.js.map +0 -1
@@ -1,5 +1,5 @@
1
1
  Object.defineProperty(exports, Symbol.toStringTag, { value: "Module" });
2
- const require_table = require("../table-FocfdaF7.js");
2
+ const require_table = require("../table-qqE4Wtic.js");
3
3
  exports.DataTable = require_table.DataTable;
4
4
  exports.DataTableColumnHeader = require_table.DataTableColumnHeader;
5
5
  exports.DataTablePagination = require_table.DataTablePagination;
@@ -1,2 +1,2 @@
1
- import { C as TableRow, S as TableHeader, _ as TableBody, a as RowDragHandle, b as TableFooter, c as DataTablePagination, d as getColumnPinningClassName, f as getCommonPinningStyles, g as Table, h as useScrollShadow, i as DataTable, l as DataTableColumnHeader, m as useDataTable, n as DataTableToolbar, o as RowDragHandleContext, p as panelIdFor, r as DataTableViewOptions, s as DataTableVirtualBody, t as RowExpandToggle, u as computeCellSpans, v as TableCaption, x as TableHead, y as TableCell } from "../table-BA2BijtZ.mjs";
1
+ import { C as TableRow, S as TableHeader, _ as TableBody, a as RowDragHandle, b as TableFooter, c as DataTablePagination, d as getColumnPinningClassName, f as getCommonPinningStyles, g as Table, h as useScrollShadow, i as DataTable, l as DataTableColumnHeader, m as useDataTable, n as DataTableToolbar, o as RowDragHandleContext, p as panelIdFor, r as DataTableViewOptions, s as DataTableVirtualBody, t as RowExpandToggle, u as computeCellSpans, v as TableCaption, x as TableHead, y as TableCell } from "../table-D3oTrmZn.mjs";
2
2
  export { DataTable, DataTableColumnHeader, DataTablePagination, DataTableToolbar, DataTableViewOptions, DataTableVirtualBody, RowDragHandle, RowDragHandleContext, RowExpandToggle, Table, TableBody, TableCaption, TableCell, TableFooter, TableHead, TableHeader, TableRow, computeCellSpans, getColumnPinningClassName, getCommonPinningStyles, panelIdFor, useDataTable, useScrollShadow };
@@ -449,7 +449,8 @@ function DataTablePagination({ table, pageSizeOptions = DEFAULT_PAGE_SIZE_OPTION
449
449
  }),
450
450
  /* @__PURE__ */ jsx(Button, {
451
451
  variant: "outline",
452
- size: "icon-sm",
452
+ size: "sm",
453
+ icon: true,
453
454
  "aria-label": "第一页",
454
455
  onClick: () => table.setPageIndex(0),
455
456
  disabled: !table.getCanPreviousPage(),
@@ -457,7 +458,8 @@ function DataTablePagination({ table, pageSizeOptions = DEFAULT_PAGE_SIZE_OPTION
457
458
  }),
458
459
  /* @__PURE__ */ jsx(Button, {
459
460
  variant: "outline",
460
- size: "icon-sm",
461
+ size: "sm",
462
+ icon: true,
461
463
  "aria-label": "上一页",
462
464
  onClick: () => table.previousPage(),
463
465
  disabled: !table.getCanPreviousPage(),
@@ -465,7 +467,8 @@ function DataTablePagination({ table, pageSizeOptions = DEFAULT_PAGE_SIZE_OPTION
465
467
  }),
466
468
  /* @__PURE__ */ jsx(Button, {
467
469
  variant: "outline",
468
- size: "icon-sm",
470
+ size: "sm",
471
+ icon: true,
469
472
  "aria-label": "下一页",
470
473
  onClick: () => table.nextPage(),
471
474
  disabled: !table.getCanNextPage(),
@@ -473,7 +476,8 @@ function DataTablePagination({ table, pageSizeOptions = DEFAULT_PAGE_SIZE_OPTION
473
476
  }),
474
477
  /* @__PURE__ */ jsx(Button, {
475
478
  variant: "outline",
476
- size: "icon-sm",
479
+ size: "sm",
480
+ icon: true,
477
481
  "aria-label": "最后一页",
478
482
  onClick: () => table.setPageIndex(pageCount - 1),
479
483
  disabled: !table.getCanNextPage(),
@@ -1022,7 +1026,8 @@ function DataTableToolbar({ table, searchColumnId, searchPlaceholder = "搜索..
1022
1026
  hasValue && /* @__PURE__ */ jsx(Button, {
1023
1027
  type: "button",
1024
1028
  variant: "ghost",
1025
- size: "icon-xs",
1029
+ size: "xs",
1030
+ icon: true,
1026
1031
  className: "absolute right-1 top-1/2 -translate-y-1/2",
1027
1032
  "aria-label": "清除搜索",
1028
1033
  onClick: () => handleChange(""),
@@ -1074,4 +1079,4 @@ function RowExpandToggle({ row, indent = 16, placeholder = true, className, ...p
1074
1079
  //#endregion
1075
1080
  export { TableRow as C, TableHeader as S, TableBody as _, RowDragHandle as a, TableFooter as b, DataTablePagination as c, getColumnPinningClassName as d, getCommonPinningStyles as f, Table as g, useScrollShadow as h, DataTable as i, DataTableColumnHeader as l, useDataTable as m, DataTableToolbar as n, RowDragHandleContext as o, panelIdFor as p, DataTableViewOptions as r, DataTableVirtualBody as s, RowExpandToggle as t, computeCellSpans as u, TableCaption as v, TableHead as x, TableCell as y };
1076
1081
 
1077
- //# sourceMappingURL=table-BA2BijtZ.mjs.map
1082
+ //# sourceMappingURL=table-D3oTrmZn.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"table-D3oTrmZn.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=\"sm\"\n icon\n aria-label=\"第一页\"\n onClick={() => table.setPageIndex(0)}\n disabled={!table.getCanPreviousPage()}\n >\n <ChevronsLeftIcon />\n </Button>\n <Button\n variant=\"outline\"\n size=\"sm\"\n icon\n aria-label=\"上一页\"\n onClick={() => table.previousPage()}\n disabled={!table.getCanPreviousPage()}\n >\n <ChevronLeftIcon />\n </Button>\n <Button\n variant=\"outline\"\n size=\"sm\"\n icon\n aria-label=\"下一页\"\n onClick={() => table.nextPage()}\n disabled={!table.getCanNextPage()}\n >\n <ChevronRightIcon />\n </Button>\n <Button\n variant=\"outline\"\n size=\"sm\"\n icon\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=\"xs\"\n icon\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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"}
@@ -451,7 +451,8 @@ function DataTablePagination({ table, pageSizeOptions = DEFAULT_PAGE_SIZE_OPTION
451
451
  }),
452
452
  /* @__PURE__ */ (0, react_jsx_runtime.jsx)(require_button.Button, {
453
453
  variant: "outline",
454
- size: "icon-sm",
454
+ size: "sm",
455
+ icon: true,
455
456
  "aria-label": "第一页",
456
457
  onClick: () => table.setPageIndex(0),
457
458
  disabled: !table.getCanPreviousPage(),
@@ -459,7 +460,8 @@ function DataTablePagination({ table, pageSizeOptions = DEFAULT_PAGE_SIZE_OPTION
459
460
  }),
460
461
  /* @__PURE__ */ (0, react_jsx_runtime.jsx)(require_button.Button, {
461
462
  variant: "outline",
462
- size: "icon-sm",
463
+ size: "sm",
464
+ icon: true,
463
465
  "aria-label": "上一页",
464
466
  onClick: () => table.previousPage(),
465
467
  disabled: !table.getCanPreviousPage(),
@@ -467,7 +469,8 @@ function DataTablePagination({ table, pageSizeOptions = DEFAULT_PAGE_SIZE_OPTION
467
469
  }),
468
470
  /* @__PURE__ */ (0, react_jsx_runtime.jsx)(require_button.Button, {
469
471
  variant: "outline",
470
- size: "icon-sm",
472
+ size: "sm",
473
+ icon: true,
471
474
  "aria-label": "下一页",
472
475
  onClick: () => table.nextPage(),
473
476
  disabled: !table.getCanNextPage(),
@@ -475,7 +478,8 @@ function DataTablePagination({ table, pageSizeOptions = DEFAULT_PAGE_SIZE_OPTION
475
478
  }),
476
479
  /* @__PURE__ */ (0, react_jsx_runtime.jsx)(require_button.Button, {
477
480
  variant: "outline",
478
- size: "icon-sm",
481
+ size: "sm",
482
+ icon: true,
479
483
  "aria-label": "最后一页",
480
484
  onClick: () => table.setPageIndex(pageCount - 1),
481
485
  disabled: !table.getCanNextPage(),
@@ -1024,7 +1028,8 @@ function DataTableToolbar({ table, searchColumnId, searchPlaceholder = "搜索..
1024
1028
  hasValue && /* @__PURE__ */ (0, react_jsx_runtime.jsx)(require_button.Button, {
1025
1029
  type: "button",
1026
1030
  variant: "ghost",
1027
- size: "icon-xs",
1031
+ size: "xs",
1032
+ icon: true,
1028
1033
  className: "absolute right-1 top-1/2 -translate-y-1/2",
1029
1034
  "aria-label": "清除搜索",
1030
1035
  onClick: () => handleChange(""),
@@ -1213,4 +1218,4 @@ Object.defineProperty(exports, "useScrollShadow", {
1213
1218
  }
1214
1219
  });
1215
1220
 
1216
- //# sourceMappingURL=table-FocfdaF7.js.map
1221
+ //# sourceMappingURL=table-qqE4Wtic.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"table-qqE4Wtic.js","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=\"sm\"\n icon\n aria-label=\"第一页\"\n onClick={() => table.setPageIndex(0)}\n disabled={!table.getCanPreviousPage()}\n >\n <ChevronsLeftIcon />\n </Button>\n <Button\n variant=\"outline\"\n size=\"sm\"\n icon\n aria-label=\"上一页\"\n onClick={() => table.previousPage()}\n disabled={!table.getCanPreviousPage()}\n >\n <ChevronLeftIcon />\n </Button>\n <Button\n variant=\"outline\"\n size=\"sm\"\n icon\n aria-label=\"下一页\"\n onClick={() => table.nextPage()}\n disabled={!table.getCanNextPage()}\n >\n <ChevronRightIcon />\n </Button>\n <Button\n variant=\"outline\"\n size=\"sm\"\n icon\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=\"xs\"\n icon\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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"}