@modern-admin/web 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 (391) hide show
  1. package/dist/config/vite.js +20 -0
  2. package/dist/lib/index.js +6 -5
  3. package/dist/lib/index.js.map +1 -1
  4. package/dist/standalone/assets/action-component-host-8DE4kuUJ.js +2 -0
  5. package/dist/standalone/assets/action-component-host-8DE4kuUJ.js.br +0 -0
  6. package/dist/standalone/assets/action-component-host-8DE4kuUJ.js.gz +0 -0
  7. package/dist/standalone/assets/{action-component-host-QVowRL_F.js.map → action-component-host-8DE4kuUJ.js.map} +1 -1
  8. package/dist/standalone/assets/{action-page-CET1s1MA.js → action-page-D6BbXzUo.js} +2 -2
  9. package/dist/standalone/assets/action-page-D6BbXzUo.js.br +0 -0
  10. package/dist/standalone/assets/action-page-D6BbXzUo.js.gz +0 -0
  11. package/dist/standalone/assets/{action-page-CET1s1MA.js.map → action-page-D6BbXzUo.js.map} +1 -1
  12. package/dist/standalone/assets/ai-assistant-widget-BORa8_hT.js +2 -0
  13. package/dist/standalone/assets/ai-assistant-widget-BORa8_hT.js.br +0 -0
  14. package/dist/standalone/assets/ai-assistant-widget-BORa8_hT.js.gz +0 -0
  15. package/dist/standalone/assets/{ai-assistant-widget-pJHSP1PB.js.map → ai-assistant-widget-BORa8_hT.js.map} +1 -1
  16. package/dist/standalone/assets/arrow-left-yVCaEJJu.js +2 -0
  17. package/dist/standalone/assets/{arrow-left-CI9hUPwJ.js.map → arrow-left-yVCaEJJu.js.map} +1 -1
  18. package/dist/standalone/assets/audit-log-page-uHj9GWfi.js +2 -0
  19. package/dist/standalone/assets/audit-log-page-uHj9GWfi.js.br +0 -0
  20. package/dist/standalone/assets/audit-log-page-uHj9GWfi.js.gz +0 -0
  21. package/dist/standalone/assets/{audit-log-page-DoZPtbGo.js.map → audit-log-page-uHj9GWfi.js.map} +1 -1
  22. package/dist/standalone/assets/{badge-8oeWEs3P.js → badge-CdW_Z0lB.js} +2 -2
  23. package/dist/standalone/assets/{badge-8oeWEs3P.js.map → badge-CdW_Z0lB.js.map} +1 -1
  24. package/dist/standalone/assets/{bot-DFDgGfNj.js → bot-CuDPD_ZU.js} +2 -2
  25. package/dist/standalone/assets/{bot-DFDgGfNj.js.map → bot-CuDPD_ZU.js.map} +1 -1
  26. package/dist/standalone/assets/cache-page-CBKj7WFq.js +2 -0
  27. package/dist/standalone/assets/cache-page-CBKj7WFq.js.br +0 -0
  28. package/dist/standalone/assets/cache-page-CBKj7WFq.js.gz +0 -0
  29. package/dist/standalone/assets/{cache-page-CoKusfv-.js.map → cache-page-CBKj7WFq.js.map} +1 -1
  30. package/dist/standalone/assets/calendar-BuLRvNBg.js +2 -0
  31. package/dist/standalone/assets/calendar-BuLRvNBg.js.br +0 -0
  32. package/dist/standalone/assets/calendar-BuLRvNBg.js.gz +0 -0
  33. package/dist/standalone/assets/calendar-BuLRvNBg.js.map +1 -0
  34. package/dist/standalone/assets/card-BYbadRar.js +2 -0
  35. package/dist/standalone/assets/card-BYbadRar.js.br +0 -0
  36. package/dist/standalone/assets/card-BYbadRar.js.gz +0 -0
  37. package/dist/standalone/assets/{card-MNH_XK0V.js.map → card-BYbadRar.js.map} +1 -1
  38. package/dist/standalone/assets/chart-widget-Bfk_mvm2.js +2 -0
  39. package/dist/standalone/assets/chart-widget-Bfk_mvm2.js.br +0 -0
  40. package/dist/standalone/assets/chart-widget-Bfk_mvm2.js.gz +0 -0
  41. package/dist/standalone/assets/{chart-widget-R2NG5T1y.js.map → chart-widget-Bfk_mvm2.js.map} +1 -1
  42. package/dist/standalone/assets/chevrons-up-down-y29_Sm-3.js +2 -0
  43. package/dist/standalone/assets/{chevrons-up-down-BHCs46XQ.js.map → chevrons-up-down-y29_Sm-3.js.map} +1 -1
  44. package/dist/standalone/assets/{circle-alert-0EyKeic4.js → circle-alert-D1sKnXtO.js} +2 -2
  45. package/dist/standalone/assets/{circle-alert-0EyKeic4.js.map → circle-alert-D1sKnXtO.js.map} +1 -1
  46. package/dist/standalone/assets/{clock-OCmX6DtA.js → clock-B9qbSr_k.js} +2 -2
  47. package/dist/standalone/assets/{clock-OCmX6DtA.js.map → clock-B9qbSr_k.js.map} +1 -1
  48. package/dist/standalone/assets/command-BAXXxf0P.js +2 -0
  49. package/dist/standalone/assets/command-BAXXxf0P.js.br +0 -0
  50. package/dist/standalone/assets/command-BAXXxf0P.js.gz +0 -0
  51. package/dist/standalone/assets/command-BAXXxf0P.js.map +1 -0
  52. package/dist/standalone/assets/{copy-BexCWf4U.js → copy-5fb4qj-_.js} +2 -2
  53. package/dist/standalone/assets/{copy-BexCWf4U.js.map → copy-5fb4qj-_.js.map} +1 -1
  54. package/dist/standalone/assets/createLucideIcon-QE2kj6ru.js +2 -0
  55. package/dist/standalone/assets/createLucideIcon-QE2kj6ru.js.br +0 -0
  56. package/dist/standalone/assets/createLucideIcon-QE2kj6ru.js.gz +0 -0
  57. package/dist/standalone/assets/createLucideIcon-QE2kj6ru.js.map +1 -0
  58. package/dist/standalone/assets/date-picker-Bxv-yrWf.js +2 -0
  59. package/dist/standalone/assets/date-picker-Bxv-yrWf.js.br +0 -0
  60. package/dist/standalone/assets/date-picker-Bxv-yrWf.js.gz +0 -0
  61. package/dist/standalone/assets/{date-picker-DQ4XOgO6.js.map → date-picker-Bxv-yrWf.js.map} +1 -1
  62. package/dist/standalone/assets/dist-COXu-_Zv.js +2 -0
  63. package/dist/standalone/assets/dist-COXu-_Zv.js.br +0 -0
  64. package/dist/standalone/assets/dist-COXu-_Zv.js.gz +0 -0
  65. package/dist/standalone/assets/dist-COXu-_Zv.js.map +1 -0
  66. package/dist/standalone/assets/dist-CiXwD0ML.js +2 -0
  67. package/dist/standalone/assets/dist-CiXwD0ML.js.br +0 -0
  68. package/dist/standalone/assets/dist-CiXwD0ML.js.gz +0 -0
  69. package/dist/standalone/assets/dist-CiXwD0ML.js.map +1 -0
  70. package/dist/standalone/assets/dist-DPxQeZn3.js +2 -0
  71. package/dist/standalone/assets/dist-DPxQeZn3.js.br +0 -0
  72. package/dist/standalone/assets/dist-DPxQeZn3.js.gz +0 -0
  73. package/dist/standalone/assets/dist-DPxQeZn3.js.map +1 -0
  74. package/dist/standalone/assets/{edit-page-CVjik6T5.js → edit-page-Dm638D2J.js} +2 -2
  75. package/dist/standalone/assets/edit-page-Dm638D2J.js.br +0 -0
  76. package/dist/standalone/assets/edit-page-Dm638D2J.js.gz +0 -0
  77. package/dist/standalone/assets/{edit-page-CVjik6T5.js.map → edit-page-Dm638D2J.js.map} +1 -1
  78. package/dist/standalone/assets/{ellipsis-lEjcTxo0.js → ellipsis-BRmOlhsy.js} +2 -2
  79. package/dist/standalone/assets/{ellipsis-lEjcTxo0.js.map → ellipsis-BRmOlhsy.js.map} +1 -1
  80. package/dist/standalone/assets/empty-DMs98grx.js +2 -0
  81. package/dist/standalone/assets/empty-DMs98grx.js.br +0 -0
  82. package/dist/standalone/assets/empty-DMs98grx.js.gz +0 -0
  83. package/dist/standalone/assets/empty-DMs98grx.js.map +1 -0
  84. package/dist/standalone/assets/{file-text-CcLZq8HA.js → file-text-MQF--yeB.js} +2 -2
  85. package/dist/standalone/assets/{file-text-CcLZq8HA.js.map → file-text-MQF--yeB.js.map} +1 -1
  86. package/dist/standalone/assets/floating-layer-BcTp2AMB.js +2 -0
  87. package/dist/standalone/assets/floating-layer-BcTp2AMB.js.br +0 -0
  88. package/dist/standalone/assets/floating-layer-BcTp2AMB.js.gz +0 -0
  89. package/dist/standalone/assets/floating-layer-BcTp2AMB.js.map +1 -0
  90. package/dist/standalone/assets/{global-search-dialog-CT30gcRv.js → global-search-dialog-DxwxFDO5.js} +2 -2
  91. package/dist/standalone/assets/global-search-dialog-DxwxFDO5.js.br +0 -0
  92. package/dist/standalone/assets/global-search-dialog-DxwxFDO5.js.gz +0 -0
  93. package/dist/standalone/assets/{global-search-dialog-CT30gcRv.js.map → global-search-dialog-DxwxFDO5.js.map} +1 -1
  94. package/dist/standalone/assets/heavy-fields-LnhreUPp.js +174 -0
  95. package/dist/standalone/assets/heavy-fields-LnhreUPp.js.br +0 -0
  96. package/dist/standalone/assets/heavy-fields-LnhreUPp.js.gz +0 -0
  97. package/dist/standalone/assets/heavy-fields-LnhreUPp.js.map +1 -0
  98. package/dist/standalone/assets/home-page-DiDOzuic.js +61 -0
  99. package/dist/standalone/assets/home-page-DiDOzuic.js.br +0 -0
  100. package/dist/standalone/assets/home-page-DiDOzuic.js.gz +0 -0
  101. package/dist/standalone/assets/home-page-DiDOzuic.js.map +1 -0
  102. package/dist/standalone/assets/{hooks-DHDUQgzs.js → hooks-BiOfAnEq.js} +11 -11
  103. package/dist/standalone/assets/hooks-BiOfAnEq.js.br +0 -0
  104. package/dist/standalone/assets/hooks-BiOfAnEq.js.gz +0 -0
  105. package/dist/standalone/assets/hooks-BiOfAnEq.js.map +1 -0
  106. package/dist/standalone/assets/icon-registry-s31CNk7M.js +2 -0
  107. package/dist/standalone/assets/icon-registry-s31CNk7M.js.br +0 -0
  108. package/dist/standalone/assets/icon-registry-s31CNk7M.js.gz +0 -0
  109. package/dist/standalone/assets/icon-registry-s31CNk7M.js.map +1 -0
  110. package/dist/standalone/assets/index-CASCzvYu.js +15 -0
  111. package/dist/standalone/assets/index-CASCzvYu.js.br +0 -0
  112. package/dist/standalone/assets/index-CASCzvYu.js.gz +0 -0
  113. package/dist/standalone/assets/index-CASCzvYu.js.map +1 -0
  114. package/dist/standalone/assets/index-Cz5ntgJ_.css +2 -0
  115. package/dist/standalone/assets/index-Cz5ntgJ_.css.br +0 -0
  116. package/dist/standalone/assets/index-Cz5ntgJ_.css.gz +0 -0
  117. package/dist/standalone/assets/{info-CGVdWTj1.js → info-ChwYoM77.js} +2 -2
  118. package/dist/standalone/assets/{info-CGVdWTj1.js.map → info-ChwYoM77.js.map} +1 -1
  119. package/dist/standalone/assets/json-editor-BD0UhGOT.js +2 -0
  120. package/dist/standalone/assets/json-editor-BD0UhGOT.js.br +0 -0
  121. package/dist/standalone/assets/json-editor-BD0UhGOT.js.gz +0 -0
  122. package/dist/standalone/assets/json-editor-BD0UhGOT.js.map +1 -0
  123. package/dist/standalone/assets/key-BzJFbNbz.js +2 -0
  124. package/dist/standalone/assets/key-BzJFbNbz.js.map +1 -0
  125. package/dist/standalone/assets/{key-round-CQLp1Ua9.js → key-round-oSqmVdkQ.js} +2 -2
  126. package/dist/standalone/assets/{key-round-CQLp1Ua9.js.map → key-round-oSqmVdkQ.js.map} +1 -1
  127. package/dist/standalone/assets/{minimize-2-Bx2cH_WS.js → minimize-2-iWv98HjE.js} +2 -2
  128. package/dist/standalone/assets/{minimize-2-Bx2cH_WS.js.map → minimize-2-iWv98HjE.js.map} +1 -1
  129. package/dist/standalone/assets/{palette-DVP_4RAn.js → palette-jgTV28yN.js} +2 -2
  130. package/dist/standalone/assets/{palette-DVP_4RAn.js.map → palette-jgTV28yN.js.map} +1 -1
  131. package/dist/standalone/assets/{pencil-BO-k3yTG.js → pencil-kFOObGrY.js} +2 -2
  132. package/dist/standalone/assets/{pencil-BO-k3yTG.js.map → pencil-kFOObGrY.js.map} +1 -1
  133. package/dist/standalone/assets/{pipette-CqHYfQnn.js → pipette-roLBCmPv.js} +2 -2
  134. package/dist/standalone/assets/pipette-roLBCmPv.js.br +0 -0
  135. package/dist/standalone/assets/pipette-roLBCmPv.js.gz +0 -0
  136. package/dist/standalone/assets/{pipette-CqHYfQnn.js.map → pipette-roLBCmPv.js.map} +1 -1
  137. package/dist/standalone/assets/plus-D7PHzena.js +2 -0
  138. package/dist/standalone/assets/{plus-Dk-FzitW.js.map → plus-D7PHzena.js.map} +1 -1
  139. package/dist/standalone/assets/property-renderer-ClrVnSny.js +4 -0
  140. package/dist/standalone/assets/property-renderer-ClrVnSny.js.br +0 -0
  141. package/dist/standalone/assets/property-renderer-ClrVnSny.js.gz +0 -0
  142. package/dist/standalone/assets/property-renderer-ClrVnSny.js.map +1 -0
  143. package/dist/standalone/assets/reference-BMbhUBHD.js +2 -0
  144. package/dist/standalone/assets/reference-BMbhUBHD.js.br +0 -0
  145. package/dist/standalone/assets/reference-BMbhUBHD.js.gz +0 -0
  146. package/dist/standalone/assets/{reference-BDP1QYCg.js.map → reference-BMbhUBHD.js.map} +1 -1
  147. package/dist/standalone/assets/refresh-cw-Cm9YiHGV.js +2 -0
  148. package/dist/standalone/assets/refresh-cw-Cm9YiHGV.js.map +1 -0
  149. package/dist/standalone/assets/revisions-button-Csueldv_.js +2 -0
  150. package/dist/standalone/assets/revisions-button-Csueldv_.js.br +0 -0
  151. package/dist/standalone/assets/revisions-button-Csueldv_.js.gz +0 -0
  152. package/dist/standalone/assets/{revisions-button-CI74_D14.js.map → revisions-button-Csueldv_.js.map} +1 -1
  153. package/dist/standalone/assets/richtext-render-DaiNQPjZ.js +68 -0
  154. package/dist/standalone/assets/richtext-render-DaiNQPjZ.js.br +0 -0
  155. package/dist/standalone/assets/richtext-render-DaiNQPjZ.js.gz +0 -0
  156. package/dist/standalone/assets/richtext-render-DaiNQPjZ.js.map +1 -0
  157. package/dist/standalone/assets/{rotate-ccw-BLr0QLAg.js → rotate-ccw-AB1VcvbK.js} +2 -2
  158. package/dist/standalone/assets/{rotate-ccw-BLr0QLAg.js.map → rotate-ccw-AB1VcvbK.js.map} +1 -1
  159. package/dist/standalone/assets/{save-Cd3oR3Sj.js → save-BkkrgP5Q.js} +2 -2
  160. package/dist/standalone/assets/{save-Cd3oR3Sj.js.map → save-BkkrgP5Q.js.map} +1 -1
  161. package/dist/standalone/assets/schemas-ByMQmMCS.js +65 -0
  162. package/dist/standalone/assets/schemas-ByMQmMCS.js.br +0 -0
  163. package/dist/standalone/assets/schemas-ByMQmMCS.js.gz +0 -0
  164. package/dist/standalone/assets/schemas-ByMQmMCS.js.map +1 -0
  165. package/dist/standalone/assets/select-BOe2daO9.js +2 -0
  166. package/dist/standalone/assets/select-BOe2daO9.js.br +0 -0
  167. package/dist/standalone/assets/select-BOe2daO9.js.gz +0 -0
  168. package/dist/standalone/assets/select-BOe2daO9.js.map +1 -0
  169. package/dist/standalone/assets/{send-D4KHQGYj.js → send-Bzb_4uMT.js} +2 -2
  170. package/dist/standalone/assets/{send-D4KHQGYj.js.map → send-Bzb_4uMT.js.map} +1 -1
  171. package/dist/standalone/assets/settings-page-BmphreWj.js +2 -0
  172. package/dist/standalone/assets/settings-page-BmphreWj.js.br +0 -0
  173. package/dist/standalone/assets/settings-page-BmphreWj.js.gz +0 -0
  174. package/dist/standalone/assets/{settings-page-CdIWVeh0.js.map → settings-page-BmphreWj.js.map} +1 -1
  175. package/dist/standalone/assets/show-page-CDgUXhsx.js +2 -0
  176. package/dist/standalone/assets/show-page-CDgUXhsx.js.br +0 -0
  177. package/dist/standalone/assets/show-page-CDgUXhsx.js.gz +0 -0
  178. package/dist/standalone/assets/{show-page-Dgw-9Pmn.js.map → show-page-CDgUXhsx.js.map} +1 -1
  179. package/dist/standalone/assets/{sparkles-CqF0zjrF.js → sparkles-1tT0H4n4.js} +2 -2
  180. package/dist/standalone/assets/{sparkles-CqF0zjrF.js.map → sparkles-1tT0H4n4.js.map} +1 -1
  181. package/dist/standalone/assets/{square-pen-DGT7ekeJ.js → square-pen-ZvVEwkzw.js} +2 -2
  182. package/dist/standalone/assets/{square-pen-DGT7ekeJ.js.map → square-pen-ZvVEwkzw.js.map} +1 -1
  183. package/dist/standalone/assets/table-RI-lM4fw.js +2 -0
  184. package/dist/standalone/assets/table-RI-lM4fw.js.br +1 -0
  185. package/dist/standalone/assets/table-RI-lM4fw.js.gz +0 -0
  186. package/dist/standalone/assets/{table-DzBSPeVH.js.map → table-RI-lM4fw.js.map} +1 -1
  187. package/dist/standalone/assets/tabs-Bj4gQaH2.js +2 -0
  188. package/dist/standalone/assets/tabs-Bj4gQaH2.js.br +0 -0
  189. package/dist/standalone/assets/tabs-Bj4gQaH2.js.gz +0 -0
  190. package/dist/standalone/assets/tabs-Bj4gQaH2.js.map +1 -0
  191. package/dist/standalone/assets/textarea-C2w7TG3h.js +2 -0
  192. package/dist/standalone/assets/{textarea-T25SXcrC.js.map → textarea-C2w7TG3h.js.map} +1 -1
  193. package/dist/standalone/assets/{trash-2-DhyKQCKv.js → trash-2-BIJVpWxv.js} +2 -2
  194. package/dist/standalone/assets/{trash-2-DhyKQCKv.js.map → trash-2-BIJVpWxv.js.map} +1 -1
  195. package/dist/standalone/assets/{triangle-alert-CyaaNWN8.js → triangle-alert-yljVpQCM.js} +2 -2
  196. package/dist/standalone/assets/{triangle-alert-CyaaNWN8.js.map → triangle-alert-yljVpQCM.js.map} +1 -1
  197. package/dist/standalone/assets/{undo-2-DlSB-5DM.js → undo-2-CnH3ScKE.js} +2 -2
  198. package/dist/standalone/assets/undo-2-CnH3ScKE.js.br +0 -0
  199. package/dist/standalone/assets/undo-2-CnH3ScKE.js.gz +0 -0
  200. package/dist/standalone/assets/{undo-2-DlSB-5DM.js.map → undo-2-CnH3ScKE.js.map} +1 -1
  201. package/dist/standalone/assets/{upload-BVhXhZgn.js → upload-DrfB-4bU.js} +2 -2
  202. package/dist/standalone/assets/upload-DrfB-4bU.js.br +0 -0
  203. package/dist/standalone/assets/upload-DrfB-4bU.js.gz +0 -0
  204. package/dist/standalone/assets/{upload-BVhXhZgn.js.map → upload-DrfB-4bU.js.map} +1 -1
  205. package/dist/standalone/assets/{use-dashboard-charts-aymvhXUB.js → use-dashboard-charts-D7-ctwCE.js} +2 -2
  206. package/dist/standalone/assets/use-dashboard-charts-D7-ctwCE.js.br +0 -0
  207. package/dist/standalone/assets/use-dashboard-charts-D7-ctwCE.js.gz +0 -0
  208. package/dist/standalone/assets/{use-dashboard-charts-aymvhXUB.js.map → use-dashboard-charts-D7-ctwCE.js.map} +1 -1
  209. package/dist/standalone/assets/useQueries-DNUnShBb.js +2 -0
  210. package/dist/standalone/assets/useQueries-DNUnShBb.js.br +0 -0
  211. package/dist/standalone/assets/useQueries-DNUnShBb.js.gz +0 -0
  212. package/dist/standalone/assets/useQueries-DNUnShBb.js.map +1 -0
  213. package/dist/standalone/assets/{user-directory-C33bGZdb.js → user-directory-BvmDzxsG.js} +3 -3
  214. package/dist/standalone/assets/user-directory-BvmDzxsG.js.br +0 -0
  215. package/dist/standalone/assets/user-directory-BvmDzxsG.js.gz +0 -0
  216. package/dist/standalone/assets/{user-directory-C33bGZdb.js.map → user-directory-BvmDzxsG.js.map} +1 -1
  217. package/dist/standalone/assets/{wand-sparkles-DWaFQeYS.js → wand-sparkles-DwseTI5T.js} +2 -2
  218. package/dist/standalone/assets/{wand-sparkles-DWaFQeYS.js.map → wand-sparkles-DwseTI5T.js.map} +1 -1
  219. package/dist/standalone/assets/wizard-create-page-D4a8FnmI.js +2 -0
  220. package/dist/standalone/assets/wizard-create-page-D4a8FnmI.js.br +0 -0
  221. package/dist/standalone/assets/wizard-create-page-D4a8FnmI.js.gz +0 -0
  222. package/dist/standalone/assets/{wizard-create-page-BtfveXmP.js.map → wizard-create-page-D4a8FnmI.js.map} +1 -1
  223. package/dist/standalone/assets/x-c-gfVPJa.js +2 -0
  224. package/dist/standalone/assets/{x-C3kLunD6.js.map → x-c-gfVPJa.js.map} +1 -1
  225. package/dist/standalone/assets/zap-BxPAEPtJ.js +2 -0
  226. package/dist/standalone/assets/zap-BxPAEPtJ.js.map +1 -0
  227. package/dist/standalone/assets/zod-2-ubQvxh.js +2 -0
  228. package/dist/standalone/assets/zod-2-ubQvxh.js.br +0 -0
  229. package/dist/standalone/assets/zod-2-ubQvxh.js.gz +0 -0
  230. package/dist/standalone/assets/zod-2-ubQvxh.js.map +1 -0
  231. package/dist/standalone/index.html +12 -12
  232. package/dist/standalone/index.html.br +0 -0
  233. package/dist/standalone/index.html.gz +0 -0
  234. package/package.json +21 -21
  235. package/src/vite.ts +21 -0
  236. package/dist/standalone/assets/action-component-host-QVowRL_F.js +0 -2
  237. package/dist/standalone/assets/action-component-host-QVowRL_F.js.br +0 -0
  238. package/dist/standalone/assets/action-component-host-QVowRL_F.js.gz +0 -0
  239. package/dist/standalone/assets/action-page-CET1s1MA.js.br +0 -0
  240. package/dist/standalone/assets/action-page-CET1s1MA.js.gz +0 -0
  241. package/dist/standalone/assets/ai-assistant-widget-pJHSP1PB.js +0 -2
  242. package/dist/standalone/assets/ai-assistant-widget-pJHSP1PB.js.br +0 -0
  243. package/dist/standalone/assets/ai-assistant-widget-pJHSP1PB.js.gz +0 -0
  244. package/dist/standalone/assets/arrow-left-CI9hUPwJ.js +0 -2
  245. package/dist/standalone/assets/audit-log-page-DoZPtbGo.js +0 -2
  246. package/dist/standalone/assets/audit-log-page-DoZPtbGo.js.br +0 -0
  247. package/dist/standalone/assets/audit-log-page-DoZPtbGo.js.gz +0 -0
  248. package/dist/standalone/assets/cache-page-CoKusfv-.js +0 -2
  249. package/dist/standalone/assets/cache-page-CoKusfv-.js.br +0 -0
  250. package/dist/standalone/assets/cache-page-CoKusfv-.js.gz +0 -0
  251. package/dist/standalone/assets/calendar-DDv0Qalf.js +0 -2
  252. package/dist/standalone/assets/calendar-DDv0Qalf.js.br +0 -0
  253. package/dist/standalone/assets/calendar-DDv0Qalf.js.gz +0 -0
  254. package/dist/standalone/assets/calendar-DDv0Qalf.js.map +0 -1
  255. package/dist/standalone/assets/card-MNH_XK0V.js +0 -2
  256. package/dist/standalone/assets/card-MNH_XK0V.js.br +0 -0
  257. package/dist/standalone/assets/card-MNH_XK0V.js.gz +0 -0
  258. package/dist/standalone/assets/chart-widget-R2NG5T1y.js +0 -2
  259. package/dist/standalone/assets/chart-widget-R2NG5T1y.js.br +0 -0
  260. package/dist/standalone/assets/chart-widget-R2NG5T1y.js.gz +0 -0
  261. package/dist/standalone/assets/chevrons-up-down-BHCs46XQ.js +0 -2
  262. package/dist/standalone/assets/command-Cw-hTtpk.js +0 -2
  263. package/dist/standalone/assets/command-Cw-hTtpk.js.br +0 -0
  264. package/dist/standalone/assets/command-Cw-hTtpk.js.gz +0 -0
  265. package/dist/standalone/assets/command-Cw-hTtpk.js.map +0 -1
  266. package/dist/standalone/assets/createLucideIcon-CUopU_LC.js +0 -2
  267. package/dist/standalone/assets/createLucideIcon-CUopU_LC.js.br +0 -0
  268. package/dist/standalone/assets/createLucideIcon-CUopU_LC.js.gz +0 -0
  269. package/dist/standalone/assets/createLucideIcon-CUopU_LC.js.map +0 -1
  270. package/dist/standalone/assets/date-picker-DQ4XOgO6.js +0 -2
  271. package/dist/standalone/assets/date-picker-DQ4XOgO6.js.br +0 -0
  272. package/dist/standalone/assets/date-picker-DQ4XOgO6.js.gz +0 -0
  273. package/dist/standalone/assets/dist-CmyV2PEd.js +0 -2
  274. package/dist/standalone/assets/dist-CmyV2PEd.js.br +0 -0
  275. package/dist/standalone/assets/dist-CmyV2PEd.js.gz +0 -0
  276. package/dist/standalone/assets/dist-CmyV2PEd.js.map +0 -1
  277. package/dist/standalone/assets/dist-DI9XNddW.js +0 -2
  278. package/dist/standalone/assets/dist-DI9XNddW.js.br +0 -0
  279. package/dist/standalone/assets/dist-DI9XNddW.js.gz +0 -0
  280. package/dist/standalone/assets/dist-DI9XNddW.js.map +0 -1
  281. package/dist/standalone/assets/dist-jC1pK2zN.js +0 -2
  282. package/dist/standalone/assets/dist-jC1pK2zN.js.br +0 -0
  283. package/dist/standalone/assets/dist-jC1pK2zN.js.gz +0 -0
  284. package/dist/standalone/assets/dist-jC1pK2zN.js.map +0 -1
  285. package/dist/standalone/assets/edit-page-CVjik6T5.js.br +0 -0
  286. package/dist/standalone/assets/edit-page-CVjik6T5.js.gz +0 -0
  287. package/dist/standalone/assets/empty-DcETRWsu.js +0 -2
  288. package/dist/standalone/assets/empty-DcETRWsu.js.br +0 -0
  289. package/dist/standalone/assets/empty-DcETRWsu.js.gz +0 -0
  290. package/dist/standalone/assets/empty-DcETRWsu.js.map +0 -1
  291. package/dist/standalone/assets/floating-layer-DJGCYMex.js +0 -2
  292. package/dist/standalone/assets/floating-layer-DJGCYMex.js.br +0 -0
  293. package/dist/standalone/assets/floating-layer-DJGCYMex.js.gz +0 -0
  294. package/dist/standalone/assets/floating-layer-DJGCYMex.js.map +0 -1
  295. package/dist/standalone/assets/global-search-dialog-CT30gcRv.js.br +0 -0
  296. package/dist/standalone/assets/global-search-dialog-CT30gcRv.js.gz +0 -0
  297. package/dist/standalone/assets/heavy-fields-ByzRCqe0.js +0 -181
  298. package/dist/standalone/assets/heavy-fields-ByzRCqe0.js.br +0 -0
  299. package/dist/standalone/assets/heavy-fields-ByzRCqe0.js.gz +0 -0
  300. package/dist/standalone/assets/heavy-fields-ByzRCqe0.js.map +0 -1
  301. package/dist/standalone/assets/home-page-B3WVGerG.js +0 -3
  302. package/dist/standalone/assets/home-page-B3WVGerG.js.br +0 -0
  303. package/dist/standalone/assets/home-page-B3WVGerG.js.gz +0 -0
  304. package/dist/standalone/assets/home-page-B3WVGerG.js.map +0 -1
  305. package/dist/standalone/assets/hooks-DHDUQgzs.js.br +0 -0
  306. package/dist/standalone/assets/hooks-DHDUQgzs.js.gz +0 -0
  307. package/dist/standalone/assets/hooks-DHDUQgzs.js.map +0 -1
  308. package/dist/standalone/assets/icon-registry-O7MDzgTi.js +0 -2
  309. package/dist/standalone/assets/icon-registry-O7MDzgTi.js.br +0 -0
  310. package/dist/standalone/assets/icon-registry-O7MDzgTi.js.gz +0 -0
  311. package/dist/standalone/assets/icon-registry-O7MDzgTi.js.map +0 -1
  312. package/dist/standalone/assets/index-BvESJd1R.js +0 -15
  313. package/dist/standalone/assets/index-BvESJd1R.js.br +0 -0
  314. package/dist/standalone/assets/index-BvESJd1R.js.gz +0 -0
  315. package/dist/standalone/assets/index-BvESJd1R.js.map +0 -1
  316. package/dist/standalone/assets/index-DSYyF4Ah.css +0 -2
  317. package/dist/standalone/assets/index-DSYyF4Ah.css.br +0 -0
  318. package/dist/standalone/assets/index-DSYyF4Ah.css.gz +0 -0
  319. package/dist/standalone/assets/json-editor-DJ-yNmlx.js +0 -2
  320. package/dist/standalone/assets/json-editor-DJ-yNmlx.js.br +0 -0
  321. package/dist/standalone/assets/json-editor-DJ-yNmlx.js.gz +0 -0
  322. package/dist/standalone/assets/json-editor-DJ-yNmlx.js.map +0 -1
  323. package/dist/standalone/assets/key-lbuX0yk_.js +0 -2
  324. package/dist/standalone/assets/key-lbuX0yk_.js.map +0 -1
  325. package/dist/standalone/assets/pipette-CqHYfQnn.js.br +0 -0
  326. package/dist/standalone/assets/pipette-CqHYfQnn.js.gz +0 -0
  327. package/dist/standalone/assets/plus-Dk-FzitW.js +0 -2
  328. package/dist/standalone/assets/property-renderer-DeykD9hp.js +0 -7
  329. package/dist/standalone/assets/property-renderer-DeykD9hp.js.br +0 -0
  330. package/dist/standalone/assets/property-renderer-DeykD9hp.js.gz +0 -0
  331. package/dist/standalone/assets/property-renderer-DeykD9hp.js.map +0 -1
  332. package/dist/standalone/assets/reference-BDP1QYCg.js +0 -2
  333. package/dist/standalone/assets/reference-BDP1QYCg.js.br +0 -0
  334. package/dist/standalone/assets/reference-BDP1QYCg.js.gz +0 -0
  335. package/dist/standalone/assets/refresh-cw-DHvUQTMb.js +0 -2
  336. package/dist/standalone/assets/refresh-cw-DHvUQTMb.js.map +0 -1
  337. package/dist/standalone/assets/revisions-button-CI74_D14.js +0 -2
  338. package/dist/standalone/assets/revisions-button-CI74_D14.js.br +0 -0
  339. package/dist/standalone/assets/revisions-button-CI74_D14.js.gz +0 -0
  340. package/dist/standalone/assets/richtext-render-BHGG3eKV.js +0 -67
  341. package/dist/standalone/assets/richtext-render-BHGG3eKV.js.br +0 -0
  342. package/dist/standalone/assets/richtext-render-BHGG3eKV.js.gz +0 -0
  343. package/dist/standalone/assets/richtext-render-BHGG3eKV.js.map +0 -1
  344. package/dist/standalone/assets/schemas-twnCb1uT.js +0 -65
  345. package/dist/standalone/assets/schemas-twnCb1uT.js.br +0 -0
  346. package/dist/standalone/assets/schemas-twnCb1uT.js.gz +0 -0
  347. package/dist/standalone/assets/schemas-twnCb1uT.js.map +0 -1
  348. package/dist/standalone/assets/select-BR1RMqsn.js +0 -2
  349. package/dist/standalone/assets/select-BR1RMqsn.js.br +0 -0
  350. package/dist/standalone/assets/select-BR1RMqsn.js.gz +0 -0
  351. package/dist/standalone/assets/select-BR1RMqsn.js.map +0 -1
  352. package/dist/standalone/assets/settings-page-CdIWVeh0.js +0 -2
  353. package/dist/standalone/assets/settings-page-CdIWVeh0.js.br +0 -0
  354. package/dist/standalone/assets/settings-page-CdIWVeh0.js.gz +0 -0
  355. package/dist/standalone/assets/show-page-Dgw-9Pmn.js +0 -2
  356. package/dist/standalone/assets/show-page-Dgw-9Pmn.js.br +0 -0
  357. package/dist/standalone/assets/show-page-Dgw-9Pmn.js.gz +0 -0
  358. package/dist/standalone/assets/table-DzBSPeVH.js +0 -2
  359. package/dist/standalone/assets/table-DzBSPeVH.js.br +0 -0
  360. package/dist/standalone/assets/table-DzBSPeVH.js.gz +0 -0
  361. package/dist/standalone/assets/tabs-Dr7UA219.js +0 -2
  362. package/dist/standalone/assets/tabs-Dr7UA219.js.br +0 -0
  363. package/dist/standalone/assets/tabs-Dr7UA219.js.gz +0 -0
  364. package/dist/standalone/assets/tabs-Dr7UA219.js.map +0 -1
  365. package/dist/standalone/assets/textarea-T25SXcrC.js +0 -2
  366. package/dist/standalone/assets/undo-2-DlSB-5DM.js.br +0 -0
  367. package/dist/standalone/assets/undo-2-DlSB-5DM.js.gz +0 -0
  368. package/dist/standalone/assets/upload-BVhXhZgn.js.br +0 -0
  369. package/dist/standalone/assets/upload-BVhXhZgn.js.gz +0 -0
  370. package/dist/standalone/assets/use-dashboard-charts-aymvhXUB.js.br +0 -0
  371. package/dist/standalone/assets/use-dashboard-charts-aymvhXUB.js.gz +0 -0
  372. package/dist/standalone/assets/useQueries-Dch5Ggjr.js +0 -2
  373. package/dist/standalone/assets/useQueries-Dch5Ggjr.js.br +0 -0
  374. package/dist/standalone/assets/useQueries-Dch5Ggjr.js.gz +0 -0
  375. package/dist/standalone/assets/useQueries-Dch5Ggjr.js.map +0 -1
  376. package/dist/standalone/assets/user-directory-C33bGZdb.js.br +0 -0
  377. package/dist/standalone/assets/user-directory-C33bGZdb.js.gz +0 -0
  378. package/dist/standalone/assets/value-format-CLzWct9Y.js +0 -60
  379. package/dist/standalone/assets/value-format-CLzWct9Y.js.br +0 -0
  380. package/dist/standalone/assets/value-format-CLzWct9Y.js.gz +0 -0
  381. package/dist/standalone/assets/value-format-CLzWct9Y.js.map +0 -1
  382. package/dist/standalone/assets/wizard-create-page-BtfveXmP.js +0 -2
  383. package/dist/standalone/assets/wizard-create-page-BtfveXmP.js.br +0 -0
  384. package/dist/standalone/assets/wizard-create-page-BtfveXmP.js.gz +0 -0
  385. package/dist/standalone/assets/x-C3kLunD6.js +0 -2
  386. package/dist/standalone/assets/zap-b3saQVKc.js +0 -2
  387. package/dist/standalone/assets/zap-b3saQVKc.js.map +0 -1
  388. package/dist/standalone/assets/zod-N7mHo7BX.js +0 -2
  389. package/dist/standalone/assets/zod-N7mHo7BX.js.br +0 -0
  390. package/dist/standalone/assets/zod-N7mHo7BX.js.gz +0 -0
  391. package/dist/standalone/assets/zod-N7mHo7BX.js.map +0 -1
@@ -0,0 +1 @@
1
+ {"version":3,"mappings":"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","names":["useCallback","useSyncExternalStoreWithSelector","useEffect","useLayoutEffect","useState","useMemo"],"ignoreList":[5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29,30,31,32,33,34,35,36,37,38,39,40,41,42,43,44,45,46,47,48,49,50,51,52,53,54,55],"sources":["../../../../ui/src/components/media-preview.tsx","../../../../ui/src/components/combobox.tsx","../../../../ui/src/components/key-value-editor.tsx","../../../../ui/src/components/file-input.tsx","../../../../ui/src/components/multi-file-input.tsx","../../../../../node_modules/.bun/@tanstack+react-table@9.1.2+005eabf3d8b6ef06/node_modules/@tanstack/react-table/dist/FlexRender.js","../../../../../node_modules/.bun/@tanstack+store@0.11.1/node_modules/@tanstack/store/dist/alien.js","../../../../../node_modules/.bun/@tanstack+store@0.11.1/node_modules/@tanstack/store/dist/atom.js","../../../../../node_modules/.bun/@tanstack+store@0.11.1/node_modules/@tanstack/store/dist/shallow.js","../../../../../node_modules/.bun/@tanstack+react-store@0.11.1+005eabf3d8b6ef06/node_modules/@tanstack/react-store/dist/useSelector.js","../../../../../node_modules/.bun/@tanstack+react-table@9.1.2+005eabf3d8b6ef06/node_modules/@tanstack/react-table/dist/Subscribe.js","../../../../../node_modules/.bun/@tanstack+table-core@9.1.2/node_modules/@tanstack/table-core/dist/core/reactivity/coreReactivityFeature.utils.js","../../../../../node_modules/.bun/@tanstack+table-core@9.1.2/node_modules/@tanstack/table-core/dist/core/reactivity/renderPhaseReactivity.js","../../../../../node_modules/.bun/@tanstack+react-table@9.1.2+005eabf3d8b6ef06/node_modules/@tanstack/react-table/dist/reactivity.js","../../../../../node_modules/.bun/@tanstack+table-core@9.1.2/node_modules/@tanstack/table-core/dist/utils.js","../../../../../node_modules/.bun/@tanstack+table-core@9.1.2/node_modules/@tanstack/table-core/dist/core/cells/coreCellsFeature.utils.js","../../../../../node_modules/.bun/@tanstack+table-core@9.1.2/node_modules/@tanstack/table-core/dist/core/cells/coreCellsFeature.js","../../../../../node_modules/.bun/@tanstack+table-core@9.1.2/node_modules/@tanstack/table-core/dist/core/headers/constructHeader.js","../../../../../node_modules/.bun/@tanstack+table-core@9.1.2/node_modules/@tanstack/table-core/dist/features/column-pinning/columnPinningFeature.utils.js","../../../../../node_modules/.bun/@tanstack+table-core@9.1.2/node_modules/@tanstack/table-core/dist/features/column-visibility/columnVisibilityFeature.utils.js","../../../../../node_modules/.bun/@tanstack+table-core@9.1.2/node_modules/@tanstack/table-core/dist/core/headers/buildHeaderGroups.js","../../../../../node_modules/.bun/@tanstack+table-core@9.1.2/node_modules/@tanstack/table-core/dist/core/columns/constructColumn.js","../../../../../node_modules/.bun/@tanstack+table-core@9.1.2/node_modules/@tanstack/table-core/dist/features/column-ordering/columnOrderingFeature.utils.js","../../../../../node_modules/.bun/@tanstack+table-core@9.1.2/node_modules/@tanstack/table-core/dist/core/columns/coreColumnsFeature.utils.js","../../../../../node_modules/.bun/@tanstack+table-core@9.1.2/node_modules/@tanstack/table-core/dist/core/columns/coreColumnsFeature.js","../../../../../node_modules/.bun/@tanstack+table-core@9.1.2/node_modules/@tanstack/table-core/dist/core/headers/coreHeadersFeature.utils.js","../../../../../node_modules/.bun/@tanstack+table-core@9.1.2/node_modules/@tanstack/table-core/dist/core/headers/coreHeadersFeature.js","../../../../../node_modules/.bun/@tanstack+table-core@9.1.2/node_modules/@tanstack/table-core/dist/core/rows/constructRow.js","../../../../../node_modules/.bun/@tanstack+table-core@9.1.2/node_modules/@tanstack/table-core/dist/features/row-sorting/sortFns.js","../../../../../node_modules/.bun/@tanstack+table-core@9.1.2/node_modules/@tanstack/table-core/dist/features/cell-selection/cellSelectionFeature.utils.js","../../../../../node_modules/.bun/@tanstack+table-core@9.1.2/node_modules/@tanstack/table-core/dist/features/row-expanding/rowExpandingFeature.utils.js","../../../../../node_modules/.bun/@tanstack+table-core@9.1.2/node_modules/@tanstack/table-core/dist/features/row-pagination/rowPaginationFeature.utils.js","../../../../../node_modules/.bun/@tanstack+table-core@9.1.2/node_modules/@tanstack/table-core/dist/features/row-sorting/rowSortingFeature.utils.js","../../../../../node_modules/.bun/@tanstack+table-core@9.1.2/node_modules/@tanstack/table-core/dist/core/row-models/createCoreRowModel.js","../../../../../node_modules/.bun/@tanstack+table-core@9.1.2/node_modules/@tanstack/table-core/dist/core/row-models/coreRowModelsFeature.utils.js","../../../../../node_modules/.bun/@tanstack+table-core@9.1.2/node_modules/@tanstack/table-core/dist/core/row-models/coreRowModelsFeature.js","../../../../../node_modules/.bun/@tanstack+table-core@9.1.2/node_modules/@tanstack/table-core/dist/core/cells/constructCell.js","../../../../../node_modules/.bun/@tanstack+table-core@9.1.2/node_modules/@tanstack/table-core/dist/core/rows/coreRowsFeature.utils.js","../../../../../node_modules/.bun/@tanstack+table-core@9.1.2/node_modules/@tanstack/table-core/dist/core/rows/coreRowsFeature.js","../../../../../node_modules/.bun/@tanstack+table-core@9.1.2/node_modules/@tanstack/table-core/dist/core/table/coreTablesFeature.utils.js","../../../../../node_modules/.bun/@tanstack+table-core@9.1.2/node_modules/@tanstack/table-core/dist/core/coreFeatures.js","../../../../../node_modules/.bun/@tanstack+table-core@9.1.2/node_modules/@tanstack/table-core/dist/core/table/coreTablesFeature.js","../../../../../node_modules/.bun/@tanstack+table-core@9.1.2/node_modules/@tanstack/table-core/dist/helpers/tableFeatures.js","../../../../../node_modules/.bun/@tanstack+table-core@9.1.2/node_modules/@tanstack/table-core/dist/core/table/constructTable.js","../../../../../node_modules/.bun/@tanstack+table-core@9.1.2/node_modules/@tanstack/table-core/dist/features/column-filtering/columnFilteringFeature.utils.js","../../../../../node_modules/.bun/@tanstack+table-core@9.1.2/node_modules/@tanstack/table-core/dist/features/column-filtering/columnFilteringFeature.js","../../../../../node_modules/.bun/@tanstack+table-core@9.1.2/node_modules/@tanstack/table-core/dist/features/column-sizing/columnSizingFeature.utils.js","../../../../../node_modules/.bun/@tanstack+table-core@9.1.2/node_modules/@tanstack/table-core/dist/features/column-resizing/columnResizingFeature.utils.js","../../../../../node_modules/.bun/@tanstack+table-core@9.1.2/node_modules/@tanstack/table-core/dist/features/column-resizing/columnResizingFeature.js","../../../../../node_modules/.bun/@tanstack+table-core@9.1.2/node_modules/@tanstack/table-core/dist/features/column-sizing/columnSizingFeature.js","../../../../../node_modules/.bun/@tanstack+table-core@9.1.2/node_modules/@tanstack/table-core/dist/features/column-visibility/columnVisibilityFeature.js","../../../../../node_modules/.bun/@tanstack+table-core@9.1.2/node_modules/@tanstack/table-core/dist/features/row-pagination/rowPaginationFeature.js","../../../../../node_modules/.bun/@tanstack+table-core@9.1.2/node_modules/@tanstack/table-core/dist/features/row-selection/rowSelectionFeature.utils.js","../../../../../node_modules/.bun/@tanstack+table-core@9.1.2/node_modules/@tanstack/table-core/dist/features/row-selection/rowSelectionFeature.js","../../../../../node_modules/.bun/@tanstack+table-core@9.1.2/node_modules/@tanstack/table-core/dist/features/row-sorting/rowSortingFeature.js","../../../../../node_modules/.bun/@tanstack+react-table@9.1.2+005eabf3d8b6ef06/node_modules/@tanstack/react-table/dist/useTable.js","../../../../react/src/export.ts","../../../../react/src/pages/export-dialog.tsx","../../../../react/src/pages/filter-codecs.ts","../../../../react/src/relations.ts","../../../../react/src/action-guard.ts","../../../../react/src/action-launcher.tsx","../../../../react/src/pages/list-page.tsx","../../../../react/src/components/reference-multi-table-dialog.tsx","../../../../react/src/property-renderer.tsx"],"sourcesContent":["// MediaPreview — opens a dialog with an image/video preview and a download\n// button. Used by the `previewMedia` property type to render HTTP(S) URLs to\n// remote photos/videos as a \"Preview\" button instead of raw text.\n\nimport * as React from 'react'\nimport { Download, Eye, ExternalLink, Loader2, AlertCircle } from 'lucide-react'\nimport { cn } from '../lib/utils.js'\nimport { Button } from './button.js'\nimport {\n Dialog,\n DialogContent,\n DialogDescription,\n DialogFooter,\n DialogHeader,\n DialogTitle,\n} from './dialog.js'\n\nexport type MediaKind = 'image' | 'video' | 'audio' | 'unknown'\n\nconst IMAGE_EXT = /\\.(jpe?g|png|gif|webp|avif|bmp|svg|ico|heic|heif)(\\?|#|$)/i\nconst VIDEO_EXT = /\\.(mp4|webm|mov|m4v|ogv|avi|mkv)(\\?|#|$)/i\nconst AUDIO_EXT = /\\.(mp3|wav|ogg|m4a|aac|flac)(\\?|#|$)/i\n\nexport function detectMediaKind(url: string): MediaKind {\n if (!url) return 'unknown'\n if (IMAGE_EXT.test(url)) return 'image'\n if (VIDEO_EXT.test(url)) return 'video'\n if (AUDIO_EXT.test(url)) return 'audio'\n return 'unknown'\n}\n\n/**\n * Probes the Content-Type of `url` when extension-based detection returns\n * 'unknown'. Runs only when `enabled` is true (dialog has been opened).\n *\n * Strategy:\n * 1. HEAD request — reads Content-Type header (works for same-origin or\n * CORS-enabled APIs like public avatar services).\n * 2. Image constructor fallback — handles servers that block HEAD but allow\n * img GET (bypasses CORS for image fetches by design).\n *\n * Returns [resolvedKind, isLoading].\n */\nfunction useProbeMediaKind(\n url: string,\n kindOverride: MediaKind | undefined,\n enabled: boolean,\n): [MediaKind, boolean] {\n const byExt = React.useMemo(() => detectMediaKind(url), [url])\n const [kind, setKind] = React.useState<MediaKind>(kindOverride ?? byExt)\n const [loading, setLoading] = React.useState(false)\n\n // Keep kind in sync when url or kindOverride changes (e.g. parent re-renders).\n React.useEffect(() => {\n setKind(kindOverride ?? detectMediaKind(url))\n setLoading(false)\n }, [url, kindOverride])\n\n React.useEffect(() => {\n if (!enabled) return\n if (kindOverride) return\n if (byExt !== 'unknown') return\n if (!url.startsWith('http')) return\n\n let cancelled = false\n const controller = new AbortController()\n setLoading(true)\n\n const resolve = (k: MediaKind) => {\n if (cancelled) return\n setKind(k)\n setLoading(false)\n }\n\n // Image constructor fallback — works even when HEAD is CORS-blocked.\n const tryImage = () => {\n const img = new window.Image()\n img.onload = () => resolve('image')\n img.onerror = () => resolve('unknown')\n img.src = url\n }\n\n fetch(url, { method: 'HEAD', signal: controller.signal })\n .then((res) => {\n const ct = res.headers.get('content-type') ?? ''\n if (ct.startsWith('image/')) resolve('image')\n else if (ct.startsWith('video/')) resolve('video')\n else if (ct.startsWith('audio/')) resolve('audio')\n else tryImage()\n })\n .catch(() => {\n if (!cancelled) tryImage()\n })\n\n return () => {\n cancelled = true\n controller.abort()\n }\n }, [url, kindOverride, byExt, enabled])\n\n return [kind, loading]\n}\n\nexport interface MediaPreviewProps {\n /** Media URL. Should be a fully-qualified HTTP(S) URL. */\n url: string\n /** Optional override for the auto-detected media kind. */\n kind?: MediaKind\n /** Suggested file name for the download. Falls back to URL pathname. */\n downloadName?: string\n /** Strings (already-translated) to render in the UI. */\n labels?: {\n preview?: string\n download?: string\n downloadError?: string\n openInNewTab?: string\n title?: string\n description?: string\n cannotPreview?: string\n }\n /** Show the URL as secondary text next to the trigger. */\n showUrl?: boolean\n /** Variant of the trigger button. Defaults to 'outline'. */\n triggerVariant?: 'default' | 'outline' | 'secondary' | 'ghost' | 'link'\n /** Size of the trigger button. Defaults to 'sm'. */\n triggerSize?: 'default' | 'sm' | 'lg' | 'icon'\n className?: string\n}\n\nexport function MediaPreview({\n url,\n kind: kindProp,\n downloadName,\n labels,\n showUrl = false,\n triggerVariant = 'outline',\n triggerSize = 'sm',\n className,\n}: MediaPreviewProps): React.ReactElement {\n const [open, setOpen] = React.useState(false)\n const [kind, kindLoading] = useProbeMediaKind(url, kindProp, open)\n const [downloading, setDownloading] = React.useState(false)\n const [downloadError, setDownloadError] = React.useState(false)\n\n const previewLabel = labels?.preview ?? 'Preview'\n const downloadLabel = labels?.download ?? 'Download'\n const openLabel = labels?.openInNewTab ?? 'Open in new tab'\n const titleLabel = labels?.title ?? previewLabel\n const cannotLabel = labels?.cannotPreview ?? 'Preview is unavailable for this media type.'\n\n const inferredName = React.useMemo(() => {\n if (downloadName) return downloadName\n try {\n const u = new URL(url)\n const last = u.pathname.split('/').filter(Boolean).pop()\n return last || 'download'\n } catch {\n return 'download'\n }\n }, [downloadName, url])\n\n // Force a file download via fetch → blob → blob URL. The <a download> attribute\n // is silently ignored by browsers for cross-origin URLs, so we always use the\n // blob approach. Falls back to window.open if fetch fails (e.g. no CORS).\n const handleDownload = async () => {\n setDownloadError(false)\n setDownloading(true)\n try {\n const res = await fetch(url)\n const blob = await res.blob()\n const blobUrl = URL.createObjectURL(blob)\n const a = document.createElement('a')\n a.href = blobUrl\n a.download = inferredName\n document.body.appendChild(a)\n a.click()\n document.body.removeChild(a)\n URL.revokeObjectURL(blobUrl)\n } catch {\n setDownloadError(true)\n } finally {\n setDownloading(false)\n }\n }\n\n // Stop click propagation so that events from the Dialog portal (which bubble\n // through the React component tree, not the DOM) do not reach parent row\n // click handlers and trigger unintended navigation (e.g. list-page TableRow\n // opening edit on backdrop/dialog click).\n const stopClick = (e: React.MouseEvent) => e.stopPropagation()\n\n return (\n <div className={cn('inline-flex items-center gap-2', className)} onClick={stopClick}>\n <Button\n type=\"button\"\n variant={triggerVariant}\n size={triggerSize}\n onClick={() => setOpen(true)}\n disabled={!url}\n >\n <Eye className=\"size-4\" />\n <span>{previewLabel}</span>\n </Button>\n\n {showUrl && url ? (\n <span\n className=\"max-w-[24rem] truncate text-xs text-muted-foreground\"\n title={url}\n >\n {url}\n </span>\n ) : null}\n\n <Dialog open={open} onOpenChange={setOpen}>\n <DialogContent className=\"max-w-3xl\">\n <DialogHeader>\n <DialogTitle>{titleLabel}</DialogTitle>\n {labels?.description ? (\n <DialogDescription>{labels.description}</DialogDescription>\n ) : (\n <DialogDescription className=\"break-all text-xs\">{url}</DialogDescription>\n )}\n </DialogHeader>\n\n <div className=\"flex max-h-[70vh] items-center justify-center overflow-auto rounded-md border border-border bg-muted/30 p-2\">\n {kindLoading ? (\n <Loader2 className=\"size-8 animate-spin text-muted-foreground\" />\n ) : kind === 'image' ? (\n <img\n src={url}\n alt={inferredName}\n className=\"max-h-[68vh] w-auto max-w-full object-contain\"\n />\n ) : kind === 'video' ? (\n <video\n src={url}\n controls\n className=\"max-h-[68vh] w-full max-w-full\"\n />\n ) : kind === 'audio' ? (\n <audio src={url} controls className=\"w-full\" />\n ) : (\n <div className=\"p-6 text-center text-sm text-muted-foreground\">\n {cannotLabel}\n </div>\n )}\n </div>\n\n <DialogFooter>\n {downloadError && (\n <span className=\"flex items-center gap-1.5 text-xs text-destructive\">\n <AlertCircle className=\"size-3.5\" />\n {labels?.downloadError ?? 'Download failed'}\n </span>\n )}\n <Button asChild variant=\"ghost\" size=\"sm\">\n <a href={url} target=\"_blank\" rel=\"noopener noreferrer\">\n <ExternalLink className=\"size-4\" />\n <span>{openLabel}</span>\n </a>\n </Button>\n <Button\n variant=\"default\"\n size=\"sm\"\n disabled={downloading}\n onClick={() => { void handleDownload() }}\n >\n {downloading\n ? <Loader2 className=\"size-4 animate-spin\" />\n : <Download className=\"size-4\" />}\n <span>{downloadLabel}</span>\n </Button>\n </DialogFooter>\n </DialogContent>\n </Dialog>\n </div>\n )\n}\n","// Combobox — free-text autocomplete input.\n//\n// Distinct from `ReferenceCombobox` (in @modern-admin/react) which strictly\n// constrains the value to an existing referenced record. This primitive is\n// permissive: the user may type any string, and the suggestion list is\n// purely advisory. Suggestions can be:\n// • static (declared per field, e.g. enum-like hints), or\n// • dynamic (loaded by the parent — e.g. distinct values pulled from a\n// resource's column). The component itself is i18n-unaware and does\n// no fetching: callers feed `suggestions` and toggle `loading`.\n//\n// Behaviour:\n// • The input is fully controlled (`value` / `onChange`).\n// • Suggestions filter as you type: case-insensitive substring match\n// against label and value.\n// • Down/Up cycle highlight; Enter commits the highlighted item or\n// keeps the typed value if none is highlighted.\n// • Escape closes the panel; click-outside closes it (handled by Radix\n// Popover). Selecting an item sets the input value and closes.\n//\n// Mobile-first: the panel matches the input width via the\n// `--radix-popover-trigger-width` CSS var.\n//\n// i18n: optional `labels` prop with English defaults. The React layer is\n// expected to translate and feed them in.\n\nimport * as React from 'react'\nimport { ChevronDown, Loader2 } from 'lucide-react'\nimport { cn } from '../lib/utils.js'\nimport { Input } from './input.js'\nimport {\n Popover,\n PopoverAnchor,\n PopoverContent,\n} from './popover.js'\n\n/** Each suggestion may be a bare string (used as both value + label) or\n * an explicit `{ value, label }` pair. */\nexport type ComboboxSuggestion = string | { value: string; label: string }\n\nexport interface ComboboxLabels {\n /** Shown while `loading` is true and the panel is open. Default: 'Loading…'. */\n loading?: string\n /**\n * Shown when the panel is open, the user has typed something, but no\n * suggestion matches. Default: 'No matches — press Enter to keep what\n * you typed.' Use `{value}` to interpolate the current input value.\n */\n noMatches?: string\n /** Visually-hidden trigger label for screen readers. Default: 'Toggle suggestions'. */\n toggleSuggestions?: string\n}\n\nexport interface ComboboxProps {\n /** Current input value. */\n value: string\n /** Called on every keystroke and on suggestion pick. */\n onChange(next: string): void\n /** Called when the input loses focus (after the picker closes). */\n onBlur?(): void\n /** Static or pre-loaded suggestion list. May change while `loading`. */\n suggestions?: ReadonlyArray<ComboboxSuggestion>\n /** When true and the panel is open, render a small spinner. */\n loading?: boolean\n /** Disables the input and prevents the panel from opening. */\n disabled?: boolean\n placeholder?: string\n /** Forwarded to the `<input>` for accessibility (paired with a `<label>`). */\n id?: string\n 'aria-label'?: string\n className?: string\n /**\n * Maximum suggestions to render after filtering. Default: 50. Keeps the\n * panel snappy when callers pass thousands of distinct values.\n */\n maxItems?: number\n labels?: ComboboxLabels\n}\n\nconst defaultLabels: Required<ComboboxLabels> = {\n loading: 'Loading…',\n noMatches: 'No matches — press Enter to keep \"{value}\".',\n toggleSuggestions: 'Toggle suggestions',\n}\n\n/** Normalise a `ComboboxSuggestion` into `{ value, label }`. */\nconst normalise = (s: ComboboxSuggestion): { value: string; label: string } =>\n typeof s === 'string' ? { value: s, label: s } : s\n\n/** Case-insensitive substring match on label OR value. */\nconst matchesQuery = (\n s: { value: string; label: string },\n q: string,\n): boolean => {\n if (!q) return true\n const needle = q.toLowerCase()\n return (\n s.label.toLowerCase().includes(needle) ||\n s.value.toLowerCase().includes(needle)\n )\n}\n\nexport function Combobox({\n value,\n onChange,\n onBlur,\n suggestions,\n loading,\n disabled,\n placeholder,\n id,\n 'aria-label': ariaLabel,\n className,\n maxItems = 50,\n labels,\n}: ComboboxProps): React.ReactElement {\n const l = { ...defaultLabels, ...labels }\n const [focused, setFocused] = React.useState(false)\n const [highlight, setHighlight] = React.useState(0)\n\n const items = React.useMemo(() => {\n const all = (suggestions ?? []).map(normalise)\n return all.filter((s) => matchesQuery(s, value)).slice(0, maxItems)\n }, [suggestions, value, maxItems])\n\n // Reset highlight whenever the filtered set changes — otherwise the\n // index can point past the end after typing a more specific query.\n React.useEffect(() => {\n setHighlight(0)\n }, [items.length])\n\n // Open whenever the input is focused AND there's something to show\n // (either matching items or a loading spinner). Empty + non-loading =\n // no panel, so the component degrades to a plain input.\n const open =\n !disabled && focused && (items.length > 0 || Boolean(loading))\n\n const commit = (s: { value: string; label: string }): void => {\n onChange(s.value)\n setFocused(false)\n }\n\n const handleKeyDown = (e: React.KeyboardEvent<HTMLInputElement>): void => {\n if (!open) return\n if (e.key === 'ArrowDown') {\n e.preventDefault()\n setHighlight((h) => Math.min(h + 1, items.length - 1))\n } else if (e.key === 'ArrowUp') {\n e.preventDefault()\n setHighlight((h) => Math.max(h - 1, 0))\n } else if (e.key === 'Enter') {\n const picked = items[highlight]\n if (picked) {\n e.preventDefault()\n commit(picked)\n }\n } else if (e.key === 'Escape') {\n setFocused(false)\n }\n }\n\n return (\n <Popover open={open}>\n <PopoverAnchor asChild>\n <div className={cn('relative', className)}>\n <Input\n id={id}\n type=\"text\"\n value={value}\n placeholder={placeholder}\n disabled={disabled}\n aria-label={ariaLabel}\n aria-autocomplete=\"list\"\n aria-expanded={open}\n autoComplete=\"off\"\n className=\"pr-8\"\n onFocus={() => setFocused(true)}\n onBlur={() => {\n // Defer so a click on a suggestion (which fires after blur)\n // can still commit before we close the panel.\n setTimeout(() => {\n setFocused(false)\n onBlur?.()\n }, 120)\n }}\n onChange={(e) => onChange(e.target.value)}\n onKeyDown={handleKeyDown}\n />\n {/* Trailing affordance: spinner while loading, otherwise a chevron\n hint that suggestions exist. Pure decoration — focusing the\n input is what opens the panel. */}\n <span\n aria-hidden=\"true\"\n className=\"pointer-events-none absolute inset-y-0 right-2 flex items-center text-muted-foreground\"\n >\n {loading ? (\n <Loader2 className=\"size-4 animate-spin\" />\n ) : (\n <ChevronDown className=\"size-4 opacity-50\" />\n )}\n </span>\n </div>\n </PopoverAnchor>\n <PopoverContent\n align=\"start\"\n sideOffset={4}\n // Prevent Radix from stealing focus from the input when the panel\n // opens — otherwise typing would move focus to the popover root.\n onOpenAutoFocus={(e) => e.preventDefault()}\n // Allow clicks inside the panel without closing the popover before\n // the click handler on the option fires.\n onInteractOutside={(e) => {\n // The blur handler closes the panel; nothing more to do here.\n // Preventing the default keeps Radix from re-toggling internal state.\n e.preventDefault()\n }}\n className=\"flex max-h-[var(--radix-popover-content-available-height)] w-[var(--radix-popover-trigger-width)] flex-col p-1\"\n >\n {loading && items.length === 0 ? (\n <div className=\"px-2 py-2 text-sm text-muted-foreground\">\n {l.loading}\n </div>\n ) : items.length === 0 ? (\n <div className=\"px-2 py-2 text-sm text-muted-foreground\">\n {l.noMatches.replace('{value}', value)}\n </div>\n ) : (\n <ul role=\"listbox\" className=\"max-h-60 min-h-0 overflow-y-auto overscroll-contain\">\n {items.map((s, i) => {\n const active = i === highlight\n return (\n <li\n key={s.value}\n role=\"option\"\n aria-selected={active}\n // Use mousedown (fires before input blur) so the click\n // commits the value before the panel closes.\n onMouseDown={(e) => {\n e.preventDefault()\n commit(s)\n }}\n onMouseEnter={() => setHighlight(i)}\n className={cn(\n 'cursor-pointer rounded-sm px-2 py-1.5 text-sm',\n active\n ? 'bg-accent text-accent-foreground'\n : 'text-foreground',\n )}\n >\n <span className=\"truncate\">{s.label}</span>\n {s.label !== s.value ? (\n <span className=\"ml-2 text-xs text-muted-foreground\">\n {s.value}\n </span>\n ) : null}\n </li>\n )\n })}\n </ul>\n )}\n </PopoverContent>\n </Popover>\n )\n}\n","// KeyValueEditor + KeyValueView — a friendly alternative to JsonEditor for\n// JSON columns with a *fixed* set of keys.\n//\n// Instead of showing the raw JSON (`{ \"locale\": \"en\", \"featured\": true }`)\n// the editor renders one row per declared key, each with a normal form\n// input typed appropriately (string, number, boolean, textarea, select).\n// No braces, no quotes, no parse errors — the user just edits the values.\n//\n// The component is i18n-unaware: it accepts an optional `labels` prop with\n// English fallbacks so it works standalone in tests/Storybook. The\n// `packages/react` layer translates and feeds them in.\n//\n// Mobile-first: each row stacks label-above-input on narrow screens and\n// switches to a two-column label/input layout from `sm:` upwards.\n\nimport * as React from 'react'\nimport { cn } from '../lib/utils.js'\nimport { Input } from './input.js'\nimport { Textarea } from './textarea.js'\nimport { Switch } from './switch.js'\nimport {\n Select,\n SelectContent,\n SelectItem,\n SelectTrigger,\n SelectValue,\n} from './select.js'\nimport { Combobox, type ComboboxLabels, type ComboboxSuggestion } from './combobox.js'\nimport { InfoTooltip } from './info-tooltip.js'\n\n/** Built-in editor types. Resource code may pass a string; unknown values\n * fall back to a plain string input. */\nexport type KeyValueFieldType =\n | 'string'\n | 'number'\n | 'boolean'\n | 'textarea'\n | 'select'\n | 'autocomplete'\n\n/** One declared key inside the JSON object. */\nexport interface KeyValueFieldSpec {\n /** JSON key on the underlying object. */\n key: string\n /** Visible label. Defaults to the key. */\n label?: string\n /** Editor kind. Default: `'string'`. */\n type?: KeyValueFieldType\n /** Helper text shown under the input. */\n description?: string\n /** Placeholder for text/number inputs. */\n placeholder?: string\n /** Visual `*` marker; required-ness is enforced by the form layer. */\n isRequired?: boolean\n /**\n * Enum source for `type: 'select'` and static suggestions for\n * `type: 'autocomplete'`. Either a list of strings (used both as value\n * and label) or `{ value, label }` objects.\n */\n availableValues?: ReadonlyArray<string | { value: string; label: string }>\n /**\n * For `type: 'autocomplete'`: pull dynamic suggestions from the named\n * field of records of another resource (e.g. `users.email`). Resolved\n * by the `packages/react` layer before render — KeyValueEditor itself\n * never fetches, the loaded values arrive via `suggestionsByKey`.\n */\n suggestionsResource?: string\n /** Path of the field on `suggestionsResource` to project. */\n suggestionsField?: string\n}\n\n/** English-default labels surfaced through `labels` for i18n. */\nexport interface KeyValueEditorLabels {\n /** Placeholder shown in the empty `select` slot. Default: '—'. */\n emptyOption?: string\n /** Visually-hidden / fallback label suffix when a row has no `label`. */\n fieldLabelFallback?: (key: string) => string\n /** Forwarded to the inner `Combobox` for autocomplete fields. */\n combobox?: ComboboxLabels\n}\n\nexport interface KeyValueEditorProps {\n /** Declared key set. Order is preserved on screen. */\n fields: ReadonlyArray<KeyValueFieldSpec>\n /** Current value. Anything that is not a plain object is treated as `{}`. */\n value: unknown\n /** Emits a fresh JSON object on every change. */\n onChange(next: Record<string, unknown>): void\n onBlur?(): void\n disabled?: boolean\n className?: string\n labels?: KeyValueEditorLabels\n /**\n * Pre-loaded suggestions per autocomplete field, keyed by `field.key`.\n * The editor stays i18n-/network-unaware: callers (e.g. the React\n * property renderer) load values from the database and feed them in.\n */\n suggestionsByKey?: Readonly<Record<string, ReadonlyArray<ComboboxSuggestion>>>\n /** Per-key loading flags to render a spinner while suggestions stream in. */\n suggestionsLoadingByKey?: Readonly<Record<string, boolean>>\n}\n\nconst defaultLabels: Required<Omit<KeyValueEditorLabels, 'combobox'>> &\n Pick<KeyValueEditorLabels, 'combobox'> = {\n emptyOption: '—',\n fieldLabelFallback: (key) => key,\n }\n\nconst toRecord = (value: unknown): Record<string, unknown> => {\n if (value && typeof value === 'object' && !Array.isArray(value)) {\n return value as Record<string, unknown>\n }\n return {}\n}\n\nconst normaliseAvailableValues = (\n raw: KeyValueFieldSpec['availableValues'],\n): Array<{ value: string; label: string }> => {\n if (!raw) return []\n return raw.map((v) => (typeof v === 'string' ? { value: v, label: v } : v))\n}\n\nconst SENTINEL_EMPTY = '__kv_empty__'\n\nexport function KeyValueEditor({\n fields,\n value,\n onChange,\n onBlur,\n disabled,\n className,\n labels,\n suggestionsByKey,\n suggestionsLoadingByKey,\n}: KeyValueEditorProps): React.ReactElement {\n const l = { ...defaultLabels, ...labels }\n const obj = toRecord(value)\n\n // Replace `key` with `next` and emit a brand-new object so callers using\n // referential equality (e.g. RHF) detect the change.\n const set = (key: string, next: unknown): void => {\n const out: Record<string, unknown> = { ...obj }\n if (next === null || next === undefined) {\n delete out[key]\n } else {\n out[key] = next\n }\n onChange(out)\n }\n\n return (\n <div\n className={cn(\n 'divide-y divide-border rounded-md border border-border bg-card',\n className,\n )}\n >\n {fields.map((f) => {\n const fieldType: KeyValueFieldType = f.type ?? 'string'\n const label = f.label ?? l.fieldLabelFallback(f.key)\n const inputId = `kv-${f.key}`\n const raw = obj[f.key]\n\n let control: React.ReactElement\n if (fieldType === 'boolean') {\n control = (\n <Switch\n id={inputId}\n checked={Boolean(raw)}\n onCheckedChange={(v) => set(f.key, Boolean(v))}\n disabled={disabled}\n aria-label={label}\n />\n )\n } else if (fieldType === 'number') {\n control = (\n <Input\n id={inputId}\n type=\"number\"\n inputMode=\"decimal\"\n value={raw == null ? '' : String(raw)}\n placeholder={f.placeholder}\n disabled={disabled}\n onBlur={onBlur}\n onChange={(e) => {\n const v = e.target.value\n if (v === '') return set(f.key, null)\n const n = Number(v)\n set(f.key, Number.isFinite(n) ? n : v)\n }}\n aria-label={label}\n />\n )\n } else if (fieldType === 'textarea') {\n control = (\n <Textarea\n id={inputId}\n value={raw == null ? '' : String(raw)}\n placeholder={f.placeholder}\n disabled={disabled}\n onBlur={onBlur}\n onChange={(e) =>\n set(f.key, e.target.value === '' ? null : e.target.value)\n }\n rows={3}\n aria-label={label}\n />\n )\n } else if (fieldType === 'select') {\n const opts = normaliseAvailableValues(f.availableValues)\n const current = raw == null || raw === '' ? SENTINEL_EMPTY : String(raw)\n control = (\n <Select\n value={current}\n onValueChange={(v) => set(f.key, v === SENTINEL_EMPTY ? null : v)}\n disabled={disabled}\n >\n <SelectTrigger id={inputId} aria-label={label}>\n <SelectValue placeholder={l.emptyOption} />\n </SelectTrigger>\n <SelectContent>\n <SelectItem value={SENTINEL_EMPTY}>{l.emptyOption}</SelectItem>\n {opts.map((opt) => (\n <SelectItem key={opt.value} value={opt.value}>\n {opt.label}\n </SelectItem>\n ))}\n </SelectContent>\n </Select>\n )\n } else if (fieldType === 'autocomplete') {\n // Combine static `availableValues` declared on the field with\n // any dynamic values pre-loaded by the parent (e.g. distinct\n // values from a DB column). Dedupe by `value` so a static hint\n // and a DB row that share a value collapse to a single item.\n const fromStatic = normaliseAvailableValues(f.availableValues)\n const fromDynamic = suggestionsByKey?.[f.key] ?? []\n const seen = new Set<string>()\n const merged: ComboboxSuggestion[] = []\n for (const s of [...fromStatic, ...fromDynamic]) {\n const v = typeof s === 'string' ? s : s.value\n if (seen.has(v)) continue\n seen.add(v)\n merged.push(s)\n }\n control = (\n <Combobox\n id={inputId}\n value={raw == null ? '' : String(raw)}\n onChange={(v) => set(f.key, v === '' ? null : v)}\n onBlur={onBlur}\n suggestions={merged}\n loading={suggestionsLoadingByKey?.[f.key]}\n disabled={disabled}\n placeholder={f.placeholder}\n aria-label={label}\n labels={labels?.combobox}\n />\n )\n } else {\n // string (default)\n control = (\n <Input\n id={inputId}\n type=\"text\"\n value={raw == null ? '' : String(raw)}\n placeholder={f.placeholder}\n disabled={disabled}\n onBlur={onBlur}\n onChange={(e) =>\n set(f.key, e.target.value === '' ? null : e.target.value)\n }\n aria-label={label}\n />\n )\n }\n\n return (\n <div\n key={f.key}\n className=\"flex flex-col gap-1.5 p-3 sm:flex-row sm:items-start sm:gap-4\"\n >\n <label\n htmlFor={inputId}\n className=\"flex shrink-0 items-center gap-1 text-sm font-medium text-foreground sm:w-44 sm:pt-2\"\n >\n <span className=\"truncate\">{label}</span>\n {f.description ? (\n <InfoTooltip content={f.description} ariaLabel={f.description} />\n ) : null}\n {f.isRequired ? (\n <span aria-hidden=\"true\" className=\"text-destructive\">\n *\n </span>\n ) : null}\n </label>\n <div className=\"min-w-0 flex-1\">\n {control}\n </div>\n </div>\n )\n })}\n </div>\n )\n}\n\n// ─── Read-only view ──────────────────────────────────────────────────────────\n\nexport interface KeyValueViewLabels {\n /** Placeholder for missing values. Default: '—'. */\n emptyValue?: string\n /** Field label fallback when a spec entry has no `label`. */\n fieldLabelFallback?: (key: string) => string\n /** Boolean true label. Default: 'Yes'. */\n trueLabel?: string\n /** Boolean false label. Default: 'No'. */\n falseLabel?: string\n}\n\nexport interface KeyValueViewProps {\n fields: ReadonlyArray<KeyValueFieldSpec>\n value: unknown\n className?: string\n /**\n * `'inline'` collapses all fields into a single comma-separated row used\n * by the list view. `'block'` (default) renders a vertical key/value\n * table for the show view.\n */\n variant?: 'inline' | 'block'\n labels?: KeyValueViewLabels\n}\n\nconst defaultViewLabels: Required<KeyValueViewLabels> = {\n emptyValue: '—',\n fieldLabelFallback: (key) => key,\n trueLabel: 'Yes',\n falseLabel: 'No',\n}\n\nconst stringifyDisplay = (\n raw: unknown,\n field: KeyValueFieldSpec,\n l: Required<KeyValueViewLabels>,\n): string => {\n if (raw == null || raw === '') return l.emptyValue\n if (field.type === 'boolean') return raw ? l.trueLabel : l.falseLabel\n if (\n (field.type === 'select' || field.type === 'autocomplete') &&\n field.availableValues\n ) {\n const opts = normaliseAvailableValues(field.availableValues)\n const match = opts.find((o) => o.value === String(raw))\n return match?.label ?? String(raw)\n }\n if (typeof raw === 'object') {\n try {\n return JSON.stringify(raw)\n } catch {\n return String(raw)\n }\n }\n return String(raw)\n}\n\nexport function KeyValueView({\n fields,\n value,\n className,\n variant = 'block',\n labels,\n}: KeyValueViewProps): React.ReactElement {\n const l = { ...defaultViewLabels, ...labels }\n const obj = toRecord(value)\n\n if (variant === 'inline') {\n const parts = fields\n .map((f) => {\n const raw = obj[f.key]\n if (raw == null || raw === '') return null\n const label = f.label ?? l.fieldLabelFallback(f.key)\n return `${label}: ${stringifyDisplay(raw, f, l)}`\n })\n .filter((s): s is string => s !== null)\n return (\n <span\n className={cn(\n 'line-clamp-1 max-w-[24rem] truncate text-xs text-muted-foreground',\n className,\n )}\n title={parts.join(', ') || undefined}\n >\n {parts.length > 0 ? parts.join(', ') : l.emptyValue}\n </span>\n )\n }\n\n return (\n <dl\n className={cn(\n 'divide-y divide-border rounded-md border border-border bg-muted/30 text-sm',\n className,\n )}\n >\n {fields.map((f) => {\n const label = f.label ?? l.fieldLabelFallback(f.key)\n const text = stringifyDisplay(obj[f.key], f, l)\n return (\n <div\n key={f.key}\n className=\"flex flex-col gap-0.5 p-3 sm:flex-row sm:items-baseline sm:gap-4\"\n >\n <dt className=\"shrink-0 text-xs font-medium uppercase tracking-wide text-muted-foreground sm:w-44\">\n {label}\n </dt>\n <dd className=\"min-w-0 flex-1 break-words text-foreground\">\n {text}\n </dd>\n </div>\n )\n })}\n </dl>\n )\n}\n","/**\n * FileInput — styled file picker with optional drag-and-drop, current-file\n * display, and a remove button. Purely presentational: upload logic lives in\n * the `packages/react` property renderer.\n *\n * Mobile-first: full-width by default, tap-friendly hit areas.\n */\n\nimport * as React from 'react'\nimport { Upload, X, FileText, Loader2 } from 'lucide-react'\nimport { cn } from '../lib/utils.js'\nimport { Button } from './button.js'\n\nexport interface FileInputLabels {\n /** Dropzone aria-label. Default: \"Choose file\". */\n chooseFile?: string\n /** Drop zone hint before the link. Default: \"Drag and drop or\". */\n dragAndDrop?: string\n /** Link text when no file selected. Default: \"choose a file\". */\n chooseAFile?: string\n /** Upload spinner text (no filename). Default: \"Uploading…\". */\n uploading?: string\n /** Upload spinner text with filename — `{name}` is replaced. Default: \"Uploading {name}…\". */\n uploadingFile?: string\n /** Remove button aria-label. Default: \"Remove file\". */\n removeFile?: string\n}\n\nexport interface FileInputProps {\n /** Current stored value (storage key or URL). Shown as the \"current file\". */\n value?: string | null\n /** Human-readable display name for the current file. Falls back to `value`. */\n displayName?: string | null\n /** Public URL used for image thumbnail previews. */\n previewUrl?: string | null\n /** HTML `accept` attribute (e.g. `'image/*'` or `'.pdf,.docx'`). */\n accept?: string\n /** Whether a file is currently being uploaded. Shows a spinner. */\n uploading?: boolean\n /** Upload progress 0–100 (overrides the spinner with a determinate bar when set). */\n uploadProgress?: number\n /** Local file name shown next to the progress indicator. */\n uploadingName?: string\n /** Upload error message. */\n error?: string\n disabled?: boolean\n className?: string\n /** Translated UI labels. All optional — English strings are the defaults. */\n labels?: FileInputLabels\n /** Called when the user picks a new file. */\n onFileSelect: (file: File) => void\n /** Called when the user removes the current file. */\n onRemove?: () => void\n}\n\nexport function FileInput({\n value,\n displayName,\n previewUrl,\n accept,\n uploading = false,\n uploadProgress,\n uploadingName,\n error,\n disabled = false,\n className,\n labels,\n onFileSelect,\n onRemove,\n}: FileInputProps): React.ReactElement {\n const l = {\n chooseFile: labels?.chooseFile ?? 'Choose file',\n dragAndDrop: labels?.dragAndDrop ?? 'Drag and drop or',\n chooseAFile: labels?.chooseAFile ?? 'choose a file',\n uploading: labels?.uploading ?? 'Uploading…',\n uploadingFile: labels?.uploadingFile ?? 'Uploading {name}…',\n removeFile: labels?.removeFile ?? 'Remove file',\n }\n const inputRef = React.useRef<HTMLInputElement>(null)\n const [isDragging, setIsDragging] = React.useState(false)\n\n const handleFiles = (files: FileList | null) => {\n const first = files?.[0]\n if (!first || disabled || uploading) return\n onFileSelect(first)\n }\n\n const handleInputChange = (e: React.ChangeEvent<HTMLInputElement>) =>\n handleFiles(e.target.files)\n\n const handleDrop = (e: React.DragEvent<HTMLDivElement>) => {\n e.preventDefault()\n setIsDragging(false)\n handleFiles(e.dataTransfer.files)\n }\n\n const handleDragOver = (e: React.DragEvent<HTMLDivElement>) => {\n e.preventDefault()\n if (!disabled && !uploading) setIsDragging(true)\n }\n\n const handleDragLeave = () => setIsDragging(false)\n\n const label = displayName || (value ? value.split('/').pop() : null)\n\n // Detect image for thumbnail preview\n const isImage =\n previewUrl\n ? /\\.(jpe?g|png|gif|webp|avif|svg|bmp)(\\?|$)/i.test(previewUrl)\n : false\n\n return (\n <div className={cn('w-full space-y-2', className)}>\n {/* Drop zone / trigger */}\n <div\n role=\"button\"\n tabIndex={disabled ? -1 : 0}\n aria-label={l.chooseFile}\n onClick={() => !disabled && !uploading && inputRef.current?.click()}\n onKeyDown={(e) => {\n if ((e.key === 'Enter' || e.key === ' ') && !disabled && !uploading) {\n e.preventDefault()\n inputRef.current?.click()\n }\n }}\n onDrop={handleDrop}\n onDragOver={handleDragOver}\n onDragLeave={handleDragLeave}\n className={cn(\n 'flex min-h-[5rem] w-full cursor-pointer flex-col items-center justify-center gap-2 rounded-md border-2 border-dashed border-border bg-muted/30 px-4 py-6 text-center transition-colors',\n 'hover:border-primary/50 hover:bg-muted/50 focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring',\n isDragging && 'border-primary bg-primary/5',\n (disabled || uploading) && 'cursor-not-allowed opacity-60',\n )}\n >\n {uploading ? (\n <div className=\"flex w-full max-w-sm flex-col items-center gap-2\">\n <div className=\"flex items-center gap-2 text-sm text-muted-foreground\">\n <Loader2 className=\"size-5 animate-spin\" />\n <span className=\"truncate\" title={uploadingName ?? undefined}>\n {uploadingName\n ? l.uploadingFile.replace('{name}', uploadingName)\n : l.uploading}\n </span>\n </div>\n {uploadProgress != null && (\n <div className=\"flex w-full items-center gap-2\">\n <div\n className=\"h-1.5 flex-1 overflow-hidden rounded-full bg-muted\"\n role=\"progressbar\"\n aria-valuemin={0}\n aria-valuemax={100}\n aria-valuenow={uploadProgress}\n >\n <div\n className=\"h-full rounded-full bg-primary transition-[width] duration-150 ease-out\"\n style={{ width: `${uploadProgress}%` }}\n />\n </div>\n <span className=\"w-10 shrink-0 text-right text-xs tabular-nums text-muted-foreground\">\n {uploadProgress}%\n </span>\n </div>\n )}\n </div>\n ) : (\n <>\n <Upload className=\"size-6 text-muted-foreground\" />\n <span className=\"text-sm font-medium text-foreground\">\n <span className=\"hidden sm:inline\">{l.dragAndDrop} </span>\n <span className=\"text-primary underline-offset-2 hover:underline\">\n {l.chooseAFile}\n </span>\n </span>\n {accept && (\n <span className=\"text-xs text-muted-foreground\">{accept}</span>\n )}\n </>\n )}\n </div>\n\n {/* Current file row */}\n {value && !uploading && (\n <div className=\"flex items-center gap-2 rounded-md border border-border bg-background px-3 py-2\">\n {isImage && previewUrl ? (\n <img\n src={previewUrl}\n alt={label ?? 'preview'}\n className=\"size-10 shrink-0 rounded object-cover\"\n />\n ) : (\n <FileText className=\"size-5 shrink-0 text-muted-foreground\" />\n )}\n <span className=\"min-w-0 flex-1 truncate text-sm text-foreground\" title={label ?? value}>\n {label ?? value}\n </span>\n {onRemove && !disabled && (\n <Button\n type=\"button\"\n variant=\"ghost\"\n size=\"icon\"\n className=\"size-7 shrink-0 text-muted-foreground hover:text-destructive\"\n aria-label={l.removeFile}\n onClick={(e) => {\n e.stopPropagation()\n onRemove()\n }}\n >\n <X className=\"size-4\" />\n </Button>\n )}\n </div>\n )}\n\n {/* Error message */}\n {error && (\n <p className=\"text-sm text-destructive\">{error}</p>\n )}\n\n {/* Hidden native input */}\n <input\n ref={inputRef}\n type=\"file\"\n accept={accept}\n className=\"sr-only\"\n onChange={handleInputChange}\n disabled={disabled || uploading}\n tabIndex={-1}\n aria-hidden\n />\n </div>\n )\n}\n","/**\n * MultiFileInput — drag-and-drop file picker that accepts multiple files at\n * once and renders a list of currently-attached files with per-file remove\n * controls. Mirrors `FileInput` but works on an array of values.\n *\n * Purely presentational — upload + cancel logic lives in the\n * `packages/react` property renderer.\n */\n\nimport * as React from 'react'\nimport { Upload, X, FileText, Loader2 } from 'lucide-react'\nimport { cn } from '../lib/utils.js'\nimport { Button } from './button.js'\n\nexport interface MultiFileInputItem {\n /** Storage key (or URL). */\n value: string\n /** Optional public URL used for image thumbnails. */\n previewUrl?: string | null\n /** Optional display name. Falls back to the last path segment of `value`. */\n displayName?: string | null\n}\n\n/** In-progress upload — rendered as a separate row with progress / error. */\nexport interface MultiFileInputPendingItem {\n /** Stable identifier for the pending row (e.g. `crypto.randomUUID()`). */\n id: string\n /** Display name (typically the local file name). */\n name: string\n /** 0–100. `undefined` while the request is queued or finished. */\n progress?: number\n /** Status text — when present, replaces the progress bar. */\n status?: 'queued' | 'uploading' | 'error'\n /** Error message to render when `status === 'error'`. */\n error?: string\n}\n\nexport interface MultiFileInputLabels {\n /** Dropzone aria-label. Default: \"Choose files\". */\n chooseFiles?: string\n /** Drop zone hint before the link. Default: \"Drag and drop or\". */\n dragAndDrop?: string\n /** Link text when no files selected. Default: \"choose files\". */\n chooseLink?: string\n /** Link text when files already exist. Default: \"add more files\". */\n addMoreLink?: string\n /** Upload spinner text. Default: \"Uploading…\". */\n uploading?: string\n /** Remove button aria-label. Default: \"Remove file\". */\n removeFile?: string\n /** Fallback error when pending item has no message. Default: \"Upload failed\". */\n uploadFailed?: string\n /** Dismiss error button aria-label. Default: \"Dismiss\". */\n dismiss?: string\n}\n\nexport interface MultiFileInputProps {\n /** Currently attached files. */\n items: ReadonlyArray<MultiFileInputItem>\n /** Files currently being uploaded — rendered below the persisted list. */\n pendingItems?: ReadonlyArray<MultiFileInputPendingItem>\n /** HTML `accept` attribute (e.g. `'image/*'` or `'.pdf,.docx'`). */\n accept?: string\n /**\n * Whether files are currently being uploaded. Shows a spinner in the\n * dropzone. Ignored when `pendingItems` is non-empty (the per-item\n * progress rows take over the role of the dropzone spinner).\n */\n uploading?: boolean\n /** Upload error message. */\n error?: string\n disabled?: boolean\n className?: string\n /** Translated UI labels. All optional — English strings are the defaults. */\n labels?: MultiFileInputLabels\n /** Called when the user picks one or more new files. */\n onFilesSelect: (files: File[]) => void\n /** Called when the user removes the file at the given index. */\n onRemove: (index: number) => void\n /** Called when the user dismisses an errored pending item. */\n onPendingDismiss?: (id: string) => void\n}\n\nconst isImageUrl = (url: string | null | undefined): boolean =>\n !!url && /\\.(jpe?g|png|gif|webp|avif|svg|bmp)(\\?|$)/i.test(url)\n\nexport function MultiFileInput({\n items,\n pendingItems,\n accept,\n uploading = false,\n error,\n disabled = false,\n className,\n labels,\n onFilesSelect,\n onRemove,\n onPendingDismiss,\n}: MultiFileInputProps): React.ReactElement {\n const l = {\n chooseFiles: labels?.chooseFiles ?? 'Choose files',\n dragAndDrop: labels?.dragAndDrop ?? 'Drag and drop or',\n chooseLink: labels?.chooseLink ?? 'choose files',\n addMoreLink: labels?.addMoreLink ?? 'add more files',\n uploading: labels?.uploading ?? 'Uploading…',\n removeFile: labels?.removeFile ?? 'Remove file',\n uploadFailed: labels?.uploadFailed ?? 'Upload failed',\n dismiss: labels?.dismiss ?? 'Dismiss',\n }\n const inputRef = React.useRef<HTMLInputElement>(null)\n const [isDragging, setIsDragging] = React.useState(false)\n const hasPending = (pendingItems?.length ?? 0) > 0\n // The dropzone spinner is redundant when individual progress rows are\n // already on screen — only show it for batch uploads that don't supply\n // per-item progress.\n const showSpinner = uploading && !hasPending\n\n const handleFiles = (files: FileList | null): void => {\n if (!files || files.length === 0 || disabled) return\n onFilesSelect(Array.from(files))\n }\n\n const handleInputChange = (e: React.ChangeEvent<HTMLInputElement>): void => {\n handleFiles(e.target.files)\n // Allow re-selecting the same file again immediately after removing it.\n e.target.value = ''\n }\n\n const handleDrop = (e: React.DragEvent<HTMLDivElement>): void => {\n e.preventDefault()\n setIsDragging(false)\n handleFiles(e.dataTransfer.files)\n }\n\n const handleDragOver = (e: React.DragEvent<HTMLDivElement>): void => {\n e.preventDefault()\n if (!disabled) setIsDragging(true)\n }\n\n const handleDragLeave = (): void => setIsDragging(false)\n\n return (\n <div className={cn('w-full space-y-2', className)}>\n {/* Drop zone / trigger */}\n <div\n role=\"button\"\n tabIndex={disabled ? -1 : 0}\n aria-label={l.chooseFiles}\n onClick={() => !disabled && inputRef.current?.click()}\n onKeyDown={(e) => {\n if ((e.key === 'Enter' || e.key === ' ') && !disabled) {\n e.preventDefault()\n inputRef.current?.click()\n }\n }}\n onDrop={handleDrop}\n onDragOver={handleDragOver}\n onDragLeave={handleDragLeave}\n className={cn(\n 'flex min-h-[5rem] w-full cursor-pointer flex-col items-center justify-center gap-2 rounded-md border-2 border-dashed border-border bg-muted/30 px-4 py-6 text-center transition-colors',\n 'hover:border-primary/50 hover:bg-muted/50 focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring',\n isDragging && 'border-primary bg-primary/5',\n disabled && 'cursor-not-allowed opacity-60',\n )}\n >\n {showSpinner ? (\n <>\n <Loader2 className=\"size-6 animate-spin text-muted-foreground\" />\n <span className=\"text-sm text-muted-foreground\">{l.uploading}</span>\n </>\n ) : (\n <>\n <Upload className=\"size-6 text-muted-foreground\" />\n <span className=\"text-sm font-medium text-foreground\">\n <span className=\"hidden sm:inline\">{l.dragAndDrop} </span>\n <span className=\"text-primary underline-offset-2 hover:underline\">\n {items.length > 0 ? l.addMoreLink : l.chooseLink}\n </span>\n </span>\n {accept && (\n <span className=\"text-xs text-muted-foreground\">{accept}</span>\n )}\n </>\n )}\n </div>\n\n {/* Current file list */}\n {items.length > 0 && (\n <ul className=\"space-y-1\">\n {items.map((item, idx) => {\n const label = item.displayName || (item.value ? item.value.split('/').pop() : null)\n const showImage = isImageUrl(item.previewUrl)\n return (\n <li\n key={`${item.value}-${idx}`}\n className=\"flex items-center gap-2 rounded-md border border-border bg-background px-3 py-2\"\n >\n {showImage && item.previewUrl ? (\n <img\n src={item.previewUrl}\n alt={label ?? 'preview'}\n className=\"size-10 shrink-0 rounded object-cover\"\n />\n ) : (\n <FileText className=\"size-5 shrink-0 text-muted-foreground\" />\n )}\n <span\n className=\"min-w-0 flex-1 truncate text-sm text-foreground\"\n title={label ?? item.value}\n >\n {label ?? item.value}\n </span>\n {!disabled && (\n <Button\n type=\"button\"\n variant=\"ghost\"\n size=\"icon\"\n className=\"size-7 shrink-0 text-muted-foreground hover:text-destructive\"\n aria-label={l.removeFile}\n onClick={(e) => {\n e.stopPropagation()\n onRemove(idx)\n }}\n >\n <X className=\"size-4\" />\n </Button>\n )}\n </li>\n )\n })}\n </ul>\n )}\n\n {/* In-progress uploads */}\n {hasPending && (\n <ul className=\"space-y-1\">\n {pendingItems!.map((p) => (\n <li\n key={p.id}\n className={cn(\n 'flex items-center gap-3 rounded-md border bg-background px-3 py-2',\n p.status === 'error' ? 'border-destructive/50' : 'border-border',\n )}\n >\n {p.status === 'error' ? (\n <FileText className=\"size-5 shrink-0 text-destructive\" />\n ) : (\n <Loader2 className=\"size-5 shrink-0 animate-spin text-muted-foreground\" />\n )}\n <div className=\"min-w-0 flex-1\">\n <div className=\"truncate text-sm text-foreground\" title={p.name}>\n {p.name}\n </div>\n {p.status === 'error' ? (\n <div className=\"text-xs text-destructive\" role=\"alert\">\n {p.error || l.uploadFailed}\n </div>\n ) : (\n <div className=\"mt-1 flex items-center gap-2\">\n <div\n className=\"h-1.5 flex-1 overflow-hidden rounded-full bg-muted\"\n role=\"progressbar\"\n aria-valuemin={0}\n aria-valuemax={100}\n aria-valuenow={p.progress ?? 0}\n >\n <div\n className=\"h-full rounded-full bg-primary transition-[width] duration-150 ease-out\"\n style={{ width: `${p.progress ?? 0}%` }}\n />\n </div>\n <span className=\"w-10 shrink-0 text-right text-xs tabular-nums text-muted-foreground\">\n {p.progress != null ? `${p.progress}%` : '…'}\n </span>\n </div>\n )}\n </div>\n {p.status === 'error' && onPendingDismiss && (\n <Button\n type=\"button\"\n variant=\"ghost\"\n size=\"icon\"\n className=\"size-7 shrink-0 text-muted-foreground hover:text-destructive\"\n aria-label={l.dismiss}\n onClick={(e) => {\n e.stopPropagation()\n onPendingDismiss(p.id)\n }}\n >\n <X className=\"size-4\" />\n </Button>\n )}\n </li>\n ))}\n </ul>\n )}\n\n {/* Error message */}\n {error && <p className=\"text-sm text-destructive\">{error}</p>}\n\n {/* Hidden native input */}\n <input\n ref={inputRef}\n type=\"file\"\n accept={accept}\n multiple\n className=\"sr-only\"\n onChange={handleInputChange}\n disabled={disabled}\n tabIndex={-1}\n aria-hidden\n />\n </div>\n )\n}\n","import React from \"react\";\n\n//#region src/FlexRender.tsx\nfunction isReactComponent(component) {\n\treturn isClassComponent(component) || typeof component === \"function\" || isExoticComponent(component);\n}\nfunction isClassComponent(component) {\n\treturn typeof component === \"function\" && (() => {\n\t\tconst proto = Object.getPrototypeOf(component);\n\t\treturn proto.prototype && proto.prototype.isReactComponent;\n\t})();\n}\nfunction isExoticComponent(component) {\n\treturn typeof component === \"object\" && typeof component.$$typeof === \"symbol\" && [\"react.memo\", \"react.forward_ref\"].includes(component.$$typeof.description);\n}\n/**\n* If rendering headers, cells, or footers with custom markup, use flexRender instead of `cell.getValue()` or `cell.renderValue()`.\n* @example flexRender(cell.column.columnDef.cell, cell.getContext())\n*/\nfunction flexRender(Comp, props) {\n\tif (Comp === null || Comp === void 0) return null;\n\treturn isReactComponent(Comp) ? /* @__PURE__ */ React.createElement(Comp, props) : Comp;\n}\n/**\n* Simplified component wrapper of `flexRender`. Use this utility component to render headers, cells, or footers with custom markup.\n* Only one prop (`cell`, `header`, or `footer`) may be passed.\n* @example\n* ```tsx\n* <FlexRender cell={cell} />\n* <FlexRender header={header} />\n* <FlexRender footer={footer} />\n* ```\n*\n* This replaces calling `flexRender` directly like this:\n* ```tsx\n* flexRender(cell.column.columnDef.cell, cell.getContext())\n* flexRender(header.column.columnDef.header, header.getContext())\n* flexRender(footer.column.columnDef.footer, footer.getContext())\n* ```\n*/\nfunction FlexRender(props) {\n\tif (\"cell\" in props && props.cell) {\n\t\tconst cell = props.cell;\n\t\tconst def = cell.column.columnDef;\n\t\tconst groupingCell = cell;\n\t\tconst groupingDef = def;\n\t\tif (groupingCell.getIsAggregated?.()) return flexRender(groupingDef.aggregatedCell ?? def.cell, cell.getContext());\n\t\tif (groupingCell.getIsPlaceholder?.()) return null;\n\t\treturn flexRender(def.cell, cell.getContext());\n\t}\n\tif (\"header\" in props && props.header) return flexRender(props.header.column.columnDef.header, props.header.getContext());\n\tif (\"footer\" in props && props.footer) return flexRender(props.footer.column.columnDef.footer, props.footer.getContext());\n\treturn null;\n}\n\n//#endregion\nexport { FlexRender, flexRender };","//#region src/alien.ts\nconst NONE = 0;\nconst MUTABLE = 1;\nconst WATCHING = 2;\nconst RECURSED_CHECK = 4;\nconst RECURSED = 8;\nconst DIRTY = 16;\nconst PENDING = 32;\n/* @__NO_SIDE_EFFECTS__ */\nfunction createReactiveSystem({ update, notify, unwatched }) {\n\treturn {\n\t\tlink,\n\t\tunlink,\n\t\tpropagate,\n\t\tcheckDirty,\n\t\tshallowPropagate\n\t};\n\tfunction link(dep, sub, version) {\n\t\tconst prevDep = sub.depsTail;\n\t\tif (prevDep !== void 0 && prevDep.dep === dep) return;\n\t\tconst nextDep = prevDep !== void 0 ? prevDep.nextDep : sub.deps;\n\t\tif (nextDep !== void 0 && nextDep.dep === dep) {\n\t\t\tnextDep.version = version;\n\t\t\tsub.depsTail = nextDep;\n\t\t\treturn;\n\t\t}\n\t\tconst prevSub = dep.subsTail;\n\t\tif (prevSub !== void 0 && prevSub.version === version && prevSub.sub === sub) return;\n\t\tconst newLink = sub.depsTail = dep.subsTail = {\n\t\t\tversion,\n\t\t\tdep,\n\t\t\tsub,\n\t\t\tprevDep,\n\t\t\tnextDep,\n\t\t\tprevSub,\n\t\t\tnextSub: void 0\n\t\t};\n\t\tif (nextDep !== void 0) nextDep.prevDep = newLink;\n\t\tif (prevDep !== void 0) prevDep.nextDep = newLink;\n\t\telse sub.deps = newLink;\n\t\tif (prevSub !== void 0) prevSub.nextSub = newLink;\n\t\telse dep.subs = newLink;\n\t}\n\tfunction unlink(link, sub = link.sub) {\n\t\tconst dep = link.dep;\n\t\tconst prevDep = link.prevDep;\n\t\tconst nextDep = link.nextDep;\n\t\tconst nextSub = link.nextSub;\n\t\tconst prevSub = link.prevSub;\n\t\tif (nextDep !== void 0) nextDep.prevDep = prevDep;\n\t\telse sub.depsTail = prevDep;\n\t\tif (prevDep !== void 0) prevDep.nextDep = nextDep;\n\t\telse sub.deps = nextDep;\n\t\tif (nextSub !== void 0) nextSub.prevSub = prevSub;\n\t\telse dep.subsTail = prevSub;\n\t\tif (prevSub !== void 0) prevSub.nextSub = nextSub;\n\t\telse if ((dep.subs = nextSub) === void 0) unwatched(dep);\n\t\treturn nextDep;\n\t}\n\tfunction propagate(link) {\n\t\tlet next = link.nextSub;\n\t\tlet stack;\n\t\ttop: do {\n\t\t\tconst sub = link.sub;\n\t\t\tlet flags = sub.flags;\n\t\t\tif (!(flags & 60)) sub.flags = flags | 32;\n\t\t\telse if (!(flags & (4 | 8))) flags = 0;\n\t\t\telse if (!(flags & 4)) sub.flags = flags & ~8 | 32;\n\t\t\telse if (!(flags & (16 | 32)) && isValidLink(link, sub)) {\n\t\t\t\tsub.flags = flags | (8 | 32);\n\t\t\t\tflags &= 1;\n\t\t\t} else flags = 0;\n\t\t\tif (flags & 2) notify(sub);\n\t\t\tif (flags & 1) {\n\t\t\t\tconst subSubs = sub.subs;\n\t\t\t\tif (subSubs !== void 0) {\n\t\t\t\t\tconst nextSub = (link = subSubs).nextSub;\n\t\t\t\t\tif (nextSub !== void 0) {\n\t\t\t\t\t\tstack = {\n\t\t\t\t\t\t\tvalue: next,\n\t\t\t\t\t\t\tprev: stack\n\t\t\t\t\t\t};\n\t\t\t\t\t\tnext = nextSub;\n\t\t\t\t\t}\n\t\t\t\t\tcontinue;\n\t\t\t\t}\n\t\t\t}\n\t\t\tif ((link = next) !== void 0) {\n\t\t\t\tnext = link.nextSub;\n\t\t\t\tcontinue;\n\t\t\t}\n\t\t\twhile (stack !== void 0) {\n\t\t\t\tlink = stack.value;\n\t\t\t\tstack = stack.prev;\n\t\t\t\tif (link !== void 0) {\n\t\t\t\t\tnext = link.nextSub;\n\t\t\t\t\tcontinue top;\n\t\t\t\t}\n\t\t\t}\n\t\t\tbreak;\n\t\t} while (true);\n\t}\n\tfunction checkDirty(link, sub) {\n\t\tlet stack;\n\t\tlet checkDepth = 0;\n\t\tlet dirty = false;\n\t\ttop: do {\n\t\t\tconst dep = link.dep;\n\t\t\tconst flags = dep.flags;\n\t\t\tif (sub.flags & 16) dirty = true;\n\t\t\telse if ((flags & (1 | 16)) === (1 | 16)) {\n\t\t\t\tif (update(dep)) {\n\t\t\t\t\tconst subs = dep.subs;\n\t\t\t\t\tif (subs.nextSub !== void 0) shallowPropagate(subs);\n\t\t\t\t\tdirty = true;\n\t\t\t\t}\n\t\t\t} else if ((flags & (1 | 32)) === (1 | 32)) {\n\t\t\t\tif (link.nextSub !== void 0 || link.prevSub !== void 0) stack = {\n\t\t\t\t\tvalue: link,\n\t\t\t\t\tprev: stack\n\t\t\t\t};\n\t\t\t\tlink = dep.deps;\n\t\t\t\tsub = dep;\n\t\t\t\t++checkDepth;\n\t\t\t\tcontinue;\n\t\t\t}\n\t\t\tif (!dirty) {\n\t\t\t\tconst nextDep = link.nextDep;\n\t\t\t\tif (nextDep !== void 0) {\n\t\t\t\t\tlink = nextDep;\n\t\t\t\t\tcontinue;\n\t\t\t\t}\n\t\t\t}\n\t\t\twhile (checkDepth--) {\n\t\t\t\tconst firstSub = sub.subs;\n\t\t\t\tconst hasMultipleSubs = firstSub.nextSub !== void 0;\n\t\t\t\tif (hasMultipleSubs) {\n\t\t\t\t\tlink = stack.value;\n\t\t\t\t\tstack = stack.prev;\n\t\t\t\t} else link = firstSub;\n\t\t\t\tif (dirty) {\n\t\t\t\t\tif (update(sub)) {\n\t\t\t\t\t\tif (hasMultipleSubs) shallowPropagate(firstSub);\n\t\t\t\t\t\tsub = link.sub;\n\t\t\t\t\t\tcontinue;\n\t\t\t\t\t}\n\t\t\t\t\tdirty = false;\n\t\t\t\t} else sub.flags &= ~32;\n\t\t\t\tsub = link.sub;\n\t\t\t\tconst nextDep = link.nextDep;\n\t\t\t\tif (nextDep !== void 0) {\n\t\t\t\t\tlink = nextDep;\n\t\t\t\t\tcontinue top;\n\t\t\t\t}\n\t\t\t}\n\t\t\treturn dirty;\n\t\t} while (true);\n\t}\n\tfunction shallowPropagate(link) {\n\t\tdo {\n\t\t\tconst sub = link.sub;\n\t\t\tconst flags = sub.flags;\n\t\t\tif ((flags & (32 | 16)) === 32) {\n\t\t\t\tsub.flags = flags | 16;\n\t\t\t\tif ((flags & (2 | 4)) === 2) notify(sub);\n\t\t\t}\n\t\t} while ((link = link.nextSub) !== void 0);\n\t}\n\tfunction isValidLink(checkLink, sub) {\n\t\tlet link = sub.depsTail;\n\t\twhile (link !== void 0) {\n\t\t\tif (link === checkLink) return true;\n\t\t\tlink = link.prevDep;\n\t\t}\n\t\treturn false;\n\t}\n}\n\n//#endregion\nexport { createReactiveSystem };\n//# sourceMappingURL=alien.js.map","import { createReactiveSystem } from \"./alien.js\";\n\n//#region src/atom.ts\nfunction toObserver(nextHandler, errorHandler, completionHandler) {\n\tconst isObserver = typeof nextHandler === \"object\";\n\tconst self = isObserver ? nextHandler : void 0;\n\treturn {\n\t\tnext: (isObserver ? nextHandler.next : nextHandler)?.bind(self),\n\t\terror: (isObserver ? nextHandler.error : errorHandler)?.bind(self),\n\t\tcomplete: (isObserver ? nextHandler.complete : completionHandler)?.bind(self)\n\t};\n}\nconst queuedEffects = [];\nlet cycle = 0;\nconst { link, unlink, propagate, checkDirty, shallowPropagate } = /* @__PURE__ */ createReactiveSystem({\n\tupdate(atom) {\n\t\treturn atom._update();\n\t},\n\tnotify(effect) {\n\t\tqueuedEffects[queuedEffectsLength++] = effect;\n\t\teffect.flags &= ~2;\n\t},\n\tunwatched(atom) {\n\t\tif (atom.depsTail !== void 0) {\n\t\t\tatom.depsTail = void 0;\n\t\t\tatom.flags = 1 | 16;\n\t\t\tpurgeDeps(atom);\n\t\t}\n\t}\n});\nlet notifyIndex = 0;\nlet queuedEffectsLength = 0;\nlet activeSub;\nlet batchDepth = 0;\nfunction batch(fn) {\n\ttry {\n\t\t++batchDepth;\n\t\tfn();\n\t} finally {\n\t\tif (!--batchDepth) flush();\n\t}\n}\nfunction purgeDeps(sub) {\n\tconst depsTail = sub.depsTail;\n\tlet dep = depsTail !== void 0 ? depsTail.nextDep : sub.deps;\n\twhile (dep !== void 0) dep = unlink(dep, sub);\n}\nfunction flush() {\n\tif (batchDepth > 0) return;\n\twhile (notifyIndex < queuedEffectsLength) {\n\t\tconst effect = queuedEffects[notifyIndex];\n\t\tqueuedEffects[notifyIndex++] = void 0;\n\t\teffect.notify();\n\t}\n\tnotifyIndex = 0;\n\tqueuedEffectsLength = 0;\n}\nfunction createAsyncAtom(getValue, options) {\n\tconst ref = {};\n\tconst atom = createAtom(() => {\n\t\tgetValue().then((data) => {\n\t\t\tconst internalAtom = ref.current;\n\t\t\tif (internalAtom._update({\n\t\t\t\tstatus: \"done\",\n\t\t\t\tdata\n\t\t\t})) {\n\t\t\t\tconst subs = internalAtom.subs;\n\t\t\t\tif (subs !== void 0) {\n\t\t\t\t\tpropagate(subs);\n\t\t\t\t\tshallowPropagate(subs);\n\t\t\t\t\tflush();\n\t\t\t\t}\n\t\t\t}\n\t\t}, (error) => {\n\t\t\tconst internalAtom = ref.current;\n\t\t\tif (internalAtom._update({\n\t\t\t\tstatus: \"error\",\n\t\t\t\terror\n\t\t\t})) {\n\t\t\t\tconst subs = internalAtom.subs;\n\t\t\t\tif (subs !== void 0) {\n\t\t\t\t\tpropagate(subs);\n\t\t\t\t\tshallowPropagate(subs);\n\t\t\t\t\tflush();\n\t\t\t\t}\n\t\t\t}\n\t\t});\n\t\treturn { status: \"pending\" };\n\t}, options);\n\tref.current = atom;\n\treturn atom;\n}\nfunction createAtom(valueOrFn, options) {\n\tconst isComputed = typeof valueOrFn === \"function\";\n\tconst getter = valueOrFn;\n\tconst atom = {\n\t\t_snapshot: isComputed ? void 0 : valueOrFn,\n\t\tsubs: void 0,\n\t\tsubsTail: void 0,\n\t\tdeps: void 0,\n\t\tdepsTail: void 0,\n\t\tflags: isComputed ? 0 : 1,\n\t\tget() {\n\t\t\tif (activeSub !== void 0) link(atom, activeSub, cycle);\n\t\t\treturn atom._snapshot;\n\t\t},\n\t\tsubscribe(observerOrFn) {\n\t\t\tconst obs = toObserver(observerOrFn);\n\t\t\tconst observed = { current: false };\n\t\t\tconst e = effect(() => {\n\t\t\t\tatom.get();\n\t\t\t\tif (!observed.current) observed.current = true;\n\t\t\t\telse obs.next?.(atom._snapshot);\n\t\t\t});\n\t\t\treturn { unsubscribe: () => {\n\t\t\t\te.stop();\n\t\t\t} };\n\t\t},\n\t\t_update(getValue) {\n\t\t\tconst prevSub = activeSub;\n\t\t\tconst compare = options?.compare ?? Object.is;\n\t\t\tif (isComputed) {\n\t\t\t\tactiveSub = atom;\n\t\t\t\t++cycle;\n\t\t\t\tatom.depsTail = void 0;\n\t\t\t} else if (getValue === void 0) return false;\n\t\t\tif (isComputed) atom.flags = 1 | 4;\n\t\t\ttry {\n\t\t\t\tconst oldValue = atom._snapshot;\n\t\t\t\tconst newValue = typeof getValue === \"function\" ? getValue(oldValue) : getValue === void 0 && isComputed ? getter(oldValue) : getValue;\n\t\t\t\tif (oldValue === void 0 || !compare(oldValue, newValue)) {\n\t\t\t\t\tatom._snapshot = newValue;\n\t\t\t\t\treturn true;\n\t\t\t\t}\n\t\t\t\treturn false;\n\t\t\t} finally {\n\t\t\t\tactiveSub = prevSub;\n\t\t\t\tif (isComputed) atom.flags &= ~4;\n\t\t\t\tpurgeDeps(atom);\n\t\t\t}\n\t\t}\n\t};\n\tif (isComputed) {\n\t\tatom.flags = 1 | 16;\n\t\tatom.get = function() {\n\t\t\tconst flags = atom.flags;\n\t\t\tif (flags & 16 || flags & 32 && checkDirty(atom.deps, atom)) {\n\t\t\t\tif (atom._update()) {\n\t\t\t\t\tconst subs = atom.subs;\n\t\t\t\t\tif (subs !== void 0) shallowPropagate(subs);\n\t\t\t\t}\n\t\t\t} else if (flags & 32) atom.flags = flags & ~32;\n\t\t\tif (activeSub !== void 0) link(atom, activeSub, cycle);\n\t\t\treturn atom._snapshot;\n\t\t};\n\t} else atom.set = function(valueOrFn) {\n\t\tif (atom._update(valueOrFn)) {\n\t\t\tconst subs = atom.subs;\n\t\t\tif (subs !== void 0) {\n\t\t\t\tpropagate(subs);\n\t\t\t\tshallowPropagate(subs);\n\t\t\t\tflush();\n\t\t\t}\n\t\t}\n\t};\n\treturn atom;\n}\nfunction effect(fn) {\n\tconst run = () => {\n\t\tconst prevSub = activeSub;\n\t\tactiveSub = effectObj;\n\t\t++cycle;\n\t\teffectObj.depsTail = void 0;\n\t\teffectObj.flags = 2 | 4;\n\t\ttry {\n\t\t\treturn fn();\n\t\t} finally {\n\t\t\tactiveSub = prevSub;\n\t\t\teffectObj.flags &= ~4;\n\t\t\tpurgeDeps(effectObj);\n\t\t}\n\t};\n\tconst effectObj = {\n\t\tdeps: void 0,\n\t\tdepsTail: void 0,\n\t\tsubs: void 0,\n\t\tsubsTail: void 0,\n\t\tflags: 2 | 4,\n\t\tnotify() {\n\t\t\tconst flags = this.flags;\n\t\t\tif (flags & 16 || flags & 32 && checkDirty(this.deps, this)) run();\n\t\t\telse this.flags = 2;\n\t\t},\n\t\tstop() {\n\t\t\tthis.flags = 0;\n\t\t\tthis.depsTail = void 0;\n\t\t\tpurgeDeps(this);\n\t\t}\n\t};\n\trun();\n\treturn effectObj;\n}\n\n//#endregion\nexport { batch, createAsyncAtom, createAtom, flush, toObserver };\n//# sourceMappingURL=atom.js.map","//#region src/shallow.ts\nfunction shallow(objA, objB) {\n\tif (Object.is(objA, objB)) return true;\n\tif (typeof objA !== \"object\" || objA === null || typeof objB !== \"object\" || objB === null) return false;\n\tif (objA instanceof Map && objB instanceof Map) {\n\t\tif (objA.size !== objB.size) return false;\n\t\tfor (const [k, v] of objA) if (!objB.has(k) || !Object.is(v, objB.get(k))) return false;\n\t\treturn true;\n\t}\n\tif (objA instanceof Set && objB instanceof Set) {\n\t\tif (objA.size !== objB.size) return false;\n\t\tfor (const v of objA) if (!objB.has(v)) return false;\n\t\treturn true;\n\t}\n\tif (objA instanceof Date && objB instanceof Date) {\n\t\tif (objA.getTime() !== objB.getTime()) return false;\n\t\treturn true;\n\t}\n\tconst keysA = getOwnKeys(objA);\n\tif (keysA.length !== getOwnKeys(objB).length) return false;\n\tfor (let i = 0; i < keysA.length; i++) if (!Object.prototype.hasOwnProperty.call(objB, keysA[i]) || !Object.is(objA[keysA[i]], objB[keysA[i]])) return false;\n\treturn true;\n}\nfunction getOwnKeys(obj) {\n\treturn Object.keys(obj).concat(Object.getOwnPropertySymbols(obj));\n}\n\n//#endregion\nexport { shallow };\n//# sourceMappingURL=shallow.js.map","import { useCallback } from \"react\";\nimport { useSyncExternalStoreWithSelector } from \"use-sync-external-store/shim/with-selector\";\n\n//#region src/useSelector.ts\nfunction defaultCompare(a, b) {\n\treturn a === b;\n}\n/**\n* Selects a slice of state from an atom or store and subscribes the component\n* to that selection.\n*\n* This is the primary React read hook for TanStack Store. It works with any\n* source that exposes `get()` and `subscribe()`, including atoms, readonly\n* atoms, stores, and readonly stores.\n*\n* Omit the selector to subscribe to the whole value.\n*\n* @example\n* ```tsx\n* const count = useSelector(counterStore, (state) => state.count)\n* ```\n*\n* @example\n* ```tsx\n* const value = useSelector(countAtom)\n* ```\n*/\nfunction useSelector(source, selector = (s) => s, options) {\n\tconst compare = options?.compare ?? defaultCompare;\n\tconst subscribe = useCallback((handleStoreChange) => {\n\t\tconst { unsubscribe } = source.subscribe(handleStoreChange);\n\t\treturn unsubscribe;\n\t}, [source]);\n\tconst getSnapshot = useCallback(() => source.get(), [source]);\n\treturn useSyncExternalStoreWithSelector(subscribe, getSnapshot, getSnapshot, selector, compare);\n}\n\n//#endregion\nexport { useSelector };\n//# sourceMappingURL=useSelector.js.map","'use client';\n\nimport { shallow, useSelector } from \"@tanstack/react-store\";\n\n//#region src/Subscribe.ts\nfunction Subscribe(props) {\n\tconst selected = useSelector(props.source, props.selector, { compare: shallow });\n\treturn typeof props.children === \"function\" ? props.children(selected) : props.children;\n}\n\n//#endregion\nexport { Subscribe };","//#region src/core/reactivity/coreReactivityFeature.utils.ts\n/**\n* Bridges atom instances to the `Store`/`ReadonlyStore` API by exposing\n* a `state` getter backed by `atom.get()`, and wiring `setState` for\n* writable atoms.\n*\n* @example\n* ```ts\n* const store = atomToStore(atom)\n* ```\n*/\nfunction atomToStore(atom) {\n\tconst store = atom;\n\tObject.defineProperty(atom, \"state\", { get() {\n\t\treturn atom.get();\n\t} });\n\tif (\"set\" in atom) store.setState = atom.set.bind(atom);\n\treturn store;\n}\n\n//#endregion\nexport { atomToStore };","//#region src/core/reactivity/renderPhaseReactivity.ts\n/**\n* Creates reactivity bindings for render-phase adapters (React, Preact, Lit):\n* frameworks with plain, non-reactive options that are re-synchronized during\n* component render, where store notifications must not fire until the host\n* commits.\n*\n* Readonly atoms are exposed as live facades. `get()` re-evaluates the\n* resolver against the options of the render in progress — a normal computed\n* cannot know that plain `options.state` changed — and caches the result\n* through the configured comparator so external-store consumers (e.g. React's\n* `useSyncExternalStore`) see referentially stable snapshots. `subscribe()`\n* goes through a hidden computed that tracks the resolver's real atom\n* dependencies plus a commit version, so subscribers are invalidated by\n* actual reactive writes and by the adapter's post-commit publication.\n*\n* @example\n* ```ts\n* import { batch, createAtom } from '@tanstack/react-store'\n*\n* export const reactReactivity = () =>\n* renderPhaseReactivity({ createAtom, batch })\n* ```\n*/\nfunction renderPhaseReactivity(primitives) {\n\tconst { createAtom, batch } = primitives;\n\tconst commitAtom = createAtom(0);\n\treturn {\n\t\tcreateOptionsStore: false,\n\t\twrapExternalAtoms: false,\n\t\taddSubscription: () => {\n\t\t\tthrow new Error(\"Feature not supported in current reactivity implementation\");\n\t\t},\n\t\tunmount: () => {\n\t\t\tthrow new Error(\"Feature not supported in current reactivity implementation\");\n\t\t},\n\t\tschedule: primitives.schedule ?? ((fn) => queueMicrotask(fn)),\n\t\tbatch,\n\t\tuntrack: (fn) => fn(),\n\t\tcreateReadonlyAtom: (fn, atomOptions) => {\n\t\t\tconst compare = atomOptions?.compare ?? Object.is;\n\t\t\tlet hasSnapshot = false;\n\t\t\tlet snapshot;\n\t\t\tconst getSnapshot = () => {\n\t\t\t\tconst nextSnapshot = fn();\n\t\t\t\tif (!hasSnapshot || !compare(snapshot, nextSnapshot)) {\n\t\t\t\t\tsnapshot = nextSnapshot;\n\t\t\t\t\thasSnapshot = true;\n\t\t\t\t}\n\t\t\t\treturn snapshot;\n\t\t\t};\n\t\t\tconst reactiveAtom = createAtom(() => {\n\t\t\t\tcommitAtom.get();\n\t\t\t\treturn getSnapshot();\n\t\t\t}, { compare });\n\t\t\treturn {\n\t\t\t\tget: getSnapshot,\n\t\t\t\tsubscribe: reactiveAtom.subscribe.bind(reactiveAtom)\n\t\t\t};\n\t\t},\n\t\tcreateWritableAtom: (value, atomOptions) => {\n\t\t\treturn createAtom(value, { compare: atomOptions?.compare });\n\t\t},\n\t\tcommit: () => {\n\t\t\tcommitAtom.set((version) => version + 1);\n\t\t}\n\t};\n}\n/**\n* Creates a render-phase source with an explicit commit baseline.\n*\n* Render-phase adapters publish controlled state after the host framework\n* commits so isolated subscribers update, but the component that owns the\n* table already rendered that exact snapshot — forwarding the notification to\n* its root subscription would produce a redundant render. Unlike a last-read\n* filter, speculative reads do not change notification behavior: only\n* `markCommitted()` advances the baseline.\n*/\nfunction createRenderPhaseSource(source, compare = Object.is) {\n\tlet hasCommittedSnapshot = false;\n\tlet committedSnapshot;\n\treturn {\n\t\tget: source.get,\n\t\tmarkCommitted: (snapshot) => {\n\t\t\tcommittedSnapshot = snapshot;\n\t\t\thasCommittedSnapshot = true;\n\t\t},\n\t\tsubscribe: (listener) => source.subscribe((value) => {\n\t\t\tif (!hasCommittedSnapshot || !compare(committedSnapshot, value)) listener(value);\n\t\t})\n\t};\n}\n\n//#endregion\nexport { createRenderPhaseSource, renderPhaseReactivity };","import { batch, createAtom } from \"@tanstack/react-store\";\nimport { renderPhaseReactivity } from \"@tanstack/table-core/reactivity\";\n\n//#region src/reactivity.ts\n/**\n* Creates the table-core reactivity bindings used by the React adapter.\n*\n* React stores table state in TanStack Store atoms and leaves options as plain\n* resolved data because `useTable` synchronizes options during render. The\n* render-phase preset supplies the live readonly-atom facades and the `commit`\n* hook; the store primitives are passed in from `@tanstack/react-store` so all\n* atoms share one store instance with user-provided external atoms.\n*/\nfunction reactReactivity() {\n\treturn renderPhaseReactivity({\n\t\tcreateAtom,\n\t\tbatch\n\t});\n}\n\n//#endregion\nexport { reactReactivity };","//#region src/utils.ts\n/**\n* Applies a TanStack updater to a value.\n*\n* If the updater is a function it is called with the previous value; otherwise the updater value is returned directly.\n*/\nfunction functionalUpdate(updater, input) {\n\treturn typeof updater === \"function\" ? updater(input) : updater;\n}\n/**\n* Clones table state values while preserving non-plain objects.\n*\n* Plain objects and arrays are copied recursively so state updates can avoid mutating existing references.\n*/\nfunction cloneState(value) {\n\tif (Array.isArray(value)) return value.map(cloneState);\n\tif (value && typeof value === \"object\") {\n\t\tconst proto = Object.getPrototypeOf(value);\n\t\tif (proto !== Object.prototype && proto !== null) return value;\n\t\tconst copy = proto === null ? makeObjectMap() : {};\n\t\tconst keys = Object.keys(value);\n\t\tfor (let i = 0; i < keys.length; i++) {\n\t\t\tconst key = keys[i];\n\t\t\tObject.defineProperty(copy, key, {\n\t\t\t\tconfigurable: true,\n\t\t\t\tenumerable: true,\n\t\t\t\tvalue: cloneState(value[key]),\n\t\t\t\twritable: true\n\t\t\t});\n\t\t}\n\t\treturn copy;\n\t}\n\treturn value;\n}\n/**\n* Copies prototype-instance own properties without carrying over lazy memo\n* closures or the per-row cell cache, both of which are bound to the source\n* instance (cached cells reference the source row).\n*/\nfunction copyInstancePropertiesWithoutMemos(target, source) {\n\tconst keys = Object.keys(source);\n\tconst targetRecord = target;\n\tfor (let i = 0; i < keys.length; i++) {\n\t\tconst key = keys[i];\n\t\tif (!key.startsWith(\"_memo_\") && key !== \"_cellsCache\") targetRecord[key] = source[key];\n\t}\n\treturn target;\n}\n/**\n* Creates an object intended only for string-keyed dictionary lookups.\n*\n* The null prototype keeps user-controlled ids such as `__proto__` and\n* `hasOwnProperty` as plain data keys.\n*/\nfunction makeObjectMap() {\n\treturn Object.create(null);\n}\n/**\n* Checks whether an object owns a key, including null-prototype dictionaries.\n*/\nfunction hasOwn(obj, key) {\n\treturn Object.prototype.hasOwnProperty.call(obj, key);\n}\n/**\n* Creates a table state updater for a single state slice.\n*\n* The updater writes through the table base atom for the slice and supports both value and functional updater forms.\n*/\nfunction makeStateUpdater(key, instance) {\n\treturn (updater) => {\n\t\t(instance.options.atoms?.[key] ?? instance.baseAtoms[key]).set((old) => functionalUpdate(updater, old));\n\t};\n}\n/**\n* Checks whether a value is an array or a plain (or null-prototype) object.\n* Class instances, dates, and other exotic values compare by reference only,\n* mirroring the `cloneState` plain-object policy.\n*/\nfunction isPlainContainer(value) {\n\tif (typeof value !== \"object\" || value === null) return false;\n\tif (Array.isArray(value)) return true;\n\tconst proto = Object.getPrototypeOf(value);\n\treturn proto === Object.prototype || proto === null;\n}\n/**\n* Returns every enumerable own key, including symbols and non-index array\n* properties. Keeping key presence explicit distinguishes sparse array holes\n* from entries whose value is `undefined`.\n*/\nfunction getEnumerableOwnKeys(value) {\n\treturn Reflect.ownKeys(value).filter((key) => Object.prototype.propertyIsEnumerable.call(value, key));\n}\nconst MAX_STATE_COMPARE_DEPTH = 3;\n/**\n* Structurally compares two state slice values as deeply as stock feature\n* state can nest and no deeper.\n*\n* Three container levels cover flat maps and arrays, arrays of state objects,\n* array-valued filter values, and `columnResizing.columnSizingStart` tuples.\n* Deeper containers and non-plain values compare by reference. A `false`\n* result is always safe: the state update simply proceeds.\n*/\nfunction stateSlicesEqual(a, b) {\n\treturn stateSlicesEqualAtDepth(a, b, MAX_STATE_COMPARE_DEPTH);\n}\nfunction stateSlicesEqualAtDepth(a, b, depth) {\n\tif (Object.is(a, b)) return true;\n\tif (depth <= 0 || !isPlainContainer(a) || !isPlainContainer(b)) return false;\n\tif (Array.isArray(a) || Array.isArray(b)) {\n\t\tif (!Array.isArray(a) || !Array.isArray(b) || a.length !== b.length) return false;\n\t}\n\tconst keysA = getEnumerableOwnKeys(a);\n\tconst keysB = getEnumerableOwnKeys(b);\n\tif (keysA.length !== keysB.length) return false;\n\tconst recordA = a;\n\tconst recordB = b;\n\tfor (let i = 0; i < keysA.length; i++) {\n\t\tconst key = keysA[i];\n\t\tif (!Object.prototype.propertyIsEnumerable.call(b, key)) return false;\n\t\tif (!stateSlicesEqualAtDepth(recordA[key], recordB[key], depth - 1)) return false;\n\t}\n\treturn true;\n}\n/**\n* Routes a state slice update through the slice's `on<State>Change` handler,\n* preserving the owner's current reference for structural no-ops.\n*\n* Equality is evaluated inside the updater received by the state owner, never\n* against the table's potentially stale controlled snapshot. This keeps\n* same-tick updates composable in queued host containers such as React state,\n* evaluates the original updater only when the owner applies it, and lets atom\n* owners suppress notifications by returning their existing reference.\n*\n* A user-provided change handler is still invoked for a no-op because only that\n* handler's state container can know its latest queued value. The guarded\n* updater returns that container's previous reference, preventing a state write\n* or render in state containers with identity bailout semantics.\n*\n* Hot-path slices that skip guarding entirely (selection maps that scale with\n* row count, pointer-frequency resize state) call their change handler\n* directly instead of routing through this util. Custom feature slices with a\n* cheaper or semantic-aware comparison can pass `isEqual` to override the\n* structural default.\n*/\nfunction setStateSlice(instance, key, updater, isEqual = stateSlicesEqual) {\n\tconst onChangeKey = `on${key.charAt(0).toUpperCase()}${key.slice(1)}Change`;\n\tconst onChange = instance.options[onChangeKey];\n\tif (!onChange) return;\n\tonChange((current) => {\n\t\tconst next = functionalUpdate(updater, current);\n\t\treturn isEqual(current, next) ? current : next;\n\t});\n}\n/**\n* Returns whether a value is a function.\n*/\nfunction isFunction(d) {\n\treturn d instanceof Function;\n}\n/**\n* Flattens a tree of nodes by recursively reading child nodes.\n*\n* The original nodes are preserved in depth-first order.\n*/\nfunction flattenBy(arr, getChildren) {\n\tconst flat = [];\n\tconst recurse = (subArr) => {\n\t\tsubArr.forEach((item) => {\n\t\t\tflat.push(item);\n\t\t\tconst children = getChildren(item);\n\t\t\tif (children.length) recurse(children);\n\t\t});\n\t};\n\trecurse(arr);\n\treturn flat;\n}\n/**\n* Creates a dependency-tracked memoized function for table internals.\n*\n* The memo recomputes only when its dependency tuple changes and can emit debug timing information.\n*/\nconst memo = ({ fn, memoDeps, onAfterCompare, onAfterUpdate, onBeforeCompare, onBeforeUpdate }) => {\n\tlet deps = [];\n\tlet result;\n\tconst memoizedFn = (depArgs) => {\n\t\tonBeforeCompare?.();\n\t\tconst newDeps = memoDeps?.(depArgs);\n\t\tlet depsChanged = !newDeps || newDeps.length !== deps?.length;\n\t\tif (!depsChanged && newDeps) {\n\t\t\tfor (let i = 0; i < newDeps.length; i++) if (newDeps[i] !== deps[i]) {\n\t\t\t\tdepsChanged = true;\n\t\t\t\tbreak;\n\t\t\t}\n\t\t}\n\t\tonAfterCompare?.(depsChanged);\n\t\tif (!depsChanged) return result;\n\t\tdeps = newDeps;\n\t\tonBeforeUpdate?.();\n\t\tresult = fn(...newDeps ?? []);\n\t\tonAfterUpdate?.(result);\n\t\treturn result;\n\t};\n\treturn memoizedFn;\n};\n/**\n* Wraps a callback so that its first invocation is skipped.\n*\n* Row-model `onAfterUpdate` hooks schedule auto-resets when their inputs\n* change. The initial computation of a row model is not a change, so state\n* resets must not fire for it — otherwise merely reading a row model on mount\n* would wipe initial or controlled state.\n*/\nfunction skipFirstRun(fn) {\n\tlet hasRun = false;\n\treturn () => {\n\t\tif (!hasRun) {\n\t\t\thasRun = true;\n\t\t\treturn;\n\t\t}\n\t\tfn();\n\t};\n}\nconst pad = (str, num) => {\n\tstr = String(str);\n\twhile (str.length < num) str = \" \" + str;\n\treturn str;\n};\n/**\n* Creates a table-aware memoized function.\n*\n* This wraps `memo` with table debug options and feature metadata so row models and derived APIs can share consistent diagnostics.\n*/\nfunction tableMemo({ feature, fnName, objectId, onAfterUpdate, table, ...memoOptions }) {\n\tlet startCalcTime;\n\tlet endCalcTime;\n\tlet runCount = 0;\n\tlet debug;\n\tif (process.env.NODE_ENV === \"development\") {\n\t\tconst { debugAll } = table.options;\n\t\tconst { parentName } = getFunctionNameInfo(fnName, \".\");\n\t\tconst debugByParent = table.options[`debug${(parentName != \"table\" ? parentName + \"s\" : parentName).replace(parentName, parentName.charAt(0).toUpperCase() + parentName.slice(1))}`];\n\t\tconst debugByFeature = feature ? table.options[`debug${feature.charAt(0).toUpperCase() + feature.slice(1)}`] : false;\n\t\tdebug = debugAll || debugByParent || debugByFeature;\n\t}\n\tfunction logTime(time, depsChanged) {\n\t\tconst runType = runCount === 0 ? \"(1st run)\" : depsChanged ? \"(rerun #\" + runCount + \")\" : \"(cache)\";\n\t\trunCount++;\n\t\tconsole.groupCollapsed(`%c⏱ ${pad(`${time.toFixed(1)} ms`, 12)} %c${runType}%c ${fnName}%c ${objectId ? `(${fnName.split(\".\")[0]}Id: ${objectId})` : \"\"}`, `font-size: .6rem; font-weight: bold; ${depsChanged ? `color: hsl(\n ${Math.max(0, Math.min(120 - Math.log10(time) * 60, 120))}deg 100% 31%);` : \"\"} `, `color: ${runCount < 2 ? \"#FF00FF\" : \"#FF1493\"}`, \"color: #666\", \"color: #87CEEB\");\n\t\tconsole.info({\n\t\t\tfeature,\n\t\t\tstate: table.store.state,\n\t\t\tdeps: memoOptions.memoDeps?.toString()\n\t\t});\n\t\tconsole.trace();\n\t\tconsole.groupEnd();\n\t}\n\tconst onAfterUpdateHandler = () => {\n\t\tif (!onAfterUpdate) return;\n\t\tconst { schedule, untrack } = table._reactivity;\n\t\tschedule(() => untrack(() => onAfterUpdate()));\n\t};\n\tconst debugOptions = process.env.NODE_ENV === \"development\" ? {\n\t\tonBeforeCompare: () => {},\n\t\tonAfterCompare: (depsChanged) => {},\n\t\tonBeforeUpdate: () => {\n\t\t\tif (debug) startCalcTime = performance.now();\n\t\t},\n\t\tonAfterUpdate: () => {\n\t\t\tif (debug) {\n\t\t\t\tendCalcTime = performance.now();\n\t\t\t\tlogTime(Math.round((endCalcTime - startCalcTime) * 100) / 100, true);\n\t\t\t}\n\t\t\tonAfterUpdateHandler();\n\t\t}\n\t} : { onAfterUpdate: () => {\n\t\tonAfterUpdateHandler();\n\t} };\n\treturn memo({\n\t\t...memoOptions,\n\t\t...debugOptions\n\t});\n}\n/**\n* Assumes that a function name is in the format of `parentName_fnKey` and returns the `fnKey` and `fnName` in the format of `parentName.fnKey`.\n*/\nfunction getFunctionNameInfo(staticFnName, splitBy = \"_\") {\n\tconst [parentName, fnKey] = staticFnName.split(splitBy);\n\treturn {\n\t\tfnKey,\n\t\tfnName: `${parentName}.${fnKey}`,\n\t\tparentName\n\t};\n}\n/**\n* Assigns Table API methods directly to the table instance.\n* Unlike row/cell/column/header, the table is a singleton so methods are assigned directly.\n*/\nfunction assignTableAPIs(feature, table, apis) {\n\tfor (const [staticFnName, { fn, memoDeps }] of Object.entries(apis)) {\n\t\tconst { fnKey, fnName } = getFunctionNameInfo(staticFnName);\n\t\ttable[fnKey] = memoDeps ? tableMemo({\n\t\t\tmemoDeps,\n\t\t\tfn,\n\t\t\tfnName,\n\t\t\ttable,\n\t\t\tfeature\n\t\t}) : fn;\n\t}\n}\n/**\n* Assigns API methods to a prototype object for memory-efficient method sharing.\n* All instances created with this prototype will share the same method references.\n*\n* For memoized methods, the memo state is lazily created and stored on each instance.\n* This provides the best of both worlds: shared method code + per-instance caching.\n*/\nfunction assignPrototypeAPIs(feature, prototype, table, apis) {\n\tfor (const [staticFnName, { fn, memoDeps }] of Object.entries(apis)) {\n\t\tconst { fnKey, fnName } = getFunctionNameInfo(staticFnName);\n\t\tif (memoDeps) {\n\t\t\tconst memoKey = `_memo_${fnKey}`;\n\t\t\tprototype[fnKey] = function(...args) {\n\t\t\t\tif (!this[memoKey]) {\n\t\t\t\t\tconst self = this;\n\t\t\t\t\tthis[memoKey] = tableMemo({\n\t\t\t\t\t\tmemoDeps: (depArgs) => memoDeps(self, depArgs),\n\t\t\t\t\t\tfn: (...deps) => fn(self, ...deps),\n\t\t\t\t\t\tfnName,\n\t\t\t\t\t\tobjectId: self.id,\n\t\t\t\t\t\ttable,\n\t\t\t\t\t\tfeature\n\t\t\t\t\t});\n\t\t\t\t}\n\t\t\t\treturn this[memoKey](...args);\n\t\t\t};\n\t\t} else prototype[fnKey] = function(...args) {\n\t\t\treturn fn(this, ...args);\n\t\t};\n\t}\n}\n/**\n* Looks to run the memoized function with the builder pattern on the object if it exists, otherwise fall back to the static method passed in.\n*/\nfunction callMemoOrStaticFn(obj, fnKey, staticFn, ...args) {\n\treturn obj[fnKey]?.(...args) ?? staticFn(obj, ...args);\n}\n\n//#endregion\nexport { assignPrototypeAPIs, assignTableAPIs, callMemoOrStaticFn, cloneState, copyInstancePropertiesWithoutMemos, flattenBy, functionalUpdate, getFunctionNameInfo, hasOwn, isFunction, makeObjectMap, makeStateUpdater, memo, setStateSlice, skipFirstRun, stateSlicesEqual, tableMemo };","//#region src/core/cells/coreCellsFeature.utils.ts\n/**\n* Reads this cell's accessor value from its owning row and column.\n*\n* This is the standalone implementation behind `cell.getValue()`, useful when\n* importing static APIs instead of calling methods from the cell prototype.\n*\n* @example\n* ```ts\n* const value = cell_getValue(cell)\n* ```\n*/\nfunction cell_getValue(cell) {\n\treturn cell.row.getValue(cell.column.id);\n}\n/**\n* Reads the value that should be rendered for this cell.\n*\n* Nullish accessor values are replaced with `table.options.renderFallbackValue`,\n* matching the behavior of `cell.renderValue()`.\n*\n* @example\n* ```ts\n* const rendered = cell_renderValue(cell)\n* ```\n*/\nfunction cell_renderValue(cell) {\n\treturn cell.getValue() ?? cell.table.options.renderFallbackValue;\n}\n/**\n* Builds the render context passed to a column's `cell` template.\n*\n* The returned object includes stable references to the table, row, column, and\n* cell, plus bound `getValue` and `renderValue` helpers for render functions.\n*\n* @example\n* ```ts\n* const context = cell_getContext(cell)\n* ```\n*/\nfunction cell_getContext(cell) {\n\treturn {\n\t\ttable: cell.table,\n\t\tcolumn: cell.column,\n\t\trow: cell.row,\n\t\tcell,\n\t\tgetValue: () => cell.getValue(),\n\t\trenderValue: () => cell.renderValue()\n\t};\n}\n\n//#endregion\nexport { cell_getContext, cell_getValue, cell_renderValue };","import { assignPrototypeAPIs } from \"../../utils.js\";\nimport { cell_getContext, cell_getValue, cell_renderValue } from \"./coreCellsFeature.utils.js\";\n\n//#region src/core/cells/coreCellsFeature.ts\n/**\n* Core feature that adds cell value, render, and context APIs.\n*/\nconst coreCellsFeature = { assignCellPrototype: (prototype, table) => {\n\tassignPrototypeAPIs(\"coreCellsFeature\", prototype, table, {\n\t\tcell_getValue: { fn: (cell) => cell_getValue(cell) },\n\t\tcell_renderValue: { fn: (cell) => cell_renderValue(cell) },\n\t\tcell_getContext: {\n\t\t\tfn: (cell) => cell_getContext(cell),\n\t\t\tmemoDeps: (cell) => [cell]\n\t\t}\n\t});\n} };\n\n//#endregion\nexport { coreCellsFeature };","//#region src/core/headers/constructHeader.ts\n/**\n* Creates or retrieves the header prototype for a table.\n* The prototype is cached on the table and shared by all header instances.\n*/\nfunction getHeaderPrototype(table) {\n\tif (!table._headerPrototype) {\n\t\ttable._headerPrototype = { table };\n\t\tconst features = Object.values(table._features);\n\t\tfor (let i = 0; i < features.length; i++) features[i].assignHeaderPrototype?.(table._headerPrototype, table);\n\t}\n\treturn table._headerPrototype;\n}\n/**\n* Constructs a header instance from normalized table internals.\n*\n* This wires core properties, feature prototype APIs, and instance data used by table rendering and row-model operations.\n*/\nfunction constructHeader(table, column, options) {\n\tconst headerPrototype = getHeaderPrototype(table);\n\tconst header = Object.create(headerPrototype);\n\theader.colSpan = 0;\n\theader.column = column;\n\theader.depth = options.depth;\n\theader.headerGroup = null;\n\theader.id = options.id ?? column.id;\n\theader.index = options.index;\n\theader.isPlaceholder = !!options.isPlaceholder;\n\theader.placeholderId = options.placeholderId;\n\theader.rowSpan = 0;\n\theader.subHeaders = [];\n\tconst initFns = table._headerInstanceInitFns;\n\tfor (let i = 0; i < initFns.length; i++) initFns[i](header);\n\treturn header;\n}\n\n//#endregion\nexport { constructHeader };","import { callMemoOrStaticFn, cloneState, setStateSlice } from \"../../utils.js\";\nimport { column_getIsVisible, row_getVisibleCells, row_getVisibleCellsByColumnId, table_getVisibleLeafColumns } from \"../column-visibility/columnVisibilityFeature.utils.js\";\nimport { buildHeaderGroups } from \"../../core/headers/buildHeaderGroups.js\";\n\n//#region src/features/column-pinning/columnPinningFeature.utils.ts\n/**\n* Creates the default column pinning state.\n*\n* Both pinning regions start empty. Reset APIs use this value when\n* `defaultState` is `true`.\n*\n* @example\n* ```ts\n* const pinning = getDefaultColumnPinningState()\n* ```\n*/\nfunction getDefaultColumnPinningState() {\n\treturn {\n\t\tstart: [],\n\t\tend: []\n\t};\n}\n/**\n* Moves this column's leaf column ids into a pinning region.\n*\n* Pinning a group column pins all of its leaves. The leaf ids are first removed\n* from both regions, then appended to the requested `'start'` or `'end'`\n* region. Passing `false` unpins them back to the center.\n*\n* `start` and `end` are logical positions. In LTR languages/layouts, `start`\n* usually corresponds to left and `end` to right. In RTL languages/layouts,\n* `start` usually corresponds to right and `end` to left.\n*\n* @example\n* ```ts\n* column_pin(column, 'start')\n* ```\n*/\nfunction column_pin(column, position) {\n\tconst leafColumns = column.getLeafColumns();\n\tconst columnIds = [];\n\tfor (let i = 0; i < leafColumns.length; i++) {\n\t\tconst id = leafColumns[i].id;\n\t\tif (id) columnIds.push(id);\n\t}\n\ttable_setColumnPinning(column.table, (old) => {\n\t\tif (position === \"end\") return {\n\t\t\tstart: old.start.filter((d) => !columnIds.includes(d)),\n\t\t\tend: [...old.end.filter((d) => !columnIds.includes(d)), ...columnIds]\n\t\t};\n\t\tif (position === \"start\") return {\n\t\t\tstart: [...old.start.filter((d) => !columnIds.includes(d)), ...columnIds],\n\t\t\tend: old.end.filter((d) => !columnIds.includes(d))\n\t\t};\n\t\treturn {\n\t\t\tstart: old.start.filter((d) => !columnIds.includes(d)),\n\t\t\tend: old.end.filter((d) => !columnIds.includes(d))\n\t\t};\n\t});\n}\n/**\n* Checks whether this column or any of its leaf columns can be pinned.\n*\n* Column-level `enablePinning` and table `enableColumnPinning` both default to\n* `true`; at least one leaf column must allow pinning.\n*\n* @example\n* ```ts\n* const canPin = column_getCanPin(column)\n* ```\n*/\nfunction column_getCanPin(column) {\n\treturn column.getLeafColumns().some((leafColumn) => (leafColumn.columnDef.enablePinning ?? true) && (column.table.options.enableColumnPinning ?? true));\n}\n/**\n* Reads this column's current pinning region.\n*\n* Group columns report `'start'` or `'end'` when any leaf column is pinned in\n* that region. Unpinned columns return `false`.\n*\n* `start` and `end` are logical positions. In LTR languages/layouts, `start`\n* usually corresponds to left and `end` to right. In RTL languages/layouts,\n* `start` usually corresponds to right and `end` to left.\n*\n* @example\n* ```ts\n* const position = column_getIsPinned(column)\n* ```\n*/\nfunction column_getIsPinned(column) {\n\tconst leafColumns = column.getLeafColumns();\n\tconst { start, end } = column.table.atoms.columnPinning?.get() ?? getDefaultColumnPinningState();\n\tfor (let i = 0; i < leafColumns.length; i++) if (start.includes(leafColumns[i].id)) return \"start\";\n\tfor (let i = 0; i < leafColumns.length; i++) if (end.includes(leafColumns[i].id)) return \"end\";\n\treturn false;\n}\n/**\n* Finds this column's index within its pinned region.\n*\n* Unpinned columns return `0`; pinned columns return their position in\n* `state.columnPinning.start` or `state.columnPinning.end`.\n*\n* @example\n* ```ts\n* const index = column_getPinnedIndex(column)\n* ```\n*/\nfunction column_getPinnedIndex(column) {\n\tconst position = column_getIsPinned(column);\n\treturn position ? column.table.atoms.columnPinning?.get()?.[position].indexOf(column.id) ?? -1 : 0;\n}\n/**\n* Collects visible cells whose columns are not pinned start or end.\n*\n* The result preserves the row's visible-cell order for center columns.\n*\n* @example\n* ```ts\n* const centerCells = row_getCenterVisibleCells(row)\n* ```\n*/\nfunction row_getCenterVisibleCells(row) {\n\tconst allCells = callMemoOrStaticFn(row, \"getVisibleCells\", row_getVisibleCells);\n\tconst { start, end } = row.table.atoms.columnPinning?.get() ?? getDefaultColumnPinningState();\n\tif (!start.length && !end.length) return allCells;\n\tconst startAndEnd = [...start, ...end];\n\treturn allCells.filter((d) => !startAndEnd.includes(d.column.id));\n}\n/**\n* Collects visible cells for columns pinned to the start region.\n*\n* Cells are returned in `state.columnPinning.start` order and are marked with\n* `cell.position = 'start'`.\n*\n* @example\n* ```ts\n* const startCells = row_getStartVisibleCells(row)\n* ```\n*/\nfunction row_getStartVisibleCells(row) {\n\tconst { start } = row.table.atoms.columnPinning?.get() ?? getDefaultColumnPinningState();\n\tif (!start.length) return [];\n\tconst allVisibleCells = callMemoOrStaticFn(row, \"getVisibleCellsByColumnId\", row_getVisibleCellsByColumnId);\n\tconst cells = [];\n\tfor (let i = 0; i < start.length; i++) {\n\t\tconst cell = allVisibleCells[start[i]];\n\t\tif (cell) {\n\t\t\tcell.position = \"start\";\n\t\t\tcells.push(cell);\n\t\t}\n\t}\n\treturn cells;\n}\n/**\n* Collects visible cells for columns pinned to the end region.\n*\n* Cells are returned in `state.columnPinning.end` order and are marked with\n* `cell.position = 'end'`.\n*\n* @example\n* ```ts\n* const endCells = row_getEndVisibleCells(row)\n* ```\n*/\nfunction row_getEndVisibleCells(row) {\n\tconst { end } = row.table.atoms.columnPinning?.get() ?? getDefaultColumnPinningState();\n\tif (!end.length) return [];\n\tconst allVisibleCells = callMemoOrStaticFn(row, \"getVisibleCellsByColumnId\", row_getVisibleCellsByColumnId);\n\tconst cells = [];\n\tfor (let i = 0; i < end.length; i++) {\n\t\tconst cell = allVisibleCells[end[i]];\n\t\tif (cell) {\n\t\t\tcell.position = \"end\";\n\t\t\tcells.push(cell);\n\t\t}\n\t}\n\treturn cells;\n}\n/**\n* Routes a column pinning updater through the table's pinning change handler.\n*\n* The updater may be a next `{ start, end }` state or a function of the\n* previous state, matching the instance `table.setColumnPinning` behavior.\n*\n* @example\n* ```ts\n* table_setColumnPinning(table, (old) => ({ ...old, start: ['select'] }))\n* ```\n*/\nfunction table_setColumnPinning(table, updater) {\n\tsetStateSlice(table, \"columnPinning\", updater);\n}\n/**\n* Resets `columnPinning` to the configured initial state or feature default.\n*\n* With no argument, the reset clones `table.initialState.columnPinning` when it\n* exists. Passing `true` ignores initial state and resets to empty start/end\n* arrays.\n*\n* @example\n* ```ts\n* table_resetColumnPinning(table)\n* table_resetColumnPinning(table, true)\n* ```\n*/\nfunction table_resetColumnPinning(table, defaultState) {\n\ttable_setColumnPinning(table, defaultState ? getDefaultColumnPinningState() : cloneState(table.initialState.columnPinning ?? getDefaultColumnPinningState()));\n}\n/**\n* Checks whether any columns are pinned.\n*\n* Omit `position` to check both sides, or pass `'start'`/`'end'` to inspect a\n* single pinning region.\n*\n* @example\n* ```ts\n* const hasPinnedColumns = table_getIsSomeColumnsPinned(table)\n* ```\n*/\nfunction table_getIsSomeColumnsPinned(table, position) {\n\tconst pinningState = table.atoms.columnPinning?.get();\n\tif (!position) return Boolean(pinningState?.start.length || pinningState?.end.length);\n\treturn Boolean(pinningState?.[position].length);\n}\n/**\n* Builds header groups for visible columns pinned to the start region.\n*\n* The leaf columns are read in `state.columnPinning.start` order and then passed\n* through the same header-group builder as the unpinned table.\n*\n* @example\n* ```ts\n* const headerGroups = table_getStartHeaderGroups(table)\n* ```\n*/\nfunction table_getStartHeaderGroups(table) {\n\tconst allColumns = table.getAllColumns();\n\tconst leafColumnsById = table.getAllLeafColumnsById();\n\tconst { start } = table.atoms.columnPinning?.get() ?? getDefaultColumnPinningState();\n\tconst orderedLeafColumns = [];\n\tfor (let i = 0; i < start.length; i++) {\n\t\tconst column = leafColumnsById[start[i]];\n\t\tif (column && callMemoOrStaticFn(column, \"getIsVisible\", column_getIsVisible)) orderedLeafColumns.push(column);\n\t}\n\treturn buildHeaderGroups(allColumns, orderedLeafColumns, table, \"start\");\n}\n/**\n* Builds header groups for visible columns pinned to the end region.\n*\n* The leaf columns are read in `state.columnPinning.end` order and then\n* passed through the same header-group builder as the unpinned table.\n*\n* @example\n* ```ts\n* const headerGroups = table_getEndHeaderGroups(table)\n* ```\n*/\nfunction table_getEndHeaderGroups(table) {\n\tconst allColumns = table.getAllColumns();\n\tconst leafColumnsById = table.getAllLeafColumnsById();\n\tconst { end } = table.atoms.columnPinning?.get() ?? getDefaultColumnPinningState();\n\tconst orderedLeafColumns = [];\n\tfor (let i = 0; i < end.length; i++) {\n\t\tconst column = leafColumnsById[end[i]];\n\t\tif (column && callMemoOrStaticFn(column, \"getIsVisible\", column_getIsVisible)) orderedLeafColumns.push(column);\n\t}\n\treturn buildHeaderGroups(allColumns, orderedLeafColumns, table, \"end\");\n}\n/**\n* Builds header groups for visible columns that are not pinned.\n*\n* Start- and end-pinned column ids are removed from the visible leaf column\n* list before header groups are built for the center region.\n*\n* @example\n* ```ts\n* const headerGroups = table_getCenterHeaderGroups(table)\n* ```\n*/\nfunction table_getCenterHeaderGroups(table) {\n\tconst allColumns = table.getAllColumns();\n\tlet leafColumns = callMemoOrStaticFn(table, \"getVisibleLeafColumns\", table_getVisibleLeafColumns);\n\tconst { start, end } = table.atoms.columnPinning?.get() ?? getDefaultColumnPinningState();\n\tif (start.length || end.length) {\n\t\tconst startAndEnd = [...start, ...end];\n\t\tleafColumns = leafColumns.filter((column) => !startAndEnd.includes(column.id));\n\t}\n\treturn buildHeaderGroups(allColumns, leafColumns, table, \"center\");\n}\n/**\n* Builds footer groups for the start pinned region.\n*\n* Footer groups reuse the start header groups in reverse order.\n*\n* @example\n* ```ts\n* const footerGroups = table_getStartFooterGroups(table)\n* ```\n*/\nfunction table_getStartFooterGroups(table) {\n\treturn [...callMemoOrStaticFn(table, \"getStartHeaderGroups\", table_getStartHeaderGroups)].reverse();\n}\n/**\n* Builds footer groups for the end pinned region.\n*\n* Footer groups reuse the end header groups in reverse order.\n*\n* @example\n* ```ts\n* const footerGroups = table_getEndFooterGroups(table)\n* ```\n*/\nfunction table_getEndFooterGroups(table) {\n\treturn [...callMemoOrStaticFn(table, \"getEndHeaderGroups\", table_getEndHeaderGroups)].reverse();\n}\n/**\n* Builds footer groups for the center, unpinned region.\n*\n* Footer groups reuse the center header groups in reverse order.\n*\n* @example\n* ```ts\n* const footerGroups = table_getCenterFooterGroups(table)\n* ```\n*/\nfunction table_getCenterFooterGroups(table) {\n\treturn [...callMemoOrStaticFn(table, \"getCenterHeaderGroups\", table_getCenterHeaderGroups)].reverse();\n}\n/**\n* Flattens every header from the start pinned header groups.\n*\n* Parent headers and placeholder headers are included.\n*\n* @example\n* ```ts\n* const headers = table_getStartFlatHeaders(table)\n* ```\n*/\nfunction table_getStartFlatHeaders(table) {\n\tconst leftHeaderGroups = callMemoOrStaticFn(table, \"getStartHeaderGroups\", table_getStartHeaderGroups);\n\tconst result = [];\n\tfor (let i = 0; i < leftHeaderGroups.length; i++) {\n\t\tconst headers = leftHeaderGroups[i].headers;\n\t\tfor (let j = 0; j < headers.length; j++) result.push(headers[j]);\n\t}\n\treturn result;\n}\n/**\n* Flattens every header from the end pinned header groups.\n*\n* Parent headers and placeholder headers are included.\n*\n* @example\n* ```ts\n* const headers = table_getEndFlatHeaders(table)\n* ```\n*/\nfunction table_getEndFlatHeaders(table) {\n\tconst rightHeaderGroups = callMemoOrStaticFn(table, \"getEndHeaderGroups\", table_getEndHeaderGroups);\n\tconst result = [];\n\tfor (let i = 0; i < rightHeaderGroups.length; i++) {\n\t\tconst headers = rightHeaderGroups[i].headers;\n\t\tfor (let j = 0; j < headers.length; j++) result.push(headers[j]);\n\t}\n\treturn result;\n}\n/**\n* Flattens every header from the center header groups.\n*\n* Parent headers and placeholder headers are included.\n*\n* @example\n* ```ts\n* const headers = table_getCenterFlatHeaders(table)\n* ```\n*/\nfunction table_getCenterFlatHeaders(table) {\n\tconst centerHeaderGroups = callMemoOrStaticFn(table, \"getCenterHeaderGroups\", table_getCenterHeaderGroups);\n\tconst result = [];\n\tfor (let i = 0; i < centerHeaderGroups.length; i++) {\n\t\tconst headers = centerHeaderGroups[i].headers;\n\t\tfor (let j = 0; j < headers.length; j++) result.push(headers[j]);\n\t}\n\treturn result;\n}\n/**\n* Collects leaf headers for the start pinned region.\n*\n* Parent headers are filtered out from the start flat header list.\n*\n* @example\n* ```ts\n* const headers = table_getStartLeafHeaders(table)\n* ```\n*/\nfunction table_getStartLeafHeaders(table) {\n\treturn callMemoOrStaticFn(table, \"getStartFlatHeaders\", table_getStartFlatHeaders).filter((header) => !header.subHeaders.length);\n}\n/**\n* Collects leaf headers for the end pinned region.\n*\n* Parent headers are filtered out from the end flat header list.\n*\n* @example\n* ```ts\n* const headers = table_getEndLeafHeaders(table)\n* ```\n*/\nfunction table_getEndLeafHeaders(table) {\n\treturn callMemoOrStaticFn(table, \"getEndFlatHeaders\", table_getEndFlatHeaders).filter((header) => !header.subHeaders.length);\n}\n/**\n* Collects leaf headers for the center, unpinned region.\n*\n* Parent headers are filtered out from the center flat header list.\n*\n* @example\n* ```ts\n* const headers = table_getCenterLeafHeaders(table)\n* ```\n*/\nfunction table_getCenterLeafHeaders(table) {\n\treturn callMemoOrStaticFn(table, \"getCenterFlatHeaders\", table_getCenterFlatHeaders).filter((header) => !header.subHeaders.length);\n}\n/**\n* Resolves leaf columns pinned to the start region.\n*\n* The result follows `state.columnPinning.start` order and skips stale ids that\n* no longer correspond to a leaf column.\n*\n* @example\n* ```ts\n* const columns = table_getStartLeafColumns(table)\n* ```\n*/\nfunction table_getStartLeafColumns(table) {\n\tconst { start } = table.atoms.columnPinning?.get() ?? getDefaultColumnPinningState();\n\tconst leafColumnsById = table.getAllLeafColumnsById();\n\tconst result = [];\n\tfor (let i = 0; i < start.length; i++) {\n\t\tconst column = leafColumnsById[start[i]];\n\t\tif (column) result.push(column);\n\t}\n\treturn result;\n}\n/**\n* Resolves leaf columns pinned to the end region.\n*\n* The result follows `state.columnPinning.end` order and skips stale ids that\n* no longer correspond to a leaf column.\n*\n* @example\n* ```ts\n* const columns = table_getEndLeafColumns(table)\n* ```\n*/\nfunction table_getEndLeafColumns(table) {\n\tconst { end } = table.atoms.columnPinning?.get() ?? getDefaultColumnPinningState();\n\tconst leafColumnsById = table.getAllLeafColumnsById();\n\tconst result = [];\n\tfor (let i = 0; i < end.length; i++) {\n\t\tconst column = leafColumnsById[end[i]];\n\t\tif (column) result.push(column);\n\t}\n\treturn result;\n}\n/**\n* Resolves leaf columns that are not pinned to either logical side.\n*\n* Start- and end-pinned ids are removed from `table.getAllLeafColumns()`.\n*\n* @example\n* ```ts\n* const columns = table_getCenterLeafColumns(table)\n* ```\n*/\nfunction table_getCenterLeafColumns(table) {\n\tconst { start, end } = table.atoms.columnPinning?.get() ?? getDefaultColumnPinningState();\n\tif (!start.length && !end.length) return table.getAllLeafColumns();\n\tconst startAndEnd = [...start, ...end];\n\treturn table.getAllLeafColumns().filter((d) => !startAndEnd.includes(d.id));\n}\n/**\n* Resolves leaf columns for a requested pinning region.\n*\n* Pass `'start'`, `'center'`, or `'end'` for a partition, or pass `false` to\n* read all leaf columns without partitioning.\n*\n* @example\n* ```ts\n* const columns = table_getPinnedLeafColumns(table, 'center')\n* ```\n*/\nfunction table_getPinnedLeafColumns(table, position) {\n\treturn !position ? table.getAllLeafColumns() : position === \"start\" ? callMemoOrStaticFn(table, \"getStartLeafColumns\", table_getStartLeafColumns) : position === \"end\" ? callMemoOrStaticFn(table, \"getEndLeafColumns\", table_getEndLeafColumns) : callMemoOrStaticFn(table, \"getCenterLeafColumns\", table_getCenterLeafColumns);\n}\n/**\n* Resolves visible leaf columns pinned to the start region.\n*\n* Hidden pinned columns are filtered out after the start pin order is applied.\n*\n* @example\n* ```ts\n* const columns = table_getStartVisibleLeafColumns(table)\n* ```\n*/\nfunction table_getStartVisibleLeafColumns(table) {\n\treturn callMemoOrStaticFn(table, \"getStartLeafColumns\", table_getStartLeafColumns).filter((column) => callMemoOrStaticFn(column, \"getIsVisible\", column_getIsVisible));\n}\n/**\n* Resolves visible leaf columns pinned to the end region.\n*\n* Hidden pinned columns are filtered out after the end pin order is applied.\n*\n* @example\n* ```ts\n* const columns = table_getEndVisibleLeafColumns(table)\n* ```\n*/\nfunction table_getEndVisibleLeafColumns(table) {\n\treturn callMemoOrStaticFn(table, \"getEndLeafColumns\", table_getEndLeafColumns).filter((column) => callMemoOrStaticFn(column, \"getIsVisible\", column_getIsVisible));\n}\n/**\n* Resolves visible leaf columns that are not pinned.\n*\n* This is the center partition used by layouts that render pinned columns\n* separately from the scrollable middle region.\n*\n* @example\n* ```ts\n* const columns = table_getCenterVisibleLeafColumns(table)\n* ```\n*/\nfunction table_getCenterVisibleLeafColumns(table) {\n\treturn callMemoOrStaticFn(table, \"getCenterLeafColumns\", table_getCenterLeafColumns).filter((column) => callMemoOrStaticFn(column, \"getIsVisible\", column_getIsVisible));\n}\n/**\n* Resolves visible leaf columns for a requested pinning region.\n*\n* Omit `position` to get all visible leaf columns, or pass `'start'`, `'center'`,\n* or `'end'` to get one partition.\n*\n* @example\n* ```ts\n* const columns = table_getPinnedVisibleLeafColumns(table, 'start')\n* ```\n*/\nfunction table_getPinnedVisibleLeafColumns(table, position) {\n\treturn !position ? callMemoOrStaticFn(table, \"getVisibleLeafColumns\", table_getVisibleLeafColumns) : position === \"start\" ? callMemoOrStaticFn(table, \"getStartVisibleLeafColumns\", table_getStartVisibleLeafColumns) : position === \"end\" ? callMemoOrStaticFn(table, \"getEndVisibleLeafColumns\", table_getEndVisibleLeafColumns) : callMemoOrStaticFn(table, \"getCenterVisibleLeafColumns\", table_getCenterVisibleLeafColumns);\n}\n\n//#endregion\nexport { column_getCanPin, column_getIsPinned, column_getPinnedIndex, column_pin, getDefaultColumnPinningState, row_getCenterVisibleCells, row_getEndVisibleCells, row_getStartVisibleCells, table_getCenterFlatHeaders, table_getCenterFooterGroups, table_getCenterHeaderGroups, table_getCenterLeafColumns, table_getCenterLeafHeaders, table_getCenterVisibleLeafColumns, table_getEndFlatHeaders, table_getEndFooterGroups, table_getEndHeaderGroups, table_getEndLeafColumns, table_getEndLeafHeaders, table_getEndVisibleLeafColumns, table_getIsSomeColumnsPinned, table_getPinnedLeafColumns, table_getPinnedVisibleLeafColumns, table_getStartFlatHeaders, table_getStartFooterGroups, table_getStartHeaderGroups, table_getStartLeafColumns, table_getStartLeafHeaders, table_getStartVisibleLeafColumns, table_resetColumnPinning, table_setColumnPinning };","import { callMemoOrStaticFn, cloneState, hasOwn, makeObjectMap, setStateSlice } from \"../../utils.js\";\nimport { getDefaultColumnPinningState } from \"../column-pinning/columnPinningFeature.utils.js\";\n\n//#region src/features/column-visibility/columnVisibilityFeature.utils.ts\n/**\n* Creates the default column visibility state.\n*\n* The feature default is an empty object, where missing column ids are treated\n* as visible. Reset APIs use this value when `defaultState` is `true`.\n*\n* @example\n* ```ts\n* const visibility = getDefaultColumnVisibilityState()\n* ```\n*/\nfunction getDefaultColumnVisibilityState() {\n\treturn makeObjectMap();\n}\n/**\n* Updates this column's visibility when hiding is allowed.\n*\n* Passing `visible` stores that value. Omitting it flips the column's current\n* visibility state. Group columns update their hideable leaf columns because\n* visibility state is keyed by leaf column ids. Columns that cannot hide stay\n* unchanged.\n*\n* @example\n* ```ts\n* column_toggleVisibility(column)\n* ```\n*/\nfunction column_toggleVisibility(column, visible) {\n\tif (column_getCanHide(column)) table_setColumnVisibility(column.table, (old) => {\n\t\tconst next = Object.assign(makeObjectMap(), old);\n\t\tconst nextVisible = visible ?? !callMemoOrStaticFn(column, \"getIsVisible\", column_getIsVisible);\n\t\tconst leafColumns = column.getLeafColumns();\n\t\tfor (let i = 0; i < leafColumns.length; i++) {\n\t\t\tconst leafColumn = leafColumns[i];\n\t\t\tif (column_getCanHide(leafColumn)) next[leafColumn.id] = nextVisible;\n\t\t}\n\t\treturn next;\n\t});\n}\n/**\n* Checks whether this column is visible.\n*\n* Leaf columns read `state.columnVisibility[column.id]`, where missing entries\n* default to visible. Parent columns are visible when at least one child column\n* is visible.\n*\n* @example\n* ```ts\n* const visible = column_getIsVisible(column)\n* ```\n*/\nfunction column_getIsVisible(column) {\n\tconst columnVisibility = column.table.atoms.columnVisibility?.get();\n\tif (!columnVisibility) return true;\n\tconst childColumns = column.columns;\n\tif (childColumns.length) return childColumns.some((childColumn) => callMemoOrStaticFn(childColumn, \"getIsVisible\", column_getIsVisible));\n\treturn (hasOwn(columnVisibility, column.id) ? columnVisibility[column.id] : void 0) ?? true;\n}\n/**\n* Checks whether this column is allowed to be hidden.\n*\n* Both `columnDef.enableHiding` and table `enableHiding` default to `true`.\n*\n* @example\n* ```ts\n* const canHide = column_getCanHide(column)\n* ```\n*/\nfunction column_getCanHide(column) {\n\treturn (column.columnDef.enableHiding ?? true) && (column.table.options.enableHiding ?? true);\n}\n/**\n* Creates a checkbox-style handler that writes this column's visibility.\n*\n* The handler reads `event.target.checked`, so it is intended for visibility\n* controls whose checked state means \"visible\".\n*\n* @example\n* ```ts\n* const onChange = column_getToggleVisibilityHandler(column)\n* ```\n*/\nfunction column_getToggleVisibilityHandler(column) {\n\treturn (e) => {\n\t\tcolumn_toggleVisibility(column, e.target.checked);\n\t};\n}\n/**\n* Collects the cells from this row whose columns are visible.\n*\n* When column pinning is active, the result is ordered as start-pinned cells,\n* center cells, then end-pinned cells.\n*\n* @example\n* ```ts\n* const visibleCells = row_getVisibleCells(row)\n* ```\n*/\nfunction row_getVisibleCells(row) {\n\tconst allCells = row.getAllCells();\n\tconst visibleCells = [];\n\tfor (let i = 0; i < allCells.length; i++) {\n\t\tconst cell = allCells[i];\n\t\tif (callMemoOrStaticFn(cell.column, \"getIsVisible\", column_getIsVisible)) visibleCells.push(cell);\n\t}\n\tconst { start, end } = row.table.atoms.columnPinning?.get() ?? getDefaultColumnPinningState();\n\tif (!start.length && !end.length) return visibleCells;\n\tconst visibleCellsByColumnId = callMemoOrStaticFn(row, \"getVisibleCellsByColumnId\", row_getVisibleCellsByColumnId);\n\tconst startCells = [];\n\tfor (let i = 0; i < start.length; i++) {\n\t\tconst cell = visibleCellsByColumnId[start[i]];\n\t\tif (cell) startCells.push(cell);\n\t}\n\tconst endCells = [];\n\tfor (let i = 0; i < end.length; i++) {\n\t\tconst cell = visibleCellsByColumnId[end[i]];\n\t\tif (cell) endCells.push(cell);\n\t}\n\tconst centerCells = [];\n\tfor (let i = 0; i < visibleCells.length; i++) {\n\t\tconst cell = visibleCells[i];\n\t\tconst id = cell.column.id;\n\t\tif (!start.includes(id) && !end.includes(id)) centerCells.push(cell);\n\t}\n\treturn [\n\t\t...startCells,\n\t\t...centerCells,\n\t\t...endCells\n\t];\n}\n/**\n* Builds a lookup map of this row's visible cells keyed by column id.\n*\n* Hidden columns are omitted from the map.\n*\n* @example\n* ```ts\n* const visibleCellsById = row_getVisibleCellsByColumnId(row)\n* ```\n*/\nfunction row_getVisibleCellsByColumnId(row) {\n\tconst result = makeObjectMap();\n\tconst allCells = row.getAllCells();\n\tfor (let i = 0; i < allCells.length; i++) {\n\t\tconst cell = allCells[i];\n\t\tif (callMemoOrStaticFn(cell.column, \"getIsVisible\", column_getIsVisible)) result[cell.column.id] = cell;\n\t}\n\treturn result;\n}\n/**\n* Filters the flat column list down to visible columns.\n*\n* Parent/group columns are included when `column_getIsVisible` considers them\n* visible.\n*\n* @example\n* ```ts\n* const columns = table_getVisibleFlatColumns(table)\n* ```\n*/\nfunction table_getVisibleFlatColumns(table) {\n\treturn table.getAllFlatColumns().filter((column) => callMemoOrStaticFn(column, \"getIsVisible\", column_getIsVisible));\n}\n/**\n* Filters leaf columns down to those currently visible.\n*\n* This is the column list most row rendering code uses before pinning-specific\n* partitioning.\n*\n* @example\n* ```ts\n* const columns = table_getVisibleLeafColumns(table)\n* ```\n*/\nfunction table_getVisibleLeafColumns(table) {\n\treturn table.getAllLeafColumns().filter((column) => callMemoOrStaticFn(column, \"getIsVisible\", column_getIsVisible));\n}\n/**\n* Routes a column visibility updater through the table's visibility change handler.\n*\n* The updater may be a next visibility map or a function of the previous map,\n* matching the instance `table.setColumnVisibility` behavior.\n*\n* @example\n* ```ts\n* table_setColumnVisibility(table, (old) => ({ ...old, age: false }))\n* ```\n*/\nfunction table_setColumnVisibility(table, updater) {\n\tsetStateSlice(table, \"columnVisibility\", updater);\n}\n/**\n* Resets `columnVisibility` to the configured initial state or feature default.\n*\n* With no argument, the reset clones `table.initialState.columnVisibility` when\n* it exists. Passing `true` ignores initial state and resets to `{}`.\n*\n* @example\n* ```ts\n* table_resetColumnVisibility(table)\n* table_resetColumnVisibility(table, true)\n* ```\n*/\nfunction table_resetColumnVisibility(table, defaultState) {\n\ttable_setColumnVisibility(table, defaultState ? makeObjectMap() : Object.assign(makeObjectMap(), cloneState(table.initialState.columnVisibility ?? {})));\n}\n/**\n* Shows or hides every hideable leaf column.\n*\n* Columns that cannot hide stay visible when toggling all columns off.\n*\n* @example\n* ```ts\n* table_toggleAllColumnsVisible(table)\n* ```\n*/\nfunction table_toggleAllColumnsVisible(table, value) {\n\tvalue = value ?? !table_getIsAllColumnsVisible(table);\n\tconst visibility = makeObjectMap();\n\tconst leafColumns = table.getAllLeafColumns();\n\tfor (let i = 0; i < leafColumns.length; i++) {\n\t\tconst column = leafColumns[i];\n\t\tvisibility[column.id] = !value ? !column_getCanHide(column) : value;\n\t}\n\ttable_setColumnVisibility(table, visibility);\n}\n/**\n* Checks whether every leaf column is currently visible.\n*\n* Non-hideable columns are naturally visible because missing visibility entries\n* default to `true`.\n*\n* @example\n* ```ts\n* const allVisible = table_getIsAllColumnsVisible(table)\n* ```\n*/\nfunction table_getIsAllColumnsVisible(table) {\n\treturn !table.getAllLeafColumns().some((column) => !callMemoOrStaticFn(column, \"getIsVisible\", column_getIsVisible));\n}\n/**\n* Checks whether at least one leaf column is currently visible.\n*\n* This is useful for tri-state \"show all columns\" controls.\n*\n* @example\n* ```ts\n* const someVisible = table_getIsSomeColumnsVisible(table)\n* ```\n*/\nfunction table_getIsSomeColumnsVisible(table) {\n\treturn table.getAllLeafColumns().some((column) => callMemoOrStaticFn(column, \"getIsVisible\", column_getIsVisible));\n}\n/**\n* Creates a checkbox-style handler that shows or hides all columns.\n*\n* The handler reads `event.target.checked`, so it is intended for controls whose\n* checked state means \"all columns visible\".\n*\n* @example\n* ```ts\n* const onChange = table_getToggleAllColumnsVisibilityHandler(table)\n* ```\n*/\nfunction table_getToggleAllColumnsVisibilityHandler(table) {\n\treturn (e) => {\n\t\ttable_toggleAllColumnsVisible(table, e.target.checked);\n\t};\n}\n\n//#endregion\nexport { column_getCanHide, column_getIsVisible, column_getToggleVisibilityHandler, column_toggleVisibility, getDefaultColumnVisibilityState, row_getVisibleCells, row_getVisibleCellsByColumnId, table_getIsAllColumnsVisible, table_getIsSomeColumnsVisible, table_getToggleAllColumnsVisibilityHandler, table_getVisibleFlatColumns, table_getVisibleLeafColumns, table_resetColumnVisibility, table_setColumnVisibility, table_toggleAllColumnsVisible };","import { callMemoOrStaticFn } from \"../../utils.js\";\nimport { column_getIsVisible } from \"../../features/column-visibility/columnVisibilityFeature.utils.js\";\nimport { constructHeader } from \"./constructHeader.js\";\n\n//#region src/core/headers/buildHeaderGroups.ts\nfunction getMaxHeaderDepth(columns, depth = 1) {\n\tlet maxDepth = depth;\n\tfor (let i = 0; i < columns.length; i++) {\n\t\tconst column = columns[i];\n\t\tif (callMemoOrStaticFn(column, \"getIsVisible\", column_getIsVisible) && column.columns.length) maxDepth = Math.max(maxDepth, getMaxHeaderDepth(column.columns, depth + 1));\n\t}\n\treturn maxDepth;\n}\nfunction formatHeaderGroupId(headerFamily, depth) {\n\treturn headerFamily ? `${headerFamily}_${depth}` : String(depth);\n}\nfunction formatHeaderId(headerFamily, depth, columnId, childHeaderId) {\n\tlet id = headerFamily ?? \"\";\n\tif (depth) id = id ? `${id}_${depth}` : String(depth);\n\tif (columnId) id = id ? `${id}_${columnId}` : columnId;\n\tif (childHeaderId) id = id ? `${id}_${childHeaderId}` : childHeaderId;\n\treturn id;\n}\nfunction countPendingHeadersForColumn(headers, column) {\n\tlet count = 0;\n\tfor (let i = 0; i < headers.length; i++) if (headers[i].column === column) count++;\n\treturn count;\n}\nfunction constructHeaderGroup(headersToGroup, depth, table, headerFamily, headerGroups, headerGroupInitFns) {\n\tconst headerGroup = {\n\t\tdepth,\n\t\tid: formatHeaderGroupId(headerFamily, depth),\n\t\theaders: []\n\t};\n\tconst pendingParentHeaders = [];\n\tfor (let i = 0; i < headersToGroup.length; i++) {\n\t\tif (!(i in headersToGroup)) continue;\n\t\tconst headerToGroup = headersToGroup[i];\n\t\tconst latestPendingParentHeader = pendingParentHeaders[pendingParentHeaders.length - 1];\n\t\tconst isLeafHeader = headerToGroup.column.depth === headerGroup.depth;\n\t\tlet column;\n\t\tlet isPlaceholder = false;\n\t\tif (isLeafHeader && headerToGroup.column.parent) column = headerToGroup.column.parent;\n\t\telse {\n\t\t\tcolumn = headerToGroup.column;\n\t\t\tisPlaceholder = true;\n\t\t}\n\t\tif (latestPendingParentHeader && latestPendingParentHeader.column === column) latestPendingParentHeader.subHeaders.push(headerToGroup);\n\t\telse {\n\t\t\tconst header = constructHeader(table, column, {\n\t\t\t\tid: formatHeaderId(headerFamily, depth, column.id, headerToGroup.id),\n\t\t\t\tisPlaceholder,\n\t\t\t\tplaceholderId: isPlaceholder ? String(countPendingHeadersForColumn(pendingParentHeaders, column)) : void 0,\n\t\t\t\tdepth,\n\t\t\t\tindex: pendingParentHeaders.length\n\t\t\t});\n\t\t\theader.subHeaders.push(headerToGroup);\n\t\t\tpendingParentHeaders.push(header);\n\t\t}\n\t\theaderGroup.headers.push(headerToGroup);\n\t\theaderToGroup.headerGroup = headerGroup;\n\t}\n\tfor (let i = 0; i < headerGroupInitFns.length; i++) headerGroupInitFns[i](headerGroup);\n\theaderGroups.push(headerGroup);\n\tif (depth > 0) constructHeaderGroup(pendingParentHeaders, depth - 1, table, headerFamily, headerGroups, headerGroupInitFns);\n}\nfunction updateHeaderSpans(headers) {\n\tfor (let i = 0; i < headers.length; i++) {\n\t\tconst header = headers[i];\n\t\tif (!callMemoOrStaticFn(header.column, \"getIsVisible\", column_getIsVisible)) continue;\n\t\tlet colSpan = 0;\n\t\tif (header.subHeaders.length) {\n\t\t\tupdateHeaderSpans(header.subHeaders);\n\t\t\tfor (let j = 0; j < header.subHeaders.length; j++) {\n\t\t\t\tconst child = header.subHeaders[j];\n\t\t\t\tif (!callMemoOrStaticFn(child.column, \"getIsVisible\", column_getIsVisible)) continue;\n\t\t\t\tcolSpan += child.colSpan;\n\t\t\t}\n\t\t} else colSpan = 1;\n\t\theader.colSpan = colSpan;\n\t\tif (header.isPlaceholder && header.subHeaders.length === 1 && header.subHeaders[0].column === header.column) {\n\t\t\tlet rowSpan = 1;\n\t\t\tlet chainChild = header.subHeaders[0];\n\t\t\twhile (chainChild) {\n\t\t\t\tchainChild.rowSpan = 0;\n\t\t\t\trowSpan++;\n\t\t\t\tchainChild = chainChild.subHeaders.length === 1 && chainChild.subHeaders[0].column === header.column ? chainChild.subHeaders[0] : void 0;\n\t\t\t}\n\t\t\theader.rowSpan = rowSpan;\n\t\t} else header.rowSpan = 1;\n\t}\n}\n/**\n* Builds the nested header group structure for a table.\n*\n* The result accounts for visible leaf columns, pinned column groups, and placeholder headers needed to render multi-level headers.\n*/\nfunction buildHeaderGroups(allColumns, columnsToGroup, table, headerFamily) {\n\tconst maxDepth = getMaxHeaderDepth(allColumns);\n\tconst headerGroups = [];\n\tconst headerGroupInitFns = table._headerGroupInstanceInitFns;\n\tconst bottomHeaders = new Array(columnsToGroup.length);\n\tfor (let i = 0; i < columnsToGroup.length; i++) {\n\t\tif (!(i in columnsToGroup)) continue;\n\t\tbottomHeaders[i] = constructHeader(table, columnsToGroup[i], {\n\t\t\tdepth: maxDepth,\n\t\t\tindex: i\n\t\t});\n\t}\n\tconstructHeaderGroup(bottomHeaders, maxDepth - 1, table, headerFamily, headerGroups, headerGroupInitFns);\n\theaderGroups.reverse();\n\tupdateHeaderSpans(headerGroups[0]?.headers ?? []);\n\treturn headerGroups;\n}\n\n//#endregion\nexport { buildHeaderGroups };","//#region src/core/columns/constructColumn.ts\n/**\n* Creates or retrieves the column prototype for a table.\n* The prototype is cached on the table and shared by all column instances.\n*/\nfunction getColumnPrototype(table) {\n\tif (!table._columnPrototype) {\n\t\ttable._columnPrototype = { table };\n\t\tconst features = Object.values(table._features);\n\t\tfor (let i = 0; i < features.length; i++) features[i].assignColumnPrototype?.(table._columnPrototype, table);\n\t}\n\treturn table._columnPrototype;\n}\n/**\n* Constructs a column instance from normalized table internals.\n*\n* This wires core properties, feature prototype APIs, and instance data used by table rendering and row-model operations.\n*/\nfunction constructColumn(table, columnDef, depth, parent) {\n\tconst resolvedColumnDef = {\n\t\t...table.getDefaultColumnDef(),\n\t\t...columnDef\n\t};\n\tconst accessorKey = resolvedColumnDef.accessorKey;\n\tconst accessorKeyString = accessorKey === void 0 ? void 0 : String(accessorKey);\n\tconst id = resolvedColumnDef.id ?? accessorKeyString?.replaceAll(\".\", \"_\") ?? (typeof resolvedColumnDef.header === \"string\" ? resolvedColumnDef.header : void 0);\n\tlet accessorFn;\n\tif (resolvedColumnDef.accessorFn) accessorFn = resolvedColumnDef.accessorFn;\n\telse if (accessorKey !== void 0) if (typeof accessorKey === \"string\" && accessorKey.includes(\".\")) {\n\t\tconst keys = accessorKey.split(\".\");\n\t\taccessorFn = (originalRow) => {\n\t\t\tlet result = originalRow;\n\t\t\tfor (let i = 0; i < keys.length; i++) {\n\t\t\t\tconst key = keys[i];\n\t\t\t\tresult = result?.[key];\n\t\t\t\tif (process.env.NODE_ENV === \"development\" && result === void 0) console.warn(`\"${key}\" in deeply nested key \"${accessorKey}\" returned undefined.`);\n\t\t\t}\n\t\t\treturn result;\n\t\t};\n\t} else accessorFn = (originalRow) => originalRow[resolvedColumnDef.accessorKey];\n\tif (!id) {\n\t\tif (process.env.NODE_ENV === \"development\") throw new Error(resolvedColumnDef.accessorFn ? `coreColumnsFeature require an id when using an accessorFn` : `coreColumnsFeature require an id when using a non-string header`);\n\t\tthrow new Error();\n\t}\n\tconst columnPrototype = getColumnPrototype(table);\n\tconst column = Object.create(columnPrototype);\n\tcolumn.accessorFn = accessorFn;\n\tcolumn.columnDef = resolvedColumnDef;\n\tcolumn.columns = [];\n\tcolumn.depth = depth;\n\tcolumn.id = `${String(id)}`;\n\tcolumn.parent = parent;\n\tconst initFns = table._columnInstanceInitFns;\n\tfor (let i = 0; i < initFns.length; i++) initFns[i](column);\n\treturn column;\n}\n\n//#endregion\nexport { constructColumn };","import { callMemoOrStaticFn, cloneState, makeObjectMap, setStateSlice } from \"../../utils.js\";\nimport { table_getPinnedVisibleLeafColumns } from \"../column-pinning/columnPinningFeature.utils.js\";\n\n//#region src/features/column-ordering/columnOrderingFeature.utils.ts\n/**\n* Creates the default column order state.\n*\n* The feature default is an empty array, meaning leaf columns keep their natural\n* definition order. Reset APIs use this value when `defaultState` is `true`.\n*\n* @example\n* ```ts\n* const order = getDefaultColumnOrderState()\n* ```\n*/\nfunction getDefaultColumnOrderState() {\n\treturn [];\n}\n/**\n* Builds column-id to index records for each visible pinning region.\n*\n* All four regions are built in one pass so a single memo entry serves every\n* `column_getIndex` lookup without per-column scans.\n*\n* @example\n* ```ts\n* const indexes = table_getColumnIndexes(table)\n* ```\n*/\nfunction table_getColumnIndexes(table) {\n\tconst buildIndexes = (columns) => {\n\t\tconst indexes = makeObjectMap();\n\t\tfor (let i = 0; i < columns.length; i++) indexes[columns[i].id] = i;\n\t\treturn indexes;\n\t};\n\treturn {\n\t\tall: buildIndexes(table_getPinnedVisibleLeafColumns(table)),\n\t\tcenter: buildIndexes(table_getPinnedVisibleLeafColumns(table, \"center\")),\n\t\tstart: buildIndexes(table_getPinnedVisibleLeafColumns(table, \"start\")),\n\t\tend: buildIndexes(table_getPinnedVisibleLeafColumns(table, \"end\"))\n\t};\n}\n/**\n* Finds this column's index within a visible pinning region.\n*\n* Pass `'start'`, `'center'`, or `'end'` to search that region; omit the\n* position to search the full visible leaf column list.\n*\n* @example\n* ```ts\n* const index = column_getIndex(column, 'center')\n* ```\n*/\nfunction column_getIndex(column, position) {\n\treturn callMemoOrStaticFn(column.table, \"getColumnIndexes\", table_getColumnIndexes)[position === \"start\" ? \"start\" : position === \"end\" ? \"end\" : position === \"center\" ? \"center\" : \"all\"][column.id] ?? -1;\n}\n/**\n* Checks whether this column is the first visible column in a pinning region.\n*\n* The same `position` semantics as `column_getIndex` apply.\n*\n* @example\n* ```ts\n* const isFirst = column_getIsFirstColumn(column, 'start')\n* ```\n*/\nfunction column_getIsFirstColumn(column, position) {\n\treturn table_getPinnedVisibleLeafColumns(column.table, position)[0]?.id === column.id;\n}\n/**\n* Checks whether this column is the last visible column in a pinning region.\n*\n* The same `position` semantics as `column_getIndex` apply.\n*\n* @example\n* ```ts\n* const isLast = column_getIsLastColumn(column, 'end')\n* ```\n*/\nfunction column_getIsLastColumn(column, position) {\n\tconst columns = table_getPinnedVisibleLeafColumns(column.table, position);\n\treturn columns[columns.length - 1]?.id === column.id;\n}\n/**\n* Routes a column order updater through the table's column-order change handler.\n*\n* The updater may be a next ordered id array or a function of the previous\n* array, matching the instance `table.setColumnOrder` behavior.\n*\n* @example\n* ```ts\n* table_setColumnOrder(table, ['firstName', 'lastName', 'age'])\n* ```\n*/\nfunction table_setColumnOrder(table, updater) {\n\tsetStateSlice(table, \"columnOrder\", updater);\n}\n/**\n* Resets `columnOrder` to the configured initial state or feature default.\n*\n* With no argument, the reset clones `table.initialState.columnOrder` when it\n* exists. Passing `true` ignores initial state and resets to `[]`.\n*\n* @example\n* ```ts\n* table_resetColumnOrder(table)\n* table_resetColumnOrder(table, true)\n* ```\n*/\nfunction table_resetColumnOrder(table, defaultState) {\n\ttable_setColumnOrder(table, defaultState ? [] : cloneState(table.initialState.columnOrder ?? []));\n}\n/**\n* Creates the ordering function used to arrange leaf columns.\n*\n* The returned function applies `state.columnOrder`, preserves unspecified\n* columns in their original order, then delegates to grouping rules.\n*\n* @example\n* ```ts\n* const orderColumnsForTable = table_getOrderColumnsFn(table)\n* ```\n*/\nfunction table_getOrderColumnsFn(table) {\n\tconst columnOrder = table.atoms.columnOrder?.get();\n\treturn (columns) => {\n\t\tlet orderedColumns = [];\n\t\tif (!columnOrder?.length) orderedColumns = columns;\n\t\telse {\n\t\t\tconst remaining = /* @__PURE__ */ new Map();\n\t\t\tfor (let i = 0; i < columns.length; i++) {\n\t\t\t\tconst column = columns[i];\n\t\t\t\tremaining.set(column.id, column);\n\t\t\t}\n\t\t\tfor (let i = 0; i < columnOrder.length; i++) {\n\t\t\t\tconst id = columnOrder[i];\n\t\t\t\tconst column = remaining.get(id);\n\t\t\t\tif (column) {\n\t\t\t\t\torderedColumns.push(column);\n\t\t\t\t\tremaining.delete(id);\n\t\t\t\t}\n\t\t\t}\n\t\t\tfor (let i = 0; i < columns.length; i++) {\n\t\t\t\tconst column = columns[i];\n\t\t\t\tif (remaining.has(column.id)) orderedColumns.push(column);\n\t\t\t}\n\t\t}\n\t\treturn orderColumns(table, orderedColumns);\n\t};\n}\n/**\n* Applies grouped-column placement rules to an already ordered leaf-column list.\n*\n* `groupedColumnMode: 'remove'` drops grouped columns from the list.\n* `groupedColumnMode: 'reorder'` moves grouped columns to the front in grouping\n* state order.\n*\n* @example\n* ```ts\n* const orderedColumns = orderColumns(table, leafColumns)\n* ```\n*/\nfunction orderColumns(table, leafColumns) {\n\tconst grouping = table.atoms.grouping?.get() ?? [];\n\tconst { groupedColumnMode } = table.options;\n\tif (!grouping.length || !groupedColumnMode) return leafColumns;\n\tconst nonGroupingColumns = leafColumns.filter((col) => !grouping.includes(col.id));\n\tif (groupedColumnMode === \"remove\") return nonGroupingColumns;\n\tconst leafColumnsById = /* @__PURE__ */ new Map();\n\tfor (let i = 0; i < leafColumns.length; i++) {\n\t\tconst col = leafColumns[i];\n\t\tleafColumnsById.set(col.id, col);\n\t}\n\tconst groupingColumns = [];\n\tfor (let i = 0; i < grouping.length; i++) {\n\t\tconst col = leafColumnsById.get(grouping[i]);\n\t\tif (col) groupingColumns.push(col);\n\t}\n\treturn [...groupingColumns, ...nonGroupingColumns];\n}\n\n//#endregion\nexport { column_getIndex, column_getIsFirstColumn, column_getIsLastColumn, getDefaultColumnOrderState, orderColumns, table_getColumnIndexes, table_getOrderColumnsFn, table_resetColumnOrder, table_setColumnOrder };","import { callMemoOrStaticFn, makeObjectMap } from \"../../utils.js\";\nimport { table_getOrderColumnsFn } from \"../../features/column-ordering/columnOrderingFeature.utils.js\";\nimport { constructColumn } from \"./constructColumn.js\";\n\n//#region src/core/columns/coreColumnsFeature.utils.ts\n/**\n* Flattens this column and every descendant column into a single array.\n*\n* Group columns appear before their child columns, which matches the normalized\n* column hierarchy produced during table construction.\n*\n* @example\n* ```ts\n* const flatColumns = column_getFlatColumns(column)\n* ```\n*/\nfunction column_getFlatColumns(column) {\n\treturn [column, ...column.columns.flatMap((col) => col.getFlatColumns())];\n}\n/**\n* Collects the terminal leaf columns below this column.\n*\n* Group columns return their ordered descendants. Non-group columns return an\n* array containing only the column itself.\n*\n* @example\n* ```ts\n* const leafColumns = column_getLeafColumns(column)\n* ```\n*/\nfunction column_getLeafColumns(column) {\n\tif (column.columns.length) {\n\t\tconst leafColumns = column.columns.flatMap((col) => col.getLeafColumns());\n\t\treturn callMemoOrStaticFn(column.table, \"getOrderColumns\", table_getOrderColumnsFn)(leafColumns);\n\t}\n\treturn [column];\n}\n/**\n* Merges built-in, feature, and user default column definitions.\n*\n* Built-in defaults provide a header and fallback cell renderer, feature\n* defaults can add feature-specific column options, and\n* `options.defaultColumn` wins last.\n*\n* @example\n* ```ts\n* const defaultColumn = table_getDefaultColumnDef(table)\n* ```\n*/\nfunction table_getDefaultColumnDef(table) {\n\treturn {\n\t\theader: (props) => {\n\t\t\tconst resolvedColumnDef = props.header.column.columnDef;\n\t\t\tif (resolvedColumnDef.accessorKey) return resolvedColumnDef.accessorKey;\n\t\t\tif (resolvedColumnDef.accessorFn) return resolvedColumnDef.id;\n\t\t\treturn null;\n\t\t},\n\t\tcell: (props) => props.renderValue()?.toString?.() ?? null,\n\t\t...Object.values(table._features).reduce((obj, feature) => {\n\t\t\treturn Object.assign(obj, feature.getDefaultColumnDef?.());\n\t\t}, {}),\n\t\t...table.options.defaultColumn\n\t};\n}\nfunction constructColumns(table, columnDefs, parent, depth = 0) {\n\tconst columns = new Array(columnDefs.length);\n\tfor (let i = 0; i < columnDefs.length; i++) {\n\t\tif (!(i in columnDefs)) continue;\n\t\tconst columnDef = columnDefs[i];\n\t\tconst column = constructColumn(table, columnDef, depth, parent);\n\t\tconst groupingColumnDef = columnDef;\n\t\tcolumn.columns = groupingColumnDef.columns ? constructColumns(table, groupingColumnDef.columns, column, depth + 1) : [];\n\t\tcolumns[i] = column;\n\t}\n\treturn columns;\n}\n/**\n* Normalizes `options.columns` into the table's nested column tree.\n*\n* Each column definition is constructed with its parent and depth, and group\n* column children are recursively constructed.\n*\n* @example\n* ```ts\n* const columns = table_getAllColumns(table)\n* ```\n*/\nfunction table_getAllColumns(table) {\n\treturn constructColumns(table, table.options.columns);\n}\n/**\n* Flattens every table column, including group columns and leaf columns.\n*\n* Use this when parent/group columns must be included in addition to data leaf\n* columns.\n*\n* @example\n* ```ts\n* const flatColumns = table_getAllFlatColumns(table)\n* ```\n*/\nfunction table_getAllFlatColumns(table) {\n\treturn table.getAllColumns().flatMap((column) => column.getFlatColumns());\n}\n/**\n* Builds an id lookup for every flat column in the table.\n*\n* Group columns and leaf columns are included. Later columns with the same id\n* replace earlier entries.\n*\n* @example\n* ```ts\n* const columnsById = table_getAllFlatColumnsById(table)\n* ```\n*/\nfunction table_getAllFlatColumnsById(table) {\n\tconst result = makeObjectMap();\n\tconst flatColumns = table.getAllFlatColumns();\n\tfor (let i = 0; i < flatColumns.length; i++) {\n\t\tconst column = flatColumns[i];\n\t\tresult[column.id] = column;\n\t}\n\treturn result;\n}\n/**\n* Collects all terminal leaf columns in their current table order.\n*\n* Column ordering features can reorder the collected leaves before the result\n* is returned.\n*\n* @example\n* ```ts\n* const leafColumns = table_getAllLeafColumns(table)\n* ```\n*/\nfunction table_getAllLeafColumns(table) {\n\tconst leafColumns = table.getAllColumns().flatMap((c) => c.getLeafColumns());\n\treturn callMemoOrStaticFn(table, \"getOrderColumns\", table_getOrderColumnsFn)(leafColumns);\n}\n/**\n* Builds an id lookup for terminal leaf columns only.\n*\n* Parent/group columns are excluded, making this lookup appropriate for row\n* cells and feature state keyed by data columns.\n*\n* @example\n* ```ts\n* const leavesById = table_getAllLeafColumnsById(table)\n* ```\n*/\nfunction table_getAllLeafColumnsById(table) {\n\tconst result = makeObjectMap();\n\tconst leafColumns = table.getAllLeafColumns();\n\tfor (let i = 0; i < leafColumns.length; i++) {\n\t\tconst column = leafColumns[i];\n\t\tresult[column.id] = column;\n\t}\n\treturn result;\n}\n/**\n* Looks up a column by id from the flat column map.\n*\n* The lookup can return group columns or leaf columns. In development, a\n* missing id logs a warning to help catch stale column references.\n*\n* @example\n* ```ts\n* const column = table_getColumn(table, 'firstName')\n* ```\n*/\nfunction table_getColumn(table, columnId) {\n\tconst column = table.getAllFlatColumnsById()[columnId];\n\tif (process.env.NODE_ENV === \"development\" && !column) console.warn(`[Table] Column with id '${columnId}' does not exist.`);\n\treturn column;\n}\n\n//#endregion\nexport { column_getFlatColumns, column_getLeafColumns, table_getAllColumns, table_getAllFlatColumns, table_getAllFlatColumnsById, table_getAllLeafColumns, table_getAllLeafColumnsById, table_getColumn, table_getDefaultColumnDef };","import { assignPrototypeAPIs, assignTableAPIs } from \"../../utils.js\";\nimport { column_getFlatColumns, column_getLeafColumns, table_getAllColumns, table_getAllFlatColumns, table_getAllFlatColumnsById, table_getAllLeafColumns, table_getAllLeafColumnsById, table_getColumn, table_getDefaultColumnDef } from \"./coreColumnsFeature.utils.js\";\n\n//#region src/core/columns/coreColumnsFeature.ts\n/**\n* Core feature that builds the column tree and exposes table/column APIs.\n*/\nconst coreColumnsFeature = {\n\tassignColumnPrototype: (prototype, table) => {\n\t\tassignPrototypeAPIs(\"coreColumnsFeature\", prototype, table, {\n\t\t\tcolumn_getFlatColumns: {\n\t\t\t\tfn: (column) => column_getFlatColumns(column),\n\t\t\t\tmemoDeps: (column) => [column.table.options.columns]\n\t\t\t},\n\t\t\tcolumn_getLeafColumns: {\n\t\t\t\tfn: (column) => column_getLeafColumns(column),\n\t\t\t\tmemoDeps: (column) => [\n\t\t\t\t\tcolumn.table.atoms.columnOrder?.get(),\n\t\t\t\t\tcolumn.table.atoms.grouping?.get(),\n\t\t\t\t\tcolumn.table.options.columns,\n\t\t\t\t\tcolumn.table.options.groupedColumnMode\n\t\t\t\t]\n\t\t\t}\n\t\t});\n\t},\n\tconstructTableAPIs: (table) => {\n\t\tassignTableAPIs(\"coreColumnsFeature\", table, {\n\t\t\ttable_getDefaultColumnDef: {\n\t\t\t\tfn: () => table_getDefaultColumnDef(table),\n\t\t\t\tmemoDeps: () => [table.options.defaultColumn]\n\t\t\t},\n\t\t\ttable_getAllColumns: {\n\t\t\t\tfn: () => table_getAllColumns(table),\n\t\t\t\tmemoDeps: () => [table.options.columns]\n\t\t\t},\n\t\t\ttable_getAllFlatColumns: {\n\t\t\t\tfn: () => table_getAllFlatColumns(table),\n\t\t\t\tmemoDeps: () => [table.options.columns]\n\t\t\t},\n\t\t\ttable_getAllFlatColumnsById: {\n\t\t\t\tfn: () => table_getAllFlatColumnsById(table),\n\t\t\t\tmemoDeps: () => [table.options.columns]\n\t\t\t},\n\t\t\ttable_getAllLeafColumns: {\n\t\t\t\tfn: () => table_getAllLeafColumns(table),\n\t\t\t\tmemoDeps: () => [\n\t\t\t\t\ttable.atoms.columnOrder?.get(),\n\t\t\t\t\ttable.atoms.grouping?.get(),\n\t\t\t\t\ttable.options.columns,\n\t\t\t\t\ttable.options.groupedColumnMode\n\t\t\t\t]\n\t\t\t},\n\t\t\ttable_getAllLeafColumnsById: {\n\t\t\t\tfn: () => table_getAllLeafColumnsById(table),\n\t\t\t\tmemoDeps: () => [table.getAllLeafColumns()]\n\t\t\t},\n\t\t\ttable_getColumn: { fn: (columnId) => table_getColumn(table, columnId) }\n\t\t});\n\t}\n};\n\n//#endregion\nexport { coreColumnsFeature };","import { callMemoOrStaticFn } from \"../../utils.js\";\nimport { column_getIsVisible, table_getVisibleLeafColumns } from \"../../features/column-visibility/columnVisibilityFeature.utils.js\";\nimport { buildHeaderGroups } from \"./buildHeaderGroups.js\";\nimport { getDefaultColumnPinningState } from \"../../features/column-pinning/columnPinningFeature.utils.js\";\n\n//#region src/core/headers/coreHeadersFeature.utils.ts\nfunction collectLeafHeaders(header, leafHeaders) {\n\tfor (let i = 0; i < header.subHeaders.length; i++) collectLeafHeaders(header.subHeaders[i], leafHeaders);\n\tleafHeaders.push(header);\n}\n/**\n* Walks a header tree and collects all descendant leaf headers.\n*\n* The header itself is included after its descendants, matching the recursive\n* shape used by nested header groups.\n*\n* @example\n* ```ts\n* const leafHeaders = header_getLeafHeaders(header)\n* ```\n*/\nfunction header_getLeafHeaders(header) {\n\tconst leafHeaders = [];\n\tcollectLeafHeaders(header, leafHeaders);\n\treturn leafHeaders;\n}\n/**\n* Builds the render context passed to a column's `header` or `footer` template.\n*\n* The context contains the header, its column, and the owning table instance.\n*\n* @example\n* ```ts\n* const context = header_getContext(header)\n* ```\n*/\nfunction header_getContext(header) {\n\treturn {\n\t\tcolumn: header.column,\n\t\theader,\n\t\ttable: header.column.table\n\t};\n}\n/**\n* Builds visible header groups for the current column tree.\n*\n* Column visibility and pinning are applied before groups are built. When no\n* columns are pinned, the fast path skips pin partitioning.\n*\n* @example\n* ```ts\n* const headerGroups = table_getHeaderGroups(table)\n* ```\n*/\nfunction table_getHeaderGroups(table) {\n\tconst { start, end } = table.atoms.columnPinning?.get() ?? getDefaultColumnPinningState();\n\tconst allColumns = table.getAllColumns();\n\tconst leafColumns = callMemoOrStaticFn(table, \"getVisibleLeafColumns\", table_getVisibleLeafColumns);\n\tif (!start.length && !end.length) return buildHeaderGroups(allColumns, leafColumns, table);\n\tconst leafColumnsById = table.getAllLeafColumnsById();\n\tconst leftColumns = [];\n\tfor (let i = 0; i < start.length; i++) {\n\t\tconst column = leafColumnsById[start[i]];\n\t\tif (column && callMemoOrStaticFn(column, \"getIsVisible\", column_getIsVisible)) leftColumns.push(column);\n\t}\n\tconst rightColumns = [];\n\tfor (let i = 0; i < end.length; i++) {\n\t\tconst column = leafColumnsById[end[i]];\n\t\tif (column && callMemoOrStaticFn(column, \"getIsVisible\", column_getIsVisible)) rightColumns.push(column);\n\t}\n\tconst centerColumns = leafColumns.filter((column) => !start.includes(column.id) && !end.includes(column.id));\n\treturn buildHeaderGroups(allColumns, [\n\t\t...leftColumns,\n\t\t...centerColumns,\n\t\t...rightColumns\n\t], table);\n}\n/**\n* Builds footer groups by reversing the current header groups.\n*\n* Footer rendering uses the same header objects and grouping structure, but\n* renders them from leaf level back toward the root.\n*\n* @example\n* ```ts\n* const footerGroups = table_getFooterGroups(table)\n* ```\n*/\nfunction table_getFooterGroups(table) {\n\treturn [...table.getHeaderGroups()].reverse();\n}\n/**\n* Flattens every header from every header group into one array.\n*\n* The result includes parent headers and placeholder headers, in header-group\n* order from top to bottom.\n*\n* @example\n* ```ts\n* const flatHeaders = table_getFlatHeaders(table)\n* ```\n*/\nfunction table_getFlatHeaders(table) {\n\tconst headerGroups = table.getHeaderGroups();\n\tconst result = [];\n\tfor (let i = 0; i < headerGroups.length; i++) {\n\t\tconst headers = headerGroups[i].headers;\n\t\tfor (let j = 0; j < headers.length; j++) result.push(headers[j]);\n\t}\n\treturn result;\n}\n/**\n* Collects only the leaf headers from the current header tree.\n*\n* Parent/group headers are skipped, making the result suitable for rendering\n* one header per visible leaf column.\n*\n* @example\n* ```ts\n* const leafHeaders = table_getLeafHeaders(table)\n* ```\n*/\nfunction table_getLeafHeaders(table) {\n\tconst topHeaders = table.getHeaderGroups()[0]?.headers ?? [];\n\tconst result = [];\n\tfor (let i = 0; i < topHeaders.length; i++) {\n\t\tconst leafHeaders = topHeaders[i].getLeafHeaders();\n\t\tfor (let j = 0; j < leafHeaders.length; j++) result.push(leafHeaders[j]);\n\t}\n\treturn result;\n}\n\n//#endregion\nexport { header_getContext, header_getLeafHeaders, table_getFlatHeaders, table_getFooterGroups, table_getHeaderGroups, table_getLeafHeaders };","import { assignPrototypeAPIs, assignTableAPIs } from \"../../utils.js\";\nimport { header_getContext, header_getLeafHeaders, table_getFlatHeaders, table_getFooterGroups, table_getHeaderGroups, table_getLeafHeaders } from \"./coreHeadersFeature.utils.js\";\n\n//#region src/core/headers/coreHeadersFeature.ts\n/**\n* Core feature that builds header groups and exposes header context APIs.\n*/\nconst coreHeadersFeature = {\n\tassignHeaderPrototype: (prototype, table) => {\n\t\tassignPrototypeAPIs(\"coreHeadersFeature\", prototype, table, {\n\t\t\theader_getLeafHeaders: {\n\t\t\t\tfn: (header) => header_getLeafHeaders(header),\n\t\t\t\tmemoDeps: (header) => [header.column.table.options.columns]\n\t\t\t},\n\t\t\theader_getContext: {\n\t\t\t\tfn: (header) => header_getContext(header),\n\t\t\t\tmemoDeps: (header) => [header.column.table.options.columns]\n\t\t\t}\n\t\t});\n\t},\n\tconstructTableAPIs: (table) => {\n\t\tassignTableAPIs(\"coreHeadersFeature\", table, {\n\t\t\ttable_getHeaderGroups: {\n\t\t\t\tfn: () => table_getHeaderGroups(table),\n\t\t\t\tmemoDeps: () => [\n\t\t\t\t\ttable.options.columns,\n\t\t\t\t\ttable.atoms.columnOrder?.get(),\n\t\t\t\t\ttable.atoms.grouping?.get(),\n\t\t\t\t\ttable.atoms.columnPinning?.get(),\n\t\t\t\t\ttable.atoms.columnVisibility?.get(),\n\t\t\t\t\ttable.options.groupedColumnMode\n\t\t\t\t]\n\t\t\t},\n\t\t\ttable_getFooterGroups: {\n\t\t\t\tfn: () => table_getFooterGroups(table),\n\t\t\t\tmemoDeps: () => [table.getHeaderGroups()]\n\t\t\t},\n\t\t\ttable_getFlatHeaders: {\n\t\t\t\tfn: () => table_getFlatHeaders(table),\n\t\t\t\tmemoDeps: () => [table.getHeaderGroups()]\n\t\t\t},\n\t\t\ttable_getLeafHeaders: {\n\t\t\t\tfn: () => table_getLeafHeaders(table),\n\t\t\t\tmemoDeps: () => [table.getHeaderGroups()]\n\t\t\t}\n\t\t});\n\t}\n};\n\n//#endregion\nexport { coreHeadersFeature };","import { makeObjectMap } from \"../../utils.js\";\n\n//#region src/core/rows/constructRow.ts\n/**\n* Creates or retrieves the row prototype for a table.\n* The prototype is cached on the table and shared by all row instances.\n*/\nfunction getRowPrototype(table) {\n\tif (!table._rowPrototype) {\n\t\ttable._rowPrototype = { table };\n\t\tconst features = Object.values(table._features);\n\t\tfor (let i = 0; i < features.length; i++) features[i].assignRowPrototype?.(table._rowPrototype, table);\n\t}\n\treturn table._rowPrototype;\n}\n/**\n* Constructs a row instance from normalized table internals.\n*\n* This wires core properties, feature prototype APIs, and instance data used by table rendering and row-model operations.\n*/\nconst constructRow = (table, id, original, rowIndex, depth, subRows, parentId) => {\n\tconst rowPrototype = getRowPrototype(table);\n\tconst row = Object.create(rowPrototype);\n\trow._displayIndexCache = -1;\n\trow._uniqueValuesCache = makeObjectMap();\n\trow._valuesCache = makeObjectMap();\n\trow.depth = depth;\n\trow.id = id;\n\trow.index = rowIndex;\n\trow.original = original;\n\trow.parentId = parentId;\n\trow.subRows = subRows ?? [];\n\tconst initFns = table._rowInstanceInitFns;\n\tfor (let i = 0; i < initFns.length; i++) initFns[i](row);\n\treturn row;\n};\n\n//#endregion\nexport { constructRow };","//#region src/features/row-sorting/sortFns.ts\n/**\n* Regular expression used to split mixed text and numeric chunks.\n*\n* The alphanumeric sort functions use these chunks for natural sorting of\n* strings like `item2` before `item10`.\n*/\nconst reSplitAlphaNumeric = /([0-9]+)/gm;\n/**\n* Builds a `SortFn` from a value-level comparator plus an optional\n* `resolveDataValue` normalizer.\n*\n* The `sort` comparator receives both rows' data values, each already passed\n* through `resolveDataValue` when one is defined. Keeping normalization in the\n* resolver means a variant of an existing sorting function only has to swap\n* the resolver, not re-implement the comparison.\n*\n* The definition is attached to the returned function, so a variant can be\n* created by spreading a built-in sorting function and overriding what\n* differs:\n*\n* ```ts\n* const stripDiacritics = (value: string) =>\n* value.normalize('NFD').replace(/\\p{Diacritic}/gu, '')\n*\n* const alphanumericIgnoreDiacritics = constructSortFn({\n* ...sortFn_alphanumeric,\n* resolveDataValue: (value) =>\n* stripDiacritics(sortFn_alphanumeric.resolveDataValue!(value)),\n* })\n* ```\n*/\nfunction constructSortFn(def) {\n\tconst sortFn = Object.assign((rowA, rowB, columnId) => {\n\t\tlet dataValueA = rowA.getValue(columnId);\n\t\tlet dataValueB = rowB.getValue(columnId);\n\t\tconst resolveDataValue = sortFn.resolveDataValue;\n\t\tif (resolveDataValue) {\n\t\t\tdataValueA = resolveDataValue(dataValueA);\n\t\t\tdataValueB = resolveDataValue(dataValueB);\n\t\t}\n\t\treturn sortFn.sort(dataValueA, dataValueB, rowA, rowB, columnId);\n\t}, def);\n\treturn sortFn;\n}\n/**\n* Sorts rows with the built-in alphanumeric strategy.\n*\n* This comparator returns ascending-order results; descending order is applied by the sorting row model.\n*/\nconst sortFn_alphanumeric = constructSortFn({\n\tresolveDataValue: (dataValue) => toString(dataValue).toLowerCase(),\n\tsort: (dataValueA, dataValueB) => compareAlphanumeric(dataValueA, dataValueB)\n});\n/**\n* Sorts rows with the built-in alphanumeric case sensitive strategy.\n*\n* This comparator returns ascending-order results; descending order is applied by the sorting row model.\n*/\nconst sortFn_alphanumericCaseSensitive = constructSortFn({\n\tresolveDataValue: (dataValue) => toString(dataValue),\n\tsort: (dataValueA, dataValueB) => compareAlphanumeric(dataValueA, dataValueB)\n});\n/**\n* Sorts rows with the built-in text strategy.\n*\n* This comparator returns ascending-order results; descending order is applied by the sorting row model.\n*/\nconst sortFn_text = constructSortFn({\n\tresolveDataValue: (dataValue) => toString(dataValue).toLowerCase(),\n\tsort: (dataValueA, dataValueB) => compareBasic(dataValueA, dataValueB)\n});\n/**\n* Sorts rows with the built-in text case sensitive strategy.\n*\n* This comparator returns ascending-order results; descending order is applied by the sorting row model.\n*/\nconst sortFn_textCaseSensitive = constructSortFn({\n\tresolveDataValue: (dataValue) => toString(dataValue),\n\tsort: (dataValueA, dataValueB) => compareBasic(dataValueA, dataValueB)\n});\n/**\n* Sorts rows with the built-in datetime strategy.\n*\n* This comparator returns ascending-order results; descending order is applied by the sorting row model.\n*/\nconst sortFn_datetime = constructSortFn({\n\tresolveDataValue: (dataValue) => toDateSortValue(dataValue),\n\tsort: (dataValueA, dataValueB) => dataValueA > dataValueB ? 1 : dataValueA < dataValueB ? -1 : 0\n});\n/**\n* Sorts rows with the built-in basic strategy.\n*\n* This comparator returns ascending-order results; descending order is applied by the sorting row model.\n*/\nconst sortFn_basic = constructSortFn({ sort: (dataValueA, dataValueB) => compareBasic(dataValueA, dataValueB) });\nfunction compareBasic(a, b) {\n\treturn a === b ? 0 : a > b ? 1 : -1;\n}\nfunction toDateSortValue(value) {\n\treturn value instanceof Date ? value.getTime() : value;\n}\nfunction toString(a) {\n\tif (typeof a === \"number\") {\n\t\tif (isNaN(a) || a === Infinity || a === -Infinity) return \"\";\n\t\treturn String(a);\n\t}\n\tif (typeof a === \"string\") return a;\n\treturn \"\";\n}\nfunction compareAlphanumeric(aStr, bStr) {\n\tlet ai = 0;\n\tlet bi = 0;\n\tconst aLen = aStr.length;\n\tconst bLen = bStr.length;\n\twhile (ai < aLen && bi < bLen) {\n\t\tconst aIsNumeric = isDigit(aStr.charCodeAt(ai));\n\t\tconst bIsNumeric = isDigit(bStr.charCodeAt(bi));\n\t\tconst aEnd = findChunkEnd(aStr, ai, aIsNumeric);\n\t\tconst bEnd = findChunkEnd(bStr, bi, bIsNumeric);\n\t\tif (!aIsNumeric && !bIsNumeric) {\n\t\t\tconst stringComparison = compareStringChunks(aStr, ai, aEnd, bStr, bi, bEnd);\n\t\t\tif (stringComparison) return stringComparison;\n\t\t\tai = aEnd;\n\t\t\tbi = bEnd;\n\t\t\tcontinue;\n\t\t}\n\t\tif (aIsNumeric !== bIsNumeric) return aIsNumeric ? 1 : -1;\n\t\tconst numericComparison = compareNumericChunks(aStr, ai, aEnd, bStr, bi, bEnd);\n\t\tif (numericComparison) return numericComparison;\n\t\tai = aEnd;\n\t\tbi = bEnd;\n\t}\n\treturn countRemainingChunks(aStr, ai) - countRemainingChunks(bStr, bi);\n}\nfunction isDigit(charCode) {\n\treturn charCode >= 48 && charCode <= 57;\n}\nfunction findChunkEnd(str, start, isNumeric) {\n\tlet end = start + 1;\n\twhile (end < str.length && isDigit(str.charCodeAt(end)) === isNumeric) end++;\n\treturn end;\n}\nfunction compareStringChunks(aStr, aStart, aEnd, bStr, bStart, bEnd) {\n\tconst aLength = aEnd - aStart;\n\tconst bLength = bEnd - bStart;\n\tconst minLength = aLength < bLength ? aLength : bLength;\n\tfor (let i = 0; i < minLength; i++) {\n\t\tconst aCode = aStr.charCodeAt(aStart + i);\n\t\tconst bCode = bStr.charCodeAt(bStart + i);\n\t\tif (aCode > bCode) return 1;\n\t\tif (bCode > aCode) return -1;\n\t}\n\tif (aLength > bLength) return 1;\n\tif (bLength > aLength) return -1;\n\treturn 0;\n}\nfunction compareNumericChunks(aStr, aStart, aEnd, bStr, bStart, bEnd) {\n\tlet aSignificantStart = aStart;\n\twhile (aSignificantStart < aEnd && aStr.charCodeAt(aSignificantStart) === 48) aSignificantStart++;\n\tlet bSignificantStart = bStart;\n\twhile (bSignificantStart < bEnd && bStr.charCodeAt(bSignificantStart) === 48) bSignificantStart++;\n\tconst aSignificantLength = aEnd - aSignificantStart;\n\tconst bSignificantLength = bEnd - bSignificantStart;\n\tif (aSignificantLength === 0 && bSignificantLength === 0) return 0;\n\tif (aSignificantLength <= 15 && bSignificantLength <= 15) {\n\t\tconst an = parseSmallInt(aStr, aSignificantStart, aEnd);\n\t\tconst bn = parseSmallInt(bStr, bSignificantStart, bEnd);\n\t\tif (an > bn) return 1;\n\t\tif (bn > an) return -1;\n\t\treturn 0;\n\t}\n\tconst an = parseInt(aStr.slice(aStart, aEnd), 10);\n\tconst bn = parseInt(bStr.slice(bStart, bEnd), 10);\n\tif (an > bn) return 1;\n\tif (bn > an) return -1;\n\treturn 0;\n}\nfunction parseSmallInt(str, start, end) {\n\tlet result = 0;\n\tfor (let i = start; i < end; i++) result = result * 10 + str.charCodeAt(i) - 48;\n\treturn result;\n}\nfunction countRemainingChunks(str, start) {\n\tlet count = 0;\n\tlet index = start;\n\twhile (index < str.length) {\n\t\tcount++;\n\t\tindex = findChunkEnd(str, index, isDigit(str.charCodeAt(index)));\n\t}\n\treturn count;\n}\n/**\n* The built-in sorting function registry.\n*\n* Registering this full object opts out of tree-shaking: every built-in\n* sorting function ends up in your bundle. Prefer importing the `sortFn_*`\n* functions you actually use and registering just those in the `sortFns`\n* slot, or passing them directly to the `sortFn` column option.\n*\n* @deprecated Import individual `sortFn_*` functions instead for a smaller\n* bundle. This export still works and is not going away in v9, but built-in\n* name resolution (including `sortFn: 'auto'`) only finds functions you\n* register yourself.\n*/\nconst sortFns = {\n\talphanumeric: sortFn_alphanumeric,\n\talphanumericCaseSensitive: sortFn_alphanumericCaseSensitive,\n\tbasic: sortFn_basic,\n\tdatetime: sortFn_datetime,\n\ttext: sortFn_text,\n\ttextCaseSensitive: sortFn_textCaseSensitive\n};\n\n//#endregion\nexport { constructSortFn, reSplitAlphaNumeric, sortFn_alphanumeric, sortFn_alphanumericCaseSensitive, sortFn_basic, sortFn_datetime, sortFn_text, sortFn_textCaseSensitive, sortFns };","import { callMemoOrStaticFn, cloneState, makeObjectMap, setStateSlice } from \"../../utils.js\";\nimport { table_getVisibleLeafColumns } from \"../column-visibility/columnVisibilityFeature.utils.js\";\nimport { applyCellSelectionBoundsOperations, expandCellSelectionBounds } from \"./cellSelectionGeometry.js\";\n\n//#region src/features/cell-selection/cellSelectionFeature.utils.ts\n/**\n* Creates the default cell selection state.\n*\n* The feature default is an empty selection. Reset APIs use this value when\n* `defaultState` is `true`.\n*\n* @example\n* ```ts\n* const selection = getDefaultCellSelectionState()\n* ```\n*/\nfunction getDefaultCellSelectionState() {\n\treturn [];\n}\n/**\n* Routes a cell selection updater through the table's selection change handler.\n*\n* @example\n* ```ts\n* table_setCellSelection(table, (old) => old.slice(0, -1))\n* ```\n*/\nfunction table_setCellSelection(table, updater) {\n\ttable.options.onCellSelectionChange?.(updater);\n}\n/**\n* Resets `cellSelection` to the configured initial state or feature default.\n*\n* With no argument, the reset clones `table.initialState.cellSelection` when it\n* exists. Passing `true` ignores initial state and resets to an empty selection.\n*\n* @example\n* ```ts\n* table_resetCellSelection(table, true)\n* ```\n*/\nfunction table_resetCellSelection(table, defaultState) {\n\tsetStateSlice(table, \"cellSelection\", defaultState ? getDefaultCellSelectionState() : cloneState(table.initialState.cellSelection) ?? getDefaultCellSelectionState());\n}\n/**\n* Schedules a cell selection reset after `data` changes.\n*\n* Ranges are stored as row and column ids, so without this a data swap would\n* leave a selection pointing at rows that no longer exist, or silently\n* re-select cells whenever new data reuses ids. The reset runs when\n* `autoResetAll` or `autoResetCellSelection` allows it, defaulting to on.\n*\n* Resetting to `initialState.cellSelection` rather than to empty means the\n* first row-model computation is a no-op, matching `table_autoResetExpanded`.\n*\n* @example\n* ```ts\n* table_autoResetCellSelection(table)\n* ```\n*/\nfunction table_autoResetCellSelection(table) {\n\tif (!table.atoms.cellSelection) return;\n\tif (table.options.autoResetAll ?? table.options.autoResetCellSelection ?? true) table._reactivity.schedule(() => table_resetCellSelection(table));\n}\n/**\n* Returns the visible leaf columns in the order their cells actually render.\n*\n* This is deliberately not `getVisibleLeafColumns()`, which is\n* visibility-filtered but *not* pinning-reordered, and not `column_getIndex()`,\n* which indexes that same unpinned list. Cells render start-pinned first, then\n* center, then end (see `row_getVisibleCells`), so indexing a selection in the\n* unpinned order would make a dragged rectangle contiguous in index space but\n* visually scattered the moment a column is pinned.\n*\n* The pinning read is inlined rather than delegated to the column pinning\n* utils so this stays correct when that feature is absent, and so the ordering\n* provably matches `row_getVisibleCells`.\n*/\nfunction getDisplayOrderedColumns(table) {\n\tconst columns = callMemoOrStaticFn(table, \"getVisibleLeafColumns\", table_getVisibleLeafColumns);\n\tconst pinning = table.atoms.columnPinning?.get();\n\tif (!pinning || !pinning.start.length && !pinning.end.length) return columns;\n\tconst byId = makeObjectMap();\n\tfor (let i = 0; i < columns.length; i++) byId[columns[i].id] = columns[i];\n\tconst start = [];\n\tfor (let i = 0; i < pinning.start.length; i++) {\n\t\tconst column = byId[pinning.start[i]];\n\t\tif (column) start.push(column);\n\t}\n\tconst end = [];\n\tfor (let i = 0; i < pinning.end.length; i++) {\n\t\tconst column = byId[pinning.end[i]];\n\t\tif (column) end.push(column);\n\t}\n\tconst center = [];\n\tfor (let i = 0; i < columns.length; i++) {\n\t\tconst column = columns[i];\n\t\tif (!pinning.start.includes(column.id) && !pinning.end.includes(column.id)) center.push(column);\n\t}\n\treturn [\n\t\t...start,\n\t\t...center,\n\t\t...end\n\t];\n}\n/**\n* Builds a column id to render-order index map.\n*\n* Registered by this feature so the lookup stays memoized even when\n* `columnOrderingFeature` is absent, since that feature's `getColumnIndexes`\n* static rebuilds all four maps on every call, which would make per-cell reads\n* O(columns).\n*\n* @example\n* ```ts\n* const index = table_getCellSelectionColumnIndexes(table)[columnId]\n* ```\n*/\nfunction table_getCellSelectionColumnIndexes(table) {\n\tconst columns = getDisplayOrderedColumns(table);\n\tconst indexes = makeObjectMap();\n\tfor (let i = 0; i < columns.length; i++) indexes[columns[i].id] = i;\n\treturn indexes;\n}\nconst EMPTY_MERGE_BOUNDS = [];\nfunction probeCellSpanIndex(table) {\n\treturn table.getCellSpanIndex?.();\n}\n/**\n* Resolves the merged-cell rectangles of the rendered rows into selection's\n* own index space.\n*\n* The span index positions rows by their paginated render order while\n* selection positions them by pre-paginated display order, so each merge is\n* mapped through `row.getDisplayIndex()`. A merge whose rows do not map to a\n* contiguous display range is skipped defensively; it then behaves like\n* unmerged cells instead of corrupting the geometry.\n*\n* Returns an empty array when `cellSpanningFeature` is not registered, which\n* keeps every selection code path identical to the span-unaware behavior.\n*\n* @example\n* ```ts\n* const merges = table_getCellSelectionMergeBounds(table)\n* ```\n*/\nfunction table_getCellSelectionMergeBounds(table) {\n\tconst spanIndex = probeCellSpanIndex(table);\n\tif (!spanIndex) return EMPTY_MERGE_BOUNDS;\n\tconst columnIndexes = callMemoOrStaticFn(table, \"getCellSelectionColumnIndexes\", table_getCellSelectionColumnIndexes);\n\tconst merges = [];\n\tfor (const columnId in spanIndex.rowSpans) {\n\t\tconst columnIndex = columnIndexes[columnId];\n\t\tif (columnIndex === void 0) continue;\n\t\tconst spans = spanIndex.rowSpans[columnId];\n\t\tconst spanColumnIndex = spanIndex.columnIndexes[columnId];\n\t\tfor (let r = 0; r < spans.length; r++) {\n\t\t\tconst span = spans[r];\n\t\t\tif (span <= 1) continue;\n\t\t\tconst startRow = spanIndex.rows[r].getDisplayIndex();\n\t\t\tconst endRow = spanIndex.rows[r + span - 1].getDisplayIndex();\n\t\t\tif (startRow < 0 || endRow - startRow !== span - 1) continue;\n\t\t\tconst colSpan = spanColumnIndex === void 0 ? 1 : Math.max(spanIndex.colSpans[r]?.[spanColumnIndex] ?? 1, 1);\n\t\t\tmerges.push({\n\t\t\t\tminRowIndex: startRow,\n\t\t\t\tmaxRowIndex: endRow,\n\t\t\t\tminColumnIndex: columnIndex,\n\t\t\t\tmaxColumnIndex: columnIndex + colSpan - 1\n\t\t\t});\n\t\t}\n\t}\n\tif (spanIndex.colSpans.length) {\n\t\tconst columnIdBySpanIndex = [];\n\t\tfor (const columnId in spanIndex.columnIndexes) columnIdBySpanIndex[spanIndex.columnIndexes[columnId]] = columnId;\n\t\tfor (let r = 0; r < spanIndex.colSpans.length; r++) {\n\t\t\tconst rowColSpans = spanIndex.colSpans[r];\n\t\t\tif (!rowColSpans) continue;\n\t\t\tconst displayRow = spanIndex.rows[r]?.getDisplayIndex() ?? -1;\n\t\t\tif (displayRow < 0) continue;\n\t\t\tfor (let c = 0; c < rowColSpans.length; c++) {\n\t\t\t\tconst span = rowColSpans[c];\n\t\t\t\tif (span <= 1) continue;\n\t\t\t\tconst columnId = columnIdBySpanIndex[c];\n\t\t\t\tif (columnId === void 0) continue;\n\t\t\t\tconst vertical = spanIndex.rowSpans[columnId];\n\t\t\t\tif (vertical && vertical[r] !== 1) continue;\n\t\t\t\tconst columnIndex = columnIndexes[columnId];\n\t\t\t\tif (columnIndex === void 0) continue;\n\t\t\t\tmerges.push({\n\t\t\t\t\tminRowIndex: displayRow,\n\t\t\t\t\tmaxRowIndex: displayRow,\n\t\t\t\t\tminColumnIndex: columnIndex,\n\t\t\t\t\tmaxColumnIndex: columnIndex + span - 1\n\t\t\t\t});\n\t\t\t}\n\t\t}\n\t}\n\treturn merges;\n}\nfunction findMergeBoundsAt(merges, rowIndex, columnIndex) {\n\tfor (let i = 0; i < merges.length; i++) {\n\t\tconst merge = merges[i];\n\t\tif (rowIndex >= merge.minRowIndex && rowIndex <= merge.maxRowIndex && columnIndex >= merge.minColumnIndex && columnIndex <= merge.maxColumnIndex) return merge;\n\t}\n}\n/**\n* Resolves a row id to its display-order index, or `-1` when it no longer\n* identifies a row in the current order.\n*\n* Callers must have already called `table.getRowsInDisplayOrder()`, which is\n* what populates the display index cache each row reads.\n*/\nfunction resolveRowIndex(table, rows, rowId) {\n\tconst row = table.getPrePaginatedRowModel().rowsById[rowId] ?? table.getCoreRowModel().rowsById[rowId];\n\tif (!row) return -1;\n\tconst index = row.getDisplayIndex();\n\tif (index < 0 || index >= rows.length || rows[index]?.id !== rowId) return -1;\n\treturn index;\n}\n/**\n* Resolves ordered range operations into disjoint, positive display-order\n* index rectangles.\n*\n* This is the single cache every per-cell read goes through, so index lookups\n* happen once per invalidation rather than once per cell. A range whose corners\n* no longer resolve, for example because its anchor row was filtered out, is\n* omitted rather than clamped, so it contributes nothing while remaining in\n* state and returns intact when the filter clears.\n*\n* @example\n* ```ts\n* const bounds = table_getCellSelectionBounds(table)\n* ```\n*/\nfunction table_getCellSelectionBounds(table) {\n\tconst ranges = table.atoms.cellSelection?.get();\n\tif (!ranges?.length) return [];\n\tconst rows = table.getRowsInDisplayOrder();\n\tconst columnIndexes = callMemoOrStaticFn(table, \"getCellSelectionColumnIndexes\", table_getCellSelectionColumnIndexes);\n\tconst operations = [];\n\tfor (let i = 0; i < ranges.length; i++) {\n\t\tconst range = ranges[i];\n\t\tconst anchorRowIndex = resolveRowIndex(table, rows, range.anchorRowId);\n\t\tconst focusRowIndex = resolveRowIndex(table, rows, range.focusRowId);\n\t\tconst anchorColumnIndex = columnIndexes[range.anchorColumnId] ?? -1;\n\t\tconst focusColumnIndex = columnIndexes[range.focusColumnId] ?? -1;\n\t\tif (anchorRowIndex < 0 || focusRowIndex < 0 || anchorColumnIndex < 0 || focusColumnIndex < 0) continue;\n\t\toperations.push({\n\t\t\tminRowIndex: Math.min(anchorRowIndex, focusRowIndex),\n\t\t\tmaxRowIndex: Math.max(anchorRowIndex, focusRowIndex),\n\t\t\tminColumnIndex: Math.min(anchorColumnIndex, focusColumnIndex),\n\t\t\tmaxColumnIndex: Math.max(anchorColumnIndex, focusColumnIndex),\n\t\t\toperation: range.operation ?? \"include\"\n\t\t});\n\t}\n\tconst merges = callMemoOrStaticFn(table, \"getCellSelectionMergeBounds\", table_getCellSelectionMergeBounds);\n\tif (merges.length) for (let i = 0; i < operations.length; i++) {\n\t\tconst operation = operations[i];\n\t\tconst expanded = expandCellSelectionBounds(operation, merges);\n\t\toperation.minRowIndex = expanded.minRowIndex;\n\t\toperation.maxRowIndex = expanded.maxRowIndex;\n\t\toperation.minColumnIndex = expanded.minColumnIndex;\n\t\toperation.maxColumnIndex = expanded.maxColumnIndex;\n\t}\n\treturn applyCellSelectionBoundsOperations(operations);\n}\n/**\n* Tests whether an index pair falls inside any resolved rectangle.\n*/\nfunction isWithinBounds(bounds, rowIndex, columnIndex) {\n\tfor (let i = 0; i < bounds.length; i++) {\n\t\tconst bound = bounds[i];\n\t\tif (rowIndex >= bound.minRowIndex && rowIndex <= bound.maxRowIndex && columnIndex >= bound.minColumnIndex && columnIndex <= bound.maxColumnIndex) return true;\n\t}\n\treturn false;\n}\n/**\n* Checks whether this cell can currently be selected.\n*\n* A column def opting out with `enableCellSelection: false` wins over the table\n* option, matching how the other per-column enable flags resolve.\n*\n* @example\n* ```ts\n* const canSelect = cell_getCanSelect(cell)\n* ```\n*/\nfunction cell_getCanSelect(cell) {\n\tif (cell.column.columnDef.enableCellSelection === false) return false;\n\tconst enabled = cell.table.options.enableCellSelection;\n\tif (typeof enabled === \"function\") return enabled(cell);\n\treturn enabled ?? true;\n}\n/**\n* Resolves a cell to the coordinates every selection read needs.\n*\n* Shared by `getIsSelected` and `getSelectionEdges` so a render pass resolves\n* each cell once. Resolving in both meant every cell paid for the bounds memo,\n* the display index, and the column index map twice over.\n*\n* Returns `null` when the cell cannot participate in a selection at all.\n*/\nfunction resolveCellPosition(cell) {\n\tconst table = cell.table;\n\tconst bounds = callMemoOrStaticFn(table, \"getCellSelectionBounds\", table_getCellSelectionBounds);\n\tif (!bounds.length) return null;\n\tif (!callMemoOrStaticFn(cell, \"getCanSelect\", cell_getCanSelect)) return null;\n\tconst rowIndex = cell.row.getDisplayIndex();\n\tif (rowIndex < 0) return null;\n\tconst columnIndex = callMemoOrStaticFn(table, \"getCellSelectionColumnIndexes\", table_getCellSelectionColumnIndexes)[cell.column.id] ?? -1;\n\tif (columnIndex < 0) return null;\n\treturn {\n\t\tbounds,\n\t\trowIndex,\n\t\tcolumnIndex\n\t};\n}\n/**\n* Checks whether this cell falls inside the final positive selection.\n*\n* Deliberately not memoized. Registering this through `assignPrototypeAPIs`\n* with `memoDeps` would allocate a memo closure and dependency array per cell,\n* which costs more than the handful of integer comparisons it would save.\n*\n* @example\n* ```ts\n* const isSelected = cell_getIsSelected(cell)\n* ```\n*/\nfunction cell_getIsSelected(cell) {\n\tconst position = resolveCellPosition(cell);\n\tif (!position) return false;\n\treturn isWithinBounds(position.bounds, position.rowIndex, position.columnIndex);\n}\n/**\n* Checks whether this cell is the active cell.\n*\n* @example\n* ```ts\n* const isFocused = cell_getIsFocused(cell)\n* ```\n*/\nfunction cell_getIsFocused(cell) {\n\tconst ranges = cell.table.atoms.cellSelection?.get();\n\tconst active = ranges?.[ranges.length - 1];\n\tif (!active) return false;\n\treturn active.anchorRowId === cell.row.id && active.anchorColumnId === cell.column.id;\n}\n/**\n* Returns `0` for the focused cell and `-1` otherwise, for roving tabindex.\n*\n* @example\n* ```ts\n* const tabIndex = cell_getTabIndex(cell)\n* ```\n*/\nfunction cell_getTabIndex(cell) {\n\treturn callMemoOrStaticFn(cell, \"getIsFocused\", cell_getIsFocused) ? 0 : -1;\n}\n/**\n* Returns which sides of this cell sit on the outer boundary of the selection.\n*\n* A side is an edge when the neighbouring cell in that direction is not itself\n* covered by a range, which is what lets a consumer draw a single outline\n* around an arbitrary union of rectangles.\n*\n* @example\n* ```ts\n* const { top, right, bottom, left } = cell_getSelectionEdges(cell)\n* ```\n*/\nfunction cell_getSelectionEdges(cell) {\n\tconst none = {\n\t\ttop: false,\n\t\tright: false,\n\t\tbottom: false,\n\t\tleft: false\n\t};\n\tconst position = resolveCellPosition(cell);\n\tif (!position) return none;\n\tconst { bounds, rowIndex, columnIndex } = position;\n\tif (!isWithinBounds(bounds, rowIndex, columnIndex)) return none;\n\tconst merges = callMemoOrStaticFn(cell.table, \"getCellSelectionMergeBounds\", table_getCellSelectionMergeBounds);\n\tconst merge = merges.length ? findMergeBoundsAt(merges, rowIndex, columnIndex) : void 0;\n\tif (!merge) return {\n\t\ttop: !isWithinBounds(bounds, rowIndex - 1, columnIndex),\n\t\tright: !isWithinBounds(bounds, rowIndex, columnIndex + 1),\n\t\tbottom: !isWithinBounds(bounds, rowIndex + 1, columnIndex),\n\t\tleft: !isWithinBounds(bounds, rowIndex, columnIndex - 1)\n\t};\n\treturn {\n\t\ttop: isStripOutside(bounds, merge.minRowIndex - 1, merge.minColumnIndex, merge.maxColumnIndex, true),\n\t\tright: isStripOutside(bounds, merge.maxColumnIndex + 1, merge.minRowIndex, merge.maxRowIndex, false),\n\t\tbottom: isStripOutside(bounds, merge.maxRowIndex + 1, merge.minColumnIndex, merge.maxColumnIndex, true),\n\t\tleft: isStripOutside(bounds, merge.minColumnIndex - 1, merge.minRowIndex, merge.maxRowIndex, false)\n\t};\n}\nfunction isStripOutside(bounds, fixedIndex, from, to, fixedIsRow) {\n\tfor (let i = from; i <= to; i++) if (!isWithinBounds(bounds, fixedIsRow ? fixedIndex : i, fixedIsRow ? i : fixedIndex)) return true;\n\treturn false;\n}\n/**\n* Returns the active cell, i.e. the anchor of the most recent operation.\n*\n* Focus is derived rather than stored: in spreadsheet semantics, dragging from\n* A1 to C5 leaves the active cell at A1, so the active range's anchor already\n* is the active cell.\n*\n* @example\n* ```ts\n* const cell = table_getFocusedCell(table)\n* ```\n*/\nfunction table_getFocusedCell(table) {\n\tconst ranges = table.atoms.cellSelection?.get();\n\tconst active = ranges?.[ranges.length - 1];\n\tif (!active) return void 0;\n\treturn (table.getPrePaginatedRowModel().rowsById[active.anchorRowId] ?? table.getCoreRowModel().rowsById[active.anchorRowId])?.getAllCellsByColumnId()[active.anchorColumnId];\n}\n/**\n* Collapses the selection to a single cell at the given coordinates.\n*\n* @example\n* ```ts\n* table_setFocusedCell(table, '3', 'firstName')\n* ```\n*/\nfunction table_setFocusedCell(table, rowId, columnId) {\n\ttable_selectCellRange(table, {\n\t\tanchorRowId: rowId,\n\t\tanchorColumnId: columnId,\n\t\tfocusRowId: rowId,\n\t\tfocusColumnId: columnId\n\t});\n}\n/**\n* Selects a rectangle using replace, include, or exclude semantics.\n*\n* @example\n* ```ts\n* table_selectCellRange(table, range, { mode: 'exclude' })\n* ```\n*/\nfunction table_selectCellRange(table, range, opts) {\n\tconst mode = opts?.mode ?? (opts?.additive ? \"include\" : \"replace\");\n\tconst { operation: _operation, ...coordinates } = range;\n\tconst nextRange = mode === \"exclude\" ? {\n\t\t...coordinates,\n\t\toperation: \"exclude\"\n\t} : coordinates;\n\ttable_setCellSelection(table, (old) => mode === \"replace\" ? [nextRange] : [...old, nextRange]);\n}\n/**\n* Returns the visible leaf columns that permit selection, in display order.\n*\n* A column-level opt-out is enough to exclude a column here; a per-cell\n* predicate is not consulted, since navigation and select-all work in column\n* space rather than cell space.\n*/\nfunction getSelectableColumns(table) {\n\tconst columns = getDisplayOrderedColumns(table);\n\tif (table.options.enableCellSelection === false) return [];\n\treturn columns.filter((column) => column.columnDef.enableCellSelection !== false);\n}\n/**\n* Selects every selectable cell in the table as one range.\n*\n* @example\n* ```ts\n* table_selectAllCells(table)\n* ```\n*/\nfunction table_selectAllCells(table) {\n\tconst rows = table.getRowsInDisplayOrder();\n\tconst columns = getSelectableColumns(table);\n\tif (!rows.length || !columns.length) return;\n\ttable_selectCellRange(table, {\n\t\tanchorRowId: rows[0].id,\n\t\tanchorColumnId: columns[0].id,\n\t\tfocusRowId: rows[rows.length - 1].id,\n\t\tfocusColumnId: columns[columns.length - 1].id\n\t});\n}\n/**\n* Resolves a direction into row and column deltas.\n*/\nfunction getDirectionDelta(direction) {\n\tswitch (direction) {\n\t\tcase \"up\": return {\n\t\t\trowDelta: -1,\n\t\t\tcolumnDelta: 0\n\t\t};\n\t\tcase \"down\": return {\n\t\t\trowDelta: 1,\n\t\t\tcolumnDelta: 0\n\t\t};\n\t\tcase \"left\": return {\n\t\t\trowDelta: 0,\n\t\t\tcolumnDelta: -1\n\t\t};\n\t\tdefault: return {\n\t\t\trowDelta: 0,\n\t\t\tcolumnDelta: 1\n\t\t};\n\t}\n}\n/**\n* Steps one cell in a direction from a starting coordinate.\n*\n* Columns that cannot be selected are skipped over rather than landed on, so\n* arrow navigation never parks on an opted-out column. Returns `null` when the\n* step would leave the grid or find no selectable column.\n*/\nfunction stepCoordinate(table, rowId, columnId, direction) {\n\tconst rows = table.getRowModel().rows;\n\tconst columns = getDisplayOrderedColumns(table);\n\tif (!rows.length || !columns.length) return null;\n\tconst { rowDelta, columnDelta } = getDirectionDelta(direction);\n\tconst rowIndex = rows.findIndex((row) => row.id === rowId);\n\tconst columnIndex = columns.findIndex((column) => column.id === columnId);\n\tif (rowIndex < 0 || columnIndex < 0) return null;\n\tconst merges = callMemoOrStaticFn(table, \"getCellSelectionMergeBounds\", table_getCellSelectionMergeBounds);\n\tlet fromRowIndex = rows[rowIndex].getDisplayIndex();\n\tlet fromColumnIndex = columnIndex;\n\tif (merges.length) {\n\t\tconst startMerge = findMergeBoundsAt(merges, rowIndex, columnIndex);\n\t\tif (startMerge) {\n\t\t\tif (rowDelta > 0) fromRowIndex = startMerge.maxRowIndex;\n\t\t\tif (rowDelta < 0) fromRowIndex = startMerge.minRowIndex;\n\t\t\tif (columnDelta > 0) fromColumnIndex = startMerge.maxColumnIndex;\n\t\t\tif (columnDelta < 0) fromColumnIndex = startMerge.minColumnIndex;\n\t\t}\n\t}\n\tlet nextRowIndex = rowIndex + rowDelta;\n\tif (rowDelta && fromRowIndex !== rows[rowIndex].getDisplayIndex()) {\n\t\tconst edgeRowIndex = rows.findIndex((row) => row.getDisplayIndex() === fromRowIndex);\n\t\tif (edgeRowIndex < 0) return null;\n\t\tnextRowIndex = edgeRowIndex + rowDelta;\n\t}\n\tif (nextRowIndex < 0 || nextRowIndex >= rows.length) return null;\n\tconst selectableColumnIds = new Set(getSelectableColumns(table).map((column) => column.id));\n\tif (!selectableColumnIds.size) return null;\n\tlet nextColumnIndex = fromColumnIndex;\n\tif (columnDelta) do\n\t\tnextColumnIndex += columnDelta;\n\twhile (nextColumnIndex >= 0 && nextColumnIndex < columns.length && !selectableColumnIds.has(columns[nextColumnIndex].id));\n\telse if (!selectableColumnIds.has(columnId)) for (let distance = 1; distance < columns.length; distance++) {\n\t\tconst before = columns[columnIndex - distance];\n\t\tconst after = columns[columnIndex + distance];\n\t\tif (before && selectableColumnIds.has(before.id)) {\n\t\t\tnextColumnIndex = columnIndex - distance;\n\t\t\tbreak;\n\t\t}\n\t\tif (after && selectableColumnIds.has(after.id)) {\n\t\t\tnextColumnIndex = columnIndex + distance;\n\t\t\tbreak;\n\t\t}\n\t}\n\tif (nextColumnIndex < 0 || nextColumnIndex >= columns.length || !selectableColumnIds.has(columns[nextColumnIndex].id)) return null;\n\tlet landingRowIndex = nextRowIndex;\n\tlet landingColumnIndex = nextColumnIndex;\n\tif (merges.length) {\n\t\tconst landingMerge = findMergeBoundsAt(merges, rows[nextRowIndex].getDisplayIndex(), nextColumnIndex);\n\t\tif (landingMerge) {\n\t\t\tlandingRowIndex = rows.findIndex((row) => row.getDisplayIndex() === landingMerge.minRowIndex);\n\t\t\tif (landingRowIndex < 0) return null;\n\t\t\tlandingColumnIndex = landingMerge.minColumnIndex;\n\t\t}\n\t}\n\tconst landingRow = rows[landingRowIndex];\n\tconst landingColumn = columns[landingColumnIndex];\n\tif (!landingRow || !landingColumn) return null;\n\treturn {\n\t\trowId: landingRow.id,\n\t\tcolumnId: landingColumn.id\n\t};\n}\n/**\n* Moves the selection one step in a direction, collapsing it to a single cell.\n*\n* With nothing selected, this selects the first selectable cell so keyboard\n* navigation has somewhere to start.\n*\n* @example\n* ```ts\n* table_moveCellSelection(table, 'down')\n* ```\n*/\nfunction table_moveCellSelection(table, direction) {\n\tconst ranges = table.atoms.cellSelection?.get();\n\tconst active = ranges?.[ranges.length - 1];\n\tif (!active) {\n\t\tconst rows = table.getRowModel().rows;\n\t\tconst columns = getSelectableColumns(table);\n\t\tif (!rows.length || !columns.length) return;\n\t\ttable_setFocusedCell(table, rows[0].id, columns[0].id);\n\t\treturn;\n\t}\n\tconst next = stepCoordinate(table, active.anchorRowId, active.anchorColumnId, direction);\n\tif (!next) return;\n\ttable_setFocusedCell(table, next.rowId, next.columnId);\n}\n/**\n* Extends the active range one step in a direction, keeping its anchor fixed.\n*\n* @example\n* ```ts\n* table_extendCellSelection(table, 'right')\n* ```\n*/\nfunction table_extendCellSelection(table, direction) {\n\tconst ranges = table.atoms.cellSelection?.get();\n\tconst active = ranges?.[ranges.length - 1];\n\tif (!active) {\n\t\ttable_moveCellSelection(table, direction);\n\t\treturn;\n\t}\n\tconst next = stepCoordinate(table, active.focusRowId, active.focusColumnId, direction);\n\tif (!next) return;\n\ttable_setCellSelection(table, (old) => {\n\t\tif (!old.length) return old;\n\t\tconst nextRanges = old.slice(0, -1);\n\t\tnextRanges.push({\n\t\t\t...old[old.length - 1],\n\t\t\tfocusRowId: next.rowId,\n\t\t\tfocusColumnId: next.columnId\n\t\t});\n\t\treturn nextRanges;\n\t});\n}\n/**\n* Walks each final positive region, invoking a visitor per selectable cell.\n*\n* Every expansion API shares this so the per-cell enable predicate is applied\n* in exactly one place.\n*/\nfunction forEachSelectedCell(table, visit, skipCovered = false) {\n\tconst bounds = callMemoOrStaticFn(table, \"getCellSelectionBounds\", table_getCellSelectionBounds);\n\tif (!bounds.length) return;\n\tconst rows = table.getRowsInDisplayOrder();\n\tconst columns = getDisplayOrderedColumns(table);\n\tfor (let i = 0; i < bounds.length; i++) {\n\t\tconst bound = bounds[i];\n\t\tfor (let rowIndex = bound.minRowIndex; rowIndex <= bound.maxRowIndex; rowIndex++) {\n\t\t\tconst row = rows[rowIndex];\n\t\t\tif (!row) continue;\n\t\t\tconst cellsByColumnId = row.getAllCellsByColumnId();\n\t\t\tfor (let columnIndex = bound.minColumnIndex; columnIndex <= bound.maxColumnIndex; columnIndex++) {\n\t\t\t\tconst column = columns[columnIndex];\n\t\t\t\tif (!column) continue;\n\t\t\t\tconst cell = cellsByColumnId[column.id];\n\t\t\t\tif (!cell) continue;\n\t\t\t\tif (!callMemoOrStaticFn(cell, \"getCanSelect\", cell_getCanSelect)) continue;\n\t\t\t\tif (skipCovered && cell.getIsCovered?.()) continue;\n\t\t\t\tvisit(cell, i, rowIndex - bound.minRowIndex, columnIndex - bound.minColumnIndex);\n\t\t\t}\n\t\t}\n\t}\n}\n/**\n* Returns the ids of all selected cells, in row-major order.\n*\n* Cells covered by overlapping ranges are returned once, at their first\n* occurrence.\n*\n* @example\n* ```ts\n* const ids = table_getSelectedCellIds(table)\n* ```\n*/\nfunction table_getSelectedCellIds(table) {\n\tconst ids = [];\n\tconst seen = /* @__PURE__ */ new Set();\n\tforEachSelectedCell(table, (cell) => {\n\t\tif (seen.has(cell.id)) return;\n\t\tseen.add(cell.id);\n\t\tids.push(cell.id);\n\t}, true);\n\treturn ids;\n}\n/**\n* Returns each final positive region's values as a row-major grid.\n*\n* This is the raw material for clipboard export. Serializing it to text is left\n* to userland, since the delimiter, the null representation, and whether values\n* containing delimiters get quoted are all application decisions.\n*\n* @example\n* ```ts\n* const [firstRange] = table_getSelectedCellRangesData(table)\n* ```\n*/\nfunction table_getSelectedCellRangesData(table) {\n\tconst grids = [];\n\tforEachSelectedCell(table, (cell, rangeIndex, rowOffset) => {\n\t\tconst grid = grids[rangeIndex] ??= [];\n\t\t(grid[rowOffset] ??= []).push(cell.getValue());\n\t});\n\treturn grids;\n}\n/**\n* Returns the number of selected cells.\n*\n* Uses rectangle arithmetic over the normalized, disjoint positive regions.\n* A per-cell `enableCellSelection` predicate requires enumeration.\n*\n* @example\n* ```ts\n* const count = table_getSelectedCellCount(table)\n* ```\n*/\nfunction table_getSelectedCellCount(table) {\n\tif (table.options.enableCellSelection === false) return 0;\n\tconst bounds = callMemoOrStaticFn(table, \"getCellSelectionBounds\", table_getCellSelectionBounds);\n\tif (!bounds.length) return 0;\n\tconst merges = callMemoOrStaticFn(table, \"getCellSelectionMergeBounds\", table_getCellSelectionMergeBounds);\n\tif (typeof table.options.enableCellSelection === \"function\" || merges.length) {\n\t\tconst ids = /* @__PURE__ */ new Set();\n\t\tforEachSelectedCell(table, (cell) => ids.add(cell.id), true);\n\t\treturn ids.size;\n\t}\n\tconst columns = getDisplayOrderedColumns(table);\n\tlet count = 0;\n\tfor (const bound of bounds) {\n\t\tlet selectableColumns = 0;\n\t\tfor (let columnIndex = bound.minColumnIndex; columnIndex <= bound.maxColumnIndex; columnIndex++) {\n\t\t\tconst column = columns[columnIndex];\n\t\t\tif (!column) continue;\n\t\t\tif (column.columnDef.enableCellSelection !== false) selectableColumns++;\n\t\t}\n\t\tcount += (bound.maxRowIndex - bound.minRowIndex + 1) * selectableColumns;\n\t}\n\treturn count;\n}\n/**\n* Returns the ids of all rows intersected by the selection.\n*\n* @example\n* ```ts\n* const rowIds = table_getCellSelectionRowIds(table)\n* ```\n*/\nfunction table_getCellSelectionRowIds(table) {\n\tconst bounds = callMemoOrStaticFn(table, \"getCellSelectionBounds\", table_getCellSelectionBounds);\n\tif (!bounds.length) return [];\n\tconst rows = table.getRowsInDisplayOrder();\n\tconst seen = /* @__PURE__ */ new Set();\n\tconst ids = [];\n\tfor (let i = 0; i < bounds.length; i++) {\n\t\tconst bound = bounds[i];\n\t\tfor (let index = bound.minRowIndex; index <= bound.maxRowIndex; index++) {\n\t\t\tconst row = rows[index];\n\t\t\tif (!row || seen.has(row.id)) continue;\n\t\t\tseen.add(row.id);\n\t\t\tids.push(row.id);\n\t\t}\n\t}\n\treturn ids;\n}\n/**\n* Returns the ids of all columns intersected by the selection.\n*\n* @example\n* ```ts\n* const columnIds = table_getCellSelectionColumnIds(table)\n* ```\n*/\nfunction table_getCellSelectionColumnIds(table) {\n\tconst bounds = callMemoOrStaticFn(table, \"getCellSelectionBounds\", table_getCellSelectionBounds);\n\tif (!bounds.length) return [];\n\tconst columns = getDisplayOrderedColumns(table);\n\tconst seen = /* @__PURE__ */ new Set();\n\tconst ids = [];\n\tfor (let i = 0; i < bounds.length; i++) {\n\t\tconst bound = bounds[i];\n\t\tfor (let index = bound.minColumnIndex; index <= bound.maxColumnIndex; index++) {\n\t\t\tconst column = columns[index];\n\t\t\tif (!column || seen.has(column.id)) continue;\n\t\t\tif (column.columnDef.enableCellSelection === false) continue;\n\t\t\tseen.add(column.id);\n\t\t\tids.push(column.id);\n\t\t}\n\t}\n\treturn ids;\n}\n/**\n* Creates a handler that begins a selection at this cell.\n*\n* Follows `header_getResizeHandler`: the enable check is resolved once outside\n* the returned closure and guarded again inside it, the document is injectable\n* for SSR and cross-document rendering, and the document-level `mouseup`\n* listener is attached here so a drag released outside the table still ends.\n*\n* @example\n* ```tsx\n* <td onMouseDown={cell.getSelectionStartHandler()} />\n* ```\n*/\nfunction cell_getSelectionStartHandler(cell, _contextDocument) {\n\tconst canSelect = cell_getCanSelect(cell);\n\treturn (e) => {\n\t\tif (!canSelect) return;\n\t\tconst table = cell.table;\n\t\tconst options = table.options;\n\t\tconst contextDocument = _contextDocument ?? (typeof document !== \"undefined\" ? document : null);\n\t\tconst isRangeEvent = options.enableCellRangeSelection !== false && (options.isCellRangeSelectionEvent?.(e) ?? false);\n\t\tconst isMultiRangeEvent = options.enableMultiCellRangeSelection !== false && (options.isMultiCellRangeSelectionEvent?.(e) ?? false);\n\t\tif (options.enableCellSelectionDrag !== false && options.enableCellRangeSelection !== false && contextDocument) {\n\t\t\ttable._isSelectingCells = true;\n\t\t\tconst upHandler = () => {\n\t\t\t\tcontextDocument.removeEventListener(\"mouseup\", upHandler);\n\t\t\t\ttable._isSelectingCells = false;\n\t\t\t};\n\t\t\tcontextDocument.addEventListener(\"mouseup\", upHandler);\n\t\t}\n\t\tconst rowId = cell.row.id;\n\t\tconst columnId = cell.column.id;\n\t\tconst shouldExclude = isMultiRangeEvent && callMemoOrStaticFn(cell, \"getIsSelected\", cell_getIsSelected);\n\t\ttable_setCellSelection(table, (old) => {\n\t\t\tconst active = old[old.length - 1];\n\t\t\tif (isRangeEvent && active) {\n\t\t\t\tconst ranges = old.slice(0, -1);\n\t\t\t\tranges.push({\n\t\t\t\t\t...active,\n\t\t\t\t\tfocusRowId: rowId,\n\t\t\t\t\tfocusColumnId: columnId\n\t\t\t\t});\n\t\t\t\treturn ranges;\n\t\t\t}\n\t\t\tconst range = {\n\t\t\t\tanchorRowId: rowId,\n\t\t\t\tanchorColumnId: columnId,\n\t\t\t\tfocusRowId: rowId,\n\t\t\t\tfocusColumnId: columnId,\n\t\t\t\t...shouldExclude ? { operation: \"exclude\" } : {}\n\t\t\t};\n\t\t\treturn isMultiRangeEvent ? [...old, range] : [range];\n\t\t});\n\t};\n}\n/**\n* Creates a handler that extends the active range to this cell during a drag.\n*\n* No rAF coalescing is needed here, unlike the resize handler: `mouseenter`\n* fires once per cell boundary crossed rather than continuously, and deferring\n* it by a frame would only delay the highlight.\n*\n* @example\n* ```tsx\n* <td onMouseEnter={cell.getSelectionExtendHandler()} />\n* ```\n*/\nfunction cell_getSelectionExtendHandler(cell) {\n\tconst canSelect = cell_getCanSelect(cell);\n\treturn (_e) => {\n\t\tif (!canSelect) return;\n\t\tconst table = cell.table;\n\t\tif (!table._isSelectingCells) return;\n\t\tconst ranges = table.atoms.cellSelection?.get();\n\t\tconst active = ranges?.[ranges.length - 1];\n\t\tif (!active) return;\n\t\tconst rowId = cell.row.id;\n\t\tconst columnId = cell.column.id;\n\t\tif (active.focusRowId === rowId && active.focusColumnId === columnId) return;\n\t\ttable_setCellSelection(table, (old) => {\n\t\t\tif (!old.length) return old;\n\t\t\tconst next = old.slice(0, -1);\n\t\t\tnext.push({\n\t\t\t\t...old[old.length - 1],\n\t\t\t\tfocusRowId: rowId,\n\t\t\t\tfocusColumnId: columnId\n\t\t\t});\n\t\t\treturn next;\n\t\t});\n\t};\n}\n\n//#endregion\nexport { cell_getCanSelect, cell_getIsFocused, cell_getIsSelected, cell_getSelectionEdges, cell_getSelectionExtendHandler, cell_getSelectionStartHandler, cell_getTabIndex, getDefaultCellSelectionState, table_autoResetCellSelection, table_extendCellSelection, table_getCellSelectionBounds, table_getCellSelectionColumnIds, table_getCellSelectionColumnIndexes, table_getCellSelectionMergeBounds, table_getCellSelectionRowIds, table_getFocusedCell, table_getSelectedCellCount, table_getSelectedCellIds, table_getSelectedCellRangesData, table_moveCellSelection, table_resetCellSelection, table_selectAllCells, table_selectCellRange, table_setCellSelection, table_setFocusedCell };","import { cloneState, hasOwn, makeObjectMap, setStateSlice } from \"../../utils.js\";\n\n//#region src/features/row-expanding/rowExpandingFeature.utils.ts\n/**\n* Creates the default expanded state.\n*\n* The feature default is an empty map, meaning no rows are expanded. Reset APIs\n* use this value when `defaultState` is `true`.\n*\n* @example\n* ```ts\n* const expanded = getDefaultExpandedState()\n* ```\n*/\nfunction getDefaultExpandedState() {\n\treturn makeObjectMap();\n}\n/**\n* Schedules an expanded-state reset after row-structure changes.\n*\n* The reset runs when `autoResetAll`, `autoResetExpanded`, or the default\n* client-side expanding behavior allows it. Manual expanding opts out unless\n* the reset options explicitly opt back in.\n*\n* @example\n* ```ts\n* table_autoResetExpanded(table)\n* ```\n*/\nfunction table_autoResetExpanded(table) {\n\tif (!table.atoms.expanded) return;\n\tif (table.options.autoResetAll ?? table.options.autoResetExpanded ?? !table.options.manualExpanding) table._reactivity.schedule(() => table_resetExpanded(table));\n}\n/**\n* Routes an expanded-state updater through the table's expanded change handler.\n*\n* The updater may be `true`, a row-id map, or a function of the previous\n* expanded state, matching the instance `table.setExpanded` behavior.\n*\n* @example\n* ```ts\n* table_setExpanded(table, (old) => ({ ...old, [rowId]: true }))\n* ```\n*/\nfunction table_setExpanded(table, updater) {\n\ttable.options.onExpandedChange?.(updater);\n}\n/**\n* Expands or collapses every row.\n*\n* Passing `true` stores the special expanded-all state. Passing `false` stores\n* an empty map. Omitting the value toggles based on whether all rows are\n* currently expanded.\n*\n* The call is a no-op (no `onExpandedChange`) when no row can expand or when\n* the requested state matches the current state exactly.\n*\n* @example\n* ```ts\n* table_toggleAllRowsExpanded(table)\n* ```\n*/\nfunction table_toggleAllRowsExpanded(table, expanded) {\n\tconst currentExpanded = table.atoms.expanded?.get() ?? {};\n\tif (expanded ?? !table_getIsAllRowsExpanded(table)) {\n\t\tif (currentExpanded === true) return;\n\t\tif (!table_getCanSomeRowsExpand(table)) return;\n\t\ttable_setExpanded(table, true);\n\t} else {\n\t\tif (currentExpanded !== true && !Object.keys(currentExpanded).length) return;\n\t\ttable_setExpanded(table, makeObjectMap());\n\t}\n}\n/**\n* Resets `expanded` to the configured initial state or feature default.\n*\n* With no argument, the reset clones `table.initialState.expanded` when it\n* exists. Passing `true` ignores initial state and resets to `{}`.\n*\n* @example\n* ```ts\n* table_resetExpanded(table)\n* table_resetExpanded(table, true)\n* ```\n*/\nfunction table_resetExpanded(table, defaultState) {\n\tconst initialExpanded = table.initialState.expanded;\n\tsetStateSlice(table, \"expanded\", defaultState ? makeObjectMap() : initialExpanded === true ? true : Object.assign(makeObjectMap(), cloneState(initialExpanded ?? {})));\n}\n/**\n* Checks whether at least one pre-paginated row can expand.\n*\n* Pagination is intentionally ignored so controls can reflect expandable rows\n* that may not be on the current page.\n*\n* @example\n* ```ts\n* const canExpand = table_getCanSomeRowsExpand(table)\n* ```\n*/\nfunction table_getCanSomeRowsExpand(table) {\n\treturn table.getPrePaginatedRowModel().flatRows.some((row) => row_getCanExpand(row));\n}\n/**\n* Creates an event handler that toggles all rows expanded.\n*\n* @example\n* ```ts\n* const onClick = table_getToggleAllRowsExpandedHandler(table)\n* ```\n*/\nfunction table_getToggleAllRowsExpandedHandler(table) {\n\treturn (_e) => {\n\t\ttable_toggleAllRowsExpanded(table);\n\t};\n}\n/**\n* Checks whether any row is expanded.\n*\n* The special expanded-all value `true` counts as some rows expanded.\n*\n* @example\n* ```ts\n* const someExpanded = table_getIsSomeRowsExpanded(table)\n* ```\n*/\nfunction table_getIsSomeRowsExpanded(table) {\n\tconst expanded = table.atoms.expanded?.get() ?? {};\n\treturn expanded === true || Object.values(expanded).some(Boolean);\n}\n/**\n* Checks whether every expandable row in the current row model is expanded.\n*\n* The special expanded-all value `true` returns true immediately. Empty\n* expanded state returns false. Rows that cannot expand are ignored, so a\n* materialized expanded-all map (which only contains expandable row ids)\n* still counts as all rows expanded.\n*\n* @example\n* ```ts\n* const allExpanded = table_getIsAllRowsExpanded(table)\n* ```\n*/\nfunction table_getIsAllRowsExpanded(table) {\n\tconst expanded = table.atoms.expanded?.get() ?? {};\n\tif (expanded === true) return true;\n\tif (!Object.keys(expanded).length) return false;\n\tconst expandableRows = table.getRowModel().flatRows.filter((row) => row_getCanExpand(row));\n\tif (!expandableRows.length) return false;\n\tif (expandableRows.some((row) => !row_getIsExpanded(row))) return false;\n\treturn true;\n}\n/**\n* Computes the deepest expanded row id depth.\n*\n* Row ids are split on `.`; expanded-all state scans the current row model's\n* expandable rows, while explicit expanded state scans its expanded id keys.\n*\n* @example\n* ```ts\n* const depth = table_getExpandedDepth(table)\n* ```\n*/\nfunction table_getExpandedDepth(table) {\n\tlet maxDepth = 0;\n\tconst expanded = table.atoms.expanded?.get();\n\t(expanded === true ? Object.values(table.getRowModel().rowsById).filter((row) => row_getCanExpand(row)).map((row) => row.id) : Object.keys(expanded ?? {})).forEach((id) => {\n\t\tconst splitId = id.split(\".\");\n\t\tmaxDepth = Math.max(maxDepth, splitId.length);\n\t});\n\treturn maxDepth;\n}\n/**\n* Expands or collapses this row.\n*\n* Omitting `expanded` toggles the row. If the current state is expanded-all,\n* the function first materializes that state into a row-id map (containing\n* only expandable row ids) before applying the row-specific change.\n*\n* The call is a no-op (no `onExpandedChange`) when the requested state matches\n* the current state, or when expanding a row that cannot expand. Collapsing is\n* always allowed so stale expanded ids can be cleaned up.\n*\n* @example\n* ```ts\n* row_toggleExpanded(row)\n* ```\n*/\nfunction row_toggleExpanded(row, expanded) {\n\tconst currentExpanded = row.table.atoms.expanded?.get() ?? {};\n\tconst currentExists = currentExpanded === true || isExpandedRowId(currentExpanded, row.id);\n\tconst targetExpanded = expanded ?? !currentExists;\n\tif (targetExpanded === currentExists) return;\n\tif (targetExpanded && !row_getCanExpand(row)) return;\n\ttable_setExpanded(row.table, (old) => {\n\t\tconst exists = old === true ? true : isExpandedRowId(old, row.id);\n\t\tlet oldExpanded = makeObjectMap();\n\t\tif (old === true) Object.values(row.table.getRowModel().rowsById).forEach((rowModelRow) => {\n\t\t\tif (row_getCanExpand(rowModelRow)) oldExpanded[rowModelRow.id] = true;\n\t\t});\n\t\telse oldExpanded = Object.assign(makeObjectMap(), old);\n\t\tif (!exists && targetExpanded) {\n\t\t\toldExpanded[row.id] = true;\n\t\t\treturn oldExpanded;\n\t\t}\n\t\tif (exists && !targetExpanded) {\n\t\t\tconst rest = makeObjectMap();\n\t\t\tconst rowIds = Object.keys(oldExpanded);\n\t\t\tfor (let i = 0; i < rowIds.length; i++) {\n\t\t\t\tconst rowId = rowIds[i];\n\t\t\t\tif (rowId !== row.id && oldExpanded[rowId]) rest[rowId] = true;\n\t\t\t}\n\t\t\treturn rest;\n\t\t}\n\t\treturn old;\n\t});\n}\n/**\n* Checks whether this row is expanded.\n*\n* `options.getIsRowExpanded` can override state-derived behavior. Otherwise\n* the row is expanded when expanded state is `true` or contains this row id.\n*\n* @example\n* ```ts\n* const expanded = row_getIsExpanded(row)\n* ```\n*/\nfunction row_getIsExpanded(row) {\n\tconst expanded = row.table.atoms.expanded?.get() ?? {};\n\treturn !!(row.table.options.getIsRowExpanded?.(row) ?? (expanded === true || isExpandedRowId(expanded, row.id)));\n}\nfunction isExpandedRowId(expanded, rowId) {\n\treturn !!(expanded && expanded !== true && hasOwn(expanded, rowId) && expanded[rowId]);\n}\n/**\n* Checks whether this row can be expanded.\n*\n* `options.getRowCanExpand` wins when provided. Otherwise rows can expand when\n* expanding is enabled and the row has subRows.\n*\n* @example\n* ```ts\n* const canExpand = row_getCanExpand(row)\n* ```\n*/\nfunction row_getCanExpand(row) {\n\treturn row.table.options.getRowCanExpand?.(row) ?? ((row.table.options.enableExpanding ?? true) && !!row.subRows.length);\n}\n/**\n* Checks whether every ancestor of this row is expanded.\n*\n* The current row is not considered; only its parent chain is walked.\n*\n* @example\n* ```ts\n* const parentsExpanded = row_getIsAllParentsExpanded(row)\n* ```\n*/\nfunction row_getIsAllParentsExpanded(row) {\n\tlet isFullyExpanded = true;\n\tlet currentRow = row;\n\twhile (isFullyExpanded && currentRow.parentId) {\n\t\tcurrentRow = row.table.getRow(currentRow.parentId, true);\n\t\tisFullyExpanded = row_getIsExpanded(currentRow);\n\t}\n\treturn isFullyExpanded;\n}\n/**\n* Creates a row control handler that toggles this row's expanded state.\n*\n* The handler is a no-op when the row cannot expand.\n*\n* @example\n* ```ts\n* const onClick = row_getToggleExpandedHandler(row)\n* ```\n*/\nfunction row_getToggleExpandedHandler(row) {\n\tconst canExpand = row_getCanExpand(row);\n\treturn () => {\n\t\tif (!canExpand) return;\n\t\trow_toggleExpanded(row);\n\t};\n}\n\n//#endregion\nexport { getDefaultExpandedState, row_getCanExpand, row_getIsAllParentsExpanded, row_getIsExpanded, row_getToggleExpandedHandler, row_toggleExpanded, table_autoResetExpanded, table_getCanSomeRowsExpand, table_getExpandedDepth, table_getIsAllRowsExpanded, table_getIsSomeRowsExpanded, table_getToggleAllRowsExpandedHandler, table_resetExpanded, table_setExpanded, table_toggleAllRowsExpanded };","import { cloneState, functionalUpdate, setStateSlice } from \"../../utils.js\";\n\n//#region src/features/row-pagination/rowPaginationFeature.utils.ts\nconst defaultPageIndex = 0;\nconst defaultPageSize = 10;\n/**\n* Creates the default pagination state used by the pagination feature.\n*\n* The feature default starts at the first page with a page size of 10. Reset\n* APIs use this value when `defaultState` is `true`.\n*\n* @example\n* ```ts\n* const pagination = getDefaultPaginationState()\n* ```\n*/\nfunction getDefaultPaginationState() {\n\treturn {\n\t\tpageIndex: defaultPageIndex,\n\t\tpageSize: defaultPageSize\n\t};\n}\n/**\n* Resets the page index when a page-altering change should return to page 0.\n*\n* The reset runs when `autoResetAll`, `autoResetPageIndex`, or the default\n* client-side pagination behavior allows it. Manual pagination opts out unless\n* the reset options explicitly opt back in.\n*\n* @example\n* ```ts\n* table_autoResetPageIndex(table)\n* ```\n*/\nfunction table_autoResetPageIndex(table) {\n\tif (table.options.autoResetAll ?? table.options.autoResetPageIndex ?? !table.options.manualPagination) {\n\t\tif ((table.atoms.pagination?.get()?.pageIndex ?? defaultPageIndex) === defaultPageIndex) return;\n\t\ttable_resetPageIndex(table, true);\n\t}\n}\n/**\n* Routes a pagination updater through the table's pagination change handler.\n*\n* The updater may be a next state object or a function of the previous\n* `PaginationState`; controlled state and external atoms observe the same\n* updater path as the instance API.\n*\n* @example\n* ```ts\n* table_setPagination(table, (old) => old)\n* ```\n*/\nfunction table_setPagination(table, updater) {\n\tsetStateSlice(table, \"pagination\", updater);\n}\n/**\n* Resets `pagination` to the configured initial state or feature default.\n*\n* With no argument, the reset clones `table.initialState.pagination` when it\n* exists. Passing `true` ignores initial state and resets to\n* `{ pageIndex: 0, pageSize: 10 }`.\n*\n* @example\n* ```ts\n* table_resetPagination(table)\n* table_resetPagination(table, true)\n* ```\n*/\nfunction table_resetPagination(table, defaultState) {\n\ttable_setPagination(table, defaultState ? getDefaultPaginationState() : cloneState(table.initialState.pagination ?? getDefaultPaginationState()));\n}\n/**\n* Updates `pagination.pageIndex` and clamps it to the known page range.\n*\n* Unknown page counts (`undefined` or `-1`) allow any non-negative page index.\n* Known page counts clamp the index between `0` and `pageCount - 1`.\n*\n* @example\n* ```ts\n* table_setPageIndex(table, (old) => old)\n* ```\n*/\nfunction table_setPageIndex(table, updater) {\n\ttable_setPagination(table, (old) => {\n\t\tlet pageIndex = functionalUpdate(updater, old.pageIndex);\n\t\tconst maxPageIndex = typeof table.options.pageCount === \"undefined\" || table.options.pageCount === -1 ? Number.MAX_SAFE_INTEGER : table.options.pageCount - 1;\n\t\tpageIndex = Math.max(0, Math.min(pageIndex, maxPageIndex));\n\t\treturn {\n\t\t\t...old,\n\t\t\tpageIndex\n\t\t};\n\t});\n}\n/**\n* Resets only `pagination.pageIndex`.\n*\n* With no argument, the reset uses `table.initialState.pagination?.pageIndex`\n* or `0`. Passing `true` always resets the page index to `0`.\n*\n* @example\n* ```ts\n* table_resetPageIndex(table)\n* table_resetPageIndex(table, true)\n* ```\n*/\nfunction table_resetPageIndex(table, defaultState) {\n\ttable_setPageIndex(table, defaultState ? defaultPageIndex : table.initialState.pagination?.pageIndex ?? defaultPageIndex);\n}\n/**\n* Resets only `pagination.pageSize`.\n*\n* With no argument, the reset uses `table.initialState.pagination?.pageSize`\n* or `10`. Passing `true` always resets the page size to `10`.\n*\n* @example\n* ```ts\n* table_resetPageSize(table)\n* table_resetPageSize(table, true)\n* ```\n*/\nfunction table_resetPageSize(table, defaultState) {\n\ttable_setPageSize(table, defaultState ? defaultPageSize : table.initialState.pagination?.pageSize ?? defaultPageSize);\n}\n/**\n* Updates `pagination.pageSize` while preserving the current top row.\n*\n* The new size is clamped to at least `1`, and `pageIndex` is recalculated so\n* the row that was previously at the top of the page remains in view.\n*\n* @example\n* ```ts\n* table_setPageSize(table, (old) => old)\n* ```\n*/\nfunction table_setPageSize(table, updater) {\n\ttable_setPagination(table, (old) => {\n\t\tconst pageSize = Math.max(1, functionalUpdate(updater, old.pageSize));\n\t\tconst topRowIndex = old.pageSize === Infinity ? 0 : old.pageSize * old.pageIndex;\n\t\tconst pageIndex = pageSize === Infinity ? 0 : Math.floor(topRowIndex / pageSize);\n\t\treturn {\n\t\t\t...old,\n\t\t\tpageIndex,\n\t\t\tpageSize\n\t\t};\n\t});\n}\n/**\n* Builds the zero-based page indexes available for the current page count.\n*\n* Unknown or empty page counts return an empty array; otherwise the result is\n* `[0, 1, ...pageCount - 1]`.\n*\n* @example\n* ```ts\n* const pageIndexes = table_getPageOptions(table)\n* ```\n*/\nfunction table_getPageOptions(table) {\n\tconst pageCount = table_getPageCount(table);\n\tlet pageOptions = [];\n\tif (pageCount && pageCount > 0) pageOptions = [...new Array(pageCount)].fill(null).map((_, i) => i);\n\treturn pageOptions;\n}\n/**\n* Checks whether the current page index can move backward.\n*\n* The first page is page index `0`, so only positive page indexes can navigate\n* to a previous page.\n*\n* @example\n* ```ts\n* const canGoBack = table_getCanPreviousPage(table)\n* ```\n*/\nfunction table_getCanPreviousPage(table) {\n\treturn (table.atoms.pagination?.get()?.pageIndex ?? 0) > 0;\n}\n/**\n* Checks whether the current page index can move forward.\n*\n* A `pageCount` of `-1` means the caller does not know the total page count, so\n* this returns `true`. A page count of `0` returns `false`.\n*\n* @example\n* ```ts\n* const canGoForward = table_getCanNextPage(table)\n* ```\n*/\nfunction table_getCanNextPage(table) {\n\tconst pageIndex = table.atoms.pagination?.get()?.pageIndex ?? defaultPageIndex;\n\tconst pageCount = table_getPageCount(table);\n\tif (pageCount === -1) return true;\n\tif (pageCount === 0) return false;\n\treturn pageIndex < pageCount - 1;\n}\n/**\n* Checks whether a known, finite last page exists after the current page.\n*\n* Unknown (`-1`), empty, and non-finite page counts do not have a navigable\n* last page.\n*\n* @example\n* ```ts\n* const canGoToLastPage = table_getCanLastPage(table)\n* ```\n*/\nfunction table_getCanLastPage(table) {\n\tconst pageIndex = table.atoms.pagination?.get()?.pageIndex ?? defaultPageIndex;\n\tconst pageCount = table_getPageCount(table);\n\treturn Number.isFinite(pageCount) && pageCount > 0 && pageIndex < pageCount - 1;\n}\n/**\n* Moves the table to the previous page.\n*\n* This delegates to `table_setPageIndex` so pagination state ownership and\n* updater semantics remain consistent.\n*\n* @example\n* ```ts\n* table_previousPage(table)\n* ```\n*/\nfunction table_previousPage(table) {\n\treturn table_setPageIndex(table, (old) => old - 1);\n}\n/**\n* Moves the table to the next page.\n*\n* This delegates to `table_setPageIndex` so pagination state ownership and\n* updater semantics remain consistent.\n*\n* @example\n* ```ts\n* table_nextPage(table)\n* ```\n*/\nfunction table_nextPage(table) {\n\treturn table_setPageIndex(table, (old) => {\n\t\treturn old + 1;\n\t});\n}\n/**\n* Moves the table to the first page.\n*\n* This is a convenience wrapper around `table_setPageIndex(table, 0)`.\n*\n* @example\n* ```ts\n* table_firstPage(table)\n* ```\n*/\nfunction table_firstPage(table) {\n\treturn table_setPageIndex(table, 0);\n}\n/**\n* Moves the table to the last known page.\n*\n* Unknown, empty, and non-finite page counts do not have a navigable last\n* page, so this does nothing for those states.\n*\n* @example\n* ```ts\n* table_lastPage(table)\n* ```\n*/\nfunction table_lastPage(table) {\n\tconst pageCount = table_getPageCount(table);\n\tif (!Number.isFinite(pageCount) || pageCount <= 0) return;\n\treturn table_setPageIndex(table, pageCount - 1);\n}\n/**\n* Resolves the number of pages for the current pagination state.\n*\n* `options.pageCount` wins for manual pagination. Otherwise the value is\n* calculated from `table_getRowCount(table)` and the current `pageSize`.\n*\n* @example\n* ```ts\n* const pages = table_getPageCount(table)\n* ```\n*/\nfunction table_getPageCount(table) {\n\tconst configuredPageCount = table.options.pageCount;\n\tif (configuredPageCount != null) return configuredPageCount;\n\tconst rowCount = table_getRowCount(table);\n\tconst pageSize = table.atoms.pagination?.get()?.pageSize ?? defaultPageSize;\n\tif (pageSize === Infinity && Number.isFinite(rowCount) && rowCount > 0) return 1;\n\treturn Math.ceil(rowCount / pageSize);\n}\n/**\n* Resolves the total row count used for pagination math.\n*\n* `options.rowCount` wins for manual pagination. Otherwise the count comes\n* from the pre-paginated row model so filtering, grouping, sorting, and\n* expansion are reflected before the page slice is applied.\n*\n* @example\n* ```ts\n* const rows = table_getRowCount(table)\n* ```\n*/\nfunction table_getRowCount(table) {\n\treturn table.options.rowCount ?? table.getPrePaginatedRowModel().rows.length;\n}\n\n//#endregion\nexport { getDefaultPaginationState, table_autoResetPageIndex, table_firstPage, table_getCanLastPage, table_getCanNextPage, table_getCanPreviousPage, table_getPageCount, table_getPageOptions, table_getRowCount, table_lastPage, table_nextPage, table_previousPage, table_resetPageIndex, table_resetPageSize, table_resetPagination, table_setPageIndex, table_setPageSize, table_setPagination };","import { cloneState, isFunction, setStateSlice } from \"../../utils.js\";\nimport { reSplitAlphaNumeric, sortFn_basic } from \"./sortFns.js\";\n\n//#region src/features/row-sorting/rowSortingFeature.utils.ts\n/**\n* Creates the default sorting state.\n*\n* The feature default is an empty array, meaning no columns are sorted. Reset\n* APIs use this value when `defaultState` is `true`.\n*\n* @example\n* ```ts\n* const sorting = getDefaultSortingState()\n* ```\n*/\nfunction getDefaultSortingState() {\n\treturn [];\n}\n/**\n* Routes a sorting updater through the table's sorting change handler.\n*\n* The updater may be a next `SortingState` array or a function of the previous\n* sorting state, matching the instance `table.setSorting` behavior. State\n* owners receive an equality-guarded updater so structurally equal sorting\n* values preserve the owner's existing reference.\n*\n* @example\n* ```ts\n* table_setSorting(table, (old) => [...old, { id: 'age', desc: true }])\n* ```\n*/\nfunction table_setSorting(table, updater) {\n\tsetStateSlice(table, \"sorting\", updater);\n}\n/**\n* Resets `sorting` to the configured initial state or feature default.\n*\n* With no argument, the reset clones `table.initialState.sorting` when it\n* exists. Passing `true` ignores initial state and resets to `[]`.\n*\n* @example\n* ```ts\n* table_resetSorting(table)\n* table_resetSorting(table, true)\n* ```\n*/\nfunction table_resetSorting(table, defaultState) {\n\ttable_setSorting(table, defaultState ? [] : cloneState(table.initialState.sorting ?? []));\n}\n/**\n* Resets sorting after the table data changes when explicitly enabled.\n*\n* Unlike other auto-reset behaviors, sorting is preserved by default. An\n* explicit `autoResetAll` value takes precedence over `autoResetSorting`.\n*\n* @example\n* ```ts\n* table_autoResetSorting(table)\n* ```\n*/\nfunction table_autoResetSorting(table) {\n\tif (!table.atoms.sorting) return;\n\tif (table.options.autoResetAll ?? table.options.autoResetSorting ?? false) table_resetSorting(table);\n}\n/**\n* Chooses a built-in sorting function from sampled filtered row values.\n*\n* Date-like values use `datetime`, mixed text/numeric strings use\n* `alphanumeric`, plain strings use `text`, and unknown values fall back to\n* `basic`.\n*\n* @example\n* ```ts\n* const sortFn = column_getAutoSortFn(column)\n* ```\n*/\nfunction column_getAutoSortFn(column) {\n\tconst sortFns = column.table._rowModelFns.sortFns;\n\tconst firstRows = column.table.getFilteredRowModel().flatRows.slice(0, 10);\n\tlet sortFnName;\n\tlet isString = false;\n\tfor (let i = 0; i < firstRows.length; i++) {\n\t\tconst value = firstRows[i].getValue(column.id);\n\t\tif (Object.prototype.toString.call(value) === \"[object Date]\") {\n\t\t\tsortFnName = \"datetime\";\n\t\t\tbreak;\n\t\t}\n\t\tif (typeof value === \"string\") {\n\t\t\tisString = true;\n\t\t\tif (value.split(reSplitAlphaNumeric).length > 1) {\n\t\t\t\tsortFnName = \"alphanumeric\";\n\t\t\t\tbreak;\n\t\t\t}\n\t\t}\n\t}\n\tif (!sortFnName && isString) sortFnName = \"text\";\n\tif (sortFnName) {\n\t\tlet sortFn = sortFns?.[sortFnName];\n\t\tif (!sortFn) {\n\t\t\tif (process.env.NODE_ENV === \"development\") console.warn(`sortFn '${sortFnName}' (auto) for column '${column.id}' is not registered`);\n\t\t\tif (sortFnName === \"alphanumeric\") sortFn = sortFns?.text;\n\t\t}\n\t\tif (sortFn) return sortFn;\n\t}\n\treturn sortFn_basic;\n}\n/**\n* Chooses the default first sort direction from sampled filtered row values.\n*\n* The first non-nullish value among the sampled rows decides: string columns\n* start ascending so alphabetical order is natural; other value types (or\n* columns with no non-nullish sample) start descending. Sampling past leading\n* nullish values keeps the toggle cycle stable when sorting or a data swap\n* moves an empty value into the first row.\n*\n* @example\n* ```ts\n* const direction = column_getAutoSortDir(column)\n* ```\n*/\nfunction column_getAutoSortDir(column) {\n\tconst firstRows = column.table.getFilteredRowModel().flatRows.slice(0, 10);\n\tfor (let i = 0; i < firstRows.length; i++) {\n\t\tconst value = firstRows[i].getValue(column.id);\n\t\tif (value == null) continue;\n\t\treturn typeof value === \"string\" ? \"asc\" : \"desc\";\n\t}\n\treturn \"desc\";\n}\n/**\n* Resolves the sorting function configured for a column.\n*\n* Function-valued `columnDef.sortFn` is returned directly, `'auto'` delegates\n* to `column_getAutoSortFn`, and string values are looked up in the table's\n* sorting function registry before falling back to `basic`.\n*\n* @example\n* ```ts\n* const sortFn = column_getSortFn(column)\n* ```\n*/\nfunction column_getSortFn(column) {\n\tconst sortFns = column.table._rowModelFns.sortFns;\n\tif (isFunction(column.columnDef.sortFn)) return column.columnDef.sortFn;\n\tif (column.columnDef.sortFn === \"auto\") return column_getAutoSortFn(column);\n\tconst sortFn = sortFns?.[column.columnDef.sortFn];\n\tif (process.env.NODE_ENV === \"development\" && !sortFn) console.warn(`sortFn '${String(column.columnDef.sortFn)}' for column '${column.id}' is not registered`);\n\treturn sortFn ?? sortFn_basic;\n}\n/**\n* Applies the next sorting state for this column.\n*\n* The toggle can add, replace, flip, or remove this column's sort entry. Multi\n* sorting respects `enableMultiSort`, `enableMultiRemove`,\n* `maxMultiSortColCount`, and the `multi` argument.\n*\n* @example\n* ```ts\n* column_toggleSorting(column, undefined, true)\n* ```\n*/\nfunction column_toggleSorting(column, desc, multi) {\n\tconst nextSortingOrder = column_getNextSortingOrder(column, multi && column_getCanMultiSort(column));\n\tconst hasManualValue = typeof desc !== \"undefined\";\n\ttable_setSorting(column.table, (old) => {\n\t\tconst existingIndex = old.findIndex((d) => d.id === column.id);\n\t\tconst existingSorting = existingIndex === -1 ? void 0 : old[existingIndex];\n\t\tlet newSorting = [];\n\t\tlet sortAction;\n\t\tconst nextDesc = hasManualValue ? desc : nextSortingOrder === \"desc\";\n\t\tconst isMultiMode = !!(old.length && column_getCanMultiSort(column) && multi);\n\t\tif (isMultiMode) if (existingSorting) sortAction = \"toggle\";\n\t\telse sortAction = \"add\";\n\t\telse if (existingSorting) sortAction = \"toggle\";\n\t\telse sortAction = \"replace\";\n\t\tif (sortAction === \"toggle\") {\n\t\t\tif (!hasManualValue) {\n\t\t\t\tif (!nextSortingOrder) sortAction = \"remove\";\n\t\t\t}\n\t\t}\n\t\tif (sortAction === \"add\") {\n\t\t\tnewSorting = [...old, {\n\t\t\t\tid: column.id,\n\t\t\t\tdesc: nextDesc\n\t\t\t}];\n\t\t\tnewSorting.splice(0, newSorting.length - (column.table.options.maxMultiSortColCount ?? Number.MAX_SAFE_INTEGER));\n\t\t} else if (sortAction === \"toggle\") newSorting = isMultiMode ? old.map((d) => {\n\t\t\tif (d.id === column.id) return {\n\t\t\t\t...d,\n\t\t\t\tdesc: nextDesc\n\t\t\t};\n\t\t\treturn d;\n\t\t}) : [{\n\t\t\tid: column.id,\n\t\t\tdesc: nextDesc\n\t\t}];\n\t\telse if (sortAction === \"remove\") newSorting = isMultiMode ? old.filter((d) => d.id !== column.id) : [];\n\t\telse newSorting = [{\n\t\t\tid: column.id,\n\t\t\tdesc: nextDesc\n\t\t}];\n\t\treturn newSorting;\n\t});\n}\n/**\n* Resolves the first direction used when this column begins sorting.\n*\n* Column-level `sortDescFirst` wins, then table-level `sortDescFirst`, then the\n* auto direction inferred from sampled values.\n*\n* @example\n* ```ts\n* const firstDirection = column_getFirstSortDir(column)\n* ```\n*/\nfunction column_getFirstSortDir(column) {\n\treturn column.columnDef.sortDescFirst ?? column.table.options.sortDescFirst ?? column_getAutoSortDir(column) === \"desc\" ? \"desc\" : \"asc\";\n}\n/**\n* Resolves the next sort order for this column's toggle cycle.\n*\n* The cycle starts with the first sort direction, flips between `asc` and\n* `desc`, and can return `false` when sorting removal is enabled.\n*\n* @example\n* ```ts\n* const nextOrder = column_getNextSortingOrder(column)\n* ```\n*/\nfunction column_getNextSortingOrder(column, multi) {\n\tconst firstSortDirection = column_getFirstSortDir(column);\n\tconst isSorted = column_getIsSorted(column);\n\tif (!isSorted) return firstSortDirection;\n\tif (isSorted !== firstSortDirection && (column.table.options.enableSortingRemoval ?? true) && (multi ? column.table.options.enableMultiRemove ?? true : true)) return false;\n\treturn isSorted === \"desc\" ? \"asc\" : \"desc\";\n}\n/**\n* Checks whether this accessor column can participate in sorting.\n*\n* The column must have an accessor and sorting must be enabled by both the\n* column definition and table options.\n*\n* @example\n* ```ts\n* const canSort = column_getCanSort(column)\n* ```\n*/\nfunction column_getCanSort(column) {\n\treturn (column.columnDef.enableSorting ?? true) && (column.table.options.enableSorting ?? true) && !!column.accessorFn;\n}\n/**\n* Checks whether this column can be added to a multi-sort state.\n*\n* Column-level `enableMultiSort` wins over table-level `enableMultiSort`; if\n* neither is set, accessor columns can multi-sort by default.\n*\n* @example\n* ```ts\n* const canMultiSort = column_getCanMultiSort(column)\n* ```\n*/\nfunction column_getCanMultiSort(column) {\n\treturn column.columnDef.enableMultiSort ?? column.table.options.enableMultiSort ?? !!column.accessorFn;\n}\n/**\n* Reads this column's current sort direction.\n*\n* The result is `false` when the column is not sorted, otherwise `'asc'` or\n* `'desc'` based on the column's entry in `state.sorting`.\n*\n* @example\n* ```ts\n* const direction = column_getIsSorted(column)\n* ```\n*/\nfunction column_getIsSorted(column) {\n\tconst columnSort = column.table.atoms.sorting?.get()?.find((d) => d.id === column.id);\n\treturn !columnSort ? false : columnSort.desc ? \"desc\" : \"asc\";\n}\n/**\n* Finds this column's position in the ordered `state.sorting` array.\n*\n* The result is `-1` when the column is not sorted.\n*\n* @example\n* ```ts\n* const index = column_getSortIndex(column)\n* ```\n*/\nfunction column_getSortIndex(column) {\n\treturn column.table.atoms.sorting?.get()?.findIndex((d) => d.id === column.id) ?? -1;\n}\n/**\n* Removes this column from the sorting state.\n*\n* Other sorted columns are preserved, including their relative order.\n*\n* @example\n* ```ts\n* column_clearSorting(column)\n* ```\n*/\nfunction column_clearSorting(column) {\n\ttable_setSorting(column.table, (old) => old.length ? old.filter((d) => d.id !== column.id) : []);\n}\n/**\n* Creates a header event handler that toggles this column's sorting.\n*\n* The handler ignores events when the column cannot sort, and asks\n* `options.isMultiSortEvent` whether the event should add to a multi-sort.\n*\n* @example\n* ```ts\n* const onClick = column_getToggleSortingHandler(column)\n* ```\n*/\nfunction column_getToggleSortingHandler(column) {\n\tconst canSort = column_getCanSort(column);\n\treturn (e) => {\n\t\tif (!canSort) return;\n\t\tcolumn_toggleSorting(column, void 0, column_getCanMultiSort(column) ? column.table.options.isMultiSortEvent?.(e) : false);\n\t};\n}\n\n//#endregion\nexport { column_clearSorting, column_getAutoSortDir, column_getAutoSortFn, column_getCanMultiSort, column_getCanSort, column_getFirstSortDir, column_getIsSorted, column_getNextSortingOrder, column_getSortFn, column_getSortIndex, column_getToggleSortingHandler, column_toggleSorting, getDefaultSortingState, table_autoResetSorting, table_resetSorting, table_setSorting };","import { makeObjectMap, skipFirstRun, tableMemo } from \"../../utils.js\";\nimport { constructRow } from \"../rows/constructRow.js\";\nimport { table_autoResetCellSelection } from \"../../features/cell-selection/cellSelectionFeature.utils.js\";\nimport { table_autoResetExpanded } from \"../../features/row-expanding/rowExpandingFeature.utils.js\";\nimport { table_autoResetPageIndex } from \"../../features/row-pagination/rowPaginationFeature.utils.js\";\nimport { table_autoResetSorting } from \"../../features/row-sorting/rowSortingFeature.utils.js\";\n\n//#region src/core/row-models/createCoreRowModel.ts\n/**\n* Creates a memoized core row model factory.\n*\n* The factory reads the relevant table state atoms and options, then returns a row model function used by the table row-model pipeline.\n*/\nfunction createCoreRowModel() {\n\treturn (table) => {\n\t\treturn tableMemo({\n\t\t\tfeature: \"coreRowModelsFeature\",\n\t\t\ttable,\n\t\t\tfnName: \"table.getCoreRowModel\",\n\t\t\tmemoDeps: () => [table.options.data],\n\t\t\tfn: () => _createCoreRowModel(table, table.options.data),\n\t\t\tonAfterUpdate: skipFirstRun(() => {\n\t\t\t\ttable_autoResetExpanded(table);\n\t\t\t\ttable_autoResetPageIndex(table);\n\t\t\t\ttable_autoResetSorting(table);\n\t\t\t\ttable_autoResetCellSelection(table);\n\t\t\t})\n\t\t});\n\t};\n}\nfunction accessRows(table, rowModel, originalRows, depth = 0, parentRow) {\n\tconst rows = [];\n\tfor (let i = 0; i < originalRows.length; i++) {\n\t\tconst originalRow = originalRows[i];\n\t\tconst row = constructRow(table, table.getRowId(originalRow, i, parentRow), originalRow, i, depth, void 0, parentRow?.id);\n\t\trowModel.flatRows.push(row);\n\t\trowModel.rowsById[row.id] = row;\n\t\trows.push(row);\n\t\tif (table.options.getSubRows) {\n\t\t\trow.originalSubRows = table.options.getSubRows(originalRow, i);\n\t\t\tif (row.originalSubRows?.length) row.subRows = accessRows(table, rowModel, row.originalSubRows, depth + 1, row);\n\t\t}\n\t}\n\treturn rows;\n}\nfunction _createCoreRowModel(table, data) {\n\tconst rowModel = {\n\t\trows: [],\n\t\tflatRows: [],\n\t\trowsById: makeObjectMap()\n\t};\n\trowModel.rows = accessRows(table, rowModel, data);\n\treturn rowModel;\n}\n\n//#endregion\nexport { createCoreRowModel };","import { createCoreRowModel } from \"./createCoreRowModel.js\";\n\n//#region src/core/row-models/coreRowModelsFeature.utils.ts\n/**\n* Resolves the table's unmodified core row model.\n*\n* The factory is created once per table, either from the `coreRowModel` slot on the `features` option\n* or the built-in `createCoreRowModel()`, then reused for later calls.\n*\n* @example\n* ```ts\n* const coreRows = table_getCoreRowModel(table)\n* ```\n*/\nfunction table_getCoreRowModel(table) {\n\tif (!table._rowModels.coreRowModel) table._rowModels.coreRowModel = table.options.features.coreRowModel?.(table) ?? createCoreRowModel()(table);\n\treturn table._rowModels.coreRowModel();\n}\n/**\n* Reads the row model immediately before column/global filtering.\n*\n* Filtering is the first derived row-model stage, so this currently aliases\n* `table.getCoreRowModel()`.\n*\n* @example\n* ```ts\n* const rowsBeforeFiltering = table_getPreFilteredRowModel(table)\n* ```\n*/\nfunction table_getPreFilteredRowModel(table) {\n\treturn table.getCoreRowModel();\n}\n/**\n* Resolves the row model after column and global filtering.\n*\n* When `manualFiltering` is enabled, or no filtered row-model factory was\n* registered, this returns the pre-filtered row model because filtering is\n* expected to happen outside the table.\n*\n* @example\n* ```ts\n* const filteredRows = table_getFilteredRowModel(table)\n* ```\n*/\nfunction table_getFilteredRowModel(table) {\n\tif (!table._rowModels.filteredRowModel) table._rowModels.filteredRowModel = table.options.features.filteredRowModel?.(table);\n\tif (table.options.manualFiltering || !table._rowModels.filteredRowModel) return table.getPreFilteredRowModel();\n\treturn table._rowModels.filteredRowModel();\n}\n/**\n* Reads the row model immediately before grouping.\n*\n* Grouping runs after filtering, so this aliases `table.getFilteredRowModel()`.\n*\n* @example\n* ```ts\n* const rowsBeforeGrouping = table_getPreGroupedRowModel(table)\n* ```\n*/\nfunction table_getPreGroupedRowModel(table) {\n\treturn table.getFilteredRowModel();\n}\n/**\n* Resolves the row model after grouping has produced grouped rows.\n*\n* When `manualGrouping` is enabled, or no grouped row-model factory was\n* registered, this returns the pre-grouped row model unchanged.\n*\n* @example\n* ```ts\n* const groupedRows = table_getGroupedRowModel(table)\n* ```\n*/\nfunction table_getGroupedRowModel(table) {\n\tif (!table._rowModels.groupedRowModel) table._rowModels.groupedRowModel = table.options.features.groupedRowModel?.(table);\n\tif (table.options.manualGrouping || !table._rowModels.groupedRowModel) return table.getPreGroupedRowModel();\n\treturn table._rowModels.groupedRowModel();\n}\n/**\n* Reads the row model immediately before sorting.\n*\n* Sorting runs after grouping, so this aliases `table.getGroupedRowModel()`.\n*\n* @example\n* ```ts\n* const rowsBeforeSorting = table_getPreSortedRowModel(table)\n* ```\n*/\nfunction table_getPreSortedRowModel(table) {\n\treturn table.getGroupedRowModel();\n}\n/**\n* Resolves the row model after sorting has been applied.\n*\n* When `manualSorting` is enabled, or no sorted row-model factory was\n* registered, this returns the pre-sorted row model because sorted data is\n* expected to be supplied by the caller.\n*\n* @example\n* ```ts\n* const sortedRows = table_getSortedRowModel(table)\n* ```\n*/\nfunction table_getSortedRowModel(table) {\n\tif (!table._rowModels.sortedRowModel) table._rowModels.sortedRowModel = table.options.features.sortedRowModel?.(table);\n\tif (table.options.manualSorting || !table._rowModels.sortedRowModel) return table.getPreSortedRowModel();\n\treturn table._rowModels.sortedRowModel();\n}\n/**\n* Reads the row model immediately before row expansion.\n*\n* Expansion runs after sorting, so this aliases `table.getSortedRowModel()`.\n*\n* @example\n* ```ts\n* const rowsBeforeExpansion = table_getPreExpandedRowModel(table)\n* ```\n*/\nfunction table_getPreExpandedRowModel(table) {\n\treturn table.getSortedRowModel();\n}\n/**\n* Resolves the row model after expanded rows have been flattened into view.\n*\n* When `manualExpanding` is enabled, or no expanded row-model factory was\n* registered, this returns the pre-expanded row model unchanged.\n*\n* @example\n* ```ts\n* const expandedRows = table_getExpandedRowModel(table)\n* ```\n*/\nfunction table_getExpandedRowModel(table) {\n\tif (!table._rowModels.expandedRowModel) table._rowModels.expandedRowModel = table.options.features.expandedRowModel?.(table);\n\tif (table.options.manualExpanding || !table._rowModels.expandedRowModel) return table.getPreExpandedRowModel();\n\treturn table._rowModels.expandedRowModel();\n}\n/**\n* Reads the row model immediately before pagination.\n*\n* Pagination is the final built-in row-model stage, so this aliases\n* `table.getExpandedRowModel()`.\n*\n* @example\n* ```ts\n* const rowsBeforePagination = table_getPrePaginatedRowModel(table)\n* ```\n*/\nfunction table_getPrePaginatedRowModel(table) {\n\treturn table.getExpandedRowModel();\n}\n/**\n* Resolves the row model after pagination has sliced rows for the current page.\n*\n* When `manualPagination` is enabled, or no paginated row-model factory was\n* registered, this returns the pre-paginated row model because pagination is\n* expected to happen before data reaches the table.\n*\n* @example\n* ```ts\n* const pageRows = table_getPaginatedRowModel(table)\n* ```\n*/\nfunction table_getPaginatedRowModel(table) {\n\tif (!table._rowModels.paginatedRowModel) table._rowModels.paginatedRowModel = table.options.features.paginatedRowModel?.(table);\n\tif (table.options.manualPagination || !table._rowModels.paginatedRowModel) return table.getPrePaginatedRowModel();\n\treturn table._rowModels.paginatedRowModel();\n}\n/**\n* Resolves the final row model consumed by renderers.\n*\n* This is the end of the built-in row-model pipeline: core -> filtering ->\n* grouping -> sorting -> expanding -> pagination.\n*\n* @example\n* ```ts\n* const visibleRows = table_getRowModel(table)\n* ```\n*/\nfunction table_getRowModel(table) {\n\treturn table.getPaginatedRowModel();\n}\n\n//#endregion\nexport { table_getCoreRowModel, table_getExpandedRowModel, table_getFilteredRowModel, table_getGroupedRowModel, table_getPaginatedRowModel, table_getPreExpandedRowModel, table_getPreFilteredRowModel, table_getPreGroupedRowModel, table_getPrePaginatedRowModel, table_getPreSortedRowModel, table_getRowModel, table_getSortedRowModel };","import { assignTableAPIs } from \"../../utils.js\";\nimport { table_getCoreRowModel, table_getExpandedRowModel, table_getFilteredRowModel, table_getGroupedRowModel, table_getPaginatedRowModel, table_getPreExpandedRowModel, table_getPreFilteredRowModel, table_getPreGroupedRowModel, table_getPrePaginatedRowModel, table_getPreSortedRowModel, table_getRowModel, table_getSortedRowModel } from \"./coreRowModelsFeature.utils.js\";\n\n//#region src/core/row-models/coreRowModelsFeature.ts\n/**\n* Core feature that wires table row-model accessors and row-model caches.\n*/\nconst coreRowModelsFeature = { constructTableAPIs: (table) => {\n\tassignTableAPIs(\"coreRowModelsFeature\", table, {\n\t\ttable_getCoreRowModel: { fn: () => table_getCoreRowModel(table) },\n\t\ttable_getPreFilteredRowModel: { fn: () => table_getPreFilteredRowModel(table) },\n\t\ttable_getFilteredRowModel: { fn: () => table_getFilteredRowModel(table) },\n\t\ttable_getPreGroupedRowModel: { fn: () => table_getPreGroupedRowModel(table) },\n\t\ttable_getGroupedRowModel: { fn: () => table_getGroupedRowModel(table) },\n\t\ttable_getPreSortedRowModel: { fn: () => table_getPreSortedRowModel(table) },\n\t\ttable_getSortedRowModel: { fn: () => table_getSortedRowModel(table) },\n\t\ttable_getPreExpandedRowModel: { fn: () => table_getPreExpandedRowModel(table) },\n\t\ttable_getExpandedRowModel: { fn: () => table_getExpandedRowModel(table) },\n\t\ttable_getPrePaginatedRowModel: { fn: () => table_getPrePaginatedRowModel(table) },\n\t\ttable_getPaginatedRowModel: { fn: () => table_getPaginatedRowModel(table) },\n\t\ttable_getRowModel: { fn: () => table_getRowModel(table) }\n\t});\n} };\n\n//#endregion\nexport { coreRowModelsFeature };","//#region src/core/cells/constructCell.ts\n/**\n* Creates or retrieves the cell prototype for a table.\n* The prototype is cached on the table and shared by all cell instances.\n*/\nfunction getCellPrototype(table) {\n\tif (!table._cellPrototype) {\n\t\ttable._cellPrototype = { table };\n\t\tconst features = Object.values(table._features);\n\t\tfor (let i = 0; i < features.length; i++) features[i].assignCellPrototype?.(table._cellPrototype, table);\n\t}\n\treturn table._cellPrototype;\n}\n/**\n* Constructs a cell instance from normalized table internals.\n*\n* This wires core properties, feature prototype APIs, and instance data used by table rendering and row-model operations.\n*/\nfunction constructCell(column, row, table) {\n\tconst cellPrototype = getCellPrototype(table);\n\tconst cell = Object.create(cellPrototype);\n\tcell.column = column;\n\tcell.id = `${row.id}_${column.id}`;\n\tcell.row = row;\n\tconst initFns = table._cellInstanceInitFns;\n\tfor (let i = 0; i < initFns.length; i++) initFns[i](cell);\n\treturn cell;\n}\n\n//#endregion\nexport { constructCell };","import { flattenBy, hasOwn, makeObjectMap } from \"../../utils.js\";\nimport { constructCell } from \"../cells/constructCell.js\";\n\n//#region src/core/rows/coreRowsFeature.utils.ts\n/**\n* Returns this row's zero-based position in the current pre-pagination row\n* model. Rows outside that model return `-1`.\n*/\nfunction row_getDisplayIndex(row) {\n\tconst rows = row.table.getRowsInDisplayOrder();\n\tconst displayIndex = row._displayIndexCache;\n\treturn rows[displayIndex] === row ? displayIndex : -1;\n}\n/**\n* Returns the rows in the current display order after assigning their\n* zero-based display indexes.\n*\n* When expanded rows bypass pagination, expanded descendants are inserted into\n* the returned order even though they are absent from the pre-pagination row\n* model.\n*/\nfunction table_getRowsInDisplayOrder(table) {\n\tconst rows = table.getPrePaginatedRowModel().rows;\n\tif (table.options.paginateExpandedRows === false) {\n\t\tconst displayRows = [];\n\t\tconst handleRow = (row) => {\n\t\t\trow._displayIndexCache = displayRows.length;\n\t\t\tdisplayRows.push(row);\n\t\t\tif (row.subRows.length && row.getIsExpanded?.()) row.subRows.forEach(handleRow);\n\t\t};\n\t\trows.forEach(handleRow);\n\t\treturn displayRows;\n\t}\n\tfor (let i = 0; i < rows.length; i++) rows[i]._displayIndexCache = i;\n\treturn rows;\n}\n/**\n* Reads and caches this row's value for a column.\n*\n* The value is produced by the column accessor. Missing columns or display\n* columns without an accessor return `undefined`.\n*\n* @example\n* ```ts\n* const firstName = row_getValue(row, 'firstName')\n* ```\n*/\nfunction row_getValue(row, columnId) {\n\tif (hasOwn(row._valuesCache, columnId)) return row._valuesCache[columnId];\n\tconst column = row.table.getColumn(columnId);\n\tif (!column?.accessorFn) return;\n\trow._valuesCache[columnId] = column.accessorFn(row.original, row.index);\n\treturn row._valuesCache[columnId];\n}\n/**\n* Reads and caches the values used by faceting/grouping for a column.\n*\n* If the column defines `getUniqueValues`, that result is used. Otherwise the\n* row's accessor value is wrapped in a single-item array.\n*\n* @example\n* ```ts\n* const values = row_getUniqueValues(row, 'tags')\n* ```\n*/\nfunction row_getUniqueValues(row, columnId) {\n\tif (hasOwn(row._uniqueValuesCache, columnId)) return row._uniqueValuesCache[columnId];\n\tconst column = row.table.getColumn(columnId);\n\tif (!column?.accessorFn) return;\n\tif (!column.columnDef.getUniqueValues) {\n\t\trow._uniqueValuesCache[columnId] = [row.getValue(columnId)];\n\t\treturn row._uniqueValuesCache[columnId];\n\t}\n\trow._uniqueValuesCache[columnId] = column.columnDef.getUniqueValues(row.original, row.index);\n\treturn row._uniqueValuesCache[columnId];\n}\n/**\n* Returns a renderable row value for a column.\n*\n* If the accessor value is nullish, the table's `renderFallbackValue` is used\n* instead.\n*\n* @example\n* ```ts\n* const value = row_renderValue(row, 'firstName')\n* ```\n*/\nfunction row_renderValue(row, columnId) {\n\treturn row.getValue(columnId) ?? row.table.options.renderFallbackValue;\n}\n/**\n* Flattens this row's descendant tree into leaf rows.\n*\n* The row itself is not included; only nested `subRows` are walked.\n*\n* @example\n* ```ts\n* const descendants = row_getLeafRows(row)\n* ```\n*/\nfunction row_getLeafRows(row) {\n\treturn flattenBy(row.subRows, (d) => d.subRows);\n}\n/**\n* Returns the deepest structural row depth in the core row model.\n* Root rows are depth `0`, their direct sub-rows are depth `1`, and so on.\n*/\nfunction table_getMaxSubRowDepth(table) {\n\tconst rows = table.getCoreRowModel().flatRows;\n\tlet maxDepth = 0;\n\tfor (let i = 0; i < rows.length; i++) maxDepth = Math.max(maxDepth, rows[i].depth);\n\treturn maxDepth;\n}\n/**\n* Looks up this row's direct parent, if it has one.\n*\n* Parent lookup prefers the core row model for structural parents, then falls\n* back to the pre-pagination row model for generated parent rows.\n*\n* @example\n* ```ts\n* const parent = row_getParentRow(row)\n* ```\n*/\nfunction row_getParentRow(row) {\n\tif (!row.parentId) return;\n\treturn row.table.getCoreRowModel().rowsById[row.parentId] ?? row.table.getRow(row.parentId, true);\n}\n/**\n* Collects this row's ancestor chain from root to direct parent.\n*\n* The current row is not included. Rows without a parent return an empty array.\n*\n* @example\n* ```ts\n* const ancestors = row_getParentRows(row)\n* ```\n*/\nfunction row_getParentRows(row) {\n\tconst parentRows = [];\n\tlet currentRow = row;\n\twhile (true) {\n\t\tconst parentRow = currentRow.getParentRow();\n\t\tif (!parentRow) break;\n\t\tparentRows.push(parentRow);\n\t\tcurrentRow = parentRow;\n\t}\n\treturn parentRows.reverse();\n}\n/**\n* Constructs one cell for each leaf column in this row.\n*\n* The result follows `table.getAllLeafColumns()` order and includes hidden\n* columns; visibility-specific APIs filter this list later.\n*\n* @example\n* ```ts\n* const cells = row_getAllCells(row)\n* ```\n*/\nfunction row_getAllCells(row) {\n\tconst columns = row.table.getAllLeafColumns();\n\tlet cache = row._cellsCache;\n\tif (!cache) cache = row._cellsCache = /* @__PURE__ */ new WeakMap();\n\tconst cells = new Array(columns.length);\n\tfor (let i = 0; i < columns.length; i++) {\n\t\tconst column = columns[i];\n\t\tlet cell = cache.get(column);\n\t\tif (!cell) {\n\t\t\tcell = constructCell(column, row, row.table);\n\t\t\tcache.set(column, cell);\n\t\t}\n\t\tcells[i] = cell;\n\t}\n\treturn cells;\n}\n/**\n* Builds a lookup map of this row's cells keyed by column id.\n*\n* This is the static implementation behind `row.getAllCellsByColumnId()`.\n*\n* @example\n* ```ts\n* const cellsById = row_getAllCellsByColumnId(row)\n* ```\n*/\nfunction row_getAllCellsByColumnId(row) {\n\tconst result = makeObjectMap();\n\tconst cells = row.getAllCells();\n\tfor (let i = 0; i < cells.length; i++) {\n\t\tconst cell = cells[i];\n\t\tresult[cell.column.id] = cell;\n\t}\n\treturn result;\n}\n/**\n* Resolves the stable id for a row.\n*\n* `options.getRowId` wins when provided. Otherwise root rows use their index\n* and child rows append their index to the parent id, such as `0.2`.\n*\n* @example\n* ```ts\n* const id = table_getRowId(originalRow, table, index, parentRow)\n* ```\n*/\nfunction table_getRowId(originalRow, table, index, parent) {\n\treturn table.options.getRowId?.(originalRow, index, parent) ?? (parent ? `${parent.id}.${index}` : String(index));\n}\n/**\n* Looks up a row by id from the current or full row model.\n*\n* By default this searches `table.getRowModel()`. Passing `searchAll` searches\n* the pre-pagination model first, then falls back to the core model.\n*\n* @example\n* ```ts\n* const row = table_getRow(table, rowId, true)\n* ```\n*/\nfunction table_getRow(table, rowId, searchAll) {\n\tlet row = (searchAll ? table.getPrePaginatedRowModel() : table.getRowModel()).rowsById[rowId];\n\tif (!row) {\n\t\trow = table.getCoreRowModel().rowsById[rowId];\n\t\tif (!row) {\n\t\t\tif (process.env.NODE_ENV === \"development\") throw new Error(`getRow could not find row with ID: ${rowId}`);\n\t\t\tthrow new Error();\n\t\t}\n\t}\n\treturn row;\n}\n\n//#endregion\nexport { row_getAllCells, row_getAllCellsByColumnId, row_getDisplayIndex, row_getLeafRows, row_getParentRow, row_getParentRows, row_getUniqueValues, row_getValue, row_renderValue, table_getMaxSubRowDepth, table_getRow, table_getRowId, table_getRowsInDisplayOrder };","import { assignPrototypeAPIs, assignTableAPIs } from \"../../utils.js\";\nimport { row_getAllCells, row_getAllCellsByColumnId, row_getDisplayIndex, row_getLeafRows, row_getParentRow, row_getParentRows, row_getUniqueValues, row_getValue, row_renderValue, table_getMaxSubRowDepth, table_getRow, table_getRowId, table_getRowsInDisplayOrder } from \"./coreRowsFeature.utils.js\";\n\n//#region src/core/rows/coreRowsFeature.ts\n/**\n* Core feature that creates row APIs for values, cells, and tree traversal.\n*/\nconst coreRowsFeature = {\n\tassignRowPrototype: (prototype, table) => {\n\t\tassignPrototypeAPIs(\"coreRowsFeature\", prototype, table, {\n\t\t\trow_getDisplayIndex: { fn: (row) => row_getDisplayIndex(row) },\n\t\t\trow_getAllCellsByColumnId: {\n\t\t\t\tfn: (row) => row_getAllCellsByColumnId(row),\n\t\t\t\tmemoDeps: (row) => [row.getAllCells()]\n\t\t\t},\n\t\t\trow_getAllCells: {\n\t\t\t\tfn: (row) => row_getAllCells(row),\n\t\t\t\tmemoDeps: (row) => [row.table.getAllLeafColumns()]\n\t\t\t},\n\t\t\trow_getLeafRows: {\n\t\t\t\tfn: (row) => row_getLeafRows(row),\n\t\t\t\tmemoDeps: (row) => [row.subRows]\n\t\t\t},\n\t\t\trow_getParentRow: { fn: (row) => row_getParentRow(row) },\n\t\t\trow_getParentRows: { fn: (row) => row_getParentRows(row) },\n\t\t\trow_getUniqueValues: { fn: (row, columnId) => row_getUniqueValues(row, columnId) },\n\t\t\trow_getValue: { fn: (row, columnId) => row_getValue(row, columnId) },\n\t\t\trow_renderValue: { fn: (row, columnId) => row_renderValue(row, columnId) }\n\t\t});\n\t},\n\tconstructTableAPIs: (table) => {\n\t\tassignTableAPIs(\"coreRowsFeature\", table, {\n\t\t\ttable_getRowsInDisplayOrder: {\n\t\t\t\tfn: () => table_getRowsInDisplayOrder(table),\n\t\t\t\tmemoDeps: () => [\n\t\t\t\t\ttable.getPrePaginatedRowModel().rows,\n\t\t\t\t\ttable.options.paginateExpandedRows,\n\t\t\t\t\ttable.options.paginateExpandedRows === false ? table.atoms.expanded?.get() : void 0\n\t\t\t\t]\n\t\t\t},\n\t\t\ttable_getRowId: { fn: (originalRow, index, parent) => table_getRowId(originalRow, table, index, parent) },\n\t\t\ttable_getRow: { fn: (id, searchAll) => table_getRow(table, id, searchAll) },\n\t\t\ttable_getMaxSubRowDepth: {\n\t\t\t\tfn: () => table_getMaxSubRowDepth(table),\n\t\t\t\tmemoDeps: () => [table.getCoreRowModel()]\n\t\t\t}\n\t\t});\n\t}\n};\n\n//#endregion\nexport { coreRowsFeature };","import { cloneState, functionalUpdate } from \"../../utils.js\";\n\n//#region src/core/table/coreTablesFeature.utils.ts\n/**\n* Synchronizes externally controlled state slices into the table's base atoms.\n*\n* This keeps `options.state` values mirrored in the atom graph so derived\n* atoms, stores, and table APIs read a consistent snapshot.\n*\n* Adapters that update options during their host's render phase pass the\n* state snapshot captured by the committed render as `capturedState` — the\n* shared options object may already hold values from a newer render that\n* never commits. Pass `null` to publish nothing (a captured \"no controlled\n* state\"); omitting the argument reads the current `table.options.state`\n* instead. An optional `compare` suppresses semantically unchanged slice\n* writes; the default remains reference equality.\n*\n* @example\n* ```ts\n* table_syncExternalStateToBaseAtoms(table)\n* table_syncExternalStateToBaseAtoms(table, capturedState ?? null, shallow)\n* ```\n*/\nfunction table_syncExternalStateToBaseAtoms(table, capturedState, compare = (currentState, externalState) => currentState === externalState) {\n\tconst state = capturedState === void 0 ? table.options.state : capturedState;\n\ttable._reactivity.batch(() => {\n\t\tif (state) for (const key in state) {\n\t\t\tconst baseAtom = table.baseAtoms[key];\n\t\t\tif (!baseAtom) continue;\n\t\t\tconst rawExternalState = state[key];\n\t\t\tconst externalState = rawExternalState === void 0 ? table.initialState[key] : rawExternalState;\n\t\t\tif (!compare(table._reactivity.untrack(() => baseAtom.get()), externalState)) baseAtom.set(() => externalState);\n\t\t}\n\t});\n}\n/**\n* Publishes captured controlled state after a host framework commits.\n*\n* Render-phase adapters stage options without synchronizing base atoms, then\n* pass the state captured by the committed render here. The commit signal also\n* invalidates ownership changes when no base atom was written.\n*/\nfunction table_publishExternalState(table, state, compare = (currentState, externalState) => currentState === externalState) {\n\ttable._reactivity.batch(() => {\n\t\ttable_syncExternalStateToBaseAtoms(table, state, compare);\n\t\ttable._reactivity.commit?.();\n\t});\n}\n/**\n* Resets all internal table base atoms to `table.initialState`, then clears\n* transient instance data through registered feature reset hooks.\n*\n* This resets internally owned state slices in a single reactivity batch. Use\n* feature-specific reset APIs when a slice may be externally owned.\n*\n* @example\n* ```ts\n* table_reset(table)\n* ```\n*/\nfunction table_reset(table) {\n\tconst snap = cloneState(table.initialState);\n\ttable._reactivity.batch(() => {\n\t\tconst keys = Object.keys(snap);\n\t\tfor (let i = 0; i < keys.length; i++) {\n\t\t\tconst key = keys[i];\n\t\t\ttable.baseAtoms[key].set(snap[key]);\n\t\t}\n\t});\n\tconst features = Object.values(table._features);\n\tfor (let i = 0; i < features.length; i++) features[i].resetTableInstanceData?.(table);\n}\n/**\n* Merges new table options with the current resolved options.\n*\n* If `options.mergeOptions` is provided, it owns the merge behavior; otherwise\n* options are shallow-merged. Static options that should never change after\n* initialization are restored on a fresh object so framework merge helpers may\n* return readonly getter/proxy objects.\n*\n* @example\n* ```ts\n* const options = table_mergeOptions(table, nextOptions)\n* ```\n*/\nfunction table_mergeOptions(table, newOptions) {\n\tconst { features, atoms, initialState } = table.options;\n\tif (!table.options.mergeOptions) return {\n\t\t...table.options,\n\t\t...newOptions,\n\t\tfeatures,\n\t\tatoms,\n\t\tinitialState\n\t};\n\tconst mergedOptions = table.options.mergeOptions(table.options, newOptions);\n\tconst descriptors = { ...Object.getOwnPropertyDescriptors(mergedOptions) };\n\treturn Object.defineProperties(Object.create(Object.getPrototypeOf(mergedOptions)), {\n\t\t...descriptors,\n\t\tfeatures: {\n\t\t\tvalue: features,\n\t\t\tenumerable: true,\n\t\t\tconfigurable: true,\n\t\t\twritable: true\n\t\t},\n\t\tatoms: {\n\t\t\tvalue: atoms,\n\t\t\tenumerable: true,\n\t\t\tconfigurable: true,\n\t\t\twritable: true\n\t\t},\n\t\tinitialState: {\n\t\t\tvalue: initialState,\n\t\t\tenumerable: true,\n\t\t\tconfigurable: true,\n\t\t\twritable: true\n\t\t}\n\t});\n}\n/**\n* Updates the table options object.\n*\n* The updater receives the current resolved options and the merged result is\n* immediately assigned to the table instance.\n*\n* @example\n* ```ts\n* table_setOptions(table, (old) => old)\n* table_setOptions(table, (old) => old, { syncExternalState: false })\n* ```\n*/\nfunction table_setOptions(table, updater, options) {\n\tconst mergedOptions = table_mergeOptions(table, functionalUpdate(updater, table.options));\n\tif (table.optionsStore) table.optionsStore.set(() => mergedOptions);\n\telse table.options = mergedOptions;\n\tif (options?.syncExternalState !== false) table_publishExternalState(table, mergedOptions.state ?? null);\n}\n\n//#endregion\nexport { table_mergeOptions, table_publishExternalState, table_reset, table_setOptions, table_syncExternalStateToBaseAtoms };","import { coreCellsFeature } from \"./cells/coreCellsFeature.js\";\nimport { coreColumnsFeature } from \"./columns/coreColumnsFeature.js\";\nimport { coreHeadersFeature } from \"./headers/coreHeadersFeature.js\";\nimport { coreRowModelsFeature } from \"./row-models/coreRowModelsFeature.js\";\nimport { coreRowsFeature } from \"./rows/coreRowsFeature.js\";\nimport { coreTablesFeature } from \"./table/coreTablesFeature.js\";\n\n//#region src/core/coreFeatures.ts\n/**\n* The built-in core feature set required by every table.\n*\n* These features provide table, column, row, header, cell, and core row-model behavior before optional feature plugins are added.\n*/\nconst coreFeatures = {\n\tcoreCellsFeature,\n\tcoreColumnsFeature,\n\tcoreHeadersFeature,\n\tcoreRowModelsFeature,\n\tcoreRowsFeature,\n\tcoreTablesFeature\n};\n\n//#endregion\nexport { coreFeatures };","import { assignTableAPIs } from \"../../utils.js\";\nimport { table_reset, table_setOptions } from \"./coreTablesFeature.utils.js\";\n\n//#region src/core/table/coreTablesFeature.ts\n/**\n* Core feature that adds base table instance APIs such as reset and setOptions.\n*/\nconst coreTablesFeature = { constructTableAPIs: (table) => {\n\tassignTableAPIs(\"coreTablesFeature\", table, {\n\t\ttable_reset: { fn: () => table_reset(table) },\n\t\ttable_setOptions: { fn: (updater) => table_setOptions(table, updater) }\n\t});\n} };\n\n//#endregion\nexport { coreTablesFeature };","//#region src/helpers/tableFeatures.ts\n/**\n* A helper function to help define the features that are to be imported and applied to a table instance.\n* Use this utility to make it easier to have the correct type inference for the features that are being imported.\n* **Note:** It is recommended to use this utility statically outside of a component.\n*\n* Alongside feature modules, this object carries everything else that is\n* statically stitched into the table:\n*\n* - Row model factories (`sortedRowModel`, `filteredRowModel`, etc.)\n* - Row model function registries (`sortFns`, `filterFns`, `aggregationFns`),\n* whose keys become the valid string values for `sortFn`, `filterFn`,\n* `globalFilterFn`, and `aggregationFn` with full inference\n* - Type-only `tableMeta`/`columnMeta` slots for declaring per-table meta types\n* instead of using global declaration merging. The values are phantom\n* (ignored and stripped at runtime); only their types are used.\n* @example\n* ```\n* import {\n* columnFilteringFeature,\n* createFilteredRowModel,\n* createSortedRowModel,\n* filterFn_includesString,\n* rowSortingFeature,\n* sortFn_alphanumeric,\n* sortFn_text,\n* tableFeatures,\n* } from '@tanstack/react-table'\n* const features = tableFeatures({\n* columnFilteringFeature,\n* rowSortingFeature,\n* filteredRowModel: createFilteredRowModel(),\n* sortedRowModel: createSortedRowModel(),\n* filterFns: { includesString: filterFn_includesString, myCustomFilterFn },\n* sortFns: { alphanumeric: sortFn_alphanumeric, text: sortFn_text },\n* tableMeta: {} as { updateData: (rowIndex: number, columnId: string, value: unknown) => void },\n* columnMeta: {} as { align?: 'left' | 'right' },\n* });\n* const table = useTable({ features, columns, data });\n* ```\n*/\nfunction tableFeatures(features) {\n\treturn features;\n}\n\n//#endregion\nexport { tableFeatures };","import { cloneState, hasOwn } from \"../../utils.js\";\nimport { table_syncExternalStateToBaseAtoms } from \"./coreTablesFeature.utils.js\";\nimport { coreFeatures } from \"../coreFeatures.js\";\nimport { atomToStore } from \"../reactivity/coreReactivityFeature.utils.js\";\nimport { shallow } from \"@tanstack/store\";\n\n//#region src/core/table/constructTable.ts\n/**\n* Builds the initial table state from registered features and user initial state.\n*\n* Each feature contributes its default state before user-provided `initialState` values are merged in.\n*/\nfunction getInitialTableState(features, initialState = {}) {\n\tObject.values(features).forEach((feature) => {\n\t\tinitialState = feature.getInitialState?.(initialState) ?? initialState;\n\t});\n\treturn cloneState(initialState);\n}\n/**\n* Constructs a table instance from normalized table internals.\n*\n* This wires core properties, feature prototype APIs, and instance data used by table rendering and row-model operations.\n*/\nfunction constructTable(tableOptions) {\n\tconst _reactivity = tableOptions.features.coreReactivityFeature;\n\tconst { aggregationFns, columnMeta: _columnMeta, coreRowModel, expandedRowModel, facetedMinMaxValues, facetedRowModel, facetedUniqueValues, filterFns, filterMeta: _filterMeta, filteredRowModel, groupedRowModel, paginatedRowModel, sortFns, sortedRowModel, tableMeta: _tableMeta, ...features } = tableOptions.features;\n\tconst table = {\n\t\t_cellInstanceInitFns: [],\n\t\t_columnInstanceInitFns: [],\n\t\t_features: {\n\t\t\t...coreFeatures,\n\t\t\t...features\n\t\t},\n\t\t_headerGroupInstanceInitFns: [],\n\t\t_headerInstanceInitFns: [],\n\t\t_reactivity,\n\t\t_rowInstanceInitFns: [],\n\t\t_rowModelFns: {\n\t\t\taggregationFns,\n\t\t\tfilterFns,\n\t\t\tsortFns\n\t\t},\n\t\t_rowModels: {},\n\t\tatoms: {},\n\t\tbaseAtoms: {}\n\t};\n\tconst featuresList = Object.values(table._features);\n\tconst mergedOptions = {\n\t\t...featuresList.reduce((obj, feature) => {\n\t\t\treturn Object.assign(obj, feature.getDefaultTableOptions?.(table));\n\t\t}, {}),\n\t\t...tableOptions\n\t};\n\tif (_reactivity.wrapExternalAtoms && mergedOptions.atoms) for (const [atomKey, _atom] of Object.entries(mergedOptions.atoms)) {\n\t\tconst atom = _atom;\n\t\tconst wrappedAtom = _reactivity.createWritableAtom(atom.get(), { debugName: `externalAtom/${atomKey}` });\n\t\tmergedOptions.atoms[atomKey] = wrappedAtom;\n\t\tlet syncExternal = false;\n\t\tconst syncAtomToWrappedSub = atom.subscribe((value) => {\n\t\t\tif (syncExternal) return;\n\t\t\twrappedAtom.set(value);\n\t\t});\n\t\tconst syncWrappedToAtomSub = wrappedAtom.subscribe((value) => {\n\t\t\tsyncExternal = true;\n\t\t\tatom.set(value);\n\t\t\tsyncExternal = false;\n\t\t});\n\t\t_reactivity.addSubscription(syncAtomToWrappedSub);\n\t\t_reactivity.addSubscription(syncWrappedToAtomSub);\n\t}\n\tif (_reactivity.createOptionsStore) {\n\t\ttable.optionsStore = _reactivity.createWritableAtom(mergedOptions, { debugName: \"table/optionsStore\" });\n\t\tObject.defineProperty(table, \"options\", {\n\t\t\tconfigurable: true,\n\t\t\tenumerable: true,\n\t\t\tget() {\n\t\t\t\treturn table.optionsStore.get();\n\t\t\t},\n\t\t\tset(value) {\n\t\t\t\ttable.optionsStore.set(() => value);\n\t\t\t}\n\t\t});\n\t} else table.options = mergedOptions;\n\ttable.initialState = getInitialTableState(table._features, table.options.initialState);\n\tconst stateKeys = Object.keys(table.initialState);\n\tfor (let i = 0; i < stateKeys.length; i++) {\n\t\tconst key = stateKeys[i];\n\t\ttable.baseAtoms[key] = _reactivity.createWritableAtom(table.initialState[key], { debugName: `table/baseAtoms/${key}` });\n\t\ttable.atoms[key] = _reactivity.createReadonlyAtom(() => {\n\t\t\tconst options = table.options;\n\t\t\tconst externalAtom = options.atoms?.[key];\n\t\t\tconst reactiveState = externalAtom ? externalAtom.get() : table.baseAtoms[key].get();\n\t\t\tif (externalAtom) return reactiveState;\n\t\t\tconst controlledState = options.state;\n\t\t\tif (controlledState && hasOwn(controlledState, key)) {\n\t\t\t\tconst controlledValue = controlledState[key];\n\t\t\t\treturn controlledValue === void 0 ? table.initialState[key] : controlledValue;\n\t\t\t}\n\t\t\treturn reactiveState;\n\t\t}, { debugName: `table/atoms/${key}` });\n\t}\n\ttable_syncExternalStateToBaseAtoms(table);\n\ttable.store = atomToStore(_reactivity.createReadonlyAtom(() => {\n\t\tconst snapshot = {};\n\t\tfor (let i = 0; i < stateKeys.length; i++) {\n\t\t\tconst key = stateKeys[i];\n\t\t\tsnapshot[key] = table.atoms[key].get();\n\t\t}\n\t\treturn snapshot;\n\t}, {\n\t\tcompare: shallow,\n\t\tdebugName: \"table/store\"\n\t}));\n\tfor (let i = 0; i < featuresList.length; i++) {\n\t\tconst feature = featuresList[i];\n\t\tfeature.initTableInstanceData?.(table);\n\t\tif (feature.initCellInstanceData) table._cellInstanceInitFns.push(feature.initCellInstanceData.bind(feature));\n\t\tif (feature.initColumnInstanceData) table._columnInstanceInitFns.push(feature.initColumnInstanceData.bind(feature));\n\t\tif (feature.initHeaderGroupInstanceData) table._headerGroupInstanceInitFns.push(feature.initHeaderGroupInstanceData.bind(feature));\n\t\tif (feature.initHeaderInstanceData) table._headerInstanceInitFns.push(feature.initHeaderInstanceData.bind(feature));\n\t\tif (feature.initRowInstanceData) table._rowInstanceInitFns.push(feature.initRowInstanceData.bind(feature));\n\t\tfeature.constructTableAPIs?.(table);\n\t}\n\tif (process.env.NODE_ENV === \"development\" && (tableOptions.debugAll || tableOptions.debugTable)) {\n\t\tconst features = Object.keys(table._features);\n\t\tconst rowModels = Object.entries({\n\t\t\tcoreRowModel,\n\t\t\tfilteredRowModel,\n\t\t\tgroupedRowModel,\n\t\t\tsortedRowModel,\n\t\t\texpandedRowModel,\n\t\t\tpaginatedRowModel,\n\t\t\tfacetedRowModel,\n\t\t\tfacetedMinMaxValues,\n\t\t\tfacetedUniqueValues\n\t\t}).filter(([, factory]) => factory).map(([key]) => key);\n\t\tconst states = Object.keys(table.initialState);\n\t\tconsole.log(`Constructing Table Instance\n\n Features: ${features.join(\"\\n \")}\n\n Row Models: ${rowModels.length ? rowModels.join(\"\\n \") : \"(none)\"}\n\n States: ${states.join(\"\\n \")}\\n`, { table });\n\t}\n\treturn table;\n}\n\n//#endregion\nexport { constructTable, getInitialTableState };","import { cloneState, functionalUpdate, isFunction, setStateSlice } from \"../../utils.js\";\n\n//#region src/features/column-filtering/columnFilteringFeature.utils.ts\n/**\n* Creates the default column filter state.\n*\n* The feature default is an empty array, meaning no column filters are active.\n* Reset APIs use this value when `defaultState` is `true`.\n*\n* @example\n* ```ts\n* const filters = getDefaultColumnFiltersState()\n* ```\n*/\nfunction getDefaultColumnFiltersState() {\n\treturn [];\n}\n/**\n* Chooses a built-in filter function from the column's first core row value.\n*\n* Strings use `includesString`, numbers use `inNumberRange`, booleans and\n* objects use `equals`, dates use `inDateRange`, arrays use `arrIncludes`,\n* and unknown values fall back to `weakEquals`.\n*\n* The chosen filter function is looked up in the table's `filterFns`\n* registry. When it is not registered there, this returns `undefined` and\n* warns in development instead of substituting a different filter function.\n*\n* @example\n* ```ts\n* const filterFn = column_getAutoFilterFn(column)\n* ```\n*/\nfunction column_getAutoFilterFn(column) {\n\tconst filterFns = column.table._rowModelFns.filterFns;\n\tconst rows = column.table.getCoreRowModel().flatRows;\n\tlet value;\n\tfor (let i = 0; i < rows.length; i++) {\n\t\tconst rowValue = rows[i].getValue(column.id);\n\t\tif (rowValue !== null && rowValue !== void 0) {\n\t\t\tvalue = rowValue;\n\t\t\tbreak;\n\t\t}\n\t}\n\tlet filterFnName;\n\tif (typeof value === \"string\") filterFnName = \"includesString\";\n\telse if (typeof value === \"number\") filterFnName = \"inNumberRange\";\n\telse if (typeof value === \"boolean\") filterFnName = \"equals\";\n\telse if (Array.isArray(value)) filterFnName = \"arrIncludes\";\n\telse if (Object.prototype.toString.call(value) === \"[object Date]\") filterFnName = \"inDateRange\";\n\telse if (value !== null && typeof value === \"object\") filterFnName = \"equals\";\n\telse filterFnName = \"weakEquals\";\n\tconst filterFn = filterFns?.[filterFnName];\n\tif (process.env.NODE_ENV === \"development\" && !filterFn) console.warn(`filterFn '${filterFnName}' (auto) for column '${column.id}' is not registered`);\n\treturn filterFn;\n}\n/**\n* Resolves the filter function configured for a column.\n*\n* Function-valued `columnDef.filterFn` is returned directly, `'auto'` delegates\n* to `column_getAutoFilterFn`, and string values are looked up in the table's\n* filter function registry.\n*\n* @example\n* ```ts\n* const filterFn = column_getFilterFn(column)\n* ```\n*/\nfunction column_getFilterFn(column) {\n\tlet filterFn = null;\n\tconst filterFns = column.table._rowModelFns.filterFns;\n\tfilterFn = isFunction(column.columnDef.filterFn) ? column.columnDef.filterFn : column.columnDef.filterFn === \"auto\" ? column_getAutoFilterFn(column) : filterFns?.[column.columnDef.filterFn];\n\tif (process.env.NODE_ENV === \"development\" && !filterFn && column.columnDef.filterFn !== \"auto\") console.warn(`filterFn '${String(column.columnDef.filterFn)}' for column '${column.id}' is not registered`);\n\treturn filterFn ?? void 0;\n}\n/**\n* Checks whether column filtering is enabled for this accessor column.\n*\n* The column must have an accessor and filtering must be enabled by the column\n* definition, `enableColumnFilters`, and the table-wide `enableFilters` option.\n*\n* @example\n* ```ts\n* const canFilter = column_getCanFilter(column)\n* ```\n*/\nfunction column_getCanFilter(column) {\n\treturn (column.columnDef.enableColumnFilter ?? true) && (column.table.options.enableColumnFilters ?? true) && (column.table.options.enableFilters ?? true) && !!column.accessorFn;\n}\n/**\n* Checks whether this column currently has an entry in `state.columnFilters`.\n*\n* This only reflects filter state presence; it does not indicate whether the\n* filter removes any rows.\n*\n* @example\n* ```ts\n* const isFiltered = column_getIsFiltered(column)\n* ```\n*/\nfunction column_getIsFiltered(column) {\n\treturn column_getFilterIndex(column) > -1;\n}\n/**\n* Reads this column's current filter value from `state.columnFilters`.\n*\n* Missing filter entries return `undefined`.\n*\n* @example\n* ```ts\n* const value = column_getFilterValue(column)\n* ```\n*/\nfunction column_getFilterValue(column) {\n\treturn column.table.atoms.columnFilters?.get()?.find((d) => d.id === column.id)?.value;\n}\n/**\n* Finds this column's position in the ordered `state.columnFilters` array.\n*\n* The result is `-1` when the column has no active filter.\n*\n* @example\n* ```ts\n* const index = column_getFilterIndex(column)\n* ```\n*/\nfunction column_getFilterIndex(column) {\n\treturn column.table.atoms.columnFilters?.get()?.findIndex((d) => d.id === column.id) ?? -1;\n}\n/**\n* Adds, updates, or removes this column's filter value.\n*\n* The incoming value may be an updater. After resolution, `autoRemove` rules\n* decide whether the filter should be removed instead of stored.\n*\n* @example\n* ```ts\n* column_setFilterValue(column, (old) => String(old ?? '').trim())\n* ```\n*/\nfunction column_setFilterValue(column, value) {\n\ttable_setColumnFilters(column.table, (old) => {\n\t\tconst filterFn = column_getFilterFn(column);\n\t\tconst previousFilter = old.find((d) => d.id === column.id);\n\t\tconst newFilter = functionalUpdate(value, previousFilter ? previousFilter.value : void 0);\n\t\tif (shouldAutoRemoveFilter(filterFn, newFilter, column)) return old.filter((d) => d.id !== column.id);\n\t\tconst newFilterObj = {\n\t\t\tid: column.id,\n\t\t\tvalue: newFilter\n\t\t};\n\t\tif (previousFilter) return old.map((d) => {\n\t\t\tif (d.id === column.id) return newFilterObj;\n\t\t\treturn d;\n\t\t});\n\t\tif (old.length) return [...old, newFilterObj];\n\t\treturn [newFilterObj];\n\t});\n}\n/**\n* Routes a column filter updater through the table's filter change handler.\n*\n* The resolved filters are cleaned before they are emitted: filters for known\n* columns are removed when their filter function says the value should be\n* auto-removed.\n*\n* @example\n* ```ts\n* table_setColumnFilters(table, (old) => old.filter((filter) => filter.id !== 'age'))\n* ```\n*/\nfunction table_setColumnFilters(table, updater) {\n\tconst leafColumnsById = table.getAllLeafColumnsById();\n\tconst updateFn = (old) => {\n\t\treturn functionalUpdate(updater, old).filter((filter) => {\n\t\t\tconst column = leafColumnsById[filter.id];\n\t\t\tif (column) {\n\t\t\t\tif (shouldAutoRemoveFilter(column_getFilterFn(column), filter.value, column)) return false;\n\t\t\t}\n\t\t\treturn true;\n\t\t});\n\t};\n\tsetStateSlice(table, \"columnFilters\", updateFn);\n}\n/**\n* Resets `columnFilters` to the configured initial state or feature default.\n*\n* With no argument, the reset clones `table.initialState.columnFilters` when it\n* exists. Passing `true` ignores initial state and resets to `[]`.\n*\n* @example\n* ```ts\n* table_resetColumnFilters(table)\n* table_resetColumnFilters(table, true)\n* ```\n*/\nfunction table_resetColumnFilters(table, defaultState) {\n\ttable_setColumnFilters(table, defaultState ? [] : cloneState(table.initialState.columnFilters ?? []));\n}\n/**\n* Returns whether a filter value should be removed from filter state.\n*\n* `undefined` always removes: it is the universal \"clear this filter\"\n* sentinel used by `setFilterValue(undefined)` and functional updaters. For\n* any other value, a filter function's `autoRemove` hook is authoritative\n* when provided, so custom filter functions can keep values (such as empty\n* strings) that the default heuristic would drop. Without an `autoRemove`\n* hook, empty strings are removed.\n*\n* @example\n* ```ts\n* const removeFilter = shouldAutoRemoveFilter(filterFn, value, column)\n* ```\n*/\nfunction shouldAutoRemoveFilter(filterFn, value, column) {\n\tif (typeof value === \"undefined\") return true;\n\tif (filterFn?.autoRemove) return !!filterFn.autoRemove(value, column);\n\treturn typeof value === \"string\" && !value;\n}\n\n//#endregion\nexport { column_getAutoFilterFn, column_getCanFilter, column_getFilterFn, column_getFilterIndex, column_getFilterValue, column_getIsFiltered, column_setFilterValue, getDefaultColumnFiltersState, shouldAutoRemoveFilter, table_resetColumnFilters, table_setColumnFilters };","import { assignPrototypeAPIs, assignTableAPIs, makeObjectMap, makeStateUpdater } from \"../../utils.js\";\nimport { column_getAutoFilterFn, column_getCanFilter, column_getFilterFn, column_getFilterIndex, column_getFilterValue, column_getIsFiltered, column_setFilterValue, getDefaultColumnFiltersState, table_resetColumnFilters, table_setColumnFilters } from \"./columnFilteringFeature.utils.js\";\n\n//#region src/features/column-filtering/columnFilteringFeature.ts\n/**\n* Feature that adds per-column filtering state, options, and column/table filter APIs.\n*/\nconst columnFilteringFeature = {\n\tgetInitialState: (initialState) => {\n\t\treturn {\n\t\t\tcolumnFilters: getDefaultColumnFiltersState(),\n\t\t\t...initialState\n\t\t};\n\t},\n\tgetDefaultColumnDef: () => {\n\t\treturn { filterFn: \"auto\" };\n\t},\n\tgetDefaultTableOptions: (table) => {\n\t\treturn {\n\t\t\tonColumnFiltersChange: makeStateUpdater(\"columnFilters\", table),\n\t\t\tfilterFromLeafRows: false,\n\t\t\tmaxLeafRowFilterDepth: 100\n\t\t};\n\t},\n\tassignColumnPrototype: (prototype, table) => {\n\t\tassignPrototypeAPIs(\"columnFilteringFeature\", prototype, table, {\n\t\t\tcolumn_getAutoFilterFn: { fn: (column) => column_getAutoFilterFn(column) },\n\t\t\tcolumn_getFilterFn: { fn: (column) => column_getFilterFn(column) },\n\t\t\tcolumn_getCanFilter: { fn: (column) => column_getCanFilter(column) },\n\t\t\tcolumn_getIsFiltered: { fn: (column) => column_getIsFiltered(column) },\n\t\t\tcolumn_getFilterValue: { fn: (column) => column_getFilterValue(column) },\n\t\t\tcolumn_getFilterIndex: { fn: (column) => column_getFilterIndex(column) },\n\t\t\tcolumn_setFilterValue: { fn: (column, value) => column_setFilterValue(column, value) }\n\t\t});\n\t},\n\tinitRowInstanceData: (row) => {\n\t\trow.columnFilters = makeObjectMap();\n\t\trow.columnFiltersMeta = makeObjectMap();\n\t},\n\tconstructTableAPIs: (table) => {\n\t\tassignTableAPIs(\"columnFilteringFeature\", table, {\n\t\t\ttable_setColumnFilters: { fn: (updater) => table_setColumnFilters(table, updater) },\n\t\t\ttable_resetColumnFilters: { fn: (defaultState) => table_resetColumnFilters(table, defaultState) }\n\t\t});\n\t}\n};\n\n//#endregion\nexport { columnFilteringFeature };","import { callMemoOrStaticFn, cloneState, hasOwn, makeObjectMap } from \"../../utils.js\";\nimport { table_getCenterHeaderGroups, table_getEndHeaderGroups, table_getPinnedVisibleLeafColumns, table_getStartHeaderGroups } from \"../column-pinning/columnPinningFeature.utils.js\";\n\n//#region src/features/column-sizing/columnSizingFeature.utils.ts\n/**\n* Creates the default committed column sizing state.\n*\n* The feature default is an empty map, so columns fall back to their column def\n* size or the built-in sizing defaults.\n*\n* @example\n* ```ts\n* const sizing = getDefaultColumnSizingState()\n* ```\n*/\nfunction getDefaultColumnSizingState() {\n\treturn makeObjectMap();\n}\n/**\n* Creates the built-in sizing defaults for column definitions.\n*\n* Columns default to `size: 150`, `minSize: 20`, and\n* `maxSize: Number.MAX_SAFE_INTEGER` unless overridden by column definitions or\n* table defaults.\n*\n* @example\n* ```ts\n* const defaults = getDefaultColumnSizingColumnDef()\n* ```\n*/\nfunction getDefaultColumnSizingColumnDef() {\n\treturn {\n\t\tsize: 150,\n\t\tminSize: 20,\n\t\tmaxSize: Number.MAX_SAFE_INTEGER\n\t};\n}\n/**\n* Resolves a column's current pixel size.\n*\n* Committed `state.columnSizing[column.id]` wins over `columnDef.size`, then the\n* built-in default size. The result is clamped between min and max size.\n*\n* @example\n* ```ts\n* const width = column_getSize(column)\n* ```\n*/\nfunction column_getSize(column) {\n\tconst defaultSizes = getDefaultColumnSizingColumnDef();\n\tconst columnSizing = column.table.atoms.columnSizing?.get();\n\tconst columnSize = columnSizing && hasOwn(columnSizing, column.id) ? columnSizing[column.id] : void 0;\n\treturn Math.min(Math.max(column.columnDef.minSize ?? defaultSizes.minSize, columnSize ?? column.columnDef.size ?? defaultSizes.size), column.columnDef.maxSize ?? defaultSizes.maxSize);\n}\nfunction buildColumnOffsets(columns) {\n\tconst starts = makeObjectMap();\n\tconst afters = makeObjectMap();\n\tconst sizes = new Array(columns.length);\n\tlet start = 0;\n\tfor (let i = 0; i < columns.length; i++) {\n\t\tconst column = columns[i];\n\t\tconst size = callMemoOrStaticFn(column, \"getSize\", column_getSize);\n\t\tsizes[i] = size;\n\t\tstarts[column.id] = start;\n\t\tstart += size;\n\t}\n\tlet after = 0;\n\tfor (let i = columns.length - 1; i >= 0; i--) {\n\t\tafters[columns[i].id] = after;\n\t\tafter += sizes[i];\n\t}\n\treturn {\n\t\tstarts,\n\t\tafters\n\t};\n}\n/**\n* Builds start and after offset maps for every visible leaf column, computed\n* once per pinning region plus the full visible list.\n*\n* A single table-level memo of this result backs all `column.getStart()` and\n* `column.getAfter()` calls with O(1) lookups.\n*\n* @example\n* ```ts\n* const offsets = table_getColumnOffsets(table)\n* const startOffset = offsets.start.starts[column.id]\n* ```\n*/\nfunction table_getColumnOffsets(table) {\n\treturn {\n\t\tall: buildColumnOffsets(table_getPinnedVisibleLeafColumns(table)),\n\t\tcenter: buildColumnOffsets(table_getPinnedVisibleLeafColumns(table, \"center\")),\n\t\tstart: buildColumnOffsets(table_getPinnedVisibleLeafColumns(table, \"start\")),\n\t\tend: buildColumnOffsets(table_getPinnedVisibleLeafColumns(table, \"end\"))\n\t};\n}\nfunction toOffsetsKey(position) {\n\treturn position === \"start\" ? \"start\" : position === \"end\" ? \"end\" : position === \"center\" ? \"center\" : \"all\";\n}\n/**\n* Computes the offset from the start edge of a pinning region to this column.\n*\n* The value is the sum of all previous visible leaf column sizes in the\n* requested `'start'`, `'center'`, or `'end'` region.\n*\n* `start` and `end` are logical positions. In LTR languages/layouts, `start`\n* usually corresponds to left and `end` to right. In RTL languages/layouts,\n* `start` usually corresponds to right and `end` to left.\n*\n* @example\n* ```ts\n* const startOffset = column_getStart(column, 'start')\n* ```\n*/\nfunction column_getStart(column, position) {\n\treturn callMemoOrStaticFn(column.table, \"getColumnOffsets\", table_getColumnOffsets)[toOffsetsKey(position)].starts[column.id] ?? 0;\n}\n/**\n* Computes the offset from the end edge of a pinning region after this column.\n*\n* The value is the sum of all following visible leaf column sizes in the\n* requested region.\n*\n* @example\n* ```ts\n* const endOffset = column_getAfter(column, 'end')\n* ```\n*/\nfunction column_getAfter(column, position) {\n\treturn callMemoOrStaticFn(column.table, \"getColumnOffsets\", table_getColumnOffsets)[toOffsetsKey(position)].afters[column.id] ?? 0;\n}\n/**\n* Removes this column's committed size override.\n*\n* After reset, the column resolves size from `columnDef.size` or built-in\n* defaults again.\n*\n* @example\n* ```ts\n* column_resetSize(column)\n* ```\n*/\nfunction column_resetSize(column) {\n\ttable_setColumnSizing(column.table, (old) => {\n\t\tconst rest = makeObjectMap();\n\t\tconst columnIds = Object.keys(old);\n\t\tfor (let i = 0; i < columnIds.length; i++) {\n\t\t\tconst columnId = columnIds[i];\n\t\t\tif (columnId !== column.id) rest[columnId] = old[columnId];\n\t\t}\n\t\treturn rest;\n\t});\n}\nfunction sumHeaderSize(header) {\n\tif (!header.subHeaders.length) return column_getSize(header.column);\n\tlet sum = 0;\n\tfor (let i = 0; i < header.subHeaders.length; i++) sum += sumHeaderSize(header.subHeaders[i]);\n\treturn sum;\n}\n/**\n* Computes a header's rendered size from its leaf headers.\n*\n* Group headers sum the sizes of all descendant leaf columns. Leaf headers use\n* their column's current size.\n*\n* @example\n* ```ts\n* const width = header_getSize(header)\n* ```\n*/\nfunction header_getSize(header) {\n\treturn sumHeaderSize(header);\n}\n/**\n* Computes a header's offset from the start of its header group.\n*\n* The offset is the previous sibling header's start plus size, or `0` for the\n* first header in the group.\n*\n* @example\n* ```ts\n* const offset = header_getStart(header)\n* ```\n*/\nfunction header_getStart(header) {\n\tif (header.index > 0) {\n\t\tconst prevSiblingHeader = header.headerGroup?.headers[header.index - 1];\n\t\tif (prevSiblingHeader) return callMemoOrStaticFn(prevSiblingHeader, \"getStart\", header_getStart) + callMemoOrStaticFn(prevSiblingHeader, \"getSize\", header_getSize);\n\t}\n\treturn 0;\n}\n/**\n* Routes a committed column sizing updater through the table's sizing handler.\n*\n* The updater may be a next size map or a function of the previous map,\n* matching the instance `table.setColumnSizing` behavior.\n*\n* @example\n* ```ts\n* table_setColumnSizing(table, (old) => ({ ...old, age: 96 }))\n* ```\n*/\nfunction table_setColumnSizing(table, updater) {\n\ttable.options.onColumnSizingChange?.(updater);\n}\n/**\n* Resets `columnSizing` to the configured initial state or feature default.\n*\n* With no argument, the reset clones `table.initialState.columnSizing` when it\n* exists. Passing `true` ignores initial state and resets to `{}`.\n*\n* @example\n* ```ts\n* table_resetColumnSizing(table)\n* table_resetColumnSizing(table, true)\n* ```\n*/\nfunction table_resetColumnSizing(table, defaultState) {\n\ttable_setColumnSizing(table, defaultState ? makeObjectMap() : Object.assign(makeObjectMap(), cloneState(table.initialState.columnSizing ?? {})));\n}\n/**\n* Sums the rendered size of the full table header row.\n*\n* This includes start, center, and end columns in the main header group.\n*\n* @example\n* ```ts\n* const width = table_getTotalSize(table)\n* ```\n*/\nfunction table_getTotalSize(table) {\n\treturn table.getHeaderGroups()[0]?.headers.reduce((sum, header) => {\n\t\treturn sum + header_getSize(header);\n\t}, 0) ?? 0;\n}\n/**\n* Sums the rendered size of the logical start pinned header region.\n*\n* An empty start pinning region returns `0`.\n*\n* @example\n* ```ts\n* const width = table_getStartTotalSize(table)\n* ```\n*/\nfunction table_getStartTotalSize(table) {\n\treturn callMemoOrStaticFn(table, \"getStartHeaderGroups\", table_getStartHeaderGroups)[0]?.headers.reduce((sum, header) => {\n\t\treturn sum + header_getSize(header);\n\t}, 0) ?? 0;\n}\n/**\n* Sums the rendered size of the center, unpinned header region.\n*\n* An empty center region returns `0`.\n*\n* @example\n* ```ts\n* const width = table_getCenterTotalSize(table)\n* ```\n*/\nfunction table_getCenterTotalSize(table) {\n\treturn callMemoOrStaticFn(table, \"getCenterHeaderGroups\", table_getCenterHeaderGroups)[0]?.headers.reduce((sum, header) => {\n\t\treturn sum + header_getSize(header);\n\t}, 0) ?? 0;\n}\n/**\n* Sums the rendered size of the logical end pinned header region.\n*\n* An empty end pinning region returns `0`.\n*\n* @example\n* ```ts\n* const width = table_getEndTotalSize(table)\n* ```\n*/\nfunction table_getEndTotalSize(table) {\n\treturn callMemoOrStaticFn(table, \"getEndHeaderGroups\", table_getEndHeaderGroups)[0]?.headers.reduce((sum, header) => {\n\t\treturn sum + header_getSize(header);\n\t}, 0) ?? 0;\n}\n\n//#endregion\nexport { column_getAfter, column_getSize, column_getStart, column_resetSize, getDefaultColumnSizingColumnDef, getDefaultColumnSizingState, header_getSize, header_getStart, table_getCenterTotalSize, table_getColumnOffsets, table_getEndTotalSize, table_getStartTotalSize, table_getTotalSize, table_resetColumnSizing, table_setColumnSizing };","import { cloneState, makeObjectMap } from \"../../utils.js\";\nimport { column_getSize, header_getSize, table_setColumnSizing } from \"../column-sizing/columnSizingFeature.utils.js\";\n\n//#region src/features/column-resizing/columnResizingFeature.utils.ts\n/**\n* Creates the default transient column resizing state.\n*\n* The feature default represents no active drag interaction. Reset APIs use\n* this value when `defaultState` is `true`.\n*\n* @example\n* ```ts\n* const resizeInfo = getDefaultColumnResizingState()\n* ```\n*/\nfunction getDefaultColumnResizingState() {\n\treturn {\n\t\tstartOffset: null,\n\t\tstartSize: null,\n\t\tdeltaOffset: null,\n\t\tdeltaPercentage: null,\n\t\tisResizingColumn: false,\n\t\tcolumnSizingStart: []\n\t};\n}\n/**\n* Checks whether this column can start a resize interaction.\n*\n* Both `columnDef.enableResizing` and table `enableColumnResizing` default to\n* `true`.\n*\n* @example\n* ```ts\n* const canResize = column_getCanResize(column)\n* ```\n*/\nfunction column_getCanResize(column) {\n\treturn (column.columnDef.enableResizing ?? true) && (column.table.options.enableColumnResizing ?? true);\n}\n/**\n* Checks whether this column is the active column resize target.\n*\n* The value is read from `state.columnResizing.isResizingColumn`.\n*\n* @example\n* ```ts\n* const isResizing = column_getIsResizing(column)\n* ```\n*/\nfunction column_getIsResizing(column) {\n\treturn column.table.atoms.columnResizing?.get()?.isResizingColumn === column.id;\n}\n/**\n* Creates the pointer/touch start handler for resizing a header.\n*\n* The handler records starting sizes for all leaf headers, tracks drag deltas,\n* writes transient resize info, and commits column sizes on change or drag end\n* depending on `columnResizeMode`.\n*\n* @example\n* ```ts\n* const onMouseDown = header_getResizeHandler(header)\n* ```\n*/\nfunction header_getResizeHandler(header, _contextDocument) {\n\tconst column = header.table.getColumn(header.column.id);\n\tconst canResize = column_getCanResize(column);\n\treturn (event) => {\n\t\tif (!canResize) return;\n\t\tif (isTouchStartEvent(event)) {\n\t\t\tif (event.touches.length > 1) return;\n\t\t}\n\t\tconst startSize = header_getSize(header);\n\t\tconst columnSizingStart = header.getLeafHeaders().map((leafHeader) => [leafHeader.column.id, column_getSize(leafHeader.column)]);\n\t\tconst clientX = isTouchStartEvent(event) ? Math.round(event.touches[0].clientX) : event.clientX;\n\t\tconst newColumnSizing = makeObjectMap();\n\t\tconst updateOffset = (eventType, clientXPos) => {\n\t\t\tif (typeof clientXPos !== \"number\") return;\n\t\t\tconst table = column.table;\n\t\t\tconst isCommit = table.options.columnResizeMode === \"onChange\" || eventType === \"end\";\n\t\t\ttable._reactivity.batch(() => {\n\t\t\t\ttable_setColumnResizing(table, (old) => {\n\t\t\t\t\tconst deltaDirection = table.options.columnResizeDirection === \"rtl\" ? -1 : 1;\n\t\t\t\t\tconst deltaOffset = (clientXPos - (old.startOffset ?? 0)) * deltaDirection;\n\t\t\t\t\tconst startSize = old.startSize ?? 0;\n\t\t\t\t\tconst deltaPercentage = Math.max(startSize > 0 ? deltaOffset / startSize : 0, -.999999);\n\t\t\t\t\tif (isCommit) {\n\t\t\t\t\t\tconst columnSizingStart = old.columnSizingStart;\n\t\t\t\t\t\tfor (let i = 0; i < columnSizingStart.length; i++) {\n\t\t\t\t\t\t\tconst entry = columnSizingStart[i];\n\t\t\t\t\t\t\tconst headerSize = entry[1];\n\t\t\t\t\t\t\tnewColumnSizing[entry[0]] = Math.round(Math.max(headerSize > 0 ? headerSize + headerSize * deltaPercentage : deltaOffset / columnSizingStart.length, 0) * 100) / 100;\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t\treturn {\n\t\t\t\t\t\t...old,\n\t\t\t\t\t\tdeltaOffset,\n\t\t\t\t\t\tdeltaPercentage\n\t\t\t\t\t};\n\t\t\t\t});\n\t\t\t\tif (isCommit) table_setColumnSizing(table, (old) => Object.assign(makeObjectMap(), old, newColumnSizing));\n\t\t\t});\n\t\t};\n\t\tlet moveRafId = null;\n\t\tlet hasPendingMove = false;\n\t\tlet latestMoveX;\n\t\tconst flushMove = () => {\n\t\t\tif (hasPendingMove) {\n\t\t\t\thasPendingMove = false;\n\t\t\t\tupdateOffset(\"move\", latestMoveX);\n\t\t\t\tmoveRafId = requestAnimationFrame(flushMove);\n\t\t\t} else moveRafId = null;\n\t\t};\n\t\tconst onMove = (clientXPos) => {\n\t\t\tlatestMoveX = clientXPos;\n\t\t\tif (typeof requestAnimationFrame !== \"function\") {\n\t\t\t\tupdateOffset(\"move\", clientXPos);\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tif (moveRafId !== null) {\n\t\t\t\thasPendingMove = true;\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tupdateOffset(\"move\", clientXPos);\n\t\t\tmoveRafId = requestAnimationFrame(flushMove);\n\t\t};\n\t\tconst onEnd = (clientXPos) => {\n\t\t\tif (moveRafId !== null) {\n\t\t\t\tcancelAnimationFrame(moveRafId);\n\t\t\t\tmoveRafId = null;\n\t\t\t\thasPendingMove = false;\n\t\t\t}\n\t\t\tcolumn.table._reactivity.batch(() => {\n\t\t\t\tupdateOffset(\"end\", clientXPos ?? latestMoveX);\n\t\t\t\ttable_setColumnResizing(column.table, (old) => ({\n\t\t\t\t\t...old,\n\t\t\t\t\tisResizingColumn: false,\n\t\t\t\t\tstartOffset: null,\n\t\t\t\t\tstartSize: null,\n\t\t\t\t\tdeltaOffset: null,\n\t\t\t\t\tdeltaPercentage: null,\n\t\t\t\t\tcolumnSizingStart: []\n\t\t\t\t}));\n\t\t\t});\n\t\t};\n\t\tconst contextDocument = _contextDocument || (typeof document !== \"undefined\" ? document : null);\n\t\tconst mouseEvents = {\n\t\t\tmoveHandler: (e) => onMove(e.clientX),\n\t\t\tupHandler: (e) => {\n\t\t\t\tcontextDocument?.removeEventListener(\"mousemove\", mouseEvents.moveHandler);\n\t\t\t\tcontextDocument?.removeEventListener(\"mouseup\", mouseEvents.upHandler);\n\t\t\t\tonEnd(e.clientX);\n\t\t\t}\n\t\t};\n\t\tconst touchEvents = {\n\t\t\tmoveHandler: (touchEvent) => {\n\t\t\t\tif (touchEvent.cancelable) {\n\t\t\t\t\ttouchEvent.preventDefault();\n\t\t\t\t\ttouchEvent.stopPropagation();\n\t\t\t\t}\n\t\t\t\tonMove(touchEvent.touches[0].clientX);\n\t\t\t\treturn false;\n\t\t\t},\n\t\t\tupHandler: (e) => {\n\t\t\t\tremoveTouchEvents();\n\t\t\t\tif (e.cancelable) {\n\t\t\t\t\te.preventDefault();\n\t\t\t\t\te.stopPropagation();\n\t\t\t\t}\n\t\t\t\tonEnd(e.touches[0]?.clientX);\n\t\t\t},\n\t\t\tcancelHandler: () => {\n\t\t\t\tremoveTouchEvents();\n\t\t\t\tonEnd();\n\t\t\t}\n\t\t};\n\t\tconst removeTouchEvents = () => {\n\t\t\tcontextDocument?.removeEventListener(\"touchmove\", touchEvents.moveHandler);\n\t\t\tcontextDocument?.removeEventListener(\"touchend\", touchEvents.upHandler);\n\t\t\tcontextDocument?.removeEventListener(\"touchcancel\", touchEvents.cancelHandler);\n\t\t};\n\t\tconst passiveIfSupported = passiveEventSupported() ? { passive: false } : false;\n\t\tif (isTouchStartEvent(event)) {\n\t\t\tcontextDocument?.addEventListener(\"touchmove\", touchEvents.moveHandler, passiveIfSupported);\n\t\t\tcontextDocument?.addEventListener(\"touchend\", touchEvents.upHandler, passiveIfSupported);\n\t\t\tcontextDocument?.addEventListener(\"touchcancel\", touchEvents.cancelHandler, passiveIfSupported);\n\t\t} else {\n\t\t\tcontextDocument?.addEventListener(\"mousemove\", mouseEvents.moveHandler, passiveIfSupported);\n\t\t\tcontextDocument?.addEventListener(\"mouseup\", mouseEvents.upHandler, passiveIfSupported);\n\t\t}\n\t\ttable_setColumnResizing(column.table, (old) => ({\n\t\t\t...old,\n\t\t\tstartOffset: clientX,\n\t\t\tstartSize,\n\t\t\tdeltaOffset: 0,\n\t\t\tdeltaPercentage: 0,\n\t\t\tcolumnSizingStart,\n\t\t\tisResizingColumn: column.id\n\t\t}));\n\t};\n}\n/**\n* Routes a transient column resizing updater through the table's resize handler.\n*\n* This state tracks the active drag interaction; committed widths live in\n* `columnSizing`.\n*\n* @example\n* ```ts\n* table_setColumnResizing(table, (old) => ({ ...old, deltaOffset: 12 }))\n* ```\n*/\nfunction table_setColumnResizing(table, updater) {\n\ttable.options.onColumnResizingChange?.(updater);\n}\n/**\n* Resets `columnResizing` to the configured initial state or feature default.\n*\n* With no argument, the reset clones `table.initialState.columnResizing` when\n* it exists. Passing `true` ignores initial state and resets to the no-drag\n* default state.\n*\n* @example\n* ```ts\n* table_resetHeaderSizeInfo(table)\n* table_resetHeaderSizeInfo(table, true)\n* ```\n*/\nfunction table_resetHeaderSizeInfo(table, defaultState) {\n\ttable_setColumnResizing(table, defaultState ? getDefaultColumnResizingState() : cloneState(table.initialState.columnResizing ?? getDefaultColumnResizingState()));\n}\nlet passiveSupported = null;\n/**\n* Detects whether the current environment supports passive event listeners.\n*\n* Column resizing uses this to register pointer and touch listeners with\n* `passive: false` only when the environment understands passive options.\n*\n* @example\n* ```ts\n* const canUsePassiveListeners = passiveEventSupported()\n* ```\n*/\nfunction passiveEventSupported() {\n\tif (typeof passiveSupported === \"boolean\") return passiveSupported;\n\tlet supported = false;\n\ttry {\n\t\tconst options = { get passive() {\n\t\t\tsupported = true;\n\t\t\treturn false;\n\t\t} };\n\t\tconst noop = () => {};\n\t\twindow.addEventListener(\"test\", noop, options);\n\t\twindow.removeEventListener(\"test\", noop);\n\t} catch (err) {\n\t\tsupported = false;\n\t}\n\tpassiveSupported = supported;\n\treturn passiveSupported;\n}\n/**\n* Narrows an unknown event to a `touchstart` event.\n*\n* Column resizing uses this before reading touch coordinates and installing\n* touch-specific listeners.\n*\n* @example\n* ```ts\n* const isTouch = isTouchStartEvent(event)\n* ```\n*/\nfunction isTouchStartEvent(e) {\n\treturn e.type === \"touchstart\";\n}\n\n//#endregion\nexport { column_getCanResize, column_getIsResizing, getDefaultColumnResizingState, header_getResizeHandler, isTouchStartEvent, passiveEventSupported, table_resetHeaderSizeInfo, table_setColumnResizing };","import { assignPrototypeAPIs, assignTableAPIs, makeStateUpdater } from \"../../utils.js\";\nimport { column_getCanResize, column_getIsResizing, getDefaultColumnResizingState, header_getResizeHandler, table_resetHeaderSizeInfo, table_setColumnResizing } from \"./columnResizingFeature.utils.js\";\n\n//#region src/features/column-resizing/columnResizingFeature.ts\n/**\n* Feature that adds column resizing state, options, and resize handlers.\n*/\nconst columnResizingFeature = {\n\tgetInitialState: (initialState) => {\n\t\treturn {\n\t\t\tcolumnResizing: getDefaultColumnResizingState(),\n\t\t\t...initialState\n\t\t};\n\t},\n\tgetDefaultTableOptions: (table) => {\n\t\treturn {\n\t\t\tcolumnResizeMode: \"onEnd\",\n\t\t\tcolumnResizeDirection: \"ltr\",\n\t\t\tonColumnResizingChange: makeStateUpdater(\"columnResizing\", table)\n\t\t};\n\t},\n\tassignColumnPrototype: (prototype, table) => {\n\t\tassignPrototypeAPIs(\"columnResizingFeature\", prototype, table, {\n\t\t\tcolumn_getCanResize: { fn: (column) => column_getCanResize(column) },\n\t\t\tcolumn_getIsResizing: { fn: (column) => column_getIsResizing(column) }\n\t\t});\n\t},\n\tassignHeaderPrototype: (prototype, table) => {\n\t\tassignPrototypeAPIs(\"columnResizingFeature\", prototype, table, { header_getResizeHandler: { fn: (header, _contextDocument) => header_getResizeHandler(header, _contextDocument) } });\n\t},\n\tconstructTableAPIs: (table) => {\n\t\tassignTableAPIs(\"columnResizingFeature\", table, {\n\t\t\ttable_setColumnResizing: { fn: (updater) => table_setColumnResizing(table, updater) },\n\t\t\ttable_resetHeaderSizeInfo: { fn: (defaultState) => table_resetHeaderSizeInfo(table, defaultState) }\n\t\t});\n\t}\n};\n\n//#endregion\nexport { columnResizingFeature };","import { assignPrototypeAPIs, assignTableAPIs, makeStateUpdater } from \"../../utils.js\";\nimport { column_getAfter, column_getSize, column_getStart, column_resetSize, getDefaultColumnSizingColumnDef, getDefaultColumnSizingState, header_getSize, header_getStart, table_getCenterTotalSize, table_getColumnOffsets, table_getEndTotalSize, table_getStartTotalSize, table_getTotalSize, table_resetColumnSizing, table_setColumnSizing } from \"./columnSizingFeature.utils.js\";\n\n//#region src/features/column-sizing/columnSizingFeature.ts\n/**\n* Feature that adds column sizing state, defaults, and size measurement APIs.\n*/\nconst columnSizingFeature = {\n\tgetInitialState: (initialState) => {\n\t\treturn {\n\t\t\tcolumnSizing: getDefaultColumnSizingState(),\n\t\t\t...initialState\n\t\t};\n\t},\n\tgetDefaultColumnDef: () => {\n\t\treturn getDefaultColumnSizingColumnDef();\n\t},\n\tgetDefaultTableOptions: (table) => {\n\t\treturn { onColumnSizingChange: makeStateUpdater(\"columnSizing\", table) };\n\t},\n\tassignColumnPrototype: (prototype, table) => {\n\t\tassignPrototypeAPIs(\"columnSizingFeature\", prototype, table, {\n\t\t\tcolumn_getSize: {\n\t\t\t\tfn: (column) => column_getSize(column),\n\t\t\t\tmemoDeps: (column) => [table.options.columns, table.atoms.columnSizing?.get()?.[column.id]]\n\t\t\t},\n\t\t\tcolumn_getStart: { fn: (column, position) => column_getStart(column, position) },\n\t\t\tcolumn_getAfter: { fn: (column, position) => column_getAfter(column, position) },\n\t\t\tcolumn_resetSize: { fn: (column) => column_resetSize(column) }\n\t\t});\n\t},\n\tassignHeaderPrototype: (prototype, table) => {\n\t\tassignPrototypeAPIs(\"columnSizingFeature\", prototype, table, {\n\t\t\theader_getSize: {\n\t\t\t\tfn: (header) => header_getSize(header),\n\t\t\t\tmemoDeps: (header) => [table.options.columns, header.column.columns.length > 0 ? table.atoms.columnSizing?.get() : table.atoms.columnSizing?.get()?.[header.column.id]]\n\t\t\t},\n\t\t\theader_getStart: {\n\t\t\t\tfn: (header) => header_getStart(header),\n\t\t\t\tmemoDeps: () => [\n\t\t\t\t\ttable.options.columns,\n\t\t\t\t\ttable.atoms.columnSizing?.get(),\n\t\t\t\t\ttable.atoms.columnOrder?.get(),\n\t\t\t\t\ttable.atoms.columnPinning?.get(),\n\t\t\t\t\ttable.atoms.columnVisibility?.get(),\n\t\t\t\t\ttable.atoms.grouping?.get(),\n\t\t\t\t\ttable.options.groupedColumnMode\n\t\t\t\t]\n\t\t\t}\n\t\t});\n\t},\n\tconstructTableAPIs: (table) => {\n\t\tassignTableAPIs(\"columnSizingFeature\", table, {\n\t\t\ttable_getColumnOffsets: {\n\t\t\t\tfn: () => table_getColumnOffsets(table),\n\t\t\t\tmemoDeps: () => [\n\t\t\t\t\ttable.options.columns,\n\t\t\t\t\ttable.atoms.columnSizing?.get(),\n\t\t\t\t\ttable.atoms.columnOrder?.get(),\n\t\t\t\t\ttable.atoms.columnPinning?.get(),\n\t\t\t\t\ttable.atoms.columnVisibility?.get(),\n\t\t\t\t\ttable.atoms.grouping?.get(),\n\t\t\t\t\ttable.options.groupedColumnMode\n\t\t\t\t]\n\t\t\t},\n\t\t\ttable_setColumnSizing: { fn: (updater) => table_setColumnSizing(table, updater) },\n\t\t\ttable_resetColumnSizing: { fn: (defaultState) => table_resetColumnSizing(table, defaultState) },\n\t\t\ttable_getTotalSize: {\n\t\t\t\tfn: () => table_getTotalSize(table),\n\t\t\t\tmemoDeps: () => [table.atoms.columnSizing?.get(), table.getHeaderGroups()]\n\t\t\t},\n\t\t\ttable_getStartTotalSize: {\n\t\t\t\tfn: () => table_getStartTotalSize(table),\n\t\t\t\tmemoDeps: () => [table.atoms.columnSizing?.get(), table.getHeaderGroups()]\n\t\t\t},\n\t\t\ttable_getCenterTotalSize: {\n\t\t\t\tfn: () => table_getCenterTotalSize(table),\n\t\t\t\tmemoDeps: () => [table.atoms.columnSizing?.get(), table.getHeaderGroups()]\n\t\t\t},\n\t\t\ttable_getEndTotalSize: {\n\t\t\t\tfn: () => table_getEndTotalSize(table),\n\t\t\t\tmemoDeps: () => [table.atoms.columnSizing?.get(), table.getHeaderGroups()]\n\t\t\t}\n\t\t});\n\t}\n};\n\n//#endregion\nexport { columnSizingFeature };","import { assignPrototypeAPIs, assignTableAPIs, makeStateUpdater } from \"../../utils.js\";\nimport { column_getCanHide, column_getIsVisible, column_getToggleVisibilityHandler, column_toggleVisibility, getDefaultColumnVisibilityState, row_getVisibleCells, row_getVisibleCellsByColumnId, table_getIsAllColumnsVisible, table_getIsSomeColumnsVisible, table_getToggleAllColumnsVisibilityHandler, table_getVisibleFlatColumns, table_getVisibleLeafColumns, table_resetColumnVisibility, table_setColumnVisibility, table_toggleAllColumnsVisible } from \"./columnVisibilityFeature.utils.js\";\n\n//#region src/features/column-visibility/columnVisibilityFeature.ts\n/**\n* Feature that adds column visibility state and APIs for hiding and showing columns.\n*/\nconst columnVisibilityFeature = {\n\tgetInitialState: (initialState) => {\n\t\treturn {\n\t\t\tcolumnVisibility: getDefaultColumnVisibilityState(),\n\t\t\t...initialState\n\t\t};\n\t},\n\tgetDefaultTableOptions: (table) => {\n\t\treturn { onColumnVisibilityChange: makeStateUpdater(\"columnVisibility\", table) };\n\t},\n\tassignColumnPrototype: (prototype, table) => {\n\t\tassignPrototypeAPIs(\"columnVisibilityFeature\", prototype, table, {\n\t\t\tcolumn_getIsVisible: {\n\t\t\t\tfn: (column) => column_getIsVisible(column),\n\t\t\t\tmemoDeps: (column) => [\n\t\t\t\t\ttable.options.columns,\n\t\t\t\t\ttable.atoms.columnVisibility?.get(),\n\t\t\t\t\tcolumn.columns\n\t\t\t\t]\n\t\t\t},\n\t\t\tcolumn_getCanHide: { fn: (column) => column_getCanHide(column) },\n\t\t\tcolumn_getToggleVisibilityHandler: { fn: (column) => column_getToggleVisibilityHandler(column) },\n\t\t\tcolumn_toggleVisibility: { fn: (column, visible) => column_toggleVisibility(column, visible) }\n\t\t});\n\t},\n\tassignRowPrototype: (prototype, table) => {\n\t\tassignPrototypeAPIs(\"columnVisibilityFeature\", prototype, table, {\n\t\t\trow_getVisibleCells: {\n\t\t\t\tfn: (row) => row_getVisibleCells(row),\n\t\t\t\tmemoDeps: (row) => [\n\t\t\t\t\trow.getAllCells(),\n\t\t\t\t\ttable.atoms.columnPinning?.get(),\n\t\t\t\t\ttable.atoms.columnVisibility?.get()\n\t\t\t\t]\n\t\t\t},\n\t\t\trow_getVisibleCellsByColumnId: {\n\t\t\t\tfn: (row) => row_getVisibleCellsByColumnId(row),\n\t\t\t\tmemoDeps: (row) => [row.getAllCells(), table.atoms.columnVisibility?.get()]\n\t\t\t}\n\t\t});\n\t},\n\tconstructTableAPIs: (table) => {\n\t\tassignTableAPIs(\"columnVisibilityFeature\", table, {\n\t\t\ttable_getVisibleFlatColumns: {\n\t\t\t\tfn: () => table_getVisibleFlatColumns(table),\n\t\t\t\tmemoDeps: () => [\n\t\t\t\t\ttable.atoms.columnVisibility?.get(),\n\t\t\t\t\ttable.atoms.columnOrder?.get(),\n\t\t\t\t\ttable.atoms.grouping?.get(),\n\t\t\t\t\ttable.options.columns,\n\t\t\t\t\ttable.options.groupedColumnMode\n\t\t\t\t]\n\t\t\t},\n\t\t\ttable_getVisibleLeafColumns: {\n\t\t\t\tfn: () => table_getVisibleLeafColumns(table),\n\t\t\t\tmemoDeps: () => [\n\t\t\t\t\ttable.atoms.columnVisibility?.get(),\n\t\t\t\t\ttable.atoms.columnOrder?.get(),\n\t\t\t\t\ttable.atoms.grouping?.get(),\n\t\t\t\t\ttable.options.columns,\n\t\t\t\t\ttable.options.groupedColumnMode\n\t\t\t\t]\n\t\t\t},\n\t\t\ttable_setColumnVisibility: { fn: (updater) => table_setColumnVisibility(table, updater) },\n\t\t\ttable_resetColumnVisibility: { fn: (defaultState) => table_resetColumnVisibility(table, defaultState) },\n\t\t\ttable_toggleAllColumnsVisible: { fn: (value) => table_toggleAllColumnsVisible(table, value) },\n\t\t\ttable_getIsAllColumnsVisible: { fn: () => table_getIsAllColumnsVisible(table) },\n\t\t\ttable_getIsSomeColumnsVisible: { fn: () => table_getIsSomeColumnsVisible(table) },\n\t\t\ttable_getToggleAllColumnsVisibilityHandler: { fn: () => table_getToggleAllColumnsVisibilityHandler(table) }\n\t\t});\n\t}\n};\n\n//#endregion\nexport { columnVisibilityFeature };","import { assignTableAPIs, makeStateUpdater } from \"../../utils.js\";\nimport { getDefaultPaginationState, table_autoResetPageIndex, table_firstPage, table_getCanLastPage, table_getCanNextPage, table_getCanPreviousPage, table_getPageCount, table_getPageOptions, table_getRowCount, table_lastPage, table_nextPage, table_previousPage, table_resetPageIndex, table_resetPageSize, table_resetPagination, table_setPageIndex, table_setPageSize, table_setPagination } from \"./rowPaginationFeature.utils.js\";\n\n//#region src/features/row-pagination/rowPaginationFeature.ts\n/**\n* Feature that adds pagination state and table APIs for page navigation.\n*/\nconst rowPaginationFeature = {\n\tgetInitialState: (initialState) => {\n\t\treturn {\n\t\t\t...initialState,\n\t\t\tpagination: {\n\t\t\t\t...getDefaultPaginationState(),\n\t\t\t\t...initialState.pagination\n\t\t\t}\n\t\t};\n\t},\n\tgetDefaultTableOptions: (table) => {\n\t\treturn { onPaginationChange: makeStateUpdater(\"pagination\", table) };\n\t},\n\tconstructTableAPIs: (table) => {\n\t\tassignTableAPIs(\"rowPaginationFeature\", table, {\n\t\t\ttable_autoResetPageIndex: { fn: () => table_autoResetPageIndex(table) },\n\t\t\ttable_setPagination: { fn: (updater) => table_setPagination(table, updater) },\n\t\t\ttable_resetPagination: { fn: (defaultState) => table_resetPagination(table, defaultState) },\n\t\t\ttable_setPageIndex: { fn: (updater) => table_setPageIndex(table, updater) },\n\t\t\ttable_resetPageIndex: { fn: (defaultState) => table_resetPageIndex(table, defaultState) },\n\t\t\ttable_setPageSize: { fn: (updater) => table_setPageSize(table, updater) },\n\t\t\ttable_getPageCount: { fn: () => table_getPageCount(table) },\n\t\t\ttable_resetPageSize: { fn: (defaultState) => table_resetPageSize(table, defaultState) },\n\t\t\ttable_getPageOptions: { fn: () => table_getPageOptions(table) },\n\t\t\ttable_getCanPreviousPage: { fn: () => table_getCanPreviousPage(table) },\n\t\t\ttable_getCanNextPage: { fn: () => table_getCanNextPage(table) },\n\t\t\ttable_getCanLastPage: { fn: () => table_getCanLastPage(table) },\n\t\t\ttable_previousPage: { fn: () => table_previousPage(table) },\n\t\t\ttable_nextPage: { fn: () => table_nextPage(table) },\n\t\t\ttable_firstPage: { fn: () => table_firstPage(table) },\n\t\t\ttable_lastPage: { fn: () => table_lastPage(table) },\n\t\t\ttable_getRowCount: { fn: () => table_getRowCount(table) }\n\t\t});\n\t}\n};\n\n//#endregion\nexport { rowPaginationFeature };","import { callMemoOrStaticFn, cloneState, copyInstancePropertiesWithoutMemos, hasOwn, makeObjectMap } from \"../../utils.js\";\n\n//#region src/features/row-selection/rowSelectionFeature.utils.ts\n/**\n* Creates the default row selection state.\n*\n* The feature default is an empty map, meaning no rows are selected. Reset APIs\n* use this value when `defaultState` is `true`.\n*\n* @example\n* ```ts\n* const selection = getDefaultRowSelectionState()\n* ```\n*/\nfunction getDefaultRowSelectionState() {\n\treturn makeObjectMap();\n}\n/**\n* Routes a row selection updater through the table's selection change handler.\n*\n* The updater may be a next selection map or a function of the previous map,\n* matching the instance `table.setRowSelection` behavior.\n*\n* @example\n* ```ts\n* table_setRowSelection(table, (old) => ({ ...old, [rowId]: true }))\n* ```\n*/\nfunction table_setRowSelection(table, updater) {\n\ttable.options.onRowSelectionChange?.(updater);\n}\n/**\n* Resets `rowSelection` to the configured initial state or feature default.\n*\n* With no argument, the reset clones `table.initialState.rowSelection` when it\n* exists. Passing `true` ignores initial state and resets to `{}`.\n*\n* @example\n* ```ts\n* table_resetRowSelection(table)\n* table_resetRowSelection(table, true)\n* ```\n*/\nfunction table_resetRowSelection(table, defaultState) {\n\ttable._lastSelectedRowId = null;\n\ttable_setRowSelection(table, defaultState ? makeObjectMap() : Object.assign(makeObjectMap(), cloneState(table.initialState.rowSelection ?? {})));\n}\n/**\n* Selects or deselects every selectable row before grouping.\n*\n* Omitting `value` toggles based on `table_getIsAllRowsSelected(table)`.\n* Selecting skips sub-rows whose ancestors block descent via\n* `enableSubRowSelection`. Deselecting removes matching selectable ids from the\n* existing selection map; rows that cannot be selected keep their selection\n* unless `opts.deselectAll` is `true`.\n*\n* @example\n* ```ts\n* table_toggleAllRowsSelected(table)\n* ```\n*/\nfunction table_toggleAllRowsSelected(table, value, opts) {\n\ttable._lastSelectedRowId = null;\n\ttable_setRowSelection(table, (old) => {\n\t\tvalue = typeof value !== \"undefined\" ? value : !callMemoOrStaticFn(table, \"getIsAllRowsSelected\", table_getIsAllRowsSelected);\n\t\tif (opts?.deselectAll && !value) return makeObjectMap();\n\t\tconst rowSelection = Object.assign(makeObjectMap(), old);\n\t\tconst preGroupedFlatRows = table.getPreGroupedRowModel().flatRows;\n\t\tif (value) {\n\t\t\tconst subtreeCache = /* @__PURE__ */ new Map();\n\t\t\tpreGroupedFlatRows.forEach((row) => {\n\t\t\t\tif (isRowSelectableInSelectAll(row, subtreeCache)) rowSelection[row.id] = true;\n\t\t\t});\n\t\t} else preGroupedFlatRows.forEach((row) => {\n\t\t\tif (row_getCanSelect(row)) delete rowSelection[row.id];\n\t\t});\n\t\treturn rowSelection;\n\t});\n}\n/**\n* Selects or deselects every selectable row on the current page.\n*\n* Omitting `value` toggles based on `table_getIsAllPageRowsSelected(table)`.\n* Child rows are included when sub-row selection allows it.\n*\n* @example\n* ```ts\n* table_toggleAllPageRowsSelected(table)\n* ```\n*/\nfunction table_toggleAllPageRowsSelected(table, value, opts) {\n\ttable._lastSelectedRowId = null;\n\ttable_setRowSelection(table, (old) => {\n\t\tconst resolvedValue = typeof value !== \"undefined\" ? value : !callMemoOrStaticFn(table, \"getIsAllPageRowsSelected\", table_getIsAllPageRowsSelected);\n\t\tif (opts?.deselectAll && !resolvedValue) return makeObjectMap();\n\t\tconst rowSelection = Object.assign(makeObjectMap(), old);\n\t\ttable.getRowModel().rows.forEach((row) => {\n\t\t\tmutateRowIsSelected(rowSelection, row.id, resolvedValue, true, table, true);\n\t\t});\n\t\treturn rowSelection;\n\t});\n}\n/**\n* Reads the row model before row selection is projected into selected rows.\n*\n* Selection does not alter the base row pipeline, so this returns the core row\n* model.\n*\n* @example\n* ```ts\n* const rowsBeforeSelection = table_getPreSelectedRowModel(table)\n* ```\n*/\nfunction table_getPreSelectedRowModel(table) {\n\treturn table.getCoreRowModel();\n}\n/**\n* Builds a row model containing selected rows from the core row model.\n*\n* If no row ids are selected, an empty row model is returned without walking\n* the rows.\n*\n* @example\n* ```ts\n* const selectedRows = table_getSelectedRowModel(table)\n* ```\n*/\nfunction table_getSelectedRowModel(table) {\n\tconst rowModel = table.getCoreRowModel();\n\tif (!callMemoOrStaticFn(table, \"getIsSomeRowsSelected\", table_getIsSomeRowsSelected)) return {\n\t\trows: [],\n\t\tflatRows: [],\n\t\trowsById: makeObjectMap()\n\t};\n\treturn selectRowsFn(rowModel, table);\n}\n/**\n* Builds a row model containing selected rows from the filtered row model.\n*\n* If no row ids are selected, an empty row model is returned without walking\n* the rows.\n*\n* @example\n* ```ts\n* const selectedRows = table_getFilteredSelectedRowModel(table)\n* ```\n*/\nfunction table_getFilteredSelectedRowModel(table) {\n\tconst rowModel = table.getFilteredRowModel();\n\tif (!callMemoOrStaticFn(table, \"getIsSomeRowsSelected\", table_getIsSomeRowsSelected)) return {\n\t\trows: [],\n\t\tflatRows: [],\n\t\trowsById: makeObjectMap()\n\t};\n\treturn selectRowsFn(rowModel, table);\n}\n/**\n* Builds a row model containing selected rows from the grouped row model.\n*\n* If no row ids are selected, an empty row model is returned without walking\n* the rows.\n*\n* @example\n* ```ts\n* const selectedRows = table_getGroupedSelectedRowModel(table)\n* ```\n*/\nfunction table_getGroupedSelectedRowModel(table) {\n\tconst rowModel = table.getSortedRowModel();\n\tif (!callMemoOrStaticFn(table, \"getIsSomeRowsSelected\", table_getIsSomeRowsSelected)) return {\n\t\trows: [],\n\t\tflatRows: [],\n\t\trowsById: makeObjectMap()\n\t};\n\treturn selectRowsFn(rowModel, table);\n}\n/**\n* Returns the ids of all selected rows.\n*\n* @example\n* ```ts\n* const selectedRowIds = table_getSelectedRowIds(table)\n* ```\n*/\nfunction table_getSelectedRowIds(table) {\n\treturn Object.keys(table.atoms.rowSelection?.get() ?? {});\n}\n/**\n* Checks whether every selectable filtered row is selected.\n*\n* The result is false when there are no filtered rows or when selection state is\n* empty. Sub-rows whose ancestors block descent via `enableSubRowSelection` are\n* ignored, matching the rows that `table_toggleAllRowsSelected` selects.\n*\n* @example\n* ```ts\n* const allSelected = table_getIsAllRowsSelected(table)\n* ```\n*/\nfunction table_getIsAllRowsSelected(table) {\n\tconst preGroupedFlatRows = table.getFilteredRowModel().flatRows;\n\tconst rowSelection = table.atoms.rowSelection?.get() ?? {};\n\tlet isAllRowsSelected = Boolean(preGroupedFlatRows.length && Object.keys(rowSelection).length);\n\tif (isAllRowsSelected) {\n\t\tconst subtreeCache = /* @__PURE__ */ new Map();\n\t\tif (preGroupedFlatRows.some((row) => !isRowSelected(row, rowSelection) && isRowSelectableInSelectAll(row, subtreeCache))) isAllRowsSelected = false;\n\t}\n\treturn isAllRowsSelected;\n}\n/**\n* Checks whether every selectable row on the current page is selected.\n*\n* Non-selectable rows are ignored for this calculation, as are sub-rows whose\n* ancestors block descent via `enableSubRowSelection`.\n*\n* @example\n* ```ts\n* const allPageRowsSelected = table_getIsAllPageRowsSelected(table)\n* ```\n*/\nfunction table_getIsAllPageRowsSelected(table) {\n\tconst paginationFlatRows = table.getPaginatedRowModel().flatRows;\n\tconst rowSelection = table.atoms.rowSelection?.get() ?? {};\n\tconst subtreeCache = /* @__PURE__ */ new Map();\n\tlet sawSelectableRow = false;\n\tfor (let i = 0; i < paginationFlatRows.length; i++) {\n\t\tconst row = paginationFlatRows[i];\n\t\tif (!isRowSelected(row, rowSelection)) {\n\t\t\tif (isRowSelectableInSelectAll(row, subtreeCache)) return false;\n\t\t} else if (!sawSelectableRow && isRowSelectableInSelectAll(row, subtreeCache)) sawSelectableRow = true;\n\t}\n\treturn sawSelectableRow;\n}\n/**\n* Checks whether at least one row id is selected.\n*\n* The result stays true when every row is selected.\n*\n* @example\n* ```ts\n* const someRowsSelected = table_getIsSomeRowsSelected(table)\n* ```\n*/\nfunction table_getIsSomeRowsSelected(table) {\n\treturn callMemoOrStaticFn(table, \"getSelectedRowIds\", table_getSelectedRowIds).length > 0;\n}\n/**\n* Checks whether at least one selectable row on the current page is selected.\n*\n* @example\n* ```ts\n* const somePageRowsSelected = table_getIsSomePageRowsSelected(table)\n* ```\n*/\nfunction table_getIsSomePageRowsSelected(table) {\n\treturn table.getPaginatedRowModel().flatRows.filter((row) => row_getCanSelect(row)).some((row) => row_getIsSelected(row) || callMemoOrStaticFn(row, \"getIsSomeSelected\", row_getIsSomeSelected));\n}\n/**\n* Creates a checkbox-style handler that selects or deselects all rows.\n*\n* The handler reads `event.target.checked`, so it is intended for controls whose\n* checked state means \"all rows selected\".\n*\n* @example\n* ```ts\n* const onChange = table_getToggleAllRowsSelectedHandler(table)\n* ```\n*/\nfunction table_getToggleAllRowsSelectedHandler(table) {\n\treturn (e) => {\n\t\ttable_toggleAllRowsSelected(table, e.target.checked);\n\t};\n}\n/**\n* Creates a checkbox-style handler that selects or deselects current page rows.\n*\n* The handler reads `event.target.checked`, so it is intended for controls whose\n* checked state means \"all page rows selected\".\n*\n* @example\n* ```ts\n* const onChange = table_getToggleAllPageRowsSelectedHandler(table)\n* ```\n*/\nfunction table_getToggleAllPageRowsSelectedHandler(table) {\n\treturn (e) => {\n\t\ttable_toggleAllPageRowsSelected(table, e.target.checked);\n\t};\n}\n/**\n* Selects or deselects this row.\n*\n* Omitting `value` toggles the row. Child rows are selected recursively unless\n* `opts.selectChildren` is `false`, sub-row selection is disabled, or the row\n* only supports single selection. Pass `deselectParents: true` to also remove\n* ancestor row ids from the selection when this row is deselected.\n*\n* @example\n* ```ts\n* row_toggleSelected(row)\n* row_toggleSelected(row, true)\n* row_toggleSelected(row, false)\n* row_toggleSelected(row, true, { selectChildren: false })\n* row_toggleSelected(row, false, { deselectParents: true })\n* ```\n*/\nfunction row_toggleSelected(row, value, opts) {\n\tconst isSelected = row_getIsSelected(row);\n\ttable_setRowSelection(row.table, (old) => {\n\t\tvalue = typeof value !== \"undefined\" ? value : !isSelected;\n\t\tconst rowSelection = Object.assign(makeObjectMap(), old);\n\t\tmutateRowIsSelected(rowSelection, row.id, value, (opts?.selectChildren ?? true) && row_getCanMultiSelect(row), row.table);\n\t\tif (!value && opts?.deselectParents) pruneAncestorRowIds(rowSelection, row);\n\t\treturn rowSelection;\n\t});\n}\n/**\n* Checks whether this row id is selected in `state.rowSelection`.\n*\n* Missing row ids are treated as not selected.\n*\n* @example\n* ```ts\n* const selected = row_getIsSelected(row)\n* ```\n*/\nfunction row_getIsSelected(row) {\n\treturn isRowSelected(row, row.table.atoms.rowSelection?.get() ?? {});\n}\n/**\n* Checks whether some, but not all, selectable descendants are selected.\n*\n* This supports indeterminate selection UI for parent rows.\n*\n* @example\n* ```ts\n* const partial = row_getIsSomeSelected(row)\n* ```\n*/\nfunction row_getIsSomeSelected(row) {\n\treturn isSubRowSelected(row) === \"some\";\n}\n/**\n* Checks whether all selectable descendants are selected.\n*\n* Rows without selectable descendants return false.\n*\n* @example\n* ```ts\n* const allChildrenSelected = row_getIsAllSubRowsSelected(row)\n* ```\n*/\nfunction row_getIsAllSubRowsSelected(row) {\n\treturn isSubRowSelected(row) === \"all\";\n}\n/**\n* Checks whether this row can be selected.\n*\n* `options.enableRowSelection` may be a boolean or a row predicate; it defaults\n* to `true`.\n*\n* @example\n* ```ts\n* const canSelect = row_getCanSelect(row)\n* ```\n*/\nfunction row_getCanSelect(row) {\n\tconst options = row.table.options;\n\tif (typeof options.enableRowSelection === \"function\") return options.enableRowSelection(row);\n\treturn options.enableRowSelection ?? true;\n}\n/**\n* Checks whether selecting this row should also select its subRows.\n*\n* `options.enableSubRowSelection` may be a boolean or a row predicate; it\n* defaults to `true`.\n*\n* @example\n* ```ts\n* const canSelectChildren = row_getCanSelectSubRows(row)\n* ```\n*/\nfunction row_getCanSelectSubRows(row) {\n\tconst options = row.table.options;\n\tif (typeof options.enableSubRowSelection === \"function\") return options.enableSubRowSelection(row);\n\treturn options.enableSubRowSelection ?? true;\n}\n/**\n* Checks whether this row can be selected alongside other rows.\n*\n* `options.enableMultiRowSelection` may be a boolean or a row predicate; it\n* defaults to `true`.\n*\n* @example\n* ```ts\n* const canMultiSelect = row_getCanMultiSelect(row)\n* ```\n*/\nfunction row_getCanMultiSelect(row) {\n\tconst options = row.table.options;\n\tif (typeof options.enableMultiRowSelection === \"function\") return options.enableMultiRowSelection(row);\n\treturn options.enableMultiRowSelection ?? true;\n}\n/**\n* Creates a checkbox-style handler that selects or deselects this row.\n*\n* The handler is a no-op when the row cannot be selected and reads\n* `event.target.checked`. Shift events select or deselect the inclusive range\n* from the most recent selectable row handled by this table. Pass\n* `selectChildren: false` to limit changes to rows explicitly present in the\n* display-order interval, and `deselectParents: true` to remove ancestor row\n* ids from the selection when rows are deselected.\n*\n* @example\n* ```ts\n* const onChange = row_getToggleSelectedHandler(row)\n* ```\n*/\nfunction row_getToggleSelectedHandler(row, opts) {\n\tconst canSelect = row_getCanSelect(row);\n\treturn (e) => {\n\t\tif (!canSelect) return;\n\t\tconst event = e;\n\t\tconst table = row.table;\n\t\tconst checked = event.target.checked;\n\t\tconst anchorId = table._lastSelectedRowId;\n\t\tif (!(table.options.enableRowRangeSelection !== false && anchorId !== null && row_getCanMultiSelect(row) && (table.options.isRowRangeSelectionEvent?.(e) ?? false)) || !selectRowRange(row, anchorId, checked, opts)) row_toggleSelected(row, checked, opts);\n\t\ttable._lastSelectedRowId = row.id;\n\t};\n}\n/**\n* Resolves and mutates an inclusive interval in the table's latest logical\n* display order.\n*\n* The anchor is resolved without throwing from the pre-pagination row model,\n* then the core row model. Both endpoint display indexes must still identify\n* those rows in the current order and both endpoints must support\n* multi-selection. Eligible interval rows are applied through one row\n* selection updater; non-selectable and non-multi-selectable rows are skipped.\n* Returns `false` when the interaction should fall back to an ordinary toggle.\n*/\nfunction selectRowRange(row, anchorId, value, opts) {\n\tconst includeChildren = opts?.selectChildren ?? true;\n\tconst table = row.table;\n\tconst rows = table.getRowsInDisplayOrder();\n\tconst anchorRow = table.getPrePaginatedRowModel().rowsById[anchorId] ?? table.getCoreRowModel().rowsById[anchorId];\n\tif (!anchorRow) return false;\n\tconst anchorIndex = anchorRow.getDisplayIndex();\n\tconst rowIndex = row.getDisplayIndex();\n\tconst anchorAtIndex = rows[anchorIndex];\n\tconst rowAtIndex = rows[rowIndex];\n\tif (anchorIndex < 0 || rowIndex < 0 || anchorIndex >= rows.length || rowIndex >= rows.length || anchorAtIndex?.id !== anchorRow.id || rowAtIndex?.id !== row.id || !row_getCanMultiSelect(anchorRow) || !row_getCanMultiSelect(row)) return false;\n\tconst start = Math.min(anchorIndex, rowIndex);\n\tconst end = Math.max(anchorIndex, rowIndex);\n\ttable_setRowSelection(table, (old) => {\n\t\tconst rowSelection = Object.assign(makeObjectMap(), old);\n\t\tfor (let index = start; index <= end; index++) {\n\t\t\tconst rangeRow = rows[index];\n\t\t\tif (!row_getCanSelect(rangeRow) || !row_getCanMultiSelect(rangeRow)) continue;\n\t\t\tmutateRowIsSelected(rowSelection, rangeRow.id, value, includeChildren, table);\n\t\t\tif (!value && opts?.deselectParents) pruneAncestorRowIds(rowSelection, rangeRow);\n\t\t}\n\t\treturn rowSelection;\n\t});\n\treturn true;\n}\nfunction mutateRowIsSelected(rowSelection, rowId, value, includeChildren, table, respectCanSelectOnDeselect) {\n\tconst row = table.getRow(rowId, true);\n\tif (value) {\n\t\tif (!row_getCanMultiSelect(row)) Object.keys(rowSelection).forEach((key) => delete rowSelection[key]);\n\t\tif (row_getCanSelect(row)) rowSelection[rowId] = true;\n\t} else if (!respectCanSelectOnDeselect || row_getCanSelect(row)) delete rowSelection[rowId];\n\tif (includeChildren && row.subRows.length && row_getCanSelectSubRows(row)) row.subRows.forEach((r) => mutateRowIsSelected(rowSelection, r.id, value, includeChildren, table, respectCanSelectOnDeselect));\n}\n/**\n* Returns whether a select-all cascade can reach this row: the row itself is\n* selectable and no ancestor blocks descent via `enableSubRowSelection`.\n*\n* `subtreeCache` memoizes the per-ancestor verdict for one select-all pass, so\n* ancestor chains shared by sibling rows are only walked (and the\n* `enableSubRowSelection` predicate only invoked) once per unique ancestor.\n*/\nfunction isRowSelectableInSelectAll(row, subtreeCache) {\n\tif (!row_getCanSelect(row)) return false;\n\tconst table = row.table;\n\tif (table.options.enableSubRowSelection === true) return true;\n\tconst parentId = row.parentId;\n\tif (parentId === void 0) return true;\n\tconst cached = subtreeCache.get(parentId);\n\tif (cached !== void 0) return cached;\n\tconst rowsById = table.getCoreRowModel().rowsById;\n\tconst visited = [];\n\tlet selectable = true;\n\tlet currentId = parentId;\n\twhile (currentId !== void 0) {\n\t\tconst known = subtreeCache.get(currentId);\n\t\tif (known !== void 0) {\n\t\t\tselectable = known;\n\t\t\tbreak;\n\t\t}\n\t\tvisited.push(currentId);\n\t\tconst parent = rowsById[currentId] ?? table.getRow(currentId, true);\n\t\tif (!row_getCanSelectSubRows(parent)) {\n\t\t\tselectable = false;\n\t\t\tbreak;\n\t\t}\n\t\tcurrentId = parent.parentId;\n\t}\n\tvisited.forEach((id) => subtreeCache.set(id, selectable));\n\treturn selectable;\n}\nfunction pruneAncestorRowIds(rowSelection, row) {\n\tconst rowsById = row.table.getCoreRowModel().rowsById;\n\tlet parentId = row.parentId;\n\twhile (parentId !== void 0) {\n\t\tdelete rowSelection[parentId];\n\t\tparentId = (rowsById[parentId] ?? row.table.getRow(parentId, true)).parentId;\n\t}\n}\nfunction selectRowsRecursively(rows, rowSelection, selectedFlatRows, selectedRowsById) {\n\tconst result = [];\n\tfor (let i = 0; i < rows.length; i++) {\n\t\tconst row = rows[i];\n\t\tconst isSelected = isRowSelected(row, rowSelection);\n\t\tif (isSelected) {\n\t\t\tselectedFlatRows.push(row);\n\t\t\tselectedRowsById[row.id] = row;\n\t\t}\n\t\tif (row.subRows.length) {\n\t\t\tconst newSubRows = selectRowsRecursively(row.subRows, rowSelection, selectedFlatRows, selectedRowsById);\n\t\t\tif (isSelected) {\n\t\t\t\tconst cloned = Object.create(Object.getPrototypeOf(row));\n\t\t\t\tcopyInstancePropertiesWithoutMemos(cloned, row);\n\t\t\t\tcloned.subRows = newSubRows;\n\t\t\t\tresult.push(cloned);\n\t\t\t}\n\t\t} else if (isSelected) result.push(row);\n\t}\n\treturn result;\n}\n/**\n* Builds a row model containing rows selected by the current row selection state.\n*\n* The result is derived from the supplied row model, so selected ids absent from\n* that model are not materialized as rows.\n*\n* @example\n* ```ts\n* const selectedRows = selectRowsFn(rowModel)\n* ```\n*/\nfunction selectRowsFn(rowModel, table) {\n\tconst newSelectedFlatRows = [];\n\tconst newSelectedRowsById = makeObjectMap();\n\tconst rowSelection = table.atoms.rowSelection?.get() ?? {};\n\treturn {\n\t\trows: selectRowsRecursively(rowModel.rows, rowSelection, newSelectedFlatRows, newSelectedRowsById),\n\t\tflatRows: newSelectedFlatRows,\n\t\trowsById: newSelectedRowsById\n\t};\n}\n/**\n* Returns whether a row id is selected in the current row selection state.\n*\n* @example\n* ```ts\n* const selected = isRowSelected(row)\n* ```\n*/\nfunction isRowSelected(row, rowSelection) {\n\treturn !!(hasOwn(rowSelection, row.id) && rowSelection[row.id]);\n}\n/**\n* Returns whether all, some, or none of a row's selectable descendants are selected.\n*\n* The result is used to drive indeterminate row selection UI.\n*\n* @example\n* ```ts\n* const selectedState = isSubRowSelected(row)\n* ```\n*/\nfunction isSubRowSelected(row) {\n\tif (!row.subRows.length) return false;\n\tconst rowSelection = row.table.atoms.rowSelection?.get() ?? {};\n\tlet someSelected = false;\n\tlet allChildrenSelected = true;\n\tlet someSelectable = false;\n\tfor (let i = 0; i < row.subRows.length; i++) {\n\t\tconst subRow = row.subRows[i];\n\t\tif (someSelected && !allChildrenSelected) break;\n\t\tif (row_getCanSelect(subRow)) {\n\t\t\tsomeSelectable = true;\n\t\t\tif (isRowSelected(subRow, rowSelection)) someSelected = true;\n\t\t\telse allChildrenSelected = false;\n\t\t}\n\t\tif (subRow.subRows.length) {\n\t\t\tconst subRowChildrenSelected = isSubRowSelected(subRow);\n\t\t\tif (subRowChildrenSelected === \"all\") {\n\t\t\t\tsomeSelected = true;\n\t\t\t\tsomeSelectable = true;\n\t\t\t} else if (subRowChildrenSelected === \"some\") {\n\t\t\t\tsomeSelected = true;\n\t\t\t\tallChildrenSelected = false;\n\t\t\t\tsomeSelectable = true;\n\t\t\t} else allChildrenSelected = false;\n\t\t}\n\t}\n\tif (!someSelectable) return false;\n\treturn allChildrenSelected ? \"all\" : someSelected ? \"some\" : false;\n}\n\n//#endregion\nexport { getDefaultRowSelectionState, isRowSelected, isSubRowSelected, row_getCanMultiSelect, row_getCanSelect, row_getCanSelectSubRows, row_getIsAllSubRowsSelected, row_getIsSelected, row_getIsSomeSelected, row_getToggleSelectedHandler, row_toggleSelected, selectRowsFn, table_getFilteredSelectedRowModel, table_getGroupedSelectedRowModel, table_getIsAllPageRowsSelected, table_getIsAllRowsSelected, table_getIsSomePageRowsSelected, table_getIsSomeRowsSelected, table_getPreSelectedRowModel, table_getSelectedRowIds, table_getSelectedRowModel, table_getToggleAllPageRowsSelectedHandler, table_getToggleAllRowsSelectedHandler, table_resetRowSelection, table_setRowSelection, table_toggleAllPageRowsSelected, table_toggleAllRowsSelected };","import { assignPrototypeAPIs, assignTableAPIs, makeStateUpdater } from \"../../utils.js\";\nimport { getDefaultRowSelectionState, row_getCanMultiSelect, row_getCanSelect, row_getCanSelectSubRows, row_getIsAllSubRowsSelected, row_getIsSelected, row_getIsSomeSelected, row_getToggleSelectedHandler, row_toggleSelected, table_getFilteredSelectedRowModel, table_getGroupedSelectedRowModel, table_getIsAllPageRowsSelected, table_getIsAllRowsSelected, table_getIsSomePageRowsSelected, table_getIsSomeRowsSelected, table_getPreSelectedRowModel, table_getSelectedRowIds, table_getSelectedRowModel, table_getToggleAllPageRowsSelectedHandler, table_getToggleAllRowsSelectedHandler, table_resetRowSelection, table_setRowSelection, table_toggleAllPageRowsSelected, table_toggleAllRowsSelected } from \"./rowSelectionFeature.utils.js\";\n\n//#region src/features/row-selection/rowSelectionFeature.ts\n/**\n* Feature that adds row selection state and APIs for row and page selection.\n*/\nconst rowSelectionFeature = {\n\tinitTableInstanceData: (table) => {\n\t\ttable._lastSelectedRowId = null;\n\t},\n\tresetTableInstanceData: (table) => {\n\t\ttable._lastSelectedRowId = null;\n\t},\n\tgetInitialState: (initialState) => {\n\t\treturn {\n\t\t\trowSelection: getDefaultRowSelectionState(),\n\t\t\t...initialState\n\t\t};\n\t},\n\tgetDefaultTableOptions: (table) => {\n\t\treturn {\n\t\t\tonRowSelectionChange: makeStateUpdater(\"rowSelection\", table),\n\t\t\tenableRowSelection: true,\n\t\t\tenableMultiRowSelection: true,\n\t\t\tenableRowRangeSelection: true,\n\t\t\tenableSubRowSelection: true,\n\t\t\tisRowRangeSelectionEvent: (event) => {\n\t\t\t\tconst rangeEvent = event;\n\t\t\t\treturn Boolean(rangeEvent.shiftKey || rangeEvent.nativeEvent?.shiftKey);\n\t\t\t}\n\t\t};\n\t},\n\tassignRowPrototype: (prototype, table) => {\n\t\tassignPrototypeAPIs(\"rowSelectionFeature\", prototype, table, {\n\t\t\trow_toggleSelected: { fn: (row, value, opts) => row_toggleSelected(row, value, opts) },\n\t\t\trow_getIsSelected: { fn: (row) => row_getIsSelected(row) },\n\t\t\trow_getIsSomeSelected: {\n\t\t\t\tfn: (row) => row_getIsSomeSelected(row),\n\t\t\t\tmemoDeps: (row) => [\n\t\t\t\t\trow.subRows,\n\t\t\t\t\trow.table.atoms.rowSelection?.get(),\n\t\t\t\t\trow.table.options.enableRowSelection\n\t\t\t\t]\n\t\t\t},\n\t\t\trow_getIsAllSubRowsSelected: {\n\t\t\t\tfn: (row) => row_getIsAllSubRowsSelected(row),\n\t\t\t\tmemoDeps: (row) => [\n\t\t\t\t\trow.subRows,\n\t\t\t\t\trow.table.atoms.rowSelection?.get(),\n\t\t\t\t\trow.table.options.enableRowSelection\n\t\t\t\t]\n\t\t\t},\n\t\t\trow_getCanSelect: { fn: (row) => row_getCanSelect(row) },\n\t\t\trow_getCanSelectSubRows: { fn: (row) => row_getCanSelectSubRows(row) },\n\t\t\trow_getCanMultiSelect: { fn: (row) => row_getCanMultiSelect(row) },\n\t\t\trow_getToggleSelectedHandler: { fn: (row, opts) => row_getToggleSelectedHandler(row, opts) }\n\t\t});\n\t},\n\tconstructTableAPIs: (table) => {\n\t\tassignTableAPIs(\"rowSelectionFeature\", table, {\n\t\t\ttable_setRowSelection: { fn: (updater) => table_setRowSelection(table, updater) },\n\t\t\ttable_resetRowSelection: { fn: (defaultState) => table_resetRowSelection(table, defaultState) },\n\t\t\ttable_toggleAllRowsSelected: { fn: (value, opts) => table_toggleAllRowsSelected(table, value, opts) },\n\t\t\ttable_toggleAllPageRowsSelected: { fn: (value, opts) => table_toggleAllPageRowsSelected(table, value, opts) },\n\t\t\ttable_getPreSelectedRowModel: { fn: () => table_getPreSelectedRowModel(table) },\n\t\t\ttable_getSelectedRowModel: {\n\t\t\t\tfn: () => table_getSelectedRowModel(table),\n\t\t\t\tmemoDeps: () => [table.atoms.rowSelection?.get(), table.getCoreRowModel()]\n\t\t\t},\n\t\t\ttable_getFilteredSelectedRowModel: {\n\t\t\t\tfn: () => table_getFilteredSelectedRowModel(table),\n\t\t\t\tmemoDeps: () => [table.atoms.rowSelection?.get(), table.getFilteredRowModel()]\n\t\t\t},\n\t\t\ttable_getGroupedSelectedRowModel: {\n\t\t\t\tfn: () => table_getGroupedSelectedRowModel(table),\n\t\t\t\tmemoDeps: () => [table.atoms.rowSelection?.get(), table.getSortedRowModel()]\n\t\t\t},\n\t\t\ttable_getSelectedRowIds: {\n\t\t\t\tfn: () => table_getSelectedRowIds(table),\n\t\t\t\tmemoDeps: () => [table.atoms.rowSelection?.get()]\n\t\t\t},\n\t\t\ttable_getIsAllRowsSelected: {\n\t\t\t\tfn: () => table_getIsAllRowsSelected(table),\n\t\t\t\tmemoDeps: () => [\n\t\t\t\t\ttable.atoms.rowSelection?.get(),\n\t\t\t\t\ttable.getFilteredRowModel(),\n\t\t\t\t\ttable.options.enableRowSelection,\n\t\t\t\t\ttable.options.enableSubRowSelection\n\t\t\t\t]\n\t\t\t},\n\t\t\ttable_getIsAllPageRowsSelected: {\n\t\t\t\tfn: () => table_getIsAllPageRowsSelected(table),\n\t\t\t\tmemoDeps: () => [\n\t\t\t\t\ttable.atoms.rowSelection?.get(),\n\t\t\t\t\ttable.getPaginatedRowModel(),\n\t\t\t\t\ttable.options.enableRowSelection,\n\t\t\t\t\ttable.options.enableSubRowSelection\n\t\t\t\t]\n\t\t\t},\n\t\t\ttable_getIsSomeRowsSelected: {\n\t\t\t\tfn: () => table_getIsSomeRowsSelected(table),\n\t\t\t\tmemoDeps: () => [table.atoms.rowSelection?.get()]\n\t\t\t},\n\t\t\ttable_getIsSomePageRowsSelected: {\n\t\t\t\tfn: () => table_getIsSomePageRowsSelected(table),\n\t\t\t\tmemoDeps: () => [\n\t\t\t\t\ttable.atoms.rowSelection?.get(),\n\t\t\t\t\ttable.getPaginatedRowModel(),\n\t\t\t\t\ttable.options.enableRowSelection\n\t\t\t\t]\n\t\t\t},\n\t\t\ttable_getToggleAllRowsSelectedHandler: { fn: () => table_getToggleAllRowsSelectedHandler(table) },\n\t\t\ttable_getToggleAllPageRowsSelectedHandler: { fn: () => table_getToggleAllPageRowsSelectedHandler(table) }\n\t\t});\n\t}\n};\n\n//#endregion\nexport { rowSelectionFeature };","import { assignPrototypeAPIs, assignTableAPIs, makeStateUpdater } from \"../../utils.js\";\nimport { column_clearSorting, column_getAutoSortDir, column_getAutoSortFn, column_getCanMultiSort, column_getCanSort, column_getFirstSortDir, column_getIsSorted, column_getNextSortingOrder, column_getSortFn, column_getSortIndex, column_getToggleSortingHandler, column_toggleSorting, getDefaultSortingState, table_resetSorting, table_setSorting } from \"./rowSortingFeature.utils.js\";\n\n//#region src/features/row-sorting/rowSortingFeature.ts\n/**\n* Feature that adds row sorting state, defaults, and column/table sorting APIs.\n*/\nconst rowSortingFeature = {\n\tgetInitialState(initialState) {\n\t\treturn {\n\t\t\tsorting: getDefaultSortingState(),\n\t\t\t...initialState\n\t\t};\n\t},\n\tgetDefaultColumnDef() {\n\t\treturn {\n\t\t\tsortFn: \"auto\",\n\t\t\tsortUndefined: 1\n\t\t};\n\t},\n\tgetDefaultTableOptions(table) {\n\t\treturn {\n\t\t\tautoResetSorting: false,\n\t\t\tonSortingChange: makeStateUpdater(\"sorting\", table),\n\t\t\tisMultiSortEvent: (e) => {\n\t\t\t\treturn e.shiftKey;\n\t\t\t}\n\t\t};\n\t},\n\tassignColumnPrototype(prototype, table) {\n\t\tassignPrototypeAPIs(\"rowSortingFeature\", prototype, table, {\n\t\t\tcolumn_getAutoSortFn: { fn: (column) => column_getAutoSortFn(column) },\n\t\t\tcolumn_getAutoSortDir: { fn: (column) => column_getAutoSortDir(column) },\n\t\t\tcolumn_getSortFn: { fn: (column) => column_getSortFn(column) },\n\t\t\tcolumn_toggleSorting: { fn: (column, desc, multi) => column_toggleSorting(column, desc, multi) },\n\t\t\tcolumn_getFirstSortDir: { fn: (column) => column_getFirstSortDir(column) },\n\t\t\tcolumn_getNextSortingOrder: { fn: (column, multi) => column_getNextSortingOrder(column, multi) },\n\t\t\tcolumn_getCanSort: { fn: (column) => column_getCanSort(column) },\n\t\t\tcolumn_getCanMultiSort: { fn: (column) => column_getCanMultiSort(column) },\n\t\t\tcolumn_getIsSorted: { fn: (column) => column_getIsSorted(column) },\n\t\t\tcolumn_getSortIndex: { fn: (column) => column_getSortIndex(column) },\n\t\t\tcolumn_clearSorting: { fn: (column) => column_clearSorting(column) },\n\t\t\tcolumn_getToggleSortingHandler: { fn: (column) => column_getToggleSortingHandler(column) }\n\t\t});\n\t},\n\tconstructTableAPIs(table) {\n\t\tassignTableAPIs(\"rowSortingFeature\", table, {\n\t\t\ttable_setSorting: { fn: (updater) => table_setSorting(table, updater) },\n\t\t\ttable_resetSorting: { fn: (defaultState) => table_resetSorting(table, defaultState) }\n\t\t});\n\t}\n};\n\n//#endregion\nexport { rowSortingFeature };","'use client';\n\nimport { FlexRender } from \"./FlexRender.js\";\nimport { Subscribe } from \"./Subscribe.js\";\nimport { reactReactivity } from \"./reactivity.js\";\nimport { constructTable } from \"@tanstack/table-core\";\nimport { useEffect, useLayoutEffect, useMemo, useState } from \"react\";\nimport { shallow, useSelector } from \"@tanstack/react-store\";\nimport { createRenderPhaseSource } from \"@tanstack/table-core/reactivity\";\nimport { table_publishExternalState, table_setOptions } from \"@tanstack/table-core/static-functions\";\n\n//#region src/useTable.ts\nconst useIsomorphicLayoutEffect = typeof window === \"undefined\" ? useEffect : useLayoutEffect;\n/**\n* Creates a React table instance backed by TanStack Store atoms.\n*\n* The optional selector projects from `table.store`; the selected value is\n* exposed on `table.state` and compared shallowly for React re-renders. Omit\n* the selector to subscribe to every registered table state slice, or pass a\n* narrower selector and use `table.Subscribe` lower in the tree for targeted\n* subscriptions.\n*\n* @example\n* ```tsx\n* const table = useTable(\n* {\n* features,\n* columns,\n* data,\n* },\n* (state) => ({ pagination: state.pagination }),\n* )\n*\n* table.state.pagination\n* ```\n*/\nfunction useTable(tableOptions, selector) {\n\tconst [{ table, rootSource }] = useState(() => {\n\t\tconst tableInstance = constructTable({\n\t\t\t...tableOptions,\n\t\t\tfeatures: {\n\t\t\t\tcoreReactivityFeature: reactReactivity(),\n\t\t\t\t...tableOptions.features\n\t\t\t}\n\t\t});\n\t\ttableInstance.Subscribe = ((props) => {\n\t\t\treturn Subscribe({\n\t\t\t\t...props,\n\t\t\t\tsource: props.source ?? tableInstance.store\n\t\t\t});\n\t\t});\n\t\ttableInstance.FlexRender = FlexRender;\n\t\treturn {\n\t\t\ttable: tableInstance,\n\t\t\trootSource: createRenderPhaseSource(tableInstance.store, shallow)\n\t\t};\n\t});\n\tconst coreTable = table;\n\ttable_setOptions(coreTable, (prev) => ({\n\t\t...prev,\n\t\t...tableOptions\n\t}), { syncExternalState: false });\n\tconst controlledState = coreTable.options.state;\n\tconst renderSnapshot = rootSource.get();\n\tconst state = useSelector(rootSource, selector, { compare: shallow });\n\tuseIsomorphicLayoutEffect(() => {\n\t\trootSource.markCommitted(renderSnapshot);\n\t\ttable_publishExternalState(coreTable, controlledState ?? null, shallow);\n\t});\n\treturn useMemo(() => ({\n\t\t...table,\n\t\toptions: tableOptions,\n\t\tstate\n\t}), [\n\t\ttable,\n\t\ttableOptions,\n\t\tstate\n\t]);\n}\n\n//#endregion\nexport { useTable };","// Client-side export helpers.\n//\n// Pulls every record matching the current list query by paginating with a\n// large pageSize, then serializes to CSV or JSON and triggers a browser\n// download. Pure functions live here so they're trivially unit-testable;\n// the dialog UI in pages/export-dialog.tsx wires them together.\n\nimport type { AdminClient } from './client.js'\nimport type { ListQuery, PropertyJSON, RecordJSON } from './types.js'\n\nexport type ExportFormat = 'csv' | 'json'\n\nexport interface FetchAllOptions {\n /** Page size used for each list request. */\n batchSize?: number\n /** Optional progress callback: `(loaded, total)`. */\n onProgress?(loaded: number, total: number): void\n /** AbortSignal — drop pagination loop on cancel. */\n signal?: AbortSignal\n}\n\n/**\n * Page through `client.list()` until exhausted, returning every record that\n * matches the same filters/sorting as the current list view. `query.page`\n * and `query.perPage` are overwritten — pass the user's filters/sorting only.\n */\nexport async function fetchAllRecords(\n client: AdminClient,\n resourceId: string,\n query: ListQuery | undefined,\n opts: FetchAllOptions = {},\n): Promise<RecordJSON[]> {\n // Backend caps `perPage` at 200 (see listQueryZ in @modern-admin/nest).\n const batchSize = opts.batchSize ?? 200\n const baseQuery: ListQuery = { ...(query ?? {}), perPage: batchSize, page: 1 }\n const all: RecordJSON[] = []\n let total: number\n for (let page = 1; ; page++) {\n if (opts.signal?.aborted) throw new DOMException('Aborted', 'AbortError')\n const res = await client.list(resourceId, { ...baseQuery, page })\n total = res.meta.total\n all.push(...res.records)\n opts.onProgress?.(all.length, total)\n if (res.records.length < batchSize) break\n if (all.length >= total) break\n }\n return all\n}\n\n/** Escape a single CSV field per RFC 4180 (wrap in quotes when needed). */\nexport function csvEscape(value: unknown): string {\n if (value == null) return ''\n let str: string\n if (typeof value === 'string') str = value\n else if (typeof value === 'number' || typeof value === 'boolean') str = String(value)\n else if (value instanceof Date) str = value.toISOString()\n else str = JSON.stringify(value)\n // Quote if it contains comma, quote, CR or LF.\n if (/[\",\\r\\n]/.test(str)) {\n return `\"${str.replace(/\"/g, '\"\"')}\"`\n }\n return str\n}\n\nexport interface SerializeOptions {\n /** Properties to export in this order. Defaults to union of keys in `records`. */\n properties?: PropertyJSON[]\n /** When provided, the active list query is embedded as a comment at the top\n * of the exported file so the export is self-documenting:\n * – CSV: `# Query: {...}` line before the header row\n * – JSON: `// Query: {...}` line before the JSON array */\n query?: ListQuery\n}\n\n/** Build a CSV document for the given records. UTF-8 BOM for Excel friendliness. */\nexport function recordsToCsv(records: RecordJSON[], opts: SerializeOptions = {}): string {\n const columns = opts.properties\n ? opts.properties.map((p) => ({ path: p.path, label: p.label }))\n : columnsFromRecords(records)\n const header = columns.map((c) => csvEscape(c.label)).join(',')\n const lines = records.map((r) =>\n columns.map((c) => csvEscape(r.params[c.path])).join(','),\n )\n const queryComment = opts.query\n ? `# Query: ${JSON.stringify(opts.query)}\\r\\n`\n : ''\n return `\\uFEFF${queryComment}${[header, ...lines].join('\\r\\n')}`\n}\n\n/** Build a pretty-printed JSON document for the given records.\n * When `opts.query` is set, a `// Query: ...` comment is prepended so the\n * export is self-documenting (JSONC — understood by VS Code, TypeScript, etc.) */\nexport function recordsToJson(records: RecordJSON[], opts: SerializeOptions = {}): string {\n const paths = opts.properties?.map((p) => p.path)\n const items = records.map((r) => {\n if (!paths) return { id: r.id, ...r.params }\n const row: Record<string, unknown> = { id: r.id }\n for (const p of paths) row[p] = r.params[p]\n return row\n })\n const json = JSON.stringify(items, null, 2)\n return opts.query ? `// Query: ${JSON.stringify(opts.query)}\\n${json}` : json\n}\n\nfunction columnsFromRecords(records: RecordJSON[]): { path: string; label: string }[] {\n const seen = new Set<string>()\n const out: { path: string; label: string }[] = []\n for (const r of records) {\n for (const k of Object.keys(r.params)) {\n if (seen.has(k)) continue\n seen.add(k)\n out.push({ path: k, label: k })\n }\n }\n return out\n}\n\n/** Trigger a browser download for the given text payload. */\nexport function downloadText(filename: string, mime: string, body: string): void {\n if (typeof window === 'undefined') return\n const blob = new Blob([body], { type: `${mime};charset=utf-8` })\n const url = URL.createObjectURL(blob)\n const a = document.createElement('a')\n a.href = url\n a.download = filename\n document.body.appendChild(a)\n a.click()\n a.remove()\n // Revoke after a tick so Safari has time to start the download.\n window.setTimeout(() => URL.revokeObjectURL(url), 1000)\n}\n\n/** Build a stable filename like `users-20260506-143015.csv`. */\nexport function exportFilename(resourceId: string, format: ExportFormat, now: Date = new Date()): string {\n const pad = (n: number) => String(n).padStart(2, '0')\n const stamp =\n `${now.getFullYear()}${pad(now.getMonth() + 1)}${pad(now.getDate())}` +\n `-${pad(now.getHours())}${pad(now.getMinutes())}${pad(now.getSeconds())}`\n return `${resourceId}-${stamp}.${format}`\n}\n","// Export dialog: lets the user download all records matching the current\n// list filters/sorting as CSV or JSON. Rendered inside a generic <Dialog>\n// via useDialogs().open() — the parent passes resourceId + visible\n// properties + the active ListQuery.\n\nimport * as React from 'react'\nimport {\n Button,\n DialogDescription,\n DialogFooter,\n DialogHeader,\n DialogTitle,\n} from '@modern-admin/ui'\nimport { Download, FileJson, FileSpreadsheet, X } from 'lucide-react'\nimport { useAdminClient } from '../provider.js'\nimport { useI18n } from '../i18n.js'\nimport { useNotify } from '../notify.js'\nimport {\n downloadText,\n exportFilename,\n fetchAllRecords,\n recordsToCsv,\n recordsToJson,\n type ExportFormat,\n} from '../export.js'\nimport type { ListQuery, PropertyJSON } from '../types.js'\n\nexport interface ExportDialogProps {\n resourceId: string\n resourceLabel: string\n properties: PropertyJSON[]\n query: ListQuery | undefined\n onClose(): void\n}\n\nexport function ExportDialog({\n resourceId,\n resourceLabel,\n properties,\n query,\n onClose,\n}: ExportDialogProps): React.ReactElement {\n const client = useAdminClient()\n const { t } = useI18n()\n const notify = useNotify()\n const [busy, setBusy] = React.useState<ExportFormat | null>(null)\n const [progress, setProgress] = React.useState<{ loaded: number; total: number } | null>(null)\n const abortRef = React.useRef<AbortController | null>(null)\n\n React.useEffect(() => {\n return () => abortRef.current?.abort()\n }, [])\n\n const run = async (format: ExportFormat): Promise<void> => {\n if (busy) return\n setBusy(format)\n setProgress({ loaded: 0, total: 0 })\n const ctrl = new AbortController()\n abortRef.current = ctrl\n try {\n const records = await fetchAllRecords(client, resourceId, query, {\n signal: ctrl.signal,\n onProgress: (loaded, total) => setProgress({ loaded, total }),\n })\n const body =\n format === 'csv'\n ? recordsToCsv(records, { properties, query })\n : recordsToJson(records, { properties, query })\n const mime = format === 'csv' ? 'text/csv' : 'application/json'\n downloadText(exportFilename(resourceId, format), mime, body)\n notify.success({ key: 'export:exported', params: { count: records.length } })\n onClose()\n } catch (err) {\n if ((err as { name?: string }).name === 'AbortError') return\n notify.error(\n { key: 'export:exportFailed' },\n { description: err instanceof Error ? err.message : String(err) },\n )\n } finally {\n setBusy(null)\n setProgress(null)\n abortRef.current = null\n }\n }\n\n return (\n <>\n <DialogHeader>\n <DialogTitle>{t('export:title')}</DialogTitle>\n <DialogDescription>\n {t('export:description', { resource: resourceLabel })}\n </DialogDescription>\n </DialogHeader>\n\n <div className=\"grid grid-cols-1 gap-2 sm:grid-cols-2\">\n <Button\n type=\"button\"\n variant=\"outline\"\n className=\"h-auto justify-start gap-3 py-3\"\n disabled={!!busy}\n onClick={() => run('csv')}\n >\n <FileSpreadsheet className=\"size-5 shrink-0\" />\n <div className=\"min-w-0 flex flex-col items-start text-left overflow-hidden\">\n <span className=\"font-medium\">CSV</span>\n <span className=\"text-xs text-muted-foreground truncate w-full\">\n {t('export:csvHint')}\n </span>\n </div>\n </Button>\n <Button\n type=\"button\"\n variant=\"outline\"\n className=\"h-auto justify-start gap-3 py-3\"\n disabled={!!busy}\n onClick={() => run('json')}\n >\n <FileJson className=\"size-5 shrink-0\" />\n <div className=\"min-w-0 flex flex-col items-start text-left overflow-hidden\">\n <span className=\"font-medium\">JSON</span>\n <span className=\"text-xs text-muted-foreground truncate w-full\">\n {t('export:jsonHint')}\n </span>\n </div>\n </Button>\n </div>\n\n {busy && (\n <div className=\"flex items-center gap-2 text-sm text-muted-foreground\">\n <Download className=\"size-4 animate-pulse\" />\n <span>\n {progress && progress.total > 0\n ? t('export:progress', { loaded: progress.loaded, total: progress.total })\n : t('export:downloading')}\n </span>\n </div>\n )}\n\n <DialogFooter>\n <Button\n type=\"button\"\n variant=\"ghost\"\n onClick={() => {\n abortRef.current?.abort()\n onClose()\n }}\n >\n <X className=\"size-4\" />\n {busy ? t('common:cancel') : t('common:close')}\n </Button>\n </DialogFooter>\n </>\n )\n}\n","// Filter operator codecs for the list page.\n//\n// Operators are encoded in the filter value string as `OPERATOR:VALUE`, which\n// travels through the URL hash / controlled query state. These pure functions\n// are the single boundary between that wire format and the structured\n// `{ op, val }` / `{ op, from, to }` shapes the filter UIs work with. Kept\n// framework-free so they're unit-testable without React.\n\n// ─── String filters ─────────────────────────────────────────────────────────\n// Legacy values (no prefix) default to `co` (contains) for strings.\n\nexport type StringFilterOp =\n | 'co'\n | 'nco'\n | 'sw'\n | 'ew'\n | 'eq'\n | 'neq'\n | 'empty'\n | 'nempty'\n | 'in'\n\nconst STRING_OPS: ReadonlySet<string> = new Set(['co', 'nco', 'sw', 'ew', 'eq', 'neq', 'empty', 'nempty', 'in'])\nexport const ALL_STRING_OPS: StringFilterOp[] = ['co', 'nco', 'sw', 'ew', 'in', 'empty', 'nempty']\nexport const NULLARY_OPS: ReadonlySet<string> = new Set(['empty', 'nempty'])\n\n/** Max distinct values for which a string filter defaults to \"is one of\"\n * (checkbox list). Fields with more choices default to \"contains\". */\nexport const ONE_OF_DEFAULT_MAX = 10\n\nexport function parseFilterString(raw: string): { op: StringFilterOp; val: string } {\n if (!raw) return { op: 'co', val: '' }\n const colonIdx = raw.indexOf(':')\n if (colonIdx === -1) return { op: 'co', val: raw }\n const prefix = raw.slice(0, colonIdx)\n if (STRING_OPS.has(prefix)) return { op: prefix as StringFilterOp, val: raw.slice(colonIdx + 1) }\n return { op: 'co', val: raw }\n}\n\nexport function encodeFilter(op: StringFilterOp, val: string): string {\n if (op === 'empty' || op === 'nempty') return `${op}:`\n // Unchecking the last item in the \"Is one of\" picker ⇒ no filter.\n // We deliberately do NOT emit `in:` here: it would survive\n // `setDraftFilter`'s empty-string guard and ship a phantom\n // `filters[col]=in:` URL param (and a \"1 active filter\" badge) while\n // the adapter layer drops the clause anyway. The operator resets to\n // `co` on close, but `StringFilterField`'s auto-switch re-promotes\n // low-cardinality fields back to `in` the next time the panel opens.\n if (op === 'in') return val ? `in:${val}` : ''\n if (!val) return ''\n return `${op}:${val}`\n}\n\n// ─── Numeric filters ─────────────────────────────────────────────────────────\n\nexport type NumericFilterOp = 'eq' | 'neq' | 'gt' | 'lt' | 'between' | 'empty' | 'nempty'\n\nconst NUMERIC_OP_SET = new Set<string>(['eq', 'neq', 'gt', 'lt', 'between', 'empty', 'nempty'])\nexport const ALL_NUMERIC_OPS: NumericFilterOp[] = ['eq', 'neq', 'gt', 'lt', 'between', 'empty', 'nempty']\nexport const NUMERIC_NULLARY: ReadonlySet<string> = new Set(['empty', 'nempty'])\n\nexport function parseNumericFilter(raw: string): { op: NumericFilterOp; from: string; to: string } {\n if (!raw) return { op: 'eq', from: '', to: '' }\n const colonIdx = raw.indexOf(':')\n if (colonIdx === -1) return { op: 'eq', from: raw, to: '' }\n const prefix = raw.slice(0, colonIdx)\n if (!NUMERIC_OP_SET.has(prefix)) return { op: 'eq', from: raw, to: '' }\n const rest = raw.slice(colonIdx + 1)\n if (prefix === 'between') {\n const commaIdx = rest.indexOf(',')\n return commaIdx !== -1\n ? { op: 'between', from: rest.slice(0, commaIdx), to: rest.slice(commaIdx + 1) }\n : { op: 'between', from: rest, to: '' }\n }\n return { op: prefix as NumericFilterOp, from: rest, to: '' }\n}\n\nexport function encodeNumericFilter(op: NumericFilterOp, from: string, to: string): string {\n if (op === 'empty' || op === 'nempty') return `${op}:`\n if (op === 'between') return (from || to) ? `between:${from},${to}` : ''\n return from ? `${op}:${from}` : ''\n}\n","import type { PropertyJSON, RelatedResource, ResourceJSON } from './types.js'\n\n/**\n * Prisma/ORM reverse one-to-many relation fields arrive as array references.\n * Their values are usually not included in record/list payloads, so rendering\n * them as normal fields produces empty placeholders. They belong in related\n * record tables instead.\n */\nexport const isToManyReferenceProperty = (property: PropertyJSON): boolean =>\n property.type === 'reference' && property.isArray && property.reference !== null\n\n/**\n * Properties to render for a given view, in the right order.\n *\n * When `order` (the resource's `propertyOrder[view]`) is supplied it is the\n * authority: the backend already resolved visibility + `listProperties` +\n * `position`, so we simply resolve each path against `properties` (which may be\n * shorter, having had per-record-inaccessible fields stripped) preserving that\n * order. Reverse to-many references are still filtered out — they belong in the\n * related-records section, not as columns.\n *\n * Without `order` (older API servers) we fall back to the legacy behaviour:\n * filter by `visibility[view]` in the payload's own order.\n */\nexport const visibleRecordProperties = (\n properties: ReadonlyArray<PropertyJSON>,\n view: 'list' | 'show' | 'edit' | 'filter',\n order?: ReadonlyArray<string>,\n): PropertyJSON[] => {\n if (order) {\n const byPath = new Map(properties.map((property) => [property.path, property]))\n return order\n .map((path) => byPath.get(path))\n .filter(\n (property): property is PropertyJSON =>\n property !== undefined && !isToManyReferenceProperty(property),\n )\n }\n return properties.filter((property) =>\n property.visibility[view] && !isToManyReferenceProperty(property),\n )\n}\n\nconst relatedKey = (related: RelatedResource): string =>\n `${related.resourceId}::${related.foreignKey}`\n\nexport const resolveRelatedResources = (\n resource: ResourceJSON,\n allResources: ReadonlyArray<ResourceJSON>,\n): RelatedResource[] => {\n const byId = new Map(allResources.map((item) => [item.id, item]))\n const result = [...(resource.relatedResources ?? [])]\n const seen = new Set(result.map(relatedKey))\n\n for (const property of resource.properties) {\n if (!isToManyReferenceProperty(property) || !property.reference) continue\n // Point-hide: a to-many reference property that's hidden from the `show`\n // view opts its auto-discovered tab out of the related-records section.\n // Explicitly-configured `relatedResources` are unaffected — they're an\n // intentional opt-in and carry no backing property visibility.\n if (property.visibility.show === false) continue\n\n const target = byId.get(property.reference)\n if (!target) continue\n\n const foreignKey = target.properties.find((candidate) =>\n !candidate.isArray && candidate.reference === resource.id,\n )\n if (!foreignKey) continue\n\n const related: RelatedResource = {\n resourceId: target.id,\n foreignKey: foreignKey.path,\n label: property.label,\n }\n const key = relatedKey(related)\n if (seen.has(key)) continue\n\n seen.add(key)\n result.push(related)\n }\n\n return result\n}\n","import type { ActionDescriptor } from './types.js'\nimport type { ConfirmOptions, DialogsApi } from './dialogs.js'\n\n/**\n * If `action.guard` is set, shows a confirm dialog with that text as the\n * description before proceeding. Returns `true` if the action should run\n * (no guard configured, or user clicked Confirm), `false` if cancelled.\n *\n * Usage at an invoke call-site:\n * if (!await confirmGuard(action, dialogs)) return\n * invoke.mutate(...)\n */\nexport async function confirmGuard(\n action: Pick<ActionDescriptor, 'guard'>,\n dialogs: Pick<DialogsApi, 'confirm'>,\n extra?: Omit<ConfirmOptions, 'description'>,\n): Promise<boolean> {\n if (!action.guard) return true\n return dialogs.confirm({ description: action.guard, ...extra })\n}\n","// Launch strategy for custom actions.\n//\n// An action with no `component` is a one-click operation: the menu fires it\n// straight at the API. An action *with* a `component` renders its own UI\n// first — a page by default (deep-linkable, room for a real form), or a\n// modal when the action opts in with `custom.showAs: 'dialog'`.\n//\n// Both presentations render the same `<ActionComponentHost/>`, so the only\n// thing that varies here is the container.\n\nimport * as React from 'react'\nimport { DialogHeader, DialogTitle } from '@modern-admin/ui'\nimport { useDialogs } from './dialogs.js'\nimport { useNavigate } from './router.js'\nimport { getActionLabel } from './action-menu.js'\nimport { ActionComponentHost } from './components/action-component-host.js'\nimport type { ActionDescriptor } from './types.js'\n\n/** True when the action renders its own UI instead of firing on click. */\nexport const hasActionComponent = (action: ActionDescriptor): boolean =>\n typeof action.component === 'string' && action.component.length > 0\n\nexport interface LaunchActionOptions {\n /** Record id for `actionType: 'record'` actions. */\n recordId?: string\n /** Selection for `actionType: 'bulk'` actions. */\n recordIds?: string[]\n /** Fired after each successful invoke — only observable in dialog mode,\n * since navigating away unmounts the caller. */\n onSuccess?(): void\n}\n\n/**\n * Opens a custom action's component. Callers should gate on\n * `hasActionComponent(action)` first and fall back to their direct-invoke\n * path when it returns false.\n */\nexport type OpenActionComponent = (\n action: ActionDescriptor,\n options?: LaunchActionOptions,\n) => void\n\nexport const useActionLauncher = (resourceId: string): OpenActionComponent => {\n const dialogs = useDialogs()\n const navigate = useNavigate()\n\n return React.useCallback(\n (action: ActionDescriptor, options: LaunchActionOptions = {}) => {\n const { recordId, recordIds, onSuccess } = options\n if (action.custom?.showAs === 'dialog') {\n void dialogs.open({\n className: 'sm:max-w-2xl',\n render: ({ close }) => (\n <>\n <DialogHeader>\n <DialogTitle>{getActionLabel(action)}</DialogTitle>\n </DialogHeader>\n <ActionComponentHost\n resourceId={resourceId}\n actionName={action.name}\n {...(recordId !== undefined ? { recordId } : {})}\n {...(recordIds !== undefined ? { recordIds } : {})}\n {...(onSuccess !== undefined ? { onSuccess } : {})}\n onClose={() => close()}\n />\n </>\n ),\n })\n return\n }\n navigate({\n name: 'action',\n resourceId,\n actionName: action.name,\n ...(recordId !== undefined ? { recordId } : {}),\n ...(recordIds !== undefined ? { recordIds } : {}),\n })\n },\n [dialogs, navigate, resourceId],\n )\n}\n","// List page powered by @tanstack/react-table. Server-side sorting / filtering\n// / pagination — TanStack just handles state + UI. Each visible PropertyJSON\n// becomes a column; reference cells link to the related record's show page,\n// id cells link to their own show page, and clicking anywhere else in a row\n// opens edit. A toolbar offers global search, per-column filters and column\n// visibility, plus a paginator with page-size selector.\n\nimport * as React from 'react'\nimport {\n columnFilteringFeature,\n columnResizingFeature,\n columnSizingFeature,\n type ColumnVisibilityState,\n type ColumnDef,\n type ColumnFiltersState,\n type ColumnSizingState,\n flexRender,\n type ReactTable,\n rowPaginationFeature,\n rowSelectionFeature,\n rowSortingFeature,\n type RowSelectionState,\n type SortingState,\n tableFeatures,\n useTable,\n columnVisibilityFeature,\n} from '@tanstack/react-table'\nimport {\n Badge,\n Button,\n Card,\n CardContent,\n CardHeader,\n CardTitle,\n Checkbox,\n cn,\n DatePicker,\n DropdownMenu,\n DropdownMenuCheckboxItem,\n DropdownMenuContent,\n DropdownMenuItem,\n DropdownMenuLabel,\n DropdownMenuSeparator,\n DropdownMenuTrigger,\n Empty,\n EmptyContent,\n EmptyDescription,\n EmptyHeader,\n EmptyMedia,\n EmptyTitle,\n Input,\n Kbd,\n Label,\n Popover,\n PopoverContent,\n PopoverTrigger,\n ScrollArea,\n Select,\n SelectContent,\n SelectItem,\n SelectTrigger,\n SelectValue,\n Sheet,\n SheetContent,\n SheetHeader,\n SheetTitle,\n Skeleton,\n TableBody,\n TableCell,\n TableHead,\n TableHeader,\n TableRow,\n Tooltip,\n TooltipContent,\n TooltipTrigger,\n} from '@modern-admin/ui'\nimport {\n ArrowDown,\n ArrowUp,\n ArrowUpDown,\n ChevronLeft,\n ChevronRight,\n ChevronsLeft,\n ChevronsRight,\n Download,\n Eye,\n Inbox,\n ListFilter,\n MoreHorizontal,\n Pencil,\n Plus,\n RefreshCw,\n Search,\n SlidersHorizontal,\n Trash2,\n X,\n Zap,\n} from 'lucide-react'\nimport {\n useBulkDeleteRecords,\n useDeleteRecord,\n useDistinctValues,\n useInvokeBulkAction,\n useInvokeRecordAction,\n useInvokeResourceAction,\n useRecords,\n useRefreshRecords,\n useResource,\n} from '../hooks.js'\nimport { PropertyDisplay } from '../property-renderer.js'\nimport { ReferenceCombobox, ReferenceLink, ReferenceLinkList } from '../reference.js'\nimport {\n Link,\n type ListQueryState,\n useNavigate,\n useOpenInNewTab,\n useRoute,\n} from '../router.js'\nimport { useI18n } from '../i18n.js'\nimport { useNotify } from '../notify.js'\nimport { useDialogs } from '../dialogs.js'\nimport { useHotkey } from '../use-hotkey.js'\nimport { homeCrumb, PageBreadcrumbs } from '../breadcrumbs.js'\nimport { ExportDialog } from './export-dialog.js'\nimport {\n ALL_NUMERIC_OPS,\n ALL_STRING_OPS,\n encodeFilter,\n encodeNumericFilter,\n type NumericFilterOp,\n NUMERIC_NULLARY,\n NULLARY_OPS,\n ONE_OF_DEFAULT_MAX,\n parseFilterString,\n parseNumericFilter,\n type StringFilterOp,\n} from './filter-codecs.js'\nimport {\n ActionMenu,\n ActionMenuItems,\n isActionAllowedForRecord,\n visibleRecordActions,\n} from '../action-menu.js'\nimport { visibleRecordProperties } from '../relations.js'\nimport type {\n ActionDescriptor,\n ListQuery,\n PropertyJSON,\n RecordJSON,\n} from '../types.js'\nimport { confirmGuard } from '../action-guard.js'\nimport { showActionNotice } from '../action-notice.js'\nimport { hasActionComponent, useActionLauncher } from '../action-launcher.js'\n\nconst LIST_TABLE_FEATURES = tableFeatures({\n columnFilteringFeature,\n rowSortingFeature,\n rowPaginationFeature,\n rowSelectionFeature,\n columnVisibilityFeature,\n columnSizingFeature,\n columnResizingFeature,\n})\n\ntype ListTableFeatures = typeof LIST_TABLE_FEATURES\ntype ListColumnDef = ColumnDef<ListTableFeatures, RecordJSON>\ntype ListTable = ReactTable<ListTableFeatures, RecordJSON>\n\nconst PAGE_SIZES = [10, 20, 50, 100] as const\n\n// Cycling widths for skeleton cells — varied so rows don't look identical.\nconst SKEL_WIDTHS = ['w-16', 'w-24', 'w-20', 'w-32', 'w-14', 'w-28', 'w-18', 'w-22'] as const\n\n/** Attach click-and-drag horizontal scrolling to a scroll container.\n *\n * Used on the table wrapper and the pagination buttons row so users on a\n * mouse can drag horizontally without first scrolling to the native scroll-\n * bar. Mouse-only — touch devices already get smooth native momentum\n * scrolling. Engages only after a small movement threshold so plain clicks\n * on rows/buttons still fire, and swallows the synthetic post-drag click to\n * avoid accidental navigation. Returns a cleanup function. */\nfunction attachDragScroll(el: HTMLElement): () => void {\n const DRAG_THRESHOLD = 5\n let startX = 0\n let startScrollLeft = 0\n let pointerId: number | null = null\n let dragging = false\n let armed = false\n\n const onPointerDown = (e: PointerEvent) => {\n if (e.pointerType !== 'mouse') return\n const target = e.target as HTMLElement | null\n if (!target) return\n if (e.button !== 0) return\n if (\n target.closest(\n 'button, a, input, label, [role=\"checkbox\"], [role=\"menuitem\"], [data-resize-handle], [contenteditable=\"true\"]',\n )\n )\n return\n if (el.scrollWidth <= el.clientWidth) return\n armed = true\n dragging = false\n pointerId = e.pointerId\n startX = e.clientX\n startScrollLeft = el.scrollLeft\n }\n\n const onPointerMove = (e: PointerEvent) => {\n if (!armed || pointerId !== e.pointerId) return\n const dx = e.clientX - startX\n if (!dragging) {\n if (Math.abs(dx) < DRAG_THRESHOLD) return\n dragging = true\n el.setPointerCapture(pointerId)\n el.style.cursor = 'grabbing'\n el.style.userSelect = 'none'\n }\n el.scrollLeft = startScrollLeft - dx\n e.preventDefault()\n }\n\n const endDrag = (e: PointerEvent) => {\n if (pointerId !== e.pointerId) return\n armed = false\n if (dragging) {\n dragging = false\n if (el.hasPointerCapture(pointerId)) el.releasePointerCapture(pointerId)\n el.style.cursor = ''\n el.style.userSelect = ''\n const swallow = (ev: MouseEvent) => {\n ev.stopPropagation()\n ev.preventDefault()\n }\n el.addEventListener('click', swallow, { capture: true, once: true })\n }\n pointerId = null\n }\n\n el.addEventListener('pointerdown', onPointerDown)\n el.addEventListener('pointermove', onPointerMove)\n el.addEventListener('pointerup', endDrag)\n el.addEventListener('pointercancel', endDrag)\n return () => {\n el.removeEventListener('pointerdown', onPointerDown)\n el.removeEventListener('pointermove', onPointerMove)\n el.removeEventListener('pointerup', endDrag)\n el.removeEventListener('pointercancel', endDrag)\n }\n}\n\n/** Reasonable starting width per property type. Users can resize from there\n * and the chosen widths are persisted per-resource in localStorage. */\nfunction defaultColumnSize(property: PropertyJSON): number {\n if (property.isId) return 100\n switch (property.type) {\n case 'boolean':\n return 110\n case 'date':\n return 140\n case 'datetime':\n return 180\n case 'number':\n case 'float':\n case 'money':\n case 'currency':\n return 120\n case 'color':\n return 140\n case 'reference':\n return 200\n case 'richtext':\n case 'textarea':\n return 320\n default:\n return 200\n }\n}\n\nconst COLUMN_SIZE_STORAGE_PREFIX = 'modern-admin:colSizes:'\n\n// Internal system columns (_select, _actions) must never have their sizes\n// persisted — their widths are determined by the layout logic, not the user.\nconst isSystemCol = (id: string) => id.startsWith('_')\n\nfunction loadColumnSizing(resourceId: string): ColumnSizingState {\n if (typeof window === 'undefined') return {}\n try {\n const raw = window.localStorage.getItem(COLUMN_SIZE_STORAGE_PREFIX + resourceId)\n if (!raw) return {}\n const parsed = JSON.parse(raw) as ColumnSizingState\n return Object.fromEntries(Object.entries(parsed).filter(([k]) => !isSystemCol(k)))\n } catch {\n return {}\n }\n}\n\nfunction saveColumnSizing(resourceId: string, sizing: ColumnSizingState): void {\n if (typeof window === 'undefined') return\n try {\n const toSave = Object.fromEntries(Object.entries(sizing).filter(([k]) => !isSystemCol(k)))\n window.localStorage.setItem(COLUMN_SIZE_STORAGE_PREFIX + resourceId, JSON.stringify(toSave))\n } catch { /* quota / private mode — ignore */\n }\n}\n\n/** Toggles for individual chrome / toolbar pieces. All default to `true`. */\nexport interface ResourceListFeatures {\n breadcrumbs?: boolean\n title?: boolean\n refresh?: boolean\n filters?: boolean\n columns?: boolean\n export?: boolean\n create?: boolean\n bulk?: boolean\n /** Toolbar-level \"Actions\" dropdown for resource-scoped custom actions. */\n actions?: boolean\n /** Per-column filter popovers in the table header. */\n headerFilters?: boolean\n /** Wrap table + toolbar in a Card. Set false when embedding inside another card. */\n card?: boolean\n}\n\nexport interface ResourceListPageProps {\n resourceId: string\n /** When provided, the table runs in \"controlled\" mode: query state comes\n * from props instead of the URL hash. Both `query` and `onQueryChange`\n * must be supplied together. */\n query?: ListQueryState\n onQueryChange?: (next: ListQueryState) => void\n /** Filters always applied to the data query but hidden from the filter UI\n * and never written to the URL. Used to embed the list as a related-records\n * view filtered by a parent record's id. */\n lockedFilters?: Record<string, string>\n features?: ResourceListFeatures\n /** When provided, row selection is controlled from outside. The\n * internal bulk action bar should be hidden (`features.bulk = false`)\n * in this mode — the parent is consuming the selection. */\n selectedIds?: ReadonlyArray<string>\n onSelectionChange?: (next: string[]) => void\n /** Disable row click → edit and link cells. Used by the picker dialog\n * so clicking a row just toggles selection. */\n disableRowNavigation?: boolean\n /** In embedded mode (`card: false`), whether the internal scroll container\n * and paginator carry their own horizontal padding (`px-6`). Defaults to\n * true — correct for the picker dialog whose body has no padding. Set to\n * false when the host already pads the list (e.g. the related-records tabs\n * embed inside a `CardContent`), otherwise the two paddings stack and the\n * table no longer spans the block's full width. */\n embedPadding?: boolean\n}\n\nexport function ResourceListPage({\n resourceId,\n query: controlledQuery,\n onQueryChange,\n lockedFilters,\n features,\n selectedIds: controlledSelectedIds,\n onSelectionChange,\n disableRowNavigation,\n embedPadding = true,\n}: ResourceListPageProps): React.ReactElement {\n const resource = useResource(resourceId)\n const navigate = useNavigate()\n const openInNewTab = useOpenInNewTab()\n const route = useRoute()\n const remove = useDeleteRecord(resourceId)\n const bulkRemove = useBulkDeleteRecords(resourceId)\n const invokeRecord = useInvokeRecordAction(resourceId)\n const invokeBulk = useInvokeBulkAction(resourceId)\n const invokeResource = useInvokeResourceAction(resourceId)\n const { t } = useI18n()\n const notify = useNotify()\n const dialogs = useDialogs()\n const openActionComponent = useActionLauncher(resourceId)\n\n const isSelectionControlled = controlledSelectedIds !== undefined && onSelectionChange !== undefined\n const [internalRowSelection, setInternalRowSelection] = React.useState<RowSelectionState>({})\n const controlledRowSelection = React.useMemo<RowSelectionState>(() => {\n if (!isSelectionControlled) return {}\n const next: RowSelectionState = {}\n for (const id of controlledSelectedIds!) next[id] = true\n return next\n }, [isSelectionControlled, controlledSelectedIds])\n const rowSelection = isSelectionControlled ? controlledRowSelection : internalRowSelection\n const setRowSelection = React.useCallback(\n (\n updater:\n | RowSelectionState\n | ((prev: RowSelectionState) => RowSelectionState),\n ) => {\n if (isSelectionControlled) {\n const prev = controlledRowSelection\n const next = typeof updater === 'function'\n ? (updater as (p: RowSelectionState) => RowSelectionState)(prev)\n : updater\n onSelectionChange!(Object.keys(next).filter((id) => next[id]))\n return\n }\n setInternalRowSelection(updater)\n },\n [isSelectionControlled, controlledRowSelection, onSelectionChange],\n )\n\n const isControlled = controlledQuery !== undefined && onQueryChange !== undefined\n const f = React.useMemo(\n () => ({\n breadcrumbs: features?.breadcrumbs ?? true,\n title: features?.title ?? true,\n refresh: features?.refresh ?? true,\n filters: features?.filters ?? true,\n columns: features?.columns ?? true,\n export: features?.export ?? true,\n create: features?.create ?? true,\n bulk: features?.bulk ?? true,\n actions: features?.actions ?? true,\n headerFilters: features?.headerFilters ?? true,\n card: features?.card ?? true,\n }),\n [features],\n )\n\n // ── URL-driven (or prop-driven) query state ──\n // In standalone mode, filters/page/perPage/sortBy/direction live in the URL\n // hash (`?page=2&perPage=50&sortBy=name&direction=asc&filters[email]=ada`)\n // so they survive refresh, back, and link sharing. In embedded mode, the\n // parent component owns the same state shape and passes it via `query`.\n const urlQuery = React.useMemo<ListQueryState>(\n () =>\n isControlled\n ? (controlledQuery ?? {})\n : ((route.name === 'list' && route.query) || {}),\n [isControlled, controlledQuery, route],\n )\n\n const sorting = React.useMemo<SortingState>(\n () =>\n urlQuery.sortBy\n ? [{ id: urlQuery.sortBy, desc: urlQuery.direction === 'desc' }]\n : [],\n [urlQuery.sortBy, urlQuery.direction],\n )\n const columnFilters = React.useMemo<ColumnFiltersState>(\n () =>\n urlQuery.filters\n ? Object.entries(urlQuery.filters).map(([id, value]) => ({ id, value }))\n : [],\n [urlQuery.filters],\n )\n const pagination = React.useMemo(\n () => ({\n pageIndex: (urlQuery.page ?? 1) - 1,\n pageSize: urlQuery.perPage ?? 20,\n }),\n [urlQuery.page, urlQuery.perPage],\n )\n\n const [columnVisibility, setColumnVisibility] = React.useState<ColumnVisibilityState>({})\n const [columnSizing, setColumnSizing] = React.useState<ColumnSizingState>(() =>\n loadColumnSizing(resourceId),\n )\n // Reload + persist coherently. When resourceId changes we reload first\n // (and skip saving the old state under the new key); on subsequent updates\n // we persist the user's resize choices.\n const lastResourceIdRef = React.useRef(resourceId)\n React.useEffect(() => {\n if (lastResourceIdRef.current !== resourceId) {\n lastResourceIdRef.current = resourceId\n setColumnSizing(loadColumnSizing(resourceId))\n return\n }\n saveColumnSizing(resourceId, columnSizing)\n }, [resourceId, columnSizing])\n\n // Track the wrapper width so the last visible column can flex to fill any\n // leftover space (mirrors unitify's \"distribute remaining space\" pattern\n // without re-layouting all columns on every observe).\n const [wrapperWidth, setWrapperWidth] = React.useState(0)\n const roRef = React.useRef<ResizeObserver | null>(null)\n const dragCleanupRef = React.useRef<(() => void) | null>(null)\n const lastWidthRef = React.useRef(0)\n\n // The width feeds every column's rendered pixel size, so a naive\n // `setWrapperWidth` per observation re-renders the whole table. Anything\n // that animates the wrapper's width — notably the sidebar's 200ms\n // collapse/expand transition — therefore fired a full table render on every\n // frame and blocked the main thread for ~150-240ms, visibly stalling the\n // animation. Two guards: drop sub-pixel/no-op observations, and schedule the\n // update as a non-urgent transition so React can abandon the intermediate\n // renders and only commit the settled width.\n const commitWrapperWidth = React.useCallback((raw: number) => {\n const w = Math.round(raw)\n if (w === lastWidthRef.current) return\n lastWidthRef.current = w\n React.startTransition(() => setWrapperWidth(w))\n }, [])\n // Callback ref: re-attaches ResizeObserver and click-and-drag handlers\n // whenever the wrapper mounts. (Plain useRef + useEffect runs only once,\n // so if the wrapper is initially unmounted due to conditional rendering,\n // the observer never attaches.)\n const tableWrapperRef = React.useCallback((el: HTMLDivElement | null) => {\n if (roRef.current) {\n roRef.current.disconnect()\n roRef.current = null\n }\n if (dragCleanupRef.current) {\n dragCleanupRef.current()\n dragCleanupRef.current = null\n }\n if (!el) return\n const ro = new ResizeObserver((entries) => {\n commitWrapperWidth(entries[0]?.contentRect.width ?? 0)\n })\n ro.observe(el)\n roRef.current = ro\n commitWrapperWidth(el.clientWidth)\n dragCleanupRef.current = attachDragScroll(el)\n }, [commitWrapperWidth])\n\n const updateUrlQuery = React.useCallback(\n (changes: Partial<ListQueryState>) => {\n const merged: ListQueryState = { ...urlQuery, ...changes }\n const next: ListQueryState = {}\n if (merged.page && merged.page > 1) next.page = merged.page\n if (merged.perPage && merged.perPage !== 20) next.perPage = merged.perPage\n if (merged.sortBy) next.sortBy = merged.sortBy\n if (merged.direction) next.direction = merged.direction\n if (merged.filters && Object.keys(merged.filters).length > 0) next.filters = merged.filters\n if (isControlled) {\n onQueryChange!(next)\n return\n }\n navigate({\n name: 'list',\n resourceId,\n ...(Object.keys(next).length > 0 ? { query: next } : {}),\n })\n },\n [isControlled, onQueryChange, navigate, resourceId, urlQuery],\n )\n\n const handleSortingChange = React.useCallback(\n (updater: SortingState | ((prev: SortingState) => SortingState)) => {\n const next = typeof updater === 'function' ? updater(sorting) : updater\n const first = next[0]\n updateUrlQuery({\n sortBy: first?.id,\n direction: first ? (first.desc ? 'desc' : 'asc') : undefined,\n page: 1,\n })\n },\n [sorting, updateUrlQuery],\n )\n\n const handleFilterChange = React.useCallback(\n (\n updater:\n | ColumnFiltersState\n | ((prev: ColumnFiltersState) => ColumnFiltersState),\n ) => {\n const next = typeof updater === 'function' ? updater(columnFilters) : updater\n const filters: Record<string, string> = {}\n for (const f of next) {\n if (f.value != null && f.value !== '') filters[f.id] = String(f.value)\n }\n updateUrlQuery({\n filters: Object.keys(filters).length > 0 ? filters : undefined,\n page: 1,\n })\n },\n [columnFilters, updateUrlQuery],\n )\n\n // Ref so column header popovers can read latest filter state without being\n // in the `columns` useMemo dependency array (which would recreate all columns\n // on every filter change).\n const columnFiltersRef = React.useRef(columnFilters)\n React.useEffect(() => {\n columnFiltersRef.current = columnFilters\n }, [columnFilters])\n\n const handleColumnFilterApply = React.useCallback(\n (updates: Record<string, string>) => {\n const next = columnFiltersRef.current.filter((f) => !(f.id in updates))\n for (const [id, value] of Object.entries(updates)) {\n if (value) next.push({ id, value })\n }\n handleFilterChange(next)\n },\n [handleFilterChange],\n )\n\n const handlePaginationChange = React.useCallback(\n (\n updater:\n | { pageIndex: number; pageSize: number }\n | ((prev: { pageIndex: number; pageSize: number }) => {\n pageIndex: number\n pageSize: number\n }),\n ) => {\n const next = typeof updater === 'function' ? updater(pagination) : updater\n updateUrlQuery({\n page: next.pageIndex + 1,\n perPage: next.pageSize,\n })\n },\n [pagination, updateUrlQuery],\n )\n\n const query = React.useMemo<ListQuery>(() => {\n // Locked filters are merged in but never written to URL or column state.\n const mergedFilters = { ...(lockedFilters ?? {}), ...(urlQuery.filters ?? {}) }\n return {\n page: urlQuery.page ?? 1,\n perPage: urlQuery.perPage ?? 20,\n ...(urlQuery.sortBy\n ? {\n sortBy: urlQuery.sortBy,\n ...(urlQuery.direction ? { direction: urlQuery.direction } : {}),\n }\n : {}),\n ...(Object.keys(mergedFilters).length > 0 ? { filters: mergedFilters } : {}),\n }\n }, [\n urlQuery.page,\n urlQuery.perPage,\n urlQuery.sortBy,\n urlQuery.direction,\n urlQuery.filters,\n lockedFilters,\n ])\n\n const records = useRecords(resourceId, query)\n // Refresh means \"show me what the database holds now\" — the request\n // carries `Cache-Control: no-cache` so the server reads past its own\n // caches and busts them when the rows turn out to have changed.\n const refreshRecords = useRefreshRecords(resourceId, query)\n\n const visible = React.useMemo<PropertyJSON[]>(() => {\n const all = resource\n ? visibleRecordProperties(resource.properties, 'list', resource.propertyOrder?.list)\n : []\n // Drop columns pinned by lockedFilters — they're identical for every row.\n if (lockedFilters && Object.keys(lockedFilters).length > 0) {\n return all.filter((p) => !(p.path in lockedFilters))\n }\n return all\n }, [resource, lockedFilters])\n\n // The filter panel has its own view — `filterProperties` (whitelist + order)\n // or, absent that, every property whose `isVisible.filter` holds. Feeding it\n // `visible` would tie filtering to the table columns, so a property hidden\n // from the list becomes unfilterable and one hidden from filters still shows\n // up. Both sets are computed server-side; use the matching one.\n const filterable = React.useMemo<PropertyJSON[]>(() => {\n const all = resource\n ? visibleRecordProperties(resource.properties, 'filter', resource.propertyOrder?.filter)\n : []\n // Locked filters are fixed for the whole view — offering them as editable\n // filter inputs would let the user contradict the lock.\n if (lockedFilters && Object.keys(lockedFilters).length > 0) {\n return all.filter((p) => !(p.path in lockedFilters))\n }\n return all\n }, [resource, lockedFilters])\n\n // Header (per-column) filters answer the same question as the panel, so they\n // follow the same view: a column that isn't filterable gets no filter icon.\n const filterablePaths = React.useMemo(\n () => new Set(filterable.map((p) => p.path)),\n [filterable],\n )\n\n const { customResourceActions, customRecordActions, customBulkActions } = React.useMemo(() => {\n const builtInActionNames = new Set([\n 'list',\n 'show',\n 'new',\n 'edit',\n 'delete',\n 'bulkDelete',\n 'search',\n 'values',\n ])\n const actions = resource?.actions ?? []\n return {\n customResourceActions: actions.filter(\n (a) => a.actionType === 'resource' && !builtInActionNames.has(a.name),\n ),\n customRecordActions: actions.filter(\n (a) => a.actionType === 'record' && !builtInActionNames.has(a.name),\n ),\n customBulkActions: actions.filter(\n (a) => a.actionType === 'bulk' && !builtInActionNames.has(a.name),\n ),\n }\n }, [resource])\n\n // Delete + custom-action handlers are identical for the desktop table rows\n // and the mobile record cards, so both surfaces share these factories rather\n // than each carrying its own copy of the confirm-dialog / mutate plumbing.\n const makeDeleteHandler = React.useCallback(\n (record: RecordJSON) => async () => {\n const ok = await dialogs.confirm({\n title: t('common:confirmDelete'),\n description: record.title || record.id,\n confirmLabel: t('common:delete'),\n destructive: true,\n })\n if (!ok) return\n remove.mutate(record.id, {\n onSuccess: () => notify.success({ key: 'toast:deleted' }),\n onError: (err) =>\n notify.error(\n { key: 'toast:deleteFailed' },\n { description: err instanceof Error ? err.message : String(err) },\n ),\n })\n },\n [dialogs, t, remove, notify],\n )\n\n const makeInvokeRecordHandler = React.useCallback(\n (record: RecordJSON) => async (action: ActionDescriptor) => {\n // Actions with their own UI collect a payload first; the guard runs\n // inside that flow (or not at all — the component is the confirmation).\n if (hasActionComponent(action)) {\n openActionComponent(action, { recordId: record.id })\n return\n }\n if (!await confirmGuard(action, dialogs)) return\n invokeRecord.mutate(\n { recordId: record.id, actionName: action.name },\n {\n onSuccess: (res) => showActionNotice(notify, res.notice),\n onError: (err) => notify.error({ message: err.message }),\n },\n )\n },\n [dialogs, invokeRecord, notify, openActionComponent],\n )\n\n const showSelectColumn = f.bulk || isSelectionControlled\n const columns = React.useMemo<ListColumnDef[]>(() => {\n const cols: ListColumnDef[] = []\n if (showSelectColumn) {\n cols.push({\n id: '_select',\n enableSorting: false,\n enableHiding: false,\n enableResizing: false,\n size: 40,\n minSize: 0,\n header: ({ table }) => {\n const all = table.getIsAllPageRowsSelected()\n const some = table.getIsSomePageRowsSelected()\n return (\n <Checkbox\n checked={all ? true : some ? 'indeterminate' : false}\n onCheckedChange={(v) => table.toggleAllPageRowsSelected(!!v)}\n aria-label={t('common:selectAll')}\n />\n )\n },\n cell: ({ row }) => (\n <Checkbox\n checked={row.getIsSelected()}\n onCheckedChange={(v) => row.toggleSelected(!!v)}\n onClick={(e) => e.stopPropagation()}\n aria-label={t('common:selectRow')}\n />\n ),\n })\n }\n cols.push(...visible.map<ListColumnDef>((property) => ({\n id: property.path,\n accessorFn: (row) => row.params[property.path],\n size: defaultColumnSize(property),\n minSize: 80,\n header: ({ column }) => (\n <div className=\"flex items-center gap-0.5\">\n <SortHeader\n property={property}\n state={\n column.getIsSorted() === 'asc'\n ? 'asc'\n : column.getIsSorted() === 'desc'\n ? 'desc'\n : 'none'\n }\n onSort={() => {\n if (!property.isSortable) return\n const cur = column.getIsSorted()\n if (cur === false) column.toggleSorting(false)\n else if (cur === 'asc') column.toggleSorting(true)\n else column.clearSorting()\n }}\n />\n {f.headerFilters && filterablePaths.has(property.path) && (\n <ColumnFilterPopover\n property={property}\n getFilters={() => columnFiltersRef.current}\n onApply={handleColumnFilterApply}\n resourceId={resourceId}\n t={t}\n />\n )}\n </div>\n ),\n enableSorting: property.isSortable,\n cell: ({ row }) => (\n <CellContent\n resourceId={resourceId}\n recordId={row.original.id}\n property={property}\n value={row.original.params[property.path]}\n populated={row.original.populated}\n />\n ),\n })))\n if (!disableRowNavigation) cols.push({\n id: '_actions',\n header: () => null,\n enableSorting: false,\n enableHiding: false,\n enableResizing: false,\n size: 44,\n minSize: 0,\n cell: ({ row }) => (\n <RowActions\n t={t}\n record={row.original}\n customActions={customRecordActions}\n onView={() =>\n navigate({ name: 'show', resourceId, recordId: row.original.id })\n }\n onEdit={() =>\n navigate({ name: 'edit', resourceId, recordId: row.original.id })\n }\n onDelete={makeDeleteHandler(row.original)}\n onInvokeAction={makeInvokeRecordHandler(row.original)}\n />\n ),\n })\n return cols\n }, [\n visible,\n resourceId,\n navigate,\n t,\n handleColumnFilterApply,\n filterablePaths,\n f.headerFilters,\n showSelectColumn,\n disableRowNavigation,\n customRecordActions,\n makeDeleteHandler,\n makeInvokeRecordHandler,\n ])\n\n const total = records.data?.meta.total ?? 0\n const pageCount = Math.max(1, Math.ceil(total / pagination.pageSize))\n\n const table = useTable({\n features: LIST_TABLE_FEATURES,\n data: records.data?.records ?? [],\n columns,\n pageCount,\n state: { sorting, columnFilters, columnVisibility, pagination, rowSelection, columnSizing },\n onSortingChange: handleSortingChange,\n onColumnFiltersChange: handleFilterChange,\n onColumnVisibilityChange: setColumnVisibility,\n onColumnSizingChange: setColumnSizing,\n onPaginationChange: handlePaginationChange,\n onRowSelectionChange: setRowSelection,\n enableRowSelection: true,\n manualSorting: true,\n manualFiltering: true,\n manualPagination: true,\n enableColumnResizing: true,\n // 'onEnd' commits the new size only when the user releases the handle,\n // avoiding a re-render storm that 'onChange' triggers on every mousemove.\n columnResizeMode: 'onEnd',\n defaultColumn: { minSize: 80, size: 200, maxSize: 800 },\n getRowId: (row) => row.id,\n })\n\n // Selection lives at the page level (we always know the IDs from rowSelection\n // keys because getRowId returns row.id). The bulk-delete button shows\n // whenever the user has at least one row selected.\n const selectedIds = React.useMemo(() => Object.keys(rowSelection), [rowSelection])\n const selectedCount = selectedIds.length\n // An empty result set has two flavours. When there are NO active filters the\n // resource is genuinely empty, so we swap the whole toolbar for a \"create your\n // first record\" empty state. When filters ARE active the resource may well\n // hold records — the current filters just match none — so we must KEEP the\n // toolbar (and its filter button) reachable, otherwise the user is stranded\n // with no way to relax the filters. This bites the related-records embed,\n // where a filter that matches nothing would otherwise hide the filter button.\n const isEmpty = !records.isPending && !records.isError && total === 0\n const hasActiveFilters = columnFilters.length > 0\n const showStandaloneEmptyState = isEmpty && !hasActiveFilters\n const showFilteredEmptyState = isEmpty && hasActiveFilters\n // Skeletons appear only on the true first load, where `placeholderData:\n // keepPreviousData` has nothing to hold. Page/sort/filter changes and\n // background invalidations keep the prior rows on screen (isFetching, not\n // isPending) so the table never blanks out from under the user.\n const showSkeletons = records.isPending\n\n // ── Keyboard shortcuts ──\n // Plain `n` creates, `r` refreshes, `f` opens the filters drawer.\n // Bare-key bindings are skipped while typing in inputs. Ctrl+N would\n // be the conventional choice for \"new\" but every major browser\n // reserves it for \"new window\" and won't surrender the keydown, so we\n // settle for a single-letter binding consistent with `r` / `f`.\n useHotkey(\n 'n',\n () => {\n navigate({ name: 'new', resourceId })\n },\n { enabled: f.create, description: t('common:new') },\n )\n useHotkey(\n 'r',\n () => {\n if (!records.isFetching) void refreshRecords()\n },\n { enabled: f.refresh, description: t('common:refresh') },\n )\n const handleBulkDelete = React.useCallback(async () => {\n const ok = await dialogs.confirm({\n title: t('common:bulkDeleteConfirm', { count: selectedCount }),\n confirmLabel: t('common:delete'),\n destructive: true,\n })\n if (!ok) return\n bulkRemove.mutate(selectedIds, {\n onSuccess: () => {\n setRowSelection({})\n notify.success({ key: 'toast:bulkDeleted', params: { count: selectedCount } })\n },\n onError: (err) =>\n notify.error(\n { key: 'toast:bulkDeleteFailed' },\n { description: err instanceof Error ? err.message : String(err) },\n ),\n })\n }, [bulkRemove, dialogs, notify, selectedCount, selectedIds, setRowSelection, t])\n\n if (!resource) {\n return (\n <Card>\n <CardContent className=\"p-6\">\n <Skeleton className=\"h-6 w-1/3\"/>\n </CardContent>\n </Card>\n )\n }\n\n const showCustomResourceActions = f.actions && customResourceActions.length > 0\n const hasToolbarActions = !showStandaloneEmptyState && (\n f.refresh || f.filters || f.columns || f.export || f.create || showCustomResourceActions\n )\n const hasHeader = f.title || hasToolbarActions || (!showStandaloneEmptyState && visible.some((p) => p.isSortable))\n\n // CardHeader/Content add their own padding. When `card: false` we're embedded\n // inside another container that already provides spacing, so use a bare div\n // wrapper to avoid compounding paddings.\n const HeaderEl = f.card ? CardHeader : 'div'\n const ContentEl = f.card ? CardContent : 'div'\n const headerCls = cn(\n 'flex flex-col items-start gap-3 sm:flex-row sm:items-center sm:justify-between sm:gap-4',\n !f.card && 'mb-3',\n )\n\n const inner = (\n <>\n {/* The trigger + panel normally live together inside the toolbar (see\n `FilterControl`), which keeps the open/close state out of this\n component so toggling doesn't re-render the whole list body. The\n toolbar is suppressed in the standalone empty state, so mount a\n trigger-less instance here to keep the `F` hotkey working. */}\n {f.filters && !hasToolbarActions && (\n <FilterControl\n showTrigger={false}\n properties={filterable}\n filters={columnFilters}\n onChange={handleFilterChange}\n resourceId={resourceId}\n t={t}\n />\n )}\n {hasHeader && (\n <HeaderEl className={headerCls}>\n {f.title ? <CardTitle>{resource.name}</CardTitle> : <span/>}\n {hasToolbarActions && (\n <div className=\"flex w-full flex-wrap items-center justify-end gap-2 sm:w-auto\">\n {f.refresh && (\n <Tooltip>\n <TooltipTrigger asChild>\n <Button\n variant=\"outline\"\n size=\"sm\"\n onClick={() => void refreshRecords()}\n disabled={records.isFetching}\n aria-label={t('common:refresh')}\n >\n <RefreshCw className={records.isFetching ? 'size-4 animate-spin' : 'size-4'}/>\n </Button>\n </TooltipTrigger>\n <TooltipContent className=\"flex items-center gap-1.5\">\n <span>{t('common:refresh')}</span>\n <Kbd>R</Kbd>\n </TooltipContent>\n </Tooltip>\n )}\n {f.filters && (\n <FilterControl\n showTrigger\n properties={filterable}\n filters={columnFilters}\n onChange={handleFilterChange}\n resourceId={resourceId}\n t={t}\n />\n )}\n {f.columns && (\n <ColumnVisibilityMenu table={table} properties={visible} t={t}/>\n )}\n {f.export && (\n <Button\n variant=\"outline\"\n size=\"sm\"\n onClick={() =>\n dialogs.open({\n render: ({ close }) => (\n <ExportDialog\n resourceId={resourceId}\n resourceLabel={resource.name}\n properties={visible}\n query={query}\n onClose={() => close()}\n />\n ),\n })\n }\n >\n <Download className=\"size-4\"/>\n <span className=\"hidden sm:inline\">{t('common:export')}</span>\n </Button>\n )}\n {showCustomResourceActions && (\n <ActionMenu\n actions={customResourceActions}\n onAction={async (action) => {\n if (hasActionComponent(action)) {\n openActionComponent(action)\n return\n }\n if (!await confirmGuard(action, dialogs)) return\n invokeResource.mutate(\n { actionName: action.name },\n {\n onSuccess: (res) => showActionNotice(notify, res.notice),\n onError: (err) => notify.error({ message: err.message }),\n },\n )\n }}\n t={t}\n trigger={(\n <Button variant=\"outline\" size=\"sm\" disabled={invokeResource.isPending}>\n <Zap className=\"size-4\"/>\n <span className=\"hidden sm:inline\">{t('common:actions')}</span>\n </Button>\n )}\n />\n )}\n {f.create && (\n <Tooltip>\n <TooltipTrigger asChild>\n <Button size=\"sm\" onClick={() => navigate({ name: 'new', resourceId })}>\n <Plus className=\"size-4\"/>\n <span className=\"hidden sm:inline\">{t('common:new')}</span>\n </Button>\n </TooltipTrigger>\n <TooltipContent className=\"flex items-center gap-1.5\">\n <span>{t('common:new')}</span>\n <Kbd>N</Kbd>\n </TooltipContent>\n </Tooltip>\n )}\n </div>\n )}\n {/* Mobile-only sort selector — desktop uses column header clicks */}\n {visible.some((p) => p.isSortable) && (\n <div className=\"flex w-full items-center gap-2 sm:hidden\">\n <ArrowUpDown className=\"size-4 shrink-0 text-muted-foreground\"/>\n <Select\n value={\n sorting[0]\n ? `${sorting[0].id}:${sorting[0].desc ? 'desc' : 'asc'}`\n : '_none_'\n }\n onValueChange={(v) => {\n if (v === '_none_') {\n handleSortingChange([])\n return\n }\n const sep = v.lastIndexOf(':')\n handleSortingChange([{ id: v.slice(0, sep), desc: v.slice(sep + 1) === 'desc' }])\n }}\n >\n <SelectTrigger className=\"h-8 flex-1\">\n <SelectValue placeholder={t('common:sortBy')}/>\n </SelectTrigger>\n <SelectContent>\n <SelectItem value=\"_none_\">{t('common:sortBy')}: —</SelectItem>\n {visible\n .filter((p) => p.isSortable)\n .flatMap((p) => [\n <SelectItem key={`${p.path}:asc`} value={`${p.path}:asc`}>\n {p.label} ↑\n </SelectItem>,\n <SelectItem key={`${p.path}:desc`} value={`${p.path}:desc`}>\n {p.label} ↓\n </SelectItem>,\n ])}\n </SelectContent>\n </Select>\n </div>\n )}\n </HeaderEl>\n )}\n <ContentEl className=\"flex flex-1 flex-col gap-2 sm:gap-3\">\n {showStandaloneEmptyState ? (\n <Empty>\n <EmptyHeader>\n <EmptyMedia>\n <Inbox/>\n </EmptyMedia>\n <EmptyTitle>{t('common:noRecords')}</EmptyTitle>\n {f.create && (\n <EmptyDescription>\n {t('common:noRecordsHint', { resource: resource.name })}\n </EmptyDescription>\n )}\n </EmptyHeader>\n {f.create && (\n <EmptyContent>\n <Button size=\"sm\" onClick={() => navigate({ name: 'new', resourceId })}>\n <Plus className=\"size-4\"/>\n {t('common:new')}\n </Button>\n </EmptyContent>\n )}\n </Empty>\n ) : showFilteredEmptyState ? (\n // Filters are active but match nothing. The toolbar (with its filter\n // button) stays visible above, so here we only offer a quick reset.\n <Empty>\n <EmptyHeader>\n <EmptyMedia>\n <ListFilter/>\n </EmptyMedia>\n <EmptyTitle>{t('common:noMatchingRecords')}</EmptyTitle>\n </EmptyHeader>\n <EmptyContent>\n <Button variant=\"outline\" size=\"sm\" onClick={() => handleFilterChange([])}>\n <X className=\"size-4\"/>\n {t('common:clearFilters')}\n </Button>\n </EmptyContent>\n </Empty>\n ) : (\n <>\n {/* Bulk action bar — only visible when at least one row is selected.\n Sits above the list so the user can act on the selection without\n having to scroll. Mirrors a typical email-client multi-select. */}\n {f.bulk && selectedCount > 0 && (\n <div\n className=\"flex flex-row items-center justify-between gap-2 rounded-md border border-primary/30 bg-primary/5 px-3 py-2\">\n <div className=\"min-w-0 truncate text-sm font-medium\">\n {t('common:selectedCount', { count: selectedCount })}\n </div>\n <div className=\"flex shrink-0 items-center gap-2\">\n <Button\n variant=\"ghost\"\n size=\"sm\"\n onClick={() => setRowSelection({})}\n disabled={bulkRemove.isPending}\n >\n <X className=\"size-4\"/>\n <span className=\"hidden sm:inline\">{t('common:clearSelection')}</span>\n </Button>\n {customBulkActions.length > 0 && (\n <ActionMenu\n actions={customBulkActions}\n onAction={async (action) => {\n if (hasActionComponent(action)) {\n // The component collects the payload and runs the\n // action itself; clearing the selection is deferred\n // until it actually succeeds.\n openActionComponent(action, {\n recordIds: selectedIds,\n onSuccess: () => setRowSelection({}),\n })\n return\n }\n if (!await confirmGuard(action, dialogs)) return\n invokeBulk.mutate(\n { actionName: action.name, ids: selectedIds },\n {\n onSuccess: (res) => {\n setRowSelection({})\n showActionNotice(notify, res.notice)\n },\n onError: (err) => notify.error({ message: err.message }),\n },\n )\n }}\n t={t}\n trigger={(\n <Button variant=\"outline\" size=\"sm\" disabled={invokeBulk.isPending}>\n <Zap className=\"size-4\"/>\n <span className=\"hidden sm:inline\">{t('common:actions')}</span>\n </Button>\n )}\n />\n )}\n <Button\n variant=\"destructive\"\n size=\"sm\"\n onClick={handleBulkDelete}\n disabled={bulkRemove.isPending}\n >\n <Trash2 className=\"size-4\"/>\n <span className=\"hidden sm:inline\">{t('common:deleteSelected')}</span>\n </Button>\n </div>\n </div>\n )}\n {/* Mobile: card-per-record stack. Hidden ≥ sm. */}\n <div className=\"space-y-2 sm:hidden\">\n {showSkeletons && Array.from({ length: pagination.pageSize }, (_, i) => (\n <div key={`skel-card-${i}`} className=\"rounded-lg border border-border bg-card p-3\">\n <div className=\"flex items-start gap-3\">\n <Skeleton className=\"mt-1 h-4 w-4 flex-none rounded\"/>\n <div className=\"flex-1 space-y-2\">\n <div className=\"flex items-start justify-between gap-2\">\n <div className=\"flex-1 space-y-1.5\">\n <Skeleton className=\"h-4 w-32\"/>\n <Skeleton className=\"h-3 w-16\"/>\n </div>\n <Skeleton className=\"h-7 w-7 shrink-0 rounded\"/>\n </div>\n <div className=\"mt-3 grid grid-cols-2 gap-x-3 gap-y-2\">\n {Array.from({ length: 4 }, (_, j) => (\n <div key={j} className=\"space-y-1\">\n <Skeleton className=\"h-2.5 w-14\"/>\n <Skeleton className={`h-4 ${SKEL_WIDTHS[(i * 3 + j) % SKEL_WIDTHS.length]}`}/>\n </div>\n ))}\n </div>\n </div>\n </div>\n </div>\n ))}\n {!showSkeletons && records.isError && (\n <div className=\"rounded-md border border-border px-4 py-8 text-left text-destructive\">\n {t('common:loadFailed', { error: String(records.error) })}\n </div>\n )}\n {!showSkeletons && table.getRowModel().rows.map((row) => (\n <RecordCard\n key={row.id}\n record={row.original}\n properties={visible.filter((p) =>\n table.getColumn(p.path)?.getIsVisible() ?? true,\n )}\n resourceId={resourceId}\n showSelect={showSelectColumn}\n selected={row.getIsSelected()}\n onToggleSelect={(v) => row.toggleSelected(v)}\n onView={() => navigate({ name: 'show', resourceId, recordId: row.original.id })}\n onEdit={() => navigate({ name: 'edit', resourceId, recordId: row.original.id })}\n onDelete={makeDeleteHandler(row.original)}\n customActions={customRecordActions}\n onInvokeAction={makeInvokeRecordHandler(row.original)}\n t={t}\n />\n ))}\n </div>\n\n {/* Desktop: tabular layout. Hidden < sm.\n `cursor-grab` is a hint that the table can be dragged\n horizontally; the actual drag handlers live in\n `tableWrapperRef`. The grip on column resize handles takes\n precedence (cursor-col-resize is set on a child) so users\n still get the right cursor while resizing. */}\n <div\n ref={tableWrapperRef}\n className=\"relative hidden cursor-grab overflow-x-auto rounded-md border border-border sm:block\"\n >\n {(() => {\n // Distribute leftover wrapper space proportionally across data columns\n // so the table always fills the full wrapper width.\n // _select and _actions keep their fixed sizes; only data columns stretch.\n const leafCols = table.getVisibleLeafColumns()\n const totalSize = table.getCenterTotalSize()\n const wrapperW = wrapperWidth > 0 ? wrapperWidth : totalSize\n const extra = Math.max(0, wrapperW - totalSize)\n\n // _select (checkbox) and _actions stay fixed-width; only data\n // columns participate in proportional stretch.\n const fixedIds = new Set(['_select', '_actions'])\n const stretchCols = leafCols.filter((c) => !fixedIds.has(c.id))\n const stretchBaseTotal = stretchCols.reduce((s, c) => s + c.getSize(), 0)\n\n // Pre-compute each column's rendered pixel width (base + proportional boost).\n const renderedWidth = new Map<string, number>(\n leafCols.map((c) => [c.id, c.getSize()]),\n )\n if (extra > 0 && stretchBaseTotal > 0) {\n let assigned = 0\n stretchCols.forEach((c, i) => {\n const share =\n i === stretchCols.length - 1\n ? extra - assigned\n : Math.floor((extra * c.getSize()) / stretchBaseTotal)\n renderedWidth.set(c.id, c.getSize() + share)\n assigned += share\n })\n }\n\n const renderedTotal = totalSize + extra\n const sizeOf = (colId: string, base: number): number =>\n renderedWidth.get(colId) ?? base\n\n // Resize guide: compute left offset using rendered (boosted) widths.\n const resizingHeader = table.getHeaderGroups()\n .flatMap((hg) => hg.headers)\n .find((h) => h.column.getIsResizing())\n const deltaOffset = table.state.columnResizing.deltaOffset ?? 0\n const resizeLeft = resizingHeader\n ? leafCols\n .slice(\n 0,\n leafCols.findIndex((c) => c.id === resizingHeader.column.id) + 1,\n )\n .reduce((s, c) => s + (renderedWidth.get(c.id) ?? c.getSize()), 0) +\n deltaOffset\n : 0\n\n return (\n <div className=\"relative\" style={{ width: renderedTotal }}>\n {/* Use a raw <table> instead of the shadcn <Table> wrapper:\n <Table> renders an internal <div className=\"overflow-auto\">\n which becomes the containing block for sticky cells, pinning\n them to the off-screen right edge of the full table width\n rather than the visible scroll area. */}\n <table\n className=\"w-full caption-bottom text-sm\"\n style={{ tableLayout: 'fixed', width: renderedTotal }}\n >\n <TableHeader>\n {table.getHeaderGroups().map((hg) => (\n <TableRow key={hg.id}>\n {hg.headers.map((header) => (\n <TableHead\n key={header.id}\n style={{ width: sizeOf(header.column.id, header.getSize()) }}\n className={cn(\n 'relative select-none',\n header.column.id === '_actions' &&\n 'sticky right-0 z-20 bg-muted px-1 shadow-[-4px_0_8px_-6px_rgba(0,0,0,0.15)]',\n )}\n >\n {header.isPlaceholder\n ? null\n : flexRender(header.column.columnDef.header, header.getContext())}\n {header.column.getCanResize() && (\n <div\n data-resize-handle=\"\"\n onMouseDown={header.getResizeHandler()}\n onTouchStart={header.getResizeHandler()}\n onClick={(e) => e.stopPropagation()}\n onDoubleClick={() => header.column.resetSize()}\n className={cn(\n 'absolute right-0 top-0 z-10 h-full w-1.5 cursor-col-resize touch-none select-none bg-transparent hover:bg-primary/40',\n header.column.getIsResizing() && 'bg-primary',\n )}\n aria-hidden=\"true\"\n />\n )}\n </TableHead>\n ))}\n </TableRow>\n ))}\n </TableHeader>\n <TableBody>\n {showSkeletons ? (\n Array.from({ length: pagination.pageSize }, (_, i) => (\n // `aria-busy` marks these as placeholders: one is\n // rendered per page slot, so anything counting\n // rows (assistive tech, tests) would otherwise\n // read a full page of data that hasn't arrived.\n <TableRow\n key={`skel-${i}`}\n aria-busy=\"true\"\n className=\"pointer-events-none\"\n >\n {table.getVisibleLeafColumns().map((col, j) => (\n <TableCell\n key={col.id}\n style={{ width: sizeOf(col.id, col.getSize()) }}\n className={cn(\n col.id === '_actions' &&\n 'sticky right-0 z-10 bg-card px-1 shadow-[-4px_0_8px_-6px_rgba(0,0,0,0.15)]',\n )}\n >\n {col.id === '_select' ? (\n <Skeleton className=\"h-4 w-4 rounded\"/>\n ) : col.id === '_actions' ? (\n <Skeleton className=\"h-8 w-8 rounded\"/>\n ) : (\n <Skeleton className={`h-4 ${SKEL_WIDTHS[(i * 3 + j) % SKEL_WIDTHS.length]}`}/>\n )}\n </TableCell>\n ))}\n </TableRow>\n ))\n ) : records.isError ? (\n <TableRow>\n <TableCell colSpan={columns.length} className=\"py-8\">\n <div className=\"sticky left-4 w-fit text-destructive\">\n {t('common:loadFailed', { error: String(records.error) })}\n </div>\n </TableCell>\n </TableRow>\n ) : (\n table.getRowModel().rows.map((row) => (\n <TableRow\n key={row.id}\n data-state={row.getIsSelected() && 'selected'}\n className=\"group cursor-pointer\"\n onClick={(e) => {\n const target = e.target as HTMLElement\n if (target.closest('a, button, [role=\"menuitem\"], [role=\"checkbox\"]')) return\n if (disableRowNavigation) {\n row.toggleSelected(!row.getIsSelected())\n return\n }\n navigate({ name: 'edit', resourceId, recordId: row.original.id })\n }}\n onAuxClick={(e) => {\n if (e.button !== 1) return\n const target = e.target as HTMLElement\n if (target.closest('a, button, [role=\"menuitem\"]')) return\n if (disableRowNavigation) return\n e.preventDefault()\n openInNewTab({ name: 'edit', resourceId, recordId: row.original.id })\n }}\n onMouseDown={(e) => {\n if (e.button === 1) {\n const target = e.target as HTMLElement\n if (target.closest('a, button, [role=\"menuitem\"]')) return\n e.preventDefault()\n }\n }}\n >\n {row.getVisibleCells().map((cell) => (\n <TableCell\n key={cell.id}\n style={{ width: sizeOf(cell.column.id, cell.column.getSize()) }}\n className={cn(\n 'overflow-hidden',\n cell.column.id === '_actions' &&\n 'sticky right-0 z-10 bg-card px-1 shadow-[-4px_0_8px_-6px_rgba(0,0,0,0.15)] group-hover:bg-muted group-data-[state=selected]:bg-muted',\n )}\n >\n {flexRender(cell.column.columnDef.cell, cell.getContext())}\n </TableCell>\n ))}\n </TableRow>\n ))\n )}\n </TableBody>\n </table>\n {/* Vertical guide line follows the cursor while a column is being\n resized. Position is computed from rendered (boosted) widths. */}\n {resizingHeader && (\n <div\n aria-hidden=\"true\"\n className=\"pointer-events-none absolute top-0 z-20 h-full w-px bg-primary\"\n style={{ left: resizeLeft }}\n />\n )}\n </div>\n )\n })()}\n </div>\n </>\n )}\n </ContentEl>\n </>\n )\n\n return (\n <div className={cn('flex flex-col', f.card ? 'min-h-full' : 'h-full')}>\n {f.breadcrumbs && (\n <PageBreadcrumbs\n className=\"mb-2 sm:mb-4\"\n items={[homeCrumb(t('common:home')), { label: resource.name }]}\n />\n )}\n {f.card ? (\n <Card className=\"flex flex-1 flex-col\">{inner}</Card>\n ) : (\n // Embedded mode (e.g. picker dialog): the table area scrolls\n // internally so the paginator below can sit flush at the host's\n // bottom edge, full-width, without a scrollbar gutter eating its\n // right side. `min-h-0` is required for `flex-1 overflow-y-auto`\n // inside a flex column to actually constrain its height. Horizontal\n // + top padding lives on the scroll container — the paginator is\n // a sibling so it stays edge-to-edge.\n <div\n className={cn(\n 'flex min-h-0 flex-1 flex-col',\n // `embedPadding` doubles as the \"self-contained scroll box\" flag:\n // the picker dialog is a fixed-height host, so the table area\n // scrolls internally (`overflow-y-auto`) with its own padding.\n // The related-records embed flows in the page — no internal\n // vertical scroll, no padding — so the host scrollbar is the\n // only one and the vertical gutter here disappears.\n embedPadding && 'overflow-y-auto px-6 pt-4',\n )}\n >\n {inner}\n </div>\n )}\n {!isEmpty && (\n // Standalone page mode: sticky at the page-wrapper level so the\n // paginator pins to the viewport bottom while the user scrolls\n // through the list. The bar extends edge-to-edge via negative\n // margins that exactly cancel the main scroll-container padding\n // (`px-4 sm:px-6`) so it sits flush against the screen edges with\n // no visible gutter. Right padding (`pr-14 sm:pr-16`) reserves\n // space for the floating AI assistant widget (`fixed bottom-4\n // right-4`, ~40px wide) so pagination buttons never slide under\n // it. A top shadow lifts the bar visually off the table when the\n // user is mid-scroll.\n //\n // Embedded mode (`card: false`, e.g. picker dialog): plain flex\n // child below the scrollable table area. No sticky, no scrollbar\n // gutter interference — the bar spans the host's full width and\n // sits directly above whatever the host renders next (e.g.\n // DialogFooter).\n <div\n className={cn(\n 'border-t border-border bg-card py-3',\n f.card\n ? 'sticky bottom-0 -mb-px z-20 -mx-2 mt-0 px-2 pr-14 shadow-[0_-4px_8px_-6px_rgba(0,0,0,0.08)] sm:-mx-6 sm:px-6 sm:pr-16'\n : cn('shrink-0', embedPadding && 'px-6'),\n )}\n >\n <Paginator table={table} total={total} t={t}/>\n </div>\n )}\n </div>\n )\n}\n\nfunction SortHeader({\n property,\n state,\n onSort,\n}: {\n property: PropertyJSON\n state: 'none' | 'asc' | 'desc'\n onSort(): void\n}): React.ReactElement {\n if (!property.isSortable) {\n return <span className=\"font-semibold\">{property.label}</span>\n }\n const Icon = state === 'asc' ? ArrowUp : state === 'desc' ? ArrowDown : ArrowUpDown\n return (\n <button\n type=\"button\"\n onClick={onSort}\n className=\"-ml-2 inline-flex h-8 items-center gap-1 rounded-md px-2 font-semibold hover:bg-accent hover:text-accent-foreground\"\n >\n {property.label}\n <Icon className=\"size-3.5 opacity-60\"/>\n </button>\n )\n}\n\nfunction CellContent({\n resourceId,\n recordId,\n property,\n value,\n populated,\n}: {\n resourceId: string\n recordId: string\n property: PropertyJSON\n value: unknown\n populated?: Record<string, unknown>\n}): React.ReactElement {\n if (property.isId) {\n return (\n <Link\n to={{ name: 'show', resourceId, recordId }}\n className=\"font-mono text-sm font-medium text-foreground hover:underline\"\n onClick={(e) => e.stopPropagation()}\n >\n {String(value ?? '')}\n </Link>\n )\n }\n // m2m properties also set `reference` + `isArray`, but their value is an\n // array of `{ id, ...extras }` objects — not scalar FKs. Hand them off to\n // PropertyDisplay so its dedicated `case 'm2m'` branch can extract ids.\n if (property.reference && property.type !== 'm2m' && value != null && value !== '') {\n if (property.isArray) {\n const ids = Array.isArray(value) ? (value as Array<string | number>) : []\n return (\n <ReferenceLinkList\n resourceId={property.reference}\n recordIds={ids}\n populated={populated}\n populatedKeyPrefix={property.path}\n />\n )\n }\n // The list endpoint pre-populates scalar references in batch\n // (`record.populated[property.path]`), so we hand the inline record to\n // <ReferenceLink> and avoid the per-row `show` request.\n const populatedRecord = populated?.[property.path] as\n | { id?: string; title?: string }\n | undefined\n return (\n <ReferenceLink\n resourceId={property.reference}\n recordId={value as string | number}\n populated={populatedRecord}\n />\n )\n }\n return <PropertyDisplay property={property} value={value} view=\"list\" populated={populated}/>\n}\n\nfunction RowActions({\n record,\n onView,\n onEdit,\n onDelete,\n onInvokeAction,\n customActions = [],\n t,\n}: {\n /** Drives per-row visibility via `record.recordActions` — the server's\n * `isVisible`/`isAccessible` verdict for this specific row. */\n record: RecordJSON\n onView(): void\n onEdit(): void\n onDelete(): void\n onInvokeAction?(action: ActionDescriptor): void\n customActions?: ActionDescriptor[]\n t: (key: string, params?: Record<string, string | number>) => string\n}): React.ReactElement {\n const rowActions = visibleRecordActions(customActions, record)\n const canShow = isActionAllowedForRecord('show', record)\n const canEdit = isActionAllowedForRecord('edit', record)\n const canDelete = isActionAllowedForRecord('delete', record)\n return (\n <div className=\"flex justify-end\" onClick={(e) => e.stopPropagation()}>\n <DropdownMenu>\n <DropdownMenuTrigger asChild>\n <Button variant=\"ghost\" size=\"icon\" className=\"size-8\">\n <MoreHorizontal className=\"size-4\"/>\n <span className=\"sr-only\">{t('common:openMenu')}</span>\n </Button>\n </DropdownMenuTrigger>\n <DropdownMenuContent align=\"end\">\n <DropdownMenuLabel>{t('common:actions')}</DropdownMenuLabel>\n {canShow && (\n <DropdownMenuItem onSelect={onView}>\n <Eye className=\"size-4\"/> {t('common:show')}\n </DropdownMenuItem>\n )}\n {canEdit && (\n <DropdownMenuItem onSelect={onEdit}>\n <Pencil className=\"size-4\"/> {t('common:edit')}\n </DropdownMenuItem>\n )}\n {rowActions.length > 0 && (\n <>\n <DropdownMenuSeparator/>\n <ActionMenuItems\n actions={rowActions}\n onAction={(action) => onInvokeAction?.(action)}\n />\n </>\n )}\n {canDelete && (\n <>\n <DropdownMenuSeparator/>\n <DropdownMenuItem onSelect={onDelete} className=\"text-destructive focus:text-destructive\">\n <Trash2 className=\"size-4\"/> {t('common:delete')}\n </DropdownMenuItem>\n </>\n )}\n </DropdownMenuContent>\n </DropdownMenu>\n </div>\n )\n}\n\nfunction ColumnVisibilityMenu({\n table,\n properties,\n t,\n}: {\n table: ListTable\n properties: PropertyJSON[]\n t: (key: string, params?: Record<string, string | number>) => string\n}): React.ReactElement {\n const labelMap = new Map(properties.map((p) => [p.path, p.label]))\n return (\n <DropdownMenu>\n <DropdownMenuTrigger asChild>\n <Button variant=\"outline\" size=\"sm\">\n <SlidersHorizontal className=\"size-4\"/>\n <span className=\"hidden sm:inline\">{t('common:columns')}</span>\n </Button>\n </DropdownMenuTrigger>\n <DropdownMenuContent align=\"end\" className=\"w-48\">\n <DropdownMenuLabel>{t('common:toggleColumns')}</DropdownMenuLabel>\n <DropdownMenuSeparator/>\n {table\n .getAllColumns()\n .filter((c) => c.getCanHide())\n .map((column) => (\n <DropdownMenuCheckboxItem\n key={column.id}\n checked={column.getIsVisible()}\n onCheckedChange={(v) => column.toggleVisibility(!!v)}\n onSelect={(e) => e.preventDefault()}\n >\n {labelMap.get(column.id) ?? column.id}\n </DropdownMenuCheckboxItem>\n ))}\n </DropdownMenuContent>\n </DropdownMenu>\n )\n}\n\n/** Sliding window of up to `windowSize` page indices centred on `pageIndex`. */\nfunction getPageRange(pageIndex: number, pageCount: number, windowSize = 10): number[] {\n if (pageCount <= 0) return []\n const half = Math.floor(windowSize / 2)\n let start = pageIndex - half\n let end = start + windowSize\n if (start < 0) {\n start = 0\n end = windowSize\n }\n if (end > pageCount) {\n end = pageCount\n start = Math.max(0, end - windowSize)\n }\n return Array.from({ length: end - start }, (_, i) => start + i)\n}\n\nfunction Paginator({\n table,\n total,\n t,\n}: {\n table: ListTable\n total: number\n t: (key: string, params?: Record<string, string | number>) => string\n}): React.ReactElement {\n const { pageIndex, pageSize } = table.state.pagination\n const pageCount = table.getPageCount()\n const pages = getPageRange(pageIndex, pageCount)\n // Click-and-drag horizontal scroll on the page-buttons row, mirroring the\n // table wrapper. Callback ref returns a cleanup so React 19 detaches the\n // pointer listeners automatically when the row unmounts.\n const paginationScrollRef = React.useCallback((el: HTMLDivElement | null) => {\n if (!el) return\n return attachDragScroll(el)\n }, [])\n const perPageSelect = (\n <Select\n value={String(pageSize)}\n onValueChange={(v) => table.setPageSize(Number(v))}\n >\n <SelectTrigger className=\"h-8 w-[72px]\">\n <SelectValue/>\n </SelectTrigger>\n <SelectContent>\n {PAGE_SIZES.map((s) => (\n <SelectItem key={s} value={String(s)}>\n {s}\n </SelectItem>\n ))}\n </SelectContent>\n </Select>\n )\n return (\n <div className=\"flex w-full min-w-0 flex-col gap-3 px-1 sm:flex-row sm:items-center sm:justify-between\">\n {/* Top row on mobile (records count + per-page select side-by-side);\n on desktop just the records-count label on the left. */}\n <div className=\"flex items-center justify-between gap-3 sm:justify-start\">\n <div className=\"text-sm text-muted-foreground\">\n {t('common:recordsCount', { count: total })}\n </div>\n {/* Mobile-only per-page select inline with records count. */}\n <div className=\"sm:hidden\">{perPageSelect}</div>\n </div>\n {/* `min-w-0` on the right block is critical: without it, the flex item\n takes its content's intrinsic width on mobile (the buttons row is\n ~460px) and overflows the panel to the left. */}\n <div className=\"flex min-w-0 flex-col items-center gap-2 sm:flex-row\">\n {/* Desktop-only per-page label + select next to the pagination buttons. */}\n <div className=\"hidden items-center gap-2 sm:flex\">\n <span className=\"text-sm text-muted-foreground\">\n {t('common:rowsPerPage')}\n </span>\n {perPageSelect}\n </div>\n {/* Page navigation — scrollable + drag-scrollable on narrow screens.\n `max-w-full` clamps to parent width so overflow-x-auto actually\n activates; without it the inner buttons row would expand the\n container instead of scrolling internally. `cursor-grab` hints the\n drag affordance; buttons keep their own `cursor-pointer`. */}\n <div ref={paginationScrollRef} className=\"max-w-full cursor-grab overflow-x-auto\">\n <div className=\"flex items-center gap-1\">\n <Button\n variant=\"outline\"\n size=\"sm\"\n onClick={() => table.setPageIndex(0)}\n disabled={!table.getCanPreviousPage()}\n aria-label={t('common:firstPage')}\n >\n <ChevronsLeft className=\"size-4\"/>\n </Button>\n <Button\n variant=\"outline\"\n size=\"sm\"\n onClick={() => table.previousPage()}\n disabled={!table.getCanPreviousPage()}\n aria-label={t('common:previousPage')}\n >\n <ChevronLeft className=\"size-4\"/>\n </Button>\n {pages.map((p) => (\n <Button\n key={p}\n variant={p === pageIndex ? 'default' : 'outline'}\n size=\"sm\"\n className=\"text-xs\"\n onClick={() => table.setPageIndex(p)}\n aria-current={p === pageIndex ? 'page' : undefined}\n >\n {p + 1}\n </Button>\n ))}\n <Button\n variant=\"outline\"\n size=\"sm\"\n onClick={() => table.nextPage()}\n disabled={!table.getCanNextPage()}\n aria-label={t('common:nextPage')}\n >\n <ChevronRight className=\"size-4\"/>\n </Button>\n <Button\n variant=\"outline\"\n size=\"sm\"\n onClick={() => table.setPageIndex(pageCount - 1)}\n disabled={!table.getCanNextPage()}\n aria-label={t('common:lastPage')}\n >\n <ChevronsRight className=\"size-4\"/>\n </Button>\n </div>\n </div>\n </div>\n </div>\n )\n}\n\n// ─── Numeric filter with operator selector ────────────────────────────────────\n\nfunction NumericFilterField({\n value,\n onChange,\n t,\n}: {\n value: string\n onChange(v: unknown): void\n t: (key: string, params?: Record<string, string | number>) => string\n}): React.ReactElement {\n const parsed = parseNumericFilter(value)\n const [op, setOp] = React.useState<NumericFilterOp>(parsed.op)\n const [from, setFrom] = React.useState(parsed.from)\n const [to, setTo] = React.useState(parsed.to)\n\n React.useEffect(() => {\n const next = parseNumericFilter(value)\n setOp(next.op)\n setFrom(next.from)\n setTo(next.to)\n }, [value])\n\n const emit = (nextOp: NumericFilterOp, nextFrom: string, nextTo: string) => {\n setOp(nextOp)\n setFrom(nextFrom)\n setTo(nextTo)\n onChange(encodeNumericFilter(nextOp, nextFrom, nextTo))\n }\n\n const handleOpChange = (nextOp: NumericFilterOp) => {\n if (NUMERIC_NULLARY.has(nextOp)) {\n emit(nextOp, '', '')\n } else {\n emit(nextOp, from, nextOp === 'between' ? to : '')\n }\n }\n\n return (\n <div className=\"space-y-2\">\n <Select value={op} onValueChange={(v) => handleOpChange(v as NumericFilterOp)}>\n <SelectTrigger className=\"h-7 text-xs\">\n <SelectValue />\n </SelectTrigger>\n <SelectContent>\n {ALL_NUMERIC_OPS.map((o) => (\n <SelectItem key={o} value={o} className=\"text-xs\">\n {t(`filter:op.${o}`)}\n </SelectItem>\n ))}\n </SelectContent>\n </Select>\n {op === 'between' ? (\n <div className=\"flex gap-2\">\n <Input\n type=\"number\"\n className=\"h-8\"\n value={from}\n placeholder={t('common:from')}\n onChange={(e) => emit('between', e.target.value, to)}\n />\n <Input\n type=\"number\"\n className=\"h-8\"\n value={to}\n placeholder={t('common:to')}\n onChange={(e) => emit('between', from, e.target.value)}\n />\n </div>\n ) : !NUMERIC_NULLARY.has(op) ? (\n <Input\n type=\"number\"\n className=\"h-8\"\n value={from}\n placeholder={t('common:any')}\n onChange={(e) => emit(op, e.target.value, '')}\n />\n ) : null}\n </div>\n )\n}\n\n// ─── Filter trigger + panel ──────────────────────────────────────────────────\n\n/** How many filter fields the panel mounts per frame. Sized so a chunk fits\n * comfortably in one frame's budget while still filling the visible part of\n * the panel on the first couple of frames. */\nconst FILTER_FIELD_MOUNT_CHUNK = 3\n\n/** Owns the filter sheet's open state, the `F` hotkey and (optionally) the\n * toolbar trigger button.\n *\n * The state deliberately lives here rather than in `ResourceListPage`: the\n * list body is a large tree (a full table plus the mobile card list), so a\n * toggle stored on the page re-rendered all of it *before* Radix could mount\n * the sheet, delaying the slide-in by 110-200ms. Keeping it in this leaf means\n * opening the panel only re-renders the trigger and the panel itself.\n *\n * Colocating the trigger with the panel is safe because the sheet renders\n * through a portal, so its position in this tree doesn't affect its layout. */\nfunction FilterControl({\n showTrigger,\n properties,\n filters,\n onChange,\n resourceId,\n t,\n}: {\n showTrigger: boolean\n properties: PropertyJSON[]\n filters: ColumnFiltersState\n onChange(next: ColumnFiltersState): void\n resourceId: string\n t: (key: string, params?: Record<string, string | number>) => string\n}): React.ReactElement {\n const [open, setOpen] = React.useState(false)\n useHotkey('f', () => setOpen((v) => !v), { description: t('common:filters') })\n\n return (\n <>\n {showTrigger && (\n <Tooltip>\n <TooltipTrigger asChild>\n <Button variant=\"outline\" size=\"sm\" onClick={() => setOpen(true)}>\n <ListFilter className=\"size-4\"/>\n <span className=\"hidden sm:inline\">{t('common:filters')}</span>\n {filters.length > 0 && (\n <Badge className=\"ml-1 h-5 rounded-full px-1.5 text-xs\">\n {filters.length}\n </Badge>\n )}\n </Button>\n </TooltipTrigger>\n <TooltipContent className=\"flex items-center gap-1.5\">\n <span>{t('common:filters')}</span>\n <Kbd>F</Kbd>\n </TooltipContent>\n </Tooltip>\n )}\n <FilterPanel\n open={open}\n onOpenChange={setOpen}\n properties={properties}\n filters={filters}\n onChange={onChange}\n resourceId={resourceId}\n t={t}\n />\n </>\n )\n}\n\n// ─── Filter panel (side sheet) ───────────────────────────────────────────────\n\nfunction FilterPanel({\n open,\n onOpenChange,\n properties,\n filters,\n onChange,\n resourceId,\n t,\n}: {\n open: boolean\n onOpenChange(open: boolean): void\n properties: PropertyJSON[]\n filters: ColumnFiltersState\n onChange(next: ColumnFiltersState): void\n resourceId: string\n t: (key: string, params?: Record<string, string | number>) => string\n}): React.ReactElement {\n const [draft, setDraft] = React.useState<ColumnFiltersState>(filters)\n React.useEffect(() => {\n if (open) setDraft(filters)\n }, [open, filters])\n const draftMap = new Map(draft.map((f) => [f.id, f.value]))\n\n // Every FilterField mounts a Select/Popover primitive and, for low-cardinality\n // string fields, a full checkbox list of distinct values — ~830 DOM nodes and\n // ~170ms of render for a typical resource. Mounting them all in one pass\n // stalled the sheet's slide-in: first while blocking the click handler, then\n // (once deferred) as a single un-interruptible commit mid-animation.\n //\n // So they mount a few per frame instead. Fields not yet mounted render as\n // skeletons of the same shape, and the whole list is in the DOM within a\n // handful of frames — no field is permanently withheld, which keeps\n // find-in-page and label-based queries working.\n const [mountedCount, setMountedCount] = React.useState(0)\n React.useEffect(() => {\n if (!open) {\n setMountedCount(0)\n return\n }\n if (mountedCount >= properties.length) return\n const id = requestAnimationFrame(() => {\n React.startTransition(() => {\n setMountedCount((n) => Math.min(n + FILTER_FIELD_MOUNT_CHUNK, properties.length))\n })\n })\n return () => cancelAnimationFrame(id)\n }, [open, mountedCount, properties.length])\n\n const setDraftFilter = (id: string, value: unknown) => {\n const without = draft.filter((f) => f.id !== id)\n setDraft(value != null && value !== '' ? [...without, { id, value }] : without)\n }\n\n const handleApply = () => {\n onChange(draft)\n onOpenChange(false)\n }\n\n const handleClearAll = () => {\n setDraft([])\n onChange([])\n }\n\n return (\n <Sheet open={open} onOpenChange={onOpenChange}>\n <SheetContent\n side=\"right\"\n className=\"flex w-full flex-col gap-0 p-0 sm:max-w-md\"\n aria-describedby={undefined}\n >\n <SheetHeader\n className=\"flex-none flex-row items-center justify-between space-y-0 border-b border-border px-4 py-3 pr-12\">\n <div className=\"flex items-center gap-2\">\n <SheetTitle>{t('common:filters')}</SheetTitle>\n {draft.length > 0 && (\n <Badge className=\"h-5 rounded-full px-1.5 text-xs\">{draft.length}</Badge>\n )}\n </div>\n {draft.length > 0 && (\n <Button variant=\"ghost\" size=\"sm\" onClick={handleClearAll}>\n {t('common:clearAll')}\n </Button>\n )}\n </SheetHeader>\n\n <ScrollArea className=\"min-h-0 flex-1\">\n <div className=\"space-y-5 px-4 py-4\">\n {properties.map((p, i) =>\n i < mountedCount ? (\n <FilterField\n key={p.path}\n property={p}\n value={draftMap.get(p.path) as string | undefined}\n onChange={(v) => setDraftFilter(p.path, v)}\n valueFrom={draftMap.get(p.path + '~~from') as string | undefined}\n valueTo={draftMap.get(p.path + '~~to') as string | undefined}\n onChangeFrom={(v) => setDraftFilter(p.path + '~~from', v)}\n onChangeTo={(v) => setDraftFilter(p.path + '~~to', v)}\n resourceId={resourceId}\n t={t}\n />\n ) : (\n <div key={p.path} className=\"space-y-1.5\">\n <Skeleton className=\"h-4 w-24\"/>\n <Skeleton className=\"h-8 w-full\"/>\n </div>\n ),\n )}\n </div>\n </ScrollArea>\n\n <div className=\"flex flex-none border-t border-border p-4\">\n <Button className=\"w-full\" onClick={handleApply}>\n {t('common:applyFilters')}\n </Button>\n </div>\n </SheetContent>\n </Sheet>\n )\n}\n\n// ─── Filter field (generic wrapper per property) ─────────────────────────────\n\nfunction FilterField({\n property,\n value,\n onChange,\n valueFrom,\n valueTo,\n onChangeFrom,\n onChangeTo,\n resourceId,\n t,\n}: {\n property: PropertyJSON\n value: string | undefined\n onChange(v: unknown): void\n valueFrom?: string\n valueTo?: string\n onChangeFrom?(v: unknown): void\n onChangeTo?(v: unknown): void\n resourceId: string\n t: (key: string, params?: Record<string, string | number>) => string\n}): React.ReactElement {\n const isDateType = property.type === 'date' || property.type === 'datetime'\n return (\n <div className=\"space-y-1.5\">\n <Label className=\"text-sm font-medium\">{property.label}</Label>\n {isDateType ? (\n <DateRangeFilter\n mode={property.type as 'date' | 'datetime'}\n from={valueFrom}\n to={valueTo}\n onFromChange={onChangeFrom ?? onChange}\n onToChange={onChangeTo ?? onChange}\n t={t}\n />\n ) : (\n <FilterInput\n property={property}\n value={value ?? ''}\n onChange={onChange}\n resourceId={resourceId}\n t={t}\n />\n )}\n </div>\n )\n}\n\nfunction DateRangeFilter({\n mode,\n from,\n to,\n onFromChange,\n onToChange,\n t,\n}: {\n mode: 'date' | 'datetime'\n from: string | undefined\n to: string | undefined\n onFromChange(v: unknown): void\n onToChange(v: unknown): void\n t: (key: string, params?: Record<string, string | number>) => string\n}): React.ReactElement {\n return (\n <div className=\"space-y-2\">\n <div className=\"space-y-1\">\n <span className=\"text-xs text-muted-foreground\">{t('common:from')}</span>\n <DatePicker\n mode={mode}\n value={from ?? ''}\n onChange={(v) => onFromChange(v)}\n ariaLabel={t('common:from')}\n />\n </div>\n <div className=\"space-y-1\">\n <span className=\"text-xs text-muted-foreground\">{t('common:to')}</span>\n <DatePicker\n mode={mode}\n value={to ?? ''}\n onChange={(v) => onToChange(v)}\n ariaLabel={t('common:to')}\n />\n </div>\n </div>\n )\n}\n\n// ─── Filter input (dispatches to type-specific UIs) ──────────────────────────\n\nfunction FilterInput({\n property,\n value,\n onChange,\n resourceId,\n t,\n}: {\n property: PropertyJSON\n value: string\n onChange(v: unknown): void\n resourceId: string\n t: (key: string, params?: Record<string, string | number>) => string\n}): React.ReactElement {\n // Reference field → combobox backed by the referenced resource's search action\n if (property.reference && !property.isArray) {\n return (\n <ReferenceCombobox\n referenceResourceId={property.reference}\n value={value || null}\n onChange={(v) => onChange(v ?? '')}\n placeholder={t('common:any')}\n />\n )\n }\n\n // Enum / available values → Select\n if (property.availableValues?.length) {\n return (\n <Select value={value || '_any_'} onValueChange={(v) => onChange(v === '_any_' ? '' : v)}>\n <SelectTrigger className=\"h-8\">\n <SelectValue placeholder={t('common:any')}/>\n </SelectTrigger>\n <SelectContent>\n <SelectItem value=\"_any_\">{t('common:any')}</SelectItem>\n {property.availableValues.map((opt) => (\n <SelectItem key={opt.value} value={opt.value}>\n {opt.label}\n </SelectItem>\n ))}\n </SelectContent>\n </Select>\n )\n }\n\n switch (property.type) {\n case 'boolean':\n return (\n <Select value={value || '_any_'} onValueChange={(v) => onChange(v === '_any_' ? '' : v)}>\n <SelectTrigger className=\"h-8\">\n <SelectValue placeholder={t('common:any')}/>\n </SelectTrigger>\n <SelectContent>\n <SelectItem value=\"_any_\">{t('common:any')}</SelectItem>\n <SelectItem value=\"true\">{t('common:yes')}</SelectItem>\n <SelectItem value=\"false\">{t('common:no')}</SelectItem>\n </SelectContent>\n </Select>\n )\n case 'number':\n case 'float':\n case 'money':\n case 'currency':\n return (\n <NumericFilterField\n value={value}\n onChange={onChange}\n t={t}\n />\n )\n default:\n return (\n <StringFilterField\n property={property}\n value={value}\n onChange={onChange}\n resourceId={resourceId}\n t={t}\n />\n )\n }\n}\n\n// ─── String filter with operator selector + value picker ─────────────────────\n\nfunction StringFilterField({\n property,\n value,\n onChange,\n resourceId,\n t,\n}: {\n property: PropertyJSON\n value: string\n onChange(v: unknown): void\n resourceId: string\n t: (key: string, params?: Record<string, string | number>) => string\n}): React.ReactElement {\n const parsed = parseFilterString(value)\n const [op, setOp] = React.useState<StringFilterOp>(parsed.op)\n const [val, setVal] = React.useState(parsed.val)\n\n // Sync local state when external value changes (e.g. from URL update).\n React.useEffect(() => {\n const next = parseFilterString(value)\n setOp(next.op)\n setVal(next.val)\n }, [value])\n\n // Auto-detect: fetch distinct values to see if field is low-cardinality.\n const { data: distinctData } = useDistinctValues(resourceId, property.path, {\n limit: 101,\n })\n const isLowCardinality = distinctData != null && !distinctData.hasMore\n const distinctValues = distinctData?.values ?? []\n\n // Default to \"is one of\" only for fields with few distinct values; fields with\n // more choices default to \"contains\" (free-text) since a long checkbox list is\n // unwieldy. An *empty* distinct list is not \"low cardinality\" — adapters\n // return no values for non-string columns (uuid, FK ids), and switching those\n // to a checkbox picker with nothing to check leaves the user unable to type\n // the value they came to filter by.\n const shouldDefaultToOneOf =\n isLowCardinality\n && distinctValues.length > 0\n && distinctValues.length <= ONE_OF_DEFAULT_MAX\n\n // If few distinct values, no existing filter, and default op (co with empty\n // val): auto-switch to \"is one of\" mode to match Metabase behavior.\n const autoSwitchedRef = React.useRef(false)\n React.useEffect(() => {\n if (autoSwitchedRef.current) return\n if (shouldDefaultToOneOf && !value && op === 'co' && val === '') {\n autoSwitchedRef.current = true\n setOp('in')\n }\n }, [shouldDefaultToOneOf, value, op, val])\n\n const emit = (nextOp: StringFilterOp, nextVal: string) => {\n setOp(nextOp)\n setVal(nextVal)\n onChange(encodeFilter(nextOp, nextVal))\n }\n\n const handleOpChange = (nextOp: StringFilterOp) => {\n if (NULLARY_OPS.has(nextOp)) {\n emit(nextOp, '')\n } else if (nextOp === 'in') {\n // Switching to multi-select: clear text value\n emit(nextOp, '')\n } else {\n // Switching from multi-select to text: clear value\n emit(nextOp, op === 'in' ? '' : val)\n }\n }\n\n return (\n <div className=\"space-y-2\">\n {/* Operator selector */}\n <Select value={op} onValueChange={(v) => handleOpChange(v as StringFilterOp)}>\n <SelectTrigger className=\"h-7 text-xs\">\n <SelectValue/>\n </SelectTrigger>\n <SelectContent>\n {ALL_STRING_OPS.map((o) => (\n <SelectItem key={o} value={o} className=\"text-xs\">\n {t(`filter:op.${o}`)}\n </SelectItem>\n ))}\n </SelectContent>\n </Select>\n\n {/* Value input based on operator */}\n {op === 'in' ? (\n <FilterValuePicker\n resourceId={resourceId}\n field={property.path}\n selected={val ? val.split(',') : []}\n onChange={(selected) => emit('in', selected.join(','))}\n preloadedValues={isLowCardinality ? distinctValues : undefined}\n t={t}\n />\n ) : !NULLARY_OPS.has(op) ? (\n <Input\n className=\"h-8\"\n value={val}\n placeholder={t('common:filterPlaceholder')}\n onChange={(e) => emit(op, e.target.value)}\n />\n ) : null}\n </div>\n )\n}\n\n// ─── Value picker (checkbox list with search, Metabase-style) ────────────────\n\nfunction FilterValuePicker({\n resourceId,\n field,\n selected,\n onChange,\n preloadedValues,\n t,\n}: {\n resourceId: string\n field: string\n selected: string[]\n onChange(selected: string[]): void\n /** Pre-fetched values for low-cardinality fields (avoids duplicate request). */\n preloadedValues?: string[]\n t: (key: string, params?: Record<string, string | number>) => string\n}): React.ReactElement {\n const [search, setSearch] = React.useState('')\n const selectedSet = React.useMemo(() => new Set(selected), [selected])\n\n // Fetch values from server (skipped when preloaded values are available).\n const needsServerSearch = preloadedValues == null\n const { data: serverData, isLoading } = useDistinctValues(\n resourceId,\n field,\n { search: needsServerSearch ? search : undefined, limit: 100, enabled: needsServerSearch },\n )\n\n // Client-side filter when using preloaded values, falling back to the\n // server-fetched distinct values otherwise.\n const displayValues = React.useMemo(() => {\n const allValues = preloadedValues ?? serverData?.values ?? []\n if (!preloadedValues || !search) return allValues\n const lower = search.toLowerCase()\n return allValues.filter((v) => v.toLowerCase().includes(lower))\n }, [preloadedValues, serverData?.values, search])\n\n const toggle = (val: string) => {\n if (selectedSet.has(val)) {\n onChange(selected.filter((v) => v !== val))\n } else {\n onChange([...selected, val])\n }\n }\n\n const handleSelectAll = () => {\n const allSelected = displayValues.length > 0 && displayValues.every((v) => selectedSet.has(v))\n if (allSelected) {\n // Deselect all currently visible values\n const visibleSet = new Set(displayValues)\n onChange(selected.filter((v) => !visibleSet.has(v)))\n } else {\n const allSet = new Set([...selected, ...displayValues])\n onChange(Array.from(allSet))\n }\n }\n\n return (\n <div className=\"space-y-2\">\n {/* Search input */}\n <div className=\"relative\">\n <Search\n className=\"pointer-events-none absolute left-2 top-1/2 size-3.5 -translate-y-1/2 text-muted-foreground\"/>\n <Input\n className=\"h-7 pl-7 text-xs\"\n value={search}\n placeholder={t('filter:searchValues')}\n onChange={(e) => setSearch(e.target.value)}\n />\n </div>\n\n {/* Select all */}\n {displayValues.length > 0 && (\n <div\n role=\"checkbox\"\n aria-checked={\n displayValues.length > 0 && displayValues.every((v) => selectedSet.has(v))\n ? true\n : displayValues.some((v) => selectedSet.has(v))\n ? 'mixed'\n : false\n }\n tabIndex={0}\n className=\"flex w-full cursor-pointer items-center gap-2 rounded px-1 py-0.5 text-xs text-muted-foreground hover:text-foreground\"\n onClick={handleSelectAll}\n onKeyDown={(e) => {\n if (e.key === 'Enter' || e.key === ' ') {\n e.preventDefault()\n handleSelectAll()\n }\n }}\n >\n <Checkbox\n className=\"pointer-events-none size-3.5\"\n tabIndex={-1}\n aria-hidden=\"true\"\n checked={\n displayValues.length > 0 && displayValues.every((v) => selectedSet.has(v))\n ? true\n : displayValues.some((v) => selectedSet.has(v))\n ? 'indeterminate'\n : false\n }\n />\n {t('filter:selectAll')}\n </div>\n )}\n\n {/* Value list */}\n <div className=\"max-h-48 overflow-y-auto\">\n <div className=\"space-y-0.5\">\n {isLoading && !preloadedValues ? (\n <div className=\"py-2 text-center text-xs text-muted-foreground\">\n {t('common:loading')}\n </div>\n ) : displayValues.length === 0 ? (\n <div className=\"py-2 text-center text-xs text-muted-foreground\">\n {t('filter:noValues')}\n </div>\n ) : (\n displayValues.map((v) => (\n <div\n key={v}\n role=\"checkbox\"\n aria-checked={selectedSet.has(v)}\n tabIndex={0}\n className=\"flex w-full cursor-pointer items-center gap-2 rounded px-1 py-0.5 text-left text-sm hover:bg-accent\"\n onClick={() => toggle(v)}\n onKeyDown={(e) => {\n if (e.key === 'Enter' || e.key === ' ') {\n e.preventDefault()\n toggle(v)\n }\n }}\n >\n <Checkbox className=\"pointer-events-none size-3.5\" tabIndex={-1} aria-hidden=\"true\" checked={selectedSet.has(v)}/>\n <span className=\"truncate\">{v}</span>\n </div>\n ))\n )}\n </div>\n </div>\n\n {/* Selected count */}\n {selected.length > 0 && (\n <div className=\"text-xs text-muted-foreground\">\n {t('common:selectedCount', { count: selected.length })}\n </div>\n )}\n </div>\n )\n}\n\n// ─── Per-column filter popover in table header ───────────────────────────────\n// A magnifying-glass icon sits next to the sort label. Clicking it opens a\n// Popover with the same full filter controls as the side panel (FilterField).\n// The icon is highlighted when a filter for this column is active.\nfunction ColumnFilterPopover({\n property,\n getFilters,\n onApply,\n resourceId,\n t,\n}: {\n property: PropertyJSON\n getFilters(): ColumnFiltersState\n onApply(updates: Record<string, string>): void\n resourceId: string\n t: (key: string, params?: Record<string, string | number>) => string\n}): React.ReactElement {\n const [open, setOpen] = React.useState(false)\n const isDateType = property.type === 'date' || property.type === 'datetime'\n\n const [value, setValue] = React.useState('')\n const [valueFrom, setValueFrom] = React.useState('')\n const [valueTo, setValueTo] = React.useState('')\n\n // Initialise draft from current URL filters each time the popover opens.\n React.useEffect(() => {\n if (!open) return\n const map = new Map(getFilters().map((f) => [f.id, String(f.value ?? '')]))\n if (isDateType) {\n setValueFrom(map.get(property.path + '~~from') ?? '')\n setValueTo(map.get(property.path + '~~to') ?? '')\n } else {\n setValue(map.get(property.path) ?? '')\n }\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [open])\n\n // Icon is highlighted when any filter for this property is set.\n const isActive = (() => {\n const map = new Map(getFilters().map((f) => [f.id, String(f.value ?? '')]))\n return isDateType\n ? !!(map.get(property.path + '~~from') || map.get(property.path + '~~to'))\n : !!map.get(property.path)\n })()\n\n const handleApply = () => {\n const updates: Record<string, string> = {}\n if (isDateType) {\n updates[property.path + '~~from'] = valueFrom\n updates[property.path + '~~to'] = valueTo\n } else {\n updates[property.path] = value\n }\n onApply(updates)\n setOpen(false)\n }\n\n const handleClear = () => {\n const updates: Record<string, string> = {}\n if (isDateType) {\n updates[property.path + '~~from'] = ''\n updates[property.path + '~~to'] = ''\n } else {\n updates[property.path] = ''\n }\n onApply(updates)\n setOpen(false)\n }\n\n return (\n <Popover open={open} onOpenChange={setOpen}>\n <PopoverTrigger asChild>\n <button\n type=\"button\"\n className={cn(\n 'inline-flex h-6 w-6 shrink-0 items-center justify-center rounded hover:bg-accent',\n isActive ? 'text-primary' : 'text-muted-foreground opacity-50 hover:opacity-100',\n )}\n aria-label={t('common:filter', { label: property.label })}\n >\n <ListFilter className=\"size-3.5\"/>\n </button>\n </PopoverTrigger>\n <PopoverContent\n className=\"max-h-[var(--radix-popover-content-available-height)] w-72 overflow-y-auto overscroll-contain border-border p-3\"\n align=\"start\"\n >\n <div className=\"space-y-3\">\n <FilterField\n property={property}\n value={value}\n onChange={(v) => setValue(String(v ?? ''))}\n valueFrom={valueFrom}\n valueTo={valueTo}\n onChangeFrom={(v) => setValueFrom(String(v ?? ''))}\n onChangeTo={(v) => setValueTo(String(v ?? ''))}\n resourceId={resourceId}\n t={t}\n />\n <div className=\"flex gap-2\">\n <Button size=\"sm\" className=\"flex-1\" onClick={handleApply}>\n {t('common:apply')}\n </Button>\n <Button size=\"sm\" variant=\"outline\" onClick={handleClear}>\n {t('common:clear')}\n </Button>\n </div>\n </div>\n </PopoverContent>\n </Popover>\n )\n}\n\n// ─── Mobile record card ──────────────────────────────────────────────────────\n// Renders a single record as a tap-to-edit card with a header (avatar + title +\n// id), a 2-column grid of property values, and a contextual menu.\nfunction RecordCard({\n record,\n properties,\n resourceId,\n showSelect,\n selected,\n onToggleSelect,\n onView,\n onEdit,\n onDelete,\n customActions = [],\n onInvokeAction,\n t,\n}: {\n record: RecordJSON\n properties: PropertyJSON[]\n resourceId: string\n showSelect: boolean\n selected: boolean\n onToggleSelect(value: boolean): void\n onView(): void\n onEdit(): void\n onDelete(): void\n customActions?: ActionDescriptor[]\n onInvokeAction?(action: ActionDescriptor): void\n t: (key: string, params?: Record<string, string | number>) => string\n}): React.ReactElement {\n const openInNewTab = useOpenInNewTab()\n const idProperty = properties.find((p) => p.isId)\n const titleProperty = properties.find((p) => !p.isId && p.type === 'string')\n const titleText =\n record.title ||\n (titleProperty ? String(record.params[titleProperty.path] ?? '') : '') ||\n `#${record.id}`\n\n // Body shows non-id, non-title properties. On mobile we want maximum\n // information density, so render up to 8 — enough to surface most fields\n // without scrolling each card.\n const bodyProps = properties\n .filter((p) => !p.isId && p.path !== titleProperty?.path)\n .slice(0, 8)\n\n // Card uses a clickable div (not <button>) because it nests interactive\n // children (the RowActions DropdownMenuTrigger and reference links). HTML\n // forbids button-in-button. Behavior is mirrored from the desktop TableRow.\n const handleKeyDown = (e: React.KeyboardEvent<HTMLDivElement>) => {\n if (e.key === 'Enter' || e.key === ' ') {\n const target = e.target as HTMLElement\n if (target.closest('a, button, [role=\"menuitem\"]')) return\n e.preventDefault()\n onEdit()\n }\n }\n const handleClick = (e: React.MouseEvent<HTMLDivElement>) => {\n const target = e.target as HTMLElement\n if (target.closest('a, button, [role=\"menuitem\"]')) return\n onEdit()\n }\n const handleAuxClick = (e: React.MouseEvent<HTMLDivElement>) => {\n if (e.button !== 1) return\n const target = e.target as HTMLElement\n if (target.closest('a, button, [role=\"menuitem\"]')) return\n e.preventDefault()\n openInNewTab({ name: 'edit', resourceId, recordId: record.id })\n }\n const handleMouseDown = (e: React.MouseEvent<HTMLDivElement>) => {\n if (e.button !== 1) return\n const target = e.target as HTMLElement\n if (target.closest('a, button, [role=\"menuitem\"]')) return\n e.preventDefault()\n }\n return (\n <div\n role=\"button\"\n tabIndex={0}\n onClick={handleClick}\n onAuxClick={handleAuxClick}\n onMouseDown={handleMouseDown}\n onKeyDown={handleKeyDown}\n data-state={selected ? 'selected' : undefined}\n className=\"block w-full cursor-pointer rounded-lg border border-border bg-card p-2.5 text-left transition-colors hover:bg-accent/40 focus:outline-none focus-visible:ring-2 focus-visible:ring-ring data-[state=selected]:border-primary/50 data-[state=selected]:bg-primary/5\"\n >\n <div className=\"flex items-start gap-2\">\n {showSelect && (\n <div\n className=\"flex flex-none items-center pt-0.5\"\n onClick={(e) => e.stopPropagation()}\n >\n <Checkbox\n checked={selected}\n onCheckedChange={(v) => onToggleSelect(!!v)}\n aria-label={t('common:selectRow')}\n />\n </div>\n )}\n <div className=\"min-w-0 flex-1\">\n <div className=\"flex items-start justify-between gap-2\">\n <div className=\"min-w-0 flex-1\">\n <div className=\"truncate text-sm font-semibold leading-tight\">{titleText}</div>\n {idProperty && (\n <div className=\"truncate text-[11px] leading-tight text-muted-foreground\">\n #{String(record.params[idProperty.path] ?? record.id)}\n </div>\n )}\n </div>\n <RowActions\n record={record}\n onView={onView}\n onEdit={onEdit}\n onDelete={onDelete}\n customActions={customActions}\n onInvokeAction={onInvokeAction}\n t={t}\n />\n </div>\n {bodyProps.length > 0 && (\n <div className=\"mt-2 grid grid-cols-2 gap-x-2 gap-y-1.5\">\n {bodyProps.map((p) => (\n <div key={p.path} className=\"min-w-0\">\n <div className=\"truncate text-[10px] uppercase tracking-wide leading-tight text-muted-foreground\">\n {p.label}\n </div>\n <div className=\"truncate text-sm leading-tight\">\n <CellContent\n resourceId={resourceId}\n recordId={record.id}\n property={p}\n value={record.params[p.path]}\n populated={record.populated}\n />\n </div>\n </div>\n ))}\n </div>\n )}\n </div>\n </div>\n </div>\n )\n}\n","// Picker dialog for many-to-many relation fields. Opens a modal containing\n// the embedded ResourceListPage of the referenced resource in \"picker\" mode\n// (controlled row selection, no row navigation, no toolbar create/export).\n// The dialog inherits the full list UX — sorting, filtering, header\n// filters, column visibility, pagination — so users can find records the\n// same way they would on the main list page.\n//\n// Selection inside the dialog is staged locally and only committed to the\n// outer form on Save, so the user can cancel without polluting the value.\n//\n// Used as an alternative to ReferenceMultiCombobox for m2m and\n// reference-array fields. Renders existing selections as removable chips\n// above the trigger button — same chip pattern as ReferenceMultiCombobox.\n\nimport * as React from 'react'\nimport {\n Badge,\n Button,\n Dialog,\n DialogContent,\n DialogFooter,\n DialogHeader,\n DialogTitle,\n cn,\n} from '@modern-admin/ui'\nimport { Plus, X } from 'lucide-react'\nimport { useQueries } from '@tanstack/react-query'\nimport { useAdminClient } from '../provider.js'\nimport { useI18n } from '../i18n.js'\nimport { useResource } from '../hooks.js'\nimport { ResourceListPage } from '../pages/list-page.js'\nimport type { ListQueryState } from '../router.js'\n\nexport interface ReferenceMultiTableDialogProps {\n referenceResourceId: string\n value: ReadonlyArray<string | number> | null | undefined\n onChange(next: Array<string | number>): void\n disabled?: boolean\n /** Label for the trigger button. Defaults to \"Pick records\". */\n triggerLabel?: string\n className?: string\n}\n\nexport function ReferenceMultiTableDialog({\n referenceResourceId,\n value,\n onChange,\n disabled,\n triggerLabel,\n className,\n}: ReferenceMultiTableDialogProps): React.ReactElement {\n const { t } = useI18n()\n const client = useAdminClient()\n const resource = useResource(referenceResourceId)\n\n const committedIds = React.useMemo(\n () => (value ?? []).map(String),\n [value],\n )\n\n const [open, setOpen] = React.useState(false)\n // Staged selection inside the dialog. Reset to committed value each time\n // the dialog opens so a previous Cancel doesn't leak state.\n const [stagedIds, setStagedIds] = React.useState<string[]>(() => committedIds)\n React.useEffect(() => {\n if (open) setStagedIds(committedIds)\n }, [open, committedIds])\n\n // Embedded list page keeps its own page/sort/filter state. Reset to\n // page 1 each open so each pick session starts fresh.\n const [query, setQuery] = React.useState<ListQueryState>({ perPage: 10 })\n React.useEffect(() => {\n if (open) setQuery({ perPage: 10 })\n }, [open])\n\n // Resolve chip labels by fetching each currently-committed record. Sharing\n // the query key with ReferenceLink keeps the cache warm — already-visible\n // chips render instantly.\n const titleQueries = useQueries({\n queries: committedIds.map((id) => ({\n queryKey: ['modern-admin', referenceResourceId, 'show', id],\n queryFn: () => client.show(referenceResourceId, id),\n staleTime: 30_000,\n })),\n })\n const chips = React.useMemo(\n () =>\n committedIds.map((id, i) => {\n const title = titleQueries[i]?.data?.record?.title\n return { id, label: title ? `${title} <${id}>` : `#${id}` }\n }),\n [committedIds, titleQueries],\n )\n\n const remove = (id: string): void => {\n onChange(committedIds.filter((x) => x !== id))\n }\n\n const handleSave = (): void => {\n onChange(stagedIds)\n setOpen(false)\n }\n\n const handleCancel = (): void => {\n setOpen(false)\n }\n\n const resolvedTriggerLabel =\n triggerLabel ??\n (committedIds.length > 0\n ? t('common:managePickRecords', { count: committedIds.length })\n : t('common:pickRecords'))\n\n return (\n <div className={cn('space-y-2', className)}>\n {chips.length > 0 && (\n <div className=\"flex flex-wrap gap-1\">\n {chips.map((c) => (\n <Badge key={c.id} variant=\"secondary\" className=\"gap-1 pr-1\">\n <span className=\"truncate\" title={c.label}>{c.label}</span>\n <button\n type=\"button\"\n aria-label={t('common:removeItem', { title: c.label })}\n disabled={disabled}\n onClick={() => remove(c.id)}\n className=\"rounded-sm opacity-60 hover:opacity-100\"\n >\n <X className=\"size-3\" />\n </button>\n </Badge>\n ))}\n </div>\n )}\n <Button\n type=\"button\"\n variant=\"outline\"\n disabled={disabled}\n onClick={() => setOpen(true)}\n className=\"w-full justify-start font-normal\"\n >\n <Plus className=\"size-4\" />\n <span className=\"truncate\">{resolvedTriggerLabel}</span>\n </Button>\n\n <Dialog open={open} onOpenChange={setOpen}>\n <DialogContent\n // Wide layout so the embedded table has room. Cap height and let\n // the body scroll independently of the footer.\n className=\"flex max-h-[90vh] w-[95vw] max-w-5xl flex-col gap-0 p-0\"\n >\n <DialogHeader className=\"border-b border-border px-6 py-4\">\n <DialogTitle>\n {t('common:pickRecordsFrom', { name: resource?.name ?? referenceResourceId })}\n </DialogTitle>\n </DialogHeader>\n {/* The list page is in embedded mode (`card: false`) so it\n manages its own internal scroll: the table area scrolls,\n the paginator sits below as a flush full-width bar. The\n body wrapper itself does NOT scroll, and `overflow-hidden`\n guarantees its children cannot bleed visually past the\n flex-1 box (and onto the DialogFooter below). */}\n <div className=\"flex min-h-0 flex-1 flex-col overflow-hidden\">\n <ResourceListPage\n resourceId={referenceResourceId}\n query={query}\n onQueryChange={setQuery}\n selectedIds={stagedIds}\n onSelectionChange={setStagedIds}\n disableRowNavigation\n features={{\n breadcrumbs: false,\n title: false,\n create: false,\n export: false,\n bulk: false,\n actions: false,\n card: false,\n }}\n />\n </div>\n <DialogFooter className=\"gap-2 border-t border-border px-6 py-4\">\n <div className=\"mr-auto text-sm text-muted-foreground self-center\">\n {t('common:selectedCount', { count: stagedIds.length })}\n </div>\n <Button variant=\"outline\" type=\"button\" onClick={handleCancel}>\n {t('common:cancel')}\n </Button>\n <Button type=\"button\" onClick={handleSave}>\n {t('common:save')}\n </Button>\n </DialogFooter>\n </DialogContent>\n </Dialog>\n </div>\n )\n}\n","// Property-type rendering: maps a PropertyJSON.type to display + form widgets.\n// Custom components registered via ComponentLoader take precedence.\n\nimport * as React from 'react'\nimport {\n Button,\n Input,\n PasswordInput,\n Textarea,\n Badge,\n FileInput,\n MultiFileInput,\n type MultiFileInputPendingItem,\n Switch,\n DatePicker,\n JsonEditor,\n JsonView,\n formatJsonValue,\n KeyValueEditor,\n KeyValueView,\n MediaPreview,\n type RichtextEditorProps,\n RichtextRender,\n Select,\n SelectContent,\n SelectItem,\n SelectTrigger,\n SelectValue,\n Tooltip,\n TooltipContent,\n TooltipTrigger,\n} from '@modern-admin/ui'\nimport { Check, Copy } from 'lucide-react'\nimport { uuidv7 } from '@modern-admin/core'\nimport { useQueries } from '@tanstack/react-query'\nimport type {\n KeyValueFieldSpec,\n PropertyDisplayProps,\n PropertyEditorProps,\n PropertyJSON,\n} from './types.js'\nimport { getPropertyExtension } from './extension-registry.js'\nimport { useAdminContext, useAdminClient } from './provider.js'\nimport { useI18n } from './i18n.js'\nimport { useNotify } from './notify.js'\nimport {\n ReferenceCombobox,\n ReferenceLink,\n ReferenceLinkList,\n ReferenceMultiCombobox,\n} from './reference.js'\nimport { ReferenceMultiTableDialog } from './components/reference-multi-table-dialog.js'\nimport { useResource } from './hooks.js'\n\n// The tiptap-based editor lives in its own async chunk (see heavy-fields.ts)\n// so record forms without richtext/markdown properties never pay for it.\n// The skeleton mirrors the editor's footprint to avoid layout shift.\nconst RichtextEditorImpl = React.lazy(() =>\n import('./heavy-fields.js').then((m) => ({ default: m.RichtextEditor })),\n)\n\nfunction LazyRichtextEditor(props: RichtextEditorProps): React.ReactElement {\n return (\n <React.Suspense\n fallback={\n <div\n role=\"status\"\n aria-busy=\"true\"\n className=\"min-h-40 w-full animate-pulse rounded-md border border-border bg-muted/30\"\n />\n }\n >\n <RichtextEditorImpl {...props} />\n </React.Suspense>\n )\n}\n\nexport const formatDate = (value: unknown, withTime = false): string => {\n if (value == null) return ''\n const pad = (n: number): string => String(n).padStart(2, '0')\n const render = (d: Date): string => {\n // datetime → YYYY-MM-DD HH:MM in the viewer's local timezone (minute\n // precision). We build the string from the local Date accessors rather\n // than toISOString(), which is always UTC.\n if (withTime) {\n return (\n `${d.getFullYear()}-${pad(d.getMonth() + 1)}-${pad(d.getDate())} ` +\n `${pad(d.getHours())}:${pad(d.getMinutes())}`\n )\n }\n // date-only → YYYY-MM-DD. Extract in UTC so a midnight-UTC calendar date\n // is not shifted to the previous day in negative-offset timezones.\n return d.toISOString().slice(0, 10)\n }\n if (value instanceof Date) {\n if (Number.isNaN(value.getTime())) return String(value)\n return render(value)\n }\n const d = new Date(String(value))\n if (Number.isNaN(d.getTime())) return String(value)\n return render(d)\n}\n\nexport const formatMoneyValue = (\n value: unknown,\n currency?: string,\n locale?: string,\n): string => {\n const amount = typeof value === 'number' ? value : Number(value)\n if (!Number.isFinite(amount)) return String(value ?? '')\n try {\n if (!currency) {\n return new Intl.NumberFormat(locale, {\n minimumFractionDigits: 2,\n maximumFractionDigits: 2,\n }).format(amount)\n }\n return new Intl.NumberFormat(locale, {\n style: 'currency',\n currency,\n minimumFractionDigits: 2,\n maximumFractionDigits: 2,\n }).format(amount)\n } catch {\n return amount.toFixed(2)\n }\n}\n\nconst normalizeHexColor = (value: unknown): string | null => {\n if (typeof value !== 'string') return null\n const trimmed = value.trim()\n return /^#(?:[0-9a-fA-F]{3}|[0-9a-fA-F]{6})$/.test(trimmed) ? trimmed : null\n}\n\nfunction CopiableDisplay({\n text,\n children,\n variant = 'inline',\n}: {\n text: string\n children: React.ReactNode\n variant?: 'inline' | 'overlay'\n}): React.ReactElement {\n const { t } = useI18n()\n const notify = useNotify()\n const [copied, setCopied] = React.useState(false)\n\n React.useEffect(() => {\n if (!copied) return\n const timer = window.setTimeout(() => setCopied(false), 3_000)\n return () => window.clearTimeout(timer)\n }, [copied])\n\n const onCopy = async (): Promise<void> => {\n try {\n await navigator.clipboard.writeText(text)\n setCopied(true)\n } catch {\n notify.error({ key: 'settings:apiKeys.notice.copyFailed' })\n }\n }\n\n const copyButton = (\n <Tooltip>\n <TooltipTrigger asChild>\n <Button\n type=\"button\"\n variant=\"ghost\"\n size=\"icon\"\n className=\"h-7 w-7 shrink-0\"\n onClick={() => void onCopy()}\n aria-label={copied ? t('settings:apiKeys.created.copied') : t('settings:apiKeys.created.copy')}\n >\n {copied ? <Check className=\"size-4 text-emerald-600\" /> : <Copy className=\"size-4\" />}\n </Button>\n </TooltipTrigger>\n <TooltipContent>\n {copied ? t('settings:apiKeys.created.copied') : t('settings:apiKeys.created.copy')}\n </TooltipContent>\n </Tooltip>\n )\n\n if (variant === 'overlay') {\n return (\n <div className=\"relative\">\n {children}\n <div className=\"absolute right-1 top-1\">{copyButton}</div>\n </div>\n )\n }\n\n return (\n <span className=\"inline-flex max-w-full items-center gap-2 align-middle\">\n <span className=\"min-w-0\">{children}</span>\n {copyButton}\n </span>\n )\n}\n\n// PropertyDisplayProps is defined in types.ts (shared with extension-registry).\n// Re-exported here for backwards compat.\nexport type { PropertyDisplayProps } from './types.js'\n\nfunction ListCellText({ children }: { children: React.ReactNode }): React.ReactElement {\n return (\n <span\n className=\"max-w-full overflow-hidden break-words text-foreground\"\n style={{\n display: '-webkit-box',\n WebkitBoxOrient: 'vertical',\n WebkitLineClamp: 5,\n whiteSpace: 'pre-wrap',\n }}\n >\n {children}\n </span>\n )\n}\n\nexport function PropertyDisplay({ property, value, view = 'list', populated }: PropertyDisplayProps): React.ReactElement | null {\n const { components } = useAdminContext()\n const { t, locale } = useI18n()\n const copiable = view === 'show' && (property.isId === true || property.custom?.copiable === true)\n const withCopy = (content: React.ReactElement): React.ReactElement =>\n copiable ? <CopiableDisplay text={String(value)}>{content}</CopiableDisplay> : content\n const componentName = property.components?.[view]\n if (componentName && components?.has(componentName)) {\n const Custom = components.get(componentName)!\n return <Custom property={property} value={value} view={view} />\n }\n if (value == null || value === '') return <span className=\"text-muted-foreground\">—</span>\n switch (property.type) {\n case 'boolean':\n return <Badge variant={value ? 'default' : 'outline'}>{value ? t('common:yes') : t('common:no')}</Badge>\n case 'date':\n case 'datetime': {\n const withTime = property.type === 'datetime'\n const formatted = formatDate(value, withTime)\n return withCopy(view === 'list' ? <ListCellText>{formatted}</ListCellText> : <span>{formatted}</span>)\n }\n case 'money': {\n const currency = typeof property.custom?.currency === 'string'\n ? property.custom.currency\n : undefined\n return withCopy(\n view === 'list'\n ? <ListCellText>{formatMoneyValue(value, currency, locale)}</ListCellText>\n : <span>{formatMoneyValue(value, currency, locale)}</span>,\n )\n }\n case 'json':\n case 'mixed':\n case 'key-value':\n if (property.keyValueFields?.length) {\n return (\n <KeyValueView\n fields={property.keyValueFields}\n value={value}\n variant={view === 'list' ? 'inline' : 'block'}\n labels={{\n emptyValue: '—',\n trueLabel: t('common:yes'),\n falseLabel: t('common:no'),\n }}\n />\n )\n }\n if (property.type === 'json' && view === 'show') {\n return (\n <CopiableDisplay text={formatJsonValue(value)} variant=\"overlay\">\n <JsonView value={value} className=\"pr-10\" />\n </CopiableDisplay>\n )\n }\n return <JsonView value={value} inline={view === 'list'} />\n\n case 'reference':\n if (property.reference) {\n if (property.isArray) {\n const ids = Array.isArray(value)\n ? (value as Array<string | number>)\n : []\n return (\n <ReferenceLinkList\n resourceId={property.reference}\n recordIds={ids}\n populated={populated}\n populatedKeyPrefix={property.path}\n />\n )\n }\n const populatedRecord = populated?.[property.path] as\n | { id?: string; title?: string }\n | undefined\n return (\n <ReferenceLink\n resourceId={property.reference}\n recordId={value as string | number}\n showIcon={view === 'show'}\n populated={populatedRecord}\n />\n )\n }\n return <Badge variant=\"secondary\">{String(value)}</Badge>\n case 'm2m': {\n const items = Array.isArray(value) ? (value as Array<Record<string, unknown>>) : []\n const m2m = property.custom?.m2m as\n | { reference: string; extraFields?: string[] }\n | undefined\n const reference = m2m?.reference ?? property.reference\n const ids = items.map((i) => String(i.id ?? ''))\n if (!reference) return <span className=\"text-muted-foreground\">—</span>\n if (items.length === 0) return <span className=\"text-muted-foreground\">—</span>\n const extras = m2m?.extraFields ?? []\n if (view === 'list' || extras.length === 0) {\n return (\n <ReferenceLinkList\n resourceId={reference}\n recordIds={ids}\n populated={populated}\n populatedKeyPrefix={property.path}\n />\n )\n }\n return (\n <div className=\"space-y-1\">\n {items.map((it) => {\n const populatedRef = populated?.[`${property.path}.${it.id}`] as\n | { id?: string; title?: string }\n | undefined\n return (\n <div key={String(it.id)} className=\"flex flex-wrap items-center gap-x-3 gap-y-1\">\n <ReferenceLink\n resourceId={reference}\n recordId={String(it.id)}\n populated={populatedRef}\n />\n {extras.map((f) =>\n it[f] != null && it[f] !== '' ? (\n <span key={f} className=\"text-xs text-muted-foreground\">\n {f}:{' '}\n <span className=\"text-foreground\">{String(it[f])}</span>\n </span>\n ) : null,\n )}\n </div>\n )\n })}\n </div>\n )\n }\n case 'richtext':\n if (view === 'show') {\n return <RichtextRender value={String(value)} format=\"html\" />\n }\n // List view: strip HTML tags for a compact preview.\n return (\n <ListCellText>\n {String(value).replace(/<[^>]*>/g, ' ').replace(/\\s+/g, ' ').trim()}\n </ListCellText>\n )\n case 'markdown':\n if (view === 'show') {\n return <RichtextRender value={String(value)} format=\"markdown\" />\n }\n return (\n <ListCellText>\n {String(value).replace(/[#>*_`~-]/g, '').replace(/\\s+/g, ' ').trim()}\n </ListCellText>\n )\n case 'textarea':\n return withCopy(\n view === 'show'\n ? <span className=\"whitespace-pre-wrap text-foreground\">{String(value)}</span>\n : <ListCellText>{String(value)}</ListCellText>,\n )\n case 'color': {\n const color = normalizeHexColor(value)\n if (!color) {\n return withCopy(view === 'list' ? <ListCellText>{String(value)}</ListCellText> : <span>{String(value)}</span>)\n }\n return withCopy(\n <span className=\"inline-flex items-center gap-2\">\n <span className=\"size-3 rounded-full border border-border\" style={{ backgroundColor: color }} />\n <span>{color.toUpperCase()}</span>\n </span>,\n )\n }\n case 'previewMedia': {\n const url = String(value)\n const labels = {\n preview: t('common:preview'),\n download: t('common:download'),\n openInNewTab: t('common:openInNewTab'),\n title: property.label || t('common:preview'),\n }\n return (\n <MediaPreview\n url={url}\n labels={labels}\n showUrl={view === 'show'}\n triggerSize=\"sm\"\n triggerVariant=\"outline\"\n />\n )\n }\n case 'file': {\n const template = property.custom?.uploadUrlTemplate as string | undefined\n const renderOne = (rawKey: string, idx?: number): React.ReactElement => {\n const url = template\n ? template.replace('{key}', rawKey)\n : rawKey.startsWith('http')\n ? rawKey\n : null\n const filename = rawKey.split('/').pop() ?? rawKey\n if (url) {\n const labels = {\n preview: t('common:preview'),\n download: t('common:download'),\n openInNewTab: t('common:openInNewTab'),\n title: filename,\n }\n return (\n <MediaPreview\n key={idx ?? rawKey}\n url={url}\n downloadName={filename}\n labels={labels}\n showUrl={view === 'show'}\n triggerSize=\"sm\"\n triggerVariant=\"outline\"\n />\n )\n }\n return (\n <span key={idx ?? rawKey} className=\"text-sm text-muted-foreground\">\n {filename}\n </span>\n )\n }\n if (Array.isArray(value)) {\n const arr = value as Array<unknown>\n if (arr.length === 0) return <span className=\"text-muted-foreground\">—</span>\n return (\n <div className=\"flex flex-wrap items-center gap-2\">\n {arr.map((v, i) => renderOne(String(v), i))}\n </div>\n )\n }\n return renderOne(String(value))\n }\n default: {\n // Check the extension registry for a custom type before falling back to plain text.\n const ext = getPropertyExtension(property.type)\n if (ext) return <ext.display property={property} value={value} view={view} populated={populated} />\n return withCopy(view === 'list' ? <ListCellText>{String(value)}</ListCellText> : <span>{String(value)}</span>)\n }\n }\n}\n\n// PropertyEditorProps is defined in types.ts (shared with extension-registry).\n// Re-exported here for backwards compat.\nexport type { PropertyEditorProps } from './types.js'\n\n// ─── File upload editor ───────────────────────────────────────────────────────\n\ninterface FilePropertyEditorProps {\n property: PropertyJSON\n value: unknown\n onChange(next: unknown): void\n disabled?: boolean\n resourceId?: string\n}\n\n/** Build the public URL for a stored key, using `{key}` substitution. */\nconst urlForKey = (key: string, template: string | undefined): string | null => {\n if (template) return template.replace('{key}', key)\n if (key.startsWith('http')) return key\n return null\n}\n\n/**\n * Local pending state for one in-flight upload. A small `id` (set on first\n * insertion and never re-used) keys the React row so progress updates do not\n * disturb the list ordering.\n */\ninterface PendingUpload {\n id: string\n name: string\n progress: number\n status: 'queued' | 'uploading' | 'error'\n error?: string\n}\n\nconst newPendingId = (): string => uuidv7()\n\nfunction FilePropertyEditor({\n property,\n value,\n onChange,\n disabled,\n resourceId,\n}: FilePropertyEditorProps): React.ReactElement {\n const client = useAdminClient()\n const { t } = useI18n()\n const isArray = Boolean(property.isArray)\n const [pending, setPending] = React.useState<PendingUpload[]>([])\n const [uploadError, setUploadError] = React.useState<string | null>(null)\n\n // Map of key → freshly-uploaded URL (so we can render previews without\n // waiting for the form to re-fetch), and the set of keys that were uploaded\n // in this editing session and have not yet been \"saved\" by submitting the\n // form. The latter is used to fire `cancelUpload` when the user removes a\n // pending file before saving.\n const [uploadedUrls, setUploadedUrls] = React.useState<Record<string, string>>({})\n const pendingKeysRef = React.useRef<Set<string>>(new Set())\n\n const template = property.custom?.uploadUrlTemplate as string | undefined\n const accept =\n (property.custom?.uploadMimeTypes as string[] | null | undefined)?.join(',') ?? undefined\n\n // Normalise current value into an array of keys for uniform handling.\n const currentKeys: string[] = React.useMemo(() => {\n if (isArray) {\n return Array.isArray(value)\n ? (value as unknown[]).flatMap((v) => (v == null || v === '' ? [] : [String(v)]))\n : []\n }\n return value == null || value === '' ? [] : [String(value)]\n }, [value, isArray])\n\n const currentKeysRef = React.useRef(currentKeys)\n React.useEffect(() => {\n currentKeysRef.current = currentKeys\n }, [currentKeys])\n\n const cancelIfPending = React.useCallback(\n (key: string): void => {\n if (!resourceId) return\n if (!pendingKeysRef.current.has(key)) return\n pendingKeysRef.current.delete(key)\n void client.cancelUpload(resourceId, property.path, key).catch(() => {\n // Best-effort — server-side TTL sweeper handles missed cancellations.\n })\n },\n [client, resourceId, property.path],\n )\n\n const startUploads = async (files: File[]): Promise<void> => {\n if (!resourceId) {\n setUploadError('resourceId is required for file upload')\n return\n }\n setUploadError(null)\n // For single-value fields, only the first file matters; the rest are\n // dropped before they ever hit the network.\n const accepted = isArray ? files : files.slice(0, 1)\n if (accepted.length === 0) return\n // Pre-allocate one pending row per file; the index correlates with the\n // upload index used by per-item callbacks.\n const ids = accepted.map(() => newPendingId())\n setPending((prev) => [\n ...prev,\n ...accepted.map((f, i) => ({\n id: ids[i]!,\n name: f.name,\n progress: 0,\n status: 'queued' as const,\n })),\n ])\n\n await client.uploadFiles(resourceId, property.path, accepted, {\n concurrency: 3,\n onItemStart: (i) => {\n setPending((prev) =>\n prev.map((p) => (p.id === ids[i] ? { ...p, status: 'uploading' } : p)),\n )\n },\n onItemProgress: (i, _f, p) => {\n setPending((prev) =>\n prev.map((row) => (row.id === ids[i] ? { ...row, progress: p.percent } : row)),\n )\n },\n onItemComplete: (i, _f, info) => {\n setPending((prev) => prev.filter((p) => p.id !== ids[i]))\n setUploadedUrls((u) => ({ ...u, [info.key]: info.url }))\n pendingKeysRef.current.add(info.key)\n if (isArray) {\n const next = [...currentKeysRef.current, info.key]\n currentKeysRef.current = next\n onChange(next)\n } else {\n // Single value: cancel any previously-staged key being replaced.\n for (const old of currentKeysRef.current) cancelIfPending(old)\n currentKeysRef.current = [info.key]\n onChange(info.key)\n }\n },\n onItemError: (i, _f, err) => {\n setPending((prev) =>\n prev.map((p) =>\n p.id === ids[i] ? { ...p, status: 'error', error: err.message } : p,\n ),\n )\n },\n })\n }\n\n const dismissPending = (id: string): void => {\n setPending((prev) => prev.filter((p) => p.id !== id))\n }\n\n const removeAt = (index: number): void => {\n const key = currentKeys[index]\n if (key) cancelIfPending(key)\n if (isArray) {\n const next = currentKeys.filter((_, i) => i !== index)\n onChange(next)\n } else {\n onChange(null)\n }\n setUploadError(null)\n }\n\n const stillUploading = pending.some((p) => p.status !== 'error')\n\n if (isArray) {\n const items = currentKeys.map((key) => ({\n value: key,\n previewUrl: uploadedUrls[key] ?? urlForKey(key, template),\n }))\n const pendingItems: MultiFileInputPendingItem[] = pending.map((p) => ({\n id: p.id,\n name: p.name,\n progress: p.status === 'error' ? undefined : p.progress,\n status: p.status,\n error: p.error,\n }))\n return (\n <MultiFileInput\n items={items}\n pendingItems={pendingItems}\n accept={accept}\n error={uploadError ?? undefined}\n disabled={disabled}\n labels={{\n chooseFiles: t('common:chooseFiles'),\n dragAndDrop: t('common:dragAndDrop'),\n chooseLink: t('common:chooseAFile'),\n addMoreLink: t('common:addMoreFiles'),\n uploading: t('common:uploading'),\n removeFile: t('common:removeFile'),\n uploadFailed: t('common:uploadFailed'),\n dismiss: t('common:dismiss'),\n }}\n onFilesSelect={(files) => {\n void startUploads(files)\n }}\n onRemove={removeAt}\n onPendingDismiss={dismissPending}\n />\n )\n }\n\n const storedKey = currentKeys[0] ?? null\n const previewUrl = storedKey ? (uploadedUrls[storedKey] ?? urlForKey(storedKey, template)) : null\n // For single-value fields we surface the latest in-flight upload's progress\n // through the simple FileInput's `uploading` flag. The detailed progress UI\n // lives in MultiFileInput.\n const activePending = pending.find((p) => p.status === 'uploading') ?? pending.find((p) => p.status === 'queued')\n const erroredPending = pending.find((p) => p.status === 'error')\n return (\n <FileInput\n value={storedKey}\n previewUrl={previewUrl}\n accept={accept}\n uploading={stillUploading}\n uploadProgress={activePending?.progress}\n uploadingName={activePending?.name}\n error={uploadError ?? erroredPending?.error ?? undefined}\n disabled={disabled}\n labels={{\n chooseFile: t('common:chooseFile'),\n dragAndDrop: t('common:dragAndDrop'),\n chooseAFile: t('common:chooseAFile'),\n uploading: t('common:uploading'),\n uploadingFile: t('common:uploadingFile'),\n removeFile: t('common:removeFile'),\n }}\n onFileSelect={(f) => {\n void startUploads([f])\n }}\n onRemove={() => removeAt(0)}\n />\n )\n}\n\n// ─── M2M editor ───────────────────────────────────────────────────────────────\n\ninterface M2MItemValue extends Record<string, unknown> {\n id: string\n}\n\n/**\n * Editor for many-to-many properties registered by `m2mFeature`. Wraps the\n * existing `ReferenceMultiCombobox` for picking referenced records, then\n * (when the relation has extra junction columns) renders a per-item row of\n * nested `PropertyEditor`s — one per extra field, typed from the junction\n * resource's own property declarations.\n */\nfunction M2MPropertyEditor({\n property,\n value,\n onChange,\n disabled,\n}: PropertyEditorProps): React.ReactElement {\n const m2m = property.custom?.m2m as\n | {\n reference: string\n through: string\n extraFields?: string[]\n }\n | undefined\n const junction = useResource(m2m?.through)\n if (!m2m?.reference) return <span className=\"text-muted-foreground\">—</span>\n const items: M2MItemValue[] = Array.isArray(value)\n ? (value as Array<Record<string, unknown>>).flatMap((entry) => {\n if (entry == null) return []\n if (typeof entry === 'string' || typeof entry === 'number') {\n return [{ id: String(entry) }]\n }\n if (typeof entry === 'object' && entry.id != null) {\n return [{ ...entry, id: String((entry as { id: unknown }).id) }]\n }\n return []\n })\n : []\n const ids = items.map((i) => String(i.id))\n const extras = m2m.extraFields ?? []\n\n const setIds = (nextIds: Array<string | number>): void => {\n const byId = new Map<string, M2MItemValue>(items.map((i) => [String(i.id), i]))\n const next = nextIds.map((rawId) => {\n const id = String(rawId)\n return byId.get(id) ?? ({ id } as M2MItemValue)\n })\n onChange(next)\n }\n\n const updateItem = (id: string, field: string, val: unknown): void => {\n onChange(items.map((it) => (String(it.id) === id ? { ...it, [field]: val } : it)))\n }\n\n // m2m relations are typically large tables, so default to the table-driven\n // dialog picker. Opt back into the combobox via `m2m.picker = 'combobox'`.\n const Picker =\n (m2m as { picker?: string } | undefined)?.picker === 'combobox'\n ? ReferenceMultiCombobox\n : ReferenceMultiTableDialog\n return (\n <div className=\"space-y-3\">\n <Picker\n referenceResourceId={m2m.reference}\n value={ids}\n onChange={setIds}\n disabled={disabled}\n />\n {extras.length > 0 && items.length > 0 ? (\n <div className=\"space-y-1.5\">\n {items.map((item) => (\n <div\n key={item.id}\n className=\"rounded-md border border-border bg-muted/30 px-2.5 py-2\"\n >\n {/* Mobile: stack reference link above the extras row.\n ≥sm: reference link gets a fixed-width slot on the left,\n extras flow inline on the right so we don't waste space. */}\n <div className=\"flex flex-col gap-2 sm:flex-row sm:items-start sm:gap-3\">\n <div className=\"min-w-0 sm:w-32 sm:shrink-0 sm:pt-1.5\">\n <ReferenceLink resourceId={m2m.reference} recordId={item.id} showIcon />\n </div>\n <div\n className={\n 'grid min-w-0 flex-1 gap-2 ' +\n (extras.length > 1 ? 'sm:grid-cols-2' : '')\n }\n >\n {extras.map((f) => {\n const junctionProp = junction?.properties.find((p) => p.path === f)\n const synthetic: PropertyJSON = junctionProp ?? {\n path: f,\n label: f,\n type: 'string',\n isId: false,\n isSortable: false,\n isRequired: false,\n isDisabled: false,\n isArray: false,\n reference: null,\n availableValues: null,\n components: {},\n visibility: { list: false, show: true, edit: true, filter: false },\n position: 1,\n custom: {},\n }\n return (\n <div key={f} className=\"flex items-center gap-2\">\n <label className=\"w-16 shrink-0 text-xs font-medium text-muted-foreground sm:w-auto\">\n {synthetic.label}\n </label>\n <div className=\"min-w-0 flex-1\">\n <PropertyEditor\n property={synthetic}\n value={item[f]}\n onChange={(v) => updateItem(String(item.id), f, v)}\n disabled={disabled}\n />\n </div>\n </div>\n )\n })}\n </div>\n </div>\n </div>\n ))}\n </div>\n ) : null}\n </div>\n )\n}\n\n// ─── KeyValue editor wrapper that resolves DB-bound autocomplete sources ────\n\n/**\n * Loads dynamic autocomplete suggestions for `keyValueFields[i].type ===\n * 'autocomplete'` fields that declare a `suggestionsResource` +\n * `suggestionsField` binding, then forwards everything to KeyValueEditor.\n *\n * Static suggestions (declared via `availableValues` on the field) are\n * already supported inside the editor itself — this wrapper only handles\n * the network-fetch side, so the UI primitive stays i18n- and\n * client-unaware.\n */\nfunction KeyValueEditorWithSuggestions({\n fields,\n value,\n onChange,\n disabled,\n}: {\n fields: ReadonlyArray<KeyValueFieldSpec>\n value: unknown\n onChange(next: Record<string, unknown>): void\n disabled?: boolean\n}): React.ReactElement {\n const client = useAdminClient()\n const { t } = useI18n()\n\n // Identify just the fields that need a network fetch. The order is\n // stable across renders (driven by the `fields` prop array) so the\n // `useQueries` array length is stable too.\n const dynamic = React.useMemo(\n () =>\n fields.filter(\n (f): f is KeyValueFieldSpec & {\n suggestionsResource: string\n suggestionsField: string\n } =>\n f.type === 'autocomplete' &&\n !!f.suggestionsResource &&\n !!f.suggestionsField,\n ),\n [fields],\n )\n\n const queries = useQueries({\n queries: dynamic.map((f) => ({\n queryKey: [\n 'modern-admin',\n 'fieldSuggestions',\n f.suggestionsResource,\n f.suggestionsField,\n 200,\n ] as const,\n queryFn: async (): Promise<string[]> => {\n const res = await client.list(f.suggestionsResource, { perPage: 200 })\n const seen = new Set<string>()\n const out: string[] = []\n for (const r of res.records) {\n const raw = r.params?.[f.suggestionsField]\n if (raw == null || raw === '') continue\n const v = String(raw)\n if (seen.has(v)) continue\n seen.add(v)\n out.push(v)\n }\n out.sort((a, b) => a.localeCompare(b))\n return out\n },\n staleTime: 60_000,\n })),\n })\n\n const suggestionsByKey: Record<string, string[]> = {}\n const suggestionsLoadingByKey: Record<string, boolean> = {}\n dynamic.forEach((f, i) => {\n suggestionsByKey[f.key] = queries[i]?.data ?? []\n suggestionsLoadingByKey[f.key] = queries[i]?.isLoading ?? false\n })\n\n return (\n <KeyValueEditor\n fields={fields}\n value={value}\n onChange={onChange}\n disabled={disabled}\n suggestionsByKey={suggestionsByKey}\n suggestionsLoadingByKey={suggestionsLoadingByKey}\n labels={{\n combobox: {\n loading: t('common:loading'),\n // KeyValueEditor's combobox label inherits the field label; this\n // is the empty-state message inside the dropdown.\n noMatches: t('keyValue:noMatches'),\n },\n }}\n />\n )\n}\n\n// ─── Generic property editor ──────────────────────────────────────────────────\n\nexport function PropertyEditor({\n property,\n value,\n onChange,\n disabled,\n resourceId,\n}: PropertyEditorProps): React.ReactElement {\n const { components } = useAdminContext()\n const { t } = useI18n()\n const componentName = property.components?.edit\n if (componentName && components?.has(componentName)) {\n const Custom = components.get(componentName)!\n return <Custom property={property} value={value} onChange={onChange} disabled={disabled} />\n }\n const stringValue = value == null ? '' : String(value)\n if (property.type === 'm2m') {\n return (\n <M2MPropertyEditor\n property={property}\n value={value}\n onChange={onChange}\n disabled={disabled}\n resourceId={resourceId}\n />\n )\n }\n if (property.reference) {\n if (property.isArray) {\n const arr = Array.isArray(value)\n ? (value as Array<string | number>)\n : []\n // Opt into the table-driven dialog picker via `custom.picker = 'dialog'`;\n // default stays as the compact combobox for plain reference arrays.\n const pickerKind = (property.custom as { picker?: string } | undefined)?.picker\n const ArrayPicker =\n pickerKind === 'dialog' ? ReferenceMultiTableDialog : ReferenceMultiCombobox\n return (\n <ArrayPicker\n referenceResourceId={property.reference}\n value={arr}\n onChange={(next) => onChange(next)}\n disabled={disabled}\n />\n )\n }\n return (\n <ReferenceCombobox\n referenceResourceId={property.reference}\n value={value as string | number | null | undefined}\n onChange={(next) => onChange(next)}\n disabled={disabled}\n />\n )\n }\n if (property.availableValues?.length) {\n return (\n <Select\n value={stringValue}\n onValueChange={(v) => onChange(v === '_empty_' ? '' : v)}\n disabled={disabled}\n >\n <SelectTrigger>\n <SelectValue placeholder=\"—\" />\n </SelectTrigger>\n <SelectContent>\n <SelectItem value=\"_empty_\">—</SelectItem>\n {property.availableValues.map((opt) => (\n <SelectItem key={opt.value} value={opt.value}>\n {opt.label}\n </SelectItem>\n ))}\n </SelectContent>\n </Select>\n )\n }\n switch (property.type) {\n case 'boolean':\n return (\n <Switch\n checked={Boolean(value)}\n onCheckedChange={(v) => onChange(Boolean(v))}\n disabled={disabled}\n />\n )\n case 'json':\n case 'mixed':\n case 'key-value':\n if (property.keyValueFields?.length) {\n return (\n <KeyValueEditorWithSuggestions\n fields={property.keyValueFields}\n value={value}\n onChange={(next) => onChange(next)}\n disabled={disabled}\n />\n )\n }\n return (\n <JsonEditor\n value={value}\n onChange={onChange}\n disabled={disabled}\n formatLabel={t('common:format')}\n invalidLabel={t('common:invalidJson')}\n />\n )\n case 'number':\n case 'float':\n case 'currency':\n case 'money':\n return (\n <Input\n type=\"number\"\n inputMode=\"decimal\"\n step=\"0.01\"\n value={stringValue}\n onChange={(e) => onChange(e.target.value === '' ? null : Number(e.target.value))}\n disabled={disabled}\n />\n )\n case 'date':\n return (\n <DatePicker\n mode=\"date\"\n value={value == null ? '' : String(value)}\n onChange={(v) => onChange(v === '' ? null : v)}\n disabled={disabled}\n ariaLabel={property.label}\n openCalendarLabel={t('common:openCalendar')}\n timeLabel={t('common:time')}\n />\n )\n case 'datetime':\n case 'datetime-local':\n return (\n <DatePicker\n mode=\"datetime\"\n value={value == null ? '' : String(value)}\n onChange={(v) => onChange(v === '' ? null : v)}\n disabled={disabled}\n ariaLabel={property.label}\n openCalendarLabel={t('common:openCalendar')}\n timeLabel={t('common:time')}\n />\n )\n case 'richtext':\n return (\n <LazyRichtextEditor\n value={stringValue}\n onChange={(v) => onChange(v)}\n format=\"html\"\n disabled={disabled}\n ariaLabelledBy={property.label}\n labels={{\n bold: t('richtext:bold'),\n italic: t('richtext:italic'),\n strikethrough: t('richtext:strikethrough'),\n inlineCode: t('richtext:inlineCode'),\n heading: t('richtext:heading'),\n bulletList: t('richtext:bulletList'),\n numberedList: t('richtext:numberedList'),\n blockquote: t('richtext:blockquote'),\n horizontalRule: t('richtext:horizontalRule'),\n insertLink: t('richtext:insertLink'),\n undo: t('richtext:undo'),\n redo: t('richtext:redo'),\n source: t('richtext:source'),\n splitView: t('richtext:splitView'),\n visualEditor: t('richtext:visualEditor'),\n fullscreen: t('richtext:fullscreen'),\n exitFullscreen: t('richtext:exitFullscreen'),\n urlPrompt: t('richtext:urlPrompt'),\n }}\n />\n )\n case 'markdown':\n return (\n <LazyRichtextEditor\n value={stringValue}\n onChange={(v) => onChange(v)}\n format=\"markdown\"\n disabled={disabled}\n ariaLabelledBy={property.label}\n labels={{\n bold: t('richtext:bold'),\n italic: t('richtext:italic'),\n strikethrough: t('richtext:strikethrough'),\n inlineCode: t('richtext:inlineCode'),\n heading: t('richtext:heading'),\n bulletList: t('richtext:bulletList'),\n numberedList: t('richtext:numberedList'),\n blockquote: t('richtext:blockquote'),\n horizontalRule: t('richtext:horizontalRule'),\n insertLink: t('richtext:insertLink'),\n undo: t('richtext:undo'),\n redo: t('richtext:redo'),\n source: t('richtext:source'),\n splitView: t('richtext:splitView'),\n visualEditor: t('richtext:visualEditor'),\n fullscreen: t('richtext:fullscreen'),\n exitFullscreen: t('richtext:exitFullscreen'),\n urlPrompt: t('richtext:urlPrompt'),\n }}\n />\n )\n case 'textarea':\n return (\n <Textarea\n value={stringValue}\n onChange={(e) => onChange(e.target.value)}\n disabled={disabled}\n rows={5}\n />\n )\n case 'password':\n return (\n <PasswordInput\n value={stringValue}\n onChange={(e) => onChange(e.target.value)}\n disabled={disabled}\n toggleLabel={{\n show: t('common:showPassword'),\n hide: t('common:hidePassword'),\n }}\n />\n )\n case 'file':\n return (\n <FilePropertyEditor\n property={property}\n value={value}\n onChange={onChange}\n disabled={disabled}\n resourceId={resourceId}\n />\n )\n case 'previewMedia':\n return (\n <Input\n type=\"url\"\n inputMode=\"url\"\n placeholder=\"https://…\"\n value={stringValue}\n onChange={(e) => onChange(e.target.value)}\n disabled={disabled}\n />\n )\n case 'color':\n return (\n <div className=\"flex items-center gap-3\">\n <Input\n type=\"color\"\n className=\"h-10 w-14 rounded-md p-1\"\n value={normalizeHexColor(value) ?? '#000000'}\n onChange={(e) => onChange(e.target.value)}\n disabled={disabled}\n />\n <Input\n value={stringValue}\n placeholder=\"#000000\"\n onChange={(e) => onChange(e.target.value)}\n disabled={disabled}\n />\n </div>\n )\n default: {\n // Check the extension registry for a custom type before falling back to a plain text input.\n const ext = getPropertyExtension(property.type)\n if (ext) return <ext.editor property={property} value={value} onChange={onChange} disabled={disabled} resourceId={resourceId} />\n return (\n <Input\n value={stringValue}\n onChange={(e) => onChange(e.target.value)}\n disabled={disabled}\n />\n )\n }\n }\n}\n"],"file":"property-renderer-ClrVnSny.js"}