@ai-matrx/design-system 0.43.0 → 0.44.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 (47) hide show
  1. package/CHANGELOG.md +30 -0
  2. package/dist/content-transfer.cjs +39 -0
  3. package/dist/content-transfer.cjs.map +1 -1
  4. package/dist/content-transfer.js +39 -0
  5. package/dist/content-transfer.js.map +1 -1
  6. package/dist/data-table/copy-helpers.d.cts +1 -1
  7. package/dist/data-table/copy-helpers.d.ts +1 -1
  8. package/dist/data-table/data-row-inspector.cjs +39 -0
  9. package/dist/data-table/data-row-inspector.cjs.map +1 -1
  10. package/dist/data-table/data-row-inspector.js +41 -2
  11. package/dist/data-table/data-row-inspector.js.map +1 -1
  12. package/dist/data-table/data-row-window.cjs +39 -0
  13. package/dist/data-table/data-row-window.cjs.map +1 -1
  14. package/dist/data-table/data-row-window.js +43 -4
  15. package/dist/data-table/data-row-window.js.map +1 -1
  16. package/dist/data-table/filter-engine.d.cts +1 -1
  17. package/dist/data-table/filter-engine.d.ts +1 -1
  18. package/dist/data-table/host.d.cts +1 -1
  19. package/dist/data-table/host.d.ts +1 -1
  20. package/dist/data-table/index.cjs +59 -0
  21. package/dist/data-table/index.cjs.map +1 -1
  22. package/dist/data-table/index.d.cts +2 -2
  23. package/dist/data-table/index.d.ts +2 -2
  24. package/dist/data-table/index.js +96 -37
  25. package/dist/data-table/index.js.map +1 -1
  26. package/dist/data-table/infer-filter.d.cts +1 -1
  27. package/dist/data-table/infer-filter.d.ts +1 -1
  28. package/dist/data-table/layered-filters.d.cts +1 -1
  29. package/dist/data-table/layered-filters.d.ts +1 -1
  30. package/dist/data-table/query-control.d.cts +1 -1
  31. package/dist/data-table/query-control.d.ts +1 -1
  32. package/dist/data-table/types.cjs.map +1 -1
  33. package/dist/data-table/types.d.cts +1 -1
  34. package/dist/data-table/types.d.ts +1 -1
  35. package/dist/data-table/url-state.d.cts +1 -1
  36. package/dist/data-table/url-state.d.ts +1 -1
  37. package/dist/data-table/xlsx.d.cts +1 -1
  38. package/dist/data-table/xlsx.d.ts +1 -1
  39. package/dist/index.cjs +47 -2
  40. package/dist/index.cjs.map +1 -1
  41. package/dist/index.d.cts +28 -1
  42. package/dist/index.d.ts +28 -1
  43. package/dist/index.js +52 -7
  44. package/dist/index.js.map +1 -1
  45. package/dist/{types-CUR8Hbt5.d.ts → types-Bzzzed5d.d.ts} +24 -1
  46. package/dist/{types-CqU57qk8.d.cts → types-cvgKRetM.d.cts} +24 -1
  47. package/package.json +1 -1
@@ -1,7 +1,7 @@
1
1
  import * as React from 'react';
2
2
  import { ReactNode } from 'react';
3
- import { h as MatrxDataTableProps, i as TableViewSnapshot, d as MatrxDataTableRecordControls, j as ColumnMarker, M as MatrxColumnDef } from '../types-CqU57qk8.cjs';
4
- export { A as AnyOfColumnSearch, k as CellEditType, l as CellEditsMap, f as ColumnFilterKind, a as ColumnFilterValue, C as ColumnFiltersState, m as MatrxDataTableContextMenuConfig, g as MatrxDataTableCopyConfig, n as MatrxDataTableCoverageConfig, c as MatrxDataTableDensity, o as MatrxDataTableDetailConfig, p as MatrxDataTableEditConfig, q as MatrxDataTableEmptyState, r as MatrxDataTableExpandedDetailConfig, s as MatrxDataTableFacetsConfig, t as MatrxDataTableFilterUi, u as MatrxDataTableGroupingConfig, v as MatrxDataTableHierarchyConfig, w as MatrxDataTableHierarchyMove, x as MatrxDataTableMobileCardControls, y as MatrxDataTableMultiExpandedDetailConfig, z as MatrxDataTableQueryControl, e as MatrxDataTableQueryState, B as MatrxDataTableSelectionConfig, D as MatrxDataTableSingleExpandedDetailConfig, E as MatrxDataTableSourceProcessing, F as MatrxDataTableSpreadsheetConfig, G as MatrxDataTableStyleConfig, H as MatrxDataTableToolbar, I as MatrxDataTableUrlStateConfig, J as MatrxDataTableVirtualizeConfig, K as MatrxDataTableWindowConfig, N as MatrxTablePagination, O as SortDirection, S as SortState, P as TableRankedSearchOptions, b as TableSavedViewsProps, T as TableSearchMatchMode, Q as TableSearchRole, R as TableSearchScope, U as TableViewQuery, V as TextFilterMode, W as ToolbarFacet, X as inferTableSearchRole, Y as rankTableSearchRows, Z as resolveTableSearchScopes } from '../types-CqU57qk8.cjs';
3
+ import { h as MatrxDataTableProps, i as TableViewSnapshot, d as MatrxDataTableRecordControls, j as ColumnMarker, M as MatrxColumnDef } from '../types-cvgKRetM.cjs';
4
+ export { A as AnyOfColumnSearch, k as CellEditType, l as CellEditsMap, f as ColumnFilterKind, a as ColumnFilterValue, C as ColumnFiltersState, m as MatrxDataTableContextMenuConfig, g as MatrxDataTableCopyConfig, n as MatrxDataTableCoverageConfig, c as MatrxDataTableDensity, o as MatrxDataTableDetailConfig, p as MatrxDataTableEditConfig, q as MatrxDataTableEmptyState, r as MatrxDataTableExpandedDetailConfig, s as MatrxDataTableFacetsConfig, t as MatrxDataTableFilterUi, u as MatrxDataTableGroupingConfig, v as MatrxDataTableHierarchyConfig, w as MatrxDataTableHierarchyMove, x as MatrxDataTableMobileCardControls, y as MatrxDataTableMultiExpandedDetailConfig, z as MatrxDataTableQueryControl, e as MatrxDataTableQueryState, B as MatrxDataTableSelectionConfig, D as MatrxDataTableSingleExpandedDetailConfig, E as MatrxDataTableSourceProcessing, F as MatrxDataTableSpreadsheetConfig, G as MatrxDataTableStyleConfig, H as MatrxDataTableToolbar, I as MatrxDataTableUrlStateConfig, J as MatrxDataTableVirtualizeConfig, K as MatrxDataTableWindowConfig, N as MatrxTablePagination, O as SortDirection, S as SortState, P as SpreadsheetSelection, Q as TableRankedSearchOptions, b as TableSavedViewsProps, T as TableSearchMatchMode, R as TableSearchRole, U as TableSearchScope, V as TableViewQuery, W as TextFilterMode, X as ToolbarFacet, Y as inferTableSearchRole, Z as rankTableSearchRows, _ as resolveTableSearchScopes } from '../types-cvgKRetM.cjs';
5
5
  export { MatrxDataTableHost, MatrxDataTableProvider, MatrxTableRowAlchemy, TableContextMenuBoundaryProps, TableDoors, TableEntityRefProps, TableLinkProps, TableMenuIconProps, TablePeekProps, TableSidePanelProps, TableToolbarActionProps, TableWindowPanelProps, useMatrxDataTableHost, useMatrxTableRowAlchemy } from './host.cjs';
6
6
  import { CopyControlProps } from './copy-types.cjs';
7
7
  export { AgentPayloadInput } from './copy-types.cjs';
@@ -1,7 +1,7 @@
1
1
  import * as React from 'react';
2
2
  import { ReactNode } from 'react';
3
- import { h as MatrxDataTableProps, i as TableViewSnapshot, d as MatrxDataTableRecordControls, j as ColumnMarker, M as MatrxColumnDef } from '../types-CUR8Hbt5.js';
4
- export { A as AnyOfColumnSearch, k as CellEditType, l as CellEditsMap, f as ColumnFilterKind, a as ColumnFilterValue, C as ColumnFiltersState, m as MatrxDataTableContextMenuConfig, g as MatrxDataTableCopyConfig, n as MatrxDataTableCoverageConfig, c as MatrxDataTableDensity, o as MatrxDataTableDetailConfig, p as MatrxDataTableEditConfig, q as MatrxDataTableEmptyState, r as MatrxDataTableExpandedDetailConfig, s as MatrxDataTableFacetsConfig, t as MatrxDataTableFilterUi, u as MatrxDataTableGroupingConfig, v as MatrxDataTableHierarchyConfig, w as MatrxDataTableHierarchyMove, x as MatrxDataTableMobileCardControls, y as MatrxDataTableMultiExpandedDetailConfig, z as MatrxDataTableQueryControl, e as MatrxDataTableQueryState, B as MatrxDataTableSelectionConfig, D as MatrxDataTableSingleExpandedDetailConfig, E as MatrxDataTableSourceProcessing, F as MatrxDataTableSpreadsheetConfig, G as MatrxDataTableStyleConfig, H as MatrxDataTableToolbar, I as MatrxDataTableUrlStateConfig, J as MatrxDataTableVirtualizeConfig, K as MatrxDataTableWindowConfig, N as MatrxTablePagination, O as SortDirection, S as SortState, P as TableRankedSearchOptions, b as TableSavedViewsProps, T as TableSearchMatchMode, Q as TableSearchRole, R as TableSearchScope, U as TableViewQuery, V as TextFilterMode, W as ToolbarFacet, X as inferTableSearchRole, Y as rankTableSearchRows, Z as resolveTableSearchScopes } from '../types-CUR8Hbt5.js';
3
+ import { h as MatrxDataTableProps, i as TableViewSnapshot, d as MatrxDataTableRecordControls, j as ColumnMarker, M as MatrxColumnDef } from '../types-Bzzzed5d.js';
4
+ export { A as AnyOfColumnSearch, k as CellEditType, l as CellEditsMap, f as ColumnFilterKind, a as ColumnFilterValue, C as ColumnFiltersState, m as MatrxDataTableContextMenuConfig, g as MatrxDataTableCopyConfig, n as MatrxDataTableCoverageConfig, c as MatrxDataTableDensity, o as MatrxDataTableDetailConfig, p as MatrxDataTableEditConfig, q as MatrxDataTableEmptyState, r as MatrxDataTableExpandedDetailConfig, s as MatrxDataTableFacetsConfig, t as MatrxDataTableFilterUi, u as MatrxDataTableGroupingConfig, v as MatrxDataTableHierarchyConfig, w as MatrxDataTableHierarchyMove, x as MatrxDataTableMobileCardControls, y as MatrxDataTableMultiExpandedDetailConfig, z as MatrxDataTableQueryControl, e as MatrxDataTableQueryState, B as MatrxDataTableSelectionConfig, D as MatrxDataTableSingleExpandedDetailConfig, E as MatrxDataTableSourceProcessing, F as MatrxDataTableSpreadsheetConfig, G as MatrxDataTableStyleConfig, H as MatrxDataTableToolbar, I as MatrxDataTableUrlStateConfig, J as MatrxDataTableVirtualizeConfig, K as MatrxDataTableWindowConfig, N as MatrxTablePagination, O as SortDirection, S as SortState, P as SpreadsheetSelection, Q as TableRankedSearchOptions, b as TableSavedViewsProps, T as TableSearchMatchMode, R as TableSearchRole, U as TableSearchScope, V as TableViewQuery, W as TextFilterMode, X as ToolbarFacet, Y as inferTableSearchRole, Z as rankTableSearchRows, _ as resolveTableSearchScopes } from '../types-Bzzzed5d.js';
5
5
  export { MatrxDataTableHost, MatrxDataTableProvider, MatrxTableRowAlchemy, TableContextMenuBoundaryProps, TableDoors, TableEntityRefProps, TableLinkProps, TableMenuIconProps, TablePeekProps, TableSidePanelProps, TableToolbarActionProps, TableWindowPanelProps, useMatrxDataTableHost, useMatrxTableRowAlchemy } from './host.js';
6
6
  import { CopyControlProps } from './copy-types.js';
7
7
  export { AgentPayloadInput } from './copy-types.js';
@@ -6,7 +6,7 @@ import {
6
6
  Fragment as Fragment7,
7
7
  isValidElement as isValidElement2,
8
8
  useCallback as useCallback8,
9
- useEffect as useEffect16,
9
+ useEffect as useEffect17,
10
10
  useId as useId2,
11
11
  useLayoutEffect as useLayoutEffect2,
12
12
  useMemo as useMemo9,
@@ -1529,6 +1529,15 @@ function useIsMobile() {
1529
1529
  return isMobile;
1530
1530
  }
1531
1531
 
1532
+ // src/layer-front.ts
1533
+ var LAYER_FRONT_EVENT = "matrx:layer-front";
1534
+ function announceLayerFront(element) {
1535
+ if (typeof document === "undefined") return;
1536
+ document.dispatchEvent(
1537
+ new CustomEvent(LAYER_FRONT_EVENT, { detail: { element } })
1538
+ );
1539
+ }
1540
+
1532
1541
  // src/dialog.tsx
1533
1542
  import { jsx as jsx16, jsxs as jsxs10 } from "react/jsx-runtime";
1534
1543
  var DialogWindowedByDefaultContext = React11.createContext(false);
@@ -1599,6 +1608,8 @@ var DialogContent = React11.forwardRef(
1599
1608
  dismissOnOutsideClick = false,
1600
1609
  onInteractOutside,
1601
1610
  onEscapeKeyDown,
1611
+ onPointerDownCapture,
1612
+ onFocusCapture,
1602
1613
  style,
1603
1614
  ...props
1604
1615
  }, ref) => {
@@ -1611,6 +1622,24 @@ var DialogContent = React11.forwardRef(
1611
1622
  const [containerEl, setContainerEl] = React11.useState(
1612
1623
  null
1613
1624
  );
1625
+ const stacks = windowed && windowedByDefault;
1626
+ const [behind, setBehind] = React11.useState(false);
1627
+ React11.useEffect(() => {
1628
+ if (!stacks || !containerEl) return;
1629
+ const onFront = (event) => {
1630
+ const element = event.detail?.element ?? null;
1631
+ if (element && (element === containerEl || containerEl.contains(element))) return;
1632
+ setBehind(true);
1633
+ };
1634
+ document.addEventListener(LAYER_FRONT_EVENT, onFront);
1635
+ announceLayerFront(containerEl);
1636
+ return () => document.removeEventListener(LAYER_FRONT_EVENT, onFront);
1637
+ }, [stacks, containerEl]);
1638
+ const bringToFront = () => {
1639
+ if (!stacks || !containerEl) return;
1640
+ setBehind(false);
1641
+ announceLayerFront(containerEl);
1642
+ };
1614
1643
  const [offset, setOffset] = React11.useState({ x: 0, y: 0 });
1615
1644
  const dragRef = React11.useRef(null);
1616
1645
  const handle = React11.useMemo(() => {
@@ -1669,10 +1698,20 @@ var DialogContent = React11.forwardRef(
1669
1698
  // z=1000); staying below that boundary makes a newly focused window
1670
1699
  // usable without coupling the two systems.
1671
1700
  !isModal && !windowedByDefault && "z-[900]",
1701
+ // Another layer came to the front after this window (layer-front.ts).
1702
+ stacks && behind && "z-[999]",
1672
1703
  // Without an overlay the card needs its own separation from the page.
1673
1704
  windowed && "shadow-2xl ring-1 ring-border/60"
1674
1705
  ),
1675
1706
  style: windowed && (offset.x !== 0 || offset.y !== 0) ? { ...style, translate: `${offset.x}px ${offset.y}px` } : style,
1707
+ onPointerDownCapture: (event) => {
1708
+ onPointerDownCapture?.(event);
1709
+ if (behind) bringToFront();
1710
+ },
1711
+ onFocusCapture: (event) => {
1712
+ onFocusCapture?.(event);
1713
+ if (behind) bringToFront();
1714
+ },
1676
1715
  onInteractOutside: (event) => {
1677
1716
  onInteractOutside?.(event);
1678
1717
  if (windowed && !dismissOnOutsideClick) event.preventDefault();
@@ -5710,9 +5749,9 @@ function useCopySubsetVariant() {
5710
5749
  }
5711
5750
 
5712
5751
  // src/data-table/clipping.ts
5713
- import { useEffect as useEffect6 } from "react";
5752
+ import { useEffect as useEffect7 } from "react";
5714
5753
  function useClippedContentGuard(ref, options) {
5715
- useEffect6(() => {
5754
+ useEffect7(() => {
5716
5755
  if (!options.enabled || !ref.current) return;
5717
5756
  const node = ref.current;
5718
5757
  const check = () => {
@@ -5726,7 +5765,7 @@ function useClippedContentGuard(ref, options) {
5726
5765
  }
5727
5766
 
5728
5767
  // src/data-table/url-state.ts
5729
- import { useCallback as useCallback4, useEffect as useEffect7, useMemo as useMemo5, useRef as useRef9, useState as useState12 } from "react";
5768
+ import { useCallback as useCallback4, useEffect as useEffect8, useMemo as useMemo5, useRef as useRef9, useState as useState12 } from "react";
5730
5769
  import {
5731
5770
  commitUrlParams,
5732
5771
  useUrlSearchParams
@@ -5808,7 +5847,7 @@ function useTableUrlState(options) {
5808
5847
  const state = readState(searchParams);
5809
5848
  const lastTextWriteAt = useRef9(0);
5810
5849
  const [debouncedSearch, setDebouncedSearch] = useState12(state.search);
5811
- useEffect7(() => {
5850
+ useEffect8(() => {
5812
5851
  if (state.search === debouncedSearch) return;
5813
5852
  const timer = window.setTimeout(
5814
5853
  () => setDebouncedSearch(state.search),
@@ -5916,14 +5955,14 @@ import {
5916
5955
  } from "@ai-matrx/kit/url-state";
5917
5956
 
5918
5957
  // src/data-table/RowAlchemyLauncher.tsx
5919
- import { useCallback as useCallback5, useEffect as useEffect8, useRef as useRef10, useState as useState13 } from "react";
5958
+ import { useCallback as useCallback5, useEffect as useEffect9, useRef as useRef10, useState as useState13 } from "react";
5920
5959
  import { jsx as jsx30, jsxs as jsxs21 } from "react/jsx-runtime";
5921
5960
  function MatrxTableRowAlchemyProvider({ copy, placement, controls, children }) {
5922
5961
  const controller = useRef10(null);
5923
5962
  const { CopyControls } = useMatrxDataTableHost();
5924
5963
  const [active, setActive] = useState13(false);
5925
5964
  const [fallback, setFallback] = useState13(false);
5926
- useEffect8(() => {
5965
+ useEffect9(() => {
5927
5966
  if (placement !== "menu" || active) return;
5928
5967
  const timer = window.setTimeout(() => {
5929
5968
  if (!active) {
@@ -5960,7 +5999,7 @@ function MatrxTableRowAlchemyProvider({ copy, placement, controls, children }) {
5960
5999
  // src/data-table/ColumnHeaderCell.tsx
5961
6000
  import {
5962
6001
  forwardRef as forwardRef13,
5963
- useEffect as useEffect9,
6002
+ useEffect as useEffect10,
5964
6003
  useMemo as useMemo6,
5965
6004
  useRef as useRef11,
5966
6005
  useState as useState14
@@ -6347,7 +6386,7 @@ function ColumnHeaderCell({
6347
6386
  const [filterOpen, setFilterOpen] = useState14(false);
6348
6387
  const [pendingNegation, setPendingNegation] = useState14(false);
6349
6388
  const [draftFilter, setDraftFilter] = useState14(filterValue);
6350
- useEffect9(() => {
6389
+ useEffect10(() => {
6351
6390
  if (!filterOpen) {
6352
6391
  setDraftFilter(filterValue);
6353
6392
  setPendingNegation(filterValue?.negated ?? false);
@@ -6355,7 +6394,7 @@ function ColumnHeaderCell({
6355
6394
  }, [filterOpen, filterValue]);
6356
6395
  const notifyOpen = useRef11(onFilterOpen);
6357
6396
  notifyOpen.current = onFilterOpen;
6358
- useEffect9(() => {
6397
+ useEffect10(() => {
6359
6398
  if (filterOpen) notifyOpen.current?.();
6360
6399
  }, [filterOpen]);
6361
6400
  const applyFilter = () => {
@@ -7203,7 +7242,7 @@ function parseOptionalNumber(raw) {
7203
7242
  // src/data-table/ColumnResizeHandle.tsx
7204
7243
  import {
7205
7244
  useCallback as useCallback6,
7206
- useEffect as useEffect10,
7245
+ useEffect as useEffect11,
7207
7246
  useRef as useRef12,
7208
7247
  useState as useState15
7209
7248
  } from "react";
@@ -7300,7 +7339,7 @@ function ColumnResizeHandle({
7300
7339
  handleRef.current.releasePointerCapture(active.pointerId);
7301
7340
  }
7302
7341
  }, [clearQueuedPreview, columnId2, cssVar, onResizeCancel, onResizeCommit, tableRef, writePreview]);
7303
- useEffect10(() => () => clearQueuedPreview(), [clearQueuedPreview]);
7342
+ useEffect11(() => () => clearQueuedPreview(), [clearQueuedPreview]);
7304
7343
  const onPointerDown = (event) => {
7305
7344
  if (disabled || event.button !== 0 || !event.isPrimary) return;
7306
7345
  event.preventDefault();
@@ -7841,7 +7880,7 @@ function scrollOffsetForIndex(input) {
7841
7880
  }
7842
7881
 
7843
7882
  // src/data-table/useSpreadsheetGrid.ts
7844
- import { useCallback as useCallback7, useEffect as useEffect11, useMemo as useMemo7, useRef as useRef13, useState as useState16 } from "react";
7883
+ import { useCallback as useCallback7, useEffect as useEffect12, useMemo as useMemo7, useRef as useRef13, useState as useState16 } from "react";
7845
7884
 
7846
7885
  // src/data-table/grid-selection.ts
7847
7886
  function rangeBounds(range, rowIds, fieldNames) {
@@ -8578,7 +8617,7 @@ function useSpreadsheetGrid(options) {
8578
8617
  () => options ? options.columnIds.filter((id) => id !== "") : [],
8579
8618
  [options]
8580
8619
  );
8581
- useEffect11(() => {
8620
+ useEffect12(() => {
8582
8621
  if (!range) return;
8583
8622
  const rowSet = new Set(rowIds);
8584
8623
  const colSet = new Set(columnIds);
@@ -8997,7 +9036,7 @@ function useSpreadsheetGrid(options) {
8997
9036
  fillTargetRef.current = fillTarget;
8998
9037
  const boundsRef = useRef13(null);
8999
9038
  boundsRef.current = bounds;
9000
- useEffect11(() => {
9039
+ useEffect12(() => {
9001
9040
  if (!options) return;
9002
9041
  const commit = () => {
9003
9042
  const wasDragging = draggingRef.current;
@@ -9238,7 +9277,7 @@ function rankTableSearchRows(rows, columns, query, options = {}, extraText) {
9238
9277
  }
9239
9278
 
9240
9279
  // src/data-table/ColumnManager.tsx
9241
- import { useEffect as useEffect12, useMemo as useMemo8, useState as useState17 } from "react";
9280
+ import { useEffect as useEffect13, useMemo as useMemo8, useState as useState17 } from "react";
9242
9281
  import { useDndMonitor, useDraggable as useDraggable2, useDroppable } from "@dnd-kit/core";
9243
9282
  import { jsx as jsx34, jsxs as jsxs24 } from "react/jsx-runtime";
9244
9283
  function ColumnManager({
@@ -9257,7 +9296,7 @@ function ColumnManager({
9257
9296
  const [draftHidden, setDraftHidden] = useState17(() => new Set(hidden));
9258
9297
  const [draggedColumnId, setDraggedColumnId] = useState17(null);
9259
9298
  const [dropTarget, setDropTarget] = useState17(null);
9260
- useEffect12(() => {
9299
+ useEffect13(() => {
9261
9300
  if (!open) return;
9262
9301
  setDraftOrder(order);
9263
9302
  setDraftHidden(new Set(hidden));
@@ -9790,7 +9829,7 @@ function parseTableViewSnapshot(raw) {
9790
9829
 
9791
9830
  // src/data-table/MatrxUuidCell.tsx
9792
9831
  import {
9793
- useEffect as useEffect13,
9832
+ useEffect as useEffect14,
9794
9833
  useRef as useRef14,
9795
9834
  useState as useState18
9796
9835
  } from "react";
@@ -9837,7 +9876,7 @@ function MatrxUuidCell({
9837
9876
  const [opening, setOpening] = useState18(false);
9838
9877
  const [peekOpen, setPeekOpen] = useState18(false);
9839
9878
  const timer = useRef14(null);
9840
- useEffect13(
9879
+ useEffect14(
9841
9880
  () => () => {
9842
9881
  if (timer.current) clearTimeout(timer.current);
9843
9882
  },
@@ -10132,7 +10171,7 @@ function DataRowInspector({
10132
10171
  }
10133
10172
 
10134
10173
  // src/data-table/DataRowWindow.tsx
10135
- import { useEffect as useEffect14, useState as useState19 } from "react";
10174
+ import { useEffect as useEffect15, useState as useState19 } from "react";
10136
10175
  import { jsx as jsx37, jsxs as jsxs27 } from "react/jsx-runtime";
10137
10176
  function DataRowWindow({
10138
10177
  isOpen,
@@ -10154,7 +10193,7 @@ function DataRowWindow({
10154
10193
  const hasTabs = hasEdit && children == null;
10155
10194
  const initialTab = defaultTab ?? (hasEdit ? "edit" : "view");
10156
10195
  const [tab, setTab] = useState19(initialTab);
10157
- useEffect14(() => {
10196
+ useEffect15(() => {
10158
10197
  if (!isOpen) return;
10159
10198
  setTab(defaultTab ?? (hasEdit ? "edit" : "view"));
10160
10199
  }, [isOpen, windowId, hasEdit, defaultTab]);
@@ -11368,7 +11407,7 @@ function DirtySavePill({
11368
11407
  }
11369
11408
 
11370
11409
  // src/data-table/EditableTableCell.tsx
11371
- import { useEffect as useEffect15, useRef as useRef15, useState as useState20 } from "react";
11410
+ import { useEffect as useEffect16, useRef as useRef15, useState as useState20 } from "react";
11372
11411
  import { jsx as jsx40, jsxs as jsxs30 } from "react/jsx-runtime";
11373
11412
  function CellRefusal({ reason }) {
11374
11413
  return /* @__PURE__ */ jsx40(
@@ -11432,10 +11471,10 @@ function EditableTableCell({
11432
11471
  }) {
11433
11472
  const [open, setOpen] = useState20(false);
11434
11473
  const [refusal, setRefusal] = useState20(null);
11435
- useEffect15(() => {
11474
+ useEffect16(() => {
11436
11475
  if (editRequest !== void 0) setOpen(true);
11437
11476
  }, [editRequest]);
11438
- useEffect15(() => {
11477
+ useEffect16(() => {
11439
11478
  if (!open) setRefusal(null);
11440
11479
  }, [open]);
11441
11480
  const usePencil = Boolean(href) || editTrigger === "pencil";
@@ -11545,7 +11584,7 @@ function InlineStringEditor({
11545
11584
  const handledEditRequest = useRef15(void 0);
11546
11585
  const seedRef = useRef15(editSeed);
11547
11586
  seedRef.current = editSeed;
11548
- useEffect15(() => {
11587
+ useEffect16(() => {
11549
11588
  if (editRequest === void 0 || handledEditRequest.current === editRequest) return;
11550
11589
  handledEditRequest.current = editRequest;
11551
11590
  setDraft(seedRef.current ?? value);
@@ -12536,7 +12575,7 @@ function MatrxDataTableWithUrlState({
12536
12575
  ...urlState.history === void 0 ? {} : { history: urlState.history },
12537
12576
  ...urlState.textHistory === void 0 ? {} : { textHistory: urlState.textHistory }
12538
12577
  });
12539
- useEffect16(() => {
12578
+ useEffect17(() => {
12540
12579
  if (activeUrlTableIds.has(urlState.id)) {
12541
12580
  throw new Error(
12542
12581
  `Duplicate MatrxDataTable urlState.id "${urlState.id}" on one page. Give every table a unique stable id.`
@@ -12936,7 +12975,7 @@ function MatrxDataTableCore({
12936
12975
  rows: Object.entries(draft.values).map(([rowId, columns2]) => ({ rowId, columns: columns2 }))
12937
12976
  }));
12938
12977
  const selection = appendSourceChanged && selectionConfig ? { ...selectionConfig, selectedIds: [] } : selectionConfig;
12939
- useEffect16(() => {
12978
+ useEffect17(() => {
12940
12979
  const previous = committedAppendQueryKey.current;
12941
12980
  committedAppendQueryKey.current = appendQueryKey;
12942
12981
  if (previous === null || appendQueryKey === null || previous === appendQueryKey) {
@@ -13006,7 +13045,7 @@ function MatrxDataTableCore({
13006
13045
  behavior: "smooth"
13007
13046
  });
13008
13047
  };
13009
- useEffect16(() => {
13048
+ useEffect17(() => {
13010
13049
  updateScrollHint();
13011
13050
  window.addEventListener("resize", updateScrollHint);
13012
13051
  const el = scrollRef.current;
@@ -13099,7 +13138,7 @@ function MatrxDataTableCore({
13099
13138
  columnDragRaf.current = null;
13100
13139
  columnDragScrollDirection.current = 0;
13101
13140
  }, []);
13102
- useEffect16(() => () => {
13141
+ useEffect17(() => () => {
13103
13142
  columnDragActive.current = false;
13104
13143
  stopColumnDragScroll();
13105
13144
  }, [stopColumnDragScroll]);
@@ -13225,7 +13264,7 @@ function MatrxDataTableCore({
13225
13264
  }
13226
13265
  setColumnWidths(normalized);
13227
13266
  }, [columnIds, columnState, columns, measureFixedTableGeometry, measureVisibleColumnWidths]);
13228
- useEffect16(() => {
13267
+ useEffect17(() => {
13229
13268
  const ids = columns.map(columnId);
13230
13269
  if (columnState) return;
13231
13270
  const previousIds = knownColumnIds.current;
@@ -13456,7 +13495,7 @@ function MatrxDataTableCore({
13456
13495
  searchScope
13457
13496
  ]);
13458
13497
  const lastNotifiedViewRows = useRef16(null);
13459
- useEffect16(() => {
13498
+ useEffect17(() => {
13460
13499
  if (!onViewChange) {
13461
13500
  lastNotifiedViewRows.current = null;
13462
13501
  return;
@@ -13465,7 +13504,7 @@ function MatrxDataTableCore({
13465
13504
  lastNotifiedViewRows.current = processed;
13466
13505
  if (changed) onViewChange(processed);
13467
13506
  }, [processed, onViewChange]);
13468
- useEffect16(() => {
13507
+ useEffect17(() => {
13469
13508
  if (controlledQuery) return;
13470
13509
  setInternalPage(1);
13471
13510
  }, [
@@ -13647,7 +13686,7 @@ function MatrxDataTableCore({
13647
13686
  frozenRunLength
13648
13687
  ]);
13649
13688
  const metricsWanted = virtualizeActive || columnVirtualizeActive;
13650
- useEffect16(() => {
13689
+ useEffect17(() => {
13651
13690
  recomputeWindows();
13652
13691
  }, [
13653
13692
  recomputeWindows,
@@ -13659,7 +13698,7 @@ function MatrxDataTableCore({
13659
13698
  columnWindowWidth,
13660
13699
  frozenRunLength
13661
13700
  ]);
13662
- useEffect16(() => {
13701
+ useEffect17(() => {
13663
13702
  if (!metricsWanted) return;
13664
13703
  const el = scrollRef.current;
13665
13704
  if (!el) return;
@@ -13778,6 +13817,26 @@ function MatrxDataTableCore({
13778
13817
  );
13779
13818
  const sheetRef = useRef16(sheet);
13780
13819
  sheetRef.current = sheet;
13820
+ const onSheetSelectionRef = useRef16(spreadsheet?.onSelectionChange);
13821
+ onSheetSelectionRef.current = spreadsheet?.onSelectionChange;
13822
+ const sheetSelectionKey = sheet.range ? `${sheet.range.anchor.rowId}\0${sheet.range.anchor.fieldName}\0${sheet.range.focus.rowId}\0${sheet.range.focus.fieldName}\0${sheet.bounds ? `${sheet.bounds.r0}:${sheet.bounds.r1}:${sheet.bounds.c0}:${sheet.bounds.c1}` : ""}` : "";
13823
+ useEffect17(() => {
13824
+ const tell = onSheetSelectionRef.current;
13825
+ if (!tell) return;
13826
+ const current = sheetRef.current;
13827
+ if (!current.range) {
13828
+ tell(null);
13829
+ return;
13830
+ }
13831
+ const { rowIds, columnIds: columnIds2 } = current.selectionAddresses();
13832
+ tell({
13833
+ active: { rowId: current.range.focus.rowId, columnId: current.range.focus.fieldName },
13834
+ rowIds,
13835
+ columnIds: columnIds2,
13836
+ cellCount: rowIds.length * columnIds2.length,
13837
+ tsv: current.selectionTsv()
13838
+ });
13839
+ }, [sheetSelectionKey]);
13781
13840
  const searchValueRef = useRef16(searchValue);
13782
13841
  searchValueRef.current = searchValue;
13783
13842
  const facetsEnabled = Boolean(facets && facets.enabled !== false);
@@ -13852,12 +13911,12 @@ function MatrxDataTableCore({
13852
13911
  }));
13853
13912
  });
13854
13913
  }, []);
13855
- useEffect16(() => {
13914
+ useEffect17(() => {
13856
13915
  if (!facetsEnabled) return;
13857
13916
  setFacetState({});
13858
13917
  facetRequestRef.current = /* @__PURE__ */ new Map();
13859
13918
  }, [facetsEnabled, data, searchValue]);
13860
- useEffect16(() => {
13919
+ useEffect17(() => {
13861
13920
  if (!controlledQuery || controlledQuery.state.page === safePage) return;
13862
13921
  emitControlledQueryChange({ page: safePage });
13863
13922
  }, [controlledQuery, emitControlledQueryChange, safePage]);
@@ -14443,7 +14502,7 @@ function MatrxDataTableCore({
14443
14502
  );
14444
14503
  const resolveMenuLevelRef = useRef16(resolveMenuLevel);
14445
14504
  resolveMenuLevelRef.current = resolveMenuLevel;
14446
- useEffect16(() => {
14505
+ useEffect17(() => {
14447
14506
  if (!host.rowContextRegistry) return;
14448
14507
  return host.rowContextRegistry.register(
14449
14508
  tableContextMenuInstanceId,