comins-table 0.1.9 → 0.1.11

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (46) hide show
  1. package/CHANGELOG.md +67 -1
  2. package/DESIGN.md +17 -1
  3. package/README.md +78 -16
  4. package/THIRD_PARTY_NOTICES.md +0 -2
  5. package/dist/cell-fill.d.ts +25 -0
  6. package/dist/cell-fill.d.ts.map +1 -0
  7. package/dist/clipboard-text.d.ts +5 -0
  8. package/dist/clipboard-text.d.ts.map +1 -0
  9. package/dist/clipboard.d.ts +1 -1
  10. package/dist/clipboard.d.ts.map +1 -1
  11. package/dist/clipboard.js +2 -2
  12. package/dist/column-filter.d.ts +2 -1
  13. package/dist/column-filter.d.ts.map +1 -1
  14. package/dist/component-renderer.d.ts.map +1 -1
  15. package/dist/{core-D01wEe-7.js → core-C1tlvY8Q.js} +236 -170
  16. package/dist/core-C1tlvY8Q.js.map +1 -0
  17. package/dist/core.d.ts +12 -2
  18. package/dist/core.d.ts.map +1 -1
  19. package/dist/core.js +2 -2
  20. package/dist/index.d.ts +56 -8
  21. package/dist/index.d.ts.map +1 -1
  22. package/dist/index.js +3242 -1851
  23. package/dist/index.js.map +1 -1
  24. package/dist/row-height.d.ts +25 -0
  25. package/dist/row-height.d.ts.map +1 -0
  26. package/dist/selection-data.d.ts +14 -0
  27. package/dist/selection-data.d.ts.map +1 -0
  28. package/dist/selection.js +2 -2
  29. package/dist/table-icons.d.ts.map +1 -1
  30. package/dist/tree-drag.d.ts +47 -0
  31. package/dist/tree-drag.d.ts.map +1 -0
  32. package/dist/tree.d.ts +19 -0
  33. package/dist/tree.d.ts.map +1 -1
  34. package/dist/use-viewport.d.ts +28 -0
  35. package/dist/use-viewport.d.ts.map +1 -0
  36. package/dist/viewport-data.d.ts +73 -0
  37. package/dist/viewport-data.d.ts.map +1 -0
  38. package/dist/viewport-layout.d.ts +21 -0
  39. package/dist/viewport-layout.d.ts.map +1 -0
  40. package/dist/viewport-requests.d.ts +9 -0
  41. package/dist/viewport-requests.d.ts.map +1 -0
  42. package/dist/virtual-layout.d.ts +12 -2
  43. package/dist/virtual-layout.d.ts.map +1 -1
  44. package/package.json +15 -1
  45. package/styles.css +176 -34
  46. package/dist/core-D01wEe-7.js.map +0 -1
package/styles.css CHANGED
@@ -17,8 +17,8 @@
17
17
  --comins-table-drop-invalid: #dc2626;
18
18
  --comins-table-drop-invalid-background: rgba(220, 38, 38, 0.22);
19
19
  --comins-table-drop-marker: #064e3b;
20
- --comins-table-drop-valid: #2563eb;
21
- --comins-table-drop-valid-background: rgba(37, 99, 235, 0.22);
20
+ --comins-table-drop-valid: var(--comins-table-accent-strong);
21
+ --comins-table-drop-valid-background: var(--comins-table-accent-soft);
22
22
  --comins-table-focus: rgba(16, 185, 129, 0.28);
23
23
  --comins-table-foreground: #111827;
24
24
  --comins-table-group-row-background: #d1d5db;
@@ -72,6 +72,7 @@
72
72
  border-left: 1px solid var(--comins-table-border);
73
73
  border-radius: 2px;
74
74
  border-right: 1px solid var(--comins-table-border);
75
+ border-top: 1px solid var(--comins-table-border);
75
76
  color: var(--comins-table-foreground);
76
77
  display: flex;
77
78
  flex-direction: column;
@@ -302,6 +303,13 @@
302
303
  padding-left: calc(var(--comins-tree-depth) * 16px);
303
304
  }
304
305
 
306
+ .comins-table__tr[data-comins-tree-drop="before"] > td { box-shadow: inset 0 2px var(--comins-table-drop-valid); }
307
+ .comins-table__tr[data-comins-tree-drop="after"] > td { box-shadow: inset 0 -2px var(--comins-table-drop-valid); }
308
+ .comins-table__tr[data-comins-tree-drop="inside"] { outline: 2px solid var(--comins-table-drop-valid); outline-offset: -2px; }
309
+ .comins-table__tr[data-comins-tree-drop-valid="false"] { outline: 2px solid var(--comins-table-drop-invalid); outline-offset: -2px; }
310
+ .comins-table__tr[data-comins-tree-drop-valid="false"] > td { box-shadow: none; }
311
+ .comins-table__sr-only { position: absolute; width: 1px; height: 1px; padding: 0; overflow: hidden; clip-path: inset(50%); white-space: nowrap; }
312
+
305
313
  .comins-tree-expander,
306
314
  .comins-tree-expander-spacer {
307
315
  flex: 0 0 24px;
@@ -387,15 +395,18 @@
387
395
  }
388
396
 
389
397
  .comins-table__group-row[data-comins-group-drag-source="true"] > .comins-table__group-cell {
390
- opacity: 0.68;
398
+ background: var(--comins-table-surface-muted);
399
+ color: var(--comins-table-muted);
400
+ outline: 1px dashed var(--comins-table-drop-marker);
401
+ outline-offset: -2px;
391
402
  }
392
403
 
393
404
  .comins-table__group-row[data-comins-group-drop-position="before"] > .comins-table__group-cell {
394
- box-shadow: inset 0 3px var(--comins-table-drop-marker);
405
+ box-shadow: inset 0 2px var(--comins-table-drop-valid);
395
406
  }
396
407
 
397
408
  .comins-table__group-row[data-comins-group-drop-position="after"] > .comins-table__group-cell {
398
- box-shadow: inset 0 -3px var(--comins-table-drop-marker);
409
+ box-shadow: inset 0 -2px var(--comins-table-drop-valid);
399
410
  }
400
411
 
401
412
  .comins-table__group-row[data-comins-group-drop-valid="false"] > .comins-table__group-cell {
@@ -404,17 +415,17 @@
404
415
 
405
416
  .comins-table__body-viewport[data-comins-group-drop-valid="true"],
406
417
  .comins-table__body-viewport[data-comins-row-drop-valid="true"] {
407
- box-shadow: inset 0 0 0 3px var(--comins-table-drop-marker);
418
+ box-shadow: inset 0 0 0 2px var(--comins-table-drop-valid);
408
419
  }
409
420
 
410
421
  .comins-table__body-viewport[data-comins-group-drop-valid="false"],
411
422
  .comins-table__body-viewport[data-comins-row-drop-valid="false"] {
412
- box-shadow: inset 0 0 0 3px var(--comins-table-drop-invalid);
423
+ box-shadow: inset 0 0 0 2px var(--comins-table-drop-invalid);
413
424
  }
414
425
 
415
426
  .comins-table[data-comins-transfer-rejected="true"] {
416
- outline: 1px solid var(--comins-table-drop-invalid);
417
- outline-offset: -1px;
427
+ outline: 2px solid var(--comins-table-drop-invalid);
428
+ outline-offset: -2px;
418
429
  }
419
430
 
420
431
  .comins-table__group-row[data-comins-row-drop-valid="true"] > .comins-table__group-cell {
@@ -474,6 +485,7 @@
474
485
  }
475
486
 
476
487
  .comins-table__body-viewport {
488
+ position: relative;
477
489
  box-sizing: border-box;
478
490
  flex: 1 1 auto;
479
491
  min-height: 0;
@@ -626,7 +638,9 @@
626
638
  }
627
639
 
628
640
  .comins-row-detail-expander .comins-table-icon,
629
- .comins-tree-expander .comins-table-icon {
641
+ .comins-tree-expander .comins-table-icon,
642
+ .comins-group-expander .comins-table-icon,
643
+ .comins-sort-indicator[data-sort-state] {
630
644
  transition: none;
631
645
  }
632
646
  }
@@ -653,10 +667,6 @@
653
667
  z-index: 1;
654
668
  }
655
669
 
656
- .comins-table:not([data-show-header="true"]) .comins-table__body-table {
657
- border-top: 1px solid var(--comins-table-border);
658
- }
659
-
660
670
  .comins-table__thead .comins-table__th {
661
671
  background: var(--comins-table-header-background);
662
672
  border-bottom: 1px solid var(--comins-table-header-border);
@@ -672,6 +682,12 @@
672
682
  min-width: 0;
673
683
  }
674
684
 
685
+ .comins-table__tr[data-comins-row-auto-height="true"] > .comins-table__td {
686
+ height: auto;
687
+ padding-top: var(--comins-table-cell-padding-y);
688
+ padding-bottom: var(--comins-table-cell-padding-y);
689
+ }
690
+
675
691
  .comins-table__td {
676
692
  background: var(--comins-table-cell-background);
677
693
  border-bottom: 1px solid var(--comins-table-row-border);
@@ -719,6 +735,18 @@
719
735
  border-bottom: 0;
720
736
  }
721
737
 
738
+ /* The frame owns the perimeter; keep only internal Cell separators. */
739
+ .comins-table__thead > tr:first-child > .comins-table__th {
740
+ border-top: 0;
741
+ }
742
+
743
+ .comins-table__thead .comins-table__th[data-comins-column-end="true"],
744
+ .comins-table__td:last-child,
745
+ .comins-table__summary-cell:last-child,
746
+ .comins-table__detail-content {
747
+ border-right: 0;
748
+ }
749
+
722
750
  .comins-table__tr {
723
751
  height: var(--comins-table-row-height);
724
752
  }
@@ -755,7 +783,8 @@
755
783
  }
756
784
 
757
785
  .comins-table__th[data-column-placeholder="true"] {
758
- background: color-mix(in srgb, var(--comins-table-header-background) 82%, #000000);
786
+ background: var(--comins-table-surface-muted);
787
+ color: var(--comins-table-muted);
759
788
  outline: 1px dashed var(--comins-table-drop-marker);
760
789
  outline-offset: -2px;
761
790
  }
@@ -1000,6 +1029,7 @@
1000
1029
 
1001
1030
  .comins-table__th[data-column-drop-target="true"][data-column-drop-valid="true"] {
1002
1031
  background: var(--comins-table-drop-valid-background);
1032
+ color: var(--comins-table-foreground);
1003
1033
  outline: 2px solid var(--comins-table-drop-valid);
1004
1034
  outline-offset: -2px;
1005
1035
  }
@@ -1009,10 +1039,12 @@
1009
1039
  }
1010
1040
 
1011
1041
  .comins-table__th[data-column-placeholder="true"][data-column-drop-target="true"] {
1012
- background: color-mix(in srgb, var(--comins-table-header-background) 82%, #000000);
1042
+ background: var(--comins-table-surface-muted);
1043
+ color: var(--comins-table-muted);
1013
1044
  }
1014
1045
 
1015
1046
  .comins-table__th[data-column-drop-target="true"][data-column-drop-valid="false"] {
1047
+ color: var(--comins-table-foreground);
1016
1048
  background: var(--comins-table-drop-invalid-background);
1017
1049
  cursor: not-allowed;
1018
1050
  outline: 2px solid var(--comins-table-drop-invalid);
@@ -1043,11 +1075,11 @@
1043
1075
 
1044
1076
  .comins-column-move-ghost {
1045
1077
  align-items: center;
1046
- background: var(--comins-table-drop-marker);
1047
- border: 1px solid rgba(255, 255, 255, 0.58);
1048
- border-radius: 6px;
1049
- box-shadow: 0 10px 28px rgba(15, 23, 42, 0.22);
1050
- color: #ffffff;
1078
+ background: var(--comins-table-surface);
1079
+ border: 1px solid var(--comins-table-drop-marker);
1080
+ border-radius: 2px;
1081
+ box-shadow: 0 4px 12px color-mix(in srgb, var(--comins-table-foreground) 18%, transparent);
1082
+ color: var(--comins-table-foreground);
1051
1083
  display: inline-flex;
1052
1084
  font-size: 13px;
1053
1085
  font-weight: 800;
@@ -1190,6 +1222,9 @@
1190
1222
  transform: scale(1) rotate(0deg);
1191
1223
  }
1192
1224
 
1225
+ .comins-sort-indicator[data-sort-state="asc"] .comins-table-icon { transform: rotate(-90deg); }
1226
+ .comins-sort-indicator[data-sort-state="desc"] .comins-table-icon { transform: rotate(90deg); }
1227
+
1193
1228
  .comins-sort-priority {
1194
1229
  align-items: center;
1195
1230
  background: color-mix(in srgb, var(--comins-table-accent) 18%, transparent);
@@ -1251,33 +1286,80 @@
1251
1286
  cursor: grabbing;
1252
1287
  }
1253
1288
 
1289
+ .comins-row-move-placeholder,
1254
1290
  .comins-row-move-placeholder td {
1255
- background: var(--comins-table-row-selected-background);
1256
- border-bottom: 1px solid var(--comins-table-row-border);
1257
- border-right: 1px solid var(--comins-table-cell-border);
1258
- color: var(--comins-table-accent-strong);
1291
+ border: 0;
1292
+ height: 0;
1293
+ padding: 0;
1294
+ position: relative;
1295
+ }
1296
+
1297
+ .comins-row-move-placeholder td > div {
1298
+ background: var(--comins-table-drop-valid-background);
1299
+ color: var(--comins-table-foreground);
1259
1300
  font-weight: 700;
1260
- height: 32px;
1301
+ height: var(--comins-table-row-height);
1302
+ align-items: center;
1303
+ box-sizing: border-box;
1304
+ display: flex;
1305
+ justify-content: center;
1306
+ left: 0;
1307
+ pointer-events: none;
1308
+ position: absolute;
1309
+ right: 0;
1310
+ top: 0;
1311
+ z-index: 4;
1312
+ outline: 2px solid var(--comins-table-drop-valid);
1313
+ outline-offset: -2px;
1261
1314
  text-align: center;
1262
1315
  }
1263
1316
 
1264
- .comins-row-move-placeholder[data-comins-row-drop-valid="false"] td {
1317
+ .comins-row-move-placeholder[data-comins-row-drop-valid="false"] td > div {
1318
+ background: var(--comins-table-drop-invalid-background);
1319
+ outline-color: var(--comins-table-drop-invalid);
1320
+ }
1321
+
1322
+ .comins-table__tr[data-comins-tree-drop-valid="true"] > .comins-table__td,
1323
+ .comins-table__group-row[data-comins-group-drop-position] > .comins-table__group-cell,
1324
+ .comins-table__group-row[data-comins-row-drop-valid="true"] > .comins-table__group-cell,
1325
+ .comins-table__tr[data-comins-row-drop-valid="true"] > .comins-table__td {
1326
+ background: var(--comins-table-drop-valid-background);
1327
+ color: var(--comins-table-foreground);
1328
+ }
1329
+
1330
+ .comins-table__tr[data-comins-tree-drop-valid="false"] > .comins-table__td,
1331
+ .comins-table__group-row[data-comins-group-drop-valid="false"] > .comins-table__group-cell {
1265
1332
  background: var(--comins-table-drop-invalid-background);
1266
- color: var(--comins-table-drop-invalid);
1333
+ color: var(--comins-table-foreground);
1334
+ }
1335
+
1336
+ .comins-table__group-row[data-comins-row-drop-valid="true"] {
1337
+ outline: 2px solid var(--comins-table-drop-valid);
1338
+ outline-offset: -2px;
1339
+ }
1340
+
1341
+ .comins-table__group-row[data-comins-group-drop-valid="false"],
1342
+ .comins-table__group-row[data-comins-row-drop-valid="false"] {
1343
+ outline: 2px solid var(--comins-table-drop-invalid);
1344
+ outline-offset: -2px;
1345
+ }
1346
+
1347
+ .comins-table__group-row[data-comins-group-drop-valid="false"] > .comins-table__group-cell {
1348
+ box-shadow: none;
1267
1349
  }
1268
1350
 
1269
1351
  .comins-table__tr[data-comins-cross-row-drop-position="before"] > .comins-table__td {
1270
- box-shadow: inset 0 3px var(--comins-table-drop-marker);
1352
+ box-shadow: inset 0 2px var(--comins-table-drop-valid);
1271
1353
  }
1272
1354
 
1273
1355
  .comins-table__tr[data-comins-cross-row-drop-position="before"][data-comins-row-drop-valid="false"] > .comins-table__td {
1274
1356
  background: var(--comins-table-drop-invalid-background);
1275
- box-shadow: inset 0 3px var(--comins-table-drop-invalid);
1357
+ box-shadow: inset 0 2px var(--comins-table-drop-invalid);
1276
1358
  }
1277
1359
 
1278
1360
  .comins-table-empty-filler td {
1279
1361
  border-bottom: 0;
1280
- border-right: 1px solid var(--comins-table-cell-border);
1362
+ border-right: 0;
1281
1363
  min-height: 1px;
1282
1364
  }
1283
1365
 
@@ -1567,7 +1649,7 @@
1567
1649
  }
1568
1650
 
1569
1651
  .comins-table__component-menu-item:disabled {
1570
- color: #94a3b8;
1652
+ color: var(--comins-table-component-muted);
1571
1653
  cursor: not-allowed;
1572
1654
  }
1573
1655
 
@@ -1610,7 +1692,7 @@
1610
1692
  .comins-table__component-virtual-list-item {
1611
1693
  align-items: center;
1612
1694
  background: var(--comins-table-component-surface-muted);
1613
- border: 1px solid rgba(57, 99, 88, 0.18);
1695
+ border: 1px solid var(--comins-table-component-border);
1614
1696
  border-radius: 4px;
1615
1697
  box-sizing: border-box;
1616
1698
  color: var(--comins-table-component-foreground);
@@ -1653,7 +1735,7 @@
1653
1735
  .comins-table__component-virtual-list-item:disabled,
1654
1736
  .comins-table__component-virtual-list-more:disabled,
1655
1737
  .comins-table__component-virtual-list-search:disabled {
1656
- color: #94a3b8;
1738
+ color: var(--comins-table-component-muted);
1657
1739
  cursor: not-allowed;
1658
1740
  opacity: 0.72;
1659
1741
  }
@@ -1686,3 +1768,63 @@
1686
1768
  text-overflow: ellipsis;
1687
1769
  white-space: nowrap;
1688
1770
  }
1771
+
1772
+ /* Group targets and clipboard controls share the Table's semantic state tokens. */
1773
+ .comins-table__group-row[data-comins-group-drop-position]:not([data-comins-group-drop-valid="false"]) > .comins-table__group-cell {
1774
+ background: var(--comins-table-drop-valid-background);
1775
+ color: var(--comins-table-foreground);
1776
+ }
1777
+
1778
+ .comins-sort-indicator:hover { background: color-mix(in srgb, currentColor 12%, transparent); }
1779
+ .comins-table__component-menu-item:focus-visible,
1780
+ .comins-table__component-virtual-list-item:focus-visible {
1781
+ outline: 2px solid var(--comins-table-component-accent-strong);
1782
+ outline-offset: -2px;
1783
+ }
1784
+ .comins-table__td { position: relative; }
1785
+ .comins-cell-fill-preview {
1786
+ box-shadow: inset 0 0 0 1px var(--comins-table-drop-valid);
1787
+ background: var(--comins-table-drop-valid-background);
1788
+ }
1789
+ .comins-fill-handle {
1790
+ align-items: flex-end;
1791
+ background: transparent;
1792
+ border: 0;
1793
+ bottom: 0;
1794
+ cursor: crosshair;
1795
+ display: flex;
1796
+ height: 24px;
1797
+ justify-content: flex-end;
1798
+ padding: 2px;
1799
+ position: absolute;
1800
+ right: 0;
1801
+ touch-action: none;
1802
+ width: 24px;
1803
+ z-index: 2;
1804
+ }
1805
+ .comins-fill-handle > span {
1806
+ background: var(--comins-table-accent-strong);
1807
+ border: 1px solid var(--comins-table-background);
1808
+ height: 8px;
1809
+ width: 8px;
1810
+ }
1811
+ .comins-fill-handle:focus-visible { outline: 2px solid var(--comins-table-accent-strong); outline-offset: -2px; }
1812
+ .comins-fill-menu {
1813
+ background: var(--comins-table-surface);
1814
+ border: 1px solid var(--comins-table-border);
1815
+ border-radius: 2px;
1816
+ color: var(--comins-table-foreground);
1817
+ display: grid;
1818
+ gap: 2px;
1819
+ padding: 4px;
1820
+ position: fixed;
1821
+ width: 180px;
1822
+ z-index: 80;
1823
+ }
1824
+ .comins-fill-menu button {
1825
+ background: transparent; border: 0; color: inherit; cursor: pointer;
1826
+ font: inherit; padding: 6px 8px; text-align: left;
1827
+ }
1828
+ .comins-fill-menu button:hover { background: var(--comins-table-accent-soft); }
1829
+ .comins-fill-menu button:focus-visible { outline: 2px solid var(--comins-table-accent-strong); outline-offset: -2px; }
1830
+ .comins-fill-menu button:disabled { color: var(--comins-table-muted); cursor: not-allowed; }
@@ -1 +0,0 @@
1
- {"version":3,"file":"core-D01wEe-7.js","names":[],"sources":["../src/column-pinning.ts","../src/core.ts"],"sourcesContent":["export type CominsColumnPinned = \"left\" | \"right\";\n\nexport type CominsColumnPinningBlock = {\n columnIds: readonly string[];\n columnWidths: readonly number[];\n id: string;\n pinned?: CominsColumnPinned;\n};\n\nexport type CominsResolvedPinnedColumn = {\n boundary?: boolean;\n offset?: number;\n pinned?: CominsColumnPinned;\n};\n\nexport type CominsResolvedColumnPinning = {\n columns: ReadonlyMap<string, CominsResolvedPinnedColumn>;\n orderedColumnIds: readonly string[];\n};\n\nexport type CominsColumnPinningSpanFragment = CominsResolvedPinnedColumn & {\n colSpan: number;\n startIndex: number;\n};\n\nexport function normalizeCominsColumnPinned(value: unknown): CominsColumnPinned | undefined {\n return value === \"left\" || value === \"right\" ? value : undefined;\n}\n\nexport function resolveCominsColumnPinning(\n blocks: readonly CominsColumnPinningBlock[],\n containerWidth: number,\n): CominsResolvedColumnPinning {\n const left = blocks.filter((block) => block.pinned === \"left\");\n const center = blocks.filter((block) => block.pinned === undefined);\n const right = blocks.filter((block) => block.pinned === \"right\");\n const demotedLeft: CominsColumnPinningBlock[] = [];\n const demotedRight: CominsColumnPinningBlock[] = [];\n const effectiveLeft = [...left];\n const effectiveRight = [...right];\n const safeContainerWidth = Number.isFinite(containerWidth) ? Math.max(0, containerWidth) : 0;\n const pinnedBudget = safeContainerWidth < 48 ? 0 : safeContainerWidth - 48;\n const totalWidth = (current: readonly CominsColumnPinningBlock[]) =>\n current.reduce(\n (sum, block) =>\n sum + block.columnWidths.reduce((blockSum, width) => blockSum + Math.max(0, width), 0),\n 0,\n );\n\n while (totalWidth(effectiveLeft) + totalWidth(effectiveRight) > pinnedBudget) {\n const leftWidth = totalWidth(effectiveLeft);\n const rightWidth = totalWidth(effectiveRight);\n\n if (leftWidth > rightWidth && effectiveLeft.length > 0) {\n demotedLeft.unshift(effectiveLeft.pop()!);\n } else if (effectiveRight.length > 0) {\n demotedRight.push(effectiveRight.shift()!);\n } else if (effectiveLeft.length > 0) {\n demotedLeft.unshift(effectiveLeft.pop()!);\n } else {\n break;\n }\n }\n\n const effectiveBlocks = [\n ...effectiveLeft,\n ...demotedLeft,\n ...center,\n ...demotedRight,\n ...effectiveRight,\n ];\n const columns = new Map<string, CominsResolvedPinnedColumn>();\n let leftOffset = 0;\n\n for (const block of effectiveLeft) {\n for (let index = 0; index < block.columnIds.length; index += 1) {\n const columnId = block.columnIds[index]!;\n columns.set(columnId, { offset: leftOffset, pinned: \"left\" });\n leftOffset += Math.max(0, block.columnWidths[index] ?? 0);\n }\n }\n\n const lastLeftColumnId = effectiveLeft.at(-1)?.columnIds.at(-1);\n\n if (lastLeftColumnId) {\n columns.set(lastLeftColumnId, { ...columns.get(lastLeftColumnId), boundary: true });\n }\n\n let rightOffset = 0;\n\n for (let blockIndex = effectiveRight.length - 1; blockIndex >= 0; blockIndex -= 1) {\n const block = effectiveRight[blockIndex]!;\n\n for (let columnIndex = block.columnIds.length - 1; columnIndex >= 0; columnIndex -= 1) {\n const columnId = block.columnIds[columnIndex]!;\n columns.set(columnId, { offset: rightOffset, pinned: \"right\" });\n rightOffset += Math.max(0, block.columnWidths[columnIndex] ?? 0);\n }\n }\n\n const firstRightColumnId = effectiveRight[0]?.columnIds[0];\n\n if (firstRightColumnId) {\n columns.set(firstRightColumnId, { ...columns.get(firstRightColumnId), boundary: true });\n }\n\n for (const block of [...demotedLeft, ...center, ...demotedRight]) {\n for (const columnId of block.columnIds) {\n columns.set(columnId, {});\n }\n }\n\n return {\n columns,\n orderedColumnIds: effectiveBlocks.flatMap((block) => [...block.columnIds]),\n };\n}\n\nexport function getCominsPinnedBlockResizeMaxWidth(\n blocks: readonly CominsColumnPinningBlock[],\n resolved: CominsResolvedColumnPinning,\n blockId: string,\n containerWidth: number,\n minimumCenterWidth = 48,\n): number | undefined {\n const target = blocks.find((block) => block.id === blockId);\n\n if (\n !target?.pinned ||\n target.columnIds.length === 0 ||\n target.columnIds.some((columnId) => resolved.columns.get(columnId)?.pinned !== target.pinned)\n ) {\n return undefined;\n }\n\n const otherPinnedWidth = blocks.reduce((total, block) => {\n if (\n block.id === target.id ||\n !block.pinned ||\n block.columnIds.some((columnId) => resolved.columns.get(columnId)?.pinned !== block.pinned)\n ) {\n return total;\n }\n\n return total + block.columnWidths.reduce(\n (blockTotal, width) => blockTotal + (Number.isFinite(width) ? Math.max(0, width) : 0),\n 0,\n );\n }, 0);\n const safeContainerWidth = Number.isFinite(containerWidth) ? Math.max(0, containerWidth) : 0;\n const safeMinimumCenterWidth = Number.isFinite(minimumCenterWidth)\n ? Math.max(0, minimumCenterWidth)\n : 48;\n\n return Math.max(0, safeContainerWidth - safeMinimumCenterWidth - otherPinnedWidth);\n}\n\nexport function getCominsColumnPinningSpanFragments(\n resolved: CominsResolvedColumnPinning,\n startIndex: number,\n colSpan: number,\n): CominsColumnPinningSpanFragment[] {\n const endIndex = Math.min(\n resolved.orderedColumnIds.length,\n Math.max(startIndex, startIndex + Math.max(1, Math.floor(colSpan))),\n );\n const fragments: CominsColumnPinningSpanFragment[] = [];\n\n for (let index = Math.max(0, startIndex); index < endIndex; index += 1) {\n const columnId = resolved.orderedColumnIds[index];\n const pin = columnId ? resolved.columns.get(columnId) ?? {} : {};\n const previous = fragments.at(-1);\n\n if (previous && previous.pinned === pin.pinned) {\n previous.colSpan += 1;\n\n if (pin.pinned === \"right\") {\n previous.offset = pin.offset;\n }\n continue;\n }\n\n fragments.push({\n boundary: pin.boundary,\n colSpan: 1,\n offset: pin.offset,\n pinned: pin.pinned,\n startIndex: index,\n });\n }\n\n return fragments;\n}\n","import type React from \"react\";\n\nimport type { CominsColumnFilterConfig } from \"./filtering\";\nimport { normalizeCominsColumnPinned, type CominsColumnPinned } from \"./column-pinning\";\n\nexport type { CominsColumnPinned } from \"./column-pinning\";\n\nexport type CominsRowId = string | number;\n\nexport type CominsTableDensity = \"comfortable\" | \"compact\" | \"spacious\";\n\nexport type CominsTableTheme = {\n className?: string;\n density?: CominsTableDensity;\n style?: React.CSSProperties;\n};\n\nexport type CominsSortDirection = \"asc\" | \"desc\";\n\nexport type CominsSortState = {\n columnId: string;\n direction: CominsSortDirection;\n};\n\nexport type CominsSortModel = readonly CominsSortState[];\n\nexport type CominsCellFormatParams<TData, TValue = unknown> = {\n column: CominsTableRuntimeColumn<TData, TValue>;\n row: TData;\n rowId: CominsRowId;\n value: TValue;\n};\n\nexport type CominsColumnValueResolver<TData, TValue> =\n | TValue\n | ((params: CominsCellFormatParams<TData, TValue>) => TValue);\n\nexport type CominsComponentPrimitiveValue = string | number | boolean;\nexport type CominsComponentAlign = \"center\" | \"end\" | \"start\";\nexport type CominsComponentDirection = \"left\" | \"right\";\n\nexport type CominsComponentPlacement = {\n align?: CominsComponentAlign;\n direction?: CominsComponentDirection;\n id?: string;\n};\n\nexport type CominsTableComponentOption = {\n disabled?: boolean;\n label: React.ReactNode;\n value: CominsComponentPrimitiveValue;\n};\n\nexport type CominsVirtualListItem<TItem = unknown> = {\n data?: TItem;\n disabled?: boolean;\n label: React.ReactNode;\n searchText?: string;\n value: CominsComponentPrimitiveValue;\n};\n\nexport type CominsTableMenuItem =\n | {\n disabled?: boolean;\n label: React.ReactNode;\n type?: \"item\";\n value: CominsComponentPrimitiveValue;\n }\n | {\n label: React.ReactNode;\n type: \"label\";\n }\n | {\n type: \"divider\";\n };\n\nexport type CominsComponentColumnPayload<TData, TValue = unknown> = {\n definition: CominsTableRuntimeColumn<TData, TValue>;\n field: string;\n id: string;\n index: number;\n label: React.ReactNode;\n};\n\nexport type CominsComponentRowPayload<TData> = {\n data: TData;\n dataIndex: number;\n disabled: boolean;\n id: CominsRowId;\n index: number;\n selected: boolean;\n};\n\nexport type CominsCellComponentPayload<TData, TValue = unknown> = {\n column: CominsComponentColumnPayload<TData, TValue>;\n row: CominsComponentRowPayload<TData>;\n selection: {\n selectedRowCount: number;\n };\n value: TValue;\n};\n\nexport type CominsHeaderComponentPayload<TData, TValue = unknown> = {\n column: CominsComponentColumnPayload<TData, TValue>;\n layout: {\n hidden: boolean;\n width?: number;\n };\n sort: {\n count: number;\n direction: CominsSortDirection | null;\n enabled: boolean;\n priority: number | null;\n };\n};\n\nexport type CominsClipboardGuard<TData, TValue = unknown> =\n | boolean\n | ((params: CominsCellComponentPayload<TData, TValue>) => boolean);\n\nexport type CominsColumnProps<TData, TValue = unknown> = {\n className?: string | ((params: CominsCellComponentPayload<TData, TValue>) => string | undefined);\n copyable?: CominsClipboardGuard<TData, TValue>;\n disabled?: CominsClipboardGuard<TData, TValue>;\n pasteable?: CominsClipboardGuard<TData, TValue>;\n style?: React.CSSProperties | ((params: CominsCellComponentPayload<TData, TValue>) => React.CSSProperties | undefined);\n};\n\nexport type CominsTableComponentProps<TPayload, TProps> = TProps | ((payload: TPayload) => TProps);\n\nexport type CominsTableOptions<TPayload> =\n | CominsTableComponentOption[]\n | ((payload: TPayload) => CominsTableComponentOption[]);\n\nexport type CominsTableMenuItems<TPayload> =\n | CominsTableMenuItem[]\n | ((payload: TPayload) => CominsTableMenuItem[]);\n\nexport type CominsVirtualListItems<TPayload> =\n | Array<CominsVirtualListItem>\n | ((payload: TPayload) => Array<CominsVirtualListItem>);\n\nexport type CominsButtonComponentConfig<TPayload> = {\n onClick?: (payload: TPayload & { event: React.MouseEvent<HTMLButtonElement> }) => void;\n props?: CominsTableComponentProps<TPayload, React.ButtonHTMLAttributes<HTMLButtonElement>>;\n type: \"button\";\n};\n\nexport type CominsInputCommitEvent =\n | React.ChangeEvent<HTMLInputElement>\n | React.FocusEvent<HTMLInputElement>\n | React.KeyboardEvent<HTMLInputElement>;\n\nexport type CominsInputComponentConfig<TPayload> = {\n onChange?: (payload: TPayload & { event: CominsInputCommitEvent; value: string }) => void;\n onValueChange?: (payload: TPayload & { value: string }) => void;\n props?: CominsTableComponentProps<TPayload, React.InputHTMLAttributes<HTMLInputElement>>;\n type: \"input\";\n};\n\nexport type CominsCheckboxComponentConfig<TPayload> = {\n onCheckedChange?: (payload: TPayload & { checked: boolean }) => void;\n props?: CominsTableComponentProps<TPayload, React.InputHTMLAttributes<HTMLInputElement>>;\n type: \"checkbox\";\n};\n\nexport type CominsRadioComponentConfig<TPayload> = {\n onValueChange?: (payload: TPayload & { value: string }) => void;\n options: CominsTableOptions<TPayload>;\n props?: CominsTableComponentProps<\n TPayload,\n React.HTMLAttributes<HTMLDivElement> & { value?: CominsComponentPrimitiveValue }\n >;\n type: \"radio\";\n};\n\nexport type CominsSelectComponentConfig<TPayload> = {\n onValueChange?: (payload: TPayload & { value: string }) => void;\n options: CominsTableOptions<TPayload>;\n props?: CominsTableComponentProps<TPayload, React.SelectHTMLAttributes<HTMLSelectElement>>;\n type: \"select\";\n};\n\nexport type CominsToggleComponentConfig<TPayload> = {\n onCheckedChange?: (payload: TPayload & { checked: boolean }) => void;\n props?: CominsTableComponentProps<\n TPayload,\n React.ButtonHTMLAttributes<HTMLButtonElement> & { checked?: boolean }\n >;\n type: \"toggle\";\n};\n\nexport type CominsProgressComponentConfig<TPayload> = {\n props?: CominsTableComponentProps<\n TPayload,\n React.HTMLAttributes<HTMLDivElement> & { max?: number; value?: number }\n >;\n type: \"progress\";\n};\n\nexport type CominsMenuComponentConfig<TPayload> = {\n items: CominsTableMenuItems<TPayload>;\n onBeforeChange?: (\n payload: TPayload & { event?: Event | React.SyntheticEvent; open: boolean },\n ) => boolean | void;\n onOpenChange?: (payload: TPayload & { event?: Event | React.SyntheticEvent; open: boolean }) => void;\n onSelect?: (\n payload: TPayload & {\n event: React.MouseEvent<HTMLButtonElement>;\n item: Extract<CominsTableMenuItem, { value: CominsComponentPrimitiveValue }>;\n value: CominsComponentPrimitiveValue;\n },\n ) => void;\n props?: CominsTableComponentProps<TPayload, React.ButtonHTMLAttributes<HTMLButtonElement>>;\n type: \"menu\";\n};\n\nexport type CominsVirtualListSearchFilterPayload = {\n item: CominsVirtualListItem;\n itemIndex: number;\n value: string;\n};\n\nexport type CominsVirtualListComponentConfig<TPayload> = {\n items: CominsVirtualListItems<TPayload>;\n onClickItem?: (\n payload: TPayload & {\n event: React.MouseEvent<HTMLButtonElement> | React.KeyboardEvent<HTMLButtonElement>;\n item: CominsVirtualListItem;\n itemIndex: number;\n value: CominsComponentPrimitiveValue;\n },\n ) => void;\n onContextMenuItem?: (\n payload: TPayload & {\n event: React.MouseEvent<HTMLButtonElement>;\n item: CominsVirtualListItem;\n itemIndex: number;\n value: CominsComponentPrimitiveValue;\n },\n ) => void;\n props?: CominsTableComponentProps<\n TPayload,\n React.HTMLAttributes<HTMLDivElement> & {\n height?: number | string;\n itemHeight?: number;\n limit?: number;\n more?: boolean;\n searchable?: boolean;\n }\n >;\n searchFilter?: (payload: CominsVirtualListSearchFilterPayload) => boolean;\n type: \"virtual-list\";\n};\n\nexport type CominsHeaderComponentConfig<TData, TValue = unknown> =\n | CominsButtonComponentConfig<CominsHeaderComponentPayload<TData, TValue>>\n | CominsInputComponentConfig<CominsHeaderComponentPayload<TData, TValue>>\n | CominsCheckboxComponentConfig<CominsHeaderComponentPayload<TData, TValue>>\n | CominsRadioComponentConfig<CominsHeaderComponentPayload<TData, TValue>>\n | CominsSelectComponentConfig<CominsHeaderComponentPayload<TData, TValue>>\n | CominsToggleComponentConfig<CominsHeaderComponentPayload<TData, TValue>>\n | CominsProgressComponentConfig<CominsHeaderComponentPayload<TData, TValue>>\n | CominsMenuComponentConfig<CominsHeaderComponentPayload<TData, TValue>>;\n\nexport type CominsCellComponentConfig<TData, TValue = unknown> =\n | CominsButtonComponentConfig<CominsCellComponentPayload<TData, TValue>>\n | CominsInputComponentConfig<CominsCellComponentPayload<TData, TValue>>\n | CominsCheckboxComponentConfig<CominsCellComponentPayload<TData, TValue>>\n | CominsRadioComponentConfig<CominsCellComponentPayload<TData, TValue>>\n | CominsSelectComponentConfig<CominsCellComponentPayload<TData, TValue>>\n | CominsToggleComponentConfig<CominsCellComponentPayload<TData, TValue>>\n | CominsProgressComponentConfig<CominsCellComponentPayload<TData, TValue>>\n | CominsVirtualListComponentConfig<CominsCellComponentPayload<TData, TValue>>;\n\nexport type CominsHeaderComponent<TData, TValue = unknown> = CominsComponentPlacement &\n CominsHeaderComponentConfig<TData, TValue>;\n\nexport type CominsCellComponent<TData, TValue = unknown> = CominsComponentPlacement &\n CominsCellComponentConfig<TData, TValue>;\n\nexport type CominsTableCellConfig<TData, TValue = unknown> = {\n components?: Array<CominsCellComponent<TData, TValue>>;\n format?: (params: CominsCellComponentPayload<TData, TValue>) => React.ReactNode;\n props?:\n | CominsColumnProps<TData, TValue>\n | ((params: CominsCellComponentPayload<TData, TValue>) => CominsColumnProps<TData, TValue>);\n renderer?: (params: CominsCellComponentPayload<TData, TValue>) => React.ReactNode;\n tooltip?: string | ((params: CominsCellComponentPayload<TData, TValue>) => React.ReactNode);\n};\n\nexport type CominsTableHeaderConfig<TData, TValue = unknown> = {\n components?: Array<CominsHeaderComponent<TData, TValue>>;\n props?: React.ThHTMLAttributes<HTMLTableCellElement>;\n renderer?: (params: CominsHeaderComponentPayload<TData, TValue>) => React.ReactNode;\n};\n\nexport type CominsTableColumn<TData, TValue = unknown> = {\n cell?: CominsTableCellConfig<TData, TValue>;\n field: string;\n filter?: CominsColumnFilterConfig<TData, TValue>;\n header?: CominsTableHeaderConfig<TData, TValue>;\n hidden?: boolean;\n id?: string;\n label: React.ReactNode;\n lockPosition?: boolean;\n maxWidth?: number;\n minWidth?: number;\n pinned?: CominsColumnPinned;\n sort?: boolean | ((left: TValue, right: TValue, leftRow: TData, rightRow: TData) => number);\n width?: number;\n};\n\nexport type CominsTableColumnGroup = {\n children: string[];\n hidden?: boolean;\n id: string;\n label: React.ReactNode;\n lockPosition?: boolean;\n pinned?: CominsColumnPinned;\n};\n\nexport type CominsTableRuntimeColumn<TData, TValue = unknown> = Omit<\n CominsTableColumn<TData, TValue>,\n \"id\"\n> & {\n id: string;\n};\n\nexport type CominsTableRuntimeColumnGroup = Omit<CominsTableColumnGroup, \"children\"> & {\n children: string[];\n};\n\nexport type CominsEventColumn<TData, TValue = unknown> = {\n definition: CominsTableRuntimeColumn<TData, TValue>;\n field: string;\n id: string;\n index: number;\n label: React.ReactNode;\n};\n\nexport type CominsColumnRuntimeState = {\n hidden?: boolean;\n pinned?: CominsColumnPinned;\n width?: number;\n};\n\nexport type CominsColumnGroupRuntimeState = {\n hidden?: boolean;\n pinned?: CominsColumnPinned;\n};\n\nexport type CominsColumnLayout = {\n columns: Record<string, CominsColumnRuntimeState>;\n groups?: Record<string, CominsColumnGroupRuntimeState>;\n order: string[];\n};\n\nexport type CominsPaginationState = {\n pageIndex: number;\n pageSize: number;\n};\n\nexport type CominsSelectionState = {\n cell: CominsCellAddress | null;\n cells?: CominsCellAddress[];\n range: CominsCellRange | null;\n rowIds: CominsRowId[];\n};\n\nexport type CominsTableState<TData> = {\n columnOrder: string[];\n columnGroups: CominsTableRuntimeColumnGroup[];\n columnGroupState: Record<string, CominsColumnGroupRuntimeState>;\n columns: Array<CominsTableRuntimeColumn<TData>>;\n columnState: Record<string, CominsColumnRuntimeState>;\n getRowId: (row: TData, index: number) => CominsRowId;\n pagination: CominsPaginationState;\n rowIds: CominsRowId[];\n rows: TData[];\n selection: CominsSelectionState;\n showHeader: boolean;\n sort: CominsSortState | null;\n sortModel: CominsSortModel;\n theme: CominsTableTheme;\n};\n\nexport type CominsTableStateInput<TData> = {\n columnLayout?: Partial<CominsColumnLayout>;\n columnGroups?: ReadonlyArray<CominsTableColumnGroup>;\n columns: ReadonlyArray<CominsTableColumn<TData>>;\n getRowId?: (row: TData, index: number) => CominsRowId;\n pagination?: Partial<CominsPaginationState>;\n rows: readonly TData[];\n showHeader?: boolean;\n sort?: CominsSortState | null;\n sortModel?: CominsSortModel;\n theme?: CominsTableTheme;\n};\n\nexport type CominsRowUpdate<TData> = {\n id: CominsRowId;\n patch: Partial<TData> | ((row: TData) => TData);\n};\n\nexport type CominsVirtualRowsOptions = {\n overscan?: number;\n rowHeight: number;\n scrollTop: number;\n viewportHeight: number;\n};\n\nexport type CominsVirtualRows<TData> = {\n bottomSpacerHeight: number;\n endIndex: number;\n rows: TData[];\n startIndex: number;\n topSpacerHeight: number;\n totalHeight: number;\n};\n\nexport type CominsHeaderColumnCell<TData> = {\n colSpan: 1;\n column: CominsTableRuntimeColumn<TData>;\n columnId: string;\n groupId?: string;\n kind: \"column\";\n rowSpan: 1 | 2;\n};\n\nexport type CominsHeaderGroupCell = {\n colSpan: number;\n group: CominsTableRuntimeColumnGroup;\n groupId: string;\n kind: \"group\";\n rowSpan: 1;\n};\n\nexport type CominsHeaderCell<TData> = CominsHeaderColumnCell<TData> | CominsHeaderGroupCell;\n\nexport type CominsCopiedRow<TData> = {\n kind: \"row\";\n row: TData;\n text: string;\n};\n\nexport type CominsCopiedCell = {\n kind: \"cell\";\n text: string;\n value: unknown;\n};\n\nexport type CominsCopiedCellRangeCell = {\n columnId: string;\n text: string;\n value: unknown;\n} | null;\n\nexport type CominsCopiedCellRange = {\n kind: \"cell-range\";\n rows: CominsCopiedCellRangeCell[][];\n text: string;\n};\n\nexport type CominsExportFormat = \"csv\" | \"json\";\n\nexport type CominsExportValueSource = \"formatted\" | \"raw\";\n\nexport type CominsExportColumn<TData> = {\n format?: (row: TData, rowIndex: number) => unknown;\n id?: string;\n label?: string;\n value: (row: TData, rowIndex: number) => unknown;\n};\n\nexport type CominsExportRowsOptions<TData> = {\n columnOrder?: string[];\n columns: Array<CominsExportColumn<TData>>;\n headerOverrides?: Record<string, string>;\n rows: readonly TData[];\n valueSource?: CominsExportValueSource;\n};\n\nexport type CominsCellAddress = {\n columnId: string;\n rowId: CominsRowId;\n};\n\nexport type CominsCellRange = {\n anchor: CominsCellAddress;\n focus: CominsCellAddress;\n};\n\nexport type CominsPasteRowOptions<TData> =\n | {\n getNewRowId?: (row: TData) => CominsRowId;\n mode: \"append\";\n }\n | {\n getPastedRowId?: (row: TData) => CominsRowId;\n mode: \"insert-after\";\n targetRowId: CominsRowId;\n }\n | {\n mode: \"overwrite\" | \"replace\";\n targetRowId: CominsRowId;\n };\n\nexport type CominsRowSelectionOptions = {\n multi?: boolean;\n toggle?: boolean;\n};\n\nexport type CominsCellSelectionOptions = {\n multi?: boolean;\n toggle?: boolean;\n};\n\nexport type CominsFillCellRangeOptions = {\n source: CominsCellAddress;\n target: CominsCellRange;\n};\n\nconst COMINS_MIN_COLUMN_WIDTH = 88;\n\nfunction defaultGetRowId<TData>(_row: TData, index: number) {\n return index;\n}\n\nfunction useRowsReference<TData>(rows: readonly TData[]) {\n return rows as TData[];\n}\n\nfunction normalizeColumns<TData>(columns: ReadonlyArray<CominsTableColumn<TData>>) {\n return columns.map((column) => ({\n ...column,\n id: column.id ?? column.field,\n }));\n}\n\nfunction normalizeColumnGroups<TData>(\n columns: ReadonlyArray<CominsTableRuntimeColumn<TData>>,\n columnGroups: ReadonlyArray<CominsTableColumnGroup> = [],\n) {\n const knownColumnIds = new Set(columns.map((column) => column.id));\n const usedColumnIds = new Set<string>();\n const usedGroupIds = new Set<string>();\n const groups: CominsTableRuntimeColumnGroup[] = [];\n\n for (const group of columnGroups) {\n if (usedGroupIds.has(group.id)) {\n continue;\n }\n\n const children = group.children.filter((columnId) => {\n if (!knownColumnIds.has(columnId) || usedColumnIds.has(columnId)) {\n return false;\n }\n\n usedColumnIds.add(columnId);\n return true;\n });\n\n usedGroupIds.add(group.id);\n\n if (children.length === 0) {\n continue;\n }\n\n groups.push({\n ...group,\n children,\n });\n }\n\n return groups;\n}\n\nfunction normalizeColumnState<TData>(\n columns: ReadonlyArray<CominsTableRuntimeColumn<TData>>,\n layout?: Partial<CominsColumnLayout>,\n) {\n const state: Record<string, CominsColumnRuntimeState> = {};\n\n for (const column of columns) {\n state[column.id] = {\n hidden: layout?.columns?.[column.id]?.hidden ?? column.hidden,\n pinned: normalizeCominsColumnPinned(\n layout === undefined ? column.pinned : layout.columns?.[column.id]?.pinned,\n ),\n width: layout?.columns?.[column.id]?.width ?? column.width,\n };\n }\n\n return state;\n}\n\nfunction normalizeColumnGroupState(\n columnGroups: ReadonlyArray<CominsTableRuntimeColumnGroup>,\n layout?: Partial<CominsColumnLayout>,\n) {\n const state: Record<string, CominsColumnGroupRuntimeState> = {};\n\n for (const group of columnGroups) {\n state[group.id] = {\n hidden: layout?.groups?.[group.id]?.hidden ?? group.hidden,\n pinned: normalizeCominsColumnPinned(\n layout === undefined ? group.pinned : layout.groups?.[group.id]?.pinned,\n ),\n };\n }\n\n return state;\n}\n\nfunction getColumnGroupIdMap(columnGroups: ReadonlyArray<CominsTableRuntimeColumnGroup>) {\n const map = new Map<string, string>();\n\n for (const group of columnGroups) {\n for (const columnId of group.children) {\n map.set(columnId, group.id);\n }\n }\n\n return map;\n}\n\nfunction findColumnGroupById(\n columnGroups: ReadonlyArray<CominsTableRuntimeColumnGroup>,\n groupId: string,\n) {\n return columnGroups.find((group) => group.id === groupId);\n}\n\nfunction normalizeColumnOrder<TData>(\n columns: ReadonlyArray<CominsTableRuntimeColumn<TData>>,\n layout?: Partial<CominsColumnLayout>,\n columnGroups: ReadonlyArray<CominsTableRuntimeColumnGroup> = [],\n) {\n const knownIds = new Set(columns.map((column) => column.id));\n const ordered = (layout?.order ?? []).filter((id) => knownIds.has(id));\n const missing = columns.map((column) => column.id).filter((id) => !ordered.includes(id));\n const flatOrder = [...ordered, ...missing];\n const columnById = new Map(columns.map((column) => [column.id, column]));\n const groupIdByColumnId = getColumnGroupIdMap(columnGroups);\n const groupById = new Map(columnGroups.map((group) => [group.id, group]));\n const isColumnPinned = (columnId: string) =>\n !groupIdByColumnId.has(columnId) &&\n normalizeCominsColumnPinned(\n layout === undefined\n ? columnById.get(columnId)?.pinned\n : layout.columns?.[columnId]?.pinned,\n ) !== undefined;\n const isGroupPinned = (groupId: string) =>\n normalizeCominsColumnPinned(\n layout === undefined\n ? groupById.get(groupId)?.pinned\n : layout.groups?.[groupId]?.pinned,\n ) !== undefined;\n type ColumnOrderEntity = {\n columnIds: string[];\n key: string;\n locked: boolean;\n };\n const createEntities = (order: readonly string[]) => {\n const emittedGroups = new Set<string>();\n const entities: ColumnOrderEntity[] = [];\n\n for (const columnId of order) {\n const groupId = groupIdByColumnId.get(columnId);\n\n if (!groupId) {\n entities.push({\n columnIds: [columnId],\n key: `column:${columnId}`,\n locked:\n columnById.get(columnId)?.lockPosition === true ||\n isColumnPinned(columnId),\n });\n continue;\n }\n\n if (emittedGroups.has(groupId)) {\n continue;\n }\n\n const group = groupById.get(groupId);\n\n if (!group) {\n entities.push({\n columnIds: [columnId],\n key: `column:${columnId}`,\n locked:\n columnById.get(columnId)?.lockPosition === true ||\n isColumnPinned(columnId),\n });\n continue;\n }\n\n const groupChildrenInOrder = order.filter((currentId) => group.children.includes(currentId));\n entities.push({\n columnIds: groupChildrenInOrder,\n key: `group:${groupId}`,\n locked:\n group.lockPosition ||\n isGroupPinned(groupId) ||\n groupChildrenInOrder.some((currentId) => columnById.get(currentId)?.lockPosition === true),\n });\n emittedGroups.add(groupId);\n }\n\n return entities;\n };\n const declaredEntities = createEntities(columns.map((column) => column.id));\n const proposedEntities = createEntities(flatOrder);\n const declaredEntityByKey = new Map(declaredEntities.map((entity) => [entity.key, entity]));\n const declaredSegmentByKey = new Map<string, number>();\n let segmentCount = 0;\n\n for (const entity of declaredEntities) {\n declaredSegmentByKey.set(entity.key, segmentCount);\n\n if (entity.locked) {\n segmentCount += 1;\n }\n }\n\n const movableEntitiesBySegment = Array.from(\n { length: segmentCount + 1 },\n () => [] as ColumnOrderEntity[],\n );\n const proposedEntityByKey = new Map(proposedEntities.map((entity) => [entity.key, entity]));\n\n for (const entity of proposedEntities) {\n const declaredEntity = declaredEntityByKey.get(entity.key);\n\n if (!declaredEntity || declaredEntity.locked) {\n continue;\n }\n\n const segment = declaredSegmentByKey.get(entity.key) ?? 0;\n movableEntitiesBySegment[segment]?.push(entity);\n }\n\n const normalizedEntities: ColumnOrderEntity[] = [];\n let currentSegment = 0;\n\n for (const entity of declaredEntities) {\n if (!entity.locked) {\n continue;\n }\n\n normalizedEntities.push(...(movableEntitiesBySegment[currentSegment] ?? []));\n normalizedEntities.push(proposedEntityByKey.get(entity.key) ?? entity);\n currentSegment += 1;\n }\n\n normalizedEntities.push(...(movableEntitiesBySegment[currentSegment] ?? []));\n\n return normalizedEntities.flatMap((entity) => {\n const declaredEntity = declaredEntityByKey.get(entity.key);\n\n if (!declaredEntity || entity.columnIds.length === 1) {\n return entity.columnIds;\n }\n\n const lockedChildIds = new Set(\n declaredEntity.columnIds.filter((columnId) => columnById.get(columnId)?.lockPosition),\n );\n\n if (lockedChildIds.size === 0) {\n return entity.columnIds;\n }\n\n const declaredChildSegmentById = new Map<string, number>();\n let childSegmentCount = 0;\n\n for (const columnId of declaredEntity.columnIds) {\n declaredChildSegmentById.set(columnId, childSegmentCount);\n\n if (lockedChildIds.has(columnId)) {\n childSegmentCount += 1;\n }\n }\n\n const movableChildrenBySegment = Array.from(\n { length: childSegmentCount + 1 },\n () => [] as string[],\n );\n\n for (const columnId of entity.columnIds) {\n if (lockedChildIds.has(columnId)) {\n continue;\n }\n\n const segment = declaredChildSegmentById.get(columnId) ?? 0;\n movableChildrenBySegment[segment]?.push(columnId);\n }\n\n const normalizedChildren: string[] = [];\n let currentChildSegment = 0;\n\n for (const columnId of declaredEntity.columnIds) {\n if (!lockedChildIds.has(columnId)) {\n continue;\n }\n\n normalizedChildren.push(...(movableChildrenBySegment[currentChildSegment] ?? []));\n normalizedChildren.push(columnId);\n currentChildSegment += 1;\n }\n\n normalizedChildren.push(...(movableChildrenBySegment[currentChildSegment] ?? []));\n return normalizedChildren;\n });\n}\n\nfunction createEmptySelection(): CominsSelectionState {\n return {\n cell: null,\n cells: [],\n range: null,\n rowIds: [],\n };\n}\n\nfunction areRowIdsEqual(left: readonly CominsRowId[], right: readonly CominsRowId[]) {\n return left.length === right.length && left.every((id, index) => id === right[index]);\n}\n\nfunction withRows<TData>(\n state: CominsTableState<TData>,\n rows: TData[],\n options: { resetSelection?: boolean } = {},\n): CominsTableState<TData> {\n const rowIds = rows.map(state.getRowId);\n const shouldResetSelection = options.resetSelection === true || !areRowIdsEqual(state.rowIds, rowIds);\n\n return {\n ...state,\n rowIds,\n rows,\n selection: shouldResetSelection ? createEmptySelection() : state.selection,\n };\n}\n\nfunction findRowIndex<TData>(state: CominsTableState<TData>, rowId: CominsRowId) {\n return state.rowIds.findIndex((id) => id === rowId);\n}\n\nfunction findColumn<TData>(state: CominsTableState<TData>, columnId: string) {\n return state.columns.find((column) => column.id === columnId);\n}\n\nfunction areSortModelsEqual(left: CominsSortModel, right: CominsSortModel) {\n return (\n left.length === right.length &&\n left.every(\n (rule, index) => rule.columnId === right[index]?.columnId && rule.direction === right[index]?.direction,\n )\n );\n}\n\nfunction normalizeSortModel<TData>(\n columns: ReadonlyArray<CominsTableRuntimeColumn<TData>>,\n sortModel: CominsSortModel,\n): CominsSortState[] {\n const sortableColumnIds = new Set(columns.filter((column) => Boolean(column.sort)).map((column) => column.id));\n const usedColumnIds = new Set<string>();\n const normalized: CominsSortState[] = [];\n\n for (const rule of sortModel) {\n if (\n !sortableColumnIds.has(rule.columnId) ||\n usedColumnIds.has(rule.columnId) ||\n (rule.direction !== \"asc\" && rule.direction !== \"desc\")\n ) {\n continue;\n }\n\n usedColumnIds.add(rule.columnId);\n normalized.push({ columnId: rule.columnId, direction: rule.direction });\n }\n\n return normalized;\n}\n\nfunction getNestedFieldValue(row: unknown, field: string): unknown {\n return field.split(\".\").reduce<unknown>((value, key) => {\n if (value == null || typeof value !== \"object\") {\n return undefined;\n }\n\n return (value as Record<string, unknown>)[key];\n }, row);\n}\n\nfunction setNestedFieldValue<TData>(row: TData, field: string, value: unknown): TData {\n if (!row || typeof row !== \"object\") {\n return row;\n }\n\n const keys = field.split(\".\");\n const [firstKey] = keys;\n\n if (!firstKey) {\n return row;\n }\n\n if (keys.length === 1) {\n return { ...row, [firstKey]: value };\n }\n\n const root = { ...(row as Record<string, unknown>) };\n let current: Record<string, unknown> = root;\n\n keys.slice(0, -1).forEach((key, index) => {\n const nextKey = keys[index + 1];\n const existing = current[key];\n const next =\n existing && typeof existing === \"object\" && !Array.isArray(existing)\n ? { ...(existing as Record<string, unknown>) }\n : {};\n\n current[key] = next;\n\n if (nextKey) {\n current = next;\n }\n });\n\n current[keys.at(-1)!] = value;\n\n return root as TData;\n}\n\nfunction createCellComponentParams<TData>(\n state: CominsTableState<TData>,\n row: TData,\n rowId: CominsRowId,\n column: CominsTableRuntimeColumn<TData>,\n): CominsCellComponentPayload<TData> {\n const rowIndex = state.rowIds.indexOf(rowId);\n\n return {\n column: {\n definition: column,\n field: column.field,\n id: column.id,\n index: state.columns.findIndex((current) => current.id === column.id),\n label: column.label,\n },\n row: {\n data: row,\n dataIndex: rowIndex,\n disabled: false,\n id: rowId,\n index: rowIndex,\n selected: state.selection.rowIds.includes(rowId),\n },\n selection: {\n selectedRowCount: state.selection.rowIds.length,\n },\n value: getCominsCellValue(state, row, column.id),\n };\n}\n\nfunction resolveGuard<TData>(\n guard: CominsClipboardGuard<TData> | undefined,\n params: CominsCellComponentPayload<TData>,\n) {\n if (guard === undefined) {\n return true;\n }\n\n return typeof guard === \"boolean\" ? guard : guard(params);\n}\n\nfunction resolveCellProps<TData>(\n state: CominsTableState<TData>,\n row: TData,\n rowId: CominsRowId,\n column: CominsTableRuntimeColumn<TData>,\n) {\n const params = createCellComponentParams(state, row, rowId, column);\n const props = column.cell?.props;\n\n return typeof props === \"function\" ? props(params) : props;\n}\n\nfunction getCellRangeBounds<TData>(\n state: CominsTableState<TData>,\n range: CominsCellRange,\n rowIds: readonly CominsRowId[] = state.rowIds,\n) {\n const visibleColumns = getCominsVisibleColumns(state);\n const anchorRowIndex = rowIds.indexOf(range.anchor.rowId);\n const focusRowIndex = rowIds.indexOf(range.focus.rowId);\n const anchorColumnIndex = visibleColumns.findIndex((column) => column.id === range.anchor.columnId);\n const focusColumnIndex = visibleColumns.findIndex((column) => column.id === range.focus.columnId);\n\n if (anchorRowIndex < 0 || focusRowIndex < 0 || anchorColumnIndex < 0 || focusColumnIndex < 0) {\n return null;\n }\n\n return {\n columnEnd: Math.max(anchorColumnIndex, focusColumnIndex),\n columnStart: Math.min(anchorColumnIndex, focusColumnIndex),\n rowEnd: Math.max(anchorRowIndex, focusRowIndex),\n rowIds,\n rowStart: Math.min(anchorRowIndex, focusRowIndex),\n visibleColumns,\n };\n}\n\nfunction assignGeneratedRowId<TData>(row: TData, rowId: CominsRowId) {\n if (row && typeof row === \"object\" && \"id\" in row) {\n return { ...row, id: rowId } as TData;\n }\n\n return row;\n}\n\nfunction createCopiedRowId(existingIds: readonly CominsRowId[], sourceRowId: CominsRowId) {\n let index = 1;\n let nextId = `${String(sourceRowId)}-copy-${index}`;\n const ids = new Set(existingIds.map(String));\n\n while (ids.has(nextId)) {\n index += 1;\n nextId = `${String(sourceRowId)}-copy-${index}`;\n }\n\n return nextId;\n}\n\nfunction canUseCellClipboard<TData>(\n state: CominsTableState<TData>,\n row: TData | undefined,\n rowId: CominsRowId,\n column: CominsTableRuntimeColumn<TData>,\n kind: \"copy\" | \"paste\",\n) {\n if (row === undefined) {\n return false;\n }\n\n const params = createCellComponentParams(state, row, rowId, column);\n const props = resolveCellProps(state, row, rowId, column);\n\n if (props?.disabled !== undefined && resolveGuard(props.disabled, params) === true) {\n return false;\n }\n\n return resolveGuard(kind === \"copy\" ? props?.copyable : props?.pasteable, params);\n}\n\nfunction defaultCompare(left: unknown, right: unknown) {\n if (typeof left === \"number\" && typeof right === \"number\") {\n return left - right;\n }\n\n return String(left ?? \"\").localeCompare(String(right ?? \"\"));\n}\n\nexport function createCominsTableState<TData>({\n columnLayout,\n columnGroups,\n columns,\n getRowId = defaultGetRowId,\n pagination,\n rows,\n showHeader = true,\n sort = null,\n sortModel,\n theme = {},\n}: CominsTableStateInput<TData>): CominsTableState<TData> {\n const nextRows = useRowsReference(rows);\n const nextColumns = normalizeColumns(columns);\n const nextColumnGroups = normalizeColumnGroups(nextColumns, columnGroups);\n const nextSortModel = normalizeSortModel(nextColumns, sortModel ?? (sort ? [sort] : []));\n\n return {\n columnOrder: normalizeColumnOrder(nextColumns, columnLayout, nextColumnGroups),\n columnGroups: nextColumnGroups,\n columnGroupState: normalizeColumnGroupState(nextColumnGroups, columnLayout),\n columns: nextColumns,\n columnState: normalizeColumnState(nextColumns, columnLayout),\n getRowId,\n pagination: {\n pageIndex: pagination?.pageIndex ?? 0,\n pageSize: pagination?.pageSize ?? Math.max(nextRows.length, 1),\n },\n rowIds: nextRows.map(getRowId),\n rows: nextRows,\n selection: createEmptySelection(),\n showHeader,\n sort: nextSortModel[0] ?? null,\n sortModel: nextSortModel,\n theme,\n };\n}\n\nexport function queryCominsRows<TData>(\n state: CominsTableState<TData>,\n predicate?: (row: TData, index: number) => boolean,\n) {\n return predicate ? state.rows.filter(predicate) : [...state.rows];\n}\n\nexport function replaceCominsRows<TData>(state: CominsTableState<TData>, rows: readonly TData[]) {\n return withRows(state, useRowsReference(rows), { resetSelection: true });\n}\n\nexport function addCominsRows<TData>(state: CominsTableState<TData>, rows: readonly TData[]) {\n return withRows(state, [...state.rows, ...rows]);\n}\n\nexport function updateCominsRows<TData>(\n state: CominsTableState<TData>,\n updates: ReadonlyArray<CominsRowUpdate<TData>>,\n) {\n const updateMap = new Map(updates.map((update) => [update.id, update.patch]));\n const rows = state.rows.map((row, index) => {\n const rowId = state.rowIds[index];\n const patch = rowId === undefined ? undefined : updateMap.get(rowId);\n\n if (!patch) {\n return row;\n }\n\n return typeof patch === \"function\" ? patch(row) : { ...row, ...patch };\n });\n\n return withRows(state, rows);\n}\n\nexport function deleteCominsRows<TData>(state: CominsTableState<TData>, rowIds: readonly CominsRowId[]) {\n const deleteIds = new Set(rowIds);\n\n return withRows(\n state,\n state.rows.filter((_row, index) => {\n const rowId = state.rowIds[index];\n\n return rowId === undefined || !deleteIds.has(rowId);\n }),\n );\n}\n\nexport function setCominsTableTheme<TData>(state: CominsTableState<TData>, theme: CominsTableTheme) {\n return {\n ...state,\n theme: { ...state.theme, ...theme },\n };\n}\n\nexport function setCominsHeaderVisible<TData>(state: CominsTableState<TData>, showHeader: boolean) {\n return {\n ...state,\n showHeader,\n };\n}\n\nexport function setCominsPagination<TData>(\n state: CominsTableState<TData>,\n pagination: Partial<CominsPaginationState>,\n) {\n return {\n ...state,\n pagination: {\n pageIndex: pagination.pageIndex ?? state.pagination.pageIndex,\n pageSize: pagination.pageSize ?? state.pagination.pageSize,\n },\n };\n}\n\nexport function setCominsSortState<TData>(\n state: CominsTableState<TData>,\n sort: CominsSortState | null,\n) {\n return setCominsSortModel(state, sort ? [sort] : []);\n}\n\nexport function setCominsSortModel<TData>(\n state: CominsTableState<TData>,\n sortModel: CominsSortModel,\n) {\n const nextSortModel = normalizeSortModel(state.columns, sortModel);\n const nextSort = nextSortModel[0] ?? null;\n\n if (areSortModelsEqual(state.sortModel, nextSortModel)) {\n return state;\n }\n\n return {\n ...state,\n sort: nextSort,\n sortModel: nextSortModel,\n };\n}\n\nexport function clearCominsSortState<TData>(state: CominsTableState<TData>) {\n return setCominsSortModel(state, []);\n}\n\nexport function setCominsColumnWidth<TData>(\n state: CominsTableState<TData>,\n columnId: string,\n width: number,\n) {\n return {\n ...state,\n columnState: {\n ...state.columnState,\n [columnId]: {\n ...state.columnState[columnId],\n width,\n },\n },\n };\n}\n\nexport function setCominsColumnHidden<TData>(\n state: CominsTableState<TData>,\n columnId: string,\n hidden: boolean,\n) {\n return {\n ...state,\n columnState: {\n ...state.columnState,\n [columnId]: {\n ...state.columnState[columnId],\n hidden,\n },\n },\n };\n}\n\nexport function setCominsColumnGroupHidden<TData>(\n state: CominsTableState<TData>,\n groupId: string,\n hidden: boolean,\n) {\n if (!findColumnGroupById(state.columnGroups, groupId)) {\n return state;\n }\n\n return {\n ...state,\n columnGroupState: {\n ...state.columnGroupState,\n [groupId]: {\n ...state.columnGroupState[groupId],\n hidden,\n },\n },\n };\n}\n\nfunction getColumnWidth<TData>(\n state: CominsTableState<TData>,\n column: CominsTableRuntimeColumn<TData>,\n) {\n return state.columnState[column.id]?.width ?? column.width ?? 100;\n}\n\nfunction getColumnMinWidth<TData>(column: CominsTableRuntimeColumn<TData>) {\n return Math.max(COMINS_MIN_COLUMN_WIDTH, column.minWidth ?? COMINS_MIN_COLUMN_WIDTH);\n}\n\nfunction getColumnMaxWidth<TData>(column: CominsTableRuntimeColumn<TData>) {\n return column.maxWidth ?? Number.POSITIVE_INFINITY;\n}\n\nfunction clampWidth(width: number, minWidth: number, maxWidth: number) {\n return Math.min(maxWidth, Math.max(minWidth, width));\n}\n\nfunction distributeColumnGroupWidths<TData>(\n state: CominsTableState<TData>,\n columns: Array<CominsTableRuntimeColumn<TData>>,\n targetWidth: number,\n) {\n const widths = columns.map((column) =>\n clampWidth(getColumnWidth(state, column), getColumnMinWidth(column), getColumnMaxWidth(column)),\n );\n const active = new Set(columns.map((_column, index) => index));\n const minWidths = columns.map(getColumnMinWidth);\n const maxWidths = columns.map(getColumnMaxWidth);\n const boundedTargetWidth = clampWidth(\n targetWidth,\n minWidths.reduce((sum, width) => sum + width, 0),\n maxWidths.reduce((sum, width) => sum + width, 0),\n );\n\n while (active.size > 0) {\n const currentTotal = widths.reduce((sum, width) => sum + width, 0);\n const delta = boundedTargetWidth - currentTotal;\n\n if (Math.abs(delta) < 0.001) {\n break;\n }\n\n const activeIndexes = [...active];\n const activeWeight = activeIndexes.reduce((sum, index) => sum + Math.max(widths[index] ?? 0, 0), 0);\n let clamped = false;\n\n for (const index of activeIndexes) {\n const width = widths[index] ?? 0;\n const weight = activeWeight > 0 ? width / activeWeight : 1 / activeIndexes.length;\n const nextWidth = width + delta * weight;\n const clampedWidth = clampWidth(nextWidth, minWidths[index] ?? 0, maxWidths[index] ?? Number.POSITIVE_INFINITY);\n\n widths[index] = clampedWidth;\n\n if (Math.abs(clampedWidth - nextWidth) > 0.001) {\n active.delete(index);\n clamped = true;\n }\n }\n\n if (!clamped) {\n break;\n }\n }\n\n return widths;\n}\n\nexport function setCominsColumnGroupWidth<TData>(\n state: CominsTableState<TData>,\n groupId: string,\n width: number,\n) {\n const group = findColumnGroupById(state.columnGroups, groupId);\n\n if (!group || state.columnGroupState[group.id]?.hidden === true) {\n return state;\n }\n\n const childColumns = group.children\n .map((columnId) => findColumn(state, columnId))\n .filter((column): column is CominsTableRuntimeColumn<TData> => Boolean(column))\n .filter((column) => state.columnState[column.id]?.hidden !== true);\n\n if (childColumns.length === 0) {\n return state;\n }\n\n const widths = distributeColumnGroupWidths(state, childColumns, width);\n const columnState = { ...state.columnState };\n\n childColumns.forEach((column, index) => {\n columnState[column.id] = {\n ...columnState[column.id],\n width: widths[index],\n };\n });\n\n return {\n ...state,\n columnState,\n };\n}\n\nfunction doesColumnMoveChangeLockedPositions<TData>(\n state: CominsTableState<TData>,\n nextOrder: readonly string[],\n) {\n const currentIndexByColumnId = new Map(\n state.columnOrder.map((columnId, index) => [columnId, index] as const),\n );\n const nextIndexByColumnId = new Map(\n nextOrder.map((columnId, index) => [columnId, index] as const),\n );\n\n const groupIdByColumnId = getColumnGroupIdMap(state.columnGroups);\n\n for (const column of state.columns) {\n if (\n (\n column.lockPosition ||\n (!groupIdByColumnId.has(column.id) && state.columnState[column.id]?.pinned !== undefined)\n ) &&\n currentIndexByColumnId.get(column.id) !== nextIndexByColumnId.get(column.id)\n ) {\n return true;\n }\n }\n\n for (const group of state.columnGroups) {\n if (!group.lockPosition && state.columnGroupState[group.id]?.pinned === undefined) {\n continue;\n }\n\n const currentPositions = group.children\n .map((columnId) => currentIndexByColumnId.get(columnId))\n .filter((index): index is number => index !== undefined)\n .sort((left, right) => left - right);\n const nextPositions = group.children\n .map((columnId) => nextIndexByColumnId.get(columnId))\n .filter((index): index is number => index !== undefined)\n .sort((left, right) => left - right);\n\n if (\n currentPositions.length !== nextPositions.length ||\n currentPositions.some((index, position) => index !== nextPositions[position])\n ) {\n return true;\n }\n }\n\n return false;\n}\n\nexport function moveCominsColumn<TData>(\n state: CominsTableState<TData>,\n columnId: string,\n targetIndex: number,\n) {\n const sourceColumn = findColumn(state, columnId);\n const sourceGroupId = getColumnGroupIdMap(state.columnGroups).get(columnId);\n\n if (\n !sourceColumn ||\n sourceColumn.lockPosition ||\n (!sourceGroupId && state.columnState[columnId]?.pinned !== undefined)\n ) {\n return state;\n }\n\n const groupIdByColumnId = getColumnGroupIdMap(state.columnGroups);\n\n const current = state.columnOrder.filter((id) => id !== columnId);\n\n if (current.length === state.columnOrder.length) {\n return state;\n }\n\n const nextIndex = Math.max(0, Math.min(targetIndex, current.length));\n\n if (sourceGroupId) {\n const sourceGroup = findColumnGroupById(state.columnGroups, sourceGroupId);\n\n if (!sourceGroup) {\n return state;\n }\n\n const groupChildrenInCurrent = current.filter((id) => sourceGroup.children.includes(id));\n const groupStart = current.findIndex((id) => sourceGroup.children.includes(id));\n const groupEnd = groupStart + groupChildrenInCurrent.length;\n\n if (nextIndex < groupStart || nextIndex > groupEnd) {\n return state;\n }\n } else if (state.columnGroups.length > 0) {\n for (const group of state.columnGroups) {\n const groupChildrenInCurrent = current.filter((id) => group.children.includes(id));\n\n if (groupChildrenInCurrent.length === 0) {\n continue;\n }\n\n const groupStart = current.findIndex((id) => group.children.includes(id));\n const groupEnd = groupStart + groupChildrenInCurrent.length;\n\n if (nextIndex > groupStart && nextIndex < groupEnd) {\n return state;\n }\n }\n }\n\n current.splice(nextIndex, 0, columnId);\n\n if (doesColumnMoveChangeLockedPositions(state, current)) {\n return state;\n }\n\n if (current.every((id, index) => id === state.columnOrder[index])) {\n return state;\n }\n\n return { ...state, columnOrder: current };\n}\n\nexport function moveCominsColumnGroup<TData>(\n state: CominsTableState<TData>,\n groupId: string,\n targetIndex: number,\n) {\n const group = findColumnGroupById(state.columnGroups, groupId);\n\n if (\n !group ||\n group.lockPosition ||\n state.columnGroupState[groupId]?.pinned !== undefined\n ) {\n return state;\n }\n\n const groupChildren = state.columnOrder.filter((id) => group.children.includes(id));\n\n if (groupChildren.length === 0) {\n return state;\n }\n\n const current = state.columnOrder.filter((id) => !group.children.includes(id));\n const nextIndex = Math.max(0, Math.min(targetIndex, current.length));\n const nextOrder = [...current.slice(0, nextIndex), ...groupChildren, ...current.slice(nextIndex)];\n\n if (doesColumnMoveChangeLockedPositions(state, nextOrder)) {\n return state;\n }\n\n if (nextOrder.every((id, index) => id === state.columnOrder[index])) {\n return state;\n }\n\n return { ...state, columnOrder: nextOrder };\n}\n\nexport function serializeCominsColumnLayout<TData>(state: CominsTableState<TData>): CominsColumnLayout {\n const groups =\n state.columnGroups.length === 0\n ? undefined\n : Object.fromEntries(state.columnGroups.map((group) => [group.id, { ...state.columnGroupState[group.id] }]));\n\n return {\n columns: { ...state.columnState },\n ...(groups ? { groups } : {}),\n order: [...state.columnOrder],\n };\n}\n\nexport function applyCominsColumnLayout<TData>(state: CominsTableState<TData>, layout: CominsColumnLayout) {\n return {\n ...state,\n columnOrder: normalizeColumnOrder(state.columns, layout, state.columnGroups),\n columnGroupState: normalizeColumnGroupState(state.columnGroups, layout),\n columnState: normalizeColumnState(state.columns, layout),\n };\n}\n\nexport function selectRow<TData>(\n state: CominsTableState<TData>,\n rowId: CominsRowId,\n options: CominsRowSelectionOptions = {},\n) {\n const current = state.selection.rowIds;\n const selected = current.includes(rowId);\n const rowIds = options.multi\n ? options.toggle && selected\n ? current.filter((id) => id !== rowId)\n : selected\n ? current\n : [...current, rowId]\n : options.toggle && selected\n ? []\n : [rowId];\n\n return {\n ...state,\n selection: {\n ...state.selection,\n rowIds,\n },\n };\n}\n\nexport function selectRows<TData>(state: CominsTableState<TData>, rowIds: readonly CominsRowId[]) {\n return {\n ...state,\n selection: {\n ...state.selection,\n rowIds: [...rowIds],\n },\n };\n}\n\nfunction areCellAddressesEqual(left: CominsCellAddress, right: CominsCellAddress) {\n return left.rowId === right.rowId && left.columnId === right.columnId;\n}\n\nexport function selectCell<TData>(\n state: CominsTableState<TData>,\n cell: CominsCellAddress,\n options: CominsCellSelectionOptions = {},\n) {\n const current = state.selection.cells ?? (state.selection.cell ? [state.selection.cell] : []);\n const selected = current.some((candidate) => areCellAddressesEqual(candidate, cell));\n const cells = options.multi\n ? options.toggle && selected\n ? current.filter((candidate) => !areCellAddressesEqual(candidate, cell))\n : selected\n ? current\n : [...current, cell]\n : options.toggle && selected\n ? []\n : [cell];\n const activeCell = cells.some((candidate) => areCellAddressesEqual(candidate, cell))\n ? cell\n : (cells.at(-1) ?? null);\n\n return {\n ...state,\n selection: {\n ...state.selection,\n cell: activeCell,\n cells,\n range: null,\n },\n };\n}\n\nexport function selectCellRange<TData>(state: CominsTableState<TData>, range: CominsCellRange) {\n return {\n ...state,\n selection: {\n ...state.selection,\n cell: range.focus,\n cells: [],\n range,\n },\n };\n}\n\nexport function clearCominsCellRange<TData>(state: CominsTableState<TData>) {\n return {\n ...state,\n selection: {\n ...state.selection,\n range: null,\n },\n };\n}\n\nexport function clearCominsSelection<TData>(state: CominsTableState<TData>) {\n return {\n ...state,\n selection: createEmptySelection(),\n };\n}\n\nexport function isCominsRowSelected<TData>(state: CominsTableState<TData>, rowId: CominsRowId) {\n return state.selection.rowIds.includes(rowId);\n}\n\nexport function isCominsCellSelected<TData>(state: CominsTableState<TData>, cell: CominsCellAddress) {\n const selectedCells = state.selection.cells;\n\n if (selectedCells && selectedCells.length > 0) {\n return selectedCells.some((candidate) => areCellAddressesEqual(candidate, cell));\n }\n\n return state.selection.cell !== null && areCellAddressesEqual(state.selection.cell, cell);\n}\n\nexport function getCominsSelectedCellRange<TData>(\n state: CominsTableState<TData>,\n range: CominsCellRange | null = state.selection.range,\n rowIds: readonly CominsRowId[] = state.rowIds,\n) {\n if (!range) {\n return [];\n }\n\n const visibleColumns = getCominsVisibleColumns(state);\n const bounds = getCellRangeBounds(state, range, rowIds);\n\n if (!bounds) {\n return [];\n }\n\n const cells: CominsCellAddress[] = [];\n\n for (let rowIndex = bounds.rowStart; rowIndex <= bounds.rowEnd; rowIndex += 1) {\n const rowId = bounds.rowIds[rowIndex];\n\n if (rowId === undefined) {\n continue;\n }\n\n for (let columnIndex = bounds.columnStart; columnIndex <= bounds.columnEnd; columnIndex += 1) {\n const column = visibleColumns[columnIndex];\n\n if (column) {\n cells.push({ columnId: column.id, rowId });\n }\n }\n }\n\n return cells;\n}\n\nexport function isCominsCellInSelectedRange<TData>(\n state: CominsTableState<TData>,\n cell: CominsCellAddress,\n rowIds: readonly CominsRowId[] = state.rowIds,\n) {\n return getCominsSelectedCellRange(state, state.selection.range, rowIds).some(\n (selected) => selected.rowId === cell.rowId && selected.columnId === cell.columnId,\n );\n}\n\nexport function getCominsVisibleColumns<TData>(state: CominsTableState<TData>) {\n const groupIdByColumnId = getColumnGroupIdMap(state.columnGroups);\n const groupById = new Map(state.columnGroups.map((group) => [group.id, group]));\n const emittedGroups = new Set<string>();\n const blocks: Array<{\n columns: Array<CominsTableRuntimeColumn<TData>>;\n pinned?: CominsColumnPinned;\n }> = [];\n\n for (const columnId of state.columnOrder) {\n const column = findColumn(state, columnId);\n\n if (!column || state.columnState[column.id]?.hidden === true) {\n continue;\n }\n\n const groupId = groupIdByColumnId.get(column.id);\n\n if (!groupId) {\n blocks.push({ columns: [column], pinned: state.columnState[column.id]?.pinned });\n continue;\n }\n\n if (emittedGroups.has(groupId) || state.columnGroupState[groupId]?.hidden === true) {\n continue;\n }\n\n const group = groupById.get(groupId);\n\n if (!group) {\n continue;\n }\n\n const columns = state.columnOrder\n .filter((currentId) => group.children.includes(currentId))\n .map((currentId) => findColumn(state, currentId))\n .filter((current): current is CominsTableRuntimeColumn<TData> =>\n Boolean(current) && state.columnState[current!.id]?.hidden !== true,\n );\n\n if (columns.length > 0) {\n blocks.push({ columns, pinned: state.columnGroupState[groupId]?.pinned });\n }\n\n emittedGroups.add(groupId);\n }\n\n return [\"left\", undefined, \"right\"].flatMap((pinned) =>\n blocks\n .filter((block) => block.pinned === pinned)\n .flatMap((block) => block.columns),\n );\n}\n\nexport function getCominsHeaderRows<TData>(state: CominsTableState<TData>): Array<Array<CominsHeaderCell<TData>>> {\n const visibleColumns = getCominsVisibleColumns(state);\n\n if (state.columnGroups.length === 0) {\n return [\n visibleColumns.map((column) => ({\n colSpan: 1,\n column,\n columnId: column.id,\n kind: \"column\",\n rowSpan: 1,\n })),\n ];\n }\n\n const visibleColumnIds = new Set(visibleColumns.map((column) => column.id));\n const groupIdByColumnId = getColumnGroupIdMap(state.columnGroups);\n const groupById = new Map(state.columnGroups.map((group) => [group.id, group]));\n const emittedGroups = new Set<string>();\n const parentRow: Array<CominsHeaderCell<TData>> = [];\n const childRow: Array<CominsHeaderCell<TData>> = [];\n\n for (const column of visibleColumns) {\n const columnId = column.id;\n\n const groupId = groupIdByColumnId.get(columnId);\n\n if (!groupId) {\n parentRow.push({\n colSpan: 1,\n column,\n columnId: column.id,\n kind: \"column\",\n rowSpan: 2,\n });\n continue;\n }\n\n if (emittedGroups.has(groupId)) {\n continue;\n }\n\n const group = groupById.get(groupId);\n\n if (!group) {\n continue;\n }\n\n const visibleGroupColumns = visibleColumns.filter((currentColumn) =>\n group.children.includes(currentColumn.id),\n );\n\n if (visibleGroupColumns.length === 0) {\n emittedGroups.add(groupId);\n continue;\n }\n\n parentRow.push({\n colSpan: visibleGroupColumns.length,\n group,\n groupId,\n kind: \"group\",\n rowSpan: 1,\n });\n childRow.push(\n ...visibleGroupColumns.map((currentColumn) => ({\n colSpan: 1 as const,\n column: currentColumn,\n columnId: currentColumn.id,\n groupId,\n kind: \"column\" as const,\n rowSpan: 1 as const,\n })),\n );\n emittedGroups.add(groupId);\n }\n\n return [parentRow, childRow];\n}\n\nexport function getCominsSortedRowIndexes<TData>(\n state: CominsTableState<TData>,\n sourceIndexes: readonly number[] = state.rows.map((_row, index) => index),\n) {\n const indexes = [...sourceIndexes];\n\n if (state.sortModel.length === 0) {\n return indexes;\n }\n\n return [...indexes].sort((leftIndex, rightIndex) => {\n const leftRow = state.rows[leftIndex]!;\n const rightRow = state.rows[rightIndex]!;\n\n for (const rule of state.sortModel) {\n const column = findColumn(state, rule.columnId);\n\n if (!column?.sort) {\n continue;\n }\n\n const leftValue = getCominsCellValue(state, leftRow, column.id);\n const rightValue = getCominsCellValue(state, rightRow, column.id);\n const result =\n typeof column.sort === \"function\"\n ? column.sort(leftValue, rightValue, leftRow, rightRow)\n : defaultCompare(leftValue, rightValue);\n\n if (result !== 0) {\n return rule.direction === \"desc\" ? result * -1 : result;\n }\n }\n\n return leftIndex - rightIndex;\n });\n}\n\nexport function sortCominsRows<TData>(\n state: CominsTableState<TData>,\n sort: CominsSortState | null,\n) {\n const sortedState = setCominsSortState(state, sort);\n const indexes = getCominsSortedRowIndexes(sortedState);\n const rows = indexes.map((index) => sortedState.rows[index]!);\n\n return withRows(sortedState, rows);\n}\n\nexport function getCominsPageRows<TData>(\n state: CominsTableState<TData>,\n pagination: Partial<CominsPaginationState> = {},\n) {\n const pageIndex = pagination.pageIndex ?? state.pagination.pageIndex;\n const pageSize = pagination.pageSize ?? state.pagination.pageSize;\n const start = Math.max(0, pageIndex) * Math.max(1, pageSize);\n const indexes = getCominsSortedRowIndexes(state).slice(start, start + Math.max(1, pageSize));\n\n return indexes.map((index) => state.rows[index]!);\n}\n\nexport function getCominsVirtualRows<TData>(\n state: CominsTableState<TData>,\n { overscan = 2, rowHeight, scrollTop, viewportHeight }: CominsVirtualRowsOptions,\n): CominsVirtualRows<TData> {\n const safeRowHeight = Math.max(1, rowHeight);\n const rowIndexes = getCominsSortedRowIndexes(state);\n const totalRows = rowIndexes.length;\n const totalHeight = totalRows * safeRowHeight;\n const startIndex = Math.max(0, Math.floor(Math.max(0, scrollTop) / safeRowHeight) - Math.max(0, overscan));\n const endIndex = Math.min(\n totalRows,\n Math.ceil((Math.max(0, scrollTop) + Math.max(0, viewportHeight)) / safeRowHeight) + Math.max(0, overscan),\n );\n const topSpacerHeight = startIndex * safeRowHeight;\n\n return {\n bottomSpacerHeight: Math.max(0, totalHeight - topSpacerHeight - (endIndex - startIndex) * safeRowHeight),\n endIndex,\n rows: rowIndexes.slice(startIndex, endIndex).map((index) => state.rows[index]!),\n startIndex,\n topSpacerHeight,\n totalHeight,\n };\n}\n\nexport function moveCominsRow<TData>(\n state: CominsTableState<TData>,\n rowId: CominsRowId,\n targetIndex: number,\n) {\n const currentIndex = findRowIndex(state, rowId);\n\n if (currentIndex < 0) {\n return state;\n }\n\n const rows = [...state.rows];\n const [row] = rows.splice(currentIndex, 1);\n\n if (row === undefined) {\n return state;\n }\n\n rows.splice(Math.max(0, Math.min(targetIndex, rows.length)), 0, row);\n\n return withRows(state, rows);\n}\n\nexport type CominsRowGroupMoveOptions<TData> = {\n getRowGroupId: (row: TData, dataIndex: number) => CominsRowId;\n setRowGroupId?: (params: {\n fromGroupId: CominsRowId;\n row: TData;\n rowId: CominsRowId;\n toGroupId: CominsRowId;\n }) => TData;\n sourceRowId: CominsRowId;\n targetGroupId: CominsRowId;\n targetRowId?: CominsRowId;\n};\n\nexport function moveCominsRowToGroup<TData>(\n state: CominsTableState<TData>,\n options: CominsRowGroupMoveOptions<TData>,\n) {\n const sourceIndex = findRowIndex(state, options.sourceRowId);\n const targetRowIndex = options.targetRowId === undefined\n ? -1\n : findRowIndex(state, options.targetRowId);\n\n if (\n sourceIndex < 0 ||\n options.targetRowId === options.sourceRowId ||\n (options.targetRowId !== undefined && targetRowIndex < 0)\n ) {\n return state;\n }\n\n const sourceRow = state.rows[sourceIndex];\n\n if (sourceRow === undefined) {\n return state;\n }\n\n const fromGroupId = options.getRowGroupId(sourceRow, sourceIndex);\n const membershipChanged = fromGroupId !== options.targetGroupId;\n\n if (membershipChanged && typeof options.setRowGroupId !== \"function\") {\n return state;\n }\n\n if (targetRowIndex >= 0) {\n const targetRow = state.rows[targetRowIndex];\n\n if (\n targetRow === undefined ||\n options.getRowGroupId(targetRow, targetRowIndex) !== options.targetGroupId\n ) {\n return state;\n }\n }\n\n const movedRow = membershipChanged\n ? options.setRowGroupId!({\n fromGroupId,\n row: sourceRow,\n rowId: options.sourceRowId,\n toGroupId: options.targetGroupId,\n })\n : sourceRow;\n const rows = [...state.rows];\n rows.splice(sourceIndex, 1);\n let targetIndex: number;\n\n if (options.targetRowId !== undefined) {\n targetIndex = Math.max(0, Math.min(targetRowIndex, rows.length));\n } else {\n let lastTargetIndex = -1;\n\n rows.forEach((row, index) => {\n if (options.getRowGroupId(row, index) === options.targetGroupId) {\n lastTargetIndex = index;\n }\n });\n targetIndex = lastTargetIndex < 0 ? rows.length : lastTargetIndex + 1;\n }\n\n rows.splice(targetIndex, 0, movedRow);\n\n return withRows(state, rows);\n}\n\nexport function getCominsCellValue<TData>(\n state: CominsTableState<TData>,\n row: TData,\n columnId: string,\n) {\n const column = findColumn(state, columnId);\n\n return column ? getNestedFieldValue(row, column.field) : undefined;\n}\n\nexport function formatCominsCellValue<TData>(\n state: CominsTableState<TData>,\n row: TData,\n rowId: CominsRowId,\n column: CominsTableRuntimeColumn<TData>,\n) {\n const value = getCominsCellValue(state, row, column.id);\n\n if (column.cell?.format) {\n return column.cell.format(createCellComponentParams(state, row, rowId, column));\n }\n\n return value == null ? \"\" : String(value);\n}\n\nexport function isCominsCellDisabled<TData>(\n state: CominsTableState<TData>,\n row: TData,\n rowId: CominsRowId,\n column: CominsTableRuntimeColumn<TData>,\n) {\n const props = resolveCellProps(state, row, rowId, column);\n\n return props?.disabled !== undefined && resolveGuard(props.disabled, createCellComponentParams(state, row, rowId, column)) === true;\n}\n\nexport function getCominsCellClassName<TData>(\n state: CominsTableState<TData>,\n row: TData,\n rowId: CominsRowId,\n column: CominsTableRuntimeColumn<TData>,\n) {\n const params = createCellComponentParams(state, row, rowId, column);\n const className = resolveCellProps(state, row, rowId, column)?.className;\n\n return typeof className === \"function\" ? className(params) : className;\n}\n\nexport function getCominsCellStyle<TData>(\n state: CominsTableState<TData>,\n row: TData,\n rowId: CominsRowId,\n column: CominsTableRuntimeColumn<TData>,\n) {\n const params = createCellComponentParams(state, row, rowId, column);\n const style = resolveCellProps(state, row, rowId, column)?.style;\n\n return typeof style === \"function\" ? style(params) : style;\n}\n\nexport function copyCominsRow<TData>(state: CominsTableState<TData>, rowId: CominsRowId): CominsCopiedRow<TData> {\n const row = state.rows[findRowIndex(state, rowId)];\n\n if (row === undefined) {\n throw new Error(`Cannot copy missing row: ${String(rowId)}`);\n }\n\n return {\n kind: \"row\",\n row,\n text: JSON.stringify(row),\n };\n}\n\nexport function pasteCominsRow<TData>(\n state: CominsTableState<TData>,\n copied: CominsCopiedRow<TData>,\n options: CominsPasteRowOptions<TData>,\n) {\n if (options.mode === \"append\") {\n const rowId = options.getNewRowId?.(copied.row);\n const row = rowId === undefined ? copied.row : assignGeneratedRowId(copied.row, rowId);\n\n return addCominsRows(state, [row]);\n }\n\n if (options.mode === \"insert-after\") {\n const targetIndex = findRowIndex(state, options.targetRowId);\n\n if (targetIndex < 0) {\n return state;\n }\n\n const sourceRowId = state.getRowId(copied.row, targetIndex);\n const rowId = options.getPastedRowId?.(copied.row) ?? createCopiedRowId(state.rowIds, sourceRowId);\n const row = assignGeneratedRowId(copied.row, rowId);\n const rows = [...state.rows];\n rows.splice(targetIndex + 1, 0, row);\n\n return withRows(state, rows);\n }\n\n return updateCominsRows(state, [\n {\n id: options.targetRowId,\n patch: assignGeneratedRowId(copied.row, options.targetRowId) as Partial<TData>,\n },\n ]);\n}\n\nexport function copyCominsCell<TData>(\n state: CominsTableState<TData>,\n { columnId, rowId }: CominsCellAddress,\n): CominsCopiedCell | null {\n const row = state.rows[findRowIndex(state, rowId)];\n const column = findColumn(state, columnId);\n\n if (!column || !canUseCellClipboard(state, row, rowId, column, \"copy\")) {\n return null;\n }\n\n const value = getCominsCellValue(state, row!, columnId);\n\n return {\n kind: \"cell\",\n text: value == null ? \"\" : String(value),\n value,\n };\n}\n\nexport function pasteCominsCell<TData>(\n state: CominsTableState<TData>,\n { columnId, rowId }: CominsCellAddress,\n copied: CominsCopiedCell | null,\n) {\n const column = findColumn(state, columnId);\n const row = state.rows[findRowIndex(state, rowId)];\n\n if (!copied || !column || !canUseCellClipboard(state, row, rowId, column, \"paste\")) {\n return state;\n }\n\n return updateCominsRows(state, [\n {\n id: rowId,\n patch: (currentRow) => setNestedFieldValue(currentRow, column.field, copied.value),\n },\n ]);\n}\n\nexport function copyCominsCellRange<TData>(\n state: CominsTableState<TData>,\n range: CominsCellRange | null = state.selection.range,\n rowIds: readonly CominsRowId[] = state.rowIds,\n): CominsCopiedCellRange | null {\n if (!range) {\n return null;\n }\n\n const bounds = getCellRangeBounds(state, range, rowIds);\n\n if (!bounds) {\n return null;\n }\n\n const copiedRows: CominsCopiedCellRangeCell[][] = [];\n\n for (let rowIndex = bounds.rowStart; rowIndex <= bounds.rowEnd; rowIndex += 1) {\n const rowId = bounds.rowIds[rowIndex];\n const dataIndex = rowId === undefined ? -1 : findRowIndex(state, rowId);\n const row = state.rows[dataIndex];\n const copiedCells: CominsCopiedCellRangeCell[] = [];\n\n for (let columnIndex = bounds.columnStart; columnIndex <= bounds.columnEnd; columnIndex += 1) {\n const column = bounds.visibleColumns[columnIndex];\n\n if (row === undefined || rowId === undefined || !column || !canUseCellClipboard(state, row, rowId, column, \"copy\")) {\n copiedCells.push(null);\n continue;\n }\n\n const value = getCominsCellValue(state, row, column.id);\n copiedCells.push({\n columnId: column.id,\n text: value == null ? \"\" : String(value),\n value,\n });\n }\n\n copiedRows.push(copiedCells);\n }\n\n return {\n kind: \"cell-range\",\n rows: copiedRows,\n text: copiedRows.map((row) => row.map((cell) => cell?.text ?? \"\").join(\"\\t\")).join(\"\\n\"),\n };\n}\n\nexport function pasteCominsCellRange<TData>(\n state: CominsTableState<TData>,\n target: CominsCellAddress,\n copied: CominsCopiedCellRange | null,\n rowIds: readonly CominsRowId[] = state.rowIds,\n) {\n if (!copied) {\n return state;\n }\n\n const visibleColumns = getCominsVisibleColumns(state);\n const targetRowIndex = rowIds.indexOf(target.rowId);\n const targetColumnIndex = visibleColumns.findIndex((column) => column.id === target.columnId);\n const rows = [...state.rows];\n\n if (targetRowIndex < 0 || targetColumnIndex < 0) {\n return state;\n }\n\n let changed = false;\n\n copied.rows.forEach((copiedRow, rowOffset) => {\n const rowId = rowIds[targetRowIndex + rowOffset];\n const rowIndex = rowId === undefined ? -1 : findRowIndex(state, rowId);\n const row = rows[rowIndex];\n\n if (row === undefined || rowId === undefined) {\n return;\n }\n\n copiedRow.forEach((copiedCell, columnOffset) => {\n const column = visibleColumns[targetColumnIndex + columnOffset];\n\n if (!copiedCell || !column || !canUseCellClipboard(state, row, rowId, column, \"paste\")) {\n return;\n }\n\n rows[rowIndex] = setNestedFieldValue(rows[rowIndex]!, column.field, copiedCell.value);\n changed = true;\n });\n });\n\n return changed ? withRows(state, rows) : state;\n}\n\nexport function fillCominsCellRange<TData>(\n state: CominsTableState<TData>,\n { source, target }: CominsFillCellRangeOptions,\n) {\n const copied = copyCominsCell(state, source);\n\n if (!copied) {\n return state;\n }\n\n return getCominsSelectedCellRange(state, target).reduce(\n (currentState, cell) => pasteCominsCell(currentState, cell, copied),\n state,\n );\n}\n\nfunction normalizeCominsExportColumns<TData>({\n columnOrder,\n columns,\n}: Pick<CominsExportRowsOptions<TData>, \"columnOrder\" | \"columns\">) {\n if (!columnOrder?.length) {\n return columns;\n }\n\n const columnsById = new Map(columns.map((column) => [column.id, column]));\n\n return columnOrder\n .map((id) => columnsById.get(id))\n .filter((column): column is CominsExportColumn<TData> => Boolean(column));\n}\n\nfunction stringifyCominsExportValue(value: unknown) {\n if (value === null || value === undefined) {\n return \"\";\n }\n if (typeof value === \"string\") {\n return value;\n }\n if (typeof value === \"number\" || typeof value === \"boolean\" || typeof value === \"bigint\") {\n return String(value);\n }\n\n return JSON.stringify(value);\n}\n\nfunction escapeCominsCsvCell(value: unknown) {\n const text = stringifyCominsExportValue(value);\n\n return /[\",\\r\\n]/u.test(text) ? `\"${text.replaceAll('\"', '\"\"')}\"` : text;\n}\n\nfunction getCominsExportHeader<TData>(column: CominsExportColumn<TData>, headerOverrides?: Record<string, string>) {\n if (column.id && headerOverrides?.[column.id] !== undefined) {\n return headerOverrides[column.id];\n }\n\n return column.label ?? column.id ?? \"\";\n}\n\nfunction getCominsExportValue<TData>(\n column: CominsExportColumn<TData>,\n row: TData,\n rowIndex: number,\n valueSource: CominsExportValueSource,\n) {\n if (valueSource === \"formatted\" && column.format) {\n return column.format(row, rowIndex);\n }\n\n return column.value(row, rowIndex);\n}\n\nexport function exportCominsRowsToCsv<TData>({\n columnOrder,\n columns,\n headerOverrides,\n rows,\n valueSource = \"raw\",\n}: CominsExportRowsOptions<TData>) {\n const exportColumns = normalizeCominsExportColumns({ columnOrder, columns });\n const lines = [\n exportColumns.map((column) => escapeCominsCsvCell(getCominsExportHeader(column, headerOverrides))).join(\",\"),\n ...rows.map((row, rowIndex) =>\n exportColumns.map((column) => escapeCominsCsvCell(getCominsExportValue(column, row, rowIndex, valueSource))).join(\",\"),\n ),\n ];\n\n return lines.join(\"\\n\");\n}\n\nexport function exportCominsRowsToJson<TData>({\n columnOrder,\n columns,\n headerOverrides,\n rows,\n valueSource = \"raw\",\n}: CominsExportRowsOptions<TData>) {\n const exportColumns = normalizeCominsExportColumns({ columnOrder, columns });\n const data = rows.map((row, rowIndex) =>\n Object.fromEntries(\n exportColumns.map((column) => [\n getCominsExportHeader(column, headerOverrides),\n getCominsExportValue(column, row, rowIndex, valueSource),\n ]),\n ),\n );\n\n return JSON.stringify(data, null, 2);\n}\n"],"mappings":"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"}