persian-data-grid 0.5.0 → 0.6.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.
Files changed (282) hide show
  1. package/OFL.txt +93 -0
  2. package/README.md +179 -22
  3. package/dist/ERPTableGroupRow-J5Z2LRC5.cjs +131 -0
  4. package/dist/ERPTableGroupRow-J5Z2LRC5.cjs.map +1 -0
  5. package/dist/ERPTableGroupRow-PSAPAHGL.js +125 -0
  6. package/dist/ERPTableGroupRow-PSAPAHGL.js.map +1 -0
  7. package/dist/GridPlugin-CJCaYnlw.d.ts +57 -0
  8. package/dist/GridPlugin-oxhq8AsM.d.cts +57 -0
  9. package/dist/GridPresenceService-GEH6535Q.js +3 -0
  10. package/dist/GridPresenceService-GEH6535Q.js.map +1 -0
  11. package/dist/GridPresenceService-RDN5FXHQ.cjs +12 -0
  12. package/dist/GridPresenceService-RDN5FXHQ.cjs.map +1 -0
  13. package/dist/GridSession-B-9lLcoB.d.cts +2492 -0
  14. package/dist/GridSession-Bc7UIawO.d.ts +2492 -0
  15. package/dist/GridSyncService-KTLB4KP3.js +3 -0
  16. package/dist/GridSyncService-KTLB4KP3.js.map +1 -0
  17. package/dist/GridSyncService-TAPAHABV.cjs +12 -0
  18. package/dist/GridSyncService-TAPAHABV.cjs.map +1 -0
  19. package/dist/PdfRenderer-1HFh6UeR.d.ts +22 -0
  20. package/dist/PdfRenderer-CBg7hWNS.d.cts +22 -0
  21. package/dist/RemoteApi-CCQxiSf1.d.cts +28 -0
  22. package/dist/RemoteApi-CCQxiSf1.d.ts +28 -0
  23. package/dist/SelectImpl-NM4O4IGW.js +447 -0
  24. package/dist/SelectImpl-NM4O4IGW.js.map +1 -0
  25. package/dist/SelectImpl-W2EI4T7O.cjs +453 -0
  26. package/dist/SelectImpl-W2EI4T7O.cjs.map +1 -0
  27. package/dist/UITableController-Cuwq481K.d.cts +632 -0
  28. package/dist/UITableController-DU8RopUM.d.ts +632 -0
  29. package/dist/VazirmatnPdfRenderer-BCMpC1zy.d.cts +96 -0
  30. package/dist/VazirmatnPdfRenderer-Dz_G-m3c.d.ts +96 -0
  31. package/dist/adapters/arian-erp.cjs +77 -0
  32. package/dist/adapters/arian-erp.cjs.map +1 -0
  33. package/dist/adapters/arian-erp.d.cts +60 -0
  34. package/dist/adapters/arian-erp.d.ts +60 -0
  35. package/dist/adapters/arian-erp.js +71 -0
  36. package/dist/adapters/arian-erp.js.map +1 -0
  37. package/dist/appendAtEnd-RHIQRG2W.cjs +35 -0
  38. package/dist/appendAtEnd-RHIQRG2W.cjs.map +1 -0
  39. package/dist/appendAtEnd-TJEABLGD.js +33 -0
  40. package/dist/appendAtEnd-TJEABLGD.js.map +1 -0
  41. package/dist/applyImportedRows-BO6yxoAN.d.cts +135 -0
  42. package/dist/applyImportedRows-D4zVY8uD.d.ts +135 -0
  43. package/dist/applyRowVisibilityHandler-KS6TMCBN.js +83 -0
  44. package/dist/applyRowVisibilityHandler-KS6TMCBN.js.map +1 -0
  45. package/dist/applyRowVisibilityHandler-LXCOGESZ.cjs +85 -0
  46. package/dist/applyRowVisibilityHandler-LXCOGESZ.cjs.map +1 -0
  47. package/dist/broadcastChannelTransport-FHUMV76O.cjs +12 -0
  48. package/dist/broadcastChannelTransport-FHUMV76O.cjs.map +1 -0
  49. package/dist/broadcastChannelTransport-MIH53VNZ.js +3 -0
  50. package/dist/broadcastChannelTransport-MIH53VNZ.js.map +1 -0
  51. package/dist/callbackRemoteApi-BlXO5NJz.d.ts +30 -0
  52. package/dist/callbackRemoteApi-DgnXH-i0.d.cts +30 -0
  53. package/dist/cellRenderContext-DB7V_mlu.d.ts +42 -0
  54. package/dist/cellRenderContext-DG5BOlxK.d.cts +42 -0
  55. package/dist/chunk-2BJCRYOS.cjs +936 -0
  56. package/dist/chunk-2BJCRYOS.cjs.map +1 -0
  57. package/dist/chunk-3Y3KKGEC.js +3 -0
  58. package/dist/chunk-3Y3KKGEC.js.map +1 -0
  59. package/dist/chunk-5ALMNLUR.cjs +1408 -0
  60. package/dist/chunk-5ALMNLUR.cjs.map +1 -0
  61. package/dist/chunk-5HKVMPBD.js +937 -0
  62. package/dist/chunk-5HKVMPBD.js.map +1 -0
  63. package/dist/chunk-633KP74Z.js +189 -0
  64. package/dist/chunk-633KP74Z.js.map +1 -0
  65. package/dist/chunk-6XBXZPBW.js +298 -0
  66. package/dist/chunk-6XBXZPBW.js.map +1 -0
  67. package/dist/chunk-77UXAJII.js +112 -0
  68. package/dist/chunk-77UXAJII.js.map +1 -0
  69. package/dist/chunk-ASPTRYRD.cjs +21 -0
  70. package/dist/chunk-ASPTRYRD.cjs.map +1 -0
  71. package/dist/chunk-AU3RDJYQ.js +243 -0
  72. package/dist/chunk-AU3RDJYQ.js.map +1 -0
  73. package/dist/chunk-BHDRUZH5.cjs +33 -0
  74. package/dist/chunk-BHDRUZH5.cjs.map +1 -0
  75. package/dist/chunk-BLYVOV3G.cjs +191 -0
  76. package/dist/chunk-BLYVOV3G.cjs.map +1 -0
  77. package/dist/chunk-CILNIWYW.cjs +100 -0
  78. package/dist/chunk-CILNIWYW.cjs.map +1 -0
  79. package/dist/chunk-DFFP7SJ6.cjs +257 -0
  80. package/dist/chunk-DFFP7SJ6.cjs.map +1 -0
  81. package/dist/chunk-DXRCYW42.cjs +568 -0
  82. package/dist/chunk-DXRCYW42.cjs.map +1 -0
  83. package/dist/chunk-EBV6HGZB.cjs +33 -0
  84. package/dist/chunk-EBV6HGZB.cjs.map +1 -0
  85. package/dist/chunk-EHHHC5JV.js +832 -0
  86. package/dist/chunk-EHHHC5JV.js.map +1 -0
  87. package/dist/chunk-F4PYOYHR.js +112 -0
  88. package/dist/chunk-F4PYOYHR.js.map +1 -0
  89. package/dist/chunk-GQEDLUMB.js +168 -0
  90. package/dist/chunk-GQEDLUMB.js.map +1 -0
  91. package/dist/chunk-H2LESGMX.cjs +319 -0
  92. package/dist/chunk-H2LESGMX.cjs.map +1 -0
  93. package/dist/chunk-HTNJT2QU.js +11674 -0
  94. package/dist/chunk-HTNJT2QU.js.map +1 -0
  95. package/dist/chunk-IIISFUW4.cjs +11786 -0
  96. package/dist/chunk-IIISFUW4.cjs.map +1 -0
  97. package/dist/chunk-IMPCRWYP.cjs +251 -0
  98. package/dist/chunk-IMPCRWYP.cjs.map +1 -0
  99. package/dist/chunk-IPPIXOVQ.js +317 -0
  100. package/dist/chunk-IPPIXOVQ.js.map +1 -0
  101. package/dist/chunk-J4XJ4UBC.js +1404 -0
  102. package/dist/chunk-J4XJ4UBC.js.map +1 -0
  103. package/dist/chunk-J7CPPFXT.cjs +89 -0
  104. package/dist/chunk-J7CPPFXT.cjs.map +1 -0
  105. package/dist/chunk-JOICD47Q.cjs +41 -0
  106. package/dist/chunk-JOICD47Q.cjs.map +1 -0
  107. package/dist/chunk-KHMG6EI2.js +13 -0
  108. package/dist/chunk-KHMG6EI2.js.map +1 -0
  109. package/dist/chunk-KMRURD5J.cjs +15 -0
  110. package/dist/chunk-KMRURD5J.cjs.map +1 -0
  111. package/dist/chunk-KRJG3KMP.cjs +174 -0
  112. package/dist/chunk-KRJG3KMP.cjs.map +1 -0
  113. package/dist/chunk-KUBVDIF7.cjs +653 -0
  114. package/dist/chunk-KUBVDIF7.cjs.map +1 -0
  115. package/dist/chunk-KYAOSBQN.js +31 -0
  116. package/dist/chunk-KYAOSBQN.js.map +1 -0
  117. package/dist/chunk-LJ7LMEXO.js +36 -0
  118. package/dist/chunk-LJ7LMEXO.js.map +1 -0
  119. package/dist/chunk-MT3KLB2Q.cjs +944 -0
  120. package/dist/chunk-MT3KLB2Q.cjs.map +1 -0
  121. package/dist/chunk-MU3RY46O.js +932 -0
  122. package/dist/chunk-MU3RY46O.js.map +1 -0
  123. package/dist/chunk-MUQQKPWR.js +84 -0
  124. package/dist/chunk-MUQQKPWR.js.map +1 -0
  125. package/dist/chunk-N7SJTINL.cjs +4 -0
  126. package/dist/chunk-N7SJTINL.cjs.map +1 -0
  127. package/dist/chunk-NTV2UUAJ.cjs +149 -0
  128. package/dist/chunk-NTV2UUAJ.cjs.map +1 -0
  129. package/dist/chunk-PJQWHF6T.js +31 -0
  130. package/dist/chunk-PJQWHF6T.js.map +1 -0
  131. package/dist/chunk-PQY54EL5.js +248 -0
  132. package/dist/chunk-PQY54EL5.js.map +1 -0
  133. package/dist/chunk-PXCHPZTP.cjs +839 -0
  134. package/dist/chunk-PXCHPZTP.cjs.map +1 -0
  135. package/dist/chunk-Q7TBBUTX.cjs +110 -0
  136. package/dist/chunk-Q7TBBUTX.cjs.map +1 -0
  137. package/dist/chunk-QQMU44KJ.js +612 -0
  138. package/dist/chunk-QQMU44KJ.js.map +1 -0
  139. package/dist/chunk-QZN7R2WP.cjs +114 -0
  140. package/dist/chunk-QZN7R2WP.cjs.map +1 -0
  141. package/dist/chunk-RKVSJU46.js +35 -0
  142. package/dist/chunk-RKVSJU46.js.map +1 -0
  143. package/dist/chunk-RM6ZWNT3.js +561 -0
  144. package/dist/chunk-RM6ZWNT3.js.map +1 -0
  145. package/dist/chunk-SX4VQXAA.cjs +114 -0
  146. package/dist/chunk-SX4VQXAA.cjs.map +1 -0
  147. package/dist/chunk-SZ7BLAY3.js +92 -0
  148. package/dist/chunk-SZ7BLAY3.js.map +1 -0
  149. package/dist/chunk-TN4MG6FY.js +112 -0
  150. package/dist/chunk-TN4MG6FY.js.map +1 -0
  151. package/dist/chunk-UC7PHDM6.cjs +331 -0
  152. package/dist/chunk-UC7PHDM6.cjs.map +1 -0
  153. package/dist/chunk-UXVLYUUW.js +108 -0
  154. package/dist/chunk-UXVLYUUW.js.map +1 -0
  155. package/dist/chunk-VVGYRZ7S.cjs +38 -0
  156. package/dist/chunk-VVGYRZ7S.cjs.map +1 -0
  157. package/dist/chunk-W5256BJ4.js +56 -0
  158. package/dist/chunk-W5256BJ4.js.map +1 -0
  159. package/dist/chunk-WUMOSOEK.cjs +62 -0
  160. package/dist/chunk-WUMOSOEK.cjs.map +1 -0
  161. package/dist/chunk-XLRE2J25.js +140 -0
  162. package/dist/chunk-XLRE2J25.js.map +1 -0
  163. package/dist/chunk-Y6W5V2CI.js +19 -0
  164. package/dist/chunk-Y6W5V2CI.js.map +1 -0
  165. package/dist/chunk-Z4QPZ3Z3.cjs +114 -0
  166. package/dist/chunk-Z4QPZ3Z3.cjs.map +1 -0
  167. package/dist/createEngineGridQuery-Dmq3i5v3.d.cts +884 -0
  168. package/dist/createEngineGridQuery-Mt1hc33m.d.ts +884 -0
  169. package/dist/date-picker-jalali.cjs +263 -0
  170. package/dist/date-picker-jalali.cjs.map +1 -0
  171. package/dist/date-picker-jalali.d.cts +62 -0
  172. package/dist/date-picker-jalali.d.ts +62 -0
  173. package/dist/date-picker-jalali.js +256 -0
  174. package/dist/date-picker-jalali.js.map +1 -0
  175. package/dist/finance.cjs +205 -0
  176. package/dist/finance.cjs.map +1 -0
  177. package/dist/finance.d.cts +90 -0
  178. package/dist/finance.d.ts +90 -0
  179. package/dist/finance.js +157 -0
  180. package/dist/finance.js.map +1 -0
  181. package/dist/foldedColumn-IHDT4ARZ.cjs +66 -0
  182. package/dist/foldedColumn-IHDT4ARZ.cjs.map +1 -0
  183. package/dist/foldedColumn-TFURUKFG.js +64 -0
  184. package/dist/foldedColumn-TFURUKFG.js.map +1 -0
  185. package/dist/headless.cjs +729 -0
  186. package/dist/headless.cjs.map +1 -0
  187. package/dist/headless.d.cts +504 -0
  188. package/dist/headless.d.ts +504 -0
  189. package/dist/headless.js +226 -0
  190. package/dist/headless.js.map +1 -0
  191. package/dist/index-DN8M8Jkq.d.cts +14 -0
  192. package/dist/index-DmzL-F_o.d.ts +14 -0
  193. package/dist/index.cjs +8002 -11409
  194. package/dist/index.cjs.map +1 -1
  195. package/dist/index.d.cts +437 -2305
  196. package/dist/index.d.ts +437 -2305
  197. package/dist/index.js +7244 -11083
  198. package/dist/index.js.map +1 -1
  199. package/dist/locales/ar.cjs +12 -0
  200. package/dist/locales/ar.cjs.map +1 -0
  201. package/dist/locales/ar.d.cts +6 -0
  202. package/dist/locales/ar.d.ts +6 -0
  203. package/dist/locales/ar.js +3 -0
  204. package/dist/locales/ar.js.map +1 -0
  205. package/dist/locales/en.cjs +12 -0
  206. package/dist/locales/en.cjs.map +1 -0
  207. package/dist/locales/en.d.cts +6 -0
  208. package/dist/locales/en.d.ts +6 -0
  209. package/dist/locales/en.js +3 -0
  210. package/dist/locales/en.js.map +1 -0
  211. package/dist/locales/fa.cjs +12 -0
  212. package/dist/locales/fa.cjs.map +1 -0
  213. package/dist/locales/fa.d.cts +6 -0
  214. package/dist/locales/fa.d.ts +6 -0
  215. package/dist/locales/fa.js +3 -0
  216. package/dist/locales/fa.js.map +1 -0
  217. package/dist/locales/index.cjs +51 -0
  218. package/dist/locales/index.cjs.map +1 -0
  219. package/dist/locales/index.d.cts +5 -0
  220. package/dist/locales/index.d.ts +5 -0
  221. package/dist/locales/index.js +6 -0
  222. package/dist/locales/index.js.map +1 -0
  223. package/dist/memoryRecords-AWDKUJ2F.cjs +50 -0
  224. package/dist/memoryRecords-AWDKUJ2F.cjs.map +1 -0
  225. package/dist/memoryRecords-OJTGXLRH.js +47 -0
  226. package/dist/memoryRecords-OJTGXLRH.js.map +1 -0
  227. package/dist/pagedFooterTotals-DXCGDO6F.cjs +27 -0
  228. package/dist/pagedFooterTotals-DXCGDO6F.cjs.map +1 -0
  229. package/dist/pagedFooterTotals-ORWKUNE7.js +25 -0
  230. package/dist/pagedFooterTotals-ORWKUNE7.js.map +1 -0
  231. package/dist/pagedKit-MFGAJFSK.cjs +134 -0
  232. package/dist/pagedKit-MFGAJFSK.cjs.map +1 -0
  233. package/dist/pagedKit-WYWY4LRV.js +127 -0
  234. package/dist/pagedKit-WYWY4LRV.js.map +1 -0
  235. package/dist/pagedSearch-HCPJW7VM.js +38 -0
  236. package/dist/pagedSearch-HCPJW7VM.js.map +1 -0
  237. package/dist/pagedSearch-U3WCG4GN.cjs +42 -0
  238. package/dist/pagedSearch-U3WCG4GN.cjs.map +1 -0
  239. package/dist/plugins/csv.cjs +124 -0
  240. package/dist/plugins/csv.cjs.map +1 -0
  241. package/dist/plugins/csv.d.cts +44 -0
  242. package/dist/plugins/csv.d.ts +44 -0
  243. package/dist/plugins/csv.js +120 -0
  244. package/dist/plugins/csv.js.map +1 -0
  245. package/dist/plugins/excel.cjs +52 -0
  246. package/dist/plugins/excel.cjs.map +1 -0
  247. package/dist/plugins/excel.d.cts +14 -0
  248. package/dist/plugins/excel.d.ts +14 -0
  249. package/dist/plugins/excel.js +7 -0
  250. package/dist/plugins/excel.js.map +1 -0
  251. package/dist/plugins/pdf/fonts/vazirmatn.cjs +50 -0
  252. package/dist/plugins/pdf/fonts/vazirmatn.cjs.map +1 -0
  253. package/dist/plugins/pdf/fonts/vazirmatn.d.cts +24 -0
  254. package/dist/plugins/pdf/fonts/vazirmatn.d.ts +24 -0
  255. package/dist/plugins/pdf/fonts/vazirmatn.js +39 -0
  256. package/dist/plugins/pdf/fonts/vazirmatn.js.map +1 -0
  257. package/dist/plugins/pdf.cjs +24 -0
  258. package/dist/plugins/pdf.cjs.map +1 -0
  259. package/dist/plugins/pdf.d.cts +21 -0
  260. package/dist/plugins/pdf.d.ts +21 -0
  261. package/dist/plugins/pdf.js +7 -0
  262. package/dist/plugins/pdf.js.map +1 -0
  263. package/dist/presence.cjs +56 -0
  264. package/dist/presence.cjs.map +1 -0
  265. package/dist/presence.d.cts +17 -0
  266. package/dist/presence.d.ts +17 -0
  267. package/dist/presence.js +54 -0
  268. package/dist/presence.js.map +1 -0
  269. package/dist/rebuildRowVisibility-66EAZ356.cjs +21 -0
  270. package/dist/rebuildRowVisibility-66EAZ356.cjs.map +1 -0
  271. package/dist/rebuildRowVisibility-6TYM5BP2.js +19 -0
  272. package/dist/rebuildRowVisibility-6TYM5BP2.js.map +1 -0
  273. package/dist/styles.css +1440 -0
  274. package/dist/sync.cjs +148 -0
  275. package/dist/sync.cjs.map +1 -0
  276. package/dist/sync.d.cts +17 -0
  277. package/dist/sync.d.ts +17 -0
  278. package/dist/sync.js +146 -0
  279. package/dist/sync.js.map +1 -0
  280. package/dist/types-D__47BKv.d.cts +23 -0
  281. package/dist/types-D__47BKv.d.ts +23 -0
  282. package/package.json +184 -28
@@ -0,0 +1,319 @@
1
+ 'use strict';
2
+
3
+ var chunkUC7PHDM6_cjs = require('./chunk-UC7PHDM6.cjs');
4
+ var chunkKUBVDIF7_cjs = require('./chunk-KUBVDIF7.cjs');
5
+ var React2 = require('react');
6
+ var jsxRuntime = require('react/jsx-runtime');
7
+
8
+ function _interopDefault (e) { return e && e.__esModule ? e : { default: e }; }
9
+
10
+ var React2__default = /*#__PURE__*/_interopDefault(React2);
11
+
12
+ // ui/a11y/gridRoles.ts
13
+ var ARIA_HEADER_ROW_INDEX = 1;
14
+ function ariaColIndex(visibleIndex) {
15
+ return visibleIndex + 1;
16
+ }
17
+ function ariaDataRowIndex(absoluteIndex, pinnedTopCount = 0) {
18
+ return absoluteIndex + 2 + pinnedTopCount;
19
+ }
20
+ function ariaPinnedTopRowIndex(indexInPinned) {
21
+ return indexInPinned + 2;
22
+ }
23
+ function ariaPinnedBottomRowIndex(indexInPinned, dataRowCount, pinnedTopCount = 0) {
24
+ return pinnedTopCount + dataRowCount + 2 + indexInPinned;
25
+ }
26
+ function ariaFooterRowIndex(dataRowCount, pinnedTopCount = 0, pinnedBottomCount = 0) {
27
+ return dataRowCount + pinnedTopCount + pinnedBottomCount + 2;
28
+ }
29
+ function ariaGridRowCount(dataRowCount, hasFooter, pinnedTopCount = 0, pinnedBottomCount = 0) {
30
+ const footerRows = typeof hasFooter === "number" ? hasFooter : hasFooter ? 1 : 0;
31
+ return 1 + pinnedTopCount + dataRowCount + pinnedBottomCount + footerRows;
32
+ }
33
+ function ariaToken(value) {
34
+ return value.replace(/[^A-Za-z0-9_-]/g, "_");
35
+ }
36
+ function gridCellDomId(tableKey, rowId, columnId) {
37
+ return `erp-cell-${ariaToken(tableKey)}-${rowId}-${ariaToken(columnId)}`;
38
+ }
39
+ function isAriaSelectedCell(active, rowId, columnId) {
40
+ return !!active && active.rowId === rowId && active.columnId === columnId;
41
+ }
42
+ function gridCellA11y(tableKey, rowId, columnId, active) {
43
+ return {
44
+ id: gridCellDomId(tableKey, rowId, columnId),
45
+ "aria-selected": isAriaSelectedCell(active, rowId, columnId)
46
+ };
47
+ }
48
+
49
+ // ui/columnPin.ts
50
+ function columnPinSide(column) {
51
+ const pin = chunkUC7PHDM6_cjs.resolveColumnPinned(column);
52
+ if (pin === "start" || pin === "end") return pin;
53
+ return null;
54
+ }
55
+ function columnPinClassName(column) {
56
+ if (chunkUC7PHDM6_cjs.isIndexColumn(column)) return "erp-col-pin-start erp-col-pin-index";
57
+ const side = columnPinSide(column);
58
+ if (side === "start") return "erp-col-pin-start";
59
+ if (side === "end") return "erp-col-pin-end";
60
+ return "";
61
+ }
62
+ function indexPinClassName(column) {
63
+ return columnPinClassName(column);
64
+ }
65
+ function columnPinDataAttr(column) {
66
+ if (chunkUC7PHDM6_cjs.isIndexColumn(column)) return "index";
67
+ return columnPinSide(column) ?? void 0;
68
+ }
69
+ function indexPinDataAttr(column) {
70
+ const attr = columnPinDataAttr(column);
71
+ return attr === "index" ? "index" : void 0;
72
+ }
73
+ function columnPinStyle(column, startOffsets, endOffsets) {
74
+ const side = columnPinSide(column);
75
+ if (side === "start") {
76
+ const offset = startOffsets[column.fieldName];
77
+ if (offset === void 0) return void 0;
78
+ return { insetInlineStart: offset };
79
+ }
80
+ if (side === "end") {
81
+ const offset = endOffsets[column.fieldName];
82
+ if (offset === void 0) return void 0;
83
+ return { insetInlineEnd: offset };
84
+ }
85
+ return void 0;
86
+ }
87
+ function columnPinCellProps(column, startOffsets, endOffsets) {
88
+ return {
89
+ className: columnPinClassName(column),
90
+ "data-erp-col-pin": columnPinDataAttr(column),
91
+ style: columnPinStyle(column, startOffsets, endOffsets)
92
+ };
93
+ }
94
+ var EMPTY = {
95
+ allVisible: [],
96
+ pinnedStart: [],
97
+ pinned: [],
98
+ pinnedEnd: [],
99
+ scrollable: [],
100
+ scrollableAbsIndices: [],
101
+ spacerStart: 0,
102
+ spacerEnd: 0,
103
+ pinnedStartWidth: 0,
104
+ pinnedWidth: 0,
105
+ pinnedEndWidth: 0,
106
+ startPinOffsets: {},
107
+ endPinOffsets: {},
108
+ totalWidth: 0,
109
+ layoutWidths: {},
110
+ mountedScrollableCount: 0
111
+ };
112
+ var ColumnWindowContext = React2.createContext(EMPTY);
113
+ function scrollOffsetFromInlineStart(el, direction) {
114
+ const { scrollLeft, scrollWidth, clientWidth } = el;
115
+ if (direction === "ltr") return Math.max(0, scrollLeft);
116
+ if (scrollLeft < 0) return Math.max(0, -scrollLeft);
117
+ const max = Math.max(0, scrollWidth - clientWidth);
118
+ return Math.max(0, max - scrollLeft);
119
+ }
120
+ function buildColumnWindowModel(allVisible, columnWidths, scrollOffset, viewportSize, overscan = 1, flexContainerWidth = viewportSize) {
121
+ const layoutWidths = chunkUC7PHDM6_cjs.computeLayoutColumnWidths(
122
+ allVisible,
123
+ columnWidths,
124
+ flexContainerWidth
125
+ );
126
+ const widthOf = (col) => layoutWidths[col.fieldName] ?? chunkUC7PHDM6_cjs.resolveColumnWidth(col, columnWidths);
127
+ const { pinnedStart, scrollable: scrollableAll, pinnedEnd, scrollableAbs } = chunkUC7PHDM6_cjs.partitionColumnsByPin(allVisible);
128
+ const pinnedStartWidth = chunkUC7PHDM6_cjs.sumColumnWidths(pinnedStart, widthOf);
129
+ const pinnedEndWidth = chunkUC7PHDM6_cjs.sumColumnWidths(pinnedEnd, widthOf);
130
+ const scrollableWidths = scrollableAll.map(widthOf);
131
+ const range = chunkUC7PHDM6_cjs.ViewportCalculator.calculateColumns(
132
+ scrollableWidths,
133
+ scrollOffset,
134
+ viewportSize,
135
+ pinnedStartWidth,
136
+ overscan,
137
+ pinnedEndWidth
138
+ );
139
+ const scrollable = scrollableAll.slice(range.startIndex, range.endIndex);
140
+ const scrollableAbsIndices = scrollableAbs.slice(
141
+ range.startIndex,
142
+ range.endIndex
143
+ );
144
+ const totalScrollable = range.totalScrollableWidth;
145
+ const spacerCells = (range.spacerStart > 0 ? 1 : 0) + (range.spacerEnd > 0 ? 1 : 0);
146
+ let startCursor = 0;
147
+ const startPinOffsets = {};
148
+ for (const col of pinnedStart) {
149
+ startPinOffsets[col.fieldName] = startCursor;
150
+ startCursor += widthOf(col);
151
+ }
152
+ let endCursor = 0;
153
+ const endPinOffsets = {};
154
+ for (let i = pinnedEnd.length - 1; i >= 0; i -= 1) {
155
+ const col = pinnedEnd[i];
156
+ endPinOffsets[col.fieldName] = endCursor;
157
+ endCursor += widthOf(col);
158
+ }
159
+ return {
160
+ allVisible,
161
+ pinnedStart,
162
+ pinned: pinnedStart,
163
+ pinnedEnd,
164
+ scrollable,
165
+ scrollableAbsIndices,
166
+ spacerStart: range.spacerStart,
167
+ spacerEnd: range.spacerEnd,
168
+ pinnedStartWidth,
169
+ pinnedWidth: pinnedStartWidth,
170
+ pinnedEndWidth,
171
+ startPinOffsets,
172
+ endPinOffsets,
173
+ totalWidth: pinnedStartWidth + totalScrollable + pinnedEndWidth,
174
+ layoutWidths,
175
+ mountedScrollableCount: scrollable.length + spacerCells
176
+ };
177
+ }
178
+ function ColumnWindowProvider({
179
+ scrollRef,
180
+ columns,
181
+ columnWidths,
182
+ overscan = 1,
183
+ onViewportWidthChange,
184
+ children
185
+ }) {
186
+ const direction = chunkKUBVDIF7_cjs.useDirection();
187
+ const [scrollOffset, setScrollOffset] = React2.useState(0);
188
+ const [viewportSize, setViewportSize] = React2.useState(1024);
189
+ const allVisible = React2.useMemo(
190
+ () => columns.filter((c) => !c.hidden),
191
+ [columns]
192
+ );
193
+ React2.useEffect(() => {
194
+ const el = scrollRef.current;
195
+ if (!el) return;
196
+ const update = () => {
197
+ setScrollOffset(scrollOffsetFromInlineStart(el, direction));
198
+ const w = el.clientWidth || 1024;
199
+ setViewportSize(w);
200
+ onViewportWidthChange?.(w);
201
+ };
202
+ update();
203
+ el.addEventListener("scroll", update, { passive: true });
204
+ const ro = typeof ResizeObserver !== "undefined" ? new ResizeObserver(() => update()) : null;
205
+ ro?.observe(el);
206
+ return () => {
207
+ el.removeEventListener("scroll", update);
208
+ ro?.disconnect();
209
+ };
210
+ }, [scrollRef, direction, allVisible.length, columnWidths, onViewportWidthChange]);
211
+ const value = React2.useMemo(
212
+ () => buildColumnWindowModel(
213
+ allVisible,
214
+ columnWidths,
215
+ scrollOffset,
216
+ viewportSize,
217
+ overscan
218
+ ),
219
+ [allVisible, columnWidths, scrollOffset, viewportSize, overscan]
220
+ );
221
+ return /* @__PURE__ */ jsxRuntime.jsx(ColumnWindowContext.Provider, { value, children });
222
+ }
223
+ function useColumnWindowOrAll(columns, columnWidths) {
224
+ const ctx = React2.useContext(ColumnWindowContext);
225
+ const allVisible = columns.filter((c) => !c.hidden);
226
+ if (ctx.allVisible.length > 0) return ctx;
227
+ return buildColumnWindowModel(allVisible, columnWidths, 0, 1e9, 0, 0);
228
+ }
229
+ function renderPinnedColumns(cols, model, renderColumn, keyPrefix) {
230
+ const nodes = [];
231
+ for (const col of cols) {
232
+ const abs = model.allVisible.findIndex((c) => c.fieldName === col.fieldName);
233
+ nodes.push(
234
+ /* @__PURE__ */ jsxRuntime.jsx(React2__default.default.Fragment, { children: renderColumn(col, abs >= 0 ? abs : 0) }, `${keyPrefix}-${col.fieldName}`)
235
+ );
236
+ }
237
+ return nodes;
238
+ }
239
+ function ColumnWindowCells({
240
+ window: model,
241
+ renderColumn,
242
+ spacerElement: Spacer,
243
+ spacerRole = "presentation",
244
+ spacerStyle
245
+ }) {
246
+ const nodes = [];
247
+ nodes.push(
248
+ ...renderPinnedColumns(model.pinnedStart, model, renderColumn, "pin-start")
249
+ );
250
+ if (model.spacerStart > 0) {
251
+ nodes.push(
252
+ /* @__PURE__ */ jsxRuntime.jsx(
253
+ Spacer,
254
+ {
255
+ "aria-hidden": true,
256
+ role: spacerRole,
257
+ "data-pdg-col-spacer": "start",
258
+ style: {
259
+ width: model.spacerStart,
260
+ minWidth: model.spacerStart,
261
+ padding: 0,
262
+ border: "none",
263
+ ...spacerStyle
264
+ }
265
+ },
266
+ "pdg-col-spacer-start"
267
+ )
268
+ );
269
+ }
270
+ model.scrollable.forEach((col, i) => {
271
+ const abs = model.scrollableAbsIndices[i] ?? i;
272
+ nodes.push(
273
+ /* @__PURE__ */ jsxRuntime.jsx(React2__default.default.Fragment, { children: renderColumn(col, abs) }, `scr-${col.fieldName}`)
274
+ );
275
+ });
276
+ if (model.spacerEnd > 0) {
277
+ nodes.push(
278
+ /* @__PURE__ */ jsxRuntime.jsx(
279
+ Spacer,
280
+ {
281
+ "aria-hidden": true,
282
+ role: spacerRole,
283
+ "data-pdg-col-spacer": "end",
284
+ style: {
285
+ width: model.spacerEnd,
286
+ minWidth: model.spacerEnd,
287
+ padding: 0,
288
+ border: "none",
289
+ ...spacerStyle
290
+ }
291
+ },
292
+ "pdg-col-spacer-end"
293
+ )
294
+ );
295
+ }
296
+ nodes.push(
297
+ ...renderPinnedColumns(model.pinnedEnd, model, renderColumn, "pin-end")
298
+ );
299
+ return /* @__PURE__ */ jsxRuntime.jsx(jsxRuntime.Fragment, { children: nodes });
300
+ }
301
+
302
+ exports.ARIA_HEADER_ROW_INDEX = ARIA_HEADER_ROW_INDEX;
303
+ exports.ColumnWindowCells = ColumnWindowCells;
304
+ exports.ColumnWindowProvider = ColumnWindowProvider;
305
+ exports.ariaColIndex = ariaColIndex;
306
+ exports.ariaDataRowIndex = ariaDataRowIndex;
307
+ exports.ariaFooterRowIndex = ariaFooterRowIndex;
308
+ exports.ariaGridRowCount = ariaGridRowCount;
309
+ exports.ariaPinnedBottomRowIndex = ariaPinnedBottomRowIndex;
310
+ exports.ariaPinnedTopRowIndex = ariaPinnedTopRowIndex;
311
+ exports.columnPinCellProps = columnPinCellProps;
312
+ exports.columnPinClassName = columnPinClassName;
313
+ exports.gridCellA11y = gridCellA11y;
314
+ exports.gridCellDomId = gridCellDomId;
315
+ exports.indexPinClassName = indexPinClassName;
316
+ exports.indexPinDataAttr = indexPinDataAttr;
317
+ exports.useColumnWindowOrAll = useColumnWindowOrAll;
318
+ //# sourceMappingURL=chunk-H2LESGMX.cjs.map
319
+ //# sourceMappingURL=chunk-H2LESGMX.cjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../ui/a11y/gridRoles.ts","../ui/columnPin.ts","../ui/virtual/columnWindow.tsx","../ui/virtual/ColumnWindowCells.tsx"],"names":["resolveColumnPinned","isIndexColumn","createContext","computeLayoutColumnWidths","resolveColumnWidth","partitionColumnsByPin","sumColumnWidths","ViewportCalculator","useDirection","useState","useMemo","useEffect","jsx","useContext","React","Fragment"],"mappings":";;;;;;;;;;;;AACO,IAAM,qBAAA,GAAwB;AAG9B,SAAS,aAAa,YAAA,EAA8B;AACzD,EAAA,OAAO,YAAA,GAAe,CAAA;AACxB;AAOO,SAAS,gBAAA,CACd,aAAA,EACA,cAAA,GAAiB,CAAA,EACT;AACR,EAAA,OAAO,gBAAgB,CAAA,GAAI,cAAA;AAC7B;AAGO,SAAS,sBAAsB,aAAA,EAA+B;AACnE,EAAA,OAAO,aAAA,GAAgB,CAAA;AACzB;AAGO,SAAS,wBAAA,CACd,aAAA,EACA,YAAA,EACA,cAAA,GAAiB,CAAA,EACT;AACR,EAAA,OAAO,cAAA,GAAiB,eAAe,CAAA,GAAI,aAAA;AAC7C;AAEO,SAAS,kBAAA,CACd,YAAA,EACA,cAAA,GAAiB,CAAA,EACjB,oBAAoB,CAAA,EACZ;AACR,EAAA,OAAO,YAAA,GAAe,iBAAiB,iBAAA,GAAoB,CAAA;AAC7D;AAEO,SAAS,iBACd,YAAA,EACA,SAAA,EACA,cAAA,GAAiB,CAAA,EACjB,oBAAoB,CAAA,EACZ;AACR,EAAA,MAAM,aACJ,OAAO,SAAA,KAAc,QAAA,GAAW,SAAA,GAAY,YAAY,CAAA,GAAI,CAAA;AAC9D,EAAA,OACE,CAAA,GACA,cAAA,GACA,YAAA,GACA,iBAAA,GACA,UAAA;AAEJ;AAEA,SAAS,UAAU,KAAA,EAAuB;AACxC,EAAA,OAAO,KAAA,CAAM,OAAA,CAAQ,iBAAA,EAAmB,GAAG,CAAA;AAC7C;AAGO,SAAS,aAAA,CACd,QAAA,EACA,KAAA,EACA,QAAA,EACQ;AACR,EAAA,OAAO,CAAA,SAAA,EAAY,UAAU,QAAQ,CAAC,IAAI,KAAK,CAAA,CAAA,EAAI,SAAA,CAAU,QAAQ,CAAC,CAAA,CAAA;AACxE;AAEO,SAAS,kBAAA,CACd,MAAA,EACA,KAAA,EACA,QAAA,EACS;AACT,EAAA,OAAO,CAAC,CAAC,MAAA,IAAU,OAAO,KAAA,KAAU,KAAA,IAAS,OAAO,QAAA,KAAa,QAAA;AACnE;AAEO,SAAS,YAAA,CACd,QAAA,EACA,KAAA,EACA,QAAA,EACA,MAAA,EAC0C;AAC1C,EAAA,OAAO;AAAA,IACL,EAAA,EAAI,aAAA,CAAc,QAAA,EAAU,KAAA,EAAO,QAAQ,CAAA;AAAA,IAC3C,eAAA,EAAiB,kBAAA,CAAmB,MAAA,EAAQ,KAAA,EAAO,QAAQ;AAAA,GAC7D;AACF;;;AC9EO,SAAS,cAAc,MAAA,EAA4C;AACxE,EAAA,MAAM,GAAA,GAAMA,sCAAoB,MAAM,CAAA;AACtC,EAAA,IAAI,GAAA,KAAQ,OAAA,IAAW,GAAA,KAAQ,KAAA,EAAO,OAAO,GAAA;AAC7C,EAAA,OAAO,IAAA;AACT;AAEO,SAAS,mBAAmB,MAAA,EAAiC;AAClE,EAAA,IAAIC,+BAAA,CAAc,MAAM,CAAA,EAAG,OAAO,qCAAA;AAClC,EAAA,MAAM,IAAA,GAAO,cAAc,MAAsB,CAAA;AACjD,EAAA,IAAI,IAAA,KAAS,SAAS,OAAO,mBAAA;AAC7B,EAAA,IAAI,IAAA,KAAS,OAAO,OAAO,iBAAA;AAC3B,EAAA,OAAO,EAAA;AACT;AAGO,SAAS,kBAAkB,MAAA,EAAiC;AACjE,EAAA,OAAO,mBAAmB,MAAM,CAAA;AAClC;AAEO,SAAS,kBACd,MAAA,EACqC;AACrC,EAAA,IAAIA,+BAAA,CAAc,MAAM,CAAA,EAAG,OAAO,OAAA;AAClC,EAAA,OAAO,aAAA,CAAc,MAAsB,CAAA,IAAK,MAAA;AAClD;AAGO,SAAS,iBACd,MAAA,EACqB;AACrB,EAAA,MAAM,IAAA,GAAO,kBAAkB,MAAM,CAAA;AACrC,EAAA,OAAO,IAAA,KAAS,UAAU,OAAA,GAAU,MAAA;AACtC;AAEO,SAAS,cAAA,CACd,MAAA,EACA,YAAA,EACA,UAAA,EAC2B;AAC3B,EAAA,MAAM,IAAA,GAAO,cAAc,MAAM,CAAA;AACjC,EAAA,IAAI,SAAS,OAAA,EAAS;AACpB,IAAA,MAAM,MAAA,GAAS,YAAA,CAAa,MAAA,CAAO,SAAS,CAAA;AAC5C,IAAA,IAAI,MAAA,KAAW,QAAW,OAAO,MAAA;AACjC,IAAA,OAAO,EAAE,kBAAkB,MAAA,EAAO;AAAA,EACpC;AACA,EAAA,IAAI,SAAS,KAAA,EAAO;AAClB,IAAA,MAAM,MAAA,GAAS,UAAA,CAAW,MAAA,CAAO,SAAS,CAAA;AAC1C,IAAA,IAAI,MAAA,KAAW,QAAW,OAAO,MAAA;AACjC,IAAA,OAAO,EAAE,gBAAgB,MAAA,EAAO;AAAA,EAClC;AACA,EAAA,OAAO,MAAA;AACT;AAEO,SAAS,kBAAA,CACd,MAAA,EACA,YAAA,EACA,UAAA,EAKA;AACA,EAAA,OAAO;AAAA,IACL,SAAA,EAAW,mBAAmB,MAAM,CAAA;AAAA,IACpC,kBAAA,EAAoB,kBAAkB,MAAM,CAAA;AAAA,IAC5C,KAAA,EAAO,cAAA,CAAe,MAAA,EAAQ,YAAA,EAAc,UAAU;AAAA,GACxD;AACF;ACUA,IAAM,KAAA,GAA2B;AAAA,EAE/B,YAAY,EAAC;AAAA,EAEb,aAAa,EAAC;AAAA,EAEd,QAAQ,EAAC;AAAA,EAET,WAAW,EAAC;AAAA,EAEZ,YAAY,EAAC;AAAA,EAEb,sBAAsB,EAAC;AAAA,EAEvB,WAAA,EAAa,CAAA;AAAA,EAEb,SAAA,EAAW,CAAA;AAAA,EAEX,gBAAA,EAAkB,CAAA;AAAA,EAElB,WAAA,EAAa,CAAA;AAAA,EAEb,cAAA,EAAgB,CAAA;AAAA,EAEhB,iBAAiB,EAAC;AAAA,EAElB,eAAe,EAAC;AAAA,EAEhB,UAAA,EAAY,CAAA;AAAA,EAEZ,cAAc,EAAC;AAAA,EAEf,sBAAA,EAAwB;AAE1B,CAAA;AAIA,IAAM,mBAAA,GAAsBC,qBAAiC,KAAK,CAAA;AAM3D,SAAS,2BAAA,CAEd,IAEA,SAAA,EAEQ;AAER,EAAA,MAAM,EAAE,UAAA,EAAY,WAAA,EAAa,WAAA,EAAY,GAAI,EAAA;AAEjD,EAAA,IAAI,cAAc,KAAA,EAAO,OAAO,IAAA,CAAK,GAAA,CAAI,GAAG,UAAU,CAAA;AAEtD,EAAA,IAAI,aAAa,CAAA,EAAG,OAAO,KAAK,GAAA,CAAI,CAAA,EAAG,CAAC,UAAU,CAAA;AAElD,EAAA,MAAM,GAAA,GAAM,IAAA,CAAK,GAAA,CAAI,CAAA,EAAG,cAAc,WAAW,CAAA;AAEjD,EAAA,OAAO,IAAA,CAAK,GAAA,CAAI,CAAA,EAAG,GAAA,GAAM,UAAU,CAAA;AAErC;AAIO,SAAS,sBAAA,CAEd,YAEA,YAAA,EAEA,YAAA,EAEA,cAEA,QAAA,GAAW,CAAA,EAEX,qBAAqB,YAAA,EAEF;AAEnB,EAAA,MAAM,YAAA,GAAeC,2CAAA;AAAA,IACnB,UAAA;AAAA,IACA,YAAA;AAAA,IACA;AAAA,GACF;AAEA,EAAA,MAAM,OAAA,GAAU,CAAC,GAAA,KACf,YAAA,CAAa,IAAI,SAAS,CAAA,IAAKC,oCAAA,CAAmB,GAAA,EAAK,YAAY,CAAA;AAIrE,EAAA,MAAM,EAAE,aAAa,UAAA,EAAY,aAAA,EAAe,WAAW,aAAA,EAAc,GAEvEC,wCAAsB,UAAU,CAAA;AAIlC,EAAA,MAAM,gBAAA,GAAmBC,iCAAA,CAAgB,WAAA,EAAa,OAAO,CAAA;AAE7D,EAAA,MAAM,cAAA,GAAiBA,iCAAA,CAAgB,SAAA,EAAW,OAAO,CAAA;AAIzD,EAAA,MAAM,gBAAA,GAAmB,aAAA,CAAc,GAAA,CAAI,OAAO,CAAA;AAElD,EAAA,MAAM,QAAQC,oCAAA,CAAmB,gBAAA;AAAA,IAE/B,gBAAA;AAAA,IAEA,YAAA;AAAA,IAEA,YAAA;AAAA,IAEA,gBAAA;AAAA,IAEA,QAAA;AAAA,IAEA;AAAA,GAEF;AAEA,EAAA,MAAM,aAAa,aAAA,CAAc,KAAA,CAAM,KAAA,CAAM,UAAA,EAAY,MAAM,QAAQ,CAAA;AAEvE,EAAA,MAAM,uBAAuB,aAAA,CAAc,KAAA;AAAA,IAEzC,KAAA,CAAM,UAAA;AAAA,IAEN,KAAA,CAAM;AAAA,GAER;AAEA,EAAA,MAAM,kBAAkB,KAAA,CAAM,oBAAA;AAE9B,EAAA,MAAM,WAAA,GAAA,CAEH,MAAM,WAAA,GAAc,CAAA,GAAI,IAAI,CAAA,KAAM,KAAA,CAAM,SAAA,GAAY,CAAA,GAAI,CAAA,GAAI,CAAA,CAAA;AAI/D,EAAA,IAAI,WAAA,GAAc,CAAA;AAElB,EAAA,MAAM,kBAA0C,EAAC;AAEjD,EAAA,KAAA,MAAW,OAAO,WAAA,EAAa;AAE7B,IAAA,eAAA,CAAgB,GAAA,CAAI,SAAS,CAAA,GAAI,WAAA;AAEjC,IAAA,WAAA,IAAe,QAAQ,GAAG,CAAA;AAAA,EAE5B;AAIA,EAAA,IAAI,SAAA,GAAY,CAAA;AAEhB,EAAA,MAAM,gBAAwC,EAAC;AAE/C,EAAA,KAAA,IAAS,IAAI,SAAA,CAAU,MAAA,GAAS,GAAG,CAAA,IAAK,CAAA,EAAG,KAAK,CAAA,EAAG;AAEjD,IAAA,MAAM,GAAA,GAAM,UAAU,CAAC,CAAA;AAEvB,IAAA,aAAA,CAAc,GAAA,CAAI,SAAS,CAAA,GAAI,SAAA;AAE/B,IAAA,SAAA,IAAa,QAAQ,GAAG,CAAA;AAAA,EAE1B;AAIA,EAAA,OAAO;AAAA,IAEL,UAAA;AAAA,IAEA,WAAA;AAAA,IAEA,MAAA,EAAQ,WAAA;AAAA,IAER,SAAA;AAAA,IAEA,UAAA;AAAA,IAEA,oBAAA;AAAA,IAEA,aAAa,KAAA,CAAM,WAAA;AAAA,IAEnB,WAAW,KAAA,CAAM,SAAA;AAAA,IAEjB,gBAAA;AAAA,IAEA,WAAA,EAAa,gBAAA;AAAA,IAEb,cAAA;AAAA,IAEA,eAAA;AAAA,IAEA,aAAA;AAAA,IAEA,UAAA,EAAY,mBAAmB,eAAA,GAAkB,cAAA;AAAA,IAEjD,YAAA;AAAA,IAEA,sBAAA,EAAwB,WAAW,MAAA,GAAS;AAAA,GAE9C;AAEF;AAsBO,SAAS,oBAAA,CAAqB;AAAA,EAEnC,SAAA;AAAA,EAEA,OAAA;AAAA,EAEA,YAAA;AAAA,EAEA,QAAA,GAAW,CAAA;AAAA,EAEX,qBAAA;AAAA,EAEA;AAEF,CAAA,EAAkB;AAEhB,EAAA,MAAM,YAAYC,8BAAA,EAAa;AAE/B,EAAA,MAAM,CAAC,YAAA,EAAc,eAAe,CAAA,GAAIC,gBAAS,CAAC,CAAA;AAElD,EAAA,MAAM,CAAC,YAAA,EAAc,eAAe,CAAA,GAAIA,gBAAS,IAAI,CAAA;AAIrD,EAAA,MAAM,UAAA,GAAaC,cAAA;AAAA,IAEjB,MAAM,OAAA,CAAQ,MAAA,CAAO,CAAC,CAAA,KAAM,CAAC,EAAE,MAAM,CAAA;AAAA,IAErC,CAAC,OAAO;AAAA,GAEV;AAIA,EAAAC,gBAAA,CAAU,MAAM;AAEd,IAAA,MAAM,KAAK,SAAA,CAAU,OAAA;AAErB,IAAA,IAAI,CAAC,EAAA,EAAI;AAIT,IAAA,MAAM,SAAS,MAAM;AAEnB,MAAA,eAAA,CAAgB,2BAAA,CAA4B,EAAA,EAAI,SAAS,CAAC,CAAA;AAE1D,MAAA,MAAM,CAAA,GAAI,GAAG,WAAA,IAAe,IAAA;AAE5B,MAAA,eAAA,CAAgB,CAAC,CAAA;AAEjB,MAAA,qBAAA,GAAwB,CAAC,CAAA;AAAA,IAE3B,CAAA;AAEA,IAAA,MAAA,EAAO;AAEP,IAAA,EAAA,CAAG,iBAAiB,QAAA,EAAU,MAAA,EAAQ,EAAE,OAAA,EAAS,MAAM,CAAA;AAEvD,IAAA,MAAM,EAAA,GAEJ,OAAO,cAAA,KAAmB,WAAA,GAEtB,IAAI,cAAA,CAAe,MAAM,MAAA,EAAQ,CAAA,GAEjC,IAAA;AAEN,IAAA,EAAA,EAAI,QAAQ,EAAE,CAAA;AAEd,IAAA,OAAO,MAAM;AAEX,MAAA,EAAA,CAAG,mBAAA,CAAoB,UAAU,MAAM,CAAA;AAEvC,MAAA,EAAA,EAAI,UAAA,EAAW;AAAA,IAEjB,CAAA;AAAA,EAEF,CAAA,EAAG,CAAC,SAAA,EAAW,SAAA,EAAW,WAAW,MAAA,EAAQ,YAAA,EAAc,qBAAqB,CAAC,CAAA;AAIjF,EAAA,MAAM,KAAA,GAAQD,cAAA;AAAA,IAEZ,MAEE,sBAAA;AAAA,MAEE,UAAA;AAAA,MAEA,YAAA;AAAA,MAEA,YAAA;AAAA,MAEA,YAAA;AAAA,MAEA;AAAA,KAEF;AAAA,IAEF,CAAC,UAAA,EAAY,YAAA,EAAc,YAAA,EAAc,cAAc,QAAQ;AAAA,GAEjE;AAIA,EAAA,uBAEEE,cAAA,CAAC,mBAAA,CAAoB,QAAA,EAApB,EAA6B,OAE3B,QAAA,EAEH,CAAA;AAIJ;AAcO,SAAS,oBAAA,CAEd,SAEA,YAAA,EAEmB;AAEnB,EAAA,MAAM,GAAA,GAAMC,kBAAW,mBAAmB,CAAA;AAE1C,EAAA,MAAM,aAAa,OAAA,CAAQ,MAAA,CAAO,CAAC,CAAA,KAAM,CAAC,EAAE,MAAM,CAAA;AAElD,EAAA,IAAI,GAAA,CAAI,UAAA,CAAW,MAAA,GAAS,CAAA,EAAG,OAAO,GAAA;AAEtC,EAAA,OAAO,uBAAuB,UAAA,EAAY,YAAA,EAAc,CAAA,EAAG,GAAA,EAAK,GAAG,CAAC,CAAA;AAEtE;ACxaA,SAAS,mBAAA,CAEP,IAAA,EAEA,KAAA,EAEA,YAAA,EAEA,SAAA,EAEA;AAEA,EAAA,MAAM,QAAqB,EAAC;AAE5B,EAAA,KAAA,MAAW,OAAO,IAAA,EAAM;AAEtB,IAAA,MAAM,GAAA,GAAM,MAAM,UAAA,CAAW,SAAA,CAAU,CAAC,CAAA,KAAM,CAAA,CAAE,SAAA,KAAc,GAAA,CAAI,SAAS,CAAA;AAE3E,IAAA,KAAA,CAAM,IAAA;AAAA,sBAEJD,cAAAA,CAACE,uBAAAA,CAAM,QAAA,EAAN,EAEE,uBAAa,GAAA,EAAK,GAAA,IAAO,CAAA,GAAI,GAAA,GAAM,CAAC,CAAA,EAAA,EAFlB,CAAA,EAAG,SAAS,CAAA,CAAA,EAAI,GAAA,CAAI,SAAS,CAAA,CAIlD;AAAA,KAEF;AAAA,EAEF;AAEA,EAAA,OAAO,KAAA;AAET;AAYO,SAAS,iBAAA,CAAkB;AAAA,EAEhC,MAAA,EAAQ,KAAA;AAAA,EAER,YAAA;AAAA,EAEA,aAAA,EAAe,MAAA;AAAA,EAEf,UAAA,GAAa,cAAA;AAAA,EAEb;AAEF,CAAA,EAAU;AAER,EAAA,MAAM,QAAqB,EAAC;AAI5B,EAAA,KAAA,CAAM,IAAA;AAAA,IAEJ,GAAG,mBAAA,CAAoB,KAAA,CAAM,WAAA,EAAa,KAAA,EAAO,cAAc,WAAW;AAAA,GAE5E;AAIA,EAAA,IAAI,KAAA,CAAM,cAAc,CAAA,EAAG;AAEzB,IAAA,KAAA,CAAM,IAAA;AAAA,sBAEJF,cAAAA;AAAA,QAAC,MAAA;AAAA,QAAA;AAAA,UAIC,aAAA,EAAW,IAAA;AAAA,UAEX,IAAA,EAAM,UAAA;AAAA,UAEN,qBAAA,EAAoB,OAAA;AAAA,UAEpB,KAAA,EAAO;AAAA,YAEL,OAAO,KAAA,CAAM,WAAA;AAAA,YAEb,UAAU,KAAA,CAAM,WAAA;AAAA,YAEhB,OAAA,EAAS,CAAA;AAAA,YAET,MAAA,EAAQ,MAAA;AAAA,YAER,GAAG;AAAA;AAEL,SAAA;AAAA,QApBI;AAAA;AAsBN,KAEF;AAAA,EAEF;AAIA,EAAA,KAAA,CAAM,UAAA,CAAW,OAAA,CAAQ,CAAC,GAAA,EAAK,CAAA,KAAM;AAEnC,IAAA,MAAM,GAAA,GAAM,KAAA,CAAM,oBAAA,CAAqB,CAAC,CAAA,IAAK,CAAA;AAE7C,IAAA,KAAA,CAAM,IAAA;AAAA,sBAEJA,cAAAA,CAACE,uBAAAA,CAAM,QAAA,EAAN,EAEE,QAAA,EAAA,YAAA,CAAa,GAAA,EAAK,GAAG,CAAA,EAAA,EAFH,CAAA,IAAA,EAAO,GAAA,CAAI,SAAS,CAAA,CAIzC;AAAA,KAEF;AAAA,EAEF,CAAC,CAAA;AAID,EAAA,IAAI,KAAA,CAAM,YAAY,CAAA,EAAG;AAEvB,IAAA,KAAA,CAAM,IAAA;AAAA,sBAEJF,cAAAA;AAAA,QAAC,MAAA;AAAA,QAAA;AAAA,UAIC,aAAA,EAAW,IAAA;AAAA,UAEX,IAAA,EAAM,UAAA;AAAA,UAEN,qBAAA,EAAoB,KAAA;AAAA,UAEpB,KAAA,EAAO;AAAA,YAEL,OAAO,KAAA,CAAM,SAAA;AAAA,YAEb,UAAU,KAAA,CAAM,SAAA;AAAA,YAEhB,OAAA,EAAS,CAAA;AAAA,YAET,MAAA,EAAQ,MAAA;AAAA,YAER,GAAG;AAAA;AAEL,SAAA;AAAA,QApBI;AAAA;AAsBN,KAEF;AAAA,EAEF;AAIA,EAAA,KAAA,CAAM,IAAA;AAAA,IAEJ,GAAG,mBAAA,CAAoB,KAAA,CAAM,SAAA,EAAW,KAAA,EAAO,cAAc,SAAS;AAAA,GAExE;AAIA,EAAA,uBAAOA,cAAAA,CAAAG,mBAAA,EAAA,EAAG,QAAA,EAAA,KAAA,EAAM,CAAA;AAElB","file":"chunk-H2LESGMX.cjs","sourcesContent":["/** Header occupies ARIA row 1. Data rows start at 2 (or after pinned top). */\r\nexport const ARIA_HEADER_ROW_INDEX = 1;\r\n\r\n/** 1-based `aria-colindex` from 0-based visible column order. */\r\nexport function ariaColIndex(visibleIndex: number): number {\r\n return visibleIndex + 1;\r\n}\r\n\r\n/**\r\n * 1-based `aria-rowindex` for a data row.\r\n * `absoluteIndex` is 0-based in the full collection (not the mounted DOM window).\r\n * `pinnedTopCount` shifts indices when pinned-top rows occupy slots after the header (PR-116).\r\n */\r\nexport function ariaDataRowIndex(\r\n absoluteIndex: number,\r\n pinnedTopCount = 0,\r\n): number {\r\n return absoluteIndex + 2 + pinnedTopCount;\r\n}\r\n\r\n/** Pinned-top rows sit immediately after the header (PR-116). */\r\nexport function ariaPinnedTopRowIndex(indexInPinned: number): number {\r\n return indexInPinned + 2;\r\n}\r\n\r\n/** Pinned-bottom rows sit after all data rows (PR-116). */\r\nexport function ariaPinnedBottomRowIndex(\r\n indexInPinned: number,\r\n dataRowCount: number,\r\n pinnedTopCount = 0,\r\n): number {\r\n return pinnedTopCount + dataRowCount + 2 + indexInPinned;\r\n}\r\n\r\nexport function ariaFooterRowIndex(\r\n dataRowCount: number,\r\n pinnedTopCount = 0,\r\n pinnedBottomCount = 0,\r\n): number {\r\n return dataRowCount + pinnedTopCount + pinnedBottomCount + 2;\r\n}\r\n\r\nexport function ariaGridRowCount(\r\n dataRowCount: number,\r\n hasFooter: boolean | number,\r\n pinnedTopCount = 0,\r\n pinnedBottomCount = 0,\r\n): number {\r\n const footerRows =\r\n typeof hasFooter === 'number' ? hasFooter : hasFooter ? 1 : 0;\r\n return (\r\n 1 +\r\n pinnedTopCount +\r\n dataRowCount +\r\n pinnedBottomCount +\r\n footerRows\r\n );\r\n}\r\n\r\nfunction ariaToken(value: string): string {\r\n return value.replace(/[^A-Za-z0-9_-]/g, '_');\r\n}\r\n\r\n/** Stable DOM id for `aria-activedescendant` on the grid. */\r\nexport function gridCellDomId(\r\n tableKey: string,\r\n rowId: number,\r\n columnId: string,\r\n): string {\r\n return `erp-cell-${ariaToken(tableKey)}-${rowId}-${ariaToken(columnId)}`;\r\n}\r\n\r\nexport function isAriaSelectedCell(\r\n active: { rowId: number; columnId: string } | null | undefined,\r\n rowId: number,\r\n columnId: string,\r\n): boolean {\r\n return !!active && active.rowId === rowId && active.columnId === columnId;\r\n}\r\n\r\nexport function gridCellA11y(\r\n tableKey: string,\r\n rowId: number,\r\n columnId: string,\r\n active: { rowId: number; columnId: string } | null | undefined,\r\n): { id: string; 'aria-selected': boolean } {\r\n return {\r\n id: gridCellDomId(tableKey, rowId, columnId),\r\n 'aria-selected': isAriaSelectedCell(active, rowId, columnId),\r\n };\r\n}\r\n","import type { CSSProperties } from 'react';\r\n\r\nimport type { ColumnSchema } from '../bootstrap/type';\r\nimport {\r\n computeEndPinOffsets,\r\n computePinOffsets,\r\n resolveColumnPinned,\r\n type ColumnPinSide,\r\n} from '../engine/dataOps/columnPin';\r\nimport { isIndexColumn, type ColumnWidthHint } from '../engine/columnWidth';\r\n\r\n/** D19: any column may pin; index always pins at inline-start. */\r\nexport function columnPinSide(column: ColumnSchema): ColumnPinSide | null {\r\n const pin = resolveColumnPinned(column);\r\n if (pin === 'start' || pin === 'end') return pin;\r\n return null;\r\n}\r\n\r\nexport function columnPinClassName(column: ColumnWidthHint): string {\r\n if (isIndexColumn(column)) return 'erp-col-pin-start erp-col-pin-index';\r\n const side = columnPinSide(column as ColumnSchema);\r\n if (side === 'start') return 'erp-col-pin-start';\r\n if (side === 'end') return 'erp-col-pin-end';\r\n return '';\r\n}\r\n\r\n/** @deprecated Use `columnPinDataAttr` — kept for existing DOM hooks. */\r\nexport function indexPinClassName(column: ColumnWidthHint): string {\r\n return columnPinClassName(column);\r\n}\r\n\r\nexport function columnPinDataAttr(\r\n column: ColumnWidthHint,\r\n): ColumnPinSide | 'index' | undefined {\r\n if (isIndexColumn(column)) return 'index';\r\n return columnPinSide(column as ColumnSchema) ?? undefined;\r\n}\r\n\r\n/** @deprecated Use `columnPinDataAttr`. */\r\nexport function indexPinDataAttr(\r\n column: ColumnWidthHint,\r\n): 'index' | undefined {\r\n const attr = columnPinDataAttr(column);\r\n return attr === 'index' ? 'index' : undefined;\r\n}\r\n\r\nexport function columnPinStyle(\r\n column: ColumnSchema,\r\n startOffsets: Record<string, number>,\r\n endOffsets: Record<string, number>,\r\n): CSSProperties | undefined {\r\n const side = columnPinSide(column);\r\n if (side === 'start') {\r\n const offset = startOffsets[column.fieldName];\r\n if (offset === undefined) return undefined;\r\n return { insetInlineStart: offset };\r\n }\r\n if (side === 'end') {\r\n const offset = endOffsets[column.fieldName];\r\n if (offset === undefined) return undefined;\r\n return { insetInlineEnd: offset };\r\n }\r\n return undefined;\r\n}\r\n\r\nexport function columnPinCellProps(\r\n column: ColumnSchema,\r\n startOffsets: Record<string, number>,\r\n endOffsets: Record<string, number>,\r\n): {\r\n className: string;\r\n 'data-erp-col-pin': ReturnType<typeof columnPinDataAttr>;\r\n style: CSSProperties | undefined;\r\n} {\r\n return {\r\n className: columnPinClassName(column),\r\n 'data-erp-col-pin': columnPinDataAttr(column),\r\n style: columnPinStyle(column, startOffsets, endOffsets),\r\n };\r\n}\r\n\r\nexport function buildPinOffsetMaps(\r\n pinnedStart: readonly ColumnSchema[],\r\n pinnedEnd: readonly ColumnSchema[],\r\n resolveWidth: (col: ColumnSchema) => number,\r\n): {\r\n startOffsets: Record<string, number>;\r\n endOffsets: Record<string, number>;\r\n} {\r\n return {\r\n startOffsets: computePinOffsets(pinnedStart, resolveWidth),\r\n endOffsets: computeEndPinOffsets(pinnedEnd, resolveWidth),\r\n };\r\n}\r\n","\"use client\";\r\n\r\n\r\n\r\nimport React, {\r\n\r\n createContext,\r\n\r\n useContext,\r\n\r\n useEffect,\r\n\r\n useMemo,\r\n\r\n useState,\r\n\r\n type ReactNode,\r\n\r\n type RefObject,\r\n\r\n} from 'react';\r\n\r\n\r\n\r\nimport type { ColumnSchema } from '../../bootstrap/type';\r\n\r\nimport { partitionColumnsByPin, sumColumnWidths } from '../../engine/dataOps/columnPin';\r\nimport { computeLayoutColumnWidths } from '../../engine/dataOps/columnLayout';\r\nimport { resolveColumnWidth } from '../../engine/columnWidth';\r\n\r\nimport { ViewportCalculator } from '../../engine/ViewportCalculator';\r\n\r\nimport { useDirection } from '../host';\r\n\r\n\r\n\r\nexport type ColumnWindowModel = {\r\n\r\n /** Full non-hidden column list (document order). */\r\n\r\n allVisible: ColumnSchema[];\r\n\r\n /** Inline-start pinned columns (includes index). */\r\n\r\n pinnedStart: ColumnSchema[];\r\n\r\n /** @deprecated alias for pinnedStart */\r\n\r\n pinned: ColumnSchema[];\r\n\r\n pinnedEnd: ColumnSchema[];\r\n\r\n /** Visible scrollable slice only. */\r\n\r\n scrollable: ColumnSchema[];\r\n\r\n /** Absolute indices into `allVisible` for scrollable slice entries. */\r\n\r\n scrollableAbsIndices: number[];\r\n\r\n spacerStart: number;\r\n\r\n spacerEnd: number;\r\n\r\n pinnedStartWidth: number;\r\n\r\n /** @deprecated alias for pinnedStartWidth */\r\n\r\n pinnedWidth: number;\r\n\r\n pinnedEndWidth: number;\r\n\r\n startPinOffsets: Record<string, number>;\r\n\r\n endPinOffsets: Record<string, number>;\r\n\r\n totalWidth: number;\r\n\r\n /** Effective widths after flex distribution (PR-112). */\r\n layoutWidths: Record<string, number>;\r\n\r\n /** Number of `<th>` / data cells that should mount (pins + slice + spacers). */\r\n\r\n mountedScrollableCount: number;\r\n\r\n};\r\n\r\n\r\n\r\nconst EMPTY: ColumnWindowModel = {\r\n\r\n allVisible: [],\r\n\r\n pinnedStart: [],\r\n\r\n pinned: [],\r\n\r\n pinnedEnd: [],\r\n\r\n scrollable: [],\r\n\r\n scrollableAbsIndices: [],\r\n\r\n spacerStart: 0,\r\n\r\n spacerEnd: 0,\r\n\r\n pinnedStartWidth: 0,\r\n\r\n pinnedWidth: 0,\r\n\r\n pinnedEndWidth: 0,\r\n\r\n startPinOffsets: {},\r\n\r\n endPinOffsets: {},\r\n\r\n totalWidth: 0,\r\n\r\n layoutWidths: {},\r\n\r\n mountedScrollableCount: 0,\r\n\r\n};\r\n\r\n\r\n\r\nconst ColumnWindowContext = createContext<ColumnWindowModel>(EMPTY);\r\n\r\n\r\n\r\n/** Normalize scroll position to distance from inline-start (px ≥ 0). */\r\n\r\nexport function scrollOffsetFromInlineStart(\r\n\r\n el: HTMLElement,\r\n\r\n direction: 'rtl' | 'ltr',\r\n\r\n): number {\r\n\r\n const { scrollLeft, scrollWidth, clientWidth } = el;\r\n\r\n if (direction === 'ltr') return Math.max(0, scrollLeft);\r\n\r\n if (scrollLeft < 0) return Math.max(0, -scrollLeft);\r\n\r\n const max = Math.max(0, scrollWidth - clientWidth);\r\n\r\n return Math.max(0, max - scrollLeft);\r\n\r\n}\r\n\r\n\r\n\r\nexport function buildColumnWindowModel(\r\n\r\n allVisible: ColumnSchema[],\r\n\r\n columnWidths: Record<string, number> | undefined,\r\n\r\n scrollOffset: number,\r\n\r\n viewportSize: number,\r\n\r\n overscan = 1,\r\n\r\n flexContainerWidth = viewportSize,\r\n\r\n): ColumnWindowModel {\r\n\r\n const layoutWidths = computeLayoutColumnWidths(\r\n allVisible,\r\n columnWidths,\r\n flexContainerWidth,\r\n );\r\n\r\n const widthOf = (col: ColumnSchema) =>\r\n layoutWidths[col.fieldName] ?? resolveColumnWidth(col, columnWidths);\r\n\r\n\r\n\r\n const { pinnedStart, scrollable: scrollableAll, pinnedEnd, scrollableAbs } =\r\n\r\n partitionColumnsByPin(allVisible);\r\n\r\n\r\n\r\n const pinnedStartWidth = sumColumnWidths(pinnedStart, widthOf);\r\n\r\n const pinnedEndWidth = sumColumnWidths(pinnedEnd, widthOf);\r\n\r\n\r\n\r\n const scrollableWidths = scrollableAll.map(widthOf);\r\n\r\n const range = ViewportCalculator.calculateColumns(\r\n\r\n scrollableWidths,\r\n\r\n scrollOffset,\r\n\r\n viewportSize,\r\n\r\n pinnedStartWidth,\r\n\r\n overscan,\r\n\r\n pinnedEndWidth,\r\n\r\n );\r\n\r\n const scrollable = scrollableAll.slice(range.startIndex, range.endIndex);\r\n\r\n const scrollableAbsIndices = scrollableAbs.slice(\r\n\r\n range.startIndex,\r\n\r\n range.endIndex,\r\n\r\n );\r\n\r\n const totalScrollable = range.totalScrollableWidth;\r\n\r\n const spacerCells =\r\n\r\n (range.spacerStart > 0 ? 1 : 0) + (range.spacerEnd > 0 ? 1 : 0);\r\n\r\n\r\n\r\n let startCursor = 0;\r\n\r\n const startPinOffsets: Record<string, number> = {};\r\n\r\n for (const col of pinnedStart) {\r\n\r\n startPinOffsets[col.fieldName] = startCursor;\r\n\r\n startCursor += widthOf(col);\r\n\r\n }\r\n\r\n\r\n\r\n let endCursor = 0;\r\n\r\n const endPinOffsets: Record<string, number> = {};\r\n\r\n for (let i = pinnedEnd.length - 1; i >= 0; i -= 1) {\r\n\r\n const col = pinnedEnd[i]!;\r\n\r\n endPinOffsets[col.fieldName] = endCursor;\r\n\r\n endCursor += widthOf(col);\r\n\r\n }\r\n\r\n\r\n\r\n return {\r\n\r\n allVisible,\r\n\r\n pinnedStart,\r\n\r\n pinned: pinnedStart,\r\n\r\n pinnedEnd,\r\n\r\n scrollable,\r\n\r\n scrollableAbsIndices,\r\n\r\n spacerStart: range.spacerStart,\r\n\r\n spacerEnd: range.spacerEnd,\r\n\r\n pinnedStartWidth,\r\n\r\n pinnedWidth: pinnedStartWidth,\r\n\r\n pinnedEndWidth,\r\n\r\n startPinOffsets: startPinOffsets,\r\n\r\n endPinOffsets,\r\n\r\n totalWidth: pinnedStartWidth + totalScrollable + pinnedEndWidth,\r\n\r\n layoutWidths,\r\n\r\n mountedScrollableCount: scrollable.length + spacerCells,\r\n\r\n };\r\n\r\n}\r\n\r\n\r\n\r\ntype ProviderProps = {\r\n\r\n scrollRef: RefObject<HTMLElement | null>;\r\n\r\n columns: ColumnSchema[];\r\n\r\n columnWidths?: Record<string, number>;\r\n\r\n overscan?: number;\r\n\r\n onViewportWidthChange?: (width: number) => void;\r\n\r\n children: ReactNode;\r\n\r\n};\r\n\r\n\r\n\r\nexport function ColumnWindowProvider({\r\n\r\n scrollRef,\r\n\r\n columns,\r\n\r\n columnWidths,\r\n\r\n overscan = 1,\r\n\r\n onViewportWidthChange,\r\n\r\n children,\r\n\r\n}: ProviderProps) {\r\n\r\n const direction = useDirection();\r\n\r\n const [scrollOffset, setScrollOffset] = useState(0);\r\n\r\n const [viewportSize, setViewportSize] = useState(1024);\r\n\r\n\r\n\r\n const allVisible = useMemo(\r\n\r\n () => columns.filter((c) => !c.hidden),\r\n\r\n [columns],\r\n\r\n );\r\n\r\n\r\n\r\n useEffect(() => {\r\n\r\n const el = scrollRef.current;\r\n\r\n if (!el) return;\r\n\r\n\r\n\r\n const update = () => {\r\n\r\n setScrollOffset(scrollOffsetFromInlineStart(el, direction));\r\n\r\n const w = el.clientWidth || 1024;\r\n\r\n setViewportSize(w);\r\n\r\n onViewportWidthChange?.(w);\r\n\r\n };\r\n\r\n update();\r\n\r\n el.addEventListener('scroll', update, { passive: true });\r\n\r\n const ro =\r\n\r\n typeof ResizeObserver !== 'undefined'\r\n\r\n ? new ResizeObserver(() => update())\r\n\r\n : null;\r\n\r\n ro?.observe(el);\r\n\r\n return () => {\r\n\r\n el.removeEventListener('scroll', update);\r\n\r\n ro?.disconnect();\r\n\r\n };\r\n\r\n }, [scrollRef, direction, allVisible.length, columnWidths, onViewportWidthChange]);\r\n\r\n\r\n\r\n const value = useMemo(\r\n\r\n () =>\r\n\r\n buildColumnWindowModel(\r\n\r\n allVisible,\r\n\r\n columnWidths,\r\n\r\n scrollOffset,\r\n\r\n viewportSize,\r\n\r\n overscan,\r\n\r\n ),\r\n\r\n [allVisible, columnWidths, scrollOffset, viewportSize, overscan],\r\n\r\n );\r\n\r\n\r\n\r\n return (\r\n\r\n <ColumnWindowContext.Provider value={value}>\r\n\r\n {children}\r\n\r\n </ColumnWindowContext.Provider>\r\n\r\n );\r\n\r\n}\r\n\r\n\r\n\r\nexport function useColumnWindow(): ColumnWindowModel {\r\n\r\n return useContext(ColumnWindowContext);\r\n\r\n}\r\n\r\n\r\n\r\n/** Fallback when provider is absent: render every visible column. */\r\n\r\nexport function useColumnWindowOrAll(\r\n\r\n columns: ColumnSchema[],\r\n\r\n columnWidths?: Record<string, number>,\r\n\r\n): ColumnWindowModel {\r\n\r\n const ctx = useContext(ColumnWindowContext);\r\n\r\n const allVisible = columns.filter((c) => !c.hidden);\r\n\r\n if (ctx.allVisible.length > 0) return ctx;\r\n\r\n return buildColumnWindowModel(allVisible, columnWidths, 0, 1e9, 0, 0);\r\n\r\n}\r\n\r\n\r\n","\"use client\";\r\n\r\n\r\n\r\nimport React, { type CSSProperties, type ReactNode } from 'react';\r\n\r\n\r\n\r\nimport type { ColumnSchema } from '../../bootstrap/type';\r\n\r\nimport type { ColumnWindowModel } from './columnWindow';\r\n\r\n\r\n\r\ntype SpacerKind = 'start' | 'end';\r\n\r\n\r\n\r\ntype Props = {\r\n\r\n window: ColumnWindowModel;\r\n\r\n /** Render a real pinned / scrollable column cell. */\r\n\r\n renderColumn: (col: ColumnSchema, absoluteIndex: number) => ReactNode;\r\n\r\n /** Element type for horizontal spacers (`th` in header, `td` elsewhere). */\r\n\r\n spacerElement: 'th' | 'td';\r\n\r\n spacerRole?: 'columnheader' | 'presentation' | 'gridcell';\r\n\r\n spacerStyle?: CSSProperties;\r\n\r\n};\r\n\r\n\r\n\r\nfunction renderPinnedColumns(\r\n\r\n cols: ColumnSchema[],\r\n\r\n model: ColumnWindowModel,\r\n\r\n renderColumn: Props['renderColumn'],\r\n\r\n keyPrefix: string,\r\n\r\n) {\r\n\r\n const nodes: ReactNode[] = [];\r\n\r\n for (const col of cols) {\r\n\r\n const abs = model.allVisible.findIndex((c) => c.fieldName === col.fieldName);\r\n\r\n nodes.push(\r\n\r\n <React.Fragment key={`${keyPrefix}-${col.fieldName}`}>\r\n\r\n {renderColumn(col, abs >= 0 ? abs : 0)}\r\n\r\n </React.Fragment>,\r\n\r\n );\r\n\r\n }\r\n\r\n return nodes;\r\n\r\n}\r\n\r\n\r\n\r\n/**\r\n\r\n * Shared column chrome for header / body / footer (PR-98 / PR-110):\r\n\r\n * pin start → spacerStart → scrollable window → spacerEnd → pin end.\r\n\r\n */\r\n\r\nexport function ColumnWindowCells({\r\n\r\n window: model,\r\n\r\n renderColumn,\r\n\r\n spacerElement: Spacer,\r\n\r\n spacerRole = 'presentation',\r\n\r\n spacerStyle,\r\n\r\n}: Props) {\r\n\r\n const nodes: ReactNode[] = [];\r\n\r\n\r\n\r\n nodes.push(\r\n\r\n ...renderPinnedColumns(model.pinnedStart, model, renderColumn, 'pin-start'),\r\n\r\n );\r\n\r\n\r\n\r\n if (model.spacerStart > 0) {\r\n\r\n nodes.push(\r\n\r\n <Spacer\r\n\r\n key=\"pdg-col-spacer-start\"\r\n\r\n aria-hidden\r\n\r\n role={spacerRole}\r\n\r\n data-pdg-col-spacer=\"start\"\r\n\r\n style={{\r\n\r\n width: model.spacerStart,\r\n\r\n minWidth: model.spacerStart,\r\n\r\n padding: 0,\r\n\r\n border: 'none',\r\n\r\n ...spacerStyle,\r\n\r\n }}\r\n\r\n />,\r\n\r\n );\r\n\r\n }\r\n\r\n\r\n\r\n model.scrollable.forEach((col, i) => {\r\n\r\n const abs = model.scrollableAbsIndices[i] ?? i;\r\n\r\n nodes.push(\r\n\r\n <React.Fragment key={`scr-${col.fieldName}`}>\r\n\r\n {renderColumn(col, abs)}\r\n\r\n </React.Fragment>,\r\n\r\n );\r\n\r\n });\r\n\r\n\r\n\r\n if (model.spacerEnd > 0) {\r\n\r\n nodes.push(\r\n\r\n <Spacer\r\n\r\n key=\"pdg-col-spacer-end\"\r\n\r\n aria-hidden\r\n\r\n role={spacerRole}\r\n\r\n data-pdg-col-spacer=\"end\"\r\n\r\n style={{\r\n\r\n width: model.spacerEnd,\r\n\r\n minWidth: model.spacerEnd,\r\n\r\n padding: 0,\r\n\r\n border: 'none',\r\n\r\n ...spacerStyle,\r\n\r\n }}\r\n\r\n />,\r\n\r\n );\r\n\r\n }\r\n\r\n\r\n\r\n nodes.push(\r\n\r\n ...renderPinnedColumns(model.pinnedEnd, model, renderColumn, 'pin-end'),\r\n\r\n );\r\n\r\n\r\n\r\n return <>{nodes}</>;\r\n\r\n}\r\n\r\n\r\n\r\nexport type { SpacerKind };\r\n\r\n\r\n"]}