@gp-grid/core 0.18.0 → 0.20.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/dist/index.d.ts CHANGED
@@ -263,6 +263,9 @@ interface ColumnDefinition {
263
263
  * Converts a cell value to its display string. Used by the default cell renderer
264
264
  * when no `cellRenderer` is provided. Useful for `object`-type columns where the
265
265
  * default JSON.stringify may not be suitable (e.g., display a single field of an object).
266
+ *
267
+ * Display-only: the values-mode filter groups checkbox entries by this label,
268
+ * but the filter model (and any server request) always carries RAW values.
266
269
  */
267
270
  valueFormatter?: (value: CellValue) => string;
268
271
  /**
@@ -271,6 +274,11 @@ interface ColumnDefinition {
271
274
  * use this for large datasets to avoid an O(n) scan when the value domain is
272
275
  * known up front (e.g., enums, fixed tag lists). Values are still de-duplicated
273
276
  * and sorted by their display string.
277
+ *
278
+ * Supply RAW values. When the column also has a `valueFormatter` that collapses
279
+ * several raw values into one label, this list must contain the FULL raw domain:
280
+ * values-mode filtering matches raw values, so raws missing from this list can
281
+ * never be selected and their rows would be hidden by a values filter.
274
282
  */
275
283
  distinctValues?: CellValue[];
276
284
  /**
@@ -303,8 +311,16 @@ interface TextFilterCondition {
303
311
  type: "text";
304
312
  operator: TextFilterOperator;
305
313
  value?: string;
306
- /** Selected distinct values for checkbox-style filtering */
307
- selectedValues?: Set<string>;
314
+ /**
315
+ * Raw cell values selected in values (checkbox) mode.
316
+ *
317
+ * These are raw values, never formatted labels: server-side data sources
318
+ * receive them as-is in `DataSourceRequest.filter`, and display formatting
319
+ * (`ColumnDefinition.valueFormatter`) never enters the filter model. Treat
320
+ * the set as immutable — replace it to change the selection. When
321
+ * serializing a request for a server, convert the Set to an array.
322
+ */
323
+ selectedValues?: Set<CellValue>;
308
324
  /** Include blank values */
309
325
  includeBlank?: boolean;
310
326
  /** Operator connecting this condition to the next. Defaults to ColumnFilterModel.combination */
@@ -360,8 +376,10 @@ interface DataSourceRequest {
360
376
  filter?: FilterModel;
361
377
  /**
362
378
  * Per-field value formatters, derived from column definitions.
363
- * Client data sources use these so text filters compare against the
364
- * displayed (formatted) value. Server-side data sources may ignore them.
379
+ * Client data sources use these only for free-text condition operators
380
+ * (contains, equals, ...) so they match the displayed value the user
381
+ * typed against. Values-mode `selectedValues` always hold raw values and
382
+ * ignore them. Server-side data sources may ignore them entirely.
365
383
  */
366
384
  valueFormatters?: Record<string, (v: CellValue) => string>;
367
385
  }
@@ -648,7 +666,37 @@ interface CancelRowDragInstruction {
648
666
  type: "CANCEL_ROW_DRAG";
649
667
  }
650
668
  /** Union type of all instructions */
651
- type GridInstruction = /** Slot lifecycle */CreateSlotInstruction | DestroySlotInstruction | AssignSlotInstruction | MoveSlotInstruction /** Scroll */ | ScrollToInstruction /** Selection */ | SetActiveCellInstruction | SetSelectionRangeInstruction | UpdateVisibleRangeInstruction /** Highlighting */ | SetHoverPositionInstruction /** Editing */ | StartEditInstruction | StopEditInstruction | CommitEditInstruction /** Peek (read-only expand) */ | StartPeekInstruction | StopPeekInstruction /** Layout */ | SetContentSizeInstruction | UpdateHeaderInstruction /** Filter popup */ | OpenFilterPopupInstruction | CloseFilterPopupInstruction /** Fill handle */ | StartFillInstruction | UpdateFillInstruction | CommitFillInstruction | CancelFillInstruction /** Data */ | DataLoadingInstruction | DataLoadedInstruction | DataErrorInstruction /** Transactions */ | RowsAddedInstruction | RowsRemovedInstruction | RowsUpdatedInstruction | TransactionProcessedInstruction /** Column changes */ | ColumnsChangedInstruction /** Column resize */ | StartColumnResizeInstruction | UpdateColumnResizeInstruction | CommitColumnResizeInstruction | CancelColumnResizeInstruction /** Column move */ | StartColumnMoveInstruction | UpdateColumnMoveInstruction | CommitColumnMoveInstruction | CancelColumnMoveInstruction /** Row drag */ | StartRowDragInstruction | UpdateRowDragInstruction | CommitRowDragInstruction | CancelRowDragInstruction;
669
+ type GridInstruction =
670
+ /** Slot lifecycle */
671
+ CreateSlotInstruction | DestroySlotInstruction | AssignSlotInstruction | MoveSlotInstruction |
672
+ /** Scroll */
673
+ ScrollToInstruction |
674
+ /** Selection */
675
+ SetActiveCellInstruction | SetSelectionRangeInstruction | UpdateVisibleRangeInstruction |
676
+ /** Highlighting */
677
+ SetHoverPositionInstruction |
678
+ /** Editing */
679
+ StartEditInstruction | StopEditInstruction | CommitEditInstruction |
680
+ /** Peek (read-only expand) */
681
+ StartPeekInstruction | StopPeekInstruction |
682
+ /** Layout */
683
+ SetContentSizeInstruction | UpdateHeaderInstruction |
684
+ /** Filter popup */
685
+ OpenFilterPopupInstruction | CloseFilterPopupInstruction |
686
+ /** Fill handle */
687
+ StartFillInstruction | UpdateFillInstruction | CommitFillInstruction | CancelFillInstruction |
688
+ /** Data */
689
+ DataLoadingInstruction | DataLoadedInstruction | DataErrorInstruction |
690
+ /** Transactions */
691
+ RowsAddedInstruction | RowsRemovedInstruction | RowsUpdatedInstruction | TransactionProcessedInstruction |
692
+ /** Column changes */
693
+ ColumnsChangedInstruction |
694
+ /** Column resize */
695
+ StartColumnResizeInstruction | UpdateColumnResizeInstruction | CommitColumnResizeInstruction | CancelColumnResizeInstruction |
696
+ /** Column move */
697
+ StartColumnMoveInstruction | UpdateColumnMoveInstruction | CommitColumnMoveInstruction | CancelColumnMoveInstruction |
698
+ /** Row drag */
699
+ StartRowDragInstruction | UpdateRowDragInstruction | CommitRowDragInstruction | CancelRowDragInstruction;
652
700
  /** Instruction listener: Single instruction Listener that receives a single instruction, used by frameworks to update their state */
653
701
  type InstructionListener = (instruction: GridInstruction) => void;
654
702
  /** Batch instruction listener: Batch instruction Listener that receives an array of instructions, used by frameworks to update their state */
@@ -689,6 +737,14 @@ interface GridCoreOptions<TData = unknown> {
689
737
  headerHeight?: number;
690
738
  /** Overscan: How many rows to render outside the viewport */
691
739
  overscan?: number;
740
+ /**
741
+ * Maximum velocity (logical px/ms) that stacked touch flicks can
742
+ * accumulate while scroll virtualization is active (datasets exceeding
743
+ * the browser scroll limit). Higher values traverse huge datasets faster
744
+ * but need a larger `overscan` (10–12 recommended) so rendering keeps up.
745
+ * Default: 20 × rowHeight, i.e. about 20,000 rows per second.
746
+ */
747
+ maxFlingVelocity?: number;
692
748
  /** Row loading and cache behavior. Server data sources use paginated loading by default. */
693
749
  rowLoading?: RowLoadingOptions;
694
750
  /** Enable/disable sorting globally. Default: true */
@@ -1452,12 +1508,25 @@ declare class SortFilterManager<TData = Record<string, unknown>> {
1452
1508
  private filterModel;
1453
1509
  private openFilterColIndex;
1454
1510
  private readonly scanWarnedCols;
1511
+ private readonly truncationWarnedCols;
1512
+ private readonly typeMismatchWarnedCols;
1455
1513
  onInstruction: (listener: InstructionListener) => () => void;
1456
1514
  private readonly emit;
1457
1515
  constructor(options: SortFilterManagerOptions<TData>);
1458
1516
  setSort(colId: string, direction: SortDirection | null, addToExisting?: boolean): Promise<void>;
1459
1517
  getSortModel(): SortModel[];
1460
1518
  setFilter(colId: string, filter: ColumnFilterModel | string | null): Promise<void>;
1519
+ /**
1520
+ * Lint for hand-constructed filter models: values-mode `selectedValues`
1521
+ * match by strict raw identity (`"5"` never matches `5`, an ISO string
1522
+ * never matches a `Date`), so an all-string selection on a column whose
1523
+ * raw type is not a string will match nothing. This typically comes from
1524
+ * a lossy round-trip — filter state restored via `JSON.parse` or built
1525
+ * from URL params, where numbers and Dates arrive as strings. The mistake
1526
+ * is otherwise silent because `Set<string>` typechecks against
1527
+ * `Set<CellValue>`; warn once per column.
1528
+ */
1529
+ private warnTypeMismatchedSelectedValues;
1461
1530
  getFilterModel(): FilterModel;
1462
1531
  /**
1463
1532
  * Check if a column has an active filter
@@ -1485,25 +1554,44 @@ declare class SortFilterManager<TData = Record<string, unknown>> {
1485
1554
  * For datasets above {@link DISTINCT_SCAN_WARN_THRESHOLD}, a one-time
1486
1555
  * console warning advises the consumer to pre-supply `distinctValues`
1487
1556
  * on the column to skip the full scan.
1557
+ *
1558
+ * Values are deduplicated by RAW identity ({@link rawValueKey}), not by
1559
+ * display label: when a `valueFormatter` collapses several raw values into
1560
+ * one label, every raw value survives so the popup can select them all.
1561
+ * Consequently `maxValues` caps raw values, not labels. If the cap
1562
+ * truncates the domain of a formatted column, a one-time warning is
1563
+ * emitted because ticking a label can no longer cover unscanned raws.
1488
1564
  */
1489
1565
  getDistinctValuesForColumn(colId: string, maxValues?: number): CellValue[];
1490
1566
  private scanDistinctValues;
1491
1567
  /**
1492
1568
  * Normalize a cell value into a dedup key and the value to store.
1493
- * Arrays are sorted lexicographically so different orderings produce the same key.
1494
- * When a formatter is provided it is applied to the key so that two raw values
1495
- * that render identically are treated as the same distinct entry.
1569
+ * Arrays are sorted lexicographically so different orderings produce the
1570
+ * same key. The key is the RAW identity ({@link rawValueKey}) display
1571
+ * formatting is intentionally not part of it, so raw values that share a
1572
+ * label all survive deduplication and the values-mode filter can select
1573
+ * every one of them.
1496
1574
  */
1497
1575
  private normalizeDistinctValue;
1576
+ /**
1577
+ * Values-mode filtering matches raw values, so when the distinct scan of a
1578
+ * formatted column is cut off at the cap, ticking a label cannot cover the
1579
+ * raw values that were never scanned — rows rendering that label would be
1580
+ * silently hidden. Warn once per column and advise supplying the full raw
1581
+ * domain via `ColumnDefinition.distinctValues`.
1582
+ */
1583
+ private warnTruncatedFormattedDomain;
1498
1584
  /**
1499
1585
  * Open filter popup for a column (toggles if already open for same column)
1586
+ *
1587
+ * @param computeDistinctValues Whether the adapter's popup needs a values list.
1500
1588
  */
1501
1589
  openFilterPopup(colIndex: number, anchorRect: {
1502
1590
  top: number;
1503
1591
  left: number;
1504
1592
  width: number;
1505
1593
  height: number;
1506
- }): void;
1594
+ }, computeDistinctValues?: boolean): void;
1507
1595
  /**
1508
1596
  * Close filter popup
1509
1597
  */
@@ -1525,8 +1613,9 @@ interface IndexedDataStoreOptions<TData> {
1525
1613
  /** Custom field accessor for nested properties */
1526
1614
  getFieldValue?: (row: TData, field: string) => CellValue;
1527
1615
  /**
1528
- * Lookup for a field's valueFormatter. Lets text filter conditions compare
1529
- * against the displayed (formatted) value.
1616
+ * Lookup for a field's valueFormatter. Lets free-text filter conditions
1617
+ * compare against the displayed (formatted) value. Values-mode
1618
+ * `selectedValues` compare raw values and never use it.
1530
1619
  */
1531
1620
  getValueFormatter?: (field: string) => ((v: CellValue) => string) | undefined;
1532
1621
  }
@@ -1749,9 +1838,12 @@ declare function computeValueHash(value: CellValue): number;
1749
1838
  declare function isSameDay(date1: Date, date2: Date): boolean;
1750
1839
  /**
1751
1840
  * Evaluate a text filter condition against a cell value.
1752
- * When `formatter` is provided, the cell value is compared via its formatted
1753
- * form so values-mode selections and condition-mode inputs align with what
1754
- * the grid displays.
1841
+ *
1842
+ * Values mode (`selectedValues`) compares RAW values via {@link rawValueKey};
1843
+ * the formatter is never consulted, so the filter model matches what a
1844
+ * server-side data source receives. The `formatter` only applies to free-text
1845
+ * condition operators (contains, equals, ...), where the user types the text
1846
+ * they see on screen.
1755
1847
  */
1756
1848
  declare function evaluateTextCondition(cellValue: CellValue, condition: TextFilterCondition, formatter?: (v: CellValue) => string): boolean;
1757
1849
  /**
@@ -1771,8 +1863,9 @@ declare function evaluateDateCondition(cellValue: CellValue, condition: DateFilt
1771
1863
  declare function evaluateColumnFilter(cellValue: CellValue, filter: ColumnFilterModel, formatter?: (v: CellValue) => string): boolean;
1772
1864
  /**
1773
1865
  * Check if a row passes all filters in a filter model.
1774
- * `getValueFormatter` — when provided — lets text conditions compare the
1775
- * formatted (displayed) cell value instead of the raw string.
1866
+ * `getValueFormatter` — when provided — lets free-text condition operators
1867
+ * compare the formatted (displayed) cell value instead of the raw string.
1868
+ * Values-mode `selectedValues` always compare raw values and ignore it.
1776
1869
  */
1777
1870
  declare function rowPassesFilter<TData>(row: TData, filterModel: FilterModel, getFieldValue: (row: TData, field: string) => CellValue, getValueFormatter?: (field: string) => ((v: CellValue) => string) | undefined): boolean;
1778
1871
  //#endregion
@@ -1872,6 +1965,7 @@ declare class GridCore<TData = unknown> {
1872
1965
  private readonly rowHeight;
1873
1966
  private readonly headerHeight;
1874
1967
  private readonly overscan;
1968
+ private readonly maxFlingVelocity;
1875
1969
  private readonly sortingEnabled;
1876
1970
  private readonly getRowId?;
1877
1971
  private readonly onCellValueChanged?;
@@ -1894,6 +1988,7 @@ declare class GridCore<TData = unknown> {
1894
1988
  private readonly batcher;
1895
1989
  private readonly scrollVirtualization;
1896
1990
  private isDestroyed;
1991
+ private hasWarnedAboutScaledOverscan;
1897
1992
  constructor(options: GridCoreOptions<TData>);
1898
1993
  /**
1899
1994
  * Subscribe to batched instructions for efficient React/Vue state updates.
@@ -1913,12 +2008,17 @@ declare class GridCore<TData = unknown> {
1913
2008
  setFilter(colId: string, filter: ColumnFilterModel | string | null): Promise<void>;
1914
2009
  hasActiveFilter(colId: string): boolean;
1915
2010
  getDistinctValuesForColumn(colId: string, maxValues?: number): CellValue[];
2011
+ /**
2012
+ * Open a column filter popup.
2013
+ * Adapters can skip distinct-value computation when their popup only uses
2014
+ * condition inputs, such as number and date filters.
2015
+ */
1916
2016
  openFilterPopup(colIndex: number, anchorRect: {
1917
2017
  top: number;
1918
2018
  left: number;
1919
2019
  width: number;
1920
2020
  height: number;
1921
- }): void;
2021
+ }, computeDistinctValues?: boolean): void;
1922
2022
  closeFilterPopup(): void;
1923
2023
  getSortModel(): SortModel[];
1924
2024
  getFilterModel(): FilterModel;
@@ -1946,6 +2046,12 @@ declare class GridCore<TData = unknown> {
1946
2046
  private clearSelectionIfInvalid;
1947
2047
  private computeColumnPositions;
1948
2048
  private emitContentSize;
2049
+ /**
2050
+ * One-time advisory when scroll virtualization kicks in with a small
2051
+ * overscan: momentum flings move several rows per frame at that scale,
2052
+ * and a small overscan shows blank rows behind the fling.
2053
+ */
2054
+ private warnIfOverscanTooLowForScaling;
1949
2055
  private emitHeaders;
1950
2056
  private emitVisibleRange;
1951
2057
  /**
@@ -1979,6 +2085,11 @@ declare class GridCore<TData = unknown> {
1979
2085
  getTotalWidth(): number;
1980
2086
  getTotalHeight(): number;
1981
2087
  isScalingActive(): boolean;
2088
+ /**
2089
+ * Maximum accumulated touch-fling velocity (logical px/ms) used by the
2090
+ * synthetic scroller while scroll virtualization is active.
2091
+ */
2092
+ getMaxFlingVelocity(): number;
1982
2093
  getNaturalHeight(): number;
1983
2094
  getScrollRatio(): number;
1984
2095
  getVisibleRowRange(): {
@@ -2652,9 +2763,9 @@ interface ClientDataSourceOptions<TData> {
2652
2763
  /** Custom field accessor for nested properties */
2653
2764
  getFieldValue?: (row: TData, field: string) => CellValue;
2654
2765
  /**
2655
- * Lookup for a field's valueFormatter. Lets text filter conditions compare
2656
- * against the displayed (formatted) value so that what the user sees in the
2657
- * grid matches what the filter popup selects against.
2766
+ * Lookup for a field's valueFormatter. Lets free-text filter conditions
2767
+ * compare against the displayed (formatted) value the user typed against.
2768
+ * Values-mode `selectedValues` compare raw values and never use it.
2658
2769
  */
2659
2770
  getValueFormatter?: (field: string) => ((v: CellValue) => string) | undefined;
2660
2771
  /** Use Web Worker for sorting large datasets (default: true) */
@@ -2725,8 +2836,9 @@ interface MutableClientDataSourceOptions<TData> {
2725
2836
  /** Custom field accessor for nested properties. */
2726
2837
  getFieldValue?: (row: TData, field: string) => CellValue;
2727
2838
  /**
2728
- * Lookup for a field's valueFormatter. Lets text filter conditions compare
2729
- * against the displayed (formatted) value.
2839
+ * Lookup for a field's valueFormatter. Lets free-text filter conditions
2840
+ * compare against the displayed (formatted) value. Values-mode
2841
+ * `selectedValues` compare raw values and never use it.
2730
2842
  */
2731
2843
  getValueFormatter?: (field: string) => ((v: CellValue) => string) | undefined;
2732
2844
  /** Debounce time for transactions in ms. Default 50. Set to 0 for sync. */
@@ -2745,6 +2857,53 @@ interface MutableClientDataSourceOptions<TData> {
2745
2857
  */
2746
2858
  declare function createMutableClientDataSource<TData = unknown>(data: TData[], options: MutableClientDataSourceOptions<TData>): MutableDataSource<TData>;
2747
2859
  //#endregion
2860
+ //#region src/filtering/distinct-entries.d.ts
2861
+ /** One checkbox row in the values-mode filter popup. */
2862
+ interface DistinctValueEntry {
2863
+ /** Formatted display string shown next to the checkbox. */
2864
+ label: string;
2865
+ /** All raw values that format to this label. Ticking the label selects them all. */
2866
+ values: CellValue[];
2867
+ }
2868
+ /**
2869
+ * Canonical identity key for a raw cell value, used to compare values-mode
2870
+ * selections against cell values without ever consulting a formatter.
2871
+ *
2872
+ * Type-prefixed so raw `5` and raw `"5"` never collide. Arrays are sorted by
2873
+ * their elements' own keys first so element order is irrelevant (same rule as
2874
+ * the distinct-value scan). Objects rely on JSON.stringify, so key order matters
2875
+ * for them — a pre-existing limitation of distinct-value identity.
2876
+ */
2877
+ declare const rawValueKey: (value: CellValue) => string;
2878
+ /**
2879
+ * Whether a cell value counts as blank for filtering purposes: null,
2880
+ * undefined, empty string, or empty array (e.g. a tags column with no tags).
2881
+ * Blank cells are matched via `TextFilterCondition.includeBlank` — the
2882
+ * popup's "(Blanks)" checkbox — never via `selectedValues`.
2883
+ */
2884
+ declare const isBlankCellValue: (value: CellValue) => boolean;
2885
+ /**
2886
+ * Group raw distinct values by their display label.
2887
+ *
2888
+ * Multiple raw values can format to the same label; the returned entry keeps
2889
+ * every one of them so that applying the filter selects all rows rendering
2890
+ * that label. Blank values are skipped (the popup exposes them through the
2891
+ * dedicated "include blanks" checkbox), arrays are normalized to sorted
2892
+ * copies, and raws are deduplicated within a group by {@link rawValueKey}.
2893
+ */
2894
+ declare const groupDistinctValues: (values: readonly CellValue[], formatter?: (v: CellValue) => string) => DistinctValueEntry[];
2895
+ /**
2896
+ * Map a filter model's raw `selectedValues` back to the popup labels that
2897
+ * should render as ticked. A label is ticked when at least one of its raw
2898
+ * values is selected (data may have changed since the filter was applied).
2899
+ */
2900
+ declare const labelsForSelectedValues: (entries: readonly DistinctValueEntry[], selectedValues: ReadonlySet<CellValue>) => Set<string>;
2901
+ /**
2902
+ * Collect the raw values behind the ticked labels — the set to store in
2903
+ * `TextFilterCondition.selectedValues` on apply.
2904
+ */
2905
+ declare const rawValuesForLabels: (entries: readonly DistinctValueEntry[], labels: ReadonlySet<string>) => Set<CellValue>;
2906
+ //#endregion
2748
2907
  //#region src/styles/variables.d.ts
2749
2908
  declare const variablesStyles: string;
2750
2909
  //#endregion
@@ -2920,6 +3079,9 @@ declare class TouchScrollController<TData = unknown> {
2920
3079
  private savedOverscrollBehavior;
2921
3080
  private savedTouchAction;
2922
3081
  private overrideActive;
3082
+ /** Core whose batch instructions currently drive eager policy syncs */
3083
+ private subscribedCore;
3084
+ private contentSizeUnsubscribe;
2923
3085
  /** Timestamp of the last slot/render pipeline run (drag or fling) */
2924
3086
  private lastPipelineRunMs;
2925
3087
  /** Smoothed interval between pipeline runs — the device's render pace */
@@ -2931,6 +3093,18 @@ declare class TouchScrollController<TData = unknown> {
2931
3093
  constructor(deps: TouchScrollDeps<TData>);
2932
3094
  attach(): void;
2933
3095
  detach(): void;
3096
+ /** Rebind policy updates after the host replaces its GridCore instance. */
3097
+ syncCore(): void;
3098
+ /**
3099
+ * Keep the eager policy sync subscribed to the current core. Browsers —
3100
+ * iOS Safari especially — sample `touch-action` at gesture start, so a
3101
+ * policy applied inside touchstart only takes effect from the NEXT
3102
+ * gesture. Subscribing to the core's content-size instructions applies
3103
+ * the policy the moment scaling flips, before any finger goes down.
3104
+ * Re-invoked through syncCore when the wrapper rebuilds the core, and from
3105
+ * the permanent listeners as a fallback.
3106
+ */
3107
+ private syncPolicySubscription;
2934
3108
  /**
2935
3109
  * While scroll scaling is active, panning must never be native: declare
2936
3110
  * `touch-action: none` so the browser cannot start a (ratio-amplified)
@@ -2951,10 +3125,11 @@ declare class TouchScrollController<TData = unknown> {
2951
3125
  /**
2952
3126
  * Decide whether a fast fling must fall back to throttled rendering.
2953
3127
  * The default is a full pipeline run every frame — a reduced cadence at
2954
- * medium speed reads as freeze-and-jump stutter. Only when the measured
3128
+ * low speed reads as rows locking and snapping. Only when the measured
2955
3129
  * frame pace shows the device cannot sustain per-frame renders does the
2956
3130
  * fling latch onto the throttled cadence, and it stays latched until the
2957
- * fling slows below the threshold so the cadence never oscillates.
3131
+ * fling slows below the row-flux threshold so the cadence never
3132
+ * oscillates.
2958
3133
  */
2959
3134
  private updateFlingThrottle;
2960
3135
  private isFlingPipelineDue;
@@ -2967,6 +3142,12 @@ declare class TouchScrollController<TData = unknown> {
2967
3142
  private clearGesture;
2968
3143
  private findTrackedTouch;
2969
3144
  private readonly onTouchMove;
3145
+ /**
3146
+ * True when the scroll position no longer matches what this controller
3147
+ * wrote: a native scroller is moving the element between our frames. Our
3148
+ * own writes only diverge by browser rounding, well under the threshold.
3149
+ */
3150
+ private hasNativeScrollTakenOver;
2970
3151
  private scheduleDragApply;
2971
3152
  private flushPendingDrag;
2972
3153
  private readonly onTouchEnd;
@@ -3112,4 +3293,4 @@ declare class InputEventAdapter<TData = unknown> {
3112
3293
  private dispatchCellDragStart;
3113
3294
  }
3114
3295
  //#endregion
3115
- export { type AssignSlotInstruction, AutoScrollDriver, type BatchChangeSetters, type BatchInstructionListener, type CalculateFillHandlePositionParams, type CancelColumnMoveInstruction, type CancelColumnResizeInstruction, type CancelFillInstruction, type CancelRowDragInstruction, type CellDataType, type CellPointerAction, type CellPosition, type CellRange, type CellRendererParams, type CellValue, type CellValueChangedEvent, type CloseFilterPopupInstruction, type ColumnDefinition, type ColumnFilterModel, type ColumnMoveDragState, type ColumnResizeDragState, type ColumnScrollGeometry, type ColumnsChangedInstruction, type CommitColumnMoveInstruction, type CommitColumnResizeInstruction, type CommitEditInstruction, type CommitFillInstruction, type CommitRowDragInstruction, type ContainerBounds, type CreateSlotInstruction, type DataChangeListener, type DataErrorInstruction, type DataLoadedInstruction, type DataLoadingInstruction, type DataSource, type DataSourceLoadMode, DataSourceOwner, type DataSourceRange, type DataSourceRequest, type DataSourceResponse, type DateFilterCondition, type DateFilterOperator, type DestroySlotInstruction, type Direction, type DragEndResult, type DragMoveResult, type DragState, EditManager, type EditManagerOptions, type EditRendererParams, type EditState, type FillHandlePosition, type FillHandleState, FillManager, type FillPointerAction, type FilterCombination, type FilterCondition, type FilterModel, type FilterPopupState, GridCore, type GridCoreOptions, type GridInstruction, type GridState, type HeaderData, type HeaderRendererParams, type HighlightContext, HighlightManager, type HighlightingOptions, IndexedDataStore, type IndexedDataStoreOptions, type InitialStateArgs, InputEventAdapter, type InputEventAdapterDeps, InputHandler, type InputHandlerDeps, type InputResult, type InstructionListener, type KeyEventData, type KeyboardResult, type MoveSlotInstruction, type MultiColumnSortedChunk, type MutableClientDataSourceOptions, type MutableDataSource, type NumberFilterCondition, type NumberFilterOperator, type OpenFilterPopupInstruction, ParallelSortManager, type ParallelSortOptions, PendingCellTapController, type PendingCellTapDeps, PendingRowDragController, type PendingRowDragDeps, type PointerEventData, type PopupPosition, ROW_DRAG_HOLD_MS, type RowCacheEviction, type RowCacheOptions, RowDataManager, type RowDataManagerOptions, type RowDragState, type RowId, type RowLoadingMode, type RowLoadingOptions, RowMutationManager, type RowMutationManagerOptions, type RowSortCache, type RowsAddedInstruction, type RowsRemovedInstruction, type RowsUpdatedInstruction, ScrollVirtualizationManager, type ScrollVirtualizationManagerOptions, SelectionManager, type SelectionState, type ServerDataSourceOptions, type SetActiveCellInstruction, type SetContentSizeInstruction, type SetHoverPositionInstruction, type SetSelectionRangeInstruction, type SlotData, type BatchInstructionListener$1 as SlotPoolBatchListener, SlotPoolManager, type SlotPoolManagerOptions, type SlotState, type SortDirection, SortFilterManager, type SortFilterManagerOptions, type SortModel, type SortedChunk, type StartColumnMoveInstruction, type StartColumnResizeInstruction, type StartEditInstruction, type StartFillInstruction, type StartPeekInstruction, type StartRowDragInstruction, type StopEditInstruction, type StopPeekInstruction, TAP_SLOP_PX, type TextFilterCondition, type TextFilterOperator, TouchScrollController, type TouchScrollDeps, type Transaction, TransactionManager, type TransactionManagerOptions, type TransactionProcessedInstruction, type TransactionResult, type UpdateColumnMoveInstruction, type UpdateColumnResizeInstruction, type UpdateFillInstruction, type UpdateHeaderInstruction, type UpdateRowDragInstruction, type VisibleColumnInfo, WorkerPool, type WorkerPoolOptions, applyBatchInstructions, applyInstruction, bindPeekSelectAll, buildCellClasses, calculateColumnPositions, calculateFillHandlePosition, calculateFilterPopupPosition, calculateScaledColumnPositions, cellStyles, compareValues, computeValueHash, containerStyles, createClientDataSource, createDataSourceFromArray, createInitialState, createMutableClientDataSource, createServerDataSource, detectBoundaryCollisions, evaluateColumnFilter, evaluateDateCondition, evaluateNumberCondition, evaluateTextCondition, filtersStyles, findColumnAtX, findSlotForRow, formatCellValue, getFieldValue, getTotalWidth, gridStyles, headerStyles, isCellActive, isCellEditing, isCellInFillPreview, isCellSelected, isColumnInSelectionRange, isRowInSelectionRange, isRowVisible, isSameDay, kWayMerge, kWayMergeMultiColumn, rowDragStyles, rowPassesFilter, scrollCellIntoView, scrollbarStyles, setFieldValue, statesStyles, stringToSortableNumber, toPointerEventData, variablesStyles };
3296
+ export { type AssignSlotInstruction, AutoScrollDriver, type BatchChangeSetters, type BatchInstructionListener, type CalculateFillHandlePositionParams, type CancelColumnMoveInstruction, type CancelColumnResizeInstruction, type CancelFillInstruction, type CancelRowDragInstruction, type CellDataType, type CellPointerAction, type CellPosition, type CellRange, type CellRendererParams, type CellValue, type CellValueChangedEvent, type CloseFilterPopupInstruction, type ColumnDefinition, type ColumnFilterModel, type ColumnMoveDragState, type ColumnResizeDragState, type ColumnScrollGeometry, type ColumnsChangedInstruction, type CommitColumnMoveInstruction, type CommitColumnResizeInstruction, type CommitEditInstruction, type CommitFillInstruction, type CommitRowDragInstruction, type ContainerBounds, type CreateSlotInstruction, type DataChangeListener, type DataErrorInstruction, type DataLoadedInstruction, type DataLoadingInstruction, type DataSource, type DataSourceLoadMode, DataSourceOwner, type DataSourceRange, type DataSourceRequest, type DataSourceResponse, type DateFilterCondition, type DateFilterOperator, type DestroySlotInstruction, type Direction, type DistinctValueEntry, type DragEndResult, type DragMoveResult, type DragState, EditManager, type EditManagerOptions, type EditRendererParams, type EditState, type FillHandlePosition, type FillHandleState, FillManager, type FillPointerAction, type FilterCombination, type FilterCondition, type FilterModel, type FilterPopupState, GridCore, type GridCoreOptions, type GridInstruction, type GridState, type HeaderData, type HeaderRendererParams, type HighlightContext, HighlightManager, type HighlightingOptions, IndexedDataStore, type IndexedDataStoreOptions, type InitialStateArgs, InputEventAdapter, type InputEventAdapterDeps, InputHandler, type InputHandlerDeps, type InputResult, type InstructionListener, type KeyEventData, type KeyboardResult, type MoveSlotInstruction, type MultiColumnSortedChunk, type MutableClientDataSourceOptions, type MutableDataSource, type NumberFilterCondition, type NumberFilterOperator, type OpenFilterPopupInstruction, ParallelSortManager, type ParallelSortOptions, PendingCellTapController, type PendingCellTapDeps, PendingRowDragController, type PendingRowDragDeps, type PointerEventData, type PopupPosition, ROW_DRAG_HOLD_MS, type RowCacheEviction, type RowCacheOptions, RowDataManager, type RowDataManagerOptions, type RowDragState, type RowId, type RowLoadingMode, type RowLoadingOptions, RowMutationManager, type RowMutationManagerOptions, type RowSortCache, type RowsAddedInstruction, type RowsRemovedInstruction, type RowsUpdatedInstruction, ScrollVirtualizationManager, type ScrollVirtualizationManagerOptions, SelectionManager, type SelectionState, type ServerDataSourceOptions, type SetActiveCellInstruction, type SetContentSizeInstruction, type SetHoverPositionInstruction, type SetSelectionRangeInstruction, type SlotData, type BatchInstructionListener$1 as SlotPoolBatchListener, SlotPoolManager, type SlotPoolManagerOptions, type SlotState, type SortDirection, SortFilterManager, type SortFilterManagerOptions, type SortModel, type SortedChunk, type StartColumnMoveInstruction, type StartColumnResizeInstruction, type StartEditInstruction, type StartFillInstruction, type StartPeekInstruction, type StartRowDragInstruction, type StopEditInstruction, type StopPeekInstruction, TAP_SLOP_PX, type TextFilterCondition, type TextFilterOperator, TouchScrollController, type TouchScrollDeps, type Transaction, TransactionManager, type TransactionManagerOptions, type TransactionProcessedInstruction, type TransactionResult, type UpdateColumnMoveInstruction, type UpdateColumnResizeInstruction, type UpdateFillInstruction, type UpdateHeaderInstruction, type UpdateRowDragInstruction, type VisibleColumnInfo, WorkerPool, type WorkerPoolOptions, applyBatchInstructions, applyInstruction, bindPeekSelectAll, buildCellClasses, calculateColumnPositions, calculateFillHandlePosition, calculateFilterPopupPosition, calculateScaledColumnPositions, cellStyles, compareValues, computeValueHash, containerStyles, createClientDataSource, createDataSourceFromArray, createInitialState, createMutableClientDataSource, createServerDataSource, detectBoundaryCollisions, evaluateColumnFilter, evaluateDateCondition, evaluateNumberCondition, evaluateTextCondition, filtersStyles, findColumnAtX, findSlotForRow, formatCellValue, getFieldValue, getTotalWidth, gridStyles, groupDistinctValues, headerStyles, isBlankCellValue, isCellActive, isCellEditing, isCellInFillPreview, isCellSelected, isColumnInSelectionRange, isRowInSelectionRange, isRowVisible, isSameDay, kWayMerge, kWayMergeMultiColumn, labelsForSelectedValues, rawValueKey, rawValuesForLabels, rowDragStyles, rowPassesFilter, scrollCellIntoView, scrollbarStyles, setFieldValue, statesStyles, stringToSortableNumber, toPointerEventData, variablesStyles };
package/dist/index.js CHANGED
@@ -1,9 +1,9 @@
1
- const e=(e,t,n,r,i)=>{let a=0,o=0;return e<40+i?o=-10:e>n-40&&(o=10),t<40?a=-10:t>r-40&&(a=10),a!==0||o!==0?{dx:a,dy:o}:null};var t=class{active=!1;colIndex=-1;startX=0;initialWidth=0;currentWidth=0;core;constructor(e){this.core=e}get isActive(){return this.active}start(e,t,n){return n.button!==0||this.core.getColumns()[e]?.resizable===!1?{preventDefault:!1,stopPropagation:!1}:(this.active=!0,this.colIndex=e,this.startX=n.clientX,this.initialWidth=t,this.currentWidth=t,{preventDefault:!0,stopPropagation:!0,startDrag:`column-resize`})}move(e,t){let n=this.core.getColumns()[this.colIndex],r=n?.minWidth??50,i=n?.maxWidth,a=this.initialWidth+(e.clientX-this.startX);a=Math.max(r,a),i!==void 0&&(a=Math.min(i,a)),this.currentWidth=a;let o=e.clientX-t.left>t.width-40?10:0,s=o===0?null:{dx:o,dy:0};return{targetRow:0,targetCol:this.colIndex,autoScroll:s}}end(){this.active&&this.core.setColumnWidth(this.colIndex,this.currentWidth),this.active=!1,this.colIndex=-1}getState(){return this.active===!1?null:{colIndex:this.colIndex,initialWidth:this.initialWidth,currentWidth:this.currentWidth}}};const n=e=>{let t=[0],n=0;for(let r of e)n+=r.width,t.push(n);return t},r=e=>e.at(-1)??0,i=(e,t)=>{let i=n(e),a=r(i);if(t<=a||a===0)return{positions:i,widths:e.map(e=>e.width)};let o=t/a,s=e.map(e=>e.width*o),c=[0],l=0;for(let e of s)l+=e,c.push(l);return{positions:c,widths:s}},a=(e,t)=>{for(let n=0;n<t.length-1;n++)if(e>=t[n]&&e<t[n+1])return n;return e>=t.at(-1)?t.length-2:0},o=e=>({minRow:Math.min(e.startRow,e.endRow),maxRow:Math.max(e.startRow,e.endRow),minCol:Math.min(e.startCol,e.endCol),maxCol:Math.max(e.startCol,e.endCol)}),s=(e,t,n)=>e>=n.minRow&&e<=n.maxRow&&t>=n.minCol&&t<=n.maxCol,c=(e,t,n)=>n?s(e,t,o(n)):!1,l=(e,t,n)=>n?.row===e&&n?.col===t,u=(e,t)=>!t||t.end<0||t.start>t.end?!0:e>=t.start&&e<=t.end,d=(e,t,n)=>n?.row===e&&n?.col===t,f=(e,t,n,r,i)=>{if(!n||!r||!i)return!1;let{minRow:a,maxRow:s,minCol:c,maxCol:l}=o(r),u=i.row>s,d=i.row<a;return u?e>s&&e<=i.row&&t>=c&&t<=l:d?e<a&&e>=i.row&&t>=c&&t<=l:!1},p=(e,t,n,r)=>{let i=[`gp-grid-cell`];return e&&i.push(`gp-grid-cell--active`),t&&!e&&i.push(`gp-grid-cell--selected`),n&&i.push(`gp-grid-cell--editing`),r&&i.push(`gp-grid-cell--fill-preview`),i.join(` `)},m=(e,t)=>{if(!t)return!1;let{minRow:n,maxRow:r}=o(t);return e>=n&&e<=r},h=(e,t)=>{if(!t)return!1;let{minCol:n,maxCol:r}=o(t);return e>=n&&e<=r};function g(e,t){let n=t.split(`.`),r=e;for(let e of n){if(typeof r!=`object`||!r)return null;r=r[e]}return r}function _(e,t,n){let r=t.split(`.`),i=e;for(let e=0;e<r.length-1;e++){let t=r[e];if(typeof i!=`object`||!i)return;i=i[t]}typeof i==`object`&&i&&(i[r.at(-1)]=n)}const v=()=>{let e=[];return{onInstruction:t=>(e.push(t),()=>{e=e.filter(e=>e!==t)}),emit:t=>{for(let n of e)n(t)},clearListeners:()=>{e=[]}}},ee=()=>{let e=v(),t=[];return{onInstruction:e.onInstruction,onBatchInstruction:e=>(t.push(e),()=>{t=t.filter(t=>t!==e)}),emit:n=>{e.emit(n);for(let e of t)e([n])},emitBatch:n=>{if(n.length!==0){for(let e of t)e(n);for(let t of n)e.emit(t)}},clearListeners:()=>{e.clearListeners(),t=[]}}},te=(e,t)=>{for(let n of e.values())if(n.rowIndex===t)return n;return null},ne=(e,t,n,r,i,a)=>{let o=te(i,n);if(!o){t.scrollTop=e.getScrollTopForRow(n);return}let s=a+o.translateY-t.scrollTop,c=s+r;if(s<0)t.scrollTop=e.getScrollTopForRow(n);else if(c>t.clientHeight){let i=Math.floor(t.clientHeight/r),a=Math.max(0,n-i+1);t.scrollTop=e.getScrollTopForRow(a)}},re=(e,t)=>{let n=t.visibleColumns.findIndex(e=>e.originalIndex===t.colIndex),r=t.columnPositions[n],i=t.columnWidths[n];if(n<0||r===void 0||i===void 0)return;if(r<e.scrollLeft){e.scrollLeft=r;return}let a=r+i;a>e.scrollLeft+e.clientWidth&&(e.scrollLeft=a-e.clientWidth)},ie=(e,t,n,r,i,a=0,o)=>{ne(e,t,n,r,i,a),o!==void 0&&re(t,o)},y=(e,t)=>e==null?``:t?t(e):Array.isArray(e)?e.join(`, `):typeof e==`object`?e instanceof Date?String(e):JSON.stringify(e):String(e),ae=e=>{let{activeCell:t,selectionRange:n,slots:r,columns:i,visibleColumnsWithIndices:a,columnPositions:o,columnWidths:s,rowHeight:c}=e;if(!t&&!n)return null;let l,u,d,f;if(n)l=Math.max(n.startRow,n.endRow),u=Math.max(n.startCol,n.endCol),d=Math.min(n.startCol,n.endCol),f=Math.max(n.startCol,n.endCol);else if(t)l=t.row,u=t.col,d=u,f=u;else return null;for(let e=d;e<=f;e++){let t=i[e];if(!(!t||t.hidden)&&t.editable!==!0)return null}let p=a.findIndex(e=>e.originalIndex===u);if(p===-1)return null;let m=null;for(let e of r.values())if(e.rowIndex===l){m=e.translateY;break}if(m===null)return null;let h=o[p]??0,g=s[p]??0;return{top:m+c-5,left:h+g-20}},oe=(e,t,n=8)=>{let r=e.getBoundingClientRect(),i=t.getBoundingClientRect(),a=r.bottom+4,o=r.left,s=Math.max(200,r.width);return o+i.width>window.innerWidth-n&&(o=window.innerWidth-i.width-n),o=Math.max(n,o),a+i.height>window.innerHeight-n&&(a=r.top-i.height-4),a=Math.max(n,a),{top:a,left:o,minWidth:s}},se=e=>{if(typeof document>`u`)return()=>{};let t=t=>{if(t.key!==`a`&&t.key!==`A`||!(t.ctrlKey||t.metaKey))return;t.preventDefault();let n=globalThis.getSelection();if(!n)return;n.removeAllRanges();let r=document.createRange();r.selectNodeContents(e),n.addRange(r)};return document.addEventListener(`keydown`,t),()=>document.removeEventListener(`keydown`,t)},ce=e=>{if(!e||e.length===0)return;let t={};for(let n of e)n.valueFormatter&&(t[n.colId??n.field]=n.valueFormatter);return Object.keys(t).length>0?t:void 0},b=e=>({range:e.range,sort:e.sortModel.length>0?e.sortModel:void 0,filter:Object.keys(e.filterModel).length>0?e.filterModel:void 0,valueFormatters:ce(e.columns)}),le=(e,t,n)=>{let r=e.get(t);if(r!==void 0){if(t<n){let i=n-1;for(let n=t;n<i;n++){let t=e.get(n+1);t===void 0?e.delete(n):e.set(n,t)}e.set(i,r);return}for(let r=t;r>n;r--){let t=e.get(r-1);t===void 0?e.delete(r):e.set(r,t)}e.set(n,r)}},ue=e=>{let t=[0],n=0;for(let r of e)r.hidden||(n+=r.width,t.push(n));return t},de=(e,t,n,r)=>{let i=e.get(n);if(!i)return null;let a=t[r];return a?g(i,a.field):null},fe=(e,t,n,r,i,a)=>{let o=e.get(n);if(!o||typeof o!=`object`)return;let s=t[r];if(!s)return;let c=a.onCellValueChanged!==void 0,l=c?g(o,s.field):void 0;_(o,s.field,i),c&&a.onCellValueChanged({rowId:a.getRowId(o),colIndex:r,field:s.field,oldValue:l,newValue:i,rowData:o})};var pe=class{active=!1;sourceColIndex=-1;startX=0;startY=0;thresholdMet=!1;shiftKey=!1;ghostWidth=0;ghostHeight=0;currentX=0;currentY=0;dropTargetIndex=null;core;deps;constructor(e,t){this.core=e,this.deps=t}updateDeps(e){this.deps=e}get isActive(){return this.active}get isDraggingForDisplay(){return this.active&&this.thresholdMet}start(e,t,n,r){return r.button!==0||this.core.getColumns()[e]?.movable===!1?{preventDefault:!1,stopPropagation:!1}:(this.active=!0,this.sourceColIndex=e,this.startX=r.clientX,this.startY=r.clientY,this.thresholdMet=!1,this.shiftKey=r.shiftKey,this.ghostWidth=t,this.ghostHeight=n,this.currentX=r.clientX,this.currentY=r.clientY,this.dropTargetIndex=null,{preventDefault:!0,stopPropagation:!0,startDrag:`column-move`})}move(e,t){let n=e.clientX-this.startX,r=e.clientY-this.startY;if(this.thresholdMet===!1){if(!(Math.abs(n)>5||Math.abs(r)>5))return null;this.thresholdMet=!0}this.currentX=e.clientX,this.currentY=e.clientY;let{left:i,width:o,scrollLeft:s}=t,c=e.clientX-i+s,l=this.deps.getColumnPositions(),u=this.deps.getColumnCount();this.dropTargetIndex=Math.max(0,Math.min(a(c,l),u));let d=e.clientX-i,f=0;d<40?f=-10:d>o-40&&(f=10);let p=f===0?null:{dx:f,dy:0};return{targetRow:0,targetCol:this.dropTargetIndex??0,autoScroll:p}}end(e){this.thresholdMet?this.commitMove():this.treatAsHeaderClick(e),this.reset()}commitMove(){if(this.dropTargetIndex===null)return;let e=this.sourceColIndex,t=this.deps.getOriginalColumnIndex?this.deps.getOriginalColumnIndex(Math.min(this.dropTargetIndex,this.deps.getColumnCount()-1)):this.dropTargetIndex;e!==t&&this.core.moveColumn(e,t)}treatAsHeaderClick(e){let t=this.core.getColumns()[this.sourceColIndex];if(!t)return;let n=t.colId??t.field,r=this.core.getSortModel().find(e=>e.colId===n)?.direction;this.core.setSort(n,e(r),this.shiftKey)}reset(){this.active=!1,this.sourceColIndex=-1,this.thresholdMet=!1,this.shiftKey=!1,this.dropTargetIndex=null}getState(){return this.active===!1?null:{sourceColIndex:this.sourceColIndex,currentX:this.currentX,currentY:this.currentY,dropTargetIndex:this.dropTargetIndex,ghostWidth:this.ghostWidth,ghostHeight:this.ghostHeight}}},me=class{active=!1;sourceRowIndex=-1;startX=0;startY=0;thresholdMet=!1;currentX=0;currentY=0;dropTargetIndex=null;core;deps;constructor(e,t){this.core=e,this.deps=t}updateDeps(e){this.deps=e}get isActive(){return this.active}get isDraggingForDisplay(){return this.active&&this.thresholdMet}start(e,t,n){this.active=!0,this.sourceRowIndex=e,this.startX=t,this.startY=n,this.thresholdMet=!1,this.currentX=t,this.currentY=n,this.dropTargetIndex=null}move(t,n){let r=t.clientX-this.startX,i=t.clientY-this.startY;if(this.thresholdMet===!1){if(!(Math.abs(r)>5||Math.abs(i)>5))return null;this.thresholdMet=!0}this.currentX=t.clientX,this.currentY=t.clientY;let{top:a,left:o,height:s,width:c,scrollTop:l}=n,u=this.deps.getHeaderHeight(),d=t.clientY-a,f=this.core.getRowCount(),p=Math.max(0,Math.min(this.core.getRowIndexAtDisplayY(d,l),f));return this.dropTargetIndex=p,{targetRow:p,targetCol:0,autoScroll:e(t.clientY-a,t.clientX-o,s,c,u)}}end(){this.thresholdMet&&this.dropTargetIndex!==null&&this.dropTargetIndex!==this.sourceRowIndex&&this.core.commitRowDrag(this.sourceRowIndex,this.dropTargetIndex),this.active=!1,this.sourceRowIndex=-1,this.thresholdMet=!1,this.dropTargetIndex=null}getState(){return this.active===!1?null:{sourceRowIndex:this.sourceRowIndex,currentX:this.currentX,currentY:this.currentY,dropTargetIndex:this.dropTargetIndex,dropIndicatorY:this.dropTargetIndex===null?0:this.core.getRowTranslateY(this.dropTargetIndex)}}},he=class{active=!1;core;constructor(e){this.core=e}get isActive(){return this.active}start(){this.active=!0}moveToTarget(e,t){this.active!==!1&&this.core.selection.startSelection({row:e,col:t},{shift:!0})}end(){this.active=!1}},ge=class{active=!1;sourceRange=null;target=null;core;constructor(e){this.core=e}get isActive(){return this.active}get stateSnapshot(){return{sourceRange:this.sourceRange,target:this.target}}start(e,t){if(!e&&!t)return{preventDefault:!1,stopPropagation:!1};let n=t??{startRow:e.row,startCol:e.col,endRow:e.row,endCol:e.col};return this.core.fill.startFillDrag(n),this.sourceRange=n,this.target={row:Math.max(n.startRow,n.endRow),col:Math.max(n.startCol,n.endCol)},this.active=!0,{preventDefault:!0,stopPropagation:!0,startDrag:`fill`}}moveToTarget(e,t){this.active!==!1&&(this.core.fill.updateFillDrag(e,t),this.target={row:e,col:t})}end(){this.active&&(this.core.fill.commitFillDrag(),this.core.refreshSlotData()),this.active=!1,this.sourceRange=null,this.target=null}},_e=class{record=null;set(e){this.record=e}clear(){this.record=null}consume(){let e=this.record;return this.record=null,e}},ve=class{record=null;set(e){this.record=e}clear(){this.record=null}consume(){let e=this.record;return this.record=null,e}};const ye=10,be=300,xe=e=>{switch(e){case`ArrowUp`:return`up`;case`ArrowDown`:return`down`;case`ArrowLeft`:return`left`;case`ArrowRight`:return`right`;default:return null}};var Se=class{core;constructor(e){this.core=e}handle(e,t,n,r){if(r)return{preventDefault:!1};if(this.core.getPeekState()!==null)return e.key===`Escape`?(this.core.stopPeek(),{preventDefault:!0}):{preventDefault:!1};if(n!==null&&e.key!==`Enter`&&e.key!==`Escape`&&e.key!==`Tab`)return{preventDefault:!1};let i=xe(e.key);if(i!==null)return this.moveFocus(i,e.shiftKey);let a=e.ctrlKey||e.metaKey;return this.handleAction(e.key,t,n,e.shiftKey,a)}moveFocus(e,t){this.core.stopPeek();let{selection:n}=this.core;return n.moveFocus(e,t),{preventDefault:!0,scrollToCell:n.getActiveCell()??void 0}}handleAction(e,t,n,r,i){switch(e){case`Enter`:return this.handleEnter(t,n);case`Escape`:return this.handleEscape(n);case`Tab`:return this.handleTab(n,r);default:return this.handleNonSpecialKey(e,t,n,i)}}handleEnter(e,t){return t?this.core.commitEdit():e&&this.core.startEdit(e.row,e.col),{preventDefault:!0}}handleEscape(e){return e?this.core.cancelEdit():this.core.getPeekState()?this.core.stopPeek():this.core.selection.clearSelection(),{preventDefault:!0}}handleTab(e,t){return e&&this.core.commitEdit(),this.core.selection.moveFocus(t?`left`:`right`,!1),{preventDefault:!0}}handleNonSpecialKey(e,t,n,r){let{selection:i}=this.core;return e===`a`&&r?(i.selectAll(),{preventDefault:!0}):e===`c`&&r?(i.copySelectionToClipboard(),{preventDefault:!0}):e===`F2`?(t&&!n&&this.core.startEdit(t.row,t.col),{preventDefault:!0}):e===`Delete`||e===`Backspace`?t&&!n?(this.core.startEdit(t.row,t.col),{preventDefault:!0}):{preventDefault:!1}:(t&&!n&&!r&&e.length===1&&this.core.startEdit(t.row,t.col),{preventDefault:!1})}};const Ce=(t,n,r,i)=>{let{top:o,left:s,width:c,height:l,scrollTop:u,scrollLeft:d}=i,f=n.getColumnPositions(),p=n.getColumnCount(),m=r.clientY-o,h=r.clientX-s+d,g=Math.max(0,Math.min(t.getRowIndexAtDisplayY(m,u),t.getRowCount()-1)),_=Math.max(0,Math.min(a(h,f),p-1));return{row:g,col:n.getOriginalColumnIndex?n.getOriginalColumnIndex(_):_,autoScroll:e(r.clientY-o,r.clientX-s,l,c,n.getHeaderHeight())}},x=e=>e==null?`asc`:e===`asc`?`desc`:null;var S=class{core;deps;columnResize;columnMove;rowDrag;selectionDrag;fillDrag;pendingRowDrag=new _e;pendingCellTap=new ve;keyboard;constructor(e,n){this.core=e,this.deps=n,this.columnResize=new t(e),this.columnMove=new pe(e,n),this.rowDrag=new me(e,n),this.selectionDrag=new he(e),this.fillDrag=new ge(e),this.keyboard=new Se(e)}updateDeps(e){this.deps={...this.deps,...e},this.columnMove.updateDeps(this.deps),this.rowDrag.updateDeps(this.deps)}getDragState(){let e=this.getDragType(),t=this.fillDrag.stateSnapshot;return{isDragging:e!==null,dragType:e,fillSourceRange:t.sourceRange,fillTarget:t.target,columnResize:this.columnResize.getState(),columnMove:this.columnMove.getState(),rowDrag:this.rowDrag.getState()}}getDragType(){return this.fillDrag.isActive?`fill`:this.columnResize.isActive?`column-resize`:this.columnMove.isDraggingForDisplay?`column-move`:this.rowDrag.isDraggingForDisplay?`row-drag`:this.selectionDrag.isActive?`selection`:null}handleHeaderMouseDown(e,t,n,r){return this.columnMove.start(e,t,n,r)}handleHeaderResizeMouseDown(e,t,n){return this.columnResize.start(e,t,n)}handleCellMouseDown(e,t,n){if(n.button!==0||this.core.getEditState()!==null)return we;this.core.stopPeek();let r=(this.core.getColumns()[t]?.rowDrag===!0||this.core.isRowDragEntireRow())&&!n.shiftKey;return r&&n.pointerType===`touch`?this.startPendingRowDrag(e,t,n):r?this.startRowDrag(e,t,n):this.startSelectionClick(e,t,n)}startPendingRowDrag(e,t,n){return this.pendingRowDrag.set({rowIndex:e,colIndex:t,clientX:n.clientX,clientY:n.clientY}),this.pendingCellTap.set({rowIndex:e,colIndex:t}),{preventDefault:!1,stopPropagation:!1,focusContainer:!1,startDrag:`row-drag-pending`,startTap:!0}}startRowDrag(e,t,n){return this.rowDrag.start(e,n.clientX,n.clientY),this.core.selection.startSelection({row:e,col:t},{shift:!1,ctrl:!1}),{preventDefault:!0,stopPropagation:!0,focusContainer:!0,startDrag:`row-drag`}}startSelectionClick(e,t,n){return n.pointerType===`touch`?(this.pendingCellTap.set({rowIndex:e,colIndex:t}),{preventDefault:!1,stopPropagation:!1,focusContainer:!1,startTap:!0}):(this.core.selection.startSelection({row:e,col:t},{shift:n.shiftKey,ctrl:n.ctrlKey||n.metaKey}),{preventDefault:!1,stopPropagation:!1,focusContainer:!0,startDrag:n.shiftKey?void 0:`selection`})}handleCellDoubleClick(e,t){if(this.core.getColumns()[t]?.editable){this.core.startEdit(e,t);return}this.core.startPeek(e,t)}handleCellMouseEnter(e,t){this.core.highlight?.setHoverPosition({row:e,col:t})}handleCellMouseLeave(){this.core.highlight?.setHoverPosition(null)}handleFillHandleMouseDown(e,t,n){return this.fillDrag.start(e,t)}handleHeaderClick(e,t){let n=this.core.getSortModel().find(t=>t.colId===e)?.direction;this.core.setSort(e,x(n),t)}startSelectionDrag(){this.selectionDrag.start()}confirmPendingRowDrag(){let e=this.pendingRowDrag.consume();return e===null?!1:(this.pendingCellTap.clear(),this.rowDrag.start(e.rowIndex,e.clientX,e.clientY),this.core.selection.startSelection({row:e.rowIndex,col:e.colIndex},{shift:!1,ctrl:!1}),!0)}cancelPendingRowDrag(){this.pendingRowDrag.clear()}confirmPendingCellTap(){let e=this.pendingCellTap.consume();return e===null?!1:(this.core.selection.startSelection({row:e.rowIndex,col:e.colIndex},{shift:!1,ctrl:!1}),!0)}cancelPendingCellTap(){this.pendingCellTap.clear()}handleDragMove(e,t){return this.columnResize.isActive?this.columnResize.move(e,t):this.columnMove.isActive?this.columnMove.move(e,t):this.rowDrag.isActive?this.rowDrag.move(e,t):this.selectionFillMove(e,t)}selectionFillMove(e,t){if((this.selectionDrag.isActive||this.fillDrag.isActive)===!1)return null;let n=Ce(this.core,this.deps,e,t);return this.selectionDrag.moveToTarget(n.row,n.col),this.fillDrag.moveToTarget(n.row,n.col),{targetRow:n.row,targetCol:n.col,autoScroll:n.autoScroll}}handleDragEnd(){if(this.columnResize.isActive)return this.columnResize.end();if(this.columnMove.isActive)return this.columnMove.end(x);if(this.rowDrag.isActive)return this.rowDrag.end();this.selectionDrag.end(),this.fillDrag.end()}handleWheel(e,t,n){return this.core.isScalingActive()?{dy:e*n,dx:t*n}:null}handleKeyDown(e,t,n,r){return this.keyboard.handle(e,t,n,r)}};const we={preventDefault:!1,stopPropagation:!1};var C=class{options;highlightingOptions;hoverPosition=null;emitter=v();onInstruction=this.emitter.onInstruction;emit=this.emitter.emit;rowClassCache=new Map;columnClassCache=new Map;cellClassCache=new Map;constructor(e,t={}){this.options=e,this.highlightingOptions=t}isEnabled(){return!!(this.highlightingOptions.computeRowClasses||this.highlightingOptions.computeColumnClasses||this.highlightingOptions.computeCellClasses)}updateOptions(e){this.highlightingOptions=e,this.clearAllCaches()}setHoverPosition(e){this.isEnabled()&&(this.hoverPosition?.row===e?.row&&this.hoverPosition?.col===e?.col||(this.rowClassCache.clear(),this.columnClassCache.clear(),this.cellClassCache.clear(),this.hoverPosition=e,this.emit({type:`SET_HOVER_POSITION`,position:e})))}getHoverPosition(){return this.hoverPosition}onSelectionChange(){this.clearAllCaches()}buildRowContext(e,t){let n=this.options.getActiveCell(),r=this.options.getSelectionRange();return{rowIndex:e,colIndex:null,column:void 0,rowData:t,hoverPosition:this.hoverPosition,activeCell:n,selectionRange:r,isHovered:this.hoverPosition?.row===e,isActive:n?.row===e,isSelected:m(e,r)}}buildColumnContext(e,t){let n=this.options.getActiveCell(),r=this.options.getSelectionRange();return{rowIndex:null,colIndex:e,column:t,rowData:void 0,hoverPosition:this.hoverPosition,activeCell:n,selectionRange:r,isHovered:this.hoverPosition?.col===e,isActive:n?.col===e,isSelected:h(e,r)}}buildCellContext(e,t,n,r){let i=this.options.getActiveCell(),a=this.options.getSelectionRange(),s=this.hoverPosition?.row===e&&this.hoverPosition?.col===t,c=!1;if(a){let{minRow:n,maxRow:r,minCol:i,maxCol:s}=o(a);c=e>=n&&e<=r&&t>=i&&t<=s}return{rowIndex:e,colIndex:t,column:n,rowData:r,hoverPosition:this.hoverPosition,activeCell:i,selectionRange:a,isHovered:s,isActive:i?.row===e&&i?.col===t,isSelected:c}}computeRowClasses(e,t){let n=this.highlightingOptions.computeRowClasses;if(!n)return[];let r=this.rowClassCache.get(e);if(r!==void 0)return r;let i=n(this.buildRowContext(e,t));return this.rowClassCache.set(e,i),i}computeColumnClasses(e,t){let n=this.columnClassCache.get(e);if(n!==void 0)return n;let r=this.buildColumnContext(e,t),i;if(t.computeColumnClasses)i=t.computeColumnClasses(r);else if(this.highlightingOptions.computeColumnClasses)i=this.highlightingOptions.computeColumnClasses(r);else return[];return this.columnClassCache.set(e,i),i}computeCellClasses(e,t,n,r){let i=`${e},${t}`,a=this.cellClassCache.get(i);if(a!==void 0)return a;let o=this.buildCellContext(e,t,n,r),s;if(n.computeCellClasses)s=n.computeCellClasses(o);else if(this.highlightingOptions.computeCellClasses)s=this.highlightingOptions.computeCellClasses(o);else return[];return this.cellClassCache.set(i,s),s}computeCombinedCellClasses(e,t,n,r){let i=this.computeColumnClasses(t,n),a=this.computeCellClasses(e,t,n,r);return[...i,...a]}clearAllCaches(){this.rowClassCache.clear(),this.columnClassCache.clear(),this.cellClassCache.clear()}destroy(){this.emitter.clearListeners(),this.clearAllCaches(),this.hoverPosition=null}},w=class{options;emitter=v();onInstruction=this.emitter.onInstruction;emit=this.emitter.emit;constructor(e){this.options=e}getRow(e){return this.options.getCachedRows().get(e)}addRows(e,t){if(e.length===0)return;let n=this.options.getCachedRows(),r=this.options.getTotalRows(),i=t??r,a=r+e.length;if(i<r){let t=new Map;for(let[r,a]of n)r>=i?t.set(r+e.length,a):t.set(r,a);this.options.setCachedRows(t)}let o=this.options.getCachedRows();e.forEach((e,t)=>{o.set(i+t,e)}),this.options.setTotalRows(a);let s=e.map((e,t)=>i+t);this.emit({type:`ROWS_ADDED`,indices:s,count:s.length,totalRows:a}),this.options.emitContentSize(),this.options.refreshAllSlots()}updateRows(e){if(e.length===0)return;let t=this.options.getCachedRows(),n=[];for(let r of e){let e=t.get(r.index);e&&(t.set(r.index,{...e,...r.data}),n.push(r.index))}if(n.length!==0){this.emit({type:`ROWS_UPDATED`,indices:n});for(let e of n)this.options.updateSlot(e)}}deleteRows(e){if(e.length===0)return;let t=this.options.getCachedRows(),n=this.options.getTotalRows(),r=[...e].sort((e,t)=>t-e);for(let e of r){if(e<0||e>=n)continue;t.delete(e);let r=new Map;for(let[n,i]of t)n>e?r.set(n-1,i):r.set(n,i);this.options.setCachedRows(r),n--}this.options.setTotalRows(n),this.options.clearSelectionIfInvalid(n),this.emit({type:`ROWS_REMOVED`,indices:r,totalRows:n}),this.options.emitContentSize(),this.options.refreshAllSlots()}setRow(e,t){let n=this.options.getTotalRows();e<0||e>=n||(this.options.getCachedRows().set(e,t),this.emit({type:`ROWS_UPDATED`,indices:[e]}),this.options.updateSlot(e))}destroy(){this.emitter.clearListeners()}};const Te={aggressive:{prefetchPages:0,maxPages:1},balanced:{prefetchPages:1,maxPages:5},conservative:{prefetchPages:2,maxPages:10}},T=(e,t)=>e===void 0?t:Number.isFinite(e)&&e>0?Math.floor(e):t,Ee=(e,t)=>e===void 0?t:Number.isFinite(e)&&e>=0?Math.floor(e):t,E=e=>{let t=Te[e?.eviction??`balanced`];return{pageSize:T(e?.pageSize,100),prefetchPages:Ee(e?.prefetchPages,t.prefetchPages),maxPages:T(e?.maxPages,t.maxPages)}};var De=class{options;cacheOptions;generation=0;hasKnownTotal=!1;loadedBlocks=new Set;pendingBlocks=new Map;constructor(e,t){this.options=e,this.cacheOptions=E(t)}configure(e){this.cacheOptions=E(e)}getPageSize(){return this.cacheOptions.pageSize}reset(){this.generation+=1,this.hasKnownTotal=!1,this.loadedBlocks.clear(),this.pendingBlocks.clear(),this.options.getCachedRows().clear()}hasMissingRows(e){if(e.endRow<=e.startRow)return!1;let t=this.options.getTotalRows();if(this.hasKnownTotal&&t===0||this.hasKnownTotal&&e.startRow>=t)return!1;let n=this.hasKnownTotal?Math.min(e.endRow,t):e.endRow,r=this.options.getCachedRows();for(let t=e.startRow;t<n;t+=1)if(!r.has(t))return!0;return!1}async loadRange(e,t=!1){t&&this.reset();let n=this.generation,r=this.options.getTotalRows(),i=this.getBlocksForRange(e).map(e=>this.getOrCreateBlockRequest(e,n)).filter(e=>e!==null);return i.length>0&&await Promise.all(i),n===this.generation?(this.evictAround(e),{applied:!0,loadedBlockCount:i.length,totalRowsChanged:r!==this.options.getTotalRows()}):{applied:!1,loadedBlockCount:0,totalRowsChanged:!1}}getOrCreateBlockRequest(e,t){if(this.loadedBlocks.has(e))return null;let n=this.pendingBlocks.get(e);if(n)return n;let r=this.fetchBlock(e,t);return this.pendingBlocks.set(e,r),r.then(()=>this.deletePendingBlock(e,r),()=>this.deletePendingBlock(e,r)),r}deletePendingBlock(e,t){this.pendingBlocks.get(e)===t&&this.pendingBlocks.delete(e)}async fetchBlock(e,t){let n=e*this.cacheOptions.pageSize,r=this.getBlockEndRow(e),i;try{i=await this.options.getDataSource().query(b({range:{startRow:n,endRow:r},sortModel:this.options.getSortModel(),filterModel:this.options.getFilterModel(),columns:this.options.getColumns()}))}catch(e){if(t===this.generation)throw e;return}t===this.generation&&this.applyBlockResponse(e,i.rows,i.totalRows)}applyBlockResponse(e,t,n){let r=this.options.getCachedRows(),i=this.options.getTotalRows();this.deleteRowsForBlock(e);let a=e*this.cacheOptions.pageSize;t.forEach((e,t)=>{e!==void 0&&r.set(a+t,e)}),this.options.setTotalRows(n),this.hasKnownTotal=!0,this.loadedBlocks.add(e),n<i&&this.deleteRowsAfterTotal(n)}getBlocksForRange(e){if(e.endRow<=e.startRow)return[];let t=this.options.getTotalRows();if(this.hasKnownTotal&&t===0||this.hasKnownTotal&&e.startRow>=t)return[];let n=this.hasKnownTotal?Math.min(e.endRow,t):e.endRow,r=this.cacheOptions.pageSize,i=Math.floor(e.startRow/r),a=Math.floor((n-1)/r),o=Math.max(0,i-this.cacheOptions.prefetchPages),s=this.getLastPrefetchBlock(a),c=[];for(let e=o;e<=s;e+=1)c.push(e);return c}getLastPrefetchBlock(e){let t=this.options.getTotalRows(),n=e+this.cacheOptions.prefetchPages;if(this.hasKnownTotal&&t>0){let e=Math.floor((t-1)/this.cacheOptions.pageSize);return Math.min(n,e)}return n}getBlockEndRow(e){let t=e*this.cacheOptions.pageSize+this.cacheOptions.pageSize,n=this.options.getTotalRows();return this.hasKnownTotal&&n>0?Math.min(t,n):t}evictAround(e){if(this.loadedBlocks.size<=this.cacheOptions.maxPages)return;let t=new Set(this.getBlocksForRange(e)),n=Math.floor(e.startRow/this.cacheOptions.pageSize),r=[...this.loadedBlocks].filter(e=>t.has(e)===!1).sort((e,t)=>Math.abs(t-n)-Math.abs(e-n));for(let e of r){if(this.loadedBlocks.size<=this.cacheOptions.maxPages)return;this.loadedBlocks.delete(e),this.deleteRowsForBlock(e)}}deleteRowsForBlock(e){let t=this.options.getCachedRows(),n=e*this.cacheOptions.pageSize,r=n+this.cacheOptions.pageSize;for(let e=n;e<r;e+=1)t.delete(e)}deleteRowsAfterTotal(e){let t=this.options.getCachedRows();for(let n of t.keys())n>=e&&t.delete(n)}};const D=e=>{e.computeColumnPositions(),e.batcher.start();try{e.emitContentSize(),e.emitHeaders(),e.batcher.emit({type:`COLUMNS_CHANGED`,columns:[...e.columns]}),e.refreshSlots===`sync`?e.slotPool.syncSlots():e.slotPool.refreshAllSlots()}finally{e.batcher.flush()}e.onComplete()},Oe=(e,t,n,r)=>{if(n<=0)return t;let i=0;for(let t=0;t<r.length;t++){if(t===e)continue;let n=r[t];!n||n.hidden||(i+=n.width)}return i<=0||t+i>=n?t:t*i/(n-t)},ke=(e,t,n,r)=>{let i=r.columns[e];i&&(i.width=i.hidden?t:Oe(e,t,n,r.columns),D({...r,refreshSlots:`sync`}))},Ae=(e,t,n)=>{if(e===t||e<0||e>=n.columns.length)return null;let r=t>e?t-1:t;if(r<0||r>=n.columns.length||e===r)return null;let[i]=n.columns.splice(e,1);return n.columns.splice(r,0,i),D({...n,refreshSlots:`all`}),r},je=(e,t,n)=>{let r=n.dataSource;if(!r.moveRow)return;r.moveRow(e,t),le(n.cachedRows,e,t),n.highlight?.clearAllCaches();let i=Math.min(e,t),a=Math.max(e,t);for(let e=i;e<=a;e++)n.slotPool.updateSlot(e)},Me=async e=>{let t=await e.dataSource.query(b({range:{startRow:0,endRow:2**53-1},sortModel:e.sortModel,filterModel:e.filterModel,columns:e.getColumns()}));e.cachedRows.clear();for(let n=0;n<t.rows.length;n++){let r=t.rows[n];r!==void 0&&e.cachedRows.set(n,r)}return e.setTotalRows(t.totalRows),{totalRows:t.totalRows}};var O=class{dataSource;options;rowLoading;rowWindowLoader;cachedRows=new Map;totalRows=0;isDataLoading=!1;constructor(e){this.options=e,this.dataSource=e.dataSource,this.rowLoading=e.rowLoading??{},this.rowWindowLoader=new De({getDataSource:()=>this.dataSource,getCachedRows:()=>this.cachedRows,getTotalRows:()=>this.totalRows,setTotalRows:e=>{this.totalRows=e},getSortModel:e.getSortModel,getFilterModel:e.getFilterModel,getColumns:e.getColumns},this.rowLoading.cache)}getCachedRows(){return this.cachedRows}setCachedRows(e){this.cachedRows=e}getTotalRows(){return this.totalRows}setTotalRows(e){this.totalRows=e}getDataSource(){return this.dataSource}getRowData(e){return this.cachedRows.get(e)}isLoading(){return this.isDataLoading}getCellValue(e,t){return de(this.cachedRows,this.options.getColumns(),e,t)}setCellValue(e,t,n){fe(this.cachedRows,this.options.getColumns(),e,t,n,{onCellValueChanged:this.options.onCellValueChanged,getRowId:this.options.getRowId})}async loadInitial(){if(this.isPaginatedLoading()){await this.fetchPaginatedData({range:this.getInitialPaginatedRange(),resetCache:!0,showLoading:!0,refreshSlots:!1});return}await this.fetchAllData()}requestVisibleRows(){if(this.isPaginatedLoading()===!1)return;let e=this.getPaginatedLoadRange(!0);if(e.endRow<=e.startRow)return;let t=this.getPaginatedLoadRange(!1),n=this.rowWindowLoader.hasMissingRows(t);this.fetchPaginatedData({range:e,resetCache:!1,showLoading:n,refreshSlots:!0})}async refreshFromTransaction(){if(this.isPaginatedLoading()){await this.fetchPaginatedData({range:this.getPaginatedLoadRange(!0),resetCache:!0,showLoading:!1,refreshSlots:!1});return}await Me({dataSource:this.dataSource,sortModel:this.options.getSortModel(),filterModel:this.options.getFilterModel(),cachedRows:this.cachedRows,setTotalRows:e=>{this.totalRows=e},getColumns:this.options.getColumns})}setDataSource(e){this.dataSource=e,this.rowWindowLoader.reset(),this.totalRows=0}destroy(){this.rowWindowLoader.reset(),this.cachedRows.clear(),this.totalRows=0,this.isDataLoading=!1}async fetchAllData(){this.isDataLoading=!0,this.options.batcher.emit({type:`DATA_LOADING`});try{let e=b({range:{startRow:0,endRow:2**53-1},sortModel:this.options.getSortModel(),filterModel:this.options.getFilterModel(),columns:this.options.getColumns()}),t=await this.dataSource.query(e);this.cachedRows.clear(),t.rows.forEach((e,t)=>{this.cachedRows.set(t,e)}),this.totalRows=t.totalRows,this.options.batcher.emit({type:`DATA_LOADED`,totalRows:this.totalRows})}catch(e){this.emitDataError(e)}finally{this.isDataLoading=!1}}async fetchPaginatedData(e){e.showLoading&&(this.isDataLoading=!0,this.options.batcher.emit({type:`DATA_LOADING`}));try{let t=await this.rowWindowLoader.loadRange(e.range,e.resetCache);if(t.applied===!1)return;(e.showLoading||t.totalRowsChanged)&&this.options.batcher.emit({type:`DATA_LOADED`,totalRows:this.totalRows}),e.refreshSlots&&(this.options.syncSlots(),this.options.emitVisibleRange(),t.totalRowsChanged&&this.options.emitContentSize())}catch(e){this.emitDataError(e)}finally{e.showLoading&&(this.isDataLoading=!1)}}emitDataError(e){this.options.batcher.emit({type:`DATA_ERROR`,error:e instanceof Error?e.message:String(e)})}isPaginatedLoading(){let e=this.rowLoading.mode??`auto`;return e===`paginated`?!0:e===`all`?!1:this.dataSource.loadMode===`paginated`}getInitialPaginatedRange(){let e=this.getPaginatedLoadRange(!0);return{startRow:0,endRow:Math.max(this.rowWindowLoader.getPageSize(),e.endRow)}}getPaginatedLoadRange(e){let t=this.options.getRowHeight(),n=this.options.getViewportHeight(),r=this.options.getScrollTop(),i=e?this.options.getOverscan():0,a=Math.max(0,Math.floor(r/t)-i),o=Math.ceil((r+n)/t)+i+1,s=this.totalRows>0?Math.min(this.totalRows,o):o;return{startRow:a,endRow:Math.max(a,s)}}};const k=1e7;var A=class{naturalContentHeight=0;virtualContentHeight=0;scrollRatio=1;options;constructor(e){this.options=e}updateContentSize(){let e=this.options.getTotalRows(),t=this.options.getRowHeight(),n=this.options.getHeaderHeight(),r=this.options.getViewportHeight(),i=e*t;if(this.naturalContentHeight=i+n,this.naturalContentHeight>k){this.virtualContentHeight=k;let e=this.virtualContentHeight-n-r,a=Math.ceil((i-r)/t)*t;this.scrollRatio=a>0?e/a:1}else this.virtualContentHeight=this.naturalContentHeight,this.scrollRatio=1;return{naturalHeight:this.naturalContentHeight,virtualHeight:this.virtualContentHeight,scrollRatio:this.scrollRatio}}isScalingActive(){return this.scrollRatio<1}getNaturalHeight(){let e=this.options.getTotalRows(),t=this.options.getRowHeight(),n=this.options.getHeaderHeight();return this.naturalContentHeight||e*t+n}getVirtualHeight(){let e=this.options.getTotalRows(),t=this.options.getRowHeight(),n=this.options.getHeaderHeight();return this.virtualContentHeight||e*t+n}getScrollRatio(){return this.scrollRatio}getVisibleRowRange(){let e=this.options.getViewportHeight(),t=this.options.getScrollTop(),n=this.options.getRowHeight(),r=this.options.getTotalRows(),i=e,a=Math.max(0,Math.floor(t/n)),o=Math.min(r-1,Math.ceil((t+i)/n)-1);return{start:a,end:Math.max(a,o)}}getScrollTopForRow(e){return e*this.options.getRowHeight()*this.scrollRatio}getRowIndexAtDisplayY(e,t){let n=this.options.getRowHeight(),r=e+(this.scrollRatio<1?t/this.scrollRatio:t);return Math.floor(r/n)}getVirtualContentHeight(){return this.virtualContentHeight}},j=class{options;emitter=v();sortModel=[];filterModel={};openFilterColIndex=null;scanWarnedCols=new Set;onInstruction=this.emitter.onInstruction;emit=this.emitter.emit;constructor(e){this.options=e}async setSort(e,t,n=!1){if(!this.options.isSortingEnabled()||this.options.getColumns().find(t=>(t.colId??t.field)===e)?.sortable===!1)return;let r=this.sortModel.findIndex(t=>t.colId===e);n?t===null&&r>=0?this.sortModel.splice(r,1):r>=0?this.sortModel[r].direction=t:this.sortModel.push({colId:e,direction:t}):this.sortModel=t===null?[]:[{colId:e,direction:t}],await this.options.onSortFilterChange(),this.options.onDataRefreshed()}getSortModel(){return[...this.sortModel]}async setFilter(e,t){this.options.getColumns().find(t=>(t.colId??t.field)===e)?.filterable!==!1&&(t===null||typeof t==`string`&&t.trim()===``||typeof t==`object`&&t.conditions?.length===0?delete this.filterModel[e]:typeof t==`string`?this.filterModel[e]={conditions:[{type:`text`,operator:`contains`,value:t}],combination:`and`}:this.filterModel[e]=t,await this.options.onSortFilterChange(),this.options.onDataRefreshed())}getFilterModel(){return{...this.filterModel}}hasActiveFilter(e){let t=this.filterModel[e];return t?t.conditions.length>0:!1}isColumnSortable(e){return this.options.isSortingEnabled()?this.options.getColumns()[e]?.sortable!==!1:!1}isColumnFilterable(e){return this.options.getColumns()[e]?.filterable!==!1}getDistinctValuesForColumn(e,t=500){let n=this.options.getColumns().find(t=>(t.colId??t.field)===e);if(!n)return[];let r=n.valueFormatter,i=n.distinctValues??this.scanDistinctValues(n,t),a=new Map;for(let e of i){let[n,i]=this.normalizeDistinctValue(e,r);if(!a.has(n)&&(a.set(n,i),a.size>=t))break}let o=Array.from(a.values());return o.sort((e,t)=>{let n=y(e,r),i=y(t,r);return n.localeCompare(i,void 0,{numeric:!0,sensitivity:`base`})}),o}scanDistinctValues(e,t){let n=this.options.getCachedRows(),r=n.size,i=e.colId??e.field;r>1e4&&!this.scanWarnedCols.has(i)&&(this.scanWarnedCols.add(i),console.warn(`[gp-grid] Scanning ${r} rows to compute distinct values for column "${i}". Pre-supply ColumnDefinition.distinctValues to skip this scan.`));let a=e.valueFormatter,o=new Map;for(let i=0;i<r;i++){let r=n.get(i);if(r===void 0)continue;let s=g(r,e.field),[c,l]=this.normalizeDistinctValue(s,a);if(!o.has(c)&&(o.set(c,l),o.size>=t))break}return Array.from(o.values())}normalizeDistinctValue(e,t){if(Array.isArray(e)){let n=[...e].sort((e,t)=>{let n=String(e),r=String(t);return n===r?0:n<r?-1:1});return[t?t(n):JSON.stringify(n),n]}return[t?t(e):JSON.stringify(e),e]}openFilterPopup(e,t){if(this.openFilterColIndex===e){this.closeFilterPopup();return}let n=this.options.getColumns()[e];if(!n||!this.isColumnFilterable(e))return;let r=n.colId??n.field,i=this.getDistinctValuesForColumn(r);this.openFilterColIndex=e,this.emit({type:`OPEN_FILTER_POPUP`,colIndex:e,column:n,anchorRect:t,distinctValues:i,currentFilter:this.filterModel[r]})}closeFilterPopup(){this.openFilterColIndex=null,this.emit({type:`CLOSE_FILTER_POPUP`})}getSortInfoMap(){let e=new Map;return this.sortModel.forEach((t,n)=>{e.set(t.colId,{direction:t.direction,index:n+1})}),e}destroy(){this.emitter.clearListeners(),this.sortModel=[],this.filterModel={},this.openFilterColIndex=null}},M=class{queue=[];debounceTimer=null;pendingPromise=null;options;constructor(e){this.options=e}add(e){e.length!==0&&(this.queue.push({type:`ADD`,rows:e}),this.scheduleProcessing())}remove(e){e.length!==0&&(this.queue.push({type:`REMOVE`,rowIds:e}),this.scheduleProcessing())}updateCell(e,t,n){this.queue.push({type:`UPDATE_CELL`,rowId:e,field:t,value:n}),this.scheduleProcessing()}updateRow(e,t){Object.keys(t).length!==0&&(this.queue.push({type:`UPDATE_ROW`,rowId:e,data:t}),this.scheduleProcessing())}flush(){return this.queue.length===0?Promise.resolve():(this.debounceTimer!==null&&(clearTimeout(this.debounceTimer),this.debounceTimer=null),this.pendingPromise?new Promise((e,t)=>{let n=this.pendingPromise,r=n.resolve,i=n.reject;n.resolve=()=>{r(),e()},n.reject=e=>{i(e),t(e)}}):new Promise((e,t)=>{this.pendingPromise={resolve:e,reject:t},this.processQueue()}))}hasPending(){return this.queue.length>0}getPendingCount(){return this.queue.length}clear(){this.queue=[],this.debounceTimer!==null&&(clearTimeout(this.debounceTimer),this.debounceTimer=null),this.pendingPromise&&=(this.pendingPromise.resolve(),null)}scheduleProcessing(){if(this.options.debounceMs===0){this.processQueue();return}this.debounceTimer===null&&(this.debounceTimer=setTimeout(()=>{this.debounceTimer=null,this.processQueue()},this.options.debounceMs))}processQueue(){if(this.queue.length===0){this.pendingPromise&&=(this.pendingPromise.resolve(),null);return}let e=this.queue;this.queue=[];let t={added:0,removed:0,updated:0};try{for(let n of e)switch(n.type){case`ADD`:this.options.store.addRows(n.rows),t.added+=n.rows.length;break;case`REMOVE`:t.removed+=this.options.store.removeRows(n.rowIds);break;case`UPDATE_CELL`:this.options.store.updateCell(n.rowId,n.field,n.value),t.updated++;break;case`UPDATE_ROW`:this.options.store.updateRow(n.rowId,n.data),t.updated++;break}this.options.onProcessed&&this.options.onProcessed(t),this.pendingPromise&&=(this.pendingPromise.resolve(),null)}catch(e){this.pendingPromise&&=(this.pendingPromise.reject(e instanceof Error?e:Error(String(e))),null)}}},Ne=class{listeners=[];buffer=null;subscribe(e){return this.listeners.push(e),()=>{this.listeners=this.listeners.filter(t=>t!==e)}}start(){this.buffer=[]}flush(){let e=this.buffer;if(this.buffer=null,e!==null&&e.length>0)for(let t of this.listeners)t(e)}emit(e){if(this.buffer!==null){this.buffer.push(e);return}this.notify([e])}emitBatch(e){if(e.length!==0){if(this.buffer!==null){this.buffer.push(...e);return}this.notify(e)}}clearListeners(){this.listeners=[]}notify(e){for(let t of this.listeners)t(e)}},Pe=class{scrollTop=0;scrollLeft=0;viewportWidth=800;viewportHeight=600;getScrollRatio;constructor(e){this.getScrollRatio=e}getScrollTop(){return this.scrollTop}getScrollLeft(){return this.scrollLeft}getViewportWidth(){return this.viewportWidth}getViewportHeight(){return this.viewportHeight}resetScrollTop(){this.scrollTop=0}update(e,t,n,r){let i=this.getScrollRatio(),a=i<1?e/i:e,o=this.viewportWidth!==n||this.viewportHeight!==r,s=this.scrollTop!==a||this.scrollLeft!==t||o;return s&&(this.scrollTop=a,this.scrollLeft=t,this.viewportWidth=n,this.viewportHeight=r),{changed:s,viewportSizeChanged:o}}};const N=e=>e.replaceAll(`\r
1
+ const e=(e,t,n,r,i)=>{let a=0,o=0;return e<40+i?o=-10:e>n-40&&(o=10),t<40?a=-10:t>r-40&&(a=10),a!==0||o!==0?{dx:a,dy:o}:null};var t=class{active=!1;colIndex=-1;startX=0;initialWidth=0;currentWidth=0;core;constructor(e){this.core=e}get isActive(){return this.active}start(e,t,n){return n.button!==0||this.core.getColumns()[e]?.resizable===!1?{preventDefault:!1,stopPropagation:!1}:(this.active=!0,this.colIndex=e,this.startX=n.clientX,this.initialWidth=t,this.currentWidth=t,{preventDefault:!0,stopPropagation:!0,startDrag:`column-resize`})}move(e,t){let n=this.core.getColumns()[this.colIndex],r=n?.minWidth??50,i=n?.maxWidth,a=this.initialWidth+(e.clientX-this.startX);a=Math.max(r,a),i!==void 0&&(a=Math.min(i,a)),this.currentWidth=a;let o=e.clientX-t.left>t.width-40?10:0,s=o===0?null:{dx:o,dy:0};return{targetRow:0,targetCol:this.colIndex,autoScroll:s}}end(){this.active&&this.core.setColumnWidth(this.colIndex,this.currentWidth),this.active=!1,this.colIndex=-1}getState(){return this.active===!1?null:{colIndex:this.colIndex,initialWidth:this.initialWidth,currentWidth:this.currentWidth}}};const n=e=>{let t=[0],n=0;for(let r of e)n+=r.width,t.push(n);return t},r=e=>e.at(-1)??0,i=(e,t)=>{let i=n(e),a=r(i);if(t<=a||a===0)return{positions:i,widths:e.map(e=>e.width)};let o=t/a,s=e.map(e=>e.width*o),c=[0],l=0;for(let e of s)l+=e,c.push(l);return{positions:c,widths:s}},a=(e,t)=>{for(let n=0;n<t.length-1;n++)if(e>=t[n]&&e<t[n+1])return n;return e>=t.at(-1)?t.length-2:0},o=e=>({minRow:Math.min(e.startRow,e.endRow),maxRow:Math.max(e.startRow,e.endRow),minCol:Math.min(e.startCol,e.endCol),maxCol:Math.max(e.startCol,e.endCol)}),s=(e,t,n)=>e>=n.minRow&&e<=n.maxRow&&t>=n.minCol&&t<=n.maxCol,c=(e,t,n)=>{if(!n)return!1;let r=o(n);return s(e,t,r)},l=(e,t,n)=>n?.row===e&&n?.col===t,u=(e,t)=>!t||t.end<0||t.start>t.end||e>=t.start&&e<=t.end,d=(e,t,n)=>n?.row===e&&n?.col===t,f=(e,t,n,r,i)=>{if(!n||!r||!i)return!1;let{minRow:a,maxRow:s,minCol:c,maxCol:l}=o(r),u=i.row>s,d=i.row<a;return u?e>s&&e<=i.row&&t>=c&&t<=l:d?e<a&&e>=i.row&&t>=c&&t<=l:!1},p=(e,t,n,r)=>{let i=[`gp-grid-cell`];return e&&i.push(`gp-grid-cell--active`),t&&!e&&i.push(`gp-grid-cell--selected`),n&&i.push(`gp-grid-cell--editing`),r&&i.push(`gp-grid-cell--fill-preview`),i.join(` `)},m=(e,t)=>{if(!t)return!1;let{minRow:n,maxRow:r}=o(t);return e>=n&&e<=r},h=(e,t)=>{if(!t)return!1;let{minCol:n,maxCol:r}=o(t);return e>=n&&e<=r};function g(e,t){let n=t.split(`.`),r=e;for(let e of n){if(typeof r!=`object`||!r)return null;r=r[e]}return r}function _(e,t,n){let r=t.split(`.`),i=e;for(let e=0;e<r.length-1;e++){let t=r[e];if(typeof i!=`object`||!i)return;i=i[t]}typeof i==`object`&&i&&(i[r.at(-1)]=n)}const v=()=>{let e=[];return{onInstruction:t=>(e.push(t),()=>{e=e.filter(e=>e!==t)}),emit:t=>{for(let n of e)n(t)},clearListeners:()=>{e=[]}}},ee=()=>{let e=v(),t=[];return{onInstruction:e.onInstruction,onBatchInstruction:e=>(t.push(e),()=>{t=t.filter(t=>t!==e)}),emit:n=>{e.emit(n);for(let e of t)e([n])},emitBatch:n=>{if(n.length!==0){for(let e of t)e(n);for(let t of n)e.emit(t)}},clearListeners:()=>{e.clearListeners(),t=[]}}},te=(e,t)=>{for(let n of e.values())if(n.rowIndex===t)return n;return null},ne=(e,t,n,r,i,a)=>{let o=te(i,n);if(!o){t.scrollTop=e.getScrollTopForRow(n);return}let s=a+o.translateY-t.scrollTop,c=s+r;if(s<0)t.scrollTop=e.getScrollTopForRow(n);else if(c>t.clientHeight){let i=Math.floor(t.clientHeight/r),a=Math.max(0,n-i+1);t.scrollTop=e.getScrollTopForRow(a)}},re=(e,t)=>{let n=t.visibleColumns.findIndex(e=>e.originalIndex===t.colIndex),r=t.columnPositions[n],i=t.columnWidths[n];if(n<0||r===void 0||i===void 0)return;if(r<e.scrollLeft){e.scrollLeft=r;return}let a=r+i;a>e.scrollLeft+e.clientWidth&&(e.scrollLeft=a-e.clientWidth)},ie=(e,t,n,r,i,a=0,o)=>{ne(e,t,n,r,i,a),o!==void 0&&re(t,o)},y=(e,t)=>e==null?``:t?t(e):Array.isArray(e)?e.join(`, `):typeof e==`object`?e instanceof Date?String(e):JSON.stringify(e):String(e),ae=e=>{let{activeCell:t,selectionRange:n,slots:r,columns:i,visibleColumnsWithIndices:a,columnPositions:o,columnWidths:s,rowHeight:c}=e;if(!t&&!n)return null;let l,u,d,f;if(n)l=Math.max(n.startRow,n.endRow),u=Math.max(n.startCol,n.endCol),d=Math.min(n.startCol,n.endCol),f=Math.max(n.startCol,n.endCol);else if(t)l=t.row,u=t.col,d=u,f=u;else return null;for(let e=d;e<=f;e++){let t=i[e];if(!(!t||t.hidden)&&t.editable!==!0)return null}let p=a.findIndex(e=>e.originalIndex===u);if(p===-1)return null;let m=null;for(let e of r.values())if(e.rowIndex===l){m=e.translateY;break}if(m===null)return null;let h=o[p]??0,g=s[p]??0;return{top:m+c-5,left:h+g-20}},oe=(e,t,n=8)=>{let r=e.getBoundingClientRect(),i=t.getBoundingClientRect(),a=r.bottom+4,o=r.left,s=Math.max(200,r.width);return o+i.width>window.innerWidth-n&&(o=window.innerWidth-i.width-n),o=Math.max(n,o),a+i.height>window.innerHeight-n&&(a=r.top-i.height-4),a=Math.max(n,a),{top:a,left:o,minWidth:s}},se=e=>{if(typeof document>`u`)return()=>{};let t=t=>{if(t.key!==`a`&&t.key!==`A`||!(t.ctrlKey||t.metaKey))return;t.preventDefault();let n=globalThis.getSelection();if(!n)return;n.removeAllRanges();let r=document.createRange();r.selectNodeContents(e),n.addRange(r)};return document.addEventListener(`keydown`,t),()=>document.removeEventListener(`keydown`,t)},ce=e=>{if(!e||e.length===0)return;let t={};for(let n of e)n.valueFormatter&&(t[n.colId??n.field]=n.valueFormatter);return Object.keys(t).length>0?t:void 0},b=e=>({range:e.range,sort:e.sortModel.length>0?e.sortModel:void 0,filter:Object.keys(e.filterModel).length>0?e.filterModel:void 0,valueFormatters:ce(e.columns)}),le=(e,t,n)=>{let r=e.get(t);if(r!==void 0){if(t<n){let i=n-1;for(let n=t;n<i;n++){let t=e.get(n+1);t===void 0?e.delete(n):e.set(n,t)}e.set(i,r);return}for(let r=t;r>n;r--){let t=e.get(r-1);t===void 0?e.delete(r):e.set(r,t)}e.set(n,r)}},ue=e=>{let t=[0],n=0;for(let r of e)r.hidden||(n+=r.width,t.push(n));return t},de=(e,t,n,r)=>{let i=e.get(n);if(!i)return null;let a=t[r];return a?g(i,a.field):null},fe=(e,t,n,r,i,a)=>{let o=e.get(n);if(!o||typeof o!=`object`)return;let s=t[r];if(!s)return;let c=a.onCellValueChanged!==void 0,l=c?g(o,s.field):void 0;_(o,s.field,i),c&&a.onCellValueChanged({rowId:a.getRowId(o),colIndex:r,field:s.field,oldValue:l,newValue:i,rowData:o})};var pe=class{active=!1;sourceColIndex=-1;startX=0;startY=0;thresholdMet=!1;shiftKey=!1;ghostWidth=0;ghostHeight=0;currentX=0;currentY=0;dropTargetIndex=null;core;deps;constructor(e,t){this.core=e,this.deps=t}updateDeps(e){this.deps=e}get isActive(){return this.active}get isDraggingForDisplay(){return this.active&&this.thresholdMet}start(e,t,n,r){return r.button!==0||this.core.getColumns()[e]?.movable===!1?{preventDefault:!1,stopPropagation:!1}:(this.active=!0,this.sourceColIndex=e,this.startX=r.clientX,this.startY=r.clientY,this.thresholdMet=!1,this.shiftKey=r.shiftKey,this.ghostWidth=t,this.ghostHeight=n,this.currentX=r.clientX,this.currentY=r.clientY,this.dropTargetIndex=null,{preventDefault:!0,stopPropagation:!0,startDrag:`column-move`})}move(e,t){let n=e.clientX-this.startX,r=e.clientY-this.startY;if(this.thresholdMet===!1){if(!(Math.abs(n)>5||Math.abs(r)>5))return null;this.thresholdMet=!0}this.currentX=e.clientX,this.currentY=e.clientY;let{left:i,width:o,scrollLeft:s}=t,c=e.clientX-i+s,l=this.deps.getColumnPositions(),u=this.deps.getColumnCount();this.dropTargetIndex=Math.max(0,Math.min(a(c,l),u));let d=e.clientX-i,f=0;d<40?f=-10:d>o-40&&(f=10);let p=f===0?null:{dx:f,dy:0};return{targetRow:0,targetCol:this.dropTargetIndex??0,autoScroll:p}}end(e){this.thresholdMet?this.commitMove():this.treatAsHeaderClick(e),this.reset()}commitMove(){if(this.dropTargetIndex===null)return;let e=this.sourceColIndex,t=this.deps.getOriginalColumnIndex?this.deps.getOriginalColumnIndex(Math.min(this.dropTargetIndex,this.deps.getColumnCount()-1)):this.dropTargetIndex;e!==t&&this.core.moveColumn(e,t)}treatAsHeaderClick(e){let t=this.core.getColumns()[this.sourceColIndex];if(!t)return;let n=t.colId??t.field,r=this.core.getSortModel().find(e=>e.colId===n)?.direction;this.core.setSort(n,e(r),this.shiftKey)}reset(){this.active=!1,this.sourceColIndex=-1,this.thresholdMet=!1,this.shiftKey=!1,this.dropTargetIndex=null}getState(){return this.active===!1?null:{sourceColIndex:this.sourceColIndex,currentX:this.currentX,currentY:this.currentY,dropTargetIndex:this.dropTargetIndex,ghostWidth:this.ghostWidth,ghostHeight:this.ghostHeight}}},me=class{active=!1;sourceRowIndex=-1;startX=0;startY=0;thresholdMet=!1;currentX=0;currentY=0;dropTargetIndex=null;core;deps;constructor(e,t){this.core=e,this.deps=t}updateDeps(e){this.deps=e}get isActive(){return this.active}get isDraggingForDisplay(){return this.active&&this.thresholdMet}start(e,t,n){this.active=!0,this.sourceRowIndex=e,this.startX=t,this.startY=n,this.thresholdMet=!1,this.currentX=t,this.currentY=n,this.dropTargetIndex=null}move(t,n){let r=t.clientX-this.startX,i=t.clientY-this.startY;if(this.thresholdMet===!1){if(!(Math.abs(r)>5||Math.abs(i)>5))return null;this.thresholdMet=!0}this.currentX=t.clientX,this.currentY=t.clientY;let{top:a,left:o,height:s,width:c,scrollTop:l}=n,u=this.deps.getHeaderHeight(),d=t.clientY-a,f=this.core.getRowCount(),p=Math.max(0,Math.min(this.core.getRowIndexAtDisplayY(d,l),f));return this.dropTargetIndex=p,{targetRow:p,targetCol:0,autoScroll:e(t.clientY-a,t.clientX-o,s,c,u)}}end(){this.thresholdMet&&this.dropTargetIndex!==null&&this.dropTargetIndex!==this.sourceRowIndex&&this.core.commitRowDrag(this.sourceRowIndex,this.dropTargetIndex),this.active=!1,this.sourceRowIndex=-1,this.thresholdMet=!1,this.dropTargetIndex=null}getState(){return this.active===!1?null:{sourceRowIndex:this.sourceRowIndex,currentX:this.currentX,currentY:this.currentY,dropTargetIndex:this.dropTargetIndex,dropIndicatorY:this.dropTargetIndex===null?0:this.core.getRowTranslateY(this.dropTargetIndex)}}},he=class{active=!1;core;constructor(e){this.core=e}get isActive(){return this.active}start(){this.active=!0}moveToTarget(e,t){this.active!==!1&&this.core.selection.startSelection({row:e,col:t},{shift:!0})}end(){this.active=!1}},ge=class{active=!1;sourceRange=null;target=null;core;constructor(e){this.core=e}get isActive(){return this.active}get stateSnapshot(){return{sourceRange:this.sourceRange,target:this.target}}start(e,t){if(!e&&!t)return{preventDefault:!1,stopPropagation:!1};let n=t??{startRow:e.row,startCol:e.col,endRow:e.row,endCol:e.col};return this.core.fill.startFillDrag(n),this.sourceRange=n,this.target={row:Math.max(n.startRow,n.endRow),col:Math.max(n.startCol,n.endCol)},this.active=!0,{preventDefault:!0,stopPropagation:!0,startDrag:`fill`}}moveToTarget(e,t){this.active!==!1&&(this.core.fill.updateFillDrag(e,t),this.target={row:e,col:t})}end(){this.active&&(this.core.fill.commitFillDrag(),this.core.refreshSlotData()),this.active=!1,this.sourceRange=null,this.target=null}},_e=class{record=null;set(e){this.record=e}clear(){this.record=null}consume(){let e=this.record;return this.record=null,e}},ve=class{record=null;set(e){this.record=e}clear(){this.record=null}consume(){let e=this.record;return this.record=null,e}};const ye=10,be=300,xe=e=>{switch(e){case`ArrowUp`:return`up`;case`ArrowDown`:return`down`;case`ArrowLeft`:return`left`;case`ArrowRight`:return`right`;default:return null}};var Se=class{core;constructor(e){this.core=e}handle(e,t,n,r){if(r)return{preventDefault:!1};if(this.core.getPeekState()!==null)return e.key===`Escape`?(this.core.stopPeek(),{preventDefault:!0}):{preventDefault:!1};if(n!==null&&e.key!==`Enter`&&e.key!==`Escape`&&e.key!==`Tab`)return{preventDefault:!1};let i=xe(e.key);if(i!==null)return this.moveFocus(i,e.shiftKey);let a=e.ctrlKey||e.metaKey;return this.handleAction(e.key,t,n,e.shiftKey,a)}moveFocus(e,t){this.core.stopPeek();let{selection:n}=this.core;return n.moveFocus(e,t),{preventDefault:!0,scrollToCell:n.getActiveCell()??void 0}}handleAction(e,t,n,r,i){switch(e){case`Enter`:return this.handleEnter(t,n);case`Escape`:return this.handleEscape(n);case`Tab`:return this.handleTab(n,r);default:return this.handleNonSpecialKey(e,t,n,i)}}handleEnter(e,t){return t?this.core.commitEdit():e&&this.core.startEdit(e.row,e.col),{preventDefault:!0}}handleEscape(e){return e?this.core.cancelEdit():this.core.getPeekState()?this.core.stopPeek():this.core.selection.clearSelection(),{preventDefault:!0}}handleTab(e,t){return e&&this.core.commitEdit(),this.core.selection.moveFocus(t?`left`:`right`,!1),{preventDefault:!0}}handleNonSpecialKey(e,t,n,r){let{selection:i}=this.core;return e===`a`&&r?(i.selectAll(),{preventDefault:!0}):e===`c`&&r?(i.copySelectionToClipboard(),{preventDefault:!0}):e===`F2`?(t&&!n&&this.core.startEdit(t.row,t.col),{preventDefault:!0}):e===`Delete`||e===`Backspace`?t&&!n?(this.core.startEdit(t.row,t.col),{preventDefault:!0}):{preventDefault:!1}:(t&&!n&&!r&&e.length===1&&this.core.startEdit(t.row,t.col),{preventDefault:!1})}};const Ce=(t,n,r,i)=>{let{top:o,left:s,width:c,height:l,scrollTop:u,scrollLeft:d}=i,f=n.getColumnPositions(),p=n.getColumnCount(),m=r.clientY-o,h=r.clientX-s+d,g=Math.max(0,Math.min(t.getRowIndexAtDisplayY(m,u),t.getRowCount()-1)),_=Math.max(0,Math.min(a(h,f),p-1));return{row:g,col:n.getOriginalColumnIndex?n.getOriginalColumnIndex(_):_,autoScroll:e(r.clientY-o,r.clientX-s,l,c,n.getHeaderHeight())}},x=e=>e==null?`asc`:e===`asc`?`desc`:null;var S=class{core;deps;columnResize;columnMove;rowDrag;selectionDrag;fillDrag;pendingRowDrag=new _e;pendingCellTap=new ve;keyboard;constructor(e,n){this.core=e,this.deps=n,this.columnResize=new t(e),this.columnMove=new pe(e,n),this.rowDrag=new me(e,n),this.selectionDrag=new he(e),this.fillDrag=new ge(e),this.keyboard=new Se(e)}updateDeps(e){this.deps={...this.deps,...e},this.columnMove.updateDeps(this.deps),this.rowDrag.updateDeps(this.deps)}getDragState(){let e=this.getDragType(),t=this.fillDrag.stateSnapshot;return{isDragging:e!==null,dragType:e,fillSourceRange:t.sourceRange,fillTarget:t.target,columnResize:this.columnResize.getState(),columnMove:this.columnMove.getState(),rowDrag:this.rowDrag.getState()}}getDragType(){return this.fillDrag.isActive?`fill`:this.columnResize.isActive?`column-resize`:this.columnMove.isDraggingForDisplay?`column-move`:this.rowDrag.isDraggingForDisplay?`row-drag`:this.selectionDrag.isActive?`selection`:null}handleHeaderMouseDown(e,t,n,r){return this.columnMove.start(e,t,n,r)}handleHeaderResizeMouseDown(e,t,n){return this.columnResize.start(e,t,n)}handleCellMouseDown(e,t,n){if(n.button!==0||this.core.getEditState()!==null)return we;this.core.stopPeek();let r=(this.core.getColumns()[t]?.rowDrag===!0||this.core.isRowDragEntireRow())&&!n.shiftKey;return r&&n.pointerType===`touch`?this.startPendingRowDrag(e,t,n):r?this.startRowDrag(e,t,n):this.startSelectionClick(e,t,n)}startPendingRowDrag(e,t,n){return this.pendingRowDrag.set({rowIndex:e,colIndex:t,clientX:n.clientX,clientY:n.clientY}),this.pendingCellTap.set({rowIndex:e,colIndex:t}),{preventDefault:!1,stopPropagation:!1,focusContainer:!1,startDrag:`row-drag-pending`,startTap:!0}}startRowDrag(e,t,n){return this.rowDrag.start(e,n.clientX,n.clientY),this.core.selection.startSelection({row:e,col:t},{shift:!1,ctrl:!1}),{preventDefault:!0,stopPropagation:!0,focusContainer:!0,startDrag:`row-drag`}}startSelectionClick(e,t,n){return n.pointerType===`touch`?(this.pendingCellTap.set({rowIndex:e,colIndex:t}),{preventDefault:!1,stopPropagation:!1,focusContainer:!1,startTap:!0}):(this.core.selection.startSelection({row:e,col:t},{shift:n.shiftKey,ctrl:n.ctrlKey||n.metaKey}),{preventDefault:!1,stopPropagation:!1,focusContainer:!0,startDrag:n.shiftKey?void 0:`selection`})}handleCellDoubleClick(e,t){if(this.core.getColumns()[t]?.editable){this.core.startEdit(e,t);return}this.core.startPeek(e,t)}handleCellMouseEnter(e,t){this.core.highlight?.setHoverPosition({row:e,col:t})}handleCellMouseLeave(){this.core.highlight?.setHoverPosition(null)}handleFillHandleMouseDown(e,t,n){return this.fillDrag.start(e,t)}handleHeaderClick(e,t){let n=this.core.getSortModel().find(t=>t.colId===e)?.direction;this.core.setSort(e,x(n),t)}startSelectionDrag(){this.selectionDrag.start()}confirmPendingRowDrag(){let e=this.pendingRowDrag.consume();return e===null?!1:(this.pendingCellTap.clear(),this.rowDrag.start(e.rowIndex,e.clientX,e.clientY),this.core.selection.startSelection({row:e.rowIndex,col:e.colIndex},{shift:!1,ctrl:!1}),!0)}cancelPendingRowDrag(){this.pendingRowDrag.clear()}confirmPendingCellTap(){let e=this.pendingCellTap.consume();return e===null?!1:(this.core.selection.startSelection({row:e.rowIndex,col:e.colIndex},{shift:!1,ctrl:!1}),!0)}cancelPendingCellTap(){this.pendingCellTap.clear()}handleDragMove(e,t){return this.columnResize.isActive?this.columnResize.move(e,t):this.columnMove.isActive?this.columnMove.move(e,t):this.rowDrag.isActive?this.rowDrag.move(e,t):this.selectionFillMove(e,t)}selectionFillMove(e,t){if((this.selectionDrag.isActive||this.fillDrag.isActive)===!1)return null;let n=Ce(this.core,this.deps,e,t);return this.selectionDrag.moveToTarget(n.row,n.col),this.fillDrag.moveToTarget(n.row,n.col),{targetRow:n.row,targetCol:n.col,autoScroll:n.autoScroll}}handleDragEnd(){if(this.columnResize.isActive)return this.columnResize.end();if(this.columnMove.isActive)return this.columnMove.end(x);if(this.rowDrag.isActive)return this.rowDrag.end();this.selectionDrag.end(),this.fillDrag.end()}handleWheel(e,t,n){return this.core.isScalingActive()?{dy:e*n,dx:t*n}:null}handleKeyDown(e,t,n,r){return this.keyboard.handle(e,t,n,r)}};const we={preventDefault:!1,stopPropagation:!1};var C=class{options;highlightingOptions;hoverPosition=null;emitter=v();onInstruction=this.emitter.onInstruction;emit=this.emitter.emit;rowClassCache=new Map;columnClassCache=new Map;cellClassCache=new Map;constructor(e,t={}){this.options=e,this.highlightingOptions=t}isEnabled(){return!!(this.highlightingOptions.computeRowClasses||this.highlightingOptions.computeColumnClasses||this.highlightingOptions.computeCellClasses)}updateOptions(e){this.highlightingOptions=e,this.clearAllCaches()}setHoverPosition(e){this.isEnabled()&&(this.hoverPosition?.row!==e?.row||this.hoverPosition?.col!==e?.col)&&(this.rowClassCache.clear(),this.columnClassCache.clear(),this.cellClassCache.clear(),this.hoverPosition=e,this.emit({type:`SET_HOVER_POSITION`,position:e}))}getHoverPosition(){return this.hoverPosition}onSelectionChange(){this.clearAllCaches()}buildRowContext(e,t){let n=this.options.getActiveCell(),r=this.options.getSelectionRange();return{rowIndex:e,colIndex:null,column:void 0,rowData:t,hoverPosition:this.hoverPosition,activeCell:n,selectionRange:r,isHovered:this.hoverPosition?.row===e,isActive:n?.row===e,isSelected:m(e,r)}}buildColumnContext(e,t){let n=this.options.getActiveCell(),r=this.options.getSelectionRange();return{rowIndex:null,colIndex:e,column:t,rowData:void 0,hoverPosition:this.hoverPosition,activeCell:n,selectionRange:r,isHovered:this.hoverPosition?.col===e,isActive:n?.col===e,isSelected:h(e,r)}}buildCellContext(e,t,n,r){let i=this.options.getActiveCell(),a=this.options.getSelectionRange(),s=this.hoverPosition?.row===e&&this.hoverPosition?.col===t,c=!1;if(a){let{minRow:n,maxRow:r,minCol:i,maxCol:s}=o(a);c=e>=n&&e<=r&&t>=i&&t<=s}return{rowIndex:e,colIndex:t,column:n,rowData:r,hoverPosition:this.hoverPosition,activeCell:i,selectionRange:a,isHovered:s,isActive:i?.row===e&&i?.col===t,isSelected:c}}computeRowClasses(e,t){let n=this.highlightingOptions.computeRowClasses;if(!n)return[];let r=this.rowClassCache.get(e);if(r!==void 0)return r;let i=n(this.buildRowContext(e,t));return this.rowClassCache.set(e,i),i}computeColumnClasses(e,t){let n=this.columnClassCache.get(e);if(n!==void 0)return n;let r=this.buildColumnContext(e,t),i;if(t.computeColumnClasses)i=t.computeColumnClasses(r);else if(this.highlightingOptions.computeColumnClasses)i=this.highlightingOptions.computeColumnClasses(r);else return[];return this.columnClassCache.set(e,i),i}computeCellClasses(e,t,n,r){let i=`${e},${t}`,a=this.cellClassCache.get(i);if(a!==void 0)return a;let o=this.buildCellContext(e,t,n,r),s;if(n.computeCellClasses)s=n.computeCellClasses(o);else if(this.highlightingOptions.computeCellClasses)s=this.highlightingOptions.computeCellClasses(o);else return[];return this.cellClassCache.set(i,s),s}computeCombinedCellClasses(e,t,n,r){let i=this.computeColumnClasses(t,n),a=this.computeCellClasses(e,t,n,r);return[...i,...a]}clearAllCaches(){this.rowClassCache.clear(),this.columnClassCache.clear(),this.cellClassCache.clear()}destroy(){this.emitter.clearListeners(),this.clearAllCaches(),this.hoverPosition=null}},w=class{options;emitter=v();onInstruction=this.emitter.onInstruction;emit=this.emitter.emit;constructor(e){this.options=e}getRow(e){return this.options.getCachedRows().get(e)}addRows(e,t){if(e.length===0)return;let n=this.options.getCachedRows(),r=this.options.getTotalRows(),i=t??r,a=r+e.length;if(i<r){let t=new Map;for(let[r,a]of n)r>=i?t.set(r+e.length,a):t.set(r,a);this.options.setCachedRows(t)}let o=this.options.getCachedRows();e.forEach((e,t)=>{o.set(i+t,e)}),this.options.setTotalRows(a);let s=e.map((e,t)=>i+t);this.emit({type:`ROWS_ADDED`,indices:s,count:s.length,totalRows:a}),this.options.emitContentSize(),this.options.refreshAllSlots()}updateRows(e){if(e.length===0)return;let t=this.options.getCachedRows(),n=[];for(let r of e){let e=t.get(r.index);e&&(t.set(r.index,{...e,...r.data}),n.push(r.index))}if(n.length!==0){this.emit({type:`ROWS_UPDATED`,indices:n});for(let e of n)this.options.updateSlot(e)}}deleteRows(e){if(e.length===0)return;let t=this.options.getCachedRows(),n=this.options.getTotalRows(),r=[...e].sort((e,t)=>t-e);for(let e of r){if(e<0||e>=n)continue;t.delete(e);let r=new Map;for(let[n,i]of t)n>e?r.set(n-1,i):r.set(n,i);this.options.setCachedRows(r),n--}this.options.setTotalRows(n),this.options.clearSelectionIfInvalid(n),this.emit({type:`ROWS_REMOVED`,indices:r,totalRows:n}),this.options.emitContentSize(),this.options.refreshAllSlots()}setRow(e,t){let n=this.options.getTotalRows();e<0||e>=n||(this.options.getCachedRows().set(e,t),this.emit({type:`ROWS_UPDATED`,indices:[e]}),this.options.updateSlot(e))}destroy(){this.emitter.clearListeners()}};const Te={aggressive:{prefetchPages:0,maxPages:1},balanced:{prefetchPages:1,maxPages:5},conservative:{prefetchPages:2,maxPages:10}},T=(e,t)=>e===void 0?t:Number.isFinite(e)&&e>0?Math.floor(e):t,Ee=(e,t)=>e===void 0?t:Number.isFinite(e)&&e>=0?Math.floor(e):t,E=e=>{let t=Te[e?.eviction??`balanced`];return{pageSize:T(e?.pageSize,100),prefetchPages:Ee(e?.prefetchPages,t.prefetchPages),maxPages:T(e?.maxPages,t.maxPages)}};var De=class{options;cacheOptions;generation=0;hasKnownTotal=!1;loadedBlocks=new Set;pendingBlocks=new Map;constructor(e,t){this.options=e,this.cacheOptions=E(t)}configure(e){this.cacheOptions=E(e)}getPageSize(){return this.cacheOptions.pageSize}reset(){this.generation+=1,this.hasKnownTotal=!1,this.loadedBlocks.clear(),this.pendingBlocks.clear(),this.options.getCachedRows().clear()}hasMissingRows(e){if(e.endRow<=e.startRow)return!1;let t=this.options.getTotalRows();if(this.hasKnownTotal&&t===0||this.hasKnownTotal&&e.startRow>=t)return!1;let n=this.hasKnownTotal?Math.min(e.endRow,t):e.endRow,r=this.options.getCachedRows();for(let t=e.startRow;t<n;t+=1)if(!r.has(t))return!0;return!1}async loadRange(e,t=!1){t&&this.reset();let n=this.generation,r=this.options.getTotalRows(),i=this.getBlocksForRange(e).map(e=>this.getOrCreateBlockRequest(e,n)).filter(e=>e!==null);return i.length>0&&await Promise.all(i),n===this.generation?(this.evictAround(e),{applied:!0,loadedBlockCount:i.length,totalRowsChanged:r!==this.options.getTotalRows()}):{applied:!1,loadedBlockCount:0,totalRowsChanged:!1}}getOrCreateBlockRequest(e,t){if(this.loadedBlocks.has(e))return null;let n=this.pendingBlocks.get(e);if(n)return n;let r=this.fetchBlock(e,t);return this.pendingBlocks.set(e,r),r.then(()=>this.deletePendingBlock(e,r),()=>this.deletePendingBlock(e,r)),r}deletePendingBlock(e,t){this.pendingBlocks.get(e)===t&&this.pendingBlocks.delete(e)}async fetchBlock(e,t){let n=e*this.cacheOptions.pageSize,r=this.getBlockEndRow(e),i;try{i=await this.options.getDataSource().query(b({range:{startRow:n,endRow:r},sortModel:this.options.getSortModel(),filterModel:this.options.getFilterModel(),columns:this.options.getColumns()}))}catch(e){if(t===this.generation)throw e;return}t===this.generation&&this.applyBlockResponse(e,i.rows,i.totalRows)}applyBlockResponse(e,t,n){let r=this.options.getCachedRows(),i=this.options.getTotalRows();this.deleteRowsForBlock(e);let a=e*this.cacheOptions.pageSize;t.forEach((e,t)=>{e!==void 0&&r.set(a+t,e)}),this.options.setTotalRows(n),this.hasKnownTotal=!0,this.loadedBlocks.add(e),n<i&&this.deleteRowsAfterTotal(n)}getBlocksForRange(e){if(e.endRow<=e.startRow)return[];let t=this.options.getTotalRows();if(this.hasKnownTotal&&t===0||this.hasKnownTotal&&e.startRow>=t)return[];let n=this.hasKnownTotal?Math.min(e.endRow,t):e.endRow,r=this.cacheOptions.pageSize,i=Math.floor(e.startRow/r),a=Math.floor((n-1)/r),o=Math.max(0,i-this.cacheOptions.prefetchPages),s=this.getLastPrefetchBlock(a),c=[];for(let e=o;e<=s;e+=1)c.push(e);return c}getLastPrefetchBlock(e){let t=this.options.getTotalRows(),n=e+this.cacheOptions.prefetchPages;if(this.hasKnownTotal&&t>0){let e=Math.floor((t-1)/this.cacheOptions.pageSize);return Math.min(n,e)}return n}getBlockEndRow(e){let t=e*this.cacheOptions.pageSize+this.cacheOptions.pageSize,n=this.options.getTotalRows();return this.hasKnownTotal&&n>0?Math.min(t,n):t}evictAround(e){if(this.loadedBlocks.size<=this.cacheOptions.maxPages)return;let t=new Set(this.getBlocksForRange(e)),n=Math.floor(e.startRow/this.cacheOptions.pageSize),r=[...this.loadedBlocks].filter(e=>t.has(e)===!1).sort((e,t)=>Math.abs(t-n)-Math.abs(e-n));for(let e of r){if(this.loadedBlocks.size<=this.cacheOptions.maxPages)return;this.loadedBlocks.delete(e),this.deleteRowsForBlock(e)}}deleteRowsForBlock(e){let t=this.options.getCachedRows(),n=e*this.cacheOptions.pageSize,r=n+this.cacheOptions.pageSize;for(let e=n;e<r;e+=1)t.delete(e)}deleteRowsAfterTotal(e){let t=this.options.getCachedRows();for(let n of t.keys())n>=e&&t.delete(n)}};const D=e=>{e.computeColumnPositions(),e.batcher.start();try{e.emitContentSize(),e.emitHeaders(),e.batcher.emit({type:`COLUMNS_CHANGED`,columns:[...e.columns]}),e.refreshSlots===`sync`?e.slotPool.syncSlots():e.slotPool.refreshAllSlots()}finally{e.batcher.flush()}e.onComplete()},Oe=(e,t,n,r)=>{if(n<=0)return t;let i=0;for(let t=0;t<r.length;t++){if(t===e)continue;let n=r[t];!n||n.hidden||(i+=n.width)}return i<=0||t+i>=n?t:t*i/(n-t)},ke=(e,t,n,r)=>{let i=r.columns[e];i&&(i.width=i.hidden?t:Oe(e,t,n,r.columns),D({...r,refreshSlots:`sync`}))},Ae=(e,t,n)=>{if(e===t||e<0||e>=n.columns.length)return null;let r=t>e?t-1:t;if(r<0||r>=n.columns.length||e===r)return null;let[i]=n.columns.splice(e,1);return n.columns.splice(r,0,i),D({...n,refreshSlots:`all`}),r},je=(e,t,n)=>{let r=n.dataSource;if(!r.moveRow)return;r.moveRow(e,t),le(n.cachedRows,e,t),n.highlight?.clearAllCaches();let i=Math.min(e,t),a=Math.max(e,t);for(let e=i;e<=a;e++)n.slotPool.updateSlot(e)},Me=async e=>{let t=await e.dataSource.query(b({range:{startRow:0,endRow:2**53-1},sortModel:e.sortModel,filterModel:e.filterModel,columns:e.getColumns()}));e.cachedRows.clear();for(let n=0;n<t.rows.length;n++){let r=t.rows[n];r!==void 0&&e.cachedRows.set(n,r)}return e.setTotalRows(t.totalRows),{totalRows:t.totalRows}};var O=class{dataSource;options;rowLoading;rowWindowLoader;cachedRows=new Map;totalRows=0;isDataLoading=!1;constructor(e){this.options=e,this.dataSource=e.dataSource,this.rowLoading=e.rowLoading??{},this.rowWindowLoader=new De({getDataSource:()=>this.dataSource,getCachedRows:()=>this.cachedRows,getTotalRows:()=>this.totalRows,setTotalRows:e=>{this.totalRows=e},getSortModel:e.getSortModel,getFilterModel:e.getFilterModel,getColumns:e.getColumns},this.rowLoading.cache)}getCachedRows(){return this.cachedRows}setCachedRows(e){this.cachedRows=e}getTotalRows(){return this.totalRows}setTotalRows(e){this.totalRows=e}getDataSource(){return this.dataSource}getRowData(e){return this.cachedRows.get(e)}isLoading(){return this.isDataLoading}getCellValue(e,t){return de(this.cachedRows,this.options.getColumns(),e,t)}setCellValue(e,t,n){fe(this.cachedRows,this.options.getColumns(),e,t,n,{onCellValueChanged:this.options.onCellValueChanged,getRowId:this.options.getRowId})}async loadInitial(){if(this.isPaginatedLoading()){await this.fetchPaginatedData({range:this.getInitialPaginatedRange(),resetCache:!0,showLoading:!0,refreshSlots:!1});return}await this.fetchAllData()}requestVisibleRows(){if(this.isPaginatedLoading()===!1)return;let e=this.getPaginatedLoadRange(!0);if(e.endRow<=e.startRow)return;let t=this.getPaginatedLoadRange(!1),n=this.rowWindowLoader.hasMissingRows(t);this.fetchPaginatedData({range:e,resetCache:!1,showLoading:n,refreshSlots:!0})}async refreshFromTransaction(){if(this.isPaginatedLoading()){await this.fetchPaginatedData({range:this.getPaginatedLoadRange(!0),resetCache:!0,showLoading:!1,refreshSlots:!1});return}await Me({dataSource:this.dataSource,sortModel:this.options.getSortModel(),filterModel:this.options.getFilterModel(),cachedRows:this.cachedRows,setTotalRows:e=>{this.totalRows=e},getColumns:this.options.getColumns})}setDataSource(e){this.dataSource=e,this.rowWindowLoader.reset(),this.totalRows=0}destroy(){this.rowWindowLoader.reset(),this.cachedRows.clear(),this.totalRows=0,this.isDataLoading=!1}async fetchAllData(){this.isDataLoading=!0,this.options.batcher.emit({type:`DATA_LOADING`});try{let e=b({range:{startRow:0,endRow:2**53-1},sortModel:this.options.getSortModel(),filterModel:this.options.getFilterModel(),columns:this.options.getColumns()}),t=await this.dataSource.query(e);this.cachedRows.clear(),t.rows.forEach((e,t)=>{this.cachedRows.set(t,e)}),this.totalRows=t.totalRows,this.options.batcher.emit({type:`DATA_LOADED`,totalRows:this.totalRows})}catch(e){this.emitDataError(e)}finally{this.isDataLoading=!1}}async fetchPaginatedData(e){e.showLoading&&(this.isDataLoading=!0,this.options.batcher.emit({type:`DATA_LOADING`}));try{let t=await this.rowWindowLoader.loadRange(e.range,e.resetCache);if(t.applied===!1)return;(e.showLoading||t.totalRowsChanged)&&this.options.batcher.emit({type:`DATA_LOADED`,totalRows:this.totalRows}),e.refreshSlots&&(this.options.syncSlots(),this.options.emitVisibleRange(),t.totalRowsChanged&&this.options.emitContentSize())}catch(e){this.emitDataError(e)}finally{e.showLoading&&(this.isDataLoading=!1)}}emitDataError(e){this.options.batcher.emit({type:`DATA_ERROR`,error:e instanceof Error?e.message:String(e)})}isPaginatedLoading(){let e=this.rowLoading.mode??`auto`;return e===`paginated`||e!==`all`&&this.dataSource.loadMode===`paginated`}getInitialPaginatedRange(){let e=this.getPaginatedLoadRange(!0);return{startRow:0,endRow:Math.max(this.rowWindowLoader.getPageSize(),e.endRow)}}getPaginatedLoadRange(e){let t=this.options.getRowHeight(),n=this.options.getViewportHeight(),r=this.options.getScrollTop(),i=e?this.options.getOverscan():0,a=Math.max(0,Math.floor(r/t)-i),o=Math.ceil((r+n)/t)+i+1,s=this.totalRows>0?Math.min(this.totalRows,o):o;return{startRow:a,endRow:Math.max(a,s)}}};const k=1e7;var A=class{naturalContentHeight=0;virtualContentHeight=0;scrollRatio=1;options;constructor(e){this.options=e}updateContentSize(){let e=this.options.getTotalRows(),t=this.options.getRowHeight(),n=this.options.getHeaderHeight(),r=this.options.getViewportHeight(),i=e*t;if(this.naturalContentHeight=i+n,this.naturalContentHeight>k){this.virtualContentHeight=k;let e=this.virtualContentHeight-n-r,a=Math.ceil((i-r)/t)*t;this.scrollRatio=a>0?e/a:1}else this.virtualContentHeight=this.naturalContentHeight,this.scrollRatio=1;return{naturalHeight:this.naturalContentHeight,virtualHeight:this.virtualContentHeight,scrollRatio:this.scrollRatio}}isScalingActive(){return this.scrollRatio<1}getNaturalHeight(){let e=this.options.getTotalRows(),t=this.options.getRowHeight(),n=this.options.getHeaderHeight();return this.naturalContentHeight||e*t+n}getVirtualHeight(){let e=this.options.getTotalRows(),t=this.options.getRowHeight(),n=this.options.getHeaderHeight();return this.virtualContentHeight||e*t+n}getScrollRatio(){return this.scrollRatio}getVisibleRowRange(){let e=this.options.getViewportHeight(),t=this.options.getScrollTop(),n=this.options.getRowHeight(),r=this.options.getTotalRows(),i=e,a=Math.max(0,Math.floor(t/n)),o=Math.min(r-1,Math.ceil((t+i)/n)-1);return{start:a,end:Math.max(a,o)}}getScrollTopForRow(e){return e*this.options.getRowHeight()*this.scrollRatio}getRowIndexAtDisplayY(e,t){let n=this.options.getRowHeight(),r=e+(this.scrollRatio<1?t/this.scrollRatio:t);return Math.floor(r/n)}getVirtualContentHeight(){return this.virtualContentHeight}};const j=e=>e.map(e=>({item:e,key:M(e)})).sort((e,t)=>e.key===t.key?0:e.key<t.key?-1:1).map(e=>e.item),M=e=>e==null?`x:null`:typeof e==`string`?`s:${e}`:typeof e==`number`?`n:${String(e)}`:typeof e==`boolean`?`b:${String(e)}`:e instanceof Date?`d:${String(e.getTime())}`:Array.isArray(e)?`a:${JSON.stringify(j(e))}`:`o:${JSON.stringify(e)}`,N=e=>e==null||e===``||Array.isArray(e)&&e.length===0,Ne=(e,t)=>{let n=Number.parseFloat(e),r=Number.parseFloat(t);return Number.isNaN(n)===!1&&Number.isNaN(r)===!1?n-r:e.localeCompare(t,void 0,{numeric:!0,sensitivity:`base`})},Pe=(e,t)=>{let n=new Map;for(let r of e){if(N(r))continue;let e=Array.isArray(r)?j(r):r,i=M(e),a=y(e,t),o=n.get(a);o===void 0&&(o={entry:{label:a,values:[]},seen:new Set},n.set(a,o)),!o.seen.has(i)&&(o.seen.add(i),o.entry.values.push(e))}let r=Array.from(n.values(),e=>e.entry);return r.sort((e,t)=>Ne(e.label,t.label)),r},Fe=(e,t)=>{let n=new Set;for(let e of t)n.add(M(e));let r=new Set;for(let t of e)t.values.some(e=>n.has(M(e)))&&r.add(t.label);return r},Ie=(e,t)=>{let n=new Set;for(let r of e)if(t.has(r.label)!==!1)for(let e of r.values)n.add(e);return n};var P=class{options;emitter=v();sortModel=[];filterModel={};openFilterColIndex=null;scanWarnedCols=new Set;truncationWarnedCols=new Set;typeMismatchWarnedCols=new Set;onInstruction=this.emitter.onInstruction;emit=this.emitter.emit;constructor(e){this.options=e}async setSort(e,t,n=!1){if(!this.options.isSortingEnabled()||this.options.getColumns().find(t=>(t.colId??t.field)===e)?.sortable===!1)return;let r=this.sortModel.findIndex(t=>t.colId===e);n?t===null&&r>=0?this.sortModel.splice(r,1):r>=0?this.sortModel[r].direction=t:this.sortModel.push({colId:e,direction:t}):this.sortModel=t===null?[]:[{colId:e,direction:t}],await this.options.onSortFilterChange(),this.options.onDataRefreshed()}getSortModel(){return[...this.sortModel]}async setFilter(e,t){let n=this.options.getColumns().find(t=>(t.colId??t.field)===e);n?.filterable!==!1&&(t===null||typeof t==`string`&&t.trim()===``||typeof t==`object`&&t.conditions?.length===0?delete this.filterModel[e]:typeof t==`string`?this.filterModel[e]={conditions:[{type:`text`,operator:`contains`,value:t}],combination:`and`}:(this.warnTypeMismatchedSelectedValues(e,n,t),this.filterModel[e]=t),await this.options.onSortFilterChange(),this.options.onDataRefreshed())}warnTypeMismatchedSelectedValues(e,t,n){let r=t?.cellDataType;(r===`number`||r===`boolean`||r===`date`||r===`dateTime`)&&(this.typeMismatchWarnedCols.has(e)||n.conditions.some(e=>e.type===`text`&&e.selectedValues!==void 0&&e.selectedValues.size>0&&[...e.selectedValues].every(e=>typeof e==`string`))!==!1&&(this.typeMismatchWarnedCols.add(e),console.warn(`[gp-grid] Filter on column "${e}" (cellDataType "${r}") has selectedValues containing only strings. Values-mode filters match raw values by strict identity, so this selection will likely match nothing. If this model was restored from JSON or URL params, revive the values to their raw types (e.g. Number(v), new Date(v)) before applying it.`)))}getFilterModel(){return{...this.filterModel}}hasActiveFilter(e){let t=this.filterModel[e];return t?t.conditions.length>0:!1}isColumnSortable(e){return this.options.isSortingEnabled()?this.options.getColumns()[e]?.sortable!==!1:!1}isColumnFilterable(e){return this.options.getColumns()[e]?.filterable!==!1}getDistinctValuesForColumn(e,t=500){let n=this.options.getColumns().find(t=>(t.colId??t.field)===e);if(!n)return[];let r=n.valueFormatter,i=n.distinctValues??this.scanDistinctValues(n,t),a=new Map;for(let n of i){if(a.size>=t){this.warnTruncatedFormattedDomain(e,r);break}let[i,o]=this.normalizeDistinctValue(n);a.has(i)||a.set(i,o)}let o=Array.from(a.values());return o.sort((e,t)=>{let n=y(e,r),i=y(t,r);return n.localeCompare(i,void 0,{numeric:!0,sensitivity:`base`})}),o}scanDistinctValues(e,t){let n=this.options.getCachedRows(),r=n.size,i=e.colId??e.field;r>1e4&&!this.scanWarnedCols.has(i)&&(this.scanWarnedCols.add(i),console.warn(`[gp-grid] Scanning ${r} rows to compute distinct values for column "${i}". Pre-supply ColumnDefinition.distinctValues to skip this scan.`));let a=new Map;for(let o=0;o<r;o++){let r=n.get(o);if(r===void 0)continue;if(a.size>=t){this.warnTruncatedFormattedDomain(i,e.valueFormatter);break}let s=g(r,e.field),[c,l]=this.normalizeDistinctValue(s);a.has(c)||a.set(c,l)}return Array.from(a.values())}normalizeDistinctValue(e){if(Array.isArray(e)){let t=[...e].sort((e,t)=>{let n=String(e),r=String(t);return n===r?0:n<r?-1:1});return[M(t),t]}return[M(e),e]}warnTruncatedFormattedDomain(e,t){t!==void 0&&(this.truncationWarnedCols.has(e)||(this.truncationWarnedCols.add(e),console.warn(`[gp-grid] Distinct values for column "${e}" were truncated at the cap, and the column has a valueFormatter. Values-mode filters match raw values, so selecting a label may miss rows whose raw values were not scanned. Pre-supply ColumnDefinition.distinctValues with the full raw domain.`)))}openFilterPopup(e,t,n=!0){if(this.openFilterColIndex===e){this.closeFilterPopup();return}let r=this.options.getColumns()[e];if(!r||!this.isColumnFilterable(e))return;let i=r.colId??r.field,a=[];n&&(a=this.getDistinctValuesForColumn(i)),this.openFilterColIndex=e,this.emit({type:`OPEN_FILTER_POPUP`,colIndex:e,column:r,anchorRect:t,distinctValues:a,currentFilter:this.filterModel[i]})}closeFilterPopup(){this.openFilterColIndex=null,this.emit({type:`CLOSE_FILTER_POPUP`})}getSortInfoMap(){let e=new Map;return this.sortModel.forEach((t,n)=>{e.set(t.colId,{direction:t.direction,index:n+1})}),e}destroy(){this.emitter.clearListeners(),this.sortModel=[],this.filterModel={},this.openFilterColIndex=null}},F=class{queue=[];debounceTimer=null;pendingPromise=null;options;constructor(e){this.options=e}add(e){e.length!==0&&(this.queue.push({type:`ADD`,rows:e}),this.scheduleProcessing())}remove(e){e.length!==0&&(this.queue.push({type:`REMOVE`,rowIds:e}),this.scheduleProcessing())}updateCell(e,t,n){this.queue.push({type:`UPDATE_CELL`,rowId:e,field:t,value:n}),this.scheduleProcessing()}updateRow(e,t){Object.keys(t).length!==0&&(this.queue.push({type:`UPDATE_ROW`,rowId:e,data:t}),this.scheduleProcessing())}flush(){return this.queue.length===0?Promise.resolve():(this.debounceTimer!==null&&(clearTimeout(this.debounceTimer),this.debounceTimer=null),this.pendingPromise?new Promise((e,t)=>{let n=this.pendingPromise,r=n.resolve,i=n.reject;n.resolve=()=>{r(),e()},n.reject=e=>{i(e),t(e)}}):new Promise((e,t)=>{this.pendingPromise={resolve:e,reject:t},this.processQueue()}))}hasPending(){return this.queue.length>0}getPendingCount(){return this.queue.length}clear(){this.queue=[],this.debounceTimer!==null&&(clearTimeout(this.debounceTimer),this.debounceTimer=null),this.pendingPromise&&=(this.pendingPromise.resolve(),null)}scheduleProcessing(){if(this.options.debounceMs===0){this.processQueue();return}this.debounceTimer===null&&(this.debounceTimer=setTimeout(()=>{this.debounceTimer=null,this.processQueue()},this.options.debounceMs))}processQueue(){if(this.queue.length===0){this.pendingPromise&&=(this.pendingPromise.resolve(),null);return}let e=this.queue;this.queue=[];let t={added:0,removed:0,updated:0};try{for(let n of e)switch(n.type){case`ADD`:this.options.store.addRows(n.rows),t.added+=n.rows.length;break;case`REMOVE`:t.removed+=this.options.store.removeRows(n.rowIds);break;case`UPDATE_CELL`:this.options.store.updateCell(n.rowId,n.field,n.value),t.updated++;break;case`UPDATE_ROW`:this.options.store.updateRow(n.rowId,n.data),t.updated++;break}this.options.onProcessed&&this.options.onProcessed(t),this.pendingPromise&&=(this.pendingPromise.resolve(),null)}catch(e){this.pendingPromise&&=(this.pendingPromise.reject(e instanceof Error?e:Error(String(e))),null)}}},Le=class{listeners=[];buffer=null;subscribe(e){return this.listeners.push(e),()=>{this.listeners=this.listeners.filter(t=>t!==e)}}start(){this.buffer=[]}flush(){let e=this.buffer;if(this.buffer=null,e!==null&&e.length>0)for(let t of this.listeners)t(e)}emit(e){if(this.buffer!==null){this.buffer.push(e);return}this.notify([e])}emitBatch(e){if(e.length!==0){if(this.buffer!==null){this.buffer.push(...e);return}this.notify(e)}}clearListeners(){this.listeners=[]}notify(e){for(let t of this.listeners)t(e)}},Re=class{scrollTop=0;scrollLeft=0;viewportWidth=800;viewportHeight=600;getScrollRatio;constructor(e){this.getScrollRatio=e}getScrollTop(){return this.scrollTop}getScrollLeft(){return this.scrollLeft}getViewportWidth(){return this.viewportWidth}getViewportHeight(){return this.viewportHeight}resetScrollTop(){this.scrollTop=0}update(e,t,n,r){let i=this.getScrollRatio(),a=i<1?e/i:e,o=this.viewportWidth!==n||this.viewportHeight!==r,s=this.scrollTop!==a||this.scrollLeft!==t||o;return s&&(this.scrollTop=a,this.scrollLeft=t,this.viewportWidth=n,this.viewportHeight=r),{changed:s,viewportSizeChanged:o}}};const I=e=>e.replaceAll(`\r
2
2
  `,`
3
3
  `).replaceAll(`\r`,`
4
- `),Fe=e=>{let t=N(e).split(`
5
- `);return t.length>1&&t.at(-1)===``&&t.pop(),t.map(e=>e.split(` `).map(e=>({value:e,text:e})))},Ie=(e,t)=>{if(e.value===null)return{ok:!0,value:null};let n=e.text,r=n.trim();if(r.length===0)return Le(t);switch(t.cellDataType){case`text`:return{ok:!0,value:n};case`number`:return Re(e.value,r);case`boolean`:return ze(e.value,r);case`date`:case`dateTime`:return Be(e.value,r);case`dateString`:case`dateTimeString`:return Ve(r,n);case`object`:return He(e.value,r)}},Le=e=>e.cellDataType===`text`?{ok:!0,value:``}:{ok:!0,value:null},Re=(e,t)=>{if(typeof e==`number`&&Number.isFinite(e))return{ok:!0,value:e};let n=Number(t);return Number.isFinite(n)?{ok:!0,value:n}:{ok:!1}},ze=(e,t)=>{if(typeof e==`boolean`)return{ok:!0,value:e};let n=t.toLowerCase();return n===`true`?{ok:!0,value:!0}:n===`false`?{ok:!0,value:!1}:{ok:!1}},Be=(e,t)=>{if(e instanceof Date&&P(e))return{ok:!0,value:e};let n=new Date(t);return P(n)?{ok:!0,value:n}:{ok:!1}},Ve=(e,t)=>P(new Date(e))?{ok:!0,value:t}:{ok:!1},He=(e,t)=>{if(typeof e==`object`&&e&&!(e instanceof Date))return{ok:!0,value:e};try{let e=JSON.parse(t);if(typeof e==`object`&&e)return{ok:!0,value:e}}catch{return{ok:!1}}return{ok:!1}},P=e=>Number.isFinite(e.getTime());var F=class{state={activeCell:null,range:null,anchor:null,selectionMode:!1};options;emitter=v();clipboardSnapshot=null;onInstruction=this.emitter.onInstruction;emit=this.emitter.emit;constructor(e){this.options=e}getState(){return{...this.state}}getActiveCell(){return this.state.activeCell}getSelectionRange(){return this.state.range}isSelected(e,t){let{range:n}=this.state;if(!n)return!1;let{minRow:r,maxRow:i,minCol:a,maxCol:s}=o(n);return e>=r&&e<=i&&t>=a&&t<=s}isActiveCell(e,t){let{activeCell:n}=this.state;return n?.row===e&&n?.col===t}startSelection(e,t={}){let{shift:n=!1,ctrl:r=!1}=t,{row:i,col:a}=this.clampPosition(e);n&&this.state.anchor?(this.state.range={startRow:this.state.anchor.row,startCol:this.state.anchor.col,endRow:i,endCol:a},this.state.activeCell={row:i,col:a}):(this.state.activeCell={row:i,col:a},this.state.anchor={row:i,col:a},this.state.range=null),this.state.selectionMode=r,this.emit({type:`SET_ACTIVE_CELL`,position:this.state.activeCell}),this.emit({type:`SET_SELECTION_RANGE`,range:this.state.range})}moveFocus(e,t=!1){if(!this.state.activeCell){this.startSelection({row:0,col:0});return}let{row:n,col:r}=this.state.activeCell,i=n,a=r;switch(e){case`up`:i=Math.max(0,n-1);break;case`down`:i=Math.min(this.options.getRowCount()-1,n+1);break;case`left`:a=Math.max(0,r-1);break;case`right`:a=Math.min(this.options.getColumnCount()-1,r+1);break}t?(this.state.anchor??={row:n,col:r},this.state.range={startRow:this.state.anchor.row,startCol:this.state.anchor.col,endRow:i,endCol:a},this.state.activeCell={row:i,col:a},this.emit({type:`SET_ACTIVE_CELL`,position:this.state.activeCell}),this.emit({type:`SET_SELECTION_RANGE`,range:this.state.range})):(this.state.activeCell={row:i,col:a},this.state.anchor={row:i,col:a},this.state.range=null,this.emit({type:`SET_ACTIVE_CELL`,position:this.state.activeCell}),this.emit({type:`SET_SELECTION_RANGE`,range:null}))}selectAll(){let e=this.options.getRowCount(),t=this.options.getColumnCount();e===0||t===0||(this.state.range={startRow:0,startCol:0,endRow:e-1,endCol:t-1},this.state.activeCell||(this.state.activeCell={row:0,col:0},this.emit({type:`SET_ACTIVE_CELL`,position:this.state.activeCell})),this.emit({type:`SET_SELECTION_RANGE`,range:this.state.range}))}clearSelection(){this.state.activeCell=null,this.state.range=null,this.state.anchor=null,this.state.selectionMode=!1,this.emit({type:`SET_ACTIVE_CELL`,position:null}),this.emit({type:`SET_SELECTION_RANGE`,range:null})}setActiveCell(e,t){let n=this.clampPosition({row:e,col:t});this.state.activeCell=n,this.state.anchor=n,this.state.range=null,this.emit({type:`SET_ACTIVE_CELL`,position:this.state.activeCell}),this.emit({type:`SET_SELECTION_RANGE`,range:null})}setSelectionRange(e){this.state.range=e,this.emit({type:`SET_SELECTION_RANGE`,range:this.state.range})}getSelectedData(){let e=this.getEffectiveRange();if(e===null)return[];let{minRow:t,maxRow:n,minCol:r,maxCol:i}=o(e),a=[];for(let e=t;e<=n;e++){let t=[];for(let n=r;n<=i;n++)t.push(this.options.getCellValue(e,n));a.push(t)}return a}async copySelectionToClipboard(){let e=this.getEffectiveRange();if(e===null)return;let t=this.createClipboardSnapshot(e);t.cells.length!==0&&(this.clipboardSnapshot=t,!(typeof navigator>`u`||typeof document>`u`)&&await navigator.clipboard.writeText(t.text))}pasteClipboardText(e){let t=this.getEffectiveRange();if(t===null)return{handled:!1,changedCells:[]};let n=this.getPasteSourceCells(e);return n.length===0?{handled:!1,changedCells:[]}:{handled:!0,changedCells:this.applyPasteSource(n,t,this.state.range!==null)}}destroy(){this.emitter.clearListeners(),this.state={activeCell:null,range:null,anchor:null,selectionMode:!1},this.clipboardSnapshot=null}clampPosition(e){let t=this.options.getRowCount(),n=this.options.getColumnCount();return{row:Math.max(0,Math.min(e.row,t-1)),col:Math.max(0,Math.min(e.col,n-1))}}getEffectiveRange(){let{range:e,activeCell:t}=this.state;return e||(t?{startRow:t.row,startCol:t.col,endRow:t.row,endCol:t.col}:null)}createClipboardSnapshot(e){let{minRow:t,maxRow:n,minCol:r,maxCol:i}=o(e),a=[];for(let e=t;e<=n;e++){let t=[];for(let n=r;n<=i;n++){let r=this.options.getCellValue(e,n),i=y(r,this.options.getColumn(n)?.valueFormatter);t.push({value:r,text:i})}a.push(t)}return{cells:a,text:a.map(e=>e.map(e=>e.text).join(` `)).join(`
6
- `)}}getPasteSourceCells(e){let t=this.clipboardSnapshot;return t&&N(t.text)===N(e)?t.cells:Fe(e)}applyPasteSource(e,t,n){let r=[],{minRow:i,maxRow:a,minCol:s,maxCol:c}=o(t),l=this.isSingleSourceCell(e),u=l?a:i+e.length-1,d=l?c:s+this.getMaxSourceColumnCount(e)-1,f=n?Math.min(u,a):u,p=n?Math.min(d,c):d,m=this.options.getRowCount(),h=this.options.getColumnCount(),g=Math.min(f,m-1),_=Math.min(p,h-1);for(let t=i;t<=g;t++)for(let n=s;n<=_;n++){let a=this.getSourceCellForTarget(e,t-i,n-s,l);a&&this.applyPasteCell(t,n,a,r)}return r}applyPasteCell(e,t,n,r){let i=this.options.getColumn(t);if(i===void 0||i.hidden===!0||i.editable!==!0)return;let a=Ie(n,i);a.ok!==!1&&(this.options.setCellValue(e,t,a.value),r.push({row:e,col:t,value:a.value}))}getSourceCellForTarget(e,t,n,r){return r?e[0]?.[0]??null:e[t]?.[n]??null}isSingleSourceCell(e){return e.length===1&&e[0]?.length===1}getMaxSourceColumnCount(e){return e.reduce((e,t)=>Math.max(e,t.length),0)}},I=class{state=null;options;emitter=v();onInstruction=this.emitter.onInstruction;emit=this.emitter.emit;constructor(e){this.options=e}getState(){return this.state?{...this.state}:null}isActive(){return this.state!==null}startFillDrag(e){this.state={sourceRange:e,targetRow:e.endRow,targetCol:e.endCol},this.emit({type:`START_FILL`,sourceRange:e})}updateFillDrag(e,t){if(!this.state)return;let n=this.options.getRowCount(),r=this.options.getColumnCount();e=Math.max(0,Math.min(e,n-1)),t=Math.max(0,Math.min(t,r-1)),this.state.targetRow=e,this.state.targetCol=t,this.emit({type:`UPDATE_FILL`,targetRow:e,targetCol:t})}commitFillDrag(){if(!this.state)return;let{sourceRange:e,targetRow:t}=this.state,n=this.calculateFilledCells(e,t);for(let{row:e,col:t,value:r}of n)this.options.setCellValue(e,t,r);this.emit({type:`COMMIT_FILL`,filledCells:n}),this.state=null}cancelFillDrag(){this.state&&(this.state=null,this.emit({type:`CANCEL_FILL`}))}destroy(){this.emitter.clearListeners(),this.state=null}calculateFilledCells(e,t){let n=[],{minRow:r,maxRow:i,minCol:a,maxCol:s}=o(e),c=t>i,l=t<r;if(c||l)for(let e=a;e<=s;e++){let a=this.getSourceColumnValues(r,i,e),o=this.detectPattern(a);if(c)for(let r=i+1;r<=t;r++){let t=r-i-1,s=this.applyPattern(o,a,t);n.push({row:r,col:e,value:s})}else if(l)for(let i=r-1;i>=t;i--){let t=r-i-1,s=this.applyPattern(o,a,t,!0);n.push({row:i,col:e,value:s})}}return n}getSourceColumnValues(e,t,n){let r=[];for(let i=e;i<=t;i++)r.push(this.options.getCellValue(i,n));return r}detectPattern(e){if(e.length===0)return{type:`constant`,value:null};if(e.length===1)return{type:`constant`,value:e[0]??null};let t=e.map(e=>typeof e==`number`?e:Number(e));if(t.every(e=>!Number.isNaN(e))){let e=[];for(let n=1;n<t.length;n++)e.push(t[n]-t[n-1]);if(e.every(t=>t===e[0])&&e[0]!==void 0)return{type:`arithmetic`,start:t[0],step:e[0]}}return{type:`repeat`,values:e}}applyPattern(e,t,n,r=!1){switch(e.type){case`constant`:return e.value;case`arithmetic`:{let i=r?-(n+1):n+1;return(r?e.start:e.start+e.step*(t.length-1))+e.step*i}case`repeat`:{let t=e.values.length;if(t===0)return null;if(r){let r=(t-1-n%t+t)%t;return e.values[r]??null}return e.values[n%t]??null}}}},L=class{state={slots:new Map,rowToSlot:new Map,nextSlotId:0};options;emitter=ee();isDestroyed=!1;onInstruction=this.emitter.onInstruction;onBatchInstruction=this.emitter.onBatchInstruction;emit=this.emitter.emit;emitBatch=this.emitter.emitBatch;constructor(e){this.options=e}getSlotForRow(e){return this.state.rowToSlot.get(e)}getSlots(){return this.state.slots}syncSlots(){let e=this.options.getScrollTop(),t=this.options.getRowHeight(),n=this.options.getViewportHeight(),r=this.options.getTotalRows(),i=this.options.getOverscan(),a=n,o=Math.max(0,Math.floor(e/t)-i),s=Math.min(r-1,Math.ceil((e+a)/t)+i);if(r===0||s<o){this.destroyAllSlots();return}let c=new Set;for(let e=o;e<=s;e++)c.add(e);let l=[],u=this.partitionSlots(c),d=0;for(let e of c){let t=this.options.getRowData(e);if(t===void 0)continue;let n=d<u.length?u[d++]:void 0;this.assignSlotToRow(e,t,n,l)}for(let e=d;e<u.length;e++){let t=u[e];this.state.slots.delete(t),l.push({type:`DESTROY_SLOT`,slotId:t})}this.updateSlotPositions(l),this.emitBatch(l)}partitionSlots(e){let t=[];for(let[n,r]of this.state.slots)e.has(r.rowIndex)?e.delete(r.rowIndex):(t.push(n),this.state.rowToSlot.delete(r.rowIndex));return t}assignSlotToRow(e,t,n,r){let i;if(n===void 0)i=`slot-${this.state.nextSlotId++}`,this.state.slots.set(i,{slotId:i,rowIndex:e,rowData:t,translateY:this.getRowTranslateY(e)}),r.push({type:`CREATE_SLOT`,slotId:i});else{i=n;let r=this.state.slots.get(i);r.rowIndex=e,r.rowData=t,r.translateY=this.getRowTranslateY(e)}this.state.rowToSlot.set(e,i),r.push({type:`ASSIGN_SLOT`,slotId:i,rowIndex:e,rowData:t},{type:`MOVE_SLOT`,slotId:i,translateY:this.getRowTranslateY(e)})}updateSlotPositions(e){for(let[t,n]of this.state.slots){let r=this.getRowTranslateY(n.rowIndex);n.translateY!==r&&(n.translateY=r,e.push({type:`MOVE_SLOT`,slotId:t,translateY:r}))}}destroyAllSlots(){let e=[];for(let t of this.state.slots.keys())e.push({type:`DESTROY_SLOT`,slotId:t});this.state.slots.clear(),this.state.rowToSlot.clear(),this.emitBatch(e)}destroy(){this.isDestroyed||(this.isDestroyed=!0,this.state.slots.clear(),this.state.rowToSlot.clear(),this.emitter.clearListeners())}refreshAllSlots(){let e=[],t=this.options.getTotalRows();for(let[n,r]of this.state.slots)if(r.rowIndex>=0&&r.rowIndex<t){let t=this.options.getRowData(r.rowIndex);if(t===void 0)continue;let i=this.getRowTranslateY(r.rowIndex);r.rowData=t,r.translateY=i,e.push({type:`ASSIGN_SLOT`,slotId:n,rowIndex:r.rowIndex,rowData:t},{type:`MOVE_SLOT`,slotId:n,translateY:i})}this.emitBatch(e),this.syncSlots()}updateSlot(e){let t=this.state.rowToSlot.get(e);if(t){let n=this.options.getRowData(e);n&&this.emit({type:`ASSIGN_SLOT`,slotId:t,rowIndex:e,rowData:n})}}getRowTranslateY(e){let t=this.options.getRowHeight(),n=this.options.getScrollRatio(),r=this.options.getScrollTop(),i=e*t;return n>=1?i:i-Math.floor(r/t)*t}getRowTranslateYForIndex(e){return this.getRowTranslateY(e)}getRowsWrapperOffset(){let e=this.options.getScrollRatio(),t=this.options.getScrollTop(),n=this.options.getRowHeight();if(e>=1)return 0;let r=t%n;return t*e-r}},R=class{editState=null;peekState=null;options;emitter=v();onInstruction=this.emitter.onInstruction;emit=this.emitter.emit;constructor(e){this.options=e}getState(){return this.editState?{...this.editState}:null}isEditing(){return this.editState!==null}isEditingCell(e,t){return this.editState!==null&&this.editState.row===e&&this.editState.col===t}startEdit(e,t){if(!this.options.getColumn(t)?.editable)return!1;this.peekState!==null&&this.stopPeek();let n=this.options.getCellValue(e,t);return this.editState={row:e,col:t,initialValue:n,currentValue:n},this.emit({type:`START_EDIT`,row:e,col:t,initialValue:n}),!0}getPeekState(){return this.peekState?{...this.peekState}:null}startPeek(e,t){return this.editState===null?(this.peekState={row:e,col:t},this.emit({type:`START_PEEK`,row:e,col:t}),!0):!1}stopPeek(){this.peekState!==null&&(this.peekState=null,this.emit({type:`STOP_PEEK`}))}updateValue(e){this.editState&&(this.editState.currentValue=e)}commit(){if(!this.editState)return;let{row:e,col:t,currentValue:n}=this.editState;this.options.setCellValue(e,t,n),this.emit({type:`COMMIT_EDIT`,row:e,col:t,value:n}),this.editState=null,this.emit({type:`STOP_EDIT`}),this.options.onCommit?.(e,t,n)}cancel(){this.editState=null,this.emit({type:`STOP_EDIT`})}destroy(){this.emitter.clearListeners(),this.editState=null,this.peekState=null}};const Ue=e=>{let{batcher:t}=e,n,r=new A({getRowHeight:e.getRowHeight,getHeaderHeight:e.getHeaderHeight,getTotalRows:e.getTotalRows,getScrollTop:()=>n.getScrollTop(),getViewportHeight:()=>n.getViewportHeight()});n=new Pe(()=>r.getScrollRatio());let i=null,a=new F({getRowCount:e.getTotalRows,getColumnCount:()=>e.getColumns().length,getCellValue:e.getCellValue,getRowData:t=>e.getCachedRows().get(t),getColumn:t=>e.getColumns()[t],setCellValue:e.setCellValue});a.onInstruction(e=>{t.emit(e),i?.onSelectionChange()}),e.highlighting&&(i=new C({getActiveCell:()=>a.getActiveCell(),getSelectionRange:()=>a.getSelectionRange(),getColumn:t=>e.getColumns()[t]},e.highlighting),i.onInstruction(e=>t.emit(e)));let o=new I({getRowCount:e.getTotalRows,getColumnCount:()=>e.getColumns().length,getCellValue:e.getCellValue,getColumn:t=>e.getColumns()[t],setCellValue:e.setCellValue});o.onInstruction(e=>t.emit(e));let s=new L({getRowHeight:e.getRowHeight,getHeaderHeight:e.getHeaderHeight,getOverscan:e.getOverscan,getScrollTop:()=>n.getScrollTop(),getViewportHeight:()=>n.getViewportHeight(),getTotalRows:e.getTotalRows,getScrollRatio:()=>r.getScrollRatio(),getVirtualContentHeight:()=>r.getVirtualContentHeight(),getRowData:t=>e.getCachedRows().get(t)});s.onBatchInstruction(e=>t.emitBatch(e));let c=new R({getColumn:t=>e.getColumns()[t],getCellValue:e.getCellValue,setCellValue:e.setCellValue,onCommit:e=>s.updateSlot(e)});c.onInstruction(e=>t.emit(e));let l=new j({getColumns:e.getColumns,isSortingEnabled:e.getSortingEnabled,getCachedRows:e.getCachedRows,onSortFilterChange:async()=>{await e.fetchData(),i?.clearAllCaches(),n.resetScrollTop(),t.start();try{t.emit({type:`SCROLL_TO`,scrollTop:0}),e.emitContentSize(),e.emitHeaders(),s.refreshAllSlots()}finally{t.flush()}},onDataRefreshed:()=>{}});l.onInstruction(e=>t.emit(e));let u=new w({getCachedRows:e.getCachedRows,setCachedRows:e.setCachedRows,getTotalRows:e.getTotalRows,setTotalRows:e.setTotalRows,updateSlot:e=>s.updateSlot(e),refreshAllSlots:()=>s.refreshAllSlots(),emitContentSize:e.emitContentSize,clearSelectionIfInvalid:e.clearSelectionIfInvalid});return u.onInstruction(e=>t.emit(e)),{selection:a,highlight:i,fill:o,scrollVirtualization:r,viewport:n,slotPool:s,editManager:c,sortFilter:l,rowMutation:u}},We=e=>{let t=e.columnPositions.at(-1)??0;e.scrollVirtualization.updateContentSize(),e.batcher.emit({type:`SET_CONTENT_SIZE`,width:t,height:e.scrollVirtualization.getVirtualHeight(),viewportWidth:e.viewport.getViewportWidth(),viewportHeight:e.viewport.getViewportHeight(),rowsWrapperOffset:e.slotPool.getRowsWrapperOffset()})},Ge=e=>{let t=e.sortFilter.getSortInfoMap();for(let n=0;n<e.columns.length;n++){let r=e.columns[n],i=r.colId??r.field,a=t.get(i);e.batcher.emit({type:`UPDATE_HEADER`,colIndex:n,column:r,sortDirection:a?.direction,sortIndex:a?.index,hasFilter:e.sortFilter.hasActiveFilter(i)})}},Ke=e=>{let t=e.scrollVirtualization.getVisibleRowRange();e.batcher.emit({type:`UPDATE_VISIBLE_RANGE`,start:t.start,end:t.end,rowsWrapperOffset:e.slotPool.getRowsWrapperOffset()})};var qe=class{columns;rowHeight;headerHeight;overscan;sortingEnabled;getRowId;onCellValueChanged;rowDragEntireRow;onRowDragEnd;onColumnResized;onColumnMoved;viewport;scrollTopOverride=null;rowData;selection;fill;input;highlight;sortFilter;rowMutation;slotPool;editManager;columnPositions=[];batcher=new Ne;scrollVirtualization;isDestroyed=!1;constructor(e){if(this.columns=e.columns,this.rowHeight=e.rowHeight,this.headerHeight=e.headerHeight??e.rowHeight,this.overscan=e.overscan??3,this.sortingEnabled=e.sortingEnabled??!0,this.getRowId=e.getRowId,this.onCellValueChanged=e.onCellValueChanged,this.rowDragEntireRow=e.rowDragEntireRow??!1,this.onRowDragEnd=e.onRowDragEnd,this.onColumnResized=e.onColumnResized,this.onColumnMoved=e.onColumnMoved,this.onCellValueChanged&&!this.getRowId)throw Error(`getRowId is required when onCellValueChanged is provided`);this.computeColumnPositions();let t,n,r;this.rowData=new O({dataSource:e.dataSource,rowLoading:e.rowLoading,batcher:this.batcher,getColumns:()=>this.columns,getSortModel:()=>r.getSortModel(),getFilterModel:()=>r.getFilterModel(),getRowHeight:()=>this.rowHeight,getOverscan:()=>this.overscan,getScrollTop:()=>t.getScrollTop(),getViewportHeight:()=>t.getViewportHeight(),onCellValueChanged:this.onCellValueChanged,getRowId:this.getRowId,syncSlots:()=>n.syncSlots(),emitVisibleRange:()=>this.emitVisibleRange(),emitContentSize:()=>this.emitContentSize()});let i=Ue({batcher:this.batcher,highlighting:e.highlighting,getColumns:()=>this.columns,getCachedRows:()=>this.rowData.getCachedRows(),setCachedRows:e=>this.rowData.setCachedRows(e),getTotalRows:()=>this.rowData.getTotalRows(),setTotalRows:e=>this.rowData.setTotalRows(e),getRowHeight:()=>this.rowHeight,getHeaderHeight:()=>this.headerHeight,getOverscan:()=>this.overscan,getSortingEnabled:()=>this.sortingEnabled,getCellValue:(e,t)=>this.getCellValue(e,t),setCellValue:(e,t,n)=>this.setCellValue(e,t,n),emitContentSize:()=>this.emitContentSize(),emitHeaders:()=>this.emitHeaders(),fetchData:()=>this.rowData.loadInitial(),clearSelectionIfInvalid:e=>this.clearSelectionIfInvalid(e)});this.selection=i.selection,this.highlight=i.highlight,this.fill=i.fill,this.scrollVirtualization=i.scrollVirtualization,this.viewport=i.viewport,this.slotPool=i.slotPool,this.editManager=i.editManager,this.sortFilter=i.sortFilter,this.rowMutation=i.rowMutation,t=this.viewport,n=this.slotPool,r=this.sortFilter,this.input=new S(this,{getHeaderHeight:()=>this.headerHeight,getRowHeight:()=>this.rowHeight,getColumnPositions:()=>this.columnPositions,getColumnCount:()=>this.columns.length})}onBatchInstruction(e){return this.batcher.subscribe(e)}async initialize(){await this.rowData.loadInitial(),this.slotPool.syncSlots(),this.emitContentSize(),this.emitHeaders()}setViewport(e,t,n,r){let{changed:i,viewportSizeChanged:a}=this.viewport.update(this.scrollTopOverride??e,t,n,r);i&&(this.rowData.requestVisibleRows(),this.slotPool.syncSlots(),this.emitVisibleRange(),a&&this.emitContentSize())}async setSort(e,t,n=!1){if(!this.rowData.isLoading())return this.sortFilter.setSort(e,t,n)}async setFilter(e,t){if(!this.rowData.isLoading())return this.sortFilter.setFilter(e,t)}hasActiveFilter(e){return this.sortFilter.hasActiveFilter(e)}getDistinctValuesForColumn(e,t=500){return this.sortFilter.getDistinctValuesForColumn(e,t)}openFilterPopup(e,t){this.rowData.isLoading()||this.sortFilter.openFilterPopup(e,t)}closeFilterPopup(){this.sortFilter.closeFilterPopup()}getSortModel(){return this.sortFilter.getSortModel()}getFilterModel(){return this.sortFilter.getFilterModel()}startEdit(e,t){this.editManager.startEdit(e,t)}startPeek(e,t){let n=this.columns[t];return!n||n.peekable===!1?!1:this.editManager.startPeek(e,t)}stopPeek(){this.editManager.stopPeek()}getPeekState(){return this.editManager.getPeekState()}updateEditValue(e){this.editManager.updateValue(e)}commitEdit(){this.editManager.commit()}cancelEdit(){this.editManager.cancel()}pasteClipboardText(e){if(this.editManager.getState())return!1;let t=this.selection.pasteClipboardText(e);return t.changedCells.length>0&&this.refreshSlotData(),t.handled}getEditState(){return this.editManager.getState()}getCellValue(e,t){return this.rowData.getCellValue(e,t)}setCellValue(e,t,n){this.rowData.setCellValue(e,t,n)}clearSelectionIfInvalid(e){let t=this.selection.getActiveCell();t&&t.row>=e&&this.selection.clearSelection()}computeColumnPositions(){this.columnPositions=ue(this.columns)}emitContentSize(){We({batcher:this.batcher,scrollVirtualization:this.scrollVirtualization,slotPool:this.slotPool,viewport:this.viewport,columnPositions:this.columnPositions})}emitHeaders(){Ge({batcher:this.batcher,sortFilter:this.sortFilter,columns:this.columns})}emitVisibleRange(){Ke({batcher:this.batcher,scrollVirtualization:this.scrollVirtualization,slotPool:this.slotPool})}setColumnWidth(e,t){ke(e,t,this.viewport.getViewportWidth(),{batcher:this.batcher,slotPool:this.slotPool,refreshSlots:`sync`,computeColumnPositions:()=>this.computeColumnPositions(),emitContentSize:()=>this.emitContentSize(),emitHeaders:()=>this.emitHeaders(),columns:this.columns,onComplete:()=>this.onColumnResized?.(e,t)})}moveColumn(e,t){let n=Ae(e,t,{batcher:this.batcher,slotPool:this.slotPool,refreshSlots:`all`,computeColumnPositions:()=>this.computeColumnPositions(),emitContentSize:()=>this.emitContentSize(),emitHeaders:()=>this.emitHeaders(),columns:this.columns,onComplete:()=>{}});n!==null&&this.onColumnMoved?.(e,n)}commitRowDrag(e,t){je(e,t,{dataSource:this.rowData.getDataSource(),cachedRows:this.rowData.getCachedRows(),slotPool:this.slotPool,highlight:this.highlight}),this.onRowDragEnd?.(e,t)}isRowDragEntireRow(){return this.rowDragEntireRow}getColumns(){return this.columns}getColumnPositions(){return[...this.columnPositions]}getRowCount(){return this.rowData.getTotalRows()}getRowHeight(){return this.rowHeight}getHeaderHeight(){return this.headerHeight}getTotalWidth(){return this.columnPositions.at(-1)??0}getTotalHeight(){return this.scrollVirtualization.getVirtualHeight()}isScalingActive(){return this.scrollVirtualization.isScalingActive()}setScrollTopOverride(e){this.scrollTopOverride=e}getNaturalHeight(){return this.scrollVirtualization.getNaturalHeight()}getScrollRatio(){return this.scrollVirtualization.getScrollRatio()}getVisibleRowRange(){return this.scrollVirtualization.getVisibleRowRange()}getScrollTopForRow(e){return this.scrollVirtualization.getScrollTopForRow(e)}getRowIndexAtDisplayY(e,t){return this.scrollVirtualization.getRowIndexAtDisplayY(e,t)}getRowTranslateY(e){return this.slotPool.getRowTranslateYForIndex(e)}getRowData(e){return this.rowData.getRowData(e)}async refresh(){await this.rowData.loadInitial(),this.highlight?.clearAllCaches(),this.slotPool.refreshAllSlots(),this.emitContentSize(),this.emitVisibleRange()}async refreshFromTransaction(){await this.rowData.refreshFromTransaction(),this.highlight?.clearAllCaches(),this.slotPool.refreshAllSlots(),this.emitContentSize(),this.emitVisibleRange()}refreshSlotData(){this.slotPool.refreshAllSlots()}addRows(e,t){this.rowMutation.addRows(e,t)}updateRows(e){this.rowMutation.updateRows(e)}deleteRows(e){this.rowMutation.deleteRows(e)}getRow(e){return this.rowMutation.getRow(e)}setRow(e,t){this.rowMutation.setRow(e,t)}async setDataSource(e){this.editManager.getState()&&this.editManager.cancel(),this.rowData.setDataSource(e),await this.refresh(),this.clearSelectionIfInvalid(this.rowData.getTotalRows())}setColumns(e){this.columns=e,this.computeColumnPositions(),this.emitContentSize(),this.emitHeaders(),this.slotPool.syncSlots()}destroy(){this.isDestroyed||(this.isDestroyed=!0,this.slotPool.destroy(),this.highlight?.destroy(),this.sortFilter.destroy(),this.rowMutation.destroy(),this.rowData.destroy(),this.batcher.clearListeners())}},z=class{workerCode;maxWorkers;workers=[];workerUrl=null;nextRequestId=0;isTerminated=!1;constructor(e,t={}){this.workerCode=e;let n=typeof navigator>`u`?4:navigator.hardwareConcurrency;this.maxWorkers=Math.max(1,t.maxWorkers??n??4),t.preWarm&&this.preWarmWorkers()}getPoolSize(){return this.workers.length}getMaxWorkers(){return this.maxWorkers}isAvailable(){return!this.isTerminated&&typeof Worker<`u`}async execute(e,t){if(this.isTerminated)throw Error(`WorkerPool has been terminated`);if(typeof Worker>`u`)throw TypeError(`Web Workers are not available in this environment`);let n=this.getAvailableWorker(),r=this.nextRequestId++,i={...e,id:r};return new Promise((e,a)=>{n.pendingRequests.set(r,{resolve:e,reject:a}),n.busy=!0,t&&t.length>0?n.worker.postMessage(i,t):n.worker.postMessage(i)})}async executeParallel(e){if(this.isTerminated)throw Error(`WorkerPool has been terminated`);if(e.length===0)return[];let t=Math.min(e.length,this.maxWorkers);this.ensureWorkers(t);let n=e.map((e,t)=>{let n=t%this.workers.length,r=this.workers[n],i=this.nextRequestId++,a={...e.request,id:i};return new Promise((t,n)=>{r.pendingRequests.set(i,{resolve:t,reject:n}),r.busy=!0,e.transferables&&e.transferables.length>0?r.worker.postMessage(a,e.transferables):r.worker.postMessage(a)})});return Promise.all(n)}terminate(){for(let e of this.workers){e.worker.terminate();for(let[,t]of e.pendingRequests)t.reject(Error(`Worker pool terminated`));e.pendingRequests.clear()}this.workers=[],this.workerUrl&&=(URL.revokeObjectURL(this.workerUrl),null),this.isTerminated=!0}preWarmWorkers(){this.ensureWorkers(this.maxWorkers)}ensureWorkers(e){let t=Math.min(e,this.maxWorkers)-this.workers.length;for(let e=0;e<t;e++)this.createWorker()}getAvailableWorker(){return this.workers.find(e=>!e.busy)||(this.workers.length<this.maxWorkers?this.createWorker():this.workers.reduce((e,t)=>t.pendingRequests.size<e.pendingRequests.size?t:e,this.workers[0]))}createWorker(){if(!this.workerUrl){let e=new Blob([this.workerCode],{type:`application/javascript`});this.workerUrl=URL.createObjectURL(e)}let e=new Worker(this.workerUrl),t={worker:e,busy:!1,pendingRequests:new Map};return e.onmessage=e=>{let{id:n}=e.data,r=t.pendingRequests.get(n);r&&(t.pendingRequests.delete(n),t.pendingRequests.size===0&&(t.busy=!1),e.data.type===`error`?r.reject(Error(e.data.error)):r.resolve(e.data))},e.onerror=e=>{for(let[,n]of t.pendingRequests)n.reject(Error(`Worker error: ${e.message}`));t.pendingRequests.clear(),t.busy=!1,this.respawnWorker(t)},this.workers.push(t),t}respawnWorker(e){let t=this.workers.indexOf(e);if(t!==-1){try{e.worker.terminate()}catch{}this.workers.splice(t,1),this.workers.length<this.maxWorkers&&!this.isTerminated&&this.createWorker()}}};function B(e,t){let n=t.split(`.`),r=e;for(let e of n){if(typeof r!=`object`||!r)return null;r=r[e]}return r}const V=e=>e==null?``:Array.isArray(e)?e.join(`, `):typeof e==`object`&&!(e instanceof Date)?JSON.stringify(e):String(e);function Je(e,t){if(e==null&&t==null)return 0;if(e==null)return 1;if(t==null)return-1;let n=Number(e),r=Number(t);return!Number.isNaN(n)&&!Number.isNaN(r)?n-r:e instanceof Date&&t instanceof Date?e.getTime()-t.getTime():V(e).localeCompare(V(t))}function Ye(e,t){return[...e].sort((e,n)=>{for(let{colId:r,direction:i}of t){let t=Je(B(e,r),B(n,r));if(t!==0)return i===`asc`?t:-t}return 0})}const H=globalThis;H.onmessage!==void 0&&(H.onmessage=e=>{let{type:t,id:n,data:r,sortModel:i}=e.data;if(t===`sort`)try{let e=Ye(r,i);H.postMessage?.({type:`sorted`,id:n,data:e})}catch(e){H.postMessage?.({type:`error`,id:n,error:String(e)})}});var Xe=class{heap=[];compare;constructor(e){this.compare=e}push(e){this.heap.push(e),this.bubbleUp(this.heap.length-1)}pop(){if(this.heap.length===0)return;let e=this.heap[0],t=this.heap.pop();return this.heap.length>0&&t&&(this.heap[0]=t,this.bubbleDown(0)),e}size(){return this.heap.length}bubbleUp(e){for(;e>0;){let t=Math.floor((e-1)/2);if(this.compare(this.heap[e],this.heap[t])>=0)break;this.swap(e,t),e=t}}bubbleDown(e){let t=this.heap.length;for(;;){let n=2*e+1,r=2*e+2,i=e;if(n<t&&this.compare(this.heap[n],this.heap[i])<0&&(i=n),r<t&&this.compare(this.heap[r],this.heap[i])<0&&(i=r),i===e)break;this.swap(e,i),e=i}}swap(e,t){let n=this.heap[e];this.heap[e]=this.heap[t],this.heap[t]=n}};const Ze=(e,t,n)=>{let r=[];for(let i=0;i<n;i++)r.push(e.columns[i][t]);return r};function U(e,t){if(e.length===0)return new Uint32Array;if(e.length===1){let t=e[0],n=new Uint32Array(t.indices.length);for(let e=0;e<t.indices.length;e++)n[e]=t.indices[e]+t.offset;return n}let n=0;for(let t of e)n+=t.indices.length;let r=new Uint32Array(n),i=t===`asc`?1:-1,a=new Xe((e,t)=>(e.value-t.value)*i);for(let t=0;t<e.length;t++){let n=e[t];if(n.indices.length>0){let e=n.indices[0];a.push({chunkIndex:t,positionInChunk:0,value:n.values[0],globalIndex:e+n.offset})}}let o=0;for(;a.size()>0;){let t=a.pop();r[o++]=t.globalIndex;let n=e[t.chunkIndex],i=t.positionInChunk+1;if(i<n.indices.length){let e=n.indices[i];a.push({chunkIndex:t.chunkIndex,positionInChunk:i,value:n.values[i],globalIndex:e+n.offset})}}return r}function Qe(e){if(e.length===0)return new Uint32Array;if(e.length===1){let t=e[0],n=new Uint32Array(t.indices.length);for(let e=0;e<t.indices.length;e++)n[e]=t.indices[e]+t.offset;return n}let t=e[0].directions,n=t.length,r=0;for(let t of e)r+=t.indices.length;let i=new Uint32Array(r),a=new Xe((e,n)=>{for(let r=0;r<t.length;r++){let i=(e.values[r]-n.values[r])*t[r];if(i!==0)return i}return 0});for(let t=0;t<e.length;t++){let r=e[t];if(r.indices.length>0){let e=r.indices[0];a.push({chunkIndex:t,positionInChunk:0,values:Ze(r,0,n),globalIndex:e+r.offset})}}let o=0;for(;a.size()>0;){let t=a.pop();i[o++]=t.globalIndex;let r=e[t.chunkIndex],s=t.positionInChunk+1;if(s<r.indices.length){let e=r.indices[s];a.push({chunkIndex:t.chunkIndex,positionInChunk:s,values:Ze(r,s,n),globalIndex:e+r.offset})}}return i}function $e(e,t){if(e.length<=1)return new Uint32Array;let n=[],r=0;for(let t=0;t<e.length-1;t++){let i=e[t],a=e[t+1];if(i.indices.length===0||a.indices.length===0){r+=i.indices.length;continue}let o=i.indices.length-1,s=i.values[o],c=a.values[0];if(s===c){let e=o;for(;e>0&&i.values[e-1]===s;)e--;let t=0;for(;t<a.indices.length-1&&a.values[t+1]===c;)t++;let l=r+e,u=r+i.indices.length+t+1;n.push(l,u)}r+=i.indices.length}return new Uint32Array(n)}const et=(e,t,n)=>{let r=Math.max(n,Math.ceil(e/t)),i=[];for(let t=0;t<e;t+=r)i.push({offset:t,length:Math.min(r,e-t)});return i},tt=e=>{if(e.length<=1)return[];let t=[],n=0;for(let r=0;r<e.length-1;r++){let i=e[r],a=e[r+1];if(i.indices.length===0||a.indices.length===0){n+=i.indices.length;continue}let o=i.values[i.indices.length-1],s=a.values[0];if(o===s){let e=i.indices.length-1;for(;e>0&&i.values[e-1]===o;)e--;let r=0;for(;r<a.indices.length-1&&a.values[r+1]===s;)r++;t.push(n+e,n+i.indices.length+r+1)}n+=i.indices.length}return t},nt=(e,t,n,r)=>{let i=r===`asc`?1:-1;for(let r=0;r<t.length;r+=2){let a=t[r],o=t[r+1];o<=a||o>e.length||rt(e,a,o,n,i)}},rt=(e,t,n,r,i)=>{let a=Array.from(e.slice(t,n));if(!it(a,r)){a.sort((e,t)=>i*r[e].localeCompare(r[t]));for(let n=0;n<a.length;n++)e[t+n]=a[n]}},it=(e,t)=>{let n=t[e[0]];for(let r=1;r<e.length;r++)if(t[e[r]]!==n)return!1;return!0};var W=class{pool;parallelThreshold;minChunkSize;isTerminated=!1;constructor(e={}){let t=e.maxWorkers??(navigator===void 0?4:navigator.hardwareConcurrency)??4;this.pool=new z(`
4
+ `),ze=e=>{let t=I(e).split(`
5
+ `);return t.length>1&&t.at(-1)===``&&t.pop(),t.map(e=>e.split(` `).map(e=>({value:e,text:e})))},Be=(e,t)=>{if(e.value===null)return{ok:!0,value:null};let n=e.text,r=n.trim();if(r.length===0)return Ve(t);switch(t.cellDataType){case`text`:return{ok:!0,value:n};case`number`:return He(e.value,r);case`boolean`:return Ue(e.value,r);case`date`:case`dateTime`:return We(e.value,r);case`dateString`:case`dateTimeString`:return Ge(r,n);case`object`:return Ke(e.value,r)}},Ve=e=>e.cellDataType===`text`?{ok:!0,value:``}:{ok:!0,value:null},He=(e,t)=>{if(typeof e==`number`&&Number.isFinite(e))return{ok:!0,value:e};let n=Number(t);return Number.isFinite(n)?{ok:!0,value:n}:{ok:!1}},Ue=(e,t)=>{if(typeof e==`boolean`)return{ok:!0,value:e};let n=t.toLowerCase();return n===`true`?{ok:!0,value:!0}:n===`false`?{ok:!0,value:!1}:{ok:!1}},We=(e,t)=>{if(e instanceof Date&&L(e))return{ok:!0,value:e};let n=new Date(t);return L(n)?{ok:!0,value:n}:{ok:!1}},Ge=(e,t)=>{let n=new Date(e);return L(n)?{ok:!0,value:t}:{ok:!1}},Ke=(e,t)=>{if(typeof e==`object`&&e&&!(e instanceof Date))return{ok:!0,value:e};try{let e=JSON.parse(t);if(typeof e==`object`&&e)return{ok:!0,value:e}}catch{return{ok:!1}}return{ok:!1}},L=e=>Number.isFinite(e.getTime());var R=class{state={activeCell:null,range:null,anchor:null,selectionMode:!1};options;emitter=v();clipboardSnapshot=null;onInstruction=this.emitter.onInstruction;emit=this.emitter.emit;constructor(e){this.options=e}getState(){return{...this.state}}getActiveCell(){return this.state.activeCell}getSelectionRange(){return this.state.range}isSelected(e,t){let{range:n}=this.state;if(!n)return!1;let{minRow:r,maxRow:i,minCol:a,maxCol:s}=o(n);return e>=r&&e<=i&&t>=a&&t<=s}isActiveCell(e,t){let{activeCell:n}=this.state;return n?.row===e&&n?.col===t}startSelection(e,t={}){let{shift:n=!1,ctrl:r=!1}=t,{row:i,col:a}=this.clampPosition(e);n&&this.state.anchor?(this.state.range={startRow:this.state.anchor.row,startCol:this.state.anchor.col,endRow:i,endCol:a},this.state.activeCell={row:i,col:a}):(this.state.activeCell={row:i,col:a},this.state.anchor={row:i,col:a},this.state.range=null),this.state.selectionMode=r,this.emit({type:`SET_ACTIVE_CELL`,position:this.state.activeCell}),this.emit({type:`SET_SELECTION_RANGE`,range:this.state.range})}moveFocus(e,t=!1){if(!this.state.activeCell){this.startSelection({row:0,col:0});return}let{row:n,col:r}=this.state.activeCell,i=n,a=r;switch(e){case`up`:i=Math.max(0,n-1);break;case`down`:i=Math.min(this.options.getRowCount()-1,n+1);break;case`left`:a=Math.max(0,r-1);break;case`right`:a=Math.min(this.options.getColumnCount()-1,r+1);break}t?(this.state.anchor??={row:n,col:r},this.state.range={startRow:this.state.anchor.row,startCol:this.state.anchor.col,endRow:i,endCol:a},this.state.activeCell={row:i,col:a},this.emit({type:`SET_ACTIVE_CELL`,position:this.state.activeCell}),this.emit({type:`SET_SELECTION_RANGE`,range:this.state.range})):(this.state.activeCell={row:i,col:a},this.state.anchor={row:i,col:a},this.state.range=null,this.emit({type:`SET_ACTIVE_CELL`,position:this.state.activeCell}),this.emit({type:`SET_SELECTION_RANGE`,range:null}))}selectAll(){let e=this.options.getRowCount(),t=this.options.getColumnCount();e!==0&&t!==0&&(this.state.range={startRow:0,startCol:0,endRow:e-1,endCol:t-1},this.state.activeCell||(this.state.activeCell={row:0,col:0},this.emit({type:`SET_ACTIVE_CELL`,position:this.state.activeCell})),this.emit({type:`SET_SELECTION_RANGE`,range:this.state.range}))}clearSelection(){this.state.activeCell=null,this.state.range=null,this.state.anchor=null,this.state.selectionMode=!1,this.emit({type:`SET_ACTIVE_CELL`,position:null}),this.emit({type:`SET_SELECTION_RANGE`,range:null})}setActiveCell(e,t){let n=this.clampPosition({row:e,col:t});this.state.activeCell=n,this.state.anchor=n,this.state.range=null,this.emit({type:`SET_ACTIVE_CELL`,position:this.state.activeCell}),this.emit({type:`SET_SELECTION_RANGE`,range:null})}setSelectionRange(e){this.state.range=e,this.emit({type:`SET_SELECTION_RANGE`,range:this.state.range})}getSelectedData(){let e=this.getEffectiveRange();if(e===null)return[];let{minRow:t,maxRow:n,minCol:r,maxCol:i}=o(e),a=[];for(let e=t;e<=n;e++){let t=[];for(let n=r;n<=i;n++)t.push(this.options.getCellValue(e,n));a.push(t)}return a}async copySelectionToClipboard(){let e=this.getEffectiveRange();if(e===null)return;let t=this.createClipboardSnapshot(e);t.cells.length!==0&&(this.clipboardSnapshot=t,!(typeof navigator>`u`||typeof document>`u`)&&await navigator.clipboard.writeText(t.text))}pasteClipboardText(e){let t=this.getEffectiveRange();if(t===null)return{handled:!1,changedCells:[]};let n=this.getPasteSourceCells(e);return n.length===0?{handled:!1,changedCells:[]}:{handled:!0,changedCells:this.applyPasteSource(n,t,this.state.range!==null)}}destroy(){this.emitter.clearListeners(),this.state={activeCell:null,range:null,anchor:null,selectionMode:!1},this.clipboardSnapshot=null}clampPosition(e){let t=this.options.getRowCount(),n=this.options.getColumnCount();return{row:Math.max(0,Math.min(e.row,t-1)),col:Math.max(0,Math.min(e.col,n-1))}}getEffectiveRange(){let{range:e,activeCell:t}=this.state;return e||(t?{startRow:t.row,startCol:t.col,endRow:t.row,endCol:t.col}:null)}createClipboardSnapshot(e){let{minRow:t,maxRow:n,minCol:r,maxCol:i}=o(e),a=[];for(let e=t;e<=n;e++){let t=[];for(let n=r;n<=i;n++){let r=this.options.getCellValue(e,n),i=y(r,this.options.getColumn(n)?.valueFormatter);t.push({value:r,text:i})}a.push(t)}return{cells:a,text:a.map(e=>e.map(e=>e.text).join(` `)).join(`
6
+ `)}}getPasteSourceCells(e){let t=this.clipboardSnapshot;return t&&I(t.text)===I(e)?t.cells:ze(e)}applyPasteSource(e,t,n){let r=[],{minRow:i,maxRow:a,minCol:s,maxCol:c}=o(t),l=this.isSingleSourceCell(e),u=l?a:i+e.length-1,d=l?c:s+this.getMaxSourceColumnCount(e)-1,f=n?Math.min(u,a):u,p=n?Math.min(d,c):d,m=this.options.getRowCount(),h=this.options.getColumnCount(),g=Math.min(f,m-1),_=Math.min(p,h-1);for(let t=i;t<=g;t++)for(let n=s;n<=_;n++){let a=this.getSourceCellForTarget(e,t-i,n-s,l);a&&this.applyPasteCell(t,n,a,r)}return r}applyPasteCell(e,t,n,r){let i=this.options.getColumn(t);if(i===void 0||i.hidden===!0||i.editable!==!0)return;let a=Be(n,i);a.ok!==!1&&(this.options.setCellValue(e,t,a.value),r.push({row:e,col:t,value:a.value}))}getSourceCellForTarget(e,t,n,r){return r?e[0]?.[0]??null:e[t]?.[n]??null}isSingleSourceCell(e){return e.length===1&&e[0]?.length===1}getMaxSourceColumnCount(e){return e.reduce((e,t)=>Math.max(e,t.length),0)}},z=class{state=null;options;emitter=v();onInstruction=this.emitter.onInstruction;emit=this.emitter.emit;constructor(e){this.options=e}getState(){return this.state?{...this.state}:null}isActive(){return this.state!==null}startFillDrag(e){this.state={sourceRange:e,targetRow:e.endRow,targetCol:e.endCol},this.emit({type:`START_FILL`,sourceRange:e})}updateFillDrag(e,t){if(!this.state)return;let n=this.options.getRowCount(),r=this.options.getColumnCount();e=Math.max(0,Math.min(e,n-1)),t=Math.max(0,Math.min(t,r-1)),this.state.targetRow=e,this.state.targetCol=t,this.emit({type:`UPDATE_FILL`,targetRow:e,targetCol:t})}commitFillDrag(){if(!this.state)return;let{sourceRange:e,targetRow:t}=this.state,n=this.calculateFilledCells(e,t);for(let{row:e,col:t,value:r}of n)this.options.setCellValue(e,t,r);this.emit({type:`COMMIT_FILL`,filledCells:n}),this.state=null}cancelFillDrag(){this.state&&(this.state=null,this.emit({type:`CANCEL_FILL`}))}destroy(){this.emitter.clearListeners(),this.state=null}calculateFilledCells(e,t){let n=[],{minRow:r,maxRow:i,minCol:a,maxCol:s}=o(e),c=t>i,l=t<r;if(c||l)for(let e=a;e<=s;e++){let a=this.getSourceColumnValues(r,i,e),o=this.detectPattern(a);if(c)for(let r=i+1;r<=t;r++){let t=r-i-1,s=this.applyPattern(o,a,t);n.push({row:r,col:e,value:s})}else if(l)for(let i=r-1;i>=t;i--){let t=r-i-1,s=this.applyPattern(o,a,t,!0);n.push({row:i,col:e,value:s})}}return n}getSourceColumnValues(e,t,n){let r=[];for(let i=e;i<=t;i++)r.push(this.options.getCellValue(i,n));return r}detectPattern(e){if(e.length===0)return{type:`constant`,value:null};if(e.length===1)return{type:`constant`,value:e[0]??null};let t=e.map(e=>typeof e==`number`?e:Number(e));if(t.every(e=>!Number.isNaN(e))){let e=[];for(let n=1;n<t.length;n++)e.push(t[n]-t[n-1]);if(e.every(t=>t===e[0])&&e[0]!==void 0)return{type:`arithmetic`,start:t[0],step:e[0]}}return{type:`repeat`,values:e}}applyPattern(e,t,n,r=!1){switch(e.type){case`constant`:return e.value;case`arithmetic`:{let i=r?-(n+1):n+1;return(r?e.start:e.start+e.step*(t.length-1))+e.step*i}case`repeat`:{let t=e.values.length;if(t===0)return null;if(r){let r=(t-1-n%t+t)%t;return e.values[r]??null}return e.values[n%t]??null}}}},B=class{state={slots:new Map,rowToSlot:new Map,nextSlotId:0};options;emitter=ee();isDestroyed=!1;onInstruction=this.emitter.onInstruction;onBatchInstruction=this.emitter.onBatchInstruction;emit=this.emitter.emit;emitBatch=this.emitter.emitBatch;constructor(e){this.options=e}getSlotForRow(e){return this.state.rowToSlot.get(e)}getSlots(){return this.state.slots}syncSlots(){let e=this.options.getScrollTop(),t=this.options.getRowHeight(),n=this.options.getViewportHeight(),r=this.options.getTotalRows(),i=this.options.getOverscan(),a=n,o=Math.max(0,Math.floor(e/t)-i),s=Math.min(r-1,Math.ceil((e+a)/t)+i);if(r===0||s<o){this.destroyAllSlots();return}let c=new Set;for(let e=o;e<=s;e++)c.add(e);let l=[],u=this.partitionSlots(c),d=0;for(let e of c){let t=this.options.getRowData(e);if(t===void 0)continue;let n=d<u.length?u[d++]:void 0;this.assignSlotToRow(e,t,n,l)}for(let e=d;e<u.length;e++){let t=u[e];this.state.slots.delete(t),l.push({type:`DESTROY_SLOT`,slotId:t})}this.updateSlotPositions(l),this.emitBatch(l)}partitionSlots(e){let t=[];for(let[n,r]of this.state.slots)e.has(r.rowIndex)?e.delete(r.rowIndex):(t.push(n),this.state.rowToSlot.delete(r.rowIndex));return t}assignSlotToRow(e,t,n,r){let i;if(n===void 0)i=`slot-${this.state.nextSlotId++}`,this.state.slots.set(i,{slotId:i,rowIndex:e,rowData:t,translateY:this.getRowTranslateY(e)}),r.push({type:`CREATE_SLOT`,slotId:i});else{i=n;let r=this.state.slots.get(i);r.rowIndex=e,r.rowData=t,r.translateY=this.getRowTranslateY(e)}this.state.rowToSlot.set(e,i),r.push({type:`ASSIGN_SLOT`,slotId:i,rowIndex:e,rowData:t},{type:`MOVE_SLOT`,slotId:i,translateY:this.getRowTranslateY(e)})}updateSlotPositions(e){for(let[t,n]of this.state.slots){let r=this.getRowTranslateY(n.rowIndex);n.translateY!==r&&(n.translateY=r,e.push({type:`MOVE_SLOT`,slotId:t,translateY:r}))}}destroyAllSlots(){let e=[];for(let t of this.state.slots.keys())e.push({type:`DESTROY_SLOT`,slotId:t});this.state.slots.clear(),this.state.rowToSlot.clear(),this.emitBatch(e)}destroy(){this.isDestroyed||(this.isDestroyed=!0,this.state.slots.clear(),this.state.rowToSlot.clear(),this.emitter.clearListeners())}refreshAllSlots(){let e=[],t=this.options.getTotalRows();for(let[n,r]of this.state.slots)if(r.rowIndex>=0&&r.rowIndex<t){let t=this.options.getRowData(r.rowIndex);if(t===void 0)continue;let i=this.getRowTranslateY(r.rowIndex);r.rowData=t,r.translateY=i,e.push({type:`ASSIGN_SLOT`,slotId:n,rowIndex:r.rowIndex,rowData:t},{type:`MOVE_SLOT`,slotId:n,translateY:i})}this.emitBatch(e),this.syncSlots()}updateSlot(e){let t=this.state.rowToSlot.get(e);if(t){let n=this.options.getRowData(e);n&&this.emit({type:`ASSIGN_SLOT`,slotId:t,rowIndex:e,rowData:n})}}getRowTranslateY(e){let t=this.options.getRowHeight(),n=this.options.getScrollRatio(),r=this.options.getScrollTop(),i=e*t;return n>=1?i:i-Math.floor(r/t)*t}getRowTranslateYForIndex(e){return this.getRowTranslateY(e)}getRowsWrapperOffset(){let e=this.options.getScrollRatio(),t=this.options.getScrollTop(),n=this.options.getRowHeight();if(e>=1)return 0;let r=t%n;return t*e-r}},V=class{editState=null;peekState=null;options;emitter=v();onInstruction=this.emitter.onInstruction;emit=this.emitter.emit;constructor(e){this.options=e}getState(){return this.editState?{...this.editState}:null}isEditing(){return this.editState!==null}isEditingCell(e,t){return this.editState!==null&&this.editState.row===e&&this.editState.col===t}startEdit(e,t){if(!this.options.getColumn(t)?.editable)return!1;this.peekState!==null&&this.stopPeek();let n=this.options.getCellValue(e,t);return this.editState={row:e,col:t,initialValue:n,currentValue:n},this.emit({type:`START_EDIT`,row:e,col:t,initialValue:n}),!0}getPeekState(){return this.peekState?{...this.peekState}:null}startPeek(e,t){return this.editState===null?(this.peekState={row:e,col:t},this.emit({type:`START_PEEK`,row:e,col:t}),!0):!1}stopPeek(){this.peekState!==null&&(this.peekState=null,this.emit({type:`STOP_PEEK`}))}updateValue(e){this.editState&&(this.editState.currentValue=e)}commit(){if(!this.editState)return;let{row:e,col:t,currentValue:n}=this.editState;this.options.setCellValue(e,t,n),this.emit({type:`COMMIT_EDIT`,row:e,col:t,value:n}),this.editState=null,this.emit({type:`STOP_EDIT`}),this.options.onCommit?.(e,t,n)}cancel(){this.editState=null,this.emit({type:`STOP_EDIT`})}destroy(){this.emitter.clearListeners(),this.editState=null,this.peekState=null}};const qe=e=>{let{batcher:t}=e,n,r=new A({getRowHeight:e.getRowHeight,getHeaderHeight:e.getHeaderHeight,getTotalRows:e.getTotalRows,getScrollTop:()=>n.getScrollTop(),getViewportHeight:()=>n.getViewportHeight()});n=new Re(()=>r.getScrollRatio());let i=null,a=new R({getRowCount:e.getTotalRows,getColumnCount:()=>e.getColumns().length,getCellValue:e.getCellValue,getRowData:t=>e.getCachedRows().get(t),getColumn:t=>e.getColumns()[t],setCellValue:e.setCellValue});a.onInstruction(e=>{t.emit(e),i?.onSelectionChange()}),e.highlighting&&(i=new C({getActiveCell:()=>a.getActiveCell(),getSelectionRange:()=>a.getSelectionRange(),getColumn:t=>e.getColumns()[t]},e.highlighting),i.onInstruction(e=>t.emit(e)));let o=new z({getRowCount:e.getTotalRows,getColumnCount:()=>e.getColumns().length,getCellValue:e.getCellValue,getColumn:t=>e.getColumns()[t],setCellValue:e.setCellValue});o.onInstruction(e=>t.emit(e));let s=new B({getRowHeight:e.getRowHeight,getHeaderHeight:e.getHeaderHeight,getOverscan:e.getOverscan,getScrollTop:()=>n.getScrollTop(),getViewportHeight:()=>n.getViewportHeight(),getTotalRows:e.getTotalRows,getScrollRatio:()=>r.getScrollRatio(),getVirtualContentHeight:()=>r.getVirtualContentHeight(),getRowData:t=>e.getCachedRows().get(t)});s.onBatchInstruction(e=>t.emitBatch(e));let c=new V({getColumn:t=>e.getColumns()[t],getCellValue:e.getCellValue,setCellValue:e.setCellValue,onCommit:e=>s.updateSlot(e)});c.onInstruction(e=>t.emit(e));let l=new P({getColumns:e.getColumns,isSortingEnabled:e.getSortingEnabled,getCachedRows:e.getCachedRows,onSortFilterChange:async()=>{await e.fetchData(),i?.clearAllCaches(),n.resetScrollTop(),t.start();try{t.emit({type:`SCROLL_TO`,scrollTop:0}),e.emitContentSize(),e.emitHeaders(),s.refreshAllSlots()}finally{t.flush()}},onDataRefreshed:()=>{}});l.onInstruction(e=>t.emit(e));let u=new w({getCachedRows:e.getCachedRows,setCachedRows:e.setCachedRows,getTotalRows:e.getTotalRows,setTotalRows:e.setTotalRows,updateSlot:e=>s.updateSlot(e),refreshAllSlots:()=>s.refreshAllSlots(),emitContentSize:e.emitContentSize,clearSelectionIfInvalid:e.clearSelectionIfInvalid});return u.onInstruction(e=>t.emit(e)),{selection:a,highlight:i,fill:o,scrollVirtualization:r,viewport:n,slotPool:s,editManager:c,sortFilter:l,rowMutation:u}},Je=e=>{let t=e.columnPositions.at(-1)??0;e.scrollVirtualization.updateContentSize(),e.batcher.emit({type:`SET_CONTENT_SIZE`,width:t,height:e.scrollVirtualization.getVirtualHeight(),viewportWidth:e.viewport.getViewportWidth(),viewportHeight:e.viewport.getViewportHeight(),rowsWrapperOffset:e.slotPool.getRowsWrapperOffset()})},Ye=e=>{let t=e.sortFilter.getSortInfoMap();for(let n=0;n<e.columns.length;n++){let r=e.columns[n],i=r.colId??r.field,a=t.get(i);e.batcher.emit({type:`UPDATE_HEADER`,colIndex:n,column:r,sortDirection:a?.direction,sortIndex:a?.index,hasFilter:e.sortFilter.hasActiveFilter(i)})}},Xe=e=>{let t=e.scrollVirtualization.getVisibleRowRange();e.batcher.emit({type:`UPDATE_VISIBLE_RANGE`,start:t.start,end:t.end,rowsWrapperOffset:e.slotPool.getRowsWrapperOffset()})};var Ze=class{columns;rowHeight;headerHeight;overscan;maxFlingVelocity;sortingEnabled;getRowId;onCellValueChanged;rowDragEntireRow;onRowDragEnd;onColumnResized;onColumnMoved;viewport;scrollTopOverride=null;rowData;selection;fill;input;highlight;sortFilter;rowMutation;slotPool;editManager;columnPositions=[];batcher=new Le;scrollVirtualization;isDestroyed=!1;hasWarnedAboutScaledOverscan=!1;constructor(e){if(this.columns=e.columns,this.rowHeight=e.rowHeight,this.headerHeight=e.headerHeight??e.rowHeight,this.overscan=e.overscan??3,this.maxFlingVelocity=e.maxFlingVelocity??2e4*this.rowHeight/1e3,this.sortingEnabled=e.sortingEnabled??!0,this.getRowId=e.getRowId,this.onCellValueChanged=e.onCellValueChanged,this.rowDragEntireRow=e.rowDragEntireRow??!1,this.onRowDragEnd=e.onRowDragEnd,this.onColumnResized=e.onColumnResized,this.onColumnMoved=e.onColumnMoved,this.onCellValueChanged&&!this.getRowId)throw Error(`getRowId is required when onCellValueChanged is provided`);this.computeColumnPositions();let t,n,r;this.rowData=new O({dataSource:e.dataSource,rowLoading:e.rowLoading,batcher:this.batcher,getColumns:()=>this.columns,getSortModel:()=>r.getSortModel(),getFilterModel:()=>r.getFilterModel(),getRowHeight:()=>this.rowHeight,getOverscan:()=>this.overscan,getScrollTop:()=>t.getScrollTop(),getViewportHeight:()=>t.getViewportHeight(),onCellValueChanged:this.onCellValueChanged,getRowId:this.getRowId,syncSlots:()=>n.syncSlots(),emitVisibleRange:()=>this.emitVisibleRange(),emitContentSize:()=>this.emitContentSize()});let i=qe({batcher:this.batcher,highlighting:e.highlighting,getColumns:()=>this.columns,getCachedRows:()=>this.rowData.getCachedRows(),setCachedRows:e=>this.rowData.setCachedRows(e),getTotalRows:()=>this.rowData.getTotalRows(),setTotalRows:e=>this.rowData.setTotalRows(e),getRowHeight:()=>this.rowHeight,getHeaderHeight:()=>this.headerHeight,getOverscan:()=>this.overscan,getSortingEnabled:()=>this.sortingEnabled,getCellValue:(e,t)=>this.getCellValue(e,t),setCellValue:(e,t,n)=>this.setCellValue(e,t,n),emitContentSize:()=>this.emitContentSize(),emitHeaders:()=>this.emitHeaders(),fetchData:()=>this.rowData.loadInitial(),clearSelectionIfInvalid:e=>this.clearSelectionIfInvalid(e)});this.selection=i.selection,this.highlight=i.highlight,this.fill=i.fill,this.scrollVirtualization=i.scrollVirtualization,this.viewport=i.viewport,this.slotPool=i.slotPool,this.editManager=i.editManager,this.sortFilter=i.sortFilter,this.rowMutation=i.rowMutation,t=this.viewport,n=this.slotPool,r=this.sortFilter,this.input=new S(this,{getHeaderHeight:()=>this.headerHeight,getRowHeight:()=>this.rowHeight,getColumnPositions:()=>this.columnPositions,getColumnCount:()=>this.columns.length})}onBatchInstruction(e){return this.batcher.subscribe(e)}async initialize(){await this.rowData.loadInitial(),this.slotPool.syncSlots(),this.emitContentSize(),this.emitHeaders()}setViewport(e,t,n,r){let{changed:i,viewportSizeChanged:a}=this.viewport.update(this.scrollTopOverride??e,t,n,r);i&&(this.rowData.requestVisibleRows(),this.slotPool.syncSlots(),this.emitVisibleRange(),a&&this.emitContentSize())}async setSort(e,t,n=!1){if(!this.rowData.isLoading())return this.sortFilter.setSort(e,t,n)}async setFilter(e,t){if(!this.rowData.isLoading())return this.sortFilter.setFilter(e,t)}hasActiveFilter(e){return this.sortFilter.hasActiveFilter(e)}getDistinctValuesForColumn(e,t=500){return this.sortFilter.getDistinctValuesForColumn(e,t)}openFilterPopup(e,t,n=!0){this.rowData.isLoading()||this.sortFilter.openFilterPopup(e,t,n)}closeFilterPopup(){this.sortFilter.closeFilterPopup()}getSortModel(){return this.sortFilter.getSortModel()}getFilterModel(){return this.sortFilter.getFilterModel()}startEdit(e,t){this.editManager.startEdit(e,t)}startPeek(e,t){let n=this.columns[t];return!n||n.peekable===!1?!1:this.editManager.startPeek(e,t)}stopPeek(){this.editManager.stopPeek()}getPeekState(){return this.editManager.getPeekState()}updateEditValue(e){this.editManager.updateValue(e)}commitEdit(){this.editManager.commit()}cancelEdit(){this.editManager.cancel()}pasteClipboardText(e){if(this.editManager.getState())return!1;let t=this.selection.pasteClipboardText(e);return t.changedCells.length>0&&this.refreshSlotData(),t.handled}getEditState(){return this.editManager.getState()}getCellValue(e,t){return this.rowData.getCellValue(e,t)}setCellValue(e,t,n){this.rowData.setCellValue(e,t,n)}clearSelectionIfInvalid(e){let t=this.selection.getActiveCell();t&&t.row>=e&&this.selection.clearSelection()}computeColumnPositions(){this.columnPositions=ue(this.columns)}emitContentSize(){Je({batcher:this.batcher,scrollVirtualization:this.scrollVirtualization,slotPool:this.slotPool,viewport:this.viewport,columnPositions:this.columnPositions}),this.warnIfOverscanTooLowForScaling()}warnIfOverscanTooLowForScaling(){this.hasWarnedAboutScaledOverscan||this.scrollVirtualization.isScalingActive()!==!1&&(this.hasWarnedAboutScaledOverscan=!0,!(this.overscan>=10)&&console.warn(`[gp-grid] Scroll virtualization is active (${this.rowData.getTotalRows().toLocaleString()} rows) but overscan is ${this.overscan}. Fast momentum scrolling can outrun rendering and show blank rows at this scale — set the overscan option to 10–12.`))}emitHeaders(){Ye({batcher:this.batcher,sortFilter:this.sortFilter,columns:this.columns})}emitVisibleRange(){Xe({batcher:this.batcher,scrollVirtualization:this.scrollVirtualization,slotPool:this.slotPool})}setColumnWidth(e,t){ke(e,t,this.viewport.getViewportWidth(),{batcher:this.batcher,slotPool:this.slotPool,refreshSlots:`sync`,computeColumnPositions:()=>this.computeColumnPositions(),emitContentSize:()=>this.emitContentSize(),emitHeaders:()=>this.emitHeaders(),columns:this.columns,onComplete:()=>this.onColumnResized?.(e,t)})}moveColumn(e,t){let n=Ae(e,t,{batcher:this.batcher,slotPool:this.slotPool,refreshSlots:`all`,computeColumnPositions:()=>this.computeColumnPositions(),emitContentSize:()=>this.emitContentSize(),emitHeaders:()=>this.emitHeaders(),columns:this.columns,onComplete:()=>{}});n!==null&&this.onColumnMoved?.(e,n)}commitRowDrag(e,t){je(e,t,{dataSource:this.rowData.getDataSource(),cachedRows:this.rowData.getCachedRows(),slotPool:this.slotPool,highlight:this.highlight}),this.onRowDragEnd?.(e,t)}isRowDragEntireRow(){return this.rowDragEntireRow}getColumns(){return this.columns}getColumnPositions(){return[...this.columnPositions]}getRowCount(){return this.rowData.getTotalRows()}getRowHeight(){return this.rowHeight}getHeaderHeight(){return this.headerHeight}getTotalWidth(){return this.columnPositions.at(-1)??0}getTotalHeight(){return this.scrollVirtualization.getVirtualHeight()}isScalingActive(){return this.scrollVirtualization.isScalingActive()}getMaxFlingVelocity(){return this.maxFlingVelocity}setScrollTopOverride(e){this.scrollTopOverride=e}getNaturalHeight(){return this.scrollVirtualization.getNaturalHeight()}getScrollRatio(){return this.scrollVirtualization.getScrollRatio()}getVisibleRowRange(){return this.scrollVirtualization.getVisibleRowRange()}getScrollTopForRow(e){return this.scrollVirtualization.getScrollTopForRow(e)}getRowIndexAtDisplayY(e,t){return this.scrollVirtualization.getRowIndexAtDisplayY(e,t)}getRowTranslateY(e){return this.slotPool.getRowTranslateYForIndex(e)}getRowData(e){return this.rowData.getRowData(e)}async refresh(){await this.rowData.loadInitial(),this.highlight?.clearAllCaches(),this.slotPool.refreshAllSlots(),this.emitContentSize(),this.emitVisibleRange()}async refreshFromTransaction(){await this.rowData.refreshFromTransaction(),this.highlight?.clearAllCaches(),this.slotPool.refreshAllSlots(),this.emitContentSize(),this.emitVisibleRange()}refreshSlotData(){this.slotPool.refreshAllSlots()}addRows(e,t){this.rowMutation.addRows(e,t)}updateRows(e){this.rowMutation.updateRows(e)}deleteRows(e){this.rowMutation.deleteRows(e)}getRow(e){return this.rowMutation.getRow(e)}setRow(e,t){this.rowMutation.setRow(e,t)}async setDataSource(e){this.editManager.getState()&&this.editManager.cancel(),this.rowData.setDataSource(e),await this.refresh(),this.clearSelectionIfInvalid(this.rowData.getTotalRows())}setColumns(e){this.columns=e,this.computeColumnPositions(),this.emitContentSize(),this.emitHeaders(),this.slotPool.syncSlots()}destroy(){this.isDestroyed||(this.isDestroyed=!0,this.slotPool.destroy(),this.highlight?.destroy(),this.sortFilter.destroy(),this.rowMutation.destroy(),this.rowData.destroy(),this.batcher.clearListeners())}},Qe=class{workerCode;maxWorkers;workers=[];workerUrl=null;nextRequestId=0;isTerminated=!1;constructor(e,t={}){this.workerCode=e;let n=typeof navigator>`u`?4:navigator.hardwareConcurrency;this.maxWorkers=Math.max(1,t.maxWorkers??n??4),t.preWarm&&this.preWarmWorkers()}getPoolSize(){return this.workers.length}getMaxWorkers(){return this.maxWorkers}isAvailable(){return!this.isTerminated&&typeof Worker<`u`}async execute(e,t){if(this.isTerminated)throw Error(`WorkerPool has been terminated`);if(typeof Worker>`u`)throw TypeError(`Web Workers are not available in this environment`);let n=this.getAvailableWorker(),r=this.nextRequestId++,i={...e,id:r};return new Promise((e,a)=>{n.pendingRequests.set(r,{resolve:e,reject:a}),n.busy=!0,t&&t.length>0?n.worker.postMessage(i,t):n.worker.postMessage(i)})}async executeParallel(e){if(this.isTerminated)throw Error(`WorkerPool has been terminated`);if(e.length===0)return[];let t=Math.min(e.length,this.maxWorkers);this.ensureWorkers(t);let n=e.map((e,t)=>{let n=t%this.workers.length,r=this.workers[n],i=this.nextRequestId++,a={...e.request,id:i};return new Promise((t,n)=>{r.pendingRequests.set(i,{resolve:t,reject:n}),r.busy=!0,e.transferables&&e.transferables.length>0?r.worker.postMessage(a,e.transferables):r.worker.postMessage(a)})});return Promise.all(n)}terminate(){for(let e of this.workers){e.worker.terminate();for(let[,t]of e.pendingRequests)t.reject(Error(`Worker pool terminated`));e.pendingRequests.clear()}this.workers=[],this.workerUrl&&=(URL.revokeObjectURL(this.workerUrl),null),this.isTerminated=!0}preWarmWorkers(){this.ensureWorkers(this.maxWorkers)}ensureWorkers(e){let t=Math.min(e,this.maxWorkers)-this.workers.length;for(let e=0;e<t;e++)this.createWorker()}getAvailableWorker(){return this.workers.find(e=>!e.busy)||(this.workers.length<this.maxWorkers?this.createWorker():this.workers.reduce((e,t)=>t.pendingRequests.size<e.pendingRequests.size?t:e,this.workers[0]))}createWorker(){if(!this.workerUrl){let e=new Blob([this.workerCode],{type:`application/javascript`});this.workerUrl=URL.createObjectURL(e)}let e=new Worker(this.workerUrl),t={worker:e,busy:!1,pendingRequests:new Map};return e.onmessage=e=>{let{id:n}=e.data,r=t.pendingRequests.get(n);r&&(t.pendingRequests.delete(n),t.pendingRequests.size===0&&(t.busy=!1),e.data.type===`error`?r.reject(Error(e.data.error)):r.resolve(e.data))},e.onerror=e=>{for(let[,n]of t.pendingRequests)n.reject(Error(`Worker error: ${e.message}`));t.pendingRequests.clear(),t.busy=!1,this.respawnWorker(t)},this.workers.push(t),t}respawnWorker(e){let t=this.workers.indexOf(e);if(t!==-1){try{e.worker.terminate()}catch{}this.workers.splice(t,1),this.workers.length<this.maxWorkers&&!this.isTerminated&&this.createWorker()}}};function $e(e,t){let n=t.split(`.`),r=e;for(let e of n){if(typeof r!=`object`||!r)return null;r=r[e]}return r}const H=e=>e==null?``:Array.isArray(e)?e.join(`, `):typeof e==`object`&&!(e instanceof Date)?JSON.stringify(e):String(e);function et(e,t){if(e==null&&t==null)return 0;if(e==null)return 1;if(t==null)return-1;let n=Number(e),r=Number(t);return!Number.isNaN(n)&&!Number.isNaN(r)?n-r:e instanceof Date&&t instanceof Date?e.getTime()-t.getTime():H(e).localeCompare(H(t))}function tt(e,t){return[...e].sort((e,n)=>{for(let{colId:r,direction:i}of t){let t=et($e(e,r),$e(n,r));if(t!==0)return i===`asc`?t:-t}return 0})}const U=globalThis;U.onmessage!==void 0&&(U.onmessage=e=>{let{type:t,id:n,data:r,sortModel:i}=e.data;if(t===`sort`)try{let e=tt(r,i);U.postMessage?.({type:`sorted`,id:n,data:e})}catch(e){U.postMessage?.({type:`error`,id:n,error:String(e)})}});var nt=class{heap=[];compare;constructor(e){this.compare=e}push(e){this.heap.push(e),this.bubbleUp(this.heap.length-1)}pop(){if(this.heap.length===0)return;let e=this.heap[0],t=this.heap.pop();return this.heap.length>0&&t&&(this.heap[0]=t,this.bubbleDown(0)),e}size(){return this.heap.length}bubbleUp(e){for(;e>0;){let t=Math.floor((e-1)/2);if(this.compare(this.heap[e],this.heap[t])>=0)break;this.swap(e,t),e=t}}bubbleDown(e){let t=this.heap.length;for(;;){let n=2*e+1,r=2*e+2,i=e;if(n<t&&this.compare(this.heap[n],this.heap[i])<0&&(i=n),r<t&&this.compare(this.heap[r],this.heap[i])<0&&(i=r),i===e)break;this.swap(e,i),e=i}}swap(e,t){let n=this.heap[e];this.heap[e]=this.heap[t],this.heap[t]=n}};const rt=(e,t,n)=>{let r=[];for(let i=0;i<n;i++)r.push(e.columns[i][t]);return r};function W(e,t){if(e.length===0)return new Uint32Array;if(e.length===1){let t=e[0],n=new Uint32Array(t.indices.length);for(let e=0;e<t.indices.length;e++)n[e]=t.indices[e]+t.offset;return n}let n=0;for(let t of e)n+=t.indices.length;let r=new Uint32Array(n),i=t===`asc`?1:-1,a=new nt((e,t)=>{let n=(e.value-t.value)*i;return n===0?e.globalIndex-t.globalIndex:n});for(let t=0;t<e.length;t++){let n=e[t];if(n.indices.length>0){let e=n.indices[0];a.push({chunkIndex:t,positionInChunk:0,value:n.values[0],globalIndex:e+n.offset})}}let o=0;for(;a.size()>0;){let t=a.pop();r[o++]=t.globalIndex;let n=e[t.chunkIndex],i=t.positionInChunk+1;if(i<n.indices.length){let e=n.indices[i];a.push({chunkIndex:t.chunkIndex,positionInChunk:i,value:n.values[i],globalIndex:e+n.offset})}}return r}function it(e){if(e.length===0)return new Uint32Array;if(e.length===1){let t=e[0],n=new Uint32Array(t.indices.length);for(let e=0;e<t.indices.length;e++)n[e]=t.indices[e]+t.offset;return n}let t=e[0].directions,n=t.length,r=0;for(let t of e)r+=t.indices.length;let i=new Uint32Array(r),a=new nt((e,n)=>{for(let r=0;r<t.length;r++){let i=(e.values[r]-n.values[r])*t[r];if(i!==0)return i}return e.globalIndex-n.globalIndex});for(let t=0;t<e.length;t++){let r=e[t];if(r.indices.length>0){let e=r.indices[0];a.push({chunkIndex:t,positionInChunk:0,values:rt(r,0,n),globalIndex:e+r.offset})}}let o=0;for(;a.size()>0;){let t=a.pop();i[o++]=t.globalIndex;let r=e[t.chunkIndex],s=t.positionInChunk+1;if(s<r.indices.length){let e=r.indices[s];a.push({chunkIndex:t.chunkIndex,positionInChunk:s,values:rt(r,s,n),globalIndex:e+r.offset})}}return i}function at(e,t){if(e.length<=1)return new Uint32Array;let n=[],r=0;for(let t=0;t<e.length-1;t++){let i=e[t],a=e[t+1];if(i.indices.length===0||a.indices.length===0){r+=i.indices.length;continue}let o=i.indices.length-1,s=i.values[o],c=a.values[0];if(s===c){let e=o;for(;e>0&&i.values[e-1]===s;)e--;let t=0;for(;t<a.indices.length-1&&a.values[t+1]===c;)t++;let l=r+e,u=r+i.indices.length+t+1;n.push(l,u)}r+=i.indices.length}return new Uint32Array(n)}const ot=(e,t,n)=>{let r=Math.max(n,Math.ceil(e/t)),i=[];for(let t=0;t<e;t+=r)i.push({offset:t,length:Math.min(r,e-t)});return i},st=e=>{if(e.length<=1)return[];let t=[],n=0;for(let r=0;r<e.length-1;r++){let i=e[r],a=e[r+1];if(i.indices.length===0||a.indices.length===0){n+=i.indices.length;continue}let o=i.values[i.indices.length-1],s=a.values[0];if(o===s){let e=i.indices.length-1;for(;e>0&&i.values[e-1]===o;)e--;let r=0;for(;r<a.indices.length-1&&a.values[r+1]===s;)r++;t.push(n+e,n+i.indices.length+r+1)}n+=i.indices.length}return t},ct=(e,t,n,r)=>{let i=r===`asc`?1:-1;for(let r=0;r<t.length;r+=2){let a=t[r],o=t[r+1];o<=a||o>e.length||lt(e,a,o,n,i)}},lt=(e,t,n,r,i)=>{let a=Array.from(e.slice(t,n));if(!ut(a,r)){a.sort((e,t)=>i*r[e].localeCompare(r[t]));for(let n=0;n<a.length;n++)e[t+n]=a[n]}},ut=(e,t)=>{let n=t[e[0]];for(let r=1;r<e.length;r++)if(t[e[r]]!==n)return!1;return!0};var G=class{pool;parallelThreshold;minChunkSize;isTerminated=!1;constructor(e={}){let t=e.maxWorkers??(navigator===void 0?4:navigator.hardwareConcurrency)??4;this.pool=new Qe(`
7
7
  // ---- Shared helpers (inlined for worker isolation) ----------------------
8
8
  function getFieldValue(row, field) {
9
9
  const parts = field.split(".");
@@ -87,7 +87,8 @@ function sortIndices(values, direction) {
87
87
  const va = values[a], vb = values[b];
88
88
  if (va < vb) return -1 * mult;
89
89
  if (va > vb) return 1 * mult;
90
- return 0;
90
+ // Stable tie-break: preserve original (local) index order.
91
+ return a - b;
91
92
  });
92
93
  return indices;
93
94
  }
@@ -101,7 +102,8 @@ function sortMultiColumn(columns, directions) {
101
102
  if (va < vb) return -1 * directions[c];
102
103
  if (va > vb) return 1 * directions[c];
103
104
  }
104
- return 0;
105
+ // Stable tie-break: preserve original (local) index order.
106
+ return a - b;
105
107
  });
106
108
  return indices;
107
109
  }
@@ -116,7 +118,8 @@ function sortStringHashes(hashChunks, direction) {
116
118
  if (va < vb) return -1 * mult;
117
119
  if (va > vb) return 1 * mult;
118
120
  }
119
- return 0;
121
+ // Stable tie-break: preserve original (local) index order.
122
+ return a - b;
120
123
  });
121
124
  return { indices, collisionRuns: detectCollisionRuns(indices, hashChunks) };
122
125
  }
@@ -205,7 +208,7 @@ self.onmessage = function(e) {
205
208
  self.postMessage({ type: "error", id, error: String(error) });
206
209
  }
207
210
  };
208
- `,{maxWorkers:t}),this.parallelThreshold=e.parallelThreshold??4e5,this.minChunkSize=e.minChunkSize??5e4}isAvailable(){return this.isTerminated?!1:this.pool.isAvailable()}terminate(){this.pool.terminate(),this.isTerminated=!0}async sortIndices(e,t){return this.assertNotTerminated(),e.length<this.parallelThreshold?this.sortIndicesSingle(e,t):this.sortIndicesParallel(e,t)}async sortStringHashes(e,t,n){return this.assertNotTerminated(),(e[0]?.length??0)<this.parallelThreshold?this.sortStringHashesSingle(e,t,n):this.sortStringHashesParallel(e,t,n)}async sortMultiColumn(e,t){return this.assertNotTerminated(),(e[0]?.length??0)<this.parallelThreshold?this.sortMultiColumnSingle(e,t):this.sortMultiColumnParallel(e,t)}assertNotTerminated(){if(this.isTerminated)throw Error(`ParallelSortManager has been terminated`)}async sortIndicesSingle(e,t){let n=new Float64Array(e),r={type:`sortIndices`,id:0,values:n,direction:t};return(await this.pool.execute(r,[n.buffer])).indices}async sortStringHashesSingle(e,t,n){let r={type:`sortStringHashes`,id:0,hashChunks:e,direction:t},i=e.map(e=>e.buffer),a=await this.pool.execute(r,i);return a.collisionRuns.length>0&&nt(a.indices,a.collisionRuns,n,t),a.indices}async sortMultiColumnSingle(e,t){let n=e.map(e=>new Float64Array(e)),r=new Int8Array(t.map(e=>e===`asc`?1:-1)),i={type:`sortMultiColumn`,id:0,columns:n,directions:r},a=[...n.map(e=>e.buffer),r.buffer];return(await this.pool.execute(i,a)).indices}boundariesFor(e){return et(e,this.pool.getMaxWorkers(),this.minChunkSize)}async runChunks(e){let t=await this.pool.executeParallel(e);return t.sort((e,t)=>e.chunkOffset-t.chunkOffset),t}async sortIndicesParallel(e,t){let n=this.boundariesFor(e.length).map(n=>{let r=new Float64Array(e.slice(n.offset,n.offset+n.length));return{request:{type:`sortChunk`,id:0,values:r,direction:t,chunkOffset:n.offset},transferables:[r.buffer]}});return U((await this.runChunks(n)).map(e=>({indices:e.indices,values:e.sortedValues,offset:e.chunkOffset})),t)}async sortStringHashesParallel(e,t,n){let r=this.boundariesFor(e[0].length).map(n=>{let r=e.map(e=>{let t=new Float64Array(n.length);return t.set(new Float64Array(e.buffer,n.offset*8,n.length)),t});return{request:{type:`sortStringChunk`,id:0,hashChunks:r,direction:t,chunkOffset:n.offset},transferables:r.map(e=>e.buffer)}}),i=await this.runChunks(r),a=i.map(e=>({indices:e.indices,values:e.sortedHashes,offset:e.chunkOffset})),o=at(i),s=U(a,t),c=tt(a),l=new Uint32Array([...o,...c]);return l.length>0&&nt(s,l,n,t),s}async sortMultiColumnParallel(e,t){let n=this.boundariesFor(e[0].length),r=new Int8Array(t.map(e=>e===`asc`?1:-1)),i=n.map(t=>{let n=e.map(e=>{let n=new Float64Array(t.length);for(let r=0;r<t.length;r++)n[r]=e[t.offset+r];return n}),i=new Int8Array(r);return{request:{type:`sortMultiColumnChunk`,id:0,columns:n,directions:i,chunkOffset:t.offset},transferables:[...n.map(e=>e.buffer),i.buffer]}});return Qe((await this.runChunks(i)).map(e=>({indices:e.indices,columns:e.sortedColumns,directions:r,offset:e.chunkOffset})))}};const at=e=>{let t=[];for(let n of e)for(let e=0;e<n.collisionRuns.length;e+=2)t.push(n.collisionRuns[e]+n.chunkOffset,n.collisionRuns[e+1]+n.chunkOffset);return t};function G(e){let t=e.toLowerCase(),n=Math.min(t.length,10),r=0;for(let e=0;e<n;e++){let n=t.codePointAt(e)??200,i;i=n>=97&&n<=122?n-97:n>=48&&n<=57?n-48+26:0,r=r*36+i}for(let e=n;e<10;e++)r*=36;return r}function K(e,t){let n=e==null||Array.isArray(e)&&e.length===0,r=t==null||Array.isArray(t)&&t.length===0;if(n&&r)return 0;if(n)return 1;if(r)return-1;if(Array.isArray(e)||Array.isArray(t)){let n=Array.isArray(e)?e.join(`, `):y(e),r=Array.isArray(t)?t.join(`, `):y(t);return n.localeCompare(r)}let i=Number(e),a=Number(t);return!Number.isNaN(i)&&!Number.isNaN(a)?i-a:e instanceof Date&&t instanceof Date?e.getTime()-t.getTime():y(e).localeCompare(y(t))}function ot(e){if(e==null)return Number.MAX_VALUE;if(typeof e==`number`)return e;if(e instanceof Date)return e.getTime();if(typeof e==`string`)return G(e);if(Array.isArray(e))return e.length===0?Number.MAX_VALUE:G(e.join(`, `));if(typeof e==`object`)return G(JSON.stringify(e));let t=Number(e);return Number.isNaN(t)?0:t}function st(e,t){let n=[];for(let r of t.sortModel){let i=ot(t.getFieldValue(e,r.colId));n.push(i)}return n}function ct(e,t,n){if(!e||!t)return null;for(let r=0;r<n.length;r++){let i=e[r]-t[r];if(i!==0)return n[r].direction===`asc`?i:-i}return 0}function lt(e,t,n,r){for(let{colId:i,direction:a}of n){let n=K(r(e,i),r(t,i));if(n!==0)return a===`asc`?n:-n}return 0}function ut(e){let t=e.toLowerCase(),n=[];for(let e=0;e<3;e++){let r=e*10,i=0;for(let e=0;e<10;e++){let n=r+e,a=n<t.length?t.codePointAt(n)??200:0,o;o=a>=97&&a<=122?a-97:a>=48&&a<=57?a-48+26:0,i=i*36+o}n.push(i)}return n}function dt(e){if(e==null)return Number.MAX_VALUE;if(Array.isArray(e))return e.length===0?Number.MAX_VALUE:G(e.join(`, `));if(typeof e==`number`)return e;if(e instanceof Date)return e.getTime();if(typeof e==`string`)return G(e);if(typeof e==`object`)return G(JSON.stringify(e));let t=Number(e);return Number.isNaN(t)?0:t}function ft(e,t,n){return[...e].sort((e,r)=>{for(let{colId:i,direction:a}of t){let t=K(n(e,i),n(r,i));if(t!==0)return a===`asc`?t:-t}return 0})}const pt=(e,t,n)=>{for(let r of e){let e=n(r,t);if(e!=null)return typeof e==`string`||Array.isArray(e)||typeof e==`object`&&!(e instanceof Date)?`string`:`numeric`}return`numeric`},mt=(e,t,n)=>{let r=[],i=Array.from({length:3},()=>[]);for(let a of e){let e=y(n(a,t));r.push(e);let o=ut(e);for(let e=0;e<3;e++)i[e].push(o[e])}return{originalStrings:r,hashChunkArrays:i.map(e=>new Float64Array(e))}},ht=(e,t,n)=>e.map(e=>dt(n(e,t))),gt=(e,t,n)=>{let r=[],i=[];for(let{colId:a,direction:o}of t)r.push(e.map(e=>dt(n(e,a)))),i.push(o??`asc`);return{columnValues:r,directions:i}},_t=(e,t)=>{let n=Array(e.length);for(let r=0;r<t.length;r++)n[r]=e[t[r]];return n},vt=async(e,t,n,r)=>{let{colId:i,direction:a}=t,o=a??`asc`;if(pt(e,i,r)===`string`){let{originalStrings:t,hashChunkArrays:a}=mt(e,i,r);return n.sortStringHashes(a,o,t)}let s=ht(e,i,r);return n.sortIndices(s,o)},yt=async(e,t,n,r)=>{let{columnValues:i,directions:a}=gt(e,t,r);return n.sortMultiColumn(i,a)},bt=async(e,t,n,r)=>_t(e,t.length===1?await vt(e,t[0],n,r):await yt(e,t,n,r));function q(e,t){return e.getFullYear()===t.getFullYear()&&e.getMonth()===t.getMonth()&&e.getDate()===t.getDate()}function xt(e){return e==null||e===``||Array.isArray(e)&&e.length===0}const St={contains:(e,t)=>e.includes(t),notContains:(e,t)=>!e.includes(t),equals:(e,t)=>e===t,notEquals:(e,t)=>e!==t,startsWith:(e,t)=>e.startsWith(t),endsWith:(e,t)=>e.endsWith(t),blank:(e,t,n)=>n,notBlank:(e,t,n)=>!n};function Ct(e,t,n){let r=xt(e);if(t.selectedValues&&t.selectedValues.size>0){let i=t.includeBlank===!0&&r;if(Array.isArray(e)){let r=[...e].sort((e,t)=>{let n=String(e),r=String(t);return n===r?0:n<r?-1:1}),a=n?n(r):r.join(`, `);return t.selectedValues.has(a)||i}let a=y(e,n);return t.selectedValues.has(a)||i}let i=y(e,n).toLowerCase(),a=String(t.value??``).toLowerCase();return St[t.operator](i,a,r)}const wt={"=":(e,t)=>e===t,"!=":(e,t)=>e!==t,">":(e,t)=>e>t,"<":(e,t)=>e<t,">=":(e,t)=>e>=t,"<=":(e,t)=>e<=t,between:(e,t,n)=>e>=t&&e<=n};function Tt(e,t){let n=e==null||e===``;if(t.operator===`blank`)return n;if(t.operator===`notBlank`)return!n;if(n)return!1;let r=typeof e==`number`?e:Number(e);if(Number.isNaN(r))return!1;let i=t.value??0,a=t.valueTo??0;return wt[t.operator](r,i,a)}const Et={"=":(e,t)=>q(e,t),"!=":(e,t)=>!q(e,t),">":(e,t)=>e.getTime()>t.getTime(),"<":(e,t)=>e.getTime()<t.getTime(),between:(e,t,n)=>{let r=e.getTime();return r>=t.getTime()&&r<=n.getTime()}};function Dt(e,t){let n=e==null||e===``;if(t.operator===`blank`)return n;if(t.operator===`notBlank`)return!n;if(n)return!1;let r=e instanceof Date?e:new Date(y(e));if(Number.isNaN(r.getTime()))return!1;let i=t.value instanceof Date?t.value:new Date(String(t.value??``)),a=t.valueTo instanceof Date?t.valueTo:new Date(String(t.valueTo??``));return Et[t.operator](r,i,a)}function Ot(e,t,n){switch(t.type){case`text`:return Ct(e,t,n);case`number`:return Tt(e,t);case`date`:return Dt(e,t);default:return!0}}function J(e,t,n){if(!t.conditions||t.conditions.length===0)return!0;let r=t.conditions[0];if(!r)return!0;let i=Ot(e,r,n);for(let r=1;r<t.conditions.length;r++){let a=t.conditions[r-1],o=t.conditions[r],s=a.nextOperator??t.combination,c=Ot(e,o,n);s===`and`?i&&=c:i||=c}return i}function kt(e,t,n,r){let i=Object.entries(t).filter(([,e])=>e!=null);if(i.length===0)return!0;for(let[t,a]of i){let i=n(e,t),o=r?.(t);if(!J(i,a,o))return!1}return!0}function At(e,t,n,r){let i=Object.entries(t).filter(([,e])=>typeof e==`string`?e.trim()!==``:e.conditions&&e.conditions.length>0);return i.length===0?e:e.filter(e=>{for(let[t,a]of i){let i=n(e,t),o=r?.(t);if(typeof a==`string`){if(!y(i,o).toLowerCase().includes(a.toLowerCase()))return!1;continue}if(!J(i,a,o))return!1}return!0})}function Y(e,t){let n=t.split(`.`),r=e;for(let e of n){if(typeof r!=`object`||!r)return null;r=r[e]}return r}function jt(e,t={}){let{getFieldValue:n=Y,getValueFormatter:r,useWorker:i=!0,parallelSort:a}=t,o=e,s=!1,c=i?new W(a===!1?{maxWorkers:1}:a):null;return{loadMode:`all`,async query(e){let t=o?[...o]:[];if(e.filter&&Object.keys(e.filter).length>0){let i=e.valueFormatters===null?r:t=>e.valueFormatters?.[t];t=At(t,e.filter,n,i)}e.sort&&e.sort.length>0&&(t=c&&c.isAvailable()&&t.length>=2e5?await bt(t,e.sort,c,n):ft(t,e.sort,n));let i=t.length;return{rows:t.slice(e.range.startRow,e.range.endRow),totalRows:i}},destroy(){s||(s=!0,o=null,c&&c.terminate())},moveRow(e,t){if(!o||e===t||e<0||e>=o.length||t<0||t>=o.length)return;let[n]=o.splice(e,1),r=t>e?t-1:t;o.splice(r,0,n)}}}function X(e){return jt(e)}function Mt(e,t={}){return{loadMode:t.loadMode??`paginated`,async query(t){return e(t)}}}var Nt=class{rows=[];rowById=new Map;sortedIndices=[];sortModel=[];sortModelHash=``;filterModel={};filteredIndices=new Set;distinctValues=new Map;rowSortCache=new Map;options;constructor(e,t=[]){this.options={getRowId:e.getRowId,getFieldValue:e.getFieldValue??g,getValueFormatter:e.getValueFormatter??(()=>void 0)},this.setData(t)}clear(){this.rows=[],this.rowById.clear(),this.sortedIndices=[],this.filterModel={},this.filteredIndices.clear(),this.rowSortCache.clear(),this.distinctValues.clear(),this.sortModel=[],this.sortModelHash=``}setData(e){this.rows=[...e],this.rowById.clear(),this.rowSortCache.clear(),this.distinctValues.clear();for(let e=0;e<this.rows.length;e++){let t=this.rows[e],n=this.options.getRowId(t);this.rowById.set(n,e)}this.rebuildSortedIndices(),this.rebuildFilteredIndices(),this.rebuildDistinctValues()}query(e){this.setSortModel(e.sort??[]),this.setFilterModel(e.filter??{});let t=this.getVisibleIndices(),n=t.length,r=e.range.startRow,i=Math.min(e.range.endRow,n),a=[];for(let e=r;e<i;e++){let n=t[e];n!==void 0&&a.push(this.rows[n])}return{rows:a,totalRows:n}}getRowById(e){let t=this.rowById.get(e);return t===void 0?void 0:this.rows[t]}getRowByIndex(e){return this.rows[e]}getTotalRowCount(){return this.rows.length}getAllRows(){return[...this.rows]}moveRow(e,t){if(e===t||e<0||e>=this.rows.length||t<0||t>=this.rows.length)return;let[n]=this.rows.splice(e,1),r=t>e?t-1:t;this.rows.splice(r,0,n),this.rowById.clear();for(let e=0;e<this.rows.length;e++)this.rowById.set(this.options.getRowId(this.rows[e]),e);this.sortedIndices=Array.from({length:this.rows.length},(e,t)=>t),this.rowSortCache.clear()}getVisibleRowCount(){return Object.keys(this.filterModel).length===0?this.rows.length:this.filteredIndices.size}getDistinctValues(e){let t=this.distinctValues.get(e);return t?Array.from(t.keys()):[]}addRows(e){for(let t of e)this.addRow(t)}addRow(e){let t=this.options.getRowId(e);if(this.rowById.has(t)){console.warn(`Row with ID ${t} already exists. Skipping.`);return}let n=this.rows.length;if(this.rows.push(e),this.rowById.set(t,n),this.updateDistinctValuesForRow(e,`add`),this.sortModel.length>0&&this.computeRowHashes(n,e),this.sortModel.length>0){let e=this.binarySearchInsertPosition(n);this.sortedIndices.splice(e,0,n)}else this.sortedIndices.push(n);this.rowPassesFilter(e)&&this.filteredIndices.add(n)}removeRows(e){let t=[];for(let n of e){let e=this.rowById.get(n);e!==void 0&&t.push(e)}if(t.length===0)return 0;t.sort((e,t)=>t-e);for(let e of t)this.removeRowByIndex(e);return t.length}removeRowByIndex(e){let t=this.rows[e];if(!t)return;let n=this.options.getRowId(t);this.updateDistinctValuesForRow(t,`remove`);let r=this.sortedIndices.indexOf(e);r!==-1&&this.sortedIndices.splice(r,1),this.filteredIndices.delete(e),this.rowSortCache.delete(e),this.rowById.delete(n),this.rows.splice(e,1),this.reindexAfterRemoval(e)}reindexAfterRemoval(e){for(let[t,n]of this.rowById.entries())n>e&&this.rowById.set(t,n-1);for(let t=0;t<this.sortedIndices.length;t++)this.sortedIndices[t]>e&&this.sortedIndices[t]--;let t=new Set;for(let n of this.filteredIndices)n>e?t.add(n-1):t.add(n);this.filteredIndices=t;let n=new Map;for(let[t,r]of this.rowSortCache)t>e?n.set(t-1,r):n.set(t,r);this.rowSortCache=n}updateCell(e,t,n){let r=this.rowById.get(e);if(r===void 0){console.warn(`Row with ID ${e} not found.`);return}let i=this.rows[r],a=this.options.getFieldValue(i,t);if(_(i,t,n),this.updateDistinctValueForField(t,a,n),this.sortModel.some(e=>e.colId===t)&&this.sortModel.length>0){this.computeRowHashes(r,i);let e=this.sortedIndices.indexOf(r);e!==-1&&this.sortedIndices.splice(e,1);let t=this.binarySearchInsertPosition(r);this.sortedIndices.splice(t,0,r)}t in this.filterModel&&(this.rowPassesFilter(i)?this.filteredIndices.add(r):this.filteredIndices.delete(r))}updateRow(e,t){for(let[n,r]of Object.entries(t))this.updateCell(e,n,r)}setSortModel(e){let t=JSON.stringify(e);t!==this.sortModelHash&&(this.sortModelHash=t,this.sortModel=[...e],this.rebuildHashCache(),this.rebuildSortedIndices())}getSortModel(){return[...this.sortModel]}setFilterModel(e){JSON.stringify(e)!==JSON.stringify(this.filterModel)&&(this.filterModel={...e},this.rebuildFilteredIndices())}getFilterModel(){return{...this.filterModel}}rebuildSortedIndices(){this.sortedIndices=Array.from({length:this.rows.length},(e,t)=>t),this.sortModel.length!==0&&this.sortedIndices.sort((e,t)=>this.compareRows(e,t))}rebuildHashCache(){if(this.rowSortCache.clear(),this.sortModel.length!==0)for(let e=0;e<this.rows.length;e++)this.computeRowHashes(e,this.rows[e])}computeRowHashes(e,t){if(this.sortModel.length===0)return;let n=st(t,{sortModel:this.sortModel,sortModelHash:this.sortModelHash,getFieldValue:this.options.getFieldValue}),r=this.rowSortCache.get(e);r||(r={hashes:new Map},this.rowSortCache.set(e,r)),r.hashes.set(this.sortModelHash,n)}compareRows(e,t){let n=this.rowSortCache.get(e),r=this.rowSortCache.get(t),i=n?.hashes.get(this.sortModelHash),a=r?.hashes.get(this.sortModelHash),o=ct(i,a,this.sortModel);return o===null?lt(this.rows[e],this.rows[t],this.sortModel,this.options.getFieldValue):o}binarySearchInsertPosition(e){let t=0,n=this.sortedIndices.length;for(;t<n;){let r=t+n>>>1,i=this.sortedIndices[r];this.compareRows(e,i)>0?t=r+1:n=r}return t}rebuildFilteredIndices(){if(this.filteredIndices.clear(),Object.entries(this.filterModel).some(([,e])=>e!=null))for(let e=0;e<this.rows.length;e++)this.rowPassesFilter(this.rows[e])&&this.filteredIndices.add(e)}rowPassesFilter(e){return kt(e,this.filterModel,this.options.getFieldValue,this.options.getValueFormatter)}getVisibleIndices(){return Object.entries(this.filterModel).some(([,e])=>e!=null)?this.sortedIndices.filter(e=>this.filteredIndices.has(e)):this.sortedIndices}rebuildDistinctValues(){this.distinctValues.clear();for(let e of this.rows)this.updateDistinctValuesForRow(e,`add`)}updateDistinctValuesForRow(e,t){if(!(typeof e!=`object`||!e))for(let[n,r]of Object.entries(e))r!=null&&(t===`add`?this.addToDistinctValues(n,r):this.decrementDistinctValues(n,r))}updateDistinctValueForField(e,t,n){t!=null&&this.decrementDistinctValues(e,t),n!=null&&this.addToDistinctValues(e,n)}addToDistinctValues(e,t){let n=this.distinctValues.get(e);if(n||(n=new Map,this.distinctValues.set(e,n)),Array.isArray(t)){for(let e of t)e!=null&&Pt(n,e);return}Pt(n,t)}decrementDistinctValues(e,t){let n=this.distinctValues.get(e);if(n!==void 0){if(Array.isArray(t)){for(let e of t)e!=null&&Ft(n,e);return}Ft(n,t)}}};const Pt=(e,t)=>{e.set(t,(e.get(t)??0)+1)},Ft=(e,t)=>{let n=e.get(t);if(n!==void 0){if(n<=1){e.delete(t);return}e.set(t,n-1)}};function It(e,t){let{getRowId:n,getFieldValue:r,getValueFormatter:i,debounceMs:a=50,onTransactionProcessed:o,useWorker:s=!0,parallelSort:c}=t,l=new Nt({getRowId:n,getFieldValue:r??Y,getValueFormatter:i},e),u=new Set,d=v().emit,f=s&&c!==!1?new W(c):null,p=new M({debounceMs:a,store:l,onProcessed:e=>{o?.(e);for(let t of u)t(e)}});return{loadMode:`all`,async query(e){if(p.hasPending()){d({type:`DATA_LOADING`});try{await p.flush()}finally{d({type:`DATA_LOADED`,totalRows:l.getTotalRowCount()})}}let t=l.getAllRows(),n=r??Y;if(e.filter&&Object.keys(e.filter).length>0){let r=e.valueFormatters===null?i:t=>e.valueFormatters?.[t];t=At(t,e.filter,n,r)}if(e.sort&&e.sort.length>0)if(f&&f.isAvailable()&&t.length>=2e5){d({type:`DATA_LOADING`});try{t=await bt(t,e.sort,f,n)}finally{d({type:`DATA_LOADED`,totalRows:t.length})}}else t=ft(t,e.sort,n);let a=t.length;return{rows:t.slice(e.range.startRow,e.range.endRow),totalRows:a}},addRows(e){p.add(e)},removeRows(e){p.remove(e)},updateCell(e,t,n){p.updateCell(e,t,n)},updateRow(e,t){p.updateRow(e,t)},async flushTransactions(){await p.flush()},hasPendingTransactions(){return p.hasPending()},getDistinctValues(e){return l.getDistinctValues(e)},getRowById(e){return l.getRowById(e)},getTotalRowCount(){return l.getTotalRowCount()},subscribe(e){return u.add(e),()=>{u.delete(e)}},clear(){let e=l.getTotalRowCount();l.clear();let t={added:0,removed:e,updated:0};o?.(t);for(let e of u)e(t)},moveRow(e,t){l.moveRow(e,t)}}}const Lt=`
211
+ `,{maxWorkers:t}),this.parallelThreshold=e.parallelThreshold??4e5,this.minChunkSize=e.minChunkSize??5e4}isAvailable(){return!this.isTerminated&&this.pool.isAvailable()}terminate(){this.pool.terminate(),this.isTerminated=!0}async sortIndices(e,t){return this.assertNotTerminated(),e.length<this.parallelThreshold?this.sortIndicesSingle(e,t):this.sortIndicesParallel(e,t)}async sortStringHashes(e,t,n){return this.assertNotTerminated(),(e[0]?.length??0)<this.parallelThreshold?this.sortStringHashesSingle(e,t,n):this.sortStringHashesParallel(e,t,n)}async sortMultiColumn(e,t){return this.assertNotTerminated(),(e[0]?.length??0)<this.parallelThreshold?this.sortMultiColumnSingle(e,t):this.sortMultiColumnParallel(e,t)}assertNotTerminated(){if(this.isTerminated)throw Error(`ParallelSortManager has been terminated`)}async sortIndicesSingle(e,t){let n=new Float64Array(e),r={type:`sortIndices`,id:0,values:n,direction:t};return(await this.pool.execute(r,[n.buffer])).indices}async sortStringHashesSingle(e,t,n){let r={type:`sortStringHashes`,id:0,hashChunks:e,direction:t},i=e.map(e=>e.buffer),a=await this.pool.execute(r,i);return a.collisionRuns.length>0&&ct(a.indices,a.collisionRuns,n,t),a.indices}async sortMultiColumnSingle(e,t){let n=e.map(e=>new Float64Array(e)),r=new Int8Array(t.map(e=>e===`asc`?1:-1)),i={type:`sortMultiColumn`,id:0,columns:n,directions:r},a=[...n.map(e=>e.buffer),r.buffer];return(await this.pool.execute(i,a)).indices}boundariesFor(e){return ot(e,this.pool.getMaxWorkers(),this.minChunkSize)}async runChunks(e){let t=await this.pool.executeParallel(e);return t.sort((e,t)=>e.chunkOffset-t.chunkOffset),t}async sortIndicesParallel(e,t){let n=this.boundariesFor(e.length).map(n=>{let r=new Float64Array(e.slice(n.offset,n.offset+n.length));return{request:{type:`sortChunk`,id:0,values:r,direction:t,chunkOffset:n.offset},transferables:[r.buffer]}});return W((await this.runChunks(n)).map(e=>({indices:e.indices,values:e.sortedValues,offset:e.chunkOffset})),t)}async sortStringHashesParallel(e,t,n){let r=this.boundariesFor(e[0].length).map(n=>{let r=e.map(e=>{let t=new Float64Array(n.length);return t.set(new Float64Array(e.buffer,n.offset*8,n.length)),t});return{request:{type:`sortStringChunk`,id:0,hashChunks:r,direction:t,chunkOffset:n.offset},transferables:r.map(e=>e.buffer)}}),i=await this.runChunks(r),a=i.map(e=>({indices:e.indices,values:e.sortedHashes,offset:e.chunkOffset})),o=dt(i),s=W(a,t),c=st(a),l=new Uint32Array([...o,...c]);return l.length>0&&ct(s,l,n,t),s}async sortMultiColumnParallel(e,t){let n=this.boundariesFor(e[0].length),r=new Int8Array(t.map(e=>e===`asc`?1:-1)),i=n.map(t=>{let n=e.map(e=>{let n=new Float64Array(t.length);for(let r=0;r<t.length;r++)n[r]=e[t.offset+r];return n}),i=new Int8Array(r);return{request:{type:`sortMultiColumnChunk`,id:0,columns:n,directions:i,chunkOffset:t.offset},transferables:[...n.map(e=>e.buffer),i.buffer]}});return it((await this.runChunks(i)).map(e=>({indices:e.indices,columns:e.sortedColumns,directions:r,offset:e.chunkOffset})))}};const dt=e=>{let t=[];for(let n of e)for(let e=0;e<n.collisionRuns.length;e+=2)t.push(n.collisionRuns[e]+n.chunkOffset,n.collisionRuns[e+1]+n.chunkOffset);return t};function K(e){let t=e.toLowerCase(),n=Math.min(t.length,10),r=0;for(let e=0;e<n;e++){let n=t.codePointAt(e)??200,i;i=n>=97&&n<=122?n-97:n>=48&&n<=57?n-48+26:0,r=r*36+i}for(let e=n;e<10;e++)r*=36;return r}function q(e,t){let n=e==null||Array.isArray(e)&&e.length===0,r=t==null||Array.isArray(t)&&t.length===0;if(n&&r)return 0;if(n)return 1;if(r)return-1;if(Array.isArray(e)||Array.isArray(t)){let n=Array.isArray(e)?e.join(`, `):y(e),r=Array.isArray(t)?t.join(`, `):y(t);return n.localeCompare(r)}let i=Number(e),a=Number(t);return!Number.isNaN(i)&&!Number.isNaN(a)?i-a:e instanceof Date&&t instanceof Date?e.getTime()-t.getTime():y(e).localeCompare(y(t))}function ft(e){if(e==null)return Number.MAX_VALUE;if(typeof e==`number`)return e;if(e instanceof Date)return e.getTime();if(typeof e==`string`)return K(e);if(Array.isArray(e))return e.length===0?Number.MAX_VALUE:K(e.join(`, `));if(typeof e==`object`)return K(JSON.stringify(e));let t=Number(e);return Number.isNaN(t)?0:t}function pt(e,t){let n=[];for(let r of t.sortModel){let i=ft(t.getFieldValue(e,r.colId));n.push(i)}return n}function mt(e,t,n){if(!e||!t)return null;for(let r=0;r<n.length;r++){let i=e[r]-t[r];if(i!==0)return n[r].direction===`asc`?i:-i}return 0}function ht(e,t,n,r){for(let{colId:i,direction:a}of n){let n=q(r(e,i),r(t,i));if(n!==0)return a===`asc`?n:-n}return 0}function gt(e){let t=e.toLowerCase(),n=[];for(let e=0;e<3;e++){let r=e*10,i=0;for(let e=0;e<10;e++){let n=r+e,a=n<t.length?t.codePointAt(n)??200:0,o;o=a>=97&&a<=122?a-97:a>=48&&a<=57?a-48+26:0,i=i*36+o}n.push(i)}return n}function _t(e){if(e==null)return Number.MAX_VALUE;if(Array.isArray(e))return e.length===0?Number.MAX_VALUE:K(e.join(`, `));if(typeof e==`number`)return e;if(e instanceof Date)return e.getTime();if(typeof e==`string`)return K(e);if(typeof e==`object`)return K(JSON.stringify(e));let t=Number(e);return Number.isNaN(t)?0:t}function vt(e,t,n){return[...e].sort((e,r)=>{for(let{colId:i,direction:a}of t){let t=q(n(e,i),n(r,i));if(t!==0)return a===`asc`?t:-t}return 0})}const yt=(e,t,n)=>{for(let r of e){let e=n(r,t);if(e!=null)return typeof e==`string`||Array.isArray(e)||typeof e==`object`&&!(e instanceof Date)?`string`:`numeric`}return`numeric`},bt=(e,t,n)=>{let r=[],i=Array.from({length:3},()=>[]);for(let a of e){let e=y(n(a,t));r.push(e);let o=gt(e);for(let e=0;e<3;e++)i[e].push(o[e])}return{originalStrings:r,hashChunkArrays:i.map(e=>new Float64Array(e))}},xt=(e,t,n)=>e.map(e=>_t(n(e,t))),St=(e,t,n)=>{let r=[],i=[];for(let{colId:a,direction:o}of t)r.push(e.map(e=>_t(n(e,a)))),i.push(o??`asc`);return{columnValues:r,directions:i}},Ct=(e,t)=>{let n=Array(e.length);for(let r=0;r<t.length;r++)n[r]=e[t[r]];return n},wt=async(e,t,n,r)=>{let{colId:i,direction:a}=t,o=a??`asc`;if(yt(e,i,r)===`string`){let{originalStrings:t,hashChunkArrays:a}=bt(e,i,r);return n.sortStringHashes(a,o,t)}let s=xt(e,i,r);return n.sortIndices(s,o)},Tt=async(e,t,n,r)=>{let{columnValues:i,directions:a}=St(e,t,r);return n.sortMultiColumn(i,a)},Et=async(e,t,n,r)=>{let i=t.length===1?await wt(e,t[0],n,r):await Tt(e,t,n,r);return Ct(e,i)};function J(e,t){return e.getFullYear()===t.getFullYear()&&e.getMonth()===t.getMonth()&&e.getDate()===t.getDate()}const Dt={contains:(e,t)=>e.includes(t),notContains:(e,t)=>!e.includes(t),equals:(e,t)=>e===t,notEquals:(e,t)=>e!==t,startsWith:(e,t)=>e.startsWith(t),endsWith:(e,t)=>e.endsWith(t),blank:(e,t,n)=>n,notBlank:(e,t,n)=>!n},Ot=new WeakMap,kt=e=>{let t=Ot.get(e);if(t?.size===e.size)return t.keys;let n=new Set;for(let t of e)n.add(M(t));return Ot.set(e,{size:e.size,keys:n}),n};function At(e,t,n){let r=N(e);if(t.selectedValues!==void 0)return r?t.includeBlank===!0:kt(t.selectedValues).has(M(e));let i=y(e,n).toLowerCase(),a=String(t.value??``).toLowerCase();return Dt[t.operator](i,a,r)}const jt={"=":(e,t)=>e===t,"!=":(e,t)=>e!==t,">":(e,t)=>e>t,"<":(e,t)=>e<t,">=":(e,t)=>e>=t,"<=":(e,t)=>e<=t,between:(e,t,n)=>e>=t&&e<=n};function Mt(e,t){let n=e==null||e===``;if(t.operator===`blank`)return n;if(t.operator===`notBlank`)return!n;if(n)return!1;let r=typeof e==`number`?e:Number(e);if(Number.isNaN(r))return!1;let i=t.value??0,a=t.valueTo??0;return jt[t.operator](r,i,a)}const Nt={"=":(e,t)=>J(e,t),"!=":(e,t)=>!J(e,t),">":(e,t)=>e.getTime()>t.getTime(),"<":(e,t)=>e.getTime()<t.getTime(),between:(e,t,n)=>{let r=e.getTime();return r>=t.getTime()&&r<=n.getTime()}};function Pt(e,t){let n=e==null||e===``;if(t.operator===`blank`)return n;if(t.operator===`notBlank`)return!n;if(n)return!1;let r=e instanceof Date?e:new Date(y(e));if(Number.isNaN(r.getTime()))return!1;let i=t.value instanceof Date?t.value:new Date(String(t.value??``)),a=t.valueTo instanceof Date?t.valueTo:new Date(String(t.valueTo??``));return Nt[t.operator](r,i,a)}function Ft(e,t,n){switch(t.type){case`text`:return At(e,t,n);case`number`:return Mt(e,t);case`date`:return Pt(e,t);default:return!0}}function Y(e,t,n){if(!t.conditions||t.conditions.length===0)return!0;let r=t.conditions[0];if(!r)return!0;let i=Ft(e,r,n);for(let r=1;r<t.conditions.length;r++){let a=t.conditions[r-1],o=t.conditions[r],s=a.nextOperator??t.combination,c=Ft(e,o,n);s===`and`?i&&=c:i||=c}return i}function It(e,t,n,r){let i=Object.entries(t).filter(([,e])=>e!=null);if(i.length===0)return!0;for(let[t,a]of i){let i=n(e,t),o=r?.(t);if(!Y(i,a,o))return!1}return!0}function Lt(e,t,n,r){let i=Object.entries(t).filter(([,e])=>typeof e==`string`?e.trim()!==``:e.conditions&&e.conditions.length>0);return i.length===0?e:e.filter(e=>{for(let[t,a]of i){let i=n(e,t),o=r?.(t);if(typeof a==`string`){if(!y(i,o).toLowerCase().includes(a.toLowerCase()))return!1;continue}if(!Y(i,a,o))return!1}return!0})}function X(e,t){let n=t.split(`.`),r=e;for(let e of n){if(typeof r!=`object`||!r)return null;r=r[e]}return r}function Rt(e,t={}){let{getFieldValue:n=X,getValueFormatter:r,useWorker:i=!0,parallelSort:a}=t,o=e,s=!1,c=i?new G(a===!1?{maxWorkers:1}:a):null;return{loadMode:`all`,async query(e){let t=o?[...o]:[];if(e.filter&&Object.keys(e.filter).length>0){let i=e.valueFormatters===null?r:t=>e.valueFormatters?.[t];t=Lt(t,e.filter,n,i)}e.sort&&e.sort.length>0&&(t=c&&c.isAvailable()&&t.length>=2e5?await Et(t,e.sort,c,n):vt(t,e.sort,n));let i=t.length;return{rows:t.slice(e.range.startRow,e.range.endRow),totalRows:i}},destroy(){s||(s=!0,o=null,c&&c.terminate())},moveRow(e,t){if(!o||e===t||e<0||e>=o.length||t<0||t>=o.length)return;let[n]=o.splice(e,1),r=t>e?t-1:t;o.splice(r,0,n)}}}function Z(e){return Rt(e)}function zt(e,t={}){return{loadMode:t.loadMode??`paginated`,async query(t){return e(t)}}}var Bt=class{rows=[];rowById=new Map;sortedIndices=[];sortModel=[];sortModelHash=``;filterModel={};filteredIndices=new Set;distinctValues=new Map;rowSortCache=new Map;options;constructor(e,t=[]){this.options={getRowId:e.getRowId,getFieldValue:e.getFieldValue??g,getValueFormatter:e.getValueFormatter??(()=>void 0)},this.setData(t)}clear(){this.rows=[],this.rowById.clear(),this.sortedIndices=[],this.filterModel={},this.filteredIndices.clear(),this.rowSortCache.clear(),this.distinctValues.clear(),this.sortModel=[],this.sortModelHash=``}setData(e){this.rows=[...e],this.rowById.clear(),this.rowSortCache.clear(),this.distinctValues.clear();for(let e=0;e<this.rows.length;e++){let t=this.rows[e],n=this.options.getRowId(t);this.rowById.set(n,e)}this.rebuildSortedIndices(),this.rebuildFilteredIndices(),this.rebuildDistinctValues()}query(e){this.setSortModel(e.sort??[]),this.setFilterModel(e.filter??{});let t=this.getVisibleIndices(),n=t.length,r=e.range.startRow,i=Math.min(e.range.endRow,n),a=[];for(let e=r;e<i;e++){let n=t[e];n!==void 0&&a.push(this.rows[n])}return{rows:a,totalRows:n}}getRowById(e){let t=this.rowById.get(e);return t===void 0?void 0:this.rows[t]}getRowByIndex(e){return this.rows[e]}getTotalRowCount(){return this.rows.length}getAllRows(){return[...this.rows]}moveRow(e,t){if(e===t||e<0||e>=this.rows.length||t<0||t>=this.rows.length)return;let[n]=this.rows.splice(e,1),r=t>e?t-1:t;this.rows.splice(r,0,n),this.rowById.clear();for(let e=0;e<this.rows.length;e++)this.rowById.set(this.options.getRowId(this.rows[e]),e);this.sortedIndices=Array.from({length:this.rows.length},(e,t)=>t),this.rowSortCache.clear()}getVisibleRowCount(){return Object.keys(this.filterModel).length===0?this.rows.length:this.filteredIndices.size}getDistinctValues(e){let t=this.distinctValues.get(e);return t?Array.from(t.keys()):[]}addRows(e){for(let t of e)this.addRow(t)}addRow(e){let t=this.options.getRowId(e);if(this.rowById.has(t)){console.warn(`Row with ID ${t} already exists. Skipping.`);return}let n=this.rows.length;if(this.rows.push(e),this.rowById.set(t,n),this.updateDistinctValuesForRow(e,`add`),this.sortModel.length>0&&this.computeRowHashes(n,e),this.sortModel.length>0){let e=this.binarySearchInsertPosition(n);this.sortedIndices.splice(e,0,n)}else this.sortedIndices.push(n);this.rowPassesFilter(e)&&this.filteredIndices.add(n)}removeRows(e){let t=[];for(let n of e){let e=this.rowById.get(n);e!==void 0&&t.push(e)}if(t.length===0)return 0;t.sort((e,t)=>t-e);for(let e of t)this.removeRowByIndex(e);return t.length}removeRowByIndex(e){let t=this.rows[e];if(!t)return;let n=this.options.getRowId(t);this.updateDistinctValuesForRow(t,`remove`);let r=this.sortedIndices.indexOf(e);r!==-1&&this.sortedIndices.splice(r,1),this.filteredIndices.delete(e),this.rowSortCache.delete(e),this.rowById.delete(n),this.rows.splice(e,1),this.reindexAfterRemoval(e)}reindexAfterRemoval(e){for(let[t,n]of this.rowById.entries())n>e&&this.rowById.set(t,n-1);for(let t=0;t<this.sortedIndices.length;t++)this.sortedIndices[t]>e&&this.sortedIndices[t]--;let t=new Set;for(let n of this.filteredIndices)n>e?t.add(n-1):t.add(n);this.filteredIndices=t;let n=new Map;for(let[t,r]of this.rowSortCache)t>e?n.set(t-1,r):n.set(t,r);this.rowSortCache=n}updateCell(e,t,n){let r=this.rowById.get(e);if(r===void 0){console.warn(`Row with ID ${e} not found.`);return}let i=this.rows[r],a=this.options.getFieldValue(i,t);if(_(i,t,n),this.updateDistinctValueForField(t,a,n),this.sortModel.some(e=>e.colId===t)&&this.sortModel.length>0){this.computeRowHashes(r,i);let e=this.sortedIndices.indexOf(r);e!==-1&&this.sortedIndices.splice(e,1);let t=this.binarySearchInsertPosition(r);this.sortedIndices.splice(t,0,r)}t in this.filterModel&&(this.rowPassesFilter(i)?this.filteredIndices.add(r):this.filteredIndices.delete(r))}updateRow(e,t){for(let[n,r]of Object.entries(t))this.updateCell(e,n,r)}setSortModel(e){let t=JSON.stringify(e);t!==this.sortModelHash&&(this.sortModelHash=t,this.sortModel=[...e],this.rebuildHashCache(),this.rebuildSortedIndices())}getSortModel(){return[...this.sortModel]}setFilterModel(e){JSON.stringify(e)!==JSON.stringify(this.filterModel)&&(this.filterModel={...e},this.rebuildFilteredIndices())}getFilterModel(){return{...this.filterModel}}rebuildSortedIndices(){this.sortedIndices=Array.from({length:this.rows.length},(e,t)=>t),this.sortModel.length!==0&&this.sortedIndices.sort((e,t)=>this.compareRows(e,t))}rebuildHashCache(){if(this.rowSortCache.clear(),this.sortModel.length!==0)for(let e=0;e<this.rows.length;e++)this.computeRowHashes(e,this.rows[e])}computeRowHashes(e,t){if(this.sortModel.length===0)return;let n=pt(t,{sortModel:this.sortModel,sortModelHash:this.sortModelHash,getFieldValue:this.options.getFieldValue}),r=this.rowSortCache.get(e);r||(r={hashes:new Map},this.rowSortCache.set(e,r)),r.hashes.set(this.sortModelHash,n)}compareRows(e,t){let n=this.rowSortCache.get(e),r=this.rowSortCache.get(t),i=n?.hashes.get(this.sortModelHash),a=r?.hashes.get(this.sortModelHash),o=mt(i,a,this.sortModel);return o===null?ht(this.rows[e],this.rows[t],this.sortModel,this.options.getFieldValue):o}binarySearchInsertPosition(e){let t=0,n=this.sortedIndices.length;for(;t<n;){let r=t+n>>>1,i=this.sortedIndices[r];this.compareRows(e,i)>0?t=r+1:n=r}return t}rebuildFilteredIndices(){if(this.filteredIndices.clear(),Object.entries(this.filterModel).some(([,e])=>e!=null))for(let e=0;e<this.rows.length;e++)this.rowPassesFilter(this.rows[e])&&this.filteredIndices.add(e)}rowPassesFilter(e){return It(e,this.filterModel,this.options.getFieldValue,this.options.getValueFormatter)}getVisibleIndices(){return Object.entries(this.filterModel).some(([,e])=>e!=null)?this.sortedIndices.filter(e=>this.filteredIndices.has(e)):this.sortedIndices}rebuildDistinctValues(){this.distinctValues.clear();for(let e of this.rows)this.updateDistinctValuesForRow(e,`add`)}updateDistinctValuesForRow(e,t){if(!(typeof e!=`object`||!e))for(let[n,r]of Object.entries(e))r!=null&&(t===`add`?this.addToDistinctValues(n,r):this.decrementDistinctValues(n,r))}updateDistinctValueForField(e,t,n){t!=null&&this.decrementDistinctValues(e,t),n!=null&&this.addToDistinctValues(e,n)}addToDistinctValues(e,t){let n=this.distinctValues.get(e);if(n||(n=new Map,this.distinctValues.set(e,n)),Array.isArray(t)){for(let e of t)e!=null&&Vt(n,e);return}Vt(n,t)}decrementDistinctValues(e,t){let n=this.distinctValues.get(e);if(n!==void 0){if(Array.isArray(t)){for(let e of t)e!=null&&Ht(n,e);return}Ht(n,t)}}};const Vt=(e,t)=>{e.set(t,(e.get(t)??0)+1)},Ht=(e,t)=>{let n=e.get(t);if(n!==void 0){if(n<=1){e.delete(t);return}e.set(t,n-1)}};function Ut(e,t){let{getRowId:n,getFieldValue:r,getValueFormatter:i,debounceMs:a=50,onTransactionProcessed:o,useWorker:s=!0,parallelSort:c}=t,l=new Bt({getRowId:n,getFieldValue:r??X,getValueFormatter:i},e),u=new Set,d=v().emit,f=s&&c!==!1?new G(c):null,p=new F({debounceMs:a,store:l,onProcessed:e=>{o?.(e);for(let t of u)t(e)}});return{loadMode:`all`,async query(e){if(p.hasPending()){d({type:`DATA_LOADING`});try{await p.flush()}finally{d({type:`DATA_LOADED`,totalRows:l.getTotalRowCount()})}}let t=l.getAllRows(),n=r??X;if(e.filter&&Object.keys(e.filter).length>0){let r=e.valueFormatters===null?i:t=>e.valueFormatters?.[t];t=Lt(t,e.filter,n,r)}if(e.sort&&e.sort.length>0)if(f&&f.isAvailable()&&t.length>=2e5){d({type:`DATA_LOADING`});try{t=await Et(t,e.sort,f,n)}finally{d({type:`DATA_LOADED`,totalRows:t.length})}}else t=vt(t,e.sort,n);let a=t.length;return{rows:t.slice(e.range.startRow,e.range.endRow),totalRows:a}},addRows(e){p.add(e)},removeRows(e){p.remove(e)},updateCell(e,t,n){p.updateCell(e,t,n)},updateRow(e,t){p.updateRow(e,t)},async flushTransactions(){await p.flush()},hasPendingTransactions(){return p.hasPending()},getDistinctValues(e){return l.getDistinctValues(e)},getRowById(e){return l.getRowById(e)},getTotalRowCount(){return l.getTotalRowCount()},subscribe(e){return u.add(e),()=>{u.delete(e)}},clear(){let e=l.getTotalRowCount();l.clear();let t={added:0,removed:e,updated:0};o?.(t);for(let e of u)e(t)},moveRow(e,t){l.moveRow(e,t)}}}const Wt=`
209
212
  /* =============================================================================
210
213
  GP Grid - CSS Variables for Theming
211
214
  ============================================================================= */
@@ -289,7 +292,7 @@ self.onmessage = function(e) {
289
292
  --gp-grid-scrollbar-thumb: #373a40;
290
293
  --gp-grid-scrollbar-thumb-hover: #4a4d52;
291
294
  }
292
- `,Rt=`
295
+ `,Gt=`
293
296
  /* =============================================================================
294
297
  GP Grid - Clean Flat Design
295
298
  ============================================================================= */
@@ -319,7 +322,7 @@ self.onmessage = function(e) {
319
322
  :where(.gp-grid-container:focus) {
320
323
  border-color: var(--gp-grid-primary);
321
324
  }
322
- `,zt=`
325
+ `,Kt=`
323
326
  /* =============================================================================
324
327
  Header
325
328
  ============================================================================= */
@@ -562,7 +565,7 @@ self.onmessage = function(e) {
562
565
  background-color: var(--gp-grid-primary);
563
566
  border-radius: 2px;
564
567
  }
565
- `,Bt=`
568
+ `,qt=`
566
569
  /* =============================================================================
567
570
  Data Cells
568
571
  ============================================================================= */
@@ -733,7 +736,7 @@ self.onmessage = function(e) {
733
736
  -webkit-user-select: text;
734
737
  }
735
738
 
736
- `,Vt=`
739
+ `,Jt=`
737
740
  /* =============================================================================
738
741
  Loading & Error States
739
742
  ============================================================================= */
@@ -847,7 +850,7 @@ self.onmessage = function(e) {
847
850
  font-size: 14px;
848
851
  text-align: center;
849
852
  }
850
- `,Ht=`
853
+ `,Yt=`
851
854
  /* =============================================================================
852
855
  Scrollbar Styling
853
856
  ============================================================================= */
@@ -873,7 +876,7 @@ self.onmessage = function(e) {
873
876
  :where(.gp-grid-container)::-webkit-scrollbar-corner {
874
877
  background-color: var(--gp-grid-scrollbar-track);
875
878
  }
876
- `,Ut=`
879
+ `,Xt=`
877
880
  /* =============================================================================
878
881
  Filter Popup
879
882
  ============================================================================= */
@@ -1250,7 +1253,7 @@ self.onmessage = function(e) {
1250
1253
  :where(.gp-grid-filter-btn-apply:hover) {
1251
1254
  opacity: 0.9;
1252
1255
  }
1253
- `,Wt=`
1256
+ `,Zt=`
1254
1257
  /* =============================================================================
1255
1258
  Row Drag
1256
1259
  ============================================================================= */
@@ -1313,5 +1316,5 @@ self.onmessage = function(e) {
1313
1316
  background-color: var(--gp-grid-primary);
1314
1317
  border-radius: 2px;
1315
1318
  }
1316
- `,Gt=[Lt,Rt,zt,Bt,Vt,Ht,Ut,Wt].join(`
1317
- `),Kt=e=>({slots:new Map,activeCell:null,selectionRange:null,editingCell:null,peekCell:null,contentWidth:0,contentHeight:e?.initialHeight??0,viewportWidth:e?.initialWidth??0,viewportHeight:e?.initialHeight??0,rowsWrapperOffset:0,headers:new Map,filterPopup:null,isLoading:!1,error:null,totalRows:0,visibleRowRange:null,hoverPosition:null,columns:null,pendingScrollTop:null}),qt=(e,t,n)=>{switch(e.type){case`CREATE_SLOT`:return t.set(e.slotId,{slotId:e.slotId,rowIndex:-1,rowData:{},translateY:0}),null;case`DESTROY_SLOT`:return t.delete(e.slotId),null;case`ASSIGN_SLOT`:{let n=t.get(e.slotId);return n&&t.set(e.slotId,{...n,rowIndex:e.rowIndex,rowData:e.rowData}),null}case`MOVE_SLOT`:{let n=t.get(e.slotId);return n&&t.set(e.slotId,{...n,translateY:e.translateY}),null}case`SCROLL_TO`:return{pendingScrollTop:e.scrollTop};case`SET_ACTIVE_CELL`:return{activeCell:e.position};case`SET_SELECTION_RANGE`:return{selectionRange:e.range};case`UPDATE_VISIBLE_RANGE`:return{visibleRowRange:{start:e.start,end:e.end},rowsWrapperOffset:e.rowsWrapperOffset};case`SET_HOVER_POSITION`:return{hoverPosition:e.position};case`START_EDIT`:return{editingCell:{row:e.row,col:e.col,initialValue:e.initialValue}};case`STOP_EDIT`:return{editingCell:null};case`START_PEEK`:return{peekCell:{row:e.row,col:e.col}};case`STOP_PEEK`:return{peekCell:null};case`SET_CONTENT_SIZE`:return{contentWidth:e.width,contentHeight:e.height,viewportWidth:e.viewportWidth,viewportHeight:e.viewportHeight,rowsWrapperOffset:e.rowsWrapperOffset};case`UPDATE_HEADER`:return n.set(e.colIndex,{column:e.column,sortDirection:e.sortDirection,sortIndex:e.sortIndex,hasFilter:e.hasFilter}),null;case`OPEN_FILTER_POPUP`:return{filterPopup:{isOpen:!0,colIndex:e.colIndex,column:e.column,anchorRect:e.anchorRect,distinctValues:e.distinctValues,currentFilter:e.currentFilter}};case`CLOSE_FILTER_POPUP`:return{filterPopup:null};case`DATA_LOADING`:return{isLoading:!0,error:null};case`DATA_LOADED`:return{isLoading:!1,totalRows:e.totalRows};case`DATA_ERROR`:return{isLoading:!1,error:e.error};case`ROWS_ADDED`:case`ROWS_REMOVED`:return{totalRows:e.totalRows};case`ROWS_UPDATED`:case`TRANSACTION_PROCESSED`:return null;case`COLUMNS_CHANGED`:return{columns:e.columns};default:return null}},Z=e=>({clientX:e.clientX,clientY:e.clientY,button:e.button,shiftKey:e.shiftKey,ctrlKey:e.ctrlKey,metaKey:e.metaKey,pointerId:e.pointerId,pointerType:e.pointerType});var Jt=class{intervalId=null;lastPointerEvent=null;getBodyEl;onTick;constructor(e,t){this.getBodyEl=e,this.onTick=t}recordPointer(e){this.lastPointerEvent=e}clearPointer(){this.lastPointerEvent=null}start(e,t){this.stop(),this.intervalId=setInterval(()=>{let n=this.getBodyEl();if(!n)return;n.scrollTop+=t,n.scrollLeft+=e;let r=this.lastPointerEvent;r&&this.onTick(r)},16)}stop(){this.intervalId!==null&&(clearInterval(this.intervalId),this.intervalId=null)}},Yt=class{timer=null;capture=null;savedContainerOverflow=null;blockTouchMove=e=>e.preventDefault();deps;constructor(e){this.deps=e}start(e){this.reset(),this.capture={pointerId:e.pointerId,target:e.currentTarget};let t=e.clientX,n=e.clientY,r=e=>{let r=e.clientX-t,i=e.clientY-n;(Math.abs(r)>10||Math.abs(i)>10)&&(this.cancel(),a())},i=()=>{this.cancel(),a()},a=()=>{document.removeEventListener(`pointermove`,r),document.removeEventListener(`pointerup`,i),document.removeEventListener(`pointercancel`,i)};document.addEventListener(`pointermove`,r),document.addEventListener(`pointerup`,i,{once:!0}),document.addEventListener(`pointercancel`,i,{once:!0}),this.timer=setTimeout(()=>{this.timer=null,a(),this.confirm()},300)}cancel(){this.reset(),this.deps.getCore()?.input.cancelPendingRowDrag()}reset(){this.timer!==null&&(clearTimeout(this.timer),this.timer=null),this.capture=null}releaseLocks(){if(!this.deps.isBrowser)return;let e=this.deps.getContainer();this.savedContainerOverflow!==null&&e&&(e.style.overflow=this.savedContainerOverflow),this.savedContainerOverflow=null,document.removeEventListener(`touchmove`,this.blockTouchMove)}confirm(){let e=this.deps.getCore(),t=this.capture;this.capture=null,e!==null&&e.input.confirmPendingRowDrag()&&(this.lockContainer(),document.addEventListener(`touchmove`,this.blockTouchMove,{passive:!1}),this.applyPointerCapture(t),this.deps.onDragConfirmed(e.input.getDragState()))}lockContainer(){let e=this.deps.getContainer();e&&(this.savedContainerOverflow=e.style.overflow,e.style.overflow=`hidden`)}applyPointerCapture(e){e&&Xt(e.target,e.pointerId)}};const Xt=(e,t)=>{try{return e.setPointerCapture(t),!0}catch{return!1}};var Zt=class{cleanup=null;deps;constructor(e){this.deps=e}start(e){if(!this.deps.isBrowser)return;this.detachListeners();let t=e.clientX,n=e.clientY,r=e=>{let r=e.clientX-t,i=e.clientY-n;(Math.abs(r)>10||Math.abs(i)>10)&&this.cancel()},i=()=>{this.cancel()},a=()=>{this.detachListeners(),this.deps.getCore()?.input.confirmPendingCellTap()&&this.deps.onTapConfirmed()};document.addEventListener(`pointermove`,r),document.addEventListener(`pointerup`,a,{once:!0}),document.addEventListener(`pointercancel`,i,{once:!0}),this.cleanup=()=>{document.removeEventListener(`pointermove`,r),document.removeEventListener(`pointerup`,a),document.removeEventListener(`pointercancel`,i)}}cancel(){this.detachListeners(),this.deps.getCore()?.input.cancelPendingCellTap()}detachListeners(){this.cleanup!==null&&(this.cleanup(),this.cleanup=null)}};const Qt=1.15,Q=2.4,$t=(e,t)=>e.filter(e=>t-e.time<=100),en=e=>{let t=e[0],n=e.at(-1);if(t===void 0||n===void 0||t===n)return 0;let r=n.time-t.time;if(r<=0)return 0;let i=(n.position-t.position)/r;return Math.max(-Qt,Math.min(Qt,i))},tn=(e,t)=>{let n=e*t>0?e+t:e;return Math.max(-Q,Math.min(Q,n))},nn=(e,t)=>{if(t>1500)return e;if(e===null)return t;let n=t>e?.5:.15;return e+(t-e)*n},rn=e=>{if(e===null||e<=0)return Q;let t=250/e;return Math.max(.25,Math.min(Q,t))},an=(e,t)=>({position:e.position+e.velocity*Math.min(t,64),velocity:e.velocity*Math.exp(-t/400)}),on=e=>Math.abs(e)<.01,$=(e,t,n)=>Math.min(Math.max(e,t),Math.max(t,n));var sn=class{deps;attachedEl=null;gesture=null;gestureCleanup=null;flingFrame=null;flingVelocity=0;dragFrame=null;pendingDragTarget=null;savedOverscrollBehavior=null;savedTouchAction=null;overrideActive=!1;lastPipelineRunMs=null;pipelineIntervalEmaMs=null;frameIntervalEmaMs=null;flingThrottled=!1;constructor(e){this.deps=e}attach(){if(!this.deps.isBrowser||this.attachedEl!==null)return;let e=this.deps.getScrollEl();e!==null&&(this.attachedEl=e,this.savedOverscrollBehavior=e.style.overscrollBehavior,this.savedTouchAction=e.style.touchAction,this.syncTouchPolicy(),e.addEventListener(`touchstart`,this.onTouchStart,{passive:!0}),e.addEventListener(`wheel`,this.onWheel,{passive:!0}))}detach(){this.stop(),this.clearGesture();let e=this.attachedEl;e!==null&&(this.attachedEl=null,e.removeEventListener(`touchstart`,this.onTouchStart),e.removeEventListener(`wheel`,this.onWheel),this.savedOverscrollBehavior!==null&&(e.style.overscrollBehavior=this.savedOverscrollBehavior,this.savedOverscrollBehavior=null),this.savedTouchAction!==null&&(e.style.touchAction=this.savedTouchAction,this.savedTouchAction=null))}syncTouchPolicy(){let e=this.attachedEl;if(e===null)return;let t=this.deps.getCore()?.isScalingActive()===!0,n=t?`none`:this.savedTouchAction??``,r=t?`contain`:this.savedOverscrollBehavior??``;e.style.touchAction!==n&&(e.style.touchAction=n),e.style.overscrollBehavior!==r&&(e.style.overscrollBehavior=r)}stop(){this.flingFrame!==null&&(globalThis.cancelAnimationFrame?.(this.flingFrame),this.flingFrame=null),this.releaseScrollOverride()}applySyntheticScrollTop(e,t,n,r){r!==null&&this.lastPipelineRunMs!==null&&(this.pipelineIntervalEmaMs=nn(this.pipelineIntervalEmaMs,r-this.lastPipelineRunMs)),this.lastPipelineRunMs=r,this.overrideActive=!0,e.setScrollTopOverride(n),t.scrollTop=n,e.setViewport(n,t.scrollLeft,t.clientWidth,t.clientHeight)}updateFlingThrottle(e){if(Math.abs(e)<=.35){this.flingThrottled=!1;return}let t=this.frameIntervalEmaMs;t!==null&&t>28&&(this.flingThrottled=!0)}isFlingPipelineDue(e){return this.flingThrottled?this.lastPipelineRunMs===null||e-this.lastPipelineRunMs>=100:!0}releaseScrollOverride(){if(!this.overrideActive)return;this.overrideActive=!1;let e=this.deps.getCore();if(e===null)return;e.setScrollTopOverride(null);let t=this.attachedEl;t!==null&&e.setViewport(t.scrollTop,t.scrollLeft,t.clientWidth,t.clientHeight)}onWheel=()=>{this.stop(),this.syncTouchPolicy()};onTouchStart=e=>{this.syncTouchPolicy(),this.gesture===null&&this.startTouchGesture(e)};startTouchGesture=e=>{let t=this.flingFrame===null?0:this.flingVelocity;this.stop();let n=this.deps.getCore(),r=this.attachedEl;if(!(n===null||r===null)&&n.isScalingActive()){if(e.target?.closest(`.gp-grid-fill-handle, .gp-grid-cell--row-drag-handle`))return;let n=e.changedTouches[0];if(n===void 0)return;this.gesture={touchId:n.identifier,startClientX:n.clientX,startClientY:n.clientY,baseScrollTop:r.scrollTop,baseScrollLeft:r.scrollLeft,engaged:!1,slopOffsetX:0,slopOffsetY:0,samples:[{time:e.timeStamp,position:0}],carriedVelocity:t},this.attachGestureListeners(r)}};attachGestureListeners(e){e.addEventListener(`touchmove`,this.onTouchMove,{passive:!1}),e.addEventListener(`touchend`,this.onTouchEnd,{passive:!0}),e.addEventListener(`touchcancel`,this.onTouchCancel,{passive:!0}),this.gestureCleanup=()=>{e.removeEventListener(`touchmove`,this.onTouchMove),e.removeEventListener(`touchend`,this.onTouchEnd),e.removeEventListener(`touchcancel`,this.onTouchCancel)}}clearGesture(){this.gesture=null,this.gestureCleanup?.(),this.gestureCleanup=null,this.dragFrame!==null&&(globalThis.cancelAnimationFrame?.(this.dragFrame),this.dragFrame=null),this.pendingDragTarget=null}findTrackedTouch(e){let t=this.gesture;if(t===null)return null;let n=e.changedTouches;for(let e of Array.from(n))if(e?.identifier===t.touchId)return e;return null}onTouchMove=e=>{let t=this.gesture,n=this.findTrackedTouch(e),r=this.deps.getCore(),i=this.attachedEl;if(t===null||n===null||r===null||i===null)return;if(r.input.getDragState().isDragging){this.clearGesture(),this.releaseScrollOverride();return}if(!e.cancelable){this.clearGesture(),this.releaseScrollOverride();return}e.preventDefault();let a=t.startClientX-n.clientX,o=t.startClientY-n.clientY;if(t.samples.push({time:e.timeStamp,position:o}),t.samples=$t(t.samples,e.timeStamp),!t.engaged){if(Math.abs(a)<=10&&Math.abs(o)<=10)return;t.engaged=!0,t.slopOffsetX=a,t.slopOffsetY=o}let s=r.getScrollRatio();this.pendingDragTarget={top:$(t.baseScrollTop+(o-t.slopOffsetY)*s,0,i.scrollHeight-i.clientHeight),left:$(t.baseScrollLeft+(a-t.slopOffsetX),0,i.scrollWidth-i.clientWidth)},this.scheduleDragApply(r,i)};scheduleDragApply(e,t){if(this.dragFrame!==null)return;let n=globalThis.requestAnimationFrame;if(n===void 0){this.flushPendingDrag(e,t,null);return}this.dragFrame=n(n=>{this.dragFrame=null,this.flushPendingDrag(e,t,n)})}flushPendingDrag(e,t,n){let r=this.pendingDragTarget;r!==null&&(this.pendingDragTarget=null,t.scrollLeft=r.left,this.applySyntheticScrollTop(e,t,r.top,n))}onTouchEnd=e=>{let t=this.gesture;if(t===null||this.findTrackedTouch(e)===null)return;let n=t.engaged,r=t.carriedVelocity,i=$t(t.samples,e.timeStamp),a=this.pendingDragTarget;this.clearGesture();let o=this.deps.getCore(),s=this.attachedEl;if(a!==null&&o!==null&&s!==null&&(s.scrollLeft=a.left,this.applySyntheticScrollTop(o,s,a.top,e.timeStamp)),!n)return;let c=en(i);if(Math.abs(c)<.25){this.releaseScrollOverride();return}this.startFling(tn(c,r))};onTouchCancel=e=>{this.findTrackedTouch(e)!==null&&(this.clearGesture(),this.releaseScrollOverride())};startFling(e){let t=globalThis.requestAnimationFrame,n=this.deps.getCore(),r=this.attachedEl;if(t===void 0||n===null||r===null)return;let i=rn(this.pipelineIntervalEmaMs),a=n.getScrollRatio(),o={position:r.scrollTop/a,velocity:$(e,-i,i)},s=null;this.flingVelocity=o.velocity,this.flingThrottled=!1;let c=e=>{this.flingFrame=null;let i=s===null?16:e-s;s!==null&&(this.frameIntervalEmaMs=nn(this.frameIntervalEmaMs,i)),s=e,o=an(o,i);let l=rn(this.pipelineIntervalEmaMs);o={...o,velocity:$(o.velocity,-l,l)},this.flingVelocity=o.velocity,this.updateFlingThrottle(o.velocity);let u=o.position*a,d=$(u,0,r.scrollHeight-r.clientHeight),f=d!==u,p=on(o.velocity)||f;if(p||this.isFlingPipelineDue(e)?this.applySyntheticScrollTop(n,r,d,e):r.scrollTop=d,p){this.releaseScrollOverride();return}this.flingFrame=t(c)};this.flingFrame=t(c)}};const cn=(e,t,n,r)=>{let i={slots:new Map(t),headers:new Map(n)};for(let t of e){let e=qt(t,i.slots,i.headers);e!==null&&ln(e,i,r)}return i},ln=(e,t,n)=>{e.slots!==void 0&&dn(t.slots,e.slots),e.headers!==void 0&&dn(t.headers,e.headers),un(e,n),e.columns!==void 0&&e.columns!==null&&n.setColumnsOverride(e.columns),e.filterPopup!==void 0&&n.onFilterPopupChange(e.filterPopup)},un=(e,t)=>{e.contentWidth!==void 0&&t.setContentWidth(e.contentWidth),e.contentHeight!==void 0&&t.setContentHeight(e.contentHeight),e.rowsWrapperOffset!==void 0&&t.setRowsWrapperOffset(e.rowsWrapperOffset),e.isLoading!==void 0&&t.setIsLoading(e.isLoading),e.error!==void 0&&t.setErrorMessage(e.error),e.totalRows!==void 0&&t.setTotalRows(e.totalRows),e.pendingScrollTop!==void 0&&t.setPendingScrollTop(e.pendingScrollTop),e.activeCell!==void 0&&t.setActiveCell(e.activeCell),e.selectionRange!==void 0&&t.setSelectionRange(e.selectionRange),e.editingCell!==void 0&&t.setEditingCell(e.editingCell),e.hoverPosition!==void 0&&t.setHoverPosition(e.hoverPosition),e.peekCell!==void 0&&t.setPeekCell(e.peekCell)},dn=(e,t)=>{e.clear(),t.forEach((t,n)=>e.set(n,t))};var fn=class{owned=null;lastAppliedRows=null;lastAppliedColumns=null;initialize(e,t){return e===null?(this.owned=X(t),this.lastAppliedRows=t,this.owned):e}syncRows(e,t){return t!==null||this.lastAppliedRows===e?null:(this.lastAppliedRows=e,e.length>1e4&&console.warn(`[gp-grid] rows input changed with ${e.length} rows — this triggers a full rebuild. Use createGridData() for efficient updates.`),this.owned?.destroy?.(),this.owned=X(e),this.owned)}syncColumns(e){return e.length===0||this.lastAppliedColumns===e?!1:(this.lastAppliedColumns=e,!0)}destroy(){this.owned?.destroy?.(),this.owned=null}},pn=class{deps;constructor(e){this.deps=e}headerPointerDown(e,t,n,r){let i=this.deps.getCore();return i===null?!1:i.input.handleHeaderMouseDown(e,t,n,Z(r)).preventDefault}resizePointerDown(e,t,n){let r=this.deps.getCore();return r===null?!1:r.input.handleHeaderResizeMouseDown(e,t,Z(n)).preventDefault}cellPointerDown(e,t,n){let r=this.deps.getCore();if(r===null)return{preventDefault:!1,focusContainer:!1};let i=r.input.handleCellMouseDown(e,t,Z(n));return this.dispatchCellDragStart(i,n),{preventDefault:i.preventDefault,focusContainer:i.focusContainer??!1}}cellPointerEnter(e,t){this.deps.getCore()?.input.handleCellMouseEnter(e,t)}cellPointerLeave(){this.deps.getCore()?.input.handleCellMouseLeave()}fillHandlePointerDown(e,t,n){let r=this.deps.getCore();if(r===null)return{preventDefault:!1,stopPropagation:!1};let i=r.input.handleFillHandleMouseDown(e,t,Z(n));return i.startDrag===`fill`&&(mn(n),this.deps.onDragStateChange(r.input.getDragState())),{preventDefault:i.preventDefault,stopPropagation:i.stopPropagation}}dragMove(e){let t=this.deps.getCore(),n=this.deps.getBodyEl();if(t===null||n===null)return;let r=n.getBoundingClientRect(),i=t.input.handleDragMove(Z(e),{top:r.top,left:r.left,width:r.width,height:r.height,scrollTop:n.scrollTop,scrollLeft:n.scrollLeft});this.deps.onDragStateChange(t.input.getDragState()),i?.autoScroll?this.deps.autoScroll.start(i.autoScroll.dx,i.autoScroll.dy):this.deps.autoScroll.stop()}documentPointerMove(e){let t=this.deps.getCore();if(t===null)return!1;let n=t.input.getDragState().isDragging;return this.deps.autoScroll.recordPointer(e),this.dragMove(e),n}documentPointerUp(){let e=this.deps.getCore();if(e===null)return{wasRowDrag:!1};let t=e.input.getDragState().dragType===`row-drag`;return this.deps.autoScroll.stop(),this.deps.autoScroll.clearPointer(),e.input.handleDragEnd(),this.deps.onDragStateChange(e.input.getDragState()),{wasRowDrag:t}}wheel(e,t,n){let r=this.deps.getCore();return r===null?null:r.input.handleWheel(e,t,n)}keyDown(e,t,n,r){let i=this.deps.getCore();return i===null?{preventDefault:!1}:i.input.handleKeyDown({key:e.key,shiftKey:e.shiftKey,ctrlKey:e.ctrlKey,metaKey:e.metaKey},t,n,r)}pasteText(e,t,n){let r=this.deps.getCore();return r===null||t!==null||n?!1:r.pasteClipboardText(e)}dispatchCellDragStart(e,t){let n=this.deps.getCore();if(n!==null){if(e.startTap===!0&&this.deps.pendingCellTap.start(t),e.startDrag===`selection`){n.input.startSelectionDrag(),this.deps.onDragStateChange(n.input.getDragState());return}if(e.startDrag===`row-drag`){this.deps.onDragStateChange(n.input.getDragState());return}e.startDrag===`row-drag-pending`&&this.deps.pendingRowDrag.start(t)}}};const mn=e=>{e.target.setPointerCapture(e.pointerId)};export{Jt as AutoScrollDriver,fn as DataSourceOwner,R as EditManager,I as FillManager,qe as GridCore,C as HighlightManager,Nt as IndexedDataStore,pn as InputEventAdapter,S as InputHandler,W as ParallelSortManager,Zt as PendingCellTapController,Yt as PendingRowDragController,be as ROW_DRAG_HOLD_MS,O as RowDataManager,w as RowMutationManager,A as ScrollVirtualizationManager,F as SelectionManager,L as SlotPoolManager,j as SortFilterManager,ye as TAP_SLOP_PX,sn as TouchScrollController,M as TransactionManager,z as WorkerPool,cn as applyBatchInstructions,qt as applyInstruction,se as bindPeekSelectAll,p as buildCellClasses,n as calculateColumnPositions,ae as calculateFillHandlePosition,oe as calculateFilterPopupPosition,i as calculateScaledColumnPositions,Bt as cellStyles,K as compareValues,ot as computeValueHash,Rt as containerStyles,jt as createClientDataSource,X as createDataSourceFromArray,Kt as createInitialState,It as createMutableClientDataSource,Mt as createServerDataSource,$e as detectBoundaryCollisions,J as evaluateColumnFilter,Dt as evaluateDateCondition,Tt as evaluateNumberCondition,Ct as evaluateTextCondition,Ut as filtersStyles,a as findColumnAtX,te as findSlotForRow,y as formatCellValue,g as getFieldValue,r as getTotalWidth,Gt as gridStyles,zt as headerStyles,l as isCellActive,d as isCellEditing,f as isCellInFillPreview,c as isCellSelected,h as isColumnInSelectionRange,m as isRowInSelectionRange,u as isRowVisible,q as isSameDay,U as kWayMerge,Qe as kWayMergeMultiColumn,Wt as rowDragStyles,kt as rowPassesFilter,ie as scrollCellIntoView,Ht as scrollbarStyles,_ as setFieldValue,Vt as statesStyles,G as stringToSortableNumber,Z as toPointerEventData,Lt as variablesStyles};
1319
+ `,Qt=[Wt,Gt,Kt,qt,Jt,Yt,Xt,Zt].join(`
1320
+ `),$t=e=>({slots:new Map,activeCell:null,selectionRange:null,editingCell:null,peekCell:null,contentWidth:0,contentHeight:e?.initialHeight??0,viewportWidth:e?.initialWidth??0,viewportHeight:e?.initialHeight??0,rowsWrapperOffset:0,headers:new Map,filterPopup:null,isLoading:!1,error:null,totalRows:0,visibleRowRange:null,hoverPosition:null,columns:null,pendingScrollTop:null}),en=(e,t,n)=>{switch(e.type){case`CREATE_SLOT`:return t.set(e.slotId,{slotId:e.slotId,rowIndex:-1,rowData:{},translateY:0}),null;case`DESTROY_SLOT`:return t.delete(e.slotId),null;case`ASSIGN_SLOT`:{let n=t.get(e.slotId);return n&&t.set(e.slotId,{...n,rowIndex:e.rowIndex,rowData:e.rowData}),null}case`MOVE_SLOT`:{let n=t.get(e.slotId);return n&&t.set(e.slotId,{...n,translateY:e.translateY}),null}case`SCROLL_TO`:return{pendingScrollTop:e.scrollTop};case`SET_ACTIVE_CELL`:return{activeCell:e.position};case`SET_SELECTION_RANGE`:return{selectionRange:e.range};case`UPDATE_VISIBLE_RANGE`:return{visibleRowRange:{start:e.start,end:e.end},rowsWrapperOffset:e.rowsWrapperOffset};case`SET_HOVER_POSITION`:return{hoverPosition:e.position};case`START_EDIT`:return{editingCell:{row:e.row,col:e.col,initialValue:e.initialValue}};case`STOP_EDIT`:return{editingCell:null};case`START_PEEK`:return{peekCell:{row:e.row,col:e.col}};case`STOP_PEEK`:return{peekCell:null};case`SET_CONTENT_SIZE`:return{contentWidth:e.width,contentHeight:e.height,viewportWidth:e.viewportWidth,viewportHeight:e.viewportHeight,rowsWrapperOffset:e.rowsWrapperOffset};case`UPDATE_HEADER`:return n.set(e.colIndex,{column:e.column,sortDirection:e.sortDirection,sortIndex:e.sortIndex,hasFilter:e.hasFilter}),null;case`OPEN_FILTER_POPUP`:return{filterPopup:{isOpen:!0,colIndex:e.colIndex,column:e.column,anchorRect:e.anchorRect,distinctValues:e.distinctValues,currentFilter:e.currentFilter}};case`CLOSE_FILTER_POPUP`:return{filterPopup:null};case`DATA_LOADING`:return{isLoading:!0,error:null};case`DATA_LOADED`:return{isLoading:!1,totalRows:e.totalRows};case`DATA_ERROR`:return{isLoading:!1,error:e.error};case`ROWS_ADDED`:case`ROWS_REMOVED`:return{totalRows:e.totalRows};case`ROWS_UPDATED`:case`TRANSACTION_PROCESSED`:return null;case`COLUMNS_CHANGED`:return{columns:e.columns};default:return null}},Q=e=>({clientX:e.clientX,clientY:e.clientY,button:e.button,shiftKey:e.shiftKey,ctrlKey:e.ctrlKey,metaKey:e.metaKey,pointerId:e.pointerId,pointerType:e.pointerType});var tn=class{intervalId=null;lastPointerEvent=null;getBodyEl;onTick;constructor(e,t){this.getBodyEl=e,this.onTick=t}recordPointer(e){this.lastPointerEvent=e}clearPointer(){this.lastPointerEvent=null}start(e,t){this.stop(),this.intervalId=setInterval(()=>{let n=this.getBodyEl();if(!n)return;n.scrollTop+=t,n.scrollLeft+=e;let r=this.lastPointerEvent;r&&this.onTick(r)},16)}stop(){this.intervalId!==null&&(clearInterval(this.intervalId),this.intervalId=null)}},nn=class{timer=null;capture=null;savedContainerOverflow=null;blockTouchMove=e=>e.preventDefault();deps;constructor(e){this.deps=e}start(e){this.reset(),this.capture={pointerId:e.pointerId,target:e.currentTarget};let t=e.clientX,n=e.clientY,r=e=>{let r=e.clientX-t,i=e.clientY-n;(Math.abs(r)>10||Math.abs(i)>10)&&(this.cancel(),a())},i=()=>{this.cancel(),a()},a=()=>{document.removeEventListener(`pointermove`,r),document.removeEventListener(`pointerup`,i),document.removeEventListener(`pointercancel`,i)};document.addEventListener(`pointermove`,r),document.addEventListener(`pointerup`,i,{once:!0}),document.addEventListener(`pointercancel`,i,{once:!0}),this.timer=setTimeout(()=>{this.timer=null,a(),this.confirm()},300)}cancel(){this.reset(),this.deps.getCore()?.input.cancelPendingRowDrag()}reset(){this.timer!==null&&(clearTimeout(this.timer),this.timer=null),this.capture=null}releaseLocks(){if(!this.deps.isBrowser)return;let e=this.deps.getContainer();this.savedContainerOverflow!==null&&e&&(e.style.overflow=this.savedContainerOverflow),this.savedContainerOverflow=null,document.removeEventListener(`touchmove`,this.blockTouchMove)}confirm(){let e=this.deps.getCore(),t=this.capture;this.capture=null,e!==null&&e.input.confirmPendingRowDrag()&&(this.lockContainer(),document.addEventListener(`touchmove`,this.blockTouchMove,{passive:!1}),this.applyPointerCapture(t),this.deps.onDragConfirmed(e.input.getDragState()))}lockContainer(){let e=this.deps.getContainer();e&&(this.savedContainerOverflow=e.style.overflow,e.style.overflow=`hidden`)}applyPointerCapture(e){e&&rn(e.target,e.pointerId)}};const rn=(e,t)=>{try{return e.setPointerCapture(t),!0}catch{return!1}};var an=class{cleanup=null;deps;constructor(e){this.deps=e}start(e){if(!this.deps.isBrowser)return;this.detachListeners();let t=e.clientX,n=e.clientY,r=e=>{let r=e.clientX-t,i=e.clientY-n;(Math.abs(r)>10||Math.abs(i)>10)&&this.cancel()},i=()=>{this.cancel()},a=()=>{this.detachListeners(),this.deps.getCore()?.input.confirmPendingCellTap()&&this.deps.onTapConfirmed()};document.addEventListener(`pointermove`,r),document.addEventListener(`pointerup`,a,{once:!0}),document.addEventListener(`pointercancel`,i,{once:!0}),this.cleanup=()=>{document.removeEventListener(`pointermove`,r),document.removeEventListener(`pointerup`,a),document.removeEventListener(`pointercancel`,i)}}cancel(){this.detachListeners(),this.deps.getCore()?.input.cancelPendingCellTap()}detachListeners(){this.cleanup!==null&&(this.cleanup(),this.cleanup=null)}};const on=e=>150*e/1e3,sn=(e,t)=>e.filter(e=>t-e.time<=100),cn=(e,t=640)=>{let n=e[0],r=e.at(-1);if(n===void 0||r===void 0||n===r)return 0;let i=r.time-n.time;if(i<=0)return 0;let a=(r.position-n.position)/i,o=Math.min(2.4,t);return Math.max(-o,Math.min(o,a))},ln=(e,t,n=640)=>{let r=e*t>0?e+t*4:e;return Math.max(-n,Math.min(n,r))},un=(e,t)=>{if(t>1500)return e;if(e===null)return t;let n=t>e?.5:.15;return e+(t-e)*n},dn=(e,t=640)=>{if(e===null||e<=0)return t;let n=Math.max(250,t*17)/e;return Math.max(.25,Math.min(t,n))},fn=(e,t)=>({position:e.position+e.velocity*Math.min(t,64),velocity:e.velocity*Math.exp(-t/1200)}),pn=e=>Math.abs(e)<.01,$=(e,t,n)=>Math.min(Math.max(e,t),Math.max(t,n));var mn=class{deps;attachedEl=null;gesture=null;gestureCleanup=null;flingFrame=null;flingVelocity=0;dragFrame=null;pendingDragTarget=null;savedOverscrollBehavior=null;savedTouchAction=null;overrideActive=!1;subscribedCore=null;contentSizeUnsubscribe=null;lastPipelineRunMs=null;pipelineIntervalEmaMs=null;frameIntervalEmaMs=null;flingThrottled=!1;constructor(e){this.deps=e}attach(){if(!this.deps.isBrowser||this.attachedEl!==null)return;let e=this.deps.getScrollEl();e!==null&&(this.attachedEl=e,this.savedOverscrollBehavior=e.style.overscrollBehavior,this.savedTouchAction=e.style.touchAction,this.syncCore(),e.addEventListener(`touchstart`,this.onTouchStart,{passive:!0}),e.addEventListener(`wheel`,this.onWheel,{passive:!0}))}detach(){this.stop(),this.clearGesture(),this.contentSizeUnsubscribe?.(),this.contentSizeUnsubscribe=null,this.subscribedCore=null;let e=this.attachedEl;e!==null&&(this.attachedEl=null,e.removeEventListener(`touchstart`,this.onTouchStart),e.removeEventListener(`wheel`,this.onWheel),this.savedOverscrollBehavior!==null&&(e.style.overscrollBehavior=this.savedOverscrollBehavior,this.savedOverscrollBehavior=null),this.savedTouchAction!==null&&(e.style.touchAction=this.savedTouchAction,this.savedTouchAction=null))}syncCore(){this.syncPolicySubscription(),this.syncTouchPolicy()}syncPolicySubscription(){let e=this.deps.getCore();e!==this.subscribedCore&&(this.contentSizeUnsubscribe?.(),this.contentSizeUnsubscribe=null,this.subscribedCore=e,e!==null&&(this.contentSizeUnsubscribe=e.onBatchInstruction(e=>{e.some(e=>e.type===`SET_CONTENT_SIZE`)&&this.syncTouchPolicy()})))}syncTouchPolicy(){let e=this.attachedEl;if(e===null)return;let t=this.deps.getCore()?.isScalingActive()===!0,n=t?`none`:this.savedTouchAction??``,r=t?`contain`:this.savedOverscrollBehavior??``;e.style.touchAction!==n&&(e.style.touchAction=n),e.style.overscrollBehavior!==r&&(e.style.overscrollBehavior=r)}stop(){this.flingFrame!==null&&(globalThis.cancelAnimationFrame?.(this.flingFrame),this.flingFrame=null),this.releaseScrollOverride()}applySyntheticScrollTop(e,t,n,r){r!==null&&this.lastPipelineRunMs!==null&&(this.pipelineIntervalEmaMs=un(this.pipelineIntervalEmaMs,r-this.lastPipelineRunMs)),this.lastPipelineRunMs=r,this.overrideActive=!0,e.setScrollTopOverride(n),t.scrollTop=n,e.setViewport(n,t.scrollLeft,t.clientWidth,t.clientHeight)}updateFlingThrottle(e,t){if(Math.abs(e)<=t){this.flingThrottled=!1;return}let n=this.frameIntervalEmaMs;n!==null&&n>28&&(this.flingThrottled=!0)}isFlingPipelineDue(e){return!this.flingThrottled||this.lastPipelineRunMs===null||e-this.lastPipelineRunMs>=100}releaseScrollOverride(){if(!this.overrideActive)return;this.overrideActive=!1;let e=this.deps.getCore();if(e===null)return;e.setScrollTopOverride(null);let t=this.attachedEl;t!==null&&e.setViewport(t.scrollTop,t.scrollLeft,t.clientWidth,t.clientHeight)}onWheel=()=>{this.stop(),this.syncCore()};onTouchStart=e=>{this.syncCore(),this.gesture===null&&this.startTouchGesture(e)};startTouchGesture=e=>{let t=this.flingFrame===null?0:this.flingVelocity;this.stop();let n=this.deps.getCore(),r=this.attachedEl;if(n!==null&&r!==null&&n.isScalingActive()){if(e.target?.closest(`.gp-grid-fill-handle, .gp-grid-cell--row-drag-handle`))return;let n=e.changedTouches[0];if(n===void 0)return;this.gesture={touchId:n.identifier,startClientX:n.clientX,startClientY:n.clientY,baseScrollTop:r.scrollTop,baseScrollLeft:r.scrollLeft,engaged:!1,slopOffsetX:0,slopOffsetY:0,samples:[{time:e.timeStamp,position:0}],carriedVelocity:t,expectedScrollTop:r.scrollTop,expectedScrollLeft:r.scrollLeft},this.attachGestureListeners(r)}};attachGestureListeners(e){e.addEventListener(`touchmove`,this.onTouchMove,{passive:!1}),e.addEventListener(`touchend`,this.onTouchEnd,{passive:!0}),e.addEventListener(`touchcancel`,this.onTouchCancel,{passive:!0}),this.gestureCleanup=()=>{e.removeEventListener(`touchmove`,this.onTouchMove),e.removeEventListener(`touchend`,this.onTouchEnd),e.removeEventListener(`touchcancel`,this.onTouchCancel)}}clearGesture(){this.gesture=null,this.gestureCleanup?.(),this.gestureCleanup=null,this.dragFrame!==null&&(globalThis.cancelAnimationFrame?.(this.dragFrame),this.dragFrame=null),this.pendingDragTarget=null}findTrackedTouch(e){let t=this.gesture;if(t===null)return null;let n=e.changedTouches;for(let e of Array.from(n))if(e?.identifier===t.touchId)return e;return null}onTouchMove=e=>{let t=this.gesture,n=this.findTrackedTouch(e),r=this.deps.getCore(),i=this.attachedEl;if(t===null||n===null||r===null||i===null)return;if(r.input.getDragState().isDragging){this.clearGesture(),this.releaseScrollOverride();return}if(this.hasNativeScrollTakenOver(t,i)){this.clearGesture(),this.releaseScrollOverride();return}e.cancelable&&e.preventDefault();let a=t.startClientX-n.clientX,o=t.startClientY-n.clientY;if(t.samples.push({time:e.timeStamp,position:o}),t.samples=sn(t.samples,e.timeStamp),!t.engaged){if(Math.abs(a)<=10&&Math.abs(o)<=10)return;t.engaged=!0,t.slopOffsetX=a,t.slopOffsetY=o}let s=r.getScrollRatio();this.pendingDragTarget={top:$(t.baseScrollTop+(o-t.slopOffsetY)*s,0,i.scrollHeight-i.clientHeight),left:$(t.baseScrollLeft+(a-t.slopOffsetX),0,i.scrollWidth-i.clientWidth)},this.scheduleDragApply(r,i)};hasNativeScrollTakenOver(e,t){let n=Math.abs(t.scrollTop-e.expectedScrollTop),r=Math.abs(t.scrollLeft-e.expectedScrollLeft);return n>4||r>4}scheduleDragApply(e,t){if(this.dragFrame!==null)return;let n=globalThis.requestAnimationFrame;if(n===void 0){this.flushPendingDrag(e,t,null);return}this.dragFrame=n(n=>{this.dragFrame=null,this.flushPendingDrag(e,t,n)})}flushPendingDrag(e,t,n){let r=this.pendingDragTarget;r!==null&&(this.pendingDragTarget=null,t.scrollLeft=r.left,this.gesture!==null&&(this.gesture.expectedScrollTop=r.top,this.gesture.expectedScrollLeft=r.left),this.applySyntheticScrollTop(e,t,r.top,n))}onTouchEnd=e=>{let t=this.gesture;if(t===null||this.findTrackedTouch(e)===null)return;let n=t.engaged,r=t.carriedVelocity,i=sn(t.samples,e.timeStamp),a=this.pendingDragTarget;this.clearGesture();let o=this.deps.getCore(),s=this.attachedEl;if(a!==null&&o!==null&&s!==null&&(s.scrollLeft=a.left,this.applySyntheticScrollTop(o,s,a.top,e.timeStamp)),!n)return;let c=o?.getMaxFlingVelocity()??640,l=cn(i,c);if(Math.abs(l)<.25){this.releaseScrollOverride();return}this.startFling(ln(l,r,c))};onTouchCancel=e=>{this.findTrackedTouch(e)!==null&&(this.clearGesture(),this.releaseScrollOverride())};startFling(e){let t=globalThis.requestAnimationFrame,n=this.deps.getCore(),r=this.attachedEl;if(t===void 0||n===null||r===null)return;let i=n.getMaxFlingVelocity(),a=on(n.getRowHeight()),o=dn(this.pipelineIntervalEmaMs,i),s=n.getScrollRatio(),c={position:r.scrollTop/s,velocity:$(e,-o,o)},l=null;this.flingVelocity=c.velocity,this.flingThrottled=!1;let u=e=>{this.flingFrame=null;let o=l===null?16:e-l;l!==null&&(this.frameIntervalEmaMs=un(this.frameIntervalEmaMs,o)),l=e,c=fn(c,o);let d=dn(this.pipelineIntervalEmaMs,i);c={...c,velocity:$(c.velocity,-d,d)},this.flingVelocity=c.velocity,this.updateFlingThrottle(c.velocity,a);let f=c.position*s,p=r.scrollHeight-r.clientHeight,m=$(f,0,p),h=m!==f,g=pn(c.velocity)||h;if(g||this.isFlingPipelineDue(e)?this.applySyntheticScrollTop(n,r,m,e):r.scrollTop=m,g){this.releaseScrollOverride();return}this.flingFrame=t(u)};this.flingFrame=t(u)}};const hn=(e,t,n,r)=>{let i={slots:new Map(t),headers:new Map(n)};for(let t of e){let e=en(t,i.slots,i.headers);e!==null&&gn(e,i,r)}return i},gn=(e,t,n)=>{e.slots!==void 0&&vn(t.slots,e.slots),e.headers!==void 0&&vn(t.headers,e.headers),_n(e,n),e.columns!==void 0&&e.columns!==null&&n.setColumnsOverride(e.columns),e.filterPopup!==void 0&&n.onFilterPopupChange(e.filterPopup)},_n=(e,t)=>{e.contentWidth!==void 0&&t.setContentWidth(e.contentWidth),e.contentHeight!==void 0&&t.setContentHeight(e.contentHeight),e.rowsWrapperOffset!==void 0&&t.setRowsWrapperOffset(e.rowsWrapperOffset),e.isLoading!==void 0&&t.setIsLoading(e.isLoading),e.error!==void 0&&t.setErrorMessage(e.error),e.totalRows!==void 0&&t.setTotalRows(e.totalRows),e.pendingScrollTop!==void 0&&t.setPendingScrollTop(e.pendingScrollTop),e.activeCell!==void 0&&t.setActiveCell(e.activeCell),e.selectionRange!==void 0&&t.setSelectionRange(e.selectionRange),e.editingCell!==void 0&&t.setEditingCell(e.editingCell),e.hoverPosition!==void 0&&t.setHoverPosition(e.hoverPosition),e.peekCell!==void 0&&t.setPeekCell(e.peekCell)},vn=(e,t)=>{e.clear(),t.forEach((t,n)=>e.set(n,t))};var yn=class{owned=null;lastAppliedRows=null;lastAppliedColumns=null;initialize(e,t){return e===null?(this.owned=Z(t),this.lastAppliedRows=t,this.owned):e}syncRows(e,t){return t!==null||this.lastAppliedRows===e?null:(this.lastAppliedRows=e,e.length>1e4&&console.warn(`[gp-grid] rows input changed with ${e.length} rows — this triggers a full rebuild. Use createGridData() for efficient updates.`),this.owned?.destroy?.(),this.owned=Z(e),this.owned)}syncColumns(e){return e.length===0||this.lastAppliedColumns===e?!1:(this.lastAppliedColumns=e,!0)}destroy(){this.owned?.destroy?.(),this.owned=null}},bn=class{deps;constructor(e){this.deps=e}headerPointerDown(e,t,n,r){let i=this.deps.getCore();return i!==null&&i.input.handleHeaderMouseDown(e,t,n,Q(r)).preventDefault}resizePointerDown(e,t,n){let r=this.deps.getCore();return r!==null&&r.input.handleHeaderResizeMouseDown(e,t,Q(n)).preventDefault}cellPointerDown(e,t,n){let r=this.deps.getCore();if(r===null)return{preventDefault:!1,focusContainer:!1};let i=r.input.handleCellMouseDown(e,t,Q(n));return this.dispatchCellDragStart(i,n),{preventDefault:i.preventDefault,focusContainer:i.focusContainer??!1}}cellPointerEnter(e,t){this.deps.getCore()?.input.handleCellMouseEnter(e,t)}cellPointerLeave(){this.deps.getCore()?.input.handleCellMouseLeave()}fillHandlePointerDown(e,t,n){let r=this.deps.getCore();if(r===null)return{preventDefault:!1,stopPropagation:!1};let i=r.input.handleFillHandleMouseDown(e,t,Q(n));return i.startDrag===`fill`&&(xn(n),this.deps.onDragStateChange(r.input.getDragState())),{preventDefault:i.preventDefault,stopPropagation:i.stopPropagation}}dragMove(e){let t=this.deps.getCore(),n=this.deps.getBodyEl();if(t===null||n===null)return;let r=n.getBoundingClientRect(),i=t.input.handleDragMove(Q(e),{top:r.top,left:r.left,width:r.width,height:r.height,scrollTop:n.scrollTop,scrollLeft:n.scrollLeft});this.deps.onDragStateChange(t.input.getDragState()),i?.autoScroll?this.deps.autoScroll.start(i.autoScroll.dx,i.autoScroll.dy):this.deps.autoScroll.stop()}documentPointerMove(e){let t=this.deps.getCore();if(t===null)return!1;let n=t.input.getDragState().isDragging;return this.deps.autoScroll.recordPointer(e),this.dragMove(e),n}documentPointerUp(){let e=this.deps.getCore();if(e===null)return{wasRowDrag:!1};let t=e.input.getDragState().dragType===`row-drag`;return this.deps.autoScroll.stop(),this.deps.autoScroll.clearPointer(),e.input.handleDragEnd(),this.deps.onDragStateChange(e.input.getDragState()),{wasRowDrag:t}}wheel(e,t,n){let r=this.deps.getCore();return r===null?null:r.input.handleWheel(e,t,n)}keyDown(e,t,n,r){let i=this.deps.getCore();return i===null?{preventDefault:!1}:i.input.handleKeyDown({key:e.key,shiftKey:e.shiftKey,ctrlKey:e.ctrlKey,metaKey:e.metaKey},t,n,r)}pasteText(e,t,n){let r=this.deps.getCore();return r===null||t!==null||n?!1:r.pasteClipboardText(e)}dispatchCellDragStart(e,t){let n=this.deps.getCore();if(n!==null){if(e.startTap===!0&&this.deps.pendingCellTap.start(t),e.startDrag===`selection`){n.input.startSelectionDrag(),this.deps.onDragStateChange(n.input.getDragState());return}if(e.startDrag===`row-drag`){this.deps.onDragStateChange(n.input.getDragState());return}e.startDrag===`row-drag-pending`&&this.deps.pendingRowDrag.start(t)}}};const xn=e=>{e.target.setPointerCapture(e.pointerId)};export{tn as AutoScrollDriver,yn as DataSourceOwner,V as EditManager,z as FillManager,Ze as GridCore,C as HighlightManager,Bt as IndexedDataStore,bn as InputEventAdapter,S as InputHandler,G as ParallelSortManager,an as PendingCellTapController,nn as PendingRowDragController,be as ROW_DRAG_HOLD_MS,O as RowDataManager,w as RowMutationManager,A as ScrollVirtualizationManager,R as SelectionManager,B as SlotPoolManager,P as SortFilterManager,ye as TAP_SLOP_PX,mn as TouchScrollController,F as TransactionManager,Qe as WorkerPool,hn as applyBatchInstructions,en as applyInstruction,se as bindPeekSelectAll,p as buildCellClasses,n as calculateColumnPositions,ae as calculateFillHandlePosition,oe as calculateFilterPopupPosition,i as calculateScaledColumnPositions,qt as cellStyles,q as compareValues,ft as computeValueHash,Gt as containerStyles,Rt as createClientDataSource,Z as createDataSourceFromArray,$t as createInitialState,Ut as createMutableClientDataSource,zt as createServerDataSource,at as detectBoundaryCollisions,Y as evaluateColumnFilter,Pt as evaluateDateCondition,Mt as evaluateNumberCondition,At as evaluateTextCondition,Xt as filtersStyles,a as findColumnAtX,te as findSlotForRow,y as formatCellValue,g as getFieldValue,r as getTotalWidth,Qt as gridStyles,Pe as groupDistinctValues,Kt as headerStyles,N as isBlankCellValue,l as isCellActive,d as isCellEditing,f as isCellInFillPreview,c as isCellSelected,h as isColumnInSelectionRange,m as isRowInSelectionRange,u as isRowVisible,J as isSameDay,W as kWayMerge,it as kWayMergeMultiColumn,Fe as labelsForSelectedValues,M as rawValueKey,Ie as rawValuesForLabels,Zt as rowDragStyles,It as rowPassesFilter,ie as scrollCellIntoView,Yt as scrollbarStyles,_ as setFieldValue,Jt as statesStyles,K as stringToSortableNumber,Q as toPointerEventData,Wt as variablesStyles};
package/package.json CHANGED
@@ -2,7 +2,7 @@
2
2
  "name": "@gp-grid/core",
3
3
  "description": "A high-performance, framework-agnostic TypeScript data grid core with virtual scrolling",
4
4
  "private": false,
5
- "version": "0.18.0",
5
+ "version": "0.20.0",
6
6
  "license": "Apache-2.0",
7
7
  "main": "dist/index.js",
8
8
  "types": "dist/index.d.ts",
@@ -46,7 +46,7 @@
46
46
  ],
47
47
  "devDependencies": {
48
48
  "@types/node": "^24.9.1",
49
- "tsdown": "^0.22.0",
49
+ "tsdown": "^0.22.5",
50
50
  "typescript": "~5.9.0",
51
51
  "vitest": "^4.0.15"
52
52
  },