@signalflare-ai/ui 1.3.0 → 1.4.0
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/CHANGELOG.md +77 -0
- package/dist/.build-complete +1 -1
- package/dist/components/data-grid.js +1 -1
- package/dist/{data-grid-DDSFMHud.js → data-grid-DrguJq_H.js} +59 -52
- package/dist/data-grid-DrguJq_H.js.map +1 -0
- package/dist/index.js +1 -1
- package/dist/src/components/data-grid/data-grid.d.ts.map +1 -1
- package/package.json +3 -3
- package/dist/data-grid-DDSFMHud.js.map +0 -1
package/CHANGELOG.md
CHANGED
|
@@ -1,5 +1,82 @@
|
|
|
1
1
|
# @signalflare-ai/ui
|
|
2
2
|
|
|
3
|
+
## 1.4.0
|
|
4
|
+
|
|
5
|
+
### Minor Changes
|
|
6
|
+
|
|
7
|
+
- ab31a2f: `useConversationVirtualizer` now uses TanStack Virtual's end-anchored chat mode for scroll physics. Streaming growth of the last message keeps the viewport pinned, newly appended messages auto-follow only when the user is already at the bottom (`followOnAppend`), and prepending older history keeps the visible message stable (`anchorTo: "end"`). This replaces the previous manual stick-to-bottom bookkeeping. Bumps `@tanstack/react-virtual` to `^3.13.26` (pulls in `@tanstack/virtual-core@3.16.0`).
|
|
8
|
+
|
|
9
|
+
Also fixes a noisy dev warning in `useMeasuredText`: the `system-ui` font-family warning now only fires when `system-ui` is the _first_ (effective) family in the stack, and only once per session, instead of on every measured element that merely lists it as a trailing fallback.
|
|
10
|
+
|
|
11
|
+
- ab31a2f: **DataGrid: migrate to TanStack Table v9 and add row virtualization**
|
|
12
|
+
|
|
13
|
+
`DataGrid` now uses `@tanstack/react-table@9` (modular, tree-shakeable
|
|
14
|
+
architecture) instead of v8. Internally this swaps `useReactTable` for
|
|
15
|
+
`useTable` with explicit `_features` and `_rowModels`, but the public
|
|
16
|
+
`DataGrid` API is unchanged — columns, sorting, filtering, pagination, row
|
|
17
|
+
selection, column visibility, and column resizing all behave as before.
|
|
18
|
+
|
|
19
|
+
Added opt-in row virtualization for large datasets via
|
|
20
|
+
`@tanstack/react-virtual`. Only the visible window of rows (plus overscan) is
|
|
21
|
+
rendered, using a spacer-row technique that preserves semantic
|
|
22
|
+
`<table>/<thead>/<tbody>` markup, sticky headers, and column resizing.
|
|
23
|
+
|
|
24
|
+
New props:
|
|
25
|
+
|
|
26
|
+
- `virtualized` — enable row virtualization (default `false`).
|
|
27
|
+
- `estimatedRowHeight` — estimated row height in px for the virtualizer
|
|
28
|
+
(default `44`).
|
|
29
|
+
- `overscan` — number of rows to render beyond the viewport (default `8`).
|
|
30
|
+
- `maxHeight` — bounded scroll height for the virtualized body
|
|
31
|
+
(`number | string`).
|
|
32
|
+
|
|
33
|
+
When `virtualized` is enabled, `DataGrid.Content` owns its own bounded scroll
|
|
34
|
+
container, so the outer wrapper no longer scrolls.
|
|
35
|
+
|
|
36
|
+
### Patch Changes
|
|
37
|
+
|
|
38
|
+
- ab31a2f: Register `AiCodeBlockCopyButton` as the `AiCodeBlock.CopyButton` sub-component so the docs API reference no longer shows a "Component not found in registry" warning. The standalone `AiCodeBlockCopyButton` export is unchanged. Also extended the registry sub-component prop extractor to read props from `type` aliases (e.g. `type FooProps = ComponentProps<X> & { ... }`), not just `interface` declarations.
|
|
39
|
+
- ab31a2f: Fix `Text` measured modes (`balance`/`shrink`/`reserve`) wrapping prematurely in
|
|
40
|
+
auto-width containers. The measurement hook now measures against the parent's
|
|
41
|
+
content-box width instead of the `inline-block` element's own shrink-to-fit box,
|
|
42
|
+
so headings and other measured text no longer collapse and wrap when an ancestor
|
|
43
|
+
doesn't set an explicit `max-width` (e.g. inside `Empty`).
|
|
44
|
+
|
|
45
|
+
Also fix a visible wrap flash on load and during SSR. Several causes, all
|
|
46
|
+
addressed:
|
|
47
|
+
|
|
48
|
+
- **SSR no longer ships a width-less `inline-block`.** Measured text now renders
|
|
49
|
+
in normal block/inline flow until the first client measurement lands (the
|
|
50
|
+
`inline-block` + `maxWidth` is applied only after measuring). `measured` is
|
|
51
|
+
false on both the server and the first client render, so hydration matches
|
|
52
|
+
exactly and first paint wraps the way the browser naturally would, instead of
|
|
53
|
+
shrink-wrapping an unconstrained `inline-block`.
|
|
54
|
+
- **The hook measured twice.** The first pass ran with the default font
|
|
55
|
+
(`16px sans-serif`) routed through React state; the resulting state update
|
|
56
|
+
triggered a second, _animated_ pass with the real computed font. Font metrics
|
|
57
|
+
are now read synchronously from the DOM inside `measure()`, so a single correct
|
|
58
|
+
measurement lands.
|
|
59
|
+
- **`ResizeObserver` feedback loop removed.** It now watches the parent, skips
|
|
60
|
+
its synthetic initial callback, and no longer re-measures in response to the
|
|
61
|
+
element's own measured-width changes.
|
|
62
|
+
- The `text-wrap: balance` pre-measurement fallback is removed, and the
|
|
63
|
+
`max-width`/`min-height` transition only animates changes after the initial
|
|
64
|
+
measurement settles, not the first one.
|
|
65
|
+
|
|
66
|
+
- ab31a2f: Fix Storybook story tests under Vitest 4 and run Storybook in `bun dev`.
|
|
67
|
+
|
|
68
|
+
- Migrate the Vitest browser config to the Vitest 4 API: the storybook
|
|
69
|
+
project now uses the `playwright()` provider factory instead of the
|
|
70
|
+
`provider: "playwright"` string, and pins `@vitest/browser-playwright`.
|
|
71
|
+
- Add a `@signalflare-ai/ui/components/chart` resolve alias so subpath
|
|
72
|
+
imports resolve to source in tests, matching the bare `@signalflare-ai/ui`
|
|
73
|
+
alias. Without it the test module graph mixed `src` and `dist`, breaking
|
|
74
|
+
`metrics-overview.stories.tsx`.
|
|
75
|
+
- `bun dev` now runs codegen, then starts Storybook (port 6006, exposing the
|
|
76
|
+
addon-mcp endpoint) and the docs site (port 4321) concurrently.
|
|
77
|
+
|
|
78
|
+
- ab31a2f: `Text` now defaults all variants to `wrap="natural"`, including headings. Previously `heading1/2/3` defaulted to `wrap="balance"`, which silently enabled measured/balanced wrapping. In unbounded or shrink-to-fit containers the measured width collapses, causing headings to wrap prematurely. Balanced wrapping is now fully opt-in via `wrap="balance"` and should only be used inside width-constrained containers.
|
|
79
|
+
|
|
3
80
|
## 1.3.0
|
|
4
81
|
|
|
5
82
|
### Minor Changes
|
package/dist/.build-complete
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
|
|
1
|
+
1780882427323
|
|
@@ -1,3 +1,3 @@
|
|
|
1
1
|
"use client";
|
|
2
|
-
import { n as SF_DATA_GRID_DEFAULT_VARIANTS, r as SF_DATA_GRID_VARIANTS, t as DataGrid } from "../data-grid-
|
|
2
|
+
import { n as SF_DATA_GRID_DEFAULT_VARIANTS, r as SF_DATA_GRID_VARIANTS, t as DataGrid } from "../data-grid-DrguJq_H.js";
|
|
3
3
|
export { DataGrid, SF_DATA_GRID_DEFAULT_VARIANTS, SF_DATA_GRID_VARIANTS };
|
|
@@ -8,7 +8,7 @@ import { t as Pagination } from "./pagination-DSY279Ta.js";
|
|
|
8
8
|
import { r as Table } from "./table-BM8JBGBs.js";
|
|
9
9
|
import { t as Filters } from "./filters-SmEl93za.js";
|
|
10
10
|
import { t as Empty } from "./empty-C1tAkawe.js";
|
|
11
|
-
import { createContext, useContext, useMemo, useRef
|
|
11
|
+
import { createContext, useContext, useMemo, useRef } from "react";
|
|
12
12
|
import { Fragment as Fragment$1, jsx, jsxs } from "react/jsx-runtime";
|
|
13
13
|
import { CaretDownIcon, CaretUpDownIcon, CaretUpIcon, ColumnsIcon, FadersHorizontalIcon } from "@phosphor-icons/react";
|
|
14
14
|
import { columnFilteringFeature, columnResizingFeature, columnSizingFeature, columnVisibilityFeature, createFilteredRowModel, createPaginatedRowModel, createSortedRowModel, filterFns, flexRender, rowPaginationFeature, rowSelectionFeature, rowSortingFeature, sortFns, tableFeatures, useTable } from "@tanstack/react-table";
|
|
@@ -276,68 +276,75 @@ DataGridEmpty.displayName = "DataGrid.Empty";
|
|
|
276
276
|
* Sets up the react-table instance and provides context to child components.
|
|
277
277
|
*/
|
|
278
278
|
function DataGridRoot({ data, columns, sorting: controlledSorting, onSortingChange, enableSorting = true, columnVisibility: controlledColumnVisibility, onColumnVisibilityChange, enableColumnVisibility = true, rowSelection: controlledRowSelection, onRowSelectionChange, enableRowSelection, pageSize = 10, pageIndex = 0, onPaginationChange, totalCount, manualPagination = false, pageSizeOptions: _pageSizeOptions = DEFAULT_PAGE_SIZE_OPTIONS, filters, onFiltersChange, filterFields, enableFiltering, layout: _layout = SF_DATA_GRID_DEFAULT_VARIANTS.layout, className, tableClassName, emptyState, loading, loadingRows, toolbar, showToolbar = true, showPagination = true, pagination: customPagination, enableColumnResizing, columnResizeMode = "onEnd", virtualized = false, estimatedRowHeight = 44, overscan = 8, maxHeight, children }) {
|
|
279
|
-
const
|
|
280
|
-
const
|
|
281
|
-
const
|
|
282
|
-
const
|
|
279
|
+
const isSortingControlled = controlledSorting !== void 0;
|
|
280
|
+
const isColumnVisibilityControlled = controlledColumnVisibility !== void 0;
|
|
281
|
+
const isRowSelectionControlled = controlledRowSelection !== void 0;
|
|
282
|
+
const isPaginationControlled = manualPagination;
|
|
283
|
+
const controlledState = {};
|
|
284
|
+
if (isSortingControlled) controlledState.sorting = controlledSorting;
|
|
285
|
+
if (isColumnVisibilityControlled) controlledState.columnVisibility = controlledColumnVisibility;
|
|
286
|
+
if (isRowSelectionControlled) controlledState.rowSelection = controlledRowSelection;
|
|
287
|
+
if (isPaginationControlled) controlledState.pagination = {
|
|
283
288
|
pageIndex,
|
|
284
289
|
pageSize
|
|
285
|
-
}
|
|
286
|
-
const sorting = controlledSorting ?? internalSorting;
|
|
287
|
-
const columnVisibility = controlledColumnVisibility ?? internalColumnVisibility;
|
|
288
|
-
const rowSelection = controlledRowSelection ?? internalRowSelection;
|
|
289
|
-
const pagination = internalPagination;
|
|
290
|
+
};
|
|
290
291
|
const handleSortingChange = (updater) => {
|
|
291
|
-
const
|
|
292
|
-
if (
|
|
293
|
-
|
|
292
|
+
const next = typeof updater === "function" ? updater(table.state.sorting) : updater;
|
|
293
|
+
if (!isSortingControlled) table.setSorting(next);
|
|
294
|
+
onSortingChange?.(next);
|
|
294
295
|
};
|
|
295
296
|
const handleColumnVisibilityChange = (updater) => {
|
|
296
|
-
const
|
|
297
|
-
|
|
298
|
-
|
|
297
|
+
const current = table.state.columnVisibility ?? {};
|
|
298
|
+
const next = typeof updater === "function" ? updater(current) : updater;
|
|
299
|
+
if (!isColumnVisibilityControlled) table.setColumnVisibility(next);
|
|
300
|
+
onColumnVisibilityChange?.(next);
|
|
299
301
|
};
|
|
300
302
|
const handleRowSelectionChange = (updater) => {
|
|
301
|
-
const
|
|
302
|
-
|
|
303
|
-
|
|
303
|
+
const current = table.state.rowSelection ?? {};
|
|
304
|
+
const next = typeof updater === "function" ? updater(current) : updater;
|
|
305
|
+
if (!isRowSelectionControlled) table.setRowSelection(next);
|
|
306
|
+
onRowSelectionChange?.(next);
|
|
304
307
|
};
|
|
305
308
|
const handlePaginationChange = (updater) => {
|
|
306
|
-
const
|
|
307
|
-
|
|
308
|
-
|
|
309
|
-
|
|
310
|
-
|
|
309
|
+
const current = table.state.pagination ?? {
|
|
310
|
+
pageIndex,
|
|
311
|
+
pageSize
|
|
312
|
+
};
|
|
313
|
+
const next = typeof updater === "function" ? updater(current) : updater;
|
|
314
|
+
if (!isPaginationControlled) table.setPagination(next);
|
|
315
|
+
onPaginationChange?.({
|
|
316
|
+
pageIndex: next.pageIndex,
|
|
317
|
+
pageSize: next.pageSize
|
|
311
318
|
});
|
|
312
319
|
};
|
|
320
|
+
const table = useTable({
|
|
321
|
+
features: dataGridFeatures,
|
|
322
|
+
rowModels: {
|
|
323
|
+
sortedRowModel: createSortedRowModel(sortFns),
|
|
324
|
+
filteredRowModel: createFilteredRowModel(filterFns),
|
|
325
|
+
paginatedRowModel: createPaginatedRowModel()
|
|
326
|
+
},
|
|
327
|
+
data,
|
|
328
|
+
columns,
|
|
329
|
+
initialState: { pagination: {
|
|
330
|
+
pageIndex,
|
|
331
|
+
pageSize
|
|
332
|
+
} },
|
|
333
|
+
state: controlledState,
|
|
334
|
+
...isSortingControlled || onSortingChange ? { onSortingChange: handleSortingChange } : {},
|
|
335
|
+
...isColumnVisibilityControlled || onColumnVisibilityChange ? { onColumnVisibilityChange: handleColumnVisibilityChange } : {},
|
|
336
|
+
...isRowSelectionControlled || onRowSelectionChange ? { onRowSelectionChange: handleRowSelectionChange } : {},
|
|
337
|
+
...isPaginationControlled || onPaginationChange ? { onPaginationChange: handlePaginationChange } : {},
|
|
338
|
+
enableSorting,
|
|
339
|
+
enableRowSelection: enableRowSelection !== false,
|
|
340
|
+
enableColumnResizing,
|
|
341
|
+
columnResizeMode,
|
|
342
|
+
manualPagination,
|
|
343
|
+
pageCount: manualPagination ? Math.ceil((totalCount ?? data.length) / pageSize) : void 0,
|
|
344
|
+
enableMultiRowSelection: true
|
|
345
|
+
});
|
|
313
346
|
const contextValue = {
|
|
314
|
-
table
|
|
315
|
-
_features: dataGridFeatures,
|
|
316
|
-
_rowModels: {
|
|
317
|
-
sortedRowModel: createSortedRowModel(sortFns),
|
|
318
|
-
filteredRowModel: createFilteredRowModel(filterFns),
|
|
319
|
-
paginatedRowModel: createPaginatedRowModel()
|
|
320
|
-
},
|
|
321
|
-
data,
|
|
322
|
-
columns,
|
|
323
|
-
state: {
|
|
324
|
-
sorting,
|
|
325
|
-
columnVisibility,
|
|
326
|
-
rowSelection,
|
|
327
|
-
pagination
|
|
328
|
-
},
|
|
329
|
-
onSortingChange: handleSortingChange,
|
|
330
|
-
onColumnVisibilityChange: handleColumnVisibilityChange,
|
|
331
|
-
onRowSelectionChange: handleRowSelectionChange,
|
|
332
|
-
onPaginationChange: handlePaginationChange,
|
|
333
|
-
enableSorting,
|
|
334
|
-
enableRowSelection: enableRowSelection !== false,
|
|
335
|
-
enableColumnResizing,
|
|
336
|
-
columnResizeMode,
|
|
337
|
-
manualPagination,
|
|
338
|
-
pageCount: manualPagination ? Math.ceil((totalCount ?? data.length) / pageSize) : void 0,
|
|
339
|
-
enableMultiRowSelection: true
|
|
340
|
-
}),
|
|
347
|
+
table,
|
|
341
348
|
pageSize,
|
|
342
349
|
pageIndex,
|
|
343
350
|
totalCount: totalCount ?? data.length,
|
|
@@ -385,4 +392,4 @@ var DataGrid = Object.assign(DataGridRoot, {
|
|
|
385
392
|
//#endregion
|
|
386
393
|
export { SF_DATA_GRID_DEFAULT_VARIANTS as n, SF_DATA_GRID_VARIANTS as r, DataGrid as t };
|
|
387
394
|
|
|
388
|
-
//# sourceMappingURL=data-grid-
|
|
395
|
+
//# sourceMappingURL=data-grid-DrguJq_H.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"data-grid-DrguJq_H.js","names":[],"sources":["../src/components/data-grid/features.ts","../src/components/data-grid/data-grid.tsx"],"sourcesContent":["import {\n columnFilteringFeature,\n columnResizingFeature,\n columnSizingFeature,\n columnVisibilityFeature,\n rowPaginationFeature,\n rowSelectionFeature,\n rowSortingFeature,\n tableFeatures,\n} from \"@tanstack/react-table\";\n\n/**\n * The TanStack Table v9 feature set used by DataGrid.\n *\n * v9 is modular/tree-shakeable: features must be opted into explicitly via\n * `_features` rather than being bundled into `useReactTable` like v8. This set\n * mirrors the capabilities the v8 DataGrid relied on: sorting, filtering,\n * pagination, row selection, column visibility, and column resizing/sizing.\n */\nexport const dataGridFeatures = tableFeatures({\n columnFilteringFeature,\n columnResizingFeature,\n columnSizingFeature,\n columnVisibilityFeature,\n rowPaginationFeature,\n rowSelectionFeature,\n rowSortingFeature,\n});\n\n/** The precise feature-set type, used to parameterize `Table<TFeatures, TData>`. */\nexport type DataGridFeatures = typeof dataGridFeatures;\n","\"use client\";\n\nimport {\n CaretDownIcon,\n CaretUpIcon,\n CaretUpDownIcon,\n ColumnsIcon,\n FadersHorizontalIcon,\n} from \"@phosphor-icons/react\";\nimport {\n createFilteredRowModel,\n createPaginatedRowModel,\n createSortedRowModel,\n filterFns,\n flexRender,\n sortFns,\n useTable,\n type ColumnDef,\n type ColumnVisibilityState,\n type PaginationState,\n type RowData,\n type RowSelectionState,\n type SortingState,\n type TableState,\n} from \"@tanstack/react-table\";\nimport { useVirtualizer } from \"@tanstack/react-virtual\";\nimport {\n createContext,\n useContext,\n useMemo,\n useRef,\n type ReactNode,\n} from \"react\";\n\nimport { cn } from \"../../utils/cn\";\nimport { Button } from \"../button\";\nimport { Checkbox } from \"../checkbox\";\nimport { DropdownMenu } from \"../dropdown\";\nimport { Empty } from \"../empty\";\nimport { Filters } from \"../filters\";\nimport { Loader } from \"../loader\";\nimport { Pagination } from \"../pagination\";\nimport { Table } from \"../table\";\nimport { dataGridFeatures, type DataGridFeatures } from \"./features\";\nimport type {\n DataGridProps,\n DataGridContextValue,\n DataGridToolbarProps,\n DataGridContentProps,\n DataGridPaginationProps,\n DataGridColumnToggleProps,\n DataGridEmptyProps,\n} from \"./types\";\n\n// ============================================================================\n// Variants\n// ============================================================================\n\n/** DataGrid layout variant definitions */\nexport const SF_DATA_GRID_VARIANTS = {\n layout: {\n auto: {\n classes: \"\",\n description: \"Auto column sizing - columns resize based on content\",\n },\n fixed: {\n classes: \"table-fixed\",\n description: \"Fixed column sizing - columns have equal width\",\n },\n },\n} as const;\n\n/** Default variants for DataGrid */\nexport const SF_DATA_GRID_DEFAULT_VARIANTS = {\n layout: \"auto\",\n} as const;\n\n// ============================================================================\n// Context\n// ============================================================================\n\nconst DataGridContext = createContext<DataGridContextValue | null>(null);\nconst DEFAULT_PAGE_SIZE_OPTIONS = [10, 25, 50, 100];\n\nfunction useDataGridContext<TData extends RowData>() {\n const context = useContext(DataGridContext);\n if (!context) {\n throw new Error(\n \"DataGrid compound components must be used within a DataGrid\"\n );\n }\n return context as DataGridContextValue<TData>;\n}\n\n// ============================================================================\n// Sort Icon Component\n// ============================================================================\n\nfunction SortIcon({ sorted }: { sorted: false | \"asc\" | \"desc\" }) {\n if (sorted === \"asc\") {\n return <CaretUpIcon className=\"size-3.5 text-sf-brand\" />;\n }\n if (sorted === \"desc\") {\n return <CaretDownIcon className=\"size-3.5 text-sf-brand\" />;\n }\n return <CaretUpDownIcon className=\"size-3.5 text-sf-subtle\" />;\n}\n\n// ============================================================================\n// DataGrid Toolbar\n// ============================================================================\n\n/**\n * Toolbar component for DataGrid.\n * Shows filters, column visibility toggle, and custom actions.\n */\nfunction DataGridToolbar({ className, children }: DataGridToolbarProps) {\n return (\n <div\n className={cn(\n \"flex items-center gap-2 border-b border-sf-line p-3\",\n className\n )}\n >\n {children}\n </div>\n );\n}\n\nDataGridToolbar.displayName = \"DataGrid.Toolbar\";\n\n// ============================================================================\n// DataGrid Column Toggle\n// ============================================================================\n\n/**\n * Column visibility toggle dropdown.\n * Shows checkboxes for each hideable column.\n */\nfunction DataGridColumnToggle({\n className,\n trigger,\n label = \"Columns\",\n}: DataGridColumnToggleProps) {\n const { table } = useDataGridContext();\n\n const hideableColumns = useMemo(() => {\n return table\n .getAllColumns()\n .filter(\n (col) =>\n col.getCanHide() &&\n (col.columnDef.enableHiding !== false || col.getCanHide())\n );\n }, [table]);\n\n if (hideableColumns.length === 0) return null;\n\n return (\n <DropdownMenu>\n <DropdownMenu.Trigger>\n {trigger ?? (\n <Button variant=\"secondary\" size=\"sm\" className={className}>\n <ColumnsIcon className=\"mr-1.5 size-4\" />\n {label}\n </Button>\n )}\n </DropdownMenu.Trigger>\n <DropdownMenu.Content className=\"w-48\">\n <div className=\"flex flex-col gap-1 p-1\">\n {hideableColumns.map((column) => (\n <label\n key={column.id}\n className=\"flex cursor-pointer items-center gap-2 rounded-md px-2 py-1.5 text-sm hover:bg-sf-tint\"\n >\n <Checkbox\n checked={column.getIsVisible()}\n onCheckedChange={(checked) =>\n column.toggleVisibility(!!checked)\n }\n />\n <span className=\"flex-1\">\n {typeof column.columnDef.header === \"string\"\n ? column.columnDef.header\n : column.id}\n </span>\n </label>\n ))}\n {hideableColumns.length > 0 && (\n <>\n <div className=\"my-1 h-px bg-sf-line\" />\n <DropdownMenu.Item\n onClick={() =>\n hideableColumns.forEach((col) => col.toggleVisibility(true))\n }\n >\n Show all\n </DropdownMenu.Item>\n <DropdownMenu.Item\n onClick={() =>\n hideableColumns.forEach((col) => col.toggleVisibility(false))\n }\n >\n Hide all\n </DropdownMenu.Item>\n </>\n )}\n </div>\n </DropdownMenu.Content>\n </DropdownMenu>\n );\n}\n\nDataGridColumnToggle.displayName = \"DataGrid.ColumnToggle\";\n\n// ============================================================================\n// DataGrid Content\n// ============================================================================\n\n/**\n * Main table content component.\n * Renders the table with headers, rows, and cells.\n */\nfunction DataGridContent({ className }: DataGridContentProps) {\n const {\n table,\n loading,\n loadingRows,\n enableColumnResizing,\n virtualized,\n estimatedRowHeight = 44,\n overscan = 8,\n maxHeight,\n } = useDataGridContext();\n\n const scrollRef = useRef<HTMLDivElement>(null);\n const rows = table.getRowModel().rows;\n\n const virtualizer = useVirtualizer({\n count: rows.length,\n getScrollElement: () => scrollRef.current,\n estimateSize: () => estimatedRowHeight,\n overscan,\n // Disable measurement work entirely when not virtualizing.\n enabled: Boolean(virtualized),\n getItemKey: (index) => rows[index]?.id ?? index,\n });\n\n if (loading) {\n return (\n <div className=\"p-4\">\n <div className=\"space-y-2\">\n {Array.from({ length: loadingRows ?? 5 }).map((_, i) => (\n <Loader key={i} className=\"h-10 w-full\" />\n ))}\n </div>\n </div>\n );\n }\n\n const renderCells = (row: (typeof rows)[number]) =>\n row.getVisibleCells().map((cell) => (\n <Table.Cell\n key={cell.id}\n className={\n (cell.column.columnDef as unknown as Record<string, unknown>)\n .cellClassName as string\n }\n style={\n enableColumnResizing ? { width: cell.column.getSize() } : undefined\n }\n >\n {flexRender(cell.column.columnDef.cell, cell.getContext())}\n </Table.Cell>\n ));\n\n const headerRows = table.getHeaderGroups().map((headerGroup) => (\n <Table.Row key={headerGroup.id}>\n {headerGroup.headers.map((header) => {\n const canSort = header.column.getCanSort();\n const sorted = header.column.getIsSorted();\n const canResize = enableColumnResizing && header.column.getCanResize();\n const isResizing = header.column.getIsResizing();\n\n return (\n <Table.Head\n key={header.id}\n className={cn(\n \"bg-sf-base relative group\",\n canSort && \"cursor-pointer select-none hover:bg-sf-overlay\",\n (header.column.columnDef as unknown as Record<string, unknown>)\n .headerClassName as string\n )}\n style={canResize ? { width: header.getSize() } : undefined}\n onClick={canSort ? () => header.column.toggleSorting() : undefined}\n >\n <div className=\"flex items-center gap-1.5\">\n {header.isPlaceholder\n ? null\n : flexRender(\n header.column.columnDef.header,\n header.getContext()\n )}\n {canSort && <SortIcon sorted={sorted} />}\n </div>\n {canResize && (\n <Table.ResizeHandle\n onMouseDown={header.getResizeHandler()}\n onTouchStart={header.getResizeHandler()}\n onDoubleClick={() => header.column.resetSize()}\n className={cn(isResizing && \"visible bg-sf-brand/20\")}\n />\n )}\n </Table.Head>\n );\n })}\n </Table.Row>\n ));\n\n const tableElement = (\n <Table className={className}>\n <Table.Header>{headerRows}</Table.Header>\n <Table.Body>\n {rows.map((row) => (\n <Table.Row\n key={row.id}\n variant={row.getIsSelected() ? \"selected\" : \"default\"}\n className={cn(\n row.getIsSelected() && \"bg-sf-tint\",\n \"hover:bg-sf-overlay\"\n )}\n >\n {renderCells(row)}\n </Table.Row>\n ))}\n </Table.Body>\n </Table>\n );\n\n if (!virtualized) return tableElement;\n\n // Virtualized: render only the visible window of rows inside a bounded\n // scroll container, using spacer rows to preserve total scroll height and\n // keep semantic <table> markup (sticky headers, column resizing intact).\n const virtualRows = virtualizer.getVirtualItems();\n const totalSize = virtualizer.getTotalSize();\n const colSpan = table.getVisibleLeafColumns().length;\n const paddingTop = virtualRows[0]?.start ?? 0;\n const paddingBottom = totalSize - (virtualRows.at(-1)?.end ?? 0);\n\n return (\n <div\n ref={scrollRef}\n className=\"relative overflow-auto\"\n style={{\n maxHeight: typeof maxHeight === \"number\" ? `${maxHeight}px` : maxHeight,\n }}\n >\n <Table className={className}>\n <Table.Header className=\"sticky top-0 z-10\">{headerRows}</Table.Header>\n <Table.Body>\n {paddingTop > 0 && (\n <tr aria-hidden=\"true\">\n {/* oxlint-disable-next-line control-has-associated-label */}\n <td colSpan={colSpan} style={{ height: paddingTop }} />\n </tr>\n )}\n {virtualRows.map((virtualRow) => {\n const row = rows[virtualRow.index];\n if (!row) return null;\n return (\n <Table.Row\n key={row.id}\n data-index={virtualRow.index}\n ref={virtualizer.measureElement}\n variant={row.getIsSelected() ? \"selected\" : \"default\"}\n className={cn(\n row.getIsSelected() && \"bg-sf-tint\",\n \"hover:bg-sf-overlay\"\n )}\n >\n {renderCells(row)}\n </Table.Row>\n );\n })}\n {paddingBottom > 0 && (\n <tr aria-hidden=\"true\">\n {/* oxlint-disable-next-line control-has-associated-label */}\n <td colSpan={colSpan} style={{ height: paddingBottom }} />\n </tr>\n )}\n </Table.Body>\n </Table>\n </div>\n );\n}\n\nDataGridContent.displayName = \"DataGrid.Content\";\n\n// ============================================================================\n// DataGrid Pagination\n// ============================================================================\n\n/**\n * Pagination controls for DataGrid.\n * Wraps the Pagination component with table state.\n */\nfunction DataGridPagination({ className }: DataGridPaginationProps) {\n const {\n table,\n pageSize: _pageSize,\n pageIndex: _pageIndex,\n totalCount,\n manualPagination,\n } = useDataGridContext();\n\n // Get pagination state\n const paginationState = table.state.pagination;\n const currentPageIndex = paginationState.pageIndex;\n const currentPageSize = paginationState.pageSize;\n\n // Calculate row range\n const startRow = currentPageIndex * currentPageSize + 1;\n const endRow = Math.min(\n (currentPageIndex + 1) * currentPageSize,\n manualPagination ? totalCount : table.getCoreRowModel().rows.length\n );\n\n if (table.getPageCount() <= 1 && !manualPagination) return null;\n\n return (\n <div\n className={cn(\n \"flex items-center justify-between border-t border-sf-line p-3\",\n className\n )}\n >\n <div className=\"text-sm text-sf-subtle\">\n Showing {startRow}–{endRow} of{\" \"}\n {manualPagination ? totalCount : table.getCoreRowModel().rows.length}\n </div>\n <Pagination\n page={currentPageIndex + 1}\n setPage={(page) => table.setPageIndex(page - 1)}\n perPage={currentPageSize}\n totalCount={\n manualPagination ? totalCount : table.getCoreRowModel().rows.length\n }\n text={({ pageShowingRange, totalCount: total }) =>\n `Showing ${pageShowingRange} of ${total}`\n }\n />\n </div>\n );\n}\n\nDataGridPagination.displayName = \"DataGrid.Pagination\";\n\n// ============================================================================\n// DataGrid Empty\n// ============================================================================\n\n/**\n * Empty state component for DataGrid.\n * Shown when there are no rows to display.\n */\nfunction DataGridEmpty({\n className,\n children,\n title = \"No results\",\n description = \"No data to display.\",\n}: DataGridEmptyProps) {\n const { table } = useDataGridContext();\n\n // Only show if there are no rows\n if (table.getCoreRowModel().rows.length > 0) return null;\n\n return (\n <div className={cn(\"p-8\", className)}>\n {children ?? (\n <Empty\n icon={<FadersHorizontalIcon className=\"size-10 text-sf-subtle\" />}\n title={title}\n description={description}\n />\n )}\n </div>\n );\n}\n\nDataGridEmpty.displayName = \"DataGrid.Empty\";\n\n// ============================================================================\n// DataGrid Root\n// ============================================================================\n\n/**\n * DataGrid root component.\n * Sets up the react-table instance and provides context to child components.\n */\nfunction DataGridRoot<TData extends RowData>({\n data,\n columns,\n sorting: controlledSorting,\n onSortingChange,\n enableSorting = true,\n columnVisibility: controlledColumnVisibility,\n onColumnVisibilityChange,\n enableColumnVisibility = true,\n rowSelection: controlledRowSelection,\n onRowSelectionChange,\n enableRowSelection,\n pageSize = 10,\n pageIndex = 0,\n onPaginationChange,\n totalCount,\n manualPagination = false,\n pageSizeOptions: _pageSizeOptions = DEFAULT_PAGE_SIZE_OPTIONS,\n filters,\n onFiltersChange,\n filterFields,\n enableFiltering,\n layout: _layout = SF_DATA_GRID_DEFAULT_VARIANTS.layout,\n className,\n tableClassName,\n emptyState,\n loading,\n loadingRows,\n toolbar,\n showToolbar = true,\n showPagination = true,\n pagination: customPagination,\n enableColumnResizing,\n columnResizeMode = \"onEnd\",\n virtualized = false,\n estimatedRowHeight = 44,\n overscan = 8,\n maxHeight,\n children,\n}: DataGridProps<TData> & { children?: ReactNode }) {\n // TanStack Table v9 (beta) owns uncontrolled state internally via its atom\n // store. We only pass a `state` slice for the values a consumer explicitly\n // controls via props; everything else is seeded with `initialState` so the\n // table mutates its own atoms. This avoids calling React setState during\n // TanStack's render flush (the \"setState while rendering\" warning that the\n // old controlled-mirror pattern triggered under v9-beta reactivity).\n\n // Controlled vs uncontrolled detection (a slice is controlled only when the\n // consumer passes the value prop). Pagination is controlled in manual mode,\n // where the consumer drives `pageIndex`/`pageSize` (e.g. server pagination).\n const isSortingControlled = controlledSorting !== undefined;\n const isColumnVisibilityControlled = controlledColumnVisibility !== undefined;\n const isRowSelectionControlled = controlledRowSelection !== undefined;\n const isPaginationControlled = manualPagination;\n\n // Build the controlled `state` slice (only the props the consumer drives).\n const controlledState: Partial<TableState<DataGridFeatures>> = {};\n if (isSortingControlled) {\n controlledState.sorting = controlledSorting;\n }\n if (isColumnVisibilityControlled) {\n controlledState.columnVisibility = controlledColumnVisibility;\n }\n if (isRowSelectionControlled) {\n controlledState.rowSelection = controlledRowSelection;\n }\n if (isPaginationControlled) {\n controlledState.pagination = { pageIndex, pageSize };\n }\n\n // Change handlers. A handler is only attached to `useTable` when the slice is\n // controlled (consumer drives the prop) or a consumer callback exists.\n //\n // - Controlled: notify the consumer; they update the prop which flows back in\n // via `state`. We do NOT touch the table's own atom.\n // - Uncontrolled + callback: TanStack does not self-update once a handler is\n // attached, so we advance the table's own atom via its setter AND notify the\n // consumer. Using the table setter (not React setState) keeps this out of\n // React's render pass, avoiding the v9-beta \"setState while rendering\" warn.\n const handleSortingChange = (\n updater: SortingState | ((old: SortingState) => SortingState)\n ) => {\n const next =\n typeof updater === \"function\" ? updater(table.state.sorting) : updater;\n if (!isSortingControlled) {\n table.setSorting(next);\n }\n onSortingChange?.(next);\n };\n\n const handleColumnVisibilityChange = (\n updater:\n | ColumnVisibilityState\n | ((old: ColumnVisibilityState) => ColumnVisibilityState)\n ) => {\n const current = table.state.columnVisibility ?? {};\n const next = typeof updater === \"function\" ? updater(current) : updater;\n if (!isColumnVisibilityControlled) {\n table.setColumnVisibility(next);\n }\n onColumnVisibilityChange?.(next);\n };\n\n const handleRowSelectionChange = (\n updater: RowSelectionState | ((old: RowSelectionState) => RowSelectionState)\n ) => {\n const current = table.state.rowSelection ?? {};\n const next = typeof updater === \"function\" ? updater(current) : updater;\n if (!isRowSelectionControlled) {\n table.setRowSelection(next);\n }\n onRowSelectionChange?.(next);\n };\n\n const handlePaginationChange = (\n updater: PaginationState | ((old: PaginationState) => PaginationState)\n ) => {\n const current = table.state.pagination ?? { pageIndex, pageSize };\n const next = typeof updater === \"function\" ? updater(current) : updater;\n // Manual (controlled) pagination: the consumer drives pageIndex/pageSize via\n // props, so just notify. Auto pagination: advance the table's own atom and\n // notify any consumer callback.\n if (!isPaginationControlled) {\n table.setPagination(next);\n }\n onPaginationChange?.({\n pageIndex: next.pageIndex,\n pageSize: next.pageSize,\n });\n };\n\n // Create table instance (TanStack Table v9: modular features + row models)\n const table = useTable({\n features: dataGridFeatures,\n rowModels: {\n sortedRowModel: createSortedRowModel(sortFns),\n filteredRowModel: createFilteredRowModel(filterFns),\n paginatedRowModel: createPaginatedRowModel(),\n },\n data,\n columns: columns as ColumnDef<typeof dataGridFeatures, TData, unknown>[],\n initialState: {\n pagination: { pageIndex, pageSize },\n },\n state: controlledState,\n // Only attach change handlers when the slice is controlled or the consumer\n // wants notifications. Attaching a handler tells TanStack the caller owns\n // the update, so for purely uncontrolled slices we omit it and let the\n // table manage its own atom (which also avoids setState-during-render).\n ...(isSortingControlled || onSortingChange\n ? { onSortingChange: handleSortingChange }\n : {}),\n ...(isColumnVisibilityControlled || onColumnVisibilityChange\n ? { onColumnVisibilityChange: handleColumnVisibilityChange }\n : {}),\n ...(isRowSelectionControlled || onRowSelectionChange\n ? { onRowSelectionChange: handleRowSelectionChange }\n : {}),\n ...(isPaginationControlled || onPaginationChange\n ? { onPaginationChange: handlePaginationChange }\n : {}),\n enableSorting,\n enableRowSelection: enableRowSelection !== false,\n enableColumnResizing,\n columnResizeMode,\n manualPagination,\n pageCount: manualPagination\n ? Math.ceil((totalCount ?? data.length) / pageSize)\n : undefined,\n enableMultiRowSelection: true,\n });\n\n // Provide context to children\n const contextValue: DataGridContextValue<TData> = {\n table,\n pageSize,\n pageIndex,\n totalCount: totalCount ?? data.length,\n manualPagination,\n loading,\n loadingRows,\n enableColumnResizing,\n columnResizeMode,\n virtualized,\n estimatedRowHeight,\n overscan,\n maxHeight,\n };\n\n return (\n <DataGridContext.Provider value={contextValue as DataGridContextValue}>\n <div\n className={cn(\n \"flex flex-col overflow-hidden rounded-lg border border-sf-line bg-sf-base\",\n className\n )}\n >\n {children || (\n // Auto mode - DataGrid renders everything based on props\n <>\n {/* Toolbar */}\n {showToolbar && (\n <DataGridToolbar>\n {toolbar ?? (\n <>\n {enableFiltering && filterFields && (\n <Filters\n filters={filters ?? []}\n fields={filterFields}\n onChange={onFiltersChange ?? (() => {})}\n size=\"sm\"\n />\n )}\n <div className=\"ml-auto flex items-center gap-2\">\n {enableColumnVisibility && <DataGridColumnToggle />}\n </div>\n </>\n )}\n </DataGridToolbar>\n )}\n\n {/* Table content */}\n <div\n className={cn(\n \"flex-1\",\n // When virtualized, DataGridContent owns its own bounded\n // scroll container, so the wrapper must not scroll too.\n !virtualized && \"overflow-auto\"\n )}\n >\n <DataGridContent className={tableClassName} />\n <DataGridEmpty>{emptyState}</DataGridEmpty>\n </div>\n\n {/* Pagination */}\n {showPagination && (customPagination ?? <DataGridPagination />)}\n </>\n )}\n </div>\n </DataGridContext.Provider>\n );\n}\n\nDataGridRoot.displayName = \"DataGrid\";\n\n// ============================================================================\n// Exports\n// ============================================================================\n\nexport const DataGrid = Object.assign(DataGridRoot, {\n Toolbar: DataGridToolbar,\n Content: DataGridContent,\n Pagination: DataGridPagination,\n ColumnToggle: DataGridColumnToggle,\n Empty: DataGridEmpty,\n});\n\nexport type {\n DataGridProps,\n DataGridColumn,\n DataGridToolbarProps,\n DataGridContentProps,\n DataGridPaginationProps,\n DataGridColumnToggleProps,\n DataGridEmptyProps,\n} from \"./types\";\n"],"mappings":"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"}
|
package/dist/index.js
CHANGED
|
@@ -32,7 +32,7 @@ import { r as Table } from "./table-BM8JBGBs.js";
|
|
|
32
32
|
import { c as SF_POPOVER_DEFAULT_VARIANTS, l as SF_POPOVER_VARIANTS, t as Popover } from "./popover-BY-e9co1.js";
|
|
33
33
|
import { _ as validateFilterValue, a as DEFAULT_MULTISELECT_OPERATORS, c as DEFAULT_TEXT_OPERATORS, d as formatFilterValue, f as getFieldByKey, g as mergeI18n, h as groupFields, i as DEFAULT_I18N, l as createFilter, m as getValueLabel, n as SF_FILTERS_DEFAULT_VARIANTS, o as DEFAULT_OPERATORS, p as getFieldOperators, r as SF_FILTERS_VARIANTS, s as DEFAULT_SELECT_OPERATORS, t as Filters, u as createFilterGroup } from "./filters-SmEl93za.js";
|
|
34
34
|
import { t as Empty } from "./empty-C1tAkawe.js";
|
|
35
|
-
import { n as SF_DATA_GRID_DEFAULT_VARIANTS, r as SF_DATA_GRID_VARIANTS, t as DataGrid } from "./data-grid-
|
|
35
|
+
import { n as SF_DATA_GRID_DEFAULT_VARIANTS, r as SF_DATA_GRID_VARIANTS, t as DataGrid } from "./data-grid-DrguJq_H.js";
|
|
36
36
|
import { a as useSFToastManager, n as ToastProvider, r as Toasty, t as Toast } from "./toast-CgZVaAkw.js";
|
|
37
37
|
import { n as SF_SENSITIVE_INPUT_VARIANTS, r as SensitiveInput, t as SF_SENSITIVE_INPUT_DEFAULT_VARIANTS } from "./sensitive-input-DHLZcM73.js";
|
|
38
38
|
import { i as SF_RADIO_VARIANTS, n as RadioGroup, r as SF_RADIO_DEFAULT_VARIANTS, t as Radio } from "./radio-DZwL13j0.js";
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"data-grid.d.ts","sourceRoot":"","sources":["../../../../src/components/data-grid/data-grid.tsx"],"names":[],"mappings":"AASA,OAAO,EAWL,KAAK,OAAO,
|
|
1
|
+
{"version":3,"file":"data-grid.d.ts","sourceRoot":"","sources":["../../../../src/components/data-grid/data-grid.tsx"],"names":[],"mappings":"AASA,OAAO,EAWL,KAAK,OAAO,EAIb,MAAM,uBAAuB,CAAC;AAE/B,OAAO,EAKL,KAAK,SAAS,EACf,MAAM,OAAO,CAAC;AAYf,OAAO,KAAK,EACV,aAAa,EAEb,oBAAoB,EACpB,oBAAoB,EACpB,uBAAuB,EACvB,yBAAyB,EACzB,kBAAkB,EACnB,MAAM,SAAS,CAAC;AAMjB,0CAA0C;AAC1C,eAAO,MAAM,qBAAqB;;;;;;;;;;;CAWxB,CAAC;AAEX,oCAAoC;AACpC,eAAO,MAAM,6BAA6B;;CAEhC,CAAC;AAqCX;;;GAGG;AACH,iBAAS,eAAe,CAAC,EAAE,SAAS,EAAE,QAAQ,EAAE,EAAE,oBAAoB,2CAWrE;kBAXQ,eAAe;;;AAmBxB;;;GAGG;AACH,iBAAS,oBAAoB,CAAC,EAC5B,SAAS,EACT,OAAO,EACP,KAAiB,GAClB,EAAE,yBAAyB,kDAoE3B;kBAxEQ,oBAAoB;;;AAgF7B;;;GAGG;AACH,iBAAS,eAAe,CAAC,EAAE,SAAS,EAAE,EAAE,oBAAoB,2CA4K3D;kBA5KQ,eAAe;;;AAoLxB;;;GAGG;AACH,iBAAS,kBAAkB,CAAC,EAAE,SAAS,EAAE,EAAE,uBAAuB,kDA+CjE;kBA/CQ,kBAAkB;;;AAuD3B;;;GAGG;AACH,iBAAS,aAAa,CAAC,EACrB,SAAS,EACT,QAAQ,EACR,KAAoB,EACpB,WAAmC,GACpC,EAAE,kBAAkB,kDAiBpB;kBAtBQ,aAAa;;;AA8BtB;;;GAGG;AACH,iBAAS,YAAY,CAAC,KAAK,SAAS,OAAO,EAAE,EAC3C,IAAI,EACJ,OAAO,EACP,OAAO,EAAE,iBAAiB,EAC1B,eAAe,EACf,aAAoB,EACpB,gBAAgB,EAAE,0BAA0B,EAC5C,wBAAwB,EACxB,sBAA6B,EAC7B,YAAY,EAAE,sBAAsB,EACpC,oBAAoB,EACpB,kBAAkB,EAClB,QAAa,EACb,SAAa,EACb,kBAAkB,EAClB,UAAU,EACV,gBAAwB,EACxB,eAAe,EAAE,gBAA4C,EAC7D,OAAO,EACP,eAAe,EACf,YAAY,EACZ,eAAe,EACf,MAAM,EAAE,OAA8C,EACtD,SAAS,EACT,cAAc,EACd,UAAU,EACV,OAAO,EACP,WAAW,EACX,OAAO,EACP,WAAkB,EAClB,cAAqB,EACrB,UAAU,EAAE,gBAAgB,EAC5B,oBAAoB,EACpB,gBAA0B,EAC1B,WAAmB,EACnB,kBAAuB,EACvB,QAAY,EACZ,SAAS,EACT,QAAQ,GACT,EAAE,aAAa,CAAC,KAAK,CAAC,GAAG;IAAE,QAAQ,CAAC,EAAE,SAAS,CAAA;CAAE,2CA0MjD;kBAjPQ,YAAY;;;AAyPrB,eAAO,MAAM,QAAQ;;;;;;CAMnB,CAAC;AAEH,YAAY,EACV,aAAa,EACb,cAAc,EACd,oBAAoB,EACpB,oBAAoB,EACpB,uBAAuB,EACvB,yBAAyB,EACzB,kBAAkB,GACnB,MAAM,SAAS,CAAC"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@signalflare-ai/ui",
|
|
3
|
-
"version": "1.
|
|
3
|
+
"version": "1.4.0",
|
|
4
4
|
"private": false,
|
|
5
5
|
"description": "SignalFlare AI component library for building modern web applications",
|
|
6
6
|
"keywords": [
|
|
@@ -568,7 +568,7 @@
|
|
|
568
568
|
"@tailwindcss/cli": "catalog:",
|
|
569
569
|
"@tailwindcss/vite": "catalog:",
|
|
570
570
|
"@tanstack/intent": "^0.0.41",
|
|
571
|
-
"@tanstack/react-table": "9.0.0-
|
|
571
|
+
"@tanstack/react-table": "9.0.0-beta.3",
|
|
572
572
|
"@tanstack/react-virtual": "^3.14.2",
|
|
573
573
|
"@testing-library/react": "16.3.2",
|
|
574
574
|
"@testing-library/user-event": "14.6.1",
|
|
@@ -604,7 +604,7 @@
|
|
|
604
604
|
"peerDependencies": {
|
|
605
605
|
"@phosphor-icons/react": "^2.1.10",
|
|
606
606
|
"@streamdown/code": "^1.1.1",
|
|
607
|
-
"@tanstack/react-table": "9.0.0-
|
|
607
|
+
"@tanstack/react-table": "9.0.0-beta.3",
|
|
608
608
|
"@tanstack/react-virtual": "^3.13.26",
|
|
609
609
|
"echarts": "^6.0.0",
|
|
610
610
|
"motion": "^12.38.0",
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"data-grid-DDSFMHud.js","names":[],"sources":["../src/components/data-grid/features.ts","../src/components/data-grid/data-grid.tsx"],"sourcesContent":["import {\n columnFilteringFeature,\n columnResizingFeature,\n columnSizingFeature,\n columnVisibilityFeature,\n rowPaginationFeature,\n rowSelectionFeature,\n rowSortingFeature,\n tableFeatures,\n} from \"@tanstack/react-table\";\n\n/**\n * The TanStack Table v9 feature set used by DataGrid.\n *\n * v9 is modular/tree-shakeable: features must be opted into explicitly via\n * `_features` rather than being bundled into `useReactTable` like v8. This set\n * mirrors the capabilities the v8 DataGrid relied on: sorting, filtering,\n * pagination, row selection, column visibility, and column resizing/sizing.\n */\nexport const dataGridFeatures = tableFeatures({\n columnFilteringFeature,\n columnResizingFeature,\n columnSizingFeature,\n columnVisibilityFeature,\n rowPaginationFeature,\n rowSelectionFeature,\n rowSortingFeature,\n});\n\n/** The precise feature-set type, used to parameterize `Table<TFeatures, TData>`. */\nexport type DataGridFeatures = typeof dataGridFeatures;\n","\"use client\";\n\nimport {\n CaretDownIcon,\n CaretUpIcon,\n CaretUpDownIcon,\n ColumnsIcon,\n FadersHorizontalIcon,\n} from \"@phosphor-icons/react\";\nimport {\n createFilteredRowModel,\n createPaginatedRowModel,\n createSortedRowModel,\n filterFns,\n flexRender,\n sortFns,\n useTable,\n type ColumnDef,\n type ColumnVisibilityState,\n type PaginationState,\n type RowData,\n type RowSelectionState,\n type SortingState,\n} from \"@tanstack/react-table\";\nimport { useVirtualizer } from \"@tanstack/react-virtual\";\nimport {\n createContext,\n useContext,\n useMemo,\n useRef,\n useState,\n type ReactNode,\n} from \"react\";\n\nimport { cn } from \"../../utils/cn\";\nimport { Button } from \"../button\";\nimport { Checkbox } from \"../checkbox\";\nimport { DropdownMenu } from \"../dropdown\";\nimport { Empty } from \"../empty\";\nimport { Filters } from \"../filters\";\nimport { Loader } from \"../loader\";\nimport { Pagination } from \"../pagination\";\nimport { Table } from \"../table\";\nimport { dataGridFeatures } from \"./features\";\nimport type {\n DataGridProps,\n DataGridContextValue,\n DataGridToolbarProps,\n DataGridContentProps,\n DataGridPaginationProps,\n DataGridColumnToggleProps,\n DataGridEmptyProps,\n} from \"./types\";\n\n// ============================================================================\n// Variants\n// ============================================================================\n\n/** DataGrid layout variant definitions */\nexport const SF_DATA_GRID_VARIANTS = {\n layout: {\n auto: {\n classes: \"\",\n description: \"Auto column sizing - columns resize based on content\",\n },\n fixed: {\n classes: \"table-fixed\",\n description: \"Fixed column sizing - columns have equal width\",\n },\n },\n} as const;\n\n/** Default variants for DataGrid */\nexport const SF_DATA_GRID_DEFAULT_VARIANTS = {\n layout: \"auto\",\n} as const;\n\n// ============================================================================\n// Context\n// ============================================================================\n\nconst DataGridContext = createContext<DataGridContextValue | null>(null);\nconst DEFAULT_PAGE_SIZE_OPTIONS = [10, 25, 50, 100];\n\nfunction useDataGridContext<TData extends RowData>() {\n const context = useContext(DataGridContext);\n if (!context) {\n throw new Error(\n \"DataGrid compound components must be used within a DataGrid\"\n );\n }\n return context as DataGridContextValue<TData>;\n}\n\n// ============================================================================\n// Sort Icon Component\n// ============================================================================\n\nfunction SortIcon({ sorted }: { sorted: false | \"asc\" | \"desc\" }) {\n if (sorted === \"asc\") {\n return <CaretUpIcon className=\"size-3.5 text-sf-brand\" />;\n }\n if (sorted === \"desc\") {\n return <CaretDownIcon className=\"size-3.5 text-sf-brand\" />;\n }\n return <CaretUpDownIcon className=\"size-3.5 text-sf-subtle\" />;\n}\n\n// ============================================================================\n// DataGrid Toolbar\n// ============================================================================\n\n/**\n * Toolbar component for DataGrid.\n * Shows filters, column visibility toggle, and custom actions.\n */\nfunction DataGridToolbar({ className, children }: DataGridToolbarProps) {\n return (\n <div\n className={cn(\n \"flex items-center gap-2 border-b border-sf-line p-3\",\n className\n )}\n >\n {children}\n </div>\n );\n}\n\nDataGridToolbar.displayName = \"DataGrid.Toolbar\";\n\n// ============================================================================\n// DataGrid Column Toggle\n// ============================================================================\n\n/**\n * Column visibility toggle dropdown.\n * Shows checkboxes for each hideable column.\n */\nfunction DataGridColumnToggle({\n className,\n trigger,\n label = \"Columns\",\n}: DataGridColumnToggleProps) {\n const { table } = useDataGridContext();\n\n const hideableColumns = useMemo(() => {\n return table\n .getAllColumns()\n .filter(\n (col) =>\n col.getCanHide() &&\n (col.columnDef.enableHiding !== false || col.getCanHide())\n );\n }, [table]);\n\n if (hideableColumns.length === 0) return null;\n\n return (\n <DropdownMenu>\n <DropdownMenu.Trigger>\n {trigger ?? (\n <Button variant=\"secondary\" size=\"sm\" className={className}>\n <ColumnsIcon className=\"mr-1.5 size-4\" />\n {label}\n </Button>\n )}\n </DropdownMenu.Trigger>\n <DropdownMenu.Content className=\"w-48\">\n <div className=\"flex flex-col gap-1 p-1\">\n {hideableColumns.map((column) => (\n <label\n key={column.id}\n className=\"flex cursor-pointer items-center gap-2 rounded-md px-2 py-1.5 text-sm hover:bg-sf-tint\"\n >\n <Checkbox\n checked={column.getIsVisible()}\n onCheckedChange={(checked) =>\n column.toggleVisibility(!!checked)\n }\n />\n <span className=\"flex-1\">\n {typeof column.columnDef.header === \"string\"\n ? column.columnDef.header\n : column.id}\n </span>\n </label>\n ))}\n {hideableColumns.length > 0 && (\n <>\n <div className=\"my-1 h-px bg-sf-line\" />\n <DropdownMenu.Item\n onClick={() =>\n hideableColumns.forEach((col) => col.toggleVisibility(true))\n }\n >\n Show all\n </DropdownMenu.Item>\n <DropdownMenu.Item\n onClick={() =>\n hideableColumns.forEach((col) => col.toggleVisibility(false))\n }\n >\n Hide all\n </DropdownMenu.Item>\n </>\n )}\n </div>\n </DropdownMenu.Content>\n </DropdownMenu>\n );\n}\n\nDataGridColumnToggle.displayName = \"DataGrid.ColumnToggle\";\n\n// ============================================================================\n// DataGrid Content\n// ============================================================================\n\n/**\n * Main table content component.\n * Renders the table with headers, rows, and cells.\n */\nfunction DataGridContent({ className }: DataGridContentProps) {\n const {\n table,\n loading,\n loadingRows,\n enableColumnResizing,\n virtualized,\n estimatedRowHeight = 44,\n overscan = 8,\n maxHeight,\n } = useDataGridContext();\n\n const scrollRef = useRef<HTMLDivElement>(null);\n const rows = table.getRowModel().rows;\n\n const virtualizer = useVirtualizer({\n count: rows.length,\n getScrollElement: () => scrollRef.current,\n estimateSize: () => estimatedRowHeight,\n overscan,\n // Disable measurement work entirely when not virtualizing.\n enabled: Boolean(virtualized),\n getItemKey: (index) => rows[index]?.id ?? index,\n });\n\n if (loading) {\n return (\n <div className=\"p-4\">\n <div className=\"space-y-2\">\n {Array.from({ length: loadingRows ?? 5 }).map((_, i) => (\n <Loader key={i} className=\"h-10 w-full\" />\n ))}\n </div>\n </div>\n );\n }\n\n const renderCells = (row: (typeof rows)[number]) =>\n row.getVisibleCells().map((cell) => (\n <Table.Cell\n key={cell.id}\n className={\n (cell.column.columnDef as unknown as Record<string, unknown>)\n .cellClassName as string\n }\n style={\n enableColumnResizing ? { width: cell.column.getSize() } : undefined\n }\n >\n {flexRender(cell.column.columnDef.cell, cell.getContext())}\n </Table.Cell>\n ));\n\n const headerRows = table.getHeaderGroups().map((headerGroup) => (\n <Table.Row key={headerGroup.id}>\n {headerGroup.headers.map((header) => {\n const canSort = header.column.getCanSort();\n const sorted = header.column.getIsSorted();\n const canResize = enableColumnResizing && header.column.getCanResize();\n const isResizing = header.column.getIsResizing();\n\n return (\n <Table.Head\n key={header.id}\n className={cn(\n \"bg-sf-base relative group\",\n canSort && \"cursor-pointer select-none hover:bg-sf-overlay\",\n (header.column.columnDef as unknown as Record<string, unknown>)\n .headerClassName as string\n )}\n style={canResize ? { width: header.getSize() } : undefined}\n onClick={canSort ? () => header.column.toggleSorting() : undefined}\n >\n <div className=\"flex items-center gap-1.5\">\n {header.isPlaceholder\n ? null\n : flexRender(\n header.column.columnDef.header,\n header.getContext()\n )}\n {canSort && <SortIcon sorted={sorted} />}\n </div>\n {canResize && (\n <Table.ResizeHandle\n onMouseDown={header.getResizeHandler()}\n onTouchStart={header.getResizeHandler()}\n onDoubleClick={() => header.column.resetSize()}\n className={cn(isResizing && \"visible bg-sf-brand/20\")}\n />\n )}\n </Table.Head>\n );\n })}\n </Table.Row>\n ));\n\n const tableElement = (\n <Table className={className}>\n <Table.Header>{headerRows}</Table.Header>\n <Table.Body>\n {rows.map((row) => (\n <Table.Row\n key={row.id}\n variant={row.getIsSelected() ? \"selected\" : \"default\"}\n className={cn(\n row.getIsSelected() && \"bg-sf-tint\",\n \"hover:bg-sf-overlay\"\n )}\n >\n {renderCells(row)}\n </Table.Row>\n ))}\n </Table.Body>\n </Table>\n );\n\n if (!virtualized) return tableElement;\n\n // Virtualized: render only the visible window of rows inside a bounded\n // scroll container, using spacer rows to preserve total scroll height and\n // keep semantic <table> markup (sticky headers, column resizing intact).\n const virtualRows = virtualizer.getVirtualItems();\n const totalSize = virtualizer.getTotalSize();\n const colSpan = table.getVisibleLeafColumns().length;\n const paddingTop = virtualRows[0]?.start ?? 0;\n const paddingBottom = totalSize - (virtualRows.at(-1)?.end ?? 0);\n\n return (\n <div\n ref={scrollRef}\n className=\"relative overflow-auto\"\n style={{\n maxHeight: typeof maxHeight === \"number\" ? `${maxHeight}px` : maxHeight,\n }}\n >\n <Table className={className}>\n <Table.Header className=\"sticky top-0 z-10\">{headerRows}</Table.Header>\n <Table.Body>\n {paddingTop > 0 && (\n <tr aria-hidden=\"true\">\n {/* oxlint-disable-next-line control-has-associated-label */}\n <td colSpan={colSpan} style={{ height: paddingTop }} />\n </tr>\n )}\n {virtualRows.map((virtualRow) => {\n const row = rows[virtualRow.index];\n if (!row) return null;\n return (\n <Table.Row\n key={row.id}\n data-index={virtualRow.index}\n ref={virtualizer.measureElement}\n variant={row.getIsSelected() ? \"selected\" : \"default\"}\n className={cn(\n row.getIsSelected() && \"bg-sf-tint\",\n \"hover:bg-sf-overlay\"\n )}\n >\n {renderCells(row)}\n </Table.Row>\n );\n })}\n {paddingBottom > 0 && (\n <tr aria-hidden=\"true\">\n {/* oxlint-disable-next-line control-has-associated-label */}\n <td colSpan={colSpan} style={{ height: paddingBottom }} />\n </tr>\n )}\n </Table.Body>\n </Table>\n </div>\n );\n}\n\nDataGridContent.displayName = \"DataGrid.Content\";\n\n// ============================================================================\n// DataGrid Pagination\n// ============================================================================\n\n/**\n * Pagination controls for DataGrid.\n * Wraps the Pagination component with table state.\n */\nfunction DataGridPagination({ className }: DataGridPaginationProps) {\n const {\n table,\n pageSize: _pageSize,\n pageIndex: _pageIndex,\n totalCount,\n manualPagination,\n } = useDataGridContext();\n\n // Get pagination state\n const paginationState = table.state.pagination;\n const currentPageIndex = paginationState.pageIndex;\n const currentPageSize = paginationState.pageSize;\n\n // Calculate row range\n const startRow = currentPageIndex * currentPageSize + 1;\n const endRow = Math.min(\n (currentPageIndex + 1) * currentPageSize,\n manualPagination ? totalCount : table.getCoreRowModel().rows.length\n );\n\n if (table.getPageCount() <= 1 && !manualPagination) return null;\n\n return (\n <div\n className={cn(\n \"flex items-center justify-between border-t border-sf-line p-3\",\n className\n )}\n >\n <div className=\"text-sm text-sf-subtle\">\n Showing {startRow}–{endRow} of{\" \"}\n {manualPagination ? totalCount : table.getCoreRowModel().rows.length}\n </div>\n <Pagination\n page={currentPageIndex + 1}\n setPage={(page) => table.setPageIndex(page - 1)}\n perPage={currentPageSize}\n totalCount={\n manualPagination ? totalCount : table.getCoreRowModel().rows.length\n }\n text={({ pageShowingRange, totalCount: total }) =>\n `Showing ${pageShowingRange} of ${total}`\n }\n />\n </div>\n );\n}\n\nDataGridPagination.displayName = \"DataGrid.Pagination\";\n\n// ============================================================================\n// DataGrid Empty\n// ============================================================================\n\n/**\n * Empty state component for DataGrid.\n * Shown when there are no rows to display.\n */\nfunction DataGridEmpty({\n className,\n children,\n title = \"No results\",\n description = \"No data to display.\",\n}: DataGridEmptyProps) {\n const { table } = useDataGridContext();\n\n // Only show if there are no rows\n if (table.getCoreRowModel().rows.length > 0) return null;\n\n return (\n <div className={cn(\"p-8\", className)}>\n {children ?? (\n <Empty\n icon={<FadersHorizontalIcon className=\"size-10 text-sf-subtle\" />}\n title={title}\n description={description}\n />\n )}\n </div>\n );\n}\n\nDataGridEmpty.displayName = \"DataGrid.Empty\";\n\n// ============================================================================\n// DataGrid Root\n// ============================================================================\n\n/**\n * DataGrid root component.\n * Sets up the react-table instance and provides context to child components.\n */\nfunction DataGridRoot<TData extends RowData>({\n data,\n columns,\n sorting: controlledSorting,\n onSortingChange,\n enableSorting = true,\n columnVisibility: controlledColumnVisibility,\n onColumnVisibilityChange,\n enableColumnVisibility = true,\n rowSelection: controlledRowSelection,\n onRowSelectionChange,\n enableRowSelection,\n pageSize = 10,\n pageIndex = 0,\n onPaginationChange,\n totalCount,\n manualPagination = false,\n pageSizeOptions: _pageSizeOptions = DEFAULT_PAGE_SIZE_OPTIONS,\n filters,\n onFiltersChange,\n filterFields,\n enableFiltering,\n layout: _layout = SF_DATA_GRID_DEFAULT_VARIANTS.layout,\n className,\n tableClassName,\n emptyState,\n loading,\n loadingRows,\n toolbar,\n showToolbar = true,\n showPagination = true,\n pagination: customPagination,\n enableColumnResizing,\n columnResizeMode = \"onEnd\",\n virtualized = false,\n estimatedRowHeight = 44,\n overscan = 8,\n maxHeight,\n children,\n}: DataGridProps<TData> & { children?: ReactNode }) {\n // Internal state for uncontrolled mode\n const [internalSorting, setInternalSorting] = useState<SortingState>([]);\n const [internalColumnVisibility, setInternalColumnVisibility] =\n useState<ColumnVisibilityState>({});\n const [internalRowSelection, setInternalRowSelection] =\n useState<RowSelectionState>({});\n const [internalPagination, setInternalPagination] = useState<PaginationState>(\n {\n pageIndex,\n pageSize,\n }\n );\n\n // Determine controlled vs uncontrolled\n const sorting = controlledSorting ?? internalSorting;\n const columnVisibility =\n controlledColumnVisibility ?? internalColumnVisibility;\n const rowSelection = controlledRowSelection ?? internalRowSelection;\n const pagination = internalPagination;\n\n // Handle sorting change\n const handleSortingChange = (\n updater: SortingState | ((old: SortingState) => SortingState)\n ) => {\n const newSorting =\n typeof updater === \"function\" ? updater(sorting) : updater;\n if (onSortingChange) {\n onSortingChange(newSorting);\n } else {\n setInternalSorting(newSorting);\n }\n };\n\n // Handle column visibility change\n const handleColumnVisibilityChange = (\n updater:\n | ColumnVisibilityState\n | ((old: ColumnVisibilityState) => ColumnVisibilityState)\n ) => {\n const newVisibility =\n typeof updater === \"function\" ? updater(columnVisibility) : updater;\n if (onColumnVisibilityChange) {\n onColumnVisibilityChange(newVisibility);\n } else {\n setInternalColumnVisibility(newVisibility);\n }\n };\n\n // Handle row selection change\n const handleRowSelectionChange = (\n updater: RowSelectionState | ((old: RowSelectionState) => RowSelectionState)\n ) => {\n const newSelection =\n typeof updater === \"function\" ? updater(rowSelection) : updater;\n if (onRowSelectionChange) {\n onRowSelectionChange(newSelection);\n } else {\n setInternalRowSelection(newSelection);\n }\n };\n\n // Handle pagination change\n const handlePaginationChange = (\n updater: PaginationState | ((old: PaginationState) => PaginationState)\n ) => {\n const newPagination =\n typeof updater === \"function\" ? updater(pagination) : updater;\n setInternalPagination(newPagination);\n if (onPaginationChange) {\n onPaginationChange({\n pageIndex: newPagination.pageIndex,\n pageSize: newPagination.pageSize,\n });\n }\n };\n\n // Create table instance (TanStack Table v9: modular features + row models)\n const table = useTable({\n _features: dataGridFeatures,\n _rowModels: {\n sortedRowModel: createSortedRowModel(sortFns),\n filteredRowModel: createFilteredRowModel(filterFns),\n paginatedRowModel: createPaginatedRowModel(),\n },\n data,\n columns: columns as ColumnDef<typeof dataGridFeatures, TData, unknown>[],\n state: {\n sorting,\n columnVisibility,\n rowSelection,\n pagination,\n },\n onSortingChange: handleSortingChange,\n onColumnVisibilityChange: handleColumnVisibilityChange,\n onRowSelectionChange: handleRowSelectionChange,\n onPaginationChange: handlePaginationChange,\n enableSorting,\n enableRowSelection: enableRowSelection !== false,\n enableColumnResizing,\n columnResizeMode,\n manualPagination,\n pageCount: manualPagination\n ? Math.ceil((totalCount ?? data.length) / pageSize)\n : undefined,\n enableMultiRowSelection: true,\n });\n\n // Provide context to children\n const contextValue: DataGridContextValue<TData> = {\n table,\n pageSize,\n pageIndex,\n totalCount: totalCount ?? data.length,\n manualPagination,\n loading,\n loadingRows,\n enableColumnResizing,\n columnResizeMode,\n virtualized,\n estimatedRowHeight,\n overscan,\n maxHeight,\n };\n\n return (\n <DataGridContext.Provider value={contextValue as DataGridContextValue}>\n <div\n className={cn(\n \"flex flex-col overflow-hidden rounded-lg border border-sf-line bg-sf-base\",\n className\n )}\n >\n {children || (\n // Auto mode - DataGrid renders everything based on props\n <>\n {/* Toolbar */}\n {showToolbar && (\n <DataGridToolbar>\n {toolbar ?? (\n <>\n {enableFiltering && filterFields && (\n <Filters\n filters={filters ?? []}\n fields={filterFields}\n onChange={onFiltersChange ?? (() => {})}\n size=\"sm\"\n />\n )}\n <div className=\"ml-auto flex items-center gap-2\">\n {enableColumnVisibility && <DataGridColumnToggle />}\n </div>\n </>\n )}\n </DataGridToolbar>\n )}\n\n {/* Table content */}\n <div\n className={cn(\n \"flex-1\",\n // When virtualized, DataGridContent owns its own bounded\n // scroll container, so the wrapper must not scroll too.\n !virtualized && \"overflow-auto\"\n )}\n >\n <DataGridContent className={tableClassName} />\n <DataGridEmpty>{emptyState}</DataGridEmpty>\n </div>\n\n {/* Pagination */}\n {showPagination && (customPagination ?? <DataGridPagination />)}\n </>\n )}\n </div>\n </DataGridContext.Provider>\n );\n}\n\nDataGridRoot.displayName = \"DataGrid\";\n\n// ============================================================================\n// Exports\n// ============================================================================\n\nexport const DataGrid = Object.assign(DataGridRoot, {\n Toolbar: DataGridToolbar,\n Content: DataGridContent,\n Pagination: DataGridPagination,\n ColumnToggle: DataGridColumnToggle,\n Empty: DataGridEmpty,\n});\n\nexport type {\n DataGridProps,\n DataGridColumn,\n DataGridToolbarProps,\n DataGridContentProps,\n DataGridPaginationProps,\n DataGridColumnToggleProps,\n DataGridEmptyProps,\n} from \"./types\";\n"],"mappings":"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"}
|