@versini/ui-datagrid 3.0.12 → 3.1.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.
@@ -1,10 +1,12 @@
1
1
  /*!
2
- @versini/ui-datagrid v3.0.12
2
+ @versini/ui-datagrid v3.1.0
3
3
  © 2026 gizmette.com
4
4
  */
5
5
 
6
- import { DataGridContext, clsx } from "./926.js";
7
- import { useRef, useContext, useLayoutEffect } from "./511.js";
6
+ import clsx from "clsx";
7
+ import { useContext, useLayoutEffect, useRef } from "react";
8
+ import { DataGridContext } from "./430.js";
9
+
8
10
 
9
11
 
10
12
  /**
@@ -13,12 +15,14 @@ import { useRef, useContext, useLayoutEffect } from "./511.js";
13
15
  * are provided, or define their own grid otherwise.
14
16
  *
15
17
  * @param className - Additional class name to merge
18
+ *
16
19
  */ function getBodyClass(className) {
17
20
  return clsx("contents", className);
18
21
  }
19
22
 
20
23
 
21
24
 
25
+
22
26
  /**
23
27
  * Snap a CSS pixel value to the nearest device pixel.
24
28
  *
@@ -36,7 +40,7 @@ import { useRef, useContext, useLayoutEffect } from "./511.js";
36
40
  // Guard against invalid DPR values.
37
41
  const dpr = Number.isFinite(devicePixelRatio) && devicePixelRatio > 0 ? devicePixelRatio : 1;
38
42
  /**
39
- * Note: `window.devicePixelRatio` can be < 1 in some zoom/scaling scenarios.
43
+ * NOTE: `window.devicePixelRatio` can be < 1 in some zoom/scaling scenarios.
40
44
  * We intentionally accept any DPR > 0 rather than clamping to 1 so that we
41
45
  * still snap to the real device pixel grid.
42
46
  */ const quantum = 1 / dpr;
@@ -1,9 +1,9 @@
1
1
  /*!
2
- @versini/ui-datagrid v3.0.12
2
+ @versini/ui-datagrid v3.1.0
3
3
  © 2026 gizmette.com
4
4
  */
5
5
 
6
- import { createContext } from "./511.js";
6
+ import { createContext } from "react";
7
7
 
8
8
 
9
9
 
@@ -12,4 +12,3 @@ const DataGridContext = createContext({
12
12
  });
13
13
 
14
14
  export { DataGridContext };
15
- export { default as clsx } from "clsx";
@@ -1,5 +1,5 @@
1
1
  /*!
2
- @versini/ui-datagrid v3.0.12
2
+ @versini/ui-datagrid v3.1.0
3
3
  © 2026 gizmette.com
4
4
  */
5
5
 
@@ -1,10 +1,11 @@
1
1
  /*!
2
- @versini/ui-datagrid v3.0.12
2
+ @versini/ui-datagrid v3.1.0
3
3
  © 2026 gizmette.com
4
4
  */
5
5
 
6
- import { clsx } from "./926.js";
7
- import { BlurEffects, CellWrapper } from "./46.js";
6
+ import clsx from "clsx";
7
+ import { BlurEffects, CellWrapper } from "./799.js";
8
+
8
9
 
9
10
 
10
11
 
@@ -60,6 +61,35 @@ const getTextColorClassesForHeaderFooter = ({ mode, hasBlur })=>clsx({
60
61
  "dark:border-table-light": isSys(mode),
61
62
  "dark:border-table-dark": isAlt(mode)
62
63
  });
64
+ /**
65
+ * Hover classes for body rows.
66
+ *
67
+ * The hover lifts both the background and the text color so the highlighted row
68
+ * reads as a single, cohesive change (mirroring the light-mode behavior where
69
+ * the font color shifts too).
70
+ *
71
+ * The shade is tuned per surface so the lift stays proportional:
72
+ * - Dark surfaces (slate-900 base) only step up to `table-dark-hover`
73
+ * (slate-700) instead of the much brighter `surface-medium` (slate-500),
74
+ * which felt harsh against very dark tables, and brighten the text to
75
+ * `copy-lighter` (white).
76
+ * - Light surfaces (slate-300 base) keep the established `surface-medium`
77
+ * (slate-500) background with `copy-light` (slate-200) text.
78
+ *
79
+ * Pairing matches `getBorderClasses`/`getSurfaceBackgroundClasses` so the hover
80
+ * always tracks the active surface, including the OS-driven `dark:` flips that
81
+ * `system` and `alt-system` perform.
82
+ *
83
+ */ const getRowHoverClasses = ({ mode })=>clsx(/**
84
+ * Smooth the hover so quick mouse sweeps fade rather than flash. Animating
85
+ * the row's background- and (inherited) text-color is enough; cells stay
86
+ * transparent and follow the row's transitioning color.
87
+ */ "transition-colors duration-300 ease-in-out motion-reduce:transition-none", {
88
+ "hover:bg-table-dark-hover hover:text-copy-lighter": isDarkish(mode),
89
+ "hover:bg-surface-medium hover:text-copy-light": isLightish(mode),
90
+ "dark:hover:bg-surface-medium dark:hover:text-copy-light": isSys(mode),
91
+ "dark:hover:bg-table-dark-hover dark:hover:text-copy-lighter": isAlt(mode)
92
+ });
63
93
  /**
64
94
  * Blur effect classes for sticky elements.
65
95
  */ const getBlurClasses = ({ blurEffect })=>clsx({
@@ -68,9 +98,9 @@ const getTextColorClassesForHeaderFooter = ({ mode, hasBlur })=>clsx({
68
98
  "backdrop-blur-lg": blurEffect === BlurEffects.LARGE
69
99
  });
70
100
  /**
71
- * Loading text classes for loading state. Rendered as a high-contrast pill
72
- * with a fixed dark background and light text so the message stays legible
73
- * against the blurred content behind it regardless of the grid mode.
101
+ * Loading text classes for loading state. Rendered as a high-contrast pill with
102
+ * a fixed dark background and light text so the message stays legible against
103
+ * the blurred content behind it regardless of the grid mode.
74
104
  */ const getLoadingTextClasses = ()=>"px-5 py-2 rounded-full shadow-lg text-sm font-semibold bg-surface-darker text-copy-light";
75
105
  /**
76
106
  * Overlay classes for loading state. Uses z-30/z-40 to layer above the sticky
@@ -170,7 +200,9 @@ const ROW_LAYOUT = "group grid items-center";
170
200
  return clsx(ROW_LAYOUT, className);
171
201
  }
172
202
  const borderClasses = isLastRow !== undefined ? isLastRow ? "border-b border-b-transparent dark:border-b-transparent" : "border-b" : "border-b last:border-0";
173
- return clsx(ROW_LAYOUT, borderClasses, "hover:bg-surface-medium hover:text-copy-light", getBorderClasses({
203
+ return clsx(ROW_LAYOUT, borderClasses, getRowHoverClasses({
204
+ mode
205
+ }), getBorderClasses({
174
206
  mode
175
207
  }), className);
176
208
  };
@@ -101,8 +101,8 @@ export type DataGridHeaderProps = {
101
101
  } & React.HTMLAttributes<HTMLDivElement>;
102
102
  export type DataGridBodyProps = ({
103
103
  /**
104
- * If true, applies styles for an empty state (e.g. removing extra row borders).
105
- * Used when there are no rows to display.
104
+ * If true, applies styles for an empty state (e.g. removing extra row
105
+ * borders). Used when there are no rows to display.
106
106
  */
107
107
  noData: true;
108
108
  /**
@@ -115,8 +115,8 @@ export type DataGridBodyProps = ({
115
115
  noDataText?: string;
116
116
  } | {
117
117
  /**
118
- * If true, applies styles for an empty state (e.g. removing extra row borders).
119
- * Used when there are no rows to display.
118
+ * If true, applies styles for an empty state (e.g. removing extra row
119
+ * borders). Used when there are no rows to display.
120
120
  * @default false
121
121
  */
122
122
  noData?: false;
@@ -1,12 +1,15 @@
1
1
  /*!
2
- @versini/ui-datagrid v3.0.12
2
+ @versini/ui-datagrid v3.1.0
3
3
  © 2026 gizmette.com
4
4
  */
5
5
 
6
- import { jsxs, Fragment, useState, useCallback, useMemo, jsx } from "../511.js";
7
- import { BlurEffects } from "../46.js";
8
- import { getDataGridClasses } from "../298.js";
9
- import { DataGridContext } from "../926.js";
6
+ import { Fragment, jsx, jsxs } from "react/jsx-runtime";
7
+ import { useCallback, useMemo, useState } from "react";
8
+ import { BlurEffects } from "../799.js";
9
+ import { getDataGridClasses } from "../91.js";
10
+ import { DataGridContext } from "../430.js";
11
+
12
+
10
13
 
11
14
 
12
15
 
@@ -172,4 +175,4 @@ import { DataGridContext } from "../926.js";
172
175
 
173
176
 
174
177
  export { DataGrid };
175
- export { DataGridContext } from "../926.js";
178
+ export { DataGridContext } from "../430.js";
@@ -1,9 +1,12 @@
1
1
  /*!
2
- @versini/ui-datagrid v3.0.12
2
+ @versini/ui-datagrid v3.1.0
3
3
  © 2026 gizmette.com
4
4
  */
5
5
 
6
- import { useState, useLayoutEffect, useRef, jsx } from "../511.js";
6
+ import { jsx } from "react/jsx-runtime";
7
+ import { useLayoutEffect, useRef, useState } from "react";
8
+
9
+
7
10
 
8
11
 
9
12
  const DEFAULT_ANIMATION_DURATION = 300;
@@ -4,5 +4,6 @@
4
4
  * are provided, or define their own grid otherwise.
5
5
  *
6
6
  * @param className - Additional class name to merge
7
+ *
7
8
  */
8
9
  export declare function getBodyClass(className?: string): string;
@@ -1,12 +1,15 @@
1
1
  /*!
2
- @versini/ui-datagrid v3.0.12
2
+ @versini/ui-datagrid v3.1.0
3
3
  © 2026 gizmette.com
4
4
  */
5
5
 
6
- import { useRef, useContext, jsx } from "../511.js";
7
- import { DataGridContext } from "../926.js";
8
- import { getBodyClass, useColumnMeasurement } from "../131.js";
9
- import { CellWrapper } from "../46.js";
6
+ import { jsx } from "react/jsx-runtime";
7
+ import { useContext, useRef } from "react";
8
+ import { DataGridContext } from "../430.js";
9
+ import { getBodyClass, useColumnMeasurement } from "../197.js";
10
+ import { CellWrapper } from "../799.js";
11
+
12
+
10
13
 
11
14
 
12
15
 
@@ -1,11 +1,12 @@
1
1
  /*!
2
- @versini/ui-datagrid v3.0.12
2
+ @versini/ui-datagrid v3.1.0
3
3
  © 2026 gizmette.com
4
4
  */
5
5
 
6
- import { jsx } from "../511.js";
7
- import { DataGridContext } from "../926.js";
8
- import { getCellRole, getCellClasses } from "../298.js";
6
+ import { jsx } from "react/jsx-runtime";
7
+ import { DataGridContext } from "../430.js";
8
+ import { getCellRole, getCellClasses } from "../91.js";
9
+
9
10
 
10
11
 
11
12
 
@@ -1,13 +1,18 @@
1
1
  /*!
2
- @versini/ui-datagrid v3.0.12
2
+ @versini/ui-datagrid v3.1.0
3
3
  © 2026 gizmette.com
4
4
  */
5
5
 
6
+ import { jsx, jsxs } from "react/jsx-runtime";
6
7
  import { IconSort, IconSortDown, IconSortUp } from "@versini/ui-icons";
7
- import { jsxs, jsx } from "../511.js";
8
- import { DataGridContext, clsx } from "../926.js";
9
- import { BlurEffects } from "../46.js";
10
- import { getCellClasses, getTextColorClassesForHeaderFooter } from "../298.js";
8
+ import clsx from "clsx";
9
+ import { BlurEffects } from "../799.js";
10
+ import { getCellClasses, getTextColorClassesForHeaderFooter } from "../91.js";
11
+ import { DataGridContext } from "../430.js";
12
+
13
+
14
+
15
+
11
16
 
12
17
 
13
18
 
@@ -1,9 +1,9 @@
1
1
  /*!
2
- @versini/ui-datagrid v3.0.12
2
+ @versini/ui-datagrid v3.1.0
3
3
  © 2026 gizmette.com
4
4
  */
5
5
 
6
6
 
7
7
 
8
8
 
9
- export { BlurEffects, CellWrapper, SortDirections, ThemeModes } from "../46.js";
9
+ export { BlurEffects, CellWrapper, SortDirections, ThemeModes } from "../799.js";
@@ -1,12 +1,15 @@
1
1
  /*!
2
- @versini/ui-datagrid v3.0.12
2
+ @versini/ui-datagrid v3.1.0
3
3
  © 2026 gizmette.com
4
4
  */
5
5
 
6
- import { useLayoutEffect, useRef, useEffect, jsx } from "../511.js";
7
- import { DataGridContext } from "../926.js";
8
- import { CellWrapper } from "../46.js";
9
- import { getFooterClasses } from "../298.js";
6
+ import { jsx } from "react/jsx-runtime";
7
+ import { useEffect, useLayoutEffect, useRef } from "react";
8
+ import { DataGridContext } from "../430.js";
9
+ import { CellWrapper } from "../799.js";
10
+ import { getFooterClasses } from "../91.js";
11
+
12
+
10
13
 
11
14
 
12
15
 
@@ -1,12 +1,15 @@
1
1
  /*!
2
- @versini/ui-datagrid v3.0.12
2
+ @versini/ui-datagrid v3.1.0
3
3
  © 2026 gizmette.com
4
4
  */
5
5
 
6
- import { jsxs, useLayoutEffect, useId, useRef, useEffect, jsx } from "../511.js";
7
- import { DataGridContext } from "../926.js";
8
- import { CellWrapper } from "../46.js";
9
- import { getCaptionClasses, getHeaderClasses } from "../298.js";
6
+ import { jsx, jsxs } from "react/jsx-runtime";
7
+ import { useEffect, useId, useLayoutEffect, useRef } from "react";
8
+ import { DataGridContext } from "../430.js";
9
+ import { CellWrapper } from "../799.js";
10
+ import { getCaptionClasses, getHeaderClasses } from "../91.js";
11
+
12
+
10
13
 
11
14
 
12
15
 
@@ -1,7 +1,7 @@
1
1
  export type DataGridInfiniteBodyProps<T> = ({
2
2
  /**
3
- * If true, displays an empty state instead of infinite scroll content.
4
- * When noData is true, data, children, and scroll-related props are optional.
3
+ * If true, displays an empty state instead of infinite scroll content. When
4
+ * noData is true, data, children, and scroll-related props are optional.
5
5
  */
6
6
  noData: true;
7
7
  /**
@@ -10,7 +10,8 @@ export type DataGridInfiniteBodyProps<T> = ({
10
10
  data?: T[];
11
11
  /**
12
12
  * Render function for each row. Should return a DataGridRow element. The
13
- * consumer is responsible for providing the key prop on the returned element.
13
+ * consumer is responsible for providing the key prop on the returned
14
+ * element.
14
15
  */
15
16
  children?: (item: T, index: number) => React.ReactNode;
16
17
  /**
@@ -29,7 +30,8 @@ export type DataGridInfiniteBodyProps<T> = ({
29
30
  data: T[];
30
31
  /**
31
32
  * Render function for each row. Should return a DataGridRow element. The
32
- * consumer is responsible for providing the key prop on the returned element.
33
+ * consumer is responsible for providing the key prop on the returned
34
+ * element.
33
35
  */
34
36
  children: (item: T, index: number) => React.ReactNode;
35
37
  noDataText?: never;
@@ -1,12 +1,15 @@
1
1
  /*!
2
- @versini/ui-datagrid v3.0.12
2
+ @versini/ui-datagrid v3.1.0
3
3
  © 2026 gizmette.com
4
4
  */
5
5
 
6
- import { useMemo, useContext, useImperativeHandle, useState, useCallback, useRef, useEffect, jsx } from "../511.js";
7
- import { DataGridContext } from "../926.js";
8
- import { CellWrapper } from "../46.js";
9
- import { getBodyClass, useColumnMeasurement } from "../131.js";
6
+ import { jsx } from "react/jsx-runtime";
7
+ import { useCallback, useContext, useEffect, useImperativeHandle, useMemo, useRef, useState } from "react";
8
+ import { DataGridContext } from "../430.js";
9
+ import { CellWrapper } from "../799.js";
10
+ import { getBodyClass, useColumnMeasurement } from "../197.js";
11
+
12
+
10
13
 
11
14
 
12
15
 
@@ -1,12 +1,15 @@
1
1
  /*!
2
- @versini/ui-datagrid v3.0.12
2
+ @versini/ui-datagrid v3.1.0
3
3
  © 2026 gizmette.com
4
4
  */
5
5
 
6
- import { react, jsx } from "../511.js";
7
- import { DataGridContext } from "../926.js";
8
- import { CellWrapper } from "../46.js";
9
- import { getRowClasses } from "../298.js";
6
+ import { jsx } from "react/jsx-runtime";
7
+ import react from "react";
8
+ import { DataGridContext } from "../430.js";
9
+ import { CellWrapper } from "../799.js";
10
+ import { getRowClasses } from "../91.js";
11
+
12
+
10
13
 
11
14
 
12
15
 
@@ -1,9 +1,9 @@
1
1
  /*!
2
- @versini/ui-datagrid v3.0.12
2
+ @versini/ui-datagrid v3.1.0
3
3
  © 2026 gizmette.com
4
4
  */
5
5
 
6
- import { SortDirections } from "../46.js";
6
+ import { SortDirections } from "../799.js";
7
7
 
8
8
 
9
9
  /**
@@ -233,4 +233,4 @@ import { SortDirections } from "../46.js";
233
233
 
234
234
 
235
235
  export { getNextSortConfig, getOppositeSortDirection, sortByBoolean, sortByDate, sortByNumber, sortByString, sortItems, toggleSortDirection };
236
- export { SortDirections } from "../46.js";
236
+ export { SortDirections } from "../799.js";
@@ -28,6 +28,29 @@ export declare const getHeaderFooterBackgroundClasses: ({ hasBlur, sticky, }: {
28
28
  export declare const getBorderClasses: ({ mode }: {
29
29
  mode: ThemeMode;
30
30
  }) => string;
31
+ /**
32
+ * Hover classes for body rows.
33
+ *
34
+ * The hover lifts both the background and the text color so the highlighted row
35
+ * reads as a single, cohesive change (mirroring the light-mode behavior where
36
+ * the font color shifts too).
37
+ *
38
+ * The shade is tuned per surface so the lift stays proportional:
39
+ * - Dark surfaces (slate-900 base) only step up to `table-dark-hover`
40
+ * (slate-700) instead of the much brighter `surface-medium` (slate-500),
41
+ * which felt harsh against very dark tables, and brighten the text to
42
+ * `copy-lighter` (white).
43
+ * - Light surfaces (slate-300 base) keep the established `surface-medium`
44
+ * (slate-500) background with `copy-light` (slate-200) text.
45
+ *
46
+ * Pairing matches `getBorderClasses`/`getSurfaceBackgroundClasses` so the hover
47
+ * always tracks the active surface, including the OS-driven `dark:` flips that
48
+ * `system` and `alt-system` perform.
49
+ *
50
+ */
51
+ export declare const getRowHoverClasses: ({ mode }: {
52
+ mode: ThemeMode;
53
+ }) => string;
31
54
  /**
32
55
  * Blur effect classes for sticky elements.
33
56
  */
@@ -35,9 +58,9 @@ export declare const getBlurClasses: ({ blurEffect }: {
35
58
  blurEffect?: BlurEffect;
36
59
  }) => string;
37
60
  /**
38
- * Loading text classes for loading state. Rendered as a high-contrast pill
39
- * with a fixed dark background and light text so the message stays legible
40
- * against the blurred content behind it regardless of the grid mode.
61
+ * Loading text classes for loading state. Rendered as a high-contrast pill with
62
+ * a fixed dark background and light text so the message stays legible against
63
+ * the blurred content behind it regardless of the grid mode.
41
64
  */
42
65
  export declare const getLoadingTextClasses: () => string;
43
66
  /**
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@versini/ui-datagrid",
3
- "version": "3.0.12",
3
+ "version": "3.1.0",
4
4
  "license": "MIT",
5
5
  "author": "Arno Versini",
6
6
  "publishConfig": {
@@ -98,5 +98,5 @@
98
98
  "sideEffects": [
99
99
  "**/*.css"
100
100
  ],
101
- "gitHead": "fc3839da4f630dd7954e8d9537f5cbf1762f9d85"
101
+ "gitHead": "8ae610468c121bc5ed1438573a4d2ab7068c053d"
102
102
  }
package/dist/511.js DELETED
@@ -1,9 +0,0 @@
1
- /*!
2
- @versini/ui-datagrid v3.0.12
3
- © 2026 gizmette.com
4
- */
5
-
6
-
7
-
8
- export { Fragment, jsx, jsxs } from "react/jsx-runtime";
9
- export { createContext, default as react, useCallback, useContext, useEffect, useId, useImperativeHandle, useLayoutEffect, useMemo, useRef, useState } from "react";