@hexclave/dashboard-ui-components 1.0.53 → 1.0.54

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (56) hide show
  1. package/dist/components/button.d.ts +4 -4
  2. package/dist/components/data-grid/data-grid-export-dialog.d.ts +1 -1
  3. package/dist/components/data-grid/data-grid-sizing.d.ts +1 -1
  4. package/dist/components/data-grid/data-grid-toolbar.d.ts +1 -1
  5. package/dist/components/data-grid/data-grid-toolbar.js +37 -29
  6. package/dist/components/data-grid/data-grid-toolbar.js.map +1 -1
  7. package/dist/components/data-grid/data-grid.d.ts +1 -1
  8. package/dist/components/data-grid/data-grid.js +96 -12
  9. package/dist/components/data-grid/data-grid.js.map +1 -1
  10. package/dist/components/data-grid/data-grid.test.js +101 -2
  11. package/dist/components/data-grid/data-grid.test.js.map +1 -1
  12. package/dist/components/data-grid/index.d.ts +8 -8
  13. package/dist/components/data-grid/state.d.ts +1 -1
  14. package/dist/components/data-grid/strings.d.ts +1 -1
  15. package/dist/components/data-grid/types.d.ts +1 -1
  16. package/dist/components/data-grid/use-data-source.d.ts +1 -1
  17. package/dist/components/data-grid/use-url-state.d.ts +1 -1
  18. package/dist/dashboard-ui-components.global.js +21287 -4281
  19. package/dist/dashboard-ui-components.global.js.map +4 -4
  20. package/dist/{data-grid-AJi1TNDa.d.ts → data-grid-DWHAjaNo.d.ts} +2 -2
  21. package/dist/data-grid-DWHAjaNo.d.ts.map +1 -0
  22. package/dist/{data-grid-sizing-S1ixcZKo.d.ts → data-grid-sizing-D9y1xwaq.d.ts} +2 -2
  23. package/dist/{data-grid-sizing-S1ixcZKo.d.ts.map → data-grid-sizing-D9y1xwaq.d.ts.map} +1 -1
  24. package/dist/{data-grid-toolbar-BGSNGDpT.d.ts → data-grid-toolbar-dgvnYEpC.d.ts} +10 -6
  25. package/dist/data-grid-toolbar-dgvnYEpC.d.ts.map +1 -0
  26. package/dist/esm/components/button.d.ts +4 -4
  27. package/dist/esm/components/data-grid/data-grid-toolbar.d.ts +8 -4
  28. package/dist/esm/components/data-grid/data-grid-toolbar.d.ts.map +1 -1
  29. package/dist/esm/components/data-grid/data-grid-toolbar.js +38 -30
  30. package/dist/esm/components/data-grid/data-grid-toolbar.js.map +1 -1
  31. package/dist/esm/components/data-grid/data-grid.d.ts.map +1 -1
  32. package/dist/esm/components/data-grid/data-grid.js +96 -12
  33. package/dist/esm/components/data-grid/data-grid.js.map +1 -1
  34. package/dist/esm/components/data-grid/data-grid.test.js +102 -3
  35. package/dist/esm/components/data-grid/data-grid.test.js.map +1 -1
  36. package/dist/esm/components/data-grid/types.d.ts +7 -0
  37. package/dist/esm/components/data-grid/types.d.ts.map +1 -1
  38. package/dist/esm/package.json +12 -0
  39. package/dist/index.d.ts +8 -8
  40. package/dist/{state-6LW8ACh5.d.ts → state-D5wpAg_G.d.ts} +2 -2
  41. package/dist/{state-6LW8ACh5.d.ts.map → state-D5wpAg_G.d.ts.map} +1 -1
  42. package/dist/{strings-CACVtKlq.d.ts → strings-DsIJ_o4-.d.ts} +2 -2
  43. package/dist/{strings-CACVtKlq.d.ts.map → strings-DsIJ_o4-.d.ts.map} +1 -1
  44. package/dist/{types-1-eOd1JF.d.ts → types-D8o47V7M.d.ts} +8 -1
  45. package/dist/{types-1-eOd1JF.d.ts.map → types-D8o47V7M.d.ts.map} +1 -1
  46. package/dist/{use-data-source-BVFynerX.d.ts → use-data-source-CAZPhl8e.d.ts} +2 -2
  47. package/dist/{use-data-source-BVFynerX.d.ts.map → use-data-source-CAZPhl8e.d.ts.map} +1 -1
  48. package/dist/{use-url-state-B4_wnBjm.d.ts → use-url-state-97YdV81Q.d.ts} +2 -2
  49. package/dist/{use-url-state-B4_wnBjm.d.ts.map → use-url-state-97YdV81Q.d.ts.map} +1 -1
  50. package/package.json +3 -3
  51. package/src/components/data-grid/data-grid-toolbar.tsx +20 -6
  52. package/src/components/data-grid/data-grid.test.tsx +127 -1
  53. package/src/components/data-grid/data-grid.tsx +174 -37
  54. package/src/components/data-grid/types.ts +7 -0
  55. package/dist/data-grid-AJi1TNDa.d.ts.map +0 -1
  56. package/dist/data-grid-toolbar-BGSNGDpT.d.ts.map +0 -1
@@ -1 +1 @@
1
- {"version":3,"file":"data-grid.test.js","names":[],"sources":["../../../../src/components/data-grid/data-grid.test.tsx"],"sourcesContent":["// @vitest-environment jsdom\n\nimport { act, cleanup, fireEvent, render, waitFor } from \"@testing-library/react\";\nimport { useMemo, useState } from \"react\";\nimport { afterEach, beforeEach, describe, expect, it, vi } from \"vitest\";\nimport {\n createDefaultDataGridState,\n DataGrid,\n isDataGridInteractiveRowClickTarget,\n useDataSource,\n type DataGridColumnDef,\n type DataGridDataSource,\n type DataGridProps,\n} from \"./index\";\n\ntype Row = {\n id: string,\n name: string,\n};\n\nconst columns: DataGridColumnDef<Row>[] = [\n {\n id: \"name\",\n header: \"Name\",\n accessor: (row) => row.name,\n width: 160,\n minWidth: 80,\n sortable: true,\n type: \"string\",\n },\n];\n\nconst wideColumns: DataGridColumnDef<Row>[] = [\n {\n id: \"name\",\n header: \"Name\",\n accessor: (row) => row.name,\n width: 320,\n minWidth: 80,\n type: \"string\",\n },\n {\n id: \"email\",\n header: \"Email\",\n accessor: (row) => `${row.name.toLowerCase().replaceAll(\" \", \".\")}@example.com`,\n width: 420,\n minWidth: 80,\n type: \"string\",\n },\n];\n\ntype ObserverRecord = {\n options?: IntersectionObserverInit,\n};\n\nlet intersectionObserverRecords: ObserverRecord[] = [];\nlet intersectionObserverInstances: MockIntersectionObserver[] = [];\n\nclass MockIntersectionObserver implements IntersectionObserver {\n readonly root: Element | Document | null;\n readonly rootMargin: string;\n readonly scrollMargin: string;\n readonly thresholds: ReadonlyArray<number>;\n private readonly callback: IntersectionObserverCallback;\n private readonly record: ObserverRecord;\n\n constructor(\n callback: IntersectionObserverCallback,\n options?: IntersectionObserverInit,\n ) {\n this.callback = callback;\n this.root = options?.root ?? null;\n this.rootMargin = options?.rootMargin ?? \"\";\n this.scrollMargin = \"\";\n this.thresholds = Array.isArray(options?.threshold)\n ? options.threshold\n : [options?.threshold ?? 0];\n this.record = { options };\n intersectionObserverRecords.push(this.record);\n intersectionObserverInstances.push(this);\n }\n\n disconnect() {}\n observe() {}\n takeRecords(): IntersectionObserverEntry[] {\n return [];\n }\n unobserve() {}\n\n trigger(entry: Partial<IntersectionObserverEntry> = {}) {\n this.callback(\n [\n {\n boundingClientRect: {} as DOMRectReadOnly,\n intersectionRatio: 1,\n intersectionRect: {} as DOMRectReadOnly,\n isIntersecting: true,\n rootBounds: null,\n target: document.createElement(\"div\"),\n time: 0,\n ...entry,\n },\n ],\n this,\n );\n }\n}\n\nclass MockResizeObserver implements ResizeObserver {\n private readonly callback: ResizeObserverCallback;\n\n constructor(callback: ResizeObserverCallback) {\n this.callback = callback;\n }\n\n disconnect() {}\n observe(target: Element) {\n const el = target instanceof HTMLElement ? target : null;\n const parentWidth = el?.parentElement instanceof HTMLElement ? el.parentElement.clientWidth : 0;\n const width = (el?.clientWidth ?? 0) > 0 ? (el?.clientWidth ?? 320) : parentWidth > 0 ? parentWidth : 320;\n const height = (el?.clientHeight ?? 0) > 0 ? (el?.clientHeight ?? 400) : 400;\n this.callback(\n [\n {\n target,\n contentRect: {\n x: 0,\n y: 0,\n width,\n height,\n top: 0,\n left: 0,\n right: width,\n bottom: height,\n toJSON() {\n return this;\n },\n } as DOMRectReadOnly,\n borderBoxSize: [],\n contentBoxSize: [],\n devicePixelContentBoxSize: [],\n },\n ],\n this,\n );\n }\n unobserve() {}\n}\n\nfunction DataGridHarness(props: { fillHeight?: boolean }) {\n const [state, setState] = useState(() => createDefaultDataGridState(columns));\n\n return (\n <div style={{ height: 400 }}>\n <DataGrid<Row>\n columns={columns}\n rows={[{ id: \"row-1\", name: \"Row 1\" }]}\n getRowId={(row) => row.id}\n state={state}\n onChange={setState}\n paginationMode=\"infinite\"\n hasMore\n fillHeight={props.fillHeight}\n />\n </div>\n );\n}\n\nfunction PaginatedDataGridHarness() {\n const [state, setState] = useState(() => createDefaultDataGridState(columns));\n\n return (\n <div style={{ height: 400 }}>\n <DataGrid<Row>\n columns={columns}\n rows={[{ id: \"row-1\", name: \"Row 1\" }]}\n getRowId={(row) => row.id}\n state={state}\n onChange={setState}\n paginationMode=\"paginated\"\n fillHeight={false}\n />\n </div>\n );\n}\n\nfunction InteractiveDataGridHarness(props: {\n onSortChange?: DataGridProps<Row>[\"onSortChange\"],\n onSelectionChange?: DataGridProps<Row>[\"onSelectionChange\"],\n}) {\n const [state, setState] = useState(() => createDefaultDataGridState(columns));\n\n return (\n <DataGrid<Row>\n columns={columns}\n rows={[{ id: \"row-1\", name: \"Row 1\" }]}\n getRowId={(row) => row.id}\n state={state}\n onChange={setState}\n selectionMode=\"multiple\"\n onSortChange={props.onSortChange}\n onSelectionChange={props.onSelectionChange}\n />\n );\n}\n\nfunction WideDataGridHarness() {\n const [state, setState] = useState(() => createDefaultDataGridState(wideColumns));\n\n return (\n <div style={{ width: 320 }}>\n <DataGrid<Row>\n columns={wideColumns}\n rows={[{ id: \"row-1\", name: \"Row 1\" }]}\n getRowId={(row) => row.id}\n state={state}\n onChange={setState}\n />\n </div>\n );\n}\n\ndescribe(\"DataGrid infinite scroll observer\", () => {\n beforeEach(() => {\n intersectionObserverRecords = [];\n\n vi.stubGlobal(\"IntersectionObserver\", MockIntersectionObserver);\n vi.stubGlobal(\"ResizeObserver\", MockResizeObserver);\n vi.spyOn(HTMLElement.prototype, \"getBoundingClientRect\").mockImplementation(\n function getBoundingClientRect() {\n return {\n x: 0,\n y: 0,\n width: 320,\n height: 44,\n top: 0,\n left: 0,\n right: 320,\n bottom: 44,\n toJSON() {\n return this;\n },\n } as DOMRect;\n },\n );\n Object.defineProperty(HTMLElement.prototype, \"clientHeight\", {\n configurable: true,\n get() {\n return 400;\n },\n });\n Object.defineProperty(HTMLElement.prototype, \"scrollHeight\", {\n configurable: true,\n get() {\n return 400;\n },\n });\n });\n\n afterEach(() => {\n cleanup();\n vi.restoreAllMocks();\n vi.unstubAllGlobals();\n });\n\n it(\"observes against the grid body when the grid owns vertical scrolling\", async () => {\n const { container } = render(<DataGridHarness fillHeight />);\n\n await waitFor(() => {\n expect(intersectionObserverRecords.length).toBeGreaterThan(0);\n });\n\n const grid = container.querySelector('[role=\"grid\"]');\n expect(grid).not.toBeNull();\n const scrollContainer = grid?.children.item(1);\n\n expect(intersectionObserverRecords.at(-1)?.options?.root).toBe(scrollContainer);\n });\n\n // Regression: an infinite grid left unbounded (`fillHeight={false}`, no `maxHeight`) used to\n // grow its scroll container to fit every loaded row, which defeats virtualization (the\n // virtualizer measures the container as fully visible and mounts every row) and OOMs the tab on\n // large datasets. Such grids now fall back to a default `maxHeight`, so the grid owns its own\n // bounded scroll container and observes against it rather than the viewport.\n it(\"bounds an unbounded infinite grid and observes against its own scroll container\", async () => {\n const { container } = render(<DataGridHarness fillHeight={false} />);\n\n await waitFor(() => {\n expect(intersectionObserverRecords.length).toBeGreaterThan(0);\n });\n\n const grid = container.querySelector('[role=\"grid\"]');\n expect(grid).not.toBeNull();\n const scrollContainer = grid?.children.item(1);\n\n expect(intersectionObserverRecords.at(-1)?.options?.root).toBe(scrollContainer);\n });\n\n it(\"applies a default maxHeight to an otherwise-unbounded infinite grid\", () => {\n const { container } = render(<DataGridHarness fillHeight={false} />);\n\n const grid = container.querySelector<HTMLElement>('[role=\"grid\"]');\n expect(grid).not.toBeNull();\n expect(grid?.style.maxHeight).toBe(\"calc(100dvh - 16rem)\");\n });\n\n it(\"does not force a maxHeight onto a paginated grid\", () => {\n const { container } = render(<PaginatedDataGridHarness />);\n\n const grid = container.querySelector<HTMLElement>('[role=\"grid\"]');\n expect(grid).not.toBeNull();\n expect(grid?.style.maxHeight).toBe(\"\");\n });\n});\n\n// Drives a real `useDataSource` infinite-scroll grid whose data source\n// always reports `hasMore: true`, mirroring a project with a long\n// transaction / customer history (e.g. the transactions table and customers\n// tab). Used to prove the sentinel doesn't thrash its IntersectionObserver.\nfunction InfiniteScrollLoadMoreHarness({ onFetch }: { onFetch: () => void }) {\n const [state, setState] = useState(() => createDefaultDataGridState(columns));\n const dataSource = useMemo<DataGridDataSource<Row>>(\n () => {\n let page = 0;\n return async function* () {\n onFetch();\n const current = page++;\n yield {\n rows: [{ id: `row-${current}`, name: `Row ${current}` }],\n hasMore: true,\n nextCursor: `cursor-${current}`,\n };\n };\n },\n [onFetch],\n );\n\n const gridData = useDataSource<Row>({\n dataSource,\n columns,\n getRowId: (row) => row.id,\n sorting: state.sorting,\n quickSearch: state.quickSearch,\n pagination: state.pagination,\n paginationMode: \"infinite\",\n });\n\n return (\n <div style={{ height: 400 }}>\n <DataGrid<Row>\n columns={columns}\n rows={gridData.rows}\n getRowId={(row) => row.id}\n state={state}\n onChange={setState}\n paginationMode=\"infinite\"\n hasMore={gridData.hasMore}\n isLoading={gridData.isLoading}\n isLoadingMore={gridData.isLoadingMore}\n onLoadMore={gridData.loadMore}\n />\n </div>\n );\n}\n\ndescribe(\"DataGrid infinite scroll observer stability\", () => {\n beforeEach(() => {\n intersectionObserverRecords = [];\n intersectionObserverInstances = [];\n\n vi.stubGlobal(\"IntersectionObserver\", MockIntersectionObserver);\n vi.stubGlobal(\"ResizeObserver\", MockResizeObserver);\n vi.spyOn(HTMLElement.prototype, \"getBoundingClientRect\").mockImplementation(\n function getBoundingClientRect() {\n return {\n x: 0,\n y: 0,\n width: 320,\n height: 44,\n top: 0,\n left: 0,\n right: 320,\n bottom: 44,\n toJSON() {\n return this;\n },\n } as DOMRect;\n },\n );\n Object.defineProperty(HTMLElement.prototype, \"clientHeight\", {\n configurable: true,\n get() {\n return 400;\n },\n });\n Object.defineProperty(HTMLElement.prototype, \"scrollHeight\", {\n configurable: true,\n get() {\n return 400;\n },\n });\n });\n\n afterEach(() => {\n cleanup();\n vi.restoreAllMocks();\n vi.unstubAllGlobals();\n });\n\n // Regression: the sentinel used to re-create its IntersectionObserver every\n // time the `onLoadMore` callback changed identity (which happens on every\n // `isLoadingMore` / `hasMore` toggle). A freshly-created observer re-reports\n // the sentinel's current intersection state, so a sentinel that stays in\n // view fires `onLoadMore` again after every page — auto-loading the entire\n // history back-to-back and OOM-crashing the tab (\"Aw snap\") on large\n // datasets. The observer must stay stable across load-more cycles.\n it(\"does not re-create the observer on load-more cycles\", async () => {\n const onFetch = vi.fn();\n render(<InfiniteScrollLoadMoreHarness onFetch={onFetch} />);\n\n // Initial page load, after which the sentinel (and its observer) mounts.\n await waitFor(() => expect(onFetch).toHaveBeenCalledTimes(1));\n await waitFor(() => expect(intersectionObserverInstances.length).toBeGreaterThan(0));\n\n const observersBeforeLoadMore = intersectionObserverInstances.length;\n\n // Simulate the sentinel scrolling into view exactly once.\n await act(async () => {\n intersectionObserverInstances.at(-1)?.trigger();\n await Promise.resolve();\n });\n\n await waitFor(() => expect(onFetch).toHaveBeenCalledTimes(2));\n\n // A single scroll-in must trigger a single fetch, without spawning new\n // observers — otherwise each new observer would re-fire and runaway.\n expect(intersectionObserverInstances.length).toBe(observersBeforeLoadMore);\n });\n});\n\ndescribe(\"DataGrid controlled callbacks\", () => {\n beforeEach(() => {\n vi.stubGlobal(\"ResizeObserver\", MockResizeObserver);\n vi.spyOn(HTMLElement.prototype, \"getBoundingClientRect\").mockImplementation(\n function getBoundingClientRect() {\n return {\n x: 0,\n y: 0,\n width: 320,\n height: 44,\n top: 0,\n left: 0,\n right: 320,\n bottom: 44,\n toJSON() {\n return this;\n },\n } as DOMRect;\n },\n );\n Object.defineProperty(HTMLElement.prototype, \"clientHeight\", {\n configurable: true,\n get() {\n return 400;\n },\n });\n Object.defineProperty(HTMLElement.prototype, \"scrollHeight\", {\n configurable: true,\n get() {\n return 400;\n },\n });\n });\n\n afterEach(() => {\n cleanup();\n vi.restoreAllMocks();\n vi.unstubAllGlobals();\n });\n\n it(\"fires onSortChange from the current controlled sort state\", () => {\n const onSortChange = vi.fn();\n const { getByRole } = render(<InteractiveDataGridHarness onSortChange={onSortChange} />);\n\n fireEvent.click(getByRole(\"columnheader\", { name: /name/i }));\n\n expect(onSortChange).toHaveBeenCalledTimes(1);\n expect(onSortChange).toHaveBeenCalledWith([{ columnId: \"name\", direction: \"asc\" }]);\n });\n\n it(\"fires onSelectionChange when selecting all rows\", () => {\n const onSelectionChange = vi.fn();\n const { getByRole } = render(<InteractiveDataGridHarness onSelectionChange={onSelectionChange} />);\n\n fireEvent.click(getByRole(\"checkbox\", { name: /select all rows/i }));\n\n expect(onSelectionChange).toHaveBeenCalledTimes(1);\n const [selectedIds, selectedRows] = onSelectionChange.mock.calls[0];\n expect([...selectedIds]).toEqual([\"row-1\"]);\n expect(selectedRows).toEqual([{ id: \"row-1\", name: \"Row 1\" }]);\n });\n\n it(\"identifies nested interactive controls as row-click blockers\", () => {\n const cell = document.createElement(\"div\");\n const button = document.createElement(\"button\");\n const label = document.createElement(\"span\");\n label.textContent = \"Open menu\";\n button.append(label);\n cell.append(button);\n\n expect(isDataGridInteractiveRowClickTarget(label.firstChild)).toBe(true);\n expect(isDataGridInteractiveRowClickTarget(cell)).toBe(false);\n });\n});\n\ndescribe(\"DataGrid horizontal scrolling\", () => {\n beforeEach(() => {\n vi.stubGlobal(\"ResizeObserver\", MockResizeObserver);\n Object.defineProperty(HTMLElement.prototype, \"clientWidth\", {\n configurable: true,\n get() {\n return 320;\n },\n });\n vi.spyOn(HTMLElement.prototype, \"getBoundingClientRect\").mockImplementation(\n function getBoundingClientRect() {\n return {\n x: 0,\n y: 0,\n width: 320,\n height: 44,\n top: 0,\n left: 0,\n right: 320,\n bottom: 44,\n toJSON() {\n return this;\n },\n } as DOMRect;\n },\n );\n Object.defineProperty(HTMLElement.prototype, \"clientHeight\", {\n configurable: true,\n get() {\n return 400;\n },\n });\n Object.defineProperty(HTMLElement.prototype, \"scrollHeight\", {\n configurable: true,\n get() {\n return 400;\n },\n });\n });\n\n afterEach(() => {\n cleanup();\n vi.restoreAllMocks();\n vi.unstubAllGlobals();\n });\n\n it(\"sizes the sticky clipping layer to the full row width\", () => {\n const { container } = render(<WideDataGridHarness />);\n\n const rowsClip = container.querySelector(\"[data-data-grid-rows-clip]\");\n\n expect(rowsClip).toBeInstanceOf(HTMLElement);\n expect((rowsClip as HTMLElement).style.minWidth).toBe(\"740px\");\n });\n\n it(\"lets the columns popover escape the sticky toolbar bounds\", () => {\n const { container, getByTitle } = render(<WideDataGridHarness />);\n\n fireEvent.click(getByTitle(\"Columns\"));\n\n const stickyChrome = container.querySelector('[role=\"grid\"]')?.firstElementChild;\n expect(stickyChrome).toBeInstanceOf(HTMLElement);\n expect((stickyChrome as HTMLElement).className).toContain(\"overflow-visible\");\n expect(container.textContent).toContain(\"Email\");\n });\n});\n"],"mappings":"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"}
1
+ {"version":3,"file":"data-grid.test.js","names":[],"sources":["../../../../src/components/data-grid/data-grid.test.tsx"],"sourcesContent":["// @vitest-environment jsdom\n\nimport { act, cleanup, fireEvent, render, waitFor } from \"@testing-library/react\";\nimport { useMemo, useState } from \"react\";\nimport { afterEach, beforeEach, describe, expect, it, vi } from \"vitest\";\nimport {\n createDefaultDataGridState,\n DATA_GRID_DEFAULT_STRINGS,\n DataGrid,\n DataGridToolbar,\n isDataGridInteractiveRowClickTarget,\n useDataSource,\n type DataGridColumnDef,\n type DataGridDataSource,\n type DataGridProps,\n} from \"./index\";\n\ntype Row = {\n id: string,\n name: string,\n};\n\nconst columns: DataGridColumnDef<Row>[] = [\n {\n id: \"name\",\n header: \"Name\",\n accessor: (row) => row.name,\n width: 160,\n minWidth: 80,\n sortable: true,\n type: \"string\",\n },\n];\n\nconst wideColumns: DataGridColumnDef<Row>[] = [\n {\n id: \"name\",\n header: \"Name\",\n accessor: (row) => row.name,\n width: 320,\n minWidth: 80,\n type: \"string\",\n },\n {\n id: \"email\",\n header: \"Email\",\n accessor: (row) => `${row.name.toLowerCase().replaceAll(\" \", \".\")}@example.com`,\n width: 420,\n minWidth: 80,\n type: \"string\",\n },\n];\n\ndescribe(\"DataGridToolbar action divider\", () => {\n const ctx = {\n state: createDefaultDataGridState(columns),\n onChange: vi.fn(),\n columns,\n visibleColumns: columns,\n totalRowCount: 1,\n selectedRowCount: 0,\n strings: DATA_GRID_DEFAULT_STRINGS,\n exportCsv: vi.fn(),\n };\n\n afterEach(cleanup);\n\n it(\"does not render a divider for an empty React node\", () => {\n const { container } = render(\n <DataGridToolbar ctx={ctx} extraActions={false} />,\n );\n\n expect(container.querySelector(\".mx-0\\\\.5.h-4.w-px\")).toBeNull();\n });\n\n it(\"renders the divider when an action is visible\", () => {\n const { container, getByRole } = render(\n <DataGridToolbar\n ctx={ctx}\n extraActions={<button type=\"button\">Refresh</button>}\n />,\n );\n\n expect(getByRole(\"button\", { name: \"Refresh\" })).not.toBeNull();\n expect(container.querySelector(\".mx-0\\\\.5.h-4.w-px\")).not.toBeNull();\n });\n});\n\ntype ObserverRecord = {\n options?: IntersectionObserverInit,\n};\n\nlet intersectionObserverRecords: ObserverRecord[] = [];\nlet intersectionObserverInstances: MockIntersectionObserver[] = [];\n\nclass MockIntersectionObserver implements IntersectionObserver {\n readonly root: Element | Document | null;\n readonly rootMargin: string;\n readonly scrollMargin: string;\n readonly thresholds: ReadonlyArray<number>;\n private readonly callback: IntersectionObserverCallback;\n private readonly record: ObserverRecord;\n\n constructor(\n callback: IntersectionObserverCallback,\n options?: IntersectionObserverInit,\n ) {\n this.callback = callback;\n this.root = options?.root ?? null;\n this.rootMargin = options?.rootMargin ?? \"\";\n this.scrollMargin = \"\";\n this.thresholds = Array.isArray(options?.threshold)\n ? options.threshold\n : [options?.threshold ?? 0];\n this.record = { options };\n intersectionObserverRecords.push(this.record);\n intersectionObserverInstances.push(this);\n }\n\n disconnect() {}\n observe() {}\n takeRecords(): IntersectionObserverEntry[] {\n return [];\n }\n unobserve() {}\n\n trigger(entry: Partial<IntersectionObserverEntry> = {}) {\n this.callback(\n [\n {\n boundingClientRect: {} as DOMRectReadOnly,\n intersectionRatio: 1,\n intersectionRect: {} as DOMRectReadOnly,\n isIntersecting: true,\n rootBounds: null,\n target: document.createElement(\"div\"),\n time: 0,\n ...entry,\n },\n ],\n this,\n );\n }\n}\n\nclass MockResizeObserver implements ResizeObserver {\n private readonly callback: ResizeObserverCallback;\n\n constructor(callback: ResizeObserverCallback) {\n this.callback = callback;\n }\n\n disconnect() {}\n observe(target: Element) {\n const el = target instanceof HTMLElement ? target : null;\n const parentWidth = el?.parentElement instanceof HTMLElement ? el.parentElement.clientWidth : 0;\n const width = (el?.clientWidth ?? 0) > 0 ? (el?.clientWidth ?? 320) : parentWidth > 0 ? parentWidth : 320;\n const height = (el?.clientHeight ?? 0) > 0 ? (el?.clientHeight ?? 400) : 400;\n this.callback(\n [\n {\n target,\n contentRect: {\n x: 0,\n y: 0,\n width,\n height,\n top: 0,\n left: 0,\n right: width,\n bottom: height,\n toJSON() {\n return this;\n },\n } as DOMRectReadOnly,\n borderBoxSize: [],\n contentBoxSize: [],\n devicePixelContentBoxSize: [],\n },\n ],\n this,\n );\n }\n unobserve() {}\n}\n\nfunction DataGridHarness(props: { fillHeight?: boolean }) {\n const [state, setState] = useState(() => createDefaultDataGridState(columns));\n\n return (\n <div style={{ height: 400 }}>\n <DataGrid<Row>\n columns={columns}\n rows={[{ id: \"row-1\", name: \"Row 1\" }]}\n getRowId={(row) => row.id}\n state={state}\n onChange={setState}\n paginationMode=\"infinite\"\n hasMore\n fillHeight={props.fillHeight}\n />\n </div>\n );\n}\n\nfunction PaginatedDataGridHarness() {\n const [state, setState] = useState(() => createDefaultDataGridState(columns));\n\n return (\n <div style={{ height: 400 }}>\n <DataGrid<Row>\n columns={columns}\n rows={[{ id: \"row-1\", name: \"Row 1\" }]}\n getRowId={(row) => row.id}\n state={state}\n onChange={setState}\n paginationMode=\"paginated\"\n fillHeight={false}\n />\n </div>\n );\n}\n\nfunction InteractiveDataGridHarness(props: {\n onSortChange?: DataGridProps<Row>[\"onSortChange\"],\n onSelectionChange?: DataGridProps<Row>[\"onSelectionChange\"],\n}) {\n const [state, setState] = useState(() => createDefaultDataGridState(columns));\n\n return (\n <DataGrid<Row>\n columns={columns}\n rows={[{ id: \"row-1\", name: \"Row 1\" }]}\n getRowId={(row) => row.id}\n state={state}\n onChange={setState}\n selectionMode=\"multiple\"\n onSortChange={props.onSortChange}\n onSelectionChange={props.onSelectionChange}\n />\n );\n}\n\nfunction WideDataGridHarness(props: {\n horizontalScrollbarPosition?: \"top\" | \"bottom\",\n} = {}) {\n const [state, setState] = useState(() => createDefaultDataGridState(wideColumns));\n\n return (\n <div style={{ width: 320 }}>\n <DataGrid<Row>\n columns={wideColumns}\n rows={[{ id: \"row-1\", name: \"Row 1\" }]}\n getRowId={(row) => row.id}\n state={state}\n onChange={setState}\n horizontalScrollbarPosition={props.horizontalScrollbarPosition}\n />\n </div>\n );\n}\n\ndescribe(\"DataGrid infinite scroll observer\", () => {\n beforeEach(() => {\n intersectionObserverRecords = [];\n\n vi.stubGlobal(\"IntersectionObserver\", MockIntersectionObserver);\n vi.stubGlobal(\"ResizeObserver\", MockResizeObserver);\n vi.spyOn(HTMLElement.prototype, \"getBoundingClientRect\").mockImplementation(\n function getBoundingClientRect() {\n return {\n x: 0,\n y: 0,\n width: 320,\n height: 44,\n top: 0,\n left: 0,\n right: 320,\n bottom: 44,\n toJSON() {\n return this;\n },\n } as DOMRect;\n },\n );\n Object.defineProperty(HTMLElement.prototype, \"clientHeight\", {\n configurable: true,\n get() {\n return 400;\n },\n });\n Object.defineProperty(HTMLElement.prototype, \"scrollHeight\", {\n configurable: true,\n get() {\n return 400;\n },\n });\n });\n\n afterEach(() => {\n cleanup();\n vi.restoreAllMocks();\n vi.unstubAllGlobals();\n });\n\n it(\"observes against the grid body when the grid owns vertical scrolling\", async () => {\n const { container } = render(<DataGridHarness fillHeight />);\n\n await waitFor(() => {\n expect(intersectionObserverRecords.length).toBeGreaterThan(0);\n });\n\n const grid = container.querySelector('[role=\"grid\"]');\n expect(grid).not.toBeNull();\n const scrollContainer = grid?.children.item(1);\n\n expect(intersectionObserverRecords.at(-1)?.options?.root).toBe(scrollContainer);\n });\n\n // Regression: an infinite grid left unbounded (`fillHeight={false}`, no `maxHeight`) used to\n // grow its scroll container to fit every loaded row, which defeats virtualization (the\n // virtualizer measures the container as fully visible and mounts every row) and OOMs the tab on\n // large datasets. Such grids now fall back to a default `maxHeight`, so the grid owns its own\n // bounded scroll container and observes against it rather than the viewport.\n it(\"bounds an unbounded infinite grid and observes against its own scroll container\", async () => {\n const { container } = render(<DataGridHarness fillHeight={false} />);\n\n await waitFor(() => {\n expect(intersectionObserverRecords.length).toBeGreaterThan(0);\n });\n\n const grid = container.querySelector('[role=\"grid\"]');\n expect(grid).not.toBeNull();\n const scrollContainer = grid?.children.item(1);\n\n expect(intersectionObserverRecords.at(-1)?.options?.root).toBe(scrollContainer);\n });\n\n it(\"applies a default maxHeight to an otherwise-unbounded infinite grid\", () => {\n const { container } = render(<DataGridHarness fillHeight={false} />);\n\n const grid = container.querySelector<HTMLElement>('[role=\"grid\"]');\n expect(grid).not.toBeNull();\n expect(grid?.style.maxHeight).toBe(\"calc(100dvh - 16rem)\");\n });\n\n it(\"does not force a maxHeight onto a paginated grid\", () => {\n const { container } = render(<PaginatedDataGridHarness />);\n\n const grid = container.querySelector<HTMLElement>('[role=\"grid\"]');\n expect(grid).not.toBeNull();\n expect(grid?.style.maxHeight).toBe(\"\");\n });\n});\n\n// Drives a real `useDataSource` infinite-scroll grid whose data source\n// always reports `hasMore: true`, mirroring a project with a long\n// transaction / customer history (e.g. the transactions table and customers\n// tab). Used to prove the sentinel doesn't thrash its IntersectionObserver.\nfunction InfiniteScrollLoadMoreHarness({ onFetch }: { onFetch: () => void }) {\n const [state, setState] = useState(() => createDefaultDataGridState(columns));\n const dataSource = useMemo<DataGridDataSource<Row>>(\n () => {\n let page = 0;\n return async function* () {\n onFetch();\n const current = page++;\n yield {\n rows: [{ id: `row-${current}`, name: `Row ${current}` }],\n hasMore: true,\n nextCursor: `cursor-${current}`,\n };\n };\n },\n [onFetch],\n );\n\n const gridData = useDataSource<Row>({\n dataSource,\n columns,\n getRowId: (row) => row.id,\n sorting: state.sorting,\n quickSearch: state.quickSearch,\n pagination: state.pagination,\n paginationMode: \"infinite\",\n });\n\n return (\n <div style={{ height: 400 }}>\n <DataGrid<Row>\n columns={columns}\n rows={gridData.rows}\n getRowId={(row) => row.id}\n state={state}\n onChange={setState}\n paginationMode=\"infinite\"\n hasMore={gridData.hasMore}\n isLoading={gridData.isLoading}\n isLoadingMore={gridData.isLoadingMore}\n onLoadMore={gridData.loadMore}\n />\n </div>\n );\n}\n\ndescribe(\"DataGrid infinite scroll observer stability\", () => {\n beforeEach(() => {\n intersectionObserverRecords = [];\n intersectionObserverInstances = [];\n\n vi.stubGlobal(\"IntersectionObserver\", MockIntersectionObserver);\n vi.stubGlobal(\"ResizeObserver\", MockResizeObserver);\n vi.spyOn(HTMLElement.prototype, \"getBoundingClientRect\").mockImplementation(\n function getBoundingClientRect() {\n return {\n x: 0,\n y: 0,\n width: 320,\n height: 44,\n top: 0,\n left: 0,\n right: 320,\n bottom: 44,\n toJSON() {\n return this;\n },\n } as DOMRect;\n },\n );\n Object.defineProperty(HTMLElement.prototype, \"clientHeight\", {\n configurable: true,\n get() {\n return 400;\n },\n });\n Object.defineProperty(HTMLElement.prototype, \"scrollHeight\", {\n configurable: true,\n get() {\n return 400;\n },\n });\n });\n\n afterEach(() => {\n cleanup();\n vi.restoreAllMocks();\n vi.unstubAllGlobals();\n });\n\n // Regression: the sentinel used to re-create its IntersectionObserver every\n // time the `onLoadMore` callback changed identity (which happens on every\n // `isLoadingMore` / `hasMore` toggle). A freshly-created observer re-reports\n // the sentinel's current intersection state, so a sentinel that stays in\n // view fires `onLoadMore` again after every page — auto-loading the entire\n // history back-to-back and OOM-crashing the tab (\"Aw snap\") on large\n // datasets. The observer must stay stable across load-more cycles.\n it(\"does not re-create the observer on load-more cycles\", async () => {\n const onFetch = vi.fn();\n render(<InfiniteScrollLoadMoreHarness onFetch={onFetch} />);\n\n // Initial page load, after which the sentinel (and its observer) mounts.\n await waitFor(() => expect(onFetch).toHaveBeenCalledTimes(1));\n await waitFor(() => expect(intersectionObserverInstances.length).toBeGreaterThan(0));\n\n const observersBeforeLoadMore = intersectionObserverInstances.length;\n\n // Simulate the sentinel scrolling into view exactly once.\n await act(async () => {\n intersectionObserverInstances.at(-1)?.trigger();\n await Promise.resolve();\n });\n\n await waitFor(() => expect(onFetch).toHaveBeenCalledTimes(2));\n\n // A single scroll-in must trigger a single fetch, without spawning new\n // observers — otherwise each new observer would re-fire and runaway.\n expect(intersectionObserverInstances.length).toBe(observersBeforeLoadMore);\n });\n});\n\ndescribe(\"DataGrid controlled callbacks\", () => {\n beforeEach(() => {\n vi.stubGlobal(\"ResizeObserver\", MockResizeObserver);\n vi.spyOn(HTMLElement.prototype, \"getBoundingClientRect\").mockImplementation(\n function getBoundingClientRect() {\n return {\n x: 0,\n y: 0,\n width: 320,\n height: 44,\n top: 0,\n left: 0,\n right: 320,\n bottom: 44,\n toJSON() {\n return this;\n },\n } as DOMRect;\n },\n );\n Object.defineProperty(HTMLElement.prototype, \"clientHeight\", {\n configurable: true,\n get() {\n return 400;\n },\n });\n Object.defineProperty(HTMLElement.prototype, \"scrollHeight\", {\n configurable: true,\n get() {\n return 400;\n },\n });\n });\n\n afterEach(() => {\n cleanup();\n vi.restoreAllMocks();\n vi.unstubAllGlobals();\n });\n\n it(\"fires onSortChange from the current controlled sort state\", () => {\n const onSortChange = vi.fn();\n const { getByRole } = render(<InteractiveDataGridHarness onSortChange={onSortChange} />);\n\n fireEvent.click(getByRole(\"columnheader\", { name: /name/i }));\n\n expect(onSortChange).toHaveBeenCalledTimes(1);\n expect(onSortChange).toHaveBeenCalledWith([{ columnId: \"name\", direction: \"asc\" }]);\n });\n\n it(\"fires onSelectionChange when selecting all rows\", () => {\n const onSelectionChange = vi.fn();\n const { getByRole } = render(<InteractiveDataGridHarness onSelectionChange={onSelectionChange} />);\n\n fireEvent.click(getByRole(\"checkbox\", { name: /select all rows/i }));\n\n expect(onSelectionChange).toHaveBeenCalledTimes(1);\n const [selectedIds, selectedRows] = onSelectionChange.mock.calls[0];\n expect([...selectedIds]).toEqual([\"row-1\"]);\n expect(selectedRows).toEqual([{ id: \"row-1\", name: \"Row 1\" }]);\n });\n\n it(\"identifies nested interactive controls as row-click blockers\", () => {\n const cell = document.createElement(\"div\");\n const button = document.createElement(\"button\");\n const label = document.createElement(\"span\");\n label.textContent = \"Open menu\";\n button.append(label);\n cell.append(button);\n\n expect(isDataGridInteractiveRowClickTarget(label.firstChild)).toBe(true);\n expect(isDataGridInteractiveRowClickTarget(cell)).toBe(false);\n });\n});\n\ndescribe(\"DataGrid horizontal scrolling\", () => {\n beforeEach(() => {\n vi.stubGlobal(\"ResizeObserver\", MockResizeObserver);\n Object.defineProperty(HTMLElement.prototype, \"clientWidth\", {\n configurable: true,\n get() {\n return 320;\n },\n });\n vi.spyOn(HTMLElement.prototype, \"getBoundingClientRect\").mockImplementation(\n function getBoundingClientRect() {\n return {\n x: 0,\n y: 0,\n width: 320,\n height: 44,\n top: 0,\n left: 0,\n right: 320,\n bottom: 44,\n toJSON() {\n return this;\n },\n } as DOMRect;\n },\n );\n Object.defineProperty(HTMLElement.prototype, \"clientHeight\", {\n configurable: true,\n get() {\n return 400;\n },\n });\n Object.defineProperty(HTMLElement.prototype, \"scrollHeight\", {\n configurable: true,\n get() {\n return 400;\n },\n });\n });\n\n afterEach(() => {\n cleanup();\n vi.restoreAllMocks();\n vi.unstubAllGlobals();\n });\n\n it(\"sizes the sticky clipping layer to the full row width\", () => {\n const { container } = render(<WideDataGridHarness />);\n\n const rowsClip = container.querySelector(\"[data-data-grid-rows-clip]\");\n\n expect(rowsClip).toBeInstanceOf(HTMLElement);\n expect((rowsClip as HTMLElement).style.minWidth).toBe(\"740px\");\n });\n\n it(\"lets the columns popover escape the sticky toolbar bounds\", () => {\n const { container, getByTitle } = render(<WideDataGridHarness />);\n\n fireEvent.click(getByTitle(\"Columns\"));\n\n const stickyChrome = container.querySelector('[role=\"grid\"]')?.firstElementChild;\n expect(stickyChrome).toBeInstanceOf(HTMLElement);\n expect((stickyChrome as HTMLElement).className).toContain(\"overflow-visible\");\n expect(container.textContent).toContain(\"Email\");\n });\n\n it(\"puts the horizontal scrollbar under the column headers when position is top\", () => {\n const { container } = render(<WideDataGridHarness horizontalScrollbarPosition=\"top\" />);\n\n const stickyChrome = container.querySelector('[role=\"grid\"]')?.firstElementChild;\n expect(stickyChrome).toBeInstanceOf(HTMLElement);\n const headerScroll = stickyChrome?.querySelector(\".overflow-x-auto\");\n expect(headerScroll).toBeInstanceOf(HTMLElement);\n\n const bodyScroll = container.querySelector('[role=\"grid\"]')?.children.item(1);\n expect(bodyScroll).toBeInstanceOf(HTMLElement);\n expect((bodyScroll as HTMLElement).className).toContain(\"overflow-x-hidden\");\n expect((bodyScroll as HTMLElement).className).toContain(\"overflow-y-auto\");\n\n Object.defineProperty(headerScroll as HTMLElement, \"scrollLeft\", {\n configurable: true,\n writable: true,\n value: 0,\n });\n Object.defineProperty(bodyScroll as HTMLElement, \"scrollLeft\", {\n configurable: true,\n writable: true,\n value: 0,\n });\n\n (headerScroll as HTMLElement).scrollLeft = 120;\n fireEvent.scroll(headerScroll as HTMLElement);\n expect((bodyScroll as HTMLElement).scrollLeft).toBe(120);\n });\n});\n\ndescribe(\"DataGrid loading skeleton\", () => {\n beforeEach(() => {\n vi.stubGlobal(\"ResizeObserver\", MockResizeObserver);\n });\n\n afterEach(() => {\n cleanup();\n vi.restoreAllMocks();\n vi.unstubAllGlobals();\n });\n\n it(\"shows a full-width shimmer when loading before any columns are known\", () => {\n function SchemaPendingHarness() {\n const [state, setState] = useState(() => createDefaultDataGridState([]));\n return (\n <DataGrid<Row>\n columns={[]}\n rows={[]}\n getRowId={(row) => row.id}\n state={state}\n onChange={setState}\n isLoading\n />\n );\n }\n\n const { container } = render(<SchemaPendingHarness />);\n\n const skeleton = container.querySelector(\"[data-data-grid-schema-pending-skeleton]\");\n expect(skeleton).toBeInstanceOf(HTMLElement);\n // Five placeholder columns × 10 rows → visible shimmer cells, not an empty pane.\n expect(skeleton?.querySelectorAll(\"[role='row']\").length).toBe(10);\n });\n\n it(\"uses per-column skeleton rows once the schema is known\", () => {\n function KnownSchemaHarness() {\n const [state, setState] = useState(() => createDefaultDataGridState(columns));\n return (\n <DataGrid<Row>\n columns={columns}\n rows={[]}\n getRowId={(row) => row.id}\n state={state}\n onChange={setState}\n isLoading\n />\n );\n }\n\n const { container } = render(<KnownSchemaHarness />);\n\n expect(container.querySelector(\"[data-data-grid-schema-pending-skeleton]\")).toBeNull();\n const rowsClip = container.querySelector(\"[data-data-grid-rows-clip]\");\n expect(rowsClip?.querySelectorAll(\"[role='row']\").length).toBe(8);\n });\n});\n"],"mappings":"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"}
@@ -239,6 +239,13 @@ type DataGridProps<TRow> = {
239
239
  */
240
240
  fillHeight?: boolean; /** Top offset for the sticky toolbar + header (px or CSS string). */
241
241
  stickyTop?: number | string;
242
+ /**
243
+ * Where the horizontal scrollbar is shown when columns overflow.
244
+ * - `"bottom"` (default): on the row scrollport, under the last visible rows.
245
+ * - `"top"`: under the column headers (top of the table body), so wide
246
+ * tables stay reachable without scrolling to the bottom first.
247
+ */
248
+ horizontalScrollbarPosition?: "top" | "bottom";
242
249
  } & DataGridCallbacks<TRow> & {
243
250
  /** Custom toolbar renderer. When `false`, toolbar is hidden entirely. */toolbar?: false | ((ctx: DataGridToolbarContext<TRow>) => ReactNode);
244
251
  /** Extra content rendered inside the default toolbar row, to the left of
@@ -1 +1 @@
1
- {"version":3,"file":"types.d.ts","names":[],"sources":["../../../../src/components/data-grid/types.ts"],"mappings":"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"}
1
+ {"version":3,"file":"types.d.ts","names":[],"sources":["../../../../src/components/data-grid/types.ts"],"mappings":"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"}
@@ -0,0 +1,12 @@
1
+ {
2
+ "name": "@hexclave/dashboard-ui-components",
3
+ "type": "module",
4
+ "exports": {
5
+ ".": {
6
+ "types": "./index.d.ts",
7
+ "import": {
8
+ "default": "./index.js"
9
+ }
10
+ }
11
+ }
12
+ }
package/dist/index.d.ts CHANGED
@@ -15,14 +15,14 @@ import { DesignChartLegendContent } from "./components/chart-legend.js";
15
15
  import { DESIGN_CHART_AXIS_TICK_STYLE, DESIGN_CHART_COLORS, DESIGN_CHART_GRID_COLOR, DesignChartColorEntry, DesignChartColorName, getDesignChartColor } from "./components/chart-theme.js";
16
16
  import { DesignChartTooltip, DesignChartTooltipContent } from "./components/chart-tooltip.js";
17
17
  import { CursorBlastEffect, CursorBlastEffectProps } from "./components/cursor-blast-effect.js";
18
- import { A as DataGridState, C as DataGridPaginationModel, D as DataGridSelectionModel, E as DataGridSelectionMode, M as DataGridToolbarContext, N as RowId, O as DataGridSortItem, S as DataGridPaginationMode, T as DataGridSelectOption, _ as DataGridExportScope, a as DataGridColumnPin, b as DataGridFooterContext, c as DataGridColumnVisibility, d as DataGridDateDisplay, f as DataGridDateFormat, g as DataGridExportRowsOptions, h as DataGridExportOptions, i as DataGridColumnDef, j as DataGridStrings, k as DataGridSortModel, l as DataGridDataPaginationMode, m as DataGridExportFormat, n as DataGridCellContext, o as DataGridColumnPinning, p as DataGridExportField, r as DataGridColumnAlign, s as DataGridColumnType, t as DataGridCallbacks, u as DataGridDataSource, v as DataGridFetchParams, w as DataGridProps, x as DataGridHeaderContext, y as DataGridFetchResult } from "./types-1-eOd1JF.js";
19
- import { a as getEffectiveMinWidth, i as getEffectiveMaxWidth, n as DEFAULT_MAX_COL_WIDTH, r as clampColumnWidth, t as DEFAULT_COL_WIDTH } from "./data-grid-sizing-S1ixcZKo.js";
20
- import { t as DataGridToolbar } from "./data-grid-toolbar-BGSNGDpT.js";
21
- import { n as isDataGridInteractiveRowClickTarget, t as DataGrid } from "./data-grid-AJi1TNDa.js";
22
- import { n as useDataSource, t as UseDataSourceResult } from "./use-data-source-BVFynerX.js";
23
- import { t as useDataGridUrlState } from "./use-url-state-B4_wnBjm.js";
24
- import { a as defaultFormatRelative, c as exportToCsv, d as resolveColumnValue, i as defaultFormatAbsolute, l as formatGridDate, n as buildRowComparator, o as defaultMatchRow, r as createDefaultDataGridState, s as defaultParseDate, t as applyQuickSearch, u as paginateRows } from "./state-6LW8ACh5.js";
25
- import { n as resolveDataGridStrings, t as DATA_GRID_DEFAULT_STRINGS } from "./strings-CACVtKlq.js";
18
+ import { A as DataGridState, C as DataGridPaginationModel, D as DataGridSelectionModel, E as DataGridSelectionMode, M as DataGridToolbarContext, N as RowId, O as DataGridSortItem, S as DataGridPaginationMode, T as DataGridSelectOption, _ as DataGridExportScope, a as DataGridColumnPin, b as DataGridFooterContext, c as DataGridColumnVisibility, d as DataGridDateDisplay, f as DataGridDateFormat, g as DataGridExportRowsOptions, h as DataGridExportOptions, i as DataGridColumnDef, j as DataGridStrings, k as DataGridSortModel, l as DataGridDataPaginationMode, m as DataGridExportFormat, n as DataGridCellContext, o as DataGridColumnPinning, p as DataGridExportField, r as DataGridColumnAlign, s as DataGridColumnType, t as DataGridCallbacks, u as DataGridDataSource, v as DataGridFetchParams, w as DataGridProps, x as DataGridHeaderContext, y as DataGridFetchResult } from "./types-D8o47V7M.js";
19
+ import { a as getEffectiveMinWidth, i as getEffectiveMaxWidth, n as DEFAULT_MAX_COL_WIDTH, r as clampColumnWidth, t as DEFAULT_COL_WIDTH } from "./data-grid-sizing-D9y1xwaq.js";
20
+ import { t as DataGridToolbar } from "./data-grid-toolbar-dgvnYEpC.js";
21
+ import { n as isDataGridInteractiveRowClickTarget, t as DataGrid } from "./data-grid-DWHAjaNo.js";
22
+ import { n as useDataSource, t as UseDataSourceResult } from "./use-data-source-CAZPhl8e.js";
23
+ import { t as useDataGridUrlState } from "./use-url-state-97YdV81Q.js";
24
+ import { a as defaultFormatRelative, c as exportToCsv, d as resolveColumnValue, i as defaultFormatAbsolute, l as formatGridDate, n as buildRowComparator, o as defaultMatchRow, r as createDefaultDataGridState, s as defaultParseDate, t as applyQuickSearch, u as paginateRows } from "./state-D5wpAg_G.js";
25
+ import { n as resolveDataGridStrings, t as DATA_GRID_DEFAULT_STRINGS } from "./strings-DsIJ_o4-.js";
26
26
  import { a as DesignDialogRoot, c as DesignDialogTrigger, d as designDialogGlassmorphicSurfaceClass, i as DesignDialogProps, l as DesignDialogVariant, n as DesignDialogClose, o as DesignDialogSize, r as DesignDialogDescription, s as DesignDialogTitle, t as DesignDialog, u as designDialogGlassmorphicOverlayClass } from "./dialog-CCtTH7s6.js";
27
27
  import { DesignEditMode, useDesignEditMode } from "./components/edit-mode.js";
28
28
  import { DesignEmptyState, DesignEmptyStateProps } from "./components/empty-state.js";
@@ -1,4 +1,4 @@
1
- import { A as DataGridState, C as DataGridPaginationModel, d as DataGridDateDisplay, f as DataGridDateFormat, i as DataGridColumnDef, k as DataGridSortModel } from "./types-1-eOd1JF.js";
1
+ import { A as DataGridState, C as DataGridPaginationModel, d as DataGridDateDisplay, f as DataGridDateFormat, i as DataGridColumnDef, k as DataGridSortModel } from "./types-D8o47V7M.js";
2
2
 
3
3
  //#region src/components/data-grid/state.d.ts
4
4
  /**
@@ -31,4 +31,4 @@ declare function formatGridDate(value: unknown, mode: DataGridDateDisplay, opts?
31
31
  declare function exportToCsv<TRow>(rows: readonly TRow[], columns: readonly DataGridColumnDef<TRow>[], filename: string): void;
32
32
  //#endregion
33
33
  export { defaultFormatRelative as a, exportToCsv as c, resolveColumnValue as d, defaultFormatAbsolute as i, formatGridDate as l, buildRowComparator as n, defaultMatchRow as o, createDefaultDataGridState as r, defaultParseDate as s, applyQuickSearch as t, paginateRows as u };
34
- //# sourceMappingURL=state-6LW8ACh5.d.ts.map
34
+ //# sourceMappingURL=state-D5wpAg_G.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"state-6LW8ACh5.d.ts","names":[],"sources":["../src/components/data-grid/state.ts"],"mappings":";;;;;AAqBA;;;;;;;;iBAAgB,0BAAA,CACd,OAAA,WAAkB,iBAAA,UACjB,aAAa;AAAA,iBAwBA,kBAAA,OACd,GAAA,EAAK,iBAAA,CAAkB,IAAA,GACvB,GAAA,EAAK,IAAA;AAAA,iBAkBS,kBAAA,OACd,SAAA,EAAW,iBAAA,EACX,OAAA,WAAkB,iBAAA,CAAkB,IAAA,QACjC,CAAA,EAAG,IAAA,EAAM,CAAA,EAAG,IAAA;AAAA,iBAkBD,YAAA,OACd,IAAA,WAAe,IAAA,IACf,UAAA,EAAY,uBAAA,GACX,IAAA;;iBAQa,eAAA,OACd,GAAA,EAAK,IAAA,EACL,KAAA,UACA,OAAA,WAAkB,iBAAA,CAAkB,IAAA;AAAA,iBAUtB,gBAAA,OACd,IAAA,WAAe,IAAA,IACf,KAAA,UACA,OAAA,WAAkB,iBAAA,CAAkB,IAAA,KACpC,QAAA,IACE,GAAA,EAAK,IAAA,EACL,KAAA,UACA,OAAA,WAAkB,iBAAA,CAAkB,IAAA,2BAE5B,IAAA;AAAA,iBAQI,gBAAA,CAAiB,KAAA,YAAiB,IAAI;AAAA,iBA+BtC,qBAAA,CAAsB,IAAU,EAAJ,IAAI;AAAA,iBAYhC,qBAAA,CAAsB,IAAU,EAAJ,IAAI;AAAA,iBAIhC,cAAA,CACd,KAAA,WACA,IAAA,EAAM,mBAAA,EACN,IAAA;EACE,UAAA,IAAc,KAAA,cAAmB,IAAA;EACjC,UAAA,GAAa,kBAAA;AAAA;EAEZ,OAAA;EAAwB,OAAA;AAAA;AAAA,iBAab,WAAA,OACd,IAAA,WAAe,IAAA,IACf,OAAA,WAAkB,iBAAA,CAAkB,IAAA,KACpC,QAAA"}
1
+ {"version":3,"file":"state-D5wpAg_G.d.ts","names":[],"sources":["../src/components/data-grid/state.ts"],"mappings":";;;;;AAqBA;;;;;;;;iBAAgB,0BAAA,CACd,OAAA,WAAkB,iBAAA,UACjB,aAAa;AAAA,iBAwBA,kBAAA,OACd,GAAA,EAAK,iBAAA,CAAkB,IAAA,GACvB,GAAA,EAAK,IAAA;AAAA,iBAkBS,kBAAA,OACd,SAAA,EAAW,iBAAA,EACX,OAAA,WAAkB,iBAAA,CAAkB,IAAA,QACjC,CAAA,EAAG,IAAA,EAAM,CAAA,EAAG,IAAA;AAAA,iBAkBD,YAAA,OACd,IAAA,WAAe,IAAA,IACf,UAAA,EAAY,uBAAA,GACX,IAAA;;iBAQa,eAAA,OACd,GAAA,EAAK,IAAA,EACL,KAAA,UACA,OAAA,WAAkB,iBAAA,CAAkB,IAAA;AAAA,iBAUtB,gBAAA,OACd,IAAA,WAAe,IAAA,IACf,KAAA,UACA,OAAA,WAAkB,iBAAA,CAAkB,IAAA,KACpC,QAAA,IACE,GAAA,EAAK,IAAA,EACL,KAAA,UACA,OAAA,WAAkB,iBAAA,CAAkB,IAAA,2BAE5B,IAAA;AAAA,iBAQI,gBAAA,CAAiB,KAAA,YAAiB,IAAI;AAAA,iBA+BtC,qBAAA,CAAsB,IAAU,EAAJ,IAAI;AAAA,iBAYhC,qBAAA,CAAsB,IAAU,EAAJ,IAAI;AAAA,iBAIhC,cAAA,CACd,KAAA,WACA,IAAA,EAAM,mBAAA,EACN,IAAA;EACE,UAAA,IAAc,KAAA,cAAmB,IAAA;EACjC,UAAA,GAAa,kBAAA;AAAA;EAEZ,OAAA;EAAwB,OAAA;AAAA;AAAA,iBAab,WAAA,OACd,IAAA,WAAe,IAAA,IACf,OAAA,WAAkB,iBAAA,CAAkB,IAAA,KACpC,QAAA"}
@@ -1,8 +1,8 @@
1
- import { j as DataGridStrings } from "./types-1-eOd1JF.js";
1
+ import { j as DataGridStrings } from "./types-D8o47V7M.js";
2
2
 
3
3
  //#region src/components/data-grid/strings.d.ts
4
4
  declare const DATA_GRID_DEFAULT_STRINGS: DataGridStrings;
5
5
  declare function resolveDataGridStrings(override: Partial<DataGridStrings> | undefined): DataGridStrings;
6
6
  //#endregion
7
7
  export { resolveDataGridStrings as n, DATA_GRID_DEFAULT_STRINGS as t };
8
- //# sourceMappingURL=strings-CACVtKlq.d.ts.map
8
+ //# sourceMappingURL=strings-DsIJ_o4-.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"strings-CACVtKlq.d.ts","names":[],"sources":["../src/components/data-grid/strings.ts"],"mappings":";;;cAEa,yBAAA,EAA2B,eAmCvC;AAAA,iBAEe,sBAAA,CACd,QAAA,EAAU,OAAA,CAAQ,eAAA,gBACjB,eAAA"}
1
+ {"version":3,"file":"strings-DsIJ_o4-.d.ts","names":[],"sources":["../src/components/data-grid/strings.ts"],"mappings":";;;cAEa,yBAAA,EAA2B,eAmCvC;AAAA,iBAEe,sBAAA,CACd,QAAA,EAAU,OAAA,CAAQ,eAAA,gBACjB,eAAA"}
@@ -239,6 +239,13 @@ type DataGridProps<TRow> = {
239
239
  */
240
240
  fillHeight?: boolean; /** Top offset for the sticky toolbar + header (px or CSS string). */
241
241
  stickyTop?: number | string;
242
+ /**
243
+ * Where the horizontal scrollbar is shown when columns overflow.
244
+ * - `"bottom"` (default): on the row scrollport, under the last visible rows.
245
+ * - `"top"`: under the column headers (top of the table body), so wide
246
+ * tables stay reachable without scrolling to the bottom first.
247
+ */
248
+ horizontalScrollbarPosition?: "top" | "bottom";
242
249
  } & DataGridCallbacks<TRow> & {
243
250
  /** Custom toolbar renderer. When `false`, toolbar is hidden entirely. */toolbar?: false | ((ctx: DataGridToolbarContext<TRow>) => ReactNode);
244
251
  /** Extra content rendered inside the default toolbar row, to the left of
@@ -305,4 +312,4 @@ type DataGridStrings = {
305
312
  };
306
313
  //#endregion
307
314
  export { DataGridState as A, DataGridPaginationModel as C, DataGridSelectionModel as D, DataGridSelectionMode as E, DataGridToolbarContext as M, RowId as N, DataGridSortItem as O, DataGridPaginationMode as S, DataGridSelectOption as T, DataGridExportScope as _, DataGridColumnPin as a, DataGridFooterContext as b, DataGridColumnVisibility as c, DataGridDateDisplay as d, DataGridDateFormat as f, DataGridExportRowsOptions as g, DataGridExportOptions as h, DataGridColumnDef as i, DataGridStrings as j, DataGridSortModel as k, DataGridDataPaginationMode as l, DataGridExportFormat as m, DataGridCellContext as n, DataGridColumnPinning as o, DataGridExportField as p, DataGridColumnAlign as r, DataGridColumnType as s, DataGridCallbacks as t, DataGridDataSource as u, DataGridFetchParams as v, DataGridProps as w, DataGridHeaderContext as x, DataGridFetchResult as y };
308
- //# sourceMappingURL=types-1-eOd1JF.d.ts.map
315
+ //# sourceMappingURL=types-D8o47V7M.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"types-1-eOd1JF.d.ts","names":[],"sources":["../src/components/data-grid/types.ts"],"mappings":"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"}
1
+ {"version":3,"file":"types-D8o47V7M.d.ts","names":[],"sources":["../src/components/data-grid/types.ts"],"mappings":"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"}
@@ -1,4 +1,4 @@
1
- import { C as DataGridPaginationModel, N as RowId, i as DataGridColumnDef, k as DataGridSortModel, l as DataGridDataPaginationMode, u as DataGridDataSource } from "./types-1-eOd1JF.js";
1
+ import { C as DataGridPaginationModel, N as RowId, i as DataGridColumnDef, k as DataGridSortModel, l as DataGridDataPaginationMode, u as DataGridDataSource } from "./types-D8o47V7M.js";
2
2
 
3
3
  //#region src/components/data-grid/use-data-source.d.ts
4
4
  type UseDataSourceResult<TRow> = {
@@ -82,4 +82,4 @@ declare function useDataSource<TRow>(opts: {
82
82
  }): UseDataSourceResult<TRow>;
83
83
  //#endregion
84
84
  export { useDataSource as n, UseDataSourceResult as t };
85
- //# sourceMappingURL=use-data-source-BVFynerX.d.ts.map
85
+ //# sourceMappingURL=use-data-source-CAZPhl8e.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"use-data-source-BVFynerX.d.ts","names":[],"sources":["../src/components/data-grid/use-data-source.ts"],"mappings":";;;KAkBY,mBAAA;4EAEV,IAAA,WAAe,IAAA,IAFc;EAI7B,aAAA,sBAkBY;EAhBZ,SAAA,WAJA;EAMA,YAAA,WAJA;EAMA,aAAA,WAFA;EAIA,QAAA;EAEA,OAAA,WAEA;EAAA,MAAA;EAMO;;AAAK;AAuYd;;EAvYE,KAAA,EAAO,KAAK;AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAwZc;;;iBAjBZ,aAAA,OAAoB,IAAA;EAClC,IAAA,YAAgB,IAAA;EAChB,UAAA,GAAa,kBAAA,CAAmB,IAAA;EAChC,OAAA,WAAkB,iBAAA,CAAkB,IAAA;EACpC,QAAA,GAAW,GAAA,EAAK,IAAA,KAAS,KAAA;EACzB,OAAA,EAAS,iBAAA;EAET,WAAA;;;EAGA,QAAA,IACE,GAAA,EAAK,IAAA,EACL,KAAA,UACA,OAAA,WAAkB,iBAAA,CAAkB,IAAA;EAEtC,UAAA,EAAY,uBAAA;EACZ,cAAA,EAAgB,0BAAA;AAAA,IACd,mBAAA,CAAoB,IAAA"}
1
+ {"version":3,"file":"use-data-source-CAZPhl8e.d.ts","names":[],"sources":["../src/components/data-grid/use-data-source.ts"],"mappings":";;;KAkBY,mBAAA;4EAEV,IAAA,WAAe,IAAA,IAFc;EAI7B,aAAA,sBAkBY;EAhBZ,SAAA,WAJA;EAMA,YAAA,WAJA;EAMA,aAAA,WAFA;EAIA,QAAA;EAEA,OAAA,WAEA;EAAA,MAAA;EAMO;;AAAK;AAuYd;;EAvYE,KAAA,EAAO,KAAK;AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAwZc;;;iBAjBZ,aAAA,OAAoB,IAAA;EAClC,IAAA,YAAgB,IAAA;EAChB,UAAA,GAAa,kBAAA,CAAmB,IAAA;EAChC,OAAA,WAAkB,iBAAA,CAAkB,IAAA;EACpC,QAAA,GAAW,GAAA,EAAK,IAAA,KAAS,KAAA;EACzB,OAAA,EAAS,iBAAA;EAET,WAAA;;;EAGA,QAAA,IACE,GAAA,EAAK,IAAA,EACL,KAAA,UACA,OAAA,WAAkB,iBAAA,CAAkB,IAAA;EAEtC,UAAA,EAAY,uBAAA;EACZ,cAAA,EAAgB,0BAAA;AAAA,IACd,mBAAA,CAAoB,IAAA"}
@@ -1,4 +1,4 @@
1
- import { A as DataGridState, i as DataGridColumnDef } from "./types-1-eOd1JF.js";
1
+ import { A as DataGridState, i as DataGridColumnDef } from "./types-D8o47V7M.js";
2
2
 
3
3
  //#region src/components/data-grid/use-url-state.d.ts
4
4
  type UrlStateOptions = {
@@ -35,4 +35,4 @@ type UrlStateOptions = {
35
35
  declare function useDataGridUrlState<TRow>(columns: readonly DataGridColumnDef<TRow>[], opts?: UrlStateOptions): [DataGridState, React.Dispatch<React.SetStateAction<DataGridState>>];
36
36
  //#endregion
37
37
  export { useDataGridUrlState as t };
38
- //# sourceMappingURL=use-url-state-B4_wnBjm.d.ts.map
38
+ //# sourceMappingURL=use-url-state-97YdV81Q.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"use-url-state-B4_wnBjm.d.ts","names":[],"sources":["../src/components/data-grid/use-url-state.ts"],"mappings":";;;KAqJK,eAAA;;AA3IY;EA8If,WAAA;;;;;EAKA,OAAA,GAAU,OAAA,CAAQ,IAAA,CAAK,aAAA;AAAA;;;;;;;AAAa;AAwBtC;;;;;;;;;;;;;;iBAAgB,mBAAA,OACd,OAAA,WAAkB,iBAAA,CAAkB,IAAA,KACpC,IAAA,GAAO,eAAA,IACL,aAAA,EAAe,KAAA,CAAM,QAAA,CAAS,KAAA,CAAM,cAAA,CAAe,aAAA"}
1
+ {"version":3,"file":"use-url-state-97YdV81Q.d.ts","names":[],"sources":["../src/components/data-grid/use-url-state.ts"],"mappings":";;;KAqJK,eAAA;;AA3IY;EA8If,WAAA;;;;;EAKA,OAAA,GAAU,OAAA,CAAQ,IAAA,CAAK,aAAA;AAAA;;;;;;;AAAa;AAwBtC;;;;;;;;;;;;;;iBAAgB,mBAAA,OACd,OAAA,WAAkB,iBAAA,CAAkB,IAAA,KACpC,IAAA,GAAO,eAAA,IACL,aAAA,EAAe,KAAA,CAAM,QAAA,CAAS,KAAA,CAAM,cAAA,CAAe,aAAA"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@hexclave/dashboard-ui-components",
3
- "version": "1.0.53",
3
+ "version": "1.0.54",
4
4
  "repository": "https://github.com/hexclave/hexclave",
5
5
  "main": "./dist/index.js",
6
6
  "types": "./dist/index.d.ts",
@@ -47,8 +47,8 @@
47
47
  "@tanstack/react-table": "^8.21.3",
48
48
  "@tanstack/react-virtual": "^3.13.0",
49
49
  "class-variance-authority": "^0.7.0",
50
- "@hexclave/shared": "1.0.53",
51
- "@hexclave/ui": "1.0.53"
50
+ "@hexclave/shared": "1.0.54",
51
+ "@hexclave/ui": "1.0.54"
52
52
  },
53
53
  "devDependencies": {
54
54
  "@types/react": "^19.0.0",
@@ -271,13 +271,13 @@ export function DataGridToolbar<TRow>({
271
271
  ctx,
272
272
  extra,
273
273
  extraLeading,
274
+ extraActions,
274
275
  hideQuickSearch,
275
276
  }: {
276
277
  ctx: DataGridToolbarContext<TRow>;
277
- /** Extra content rendered inside the toolbar row, to the left of the
278
- * built-in columns / export actions. Use this to add table-specific
279
- * affordances (refresh, custom toggles, row counts) without giving up
280
- * the default actions. */
278
+ /** Extra content in the leading cluster, after search / `extraLeading`
279
+ * (filters, status badges, row counts). Stays with the search side so
280
+ * it doesn't compete with the trailing icon actions. */
281
281
  extra?: React.ReactNode;
282
282
  /** Extra content rendered at the START of the toolbar row — occupies
283
283
  * the same position as the built-in quick search (after it, if the
@@ -285,6 +285,10 @@ export function DataGridToolbar<TRow>({
285
285
  * to fully replace the quick search with a custom input, e.g. an
286
286
  * AI-powered search bar. */
287
287
  extraLeading?: React.ReactNode;
288
+ /** Extra content in the trailing action cluster, immediately before
289
+ * the built-in columns / export buttons (e.g. a labeled Refresh).
290
+ * When present, a hairline divider separates it from those icons. */
291
+ extraActions?: React.ReactNode;
288
292
  /** Whether to hide the built-in quick-search input. When `true`,
289
293
  * callers are expected to provide their own search UI via
290
294
  * `extraLeading`. */
@@ -326,9 +330,10 @@ export function DataGridToolbar<TRow>({
326
330
  () => columns.some((c) => c.type === "date" || c.type === "dateTime"),
327
331
  [columns],
328
332
  );
333
+ const hasExtraActions = React.Children.toArray(extraActions).length > 0;
329
334
 
330
335
  return (
331
- <div className="flex w-full min-w-0 flex-col gap-2 px-2.5 py-2.5 border-b border-foreground/[0.06] sm:flex-row sm:items-center sm:gap-2">
336
+ <div className="flex w-full min-w-0 flex-col gap-2 px-2.5 py-2.5 pr-3 border-b border-foreground/[0.06] sm:flex-row sm:items-center sm:gap-2">
332
337
  <div className="flex min-w-0 flex-1 flex-wrap items-center gap-2">
333
338
  {!hideQuickSearch && (
334
339
  <QuickSearch
@@ -340,7 +345,16 @@ export function DataGridToolbar<TRow>({
340
345
  {extraLeading}
341
346
  {extra}
342
347
  </div>
343
- <div className="flex shrink-0 items-center justify-end gap-2">
348
+ <div className="flex shrink-0 items-center justify-end gap-1.5">
349
+ {hasExtraActions && (
350
+ <>
351
+ {extraActions}
352
+ <div
353
+ className="mx-0.5 hidden h-4 w-px bg-foreground/[0.1] sm:block"
354
+ aria-hidden
355
+ />
356
+ </>
357
+ )}
344
358
  <div className="relative shrink-0" ref={columnPopover.ref}>
345
359
  <ToolbarButton
346
360
  onClick={() => columnPopover.setOpen(!columnPopover.open)}
@@ -5,7 +5,9 @@ import { useMemo, useState } from "react";
5
5
  import { afterEach, beforeEach, describe, expect, it, vi } from "vitest";
6
6
  import {
7
7
  createDefaultDataGridState,
8
+ DATA_GRID_DEFAULT_STRINGS,
8
9
  DataGrid,
10
+ DataGridToolbar,
9
11
  isDataGridInteractiveRowClickTarget,
10
12
  useDataSource,
11
13
  type DataGridColumnDef,
@@ -49,6 +51,41 @@ const wideColumns: DataGridColumnDef<Row>[] = [
49
51
  },
50
52
  ];
51
53
 
54
+ describe("DataGridToolbar action divider", () => {
55
+ const ctx = {
56
+ state: createDefaultDataGridState(columns),
57
+ onChange: vi.fn(),
58
+ columns,
59
+ visibleColumns: columns,
60
+ totalRowCount: 1,
61
+ selectedRowCount: 0,
62
+ strings: DATA_GRID_DEFAULT_STRINGS,
63
+ exportCsv: vi.fn(),
64
+ };
65
+
66
+ afterEach(cleanup);
67
+
68
+ it("does not render a divider for an empty React node", () => {
69
+ const { container } = render(
70
+ <DataGridToolbar ctx={ctx} extraActions={false} />,
71
+ );
72
+
73
+ expect(container.querySelector(".mx-0\\.5.h-4.w-px")).toBeNull();
74
+ });
75
+
76
+ it("renders the divider when an action is visible", () => {
77
+ const { container, getByRole } = render(
78
+ <DataGridToolbar
79
+ ctx={ctx}
80
+ extraActions={<button type="button">Refresh</button>}
81
+ />,
82
+ );
83
+
84
+ expect(getByRole("button", { name: "Refresh" })).not.toBeNull();
85
+ expect(container.querySelector(".mx-0\\.5.h-4.w-px")).not.toBeNull();
86
+ });
87
+ });
88
+
52
89
  type ObserverRecord = {
53
90
  options?: IntersectionObserverInit,
54
91
  };
@@ -204,7 +241,9 @@ function InteractiveDataGridHarness(props: {
204
241
  );
205
242
  }
206
243
 
207
- function WideDataGridHarness() {
244
+ function WideDataGridHarness(props: {
245
+ horizontalScrollbarPosition?: "top" | "bottom",
246
+ } = {}) {
208
247
  const [state, setState] = useState(() => createDefaultDataGridState(wideColumns));
209
248
 
210
249
  return (
@@ -215,6 +254,7 @@ function WideDataGridHarness() {
215
254
  getRowId={(row) => row.id}
216
255
  state={state}
217
256
  onChange={setState}
257
+ horizontalScrollbarPosition={props.horizontalScrollbarPosition}
218
258
  />
219
259
  </div>
220
260
  );
@@ -578,4 +618,90 @@ describe("DataGrid horizontal scrolling", () => {
578
618
  expect((stickyChrome as HTMLElement).className).toContain("overflow-visible");
579
619
  expect(container.textContent).toContain("Email");
580
620
  });
621
+
622
+ it("puts the horizontal scrollbar under the column headers when position is top", () => {
623
+ const { container } = render(<WideDataGridHarness horizontalScrollbarPosition="top" />);
624
+
625
+ const stickyChrome = container.querySelector('[role="grid"]')?.firstElementChild;
626
+ expect(stickyChrome).toBeInstanceOf(HTMLElement);
627
+ const headerScroll = stickyChrome?.querySelector(".overflow-x-auto");
628
+ expect(headerScroll).toBeInstanceOf(HTMLElement);
629
+
630
+ const bodyScroll = container.querySelector('[role="grid"]')?.children.item(1);
631
+ expect(bodyScroll).toBeInstanceOf(HTMLElement);
632
+ expect((bodyScroll as HTMLElement).className).toContain("overflow-x-hidden");
633
+ expect((bodyScroll as HTMLElement).className).toContain("overflow-y-auto");
634
+
635
+ Object.defineProperty(headerScroll as HTMLElement, "scrollLeft", {
636
+ configurable: true,
637
+ writable: true,
638
+ value: 0,
639
+ });
640
+ Object.defineProperty(bodyScroll as HTMLElement, "scrollLeft", {
641
+ configurable: true,
642
+ writable: true,
643
+ value: 0,
644
+ });
645
+
646
+ (headerScroll as HTMLElement).scrollLeft = 120;
647
+ fireEvent.scroll(headerScroll as HTMLElement);
648
+ expect((bodyScroll as HTMLElement).scrollLeft).toBe(120);
649
+ });
650
+ });
651
+
652
+ describe("DataGrid loading skeleton", () => {
653
+ beforeEach(() => {
654
+ vi.stubGlobal("ResizeObserver", MockResizeObserver);
655
+ });
656
+
657
+ afterEach(() => {
658
+ cleanup();
659
+ vi.restoreAllMocks();
660
+ vi.unstubAllGlobals();
661
+ });
662
+
663
+ it("shows a full-width shimmer when loading before any columns are known", () => {
664
+ function SchemaPendingHarness() {
665
+ const [state, setState] = useState(() => createDefaultDataGridState([]));
666
+ return (
667
+ <DataGrid<Row>
668
+ columns={[]}
669
+ rows={[]}
670
+ getRowId={(row) => row.id}
671
+ state={state}
672
+ onChange={setState}
673
+ isLoading
674
+ />
675
+ );
676
+ }
677
+
678
+ const { container } = render(<SchemaPendingHarness />);
679
+
680
+ const skeleton = container.querySelector("[data-data-grid-schema-pending-skeleton]");
681
+ expect(skeleton).toBeInstanceOf(HTMLElement);
682
+ // Five placeholder columns × 10 rows → visible shimmer cells, not an empty pane.
683
+ expect(skeleton?.querySelectorAll("[role='row']").length).toBe(10);
684
+ });
685
+
686
+ it("uses per-column skeleton rows once the schema is known", () => {
687
+ function KnownSchemaHarness() {
688
+ const [state, setState] = useState(() => createDefaultDataGridState(columns));
689
+ return (
690
+ <DataGrid<Row>
691
+ columns={columns}
692
+ rows={[]}
693
+ getRowId={(row) => row.id}
694
+ state={state}
695
+ onChange={setState}
696
+ isLoading
697
+ />
698
+ );
699
+ }
700
+
701
+ const { container } = render(<KnownSchemaHarness />);
702
+
703
+ expect(container.querySelector("[data-data-grid-schema-pending-skeleton]")).toBeNull();
704
+ const rowsClip = container.querySelector("[data-data-grid-rows-clip]");
705
+ expect(rowsClip?.querySelectorAll("[role='row']").length).toBe(8);
706
+ });
581
707
  });