lynote-ui 0.0.9 → 0.0.11
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.
- package/dist/context-menu/index.d.ts +1 -1
- package/dist/context-menu/index.js +2 -1
- package/dist/context-menu/index.js.map +1 -1
- package/dist/context-menu/index.mjs +2 -1
- package/dist/context-menu/index.mjs.map +1 -1
- package/dist/index.js +16 -1
- package/dist/index.mjs +2 -2
- package/dist/sidebar/index.js +0 -1
- package/dist/sidebar/index.mjs +0 -1
- package/dist/style.css +231 -9
- package/dist/table/components/base-table.d.ts +10 -0
- package/dist/table/components/data-table-column-header.d.ts +12 -0
- package/dist/table/components/data-table-pagination.d.ts +12 -0
- package/dist/table/components/data-table-toolbar.d.ts +23 -0
- package/dist/table/components/data-table-view-options.d.ts +18 -0
- package/dist/table/components/data-table-virtual-body.d.ts +19 -0
- package/dist/table/components/data-table.d.ts +15 -0
- package/dist/table/components/row-drag-handle.d.ts +16 -0
- package/dist/table/components/row-expand-toggle.d.ts +21 -0
- package/dist/table/hooks/use-data-table.d.ts +44 -0
- package/dist/table/index.d.ts +13 -10
- package/dist/table/index.js +24 -78
- package/dist/table/index.mjs +2 -69
- package/dist/table/type.d.ts +198 -0
- package/dist/table/utils.d.ts +31 -0
- package/dist/table-BA2BijtZ.mjs +1077 -0
- package/dist/table-BA2BijtZ.mjs.map +1 -0
- package/dist/table-FocfdaF7.js +1216 -0
- package/dist/table-FocfdaF7.js.map +1 -0
- package/package.json +7 -1
- package/dist/table/index.js.map +0 -1
- package/dist/table/index.mjs.map +0 -1
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"table-FocfdaF7.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=\"icon-sm\"\n aria-label=\"第一页\"\n onClick={() => table.setPageIndex(0)}\n disabled={!table.getCanPreviousPage()}\n >\n <ChevronsLeftIcon />\n </Button>\n <Button\n variant=\"outline\"\n size=\"icon-sm\"\n aria-label=\"上一页\"\n onClick={() => table.previousPage()}\n disabled={!table.getCanPreviousPage()}\n >\n <ChevronLeftIcon />\n </Button>\n <Button\n variant=\"outline\"\n size=\"icon-sm\"\n aria-label=\"下一页\"\n onClick={() => table.nextPage()}\n disabled={!table.getCanNextPage()}\n >\n <ChevronRightIcon />\n </Button>\n <Button\n variant=\"outline\"\n size=\"icon-sm\"\n aria-label=\"最后一页\"\n onClick={() => table.setPageIndex(pageCount - 1)}\n disabled={!table.getCanNextPage()}\n >\n <ChevronsRightIcon />\n </Button>\n </div>\n </div>\n );\n}\n","\"use client\";\n\nimport { flexRender, type Table as TanstackTable } from \"@tanstack/react-table\";\nimport { useVirtualizer } from \"@tanstack/react-virtual\";\nimport { ChevronDownIcon, ChevronUpIcon } from \"lucide-react\";\nimport { type ReactNode, useRef } from \"react\";\nimport { cn } from \"../../../lib\";\nimport { Skeleton } from \"../../skeleton\";\nimport type { DataTableVirtualOptions } from \"../type\";\n\nconst DEFAULT_ROW_HEIGHT = 36;\nconst DEFAULT_MAX_HEIGHT = 480;\nconst DEFAULT_OVERSCAN = 10;\n\ntype DataTableVirtualBodyProps<TData> = {\n table: TanstackTable<TData>;\n loading?: boolean;\n empty?: ReactNode;\n options?: DataTableVirtualOptions;\n /** 是否显示纵向边框 */\n bordered?: boolean;\n className?: string;\n};\n\n/**\n * 行虚拟滚动表格:使用 grid 布局 + `useVirtualizer` 仅渲染可视区域\n *\n * 因表格采用 grid 布局,固定列 / 多级表头暂不支持\n */\nexport function DataTableVirtualBody<TData>({\n table,\n loading,\n empty = \"暂无数据\",\n options,\n bordered = false,\n className,\n}: DataTableVirtualBodyProps<TData>) {\n const estimateRowHeight = options?.estimateRowHeight ?? DEFAULT_ROW_HEIGHT;\n const maxHeight = options?.maxHeight ?? DEFAULT_MAX_HEIGHT;\n const overscan = options?.overscan ?? DEFAULT_OVERSCAN;\n\n const containerRef = useRef<HTMLDivElement>(null);\n const rows = table.getRowModel().rows;\n const totalWidth = table.getTotalSize();\n\n const virtualizer = useVirtualizer({\n count: rows.length,\n getScrollElement: () => containerRef.current,\n estimateSize: () => estimateRowHeight,\n overscan,\n });\n\n const virtualItems = virtualizer.getVirtualItems();\n const showEmpty = !loading && rows.length === 0;\n const skeletonRowCount = Math.max(\n 1,\n Math.floor(\n (typeof maxHeight === \"number\" ? maxHeight : 480) / estimateRowHeight,\n ),\n );\n\n return (\n <div\n ref={containerRef}\n data-slot=\"table-container\"\n className={cn(\n \"bg-background relative overflow-auto rounded-md\",\n bordered && \"border\",\n className,\n )}\n style={{\n height: typeof maxHeight === \"number\" ? `${maxHeight}px` : maxHeight,\n }}\n >\n <table\n data-slot=\"table\"\n className=\"grid text-sm\"\n style={{ width: `${totalWidth}px`, minWidth: \"100%\" }}\n >\n <thead\n data-slot=\"table-header\"\n className=\"bg-background sticky top-0 z-10 grid border-b\"\n >\n {table.getHeaderGroups().map((headerGroup) => (\n <tr key={headerGroup.id} className=\"flex w-full\">\n {headerGroup.headers.map((header, headerIndex) => {\n const canSort = header.column.getCanSort();\n const isSorted = header.column.getIsSorted();\n const isLast = headerIndex === headerGroup.headers.length - 1;\n return (\n <th\n key={header.id}\n data-slot=\"table-head\"\n className={cn(\n \"text-foreground flex h-10 shrink-0 items-center gap-1 px-2 text-left font-medium\",\n canSort && \"cursor-pointer select-none\",\n bordered && !isLast && \"border-r\",\n )}\n style={{ width: `${header.getSize()}px` }}\n onClick={\n canSort\n ? header.column.getToggleSortingHandler()\n : undefined\n }\n >\n {header.isPlaceholder\n ? null\n : flexRender(\n header.column.columnDef.header,\n header.getContext(),\n )}\n {canSort && (\n <span className=\"ml-1 flex flex-col items-center\">\n <ChevronUpIcon\n className={cn(\n \"text-muted-foreground -mb-1 size-3 transition\",\n isSorted === \"asc\" && \"text-foreground\",\n )}\n />\n <ChevronDownIcon\n className={cn(\n \"text-muted-foreground -mt-1 size-3 transition\",\n isSorted === \"desc\" && \"text-foreground\",\n )}\n />\n </span>\n )}\n </th>\n );\n })}\n </tr>\n ))}\n </thead>\n <tbody\n data-slot=\"table-body\"\n className=\"relative grid\"\n style={{\n height: loading\n ? `${skeletonRowCount * estimateRowHeight}px`\n : `${virtualizer.getTotalSize()}px`,\n }}\n >\n {loading ? (\n Array.from({ length: skeletonRowCount }).map((_, rowIndex) => {\n const leafColumns = table.getVisibleLeafColumns();\n return (\n <tr\n key={`loading-${rowIndex}`}\n className=\"flex w-full border-b\"\n style={{ height: `${estimateRowHeight}px` }}\n >\n {leafColumns.map((column, columnIndex) => {\n const isLast = columnIndex === leafColumns.length - 1;\n return (\n <td\n key={column.id}\n className={cn(\n \"flex items-center px-2\",\n bordered && !isLast && \"border-r\",\n )}\n style={{ width: `${column.getSize()}px` }}\n >\n <Skeleton className=\"h-4 w-full\" />\n </td>\n );\n })}\n </tr>\n );\n })\n ) : showEmpty ? (\n <tr className=\"flex w-full\">\n <td\n colSpan={table.getVisibleLeafColumns().length}\n className=\"text-muted-foreground flex h-24 w-full items-center justify-center\"\n >\n {empty}\n </td>\n </tr>\n ) : (\n virtualItems.map((virtualRow) => {\n const row = rows[virtualRow.index];\n const cells = row.getVisibleCells();\n return (\n <tr\n key={row.id}\n data-index={virtualRow.index}\n data-state={row.getIsSelected() ? \"selected\" : undefined}\n ref={(node) => virtualizer.measureElement(node)}\n className=\"hover:bg-muted/50 data-[state=selected]:bg-muted absolute flex w-full border-b\"\n style={{\n transform: `translateY(${virtualRow.start}px)`,\n }}\n >\n {cells.map((cell, cellIndex) => {\n const isLast = cellIndex === cells.length - 1;\n return (\n <td\n key={cell.id}\n data-slot=\"table-cell\"\n className={cn(\n \"text-foreground flex items-center px-2\",\n bordered && !isLast && \"border-r\",\n )}\n style={{\n width: `${cell.column.getSize()}px`,\n height: `${estimateRowHeight}px`,\n }}\n >\n {flexRender(\n cell.column.columnDef.cell,\n cell.getContext(),\n )}\n </td>\n );\n })}\n </tr>\n );\n })\n )}\n </tbody>\n </table>\n </div>\n );\n}\n","\"use client\";\n\nimport type {\n DraggableAttributes,\n DraggableSyntheticListeners,\n} from \"@dnd-kit/core\";\nimport { GripVerticalIcon } from \"lucide-react\";\nimport {\n createContext,\n useContext,\n type ComponentProps,\n type Ref,\n} from \"react\";\nimport { cn } from \"../../../lib\";\n\n/**\n * SortableRow 通过此 context 向其内部 cell 暴露 dnd-kit 的激活器/监听器\n *\n * 用 context 而非 prop 钻透,因为 cell 是用户自定义渲染函数,触不到 SortableRow 的局部变量\n */\nexport type RowDragHandleContextValue = {\n attributes: DraggableAttributes;\n listeners: DraggableSyntheticListeners | undefined;\n setActivatorNodeRef: Ref<HTMLElement>;\n isDragging: boolean;\n} | null;\n\nexport const RowDragHandleContext =\n createContext<RowDragHandleContextValue>(null);\n\n/** 在 cell 内任意位置放此组件即可成为行拖拽手柄 */\nexport function RowDragHandle({\n className,\n ...props\n}: Omit<\n ComponentProps<\"button\">,\n \"ref\" | \"onMouseDown\" | \"onKeyDown\" | \"onTouchStart\"\n>) {\n const handle = useContext(RowDragHandleContext);\n if (!handle) return null;\n return (\n <button\n type=\"button\"\n ref={handle.setActivatorNodeRef as Ref<HTMLButtonElement>}\n aria-label=\"拖动排序\"\n className={cn(\n \"text-muted-foreground hover:text-foreground inline-flex size-6 cursor-grab items-center justify-center rounded-md focus-visible:outline-none active:cursor-grabbing\",\n className,\n )}\n // eslint-disable-next-line react-hooks/refs\n {...handle.attributes}\n // eslint-disable-next-line react-hooks/refs\n {...handle.listeners}\n {...props}\n >\n <GripVerticalIcon className=\"size-4\" />\n </button>\n );\n}\n","\"use client\";\n\nimport {\n closestCenter,\n DndContext,\n type DragEndEvent,\n KeyboardSensor,\n PointerSensor,\n useSensor,\n useSensors,\n} from \"@dnd-kit/core\";\nimport { restrictToVerticalAxis } from \"@dnd-kit/modifiers\";\nimport {\n arrayMove,\n SortableContext,\n sortableKeyboardCoordinates,\n useSortable,\n verticalListSortingStrategy,\n} from \"@dnd-kit/sortable\";\nimport { CSS } from \"@dnd-kit/utilities\";\nimport {\n type ColumnDef,\n flexRender,\n type Row,\n type Table as TanstackTable,\n} from \"@tanstack/react-table\";\nimport {\n type CSSProperties,\n forwardRef,\n Fragment,\n type ReactElement,\n type ReactNode,\n type Ref,\n type RefAttributes,\n useEffect,\n useImperativeHandle,\n useMemo,\n useRef,\n} from \"react\";\nimport { cn } from \"../../../lib\";\nimport { Skeleton } from \"../../skeleton\";\nimport { useDataTable, useScrollShadow } from \"../hooks/use-data-table\";\nimport type { DataTablePropsType, DataTableVirtualOptions } from \"../type\";\nimport {\n computeCellSpans,\n getColumnPinningClassName,\n getCommonPinningStyles,\n panelIdFor,\n} from \"../utils\";\nimport {\n Table,\n TableBody,\n TableCell,\n TableHeader,\n TableRow,\n} from \"./base-table\";\nimport { DataTableColumnHeader } from \"./data-table-column-header\";\nimport { DataTablePagination } from \"./data-table-pagination\";\nimport { DataTableVirtualBody } from \"./data-table-virtual-body\";\nimport { RowDragHandle, RowDragHandleContext } from \"./row-drag-handle\";\n\nconst ROW_DND_HANDLE_COLUMN_ID = \"__row_dnd_handle__\";\nconst DEFAULT_SKELETON_ROWS = 8;\n\n/** ReactNode 但语义上等同于\"不渲染\"的值(null / undefined / boolean) */\nfunction isRenderablePanel(value: unknown): value is ReactNode {\n return value !== null && value !== undefined && typeof value !== \"boolean\";\n}\n\n/**\n * 渲染一行 cells —— 处理列合并 / 跨列 / 固定列样式\n *\n * 抽成共享函数,sortable 与非 sortable 两条路径都用同一份单元格生成逻辑\n */\nfunction renderRowCells<TData>(\n row: Row<TData>,\n rowIndex: number,\n cellSpans: ReturnType<typeof computeCellSpans>,\n scrollShadow: ReturnType<typeof useScrollShadow>,\n) {\n return row.getVisibleCells().map((cell) => {\n const span = cellSpans.get(rowIndex)?.get(cell.column.id);\n const rowSpan = span?.rowSpan ?? 1;\n const colSpan = span?.colSpan ?? 1;\n if (rowSpan === 0 || colSpan === 0) return null;\n return (\n <TableCell\n key={cell.id}\n rowSpan={rowSpan > 1 ? rowSpan : undefined}\n colSpan={colSpan > 1 ? colSpan : undefined}\n style={getCommonPinningStyles(cell.column)}\n className={getColumnPinningClassName(cell.column, scrollShadow)}\n >\n {flexRender(cell.column.columnDef.cell, cell.getContext())}\n </TableCell>\n );\n });\n}\n\n/** 渲染展开面板 row —— 跨满全列的单格 TableRow */\nfunction renderExpandedPanel({\n rowId,\n panel,\n visibleColumnCount,\n isSelected,\n style,\n isDragging,\n}: {\n rowId: string;\n panel: ReactNode;\n visibleColumnCount: number;\n isSelected: boolean;\n style?: CSSProperties;\n isDragging?: boolean;\n}) {\n return (\n <TableRow\n id={panelIdFor(rowId)}\n data-slot=\"data-table-expanded-row\"\n data-state={isSelected ? \"selected\" : undefined}\n style={style}\n className={cn(\"bg-muted/30 hover:bg-muted/30\", isDragging && \"shadow-md\")}\n >\n <TableCell colSpan={visibleColumnCount} className=\"p-4\">\n {panel}\n </TableCell>\n </TableRow>\n );\n}\n\nfunction buildRowDndColumn<TData>(): ColumnDef<TData> {\n return {\n id: ROW_DND_HANDLE_COLUMN_ID,\n size: 36,\n enableSorting: false,\n enableHiding: false,\n enableResizing: false,\n enableColumnFilter: false,\n enablePinning: false,\n header: \"\",\n cell: () => <RowDragHandle />,\n };\n}\n\n/** 单行 sortable 包装,把 dnd-kit 属性透传到 TableRow + Context */\nfunction SortableTableRow<TData>({\n row,\n rowIndex,\n cellSpans,\n scrollShadow,\n onRowClick,\n expandedPanel,\n visibleColumnCount,\n}: {\n row: Row<TData>;\n rowIndex: number;\n cellSpans: ReturnType<typeof computeCellSpans>;\n scrollShadow: ReturnType<typeof useScrollShadow>;\n onRowClick?: (row: TData) => void;\n expandedPanel?: ReactNode;\n visibleColumnCount: number;\n}) {\n const {\n attributes,\n listeners,\n setNodeRef,\n setActivatorNodeRef,\n transform,\n transition,\n isDragging,\n } = useSortable({ id: row.id });\n\n const style: CSSProperties = {\n transform: CSS.Transform.toString(transform),\n transition,\n position: isDragging ? \"relative\" : undefined,\n zIndex: isDragging ? 1 : undefined,\n };\n const isSelected = row.getIsSelected();\n const showPanel = expandedPanel !== undefined;\n\n return (\n <RowDragHandleContext.Provider\n value={{ attributes, listeners, setActivatorNodeRef, isDragging }}\n >\n <TableRow\n ref={setNodeRef}\n style={style}\n data-state={isSelected ? \"selected\" : undefined}\n className={cn(\n isDragging && \"bg-muted/70 shadow-md\",\n onRowClick && \"cursor-pointer\",\n )}\n onClick={onRowClick ? () => onRowClick(row.original) : undefined}\n >\n {renderRowCells(row, rowIndex, cellSpans, scrollShadow)}\n </TableRow>\n {showPanel\n ? renderExpandedPanel({\n rowId: row.id,\n panel: expandedPanel,\n visibleColumnCount,\n isSelected,\n style,\n isDragging,\n })\n : null}\n </RowDragHandleContext.Provider>\n );\n}\n\n/**\n * DataTable 暴露给 ref 的命令式 handle —— 就是底层 TanStack table 实例\n *\n * 通过 `ref` 即可拿到完整的 TanStack `table` API:`setPageIndex`、`getSelectedRowModel`、\n * `resetSorting`、`getState` 等。配合受控状态使用更顺手\n */\nexport type DataTableHandle<TData> = TanstackTable<TData>;\n\n/**\n * 全功能数据表格\n *\n * 在 `Table` 基础组件之上,基于 `@tanstack/react-table`\n * 提供排序、筛选、分页、行选择、列显隐 / 拖拽 / 固定 / 调宽、行虚拟滚动、行拖拽排序等能力\n *\n * 可通过 `ref` 拿到底层 TanStack `table` 实例 ([[DataTableHandle]]) 进行命令式操作\n */\nfunction DataTableInner<TData, TValue = unknown>(\n {\n columns,\n data,\n loading,\n state,\n initialState,\n onStateChange,\n features,\n renderToolbar,\n renderPagination,\n empty = \"暂无数据\",\n pageSizeOptions,\n className,\n tableClassName,\n onRowClick,\n onRowOrderChange,\n rowDndHandle = \"auto\",\n tableOptions,\n virtual = false,\n bordered = false,\n expandedRowRender,\n }: DataTablePropsType<TData, TValue>,\n ref: Ref<DataTableHandle<TData>>,\n) {\n const virtualEnabled = Boolean(virtual);\n const virtualOptions: DataTableVirtualOptions | undefined =\n virtual && typeof virtual === \"object\" ? virtual : undefined;\n\n const rowDndEnabled = !virtualEnabled && Boolean(features?.rowDnd);\n const autoHandle = rowDndEnabled && rowDndHandle === \"auto\";\n const expandedRowRenderEffective = virtualEnabled\n ? undefined\n : expandedRowRender;\n\n const virtualConflicts =\n virtualEnabled &&\n Boolean(features?.rowDnd || features?.expanding || expandedRowRender);\n const rowDndMissingGetRowId = rowDndEnabled && !tableOptions?.getRowId;\n useEffect(() => {\n if (virtualConflicts) {\n console.warn(\n \"[DataTable] virtual 模式与 rowDnd / expanding / expandedRowRender 不兼容,已自动忽略相关功能\",\n );\n }\n if (rowDndMissingGetRowId) {\n console.warn(\n \"[DataTable] 启用 features.rowDnd 时,请通过 tableOptions.getRowId 提供稳定的行 id,否则拖拽顺序会错乱\",\n );\n }\n }, [virtualConflicts, rowDndMissingGetRowId]);\n\n const effectiveFeatures = virtualEnabled\n ? { ...features, pagination: false, rowDnd: false, expanding: false }\n : features;\n\n // 仅当 rowDnd 启用 且 手柄模式为 auto 时,自动在最左侧追加一列拖拽手柄\n const effectiveColumns = useMemo(\n () =>\n autoHandle && !columns.some((c) => c.id === ROW_DND_HANDLE_COLUMN_ID)\n ? [buildRowDndColumn<TData>(), ...columns]\n : columns,\n [columns, autoHandle],\n );\n\n // 传了 expandedRowRender 但用户没自定义 getRowCanExpand 时,默认所有行都可展开\n const effectiveTableOptions = useMemo(() => {\n if (!expandedRowRenderEffective) return tableOptions;\n if (tableOptions?.getRowCanExpand) return tableOptions;\n return { ...tableOptions, getRowCanExpand: () => true };\n }, [tableOptions, expandedRowRenderEffective]);\n\n const { table, features: mergedFeatures } = useDataTable<TData, TValue>({\n data,\n columns: effectiveColumns,\n features: effectiveFeatures,\n state,\n initialState,\n onStateChange,\n tableOptions: effectiveTableOptions,\n });\n\n // 把 TanStack table 实例直接作为命令式 handle 暴露给外部 ref\n useImperativeHandle(ref, () => table, [table]);\n\n const wrapperRef = useRef<HTMLDivElement>(null);\n const scrollShadow = useScrollShadow(wrapperRef);\n\n const visibleLeafColumns = table.getVisibleLeafColumns();\n const visibleColumnCount = visibleLeafColumns.length;\n const rows = table.getRowModel().rows;\n // 显式重算:TanStack 每次 getRowModel/getVisibleLeafColumns 都返回新引用,\n // useMemo 的依赖永远变;改让 React Compiler 自行决定是否缓存\n const cellSpans = computeCellSpans(rows, visibleLeafColumns);\n\n // 行拖拽 sortable id 列表(行 id 由 tableOptions.getRowId 决定,缺省时为索引)\n const rowIds = rows.map((row) => row.id);\n const sensors = useSensors(\n useSensor(PointerSensor, { activationConstraint: { distance: 5 } }),\n useSensor(KeyboardSensor, {\n coordinateGetter: sortableKeyboardCoordinates,\n }),\n );\n\n const handleDragEnd = (event: DragEndEvent) => {\n const { active, over } = event;\n if (!over || active.id === over.id) return;\n const oldIndex = rows.findIndex((row) => row.id === String(active.id));\n const newIndex = rows.findIndex((row) => row.id === String(over.id));\n if (oldIndex === -1 || newIndex === -1) return;\n const nextData = arrayMove(data, oldIndex, newIndex);\n onRowOrderChange?.(nextData, {\n oldIndex,\n newIndex,\n activeId: String(active.id),\n overId: String(over.id),\n });\n };\n\n const toolbarNode = renderToolbar?.(table);\n\n const skeletonRowCount = mergedFeatures.pagination\n ? table.getState().pagination.pageSize\n : DEFAULT_SKELETON_ROWS;\n\n const bodyContent = loading ? (\n Array.from({ length: skeletonRowCount }).map((_, rowIndex) => (\n <TableRow key={`loading-${rowIndex}`}>\n {table.getVisibleLeafColumns().map((column) => (\n <TableCell\n key={column.id}\n style={getCommonPinningStyles(column)}\n className={getColumnPinningClassName(column, scrollShadow)}\n >\n <Skeleton className=\"h-4 w-full\" />\n </TableCell>\n ))}\n </TableRow>\n ))\n ) : rows.length ? (\n rows.map((row, rowIndex) => {\n const rawPanel =\n expandedRowRenderEffective && row.getIsExpanded()\n ? expandedRowRenderEffective(row)\n : undefined;\n const expandedPanel = isRenderablePanel(rawPanel) ? rawPanel : undefined;\n const isSelected = row.getIsSelected();\n\n if (rowDndEnabled) {\n return (\n <SortableTableRow\n key={row.id}\n row={row}\n rowIndex={rowIndex}\n cellSpans={cellSpans}\n scrollShadow={scrollShadow}\n onRowClick={onRowClick}\n expandedPanel={expandedPanel}\n visibleColumnCount={visibleColumnCount}\n />\n );\n }\n\n // 无展开面板:直接返回带 key 的 TableRow,避免无意义的 Fragment 包裹\n if (expandedPanel === undefined) {\n return (\n <TableRow\n key={row.id}\n data-state={isSelected ? \"selected\" : undefined}\n className={onRowClick ? \"cursor-pointer\" : undefined}\n onClick={onRowClick ? () => onRowClick(row.original) : undefined}\n >\n {renderRowCells(row, rowIndex, cellSpans, scrollShadow)}\n </TableRow>\n );\n }\n\n // 有展开面板:主行 + 面板 row 作为兄弟节点共用一个 Fragment key\n return (\n <Fragment key={row.id}>\n <TableRow\n data-state={isSelected ? \"selected\" : undefined}\n className={onRowClick ? \"cursor-pointer\" : undefined}\n onClick={onRowClick ? () => onRowClick(row.original) : undefined}\n >\n {renderRowCells(row, rowIndex, cellSpans, scrollShadow)}\n </TableRow>\n {renderExpandedPanel({\n rowId: row.id,\n panel: expandedPanel,\n visibleColumnCount,\n isSelected,\n })}\n </Fragment>\n );\n })\n ) : (\n <TableRow>\n <TableCell\n colSpan={visibleColumnCount}\n className=\"text-muted-foreground h-24 text-center\"\n >\n {empty}\n </TableCell>\n </TableRow>\n );\n\n const standardBody = (\n <div\n ref={wrapperRef}\n className={cn(\n \"rounded-md\",\n bordered &&\n \"border [&_td]:border-r [&_th]:border-r [&_tr>*:last-child]:border-r-0\",\n tableClassName,\n )}\n >\n <Table\n className=\"min-w-max\"\n style={\n mergedFeatures.columnResizing\n ? { width: table.getTotalSize() }\n : undefined\n }\n >\n <TableHeader>\n {table.getHeaderGroups().map((headerGroup) => (\n <TableRow key={headerGroup.id}>\n {headerGroup.headers.map((header) => (\n <DataTableColumnHeader\n key={header.id}\n header={header}\n resizable={mergedFeatures.columnResizing}\n scrollShadow={scrollShadow}\n />\n ))}\n </TableRow>\n ))}\n </TableHeader>\n <TableBody>\n {rowDndEnabled ? (\n <SortableContext\n items={rowIds}\n strategy={verticalListSortingStrategy}\n >\n {bodyContent}\n </SortableContext>\n ) : (\n bodyContent\n )}\n </TableBody>\n </Table>\n </div>\n );\n\n const bodyNode = virtualEnabled ? (\n <DataTableVirtualBody\n table={table}\n loading={loading}\n empty={empty}\n options={virtualOptions}\n bordered={bordered}\n className={tableClassName}\n />\n ) : rowDndEnabled ? (\n <DndContext\n sensors={sensors}\n collisionDetection={closestCenter}\n modifiers={[restrictToVerticalAxis]}\n onDragEnd={handleDragEnd}\n >\n {standardBody}\n </DndContext>\n ) : (\n standardBody\n );\n\n return (\n <div data-slot=\"data-table\" className={cn(\"flex flex-col\", className)}>\n {toolbarNode}\n {bodyNode}\n {mergedFeatures.pagination &&\n (renderPagination !== undefined ? (\n renderPagination(table)\n ) : (\n <DataTablePagination\n table={table}\n pageSizeOptions={pageSizeOptions}\n />\n ))}\n </div>\n );\n}\n\n/**\n * forwardRef 包装,泛型用 cast 保留 —— 否则会被 forwardRef 的签名擦除成 unknown\n */\nconst DataTable = forwardRef(DataTableInner) as <TData, TValue = unknown>(\n props: DataTablePropsType<TData, TValue> &\n RefAttributes<DataTableHandle<TData>>,\n) => ReactElement | null;\n\nexport { DataTable };\n","\"use client\";\n\nimport {\n closestCenter,\n DndContext,\n type DragEndEvent,\n KeyboardSensor,\n PointerSensor,\n useSensor,\n useSensors,\n} from \"@dnd-kit/core\";\nimport { restrictToVerticalAxis } from \"@dnd-kit/modifiers\";\nimport {\n arrayMove,\n SortableContext,\n sortableKeyboardCoordinates,\n useSortable,\n verticalListSortingStrategy,\n} from \"@dnd-kit/sortable\";\nimport { CSS } from \"@dnd-kit/utilities\";\nimport type { Table as TanstackTable } from \"@tanstack/react-table\";\nimport { GripVerticalIcon, Settings2Icon } from \"lucide-react\";\nimport {\n type CSSProperties,\n type MouseEvent,\n type ReactElement,\n type ReactNode,\n} from \"react\";\nimport { cn } from \"../../../lib\";\nimport { Button } from \"../../button\";\nimport {\n DropdownMenu,\n DropdownMenuCheckboxItem,\n DropdownMenuContent,\n DropdownMenuGroup,\n DropdownMenuLabel,\n DropdownMenuSeparator,\n DropdownMenuTrigger,\n} from \"../../dropdown-menu\";\nimport type { AnyColumn } from \"../type\";\n\ntype DataTableViewOptionsProps<TData> = {\n table: TanstackTable<TData>;\n /** 是否允许列拖拽排序,默认 false */\n enableOrdering?: boolean;\n /** 是否允许列固定操作,默认 false */\n enablePinning?: boolean;\n /** 触发按钮自定义,默认 \"视图\" */\n trigger?: ReactElement;\n};\n\n/**\n * 列显隐 / 排序 / 固定 设置面板\n *\n * 通过 DropdownMenu 弹出列表,内置 DnD-Kit 排序与固定按钮\n */\nexport function DataTableViewOptions<TData>({\n table,\n enableOrdering = false,\n enablePinning = false,\n trigger,\n}: DataTableViewOptionsProps<TData>) {\n const draggableColumns = table\n .getAllLeafColumns()\n .filter((column) => column.getCanHide());\n const draggableColumnIds = draggableColumns.map((column) => column.id);\n\n const sensors = useSensors(\n useSensor(PointerSensor, { activationConstraint: { distance: 5 } }),\n useSensor(KeyboardSensor, {\n coordinateGetter: sortableKeyboardCoordinates,\n }),\n );\n\n const handleDragEnd = ({ active, over }: DragEndEvent) => {\n if (!over || active.id === over.id) return;\n const currentOrder = table.getState().columnOrder;\n const allColumnIds = table.getAllLeafColumns().map((column) => column.id);\n const orderedColumnIds = currentOrder.length\n ? currentOrder.filter((columnId) => allColumnIds.includes(columnId))\n : allColumnIds;\n const nextOrder = [\n ...orderedColumnIds,\n ...allColumnIds.filter(\n (columnId) => !orderedColumnIds.includes(columnId),\n ),\n ];\n const oldIndex = nextOrder.indexOf(String(active.id));\n const newIndex = nextOrder.indexOf(String(over.id));\n if (oldIndex === -1 || newIndex === -1) return;\n table.setColumnOrder(arrayMove(nextOrder, oldIndex, newIndex));\n };\n\n const items = enableOrdering ? draggableColumnIds : [];\n\n return (\n <DropdownMenu>\n <DropdownMenuTrigger\n render={\n trigger ?? (\n <Button variant=\"outline\" size=\"sm\">\n <Settings2Icon />\n 视图\n </Button>\n )\n }\n />\n <DropdownMenuContent align=\"end\" className=\"min-w-56\">\n <DropdownMenuGroup>\n <DropdownMenuLabel>显示的列</DropdownMenuLabel>\n </DropdownMenuGroup>\n <DropdownMenuSeparator />\n {enableOrdering ? (\n <DndContext\n sensors={sensors}\n collisionDetection={closestCenter}\n modifiers={[restrictToVerticalAxis]}\n onDragEnd={handleDragEnd}\n >\n <SortableContext\n items={items}\n strategy={verticalListSortingStrategy}\n >\n {draggableColumns.map((column) => (\n <SortableColumnItem\n key={column.id}\n column={column}\n enablePinning={enablePinning}\n />\n ))}\n </SortableContext>\n </DndContext>\n ) : (\n draggableColumns.map((column) => (\n <ColumnVisibilityItem\n key={column.id}\n column={column}\n enablePinning={enablePinning}\n />\n ))\n )}\n </DropdownMenuContent>\n </DropdownMenu>\n );\n}\n\ntype ColumnItemProps<TData> = {\n column: AnyColumn<TData>;\n enablePinning?: boolean;\n};\n\n/**\n * 列设置项内部统一渲染:复选 + 列名 + 可选固定操作\n */\nfunction ColumnItemBody<TData>({\n column,\n enablePinning,\n dragHandle,\n}: ColumnItemProps<TData> & { dragHandle?: ReactNode }) {\n const pinned = column.getIsPinned();\n const canPin = enablePinning && column.getCanPin();\n\n const handlePinClick = (\n event: MouseEvent<HTMLButtonElement>,\n position: \"left\" | \"right\" | false,\n ) => {\n event.preventDefault();\n event.stopPropagation();\n column.pin(position);\n };\n\n return (\n <DropdownMenuCheckboxItem\n className=\"capitalize\"\n checked={column.getIsVisible()}\n onCheckedChange={(value) => column.toggleVisibility(!!value)}\n >\n {dragHandle}\n <span className=\"min-w-20 flex-1\">{column.id}</span>\n {canPin && (\n <span\n className=\"ml-auto mr-5 flex items-center gap-1 normal-case\"\n onClick={(event) => event.stopPropagation()}\n onPointerDown={(event) => event.stopPropagation()}\n >\n <Button\n type=\"button\"\n variant={pinned === \"left\" ? \"default\" : \"ghost\"}\n size=\"xs\"\n onClick={(event) => handlePinClick(event, \"left\")}\n >\n 左\n </Button>\n <Button\n type=\"button\"\n variant={pinned ? \"ghost\" : \"default\"}\n size=\"xs\"\n onClick={(event) => handlePinClick(event, false)}\n >\n 无\n </Button>\n <Button\n type=\"button\"\n variant={pinned === \"right\" ? \"default\" : \"ghost\"}\n size=\"xs\"\n onClick={(event) => handlePinClick(event, \"right\")}\n >\n 右\n </Button>\n </span>\n )}\n </DropdownMenuCheckboxItem>\n );\n}\n\nfunction ColumnVisibilityItem<TData>({\n column,\n enablePinning,\n}: ColumnItemProps<TData>) {\n return <ColumnItemBody column={column} enablePinning={enablePinning} />;\n}\n\nfunction SortableColumnItem<TData>({\n column,\n enablePinning,\n}: ColumnItemProps<TData>) {\n const {\n attributes,\n listeners,\n setActivatorNodeRef,\n setNodeRef,\n transform,\n transition,\n isDragging,\n } = useSortable({ id: column.id });\n\n const style: CSSProperties = {\n transform: CSS.Transform.toString(transform),\n transition,\n };\n\n return (\n <div\n ref={setNodeRef}\n style={style}\n className={cn(isDragging && \"relative z-10 opacity-80\")}\n >\n <ColumnItemBody\n column={column}\n enablePinning={enablePinning}\n dragHandle={\n <span\n ref={setActivatorNodeRef}\n className=\"cursor-grab active:cursor-grabbing\"\n aria-label={`Reorder ${column.id} column`}\n onClick={(event) => event.stopPropagation()}\n {...attributes}\n {...listeners}\n >\n <GripVerticalIcon className=\"size-[1em]\" />\n </span>\n }\n />\n </div>\n );\n}\n","\"use client\";\n\nimport type { Table as TanstackTable } from \"@tanstack/react-table\";\nimport { SearchIcon, XIcon } from \"lucide-react\";\nimport { type ReactNode } from \"react\";\nimport { cn } from \"../../../lib\";\nimport { Button } from \"../../button\";\nimport { Input } from \"../../input\";\nimport { DataTableViewOptions } from \"./data-table-view-options\";\n\ntype DataTableToolbarProps<TData> = {\n table: TanstackTable<TData>;\n /** 绑定搜索输入框的列 id;留空则使用全局过滤 */\n searchColumnId?: string;\n /** 输入框 placeholder */\n searchPlaceholder?: string;\n /** 是否展示视图配置(列显隐),默认 true */\n showViewOptions?: boolean;\n /** 是否启用列拖拽 */\n enableColumnOrdering?: boolean;\n /** 是否启用列固定 */\n enableColumnPinning?: boolean;\n /** 工具栏右侧追加内容 */\n extra?: ReactNode;\n className?: string;\n};\n\n/**\n * 表格工具栏:搜索 + 视图配置 + 自定义扩展\n */\nexport function DataTableToolbar<TData>({\n table,\n searchColumnId,\n searchPlaceholder = \"搜索...\",\n showViewOptions = true,\n enableColumnOrdering,\n enableColumnPinning,\n extra,\n className,\n}: DataTableToolbarProps<TData>) {\n const searchColumn = searchColumnId\n ? table.getColumn(searchColumnId)\n : undefined;\n const useGlobalFilter = !searchColumn;\n const value = useGlobalFilter\n ? table.getState().globalFilter\n : (searchColumn?.getFilterValue() as string | undefined);\n const hasValue = Boolean(value);\n\n const handleChange = (next: string) => {\n if (useGlobalFilter) {\n table.setGlobalFilter(next);\n } else {\n searchColumn?.setFilterValue(next || undefined);\n }\n };\n\n return (\n <div\n data-slot=\"data-table-toolbar\"\n className={cn(\"flex flex-wrap items-center gap-2 py-3\", className)}\n >\n <div className=\"relative max-w-sm flex-1\">\n <SearchIcon className=\"text-muted-foreground pointer-events-none absolute left-2.5 top-1/2 size-4 -translate-y-1/2\" />\n <Input\n placeholder={searchPlaceholder}\n value={value ?? \"\"}\n onChange={(event) => handleChange(event.target.value)}\n className=\"pl-8 pr-8\"\n />\n {hasValue && (\n <Button\n type=\"button\"\n variant=\"ghost\"\n size=\"icon-xs\"\n className=\"absolute right-1 top-1/2 -translate-y-1/2\"\n aria-label=\"清除搜索\"\n onClick={() => handleChange(\"\")}\n >\n <XIcon />\n </Button>\n )}\n </div>\n <div className=\"ml-auto flex items-center gap-2\">\n {extra}\n {showViewOptions && (\n <DataTableViewOptions\n table={table}\n enableOrdering={enableColumnOrdering}\n enablePinning={enableColumnPinning}\n />\n )}\n </div>\n </div>\n );\n}\n","\"use client\";\n\nimport type { Row } from \"@tanstack/react-table\";\nimport { ChevronRightIcon } from \"lucide-react\";\nimport type { ComponentProps } from \"react\";\nimport { cn } from \"../../../lib\";\nimport { panelIdFor } from \"../utils\";\n\ntype RowExpandTogglePropsType<TData> = Omit<\n ComponentProps<\"button\">,\n \"onClick\" | \"children\"\n> & {\n /** 当前行实例 */\n row: Row<TData>;\n /**\n * 嵌套树场景下,每层缩进的像素数;设为 0 关闭自动缩进\n *\n * 默认 16,即每深一层缩进 16px\n */\n indent?: number;\n /** 当行无可展开子项时是否仍占位渲染(保持对齐),默认 true */\n placeholder?: boolean;\n};\n\n/**\n * 行展开切换按钮:基于 `row.getToggleExpandedHandler` + `row.depth` 自动缩进\n *\n * 配合 `features.expanding` 与 `tableOptions.getSubRows`(嵌套树),或 `expandedRowRender`(展开面板)使用\n */\nexport function RowExpandToggle<TData>({\n row,\n indent = 16,\n placeholder = true,\n className,\n ...props\n}: RowExpandTogglePropsType<TData>) {\n const paddingLeft = indent > 0 ? row.depth * indent : 0;\n const canExpand = row.getCanExpand();\n const isExpanded = row.getIsExpanded();\n\n if (!canExpand) {\n if (!placeholder) return null;\n return (\n <span\n aria-hidden\n className=\"inline-flex size-6 shrink-0\"\n style={paddingLeft ? { marginLeft: paddingLeft } : undefined}\n />\n );\n }\n\n // 嵌套树场景下,展开生成的是子行而非面板;只有\"叶子但可展开\"(即 expandedRowRender 场景)\n // 才有对应的面板 row,此时才有 aria-controls 目标\n const hasPanelTarget = row.subRows.length === 0;\n\n return (\n <button\n type=\"button\"\n aria-label={isExpanded ? \"收起\" : \"展开\"}\n aria-expanded={isExpanded}\n aria-controls={\n isExpanded && hasPanelTarget ? panelIdFor(row.id) : undefined\n }\n onClick={row.getToggleExpandedHandler()}\n className={cn(\n \"text-muted-foreground hover:text-foreground inline-flex size-6 shrink-0 cursor-pointer items-center justify-center rounded-md transition-colors focus-visible:outline-none\",\n className,\n )}\n style={paddingLeft ? { marginLeft: paddingLeft } : undefined}\n {...props}\n >\n <ChevronRightIcon\n className={cn(\n \"size-4 transition-transform\",\n isExpanded ? \"rotate-90\" : \"rotate-0\",\n )}\n />\n </button>\n );\n}\n"],"mappings":"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"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "lynote-ui",
|
|
3
|
-
"version": "0.0.
|
|
3
|
+
"version": "0.0.11",
|
|
4
4
|
"description": "Reusable React UI component library.",
|
|
5
5
|
"source": "./src/index.ts",
|
|
6
6
|
"main": "./dist/index.js",
|
|
@@ -338,9 +338,14 @@
|
|
|
338
338
|
},
|
|
339
339
|
"dependencies": {
|
|
340
340
|
"@base-ui/react": "^1.4.1",
|
|
341
|
+
"@dnd-kit/core": "^6.3.1",
|
|
342
|
+
"@dnd-kit/modifiers": "^9.0.0",
|
|
343
|
+
"@dnd-kit/sortable": "^10.0.0",
|
|
344
|
+
"@dnd-kit/utilities": "^3.2.2",
|
|
341
345
|
"@hookform/resolvers": "^5.2.2",
|
|
342
346
|
"@radix-ui/react-slot": "^1.2.4",
|
|
343
347
|
"@tanstack/react-table": "^8.21.3",
|
|
348
|
+
"@tanstack/react-virtual": "^3.13.25",
|
|
344
349
|
"class-variance-authority": "^0.7.1",
|
|
345
350
|
"clsx": "^2.1.1",
|
|
346
351
|
"cmdk": "^1.1.1",
|
|
@@ -362,6 +367,7 @@
|
|
|
362
367
|
"devDependencies": {
|
|
363
368
|
"@tailwindcss/postcss": "4.2.2",
|
|
364
369
|
"@tailwindcss/vite": "^4.2.2",
|
|
370
|
+
"@tanstack/react-query": "^5.100.11",
|
|
365
371
|
"@vitejs/plugin-react": "^6.0.1",
|
|
366
372
|
"chrono-node": "^2.9.0",
|
|
367
373
|
"tailwindcss": "^4.1.18",
|
package/dist/table/index.js.map
DELETED
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","names":[],"sources":["../../src/table/index.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"],"mappings":";;;;;;;;AAMA,SAAS,MAAM,EAAE,WAAW,GAAG,SAAwC;AACrE,QACE,iBAAA,GAAA,kBAAA,KAAC,OAAD;EACE,aAAU;EACV,WAAU;YAEV,iBAAA,GAAA,kBAAA,KAAC,SAAD;GACE,aAAU;GACV,WAAW,cAAA,GAAG,iCAAiC,UAAU;GACzD,GAAI;GACJ,CAAA;EACE,CAAA;;AAIV,SAAS,YAAY,EAAE,WAAW,GAAG,SAAwC;AAC3E,QACE,iBAAA,GAAA,kBAAA,KAAC,SAAD;EACE,aAAU;EACV,WAAW,cAAA,GAAG,mBAAmB,UAAU;EAC3C,GAAI;EACJ,CAAA;;AAIN,SAAS,UAAU,EAAE,WAAW,GAAG,SAAwC;AACzE,QACE,iBAAA,GAAA,kBAAA,KAAC,SAAD;EACE,aAAU;EACV,WAAW,cAAA,GAAG,8BAA8B,UAAU;EACtD,GAAI;EACJ,CAAA;;AAIN,SAAS,YAAY,EAAE,WAAW,GAAG,SAAwC;AAC3E,QACE,iBAAA,GAAA,kBAAA,KAAC,SAAD;EACE,aAAU;EACV,WAAW,cAAA,GACT,2DACA,UACD;EACD,GAAI;EACJ,CAAA;;AAIN,SAAS,SAAS,EAAE,WAAW,GAAG,SAAqC;AACrE,QACE,iBAAA,GAAA,kBAAA,KAAC,MAAD;EACE,aAAU;EACV,WAAW,cAAA,GACT,+EACA,UACD;EACD,GAAI;EACJ,CAAA;;AAIN,SAAS,UAAU,EAAE,WAAW,GAAG,SAAqC;AACtE,QACE,iBAAA,GAAA,kBAAA,KAAC,MAAD;EACE,aAAU;EACV,WAAW,cAAA,GACT,gHACA,UACD;EACD,GAAI;EACJ,CAAA;;AAIN,SAAS,UAAU,EAAE,WAAW,GAAG,SAAqC;AACtE,QACE,iBAAA,GAAA,kBAAA,KAAC,MAAD;EACE,aAAU;EACV,WAAW,cAAA,GACT,oEACA,UACD;EACD,GAAI;EACJ,CAAA;;AAIN,SAAS,aAAa,EACpB,WACA,GAAG,SAC+B;AAClC,QACE,iBAAA,GAAA,kBAAA,KAAC,WAAD;EACE,aAAU;EACV,WAAW,cAAA,GAAG,sCAAsC,UAAU;EAC9D,GAAI;EACJ,CAAA"}
|
package/dist/table/index.mjs.map
DELETED
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"index.mjs","names":[],"sources":["../../src/table/index.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"],"mappings":";;;;;AAMA,SAAS,MAAM,EAAE,WAAW,GAAG,SAAwC;AACrE,QACE,oBAAC,OAAD;EACE,aAAU;EACV,WAAU;YAEV,oBAAC,SAAD;GACE,aAAU;GACV,WAAW,GAAG,iCAAiC,UAAU;GACzD,GAAI;GACJ,CAAA;EACE,CAAA;;AAIV,SAAS,YAAY,EAAE,WAAW,GAAG,SAAwC;AAC3E,QACE,oBAAC,SAAD;EACE,aAAU;EACV,WAAW,GAAG,mBAAmB,UAAU;EAC3C,GAAI;EACJ,CAAA;;AAIN,SAAS,UAAU,EAAE,WAAW,GAAG,SAAwC;AACzE,QACE,oBAAC,SAAD;EACE,aAAU;EACV,WAAW,GAAG,8BAA8B,UAAU;EACtD,GAAI;EACJ,CAAA;;AAIN,SAAS,YAAY,EAAE,WAAW,GAAG,SAAwC;AAC3E,QACE,oBAAC,SAAD;EACE,aAAU;EACV,WAAW,GACT,2DACA,UACD;EACD,GAAI;EACJ,CAAA;;AAIN,SAAS,SAAS,EAAE,WAAW,GAAG,SAAqC;AACrE,QACE,oBAAC,MAAD;EACE,aAAU;EACV,WAAW,GACT,+EACA,UACD;EACD,GAAI;EACJ,CAAA;;AAIN,SAAS,UAAU,EAAE,WAAW,GAAG,SAAqC;AACtE,QACE,oBAAC,MAAD;EACE,aAAU;EACV,WAAW,GACT,gHACA,UACD;EACD,GAAI;EACJ,CAAA;;AAIN,SAAS,UAAU,EAAE,WAAW,GAAG,SAAqC;AACtE,QACE,oBAAC,MAAD;EACE,aAAU;EACV,WAAW,GACT,oEACA,UACD;EACD,GAAI;EACJ,CAAA;;AAIN,SAAS,aAAa,EACpB,WACA,GAAG,SAC+B;AAClC,QACE,oBAAC,WAAD;EACE,aAAU;EACV,WAAW,GAAG,sCAAsC,UAAU;EAC9D,GAAI;EACJ,CAAA"}
|