@ai-matrx/design-system 0.19.0 → 0.19.1

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 (33) hide show
  1. package/CHANGELOG.md +20 -0
  2. package/dist/data-table/copy-helpers.d.cts +1 -1
  3. package/dist/data-table/copy-helpers.d.ts +1 -1
  4. package/dist/data-table/filter-engine.d.cts +1 -1
  5. package/dist/data-table/filter-engine.d.ts +1 -1
  6. package/dist/data-table/host.d.cts +1 -1
  7. package/dist/data-table/host.d.ts +1 -1
  8. package/dist/data-table/index.cjs +45 -13
  9. package/dist/data-table/index.cjs.map +1 -1
  10. package/dist/data-table/index.d.cts +2 -2
  11. package/dist/data-table/index.d.ts +2 -2
  12. package/dist/data-table/index.js +45 -13
  13. package/dist/data-table/index.js.map +1 -1
  14. package/dist/data-table/infer-filter.d.cts +1 -1
  15. package/dist/data-table/infer-filter.d.ts +1 -1
  16. package/dist/data-table/layered-filters.d.cts +1 -1
  17. package/dist/data-table/layered-filters.d.ts +1 -1
  18. package/dist/data-table/query-control.d.cts +1 -1
  19. package/dist/data-table/query-control.d.ts +1 -1
  20. package/dist/data-table/scroll-pagination.cjs +10 -7
  21. package/dist/data-table/scroll-pagination.cjs.map +1 -1
  22. package/dist/data-table/scroll-pagination.js +10 -7
  23. package/dist/data-table/scroll-pagination.js.map +1 -1
  24. package/dist/data-table/types.cjs.map +1 -1
  25. package/dist/data-table/types.d.cts +1 -1
  26. package/dist/data-table/types.d.ts +1 -1
  27. package/dist/data-table/url-state.d.cts +1 -1
  28. package/dist/data-table/url-state.d.ts +1 -1
  29. package/dist/data-table/xlsx.d.cts +1 -1
  30. package/dist/data-table/xlsx.d.ts +1 -1
  31. package/dist/{types-Di6QT0P1.d.cts → types-BcIcmIxd.d.cts} +5 -0
  32. package/dist/{types-D1m14boM.d.ts → types-xTXSqmR7.d.ts} +5 -0
  33. package/package.json +1 -1
@@ -1,7 +1,7 @@
1
1
  import * as React from 'react';
2
2
  import { ReactNode } from 'react';
3
- import { f as MatrxDataTableProps, g as TableViewSnapshot } from '../types-Di6QT0P1.cjs';
4
- export { A as AnyOfColumnSearch, h as CellEditType, i as CellEditsMap, d as ColumnFilterKind, a as ColumnFilterValue, C as ColumnFiltersState, M as MatrxColumnDef, e as MatrxDataTableCopyConfig, j as MatrxDataTableDetailConfig, k as MatrxDataTableEditConfig, l as MatrxDataTableEmptyState, m as MatrxDataTableFilterUi, n as MatrxDataTableHierarchyConfig, o as MatrxDataTableHierarchyMove, p as MatrxDataTableMobileCardControls, q as MatrxDataTableQueryControl, c as MatrxDataTableQueryState, r as MatrxDataTableRecordControls, s as MatrxDataTableSelectionConfig, t as MatrxDataTableSourceProcessing, u as MatrxDataTableToolbar, v as MatrxDataTableUrlStateConfig, w as MatrxDataTableWindowConfig, x as MatrxTablePagination, y as SortDirection, S as SortState, b as TableSavedViewsProps, T as TableSearchMatchMode, z as TableViewQuery, B as TextFilterMode, D as ToolbarFacet } from '../types-Di6QT0P1.cjs';
3
+ import { f as MatrxDataTableProps, g as TableViewSnapshot } from '../types-BcIcmIxd.cjs';
4
+ export { A as AnyOfColumnSearch, h as CellEditType, i as CellEditsMap, d as ColumnFilterKind, a as ColumnFilterValue, C as ColumnFiltersState, M as MatrxColumnDef, e as MatrxDataTableCopyConfig, j as MatrxDataTableDetailConfig, k as MatrxDataTableEditConfig, l as MatrxDataTableEmptyState, m as MatrxDataTableFilterUi, n as MatrxDataTableHierarchyConfig, o as MatrxDataTableHierarchyMove, p as MatrxDataTableMobileCardControls, q as MatrxDataTableQueryControl, c as MatrxDataTableQueryState, r as MatrxDataTableRecordControls, s as MatrxDataTableSelectionConfig, t as MatrxDataTableSourceProcessing, u as MatrxDataTableToolbar, v as MatrxDataTableUrlStateConfig, w as MatrxDataTableWindowConfig, x as MatrxTablePagination, y as SortDirection, S as SortState, b as TableSavedViewsProps, T as TableSearchMatchMode, z as TableViewQuery, B as TextFilterMode, D as ToolbarFacet } from '../types-BcIcmIxd.cjs';
5
5
  export { MatrxDataTableHost, MatrxDataTableProvider, TableDoors, TableEntityRefProps, TableLinkProps, TablePeekProps, TableSidePanelProps, TableToolbarActionProps, TableWindowPanelProps, useMatrxDataTableHost } from './host.cjs';
6
6
  export { DataRowInspector } from './data-row-inspector.cjs';
7
7
  export { DataRowWindow, DataRowWindowProps, DataRowWindowTab } from './data-row-window.cjs';
@@ -1,7 +1,7 @@
1
1
  import * as React from 'react';
2
2
  import { ReactNode } from 'react';
3
- import { f as MatrxDataTableProps, g as TableViewSnapshot } from '../types-D1m14boM.js';
4
- export { A as AnyOfColumnSearch, h as CellEditType, i as CellEditsMap, d as ColumnFilterKind, a as ColumnFilterValue, C as ColumnFiltersState, M as MatrxColumnDef, e as MatrxDataTableCopyConfig, j as MatrxDataTableDetailConfig, k as MatrxDataTableEditConfig, l as MatrxDataTableEmptyState, m as MatrxDataTableFilterUi, n as MatrxDataTableHierarchyConfig, o as MatrxDataTableHierarchyMove, p as MatrxDataTableMobileCardControls, q as MatrxDataTableQueryControl, c as MatrxDataTableQueryState, r as MatrxDataTableRecordControls, s as MatrxDataTableSelectionConfig, t as MatrxDataTableSourceProcessing, u as MatrxDataTableToolbar, v as MatrxDataTableUrlStateConfig, w as MatrxDataTableWindowConfig, x as MatrxTablePagination, y as SortDirection, S as SortState, b as TableSavedViewsProps, T as TableSearchMatchMode, z as TableViewQuery, B as TextFilterMode, D as ToolbarFacet } from '../types-D1m14boM.js';
3
+ import { f as MatrxDataTableProps, g as TableViewSnapshot } from '../types-xTXSqmR7.js';
4
+ export { A as AnyOfColumnSearch, h as CellEditType, i as CellEditsMap, d as ColumnFilterKind, a as ColumnFilterValue, C as ColumnFiltersState, M as MatrxColumnDef, e as MatrxDataTableCopyConfig, j as MatrxDataTableDetailConfig, k as MatrxDataTableEditConfig, l as MatrxDataTableEmptyState, m as MatrxDataTableFilterUi, n as MatrxDataTableHierarchyConfig, o as MatrxDataTableHierarchyMove, p as MatrxDataTableMobileCardControls, q as MatrxDataTableQueryControl, c as MatrxDataTableQueryState, r as MatrxDataTableRecordControls, s as MatrxDataTableSelectionConfig, t as MatrxDataTableSourceProcessing, u as MatrxDataTableToolbar, v as MatrxDataTableUrlStateConfig, w as MatrxDataTableWindowConfig, x as MatrxTablePagination, y as SortDirection, S as SortState, b as TableSavedViewsProps, T as TableSearchMatchMode, z as TableViewQuery, B as TextFilterMode, D as ToolbarFacet } from '../types-xTXSqmR7.js';
5
5
  export { MatrxDataTableHost, MatrxDataTableProvider, TableDoors, TableEntityRefProps, TableLinkProps, TablePeekProps, TableSidePanelProps, TableToolbarActionProps, TableWindowPanelProps, useMatrxDataTableHost } from './host.js';
6
6
  export { DataRowInspector } from './data-row-inspector.js';
7
7
  export { DataRowWindow, DataRowWindowProps, DataRowWindowTab } from './data-row-window.js';
@@ -1034,12 +1034,16 @@ function isVerticallyScrollable(element) {
1034
1034
  return (overflowY === "auto" || overflowY === "scroll" || overflowY === "overlay") && element.scrollHeight > element.clientHeight;
1035
1035
  }
1036
1036
  function resolveScrollOwner(source) {
1037
+ const documentOwner = document.scrollingElement instanceof HTMLElement ? document.scrollingElement : document.documentElement;
1037
1038
  for (let node = source; node; node = node.parentElement) {
1039
+ if (node === documentOwner || node === document.documentElement || node === document.body) {
1040
+ return { element: documentOwner, document: true };
1041
+ }
1038
1042
  if (node === source && node.scrollHeight > node.clientHeight || isVerticallyScrollable(node)) {
1039
1043
  return { element: node, document: false };
1040
1044
  }
1041
1045
  }
1042
- return { element: document.scrollingElement instanceof HTMLElement ? document.scrollingElement : document.documentElement, document: true };
1046
+ return { element: documentOwner, document: true };
1043
1047
  }
1044
1048
  function ownerScrollTop(owner) {
1045
1049
  return owner.document ? window.scrollY || document.documentElement.scrollTop || document.body.scrollTop || 0 : owner.element.scrollTop;
@@ -1166,7 +1170,7 @@ function useScrollPagination({
1166
1170
  else owner.element.removeEventListener("scroll", onOwnerScroll);
1167
1171
  });
1168
1172
  };
1169
- const setIntent = (source, startTop) => {
1173
+ const setIntent = (source) => {
1170
1174
  const current = latestRef.current;
1171
1175
  const owner = resolveScrollOwner(source);
1172
1176
  if (!isVisibleContainer(source) || current.loading || current.isFetchingNextPage || inFlightGenerationRef.current !== null) return;
@@ -1179,9 +1183,8 @@ function useScrollPagination({
1179
1183
  };
1180
1184
  const cleanups = attachable.map((source) => {
1181
1185
  if (!observedTopRef.current.has(source)) observedTopRef.current.set(source, source.scrollTop);
1182
- const lastObservedTop = () => observedTopRef.current.get(source) ?? source.scrollTop;
1183
1186
  const onWheel = (event) => {
1184
- if (event.deltaY > 0 && Math.abs(event.deltaY) > Math.abs(event.deltaX)) setIntent(source, lastObservedTop());
1187
+ if (event.deltaY > 0 && Math.abs(event.deltaY) > Math.abs(event.deltaX)) setIntent(source);
1185
1188
  };
1186
1189
  const onTouchStart = (event) => {
1187
1190
  const touch = event.touches.item(0);
@@ -1190,16 +1193,16 @@ function useScrollPagination({
1190
1193
  const onTouchMove = (event) => {
1191
1194
  const touch = event.touches.item(0);
1192
1195
  const startY = Number(source.dataset.matrxPaginationTouchY);
1193
- if (touch && Number.isFinite(startY) && startY - touch.clientY > 0) setIntent(source, lastObservedTop());
1196
+ if (touch && Number.isFinite(startY) && startY - touch.clientY > 0) setIntent(source);
1194
1197
  };
1195
1198
  const onTouchEnd = () => {
1196
1199
  delete source.dataset.matrxPaginationTouchY;
1197
1200
  };
1198
1201
  const onKeyDown = (event) => {
1199
- if (isDownwardKeyboardInput(event)) setIntent(source, lastObservedTop());
1202
+ if (isDownwardKeyboardInput(event)) setIntent(source);
1200
1203
  };
1201
1204
  const onPointerDown = (event) => {
1202
- if (isNativeScrollbarPointer(event, source)) setIntent(source, lastObservedTop());
1205
+ if (isNativeScrollbarPointer(event, source)) setIntent(source);
1203
1206
  };
1204
1207
  const onScroll = () => {
1205
1208
  handleScroll(source, { element: source, document: false });
@@ -5969,6 +5972,8 @@ function ColumnResizeHandle({
5969
5972
  minWidth,
5970
5973
  maxWidth,
5971
5974
  disabled = false,
5975
+ onResizeStart,
5976
+ onResizeCancel,
5972
5977
  onResizeCommit
5973
5978
  }) {
5974
5979
  const handleRef = useRef7(null);
@@ -6013,6 +6018,7 @@ function ColumnResizeHandle({
6013
6018
  if (!commit) {
6014
6019
  if (active.priorPreview) table?.style.setProperty(cssVar, active.priorPreview);
6015
6020
  else table?.style.removeProperty(cssVar);
6021
+ onResizeCancel?.();
6016
6022
  } else {
6017
6023
  writePreview(width);
6018
6024
  setAnnouncedWidth(width);
@@ -6021,7 +6027,7 @@ function ColumnResizeHandle({
6021
6027
  if (handleRef.current?.hasPointerCapture(active.pointerId)) {
6022
6028
  handleRef.current.releasePointerCapture(active.pointerId);
6023
6029
  }
6024
- }, [clearQueuedPreview, columnId2, cssVar, onResizeCommit, tableRef, writePreview]);
6030
+ }, [clearQueuedPreview, columnId2, cssVar, onResizeCancel, onResizeCommit, tableRef, writePreview]);
6025
6031
  useEffect8(() => () => clearQueuedPreview(), [clearQueuedPreview]);
6026
6032
  const onPointerDown = (event) => {
6027
6033
  if (disabled || event.button !== 0 || !event.isPrimary) return;
@@ -6029,6 +6035,7 @@ function ColumnResizeHandle({
6029
6035
  event.stopPropagation();
6030
6036
  const startWidth = readWidth();
6031
6037
  keyboardWidthRef.current = startWidth;
6038
+ onResizeStart?.();
6032
6039
  activeResizeRef.current = {
6033
6040
  pointerId: event.pointerId,
6034
6041
  startX: event.clientX,
@@ -6068,6 +6075,7 @@ function ColumnResizeHandle({
6068
6075
  event.stopPropagation();
6069
6076
  const nextWidth = clampColumnWidth(width, bounds);
6070
6077
  keyboardWidthRef.current = nextWidth;
6078
+ onResizeStart?.();
6071
6079
  writePreview(nextWidth);
6072
6080
  setAnnouncedWidth(nextWidth);
6073
6081
  onResizeCommit(columnId2, nextWidth);
@@ -8330,6 +8338,7 @@ function MatrxDataTableCore({
8330
8338
  if (scrollRef.current) scrollRef.current.scrollTop = 0;
8331
8339
  if (cardsScrollRef.current) cardsScrollRef.current.scrollTop = 0;
8332
8340
  }, [appendQueryKey]);
8341
+ const appendScrollPolicy = appendQuery?.scroll;
8333
8342
  const scrollPagination = useScrollPagination({
8334
8343
  containers: [scrollRef, cardsScrollRef],
8335
8344
  queryKey: appendQuery?.pagination.queryKey ?? "",
@@ -8339,7 +8348,11 @@ function MatrxDataTableCore({
8339
8348
  error: appendQuery?.pagination.error ?? null,
8340
8349
  loadNextPage: appendQuery?.pagination.loadNextPage ?? (() => void 0),
8341
8350
  enabled: appendQuery !== null,
8342
- ...appendQuery?.scroll
8351
+ // Suspended policy is deliberately manual at the hook boundary: its
8352
+ // reason remains visible in the footer while automatic listeners stay off.
8353
+ mode: appendScrollPolicy?.mode === "suspended" ? "manual" : appendScrollPolicy?.mode ?? "scroll",
8354
+ ...appendScrollPolicy?.mode === "scroll" && appendScrollPolicy.thresholdPx !== void 0 ? { thresholdPx: appendScrollPolicy.thresholdPx } : {},
8355
+ ...appendScrollPolicy?.mode === "scroll" && appendScrollPolicy.intentTimeoutMs !== void 0 ? { intentTimeoutMs: appendScrollPolicy.intentTimeoutMs } : {}
8343
8356
  });
8344
8357
  const rootRef = useRef9(null);
8345
8358
  const actionDiagnosticObserver = useRef9(null);
@@ -8481,6 +8494,7 @@ function MatrxDataTableCore({
8481
8494
  () => normalizeColumnWidthsForColumns(columnState?.widths ?? columnWidths, columns),
8482
8495
  [columns, columnState?.widths, columnWidths]
8483
8496
  );
8497
+ const resizeGestureSnapshotRef = useRef9(null);
8484
8498
  const measureVisibleColumnWidths = useCallback5(() => {
8485
8499
  const measured = {};
8486
8500
  const headers = tableRef.current ? Array.from(tableRef.current.querySelectorAll(
@@ -8515,13 +8529,25 @@ function MatrxDataTableCore({
8515
8529
  ...actionsWidth === void 0 ? {} : { actionsWidth }
8516
8530
  };
8517
8531
  }, []);
8532
+ const captureResizeGestureSnapshot = useCallback5(() => {
8533
+ resizeGestureSnapshotRef.current = {
8534
+ widths: measureVisibleColumnWidths(),
8535
+ geometry: measureFixedTableGeometry()
8536
+ };
8537
+ }, [measureFixedTableGeometry, measureVisibleColumnWidths]);
8538
+ const clearResizeGestureSnapshot = useCallback5(() => {
8539
+ resizeGestureSnapshotRef.current = null;
8540
+ }, []);
8518
8541
  const commitColumnWidths = useCallback5((next, captureInitialWidths = false) => {
8542
+ const gestureSnapshot = captureInitialWidths ? resizeGestureSnapshotRef.current : null;
8543
+ resizeGestureSnapshotRef.current = null;
8519
8544
  const normalized = normalizeColumnWidthsForColumns(
8520
- captureInitialWidths ? { ...measureVisibleColumnWidths(), ...next } : next,
8545
+ captureInitialWidths ? { ...gestureSnapshot?.widths ?? measureVisibleColumnWidths(), ...next } : next,
8521
8546
  columns
8522
8547
  );
8523
- if (captureInitialWidths) setFixedTableGeometry(measureFixedTableGeometry());
8524
- else setFixedTableGeometry(null);
8548
+ if (captureInitialWidths) {
8549
+ setFixedTableGeometry(gestureSnapshot?.geometry ?? measureFixedTableGeometry());
8550
+ } else setFixedTableGeometry(null);
8525
8551
  for (const id of columnIds) {
8526
8552
  tableRef.current?.style.removeProperty(columnResizeCssVar(id));
8527
8553
  }
@@ -9983,6 +10009,8 @@ function MatrxDataTableCore({
9983
10009
  tableRef,
9984
10010
  minWidth: col.minWidth,
9985
10011
  maxWidth: col.maxWidth,
10012
+ onResizeStart: captureResizeGestureSnapshot,
10013
+ onResizeCancel: clearResizeGestureSnapshot,
9986
10014
  onResizeCommit: (columnId2, width) => commitColumnWidths(
9987
10015
  { ...effectiveColumnWidths, [columnId2]: width },
9988
10016
  true
@@ -10325,7 +10353,11 @@ function MatrxDataTableCore({
10325
10353
  "."
10326
10354
  ] }) : null,
10327
10355
  !isLoading && !isFetching && !appendQuery.pagination.loadAll?.isLoading && !scrollPagination.error && !appendQuery.pagination.hasNextPage && appendQuery.pagination.totalItems !== void 0 && data.length === appendQuery.pagination.totalItems ? /* @__PURE__ */ jsx38("p", { children: "All source rows are loaded." }) : appendUsesLocalProcessing ? /* @__PURE__ */ jsx38("p", { children: "Local search and filters cover loaded rows." }) : null,
10328
- scrollPagination.error ? /* @__PURE__ */ jsx38("p", { role: "alert", className: "break-words text-destructive", children: scrollPagination.error.message }) : null
10356
+ scrollPagination.error ? /* @__PURE__ */ jsx38("p", { role: "alert", className: "break-words text-destructive", children: scrollPagination.error.message }) : null,
10357
+ appendScrollPolicy?.mode === "suspended" ? /* @__PURE__ */ jsxs28("p", { role: "status", className: "break-words", children: [
10358
+ appendScrollPolicy.reason,
10359
+ " Load more remains available."
10360
+ ] }) : null
10329
10361
  ] })
10330
10362
  ]
10331
10363
  }