@jmruthers/pace-core 0.6.2 → 0.6.4

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 (299) hide show
  1. package/CHANGELOG.md +45 -0
  2. package/cursor-rules/00-pace-core-compliance.mdc +34 -2
  3. package/dist/{AuthService-BPvc3Ka0.d.ts → AuthService-Cb34EQs3.d.ts} +9 -1
  4. package/dist/{DataTable-TPTKCX4D.js → DataTable-E7YQZD7D.js} +9 -8
  5. package/dist/{PublicPageProvider-DC6kCaqf.d.ts → PublicPageProvider-DEMpysFR.d.ts} +45 -67
  6. package/dist/{UnifiedAuthProvider-CVcTjx-d.d.ts → UnifiedAuthProvider-CKvHP1MK.d.ts} +1 -8
  7. package/dist/{UnifiedAuthProvider-CH6Z342H.js → UnifiedAuthProvider-QPXO24B4.js} +5 -4
  8. package/dist/{api-MVVQZLJI.js → api-6LVZTHDS.js} +10 -10
  9. package/dist/{audit-B5P6FFIR.js → audit-V53FV5AG.js} +2 -2
  10. package/dist/chunk-36LVWXB2.js +227 -0
  11. package/dist/chunk-36LVWXB2.js.map +1 -0
  12. package/dist/{chunk-24UVZUZG.js → chunk-3LPHPB62.js} +129 -387
  13. package/dist/chunk-3LPHPB62.js.map +1 -0
  14. package/dist/{chunk-2UOI2FG5.js → chunk-5EC5MEWX.js} +4 -4
  15. package/dist/{chunk-3XC4CPTD.js → chunk-7JPAB3T5.js} +244 -5727
  16. package/dist/chunk-7JPAB3T5.js.map +1 -0
  17. package/dist/{chunk-6J4GEEJR.js → chunk-ATKZM7RX.js} +53 -27
  18. package/dist/chunk-ATKZM7RX.js.map +1 -0
  19. package/dist/{chunk-EHMR7VYL.js → chunk-AVMLPIM7.js} +443 -189
  20. package/dist/chunk-AVMLPIM7.js.map +1 -0
  21. package/dist/chunk-DGUM43GV.js +11 -0
  22. package/dist/{chunk-NECFR5MM.js → chunk-I6DAQMWX.js} +575 -647
  23. package/dist/chunk-I6DAQMWX.js.map +1 -0
  24. package/dist/{chunk-F2IMUDXZ.js → chunk-M7MPQISP.js} +2 -2
  25. package/dist/{chunk-XWQCNGTQ.js → chunk-NN6WWZ5U.js} +173 -79
  26. package/dist/chunk-NN6WWZ5U.js.map +1 -0
  27. package/dist/{chunk-MMZ7JXPU.js → chunk-OEWDTMG7.js} +13 -21
  28. package/dist/{chunk-MMZ7JXPU.js.map → chunk-OEWDTMG7.js.map} +1 -1
  29. package/dist/{chunk-SFZUDBL5.js → chunk-YKRAFF5K.js} +70 -56
  30. package/dist/chunk-YKRAFF5K.js.map +1 -0
  31. package/dist/components.d.ts +2 -2
  32. package/dist/components.js +12 -13
  33. package/dist/contextValidator-OOPCLPZW.js +9 -0
  34. package/dist/contextValidator-OOPCLPZW.js.map +1 -0
  35. package/dist/eslint-rules/pace-core-compliance.cjs +106 -0
  36. package/dist/hooks.d.ts +2 -2
  37. package/dist/hooks.js +7 -6
  38. package/dist/hooks.js.map +1 -1
  39. package/dist/index.d.ts +7 -7
  40. package/dist/index.js +21 -16
  41. package/dist/index.js.map +1 -1
  42. package/dist/providers.d.ts +3 -3
  43. package/dist/providers.js +4 -3
  44. package/dist/rbac/index.d.ts +67 -27
  45. package/dist/rbac/index.js +15 -8
  46. package/dist/styles/index.js +1 -1
  47. package/dist/theming/runtime.js +1 -1
  48. package/dist/types.js +1 -1
  49. package/dist/{usePublicRouteParams-1oMokgLF.d.ts → usePublicRouteParams-i3qtoBgg.d.ts} +7 -16
  50. package/dist/utils.js +5 -7
  51. package/dist/utils.js.map +1 -1
  52. package/docs/api/README.md +14 -16
  53. package/docs/api/modules.md +3796 -2513
  54. package/docs/components/context-selector.md +126 -0
  55. package/docs/migration/RBAC_SCOPE_MIGRATION.md +385 -0
  56. package/docs/pace-mint-fix-auto-selection.md +218 -0
  57. package/docs/pace-mint-rbac-setup.md +391 -0
  58. package/docs/rbac/secure-client-protection.md +330 -0
  59. package/package.json +10 -5
  60. package/scripts/audit/core/checks/compliance.cjs +72 -0
  61. package/scripts/audit/core/checks/dependencies.cjs +568 -28
  62. package/scripts/audit/core/checks/documentation.cjs +68 -3
  63. package/scripts/audit/core/checks/environment.cjs +2 -14
  64. package/scripts/audit/core/checks/error-handling.cjs +47 -6
  65. package/src/components/ContextSelector/ContextSelector.tsx +384 -0
  66. package/src/components/ContextSelector/index.ts +3 -0
  67. package/src/components/DataTable/components/RowComponent.tsx +19 -19
  68. package/src/components/DataTable/components/UnifiedTableBody.tsx +2 -2
  69. package/src/components/DataTable/hooks/useDataTablePermissions.ts +8 -6
  70. package/src/components/Dialog/Dialog.tsx +29 -1
  71. package/src/components/FileDisplay/FileDisplay.tsx +42 -10
  72. package/src/components/Header/Header.test.tsx +43 -73
  73. package/src/components/Header/Header.tsx +44 -45
  74. package/src/components/PaceAppLayout/PaceAppLayout.integration.test.tsx +10 -19
  75. package/src/components/PaceAppLayout/PaceAppLayout.performance.test.tsx +2 -2
  76. package/src/components/PaceAppLayout/PaceAppLayout.security.test.tsx +5 -5
  77. package/src/components/PaceAppLayout/PaceAppLayout.test.tsx +9 -9
  78. package/src/components/PaceAppLayout/PaceAppLayout.tsx +157 -36
  79. package/src/components/PaceAppLayout/README.md +14 -17
  80. package/src/components/PaceAppLayout/test-setup.tsx +2 -2
  81. package/src/components/index.ts +5 -5
  82. package/src/eslint-rules/pace-core-compliance.cjs +106 -0
  83. package/src/hooks/__tests__/useAppConfig.unit.test.ts +4 -98
  84. package/src/hooks/useAppConfig.ts +15 -30
  85. package/src/hooks/useFileDisplay.ts +77 -50
  86. package/src/index.ts +4 -5
  87. package/src/providers/services/AuthServiceProvider.tsx +17 -7
  88. package/src/providers/services/EventServiceProvider.tsx +33 -5
  89. package/src/providers/services/UnifiedAuthProvider.tsx +90 -134
  90. package/src/rbac/__tests__/adapters.comprehensive.test.tsx +1 -1
  91. package/src/rbac/adapters.tsx +2 -2
  92. package/src/rbac/api.test.ts +59 -51
  93. package/src/rbac/api.ts +178 -132
  94. package/src/rbac/components/PagePermissionGuard.tsx +38 -10
  95. package/src/rbac/hooks/__tests__/useSecureSupabase.test.ts +32 -21
  96. package/src/rbac/hooks/permissions/useAccessLevel.ts +1 -1
  97. package/src/rbac/hooks/permissions/useCan.ts +41 -11
  98. package/src/rbac/hooks/permissions/useHasAllPermissions.ts +1 -1
  99. package/src/rbac/hooks/permissions/useHasAnyPermission.ts +1 -1
  100. package/src/rbac/hooks/permissions/useMultiplePermissions.ts +1 -1
  101. package/src/rbac/hooks/useCan.test.ts +0 -9
  102. package/src/rbac/hooks/useRBAC.test.ts +1 -5
  103. package/src/rbac/hooks/useRBAC.ts +36 -37
  104. package/src/rbac/hooks/useResolvedScope.test.ts +120 -35
  105. package/src/rbac/hooks/useResolvedScope.ts +35 -40
  106. package/src/rbac/hooks/useSecureSupabase.ts +7 -7
  107. package/src/rbac/index.ts +7 -0
  108. package/src/rbac/secureClient.test.ts +22 -18
  109. package/src/rbac/secureClient.ts +103 -16
  110. package/src/rbac/security.ts +0 -17
  111. package/src/rbac/types.ts +1 -0
  112. package/src/rbac/utils/__tests__/contextValidator.test.ts +64 -86
  113. package/src/rbac/utils/clientSecurity.ts +93 -0
  114. package/src/rbac/utils/contextValidator.ts +77 -168
  115. package/src/services/AuthService.ts +39 -7
  116. package/src/services/EventService.ts +285 -56
  117. package/src/services/OrganisationService.ts +81 -14
  118. package/src/services/__tests__/EventService.test.ts +1 -2
  119. package/src/services/base/BaseService.ts +3 -0
  120. package/src/utils/dynamic/dynamicUtils.ts +7 -4
  121. package/dist/chunk-24UVZUZG.js.map +0 -1
  122. package/dist/chunk-3XC4CPTD.js.map +0 -1
  123. package/dist/chunk-6J4GEEJR.js.map +0 -1
  124. package/dist/chunk-7D4SUZUM.js +0 -38
  125. package/dist/chunk-EHMR7VYL.js.map +0 -1
  126. package/dist/chunk-NECFR5MM.js.map +0 -1
  127. package/dist/chunk-SFZUDBL5.js.map +0 -1
  128. package/dist/chunk-XWQCNGTQ.js.map +0 -1
  129. package/docs/api/classes/ColumnFactory.md +0 -243
  130. package/docs/api/classes/InvalidScopeError.md +0 -73
  131. package/docs/api/classes/Logger.md +0 -178
  132. package/docs/api/classes/MissingUserContextError.md +0 -66
  133. package/docs/api/classes/OrganisationContextRequiredError.md +0 -66
  134. package/docs/api/classes/PermissionDeniedError.md +0 -73
  135. package/docs/api/classes/RBACAuditManager.md +0 -297
  136. package/docs/api/classes/RBACCache.md +0 -322
  137. package/docs/api/classes/RBACEngine.md +0 -171
  138. package/docs/api/classes/RBACError.md +0 -76
  139. package/docs/api/classes/RBACNotInitializedError.md +0 -66
  140. package/docs/api/classes/SecureSupabaseClient.md +0 -163
  141. package/docs/api/classes/StorageUtils.md +0 -328
  142. package/docs/api/enums/FileCategory.md +0 -184
  143. package/docs/api/enums/LogLevel.md +0 -54
  144. package/docs/api/enums/RBACErrorCode.md +0 -228
  145. package/docs/api/enums/RPCFunction.md +0 -118
  146. package/docs/api/interfaces/AddressFieldProps.md +0 -241
  147. package/docs/api/interfaces/AddressFieldRef.md +0 -94
  148. package/docs/api/interfaces/AggregateConfig.md +0 -43
  149. package/docs/api/interfaces/AutocompleteOptions.md +0 -75
  150. package/docs/api/interfaces/AvatarProps.md +0 -128
  151. package/docs/api/interfaces/BadgeProps.md +0 -34
  152. package/docs/api/interfaces/ButtonProps.md +0 -56
  153. package/docs/api/interfaces/CalendarProps.md +0 -73
  154. package/docs/api/interfaces/CardProps.md +0 -69
  155. package/docs/api/interfaces/ColorPalette.md +0 -7
  156. package/docs/api/interfaces/ColorShade.md +0 -66
  157. package/docs/api/interfaces/ComplianceResult.md +0 -30
  158. package/docs/api/interfaces/DataAccessRecord.md +0 -96
  159. package/docs/api/interfaces/DataRecord.md +0 -11
  160. package/docs/api/interfaces/DataTableAction.md +0 -252
  161. package/docs/api/interfaces/DataTableColumn.md +0 -504
  162. package/docs/api/interfaces/DataTableProps.md +0 -625
  163. package/docs/api/interfaces/DataTableToolbarButton.md +0 -96
  164. package/docs/api/interfaces/DatabaseComplianceResult.md +0 -85
  165. package/docs/api/interfaces/DatabaseIssue.md +0 -41
  166. package/docs/api/interfaces/EmptyStateConfig.md +0 -61
  167. package/docs/api/interfaces/EnhancedNavigationMenuProps.md +0 -235
  168. package/docs/api/interfaces/ErrorBoundaryProps.md +0 -147
  169. package/docs/api/interfaces/ErrorBoundaryProviderProps.md +0 -36
  170. package/docs/api/interfaces/ErrorBoundaryState.md +0 -75
  171. package/docs/api/interfaces/EventAppRoleData.md +0 -71
  172. package/docs/api/interfaces/ExportColumn.md +0 -90
  173. package/docs/api/interfaces/ExportOptions.md +0 -126
  174. package/docs/api/interfaces/FileDisplayProps.md +0 -249
  175. package/docs/api/interfaces/FileMetadata.md +0 -129
  176. package/docs/api/interfaces/FileReference.md +0 -118
  177. package/docs/api/interfaces/FileSizeLimits.md +0 -7
  178. package/docs/api/interfaces/FileUploadOptions.md +0 -139
  179. package/docs/api/interfaces/FileUploadProps.md +0 -296
  180. package/docs/api/interfaces/FooterProps.md +0 -107
  181. package/docs/api/interfaces/FormFieldProps.md +0 -166
  182. package/docs/api/interfaces/FormProps.md +0 -113
  183. package/docs/api/interfaces/GrantEventAppRoleParams.md +0 -122
  184. package/docs/api/interfaces/InactivityWarningModalProps.md +0 -115
  185. package/docs/api/interfaces/InputProps.md +0 -56
  186. package/docs/api/interfaces/LabelProps.md +0 -107
  187. package/docs/api/interfaces/LoggerConfig.md +0 -62
  188. package/docs/api/interfaces/LoginFormProps.md +0 -187
  189. package/docs/api/interfaces/NavigationAccessRecord.md +0 -107
  190. package/docs/api/interfaces/NavigationContextType.md +0 -164
  191. package/docs/api/interfaces/NavigationGuardProps.md +0 -139
  192. package/docs/api/interfaces/NavigationItem.md +0 -120
  193. package/docs/api/interfaces/NavigationMenuProps.md +0 -221
  194. package/docs/api/interfaces/NavigationProviderProps.md +0 -117
  195. package/docs/api/interfaces/Organisation.md +0 -140
  196. package/docs/api/interfaces/OrganisationContextType.md +0 -388
  197. package/docs/api/interfaces/OrganisationMembership.md +0 -140
  198. package/docs/api/interfaces/OrganisationProviderProps.md +0 -76
  199. package/docs/api/interfaces/OrganisationSecurityError.md +0 -62
  200. package/docs/api/interfaces/PaceAppLayoutProps.md +0 -409
  201. package/docs/api/interfaces/PaceLoginPageProps.md +0 -49
  202. package/docs/api/interfaces/PageAccessRecord.md +0 -85
  203. package/docs/api/interfaces/PagePermissionContextType.md +0 -140
  204. package/docs/api/interfaces/PagePermissionGuardProps.md +0 -153
  205. package/docs/api/interfaces/PagePermissionProviderProps.md +0 -119
  206. package/docs/api/interfaces/PaletteData.md +0 -41
  207. package/docs/api/interfaces/ParsedAddress.md +0 -120
  208. package/docs/api/interfaces/PermissionEnforcerProps.md +0 -153
  209. package/docs/api/interfaces/ProgressProps.md +0 -42
  210. package/docs/api/interfaces/ProtectedRouteProps.md +0 -78
  211. package/docs/api/interfaces/PublicPageFooterProps.md +0 -112
  212. package/docs/api/interfaces/PublicPageHeaderProps.md +0 -125
  213. package/docs/api/interfaces/PublicPageLayoutProps.md +0 -185
  214. package/docs/api/interfaces/QuickFix.md +0 -52
  215. package/docs/api/interfaces/RBACAccessValidateParams.md +0 -52
  216. package/docs/api/interfaces/RBACAccessValidateResult.md +0 -41
  217. package/docs/api/interfaces/RBACAuditLogParams.md +0 -85
  218. package/docs/api/interfaces/RBACAuditLogResult.md +0 -52
  219. package/docs/api/interfaces/RBACConfig.md +0 -133
  220. package/docs/api/interfaces/RBACContext.md +0 -52
  221. package/docs/api/interfaces/RBACLogger.md +0 -112
  222. package/docs/api/interfaces/RBACPageAccessCheckParams.md +0 -74
  223. package/docs/api/interfaces/RBACPerformanceMetrics.md +0 -138
  224. package/docs/api/interfaces/RBACPermissionCheckParams.md +0 -74
  225. package/docs/api/interfaces/RBACPermissionCheckResult.md +0 -52
  226. package/docs/api/interfaces/RBACPermissionsGetParams.md +0 -63
  227. package/docs/api/interfaces/RBACPermissionsGetResult.md +0 -63
  228. package/docs/api/interfaces/RBACResult.md +0 -58
  229. package/docs/api/interfaces/RBACRoleGrantParams.md +0 -63
  230. package/docs/api/interfaces/RBACRoleGrantResult.md +0 -52
  231. package/docs/api/interfaces/RBACRoleRevokeParams.md +0 -63
  232. package/docs/api/interfaces/RBACRoleRevokeResult.md +0 -52
  233. package/docs/api/interfaces/RBACRoleValidateParams.md +0 -52
  234. package/docs/api/interfaces/RBACRoleValidateResult.md +0 -63
  235. package/docs/api/interfaces/RBACRolesListParams.md +0 -52
  236. package/docs/api/interfaces/RBACRolesListResult.md +0 -74
  237. package/docs/api/interfaces/RBACSessionTrackParams.md +0 -74
  238. package/docs/api/interfaces/RBACSessionTrackResult.md +0 -52
  239. package/docs/api/interfaces/ResourcePermissions.md +0 -155
  240. package/docs/api/interfaces/RevokeEventAppRoleParams.md +0 -100
  241. package/docs/api/interfaces/RoleBasedRouterContextType.md +0 -151
  242. package/docs/api/interfaces/RoleBasedRouterProps.md +0 -156
  243. package/docs/api/interfaces/RoleManagementResult.md +0 -52
  244. package/docs/api/interfaces/RouteAccessRecord.md +0 -107
  245. package/docs/api/interfaces/RouteConfig.md +0 -134
  246. package/docs/api/interfaces/RuntimeComplianceResult.md +0 -55
  247. package/docs/api/interfaces/SecureDataContextType.md +0 -168
  248. package/docs/api/interfaces/SecureDataProviderProps.md +0 -132
  249. package/docs/api/interfaces/SessionRestorationLoaderProps.md +0 -34
  250. package/docs/api/interfaces/SetupIssue.md +0 -41
  251. package/docs/api/interfaces/StorageConfig.md +0 -41
  252. package/docs/api/interfaces/StorageFileInfo.md +0 -74
  253. package/docs/api/interfaces/StorageFileMetadata.md +0 -151
  254. package/docs/api/interfaces/StorageListOptions.md +0 -99
  255. package/docs/api/interfaces/StorageListResult.md +0 -41
  256. package/docs/api/interfaces/StorageUploadOptions.md +0 -101
  257. package/docs/api/interfaces/StorageUploadResult.md +0 -63
  258. package/docs/api/interfaces/StorageUrlOptions.md +0 -60
  259. package/docs/api/interfaces/StyleImport.md +0 -19
  260. package/docs/api/interfaces/SwitchProps.md +0 -34
  261. package/docs/api/interfaces/TabsContentProps.md +0 -9
  262. package/docs/api/interfaces/TabsListProps.md +0 -9
  263. package/docs/api/interfaces/TabsProps.md +0 -9
  264. package/docs/api/interfaces/TabsTriggerProps.md +0 -50
  265. package/docs/api/interfaces/TextareaProps.md +0 -53
  266. package/docs/api/interfaces/ToastActionElement.md +0 -12
  267. package/docs/api/interfaces/ToastProps.md +0 -9
  268. package/docs/api/interfaces/UnifiedAuthContextType.md +0 -823
  269. package/docs/api/interfaces/UnifiedAuthProviderProps.md +0 -173
  270. package/docs/api/interfaces/UseFormDialogOptions.md +0 -62
  271. package/docs/api/interfaces/UseFormDialogReturn.md +0 -117
  272. package/docs/api/interfaces/UseInactivityTrackerOptions.md +0 -138
  273. package/docs/api/interfaces/UseInactivityTrackerReturn.md +0 -123
  274. package/docs/api/interfaces/UsePublicEventLogoOptions.md +0 -87
  275. package/docs/api/interfaces/UsePublicEventLogoReturn.md +0 -84
  276. package/docs/api/interfaces/UsePublicEventOptions.md +0 -34
  277. package/docs/api/interfaces/UsePublicEventReturn.md +0 -71
  278. package/docs/api/interfaces/UsePublicFileDisplayOptions.md +0 -47
  279. package/docs/api/interfaces/UsePublicFileDisplayReturn.md +0 -123
  280. package/docs/api/interfaces/UsePublicRouteParamsReturn.md +0 -97
  281. package/docs/api/interfaces/UseResolvedScopeOptions.md +0 -47
  282. package/docs/api/interfaces/UseResolvedScopeReturn.md +0 -47
  283. package/docs/api/interfaces/UseResourcePermissionsOptions.md +0 -34
  284. package/docs/api/interfaces/UserEventAccess.md +0 -121
  285. package/docs/api/interfaces/UserMenuProps.md +0 -88
  286. package/docs/api/interfaces/UserProfile.md +0 -63
  287. package/src/components/EventSelector/EventSelector.test.tsx +0 -720
  288. package/src/components/EventSelector/EventSelector.tsx +0 -423
  289. package/src/components/EventSelector/index.ts +0 -3
  290. package/src/components/OrganisationSelector/OrganisationSelector.test.tsx +0 -784
  291. package/src/components/OrganisationSelector/OrganisationSelector.tsx +0 -327
  292. package/src/components/OrganisationSelector/index.ts +0 -9
  293. /package/dist/{DataTable-TPTKCX4D.js.map → DataTable-E7YQZD7D.js.map} +0 -0
  294. /package/dist/{UnifiedAuthProvider-CH6Z342H.js.map → UnifiedAuthProvider-QPXO24B4.js.map} +0 -0
  295. /package/dist/{api-MVVQZLJI.js.map → api-6LVZTHDS.js.map} +0 -0
  296. /package/dist/{audit-B5P6FFIR.js.map → audit-V53FV5AG.js.map} +0 -0
  297. /package/dist/{chunk-2UOI2FG5.js.map → chunk-5EC5MEWX.js.map} +0 -0
  298. /package/dist/{chunk-7D4SUZUM.js.map → chunk-DGUM43GV.js.map} +0 -0
  299. /package/dist/{chunk-F2IMUDXZ.js.map → chunk-M7MPQISP.js.map} +0 -0
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/components/DataTable/DataTable.tsx","../src/components/DataTable/components/DataTableCore.tsx","../src/components/DataTable/components/LoadingState.tsx","../src/components/DataTable/components/DataTableLayout.tsx","../src/components/Button/Button.tsx","../src/components/Tooltip/Tooltip.tsx","../src/components/Input/Input.tsx","../src/components/DataTable/components/DataTableToolbar.tsx","../src/components/Select/Select.tsx","../src/components/Select/context.ts","../src/components/Select/hooks/useSelectEvents.ts","../src/components/Select/hooks/useSelectSearch.ts","../src/components/Select/hooks/useSelectState.ts","../src/components/Select/utils/text.ts","../src/components/DataTable/components/GroupingDropdown.tsx","../src/components/Checkbox/Checkbox.tsx","../src/components/DataTable/components/ColumnVisibilityDropdown.tsx","../src/components/DataTable/components/UnifiedTableBody.tsx","../src/components/DataTable/components/EmptyState.tsx","../src/components/DataTable/components/FilterRow.tsx","../src/components/DataTable/components/ColumnFilter.tsx","../src/components/DataTable/utils/columnUtils.ts","../src/components/DataTable/components/RowComponent.tsx","../src/components/DataTable/components/ActionButtons.tsx","../src/components/DataTable/components/EditableRow.tsx","../src/components/DataTable/styles.ts","../src/components/DataTable/utils/hierarchicalUtils.ts","../src/components/DataTable/utils/rowUtils.ts","../src/components/DataTable/components/EditFields.tsx","../src/components/DataTable/components/PaginationControls.tsx","../src/components/DataTable/utils/paginationUtils.ts","../src/components/DataTable/components/DataTableModals.tsx","../src/components/DataTable/components/ImportModal.tsx","../src/components/Dialog/Dialog.tsx","../src/components/Progress/Progress.tsx","../src/components/DataTable/utils/a11yUtils.ts","../src/components/DataTable/utils/exportUtils.ts","../src/components/DataTable/components/DataTableErrorBoundary.tsx","../src/components/Alert/Alert.tsx","../src/components/DataTable/hooks/useColumnOrderPersistence.ts","../src/components/DataTable/hooks/useColumnVisibilityPersistence.ts","../src/components/DataTable/hooks/useDataTableState.ts","../src/components/DataTable/hooks/useDataTableDataPipeline.ts","../src/components/DataTable/hooks/useHierarchicalState.ts","../src/components/DataTable/utils/hierarchicalSorting.ts","../src/components/DataTable/hooks/useServerSideDataEffect.ts","../src/components/DataTable/hooks/useEffectiveColumnOrder.ts","../src/components/DataTable/hooks/useTableHandlers.ts","../src/components/DataTable/hooks/useDataTableConfiguration.ts","../src/components/Card/Card.tsx","../src/components/DataTable/components/AccessDeniedPage.tsx","../src/components/DataTable/hooks/useDataTablePermissions.ts","../src/components/DataTable/types.ts","../src/components/DataTable/hooks/useTableColumns.ts","../src/components/DataTable/core/ColumnFactory.ts","../src/components/DataTable/hooks/useKeyboardNavigation.ts","../src/components/DataTable/components/hooks/usePermissionTracking.ts","../src/components/DataTable/components/hooks/useImportModalFocus.ts","../src/components/DataTable/components/cellValueUtils.ts","../src/components/DataTable/components/BulkOperationsDropdown.tsx","../src/components/DataTable/components/GroupHeader.tsx","../src/components/DataTable/utils/aggregationUtils.ts"],"sourcesContent":["/**\n * @file Enhanced DataTable Component with Performance Optimizations\n * @package @jmruthers/pace-core\n * @module Components/DataTable\n * @since 0.3.0\n *\n * A comprehensive, feature-rich data table component built on top of TanStack Table.\n * Provides advanced data management capabilities with a clean, accessible interface.\n * \n * The DataTable is an enterprise-grade data table component that provides all the features\n * you need for complex data management: sorting, filtering, pagination, search, export/import,\n * inline editing, grouping with aggregation, virtual scrolling, and full accessibility support.\n * \n * ## Performance Features\n * - 🚀 **Intelligent Virtual Scrolling** - Automatically handles 100,000+ records with smooth scrolling\n * - ⚡ **Smart Pagination** - Automatic mode detection (client/server/hybrid)\n * - 🔍 **Advanced Search** - Fast indexing with fuzzy search capabilities\n * - 💾 **Memory Management** - Intelligent data chunking and cleanup\n * - 🎯 **Intersection Observer** - Efficient visibility tracking\n * - 🔄 **Data Chunking** - LRU cache for optimal memory usage\n * - 🧠 **Adaptive Rendering** - Automatically switches between standard and virtualized rendering\n *\n * ## Features\n * - ✅ **Search** - Global search with column-specific filters\n * - ✅ **Pagination** - Configurable pagination with custom initial page size and page size options\n * - ✅ **Sorting** - Multi-column sorting with visual indicators (↕️ unsorted, ↑ ascending, ↓ descending)\n * - ✅ **Filtering** - Column-specific filtering with multiple input types\n * - ✅ **Export/Import** - CSV data export/import with automatic column mapping and reference field support\n * - ✅ **Row Selection** - Single and multi-row selection for bulk operations\n * - ✅ **Row Creation** - Add new rows with validation\n * - ✅ **Row Editing** - Inline row editing with input field conversion\n * - ✅ **Row Deletion** - Individual and bulk row deletion\n * - ✅ **Actions** - Custom row actions and toolbar buttons\n * - ✅ **Grouping** - Data grouping with aggregation functions\n * - ✅ **Column Visibility** - Show/hide columns dynamically\n * - ✅ **Column Reordering** - Drag and drop column reordering\n * - ✅ **Intelligent Virtual Scrolling** - Automatic performance optimization for large datasets\n * - ✅ **Searchable Select Fields** - Type-to-search in select dropdowns within editable columns\n * - ✅ **Creatable Select Fields** - Create new options on-the-fly when they don't exist\n * - ✅ **Grouped Select Options** - Organize select options into groups with labels and separators\n * - ✅ **Customizable Number Inputs** - Hide spinner arrows on number input fields for cleaner UX\n * - ✅ **Responsive Design** - Mobile-friendly responsive layout\n * - ✅ **Accessibility** - WCAG 2.1 AA compliant with keyboard navigation\n * - ✅ **TypeScript** - Full TypeScript support with strict typing\n *\n * @example\n * ```tsx\n * // Basic usage - simple data table (automatically optimized)\n * import { DataTable, type DataTableColumn } from '@jmruthers/pace-core';\n * \n * interface User {\n * id: string;\n * name: string;\n * email: string;\n * role: string;\n * status: 'active' | 'inactive';\n * }\n * \n * const columns: DataTableColumn<User>[] = [\n * {\n * accessorKey: 'name',\n * header: 'Name',\n * sortable: true,\n * searchable: true,\n * },\n * {\n * accessorKey: 'email', \n * header: 'Email',\n * sortable: true,\n * searchable: true,\n * },\n * {\n * accessorKey: 'role',\n * header: 'Role',\n * sortable: true,\n * enableGrouping: true,\n * },\n * {\n * accessorKey: 'status',\n * header: 'Status',\n * sortable: true,\n * cell: ({ row }) => (\n * <span className={`px-2 py-1 rounded text-xs ${\n * row.original.status === 'active' \n * ? 'bg-main-100 text-main-800'\n * : 'bg-acc-100 text-acc-800'\n * }`}>\n * {row.original.status}\n * </span>\n * ),\n * },\n * ];\n * \n * const data: User[] = [\n * { id: '1', name: 'John Doe', email: 'john@example.com', role: 'Admin', status: 'active' },\n * { id: '2', name: 'Jane Smith', email: 'jane@example.com', role: 'User', status: 'active' },\n * ];\n * \n * <DataTable\n * data={data}\n * columns={columns}\n * rbac={{\n * pageId: 'user-management'\n * }}\n * title=\"Users\"\n * description=\"Manage your users\"\n * features={{\n * search: true,\n * pagination: true,\n * sorting: true,\n * filtering: true,\n * export: true,\n * import: true,\n * selection: true,\n * creation: true,\n * editing: true,\n * deletion: true,\n * deleteSelected: true,\n * grouping: true,\n * columnVisibility: true,\n * columnReordering: true,\n * }}\n * initialPageSize={25} // Set custom initial page size\n * columnOrder={['select', 'name', 'email', 'role', 'status']} // Control column order\n * onEditRow={(row, data) => console.log('Edit:', row, data)}\n * onDeleteRow={(row) => console.log('Delete:', row)}\n * />\n * ```\n * \n * @example\n * ```tsx\n * // DataTable with custom column ordering and selection\n * <DataTable\n * data={data}\n * columns={columns}\n * rbac={{\n * pageId: 'user-management'\n * }}\n * title=\"Custom Ordered Table\"\n * features={{\n * selection: true,\n * sorting: true,\n * filtering: true,\n * // ... other features\n * }}\n * // Control the exact order of columns, including selection column\n * columnOrder={['select', 'name', 'email', 'role', 'status']}\n * // When selection is enabled but not in columnOrder, it defaults to first position\n * // columnOrder={['name', 'email', 'role']} // selection column will be first\n * />\n * ```\n * \n * @example\n * ```tsx\n * // Large dataset with performance optimizations\n * <DataTable\n * data={largeDataset} // 50,000+ records\n * columns={columns}\n * rbac={{\n * pageId: 'user-management'\n * }}\n * title=\"Large Dataset\"\n * \n * // Features configuration\n * features={{\n * search: true,\n * pagination: true,\n * sorting: true,\n * filtering: true,\n * export: true,\n * import: true,\n * selection: true,\n * creation: true,\n * editing: true,\n * deletion: true,\n * deleteSelected: true,\n * grouping: true,\n * columnVisibility: true,\n * columnReordering: true,\n * // Virtualization is automatically enabled for large datasets\n * }}\n * \n * // Performance configuration (optional)\n * performance={{\n * virtualScrolling: true,\n * enableChunking: true,\n * chunkSize: 1000,\n * enableWebWorkers: true,\n * }}\n * />\n * ```\n * \n * @example\n * ```tsx\n * // Server-side data with large datasets\n * <DataTable\n * data={[]} // Empty - data comes from server\n * columns={columns}\n * rbac={{\n * pageId: 'user-management'\n * }}\n * title=\"Server-side Data\"\n * \n * // Features configuration\n * features={{\n * search: true,\n * pagination: true,\n * sorting: true,\n * filtering: true,\n * export: true,\n * import: true,\n * selection: true,\n * creation: true,\n * editing: true,\n * deletion: true,\n * deleteSelected: true,\n * grouping: true,\n * columnVisibility: true,\n * columnReordering: true,\n * // Virtualization is automatically enabled for large datasets\n * }}\n * \n * // Server-side configuration\n * serverSide={{\n * fetchData: async (params) => {\n * const response = await fetchServerData(params);\n * return response;\n * },\n * enableServerSorting: true,\n * enableServerFiltering: true,\n * enableServerSearch: true,\n * enableServerPagination: true,\n * }}\n * />\n * ```\n * \n * @example\n * ```tsx\n * // DataTable with customized import modal text\n * const importConfig = {\n * title: \"Import Customer Data\",\n * description: \"Upload a CSV file with customer information to import multiple records.\",\n * uploadText: \"Choose a customer CSV file to upload\",\n * selectFileButtonText: \"Browse Files\",\n * importButtonText: \"Import Customers\",\n * importButtonProcessingText: \"Processing customers...\",\n * previewHeaderText: \"Customer Preview (first 5 records)\",\n * totalRowsText: \"Found {count} customer records to import\"\n * };\n * \n * <DataTable\n * data={customerData}\n * columns={customerColumns}\n * rbac={{\n * pageId: 'customer-management'\n * }}\n * title=\"Customer Management\"\n * features={{\n * search: true,\n * pagination: true,\n * sorting: true,\n * filtering: true,\n * export: true,\n * import: true,\n * selection: true,\n * creation: true,\n * editing: true,\n * deletion: true,\n * deleteSelected: true,\n * grouping: true,\n * columnVisibility: true,\n * columnReordering: true,\n * }}\n * importModalConfig={importConfig}\n * onImport={(importedData) => {\n * console.log('Imported customers:', importedData);\n * // Handle imported customer data\n * }}\n * />\n * ```\n */\n\nimport React from 'react';\nimport { DataTableCore } from './components/DataTableCore';\nimport { createLogger } from '../../utils/core/logger';\nimport { normalizeDataTableFeatures } from './types';\nimport type {\n DataRecord,\n GetRowId,\n ServerSideParams,\n PerformanceConfig,\n ServerSideConfig,\n ChunkingConfig,\n SearchIndexConfig,\n PaginationMode,\n EmptyStateConfig,\n DataTableFeatureConfig,\n DataTableColumn,\n SimpleColumn,\n AggregateConfig,\n DataTableAction,\n HierarchicalConfig,\n DataTableRBACConfig\n} from './types';\nimport type { ImportModalConfig } from './components/ImportModal';\n\n// ============================================================================\n// ENHANCED DATATABLE PROPS\n// ============================================================================\n\n/**\n * Enhanced DataTable props with performance features\n * @template TData - The type of data records in the table\n */\nexport interface DataTableProps<TData extends DataRecord> {\n // ========================================\n // CORE DATA\n // ========================================\n \n /** Array of data records to display in the table */\n data: TData[];\n /** Column definitions for the table */\n columns: DataTableColumn<TData>[];\n \n // ========================================\n // MANDATORY RBAC\n // ========================================\n \n /** RBAC configuration - REQUIRED for all DataTables */\n rbac: DataTableRBACConfig;\n \n // ========================================\n // DISPLAY\n // ========================================\n \n /** Optional title displayed above the table */\n title?: string;\n /** Optional description displayed below the title */\n description?: string;\n /** Visual variant of the table */\n variant?: 'default' | 'compact' | 'spacious';\n /** Additional CSS classes for the table container */\n className?: string;\n \n // ========================================\n // NEW: UNIFIED FEATURE CONFIGURATION\n // ========================================\n \n /** Feature configuration - all features are disabled by default */\n features?: DataTableFeatureConfig;\n\n // ========================================\n // HIERARCHICAL CONFIGURATION\n // ========================================\n \n /** Hierarchical parent/child row configuration */\n hierarchical?: HierarchicalConfig;\n \n // ========================================\n // PERFORMANCE FEATURES\n // ========================================\n \n /** Performance optimization configuration */\n performance?: PerformanceConfig;\n /** Server-side data fetching configuration */\n serverSide?: ServerSideConfig<TData>;\n /** Override automatic pagination mode detection */\n paginationMode?: PaginationMode;\n /** Data chunking configuration for memory optimization */\n chunking?: ChunkingConfig;\n /** Search indexing configuration for fast search */\n searchIndex?: SearchIndexConfig;\n /** Virtual scrolling height */\n virtualHeight?: number;\n /** Initial page size for pagination */\n initialPageSize?: number;\n \n // ========================================\n // DEFAULT STATE CONFIGURATION\n // ========================================\n \n /** Initial grouping configuration - columns to group by on load */\n defaultGrouping?: string[];\n /** Initial sorting configuration - sort state to apply on load */\n defaultSorting?: Array<{\n id: string;\n desc: boolean;\n }>;\n \n /** Enable enhanced pagination controls */\n enhancedPagination?: boolean;\n /** Custom loading component */\n loadingComponent?: React.ComponentType;\n /** Custom error component */\n errorComponent?: React.ComponentType<{ error: Error; retry: () => void }>;\n \n // ========================================\n // EVENT HANDLERS\n // ========================================\n \n /** Callback when a row is edited */\n onEditRow?: (row: TData, data: Partial<TData>) => void;\n /** Callback when a row is deleted */\n onDeleteRow?: (row: TData) => void;\n /** Callback when a new row is created */\n onCreateRow?: (data: Partial<TData>) => void;\n /** Callback when data is imported */\n onImport?: (data: TData[]) => void | Promise<void>;\n /** Callback for custom export functionality */\n onExport?: (options: import('./types').ExportOptions<TData>) => void | Promise<void>;\n /** Callback when row selection changes */\n onRowSelectionChange?: (selection: Record<string, boolean>) => void;\n /** Controlled selection state */\n selection?: Record<string, boolean>;\n /** Callback when bulk delete selected rows is triggered */\n onDeleteSelected?: (selectedRows: Record<string, boolean>) => void;\n \n // ========================================\n // UTILITIES\n // ========================================\n \n /** Function to generate unique row IDs */\n getRowId?: GetRowId<TData>;\n /** Whether the table is in a loading state */\n isLoading?: boolean;\n /** Custom component to display when table is empty */\n emptyState?: EmptyStateConfig | React.ReactElement<any>;\n /** Array of aggregation functions for grouped data */\n aggregates?: AggregateConfig[];\n \n /** Import modal configuration */\n importModalConfig?: ImportModalConfig;\n \n /** Custom row actions - use this for custom action buttons */\n actions?: DataTableAction<TData>[];\n \n /** Column order configuration - array of column IDs in desired order */\n columnOrder?: string[];\n \n // ========================================\n // PERSISTENCE CONFIGURATION\n // ========================================\n \n /** Unique storage key for persisting table layout state across sessions */\n storageKey?: string;\n /** Callback when table layout changes (column order, visibility, etc.) */\n onLayoutChange?: (layout: { columnOrder: string[]; columnVisibility: Record<string, boolean> }) => void;\n}\n\n// ============================================================================\n// MAIN ENHANCED DATATABLE COMPONENT\n// ============================================================================\n\n/**\n * Enhanced DataTable with comprehensive performance optimizations\n * \n * This component automatically detects dataset size and applies appropriate performance optimizations:\n * - < 1,000 records: Standard rendering with full feature support\n * - 1,000+ records: Automatic virtual scrolling with intelligent memory management\n * - 10,000+ records: Enhanced chunking and memory optimization\n * - 100,000+ records: Advanced server-side processing with virtualization\n * \n * Features are configured through the unified `features` prop for maximum flexibility.\n */\n/**\n * Enhanced DataTable component with performance optimizations and comprehensive features.\n * \n * This is the main entry point for the DataTable component. It wraps DataTableCore\n * and provides feature normalization and validation.\n * \n * @template TData - The type of data records in the table\n * @param props - DataTable configuration including data, columns, features, and RBAC\n * @returns The rendered DataTable component\n * \n * @example\n * ```tsx\n * <DataTable\n * data={users}\n * columns={userColumns}\n * rbac={{ pageId: 'user-management' }}\n * features={{\n * search: true,\n * pagination: true,\n * sorting: true\n * }}\n * />\n * ```\n */\n/**\n * Comprehensive, feature-rich data table component built on top of TanStack Table.\n * Provides advanced data management capabilities with a clean, accessible interface.\n * \n * @template TData - The type of data records in the table\n * @param props - DataTable configuration and props\n * @returns The rendered DataTable component\n */\nexport function DataTable<TData extends DataRecord>(props: DataTableProps<TData>) {\n const logger = createLogger('DataTable');\n const { features, ...rest } = props;\n\n const normalizedFeatures = React.useMemo(\n () => normalizeDataTableFeatures(features),\n [features]\n );\n\n React.useEffect(() => {\n if (normalizedFeatures.deleteSelected && !normalizedFeatures.deletion) {\n logger.warn('deleteSelected requires deletion to be enabled');\n }\n }, [normalizedFeatures.deleteSelected, normalizedFeatures.deletion, logger]);\n\n return <DataTableCore {...rest} features={normalizedFeatures} />;\n}\n\n// ============================================================================\n// EXPORT WITH PERFORMANCE OPTIMIZATIONS\n// ============================================================================\n\n/**\n * DataTable component export\n * \n * Note: React.memo removed for React 19 compatibility. React 19's automatic\n * memoization (React Compiler) handles optimization automatically, and manual\n * memoization can interfere with prop updates in React 19.\n */\nexport { DataTable as default };\n\n// Re-export for convenience\nexport { DataTable as EnhancedDataTable };\n","/**\n * @file DataTable Core Component\n * @package @jmruthers/pace-core\n * @module Components/DataTable/Components\n * @since 0.4.0\n * \n * Core DataTable component that orchestrates all sub-components.\n * This is the main component that consumers will use.\n */\n\nimport React, { useMemo, useCallback, useEffect, useRef } from 'react';\nimport { useReactTable } from '@tanstack/react-table';\nimport type {\n SortingState,\n} from '@tanstack/react-table';\nimport { Edit, Trash } from 'lucide-react';\nimport { useDataTablePerformance } from '../../../hooks/useDataTablePerformance';\nimport { LoadingState } from './LoadingState';\nimport { DataTableLayout } from './DataTableLayout';\nimport { DataTableErrorBoundary } from './DataTableErrorBoundary';\nimport { useColumnOrderPersistence } from '../hooks/useColumnOrderPersistence';\nimport { useColumnVisibilityPersistence } from '../hooks/useColumnVisibilityPersistence';\nimport { useDataTableState } from '../hooks/useDataTableState';\nimport { useDataTableDataPipeline } from '../hooks/useDataTableDataPipeline';\nimport { useServerSideDataEffect } from '../hooks/useServerSideDataEffect';\nimport { useEffectiveColumnOrder } from '../hooks/useEffectiveColumnOrder';\nimport { useTableHandlers } from '../hooks/useTableHandlers';\nimport { useDataTableConfiguration } from '../hooks/useDataTableConfiguration';\nimport type { TableStateSnapshot } from '../hooks/useTableHandlers';\nimport { ColumnFactory } from '../core/ColumnFactory';\nimport { AccessDeniedPage } from './AccessDeniedPage';\n// NOTE: All toast() calls in this component use the default timeout (5 seconds).\n// Do NOT set duration or timeout properties - let the toast system use its default.\nimport { toast } from '../../../hooks/useToast';\nimport { useUnifiedAuth } from '../../../providers/services/UnifiedAuthProvider';\nimport { useDataTablePermissions } from '../hooks/useDataTablePermissions';\nimport { useTableColumns } from '../hooks/useTableColumns';\nimport { initializeLiveRegion } from '../utils/a11yUtils';\nimport { useKeyboardNavigation } from '../hooks/useKeyboardNavigation';\nimport { getRowIdSafe } from '../utils/rowUtils';\nimport { createLogger } from '../../../utils/core/logger';\nimport { usePermissionTracking } from './hooks/usePermissionTracking';\nimport { useImportModalFocus } from './hooks/useImportModalFocus';\nimport { toCellValueRecord } from './cellValueUtils';\n\nimport { normalizeDataTableFeatures } from '../types';\nimport type {\n DataRecord,\n GetRowId,\n PerformanceConfig,\n ServerSideConfig,\n ChunkingConfig,\n SearchIndexConfig,\n PaginationMode,\n EmptyStateConfig,\n DataTableFeatureConfig,\n NormalizedDataTableFeatureConfig,\n DataTableColumn,\n AggregateConfig,\n DataTableAction,\n HierarchicalConfig,\n DataTableRBACConfig,\n} from '../types';\nimport type { ImportModalConfig } from './ImportModal';\n\n// ============================================================================\n// CORE COMPONENT PROPS\n// ============================================================================\n\n/**\n * Core DataTable component props.\n * This is the internal component that handles all DataTable functionality.\n * \n * @template TData - The type of data records in the table\n */\nexport interface DataTableCoreProps<TData extends DataRecord> {\n // Core data\n data: TData[];\n columns: DataTableColumn<TData>[];\n \n // MANDATORY RBAC - NO OPTIONAL\n /** RBAC configuration - REQUIRED for all DataTables */\n rbac: DataTableRBACConfig;\n \n // Display\n title?: string;\n description?: string;\n variant?: 'default' | 'compact' | 'spacious';\n className?: string;\n\n // Feature configuration\n features?: DataTableFeatureConfig;\n \n // Hierarchical configuration\n hierarchical?: HierarchicalConfig;\n \n // Performance props\n performance?: PerformanceConfig;\n serverSide?: ServerSideConfig<TData>;\n paginationMode?: PaginationMode;\n chunking?: ChunkingConfig;\n searchIndex?: SearchIndexConfig;\n virtualHeight?: number;\n enhancedPagination?: boolean;\n loadingComponent?: React.ComponentType;\n errorComponent?: React.ComponentType<{ error: Error; retry: () => void }>;\n initialPageSize?: number;\n \n // Event handlers\n onEditRow?: (row: TData, data: Partial<TData>) => void;\n onDeleteRow?: (row: TData) => void;\n onCreateRow?: (data: Partial<TData>) => void;\n onImport?: (data: TData[]) => void | Promise<void>;\n onExport?: (options: import('../types').ExportOptions<TData>) => void | Promise<void>;\n onRowSelectionChange?: (selection: Record<string, boolean>) => void;\n selection?: Record<string, boolean>;\n onDeleteSelected?: (selectedRows: Record<string, boolean>) => void;\n \n // Utilities\n getRowId?: GetRowId<TData>;\n isLoading?: boolean;\n emptyState?: EmptyStateConfig | React.ReactElement<any>;\n aggregates?: AggregateConfig[];\n importModalConfig?: ImportModalConfig;\n actions?: DataTableAction<TData>[];\n columnOrder?: string[];\n \n // Default state configuration\n defaultGrouping?: string[];\n defaultSorting?: SortingState;\n \n // Persistence configuration\n storageKey?: string;\n onLayoutChange?: (layout: { columnOrder: string[]; columnVisibility: Record<string, boolean> }) => void;\n}\n\n// ============================================================================\n// INTERNAL COMPONENT (USES CONTEXT)\n// ============================================================================\n\nfunction DataTableInternal<TData extends DataRecord>(props: DataTableCoreProps<TData>) {\n const {\n data,\n columns,\n rbac, // MANDATORY RBAC\n title,\n description,\n variant = 'default',\n className,\n features: incomingFeatures = {},\n hierarchical,\n performance = {},\n serverSide,\n paginationMode,\n chunking,\n searchIndex,\n virtualHeight = 600,\n enhancedPagination = false,\n loadingComponent: LoadingComponent = LoadingState,\n errorComponent: ErrorComponent,\n initialPageSize = 10,\n onEditRow,\n onDeleteRow,\n onCreateRow,\n onImport,\n onExport,\n onRowSelectionChange,\n selection,\n onDeleteSelected,\n getRowId,\n isLoading: externalIsLoading = false,\n emptyState,\n aggregates = [],\n importModalConfig,\n actions = [],\n columnOrder: externalColumnOrder,\n defaultGrouping,\n defaultSorting,\n storageKey,\n onLayoutChange,\n } = props;\n \n const logger = createLogger('DataTableCore');\n \n // ============================================================================\n // ALL HOOKS MUST BE CALLED IN THE SAME ORDER EVERY RENDER\n // ============================================================================\n \n // MANDATORY: Get authenticated user - ALWAYS call this hook\n const authResult = useUnifiedAuth();\n const user = authResult.user;\n\n const requestedFeatures = useMemo<NormalizedDataTableFeatureConfig>(() =>\n normalizeDataTableFeatures(incomingFeatures),\n [incomingFeatures]);\n\n // MANDATORY: Get permissions and secure features\n const { permissions, secureFeatures, effectivePageId } = useDataTablePermissions(rbac, requestedFeatures);\n\n const {\n permissionElapsed,\n shouldAllowRenderAfterTimeout,\n isPermissionLoading,\n } = usePermissionTracking({\n permissions,\n effectivePageId,\n logger,\n });\n \n \n // ============================================================================\n // UNIFIED STATE MANAGEMENT - Use ONLY useDataTableState for all state\n // ============================================================================\n \n const effectiveColumnOrder = useEffectiveColumnOrder({\n columns,\n externalColumnOrder,\n selectionEnabled: secureFeatures.selection,\n });\n \n // ============================================================================\n // COLUMN VISIBILITY PERSISTENCE - ALWAYS call these hooks\n // ============================================================================\n \n const {\n columnVisibility: savedColumnVisibility,\n isLoaded: isColumnVisibilityLoaded,\n updateColumnVisibility: updateSavedColumnVisibility,\n } = useColumnVisibilityPersistence({\n tableId: title ? `datatable-${title.toLowerCase().replace(/\\s+/g, '-')}` : undefined,\n defaultVisibility: {},\n enablePersistence: secureFeatures.columnVisibility,\n storageKey,\n });\n \n // Merge saved column visibility into initial state\n const initialColumnVisibility = useMemo(() => {\n if (secureFeatures.columnVisibility && savedColumnVisibility && Object.keys(savedColumnVisibility).length > 0) {\n return savedColumnVisibility;\n }\n return {};\n }, [secureFeatures.columnVisibility, savedColumnVisibility]);\n \n // Use the centralized state management hook for ALL table state\n // Note: 'actions' prop parameter is shadowed by destructuring, so we rename to stateActions\n const { state, actions: stateActions } = useDataTableState<TData>({\n initialPageSize,\n columnIds: effectiveColumnOrder,\n initialRowSelection: selection || {},\n onRowSelectionChange,\n defaultSorting: defaultSorting || [],\n defaultGrouping: defaultGrouping || []\n });\n \n // Apply saved visibility to state if available\n useEffect(() => {\n if (secureFeatures.columnVisibility && isColumnVisibilityLoaded && Object.keys(initialColumnVisibility).length > 0) {\n stateActions.setColumnVisibility(initialColumnVisibility);\n }\n }, [secureFeatures.columnVisibility, isColumnVisibilityLoaded, initialColumnVisibility, stateActions]);\n \n // Initialize live region for accessibility announcements\n useEffect(() => {\n initializeLiveRegion();\n }, []);\n \n // Row selection: prefer controlled prop, fall back to state\n const rowSelection = selection !== undefined ? selection : state.rowSelection;\n\n const resolvedGetRowId = useCallback(\n (row: TData, index: number) => getRowIdSafe(row, index, getRowId),\n [getRowId]\n );\n \n // ============================================================================\n // AUTO-EXPAND GROUPS WHEN DEFAULT GROUPING IS PROVIDED\n // ============================================================================\n \n // Track if we've already initialized expansion state\n const hasInitializedExpansion = useRef(false);\n \n // Auto-expand all groups when default grouping is provided (only once on mount)\n useEffect(() => {\n if (!hasInitializedExpansion.current && defaultGrouping && defaultGrouping.length > 0) {\n stateActions.setExpanded(true); // Expand all groups\n hasInitializedExpansion.current = true;\n }\n }, [defaultGrouping, stateActions]);\n\n // Extract commonly used state values\n const { sorting, columnFilters, columnVisibility, grouping, expanded, pagination, columnOrder, \n showImportModal, showFilterRow, isCreating, creationData, editingRowId, editingData } = state;\n \n // ============================================================================\n // PERFORMANCE HOOK - ALWAYS call this hook\n // ============================================================================\n \n const performanceHook = useDataTablePerformance({\n data,\n performance,\n serverSide,\n chunking,\n searchIndex,\n });\n\n const {\n paginationMode: detectedMode,\n isVirtualized,\n pageSizeOptions: optimizedPageSizeOptions,\n isLoading: performanceLoading,\n searchQuery,\n setSearchQuery,\n fetchServerData,\n serverData,\n cleanup,\n } = performanceHook;\n\n const finalPaginationMode = paginationMode || detectedMode;\n\n // ============================================================================\n // KEYBOARD NAVIGATION - ALWAYS call this hook\n // ============================================================================\n \n const keyboardNavigation = useKeyboardNavigation(\n data.length,\n columns.length,\n {\n enabled: true,\n announceNavigation: true,\n supportsColumnReorder: secureFeatures.columnReordering,\n supportsColumnResize: false, // Column resizing is not currently supported\n }\n );\n\n const { lastFocusedElementRef } = useImportModalFocus(state.showImportModal, keyboardNavigation);\n\n // ============================================================================\n // HIERARCHICAL DATA VALIDATION AND PROCESSING - ALWAYS call these hooks\n // ============================================================================\n \n const {\n finalTableData,\n dataCount: finalDataCount,\n hierarchicalState,\n hierarchicalValidation,\n } = useDataTableDataPipeline<TData>({\n data,\n features: secureFeatures,\n hierarchical,\n sorting: state.sorting,\n finalPaginationMode,\n serverData,\n });\n\n useEffect(() => {\n if (!hierarchicalValidation.isValid) {\n logger.error('Hierarchical data validation failed:', hierarchicalValidation.errors);\n }\n }, [hierarchicalValidation, logger]);\n\n const {\n columnOrder: savedColumnOrder,\n isLoaded: isColumnOrderLoaded,\n updateColumnOrder,\n } = useColumnOrderPersistence({\n tableId: title ? `datatable-${title.toLowerCase().replace(/\\s+/g, '-')}` : undefined,\n defaultOrder: columns.map(col => col.id || col.accessorKey || ''),\n enablePersistence: secureFeatures.columnReordering,\n storageKey,\n });\n\n useEffect(() => {\n if (\n secureFeatures.columnReordering &&\n isColumnOrderLoaded &&\n savedColumnOrder &&\n savedColumnOrder.length > 0\n ) {\n // Normalize: ensure 'select' is first if selection is enabled\n const normalizedOrder = secureFeatures.selection && savedColumnOrder.includes('select')\n ? ['select', ...savedColumnOrder.filter(id => id !== 'select')]\n : savedColumnOrder;\n stateActions.setColumnOrder(normalizedOrder);\n }\n }, [secureFeatures.columnReordering, secureFeatures.selection, isColumnOrderLoaded, savedColumnOrder, stateActions]);\n\n // CRITICAL: Always ensure state.columnOrder has 'select' first if selection is enabled\n // This fixes any state that gets out of sync (e.g., from localStorage or user reordering)\n useEffect(() => {\n if (secureFeatures.selection && state.columnOrder.includes('select') && state.columnOrder[0] !== 'select') {\n const normalizedOrder = ['select', ...state.columnOrder.filter(id => id !== 'select')];\n stateActions.setColumnOrder(normalizedOrder);\n // Also update persisted order if persistence is enabled\n if (secureFeatures.columnReordering) {\n updateColumnOrder(normalizedOrder);\n }\n }\n }, [secureFeatures.selection, secureFeatures.columnReordering, state.columnOrder, stateActions, updateColumnOrder]);\n\n // ============================================================================\n // CONFIGURATION RESOLUTION - ALWAYS call these hooks\n // ============================================================================\n \n const finalPageSizeOptions = optimizedPageSizeOptions;\n \n const validatedInitialPageSize = useMemo(() => {\n if (!secureFeatures.pagination || !finalPageSizeOptions.length) {\n return initialPageSize;\n }\n \n if (finalPageSizeOptions.includes(initialPageSize)) {\n return initialPageSize;\n }\n \n const sortedOptions = [...finalPageSizeOptions].sort((a, b) => a - b);\n const closestOption = sortedOptions.reduce((prev, curr) => \n Math.abs(curr - initialPageSize) < Math.abs(prev - initialPageSize) ? curr : prev\n );\n \n logger.warn(\n `initialPageSize ${initialPageSize} is not available in page size options [${finalPageSizeOptions.join(', ')}]. Using closest option: ${closestOption}`\n );\n \n return closestOption;\n }, [initialPageSize, finalPageSizeOptions, secureFeatures.pagination, logger]);\n \n // Determine the effective pageSize to use (validated or current state)\n // CRITICAL: This ensures we always pass a valid pageSize to TanStack Table configuration.\n // An invalid pageSize can cause getPaginationRowModel() to return empty rows.\n const effectivePageSize = useMemo(() => {\n if (!secureFeatures.pagination || !finalPageSizeOptions.length) {\n return state.pagination.pageSize;\n }\n \n // If current pageSize is invalid (not in options), use validated value immediately\n // This is a safety net in case the useEffect hasn't run yet\n if (!finalPageSizeOptions.includes(state.pagination.pageSize)) {\n return validatedInitialPageSize;\n }\n \n return state.pagination.pageSize;\n }, [state.pagination.pageSize, validatedInitialPageSize, secureFeatures.pagination, finalPageSizeOptions]);\n \n // CRITICAL FIX: Ensure pagination state always uses a valid pageSize and pageIndex\n // An invalid pageSize (not in page size options) causes getPaginationRowModel() to return empty rows,\n // which manifests as \"DataTable shows record count but no rows\" bug for large datasets.\n // An out-of-bounds pageIndex (beyond available pages) also causes empty rows.\n // This fixes the bug where DataTable shows record count but no rows for large datasets.\n useEffect(() => {\n if (secureFeatures.pagination && finalPageSizeOptions.length > 0) {\n const needsFix = !finalPageSizeOptions.includes(state.pagination.pageSize);\n \n // Also check if pageIndex is out of bounds for the current data\n const currentPageSize = effectivePageSize || validatedInitialPageSize;\n const totalPages = currentPageSize > 0 ? Math.ceil(finalDataCount / currentPageSize) : 0;\n const pageIndexOutOfBounds = totalPages > 0 && state.pagination.pageIndex >= totalPages;\n \n if (needsFix || pageIndexOutOfBounds) {\n // PageSize is invalid OR pageIndex is out of bounds - correct both to prevent empty rows\n stateActions.setPagination({\n pageSize: validatedInitialPageSize,\n pageIndex: 0, // Reset to first page when correcting pagination issues\n });\n }\n }\n }, [\n secureFeatures.pagination, \n finalPageSizeOptions, \n state.pagination.pageSize, \n state.pagination.pageIndex,\n validatedInitialPageSize, \n stateActions,\n effectivePageSize,\n finalDataCount\n ]);\n \n // React 19 fix: Use useMemo to ensure isLoading updates when props change\n // This prevents the component from getting stuck in loading state when externalIsLoading\n // changes from true to false in React 19 with automatic memoization\n const isLoading = useMemo(\n () => externalIsLoading || performanceLoading,\n [externalIsLoading, performanceLoading]\n );\n \n // ============================================================================\n // DATA PROCESSING - ALWAYS call these hooks\n // ============================================================================\n \n // ============================================================================\n // ACTIONS PROCESSING - ALWAYS call these hooks\n // ============================================================================\n\n // ============================================================================\n // COLUMN PROCESSING - ALWAYS call these hooks\n // ============================================================================\n\n // ============================================================================\n // TABLE CONFIGURATION - ALWAYS call these hooks\n // ============================================================================\n\n // ============================================================================\n // SEARCH HANDLERS - ALWAYS call these hooks\n // ============================================================================\n \n /**\n * Handle search input changes.\n * \n * When a search query is entered, we reset to the first page to show results\n * from the beginning. This provides a better user experience when searching\n * large datasets.\n * \n * CRITICAL: Must sync both state.searchQuery (used by state management) and\n * performance hook's searchQuery (used by table filtering and search index).\n * \n * @param value - The search query string\n */\n const handleSearch = useCallback((value: string) => {\n // Update both search query states to keep them in sync\n stateActions.setSearchQuery(value);\n setSearchQuery(value);\n \n // Reset to first page when searching to show results from the beginning\n if (secureFeatures.pagination) {\n stateActions.setPagination({ ...state.pagination, pageIndex: 0 });\n }\n }, [stateActions, setSearchQuery, secureFeatures.pagination, state.pagination]);\n\n // ============================================================================\n // SERVER-SIDE DATA FETCHING - ALWAYS call these hooks\n // ============================================================================\n \n /**\n * Handle server-side data fetching.\n * \n * This function is called when any state that affects server-side data changes:\n * - pagination (page/size)\n * - sorting (column/sort order)\n * - filtering (column filters or global search)\n * - grouping\n * \n * It collects all current table state and makes a single request to the server\n * with those parameters, allowing for efficient server-side pagination, sorting,\n * and filtering without loading all data client-side.\n * \n * Early return guards prevent unnecessary server calls when:\n * - Component is in client-side mode (finalPaginationMode !== 'server')\n * - No server-side config is provided (!serverSide)\n */\n useServerSideDataEffect<TData>({\n finalPaginationMode,\n serverSide,\n pagination: state.pagination,\n sorting: state.sorting,\n columnFilters: state.columnFilters,\n grouping: state.grouping,\n searchQuery,\n tableDataLength: finalTableData.length,\n fetchServerData,\n cleanup,\n });\n\n // ============================================================================\n // RBAC VALIDATION AND SECURE CONFIGURATION - ALWAYS call these hooks\n // ============================================================================\n\n // MANDATORY: Handlers are automatically secured\n const secureHandlers = useMemo(() => {\n const handlers = {\n onEditRow: permissions.canUpdate.can ? onEditRow : undefined,\n onDeleteRow: permissions.canDelete.can ? onDeleteRow : undefined,\n onCreateRow: permissions.canCreate.can ? onCreateRow : undefined,\n onImport: permissions.canImport.can ? onImport : undefined,\n onExport: permissions.canExport.can ? onExport : undefined,\n onDeleteSelected: permissions.canDelete.can ? onDeleteSelected : undefined,\n };\n \n return handlers;\n }, [permissions.canUpdate.can, permissions.canDelete.can, permissions.canCreate.can, permissions.canImport.can, permissions.canExport.can, onEditRow, onDeleteRow, onCreateRow, onImport, onExport, onDeleteSelected, secureFeatures.creation]);\n\n // MANDATORY: Process actions with RBAC checks\n const effectiveActions = useMemo(() => {\n // Create a new array to avoid mutating the original\n const result = [...actions];\n \n // Add Edit action with RBAC check\n if (secureFeatures.editing && secureHandlers.onEditRow && !result.some(a => a.label === 'Edit')) {\n result.push({\n label: 'Edit',\n onClick: (row: TData) => {\n if (!permissions.canUpdate.can) {\n throw new Error('Insufficient permissions to edit this resource');\n }\n\n const rowIndex = data.findIndex(r => r === row);\n const rowId = resolvedGetRowId(row, rowIndex >= 0 ? rowIndex : 0);\n\n // Set the row into editing mode with the current row data\n stateActions.setEditingRow(rowId, toCellValueRecord(row));\n },\n icon: Edit,\n testId: 'edit',\n hidden: !permissions.canUpdate.can,\n });\n }\n \n // Add Delete action with RBAC check\n if (secureFeatures.deletion && secureHandlers.onDeleteRow && !result.some(a => a.label === 'Delete')) {\n result.push({\n label: 'Delete',\n onClick: async (row: TData) => {\n if (!permissions.canDelete.can) {\n // NOTE: Toast notifications use default timeout (5 seconds) - do not set duration property\n toast({\n title: \"Delete Failed\",\n description: \"Insufficient permissions to delete this resource\",\n variant: \"destructive\"\n });\n return;\n }\n try {\n const result = secureHandlers.onDeleteRow!(row) as any;\n // Handle async operations\n if (result !== undefined && result !== null && typeof result === 'object' && typeof result.then === 'function') {\n await result;\n }\n toast({\n title: \"Delete Successful\",\n description: \"Row deleted successfully\",\n variant: \"default\"\n });\n } catch (error) {\n logger.error('Delete error:', error);\n toast({\n title: \"Delete Failed\",\n description: error instanceof Error ? error.message : 'Failed to delete row',\n variant: \"destructive\"\n });\n }\n },\n icon: Trash,\n testId: 'delete',\n variant: 'destructive' as const,\n hidden: !permissions.canDelete.can,\n });\n }\n\n return result;\n }, [actions, secureFeatures, permissions, secureHandlers, resolvedGetRowId, stateActions, data]);\n\n // Normalize columnOrder for useTableColumns: ensure 'select' is always first\n const normalizedColumnOrderForColumns = useMemo(() => {\n if (secureFeatures.selection && state.columnOrder.includes('select')) {\n return ['select', ...state.columnOrder.filter(id => id !== 'select')];\n }\n return state.columnOrder;\n }, [state.columnOrder, secureFeatures.selection]);\n\n // MANDATORY: Process columns with actions\n const { enhancedColumns } = useTableColumns({\n columns,\n features: secureFeatures,\n effectiveActions,\n columnOrder: normalizedColumnOrderForColumns\n });\n\n // Use effective pageSize in pagination state snapshot to ensure table receives valid pageSize\n const paginationStateWithValidatedSize = useMemo(() => ({\n ...state.pagination,\n pageSize: effectivePageSize,\n }), [state.pagination, effectivePageSize]);\n \n const tableStateSnapshot = useMemo<TableStateSnapshot<TData>>(() => {\n // Normalize columnOrder in snapshot: ensure 'select' is always first if selection is enabled\n const normalizedColumnOrder = secureFeatures.selection && state.columnOrder.includes('select')\n ? ['select', ...state.columnOrder.filter(id => id !== 'select')]\n : state.columnOrder;\n \n return {\n sorting: state.sorting,\n columnFilters: state.columnFilters,\n columnVisibility: state.columnVisibility,\n rowSelection,\n grouping: state.grouping,\n expanded: state.expanded,\n pagination: paginationStateWithValidatedSize,\n globalFilter: searchQuery,\n columnOrder: normalizedColumnOrder,\n };\n }, [\n state.sorting,\n state.columnFilters,\n state.columnVisibility,\n rowSelection,\n state.grouping,\n state.expanded,\n paginationStateWithValidatedSize,\n searchQuery,\n state.columnOrder,\n secureFeatures.selection,\n ]);\n\n const tableHandlers = useTableHandlers({\n state,\n stateSnapshot: tableStateSnapshot,\n actions: stateActions,\n selection,\n onRowSelectionChange,\n effectiveColumnOrder,\n canPersistVisibility: secureFeatures.columnVisibility && Boolean(storageKey),\n canPersistOrder: secureFeatures.columnReordering && Boolean(storageKey),\n updateSavedColumnVisibility,\n updateColumnOrder,\n onLayoutChange,\n });\n\n // PERFORMANCE FIX: If permissions still loading after timeout, filter data to empty array\n // This allows table structure to render but keeps data hidden until permissions confirm\n // SECURITY: Data remains protected - only table structure (headers) will show\n const safeTableData = useMemo(() => {\n if (permissions.canRead.isLoading && shouldAllowRenderAfterTimeout) {\n // Permissions still loading after timeout - return empty array to hide data\n return [] as TData[];\n }\n if (!permissions.canRead.can) {\n // Permissions denied - return empty array\n return [] as TData[];\n }\n // Permissions confirmed - return actual data\n return finalTableData as TData[];\n }, [finalTableData, permissions.canRead.isLoading, permissions.canRead.can, shouldAllowRenderAfterTimeout]);\n\n const tableConfig = useDataTableConfiguration({\n data: safeTableData,\n columns: enhancedColumns,\n stateSnapshot: tableStateSnapshot,\n handlers: tableHandlers,\n features: secureFeatures,\n getRowId: resolvedGetRowId,\n finalPaginationMode,\n finalDataCount: safeTableData.length > 0 ? finalDataCount : 0,\n pageSize: effectivePageSize,\n hasServerSideConfig: !!serverSide,\n });\n \n\n const table = useReactTable(tableConfig);\n\n // ============================================================================\n // RBAC VALIDATION AND EARLY RETURNS - AFTER ALL HOOKS\n // ============================================================================\n \n // DIAGNOSTIC: Log render state for debugging\n const renderDiagnostics = {\n hasUser: !!user,\n userId: user?.id,\n permissionLoading: permissions.canRead.isLoading,\n permissionCan: permissions.canRead.can,\n permissionError: permissions.canRead.error,\n effectivePageId,\n externalIsLoading,\n performanceLoading,\n computedIsLoading: isLoading,\n dataLength: data.length,\n finalTableDataLength: finalTableData.length,\n columnsLength: columns.length,\n tableRowsCount: table?.getRowModel().rows.length || 0,\n };\n\n // Log diagnostics in development mode\n if (process.env.NODE_ENV === 'development') {\n logger.debug('DataTable render diagnostics:', renderDiagnostics);\n }\n\n // MANDATORY: Every DataTable must have a user\n if (!user) {\n logger.error('DataTable render blocked: No user', renderDiagnostics);\n throw new Error('DataTable requires authenticated user for RBAC');\n }\n\n // PERFORMANCE FIX: Allow rendering after timeout to prevent infinite blocking\n // After 3 seconds, allow table to render but keep data hidden until permissions confirm\n // This provides better UX while maintaining security (data remains protected)\n // Note: permissionElapsed and shouldAllowRenderAfterTimeout are calculated above for useMemo\n // Wait for permission check to complete before making access decisions\n // BUT: After 3s timeout, allow table structure to render (data will remain hidden)\n if (isPermissionLoading) {\n // Enhanced diagnostics for hanging permission checks\n if (permissionElapsed > 10000) {\n logger.error('DataTableCore', 'DataTable: Permission check hanging (>10s)', {\n ...renderDiagnostics,\n permissionState: {\n can: permissions.canRead.can,\n isLoading: permissions.canRead.isLoading,\n error: permissions.canRead.error?.message,\n },\n elapsedMs: permissionElapsed,\n diagnostic: 'Permission check has been loading for over 10 seconds. This likely indicates a hanging database query or network issue. Check browser network tab for pending requests to Supabase.',\n recommendation: 'Check: 1) Browser network tab for pending requests, 2) Supabase connection, 3) Database query performance, 4) Super admin check completion',\n });\n }\n \n if (process.env.NODE_ENV === 'development') {\n logger.debug('DataTable render blocked: Permissions loading', {\n ...renderDiagnostics,\n permissionState: permissions.canRead,\n elapsedMs: permissionElapsed,\n });\n }\n return <LoadingComponent />;\n }\n \n // If timeout reached but permissions still loading, log warning and proceed with caution\n if (permissions.canRead.isLoading && shouldAllowRenderAfterTimeout) {\n logger.warn('DataTable: Rendering after timeout - permissions still loading. Data will remain hidden until confirmed.', {\n pageId: effectivePageId,\n elapsedMs: permissionElapsed,\n permissionState: permissions.canRead,\n });\n // Continue to render check below - we'll show empty state until permissions confirm\n }\n\n // MANDATORY: No data access without read permission\n // SECURITY: If permissions are still loading after timeout, allow table structure but hide data\n // If permissions are confirmed as denied, show access denied page\n if (!permissions.canRead.isLoading && !permissions.canRead.can) {\n logger.warn('Access denied - no read permission:', {\n canRead: permissions.canRead,\n pageId: effectivePageId,\n isLoading: permissions.canRead.isLoading,\n diagnostics: renderDiagnostics,\n });\n return <AccessDeniedPage resource={effectivePageId || 'unknown-page'} operation=\"read\" />;\n }\n \n // If permissions still loading after timeout, proceed to render but data will be empty/hidden\n // The table structure will render, but rows will be empty until permissions confirm\n if (permissions.canRead.isLoading && shouldAllowRenderAfterTimeout) {\n // Log that we're proceeding with timeout\n logger.debug('DataTable: Proceeding to render after timeout - permissions still loading', {\n pageId: effectivePageId,\n elapsedMs: permissionElapsed,\n });\n // Continue to render - data will be empty until permissions confirm\n }\n\n // ============================================================================\n // RENDER\n // ============================================================================\n \n if (isLoading) {\n if (process.env.NODE_ENV === 'development') {\n logger.debug('DataTable render blocked: External isLoading', {\n ...renderDiagnostics,\n isLoadingSource: {\n externalIsLoading,\n performanceLoading,\n computed: isLoading,\n },\n });\n }\n return <LoadingComponent />;\n }\n\n // DIAGNOSTIC: Log successful render path\n if (process.env.NODE_ENV === 'development') {\n logger.debug('DataTable proceeding to render:', {\n ...renderDiagnostics,\n willRender: true,\n tableState: {\n rowCount: table?.getRowModel().rows.length || 0,\n columnCount: table?.getVisibleFlatColumns().length || 0,\n paginationMode: finalPaginationMode,\n },\n });\n }\n\n return (\n <DataTableLayout\n table={table}\n title={title}\n description={description}\n variant={variant}\n className={className}\n columns={columns}\n secureFeatures={secureFeatures}\n enhancedPagination={enhancedPagination}\n searchQuery={searchQuery}\n onSearch={handleSearch}\n state={state}\n stateActions={stateActions}\n rowSelection={rowSelection}\n onCreateRow={secureHandlers.onCreateRow}\n onEditRow={secureHandlers.onEditRow}\n onImport={secureHandlers.onImport}\n onExport={secureHandlers.onExport}\n onDeleteSelected={secureHandlers.onDeleteSelected}\n rbac={rbac}\n permissions={permissions}\n effectiveActions={effectiveActions}\n finalPageSizeOptions={finalPageSizeOptions}\n finalPaginationMode={finalPaginationMode}\n finalDataCount={finalDataCount}\n isLoading={isLoading}\n finalTableData={finalTableData}\n aggregates={aggregates}\n resolvedGetRowId={resolvedGetRowId}\n data={data}\n emptyState={emptyState}\n virtualHeight={virtualHeight}\n hierarchical={hierarchical}\n hierarchicalState={hierarchicalState}\n logger={logger}\n secureHandlers={secureHandlers}\n importModalConfig={importModalConfig}\n keyboardNavigation={keyboardNavigation}\n lastFocusedElementRef={lastFocusedElementRef}\n />\n );\n}\n\n// ============================================================================\n// MAIN COMPONENT\n// ============================================================================\n\n/**\n * Core DataTable component implementation.\n * This is the internal component that handles all DataTable functionality including\n * state management, RBAC, performance optimizations, and feature rendering.\n * \n * @template TData - The type of data records in the table\n * @param props - DataTable configuration\n * @returns The rendered DataTable with error boundary\n */\nexport function DataTableCore<TData extends DataRecord>(props: DataTableCoreProps<TData>) {\n return (\n <DataTableErrorBoundary>\n <DataTableInternal {...props} />\n </DataTableErrorBoundary>\n );\n}\n","import React from 'react';\n\n/**\n * Loading state component for DataTable.\n * Displays a loading spinner and message while data is being fetched.\n * \n * @returns The rendered loading state UI\n */\nexport function LoadingState() {\n return (\n <div className=\"p-8 text-center\">\n <div className=\"flex items-center justify-center space-x-2\">\n <div className=\"animate-spin rounded-full size-6 border-b-2 border-primary\"></div>\n <span aria-live=\"polite\" className=\"text-muted-foreground\">Loading...</span>\n </div>\n </div>\n );\n}\n","import React from 'react';\nimport { Edit, Trash, ChevronUp, ChevronDown, ChevronsUpDown } from 'lucide-react';\nimport type { Table } from '@tanstack/react-table';\nimport { cn } from '../../../utils/core/cn';\nimport { Button } from '../../Button/Button';\nimport { DataTableToolbar } from './DataTableToolbar';\nimport { UnifiedTableBody } from './UnifiedTableBody';\nimport { PaginationControls, EnhancedPaginationControls } from './PaginationControls';\nimport { DataTableModals } from './DataTableModals';\nimport { announceSortChange } from '../utils/a11yUtils';\nimport { exportToCSVWithTableRows } from '../utils/exportUtils';\nimport { getTableClasses } from '../styles';\nimport { toast } from '../../../hooks/useToast';\nimport type {\n AggregateConfig,\n DataRecord,\n DataTableAction,\n DataTableColumn,\n DataTableRBACConfig,\n EmptyStateConfig,\n ExportOptions,\n HierarchicalConfig,\n NormalizedDataTableFeatureConfig,\n PaginationMode,\n} from '../types';\nimport type { DataTableState, DataTableStateActions } from '../hooks/useDataTableState';\nimport type { UseDataTablePermissionsReturn } from '../hooks/useDataTablePermissions';\nimport type { GetRowId } from '../types';\nimport type { ImportModalConfig } from './ImportModal';\nimport type { UseDataTableDataPipelineResult } from '../hooks/useDataTableDataPipeline';\nimport type { UseKeyboardNavigationReturn } from '../hooks/useKeyboardNavigation';\nimport type { Column } from '@tanstack/react-table';\nimport type { createLogger } from '../../../utils/core/logger';\n\ninterface DataTableLayoutProps<TData extends DataRecord> {\n table: Table<TData>;\n title?: string;\n description?: string;\n variant: 'default' | 'compact' | 'spacious';\n className?: string;\n columns: DataTableColumn<TData>[];\n secureFeatures: NormalizedDataTableFeatureConfig;\n enhancedPagination: boolean;\n searchQuery: string;\n onSearch: (value: string) => void;\n state: DataTableState<TData>;\n stateActions: DataTableStateActions<TData>;\n rowSelection: Record<string, boolean>;\n onCreateRow?: (data: Partial<TData>) => void;\n onEditRow?: (row: TData, data: Partial<TData>) => void;\n onImport?: (data: TData[]) => void | Promise<void>;\n onExport?: (options: ExportOptions<TData>) => void | Promise<void>;\n onDeleteSelected?: (selectedRows: Record<string, boolean>) => void;\n rbac: DataTableRBACConfig;\n permissions: UseDataTablePermissionsReturn['permissions'];\n effectiveActions: DataTableAction<TData>[];\n finalPageSizeOptions: number[];\n finalPaginationMode: PaginationMode;\n finalDataCount: number;\n isLoading: boolean;\n finalTableData: TData[];\n aggregates: AggregateConfig[];\n resolvedGetRowId: GetRowId<TData>;\n data: TData[];\n emptyState?: EmptyStateConfig | React.ReactElement<any>;\n virtualHeight: number;\n hierarchical?: HierarchicalConfig;\n hierarchicalState: UseDataTableDataPipelineResult<TData>['hierarchicalState'];\n logger: ReturnType<typeof createLogger>;\n secureHandlers: {\n onEditRow?: ((row: TData, data: Partial<TData>) => void) | undefined;\n onDeleteRow?: ((row: TData) => void) | undefined;\n onCreateRow?: ((data: Partial<TData>) => void) | undefined;\n onImport?: ((data: TData[]) => void | Promise<void>) | undefined;\n onExport?: ((options: ExportOptions<TData>) => void | Promise<void>) | undefined;\n onDeleteSelected?: ((selectedRows: Record<string, boolean>) => void) | undefined;\n };\n importModalConfig?: ImportModalConfig;\n keyboardNavigation: UseKeyboardNavigationReturn;\n lastFocusedElementRef: React.RefObject<HTMLElement | null>;\n}\n\nconst SYSTEM_COLUMN_IDS = new Set(['select', 'actions']);\n\n/**\n * Main layout component for DataTable.\n * Orchestrates all DataTable UI components including toolbar, body, pagination, and modals.\n * \n * @template TData - The type of data records in the table\n * @param props - DataTable layout configuration\n * @returns The complete DataTable UI layout\n */\nexport function DataTableLayout<TData extends DataRecord>({\n table,\n title,\n description,\n variant,\n className,\n columns,\n secureFeatures,\n enhancedPagination,\n searchQuery,\n onSearch,\n state,\n stateActions,\n rowSelection,\n onCreateRow,\n onEditRow,\n onImport,\n onExport,\n onDeleteSelected,\n rbac,\n permissions,\n effectiveActions,\n finalPageSizeOptions,\n finalPaginationMode,\n finalDataCount,\n isLoading,\n finalTableData,\n aggregates,\n resolvedGetRowId,\n data,\n emptyState,\n virtualHeight,\n hierarchical,\n hierarchicalState,\n logger,\n secureHandlers,\n importModalConfig,\n keyboardNavigation,\n lastFocusedElementRef,\n}: DataTableLayoutProps<TData>) {\n const handleExport = async () => {\n try {\n const tableRows = table.getFilteredRowModel().rows;\n const tableColumns = table.getAllColumns();\n const visibleTableColumns = tableColumns.filter((col) => !SYSTEM_COLUMN_IDS.has(col.id) && col.getIsVisible());\n\n const visibleColumns: DataTableColumn<TData>[] = [];\n const columnIdToTableColumn = new Map<string, Column<TData>>();\n\n visibleTableColumns.forEach((tableCol) => {\n const originalCol = columns.find((col) => {\n const colId = col.id || col.accessorKey;\n return colId && String(colId) === tableCol.id;\n });\n\n if (!originalCol) return;\n\n columnIdToTableColumn.set(tableCol.id, tableCol);\n visibleColumns.push(originalCol);\n });\n\n const timestamp = new Date().toISOString().split('T')[0];\n const filename = title\n ? `${title.replace(/[^a-z0-9]/gi, '_').toLowerCase()}_${timestamp}.csv`\n : `data_export_${timestamp}.csv`;\n\n const exportOptions: ExportOptions<TData> = {\n tableRows,\n allColumns: columns,\n visibleColumns,\n columnIdToTableColumn,\n data,\n filename,\n table,\n };\n\n if (secureHandlers.onExport) {\n await secureHandlers.onExport(exportOptions);\n return;\n }\n\n const exportColumns: Array<{\n header?: string;\n id?: string;\n accessorKey?: string;\n accessorFn?: (row: any) => any;\n editAccessorKey?: string;\n isIdColumn?: boolean;\n }> = exportOptions.visibleColumns.map((col) => {\n const colId = col.id || col.accessorKey;\n const hasAccessorFn = 'accessorFn' in col && (col as any).accessorFn;\n\n return {\n ...col,\n header: typeof col.header === 'string'\n ? col.header\n : col.accessorKey || colId || 'Column',\n id: colId ? String(colId) : undefined,\n accessorFn: hasAccessorFn ? (col as any).accessorFn : undefined,\n };\n });\n\n await exportToCSVWithTableRows(\n exportOptions.tableRows,\n exportColumns,\n exportOptions.columnIdToTableColumn,\n exportOptions.filename\n );\n\n toast({\n title: 'Export Successful',\n description: `Data exported to ${exportOptions.filename}`,\n variant: 'default',\n });\n } catch (error) {\n logger.error('Failed to export data:', error);\n const errorMessage = error instanceof Error ? error.message : 'Unknown error occurred';\n toast({\n title: 'Export Failed',\n description: `Failed to export data: ${errorMessage}`,\n variant: 'destructive',\n });\n }\n };\n\n const PaginationComponent = enhancedPagination || finalPaginationMode !== 'client'\n ? EnhancedPaginationControls\n : PaginationControls;\n\n const visibleColumns = table?.getVisibleFlatColumns() || [];\n const dataColumns = visibleColumns.filter((col) => !SYSTEM_COLUMN_IDS.has(col.id)).length;\n const hasSelectColumn = visibleColumns.some((col) => col.id === 'select');\n const hasActionsColumn = visibleColumns.some((col) => col.id === 'actions');\n\n return (\n <>\n <table\n className={getTableClasses({\n isFixed: false,\n variant,\n className: cn('border-collapse relative w-full', className),\n })}\n aria-label={title}\n aria-describedby={description ? 'table-description' : undefined}\n aria-busy={isLoading ? 'true' : 'false'}\n >\n <caption className=\"text-left pb-2\">\n {(title || description) && (\n <>\n {title && <h2>{title}</h2>}\n {description && <p id=\"table-description\">{description}</p>}\n </>\n )}\n <DataTableToolbar\n features={secureFeatures}\n globalFilter={searchQuery}\n onGlobalFilterChange={onSearch}\n columns={columns}\n grouping={state.grouping}\n onGroupByChange={(columnId) => {\n stateActions.setGrouping(columnId ? [columnId] : []);\n }}\n tableColumns={table?.getAllColumns() || []}\n onColumnVisibilityChange={(columnId: string, visible: boolean) => {\n stateActions.setColumnVisibility({ ...state.columnVisibility, [columnId]: visible });\n }}\n onCreateRow={secureFeatures.creation && secureHandlers.onCreateRow ? () => stateActions.setCreating(true) : undefined}\n onImportClick={() => {\n if (document.activeElement instanceof HTMLElement) {\n lastFocusedElementRef.current = document.activeElement;\n }\n stateActions.setImportModal(true);\n }}\n onExport={handleExport}\n rowSelection={rowSelection}\n onDeleteSelected={\n secureHandlers.onDeleteSelected\n ? async (selectedRows: Record<string, boolean>) => {\n const selectedCount = Object.values(selectedRows).filter(Boolean).length;\n if (selectedCount === 0) {\n toast({\n title: 'No Selection',\n description: 'Please select at least one row to delete',\n variant: 'default',\n });\n return;\n }\n try {\n const result = secureHandlers.onDeleteSelected!(selectedRows) as any;\n if (result !== undefined && result !== null && typeof result === 'object' && typeof result.then === 'function') {\n await result;\n }\n toast({\n title: 'Delete Successful',\n description: `Successfully deleted ${selectedCount} ${selectedCount === 1 ? 'row' : 'rows'}`,\n variant: 'default',\n });\n } catch (error) {\n logger.error('Bulk delete error:', error);\n toast({\n title: 'Delete Failed',\n description: error instanceof Error ? error.message : 'Failed to delete selected rows',\n variant: 'destructive',\n });\n }\n }\n : undefined\n }\n onToggleFilterRow={() => stateActions.setFilterRow(!state.showFilterRow)}\n showFilterRow={state.showFilterRow}\n rbac={rbac}\n permissions={permissions}\n />\n </caption>\n\n <colgroup>\n {hasSelectColumn && <col span={1} data-col-type=\"select\" />}\n <col span={dataColumns} data-col-type=\"data\" />\n {hasActionsColumn && <col span={1} data-col-type=\"actions\" />}\n </colgroup>\n\n <thead>\n {table?.getHeaderGroups().map((headerGroup) => {\n const visibleHeaders = headerGroup.headers.filter((header) => {\n return typeof header.column.getIsVisible === 'function'\n ? header.column.getIsVisible()\n : true;\n });\n\n return (\n <tr key={headerGroup.id}>\n {visibleHeaders.map((header, index) => {\n const isFirst = index === 0;\n const isLast = index === visibleHeaders.length - 1;\n const isSortable = header.column.getCanSort();\n const ariaSort = isSortable\n ? header.column.getIsSorted() === 'asc'\n ? 'ascending'\n : header.column.getIsSorted() === 'desc'\n ? 'descending'\n : 'none'\n : undefined;\n const isRightAligned = header.column.columnDef.meta?.align === 'right';\n\n const handleSortClick = (event: React.MouseEvent) => {\n const originalHandler = header.column.getToggleSortingHandler();\n if (originalHandler) {\n originalHandler(event);\n }\n\n const columnName =\n typeof header.column.columnDef.header === 'string'\n ? header.column.columnDef.header\n : 'column';\n const currentSort = header.column.getIsSorted();\n const newSort = currentSort === 'asc' ? 'desc' : currentSort === 'desc' ? null : 'asc';\n announceSortChange(columnName, newSort);\n };\n\n const headerKeyboardHandlers = keyboardNavigation.getHeaderKeyboardHandlers(\n header.index,\n () => {\n const originalHandler = header.column.getToggleSortingHandler();\n if (originalHandler) {\n originalHandler({} as any);\n }\n\n const columnName =\n typeof header.column.columnDef.header === 'string'\n ? header.column.columnDef.header\n : 'column';\n const currentSort = header.column.getIsSorted();\n const newSort = currentSort === 'asc' ? 'desc' : currentSort === 'desc' ? null : 'asc';\n announceSortChange(columnName, newSort);\n }\n );\n\n return (\n <th\n key={header.id}\n className={cn(\n 'px-3 py-2 bg-main-200',\n isRightAligned ? 'text-right' : 'text-left',\n isFirst && 'rounded-l-md',\n isLast && 'rounded-r-md'\n )}\n scope=\"col\"\n role=\"columnheader\"\n {...(isSortable ? { 'aria-sort': ariaSort } : {})}\n {...(isSortable ? headerKeyboardHandlers : {})}\n >\n {header.isPlaceholder ? null : isSortable ? (\n <Button\n variant=\"ghost\"\n className={`h-auto p-0 font-bold hover:bg-transparent ${isRightAligned ? 'justify-end' : 'justify-start'}`}\n onClick={handleSortClick}\n {...headerKeyboardHandlers}\n aria-label={`Sort by ${\n typeof header.column.columnDef.header === 'string'\n ? header.column.columnDef.header\n : 'column'\n }`}\n tabIndex={0}\n >\n {typeof header.column.columnDef.header === 'function'\n ? header.column.columnDef.header(header.getContext())\n : header.column.columnDef.header}\n {header.column.getIsSorted() === 'asc' ? (\n <ChevronUp className=\"size-4\" />\n ) : header.column.getIsSorted() === 'desc' ? (\n <ChevronDown className=\"size-4\" />\n ) : (\n <ChevronsUpDown className=\"size-4\" />\n )}\n </Button>\n ) : typeof header.column.columnDef.header === 'function' ? (\n header.column.columnDef.header(header.getContext())\n ) : (\n header.column.columnDef.header\n )}\n </th>\n );\n })}\n </tr>\n );\n })}\n </thead>\n\n <UnifiedTableBody\n table={table}\n isCreating={state.isCreating}\n creationData={state.creationData}\n onCreationDataChange={stateActions.setCreationData}\n onSaveCreation={() => {\n if (onCreateRow) {\n onCreateRow(state.creationData as Partial<TData>);\n stateActions.clearCreationData();\n stateActions.setCreating(false);\n }\n }}\n onCancelCreation={() => {\n stateActions.clearCreationData();\n stateActions.setCreating(false);\n }}\n editingRowId={state.editingRowId}\n editingData={state.editingData}\n onEditingDataChange={(data) => {\n if (state.editingRowId) {\n stateActions.setEditingRow(state.editingRowId, data);\n }\n }}\n onSaveEditing={() => {\n if (onEditRow && state.editingRowId) {\n const originalRow = data.find((row) => {\n try {\n const rowId = resolvedGetRowId(row, 0);\n return rowId === state.editingRowId;\n } catch {\n return false;\n }\n });\n if (originalRow) {\n onEditRow(originalRow, state.editingData as Partial<TData>);\n }\n }\n stateActions.clearEditing();\n }}\n onCancelEditing={() => {\n stateActions.clearEditing();\n }}\n grouping={state.grouping}\n aggregates={aggregates}\n getRowId={resolvedGetRowId}\n emptyState={React.isValidElement(emptyState) ? undefined : (emptyState as any)}\n isFiltered={searchQuery !== '' || state.columnFilters.length > 0}\n onClearFilters={() => {\n onSearch('');\n stateActions.setColumnFilters([]);\n }}\n enableFiltering={secureFeatures.filtering}\n showFilterRow={state.showFilterRow}\n dataLength={finalTableData?.length || 0}\n virtualHeight={virtualHeight}\n forceVirtualization={false}\n hierarchical={\n secureFeatures.hierarchical && hierarchical?.enabled && hierarchicalState\n ? {\n ...hierarchical,\n state: hierarchicalState,\n expandAll: hierarchicalState.expandAll,\n collapseAll: hierarchicalState.collapseAll,\n isAllExpanded:\n hierarchicalState.getExpandedIds().length > 0 &&\n hierarchicalState.getExpandedIds().length === (finalTableData as any[]).filter((row) => (row as any).isParent).length,\n hasAnyChildren: (finalTableData as any[]).some((row) => (row as any).isParent),\n }\n : undefined\n }\n actions={effectiveActions}\n rbac={rbac}\n permissions={permissions}\n />\n\n {secureFeatures.pagination && (\n <tfoot>\n <tr>\n <td colSpan={visibleColumns.length}>\n <PaginationComponent\n table={table}\n pageSizeOptions={finalPageSizeOptions}\n paginationMode={finalPaginationMode}\n totalCount={finalDataCount}\n isLoading={isLoading}\n />\n </td>\n </tr>\n </tfoot>\n )}\n </table>\n\n <DataTableModals\n showImportModal={state.showImportModal}\n onCloseImportModal={() => stateActions.setImportModal(false)}\n onImport={async (modalData: TData[]) => {\n if (onImport) {\n try {\n const result = onImport(modalData);\n if (result && typeof result.then === 'function') {\n await result;\n }\n\n toast({\n title: 'Import Successful',\n description: `Successfully imported ${modalData.length} ${modalData.length === 1 ? 'row' : 'rows'}`,\n variant: 'default',\n });\n } catch (error) {\n logger.error('Import error:', error);\n toast({\n title: 'Import Failed',\n description: error instanceof Error ? error.message : 'Failed to import data',\n variant: 'destructive',\n });\n return;\n }\n } else {\n logger.error('onImport handler not provided');\n toast({\n title: 'Import Not Configured',\n description: 'Import functionality requires an onImport handler to be provided.',\n variant: 'destructive',\n });\n return;\n }\n stateActions.setImportModal(false);\n }}\n importModalConfig={importModalConfig}\n columns={columns.map((col) => ({\n id: col.id,\n accessorKey: col.accessorKey,\n header: typeof col.header === 'string' ? col.header : undefined,\n editAccessorKey: col.editAccessorKey,\n }))}\n />\n </>\n );\n}\n","/**\n * @file Button Component Suite\n * @package @jmruthers/pace-core\n * @module Components\n * @since 0.1.0\n *\n * A comprehensive button component suite including Button, ButtonGroup, and IconButton.\n * Provides flexible, accessible button components with consistent styling and behavior.\n *\n * Features:\n * - Multiple variants (default, destructive, outline, secondary, ghost, link)\n * - Multiple sizes (default, sm, lg, icon)\n * - Button grouping with consistent styling\n * - Icon-only buttons with accessibility support\n * - Tooltip integration for icon buttons\n * - Composition support with asChild prop\n *\n * @example\n * ```tsx\n * // Basic button\n * <Button>Click me</Button>\n * \n * // Button with variants\n * <Button variant=\"destructive\" size=\"lg\">Delete</Button>\n * \n * // Button group\n * <ButtonGroup variant=\"outline\" spacing=\"md\">\n * <Button>Cancel</Button>\n * <Button variant=\"primary\">Save</Button>\n * </ButtonGroup>\n * \n * // Icon button\n * <IconButton \n * icon={<Settings />} \n * aria-label=\"Settings\"\n * tooltip=\"Open settings\"\n * />\n * ```\n *\n * @accessibility\n * - Proper ARIA attributes and roles\n * - Keyboard navigation support\n * - Screen reader friendly\n * - Focus management\n */\n\nimport * as React from 'react';\nimport { Slot } from '@radix-ui/react-slot';\nimport { cn } from '../../utils/core/cn';\nimport { Tooltip } from '../Tooltip';\n\n// ============================================================================\n// BASE BUTTON COMPONENT\n// ============================================================================\n\n/**\n * Button component props\n * Extends standard HTML button attributes with button-specific styling and behavior options.\n * \n * @interface ButtonProps\n */\n/**\n * Props for the Button component.\n * Extends standard button HTML attributes.\n */\nexport interface ButtonProps extends React.ButtonHTMLAttributes<HTMLButtonElement> {\n /** Visual variant of the button */\n variant?: 'default' | 'destructive' | 'outline' | 'secondary' | 'ghost' | 'link';\n /** Size of the button */\n size?: 'default' | 'sm' | 'lg' | 'icon';\n /** Whether to render as a different element using Radix Slot */\n asChild?: boolean;\n}\n\n/**\n * Get button classes based on variant and size\n */\nfunction getButtonClasses(variant: ButtonProps['variant'] = 'default', size: ButtonProps['size'] = 'default'): string {\n const baseClasses = 'inline-flex items-center justify-center gap-2 whitespace-nowrap rounded-md text-sm font-medium transition-colors focus-visible:outline-none focus-visible:ring-1 focus-visible:ring-ring disabled:pointer-events-none disabled:opacity-50';\n \n const variantClasses = {\n default: 'bg-main-600 text-main-50 shadow hover:bg-acc-400',\n destructive: 'bg-acc-600 text-acc-50 shadow-sm hover:bg-acc-400',\n outline: 'border border-main-300 bg-background shadow-sm hover:bg-acc-400',\n secondary: 'bg-sec-100 text-sec-900 shadow-sm hover:bg-acc-400',\n ghost: 'hover:bg-acc-400',\n link: 'text-main-700 underline-offset-4 hover:underline hover:drop-shadow-lg hover:drop-shadow-acc-400',\n };\n \n const sizeClasses = {\n default: 'h-9 px-4 py-2',\n sm: 'h-8 rounded-md px-3 text-xs',\n lg: 'h-10 rounded-md px-8',\n icon: 'size-8',\n };\n \n return `${baseClasses} ${variantClasses[variant]} ${sizeClasses[size]}`;\n}\n\n/**\n * Button Component\n * A flexible, accessible button component with multiple variants and sizes.\n * \n * @component\n * @example\n * ```tsx\n * // Basic button\n * <Button>Click me</Button>\n * \n * // Button with variant and size\n * <Button variant=\"destructive\" size=\"lg\">Delete</Button>\n * \n * // Button as child (composition)\n * <Button asChild>\n * <Link href=\"/dashboard\">Go to Dashboard</Link>\n * </Button>\n * ```\n */\nconst Button = React.forwardRef<HTMLButtonElement, ButtonProps>(\n ({ className, variant, size, asChild = false, type = 'button', disabled, ...props }, ref) => {\n const Comp = asChild ? Slot : 'button';\n return (\n <Comp\n className={cn(getButtonClasses(variant, size), className)}\n ref={ref}\n type={!asChild ? type : undefined}\n disabled={disabled}\n aria-disabled={disabled ? 'true' : undefined}\n {...props}\n />\n );\n }\n);\nButton.displayName = 'Button';\n\n// ============================================================================\n// BUTTON GROUP COMPONENT\n// ============================================================================\n\n/**\n * ButtonGroup component props\n * Configuration for grouping multiple buttons with consistent styling and spacing.\n * \n * @interface ButtonGroupProps\n */\nexport type ButtonGroupProps = {\n /** Child elements to be rendered in the group */\n children: React.ReactNode;\n /** Layout orientation of the button group */\n orientation?: 'horizontal' | 'vertical';\n /** Visual variant to apply to all buttons in the group */\n variant?: 'default' | 'outline' | 'ghost';\n /** Size to apply to all buttons in the group */\n size?: 'sm' | 'default' | 'lg';\n /** Additional CSS classes to apply to the group container */\n className?: string;\n /** Spacing between buttons in the group */\n spacing?: 'none' | 'sm' | 'md' | 'lg';\n};\n\n/**\n * A component that groups multiple buttons together with consistent styling and spacing.\n * Automatically applies variant and size props to child Button components.\n * \n * @component\n * @example\n * ```tsx\n * // Basic horizontal group\n * <ButtonGroup>\n * <Button>Cancel</Button>\n * <Button variant=\"primary\">Save</Button>\n * </ButtonGroup>\n * \n * // Vertical group with custom spacing\n * <ButtonGroup \n * orientation=\"vertical\" \n * spacing=\"md\"\n * variant=\"outline\"\n * >\n * <Button>Option 1</Button>\n * <Button>Option 2</Button>\n * <Button>Option 3</Button>\n * </ButtonGroup>\n * ```\n */\nexport function ButtonGroup({\n children,\n orientation = 'horizontal',\n variant,\n size,\n className,\n spacing = 'sm'\n}: ButtonGroupProps) {\n const spacingClasses = {\n none: '',\n sm: orientation === 'horizontal' ? 'space-x-1' : 'space-y-1',\n md: orientation === 'horizontal' ? 'space-x-2' : 'space-y-2',\n lg: orientation === 'horizontal' ? 'space-x-4' : 'space-y-4'\n };\n\n return (\n <fieldset\n className={cn(\n 'flex',\n orientation === 'horizontal' ? 'flex-row items-center' : 'flex-col',\n spacingClasses[spacing],\n className\n )}\n role=\"group\"\n >\n {React.Children.map(children, (child) => {\n if (React.isValidElement(child) && child.type) {\n // Check if child is a Button component by checking displayName\n // Type assertion needed because React.ComponentType doesn't guarantee displayName\n const componentType = child.type as React.ComponentType<unknown> & { displayName?: string };\n if (componentType.displayName === 'Button') {\n const childProps = child.props as { variant?: string; size?: string; [key: string]: unknown };\n return React.cloneElement(child, {\n variant: childProps.variant || variant,\n size: childProps.size || size,\n ...childProps\n } as typeof childProps);\n }\n }\n return child;\n })}\n </fieldset>\n );\n}\n\n// ============================================================================\n// ICON BUTTON COMPONENT\n// ============================================================================\n\n/**\n * IconButton component props\n * Extends ButtonProps but requires an icon and aria-label instead of children.\n * \n * @interface IconButtonProps\n */\nexport type IconButtonProps = Omit<ButtonProps, 'children'> & {\n /** The icon element to display in the button */\n icon: React.ReactNode;\n /** Accessibility label for the button (required for screen readers) */\n 'aria-label': string;\n /** Optional tooltip text to show on hover */\n tooltip?: string;\n};\n\n/**\n * IconButton Component\n * A button component specifically designed for icon-only interactions.\n * \n * @component\n * @example\n * ```tsx\n * <IconButton \n * icon={<Settings />} \n * aria-label=\"Settings\"\n * tooltip=\"Open settings\"\n * onClick={handleClick} \n * />\n * ```\n */\nexport const IconButton = React.forwardRef<HTMLButtonElement, IconButtonProps>(\n ({ icon, className, size = 'icon', 'aria-label': ariaLabel, tooltip, ...props }, ref) => {\n const button = (\n <Button\n ref={ref}\n size={size}\n className={cn('shrink-0', className)}\n aria-label={ariaLabel}\n {...props}\n >\n {icon}\n </Button>\n );\n\n if (tooltip) {\n return (\n <Tooltip content={tooltip}>\n {button}\n </Tooltip>\n );\n }\n\n return button;\n }\n);\n\nIconButton.displayName = 'IconButton';\n\n// ============================================================================\n// EXPORTS\n// ============================================================================\n\nexport { Button };\n","/**\n * @file Tooltip Component System\n * @package @jmruthers/pace-core\n * @module Components/Tooltip\n * @since 0.1.0\n *\n * A comprehensive tooltip component system built on top of Radix UI primitives.\n * Provides accessible tooltips with customizable positioning and animations.\n *\n * Features:\n * - Multiple positioning options (top, bottom, left, right)\n * - Customizable delay duration\n * - Smooth animations and transitions\n * - Keyboard and mouse interaction\n * - Screen reader support\n * - Responsive design\n * - Customizable styling\n * - Focus management\n *\n * @example\n * ```tsx\n * // Basic tooltip\n * <Tooltip content=\"This is a helpful tooltip\">\n * <Button>Hover me</Button>\n * </Tooltip>\n * \n * // Tooltip with custom delay\n * <Tooltip content=\"Custom delay\" delayDuration={500}>\n * <IconButton icon={<Info />} />\n * </Tooltip>\n * \n * // Advanced tooltip with custom content\n * <TooltipProvider>\n * <TooltipRoot>\n * <TooltipTrigger asChild>\n * <Button>Advanced Tooltip</Button>\n * </TooltipTrigger>\n * <TooltipContent side=\"top\" className=\"bg-main-500 text-main-50\">\n * <section className=\"space-y-1\">\n * <p className=\"font-semibold\">Advanced Tooltip</p>\n * <p className=\"text-xs\">With custom styling</p>\n * </section>\n * </TooltipContent>\n * </TooltipRoot>\n * </TooltipProvider>\n * \n * // Tooltip on disabled element\n * <Tooltip content=\"This feature is coming soon\">\n * <Button disabled>Coming Soon</Button>\n * </Tooltip>\n * ```\n *\n * @accessibility\n * - WCAG 2.1 AA compliant\n * - Proper ARIA attributes and roles\n * - Keyboard navigation support\n * - Screen reader announcements\n * - Focus management\n * - High contrast support\n * - Reduced motion support\n *\n * @performance\n * - Efficient positioning calculations\n * - Optimized animations\n * - Memory leak prevention\n * - Lazy rendering\n *\n * @dependencies\n * - @radix-ui/react-tooltip - Core tooltip functionality\n * - React 19+ - Hooks and refs\n * - Tailwind CSS - Styling and animations\n */\n\nimport * as React from \"react\";\nimport * as TooltipPrimitive from \"@radix-ui/react-tooltip\";\nimport { cn } from \"../../utils/core/cn\";\n\nconst TooltipProvider = TooltipPrimitive.Provider;\n\nconst TooltipRoot = TooltipPrimitive.Root;\n\nconst TooltipTrigger = TooltipPrimitive.Trigger;\n\n/**\n * TooltipContent component\n * The content container for tooltip information\n * \n * @param props - Content configuration and styling\n * @param ref - Forwarded ref to the content element\n * @returns JSX.Element - The tooltip content container\n * \n * @example\n * ```tsx\n * <TooltipContent side=\"top\" className=\"bg-main-500\">\n * Custom tooltip content\n * </TooltipContent>\n * ```\n */\nconst TooltipContent = React.forwardRef<\n React.ElementRef<typeof TooltipPrimitive.Content>,\n React.ComponentPropsWithoutRef<typeof TooltipPrimitive.Content>\n>(({ className, sideOffset = 4, ...props }, ref) => (\n <TooltipPrimitive.Content\n ref={ref}\n sideOffset={sideOffset}\n className={cn(\n \"z-50 overflow-hidden rounded-md border bg-main-500 px-3 py-1.5 text-sm text-main-50 shadow-md animate-in fade-in-0 zoom-in-95 data-[state=closed]:animate-out data-[state=closed]:fade-out-0 data-[state=closed]:zoom-out-95 data-[side=bottom]:slide-in-from-top-2 data-[side=left]:slide-in-from-right-2 data-[side=right]:slide-in-from-left-2 data-[side=top]:slide-in-from-bottom-2\",\n className\n )}\n {...props}\n />\n));\nTooltipContent.displayName = TooltipPrimitive.Content.displayName;\n\n/**\n * Props for the simplified Tooltip component\n */\nexport interface TooltipProps {\n /** The element that triggers the tooltip */\n children: React.ReactNode;\n /** The content to display in the tooltip */\n content: React.ReactNode;\n /** Delay before showing the tooltip (in milliseconds) */\n delayDuration?: number;\n}\n\n/**\n * Tooltip component\n * A simplified tooltip component for easy usage\n * \n * @param props - Tooltip configuration\n * @param ref - Forwarded ref to the trigger element\n * @returns JSX.Element - The tooltip with trigger and content\n * \n * @example\n * ```tsx\n * <Tooltip content=\"This is a helpful tooltip\">\n * <Button>Hover me</Button>\n * </Tooltip>\n * ```\n */\nconst Tooltip = React.forwardRef<\n React.ElementRef<typeof TooltipPrimitive.Trigger>,\n TooltipProps\n>(({ children, content, delayDuration = 200 }, ref) => (\n <TooltipProvider>\n <TooltipRoot delayDuration={delayDuration}>\n <TooltipTrigger ref={ref} asChild>\n <span>\n {children}\n </span>\n </TooltipTrigger>\n <TooltipContent>\n {content}\n </TooltipContent>\n </TooltipRoot>\n </TooltipProvider>\n));\nTooltip.displayName = \"Tooltip\";\n\nexport {\n Tooltip,\n TooltipProvider,\n TooltipRoot,\n TooltipTrigger,\n TooltipContent,\n};\n","/**\n * @file Input Component Suite\n * @package @jmruthers/pace-core\n * @module Input\n * @since 0.1.0\n *\n * A comprehensive input component suite including Input and InputGroup.\n * Provides flexible, accessible input components with consistent styling and behavior.\n *\n * Features:\n * - Multiple input variants (default, destructive)\n * - Multiple input sizes (sm, md, lg)\n * - Error state styling\n * - Input grouping with consistent spacing\n * - Horizontal and vertical orientation support\n * - Forwarded ref support\n * - Composition support\n *\n * @example\n * ```tsx\n * // Basic input\n * <Input placeholder=\"Enter text\" />\n * \n * // Input with variants and sizes\n * <Input \n * variant=\"destructive\" \n * size=\"lg\" \n * placeholder=\"Error input\" \n * />\n * \n * // Input group\n * <InputGroup orientation=\"horizontal\" spacing=\"md\">\n * <Input placeholder=\"First name\" />\n * <Input placeholder=\"Last name\" />\n * </InputGroup>\n * \n * // Vertical input group\n * <InputGroup orientation=\"vertical\" spacing=\"lg\">\n * <Input placeholder=\"Email\" type=\"email\" />\n * <Input placeholder=\"Password\" type=\"password\" />\n * </InputGroup>\n * ```\n *\n * @accessibility\n * - Proper ARIA attributes and roles\n * - Keyboard navigation support\n * - Screen reader friendly\n * - Focus management\n */\n\nimport * as React from 'react';\nimport { cn } from '../../utils/core/cn';\n\n// ============================================================================\n// BASE INPUT COMPONENT\n// ============================================================================\n\n/**\n * Props for the Input component.\n * Extends standard input HTML attributes.\n */\nexport interface InputProps\n extends Omit<React.InputHTMLAttributes<HTMLInputElement>, 'size'> {\n /**\n * Input variant style\n */\n variant?: 'default' | 'destructive';\n \n /**\n * Input size\n */\n size?: 'sm' | 'md' | 'lg';\n \n /**\n * Error state for styling\n */\n error?: boolean;\n}\n\n/**\n * Input component\n * A flexible, accessible input component with multiple variants and sizes\n * \n * @param props - Input configuration and styling\n * @param ref - Forwarded ref to the input element\n * @returns JSX.Element - The rendered input element\n * \n * @example\n * ```tsx\n * // Basic input\n * <Input placeholder=\"Enter your name\" />\n * \n * // Input with error state\n * <Input \n * placeholder=\"Email\" \n * type=\"email\" \n * error={true}\n * />\n * \n * // Large input with destructive variant\n * <Input \n * variant=\"destructive\" \n * size=\"lg\" \n * placeholder=\"Error input\" \n * />\n * ```\n */\nfunction Input({ className, variant = 'default', size = 'md', error, type, ref, ...props }: InputProps & { ref?: React.Ref<HTMLInputElement> }) {\n return (\n <input\n type={type}\n className={cn(\n // Base styles\n 'flex w-full rounded-md border border-input bg-background px-3 py-2 text-sm ring-offset-background file:border-0 file:bg-transparent file:text-sm file:font-medium placeholder:text-muted-foreground focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring focus-visible:ring-offset-2 disabled:cursor-not-allowed disabled:opacity-50',\n \n // Variant styles\n {\n 'border-input': variant === 'default' && !error,\n 'border-destructive focus-visible:ring-destructive': variant === 'destructive' || error,\n },\n \n // Size styles\n {\n 'h-8 px-2 py-1 text-xs': size === 'sm',\n 'h-9 px-3 py-2 text-sm': size === 'md',\n 'h-10 px-4 py-3 text-base': size === 'lg',\n },\n \n className\n )}\n ref={ref}\n {...props}\n />\n );\n}\n\nInput.displayName = 'Input';\n\n// ============================================================================\n// INPUT GROUP COMPONENT\n// ============================================================================\n\nexport interface InputGroupProps extends React.HTMLAttributes<HTMLFieldSetElement> {\n /** Child elements to be rendered in the group */\n children: React.ReactNode;\n /** Layout orientation of the input group */\n orientation?: 'horizontal' | 'vertical';\n /** Spacing between inputs in the group */\n spacing?: 'sm' | 'md' | 'lg';\n}\n\n/**\n * InputGroup Component\n * A container component that groups multiple inputs together with consistent spacing.\n * \n * @component\n * @example\n * ```tsx\n * // Horizontal group\n * <InputGroup orientation=\"horizontal\" spacing=\"md\">\n * <Input placeholder=\"First name\" />\n * <Input placeholder=\"Last name\" />\n * </InputGroup>\n * \n * // Vertical group\n * <InputGroup orientation=\"vertical\" spacing=\"lg\">\n * <Input placeholder=\"Email\" type=\"email\" />\n * <Input placeholder=\"Password\" type=\"password\" />\n * </InputGroup>\n * ```\n */\nexport const InputGroup = React.forwardRef<HTMLFieldSetElement, InputGroupProps>(\n ({ className, children, orientation = 'vertical', spacing = 'md', ...props }, ref) => {\n const spacingClasses = {\n sm: orientation === 'horizontal' ? 'space-x-2' : 'space-y-2',\n md: orientation === 'horizontal' ? 'space-x-4' : 'space-y-4',\n lg: orientation === 'horizontal' ? 'space-x-6' : 'space-y-6'\n };\n\n return (\n <fieldset\n ref={ref}\n className={cn(\n 'flex',\n orientation === 'horizontal' ? 'flex-row items-end' : 'flex-col',\n spacingClasses[spacing],\n className\n )}\n {...props}\n >\n {children}\n </fieldset>\n );\n }\n);\n\nInputGroup.displayName = 'InputGroup';\n\n// ============================================================================\n// EXPORTS\n// ============================================================================\n\nexport { Input };\n","/**\n * @file DataTable Toolbar Component\n * @package @jmruthers/pace-core\n * @module Components/DataTable/Components\n * @since 0.3.0\n * \n * The DataTable toolbar provides a comprehensive interface for table operations including\n * search, grouping, column visibility, and action buttons. It's positioned above the table\n * and contains all primary user interactions.\n * \n * Features:\n * - Global search with debounced input\n * - Column-based grouping controls\n * - Column visibility toggles\n * - Custom toolbar buttons\n * - Import/Export actions\n * - Row creation button\n * - Responsive layout that adapts to screen size\n * \n * @example\n * ```tsx\n * <DataTableToolbar\n * searchable={true}\n * globalFilter=\"\"\n * onGlobalFilterChange={(value) => setFilter(value)}\n * enableGrouping={true}\n * columns={columns}\n * grouping={[]}\n * onGroupByChange={(columnId) => setGroupBy(columnId)}\n * enableColumnVisibility={true}\n * tableColumns={table.getAllColumns()}\n * onColumnVisibilityChange={(id, visible) => toggleColumn(id, visible)}\n * toolbarButtons={customButtons}\n * enableCreation={true}\n * onCreateRow={() => openCreateModal()}\n * enableImport={true}\n * onImportClick={() => openImportModal()}\n * exportable={true}\n * onExport={() => exportData()}\n * />\n * ```\n * \n * @accessibility\n * - Search input has proper aria-label\n * - All buttons have descriptive labels\n * - Keyboard navigation support\n * - Focus management\n * \n * @performance\n * - Search input uses debounced onChange to prevent excessive filtering\n * - Button renders are memoized\n * - Dropdown menus use virtual scrolling for large column lists\n */\n\nimport React from 'react';\nimport { Input } from '../../Input/Input';\nimport { Button } from '../../Button/Button';\nimport { Search, Plus, Upload, Download, Settings2, Filter, Trash2 } from 'lucide-react';\nimport { GroupingDropdown } from './GroupingDropdown';\nimport { ColumnVisibilityDropdown } from './ColumnVisibilityDropdown';\nimport type { DataTableColumn, DataRecord, SimpleColumn, DataTableFeatureConfig, DataTableRBACConfig } from '../types';\nimport type { Column } from '@tanstack/react-table';\n\n/**\n * Props for the DataTable toolbar component\n * @template TData - The type of data records in the table\n */\ninterface DataTableToolbarProps<TData extends DataRecord = DataRecord> {\n // Feature configuration\n /** Feature configuration for the toolbar */\n features: DataTableFeatureConfig;\n \n // MANDATORY RBAC\n /** RBAC configuration - REQUIRED for all DataTables */\n rbac: DataTableRBACConfig;\n /** Permission states for RBAC enforcement */\n permissions: {\n canCreate: { can: boolean; isLoading: boolean };\n canImport: { can: boolean; isLoading: boolean };\n canExport: { can: boolean; isLoading: boolean };\n canDelete: { can: boolean; isLoading: boolean };\n };\n \n // Data and state\n /** Current global filter value */\n globalFilter: string;\n /** Callback when global filter changes */\n onGlobalFilterChange: (value: string) => void;\n /** Column definitions for grouping dropdown */\n columns: (DataTableColumn<TData> | SimpleColumn<TData>)[];\n /** Currently applied grouping columns */\n grouping: string[];\n /** Callback when grouping changes */\n onGroupByChange: (columnId: string | null) => void;\n /** Table columns from TanStack Table instance */\n tableColumns: Column<TData, unknown>[];\n /** Callback when column visibility changes */\n onColumnVisibilityChange: (columnId: string, visible: boolean) => void;\n /** Current row selection state */\n rowSelection: Record<string, boolean>;\n \n // Callbacks\n /** Callback when create row button is clicked */\n onCreateRow?: () => void;\n /** Callback when import button is clicked */\n onImportClick: () => void;\n /** Callback when export button is clicked */\n onExport: () => void;\n /** Callback when delete selected button is clicked */\n onDeleteSelected?: (selectedRows: Record<string, boolean>) => void;\n /** Callback when filter toggle button is clicked */\n onToggleFilterRow?: () => void;\n \n // Filter state\n /** Whether the filter row is currently visible */\n showFilterRow?: boolean;\n}\n\n/**\n * DataTable toolbar component that provides search, filtering, and action controls\n * \n * This component renders the top toolbar of the DataTable with various controls including:\n * - Global search input (left side)\n * - Grouping dropdown (left side)\n * - Action buttons and controls (right side)\n * \n * The toolbar uses a responsive flexbox layout that adapts to different screen sizes.\n * \n * @template TData - The type of data records in the table\n * @param props - The toolbar props\n * @returns JSX.Element - The rendered toolbar component\n * \n * @example\n * ```tsx\n * <DataTableToolbar\n * searchable={true}\n * globalFilter=\"john\"\n * onGlobalFilterChange={(value) => setFilter(value)}\n * enableGrouping={true}\n * // ... other props\n * />\n * ```\n */\n/**\n * Toolbar component for DataTable.\n * Provides search, filters, export/import, and other table actions.\n * \n * @template TData - The type of data records in the table\n * @param props - Toolbar configuration and handlers\n * @returns The rendered toolbar\n */\nexport function DataTableToolbar<TData extends DataRecord>({\n features,\n rbac,\n permissions,\n globalFilter,\n onGlobalFilterChange,\n columns,\n grouping,\n onGroupByChange,\n tableColumns,\n onColumnVisibilityChange,\n rowSelection,\n onCreateRow,\n onImportClick,\n onExport,\n onDeleteSelected,\n onToggleFilterRow,\n showFilterRow = false,\n}: DataTableToolbarProps<TData>) {\n const currentGroupBy = grouping.length > 0 ? grouping[0] : null;\n\n return (\n\n<nav className=\"flex justify-end flex-wrap gap-2\">\n {features.search && (\n\n <Input\n id=\"table-search\"\n placeholder=\"Search...\"\n value={globalFilter}\n onChange={(e) => onGlobalFilterChange(e.target.value)}\n aria-label=\"Search table\"\n tabIndex={0}\n className=\"justify-self-start w-50 flex-1\"\n />\n\n )}\n\n\n \n {/* Grouping */}\n {features.grouping && (\n <GroupingDropdown\n columns={columns}\n currentGroupBy={currentGroupBy}\n onGroupByChange={onGroupByChange}\n />\n )}\n \n {/* Column Visibility */}\n {features.columnVisibility && (\n <ColumnVisibilityDropdown\n columns={tableColumns}\n onColumnVisibilityChange={onColumnVisibilityChange}\n />\n )}\n\n {/* Filter Toggle */}\n {features.filtering && onToggleFilterRow && (\n <Button \n variant=\"outline\" \n onClick={onToggleFilterRow}\n >\n <Filter className=\"size-4 mr-2 flex-shrink-0\" />\n <span className=\"truncate\">\n {showFilterRow ? 'Hide Filters' : 'Show Filters'}\n </span>\n </Button>\n )}\n\n {/* Row Creation - ONLY if user has create permission */}\n {features.creation && permissions.canCreate.can && onCreateRow && (\n <Button \n variant=\"outline\" \n onClick={onCreateRow}\n >\n <Plus className=\"size-4 mr-2 flex-shrink-0\" />\n <span className=\"truncate\">Add Row</span>\n </Button>\n )}\n\n {/* Import - ONLY if user has import permission */}\n {features.import && permissions.canImport.can && (\n <Button\n variant=\"outline\"\n onClick={onImportClick}\n data-restore-target=\"datatable-import-button\"\n >\n <Upload className=\"size-4 mr-2 flex-shrink-0\" />\n <span className=\"truncate\">Import</span>\n </Button>\n )}\n\n {/* Export - ONLY if user has export permission */}\n {features.export && permissions.canExport.can && (\n <Button \n variant=\"outline\" \n onClick={onExport}\n >\n <Download className=\"size-4 mr-2 flex-shrink-0\" />\n <span className=\"truncate\">Export</span>\n </Button>\n )}\n\n {/* Delete Selected - ONLY if user has delete permission */}\n {features.deleteSelected && features.deletion && features.selection && permissions.canDelete.can && (\n <Button\n variant=\"destructive\"\n onClick={() => onDeleteSelected?.(rowSelection)}\n disabled={Object.values(rowSelection).filter(Boolean).length === 0}\n >\n <Trash2 className=\"size-4 mr-2 flex-shrink-0\" />\n <span className=\"truncate\">Delete</span>\n </Button>\n )}\n\n </nav>\n\n );\n}\n","/**\n * @file Select Component - Refactored SOLID Implementation\n * @package @jmruthers/pace-core\n * @module Components/Select\n * @since 0.4.0\n *\n * Refactored Select component following SOLID principles:\n * - Single Responsibility: Each component has one clear purpose\n * - Open/Closed: Easy to extend without modification\n * - Liskov Substitution: Components can be substituted\n * - Interface Segregation: Small, focused interfaces\n * - Dependency Inversion: Depends on abstractions, not concretions\n */\n\nimport * as React from \"react\";\nimport { Search, X, ChevronDown, Check } from \"lucide-react\";\nimport { Button } from \"../Button/Button\";\nimport { cn } from \"../../utils/core/cn\";\nimport { SelectContext, useSelectContext } from \"./context\";\nimport { useSelectEvents } from \"./hooks/useSelectEvents\";\nimport { useSelectSearch } from \"./hooks/useSelectSearch\";\nimport { useSelectState } from \"./hooks/useSelectState\";\nimport type {\n SelectContentProps,\n SelectContextValue,\n SelectItemProps,\n SelectProps,\n SelectTriggerProps,\n SelectValueProps,\n UseSelectStateProps,\n} from \"./types\";\nimport { getTextContent } from \"./utils/text\";\n\n// ============================================================================\n// ROOT COMPONENT\n// ============================================================================\n\n/**\n * Select component root.\n * Provides select dropdown functionality with search, keyboard navigation, and accessibility.\n * \n * @param props - Select configuration\n * @param ref - Forwarded ref to the form element\n * @returns The rendered select component\n */\nexport const Select = React.forwardRef<HTMLFormElement, SelectProps & UseSelectStateProps>(\n ({ \n children,\n className,\n direction = 'down',\n ...selectProps\n }, ref) => {\n const internalRef = React.useRef<HTMLFormElement>(null);\n const selectRef = React.useMemo(() => {\n if (ref && typeof ref === 'object' && 'current' in ref) {\n return ref as React.RefObject<HTMLFormElement | null>;\n }\n return internalRef;\n }, [ref]);\n\n // Use custom hooks for state management\n const { state, actions } = useSelectState(selectProps);\n const { isSelecting } = useSelectEvents({ state, actions, selectRef });\n\n // Map to store item values and their text\n const itemsMapRef = React.useRef<Map<string, string>>(new Map());\n const currentValueRef = React.useRef(state.value);\n\n // Update ref when value changes\n React.useEffect(() => {\n currentValueRef.current = state.value;\n }, [state.value]);\n\n // Helper to update selectedText if needed\n const updateSelectedTextIfNeeded = React.useCallback((value: string) => {\n if (value && value === currentValueRef.current) {\n const registeredText = itemsMapRef.current.get(value);\n if (registeredText) {\n actions.setSelectedText(registeredText);\n return true;\n }\n }\n return false;\n }, [actions.setSelectedText]);\n\n // Register/unregister functions\n const registerItem = React.useCallback((value: string, text: string) => {\n itemsMapRef.current.set(value, text);\n // If this is the currently selected value, update selectedText\n updateSelectedTextIfNeeded(value);\n }, [updateSelectedTextIfNeeded]);\n\n const unregisterItem = React.useCallback((value: string) => {\n itemsMapRef.current.delete(value);\n }, []);\n\n // Find selected text by querying the DOM (simplified approach)\n // Since SelectItems are always rendered (hidden when closed), we can always find them in the DOM\n const findAndSetSelectedText = React.useCallback(() => {\n if (!state.value) {\n actions.setSelectedText('');\n return;\n }\n\n const selectElement = selectRef.current;\n if (!selectElement) return;\n\n // Query the DOM for the SelectItem (li element) with matching value\n // Must be a select-item, not the trigger which also has data-value\n let selectItem = selectElement.querySelector(`[data-testid=\"select-item\"][data-value=\"${state.value}\"]`) as HTMLElement;\n \n // If not found, try querying within content containers\n if (!selectItem) {\n const hiddenContent = selectElement.querySelector('[data-testid=\"select-content-hidden\"]');\n if (hiddenContent) {\n selectItem = hiddenContent.querySelector(`[data-testid=\"select-item\"][data-value=\"${state.value}\"]`) as HTMLElement;\n }\n }\n \n // Try visible content as fallback\n if (!selectItem) {\n const visibleContent = selectElement.querySelector('[data-testid=\"select-content\"]');\n if (visibleContent) {\n selectItem = visibleContent.querySelector(`[data-testid=\"select-item\"][data-value=\"${state.value}\"]`) as HTMLElement;\n }\n }\n\n if (selectItem) {\n // Get text content, excluding the check icon text if present\n let textContent = selectItem.textContent?.trim() || '';\n // Remove any check mark icons or other decorators (basic cleanup)\n textContent = textContent.split('\\n').map(line => line.trim()).filter(line => line).join(' ');\n \n if (textContent) {\n actions.setSelectedText(textContent);\n // Also register it for future use\n itemsMapRef.current.set(state.value, textContent);\n return;\n }\n }\n \n // If not found and we have a content container, items might still be rendering\n // Don't clear selectedText in this case - let the MutationObserver or retry effect handle it\n const hasContentContainer = selectElement.querySelector('[data-testid=\"select-content-hidden\"]') || \n selectElement.querySelector('[data-testid=\"select-content\"]');\n if (!hasContentContainer) {\n // No content container means no items exist - clear selectedText\n actions.setSelectedText('');\n }\n }, [state.value, actions.setSelectedText, selectRef]);\n\n // Try to find text immediately in layout effect\n React.useLayoutEffect(() => {\n findAndSetSelectedText();\n }, [findAndSetSelectedText]);\n\n // Also try in regular effect as fallback (runs after all layout effects and rendering)\n // This ensures we catch items that render after the layout effect runs\n React.useEffect(() => {\n if (state.value && !state.selectedText) {\n // Use a small timeout to ensure DOM is fully rendered\n const timeoutId = setTimeout(() => {\n findAndSetSelectedText();\n }, 0);\n return () => clearTimeout(timeoutId);\n }\n }, [state.value, state.selectedText, findAndSetSelectedText]);\n\n // Watch for DOM mutations to catch when hidden items are rendered\n // This ensures we find items even if they render after the initial effects\n React.useEffect(() => {\n if (!state.value || state.selectedText) return;\n\n const selectElement = selectRef.current;\n if (!selectElement) return;\n\n // Try immediately\n findAndSetSelectedText();\n\n // Watch for changes in the DOM (when hidden items get rendered)\n const observer = new MutationObserver(() => {\n if (!state.selectedText) {\n findAndSetSelectedText();\n }\n });\n\n observer.observe(selectElement, {\n childList: true,\n subtree: true,\n });\n\n return () => observer.disconnect();\n }, [state.value, state.selectedText, findAndSetSelectedText, selectRef]);\n\n const contextValue = React.useMemo<SelectContextValue>(() => ({\n ...state,\n actions,\n registerItem,\n unregisterItem,\n direction,\n }), [state, actions, registerItem, unregisterItem, direction]);\n\n return (\n <form\n ref={selectRef}\n className={cn(\"relative\", className)}\n data-value={state.value}\n data-testid=\"select-root\"\n onSubmit={(e) => {\n e.preventDefault();\n e.stopPropagation();\n }}\n >\n <SelectContext.Provider value={contextValue}>\n {children}\n </SelectContext.Provider>\n </form>\n );\n }\n);\nSelect.displayName = \"Select\";\n\n// ============================================================================\n// TRIGGER COMPONENT\n// ============================================================================\n\n/**\n * Select trigger button component.\n * Opens/closes the select dropdown and displays the selected value.\n * \n * @param props - Select trigger configuration\n * @param ref - Forwarded ref to the button element\n * @returns The rendered select trigger\n */\nexport const SelectTrigger = React.forwardRef<HTMLButtonElement, SelectTriggerProps>(\n ({ children, className, variant = \"outline\", size = \"default\", asChild = false, ...props }, ref) => {\n const { open, disabled, value, actions, direction = 'down' } = useSelectContext();\n const opensUpward = direction === 'up';\n\n // Use ref to store the latest handleClick to avoid re-creating the effect\n const handleClickRef = React.useRef<(e: React.MouseEvent) => void>(undefined);\n \n const handleClick = React.useCallback((e: React.MouseEvent) => {\n if (disabled) {\n e.preventDefault();\n e.stopPropagation();\n return;\n }\n \n e.preventDefault();\n e.stopPropagation();\n actions.setOpen(!open);\n }, [disabled, open, actions]);\n\n // Update ref whenever handleClick changes\n React.useEffect(() => {\n handleClickRef.current = handleClick;\n }, [handleClick]);\n\n const handleKeyDown = (e: React.KeyboardEvent) => {\n if (disabled) return;\n\n switch (e.key) {\n case 'Enter':\n case ' ':\n case 'ArrowDown':\n case 'ArrowUp':\n e.preventDefault();\n actions.setOpen(true);\n break;\n case 'Escape':\n if (open) {\n e.preventDefault();\n actions.setOpen(false);\n }\n break;\n }\n };\n\n const triggerProps = {\n ref,\n type: \"button\" as const,\n role: \"combobox\",\n \"aria-expanded\": open,\n \"aria-haspopup\": \"listbox\",\n disabled,\n className: cn(\n \"!justify-between relative w-full\",\n \"[&_svg]:pointer-events-none\",\n open && !opensUpward && \"!rounded-b-none !border-b-0\",\n open && opensUpward && \"!rounded-t-none !border-t-0\",\n className\n ),\n style: {\n ...props.style,\n overflow: 'hidden',\n textOverflow: 'ellipsis',\n whiteSpace: 'nowrap'\n },\n onClick: handleClick,\n onKeyDown: handleKeyDown,\n \"data-testid\": \"select-trigger\",\n \"data-value\": value,\n ...props\n };\n\n if (asChild) {\n const childElement = children as React.ReactElement<{ children?: React.ReactNode; [key: string]: unknown }>;\n const childChildren = React.Children.toArray(childElement.props.children);\n const hasChevron = childChildren.some(child => {\n if (React.isValidElement(child)) {\n const childProps = child.props as { 'data-testid'?: string; [key: string]: unknown };\n return child.type === ChevronDown || \n (child.type === 'svg' && childProps['data-testid'] === 'chevron-down') ||\n (typeof child === 'object' && 'type' in child && typeof child.type === 'function' && child.type.name === 'ChevronDown');\n }\n return false;\n });\n\n // Merge child's className with triggerProps className\n const childClassName = (children as React.ReactElement<any>).props.className;\n const mergedClassName = cn(\n triggerProps.className,\n childClassName\n );\n\n return React.cloneElement(children as React.ReactElement<any>, {\n ...triggerProps,\n className: mergedClassName,\n children: hasChevron ? childChildren : [\n ...childChildren,\n <ChevronDown \n key=\"chevron-down\"\n className={cn(\n \"size-4 opacity-50 transition-transform pointer-events-none float-right\",\n open && \"rotate-180\"\n )} \n />\n ]\n });\n }\n\n\n // Simple ref forwarding\n const handleRef = React.useCallback((node: HTMLButtonElement | null) => {\n if (typeof ref === 'function') {\n ref(node);\n } else if (ref) {\n (ref as React.MutableRefObject<HTMLButtonElement | null>).current = node;\n }\n }, [ref]);\n\n return (\n <Button\n ref={handleRef}\n type=\"button\"\n role=\"combobox\"\n aria-expanded={open}\n aria-haspopup=\"listbox\"\n disabled={disabled}\n variant={variant}\n size={size}\n className={cn(\n \"!justify-between relative w-full\",\n \"[&_svg]:pointer-events-none\",\n open && !opensUpward && \"!rounded-b-none !border-b-0\",\n open && opensUpward && \"!rounded-t-none !border-t-0\",\n className\n )}\n style={{\n ...props.style,\n overflow: 'hidden',\n textOverflow: 'ellipsis',\n whiteSpace: 'nowrap'\n }}\n onClick={(e) => {\n handleClick(e);\n }}\n onKeyDown={handleKeyDown}\n data-testid=\"select-trigger\"\n data-value={value}\n {...props}\n >\n {children}\n <ChevronDown \n className={cn(\n \"size-4 opacity-50 transition-transform pointer-events-none float-right\",\n open && \"rotate-180\"\n )} \n />\n </Button>\n );\n }\n);\nSelectTrigger.displayName = \"SelectTrigger\";\n\n// ============================================================================\n// VALUE COMPONENT\n// ============================================================================\n\n/**\n * Select value display component.\n * Shows the selected value or placeholder text.\n * \n * @param props - Select value configuration\n * @param ref - Forwarded ref to the span element\n * @returns The rendered select value display\n */\nexport const SelectValue = React.forwardRef<HTMLSpanElement, SelectValueProps>(\n ({ placeholder = \"Select an option...\", children }, ref) => {\n const { selectedText } = useSelectContext();\n\n return (\n <span \n ref={ref} \n data-testid=\"select-value\"\n style={{ pointerEvents: 'none' }}\n className=\"pointer-events-none\"\n >\n {children || (selectedText ? selectedText : placeholder)}\n </span>\n );\n }\n);\nSelectValue.displayName = \"SelectValue\";\n\n// ============================================================================\n// CONTENT COMPONENT\n// ============================================================================\n\n/**\n * Select content/dropdown component.\n * Contains the list of selectable options.\n * \n * @param props - Select content configuration\n * @param ref - Forwarded ref to the list element\n * @returns The rendered select content\n */\nexport const SelectContent = React.forwardRef<HTMLUListElement, SelectContentProps>(\n ({ \n children, \n className, \n searchable = false,\n searchPlaceholder = \"Search...\",\n maxHeight = \"max(20rem, 50vh)\",\n style\n }, ref) => {\n const { open, actions, direction = 'down' } = useSelectContext();\n const { searchTerm, setSearchTerm, filteredChildren, searchInputRef } = useSelectSearch({\n children,\n searchable,\n });\n\n // Focus search input when dropdown opens\n React.useEffect(() => {\n if (open && searchable && searchInputRef.current) {\n searchInputRef.current.focus();\n }\n }, [open, searchable]);\n\n // Always render children in DOM (hidden when closed) so Select can find item text via DOM query\n // This ensures SelectValue can display selected text even when dropdown is closed\n if (!open) {\n // Render a hidden version with all items (not filtered) so the DOM fallback effect can find them\n return (\n <ul\n ref={ref}\n style={{ display: 'none', visibility: 'hidden', position: 'absolute' }}\n aria-hidden=\"true\"\n data-testid=\"select-content-hidden\"\n >\n {children}\n </ul>\n );\n }\n\n const opensUpward = direction === 'up';\n \n return (\n <ul\n ref={ref}\n className={cn(\n \"absolute z-[99999] w-full overflow-y-auto border border-main-300 bg-main-50 shadow-lg\",\n \"list-none p-0 m-0\",\n opensUpward \n ? \"rounded-t-md border-b-0\" \n : \"rounded-b-md border-t-0\",\n className\n )}\n style={{ \n [opensUpward ? 'bottom' : 'top']: '100%',\n left: 0,\n right: 0,\n maxHeight,\n position: 'absolute',\n zIndex: 99999,\n ...style\n }}\n data-testid=\"select-content\"\n role=\"listbox\"\n >\n {searchable && (\n <div className=\"p-2 border-b border-main-200\">\n <div className=\"relative\">\n <Search className=\"absolute left-2 top-1/2 transform -translate-y-1/2 size-4 text-main-400\" />\n <input\n ref={searchInputRef}\n type=\"text\"\n placeholder={searchPlaceholder}\n value={searchTerm}\n onChange={(e) => setSearchTerm(e.target.value)}\n onKeyDown={(e) => {\n if (e.key === 'Escape') {\n e.preventDefault();\n setSearchTerm('');\n }\n }}\n className=\"w-full pl-8 pr-8 py-1 text-sm border border-main-200 rounded focus:outline-none focus:ring-2 focus:ring-main-500\"\n data-testid=\"select-search-input\"\n aria-label=\"Search options\"\n />\n {searchTerm && (\n <button\n type=\"button\"\n onClick={() => setSearchTerm('')}\n className=\"absolute right-2 top-1/2 transform -translate-y-1/2 text-main-400 hover:text-main-600\"\n data-testid=\"select-clear-search\"\n aria-label=\"Clear search\"\n >\n <X className=\"size-4\" />\n </button>\n )}\n </div>\n </div>\n )}\n {filteredChildren}\n </ul>\n );\n }\n);\nSelectContent.displayName = \"SelectContent\";\n\n// ============================================================================\n// ITEM COMPONENT\n// ============================================================================\n\n/**\n * Select item component.\n * Represents a single selectable option in the dropdown.\n * \n * @param props - Select item configuration\n * @param ref - Forwarded ref to the list item element\n * @returns The rendered select item\n */\nexport const SelectItem = React.forwardRef<HTMLLIElement, SelectItemProps>(\n ({ value, children, disabled = false, className, onClick }, ref) => {\n const { value: selectedValue, actions, registerItem, unregisterItem } = useSelectContext();\n const isSelected = selectedValue === value;\n\n const itemText = getTextContent(children);\n\n // Register this item when it mounts or text changes\n // Use layout effect to register synchronously so Select can find it immediately\n React.useLayoutEffect(() => {\n if (registerItem && itemText) {\n registerItem(value, itemText);\n }\n return () => {\n if (unregisterItem) {\n unregisterItem(value);\n }\n };\n }, [value, itemText, registerItem, unregisterItem]);\n \n const handleMouseDown = (e: React.MouseEvent) => {\n if (!disabled) {\n const event = new CustomEvent('selectItemMouseDown', { detail: { value } });\n document.dispatchEvent(event);\n }\n };\n\n const handleClick = (e: React.MouseEvent) => {\n if (!disabled) {\n if (onClick) {\n onClick(e);\n }\n actions.setValue(value, itemText);\n // Note: setValue already handles closing the dropdown\n }\n };\n\n const handleKeyDown = (e: React.KeyboardEvent) => {\n if (disabled) return;\n\n switch (e.key) {\n case 'Enter':\n case ' ':\n e.preventDefault();\n if (onClick) {\n // Create a synthetic mouse event for onClick handler compatibility\n const syntheticEvent = {\n ...e,\n type: 'click',\n currentTarget: e.currentTarget,\n target: e.target,\n } as unknown as React.MouseEvent;\n onClick(syntheticEvent);\n }\n actions.setValue(value, itemText);\n // Note: setValue already handles closing the dropdown\n break;\n }\n };\n\n return (\n <li\n ref={ref}\n data-value={value}\n className={cn(\n \"relative flex cursor-pointer select-none items-start rounded-sm px-2 py-1.5 text-sm outline-none\",\n \"hover:bg-main-100 focus:bg-main-100\",\n \"break-words min-w-0\",\n isSelected && \"bg-main-100 text-main-900\",\n disabled && \"pointer-events-none opacity-50\",\n className\n )}\n onMouseDown={handleMouseDown}\n onClick={handleClick}\n onKeyDown={handleKeyDown}\n data-testid=\"select-item\"\n data-disabled={disabled ? \"true\" : undefined}\n role=\"option\"\n aria-selected={isSelected}\n tabIndex={disabled ? -1 : 0}\n >\n {children}\n {isSelected && (\n <Check className=\"absolute right-2 size-4 flex-shrink-0 mt-0.5\" />\n )}\n </li>\n );\n }\n);\nSelectItem.displayName = \"SelectItem\";\n\n// ============================================================================\n// ADDITIONAL COMPONENTS (for backward compatibility)\n// ============================================================================\n\n/**\n * Select group component.\n * Groups related select items together.\n * \n * @param props - Select group configuration\n * @param ref - Forwarded ref to the div element\n * @returns The rendered select group\n */\nexport const SelectGroup = React.forwardRef<HTMLDivElement, { children: React.ReactNode; className?: string }>(\n ({ children, className }, ref) => {\n return (\n <div ref={ref} className={cn(\"p-1\", className)} data-testid=\"select-group\">\n {children}\n </div>\n );\n }\n);\nSelectGroup.displayName = \"SelectGroup\";\n\n/**\n * Select label component.\n * Provides a label for a group of select items.\n * \n * @param props - Select label configuration\n * @param ref - Forwarded ref to the div element\n * @returns The rendered select label\n */\nexport const SelectLabel = React.forwardRef<HTMLDivElement, { children: React.ReactNode; className?: string }>(\n ({ children, className }, ref) => {\n return (\n <div ref={ref} className={cn(\"px-2 py-1.5 text-sm font-semibold\", className)} data-testid=\"select-label\">\n {children}\n </div>\n );\n }\n);\nSelectLabel.displayName = \"SelectLabel\";\n\n/**\n * Select separator component.\n * Provides visual separation between groups of select items.\n * \n * @param props - Select separator configuration\n * @param ref - Forwarded ref to the div element\n * @returns The rendered select separator\n */\nexport const SelectSeparator = React.forwardRef<HTMLDivElement, { className?: string }>(\n ({ className }, ref) => {\n return (\n <div\n ref={ref}\n className={cn(\"my-1 h-px bg-sec-200\", className)}\n data-testid=\"select-separator\"\n />\n );\n }\n);\nSelectSeparator.displayName = \"SelectSeparator\";\n","import * as React from \"react\";\nimport type { SelectContextValue } from \"./types\";\n\n/**\n * Select context for sharing state between Select components.\n */\nexport const SelectContext =\n React.createContext<SelectContextValue | null>(null);\n\n/**\n * Hook to access Select context.\n * Must be used within a Select component.\n * \n * @returns Select context value\n * @throws Error if used outside Select component\n */\nexport const useSelectContext = () => {\n const context = React.useContext(SelectContext);\n if (!context) {\n throw new Error(\"Select components must be used within a Select\");\n }\n return context;\n};\n","import * as React from \"react\";\nimport type { UseSelectEventsProps } from \"../types\";\n\n/**\n * Hook for managing Select event handlers.\n * Handles click outside, keyboard navigation, and focus management.\n * \n * @param props - Select events configuration\n */\nexport const useSelectEvents = ({\n state,\n actions,\n selectRef,\n}: UseSelectEventsProps) => {\n const [isSelecting, setIsSelecting] = React.useState(false);\n\n React.useEffect(() => {\n const handleCloseSelect = () => {\n actions.setOpen(false);\n };\n\n const selectElement = selectRef.current as HTMLElement;\n if (selectElement) {\n selectElement.addEventListener(\"closeSelect\", handleCloseSelect);\n return () => {\n selectElement.removeEventListener(\"closeSelect\", handleCloseSelect);\n };\n }\n }, [actions, selectRef]);\n\n React.useEffect(() => {\n if (!state.open) return;\n\n const handleClickOutside = (event: MouseEvent) => {\n const selectElement = selectRef.current;\n if (!selectElement) return;\n\n const target = event.target as Node;\n\n if (!selectElement.contains(target) && !isSelecting) {\n actions.setOpen(false);\n }\n };\n\n const timeoutId = setTimeout(() => {\n document.addEventListener(\"click\", handleClickOutside, true);\n }, 100);\n\n return () => {\n clearTimeout(timeoutId);\n document.removeEventListener(\"click\", handleClickOutside, true);\n };\n }, [state.open, actions, selectRef, isSelecting]);\n\n React.useEffect(() => {\n let timeoutId: NodeJS.Timeout | null = null;\n let isMounted = true;\n\n const handleSelectItemMouseDown = () => {\n if (!isMounted) return;\n\n setIsSelecting(true);\n timeoutId = setTimeout(() => {\n if (isMounted) {\n setIsSelecting(false);\n }\n }, 150);\n };\n\n document.addEventListener(\n \"selectItemMouseDown\",\n handleSelectItemMouseDown as EventListener\n );\n return () => {\n isMounted = false;\n document.removeEventListener(\n \"selectItemMouseDown\",\n handleSelectItemMouseDown as EventListener\n );\n if (timeoutId) {\n clearTimeout(timeoutId);\n }\n };\n }, []);\n\n return { isSelecting };\n};\n","import * as React from \"react\";\nimport type { UseSelectSearchProps } from \"../types\";\n\n/**\n * Hook for managing Select search functionality.\n * Filters select items based on search term.\n * \n * @param props - Select search configuration\n */\nexport const useSelectSearch = ({\n children,\n searchable = false,\n searchTerm: controlledSearchTerm,\n onSearchChange,\n}: UseSelectSearchProps) => {\n const [internalSearchTerm, setInternalSearchTerm] = React.useState(\"\");\n const [filteredChildren, setFilteredChildren] =\n React.useState<React.ReactNode>(children);\n const searchInputRef = React.useRef<HTMLInputElement>(null);\n\n const searchTerm =\n controlledSearchTerm !== undefined\n ? controlledSearchTerm\n : internalSearchTerm;\n\n const setSearchTerm = React.useCallback(\n (term: string) => {\n if (controlledSearchTerm === undefined) {\n setInternalSearchTerm(term);\n }\n onSearchChange?.(term);\n },\n [controlledSearchTerm, onSearchChange]\n );\n\n React.useEffect(() => {\n if (!searchable || !searchTerm) {\n setFilteredChildren(children);\n return;\n }\n\n const filterChildren = (nodes: React.ReactNode): React.ReactNode => {\n return React.Children.map(nodes, (child) => {\n if (!React.isValidElement(child)) return child;\n\n const childProps = child.props as {\n \"data-testid\"?: string;\n value?: unknown;\n children?: React.ReactNode;\n [key: string]: unknown;\n };\n const isSelectItem =\n childProps &&\n (childProps[\"data-testid\"] === \"select-item\" ||\n childProps.value !== undefined);\n\n if (isSelectItem) {\n const childText = React.Children.toArray(\n childProps.children\n ).join(\" \");\n const searchLower = searchTerm.toLowerCase();\n\n if (childText.toLowerCase().includes(searchLower)) {\n return child;\n }\n return null;\n }\n\n if (childProps.children) {\n const filteredChildChildren = filterChildren(childProps.children);\n if (React.Children.count(filteredChildChildren) > 0) {\n return React.cloneElement(child, {}, filteredChildChildren);\n }\n return null;\n }\n\n return child;\n });\n };\n\n const filtered = filterChildren(children);\n setFilteredChildren(filtered);\n }, [children, searchTerm, searchable]);\n\n return {\n searchTerm,\n setSearchTerm,\n filteredChildren,\n searchInputRef,\n };\n};\n","import * as React from \"react\";\nimport type {\n SelectActions,\n SelectState,\n UseSelectStateProps,\n} from \"../types\";\n\n/**\n * Hook for managing Select component state.\n * Handles controlled and uncontrolled value, open state, and disabled state.\n * \n * @param props - Select state configuration\n * @returns Select state and actions\n */\nexport const useSelectState = ({\n value: controlledValue,\n defaultValue = \"\",\n selectedText: controlledSelectedText,\n open: controlledOpen,\n defaultOpen = false,\n disabled = false,\n onValueChange,\n onOpenChange,\n}: UseSelectStateProps) => {\n const [internalValue, setInternalValue] = React.useState(defaultValue);\n const [internalSelectedText, setInternalSelectedText] = React.useState(\"\");\n const [internalOpen, setInternalOpen] = React.useState(defaultOpen);\n\n const value = controlledValue !== undefined ? controlledValue : internalValue;\n const selectedText =\n controlledSelectedText !== undefined\n ? controlledSelectedText\n : internalSelectedText;\n const open = controlledOpen !== undefined ? controlledOpen : internalOpen;\n\n const setValue = React.useCallback(\n (newValue: string, newText: string) => {\n if (controlledValue === undefined) {\n setInternalValue(newValue);\n setInternalSelectedText(newText);\n }\n onValueChange?.(newValue);\n\n if (controlledOpen === undefined) {\n setInternalOpen(false);\n }\n onOpenChange?.(false);\n },\n [controlledValue, onValueChange, controlledOpen, onOpenChange]\n );\n\n const setOpen = React.useCallback(\n (newOpen: boolean) => {\n if (disabled) {\n return;\n }\n\n if (newOpen) {\n const allTriggers = document.querySelectorAll(\n '[data-testid=\"select-trigger\"]'\n );\n allTriggers.forEach((trigger) => {\n if (trigger.getAttribute(\"aria-expanded\") === \"true\") {\n const selectRoot = trigger.closest('[data-testid=\"select-root\"]');\n if (selectRoot) {\n const closeEvent = new CustomEvent(\"closeSelect\");\n selectRoot.dispatchEvent(closeEvent);\n }\n }\n });\n }\n\n if (controlledOpen === undefined) {\n setInternalOpen(newOpen);\n }\n onOpenChange?.(newOpen);\n },\n [controlledOpen, onOpenChange, disabled]\n );\n\n const setSelectedText = React.useCallback(\n (newText: string) => {\n if (controlledSelectedText === undefined) {\n setInternalSelectedText(newText);\n }\n },\n [controlledSelectedText]\n );\n\n const state: SelectState = {\n value,\n selectedText,\n open,\n disabled,\n };\n\n const actions: SelectActions = {\n setValue,\n setOpen,\n setSelectedText,\n };\n\n return { state, actions };\n};\n","import * as React from \"react\";\n\n/**\n * Extracts text content from React children.\n * Recursively extracts all text content from a React node tree.\n * \n * @param children - React children to extract text from\n * @returns Extracted text content as a string\n */\nexport const getTextContent = (children: React.ReactNode): string => {\n if (typeof children === \"string\") return children;\n if (typeof children === \"number\") return children.toString();\n if (React.isValidElement(children)) {\n const props = children.props as {\n children?: React.ReactNode;\n [key: string]: unknown;\n };\n if (props.children) {\n return getTextContent(props.children);\n }\n }\n if (Array.isArray(children)) {\n return children.map(getTextContent).join(\"\");\n }\n return \"\";\n};\n","import React from 'react';\nimport { Button } from '../../Button/Button';\nimport {\n Select,\n SelectContent,\n SelectItem,\n SelectTrigger,\n SelectValue,\n} from '../../Select/Select';\nimport { Group } from 'lucide-react';\nimport type { DataTableColumn, DataRecord, SimpleColumn } from '../types';\n\n/**\n * Props for the GroupingDropdown component.\n * @template TData - The type of data records in the table\n */\ninterface GroupingDropdownProps<TData extends DataRecord = DataRecord> {\n columns: (DataTableColumn<TData> | SimpleColumn<TData>)[];\n currentGroupBy: string | null;\n onGroupByChange: (columnId: string | null) => void;\n className?: string;\n}\n\n/**\n * Dropdown component for selecting grouping column in DataTable.\n * Allows users to group table rows by a specific column.\n * \n * @template TData - The type of data records in the table\n * @param props - Grouping dropdown configuration\n * @returns The rendered grouping dropdown\n */\nexport function GroupingDropdown<TData extends DataRecord>({ \n columns, \n currentGroupBy, \n onGroupByChange,\n className\n}: GroupingDropdownProps<TData>) {\n // Convert columns to a consistent format for grouping\n const convertedColumns = columns.map(col => {\n if ('accessorKey' in col && 'header' in col) {\n // DataTableColumn format\n return {\n accessorKey: col.accessorKey,\n header: typeof col.header === 'string' ? col.header : String(col.accessorKey),\n enableGrouping: col.enableGrouping || false,\n };\n } else if ('key' in col && 'label' in col) {\n // SimpleColumn format\n return {\n accessorKey: col.key,\n header: col.label,\n enableGrouping: false, // SimpleColumn doesn't support grouping by default\n };\n } else {\n // Fallback for unknown format\n return {\n accessorKey: 'unknown',\n header: 'Unknown',\n enableGrouping: false,\n };\n }\n });\n\n const groupableColumns = convertedColumns.filter(col => col.enableGrouping && col.accessorKey);\n \n if (groupableColumns.length === 0) {\n return null;\n }\n\n return (\n <Select className=\"w-40\">\n <SelectTrigger asChild>\n <Button \n variant=\"outline\" \n className={className || ''}\n >\n <Group className=\"size-4 mr-2 flex-shrink-0\" />\n <span className=\"truncate\">Grouping</span>\n </Button>\n </SelectTrigger>\n <SelectContent>\n <SelectItem\n value=\"no-grouping\"\n onClick={() => onGroupByChange(null)}\n className={`px-3 py-2 text-sm ${!currentGroupBy ? \"bg-main-50 text-main-700\" : \"hover:bg-sec-50\"}`}\n >\n No grouping\n </SelectItem>\n {groupableColumns.map((column) => {\n const columnId = String(column.accessorKey);\n const isSelected = currentGroupBy === columnId;\n const displayName = column.header || String(column.accessorKey);\n \n return (\n <SelectItem\n key={columnId}\n value={columnId}\n onClick={() => onGroupByChange(columnId)}\n className={`px-3 py-2 text-sm ${isSelected ? \"bg-main-50 text-main-700\" : \"hover:bg-sec-50\"}`}\n >\n {displayName}\n </SelectItem>\n );\n })}\n </SelectContent>\n </Select>\n );\n}\n","/**\n * @file Checkbox Component\n * @package @jmruthers/pace-core\n * @module Components\n * @since 0.1.0\n *\n * An accessible checkbox component built on top of Radix UI's Checkbox primitive.\n * Provides a customizable checkbox input with proper keyboard and screen reader support.\n *\n * Features:\n * - Customizable styling via className\n * - Built-in focus and hover states\n * - Disabled state support\n * - Checked state indicator\n * - Full keyboard navigation\n * - Screen reader support\n *\n * @example\n * ```tsx\n * // Basic usage\n * <Checkbox />\n *\n * // With label\n * <>\n * <Checkbox id=\"terms\" />\n * <label htmlFor=\"terms\">Accept terms and conditions</label>\n * </>\n *\n * // Disabled state\n * <Checkbox disabled />\n *\n * // Controlled component\n * const [checked, setChecked] = React.useState(false);\n * <Checkbox \n * checked={checked}\n * onCheckedChange={setChecked}\n * />\n * ```\n *\n * @accessibility\n * - Uses Radix UI's accessible checkbox primitive\n * - Proper keyboard navigation (Space to toggle)\n * - Screen reader announcements for state changes\n * - Focus visible styles for keyboard users\n * - ARIA attributes handled automatically\n */\n\nimport * as React from \"react\"\nimport * as CheckboxPrimitive from \"@radix-ui/react-checkbox\"\nimport { Check } from \"lucide-react\"\n\nimport { cn } from \"../../utils/core/cn\"\n\nconst Checkbox = React.forwardRef<\n React.ElementRef<typeof CheckboxPrimitive.Root>,\n React.ComponentPropsWithoutRef<typeof CheckboxPrimitive.Root>\n>(({ className, ...props }, ref) => (\n <CheckboxPrimitive.Root\n ref={ref}\n className={cn(\n \"peer size-4 shrink-0 rounded-sm border border-primary ring-offset-background focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring focus-visible:ring-offset-2 disabled:cursor-not-allowed disabled:opacity-50 data-[state=checked]:bg-primary data-[state=checked]:text-primary-foreground\",\n className\n )}\n {...props}\n >\n <CheckboxPrimitive.Indicator\n className={cn(\"flex items-center justify-center text-current\")}\n >\n <Check className=\"size-4\" />\n </CheckboxPrimitive.Indicator>\n </CheckboxPrimitive.Root>\n))\nCheckbox.displayName = CheckboxPrimitive.Root.displayName\n\nexport { Checkbox }\n","import React from 'react';\nimport { Column } from '@tanstack/react-table';\nimport { Button } from '../../Button/Button';\nimport { \n Select,\n SelectContent,\n SelectItem,\n SelectSeparator,\n SelectTrigger,\n} from '../../Select/Select';\nimport { Checkbox } from '../../Checkbox/Checkbox';\nimport { Settings2, Eye, EyeOff } from 'lucide-react';\n\n/**\n * Props for the ColumnVisibilityDropdown component.\n * @template TData - The type of data records in the table\n */\ninterface ColumnVisibilityDropdownProps<TData> {\n columns: Column<TData, unknown>[];\n onColumnVisibilityChange: (columnId: string, visible: boolean) => void;\n}\n\n/**\n * Dropdown component for managing column visibility in DataTable.\n * Allows users to show/hide columns and provides bulk actions.\n * \n * @template TData - The type of data records in the table\n * @param props - Column visibility configuration\n * @returns The rendered column visibility dropdown\n */\nexport function ColumnVisibilityDropdown<TData>({ \n columns, \n onColumnVisibilityChange \n}: ColumnVisibilityDropdownProps<TData>) {\n const toggleableColumns = columns.filter(\n (column) => column.getCanHide() && column.id !== 'actions'\n );\n\n return (\n <Select className=\"w-52\">\n <SelectTrigger asChild>\n <Button \n variant=\"outline\" \n >\n <Settings2 className=\"size-4 mr-2 flex-shrink-0\" />\n <span className=\"truncate\">Columns</span>\n </Button>\n </SelectTrigger>\n <SelectContent>\n <div className=\"p-2 space-y-1\">\n <div className=\"flex gap-1 mb-2\">\n <Button\n variant=\"ghost\"\n size=\"sm\"\n className=\"h-7 px-2 text-xs\"\n onClick={() => {\n toggleableColumns.forEach(column => {\n if (!column.getIsVisible()) {\n onColumnVisibilityChange(column.id, true);\n }\n });\n }}\n >\n <Eye className=\"size-3 mr-1\" />\n Show All\n </Button>\n <Button\n variant=\"ghost\"\n size=\"sm\"\n className=\"h-7 px-2 text-xs\"\n onClick={() => {\n toggleableColumns.forEach(column => {\n if (column.getIsVisible()) {\n onColumnVisibilityChange(column.id, false);\n }\n });\n }}\n >\n <EyeOff className=\"size-3 mr-1\" />\n Hide All\n </Button>\n </div>\n <SelectSeparator />\n {toggleableColumns.map((column) => (\n <SelectItem \n key={column.id} \n value={column.id}\n className=\"flex items-center space-x-2 cursor-pointer px-3 py-2 text-sm hover:bg-sec-50\"\n onClick={(e) => e.preventDefault()}\n >\n <Checkbox\n id={column.id}\n checked={column.getIsVisible()}\n onCheckedChange={(checked) =>\n onColumnVisibilityChange(column.id, !!checked)\n }\n />\n <label\n htmlFor={column.id}\n className=\"text-sm font-medium leading-none peer-disabled:cursor-not-allowed peer-disabled:opacity-70 cursor-pointer\"\n >\n {typeof column.columnDef?.header === 'string'\n ? column.columnDef.header\n : column.id}\n </label>\n </SelectItem>\n ))}\n </div>\n </SelectContent>\n </Select>\n );\n}\n","/**\n * @file Unified Table Body Component with Virtual Scrolling\n * @package @jmruthers/pace-core\n * @module Components/DataTable/Components\n * @since 0.3.0\n *\n * A unified table body component that handles both standard and virtualized rendering\n * based on data size. This eliminates the need for separate virtualized components\n * while maintaining all features consistently.\n */\n\nimport React, { useEffect, useRef } from 'react';\nimport { type Table } from '@tanstack/react-table';\nimport { useVirtualizer, type VirtualItem } from '@tanstack/react-virtual';\nimport { EmptyState } from './EmptyState';\nimport { FilterRow } from './FilterRow';\nimport { MemoizedRow } from './RowComponent';\nimport { renderEditField } from './EditFields';\nimport { getTableCellClasses } from '../styles';\nimport { Input } from '../../Input/Input';\nimport { createLogger } from '../../../utils/core/logger';\nimport type {\n AggregateConfig,\n CellValue,\n DataRecord,\n DataTableAction,\n EditableColumnDef,\n EmptyStateConfig,\n HierarchicalConfig,\n} from '../types';\nimport { getRowIdSafe } from '../utils/rowUtils';\n\n// Performance thresholds\nconst VIRTUALIZATION_THRESHOLD = 1000;\n\n/**\n * Props for the unified table body component\n */\ninterface UnifiedTableBodyProps<TData extends DataRecord> {\n /** TanStack table instance */\n table: Table<TData>;\n /** Whether a new row is being created */\n isCreating: boolean;\n /** Data for the row being created */\n creationData: Record<string, CellValue>;\n /** Callback when creation data changes */\n onCreationDataChange: (data: Record<string, CellValue>) => void;\n /** Callback to save the new row */\n onSaveCreation: () => void;\n /** Callback to cancel row creation */\n onCancelCreation: () => void;\n /** ID of the row currently being edited */\n editingRowId: string | null;\n /** Data for the row being edited */\n editingData: Record<string, CellValue>;\n /** Callback when editing data changes */\n onEditingDataChange: (data: Record<string, CellValue>) => void;\n /** Callback to save the edited row */\n onSaveEditing?: () => void;\n /** Callback to cancel row editing */\n onCancelEditing?: () => void;\n /** Current grouping configuration */\n grouping: string[];\n /** Aggregate configurations for grouped data */\n aggregates: AggregateConfig[];\n /** Function to get unique row ID */\n getRowId?: (row: TData, index: number) => string;\n /** Custom empty state configuration */\n emptyState?: EmptyStateConfig;\n /** Whether the table is currently filtered */\n isFiltered?: boolean;\n /** Callback to clear all filters */\n onClearFilters?: () => void;\n /** Whether filtering is enabled */\n enableFiltering?: boolean;\n /** Whether the filter row should be visible */\n showFilterRow?: boolean;\n /** Table ID for persistence */\n tableId?: string;\n /** Data length for virtualization decision */\n dataLength: number;\n /** Virtual height for virtualized rendering */\n virtualHeight?: number;\n /** Whether to force virtualization */\n forceVirtualization?: boolean;\n /** Hierarchical configuration for parent/child rows */\n hierarchical?: HierarchicalConfig & {\n state?: {\n isExpanded: (rowId: string) => boolean;\n hasChildren: (rowId: string) => boolean;\n getChildrenCount: (rowId: string) => number;\n toggleRow: (rowId: string) => void;\n };\n expandAll?: () => void;\n collapseAll?: () => void;\n isAllExpanded?: boolean;\n hasAnyChildren?: boolean;\n };\n /** Actions for action buttons */\n actions?: DataTableAction<TData>[];\n // MANDATORY RBAC\n rbac?: {\n pageId?: string;\n pageName?: string;\n };\n permissions?: {\n canRead: { can: boolean; isLoading: boolean };\n canCreate: { can: boolean; isLoading: boolean };\n canUpdate: { can: boolean; isLoading: boolean };\n canDelete: { can: boolean; isLoading: boolean };\n canExport: { can: boolean; isLoading: boolean };\n canImport: { can: boolean; isLoading: boolean };\n };\n}\n\n/**\n * Unified table body component with intelligent virtualization\n */\nexport function UnifiedTableBody<TData extends Record<string, any>>({\n table,\n isCreating,\n creationData,\n onCreationDataChange,\n onSaveCreation,\n onCancelCreation,\n editingRowId,\n editingData,\n onEditingDataChange,\n onSaveEditing,\n onCancelEditing,\n grouping,\n aggregates: _aggregates,\n getRowId,\n emptyState,\n isFiltered,\n onClearFilters,\n enableFiltering = false,\n showFilterRow = false,\n dataLength,\n virtualHeight: _virtualHeight = 600,\n forceVirtualization = false,\n hierarchical,\n actions = [],\n rbac,\n permissions,\n}: UnifiedTableBodyProps<TData>) {\n const logger = createLogger('UnifiedTableBody');\n\n const bodyRef = useRef<HTMLTableSectionElement>(null);\n const parentRef = useRef<HTMLDivElement>(null);\n\n const shouldVirtualize = forceVirtualization || dataLength > VIRTUALIZATION_THRESHOLD;\n\n const rows = table.getRowModel().rows;\n const headerGroups = table.getHeaderGroups();\n\n const hasScrollContainer = !!parentRef.current;\n const effectiveShouldVirtualize = shouldVirtualize && hasScrollContainer;\n\n const virtualizer = useVirtualizer({\n count: effectiveShouldVirtualize ? rows.length : 0,\n getScrollElement: () => parentRef.current || null,\n estimateSize: () => 40,\n overscan: 5,\n });\n\n const virtualRows = effectiveShouldVirtualize ? virtualizer.getVirtualItems() : [];\n\n useEffect(() => {\n if (shouldVirtualize && !hasScrollContainer) {\n logger.warn('Virtualization enabled but no scroll container found. Falling back to standard rendering.', {\n rowsLength: rows.length,\n dataLength,\n });\n }\n }, [shouldVirtualize, hasScrollContainer, rows.length, dataLength, logger]);\n\n const renderTableContent = () => {\n if (rows.length === 0) {\n return (\n <tr>\n <td colSpan={table.getVisibleFlatColumns().length} className=\"px-3 py-2\" role=\"status\">\n <EmptyState\n title={emptyState?.title}\n description={emptyState?.description}\n icon={emptyState?.icon}\n action={emptyState?.action}\n isFiltered={isFiltered}\n onClearFilters={onClearFilters}\n />\n </td>\n </tr>\n );\n }\n\n if (effectiveShouldVirtualize && virtualRows.length > 0) {\n return virtualRows.map((virtualRow: VirtualItem) => {\n const row = rows[virtualRow.index];\n if (!row) return null;\n\n const rowId = getRowIdSafe(row.original, row.index, getRowId);\n const isEditing = editingRowId === rowId;\n\n return (\n <MemoizedRow\n key={row.id}\n row={row}\n isEditing={isEditing}\n editingData={editingData}\n onEditingDataChange={onEditingDataChange}\n onSaveEditing={onSaveEditing}\n onCancelEditing={onCancelEditing}\n getRowId={getRowId}\n grouping={grouping}\n editingRowId={editingRowId}\n hierarchical={hierarchical}\n actions={actions}\n rbac={rbac}\n permissions={permissions}\n style={{\n position: 'absolute',\n top: 0,\n left: 0,\n width: '100%',\n height: `${virtualRow.size}px`,\n transform: `translateY(${virtualRow.start}px)`,\n }}\n />\n );\n });\n }\n\n return rows.map((row) => {\n const rowId = getRowIdSafe(row.original, row.index, getRowId);\n const isEditing = editingRowId === rowId;\n\n return (\n <MemoizedRow\n key={row.id}\n row={row}\n isEditing={isEditing}\n editingData={editingData}\n onEditingDataChange={onEditingDataChange}\n onSaveEditing={onSaveEditing}\n onCancelEditing={onCancelEditing}\n getRowId={getRowId}\n grouping={grouping}\n editingRowId={editingRowId}\n hierarchical={hierarchical}\n actions={actions}\n rbac={rbac}\n permissions={permissions}\n />\n );\n });\n };\n\n return (\n <tbody ref={bodyRef}>\n {/* Unified Table Body - Same structure for both virtualized and standard */}\n {/* Creation Row */}\n {isCreating && (\n <tr>\n {headerGroups[0]?.headers\n ?.filter((header) => {\n return typeof header.column.getIsVisible === 'function' ? header.column.getIsVisible() : true;\n })\n ?.filter((header) => header.column.id !== 'actions')\n ?.map((header) => {\n if (header.column.id === 'select') {\n return (\n <td\n key={header.column.id}\n className={getTableCellClasses({\n isCompact: true,\n className: 'px-3 py-2',\n })}\n >\n {/* Empty cell for selection checkbox to maintain alignment */}\n </td>\n );\n }\n\n const columnDef = header.column.columnDef as EditableColumnDef<TData>;\n const dataKey = columnDef.editAccessorKey || columnDef.accessorKey || header.column.id;\n\n const editField = renderEditField(\n header.column,\n creationData[dataKey] ?? creationData[header.column.id] ?? '',\n (value) => {\n if (typeof value === 'object' && value !== null && !Array.isArray(value) && !(value instanceof Date)) {\n onCreationDataChange({ ...creationData, ...(value as Record<string, CellValue>) });\n } else {\n onCreationDataChange({ ...creationData, [dataKey]: value as CellValue });\n }\n },\n creationData\n );\n\n return (\n <td\n key={header.column.id}\n className={getTableCellClasses({\n isCompact: true,\n className: 'px-3 py-2',\n })}\n >\n {editField || (\n <Input\n type=\"text\"\n value={String(creationData[dataKey] ?? creationData[header.column.id] ?? '')}\n onChange={(e) => onCreationDataChange({ ...creationData, [dataKey]: e.target.value as CellValue })}\n placeholder={`Enter ${columnDef.header || header.column.id}...`}\n className=\"h-8\"\n />\n )}\n </td>\n );\n })}\n <td\n className={getTableCellClasses({\n isCompact: true,\n className: 'px-3 py-2 flex gap-1',\n })}\n >\n <button\n onClick={onSaveCreation}\n className=\"size-8 p-0 hover:bg-muted/50 flex items-center justify-center\"\n title=\"Save new row\"\n >\n <svg className=\"size-4\" fill=\"none\" viewBox=\"0 0 24 24\" stroke=\"currentColor\">\n <path strokeLinecap=\"round\" strokeLinejoin=\"round\" strokeWidth={2} d=\"M5 13l4 4L19 7\" />\n </svg>\n </button>\n <button\n onClick={onCancelCreation}\n className=\"size-8 p-0 hover:bg-muted/50 flex items-center justify-center\"\n title=\"Cancel new row\"\n >\n <svg className=\"size-4\" fill=\"none\" viewBox=\"0 0 24 24\" stroke=\"currentColor\">\n <path strokeLinecap=\"round\" strokeLinejoin=\"round\" strokeWidth={2} d=\"M6 18L18 6M6 6l12 12\" />\n </svg>\n </button>\n </td>\n </tr>\n )}\n\n {/* Filter Row */}\n {showFilterRow && enableFiltering && <FilterRow table={table} visibleColumns={table.getHeaderGroups()[0]?.headers || []} />}\n\n {/* Table Content */}\n {renderTableContent()}\n </tbody>\n );\n}\n","import React from 'react';\nimport { Database, Search, Plus, User } from 'lucide-react';\nimport { Button } from '../../Button/Button';\n\n/**\n * Props for the EmptyState component.\n */\ninterface EmptyStateProps {\n title?: string;\n description?: string;\n icon?: React.ComponentType<React.SVGProps<SVGSVGElement>>;\n action?: {\n label: string;\n onClick: () => void;\n };\n isFiltered?: boolean;\n onClearFilters?: () => void;\n}\n\n/**\n * Empty state component for DataTable.\n * Displays a message when the table has no data or no filtered results.\n * \n * @param props - Empty state configuration\n * @returns The rendered empty state UI\n */\nexport function EmptyState({ \n title,\n description,\n icon: Icon = Database,\n action,\n isFiltered = false,\n onClearFilters\n}: EmptyStateProps) {\n const defaultTitle = isFiltered ? \"No results found\" : \"No data available\";\n const defaultDescription = isFiltered \n ? \"Try adjusting your search or filter criteria\"\n : \"Get started by adding your first entry\";\n\n return (\n <div \n role=\"status\" \n aria-live=\"polite\"\n className=\"flex flex-col items-center justify-center p-8 text-center\"\n >\n <Icon \n role=\"img\" \n aria-hidden=\"true\" \n className=\"size-12 text-muted-foreground mb-4\"\n data-testid={Icon === Database ? 'lucide-database' : Icon === User ? 'lucide-user' : 'custom-icon'}\n />\n <h3 className=\"text-lg font-semibold mb-2\">\n {title || defaultTitle}\n </h3>\n <p className=\"text-sm text-muted-foreground mb-4 max-w-sm\">\n {description || defaultDescription}\n </p>\n \n {(isFiltered && onClearFilters) || action ? (\n <div className=\"flex gap-2\">\n {isFiltered && onClearFilters && (\n <Button variant=\"outline\" onClick={onClearFilters}>\n <Search className=\"size-4 mr-2\" />\n Clear filters\n </Button>\n )}\n \n {action && (\n <Button onClick={action.onClick}>\n <Plus className=\"size-4 mr-2\" />\n {action.label}\n </Button>\n )}\n </div>\n ) : null}\n </div>\n );\n}\n","import React from 'react';\nimport { ColumnFilter } from './ColumnFilter';\nimport type { Header, Table } from '@tanstack/react-table';\nimport { getColumnHeaderText } from '../utils/columnUtils';\nimport type { Column } from '@tanstack/react-table';\nimport type { DataRecord } from '../types';\n\n/**\n * Props for the FilterRow component.\n * @template TData - The type of data records in the table\n */\ninterface FilterRowProps<TData> {\n table: Table<TData>;\n visibleColumns: Header<TData, unknown>[];\n}\n\n/**\n * Filter row component for DataTable.\n * Renders filter inputs for each visible column.\n * \n * @template TData - The type of data records in the table\n * @param props - Filter row configuration\n * @returns The rendered filter row\n */\nexport function FilterRow<TData>({ table, visibleColumns }: FilterRowProps<TData>) {\n const { getState } = table;\n const { columnFilters } = getState();\n\n // Get unique values for select filters\n const getColumnOptions = React.useCallback((columnId: string) => {\n const column = table.getColumn(columnId);\n if (!column) return [];\n\n const columnDef = column.columnDef as any;\n \n // Check for filterSelectOptions first (preferred for filters)\n if (columnDef.filterSelectOptions && Array.isArray(columnDef.filterSelectOptions)) {\n return columnDef.filterSelectOptions;\n }\n \n // Check if column has explicit field options\n if (columnDef.fieldOptions && Array.isArray(columnDef.fieldOptions)) {\n return columnDef.fieldOptions;\n }\n\n // Fallback to generating options from data\n const uniqueValues = new Set<string>();\n table.getRowModel().rows.forEach((row) => {\n const value = row.getValue(columnId);\n if (value !== null && value !== undefined) {\n uniqueValues.add(String(value));\n }\n });\n\n return Array.from(uniqueValues)\n .sort()\n .map((value) => ({ value, label: value }));\n }, [table]);\n\n // Determine filter type based on column data\n // IMPORTANT: Explicit filterType always takes priority - auto-detection only runs if filterType is not set\n const getFilterType = React.useCallback((columnId: string) => {\n const column = table.getColumn(columnId);\n if (!column) return 'text';\n\n const columnDef = column.columnDef as any;\n \n // PRIORITY 1: Check if column has explicit filter type configuration\n // This MUST be checked first and must respect any explicit value, including 'text'\n // Check for valid filter type strings explicitly to prevent any edge cases\n // This prevents auto-detection from overriding explicit filterType settings\n const explicitFilterType = columnDef.filterType;\n if (\n explicitFilterType === 'text' ||\n explicitFilterType === 'select' ||\n explicitFilterType === 'number' ||\n explicitFilterType === 'date'\n ) {\n // Explicit filterType set - return it immediately (no auto-detection)\n // This ensures filterType: 'text' is always respected, even for columns with ≤10 unique values\n return explicitFilterType as 'text' | 'select' | 'number' | 'date';\n }\n \n // Only proceed with auto-detection if filterType was NOT explicitly set\n \n // PRIORITY 2: Auto-detect select filter if filterSelectOptions is explicitly provided\n if (columnDef.filterSelectOptions && Array.isArray(columnDef.filterSelectOptions)) {\n return 'select';\n }\n\n // PRIORITY 3: Check if it's a date column (by column ID pattern)\n if (columnId.toLowerCase().includes('date') || columnId.toLowerCase().includes('time')) {\n return 'date';\n }\n\n // PRIORITY 4: Check if it's a number column (by data type)\n const firstValue = table.getRowModel().rows[0]?.getValue(columnId);\n if (typeof firstValue === 'number') {\n return 'number';\n }\n\n // PRIORITY 5: Auto-detect select filter if limited unique values (≤10)\n // Only runs if filterType was NOT explicitly set (checked above)\n const uniqueValues = getColumnOptions(columnId);\n if (uniqueValues.length <= 10 && uniqueValues.length > 1) {\n return 'select';\n }\n\n // Default to text filter\n return 'text';\n }, [table, getColumnOptions]);\n\n return (\n <tr className=\"border-b bg-sec-50/50\">\n {visibleColumns.map((header) => {\n const column = header.column;\n const canFilter = column.getCanFilter();\n const filterType = getFilterType(column.id);\n const options = filterType === 'select' ? getColumnOptions(column.id) : [];\n\n return (\n <td\n key={header.id}\n className=\"px-4 py-2\"\n >\n {canFilter ? (\n <ColumnFilter\n column={column}\n filterType={filterType}\n options={options}\n placeholder={`Filter ${getColumnHeaderText(column as unknown as Column<DataRecord, unknown>)}...`}\n />\n ) : (\n <div className=\"h-8 flex items-center text-sec-400 text-sm\">\n No filter\n </div>\n )}\n </td>\n );\n })}\n </tr>\n );\n}\n","import React from 'react';\nimport { Input } from '../../Input/Input';\nimport { Select, SelectTrigger, SelectValue, SelectContent, SelectItem } from '../../Select/Select';\nimport { Button } from '../../Button/Button';\nimport { X, Filter } from 'lucide-react';\nimport type { Column } from '@tanstack/react-table';\nimport { getColumnHeaderText } from '../utils/columnUtils';\n\n/**\n * Props for the ColumnFilter component.\n */\ninterface ColumnFilterProps {\n column: Column<any, unknown>;\n placeholder?: string;\n filterType?: 'text' | 'select' | 'number' | 'date';\n options?: Array<{ value: string; label: string }>;\n}\n\n/**\n * Column filter component for DataTable.\n * Provides filtering UI for individual columns with support for text, select, number, and date filters.\n * \n * @param props - Filter configuration\n * @returns The rendered filter input or null if column cannot be filtered\n */\nexport function ColumnFilter({ \n column, \n placeholder, \n filterType = 'text',\n options = []\n}: ColumnFilterProps) {\n const columnFilterValue = column.getFilterValue();\n const canFilter = column.getCanFilter();\n\n if (!canFilter) {\n return null;\n }\n\n const handleFilterChange = (value: string | number | undefined) => {\n if (value === '' || value === undefined) {\n column.setFilterValue(undefined);\n } else {\n column.setFilterValue(value);\n }\n };\n\n const clearFilter = () => {\n column.setFilterValue(undefined);\n };\n\n const hasFilter = columnFilterValue !== undefined && columnFilterValue !== '';\n \n // Get the default placeholder using column header text\n const defaultPlaceholder = `Filter ${getColumnHeaderText(column)}...`;\n\n const renderFilterInput = () => {\n switch (filterType) {\n case 'select':\n return (\n <Select\n value={columnFilterValue as string || ''}\n onValueChange={handleFilterChange}\n >\n <SelectTrigger className=\"h-8\">\n <SelectValue placeholder={placeholder || defaultPlaceholder} />\n </SelectTrigger>\n <SelectContent>\n <SelectItem value=\"\">All</SelectItem>\n {options.map((option) => (\n <SelectItem key={option.value} value={option.value}>\n {option.label}\n </SelectItem>\n ))}\n </SelectContent>\n </Select>\n );\n \n case 'number':\n // Always hide spinner arrows for number filter inputs (cleaner UX)\n return (\n <Input\n type=\"number\"\n value={columnFilterValue as string || ''}\n onChange={(e) => handleFilterChange(e.target.value ? Number(e.target.value) : undefined)}\n placeholder={placeholder || defaultPlaceholder}\n className=\"h-8 datatable-number-no-spinners\"\n />\n );\n \n case 'date':\n return (\n <Input\n type=\"date\"\n value={columnFilterValue as string || ''}\n onChange={(e) => handleFilterChange(e.target.value || undefined)}\n placeholder={placeholder || defaultPlaceholder}\n className=\"h-8\"\n />\n );\n \n default: // text\n return (\n <Input\n value={columnFilterValue as string || ''}\n onChange={(e) => handleFilterChange(e.target.value || undefined)}\n placeholder={placeholder || defaultPlaceholder}\n className=\"h-8\"\n />\n );\n }\n };\n\n return (\n <div className=\"relative flex items-center gap-1\">\n {renderFilterInput()}\n {hasFilter && (\n <Button\n variant=\"ghost\"\n onClick={clearFilter}\n >\n <X className=\"size-3\" />\n </Button>\n )}\n {hasFilter && (\n <div className=\"absolute -top-1 -right-1 h-2 w-2 bg-main-500 rounded-full\" />\n )}\n </div>\n );\n}\n","import React from 'react';\nimport type { Column } from '@tanstack/react-table';\nimport type { DataRecord } from '../types';\n\n/**\n * Extracts a human-readable header text from a column definition.\n * Used for generating filter placeholders and other UI text that should\n * display the column header instead of the technical field name.\n * \n * @param column - The TanStack Table column object\n * @returns The header text as a string, or falls back to column.id\n */\nexport function getColumnHeaderText<TData extends DataRecord = DataRecord>(column: Column<TData, unknown>): string {\n const header = column.columnDef.header;\n \n // If header is a string, use it directly\n if (typeof header === 'string') {\n return header;\n }\n \n // Helper to get accessorKey safely\n const getAccessorKey = (): string | undefined => {\n const def = column.columnDef;\n return 'accessorKey' in def && def.accessorKey ? String(def.accessorKey) : undefined;\n };\n \n // If header is a function, we can't easily extract the text without calling it\n // with a context, so we fall back to accessorKey or id\n if (typeof header === 'function') {\n return getAccessorKey() || column.id;\n }\n \n // If header is a React component, fall back to accessorKey or id\n if (React.isValidElement(header)) {\n return getAccessorKey() || column.id;\n }\n \n // Final fallback to accessorKey or id\n return getAccessorKey() || column.id;\n}\n\n","import React, { useEffect, useMemo, useRef } from 'react';\nimport { flexRender } from '@tanstack/react-table';\nimport { ChevronDown, ChevronRight } from 'lucide-react';\nimport { Button } from '../../Button/Button';\nimport { ActionButtons } from './ActionButtons';\nimport { EditableRow } from './EditableRow';\nimport { cn } from '../../../utils/core/cn';\nimport { createLogger } from '../../../utils/core/logger';\nimport { getTableCellClasses, getTableRowClasses } from '../styles';\nimport type {\n DataRecord,\n DataTableAction,\n DataTableColumn,\n HierarchicalConfig,\n HierarchicalDataRow,\n} from '../types';\nimport { calculateIndentation } from '../utils/hierarchicalUtils';\nimport { getRowIdSafe } from '../utils/rowUtils';\n\n/**\n * Props for the Row component.\n * Defines the configuration for rendering a single table row.\n */\nexport interface RowProps {\n row: any;\n style?: React.CSSProperties;\n isEditing?: boolean;\n editingData?: Record<string, any>;\n onEditingDataChange?: (data: Record<string, any>) => void;\n onSaveEditing?: () => void;\n onCancelEditing?: () => void;\n getRowId?: (row: any, index: number) => string;\n grouping: string[];\n editingRowId?: string | null;\n hierarchical?:\n | (HierarchicalConfig & {\n state?: {\n isExpanded: (rowId: string) => boolean;\n hasChildren: (rowId: string) => boolean;\n getChildrenCount: (rowId: string) => number;\n toggleRow: (rowId: string) => void;\n };\n })\n | undefined;\n actions?: DataTableAction<DataRecord>[] | Array<{\n label: string;\n onClick: (row: any) => void;\n icon?: any;\n variant?: 'default' | 'destructive' | 'outline' | 'secondary' | 'ghost';\n disabled?: boolean | ((row?: any) => boolean);\n visible?: boolean | ((row?: any) => boolean);\n testId?: string;\n showInEditMode?: boolean;\n hideInViewMode?: boolean;\n showInViewMode?: boolean;\n hidden?: boolean;\n showForParent?: boolean;\n showForChild?: boolean;\n parentIcon?: any;\n childIcon?: any;\n parentLabel?: string;\n childLabel?: string;\n }>;\n rbac?: {\n pageId?: string;\n pageName?: string;\n };\n permissions?: {\n canRead: { can: boolean; isLoading: boolean };\n canCreate: { can: boolean; isLoading: boolean };\n canUpdate: { can: boolean; isLoading: boolean };\n canDelete: { can: boolean; isLoading: boolean };\n canExport: { can: boolean; isLoading: boolean };\n canImport: { can: boolean; isLoading: boolean };\n };\n}\n\nconst RowComponent = ({\n row,\n style,\n isEditing,\n editingData,\n onEditingDataChange,\n onSaveEditing,\n onCancelEditing,\n getRowId,\n grouping,\n editingRowId,\n hierarchical,\n actions,\n rbac,\n permissions,\n }: RowProps) => {\n const rowRef = useRef<HTMLTableRowElement>(null);\n const firstInputRef = useRef<HTMLInputElement>(null);\n const logger = createLogger('RowComponent');\n\n const rowId = getRowIdSafe(row.original, row.index, getRowId);\n\n const hierarchicalRow = row.original as HierarchicalDataRow;\n const isHierarchical = hierarchical?.enabled && hierarchicalRow?.isParent !== undefined;\n const isParent = isHierarchical && hierarchicalRow.isParent;\n const isChild = isHierarchical && !hierarchicalRow.isParent;\n\n const visibleCells = row.getVisibleCells();\n const isSelected = typeof row.getIsSelected === 'function' ? row.getIsSelected() : false;\n\n useEffect(() => {\n if (isEditing && firstInputRef.current) {\n firstInputRef.current.focus();\n firstInputRef.current.select();\n }\n }, [isEditing]);\n\n useEffect(() => {\n if (!isEditing) return;\n\n const handleKeyDown = (event: KeyboardEvent) => {\n const target = event.target as HTMLElement;\n if (target.tagName === 'INPUT' || target.tagName === 'TEXTAREA') {\n if (event.key === 'Enter' && !event.shiftKey && target.tagName === 'INPUT') {\n event.preventDefault();\n onSaveEditing?.();\n } else if (event.key === 'Escape') {\n event.preventDefault();\n onCancelEditing?.();\n }\n }\n };\n\n const currentRow = rowRef.current;\n if (currentRow) {\n currentRow.addEventListener('keydown', handleKeyDown);\n return () => {\n currentRow.removeEventListener('keydown', handleKeyDown);\n };\n }\n }, [isEditing, onSaveEditing, onCancelEditing]);\n\n // CRITICAL: All hooks must be called before any early returns to avoid React hooks violations\n // Move useMemo hooks here so they're always called, regardless of early returns below\n const indentSize = hierarchical?.indentSize || 24;\n const indentation = useMemo(() => {\n return isChild && hierarchical?.state ? calculateIndentation(hierarchicalRow, [], indentSize) : 0;\n }, [isChild, hierarchical?.state, hierarchicalRow, indentSize]);\n\n const rowClassName = useMemo(() => {\n if (isHierarchical) {\n const hierarchicalClass = isParent\n ? hierarchical?.parentRowClassName || 'bg-main-50 hover:bg-main-100 font-medium'\n : hierarchical?.childRowClassName || 'bg-sec-25 hover:bg-sec-50';\n return cn(getTableRowClasses({ isSelected, isVirtualized: false }), hierarchicalClass);\n }\n return getTableRowClasses({ isSelected, isVirtualized: false });\n }, [isHierarchical, isParent, isSelected, hierarchical]);\n\n if (row.getIsGrouped && row.getIsGrouped()) {\n const groupValue = row.getValue(grouping[0]);\n const subRowsCount = row.subRows?.length || 0;\n const isExpanded = row.getIsExpanded();\n\n const childRows: DataRecord[] = row.subRows?.map((subRow: any) => subRow.original) || [];\n\n return (\n <tr className=\"bg-sec-50 hover:bg-sec-100\" style={style}>\n {visibleCells.map((cell: any, cellIndex: number) => {\n const columnDef = cell.column.columnDef as DataTableColumn<DataRecord>;\n const isGroupingColumn = cellIndex === 0 || grouping.includes(cell.column.id || '');\n\n if (isGroupingColumn && cellIndex === 0) {\n return (\n <td\n key={cell.id}\n className={getTableCellClasses({\n isCompact: true,\n className: 'px-3 py-2 flex items-center font-medium',\n })}\n >\n <Button variant=\"ghost\" size=\"sm\" onClick={() => row.toggleExpanded()} className=\"p-0 h-auto mr-2\">\n {isExpanded ? <ChevronDown className=\"size-4\" /> : <ChevronRight className=\"size-4\" />}\n </Button>\n <span className=\"text-sm\">\n {String(groupValue)} ({subRowsCount} items)\n </span>\n </td>\n );\n }\n\n if (columnDef.aggregateFn && childRows.length > 0) {\n try {\n const aggregatedValue = columnDef.aggregateFn(childRows, columnDef);\n\n let cellContent: React.ReactNode;\n if (columnDef.aggregateCell) {\n cellContent = columnDef.aggregateCell(aggregatedValue, childRows, columnDef);\n } else if (columnDef.cell) {\n const mockCell = {\n ...cell,\n getValue: () => aggregatedValue,\n renderValue: () => aggregatedValue,\n };\n cellContent = flexRender(columnDef.cell, {\n ...mockCell,\n row: row,\n column: cell.column,\n cell: mockCell,\n getValue: () => aggregatedValue,\n renderValue: () => aggregatedValue,\n });\n } else {\n cellContent = aggregatedValue != null ? String(aggregatedValue) : '';\n }\n\n return (\n <td\n key={cell.id}\n className={getTableCellClasses({\n isCompact: true,\n className: `px-3 py-2 ${cell.column.columnDef.meta?.align === 'right' ? 'text-right' : ''}`,\n })}\n >\n {cellContent}\n </td>\n );\n } catch (error) {\n logger.warn('Error in aggregation function:', error);\n return (\n <td\n key={cell.id}\n className={getTableCellClasses({\n isCompact: true,\n className: 'px-3 py-2',\n })}\n />\n );\n }\n }\n\n return (\n <td\n key={cell.id}\n className={getTableCellClasses({\n isCompact: true,\n className: 'px-3 py-2',\n })}\n />\n );\n })}\n </tr>\n );\n }\n\n if (isEditing && editingData && onEditingDataChange && onSaveEditing && onCancelEditing) {\n return (\n <EditableRow\n row={row}\n editingData={editingData}\n onEditingDataChange={onEditingDataChange}\n onSave={onSaveEditing}\n onCancel={onCancelEditing}\n actions={actions ?? []}\n getRowId={getRowId}\n isParent={isParent}\n hierarchical={!!hierarchical}\n />\n );\n }\n\n return (\n <tr\n ref={rowRef}\n key={row.id}\n role=\"row\"\n style={{\n ...style,\n ...(isChild && indentation > 0 ? { paddingLeft: `${indentation}px` } : {}),\n }}\n className={rowClassName}\n aria-selected={isSelected ? 'true' : 'false'}\n >\n {visibleCells.map((cell: any, cellIndex: number) => {\n const isFirstCell = cellIndex === 0;\n const shouldShowExpansionButton = isHierarchical && isParent && isFirstCell && hierarchical?.state;\n const isExpanded = shouldShowExpansionButton ? hierarchical?.state?.isExpanded(rowId) : false;\n const hasChildren = shouldShowExpansionButton ? hierarchical?.state?.hasChildren(rowId) : false;\n\n return (\n <td\n key={cell.id}\n className={getTableCellClasses({\n isCompact: true,\n className: `px-3 py-2 ${\n cell.column.id === 'actions' ? 'whitespace-nowrap' : 'whitespace-normal break-words'\n } ${cell.column.columnDef.meta?.align === 'right' ? 'text-right' : ''}`,\n })}\n >\n {shouldShowExpansionButton && hasChildren && (\n <Button\n variant=\"ghost\"\n size=\"sm\"\n onClick={() => hierarchical?.state?.toggleRow(rowId)}\n className=\"size-6 p-0 flex-shrink-0\"\n aria-label={isExpanded ? 'Collapse row' : 'Expand row'}\n title={isExpanded ? 'Collapse row' : 'Expand row'}\n >\n {isExpanded ? <ChevronDown className=\"size-4\" /> : <ChevronRight className=\"size-4\" />}\n </Button>\n )}\n {cell.column.id === 'actions' ? (\n <ActionButtons\n row={row}\n actions={actions}\n isEditing={isEditing}\n isParent={isParent}\n hierarchical={!!hierarchical}\n rbac={rbac}\n permissions={permissions}\n />\n ) : (\n flexRender(cell.column.columnDef.cell, {\n ...cell.getContext(),\n hierarchical: hierarchical,\n isParent: isParent,\n isChild: isChild,\n isHierarchical: isHierarchical,\n rowId: rowId,\n isExpanded: isExpanded,\n hasChildren: hasChildren,\n })\n )}\n </td>\n );\n })}\n </tr>\n );\n };\n\nRowComponent.displayName = 'RowComponent';\n\nconst areRowPropsEqual = (prevProps: RowProps, nextProps: RowProps): boolean => {\n if (prevProps.row.id !== nextProps.row.id || prevProps.row.index !== nextProps.row.index) {\n return false;\n }\n\n if (prevProps.isEditing !== nextProps.isEditing) {\n return false;\n }\n\n if (prevProps.editingRowId !== nextProps.editingRowId) {\n return false;\n }\n\n if (prevProps.style !== nextProps.style) {\n if (!prevProps.style || !nextProps.style) {\n return false;\n }\n const prevStyle = prevProps.style as Record<string, unknown>;\n const nextStyle = nextProps.style as Record<string, unknown>;\n const styleKeys = new Set([...Object.keys(prevStyle), ...Object.keys(nextStyle)]);\n for (const key of styleKeys) {\n if (prevStyle[key] !== nextStyle[key]) {\n return false;\n }\n }\n }\n\n if (\n prevProps.grouping.length !== nextProps.grouping.length ||\n prevProps.grouping.some((id, i) => id !== nextProps.grouping[i])\n ) {\n return false;\n }\n\n if (prevProps.hierarchical?.enabled !== nextProps.hierarchical?.enabled) {\n return false;\n }\n\n const prevSelected = typeof prevProps.row.getIsSelected === 'function' ? prevProps.row.getIsSelected() : false;\n const nextSelected = typeof nextProps.row.getIsSelected === 'function' ? nextProps.row.getIsSelected() : false;\n if (prevSelected !== nextSelected) {\n return false;\n }\n\n return true;\n};\n\n/**\n * Memoized row component for performance optimization.\n * Prevents unnecessary re-renders when row props haven't changed.\n */\nexport const MemoizedRow = React.memo(RowComponent, areRowPropsEqual);\n","import React, { useMemo } from 'react';\nimport { MoreHorizontal } from 'lucide-react';\nimport type { Row } from '@tanstack/react-table';\n\nimport { Button } from '../../Button/Button';\nimport {\n Select,\n SelectContent,\n SelectItem,\n SelectTrigger,\n} from '../../Select/Select';\nimport type { ActionCondition, DataRecord, DataTableAction } from '../types';\n\ninterface ActionButtonsProps<TData extends DataRecord = DataRecord> {\n row: Row<TData>;\n rowId?: string;\n index?: number;\n actions?: DataTableAction<TData>[];\n isEditing?: boolean;\n className?: string;\n // Hierarchical context\n isParent?: boolean;\n hierarchical?: boolean;\n // MANDATORY RBAC\n rbac?: {\n pageId?: string;\n pageName?: string;\n };\n permissions?: {\n canRead: { can: boolean; isLoading: boolean };\n canCreate: { can: boolean; isLoading: boolean };\n canUpdate: { can: boolean; isLoading: boolean };\n canDelete: { can: boolean; isLoading: boolean };\n canExport: { can: boolean; isLoading: boolean };\n canImport: { can: boolean; isLoading: boolean };\n };\n}\n\nconst evaluateCondition = <TData extends DataRecord>(\n condition: ActionCondition<TData> | undefined,\n row: TData,\n defaultValue: boolean\n): boolean => {\n if (typeof condition === 'boolean') {\n return condition;\n }\n\n if (typeof condition === 'function') {\n return condition(row);\n }\n\n return defaultValue;\n};\n\nfunction ActionButtonsComponent<TData extends DataRecord = DataRecord>({\n row,\n actions = [],\n isEditing = false,\n isParent = false,\n hierarchical = false,\n permissions,\n}: ActionButtonsProps<TData>) {\n const rowData = row.original;\n\n // Call hooks before any early returns\n const visibleActions = useMemo(() => {\n if (actions.length === 0) {\n return [];\n }\n return actions.filter(action => {\n if (action.hidden) return false;\n\n if (permissions) {\n if (action.label === 'Edit' && !permissions.canUpdate.can) return false;\n if (action.label === 'Delete' && !permissions.canDelete.can) return false;\n }\n\n if (hierarchical) {\n if (action.showForParent && !isParent) return false;\n if (action.showForChild && isParent) return false;\n }\n\n if (!evaluateCondition(action.visible, rowData, true)) {\n return false;\n }\n\n if (isEditing) {\n return action.showInEditMode !== false;\n }\n\n return action.hideInViewMode !== true && action.showInViewMode !== false;\n });\n }, [actions, permissions, hierarchical, isParent, rowData, isEditing]);\n\n // Early return check after hooks\n if (visibleActions.length === 0) {\n return null;\n }\n\n const renderAction = (action: DataTableAction<TData>, actionIndex: number) => {\n let Icon = action.icon;\n let label = action.label;\n\n if (hierarchical) {\n if (isParent && action.parentIcon) {\n Icon = action.parentIcon;\n } else if (!isParent && action.childIcon) {\n Icon = action.childIcon;\n }\n\n if (isParent && action.parentLabel) {\n label = action.parentLabel;\n } else if (!isParent && action.childLabel) {\n label = action.childLabel;\n }\n }\n\n return { Icon, label } as const;\n };\n\n if (visibleActions.length <= 6) {\n return (\n <>\n {visibleActions.map((action, actionIndex) => {\n const { Icon, label } = renderAction(action, actionIndex);\n const isDisabled = evaluateCondition(action.disabled, rowData, false);\n\n return (\n <Button\n key={actionIndex}\n variant={action.variant === 'destructive' ? 'destructive' : 'ghost'}\n size=\"sm\"\n onClick={() => {\n if (!isDisabled) {\n action.onClick(rowData);\n }\n }}\n disabled={isDisabled}\n aria-disabled={isDisabled}\n data-testid={action.testId}\n aria-label={label}\n className=\"size-8 p-0\"\n >\n {Icon && <Icon className=\"size-4\" />}\n </Button>\n );\n })}\n </>\n );\n }\n\n return (\n <Select>\n <SelectTrigger asChild>\n <Button variant=\"ghost\" className=\"size-8 p-0\">\n <span className=\"sr-only\">Open menu</span>\n <MoreHorizontal className=\"size-4\" />\n </Button>\n </SelectTrigger>\n <SelectContent className=\"!bg-main-50 border border-sec-200 shadow-lg z-[9999]\">\n {visibleActions.map((action, actionIndex) => {\n const { Icon, label } = renderAction(action, actionIndex);\n const isDisabled = evaluateCondition(action.disabled, rowData, false);\n\n return (\n <SelectItem\n key={actionIndex}\n value={`action-${actionIndex}`}\n onClick={() => {\n if (!isDisabled) {\n action.onClick(rowData);\n }\n }}\n data-testid={action.testId}\n className=\"flex items-center gap-2\"\n aria-disabled={isDisabled}\n >\n {Icon && <Icon className=\"size-4\" />}\n <span>{label}</span>\n </SelectItem>\n );\n })}\n </SelectContent>\n </Select>\n );\n}\n\nconst ActionButtons = React.memo(ActionButtonsComponent) as typeof ActionButtonsComponent;\n\nexport { ActionButtons };\n","import React from 'react';\nimport { flexRender, type Row, type Column } from '@tanstack/react-table';\nimport { X, Check } from 'lucide-react';\n\nimport { Button } from '../../Button/Button';\nimport { Input } from '../../Input/Input';\nimport {\n Select,\n SelectContent,\n SelectItem,\n SelectTrigger,\n SelectValue,\n SelectGroup,\n SelectLabel,\n SelectSeparator,\n} from '../../Select/Select';\nimport { createLogger } from '../../../utils/core/logger';\nimport type { CellValue, DataRecord, DataTableAction, EditableColumnDef } from '../types';\n\ninterface EditableRowProps<TData extends DataRecord> {\n row: Row<TData>;\n editingData: Record<string, CellValue>;\n onEditingDataChange: (data: Record<string, CellValue>) => void;\n onSave: () => void;\n onCancel: () => void;\n actions: DataTableAction<TData>[];\n getRowId?: (row: TData, index: number) => string;\n isParent?: boolean;\n hierarchical?: boolean;\n}\n\n// Component for select fields with searchable and creatable support\nfunction SelectEditField<TData extends DataRecord>({\n columnDef,\n accessorKey,\n currentValue,\n placeholder,\n onChange,\n className,\n}: {\n columnDef: EditableColumnDef<TData>;\n accessorKey: string;\n currentValue: CellValue;\n placeholder?: string;\n onChange: (value: CellValue) => void;\n className?: string;\n}) {\n const logger = createLogger('SelectEditField');\n // Determine if searchable - explicitly check for true to ensure visible search input appears\n // When selectSearchable is true or undefined, show the visible search input box\n // When selectSearchable is false, hide the search input (type-to-search still works via SelectContent internals)\n const isSearchable = columnDef.selectSearchable !== false;\n const isCreatable = columnDef.creatable === true;\n const selectRef = React.useRef<HTMLFormElement>(null);\n const [searchTerm, setSearchTerm] = React.useState('');\n const [isOpen, setIsOpen] = React.useState(false);\n const [showCreateOption, setShowCreateOption] = React.useState(false);\n\n // Monitor search input value via DOM events to detect when user types\n React.useEffect(() => {\n if (!isOpen || !isSearchable || !isCreatable) return;\n \n // Function to find and attach listener to search input\n const findAndAttachSearchInput = (): (() => void) | null => {\n // Try to find search input - check both within selectRef and document\n // SelectContent might be rendered outside the form element\n let searchInput: HTMLInputElement | null = null;\n \n if (selectRef.current) {\n searchInput = selectRef.current.querySelector<HTMLInputElement>('[data-testid=\"select-search-input\"]');\n }\n \n // If not found in selectRef, try document (in case SelectContent is in a portal)\n if (!searchInput) {\n // Find the most recently opened select's search input\n const allSearchInputs = document.querySelectorAll<HTMLInputElement>('[data-testid=\"select-search-input\"]');\n // Get the one that's visible (not hidden)\n for (const input of Array.from(allSearchInputs)) {\n const content = input.closest('[data-testid=\"select-content\"]');\n if (content && content.getAttribute('aria-hidden') !== 'true') {\n searchInput = input;\n break;\n }\n }\n }\n \n if (!searchInput) return null;\n\n const handleInput = (e: Event) => {\n const target = e.target as HTMLInputElement;\n const currentSearch = target.value;\n setSearchTerm(currentSearch);\n \n // Check if search doesn't match any option (including items in groups)\n if (currentSearch.trim()) {\n const searchLower = currentSearch.toLowerCase().trim();\n \n // Helper to check if an option matches\n // Use explicit union type instead of typeof to avoid Babel parsing issues\n type FieldOption = \n | { value: string | number; label: string }\n | { type: 'group'; label: string; items: Array<{ value: string | number; label: string }> }\n | { type: 'separator' };\n \n const checkMatch = (opt: FieldOption): boolean => {\n // Simple option\n if ('value' in opt && !('type' in opt)) {\n return opt.label.toLowerCase().includes(searchLower);\n }\n // Group - check items within the group\n if ('type' in opt && opt.type === 'group') {\n return (opt as { type: 'group'; label: string; items: Array<{ value: string | number; label: string }> }).items.some((item: { value: string | number; label: string }) => item.label.toLowerCase().includes(searchLower));\n }\n // Separator - doesn't match\n return false;\n };\n \n const hasMatch = (columnDef.fieldOptions || []).some(checkMatch);\n setShowCreateOption(!hasMatch);\n } else {\n setShowCreateOption(false);\n }\n };\n\n // Check initial value in case user has already typed\n const initialValue = searchInput.value;\n if (initialValue) {\n const currentSearch = initialValue;\n setSearchTerm(currentSearch);\n \n // Check if search doesn't match any option (including items in groups)\n if (currentSearch.trim()) {\n const searchLower = currentSearch.toLowerCase().trim();\n \n type FieldOption = \n | { value: string | number; label: string }\n | { type: 'group'; label: string; items: Array<{ value: string | number; label: string }> }\n | { type: 'separator' };\n \n const checkMatch = (opt: FieldOption): boolean => {\n if ('value' in opt && !('type' in opt)) {\n return opt.label.toLowerCase().includes(searchLower);\n }\n if ('type' in opt && opt.type === 'group') {\n return (opt as { type: 'group'; label: string; items: Array<{ value: string | number; label: string }> }).items.some((item: { value: string | number; label: string }) => item.label.toLowerCase().includes(searchLower));\n }\n return false;\n };\n \n const hasMatch = (columnDef.fieldOptions || []).some(checkMatch);\n setShowCreateOption(!hasMatch);\n } else {\n setShowCreateOption(false);\n }\n }\n\n searchInput.addEventListener('input', handleInput);\n \n return () => {\n searchInput?.removeEventListener('input', handleInput);\n };\n };\n\n // Try to find immediately\n let cleanup: (() => void) | null = findAndAttachSearchInput();\n \n // If not found, try again after a short delay (SelectContent might render asynchronously)\n if (!cleanup) {\n let timeoutCleanup: (() => void) | null = null;\n const timeoutId = setTimeout(() => {\n timeoutCleanup = findAndAttachSearchInput();\n }, 50);\n \n return () => {\n clearTimeout(timeoutId);\n timeoutCleanup?.();\n };\n }\n \n return cleanup;\n }, [isOpen, isSearchable, isCreatable, columnDef.fieldOptions]);\n\n const handleCreateNew = React.useCallback(async () => {\n if (!isCreatable || !columnDef.onCreateNew || !searchTerm.trim()) return;\n \n try {\n const newValue = await columnDef.onCreateNew(searchTerm.trim());\n onChange(newValue);\n setSearchTerm('');\n setShowCreateOption(false);\n } catch (error) {\n logger.error('Error creating new item:', error);\n }\n }, [isCreatable, columnDef.onCreateNew, searchTerm, onChange, logger]);\n\n return (\n <Select\n ref={selectRef}\n value={String(currentValue)}\n onValueChange={(newValue) => {\n if (newValue.startsWith('__create_new__')) {\n handleCreateNew();\n } else {\n onChange(newValue as CellValue);\n }\n }}\n onOpenChange={(open) => {\n setIsOpen(open);\n if (!open) {\n setSearchTerm('');\n setShowCreateOption(false);\n }\n }}\n >\n <SelectTrigger className={className || \"w-full h-7\"}>\n <SelectValue placeholder={placeholder || `Select ${columnDef.header || 'option'}...`} />\n </SelectTrigger>\n <SelectContent \n searchable={Boolean(isSearchable)}\n searchPlaceholder={`Search ${columnDef.header || 'options'}...`}\n maxHeight={columnDef.selectMaxHeight}\n className={columnDef.selectContentClassName}\n style={columnDef.selectContentStyle}\n >\n {columnDef.fieldOptions?.map((option, index) => {\n // Simple option item\n if ('value' in option && !('type' in option)) {\n return (\n <SelectItem key={`${option.value}-${index}`} value={String(option.value)}>\n {option.label}\n </SelectItem>\n );\n }\n \n // Separator\n if ('type' in option && option.type === 'separator') {\n return <SelectSeparator key={`separator-${index}`} />;\n }\n \n // Group with label\n if ('type' in option && option.type === 'group') {\n const groupOption = option as { type: 'group'; label: string; items: Array<{ value: string | number; label: string }> };\n return (\n <SelectGroup key={`group-${groupOption.label}-${index}`}>\n <SelectLabel>{groupOption.label}</SelectLabel>\n {groupOption.items.map((item: { value: string | number; label: string }) => (\n <SelectItem key={`${item.value}-${index}`} value={String(item.value)}>\n {item.label}\n </SelectItem>\n ))}\n </SelectGroup>\n );\n }\n \n return null;\n })}\n {showCreateOption && isCreatable && searchTerm.trim() && (\n <SelectItem \n key=\"__create_new__\" \n value={`__create_new__${searchTerm}`}\n className=\"bg-main-100 font-medium border-t border-main-200\"\n >\n Create \"{searchTerm}\"\n </SelectItem>\n )}\n </SelectContent>\n </Select>\n );\n}\n\nconst renderEditField = <TData extends DataRecord>(\n column: Column<TData, unknown>,\n value: CellValue,\n onChange: (value: CellValue | Record<string, CellValue>) => void,\n editingData: Record<string, CellValue> = {},\n placeholder?: string,\n inputRef?: React.Ref<HTMLInputElement>\n) => {\n const columnDef = column.columnDef as EditableColumnDef<TData>;\n\n if (columnDef.editable === false) {\n return <span className=\"text-sm text-sec-600\">{String(value ?? '')}</span>;\n }\n\n if (columnDef.fieldType === 'select' && columnDef.fieldOptions) {\n const accessorKey = columnDef.editAccessorKey || column.id;\n const currentValue = editingData[accessorKey] ?? value ?? '';\n\n return (\n <SelectEditField\n columnDef={columnDef}\n accessorKey={accessorKey}\n currentValue={currentValue}\n placeholder={placeholder}\n onChange={(newValue) => onChange({ [accessorKey]: newValue })}\n className=\"w-full h-7\"\n />\n );\n }\n\n if (columnDef.fieldType === 'date') {\n return (\n <Input\n ref={inputRef}\n type=\"date\"\n value={String(value ?? '')}\n onChange={(e) => onChange(e.target.value as unknown as CellValue)}\n className=\"w-full h-7\"\n />\n );\n }\n\n if (columnDef.fieldType === 'number') {\n // Hide spinner arrows by default for number, currency, and percentage fields\n // Only show spinners if explicitly set to false\n const hideSpinners = columnDef.hideNumberSpinners !== false; // Default to true\n return (\n <Input\n ref={inputRef}\n type=\"number\"\n value={String(value ?? '')}\n onChange={(e) => onChange(e.target.value as unknown as CellValue)}\n className={`w-full h-7 ${hideSpinners ? 'datatable-number-no-spinners' : ''}`}\n />\n );\n }\n\n return (\n <Input\n ref={inputRef}\n type=\"text\"\n value={String(value ?? '')}\n onChange={(e) => onChange(e.target.value as unknown as CellValue)}\n className=\"w-full h-7\"\n placeholder={placeholder || `Enter ${column.id}`}\n />\n );\n};\n\n/**\n * Editable row component for DataTable.\n * Renders a row in edit mode with input fields for each editable column.\n * \n * @template TData - The type of data records in the table\n * @param props - Editable row configuration\n * @returns The rendered editable row\n */\nexport function EditableRow<TData extends DataRecord>({\n row,\n editingData,\n onEditingDataChange,\n onSave,\n onCancel,\n actions,\n getRowId,\n isParent = false,\n hierarchical = false,\n}: EditableRowProps<TData>) {\n const rowId = getRowId ? getRowId(row.original, row.index) : String(row.id);\n const firstInputRef = React.useRef<HTMLInputElement>(null);\n const hasAssignedRef = React.useRef(false);\n\n // Auto-focus first input field when entering edit mode\n React.useEffect(() => {\n if (firstInputRef.current) {\n firstInputRef.current.focus();\n firstInputRef.current.select();\n }\n }, []);\n\n return (\n <tr\n role=\"row\"\n aria-selected={typeof row.getIsSelected === 'function' ? (row.getIsSelected() ? 'true' : 'false') : 'false'}\n aria-rowindex={row.index + 1}\n >\n {row.getVisibleCells().map(cell => {\n // Skip rendering edit fields for system columns (select, actions)\n const isSystemColumn = cell.column.id === 'select' || cell.column.id === 'actions';\n \n return (\n <td key={cell.id} role=\"cell\">\n <div className={cell.column.columnDef.meta?.align === 'right' ? 'text-right' : ''}>\n {isSystemColumn ? (\n // System columns: render their normal cell content (checkbox for select, buttons for actions)\n cell.column.id === 'actions' ? (\n <div className=\"flex gap-1\">\n <Button onClick={onSave} size=\"sm\" variant=\"default\" aria-label=\"Save changes\">\n <Check className=\"size-4\" />\n </Button>\n <Button onClick={onCancel} size=\"sm\" variant=\"outline\" aria-label=\"Cancel editing\">\n <X className=\"size-4\" />\n </Button>\n </div>\n ) : (\n // Select column: render the checkbox normally\n flexRender(cell.column.columnDef.cell, cell.getContext())\n )\n ) : (\n // Data columns: render edit fields\n (() => {\n const columnDef = cell.column.columnDef as EditableColumnDef<TData>;\n \n // CRITICAL FIX: For editable columns (editable !== false), ALWAYS use renderEditField\n // to ensure input fields are shown in edit mode. Custom cell renderers are only used\n // when the column is explicitly marked as editable: false (non-editable columns).\n // This ensures that editable fields always display as input fields in edit mode.\n \n // If column is explicitly marked as not editable, check if custom cell renderer handles editing\n if (columnDef.editable === false) {\n // Not editable - use custom cell renderer if available, otherwise show static value\n return cell.column.columnDef.cell ? (\n flexRender(cell.column.columnDef.cell, {\n ...cell.getContext(),\n getIsEditing: () => true,\n setValue: (value: CellValue | Record<string, CellValue>) => {\n if (typeof value === 'object' && value !== null && !Array.isArray(value) && !(value instanceof Date)) {\n onEditingDataChange({ ...editingData, ...(value as Record<string, CellValue>) });\n } else {\n onEditingDataChange({ ...editingData, [cell.column.id]: value as CellValue });\n }\n }\n })\n ) : (\n <span className=\"text-sm text-sec-600\">{String(cell.getValue() ?? '')}</span>\n );\n }\n \n // Column is editable (editable !== false or undefined) - ALWAYS use renderEditField\n // This ensures input fields are always displayed in edit mode, regardless of custom cell renderers.\n // Custom cell renderers are for display purposes only and should not interfere with edit mode.\n const shouldGetRef = !hasAssignedRef.current;\n if (shouldGetRef) {\n hasAssignedRef.current = true;\n }\n \n return renderEditField(\n cell.column, \n editingData[cell.column.id] ?? (cell.getValue() as CellValue), \n (value) => {\n if (typeof value === 'object' && value !== null && !Array.isArray(value) && !(value instanceof Date)) {\n onEditingDataChange({ ...editingData, ...(value as Record<string, CellValue>) });\n } else {\n onEditingDataChange({ ...editingData, [cell.column.id]: value as CellValue });\n }\n }, \n editingData,\n undefined, // placeholder\n shouldGetRef ? firstInputRef : undefined\n );\n })()\n )}\n </div>\n </td>\n );\n })}\n </tr>\n );\n}\n","/**\n * @file DataTable Styling Constants\n * @package @jmruthers/pace-core\n * @module Components/DataTable\n * @since 0.4.0\n *\n * Centralized styling constants for all DataTable components.\n * This ensures consistent styling across regular and virtualized tables.\n */\n\nimport { cn } from '../../utils/core/cn';\n\n// ============================================================================\n// TABLE BASE STYLES\n// ============================================================================\n\nexport const tableStyles = {\n // Main table container\n table: 'w-full caption-top text-sm',\n tableFixed: 'w-full table-fixed',\n \n // Table sections\n header: '[&_tr]:border-b',\n body: '[&_tr:last-child]:border-0',\n footer: 'border-t bg-muted/50 font-medium [&>tr]:last:border-b-0',\n \n // Table rows\n row: 'border-b transition-colors hover:bg-muted/50 data-[state=selected]:bg-muted',\n rowHover: 'hover:bg-sec-50 transition-colors',\n rowSelected: 'bg-main-50',\n \n // Table cells\n head: 'h-12 px-4 text-left align-middle font-medium text-muted-foreground [&:has([role=checkbox])]:pr-0',\n headSortable: 'cursor-pointer select-none hover:bg-muted/50',\n cell: 'p-4 align-middle [&:has([role=checkbox])]:pr-0',\n cellCompact: 'px-3 py-2 align-middle [&:has([role=checkbox])]:pr-0',\n cellVirtualized: 'px-4 py-2 text-sm border-b border-sec-200 whitespace-normal',\n cellSortable: 'cursor-pointer select-none',\n \n // Table layout\n mainContainer: 'w-full max-w-full',\n container: 'overflow-x-auto w-full',\n containerVirtualized: 'overflow-hidden',\n \n // Sticky positioning\n stickyHeader: 'sticky top-0 z-10',\n \n // Empty state\n emptyState: 'flex items-center justify-center py-12',\n emptyStateContent: 'text-center',\n emptyStateIcon: 'text-sec-400 text-lg mb-2',\n emptyStateText: 'text-sec-500',\n} as const;\n\n// ============================================================================\n// STYLING UTILITIES\n// ============================================================================\n\n/**\n * Get table cell classes based on context\n */\nexport const getTableCellClasses = (options: {\n isVirtualized?: boolean;\n isCompact?: boolean;\n isSortable?: boolean;\n className?: string;\n} = {}): string => {\n const { isVirtualized = false, isCompact = false, isSortable = false, className } = options;\n \n if (isVirtualized) {\n return cn(\n tableStyles.cellVirtualized,\n isSortable && tableStyles.cellSortable,\n className\n );\n }\n \n return cn(\n isCompact ? tableStyles.cellCompact : tableStyles.cell,\n isSortable && tableStyles.cellSortable,\n className\n );\n};\n\n/**\n * Get table head classes based on context\n */\nexport const getTableHeadClasses = (options: {\n isSortable?: boolean;\n className?: string;\n} = {}): string => {\n const { isSortable = false, className } = options;\n \n return cn(\n tableStyles.head,\n isSortable && tableStyles.headSortable,\n className\n );\n};\n\n/**\n * Get table row classes based on context\n */\nexport const getTableRowClasses = (options: {\n isSelected?: boolean;\n isVirtualized?: boolean;\n className?: string;\n} = {}): string => {\n const { isSelected = false, isVirtualized = false, className } = options;\n \n if (isVirtualized) {\n return cn(\n tableStyles.rowHover,\n isSelected && tableStyles.rowSelected,\n className\n );\n }\n \n return cn(\n tableStyles.row,\n isSelected && tableStyles.rowSelected,\n className\n );\n};\n\n/**\n * Get table container classes based on context\n */\nexport const getTableContainerClasses = (options: {\n isVirtualized?: boolean;\n className?: string;\n} = {}): string => {\n const { isVirtualized = false, className } = options;\n \n return cn(\n isVirtualized ? tableStyles.containerVirtualized : tableStyles.container,\n className\n );\n};\n\n/**\n * Get table classes based on context\n */\nexport const getTableClasses = (options: {\n isFixed?: boolean;\n variant?: 'default' | 'compact' | 'spacious';\n className?: string;\n} = {}): string => {\n const { isFixed = false, variant = 'default', className } = options;\n \n if (isFixed) {\n // For fixed tables, use tableFixed and add variant-specific text size\n return cn(\n tableStyles.tableFixed,\n variant === 'compact' && 'text-sm',\n variant === 'spacious' && 'text-base',\n className\n );\n }\n \n // For regular tables, build classes based on variant\n // tableStyles.table includes 'text-sm', so we need to handle variants carefully\n if (variant === 'compact') {\n // Compact uses text-sm (same as default), so just use base table styles\n return cn(tableStyles.table, className);\n }\n \n if (variant === 'spacious') {\n // Spacious uses text-base, so replace text-sm with text-base\n return cn(\n tableStyles.table.replace('text-sm', 'text-base'),\n className\n );\n }\n \n // Default variant\n return cn(tableStyles.table, className);\n};\n\n/**\n * Get main DataTable container classes\n */\nexport const getMainContainerClasses = (options: {\n className?: string;\n} = {}): string => {\n const { className } = options;\n \n return cn(\n tableStyles.mainContainer,\n className\n );\n};\n","/**\n * @file Hierarchical Data Processing Utilities\n * @package @jmruthers/pace-core\n * @module Components/DataTable/Utils/hierarchicalUtils\n * @since 0.4.35\n */\n\nimport type { HierarchicalDataRow, DataTableColumn, DataRecord } from '../types';\nimport { createLogger } from '../../../utils/core/logger';\n\n/**\n * Validates that data conforms to hierarchical structure\n */\nexport function validateHierarchicalData<TData extends HierarchicalDataRow>(\n data: TData[]\n): { isValid: boolean; errors: string[] } {\n const errors: string[] = [];\n \n // Check that all rows have required fields\n data.forEach((row, index) => {\n if (!row.id) {\n errors.push(`Row ${index}: Missing required 'id' field`);\n }\n \n if (typeof row.isParent !== 'boolean') {\n errors.push(`Row ${index}: Missing or invalid 'isParent' field`);\n }\n \n if (!row.isParent && !row.parentId) {\n errors.push(`Row ${index}: Child row missing 'parentId' field`);\n }\n });\n\n // Check for orphaned child rows\n const parentIds = new Set(data.filter(row => row.isParent).map(row => row.id));\n data.forEach((row, index) => {\n if (!row.isParent && row.parentId && !parentIds.has(row.parentId)) {\n errors.push(`Row ${index}: Child row references non-existent parent '${row.parentId}'`);\n }\n });\n\n // Check for duplicate IDs\n const ids = data.map(row => row.id);\n const duplicateIds = ids.filter((id, index) => ids.indexOf(id) !== index);\n if (duplicateIds.length > 0) {\n errors.push(`Duplicate IDs found: ${duplicateIds.join(', ')}`);\n }\n\n return {\n isValid: errors.length === 0,\n errors,\n };\n}\n\n/**\n * Groups data into parent-child relationships\n */\nexport function groupHierarchicalData<TData extends HierarchicalDataRow>(\n data: TData[]\n): Map<string, { parent: TData; children: TData[] }> {\n const groups = new Map<string, { parent: TData; children: TData[] }>();\n \n // Initialize groups for parent rows\n data.forEach(row => {\n if (row.isParent) {\n groups.set(row.id, { parent: row, children: [] });\n }\n });\n \n // Add children to their parent groups\n data.forEach(row => {\n if (!row.isParent && row.parentId) {\n const group = groups.get(row.parentId);\n if (group) {\n group.children.push(row);\n }\n }\n });\n \n return groups;\n}\n\n/**\n * Optimized depth cache to avoid recalculating depth for the same row\n * This prevents O(n²) behavior when calculating depths for all rows\n */\nconst depthCache = new WeakMap<unknown[], Map<number, Map<string, number>>>();\n\nconst logger = createLogger('HierarchicalUtils');\n\n/**\n * Gets the depth level of a row in the hierarchy\n * \n * Performance: Uses memoization to avoid recalculating depth for the same row.\n * This is optimized for when depth needs to be calculated for many rows.\n * \n * @param row - The row to get depth for\n * @param allData - All hierarchical data (used to build parent chain)\n * @returns The depth level (0 for parents, 1+ for children)\n * \n * @example\n * ```tsx\n * const depth = getRowDepth(childRow, allData);\n * ```\n */\nexport function getRowDepth<TData extends HierarchicalDataRow>(\n row: TData,\n allData: TData[],\n maxDepth: number = 100\n): number {\n // Check cache first\n let cachedDepthsByLimit = depthCache.get(allData);\n if (!cachedDepthsByLimit) {\n cachedDepthsByLimit = new Map();\n depthCache.set(allData, cachedDepthsByLimit);\n }\n\n let cachedDepths = cachedDepthsByLimit.get(maxDepth);\n if (!cachedDepths) {\n cachedDepths = new Map();\n cachedDepthsByLimit.set(maxDepth, cachedDepths);\n }\n \n // Return cached depth if available\n if (cachedDepths.has(row.id)) {\n return cachedDepths.get(row.id)!;\n }\n \n // Calculate depth\n let depth = 0;\n\n if (row.isParent) {\n depth = 0;\n } else if (!row.parentId) {\n depth = 0;\n } else {\n // Build parent lookup map for efficient parent finding\n const parentMap = new Map<string, TData>();\n allData.forEach(item => {\n if (item.isParent || item.parentId) {\n parentMap.set(item.id, item);\n }\n });\n\n const visited = new Set<string>();\n\n // Walk up the parent chain\n let current = row;\n while (current.parentId && depth < maxDepth) {\n if (visited.has(current.id)) {\n logger.warn('Circular reference detected while calculating row depth', {\n rowId: row.id,\n currentId: current.id,\n });\n break;\n }\n\n visited.add(current.id);\n depth++;\n const parent = parentMap.get(current.parentId);\n\n if (!parent || parent.isParent) {\n break;\n }\n\n current = parent;\n\n // Check cache during traversal\n if (cachedDepths.has(current.id)) {\n depth += cachedDepths.get(current.id)!;\n break;\n }\n }\n\n if (depth >= maxDepth && current.parentId) {\n logger.warn('Maximum hierarchy depth reached while calculating row depth', {\n rowId: row.id,\n maxDepth,\n });\n }\n }\n \n // Cache the result\n cachedDepths.set(row.id, depth);\n \n return depth;\n}\n\n/**\n * Pre-calculates depth for all rows in a dataset\n * This is more efficient than calculating depth on-demand for each row\n * \n * @param data - Array of hierarchical data rows\n * @returns Map of row IDs to their depth levels\n * \n * @example\n * ```tsx\n * const depthMap = calculateAllDepths(data);\n * const indent = depthMap.get(rowId) * 24;\n * ```\n */\nexport function calculateAllDepths<TData extends HierarchicalDataRow>(\n data: TData[]\n): Map<string, number> {\n const depthMap = new Map<string, number>();\n const parentMap = new Map<string, TData>();\n \n // Build parent lookup map\n data.forEach(item => {\n if (item.isParent || item.parentId) {\n parentMap.set(item.id, item);\n }\n });\n \n // Calculate depth for each row\n data.forEach(row => {\n if (row.isParent) {\n depthMap.set(row.id, 0);\n return;\n }\n \n if (!row.parentId) {\n depthMap.set(row.id, 0);\n return;\n }\n \n // Walk up parent chain\n let depth = 0;\n let current = row;\n \n while (current.parentId) {\n depth++;\n const parent = parentMap.get(current.parentId);\n \n if (!parent || parent.isParent) {\n break;\n }\n \n // Use cached depth if available\n if (depthMap.has(parent.id)) {\n depth += depthMap.get(parent.id)!;\n break;\n }\n \n current = parent;\n }\n \n depthMap.set(row.id, depth);\n });\n \n return depthMap;\n}\n\n/**\n * Determines if a column should be visible for a given row type\n */\nexport function shouldShowColumnForRow<TData extends HierarchicalDataRow>(\n column: DataTableColumn<TData>,\n isParent: boolean\n): boolean {\n if (isParent && column.hideForParent) {\n return false;\n }\n \n if (!isParent && column.hideForChild) {\n return false;\n }\n \n return true;\n}\n\n/**\n * Gets the appropriate cell renderer for a row type\n */\nexport function getCellRenderer<TData extends HierarchicalDataRow>(\n column: DataTableColumn<TData>,\n row: TData\n): ((row: TData) => React.ReactNode) | undefined {\n if (row.isParent && column.renderForParent) {\n return column.renderForParent;\n }\n \n if (!row.isParent && column.renderForChild) {\n return column.renderForChild;\n }\n \n return column.cell as ((row: TData) => React.ReactNode) | undefined;\n}\n\n/**\n * Calculates the indentation for a child row\n * \n * @param row - The row to calculate indentation for\n * @param allData - All hierarchical data rows\n * @param baseIndent - Base indentation in pixels (default: 24)\n * @returns The indentation in pixels\n */\nexport function calculateIndentation<TData extends HierarchicalDataRow>(\n row: TData,\n allData: TData[],\n baseIndent: number = 24\n): number {\n const depth = getRowDepth(row, allData);\n return depth * baseIndent;\n}\n\n/**\n * Calculates indentation for all rows using bulk depth calculation\n * More efficient than calling calculateIndentation individually for each row\n * \n * @param data - All hierarchical data rows\n * @param baseIndent - Base indentation in pixels (default: 24)\n * @returns Map of row IDs to their indentation in pixels\n * \n * @example\n * ```tsx\n * const indentMap = calculateAllIndentation(data, 24);\n * const indent = indentMap.get(rowId);\n * ```\n */\nexport function calculateAllIndentation<TData extends HierarchicalDataRow>(\n data: TData[],\n baseIndent: number = 24\n): Map<string, number> {\n const depthMap = calculateAllDepths(data);\n const indentMap = new Map<string, number>();\n \n depthMap.forEach((depth, rowId) => {\n indentMap.set(rowId, depth * baseIndent);\n });\n \n return indentMap;\n}\n\n/**\n * Creates a hierarchical data structure from flat data\n */\nexport function createHierarchicalStructure<TData extends DataRecord>(\n data: TData[],\n parentKey: keyof TData,\n childrenKey: keyof TData,\n idKey: keyof TData = 'id' as keyof TData\n): HierarchicalDataRow[] {\n const result: HierarchicalDataRow[] = [];\n \n data.forEach(item => {\n // Add parent row\n const parentRow: HierarchicalDataRow = {\n ...item,\n id: String(item[idKey]),\n isParent: true,\n };\n result.push(parentRow);\n \n // Add child rows\n const children = item[childrenKey] as TData[] | undefined;\n if (children && Array.isArray(children)) {\n children.forEach(child => {\n const childRow: HierarchicalDataRow = {\n ...child,\n id: `${String(item[idKey])}-${String(child[idKey])}`,\n isParent: false,\n parentId: String(item[idKey]),\n };\n result.push(childRow);\n });\n }\n });\n \n return result;\n}\n","/**\n * @file Row Utilities\n * @package @jmruthers/pace-core\n * @module Components/DataTable/Utils\n * @since 0.4.0\n * \n * Utility functions for row operations including ID generation and validation.\n */\n\nimport type { DataRecord, GetRowId } from '../types';\n\n/**\n * Safely gets a row ID, handling various fallback scenarios\n * \n * This standardizes row ID generation across the DataTable component\n * to prevent ID collisions and incorrect row identification.\n * \n * @param row - The data row\n * @param index - The row index\n * @param getRowId - Optional custom getRowId function\n * @returns A unique row identifier\n * \n * @example\n * ```tsx\n * const rowId = getRowIdSafe(user, 0, getRowId);\n * ```\n */\nexport function getRowIdSafe<TData extends DataRecord>(\n row: TData,\n index: number,\n getRowId?: GetRowId<TData>\n): string {\n // Use custom getRowId if provided\n if (getRowId) {\n const customId = getRowId(row, index);\n // If custom getRowId returns null/undefined, fall back to standard logic\n if (customId != null && customId !== '') {\n return String(customId);\n }\n }\n \n // Fall back to row.id if available\n if ('id' in row && row.id !== undefined && row.id !== null) {\n return String(row.id);\n }\n\n throw new Error(\n '[DataTable] Unable to determine a stable row id. Provide a getRowId prop or ensure each record exposes an \"id\" field.'\n );\n}\n\n/**\n * Validates that a row has a valid identifier\n * \n * @param row - The row to validate\n * @param getRowId - Optional custom getRowId function\n * @returns true if the row has a valid identifier\n */\nexport function hasValidRowId<TData extends DataRecord>(\n row: TData,\n getRowId?: GetRowId<TData>\n): boolean {\n try {\n const id = getRowIdSafe(row, 0, getRowId);\n return id !== '0' && id !== '' && id !== 'undefined' && id !== 'null';\n } catch {\n return false;\n }\n}\n","import React from 'react';\nimport { type Column } from '@tanstack/react-table';\nimport { Input } from '../../Input/Input';\nimport {\n Select,\n SelectContent,\n SelectGroup,\n SelectItem,\n SelectLabel,\n SelectSeparator,\n SelectTrigger,\n SelectValue,\n} from '../../Select/Select';\nimport { createLogger } from '../../../utils/core/logger';\nimport type { CellValue, DataRecord, EditableColumnDef } from '../types';\n\n/**\n * Component for select fields with searchable and creatable support\n */\nexport function SelectEditField<TData extends DataRecord>({\n columnDef,\n accessorKey,\n currentValue,\n placeholder,\n onChange,\n}: {\n columnDef: EditableColumnDef<TData>;\n accessorKey: string;\n currentValue: CellValue;\n placeholder?: string;\n onChange: (value: CellValue) => void;\n}) {\n const logger = createLogger('SelectEditField');\n const isSearchable = columnDef.selectSearchable !== false;\n const isCreatable = columnDef.creatable === true;\n const selectRef = React.useRef<HTMLFormElement>(null);\n const [searchTerm, setSearchTerm] = React.useState('');\n const [isOpen, setIsOpen] = React.useState(false);\n const [showCreateOption, setShowCreateOption] = React.useState(false);\n\n React.useEffect(() => {\n if (!isOpen || !isSearchable || !isCreatable || !columnDef.onCreateNew) {\n if (!isOpen || !isCreatable || !columnDef.onCreateNew) {\n setShowCreateOption(false);\n }\n return;\n }\n\n const findAndAttachSearchInput = (): (() => void) | null => {\n let searchInput: HTMLInputElement | null = null;\n\n if (selectRef.current) {\n searchInput = selectRef.current.querySelector<HTMLInputElement>('[data-testid=\"select-search-input\"]');\n }\n\n if (!searchInput) {\n const allSearchInputs = document.querySelectorAll<HTMLInputElement>('[data-testid=\"select-search-input\"]');\n for (const input of Array.from(allSearchInputs)) {\n const content = input.closest('[data-testid=\"select-content\"]');\n if (content && content.getAttribute('aria-hidden') !== 'true') {\n searchInput = input;\n break;\n }\n }\n }\n\n if (!searchInput) return null;\n\n const handleInput = (e: Event) => {\n const target = e.target as HTMLInputElement;\n const currentSearch = target.value;\n setSearchTerm(currentSearch);\n\n if (currentSearch.trim()) {\n const searchLower = currentSearch.toLowerCase().trim();\n\n type FieldOption =\n | { value: string | number; label: string }\n | { type: 'group'; label: string; items: Array<{ value: string | number; label: string }> }\n | { type: 'separator' };\n\n const checkMatch = (opt: FieldOption): boolean => {\n if ('value' in opt && !('type' in opt)) {\n return opt.label.toLowerCase().includes(searchLower);\n }\n if ('type' in opt && opt.type === 'group') {\n return (\n (opt as { type: 'group'; label: string; items: Array<{ value: string | number; label: string }> }).items.some(\n (item: { value: string | number; label: string }) => item.label.toLowerCase().includes(searchLower)\n )\n );\n }\n return false;\n };\n\n const shouldShow = isCreatable && !!columnDef.onCreateNew;\n\n setShowCreateOption(shouldShow);\n } else {\n setShowCreateOption(false);\n }\n };\n\n const initialValue = searchInput.value;\n if (initialValue) {\n const currentSearch = initialValue;\n setSearchTerm(currentSearch);\n\n if (currentSearch.trim()) {\n const searchLower = currentSearch.toLowerCase().trim();\n\n type FieldOption =\n | { value: string | number; label: string }\n | { type: 'group'; label: string; items: Array<{ value: string | number; label: string }> }\n | { type: 'separator' };\n\n const checkMatch = (opt: FieldOption): boolean => {\n if ('value' in opt && !('type' in opt)) {\n return opt.label.toLowerCase().includes(searchLower);\n }\n if ('type' in opt && opt.type === 'group') {\n return (\n (opt as { type: 'group'; label: string; items: Array<{ value: string | number; label: string }> }).items.some(\n (item: { value: string | number; label: string }) => item.label.toLowerCase().includes(searchLower)\n )\n );\n }\n return false;\n };\n\n const shouldShow = isCreatable && !!columnDef.onCreateNew;\n setShowCreateOption(shouldShow);\n } else {\n setShowCreateOption(false);\n }\n }\n\n searchInput.addEventListener('input', handleInput);\n\n return () => {\n searchInput?.removeEventListener('input', handleInput);\n };\n };\n\n let cleanup: (() => void) | null = findAndAttachSearchInput();\n\n if (!cleanup) {\n let timeoutCleanup: (() => void) | null = null;\n const timeoutId = setTimeout(() => {\n timeoutCleanup = findAndAttachSearchInput();\n }, 50);\n\n return () => {\n clearTimeout(timeoutId);\n timeoutCleanup?.();\n };\n }\n\n return cleanup;\n }, [isOpen, isSearchable, isCreatable, columnDef.fieldOptions, columnDef.onCreateNew]);\n\n const handleCreateNew = React.useCallback(async () => {\n if (!isCreatable || !columnDef.onCreateNew || !searchTerm.trim()) return;\n\n try {\n const newValue = await columnDef.onCreateNew(searchTerm.trim());\n onChange(newValue);\n setSearchTerm('');\n setShowCreateOption(false);\n } catch (error) {\n logger.error('Error creating new item:', error);\n }\n }, [isCreatable, columnDef.onCreateNew, searchTerm, onChange, logger]);\n\n return (\n <Select\n ref={selectRef}\n value={String(currentValue)}\n onValueChange={(newValue) => {\n if (newValue.startsWith('__create_new__')) {\n handleCreateNew();\n } else {\n onChange(newValue as CellValue);\n }\n }}\n onOpenChange={(open) => {\n setIsOpen(open);\n if (!open) {\n setSearchTerm('');\n setShowCreateOption(false);\n }\n }}\n >\n <SelectTrigger className=\"h-8\">\n <SelectValue placeholder={placeholder || `Select ${columnDef.header || 'option'}...`} />\n </SelectTrigger>\n <SelectContent\n searchable={Boolean(isSearchable)}\n searchPlaceholder={`Search ${columnDef.header || 'options'}...`}\n maxHeight={columnDef.selectMaxHeight}\n className={columnDef.selectContentClassName}\n style={columnDef.selectContentStyle}\n >\n {columnDef.fieldOptions?.map((option, index) => {\n if ('value' in option && !('type' in option)) {\n return (\n <SelectItem key={`${option.value}-${index}`} value={String(option.value)}>\n {option.label}\n </SelectItem>\n );\n }\n\n if ('type' in option && option.type === 'separator') {\n return <SelectSeparator key={`separator-${index}`} />;\n }\n\n if ('type' in option && option.type === 'group') {\n const groupOption = option as { type: 'group'; label: string; items: Array<{ value: string | number; label: string }> };\n return (\n <SelectGroup key={`group-${groupOption.label}-${index}`}>\n <SelectLabel>{groupOption.label}</SelectLabel>\n {groupOption.items.map((item: { value: string | number; label: string }) => (\n <SelectItem key={`${item.value}-${index}`} value={String(item.value)}>\n {item.label}\n </SelectItem>\n ))}\n </SelectGroup>\n );\n }\n\n return null;\n })}\n {showCreateOption && isCreatable && searchTerm.trim() && columnDef.onCreateNew && (\n <SelectItem key=\"__create_new__\" value={`__create_new__${searchTerm}`} className=\"bg-main-100 font-medium border-t border-main-200\">\n Create \"{searchTerm}\"\n </SelectItem>\n )}\n </SelectContent>\n </Select>\n );\n}\n\n/**\n * Helper function to render the appropriate input type based on column configuration\n */\nexport const renderEditField = <TData extends DataRecord>(\n column: Column<TData, unknown>,\n value: CellValue,\n onChange: (value: CellValue | Record<string, CellValue>) => void,\n editingData: Record<string, CellValue> = {},\n placeholder?: string\n): React.ReactElement => {\n const columnDef = column.columnDef as EditableColumnDef<TData>;\n\n if (columnDef.editable === false) {\n return <span className=\"text-sm text-sec-600\">{String(value ?? '')}</span>;\n }\n\n if (columnDef.fieldType === 'select' && columnDef.fieldOptions) {\n const accessorKey = columnDef.editAccessorKey || column.id;\n const currentValue = editingData[accessorKey] ?? value ?? '';\n\n return (\n <SelectEditField\n columnDef={columnDef}\n accessorKey={accessorKey}\n currentValue={currentValue}\n placeholder={placeholder}\n onChange={(newValue) => onChange({ [accessorKey]: newValue })}\n />\n );\n }\n\n if (columnDef.fieldType === 'number') {\n const hideSpinners = columnDef.hideNumberSpinners !== false;\n return (\n <Input\n type=\"number\"\n value={String(value ?? '')}\n onChange={(e) => onChange(e.target.value as unknown as CellValue)}\n placeholder={placeholder || `Enter ${columnDef.header || column.id}...`}\n className={`h-8 ${hideSpinners ? 'datatable-number-no-spinners' : ''}`}\n />\n );\n }\n\n if (columnDef.fieldType === 'date') {\n return (\n <Input\n type=\"date\"\n value={String(value ?? '')}\n onChange={(e) => onChange(e.target.value as unknown as CellValue)}\n className=\"h-8\"\n />\n );\n }\n\n return (\n <Input\n type=\"text\"\n value={String(value ?? '')}\n onChange={(e) => onChange(e.target.value as unknown as CellValue)}\n placeholder={placeholder || `Enter ${columnDef.header || column.id}...`}\n className=\"h-8\"\n />\n );\n};\n","import React from 'react';\nimport { Table } from '@tanstack/react-table';\nimport { Button } from '../../Button/Button';\nimport {\n ChevronLeft,\n ChevronRight,\n ChevronsLeft,\n ChevronsRight,\n Loader2,\n Server,\n Database,\n Zap\n} from 'lucide-react';\nimport { cn } from '../../../utils/core/cn';\nimport { Select, SelectContent, SelectItem, SelectTrigger, SelectValue } from '../../Select/Select';\nimport { getPaginationBinding, getPageSizeOptions } from '../utils/paginationUtils';\nimport type { PaginationMode, ServerSideResponse, DataRecord } from '../types';\n\n/**\n * Props for the PaginationControls component.\n * @template TData - The type of data records in the table\n */\ninterface PaginationControlsProps<TData extends DataRecord> {\n table: Table<TData>;\n pageSizeOptions?: number[];\n paginationMode?: PaginationMode;\n serverData?: ServerSideResponse<TData> | null;\n isLoading?: boolean;\n onPageChange?: (pageIndex: number) => void;\n onPageSizeChange?: (pageSize: number) => void;\n showPerformanceInfo?: boolean;\n totalCount?: number;\n}\n\n/**\n * Pagination controls component for DataTable.\n * Provides page navigation, page size selection, and performance information.\n * \n * @template TData - The type of data records in the table\n * @param props - Pagination configuration\n * @returns The rendered pagination controls\n */\nexport function PaginationControls<TData extends DataRecord>({\n table,\n pageSizeOptions = [10, 20, 30, 40, 50],\n paginationMode = 'client',\n serverData,\n isLoading = false,\n onPageChange,\n onPageSizeChange,\n showPerformanceInfo = false,\n totalCount\n}: PaginationControlsProps<TData>) {\n\n // Use unified pagination binding for consistent behavior across modes\n const pagination = getPaginationBinding({\n mode: paginationMode,\n table,\n serverData,\n totalCount,\n onPageChange,\n onPageSizeChange,\n });\n\n const {\n currentPageSize,\n currentPageIndex,\n pageCount,\n totalRows,\n canPreviousPage,\n canNextPage,\n startRow,\n endRow,\n } = pagination.state;\n\n const {\n goToFirstPage,\n goToPreviousPage,\n goToNextPage,\n goToLastPage,\n setPageSize,\n } = pagination.actions;\n\n // Get mode-specific page size options\n const availablePageSizes = getPageSizeOptions(paginationMode, pageSizeOptions);\n\n // Performance mode indicator\n const getModeIcon = () => {\n switch (paginationMode) {\n case 'server':\n return <Server className=\"size-3\" />;\n case 'hybrid':\n return <Database className=\"size-3\" />;\n default:\n return <Zap className=\"size-3\" />;\n }\n };\n\n const getModeLabel = () => {\n switch (paginationMode) {\n case 'server':\n return 'Server-side';\n case 'hybrid':\n return 'Hybrid';\n default:\n return 'Client-side';\n }\n };\n\n return (\n <footer\n aria-label=\"pagination\"\n className=\"mx-auto grid grid-cols-[auto_auto_1fr_auto_auto_auto_auto] gap-4 items-center my-2\"\n >\n {/* Left side - Page Size Selector */}\n\n <label className=\"text-sec-600\">Rows per page</label>\n <Select\n value={currentPageSize?.toString() || '10'}\n selectedText={currentPageSize?.toString() || '10'}\n onValueChange={(value) => setPageSize(Number(value))}\n disabled={isLoading}\n direction=\"up\"\n className=\"w-36 h-8\"\n >\n \n <SelectTrigger\n className={cn(\n\n isLoading && \"opacity-50 cursor-not-allowed\"\n )}\n aria-label=\"Rows per page\"\n >\n <SelectValue />\n </SelectTrigger>\n <SelectContent>\n {availablePageSizes.map((pageSize) => (\n <SelectItem key={pageSize} value={pageSize?.toString() || '10'}>\n {pageSize}\n </SelectItem>\n ))}\n </SelectContent>\n </Select>\n\n\n\n {/* Performance Mode Indicator */}\n {showPerformanceInfo && (\n <>\n {getModeIcon()}\n <span>{getModeLabel()}</span>\n </>\n )}\n\n\n {/* Row Count Display - Removed as per user request, keeping only \"Page X of Y\" */}\n\n\n {/* Center - Page Navigation */}\n\n <p className=\"justify-self-center text-sm text-sec-600 my-0 py-0\">\n Page {currentPageIndex + 1} of {pageCount || 1}\n </p>\n\n\n {/* Right side - Navigation Buttons */}\n\n\n <Button\n variant=\"outline\"\n size=\"sm\"\n className=\"size-8 p-0\"\n onClick={goToFirstPage}\n disabled={!canPreviousPage || isLoading}\n aria-label=\"Go to first page\"\n tabIndex={0}\n >\n <ChevronsLeft className=\"size-4\" />\n </Button>\n\n <Button\n variant=\"outline\"\n size=\"sm\"\n className=\"size-8 p-0\"\n onClick={goToPreviousPage}\n disabled={!canPreviousPage || isLoading}\n aria-label=\"Go to previous page\"\n tabIndex={0}\n >\n <ChevronLeft className=\"size-4\" />\n </Button>\n\n <Button\n variant=\"outline\"\n size=\"sm\"\n className=\"size-8 p-0\"\n onClick={goToNextPage}\n disabled={!canNextPage || isLoading}\n aria-label=\"Go to next page\"\n tabIndex={0}\n >\n <ChevronRight className=\"size-4\" />\n </Button>\n\n <Button\n variant=\"outline\"\n size=\"sm\"\n className=\"size-8 p-0\"\n onClick={goToLastPage}\n disabled={!canNextPage || isLoading}\n aria-label=\"Go to last page\"\n tabIndex={0}\n >\n <ChevronsRight className=\"size-4\" />\n </Button>\n </footer>\n );\n}\n\n/**\n * Enhanced pagination controls with additional features\n * Provides jump-to-page functionality for improved navigation\n */\ninterface EnhancedPaginationControlsProps<TData extends DataRecord>\n extends PaginationControlsProps<TData> {\n showJumpToPage?: boolean;\n}\n\nexport function EnhancedPaginationControls<TData extends DataRecord>({\n showJumpToPage = false,\n ...props\n}: EnhancedPaginationControlsProps<TData>) {\n const [jumpToPage, setJumpToPage] = React.useState('');\n\n const { table, paginationMode = 'client', serverData, onPageChange, totalCount } = props;\n\n // Use unified pagination binding for consistent behavior\n const pagination = getPaginationBinding({\n mode: paginationMode,\n table,\n serverData,\n totalCount,\n onPageChange,\n onPageSizeChange: props.onPageSizeChange,\n });\n\n const { pageCount } = pagination.state;\n\n const handleJumpToPage = (e: React.FormEvent) => {\n e.preventDefault();\n const pageNumber = parseInt(jumpToPage, 10);\n if (pageNumber >= 1 && pageNumber <= pageCount) {\n const pageIndex = pageNumber - 1;\n pagination.actions.goToPage(pageIndex);\n setJumpToPage('');\n }\n };\n\n return (\n <>\n <PaginationControls {...props} />\n\n {/* Additional Controls */}\n {showJumpToPage && (\n <>\n {/* Jump to Page */}\n <form onSubmit={handleJumpToPage} className=\"flex items-center space-x-2\">\n <label htmlFor=\"jump-to-page-input\" className=\"sr-only\">Jump to page</label>\n <span aria-hidden=\"true\">Jump to page:</span>\n <input\n id=\"jump-to-page-input\"\n type=\"number\"\n min=\"1\"\n max={pageCount}\n value={jumpToPage}\n onChange={(e) => setJumpToPage(e.target.value)}\n className=\"w-16 h-6 px-2 border rounded text-xs datatable-number-no-spinners\"\n placeholder=\"1\"\n aria-label=\"Page number\"\n />\n <Button type=\"submit\" size=\"sm\" variant=\"outline\" className=\"h-6 px-2 text-xs\">\n Go\n </Button>\n </form>\n </>\n )}\n </>\n );\n}\n","/**\n * @file Pagination Utilities\n * @package @jmruthers/pace-core\n * @module Components/DataTable/Utils\n * @since 0.4.0\n * \n * Unified pagination utilities that work consistently across client/server/hybrid modes.\n */\n\nimport { Table } from '@tanstack/react-table';\nimport type { PaginationMode, ServerSideResponse, DataRecord } from '../types';\nimport { createLogger } from '../../../utils/core/logger';\n\n// ============================================================================\n// TYPES\n// ============================================================================\n\n/**\n * Unified pagination state that works across all modes\n */\nexport interface UnifiedPaginationState {\n /** Current page index (0-based) */\n currentPageIndex: number;\n /** Current page size */\n currentPageSize: number;\n /** Total number of pages */\n pageCount: number;\n /** Total number of rows across all pages */\n totalRows: number;\n /** Whether previous page is available */\n canPreviousPage: boolean;\n /** Whether next page is available */\n canNextPage: boolean;\n /** Display range start (1-based for user display) */\n startRow: number;\n /** Display range end */\n endRow: number;\n}\n\n/**\n * Unified pagination actions that work across all modes\n */\nexport interface UnifiedPaginationActions {\n /** Go to first page */\n goToFirstPage: () => void;\n /** Go to previous page */\n goToPreviousPage: () => void;\n /** Go to next page */\n goToNextPage: () => void;\n /** Go to last page */\n goToLastPage: () => void;\n /** Go to specific page (0-based index) */\n goToPage: (pageIndex: number) => void;\n /** Change page size */\n setPageSize: (pageSize: number) => void;\n}\n\n/**\n * Configuration for pagination binding\n */\nexport interface PaginationBindingConfig<TData extends DataRecord> {\n /** Pagination mode */\n mode: PaginationMode;\n /** TanStack table instance (for client/hybrid modes) */\n table?: Table<TData>;\n /** Server data (for server/hybrid modes) */\n serverData?: ServerSideResponse<TData> | null;\n /** Total count override (for hybrid mode) */\n totalCount?: number;\n /** Page change callback (for server/hybrid modes) */\n onPageChange?: (pageIndex: number) => void;\n /** Page size change callback (for server/hybrid modes) */\n onPageSizeChange?: (pageSize: number) => void;\n}\n\n/**\n * Complete pagination binding with state and actions\n */\nexport interface PaginationBinding {\n /** Current pagination state */\n state: UnifiedPaginationState;\n /** Available pagination actions */\n actions: UnifiedPaginationActions;\n}\n\n// ============================================================================\n// CORE UTILITY FUNCTION\n// ============================================================================\n\n/**\n * Creates a unified pagination binding that works consistently across all modes.\n * \n * This utility abstracts away the differences between client-side, server-side,\n * and hybrid pagination modes, providing a consistent interface for components.\n * \n * @param config - Configuration object with mode and required dependencies\n * @returns Unified pagination state and actions\n * \n * @example\n * ```tsx\n * // Client mode\n * const pagination = getPaginationBinding({\n * mode: 'client',\n * table: tableInstance\n * });\n * \n * // Server mode\n * const pagination = getPaginationBinding({\n * mode: 'server',\n * serverData: serverResponse,\n * onPageChange: handlePageChange,\n * onPageSizeChange: handlePageSizeChange\n * });\n * \n * // Hybrid mode\n * const pagination = getPaginationBinding({\n * mode: 'hybrid',\n * table: tableInstance,\n * totalCount: serverTotalCount,\n * onPageChange: handlePageChange\n * });\n * ```\n */\n/**\n * Creates a unified pagination binding that works across all pagination modes.\n * Provides consistent pagination state and actions regardless of client/server/hybrid mode.\n * \n * @template TData - The type of data records in the table\n * @param config - Pagination binding configuration\n * @returns Unified pagination state and actions\n */\nexport function getPaginationBinding<TData extends DataRecord>(\n config: PaginationBindingConfig<TData>\n): PaginationBinding {\n const { mode, table, serverData, totalCount, onPageChange, onPageSizeChange } = config;\n\n // ============================================================================\n // STATE CALCULATION\n // ============================================================================\n\n const state = calculatePaginationState(config);\n\n // ============================================================================\n // ACTION HANDLERS\n // ============================================================================\n\n const actions: UnifiedPaginationActions = {\n goToFirstPage: () => {\n if (mode === 'server') {\n onPageChange?.(0);\n } else if (table) {\n table.setPageIndex(0);\n }\n },\n\n goToPreviousPage: () => {\n const targetPage = Math.max(0, state.currentPageIndex - 1);\n if (mode === 'server') {\n onPageChange?.(targetPage);\n } else if (table) {\n table.previousPage();\n }\n },\n\n goToNextPage: () => {\n const targetPage = Math.min(state.pageCount - 1, state.currentPageIndex + 1);\n if (mode === 'server') {\n onPageChange?.(targetPage);\n } else if (table) {\n table.nextPage();\n }\n },\n\n goToLastPage: () => {\n const lastPage = state.pageCount - 1;\n if (mode === 'server') {\n onPageChange?.(lastPage);\n } else if (table) {\n table.setPageIndex(lastPage);\n }\n },\n\n goToPage: (pageIndex: number) => {\n // Validate page index\n const clampedIndex = Math.max(0, Math.min(state.pageCount - 1, pageIndex));\n \n if (mode === 'server') {\n onPageChange?.(clampedIndex);\n } else if (table) {\n table.setPageIndex(clampedIndex);\n }\n },\n\n setPageSize: (pageSize: number) => {\n if (mode === 'server') {\n onPageSizeChange?.(pageSize);\n } else if (table) {\n table.setPageSize(pageSize);\n }\n },\n };\n\n return { state, actions };\n}\n\n// ============================================================================\n// HELPER FUNCTIONS\n// ============================================================================\n\n/**\n * Calculates unified pagination state from the current configuration\n */\nfunction calculatePaginationState<TData extends DataRecord>(\n config: PaginationBindingConfig<TData>\n): UnifiedPaginationState {\n const { mode, table, serverData, totalCount } = config;\n\n if (mode === 'server' && serverData) {\n // Server mode: use server response data\n const startRow = serverData.pageIndex * serverData.pageSize + 1;\n const endRow = Math.min((serverData.pageIndex + 1) * serverData.pageSize, serverData.totalCount);\n\n return {\n currentPageIndex: serverData.pageIndex,\n currentPageSize: serverData.pageSize,\n pageCount: serverData.pageCount,\n totalRows: serverData.totalCount,\n canPreviousPage: serverData.hasPreviousPage,\n canNextPage: serverData.hasNextPage,\n startRow,\n endRow,\n };\n }\n\n if (table) {\n // Client or hybrid mode: use table state\n const paginationState = table.getState().pagination;\n const rowCount = totalCount ?? table.getRowCount();\n const pageCount = Math.ceil(rowCount / paginationState.pageSize);\n \n const startRow = paginationState.pageIndex * paginationState.pageSize + 1;\n const endRow = Math.min((paginationState.pageIndex + 1) * paginationState.pageSize, rowCount);\n\n return {\n currentPageIndex: paginationState.pageIndex,\n currentPageSize: paginationState.pageSize,\n pageCount,\n totalRows: rowCount,\n canPreviousPage: table.getCanPreviousPage(),\n canNextPage: table.getCanNextPage(),\n startRow,\n endRow,\n };\n }\n\n // Fallback state (should not happen in normal usage)\n return {\n currentPageIndex: 0,\n currentPageSize: 10,\n pageCount: 1,\n totalRows: 0,\n canPreviousPage: false,\n canNextPage: false,\n startRow: 0,\n endRow: 0,\n };\n}\n\n/**\n * Validates pagination configuration and logs warnings for common issues\n */\nexport function validatePaginationConfig<TData extends DataRecord>(\n config: PaginationBindingConfig<TData>\n): boolean {\n const { mode, table, serverData, onPageChange, onPageSizeChange } = config;\n const logger = createLogger('PaginationUtils');\n\n let isValid = true;\n\n // Server mode validation\n if (mode === 'server') {\n if (!serverData) {\n logger.warn('Server mode requires serverData');\n isValid = false;\n }\n if (!onPageChange) {\n logger.warn('Server mode requires onPageChange callback');\n isValid = false;\n }\n if (!onPageSizeChange) {\n logger.warn('Server mode requires onPageSizeChange callback');\n isValid = false;\n }\n }\n\n // Client/Hybrid mode validation\n if ((mode === 'client' || mode === 'hybrid') && !table) {\n logger.warn(`${mode} mode requires table instance`);\n isValid = false;\n }\n\n // Hybrid mode validation\n if (mode === 'hybrid') {\n if (!onPageChange) {\n logger.warn('Hybrid mode requires onPageChange callback for server pagination');\n isValid = false;\n }\n }\n\n return isValid;\n}\n\n/**\n * Gets appropriate page size options based on pagination mode\n */\nexport function getPageSizeOptions(mode: PaginationMode, defaultOptions: number[] = [10, 20, 30, 40, 50]): number[] {\n switch (mode) {\n case 'server':\n // Limit server-side page sizes to prevent performance issues\n return defaultOptions.filter(size => size <= 250);\n case 'hybrid':\n // Hybrid mode prefers larger pages for better performance\n return defaultOptions.filter(size => size >= 50);\n default:\n // Client mode can handle any page size\n return defaultOptions;\n }\n}\n\n/**\n * Calculates optimal page size based on data size and mode\n */\nexport function calculateOptimalPageSize(\n dataSize: number, \n mode: PaginationMode,\n availableOptions: number[] = [10, 20, 30, 40, 50]\n): number {\n const filteredOptions = getPageSizeOptions(mode, availableOptions);\n \n if (mode === 'client' && dataSize <= 100) {\n // For small datasets in client mode, show all data\n return Math.max(dataSize, filteredOptions[0]);\n }\n \n if (mode === 'server' && dataSize > 10000) {\n // For large server datasets, use smaller pages\n return Math.min(...filteredOptions);\n }\n \n if (mode === 'hybrid') {\n // For hybrid mode, prefer larger page sizes for better performance\n const sortedOptions = [...filteredOptions].sort((a, b) => a - b);\n return sortedOptions[0] || 50; // Return the smallest available option that's >= 50\n }\n \n // Default to first available option\n return filteredOptions[0] || 10;\n}\n","/**\n * @file DataTable Modals Component\n * @package @jmruthers/pace-core\n * @module Components/DataTable/Components\n * @since 0.2.0\n * \n * Container component for all modal dialogs used by the DataTable component.\n * This includes import modals and other data table related dialogs.\n * \n * @example\n * ```tsx\n * <DataTableModals\n * showImportModal={isImportOpen}\n * onCloseImportModal={() => setIsImportOpen(false)}\n * onImport={handleImportData}\n * importModalConfig={{\n * title: \"Import Users\",\n * description: \"Upload a CSV file with user data.\"\n * }}\n * />\n * ```\n */\n\nimport React, { useEffect } from 'react';\nimport { ImportModal, type ImportModalConfig } from './ImportModal';\nimport { createLogger } from '../../../utils/core/logger';\n\n/**\n * Maps CSV column data to table column structure\n * Handles reference fields (columns with editAccessorKey) and direct accessorKey columns\n */\nfunction mapCSVToTableColumns<TData extends Record<string, unknown> = Record<string, unknown>>(\n csvData: Array<Record<string, unknown>>,\n columns: Array<{\n id?: string;\n accessorKey?: string;\n header?: string;\n editAccessorKey?: string;\n }>\n): TData[] {\n const logger = createLogger('mapCSVToTableColumns');\n // Create a mapping from CSV headers to table field names\n // Priority: editAccessorKey > accessorKey > id\n const columnMap = new Map<string, string>();\n \n columns.forEach(col => {\n const fieldName = col.editAccessorKey || col.accessorKey || col.id;\n const header = typeof col.header === 'string' ? col.header : '';\n \n if (fieldName && header) {\n const headerLower = header.toLowerCase();\n // Map header to field name (case-insensitive)\n columnMap.set(headerLower, fieldName);\n \n // Also map id/accessorKey if different from header\n const colId = col.id || col.accessorKey;\n if (colId && colId !== header && colId !== fieldName) {\n columnMap.set(colId.toLowerCase(), fieldName);\n }\n \n // For reference fields with editAccessorKey, also map the ID column header\n // This handles exports that include both \"Type\" and \"Type (ID)\" columns\n if (col.editAccessorKey && header) {\n const editAccessorKey = col.editAccessorKey; // Store in const for proper type narrowing\n const idColumnHeader = `${header} (ID)`;\n columnMap.set(idColumnHeader.toLowerCase(), editAccessorKey);\n // Also map the editAccessorKey directly (in case CSV uses the field name)\n columnMap.set(editAccessorKey.toLowerCase(), editAccessorKey);\n }\n } else {\n logger.warn('Skipping column with missing fieldName or header:', col);\n }\n });\n \n if (csvData.length === 0) {\n logger.warn('No CSV data to map');\n return [];\n }\n \n // Transform CSV data using the mapping\n const mappedData = csvData.map((row, index) => {\n const mappedRow: Record<string, unknown> = {};\n \n // For each CSV column, find the corresponding table field\n Object.keys(row).forEach(csvHeader => {\n const csvHeaderLower = csvHeader.toLowerCase();\n \n // Try exact match first\n let fieldName = columnMap.get(csvHeaderLower);\n \n // If no exact match, try flexible suffix matching:\n // If CSV header ends with \" [space] ColumnHeader\", match it\n // This handles cases like \"Meal Type\" → \"Type\", \"User Name\" → \"Name\", etc.\n // Also handles \"Meal Type (ID)\" → matches the column with header \"Type (ID)\"\n if (!fieldName) {\n for (const [mapKey, mapValue] of columnMap.entries()) {\n // Check if CSV header ends with the mapped key (with a space before it, or exact match)\n const keyWithSpace = ` ${mapKey}`;\n if (csvHeaderLower === mapKey || csvHeaderLower.endsWith(keyWithSpace)) {\n fieldName = mapValue;\n break; // Found a match, stop searching\n }\n }\n }\n \n if (fieldName) {\n mappedRow[fieldName] = row[csvHeader];\n } else {\n // If no mapping found, use the CSV header as-is (lowercase)\n mappedRow[csvHeaderLower] = row[csvHeader];\n if (index === 0) {\n logger.warn(`No mapping found for \"${csvHeader}\", using as-is`);\n }\n }\n });\n \n return mappedRow as TData;\n });\n \n return mappedData;\n}\n\n/**\n * Props interface for the DataTableModals component\n * @public\n */\nexport interface DataTableModalsProps<TData extends Record<string, unknown> = Record<string, unknown>> {\n // Import modal\n /** Whether the import modal is visible */\n showImportModal: boolean;\n /** Callback function when the import modal is closed */\n onCloseImportModal: () => void;\n /** Callback function when data is imported successfully */\n onImport: (data: TData[]) => void | Promise<void>;\n /** Configuration object for customizing import modal text content */\n importModalConfig?: ImportModalConfig;\n /** Column definitions for automatic column mapping during import */\n columns?: Array<{\n id?: string;\n accessorKey?: string;\n header?: string;\n editAccessorKey?: string;\n }>;\n \n // Focus management\n /** Function to store focus before opening modal */\n onStoreFocus?: () => void;\n /** Function to restore focus after closing modal */\n onRestoreFocus?: () => void;\n}\n\n/**\n * DataTableModals component that renders all modal dialogs for the DataTable\n * \n * @param props - The component props\n * @returns JSX.Element - Container with all data table modal dialogs\n * \n * @example\n * ```tsx\n * const importConfig = {\n * title: \"Import Customer Data\",\n * description: \"Upload a CSV file with customer information to import multiple records.\",\n * uploadText: \"Choose a customer CSV file\",\n * selectFileButtonText: \"Browse Files\"\n * };\n * \n * <DataTableModals\n * showImportModal={showImport}\n * onCloseImportModal={() => setShowImport(false)}\n * onImport={handleImportedData}\n * importModalConfig={importConfig}\n * isViewModalOpen={showView}\n * onCloseViewModal={() => setShowView(false)}\n * viewModalData={selectedRow}\n * />\n * ```\n */\n/**\n * Container component for all DataTable modal dialogs.\n * Manages import modals and other data table related dialogs.\n * \n * @template TData - The type of data records in the table\n * @param props - Modal configuration and handlers\n * @returns The rendered modals\n */\nexport function DataTableModals<TData extends Record<string, unknown> = Record<string, unknown>>({\n showImportModal,\n onCloseImportModal,\n onImport,\n importModalConfig,\n columns,\n onStoreFocus,\n onRestoreFocus,\n}: DataTableModalsProps<TData>) {\n const logger = createLogger('DataTableModals');\n // Handle focus management for import modal\n useEffect(() => {\n if (showImportModal) {\n onStoreFocus?.();\n } else {\n // Restore focus when modal closes\n const timeoutId = setTimeout(() => {\n onRestoreFocus?.();\n }, 100); // Small delay to ensure modal is fully closed\n \n return () => clearTimeout(timeoutId);\n }\n }, [showImportModal, onStoreFocus, onRestoreFocus]);\n\n return (\n <>\n <ImportModal\n isOpen={showImportModal}\n onClose={onCloseImportModal}\n onImport={async (rawData: Array<Record<string, unknown>>) => {\n try {\n // Automatically map CSV columns to table columns based on column definitions\n let mappedData: TData[];\n if (columns && columns.length > 0) {\n mappedData = mapCSVToTableColumns<TData>(rawData, columns);\n } else {\n logger.warn('No columns provided for mapping, using raw data');\n mappedData = rawData as TData[];\n }\n \n if (!onImport) {\n logger.error('onImport callback is not provided');\n throw new Error('Import handler is not configured. Please provide an onImport callback.');\n }\n \n const result = onImport(mappedData);\n if (result && typeof result.then === 'function') {\n await result;\n }\n } catch (error) {\n logger.error('Import error:', error);\n throw error; // Re-throw to let ImportModal handle it\n }\n }}\n config={importModalConfig}\n />\n\n </>\n );\n}\n","/**\n * @file Import Modal Component\n * @package @jmruthers/pace-core\n * @module Components/DataTable/Components\n * @since 0.2.0\n * \n * A modal dialog for importing CSV data into the DataTable component.\n * Provides file selection, data preview, and validation functionality.\n * \n * @example\n * ```tsx\n * <ImportModal\n * isOpen={showModal}\n * onClose={() => setShowModal(false)}\n * onImport={(data) => handleImportedData(data)}\n * title=\"Import Users\"\n * description=\"Upload a CSV file containing user data to import multiple users at once.\"\n * uploadText=\"Choose a user CSV file to upload\"\n * selectFileButtonText=\"Select User File\"\n * />\n * ```\n * \n * @accessibility\n * - Uses pace-core Dialog component with full accessibility support\n * - Proper ARIA labels and descriptions\n * - Keyboard navigation support\n * - Screen reader compatible file input\n * - Error messages are announced to screen readers\n * \n * @features\n * - CSV file validation and parsing\n * - Data preview (first 5 rows)\n * - Total row count display\n * - Error handling and user feedback\n * - Processing state management\n * - Customizable text content\n */\nimport React, { useState, useRef, useEffect } from 'react';\nimport { Dialog, DialogContent, DialogDescription, DialogHeader, DialogTitle } from '../../Dialog';\nimport { Button } from '../../Button/Button';\nimport { Input } from '../../Input/Input';\nimport { Progress } from '../../Progress';\nimport { Upload, FileText, AlertCircle } from 'lucide-react';\nimport { createLogger } from '../../../utils/core/logger';\n\n/**\n * Configuration interface for customizing ImportModal text content\n * @public\n */\nexport interface ImportModalConfig {\n /** Custom title for the import modal */\n title?: string;\n /** Custom description text shown below the title */\n description?: string;\n /** Custom text shown in the file upload area when no file is selected */\n uploadText?: string;\n /** Custom text for the file selection button */\n selectFileButtonText?: string;\n /** Custom text for the import button */\n importButtonText?: string;\n /** Custom text for the import button when processing */\n importButtonProcessingText?: string;\n /** Custom text for the cancel button */\n cancelButtonText?: string;\n /** Custom text for the preview section header */\n previewHeaderText?: string;\n /** Custom text pattern for total rows display. Use {count} as placeholder for the actual count */\n totalRowsText?: string;\n}\n\n/**\n * Props interface for the ImportModal component\n * @public\n */\ninterface ImportModalProps {\n /** Whether the modal is open */\n isOpen: boolean;\n /** Callback function when the modal is closed */\n onClose: () => void;\n /** Callback function when data is imported successfully */\n onImport: (data: Array<Record<string, unknown>>) => void | Promise<void>;\n /** Configuration object for customizing modal text content */\n config?: ImportModalConfig;\n}\n\n/**\n * ImportModal component for handling CSV data import\n * \n * @param props - The component props\n * @returns JSX.Element - The import modal dialog\n * \n * @example\n * ```tsx\n * const importConfig = {\n * title: \"Import Customer Data\",\n * description: \"Upload a CSV file with customer information to import multiple records.\",\n * uploadText: \"Choose a customer CSV file\",\n * selectFileButtonText: \"Browse Files\",\n * importButtonText: \"Import Customers\",\n * totalRowsText: \"Found {count} customer records to import\"\n * };\n * \n * <ImportModal\n * isOpen={isImportModalOpen}\n * onClose={() => setIsImportModalOpen(false)}\n * onImport={handleDataImport}\n * config={importConfig}\n * />\n * ```\n */\n/**\n * Import modal component for DataTable.\n * Provides CSV file upload, preview, and import functionality.\n * \n * @param props - Import modal configuration\n * @returns The rendered import modal dialog\n */\nexport function ImportModal({ isOpen, onClose, onImport, config = {} }: ImportModalProps) {\n const logger = createLogger('ImportModal');\n const [file, setFile] = useState<File | null>(null);\n const [isProcessing, setIsProcessing] = useState(false);\n const [error, setError] = useState<string | null>(null);\n const [previewData, setPreviewData] = useState<Array<Record<string, unknown>> | null>(null);\n const [totalCount, setTotalCount] = useState<number>(0);\n const [validationErrors, setValidationErrors] = useState<Array<{row: number; field: string; message: string}>>([]);\n const [importProgress, setImportProgress] = useState<{ current: number; total: number; stage: 'parsing' | 'importing' } | null>(null);\n const fileInputRef = useRef<HTMLInputElement>(null);\n const isMountedRef = useRef(true);\n\n // Cleanup effect to prevent state updates after unmount\n useEffect(() => {\n return () => {\n isMountedRef.current = false;\n };\n }, []);\n\n // Reset state when modal opens/closes to ensure clean initial state\n useEffect(() => {\n if (!isOpen) {\n // Reset all state when modal is closed\n setFile(null);\n setPreviewData(null);\n setTotalCount(0);\n setError(null);\n setValidationErrors([]);\n setIsProcessing(false);\n setImportProgress(null);\n // Reset file input\n if (fileInputRef.current) {\n fileInputRef.current.value = '';\n }\n }\n }, [isOpen]);\n\n // Extract config with defaults\n const {\n title = 'Import Data',\n description = 'Upload a CSV file to import multiple records at once.',\n uploadText = 'Choose a CSV file to upload',\n selectFileButtonText = 'Select File',\n importButtonText = 'Import',\n importButtonProcessingText = 'Processing...',\n cancelButtonText = 'Cancel',\n previewHeaderText = 'Preview (first 5 rows)',\n totalRowsText = 'Total rows to import: {count}'\n } = config;\n\n\n const processCSV = (csvText: string): Array<Record<string, unknown>> => {\n const lines = csvText.split('\\n').filter(line => line.trim());\n \n if (lines.length < 2) {\n throw new Error('CSV must have at least a header row and one data row');\n }\n\n // Better CSV parsing that handles quotes and commas within values\n const parseCSVLine = (line: string): string[] => {\n const result: string[] = [];\n let current = '';\n let inQuotes = false;\n \n for (let i = 0; i < line.length; i++) {\n const char = line[i];\n \n if (char === '\"') {\n inQuotes = !inQuotes;\n } else if (char === ',' && !inQuotes) {\n result.push(current.trim());\n current = '';\n } else {\n current += char;\n }\n }\n result.push(current.trim());\n return result;\n };\n\n const headers = parseCSVLine(lines[0]).map(h => h.replace(/\"/g, '').trim());\n \n const data = lines.slice(1).map((line) => {\n const values = parseCSVLine(line).map(v => v.replace(/\"/g, '').trim());\n const row: Record<string, unknown> = {};\n headers.forEach((header, colIndex) => {\n row[header] = values[colIndex] || '';\n });\n return row;\n });\n\n return data;\n };\n\n const handleImport = async () => {\n if (!file) return;\n\n setIsProcessing(true);\n setError(null);\n setImportProgress({ current: 0, total: 0, stage: 'parsing' });\n\n try {\n // Step 1: Parse CSV with progress indication\n const text = await file.text();\n const lines = text.split('\\n').filter(line => line.trim());\n const totalLines = lines.length;\n \n if (totalLines < 2) {\n throw new Error('CSV must have at least a header row and one data row');\n }\n\n // For large files, process in chunks to show progress\n const CHUNK_SIZE = 1000; // Process 1000 rows at a time\n const data: Array<Record<string, unknown>> = [];\n \n if (totalLines > CHUNK_SIZE) {\n // Large file - process in chunks with progress\n const parseCSVLine = (line: string): string[] => {\n const result: string[] = [];\n let current = '';\n let inQuotes = false;\n \n for (let i = 0; i < line.length; i++) {\n const char = line[i];\n \n if (char === '\"') {\n inQuotes = !inQuotes;\n } else if (char === ',' && !inQuotes) {\n result.push(current.trim());\n current = '';\n } else {\n current += char;\n }\n }\n result.push(current.trim());\n return result;\n };\n\n const headers = parseCSVLine(lines[0]).map(h => h.replace(/\"/g, '').trim());\n \n // Process data rows in chunks\n for (let i = 1; i < totalLines; i += CHUNK_SIZE) {\n const chunkEnd = Math.min(i + CHUNK_SIZE, totalLines);\n const chunk = lines.slice(i, chunkEnd);\n \n chunk.forEach((line, index) => {\n const values = parseCSVLine(line).map(v => v.replace(/\"/g, '').trim());\n const row: Record<string, unknown> = {};\n headers.forEach((header, colIndex) => {\n row[header] = values[colIndex] || '';\n });\n data.push(row);\n });\n \n // Update progress\n const processed = Math.min(chunkEnd - 1, totalLines - 1);\n if (isMountedRef.current) {\n setImportProgress({ \n current: processed, \n total: totalLines - 1, \n stage: 'parsing' \n });\n }\n \n // Yield to browser to update UI\n await new Promise(resolve => setTimeout(resolve, 0));\n }\n } else {\n // Small file - process normally\n const parsedData = processCSV(text);\n data.push(...parsedData);\n if (isMountedRef.current) {\n setImportProgress({ \n current: totalLines - 1, \n total: totalLines - 1, \n stage: 'parsing' \n });\n }\n }\n \n // Step 2: Import data with progress indication\n if (isMountedRef.current) {\n setImportProgress({ \n current: 0, \n total: data.length, \n stage: 'importing' \n });\n }\n \n // Await the onImport callback in case it returns a promise\n const result = onImport(data);\n if (result && typeof result.then === 'function') {\n // For async imports, we can't track exact progress, but we show it's processing\n // The progress will remain at 0 until the import completes\n await result;\n }\n // Note: For synchronous imports, the progress stays at 0 until we mark it complete\n \n // Mark as complete\n if (isMountedRef.current) {\n setImportProgress({ \n current: data.length, \n total: data.length, \n stage: 'importing' \n });\n }\n \n // Small delay to show completion\n await new Promise(resolve => setTimeout(resolve, 300));\n \n onClose();\n setFile(null);\n } catch (err) {\n setError(err instanceof Error ? err.message : 'Failed to process file');\n setImportProgress(null);\n } finally {\n if (isMountedRef.current) {\n setIsProcessing(false);\n setImportProgress(null);\n }\n }\n };\n\n const handleClose = () => {\n setFile(null);\n setError(null);\n setPreviewData(null);\n setTotalCount(0);\n setValidationErrors([]);\n setImportProgress(null);\n onClose();\n };\n \n const handleFileSelect = async (event: React.ChangeEvent<HTMLInputElement>) => {\n const selectedFile = event.target.files?.[0];\n if (selectedFile) {\n setFile(selectedFile);\n setError(null);\n setValidationErrors([]);\n \n // Generate preview\n try {\n const text = await selectedFile.text();\n const data = processCSV(text);\n setPreviewData(data.slice(0, 5)); // Show first 5 rows as preview\n setTotalCount(data.length); // Store total count\n } catch (err) {\n logger.error('CSV parsing error:', err);\n setError(err instanceof Error ? err.message : 'Failed to preview file');\n setPreviewData(null);\n setTotalCount(0);\n }\n }\n };\n\n return (\n <Dialog open={isOpen} onOpenChange={handleClose}>\n <DialogContent className=\"sm:max-w-2xl bg-main-50\">\n <DialogHeader>\n <DialogTitle>{title}</DialogTitle>\n <DialogDescription>\n {description}\n </DialogDescription>\n </DialogHeader>\n\n <div className=\"space-y-4\">\n <div className=\"border-2 border-dashed border-sec-200 rounded-lg p-6 text-center\">\n <FileText className=\"size-8 mx-auto text-sec-400 mb-2\" />\n <p className=\"text-sec-600 mb-2\">\n {file ? `Selected: ${file.name}` : uploadText}\n </p>\n {file && (\n <p className=\"text-xs text-sec-500\">\n File selected, processing preview...\n </p>\n )}\n <Button\n variant=\"outline\"\n size=\"sm\"\n onClick={() => fileInputRef.current?.click()}\n >\n <Upload className=\"size-4 mr-2\" />\n {selectFileButtonText}\n </Button>\n <Input\n ref={fileInputRef}\n type=\"file\"\n accept=\".csv\"\n onChange={handleFileSelect}\n className=\"hidden\"\n />\n </div>\n\n {error && (\n <div className=\"flex items-center gap-2 p-3 bg-acc-50 border border-acc-200 rounded text-acc-700\">\n <AlertCircle className=\"size-4\" />\n <span className=\"text-sm\">{error}</span>\n </div>\n )}\n \n {validationErrors.length > 0 && (\n <div className=\"space-y-2\">\n <div className=\"flex items-center gap-2 p-3 bg-acc-50 border border-acc-200 rounded text-acc-700\">\n <AlertCircle className=\"size-4\" />\n <span className=\"text-sm font-medium\">\n {validationErrors.length} validation error{validationErrors.length !== 1 ? 's' : ''} found\n </span>\n </div>\n <div className=\"max-h-32 overflow-y-auto space-y-1\">\n {validationErrors.slice(0, 10).map((err, idx) => (\n <div key={idx} className=\"text-xs text-acc-600 p-2 bg-acc-50 border border-acc-200 rounded\">\n <span className=\"font-medium\">Row {err.row}</span> • {err.field}: {err.message}\n </div>\n ))}\n {validationErrors.length > 10 && (\n <div className=\"text-xs text-sec-500 italic\">\n ... and {validationErrors.length - 10} more errors\n </div>\n )}\n </div>\n </div>\n )}\n\n\n {importProgress && isProcessing && (\n <div className=\"space-y-2 p-4 bg-sec-50 rounded-lg border border-sec-200\">\n <div className=\"flex items-center justify-between\">\n <span className=\"text-sm font-medium text-sec-900\">\n {importProgress.stage === 'parsing' ? 'Parsing CSV file...' : 'Importing data...'}\n </span>\n <span className=\"text-sm text-sec-600\">\n {importProgress.current.toLocaleString()} / {importProgress.total.toLocaleString()} rows\n </span>\n </div>\n <Progress \n value={importProgress.total > 0 ? (importProgress.current / importProgress.total) * 100 : 0} \n className=\"h-2 bg-sec-200\"\n />\n <p className=\"text-xs text-sec-500\">\n {importProgress.total > 0 && importProgress.current < importProgress.total\n ? `${Math.round((importProgress.current / importProgress.total) * 100)}% complete`\n : importProgress.stage === 'importing' && importProgress.current === 0\n ? 'Processing your data...'\n : importProgress.current === importProgress.total\n ? 'Complete!'\n : 'Processing...'}\n </p>\n </div>\n )}\n\n {file && previewData && previewData.length > 0 && !isProcessing ? (\n <div className=\"space-y-3\">\n <h4 className=\"text-sec-900\">{previewHeaderText}</h4>\n <div className=\"border rounded-lg overflow-hidden\">\n <div className=\"overflow-x-auto max-h-48\">\n <table className=\"min-w-full text-xs\">\n <thead className=\"bg-sec-50\">\n <tr>\n {Object.keys(previewData[0]).map((header) => (\n <th key={header} className=\"px-2 py-1 text-left font-medium text-sec-900 border-b\">\n {header}\n </th>\n ))}\n </tr>\n </thead>\n <tbody>\n {previewData.map((row, index) => (\n <tr key={index} className={index % 2 === 0 ? 'bg-app-main-50' : 'bg-sec-50'}>\n {Object.values(row).map((value, cellIndex) => (\n <td key={cellIndex} className=\"px-2 py-1 text-sec-700 border-b\">\n {String(value)}\n </td>\n ))}\n </tr>\n ))}\n </tbody>\n </table>\n </div>\n </div>\n <p className=\"text-sec-500\">\n {totalRowsText.replace('{count}', totalCount.toString())}\n </p>\n </div>\n ) : !file ? (\n <div className=\"border rounded-lg p-6 text-center bg-sec-50\">\n <p className=\"text-sec-500\">\n Select a CSV file to preview\n </p>\n </div>\n ) : null}\n\n <div className=\"flex justify-end gap-2\">\n <Button variant=\"outline\" onClick={handleClose}>\n {cancelButtonText}\n </Button>\n <Button \n onClick={handleImport} \n disabled={!file || isProcessing}\n >\n {isProcessing ? importButtonProcessingText : importButtonText}\n </Button>\n </div>\n </div>\n </DialogContent>\n </Dialog>\n );\n}\n","/**\n * @file Dialog Component System\n * @package @jmruthers/pace-core\n * @module Components/Dialog\n * @since 0.1.0\n *\n * A comprehensive dialog component system built on top of Radix UI primitives.\n * Provides accessible modal dialogs with focus management and keyboard navigation.\n * Uses semantic HTML elements including native <dialog> element for maximum accessibility.\n *\n * Features:\n * - Semantic HTML structure (native <dialog>, header, main, footer elements)\n * - Focus trapping within dialog content\n * - Keyboard navigation (Escape to close, Tab for focus management)\n * - Screen reader support with proper ARIA attributes\n * - Native dialog element with enhanced styling\n * - Complete semantic landmark structure for accessibility\n * - Smooth animations and transitions\n * - Customizable styling and positioning\n * - Multiple size variants (sm, md, lg, xl, full, auto)\n * - Responsive design with smart height management\n * - Automatic height constraints based on viewport\n * - Scrollable content areas when content overflows\n * - Sticky headers/footers with scrollable body\n * - Overlay backdrop with customization\n * - Close button with accessibility (optional)\n * - Header, footer, title, and description components\n * - Configurable close behaviors\n *\n * @example\n * ```tsx\n * // Basic dialog with semantic structure\n * <Dialog>\n * <DialogTrigger asChild>\n * <Button>Open Dialog</Button>\n * </DialogTrigger>\n * <DialogContent size=\"lg\">\n * <DialogHeader>\n * <DialogTitle>Edit Profile</DialogTitle>\n * <DialogDescription>\n * Make changes to your profile here. Click save when you're done.\n * </DialogDescription>\n * </DialogHeader>\n * <DialogBody>\n * <section className=\"space-y-4\">\n * <fieldset className=\"grid grid-cols-4 items-center gap-4\">\n * <Label htmlFor=\"name\" className=\"text-right\">Name</Label>\n * <Input id=\"name\" defaultValue=\"John Doe\" className=\"col-span-3\" />\n * </fieldset>\n * </section>\n * </DialogBody>\n * <DialogFooter>\n * <Button type=\"submit\">Save changes</Button>\n * </DialogFooter>\n * </DialogContent>\n * </Dialog>\n * \n * // Dialog with semantic scrolling content\n * <Dialog>\n * <DialogTrigger asChild>\n * <Button>Scrollable Dialog</Button>\n * </DialogTrigger>\n * <DialogContent \n * size=\"lg\" \n * enableScrolling={true}\n * maxHeightPercent={80}\n * >\n * <DialogHeader>\n * <DialogTitle>Large Content Dialog</DialogTitle>\n * <DialogDescription>\n * This dialog has lots of content and will scroll if needed.\n * </DialogDescription>\n * </DialogHeader>\n * <DialogBody>\n * <section className=\"space-y-4\">\n * {Array.from({ length: 50 }, (_, i) => (\n * <article key={i}>\n * <h4>Content Item {i + 1}</h4>\n * <p>This is semantic content within the dialog body.</p>\n * </article>\n * ))}\n * </section>\n * </DialogBody>\n * <DialogFooter>\n * <Button>Save</Button>\n * </DialogFooter>\n * </DialogContent>\n * </Dialog>\n * \n * // Auto-sizing dialog that fits content\n * <Dialog>\n * <DialogTrigger asChild>\n * <Button>Auto Size Dialog</Button>\n * </DialogTrigger>\n * <DialogContent size=\"auto\">\n * <DialogHeader>\n * <DialogTitle>Auto-Sized Dialog</DialogTitle>\n * <DialogDescription>\n * This dialog automatically adjusts its width to fit the content.\n * </DialogDescription>\n * </DialogHeader>\n * <DialogBody>\n * <section>\n * <p>Content that determines the dialog width...</p>\n * </section>\n * </DialogBody>\n * </DialogContent>\n * </Dialog>\n * \n * // Full-screen dialog with semantic structure\n * <Dialog>\n * <DialogTrigger asChild>\n * <Button>Full Screen</Button>\n * </DialogTrigger>\n * <DialogContent size=\"full\">\n * <DialogHeader>\n * <DialogTitle>Full Screen Dialog</DialogTitle>\n * </DialogHeader>\n * <DialogBody>\n * <section>\n * <p>Full screen content with semantic structure...</p>\n * </section>\n * </DialogBody>\n * </DialogContent>\n * </Dialog>\n * ```\n *\n * @accessibility\n * - WCAG 2.1 AA compliant\n * - Uses semantic HTML structure (dialog, header, main, footer)\n * - Native dialog element with enhanced ARIA attributes via Radix UI\n * - Focus trapping within dialog content\n * - Keyboard navigation support\n * - Screen reader announcements\n * - Focus restoration when closed\n * - Escape key to close (configurable)\n * - Tab key focus management\n * - Close button with screen reader text (optional)\n * - Scrollable regions properly announced to screen readers\n * - Complete semantic landmark structure for screen reader navigation\n *\n * @performance\n * - Efficient focus management\n * - Optimized animations\n * - Memory leak prevention\n * - Conditional rendering\n * - Optimized scroll handling\n *\n * @dependencies\n * - @radix-ui/react-dialog - Core dialog functionality\n * - lucide-react - Icons\n * - React 19+ - Hooks and refs\n * - Tailwind CSS - Styling and animations\n */\n\nimport * as React from 'react';\nimport * as DialogPrimitive from '@radix-ui/react-dialog';\nimport { X } from 'lucide-react';\nimport { cn } from '../../utils/core/cn';\nimport { renderSafeHtml } from '../../utils/validation/htmlSanitization';\nimport { useState, useEffect } from 'react';\n\n/**\n * Simple debounce function that matches lodash debounce API\n * Returns a debounced function with a cancel method\n */\nfunction debounce<T extends (...args: any[]) => void>(\n func: T,\n wait: number\n): T & { cancel: () => void } {\n let timeoutId: ReturnType<typeof setTimeout> | null = null;\n\n const debounced = ((...args: Parameters<T>) => {\n if (timeoutId !== null) {\n clearTimeout(timeoutId);\n }\n timeoutId = setTimeout(() => {\n func(...args);\n }, wait);\n }) as T & { cancel: () => void };\n\n debounced.cancel = () => {\n if (timeoutId !== null) {\n clearTimeout(timeoutId);\n timeoutId = null;\n }\n };\n\n return debounced;\n}\n\n/**\n * Dialog size variants\n * @public\n */\nexport type DialogSize = 'sm' | 'md' | 'lg' | 'xl' | 'full' | 'auto';\n\n/**\n * Props for the Dialog root component\n * @public\n */\nexport interface DialogProps extends DialogPrimitive.DialogProps {}\n\n/**\n * Props for the DialogTrigger component\n * @public\n */\nexport interface DialogTriggerProps extends DialogPrimitive.DialogTriggerProps {}\n\n/**\n * Enhanced props for the DialogContent component with size variants and customization\n * Uses semantic HTML dialog element with Radix UI accessibility features\n * @public\n */\nexport interface DialogContentProps extends React.ComponentPropsWithoutRef<typeof DialogPrimitive.Content> {\n /** Dialog size variant */\n size?: DialogSize;\n /** Whether to show the close button */\n showCloseButton?: boolean;\n /** Custom className for the overlay */\n overlayClassName?: string;\n /** Whether to prevent closing on escape key */\n preventCloseOnEscape?: boolean;\n /** Whether to prevent closing on outside click */\n preventCloseOnOutsideClick?: boolean;\n /** Maximum height as percentage of viewport height (0-100) */\n maxHeightPercent?: number;\n /** Maximum width as percentage of viewport width (0-100) */\n maxWidthPercent?: number;\n /** Enable smart scrolling with sticky header/footer */\n enableScrolling?: boolean;\n /** Custom max height in CSS units (overrides maxHeightPercent) */\n maxHeight?: string;\n /** Custom max width in CSS units (overrides maxWidthPercent and size) */\n maxWidth?: string;\n /** Minimum height in CSS units */\n minHeight?: string;\n /** Minimum width in CSS units */\n minWidth?: string;\n}\n\n/**\n * Props for the DialogOverlay component\n * @public\n */\nexport interface DialogOverlayProps extends React.ComponentPropsWithoutRef<typeof DialogPrimitive.Overlay> {}\n\n/**\n * Props for the DialogHeader component (semantic header element)\n * @public\n */\nexport interface DialogHeaderProps extends React.HTMLAttributes<HTMLElement> {\n /** Whether this header should be sticky when scrolling is enabled */\n sticky?: boolean;\n}\n\n/**\n * Props for the DialogFooter component (semantic footer element)\n * @public\n */\nexport interface DialogFooterProps extends React.HTMLAttributes<HTMLElement> {\n /** Whether this footer should be sticky when scrolling is enabled */\n sticky?: boolean;\n}\n\n/**\n * Props for the DialogBody component (semantic main element)\n * @public\n */\nexport interface DialogBodyProps extends React.HTMLAttributes<HTMLElement> {\n /** Custom max height for the scrollable area */\n maxHeight?: string;\n /** HTML content to render (will be sanitized for security) */\n htmlContent?: string;\n /** Whether to allow HTML content rendering (default: true) */\n allowHtml?: boolean;\n /** Whether to use strict HTML sanitization (default: true) */\n strictSanitization?: boolean;\n /** Whether to log HTML sanitization warnings to console (default: false) */\n logWarnings?: boolean;\n}\n\n/**\n * Props for the DialogTitle component\n * @public\n */\nexport interface DialogTitleProps extends React.ComponentPropsWithoutRef<typeof DialogPrimitive.Title> {\n /** HTML content to render as title (will be sanitized for security) */\n htmlContent?: string;\n /** Whether to allow HTML content rendering (default: true) */\n allowHtml?: boolean;\n}\n\n/**\n * Props for the DialogDescription component\n * @public\n */\nexport interface DialogDescriptionProps extends React.ComponentPropsWithoutRef<typeof DialogPrimitive.Description> {\n /** HTML content to render as description (will be sanitized for security) */\n htmlContent?: string;\n /** Whether to allow HTML content rendering (default: true) */\n allowHtml?: boolean;\n}\n\n// Size mapping for dialog variants\nconst sizeClasses = {\n sm: 'max-w-sm',\n md: 'max-w-md', \n lg: 'max-w-lg',\n xl: 'max-w-xl',\n full: 'max-w-full size-full',\n auto: 'max-w-none w-auto min-w-0'\n};\n\n// Root Dialog components from Radix\nconst Dialog = DialogPrimitive.Root;\nconst DialogTrigger = DialogPrimitive.Trigger;\nconst DialogPortal = DialogPrimitive.Portal;\nconst DialogClose = DialogPrimitive.Close;\n\n// DialogOverlay component\nconst DialogOverlay = React.forwardRef<\n React.ElementRef<typeof DialogPrimitive.Overlay>,\n DialogOverlayProps\n>(({ className, ...props }, ref) => (\n <DialogPrimitive.Overlay\n ref={ref}\n className={cn(\n 'fixed inset-0 z-50 bg-black/50 data-[state=open]:animate-in data-[state=closed]:animate-out data-[state=closed]:fade-out-0 data-[state=open]:fade-in-0',\n className\n )}\n {...props}\n />\n));\nDialogOverlay.displayName = DialogPrimitive.Overlay.displayName;\n\n/**\n * Custom hook for managing smart dialog dimensions\n * Handles responsive sizing and viewport-based constraints\n */\nconst useSmartDimensions = ({\n maxHeightPercent,\n maxWidthPercent,\n maxHeight,\n maxWidth,\n minHeight,\n minWidth,\n enableScrolling = false,\n}: {\n maxHeightPercent?: number;\n maxWidthPercent?: number;\n maxHeight?: string;\n maxWidth?: string;\n minHeight?: string;\n minWidth?: string;\n enableScrolling?: boolean;\n}) => {\n const [dimensions, setDimensions] = useState<React.CSSProperties>({});\n\n useEffect(() => {\n if (!maxHeightPercent && !maxWidthPercent && !maxHeight && !maxWidth && !minHeight && !minWidth) {\n return;\n }\n\n const updateDimensions = () => {\n const result: React.CSSProperties = {};\n\n // Handle height constraints\n if (maxHeightPercent && typeof maxHeightPercent === 'number') {\n const constrainedHeight = Math.min(maxHeightPercent, 95); // Cap at 95% to ensure some margin\n result.maxHeight = `${constrainedHeight}vh`;\n } else if (maxHeight) {\n result.maxHeight = maxHeight;\n }\n\n // Handle width constraints \n if (maxWidthPercent && typeof maxWidthPercent === 'number') {\n const constrainedWidth = Math.min(maxWidthPercent, 95); // Cap at 95% to ensure some margin\n result.maxWidth = `${constrainedWidth}vw`;\n } else if (maxWidth) {\n result.maxWidth = maxWidth;\n }\n\n // Include minHeight/minWidth if provided\n if (minHeight) {\n result.minHeight = minHeight;\n }\n if (minWidth) {\n result.minWidth = minWidth;\n }\n\n setDimensions(result);\n };\n\n // Debounced resize handler\n const debouncedUpdate = debounce(updateDimensions, 100);\n \n // Initial calculation\n updateDimensions();\n \n // Listen for resize events\n window.addEventListener('resize', debouncedUpdate);\n \n return () => {\n window.removeEventListener('resize', debouncedUpdate);\n debouncedUpdate.cancel();\n };\n }, [maxHeightPercent, maxWidthPercent, maxHeight, maxWidth, minHeight, minWidth, enableScrolling]);\n\n // Only return dimensions if we have something to constrain\n const result: React.CSSProperties = {};\n\n // Handle height constraints\n if (maxHeightPercent && typeof maxHeightPercent === 'number') {\n const constrainedHeight = Math.min(maxHeightPercent, 95);\n result.maxHeight = `${constrainedHeight}vh`;\n } else if (maxHeight) {\n result.maxHeight = maxHeight;\n }\n\n // Handle width constraints\n if (maxWidthPercent && typeof maxWidthPercent === 'number') {\n const constrainedWidth = Math.min(maxWidthPercent, 95);\n result.maxWidth = `${constrainedWidth}vw`;\n } else if (maxWidth) {\n result.maxWidth = maxWidth;\n }\n\n // Include minHeight/minWidth if provided\n if (minHeight) {\n result.minHeight = minHeight;\n }\n if (minWidth) {\n result.minWidth = minWidth;\n }\n\n return result;\n};\n\n/**\n * DialogContent component\n * The main content container using semantic HTML <dialog> element with enhanced features\n * Built on Radix UI primitives for accessibility while providing semantic structure\n * \n * @param props - Content configuration and styling\n * @param ref - Forwarded ref to the dialog element\n * @returns JSX.Element - The semantic dialog content with overlay and optional close button\n * \n * @example\n * ```tsx\n * <DialogContent size=\"lg\" enableScrolling={true} maxHeightPercent={80}>\n * <DialogHeader>\n * <DialogTitle>Scrollable Dialog</DialogTitle>\n * <DialogDescription>This dialog will scroll if content overflows.</DialogDescription>\n * </DialogHeader>\n * <DialogBody>\n * <section>Large amount of semantic content here...</section>\n * </DialogBody>\n * <DialogFooter>\n * <Button>Save</Button>\n * </DialogFooter>\n * </DialogContent>\n * ```\n */\nconst DialogContent = React.forwardRef<\n React.ElementRef<typeof DialogPrimitive.Content>,\n DialogContentProps\n>(({ \n className, \n children, \n size = 'md',\n showCloseButton = true,\n overlayClassName,\n preventCloseOnEscape = false,\n preventCloseOnOutsideClick = false,\n maxHeightPercent,\n maxWidthPercent,\n enableScrolling = false,\n maxHeight,\n maxWidth,\n minHeight,\n minWidth,\n style,\n ...props \n}, ref) => {\n const smartDimensions = useSmartDimensions({ \n maxHeightPercent, \n maxWidthPercent,\n maxHeight, \n maxWidth,\n minHeight,\n minWidth,\n enableScrolling \n });\n\n // React Compiler handles memoization automatically\n const handleEscapeKeyDown = (event: KeyboardEvent) => {\n if (preventCloseOnEscape) {\n event.preventDefault();\n }\n };\n\n const handlePointerDownOutside = (event: Event) => {\n if (preventCloseOnOutsideClick) {\n event.preventDefault();\n }\n };\n\n // Merge smart dimensions with provided style\n const mergedStyle = React.useMemo(() => {\n // If no smart dimensions are active, just return the provided style\n if (Object.keys(smartDimensions).length === 0) {\n return style;\n }\n\n // Start with smart dimensions\n const finalStyle: React.CSSProperties = { ...smartDimensions, ...style };\n \n // If not using smart width and no maxWidth override, don't include maxWidth\n if (!maxWidth && !maxWidthPercent) {\n const { maxWidth: _, ...styleWithoutMaxWidth } = finalStyle;\n return styleWithoutMaxWidth;\n }\n \n return finalStyle;\n }, [smartDimensions, style, maxWidth, maxWidthPercent]);\n\n return (\n <DialogPortal>\n <DialogOverlay className={overlayClassName} />\n <DialogPrimitive.Content\n ref={ref}\n onEscapeKeyDown={preventCloseOnEscape ? handleEscapeKeyDown : undefined}\n onPointerDownOutside={handlePointerDownOutside}\n className={cn(\n 'fixed left-[50%] top-[50%] z-[51] w-full translate-x-[-50%] translate-y-[-50%] border bg-background shadow-lg duration-200 data-[state=open]:animate-in data-[state=closed]:animate-out data-[state=closed]:fade-out-0 data-[state=open]:fade-in-0 data-[state=closed]:zoom-out-95 data-[state=open]:zoom-in-95 data-[state=closed]:slide-out-to-left-1/2 data-[state=closed]:slide-out-to-top-[48%] data-[state=open]:slide-in-from-left-1/2 data-[state=open]:slide-in-from-top-[48%] sm:rounded-lg',\n // Reset native dialog styles that interfere with our custom styling\n 'm-0 p-0 max-w-none max-h-none w-auto h-auto border-0 bg-transparent outline-none',\n // Apply our custom styling\n 'border bg-background shadow-lg',\n // Only apply size classes if not using smart width\n !maxWidth && !maxWidthPercent && sizeClasses[size],\n // Auto size gets special handling for content fitting\n size === 'auto' && 'w-fit max-w-[90vw] sm:max-w-[80vw]',\n // Layout classes based on scrolling mode\n enableScrolling ? 'flex flex-col' : 'grid gap-4 p-6',\n // Full screen handling\n size === 'full' && 'sm:left-[50%] sm:top-[50%] sm:translate-x-[-50%] sm:translate-y-[-50%] left-0 top-0 translate-x-0 translate-y-0 h-full rounded-none sm:h-auto sm:rounded-lg',\n // Overflow handling for scrolling mode\n enableScrolling && 'overflow-hidden',\n className\n )}\n style={mergedStyle}\n {...props}\n >\n {children}\n {showCloseButton && (\n <DialogPrimitive.Close className=\"absolute right-4 top-4 z-10 rounded-sm opacity-70 ring-offset-background transition-opacity hover:opacity-100 focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2 disabled:pointer-events-none data-[state=open]:bg-accent data-[state=open]:text-muted-foreground\">\n <X className=\"size-4\" />\n <span className=\"sr-only\">Close</span>\n </DialogPrimitive.Close>\n )}\n </DialogPrimitive.Content>\n </DialogPortal>\n );\n});\nDialogContent.displayName = DialogPrimitive.Content.displayName;\n\n/**\n * DialogHeader component\n * Semantic header container for dialog title and description with optional sticky behavior\n * \n * @param props - Header configuration and styling\n * @returns JSX.Element - The dialog header container using semantic <header> element\n * \n * @example\n * ```tsx\n * <DialogHeader sticky={true}>\n * <DialogTitle>Sticky Header</DialogTitle>\n * <DialogDescription>This header stays visible while scrolling.</DialogDescription>\n * </DialogHeader>\n * ```\n */\nconst DialogHeader = ({\n className,\n sticky = false,\n ...props\n}: DialogHeaderProps) => (\n <header\n className={cn(\n 'flex flex-col space-y-1.5 text-center sm:text-left',\n sticky ? 'sticky top-0 z-10 bg-background p-6 pb-4 border-b' : 'p-6 pb-4',\n className\n )}\n {...props}\n />\n);\nDialogHeader.displayName = 'DialogHeader';\n\n/**\n * DialogBody component\n * Semantic main content area for dialog body content with scrollable functionality\n * Supports both React children and safe HTML content rendering\n * \n * @param props - Body configuration and styling\n * @returns JSX.Element - The scrollable dialog body container using semantic <main> element\n * \n * @example\n * ```tsx\n * // Using React children\n * <DialogBody>\n * <section className=\"space-y-4\">\n * <h4>Content Title</h4>\n * <p>Long content that will scroll...</p>\n * </section>\n * </DialogBody>\n * \n * // Using HTML content\n * <DialogBody \n * htmlContent=\"<h2>Import Instructions</h2><p>Upload a CSV file with the following format:</p><ul><li>Required columns: name, email</li><li>Optional columns: phone, address</li></ul>\"\n * allowHtml={true}\n * />\n * ```\n */\nconst DialogBody = ({\n className,\n maxHeight,\n style,\n htmlContent,\n allowHtml = true,\n strictSanitization = true,\n logWarnings = false,\n children,\n ...props\n}: DialogBodyProps) => {\n const mergedStyle = React.useMemo(() => {\n return {\n ...(maxHeight && { maxHeight }),\n ...style,\n };\n }, [maxHeight, style]);\n\n // Process HTML content if provided\n const processedHtmlContent = React.useMemo(() => {\n if (!htmlContent || !allowHtml) {\n return null;\n }\n\n const result = renderSafeHtml(htmlContent, {\n strict: strictSanitization,\n logWarnings\n });\n\n return result.html;\n }, [htmlContent, allowHtml, strictSanitization, logWarnings]);\n\n // Determine if htmlContent was provided (even if processing failed)\n const hasHtmlContent = Boolean(htmlContent && allowHtml);\n\n return (\n <main\n className={cn(\n 'overflow-y-auto px-6 py-2',\n className\n )}\n style={mergedStyle}\n aria-label=\"Dialog main content\"\n tabIndex={-1}\n {...props}\n >\n {processedHtmlContent ? (\n <div \n dangerouslySetInnerHTML={{ __html: processedHtmlContent }}\n className=\"prose prose-sm max-w-none\"\n />\n ) : (\n <>\n {hasHtmlContent && !processedHtmlContent && (\n <div className=\"text-acc-500 mb-2\">\n No HTML content processed. Showing children instead.\n </div>\n )}\n {children}\n </>\n )}\n </main>\n );\n};\nDialogBody.displayName = 'DialogBody';\n\n/**\n * DialogFooter component\n * Semantic footer container for dialog action buttons with optional sticky behavior\n * \n * @param props - Footer configuration and styling\n * @returns JSX.Element - The dialog footer container using semantic <footer> element\n * \n * @example\n * ```tsx\n * <DialogFooter sticky={true}>\n * <Button variant=\"outline\">Cancel</Button>\n * <Button>Save changes</Button>\n * </DialogFooter>\n * ```\n */\nconst DialogFooter = ({\n className,\n sticky = false,\n ...props\n}: DialogFooterProps) => (\n <footer\n className={cn(\n // Only apply default layout classes if no custom className is provided\n !className && 'flex flex-col-reverse sm:flex-row sm:justify-end sm:space-x-2',\n !className && (sticky ? 'sticky bottom-0 z-10 bg-background p-6 pt-4 border-t' : 'p-6 pt-4'),\n className\n )}\n {...props}\n />\n);\nDialogFooter.displayName = 'DialogFooter';\n\nconst DialogTitle = React.forwardRef<\n React.ElementRef<typeof DialogPrimitive.Title>,\n DialogTitleProps\n>(({ className, htmlContent, allowHtml = true, children, ...props }, ref) => {\n const processedHtmlContent = React.useMemo(() => {\n if (!htmlContent || !allowHtml) {\n return null;\n }\n\n const result = renderSafeHtml(htmlContent, {\n strict: true,\n logWarnings: false\n });\n\n return result.html;\n }, [htmlContent, allowHtml]);\n\n return (\n <DialogPrimitive.Title\n ref={ref}\n className={cn(\n className\n )}\n {...props}\n >\n {processedHtmlContent ? (\n <span dangerouslySetInnerHTML={{ __html: processedHtmlContent }} />\n ) : (\n children\n )}\n </DialogPrimitive.Title>\n );\n});\nDialogTitle.displayName = DialogPrimitive.Title.displayName;\n\nconst DialogDescription = React.forwardRef<\n HTMLHeadingElement,\n DialogDescriptionProps\n>(({ className, htmlContent, allowHtml = true, children, ...props }, ref) => {\n const processedHtmlContent = React.useMemo(() => {\n if (!htmlContent || !allowHtml) {\n return null;\n }\n\n const result = renderSafeHtml(htmlContent, {\n strict: true,\n logWarnings: false\n });\n\n return result.html;\n }, [htmlContent, allowHtml]);\n\n return (\n <DialogPrimitive.Description asChild>\n <h5\n ref={ref}\n className={cn(className)}\n {...props}\n >\n {processedHtmlContent ? (\n <span dangerouslySetInnerHTML={{ __html: processedHtmlContent }} />\n ) : (\n children\n )}\n </h5>\n </DialogPrimitive.Description>\n );\n});\nDialogDescription.displayName = DialogPrimitive.Description.displayName;\n\nexport {\n Dialog,\n DialogPortal,\n DialogOverlay,\n DialogClose,\n DialogTrigger,\n DialogContent,\n DialogHeader,\n DialogBody,\n DialogFooter,\n DialogTitle,\n DialogDescription,\n};\n","/**\n * @file Progress Component\n * @package @jmruthers/pace-core\n * @module Components/Progress\n * @since 0.1.0\n *\n * An accessible progress bar component built on the native HTML `<progress>` element.\n * Provides smooth animations and proper ARIA attributes for screen readers.\n *\n * Features:\n * - Smooth progress animations\n * - Customizable value and max range\n * - Native accessibility support (role=\"progressbar\" automatically applied)\n * - Customizable styling and appearance\n * - Responsive design\n * - Indeterminate state support\n *\n * @example\n * ```tsx\n * // Basic progress bar\n * <Progress value={50} />\n * \n * // Progress with custom max value\n * <Progress value={7} max={10} />\n * \n * // Progress with custom styling\n * <Progress \n * value={75} \n * className=\"h-4 bg-sec-200\" \n * />\n * \n * // Animated progress (controlled)\n * const [progress, setProgress] = useState(0);\n * \n * useEffect(() => {\n * const timer = setInterval(() => {\n * setProgress(prev => prev >= 100 ? 0 : prev + 10);\n * }, 1000);\n * return () => clearInterval(timer);\n * }, []);\n * \n * <Progress value={progress} />\n * \n * // Indeterminate progress (no value)\n * <Progress />\n * ```\n *\n * @accessibility\n * - WCAG 2.1 AA compliant\n * - Native `<progress>` element provides role=\"progressbar\" automatically\n * - Screen reader announcements for progress changes\n * - High contrast support\n *\n * @performance\n * - CSS transitions for smooth animations\n * - Efficient re-rendering\n * - Minimal DOM structure (native HTML element)\n *\n * @dependencies\n * - React 19+ - Hooks and refs\n * - Tailwind CSS - Styling\n */\n\nimport * as React from 'react';\nimport { cn } from '../../utils/core/cn';\n\n/**\n * Props for the Progress component\n */\nexport interface ProgressProps extends React.HTMLAttributes<HTMLProgressElement> {\n /** Current progress value (0 to max). Omit for indeterminate state. */\n value?: number;\n /** Maximum progress value (default: 100) */\n max?: number;\n}\n\n/**\n * Progress component\n * An accessible progress bar with smooth animations using native HTML `<progress>` element\n * \n * @param props - Progress configuration and styling\n * @param ref - Forwarded ref to the progress element\n * @returns JSX.Element - The rendered progress bar\n * \n * @example\n * ```tsx\n * <Progress value={75} max={100} />\n * ```\n */\nconst Progress = React.forwardRef<\n HTMLProgressElement,\n ProgressProps\n>(({ className, value, max = 100, ...props }, ref) => {\n const isIndeterminate = value === undefined;\n \n return (\n <progress\n ref={ref}\n className={cn(\n 'appearance-none border-0 h-2 w-full rounded-full overflow-hidden transition-all accent-primary',\n isIndeterminate\n ? 'bg-gradient-to-r from-primary/10 via-primary/90 to-primary/10'\n : 'bg-primary/20',\n className\n )}\n {...(isIndeterminate ? {} : { value })}\n max={max}\n {...props}\n />\n );\n});\n\nProgress.displayName = 'Progress';\n\nexport { Progress };\n","/**\n * @file Accessibility Utilities for DataTable\n * @package @jmruthers/pace-core\n * @module Components/DataTable/Utils\n * @since 0.4.0\n * \n * Utilities for managing accessibility features in DataTable components.\n */\n\n/**\n * Live region instance for screen reader announcements\n */\nlet liveRegion: HTMLElement | null = null;\n\n/**\n * Initialize the live region for screen reader announcements\n * This should be called once when the DataTable is mounted\n */\nexport function initializeLiveRegion(): HTMLElement | null {\n if (typeof window === 'undefined') return null;\n \n if (liveRegion && document.contains(liveRegion)) {\n return liveRegion;\n }\n\n // Create live region element\n liveRegion = document.createElement('div');\n liveRegion.setAttribute('aria-live', 'polite');\n liveRegion.setAttribute('aria-atomic', 'true');\n liveRegion.setAttribute('class', 'sr-only');\n liveRegion.style.position = 'absolute';\n liveRegion.style.left = '-10000px';\n liveRegion.style.width = '1px';\n liveRegion.style.height = '1px';\n liveRegion.style.overflow = 'hidden';\n\n // Add to document body\n document.body.appendChild(liveRegion);\n\n return liveRegion;\n}\n\n/**\n * Clean up the live region when DataTable is unmounted\n */\nexport function cleanupLiveRegion(): void {\n if (typeof window === 'undefined') return;\n \n if (liveRegion && document.contains(liveRegion)) {\n document.body.removeChild(liveRegion);\n liveRegion = null;\n }\n}\n\n/**\n * Announce a message to screen readers via the live region\n * @param message - The message to announce\n * @param priority - The priority level ('polite' or 'assertive')\n */\nexport function announce(message: string, priority: 'polite' | 'assertive' = 'polite'): void {\n if (!message.trim() || typeof window === 'undefined') return;\n\n const region = liveRegion || initializeLiveRegion();\n if (!region) return;\n \n // Update aria-live attribute if needed\n if (region.getAttribute('aria-live') !== priority) {\n region.setAttribute('aria-live', priority);\n }\n\n // Clear and set the message\n region.textContent = '';\n \n // Use setTimeout to ensure the screen reader picks up the change\n setTimeout(() => {\n region.textContent = message;\n }, 100);\n\n // Clear the message after a delay to avoid repetition\n setTimeout(() => {\n if (region.textContent === message) {\n region.textContent = '';\n }\n }, 1000);\n}\n\n/**\n * Generate accessible sort button label\n * @param columnName - The name of the column\n * @param currentSort - Current sort state ('asc', 'desc', or false)\n */\nexport function getSortButtonLabel(columnName: string, currentSort: 'asc' | 'desc' | false): string {\n if (currentSort === 'asc') {\n return `Sort ${columnName} descending`;\n } else if (currentSort === 'desc') {\n return `Remove sort from ${columnName}`;\n } else {\n return `Sort ${columnName} ascending`;\n }\n}\n\n/**\n * Generate accessible sort announcement\n * @param columnName - The name of the column\n * @param sortDirection - The new sort direction\n */\nexport function announceSortChange(columnName: string, sortDirection: 'asc' | 'desc' | null): void {\n let message: string;\n \n if (sortDirection === 'asc') {\n message = `Table sorted by ${columnName} in ascending order`;\n } else if (sortDirection === 'desc') {\n message = `Table sorted by ${columnName} in descending order`;\n } else {\n message = `Sort removed from ${columnName}`;\n }\n \n announce(message);\n}\n\n/**\n * Announce filter changes\n * @param columnName - The name of the column being filtered\n * @param filterValue - The filter value\n * @param resultCount - Number of results after filtering\n */\nexport function announceFilterChange(columnName: string, filterValue: string, resultCount: number): void {\n if (filterValue.trim()) {\n const message = `Filtered ${columnName} by \"${filterValue}\". ${resultCount} ${resultCount === 1 ? 'result' : 'results'} found.`;\n announce(message);\n } else {\n announce(`Filter removed from ${columnName}`);\n }\n}\n\n/**\n * Announce search results\n * @param query - The search query\n * @param resultCount - Number of search results\n */\nexport function announceSearchResults(query: string, resultCount: number): void {\n if (query.trim()) {\n const message = `Search for \"${query}\" returned ${resultCount} ${resultCount === 1 ? 'result' : 'results'}.`;\n announce(message);\n } else {\n announce('Search cleared');\n }\n}\n\n/**\n * Announce pagination changes\n * @param currentPage - Current page number (1-based)\n * @param totalPages - Total number of pages\n * @param pageSize - Number of items per page\n * @param totalItems - Total number of items\n */\nexport function announcePaginationChange(\n currentPage: number, \n totalPages: number, \n pageSize: number, \n totalItems: number\n): void {\n const startItem = (currentPage - 1) * pageSize + 1;\n const endItem = Math.min(currentPage * pageSize, totalItems);\n \n const message = `Page ${currentPage} of ${totalPages}. Showing items ${startItem} to ${endItem} of ${totalItems}.`;\n announce(message);\n}\n\n/**\n * Announce row selection changes\n * @param selectedCount - Number of selected rows\n * @param totalCount - Total number of rows\n */\nexport function announceSelectionChange(selectedCount: number, totalCount: number): void {\n if (selectedCount === 0) {\n announce('All rows deselected');\n } else if (selectedCount === totalCount) {\n announce(`All ${totalCount} rows selected`);\n } else {\n announce(`${selectedCount} of ${totalCount} rows selected`);\n }\n}\n\n/**\n * Announce data loading states\n * @param isLoading - Whether data is currently loading\n * @param hasError - Whether there was an error loading data\n */\nexport function announceLoadingState(isLoading: boolean, hasError: boolean = false): void {\n if (hasError) {\n announce('Error loading data', 'assertive');\n } else if (isLoading) {\n announce('Loading data...');\n } else {\n announce('Data loaded');\n }\n}\n\n/**\n * Announce bulk operations\n * @param operation - The operation performed ('delete', 'export', etc.)\n * @param count - Number of items affected\n */\nexport function announceBulkOperation(operation: string, count: number): void {\n const message = `${operation} completed for ${count} ${count === 1 ? 'item' : 'items'}`;\n announce(message);\n}\n\n/**\n * Get ARIA sort value for column headers\n * @param sortDirection - Current sort direction\n */\n/**\n * Converts TanStack Table sort direction to ARIA sort value.\n * Maps table sort states to accessible ARIA attributes.\n * \n * @param sortDirection - Sort direction from TanStack Table\n * @returns ARIA sort value for accessibility\n */\nexport function getAriaSortValue(sortDirection: 'asc' | 'desc' | false): 'ascending' | 'descending' | 'none' {\n if (sortDirection === 'asc') return 'ascending';\n if (sortDirection === 'desc') return 'descending';\n return 'none';\n}\n\n/**\n * Get accessible row description for screen readers\n * @param rowIndex - The row index (0-based)\n * @param totalRows - Total number of rows\n * @param isSelected - Whether the row is selected\n * @param isEditing - Whether the row is being edited\n */\nexport function getRowDescription(\n rowIndex: number, \n totalRows: number, \n isSelected: boolean = false, \n isEditing: boolean = false\n): string {\n let description = `Row ${rowIndex + 1} of ${totalRows}`;\n \n if (isSelected) {\n description += ', selected';\n }\n \n if (isEditing) {\n description += ', editing mode';\n }\n \n return description;\n}\n","/**\n * @file Export Utilities for DataTable\n * @package @jmruthers/pace-core\n * @module DataTable\n * @since 0.1.0\n * \n * Utility functions for exporting DataTable data to CSV format.\n * Provides automatic column mapping and data formatting.\n * \n * Features:\n * - CSV export with headers\n * - Automatic column mapping\n * - Data sanitization\n * - Custom filename support\n * - Browser download handling\n */\n\nimport { createLogger } from '../../../utils/core/logger';\nimport type { DataRecord } from '../types';\n\n/**\n * @example\n * ```tsx\n * // Basic export\n * exportToCSV(\n * tableData,\n * columns,\n * 'export.csv'\n * );\n * ```\n * \n * @example\n * ```tsx\n * // With custom column mapping\n * const columns = [\n * { accessorKey: 'name', header: 'Full Name' },\n * { accessorKey: 'email', header: 'Email Address' },\n * { accessorKey: 'role', header: 'User Role' }\n * ];\n * \n * exportToCSV(users, columns, 'users.csv');\n * ```\n */\n\n/**\n * Column definition for export\n */\nexport interface ExportColumn {\n header?: string;\n id?: string;\n accessorKey?: string;\n accessorFn?: (row: DataRecord) => unknown;\n editAccessorKey?: string;\n isIdColumn?: boolean; // Internal flag to mark ID columns for reference fields\n}\n\n/**\n * Escapes a value for CSV format according to RFC 4180\n * - Encloses in quotes if value contains comma, newline, or quote\n * - Escapes existing quotes by doubling them\n * - Prevents CSV injection by sanitizing dangerous characters\n */\nfunction escapeCSVValue(value: unknown, sanitizeForSecurity: boolean = true): string {\n if (value === null || value === undefined) {\n return sanitizeForSecurity ? '\"\"' : '';\n }\n \n let stringValue = String(value);\n \n if (sanitizeForSecurity) {\n // Sanitize to prevent CSV injection\n // Check for dangerous patterns that could be interpreted as formulas\n // If starts with =, +, -, @, or \\t, it could be a formula\n if (/^[=+\\-@]/.test(stringValue) || stringValue.startsWith('\\t')) {\n // Prefix with single quote to prevent formula interpretation in Excel\n stringValue = \"'\" + stringValue;\n }\n \n // Remove control characters except newline (which is handled below)\n stringValue = stringValue.replace(/[\\x00-\\x08\\x0B-\\x0C\\x0E-\\x1F]/g, '');\n \n // Always quote values for consistency and safety\n const escaped = stringValue.replace(/\"/g, '\"\"');\n return `\"${escaped}\"`;\n } else {\n // Minimal escaping - only escape quotes in quoted strings\n const escaped = stringValue.replace(/\"/g, '\"\"');\n return `\"${escaped}\"`;\n }\n}\n\n/**\n * Formats a value according to locale preferences\n */\nfunction formatLocaleValue(value: unknown, locale?: string): string {\n if (value === null || value === undefined) {\n return '';\n }\n \n if (typeof value === 'number') {\n return new Intl.NumberFormat(locale).format(value);\n }\n \n if (value instanceof Date) {\n return new Intl.DateTimeFormat(locale).format(value);\n }\n \n if (typeof value === 'boolean') {\n return ''; // Don't format booleans in formatLocaleValue, let them pass through as-is\n }\n \n return String(value);\n}\n\n/**\n * Generates CSV content from data without triggering download\n * \n * @param data - Array of data objects to export\n * @param columns - Column definitions for mapping\n * @param options - Export options\n * @returns CSV content as string\n */\nexport function generateCSVContent<TData extends DataRecord>(\n data: TData[],\n columns: ExportColumn[],\n options: { \n includeHeaders?: boolean;\n locale?: string;\n sanitizeForSecurity?: boolean; // Default: true\n } = {}\n): string {\n const logger = createLogger('generateCSVContent');\n if (!data.length) return '';\n\n const { \n includeHeaders = true,\n locale,\n sanitizeForSecurity = true\n } = options;\n\n // Create CSV header row\n const headers = columns.map(col => {\n const headerValue = col.header || col.id || \"Column\";\n return escapeCSVValue(headerValue, sanitizeForSecurity);\n });\n \n // Format data into CSV rows\n const csvData = data.map(row => {\n return columns.map(col => {\n let value: unknown;\n \n // Handle accessorFn (for computed/reference fields) first\n if (col.accessorFn) {\n try {\n value = col.accessorFn(row);\n } catch (error) {\n logger.warn('Error evaluating accessorFn for column:', col.id || col.header, error);\n value = undefined;\n }\n } else {\n // Fall back to accessorKey or id for direct property access\n const key = col.accessorKey || col.id;\n value = key ? row[key] : undefined;\n }\n \n // Format according to locale if provided\n if (locale && (typeof value === 'number' || value instanceof Date || typeof value === 'boolean')) {\n value = formatLocaleValue(value, locale);\n }\n \n // Escape the value for CSV\n return escapeCSVValue(value, sanitizeForSecurity);\n }).join(\",\");\n });\n \n // Combine header and data\n const csvContent = includeHeaders \n ? [headers.join(\",\"), ...csvData].join(\"\\n\")\n : csvData.join(\"\\n\");\n \n return csvContent;\n}\n\n/**\n * Exports DataTable data using TanStack Table rows with getValue() for proper accessorFn evaluation\n * This ensures computed columns (with accessorFn) export correctly with their displayed values\n */\nexport async function exportToCSVWithTableRows(\n tableRows: Array<{ \n original: DataRecord;\n getValue: (columnId: string) => unknown;\n id: string;\n }>,\n columns: ExportColumn[],\n columnIdToTableColumn: Map<string, unknown>,\n filename: string = \"download.csv\",\n options: {\n locale?: string;\n sanitizeForSecurity?: boolean;\n } = {}\n): Promise<void> {\n const logger = createLogger('ExportUtils');\n return new Promise((resolve, reject) => {\n try {\n if (typeof window === 'undefined') {\n throw new Error('CSV export is only available in browser environments');\n }\n\n if (!tableRows || tableRows.length === 0) {\n throw new Error('No data to export');\n }\n\n if (!columns || columns.length === 0) {\n throw new Error('No columns defined for export');\n }\n\n // Create CSV header row\n const headers = columns.map(col => {\n const headerValue = col.header || col.id || \"Column\";\n return escapeCSVValue(headerValue, options.sanitizeForSecurity !== false);\n });\n\n // Format data into CSV rows using table row getValue() for proper accessorFn evaluation\n const csvData = tableRows.map(tableRow => {\n return columns.map(col => {\n let value: unknown;\n \n // For ID columns (reference field IDs), get directly from original data\n if (col.isIdColumn && col.accessorKey) {\n value = tableRow.original[col.accessorKey];\n } \n // For columns with accessorFn, use TanStack Table's getValue() which properly evaluates it\n else if (col.id && columnIdToTableColumn.has(col.id)) {\n try {\n // Use getValue() which properly evaluates accessorFn with the table's context\n value = tableRow.getValue(col.id);\n } catch (error) {\n // Fallback: try accessorFn directly if getValue() fails\n if (col.accessorFn) {\n try {\n value = col.accessorFn(tableRow.original);\n } catch (accessorError) {\n logger.warn('Error evaluating accessorFn for column:', col.id || col.header, accessorError);\n value = undefined;\n }\n } else {\n // Direct property access\n const key = col.accessorKey || col.id;\n value = key ? tableRow.original[key] : undefined;\n }\n }\n }\n // Fallback to direct property access\n else {\n const key = col.accessorKey || col.id;\n value = key ? tableRow.original[key] : undefined;\n }\n\n // Format according to locale if provided\n if (options.locale && (typeof value === 'number' || value instanceof Date || typeof value === 'boolean')) {\n value = formatLocaleValue(value, options.locale);\n }\n\n // Escape the value for CSV\n return escapeCSVValue(value, options.sanitizeForSecurity !== false);\n }).join(\",\");\n });\n\n // Combine header and data\n const csvContent = [headers.join(\",\"), ...csvData].join(\"\\n\");\n\n // Create and trigger download\n const blob = new Blob([csvContent], { type: \"text/csv;charset=utf-8;\" });\n const link = document.createElement(\"a\");\n const url = URL.createObjectURL(blob);\n\n link.setAttribute(\"href\", url);\n link.setAttribute(\"download\", filename);\n link.style.display = \"none\";\n\n // Handle click event\n link.onclick = () => {\n setTimeout(() => {\n URL.revokeObjectURL(url);\n resolve();\n }, 100);\n };\n\n document.body.appendChild(link);\n link.click();\n document.body.removeChild(link);\n } catch (error) {\n logger.error('Failed to export data to CSV:', error);\n reject(error);\n }\n });\n}\n\n/**\n * Exports DataTable data to CSV format\n * \n * @param data - Array of data objects to export\n * @param columns - Column definitions for mapping\n * @param filename - Optional filename for download (default: \"download.csv\")\n * @param options - Optional export configuration\n * @returns Promise that resolves when export is complete, rejects on error\n * \n * @example\n * ```tsx\n * // Export user data\n * const users = [\n * { id: 1, name: 'John Doe', email: 'john@example.com' },\n * { id: 2, name: 'Jane Smith', email: 'jane@example.com' }\n * ];\n * \n * const columns = [\n * { accessorKey: 'name', header: 'Name' },\n * { accessorKey: 'email', header: 'Email' }\n * ];\n * \n * try {\n * await exportToCSV(users, columns, 'users.csv', { locale: 'en-US' });\n * showSuccessToast('Data exported successfully');\n * } catch (error) {\n * showErrorToast('Failed to export data');\n * }\n * ```\n * \n * @remarks\n * - Automatically handles special characters in data\n * - Uses column headers for CSV headers\n * - Sanitizes data to prevent CSV injection\n * - Triggers browser download\n * - Throws error if export fails\n */\n/**\n * Exports DataTable data to CSV format.\n * Handles column mapping, data formatting, and browser download.\n * \n * @template TData - The type of data records in the table\n * @param data - Array of data records to export\n * @param columns - Column definitions for export\n * @param filename - Name of the CSV file to download\n */\nexport function exportToCSV<TData extends DataRecord>(\n data: TData[],\n columns: ExportColumn[],\n filename: string = \"download.csv\",\n options: {\n locale?: string;\n sanitizeForSecurity?: boolean;\n } = {}\n): Promise<void> {\n const logger = createLogger('ExportUtils');\n return new Promise((resolve, reject) => {\n try {\n if (typeof window === 'undefined') {\n throw new Error('CSV export is only available in browser environments');\n }\n\n if (!data || data.length === 0) {\n throw new Error('No data to export');\n }\n\n if (!columns || columns.length === 0) {\n throw new Error('No columns defined for export');\n }\n\n const csvContent = generateCSVContent(data, columns, options);\n \n // Create and trigger download\n const blob = new Blob([csvContent], { type: \"text/csv;charset=utf-8;\" });\n const link = document.createElement(\"a\");\n const url = URL.createObjectURL(blob);\n \n link.setAttribute(\"href\", url);\n link.setAttribute(\"download\", filename);\n link.style.display = \"none\";\n \n // Handle click event\n link.onclick = () => {\n setTimeout(() => {\n URL.revokeObjectURL(url);\n resolve();\n }, 100);\n };\n \n document.body.appendChild(link);\n link.click();\n document.body.removeChild(link);\n } catch (error) {\n logger.error('Failed to export data to CSV:', error);\n reject(error);\n }\n });\n}\n","/**\n * @file DataTable Error Boundary\n * @package @jmruthers/pace-core\n * @module Components/DataTable/Components\n * @since 0.4.0\n * \n * Error boundary component for DataTable with fallback UI and error recovery.\n */\n\nimport React, { Component, ErrorInfo, ReactNode } from 'react';\nimport { Alert, AlertDescription, AlertTitle } from '../../Alert/Alert';\nimport { Button } from '../../Button/Button';\nimport { createLogger } from '../../../utils/core/logger';\n// Icons removed to avoid test mocking issues\n\n// ============================================================================\n// ERROR BOUNDARY STATE\n// ============================================================================\n\ninterface ErrorBoundaryState {\n hasError: boolean;\n error: Error | null;\n errorInfo: ErrorInfo | null;\n retryCount: number;\n}\n\n// ============================================================================\n// ERROR BOUNDARY PROPS\n// ============================================================================\n\ninterface DataTableErrorBoundaryProps {\n children: ReactNode;\n fallback?: ReactNode;\n onError?: (error: Error, errorInfo: ErrorInfo) => void;\n onRetry?: () => void;\n maxRetries?: number;\n showRetryButton?: boolean;\n showErrorDetails?: boolean;\n}\n\n// ============================================================================\n// ERROR BOUNDARY COMPONENT\n// ============================================================================\n\n/**\n * Error boundary component for DataTable.\n * Catches errors in the DataTable component tree and displays a fallback UI.\n * Provides error recovery with retry functionality.\n */\nexport class DataTableErrorBoundary extends Component<\n DataTableErrorBoundaryProps,\n ErrorBoundaryState\n> {\n private logger = createLogger('DataTableErrorBoundary');\n private retryTimeoutId: NodeJS.Timeout | null = null;\n\n constructor(props: DataTableErrorBoundaryProps) {\n super(props);\n this.state = {\n hasError: false,\n error: null,\n errorInfo: null,\n retryCount: 0\n };\n }\n\n static getDerivedStateFromError(error: Error): Partial<ErrorBoundaryState> {\n return {\n hasError: true,\n error\n };\n }\n\n componentDidCatch(error: Error, errorInfo: ErrorInfo) {\n this.setState({\n error,\n errorInfo\n });\n\n // Call error handler if provided\n this.props.onError?.(error, errorInfo);\n\n // Log error for debugging\n this.logger.error('Error Boundary caught an error:', error, errorInfo);\n }\n\n componentWillUnmount() {\n if (this.retryTimeoutId) {\n clearTimeout(this.retryTimeoutId);\n }\n }\n\n handleRetry = () => {\n const { onRetry, maxRetries = 3 } = this.props;\n const { retryCount } = this.state;\n\n if (retryCount >= maxRetries) {\n this.logger.warn('Error Boundary: Maximum retry attempts reached');\n return;\n }\n\n // Call custom retry handler if provided\n if (onRetry) {\n onRetry();\n }\n\n // Reset error state after a short delay\n this.retryTimeoutId = setTimeout(() => {\n this.setState({\n hasError: false,\n error: null,\n errorInfo: null,\n retryCount: retryCount + 1\n });\n }, 100);\n };\n\n handleReset = () => {\n this.setState({\n hasError: false,\n error: null,\n errorInfo: null,\n retryCount: 0\n });\n };\n\n render() {\n const { \n children, \n fallback, \n showRetryButton = true, \n showErrorDetails = false,\n maxRetries = 3\n } = this.props;\n const { hasError, error, retryCount } = this.state;\n\n if (hasError) {\n // Use custom fallback if provided\n if (fallback) {\n return fallback;\n }\n\n // Default error UI\n return (\n <div className=\"flex items-center justify-center p-8\">\n <Alert variant=\"destructive\" className=\"max-w-md\">\n <AlertTitle>DataTable Error</AlertTitle>\n <AlertDescription className=\"mt-2\">\n <span>Something went wrong</span>\n </AlertDescription>\n {error && error.message ? (\n <details className=\"mt-2\">\n <summary className=\"cursor-pointer text-sm font-medium\">\n Error Details\n </summary>\n <pre className=\"mt-2 text-xs overflow-auto max-h-32\">\n {error.message}\n {showErrorDetails && error.stack && (\n <>\n {'\\n\\nStack Trace:\\n'}\n {error.stack}\n </>\n )}\n </pre>\n </details>\n ) : (\n <div className=\"mt-2\">\n <span>An unexpected error occurred</span>\n </div>\n )}\n <div className=\"mt-4 flex gap-2\">\n {showRetryButton && retryCount < maxRetries && (\n <Button\n variant=\"outline\"\n size=\"sm\"\n onClick={this.handleRetry}\n className=\"flex items-center gap-2\"\n >\n Retry ({retryCount + 1}/{maxRetries})\n </Button>\n )}\n <Button\n variant=\"outline\"\n size=\"sm\"\n onClick={this.handleReset}\n >\n Reset\n </Button>\n </div>\n </Alert>\n </div>\n );\n }\n\n return children;\n }\n}\n\n// ============================================================================\n// HOOK FOR ERROR BOUNDARY\n// ============================================================================\n\n/**\n * Hook for programmatically triggering error boundary reset.\n * Useful for error recovery in DataTable components.\n * \n * @returns Object with error state and reset function\n */\nexport function useDataTableErrorBoundary() {\n const [error, setError] = React.useState<Error | null>(null);\n\n const resetError = React.useCallback(() => {\n setError(null);\n }, []);\n\n const captureError = React.useCallback((error: Error) => {\n setError(error);\n }, []);\n\n React.useEffect(() => {\n if (error) {\n throw error;\n }\n }, [error]);\n\n return { captureError, resetError };\n}","/**\n * @file Alert Component Suite\n * @package @jmruthers/pace-core\n * @module Components\n * @since 0.1.0\n *\n * A flexible and accessible alert component for displaying important messages.\n * Includes Alert, AlertTitle, and AlertDescription subcomponents.\n *\n * Features:\n * - Multiple visual variants (default, destructive, inline)\n * - Title and description support\n * - Semantic HTML: renders as `<aside>` element\n * - ARIA role=\"alert\" for accessibility\n * - Keyboard and screen reader accessible\n * - Composable with icons and actions\n * - Inline variant for lightweight text formatting\n *\n * @example\n * ```tsx\n * // Basic alert (renders as <aside> with <h5> title and <p> description)\n * <Alert>\n * <AlertTitle>Success</AlertTitle>\n * <AlertDescription>Your changes have been saved.</AlertDescription>\n * </Alert>\n *\n * // Destructive alert with icon (renders as <aside> with <h5> title and <p> description)\n * <Alert variant=\"destructive\">\n * <ErrorIcon />\n * <AlertTitle>Error</AlertTitle>\n * <AlertDescription>Something went wrong.</AlertDescription>\n * </Alert>\n *\n * // Inline alert (renders as React.Fragment with <strong> title and <span> description)\n * <Alert variant=\"inline\">\n * <AlertTitle>Note:</AlertTitle>\n * <AlertDescription>This is an inline message.</AlertDescription>\n * </Alert>\n * ```\n *\n * @accessibility\n * - Uses semantic HTML: `<aside>` element for better semantic meaning\n * - Uses role=\"alert\" for screen reader announcement\n * - Title and description are semantically structured\n * - Supports keyboard navigation and focus\n */\n\nimport * as React from \"react\"\n\nimport { cn } from \"../../utils/core/cn\"\n\n// Context to share variant with child components\nconst AlertContext = React.createContext<{ variant?: \"default\" | \"destructive\" | \"inline\" }>({ variant: \"default\" })\n\nconst getAlertClasses = (variant: \"default\" | \"destructive\" | \"inline\" = \"default\"): string => {\n const baseClasses = \"relative w-full rounded-lg border p-4\";\n \n const variantClasses = {\n default: \"bg-background text-foreground\",\n destructive: \"border-destructive text-destructive\",\n inline: \"\", // No classes for inline variant as it renders as fragment\n };\n \n return `${baseClasses} ${variantClasses[variant]}`;\n};\n\nconst Alert = React.forwardRef<\n HTMLElement,\n React.HTMLAttributes<HTMLElement> & { variant?: \"default\" | \"destructive\" | \"inline\" }\n>(({ className, variant = \"default\", ...props }, ref) => {\n const contextValue = React.useMemo(() => ({ variant }), [variant])\n \n if (variant === \"inline\") {\n return (\n <AlertContext.Provider value={contextValue}>\n <React.Fragment {...props} />\n </AlertContext.Provider>\n )\n }\n \n return (\n <AlertContext.Provider value={contextValue}>\n <aside\n ref={ref}\n className={cn(getAlertClasses(variant), className)}\n role=\"alert\"\n {...props}\n />\n </AlertContext.Provider>\n )\n})\nAlert.displayName = \"Alert\"\n\nconst AlertTitle = React.forwardRef<\n HTMLHeadingElement,\n React.HTMLAttributes<HTMLHeadingElement>\n>(({ className, ...props }, ref) => {\n const { variant } = React.useContext(AlertContext)\n \n if (variant === \"inline\") {\n return <strong {...props} />\n }\n \n return (\n <h5\n ref={ref}\n className={cn(className)}\n {...props}\n />\n )\n})\nAlertTitle.displayName = \"AlertTitle\"\n\nconst AlertDescription = React.forwardRef<\n HTMLParagraphElement,\n React.HTMLAttributes<HTMLParagraphElement>\n>(({ className, ...props }, ref) => {\n const { variant } = React.useContext(AlertContext)\n \n if (variant === \"inline\") {\n return <span {...props} />\n }\n \n return (\n <p\n ref={ref}\n className={cn(className)}\n {...props}\n />\n )\n})\nAlertDescription.displayName = \"AlertDescription\"\n\nexport { Alert, AlertTitle, AlertDescription }\n","import { useState, useEffect, useCallback } from 'react';\nimport { createLogger } from '../../../utils/core/logger';\n\n/**\n * Props for the useColumnOrderPersistence hook.\n */\ninterface UseColumnOrderPersistenceProps {\n tableId?: string;\n defaultOrder?: string[];\n enablePersistence?: boolean;\n storageKey?: string;\n}\n\n/**\n * Hook for persisting column order in localStorage.\n * Saves and restores column order across page reloads.\n * \n * @param props - Column order persistence configuration\n * @returns Column order state and update function\n */\nexport function useColumnOrderPersistence({\n tableId,\n defaultOrder = [],\n enablePersistence = false,\n storageKey,\n}: UseColumnOrderPersistenceProps) {\n const logger = createLogger('ColumnOrderPersistence');\n const [columnOrder, setColumnOrder] = useState<string[]>(defaultOrder);\n const [isLoaded, setIsLoaded] = useState(false);\n\n // Generate a unique key for this table\n const finalStorageKey = storageKey \n ? `${storageKey}-column-order` \n : (tableId ? `datatable-column-order-${tableId}` : 'datatable-column-order');\n\n // Load column order from localStorage on mount\n useEffect(() => {\n if (!enablePersistence || typeof window === 'undefined') {\n setIsLoaded(true);\n return;\n }\n\n // Only load if we have a storage key (either via storageKey prop or tableId)\n if (!storageKey && !tableId) {\n setIsLoaded(true);\n return;\n }\n\n try {\n const savedOrder = localStorage.getItem(finalStorageKey);\n if (savedOrder) {\n const parsedOrder = JSON.parse(savedOrder);\n if (Array.isArray(parsedOrder)) {\n setColumnOrder(parsedOrder);\n }\n }\n } catch (error) {\n logger.warn('Failed to load column order from localStorage:', error);\n } finally {\n setIsLoaded(true);\n }\n }, [enablePersistence, finalStorageKey, storageKey, tableId]);\n\n // Save column order to localStorage\n const saveColumnOrder = useCallback((newOrder: string[]) => {\n if (!enablePersistence || typeof window === 'undefined') return;\n \n // Only save if we have a storage key (either via storageKey prop or tableId)\n if (!storageKey && !tableId) return;\n\n try {\n localStorage.setItem(finalStorageKey, JSON.stringify(newOrder));\n } catch (error) {\n logger.warn('Failed to save column order to localStorage:', error);\n }\n }, [enablePersistence, finalStorageKey, storageKey, tableId]);\n\n // Update column order and save to localStorage\n const updateColumnOrder = useCallback((newOrder: string[]) => {\n setColumnOrder(newOrder);\n saveColumnOrder(newOrder);\n }, [saveColumnOrder]);\n\n // Reset to default order\n const resetColumnOrder = useCallback(() => {\n setColumnOrder(defaultOrder);\n if (enablePersistence && (storageKey || tableId) && typeof window !== 'undefined') {\n try {\n localStorage.removeItem(finalStorageKey);\n } catch (error) {\n logger.warn('Failed to remove column order from localStorage:', error);\n }\n }\n }, [defaultOrder, enablePersistence, finalStorageKey, storageKey, tableId]);\n\n // Clear all saved preferences\n const clearAllPreferences = useCallback(() => {\n if (!enablePersistence || typeof window === 'undefined') return;\n\n try {\n // Remove all datatable preferences\n const keys = Object.keys(localStorage);\n keys.forEach(key => {\n if (key.startsWith('datatable-')) {\n localStorage.removeItem(key);\n }\n });\n } catch (error) {\n logger.warn('Failed to clear datatable preferences:', error);\n }\n }, [enablePersistence]);\n\n return {\n columnOrder,\n isLoaded,\n updateColumnOrder,\n resetColumnOrder,\n clearAllPreferences,\n };\n}\n","import { useState, useEffect, useCallback } from 'react';\nimport { createLogger } from '../../../utils/core/logger';\n\n/**\n * Props for the useColumnVisibilityPersistence hook.\n */\ninterface UseColumnVisibilityPersistenceProps {\n tableId?: string;\n defaultVisibility?: Record<string, boolean>;\n enablePersistence?: boolean;\n storageKey?: string;\n}\n\n/**\n * Hook for persisting column visibility in localStorage.\n * Saves and restores column visibility state across page reloads.\n * \n * @param props - Column visibility persistence configuration\n * @returns Column visibility state and update function\n */\nexport function useColumnVisibilityPersistence({\n tableId,\n defaultVisibility = {},\n enablePersistence = false,\n storageKey,\n}: UseColumnVisibilityPersistenceProps) {\n const logger = createLogger('ColumnVisibilityPersistence');\n const [columnVisibility, setColumnVisibility] = useState<Record<string, boolean>>(defaultVisibility);\n const [isLoaded, setIsLoaded] = useState(false);\n\n // Generate a unique key for this table\n const finalStorageKey = storageKey \n ? `${storageKey}-column-visibility` \n : (tableId ? `datatable-column-visibility-${tableId}` : 'datatable-column-visibility');\n\n // Load column visibility from localStorage on mount\n useEffect(() => {\n if (!enablePersistence || typeof window === 'undefined') {\n setIsLoaded(true);\n return;\n }\n\n try {\n const savedVisibility = localStorage.getItem(finalStorageKey);\n if (savedVisibility) {\n const parsedVisibility = JSON.parse(savedVisibility);\n if (typeof parsedVisibility === 'object' && parsedVisibility !== null) {\n setColumnVisibility(parsedVisibility);\n }\n }\n } catch (error) {\n logger.warn('Failed to load column visibility from localStorage:', error);\n } finally {\n setIsLoaded(true);\n }\n }, [enablePersistence, finalStorageKey]);\n\n // Save column visibility to localStorage\n const saveColumnVisibility = useCallback((newVisibility: Record<string, boolean>) => {\n if (!enablePersistence || typeof window === 'undefined') return;\n\n try {\n localStorage.setItem(finalStorageKey, JSON.stringify(newVisibility));\n } catch (error) {\n logger.warn('Failed to save column visibility to localStorage:', error);\n }\n }, [enablePersistence, finalStorageKey]);\n\n // Update column visibility and save to localStorage\n const updateColumnVisibility = useCallback((newVisibility: Record<string, boolean>) => {\n setColumnVisibility(newVisibility);\n saveColumnVisibility(newVisibility);\n }, [saveColumnVisibility]);\n\n // Reset to default visibility\n const resetColumnVisibility = useCallback(() => {\n setColumnVisibility(defaultVisibility);\n if (enablePersistence && typeof window !== 'undefined') {\n try {\n localStorage.removeItem(finalStorageKey);\n } catch (error) {\n logger.warn('Failed to remove column visibility from localStorage:', error);\n }\n }\n }, [defaultVisibility, enablePersistence, finalStorageKey]);\n\n // Clear all saved preferences\n const clearAllPreferences = useCallback(() => {\n if (!enablePersistence || typeof window === 'undefined') return;\n\n try {\n // Remove all datatable preferences\n const keys = Object.keys(localStorage);\n keys.forEach(key => {\n if (key.startsWith('datatable-')) {\n localStorage.removeItem(key);\n }\n });\n } catch (error) {\n logger.warn('Failed to clear datatable preferences:', error);\n }\n }, [enablePersistence]);\n\n return {\n columnVisibility,\n isLoaded,\n updateColumnVisibility,\n resetColumnVisibility,\n clearAllPreferences,\n };\n}\n\n","/**\n * @file DataTable State Management Hook\n * @package @jmruthers/pace-core\n * @module Components/DataTable/Hooks\n * @since 0.4.0\n * \n * Centralized state management for DataTable using useReducer pattern.\n * This replaces the scattered useState calls with a single, predictable state management system.\n */\n\nimport { useReducer, useCallback, useMemo } from 'react';\nimport type { \n SortingState, \n ColumnFiltersState, \n VisibilityState, \n GroupingState, \n ExpandedState,\n PaginationState \n} from '@tanstack/react-table';\nimport type { DataRecord, CellValue, RowId } from '../types';\n\n// Re-export types for external use\nexport type { DataRecord, CellValue, RowId };\n\n// ============================================================================\n// STATE INTERFACE\n// ============================================================================\n\n/**\n * DataTable state interface.\n * Contains all state for table operations including sorting, filtering, pagination, and editing.\n * \n * @template TData - The type of data records in the table\n */\nexport interface DataTableState<TData extends DataRecord> {\n // Table state\n sorting: SortingState;\n columnFilters: ColumnFiltersState;\n columnVisibility: VisibilityState;\n grouping: GroupingState;\n expanded: ExpandedState;\n pagination: PaginationState;\n columnOrder: string[];\n \n // Row operations\n rowSelection: Record<string, boolean>;\n \n // Editing state\n isCreating: boolean;\n creationData: Record<string, CellValue>;\n editingRowId: RowId | null;\n editingData: Record<string, CellValue>;\n \n // UI state\n showImportModal: boolean;\n showFilterRow: boolean;\n \n // Search state\n searchQuery: string;\n}\n\n/**\n * Actions interface for DataTable state management.\n * Provides functions to update all aspects of table state.\n * \n * @template TData - The type of data records in the table\n */\nexport interface DataTableStateActions<TData extends DataRecord> {\n setSorting: (sorting: SortingState) => void;\n setColumnFilters: (filters: ColumnFiltersState) => void;\n setColumnVisibility: (visibility: VisibilityState) => void;\n setGrouping: (grouping: GroupingState) => void;\n setExpanded: (expanded: ExpandedState) => void;\n setPagination: (pagination: PaginationState) => void;\n setColumnOrder: (order: string[]) => void;\n setRowSelection: (\n selection: Record<string, boolean> | ((old: Record<string, boolean>) => Record<string, boolean>)\n ) => void;\n toggleRowSelection: (rowId: string, selected: boolean) => void;\n clearRowSelection: () => void;\n setCreating: (isCreating: boolean) => void;\n setCreationData: (data: Record<string, CellValue>) => void;\n clearCreationData: () => void;\n setEditingRow: (rowId: RowId | null, data: Record<string, CellValue>) => void;\n clearEditing: () => void;\n setImportModal: (show: boolean) => void;\n setFilterRow: (show: boolean) => void;\n setSearchQuery: (query: string) => void;\n resetState: () => void;\n initializeState: (partialState: Partial<DataTableState<TData>>) => void;\n}\n\n/**\n * Computed values interface for DataTable.\n * Provides derived state values that are computed from the table state.\n */\nexport interface DataTableComputed {\n hasSelection: boolean;\n selectedRowIds: string[];\n isEditing: boolean;\n isCreating: boolean;\n hasFilters: boolean;\n canClearFilters: boolean;\n}\n\n// ============================================================================\n// ACTION TYPES\n// ============================================================================\n\nexport type DataTableAction<TData extends DataRecord> =\n | { type: 'SET_SORTING'; payload: SortingState }\n | { type: 'SET_COLUMN_FILTERS'; payload: ColumnFiltersState }\n | { type: 'SET_COLUMN_VISIBILITY'; payload: VisibilityState }\n | { type: 'SET_GROUPING'; payload: GroupingState }\n | { type: 'SET_EXPANDED'; payload: ExpandedState }\n | { type: 'SET_PAGINATION'; payload: PaginationState }\n | { type: 'SET_COLUMN_ORDER'; payload: string[] }\n | { type: 'SET_ROW_SELECTION'; payload: Record<string, boolean> }\n | { type: 'TOGGLE_ROW_SELECTION'; payload: { rowId: string; selected: boolean } }\n | { type: 'CLEAR_ROW_SELECTION' }\n | { type: 'SET_CREATING'; payload: boolean }\n | { type: 'SET_CREATION_DATA'; payload: Record<string, CellValue> }\n | { type: 'CLEAR_CREATION_DATA' }\n | { type: 'SET_EDITING_ROW'; payload: { rowId: RowId | null; data: Record<string, CellValue> } }\n | { type: 'CLEAR_EDITING' }\n | { type: 'SET_IMPORT_MODAL'; payload: boolean }\n | { type: 'SET_FILTER_ROW'; payload: boolean }\n | { type: 'SET_SEARCH_QUERY'; payload: string }\n | { type: 'RESET_STATE' }\n | { type: 'INITIALIZE_STATE'; payload: Partial<DataTableState<TData>> };\n\n// ============================================================================\n// REDUCER\n// ============================================================================\n\n/**\n * Reducer function for DataTable state management.\n * Handles all state updates for the DataTable component.\n * \n * @template TData - The type of data records in the table\n * @param state - Current table state\n * @param action - Action to perform\n * @returns New table state\n */\nexport function dataTableReducer<TData extends DataRecord>(\n state: DataTableState<TData>,\n action: DataTableAction<TData>\n): DataTableState<TData> {\n switch (action.type) {\n case 'SET_SORTING':\n return { ...state, sorting: action.payload };\n \n case 'SET_COLUMN_FILTERS':\n return { ...state, columnFilters: action.payload };\n \n case 'SET_COLUMN_VISIBILITY':\n return { ...state, columnVisibility: action.payload };\n \n case 'SET_GROUPING':\n return { ...state, grouping: action.payload };\n \n case 'SET_EXPANDED':\n return { ...state, expanded: action.payload };\n \n case 'SET_PAGINATION':\n return { ...state, pagination: action.payload };\n \n case 'SET_COLUMN_ORDER':\n return { ...state, columnOrder: action.payload };\n \n case 'SET_ROW_SELECTION':\n return { ...state, rowSelection: action.payload };\n \n case 'TOGGLE_ROW_SELECTION':\n return {\n ...state,\n rowSelection: {\n ...state.rowSelection,\n [action.payload.rowId]: action.payload.selected\n }\n };\n \n case 'CLEAR_ROW_SELECTION':\n return { ...state, rowSelection: {} };\n \n case 'SET_CREATING':\n return { ...state, isCreating: action.payload };\n \n case 'SET_CREATION_DATA':\n return { ...state, creationData: action.payload };\n \n case 'CLEAR_CREATION_DATA':\n return { ...state, creationData: {} };\n \n case 'SET_EDITING_ROW':\n return {\n ...state,\n editingRowId: action.payload.rowId,\n editingData: action.payload.data\n };\n \n case 'CLEAR_EDITING':\n return { ...state, editingRowId: null, editingData: {} };\n \n case 'SET_IMPORT_MODAL':\n return { ...state, showImportModal: action.payload };\n \n case 'SET_FILTER_ROW':\n return { ...state, showFilterRow: action.payload };\n \n case 'SET_SEARCH_QUERY':\n return { ...state, searchQuery: action.payload };\n \n case 'RESET_STATE':\n return createInitialState<TData>();\n \n case 'INITIALIZE_STATE':\n return { ...state, ...action.payload };\n \n default:\n return state;\n }\n}\n\n// ============================================================================\n// INITIAL STATE\n// ============================================================================\n\nexport function createInitialState<TData extends DataRecord>(\n initialPageSize: number = 10,\n columnIds: string[] = [],\n defaultSorting?: SortingState,\n defaultGrouping?: GroupingState\n): DataTableState<TData> {\n return {\n sorting: defaultSorting || [],\n columnFilters: [],\n columnVisibility: {},\n grouping: defaultGrouping || [],\n expanded: {},\n pagination: {\n pageIndex: 0,\n pageSize: initialPageSize\n },\n columnOrder: columnIds,\n rowSelection: {},\n isCreating: false,\n creationData: {},\n editingRowId: null,\n editingData: {},\n showImportModal: false,\n showFilterRow: false,\n searchQuery: ''\n };\n}\n\n// ============================================================================\n// HOOK\n// ============================================================================\n\nexport interface UseDataTableStateOptions<TData extends DataRecord> {\n initialPageSize?: number;\n columnIds?: string[];\n initialRowSelection?: Record<string, boolean>;\n onRowSelectionChange?: (selection: Record<string, boolean>) => void;\n defaultSorting?: SortingState;\n defaultGrouping?: GroupingState;\n}\n\nexport function useDataTableState<TData extends DataRecord>({\n initialPageSize = 10,\n columnIds = [],\n initialRowSelection = {},\n onRowSelectionChange,\n defaultSorting,\n defaultGrouping\n}: UseDataTableStateOptions<TData> = {}) {\n \n const initialState = useMemo(() => \n createInitialState<TData>(initialPageSize, columnIds, defaultSorting, defaultGrouping),\n [initialPageSize, columnIds, defaultSorting, defaultGrouping]\n );\n\n const [state, dispatch] = useReducer(dataTableReducer<TData>, {\n ...initialState,\n rowSelection: initialRowSelection\n });\n\n // ============================================================================\n // ACTION CREATORS\n // ============================================================================\n\n const actions = useMemo<DataTableStateActions<TData>>(() => ({\n setSorting: (sorting: SortingState) =>\n dispatch({ type: 'SET_SORTING', payload: sorting }),\n \n setColumnFilters: (filters: ColumnFiltersState) => \n dispatch({ type: 'SET_COLUMN_FILTERS', payload: filters }),\n \n setColumnVisibility: (visibility: VisibilityState) => \n dispatch({ type: 'SET_COLUMN_VISIBILITY', payload: visibility }),\n \n setGrouping: (grouping: GroupingState) => \n dispatch({ type: 'SET_GROUPING', payload: grouping }),\n \n setExpanded: (expanded: ExpandedState) => \n dispatch({ type: 'SET_EXPANDED', payload: expanded }),\n \n setPagination: (pagination: PaginationState) => \n dispatch({ type: 'SET_PAGINATION', payload: pagination }),\n \n setColumnOrder: (order: string[]) => \n dispatch({ type: 'SET_COLUMN_ORDER', payload: order }),\n \n setRowSelection: (selection: Record<string, boolean> | ((old: Record<string, boolean>) => Record<string, boolean>)) => {\n const newSelection = typeof selection === 'function' ? selection(state.rowSelection) : selection;\n dispatch({ type: 'SET_ROW_SELECTION', payload: newSelection });\n onRowSelectionChange?.(newSelection);\n },\n \n toggleRowSelection: (rowId: string, selected: boolean) => {\n dispatch({ type: 'TOGGLE_ROW_SELECTION', payload: { rowId, selected } });\n const newSelection = { ...state.rowSelection, [rowId]: selected };\n onRowSelectionChange?.(newSelection);\n },\n \n clearRowSelection: () => {\n dispatch({ type: 'CLEAR_ROW_SELECTION' });\n onRowSelectionChange?.({});\n },\n \n setCreating: (isCreating: boolean) => \n dispatch({ type: 'SET_CREATING', payload: isCreating }),\n \n setCreationData: (data: Record<string, CellValue>) => \n dispatch({ type: 'SET_CREATION_DATA', payload: data }),\n \n clearCreationData: () => \n dispatch({ type: 'CLEAR_CREATION_DATA' }),\n \n setEditingRow: (rowId: RowId | null, data: Record<string, CellValue>) => \n dispatch({ type: 'SET_EDITING_ROW', payload: { rowId, data } }),\n \n clearEditing: () => \n dispatch({ type: 'CLEAR_EDITING' }),\n \n setImportModal: (show: boolean) => \n dispatch({ type: 'SET_IMPORT_MODAL', payload: show }),\n \n setFilterRow: (show: boolean) => \n dispatch({ type: 'SET_FILTER_ROW', payload: show }),\n \n setSearchQuery: (query: string) => \n dispatch({ type: 'SET_SEARCH_QUERY', payload: query }),\n \n resetState: () => \n dispatch({ type: 'RESET_STATE' }),\n \n initializeState: (partialState: Partial<DataTableState<TData>>) =>\n dispatch({ type: 'INITIALIZE_STATE', payload: partialState })\n }), [state.rowSelection, onRowSelectionChange]);\n\n // ============================================================================\n // COMPUTED VALUES\n // ============================================================================\n\n const computed = useMemo<DataTableComputed>(() => ({\n hasSelection: Object.values(state.rowSelection).some(Boolean),\n selectedRowIds: Object.entries(state.rowSelection)\n .filter(([_, selected]) => selected)\n .map(([rowId, _]) => rowId),\n isEditing: state.editingRowId !== null,\n isCreating: state.isCreating,\n hasFilters: state.columnFilters.length > 0 || state.searchQuery !== '',\n canClearFilters: state.columnFilters.length > 0 || state.searchQuery !== ''\n }), [state]);\n\n // ============================================================================\n // CLEAR FILTERS\n // ============================================================================\n\n const clearFilters = useCallback(() => {\n dispatch({ type: 'SET_COLUMN_FILTERS', payload: [] });\n dispatch({ type: 'SET_SEARCH_QUERY', payload: '' });\n }, []);\n\n return {\n state,\n actions,\n computed,\n clearFilters\n };\n}\n","/**\n * @file DataTable data pipeline hook\n * @description Encapsulates hierarchical validation, sorting, and data source\n * resolution so the main DataTable component can focus on orchestration.\n */\n\nimport { useMemo } from 'react';\nimport { useHierarchicalState, type HierarchicalState } from './useHierarchicalState';\nimport { validateHierarchicalData } from '../utils/hierarchicalUtils';\nimport {\n sortHierarchicalDataByStructure,\n sortHierarchicalDataWithSorting,\n} from '../utils/hierarchicalSorting';\nimport type {\n DataRecord,\n HierarchicalConfig,\n HierarchicalDataRow,\n NormalizedDataTableFeatureConfig,\n PaginationMode,\n ServerSideResponse,\n} from '../types';\nimport type { SortingState } from '@tanstack/react-table';\n\n/**\n * Parameters for the useDataTableDataPipeline hook.\n * @template TData - The type of data records in the table\n */\nexport interface UseDataTableDataPipelineParams<TData extends DataRecord> {\n data: TData[];\n features: NormalizedDataTableFeatureConfig;\n hierarchical?: HierarchicalConfig;\n sorting: SortingState;\n finalPaginationMode: PaginationMode;\n serverData: ServerSideResponse<TData> | null;\n}\n\n/**\n * Return value of the useDataTableDataPipeline hook.\n * @template TData - The type of data records in the table\n */\nexport interface UseDataTableDataPipelineResult<TData extends DataRecord> {\n finalTableData: TData[];\n dataCount: number;\n hierarchicalState?: HierarchicalState<HierarchicalDataRow>;\n hierarchicalValidation: { isValid: boolean; errors: string[] };\n}\n\n/**\n * Hook that encapsulates hierarchical validation, sorting, and data source resolution.\n * Processes table data through the data pipeline before rendering.\n * \n * @template TData - The type of data records in the table\n * @param params - Data pipeline configuration\n * @returns Processed table data and pipeline state\n */\nexport function useDataTableDataPipeline<TData extends DataRecord>({\n data,\n features,\n hierarchical,\n sorting,\n finalPaginationMode,\n serverData,\n}: UseDataTableDataPipelineParams<TData>): UseDataTableDataPipelineResult<TData> {\n const hierarchicalEnabled = Boolean(features.hierarchical && hierarchical?.enabled);\n\n const hierarchicalValidation = useMemo(() => {\n if (!hierarchicalEnabled) {\n return { isValid: true, errors: [] as string[] };\n }\n\n return validateHierarchicalData(data as unknown as HierarchicalDataRow[]);\n }, [data, hierarchicalEnabled]);\n\n const structuredHierarchicalData = useMemo(() => {\n if (!hierarchicalEnabled || !hierarchicalValidation.isValid) {\n return data;\n }\n\n return sortHierarchicalDataByStructure(data as unknown as HierarchicalDataRow[]) as unknown as TData[];\n }, [data, hierarchicalEnabled, hierarchicalValidation.isValid]);\n\n const hierarchicalState = useHierarchicalState<HierarchicalDataRow>(\n (hierarchicalEnabled && hierarchicalValidation.isValid\n ? (structuredHierarchicalData as unknown as HierarchicalDataRow[])\n : []) as HierarchicalDataRow[],\n hierarchicalEnabled ? hierarchical : undefined\n );\n\n const baseData = useMemo(() => {\n // CRITICAL FIX: In server mode, only use serverData if it actually contains data.\n // If serverData is null/empty but we have client data, fall back to client data\n // to prevent empty tables when server-side fetching isn't configured or hasn't completed.\n if (finalPaginationMode === 'server') {\n // Only use serverData if it exists and has data, otherwise fall back to client data\n // This prevents the \"record count shows but no rows\" bug when server mode is detected\n // but serverSide config isn't provided or hasn't fetched yet.\n if (serverData?.data && serverData.data.length > 0) {\n return serverData.data;\n }\n // Fall back to structuredHierarchicalData if serverData isn't ready yet\n // This allows the table to render while waiting for server data\n return structuredHierarchicalData;\n }\n\n return structuredHierarchicalData;\n }, [finalPaginationMode, serverData?.data, structuredHierarchicalData]);\n\n const tableData = useMemo(() => {\n if (!hierarchicalEnabled) {\n return baseData;\n }\n\n return (hierarchicalState.visibleRows as unknown as TData[]) ?? [];\n }, [baseData, hierarchicalEnabled, hierarchicalState.visibleRows]);\n\n const sortedHierarchicalData = useMemo(() => {\n if (!hierarchicalEnabled || sorting.length === 0) {\n return tableData;\n }\n\n const visibleRows = hierarchicalState.visibleRows as unknown as HierarchicalDataRow[];\n return sortHierarchicalDataWithSorting(visibleRows, sorting) as unknown as TData[];\n }, [hierarchicalEnabled, hierarchicalState.visibleRows, sorting, tableData]);\n\n const finalTableData = hierarchicalEnabled && sorting.length > 0\n ? sortedHierarchicalData\n : tableData;\n\n const dataCount = useMemo(() => {\n if (finalPaginationMode === 'server') {\n return serverData?.totalCount ?? 0;\n }\n\n return finalTableData?.length ?? 0;\n }, [finalPaginationMode, finalTableData?.length, serverData?.totalCount]);\n\n return {\n finalTableData,\n dataCount,\n hierarchicalState: hierarchicalEnabled ? hierarchicalState : undefined,\n hierarchicalValidation,\n };\n}\n\n","/**\n * @file Hierarchical State Management Hook\n * @package @jmruthers/pace-core\n * @module Components/DataTable/Hooks/useHierarchicalState\n * @since 0.4.35\n */\n\nimport { useState, useCallback, useMemo, useEffect } from 'react';\nimport type { HierarchicalDataRow, HierarchicalConfig } from '../types';\n\nexport interface HierarchicalState<TData extends HierarchicalDataRow> {\n expandedRows: Set<string>;\n visibleRows: TData[];\n toggleRow: (rowId: string) => void;\n expandAll: () => void;\n collapseAll: () => void;\n setExpandedIds: (ids: string[]) => void;\n isExpanded: (rowId: string) => boolean;\n hasChildren: (rowId: string) => boolean;\n getChildrenCount: (rowId: string) => number;\n getExpandedIds: () => string[];\n parentChildMap: Map<string, TData[]>;\n}\n\n/**\n * Hook for managing hierarchical expand/collapse state\n * \n * Provides state management for hierarchical rows with support for:\n * - Individual row expansion/collapse\n * - Bulk expand/collapse operations\n * - Default expanded state configuration\n * - Parent/child relationship tracking\n */\nexport function useHierarchicalState<TData extends HierarchicalDataRow>(\n data: TData[],\n config?: HierarchicalConfig\n): HierarchicalState<TData> {\n // Memoize initial state to prevent recreation\n const initialExpandedState = useMemo(() => {\n if (!config?.defaultExpanded) {\n return new Set<string>();\n }\n\n if (config.defaultExpanded === true) {\n // All parent rows expanded\n return new Set(data.filter(row => row.isParent).map(row => row.id));\n }\n\n if (Array.isArray(config.defaultExpanded)) {\n // Specific rows expanded\n return new Set(config.defaultExpanded);\n }\n\n // All collapsed\n return new Set<string>();\n }, [data, config?.defaultExpanded]);\n\n const [expandedRows, setExpandedRows] = useState<Set<string>>(initialExpandedState);\n\n // Reset expanded state when data changes (only in specific cases)\n const [prevDataLength, setPrevDataLength] = useState(data.length);\n const [prevDefaultExpanded, setPrevDefaultExpanded] = useState(config?.defaultExpanded);\n \n useEffect(() => {\n // Only reset if defaultExpanded config changed or data structure changed significantly\n const dataLengthChanged = data.length !== prevDataLength;\n const configChanged = config?.defaultExpanded !== prevDefaultExpanded;\n \n if (configChanged || dataLengthChanged) {\n if (!config?.defaultExpanded) {\n setExpandedRows(new Set());\n } else if (config.defaultExpanded === true) {\n setExpandedRows(new Set(data.filter(row => row.isParent).map(row => row.id)));\n } else if (Array.isArray(config.defaultExpanded)) {\n setExpandedRows(new Set(config.defaultExpanded));\n }\n \n setPrevDataLength(data.length);\n setPrevDefaultExpanded(config?.defaultExpanded);\n }\n }, [data, config?.defaultExpanded, prevDataLength, prevDefaultExpanded]);\n\n // Get parent-child relationships\n const parentChildMap = useMemo(() => {\n const map = new Map<string, TData[]>();\n \n if (Array.isArray(data)) {\n data.forEach(row => {\n if (row.isParent) {\n map.set(row.id, []);\n } else if (row.parentId) {\n const children = map.get(row.parentId) || [];\n children.push(row);\n map.set(row.parentId, children);\n }\n });\n }\n\n return map;\n }, [data]);\n\n // Get visible rows (parent rows + expanded children)\n const visibleRows = useMemo(() => {\n const visible: TData[] = [];\n \n if (Array.isArray(data)) {\n data.forEach(row => {\n if (row.isParent) {\n visible.push(row);\n \n // Add children if parent is expanded\n if (expandedRows.has(row.id)) {\n const children = parentChildMap.get(row.id) || [];\n visible.push(...children);\n }\n }\n });\n }\n\n return visible;\n }, [data, expandedRows, parentChildMap]);\n\n // Toggle single row expansion\n const toggleRow = useCallback((rowId: string) => {\n setExpandedRows(prev => {\n const newSet = new Set(prev);\n if (newSet.has(rowId)) {\n newSet.delete(rowId);\n } else {\n newSet.add(rowId);\n }\n \n // Notify parent component\n if (config?.onExpandedChange) {\n config.onExpandedChange(Array.from(newSet));\n }\n \n return newSet;\n });\n }, [config]);\n\n // Expand all parent rows\n const expandAll = useCallback(() => {\n const parentIds = data.filter(row => row.isParent).map(row => row.id);\n setExpandedRows(new Set(parentIds));\n \n if (config?.onExpandedChange) {\n config.onExpandedChange(parentIds);\n }\n }, [data, config]);\n\n // Collapse all rows\n const collapseAll = useCallback(() => {\n setExpandedRows(new Set());\n \n if (config?.onExpandedChange) {\n config.onExpandedChange([]);\n }\n }, [config]);\n\n // Check if row is expanded\n const isExpanded = useCallback((rowId: string) => {\n return expandedRows.has(rowId);\n }, [expandedRows]);\n\n // Check if row has children\n const hasChildren = useCallback((rowId: string) => {\n return parentChildMap.has(rowId) && (parentChildMap.get(rowId)?.length || 0) > 0;\n }, [parentChildMap]);\n\n // Get children count for a parent row\n const getChildrenCount = useCallback((rowId: string) => {\n return parentChildMap.get(rowId)?.length || 0;\n }, [parentChildMap]);\n\n // Get all expanded row IDs\n const getExpandedIds = useCallback(() => {\n return Array.from(expandedRows);\n }, [expandedRows]);\n\n // Set expanded state from external source\n const setExpandedIds = useCallback((ids: string[]) => {\n setExpandedRows(new Set(ids));\n }, []);\n\n return {\n // State\n expandedRows,\n visibleRows,\n \n // Actions\n toggleRow,\n expandAll,\n collapseAll,\n setExpandedIds,\n \n // Getters\n isExpanded,\n hasChildren,\n getChildrenCount,\n getExpandedIds,\n \n // Utilities\n parentChildMap,\n };\n}\n","/**\n * @file Hierarchical Sorting Utilities\n * @package @jmruthers/pace-core\n * @module Components/DataTable/Utils/hierarchicalSorting\n * @since 0.4.35\n */\n\nimport type { HierarchicalDataRow } from '../types';\nimport type { SortingState } from '@tanstack/react-table';\n\n/**\n * Sorts hierarchical data by structure only (parents before children).\n * This is the basic hierarchical ordering without any column-based sorting.\n * \n * @param data - Array of hierarchical data rows\n * @returns Data sorted with parents first, then their children\n * \n * @example\n * ```tsx\n * const sorted = sortHierarchicalDataByStructure([...data]);\n * ```\n */\nexport function sortHierarchicalDataByStructure<TData extends HierarchicalDataRow>(\n data: TData[]\n): TData[] {\n const sorted: TData[] = [];\n const processed = new Set<string>();\n \n // First, add all parent rows\n data.forEach(row => {\n if (row.isParent && !processed.has(row.id)) {\n sorted.push(row);\n processed.add(row.id);\n }\n });\n \n // Then, add children in order\n data.forEach(row => {\n if (!row.isParent && !processed.has(row.id)) {\n sorted.push(row);\n processed.add(row.id);\n }\n });\n \n return sorted;\n}\n\n/**\n * Sorts hierarchical data while preserving parent-child relationships.\n * Parent rows maintain their order, child rows are sorted within their parent groups.\n * This applies column-based sorting based on the provided sorting state.\n * \n * @param data - Array of hierarchical data rows\n * @param sorting - TanStack Table sorting state (column + direction)\n * @returns Data sorted with parents first, children sorted within each parent\n * \n * @example\n * ```tsx\n * const sorted = sortHierarchicalDataWithSorting(data, [{ id: 'name', desc: false }]);\n * ```\n */\nexport function sortHierarchicalDataWithSorting<TData extends HierarchicalDataRow>(\n data: TData[],\n sorting: SortingState\n): TData[] {\n if (sorting.length === 0) {\n return data;\n }\n\n const [sortConfig] = sorting;\n const { id: columnId, desc } = sortConfig;\n\n // Group data by parent\n const parentGroups = new Map<string, { parent: TData; children: TData[] }>();\n \n data.forEach(row => {\n if (row.isParent) {\n parentGroups.set(row.id, { parent: row, children: [] });\n } else if (row.parentId) {\n const group = parentGroups.get(row.parentId);\n if (group) {\n group.children.push(row);\n }\n }\n });\n\n // Sort children within each parent group\n const sortedGroups = Array.from(parentGroups.values()).map(group => {\n const sortedChildren = [...group.children].sort((a, b) => {\n const aValue = getSortValue(a, columnId);\n const bValue = getSortValue(b, columnId);\n \n if (aValue === bValue) return 0;\n \n const comparison = compareValues(aValue, bValue);\n return desc ? -comparison : comparison;\n });\n\n return {\n parent: group.parent,\n children: sortedChildren\n };\n });\n\n // Reconstruct the sorted data maintaining parent-child order\n const sortedData: TData[] = [];\n \n sortedGroups.forEach(group => {\n sortedData.push(group.parent);\n sortedData.push(...group.children);\n });\n\n return sortedData;\n}\n\n/**\n * Gets the sort value for a row and column\n */\nfunction getSortValue<TData extends HierarchicalDataRow>(\n row: TData, \n columnId: string\n): unknown {\n // Handle nested property access (e.g., \"user.name\")\n const keys = columnId.split('.');\n let value: unknown = row;\n \n for (const key of keys) {\n if (value && typeof value === 'object' && key in value) {\n value = (value as Record<string, unknown>)[key];\n } else {\n return null;\n }\n }\n \n return value;\n}\n\n/**\n * Compares two values for sorting\n */\nfunction compareValues(a: unknown, b: unknown): number {\n // Handle null/undefined values\n if (a == null && b == null) return 0;\n if (a == null) return -1;\n if (b == null) return 1;\n\n // Handle numbers\n if (typeof a === 'number' && typeof b === 'number') {\n return a - b;\n }\n\n // Handle dates\n if (a instanceof Date && b instanceof Date) {\n return a.getTime() - b.getTime();\n }\n\n // Handle strings (case-insensitive)\n const aStr = String(a).toLowerCase();\n const bStr = String(b).toLowerCase();\n \n if (aStr < bStr) return -1;\n if (aStr > bStr) return 1;\n return 0;\n}\n\n/**\n * Determines if a column should be sortable in hierarchical mode\n * Child-only columns should not affect parent row order\n */\nexport function isHierarchicalSortableColumn<TData extends HierarchicalDataRow>(\n columnId: string,\n columns: Array<{ id?: string; accessorKey?: string; hideForParent?: boolean }>\n): boolean {\n const column = columns.find(col => col.id === columnId || col.accessorKey === columnId);\n \n if (!column) return true;\n \n // If column is hidden for parent rows, it should only sort children within parents\n return !column.hideForParent;\n}\n\n/**\n * Gets the effective sorting configuration for hierarchical data\n * Returns null if the column should not sort parent rows\n */\nexport function getHierarchicalSortConfig(\n sorting: SortingState,\n columns: Array<{ id?: string; accessorKey?: string; hideForParent?: boolean }>\n): SortingState {\n if (sorting.length === 0) return sorting;\n \n const [sortConfig] = sorting;\n const { id: columnId } = sortConfig;\n \n // If this is a child-only column, we still want to sort but only within parent groups\n // The main sorting logic will handle this appropriately\n return sorting;\n}\n","/**\n * @file Server-side data coordination hook\n */\n\nimport { useCallback, useEffect } from 'react';\nimport type {\n DataRecord,\n PaginationMode,\n ServerSideConfig,\n ServerSideParams,\n} from '../types';\nimport type {\n SortingState,\n ColumnFiltersState,\n GroupingState,\n PaginationState,\n} from '@tanstack/react-table';\n\n/**\n * Parameters for the useServerSideDataEffect hook.\n * @template TData - The type of data records in the table\n */\nexport interface UseServerSideDataEffectParams<TData extends DataRecord> {\n finalPaginationMode: PaginationMode;\n serverSide?: ServerSideConfig<TData>;\n pagination: PaginationState;\n sorting: SortingState;\n columnFilters: ColumnFiltersState;\n grouping: GroupingState;\n searchQuery: string;\n tableDataLength: number;\n fetchServerData: (params: ServerSideParams) => Promise<void>;\n cleanup?: () => void;\n}\n\n/**\n * Hook for coordinating server-side data fetching.\n * Triggers data fetches when table state changes in server-side pagination mode.\n * \n * @template TData - The type of data records in the table\n * @param params - Server-side data effect configuration\n */\nexport function useServerSideDataEffect<TData extends DataRecord>({\n finalPaginationMode,\n serverSide,\n pagination,\n sorting,\n columnFilters,\n grouping,\n searchQuery,\n tableDataLength,\n fetchServerData,\n cleanup,\n}: UseServerSideDataEffectParams<TData>) {\n const handleServerSideChange = useCallback(async () => {\n if (finalPaginationMode !== 'server' || !serverSide) {\n return;\n }\n\n const params: ServerSideParams = {\n pageIndex: pagination.pageIndex,\n pageSize: pagination.pageSize,\n sorting,\n columnFilters,\n globalFilter: searchQuery,\n grouping,\n };\n\n await fetchServerData(params);\n }, [\n finalPaginationMode,\n serverSide,\n pagination.pageIndex,\n pagination.pageSize,\n sorting,\n columnFilters,\n searchQuery,\n grouping,\n fetchServerData,\n ]);\n\n useEffect(() => {\n if (finalPaginationMode !== 'server' || !serverSide) {\n return;\n }\n\n if (tableDataLength > 0) {\n return;\n }\n\n handleServerSideChange();\n }, [\n finalPaginationMode,\n serverSide,\n tableDataLength,\n handleServerSideChange,\n ]);\n\n useEffect(() => () => {\n cleanup?.();\n }, [cleanup]);\n\n return handleServerSideChange;\n}\n\n","import { useMemo } from 'react';\n\nimport type { DataRecord, DataTableColumn } from '../types';\n\n/**\n * Options for the useEffectiveColumnOrder hook.\n * @template TData - The type of data records in the table\n */\ninterface UseEffectiveColumnOrderOptions<TData extends DataRecord> {\n columns: DataTableColumn<TData>[];\n externalColumnOrder?: string[];\n selectionEnabled: boolean;\n}\n\n/**\n * Hook to compute effective column order.\n * Handles external column order and ensures selection column is first when enabled.\n * \n * @template TData - The type of data records in the table\n * @param options - Column order configuration\n * @returns Effective column order array\n */\nexport function useEffectiveColumnOrder<TData extends DataRecord>({\n columns,\n externalColumnOrder,\n selectionEnabled,\n}: UseEffectiveColumnOrderOptions<TData>): string[] {\n const baseOrder = useMemo(() => {\n if (externalColumnOrder && externalColumnOrder.length > 0) {\n return externalColumnOrder;\n }\n\n return columns\n .map(column => column.id || column.accessorKey || '')\n .filter((identifier): identifier is string => Boolean(identifier));\n }, [columns, externalColumnOrder]);\n\n return useMemo(() => {\n if (!selectionEnabled) {\n return baseOrder;\n }\n \n // Always ensure 'select' is first, even if it appears elsewhere in the order\n const orderWithoutSelect = baseOrder.filter(id => id !== 'select');\n return ['select', ...orderWithoutSelect];\n }, [baseOrder, selectionEnabled]);\n}\n","import { useCallback, useMemo } from 'react';\nimport type {\n ColumnFiltersState,\n ExpandedState,\n GroupingState,\n PaginationState,\n SortingState,\n VisibilityState,\n} from '@tanstack/react-table';\n\nimport type {\n DataRecord,\n DataTableState,\n DataTableStateActions,\n} from './useDataTableState';\n\n/**\n * Table layout change interface.\n * Represents changes to column order and visibility.\n */\nexport interface TableLayoutChange {\n columnOrder: string[];\n columnVisibility: VisibilityState;\n}\n\n/**\n * Snapshot of table state at a point in time.\n * Used for state persistence and restoration.\n * \n * @template TData - The type of data records in the table\n */\nexport interface TableStateSnapshot<TData extends DataRecord> {\n sorting: SortingState;\n columnFilters: ColumnFiltersState;\n columnVisibility: VisibilityState;\n rowSelection: Record<string, boolean>;\n grouping: GroupingState;\n expanded: ExpandedState;\n pagination: PaginationState;\n globalFilter: string;\n columnOrder: string[];\n}\n\n/**\n * Table event handlers interface.\n * Provides handlers for all table state changes.\n */\nexport interface TableHandlers {\n onSortingChange: (updaterOrValue: unknown) => void;\n onColumnFiltersChange: (updaterOrValue: unknown) => void;\n onColumnVisibilityChange: (updaterOrValue: unknown) => void;\n onRowSelectionChange: (updaterOrValue: unknown) => void;\n onGroupingChange: (updaterOrValue: unknown) => void;\n onExpandedChange: (updaterOrValue: unknown) => void;\n onPaginationChange: (updaterOrValue: unknown) => void;\n onColumnOrderChange: (updaterOrValue: unknown) => void;\n}\n\ninterface UseTableHandlersOptions<TData extends DataRecord> {\n state: DataTableState<TData>;\n stateSnapshot: TableStateSnapshot<TData>;\n actions: DataTableStateActions<TData>;\n selection?: Record<string, boolean>;\n onRowSelectionChange?: (selection: Record<string, boolean>) => void;\n effectiveColumnOrder: string[];\n canPersistVisibility: boolean;\n canPersistOrder: boolean;\n updateSavedColumnVisibility: (visibility: VisibilityState) => void;\n updateColumnOrder: (order: string[]) => void;\n onLayoutChange?: (layout: TableLayoutChange) => void;\n}\n\nexport function useTableHandlers<TData extends DataRecord>({\n state,\n stateSnapshot,\n actions,\n selection,\n onRowSelectionChange,\n effectiveColumnOrder,\n canPersistVisibility,\n canPersistOrder,\n updateSavedColumnVisibility,\n updateColumnOrder,\n onLayoutChange,\n}: UseTableHandlersOptions<TData>): TableHandlers {\n const handleSortingChange = useCallback((updaterOrValue: unknown) => {\n const nextValue = typeof updaterOrValue === 'function'\n ? (updaterOrValue as (prev: SortingState) => SortingState)(stateSnapshot.sorting)\n : updaterOrValue as SortingState;\n actions.setSorting(nextValue);\n }, [actions, stateSnapshot.sorting]);\n\n const handleColumnFiltersChange = useCallback((updaterOrValue: unknown) => {\n const nextValue = typeof updaterOrValue === 'function'\n ? (updaterOrValue as (prev: ColumnFiltersState) => ColumnFiltersState)(stateSnapshot.columnFilters)\n : updaterOrValue as ColumnFiltersState;\n actions.setColumnFilters(nextValue);\n }, [actions, stateSnapshot.columnFilters]);\n\n const handleColumnVisibilityChange = useCallback((updaterOrValue: unknown) => {\n const nextValue = typeof updaterOrValue === 'function'\n ? (updaterOrValue as (prev: VisibilityState) => VisibilityState)(stateSnapshot.columnVisibility)\n : updaterOrValue as VisibilityState;\n\n actions.setColumnVisibility(nextValue);\n\n if (canPersistVisibility) {\n updateSavedColumnVisibility(nextValue);\n }\n\n onLayoutChange?.({\n columnOrder: effectiveColumnOrder,\n columnVisibility: nextValue,\n });\n }, [actions, stateSnapshot.columnVisibility, canPersistVisibility, updateSavedColumnVisibility, onLayoutChange, effectiveColumnOrder]);\n\n const handleRowSelectionChange = useCallback((updaterOrValue: unknown) => {\n const currentSelection = selection ?? state.rowSelection;\n const nextSelection = typeof updaterOrValue === 'function'\n ? (updaterOrValue as (prev: Record<string, boolean>) => Record<string, boolean>)(currentSelection)\n : updaterOrValue as Record<string, boolean>;\n\n if (selection === undefined) {\n // Uncontrolled mode - update internal state\n actions.setRowSelection(nextSelection);\n // Still invoke callback so parent components can react (e.g., enable bulk delete button)\n onRowSelectionChange?.(nextSelection);\n return;\n }\n\n // Controlled mode - update via callback\n onRowSelectionChange?.(nextSelection);\n }, [actions, selection, state.rowSelection, onRowSelectionChange]);\n\n const handleGroupingChange = useCallback((updaterOrValue: unknown) => {\n const nextValue = typeof updaterOrValue === 'function'\n ? (updaterOrValue as (prev: GroupingState) => GroupingState)(stateSnapshot.grouping)\n : updaterOrValue as GroupingState;\n actions.setGrouping(nextValue);\n }, [actions, stateSnapshot.grouping]);\n\n const handleExpandedChange = useCallback((updaterOrValue: unknown) => {\n const nextValue = typeof updaterOrValue === 'function'\n ? (updaterOrValue as (prev: ExpandedState) => ExpandedState)(stateSnapshot.expanded)\n : updaterOrValue as ExpandedState;\n actions.setExpanded(nextValue);\n }, [actions, stateSnapshot.expanded]);\n\n const handlePaginationChange = useCallback((updaterOrValue: unknown) => {\n const nextValue = typeof updaterOrValue === 'function'\n ? (updaterOrValue as (prev: PaginationState) => PaginationState)(stateSnapshot.pagination)\n : updaterOrValue as PaginationState;\n actions.setPagination(nextValue);\n }, [actions, stateSnapshot.pagination]);\n\n const handleColumnOrderChange = useCallback((updaterOrValue: unknown) => {\n const nextValue = typeof updaterOrValue === 'function'\n ? (updaterOrValue as (prev: string[]) => string[])(stateSnapshot.columnOrder)\n : updaterOrValue as string[];\n \n // Normalize: ensure 'select' stays first if it exists\n const normalizedOrder = nextValue.includes('select')\n ? ['select', ...nextValue.filter(id => id !== 'select')]\n : nextValue;\n\n actions.setColumnOrder(normalizedOrder);\n\n if (canPersistOrder) {\n updateColumnOrder(normalizedOrder);\n }\n\n onLayoutChange?.({\n columnOrder: normalizedOrder,\n columnVisibility: stateSnapshot.columnVisibility,\n });\n }, [actions, stateSnapshot.columnOrder, stateSnapshot.columnVisibility, canPersistOrder, updateColumnOrder, onLayoutChange]);\n\n return useMemo(() => ({\n onSortingChange: handleSortingChange,\n onColumnFiltersChange: handleColumnFiltersChange,\n onColumnVisibilityChange: handleColumnVisibilityChange,\n onRowSelectionChange: handleRowSelectionChange,\n onGroupingChange: handleGroupingChange,\n onExpandedChange: handleExpandedChange,\n onPaginationChange: handlePaginationChange,\n onColumnOrderChange: handleColumnOrderChange,\n }), [\n handleSortingChange,\n handleColumnFiltersChange,\n handleColumnVisibilityChange,\n handleRowSelectionChange,\n handleGroupingChange,\n handleExpandedChange,\n handlePaginationChange,\n handleColumnOrderChange,\n ]);\n}\n","import { useMemo } from 'react';\nimport {\n getCoreRowModel,\n getExpandedRowModel,\n getFilteredRowModel,\n getGroupedRowModel,\n getPaginationRowModel,\n getSortedRowModel,\n type ColumnDef,\n} from '@tanstack/react-table';\n\nimport type {\n DataRecord,\n NormalizedDataTableFeatureConfig,\n PaginationMode,\n GetRowId,\n} from '../types';\nimport type { TableHandlers, TableStateSnapshot } from './useTableHandlers';\n\ninterface UseDataTableConfigurationOptions<TData extends DataRecord> {\n data: TData[];\n columns: ColumnDef<TData>[];\n stateSnapshot: TableStateSnapshot<TData>;\n handlers: TableHandlers;\n features: NormalizedDataTableFeatureConfig;\n getRowId: GetRowId<TData>;\n finalPaginationMode: PaginationMode;\n finalDataCount: number;\n pageSize: number;\n /** Whether server-side fetching is actually configured (not just auto-detected) */\n hasServerSideConfig?: boolean;\n}\n\nexport function useDataTableConfiguration<TData extends DataRecord>({\n data,\n columns,\n stateSnapshot,\n handlers,\n features,\n getRowId,\n finalPaginationMode,\n finalDataCount,\n pageSize,\n hasServerSideConfig = false,\n}: UseDataTableConfigurationOptions<TData>) {\n return useMemo(() => {\n // Normalize columnOrder: ensure 'select' is always first if selection is enabled\n // This is critical for the UI - the select checkbox column must appear first\n let normalizedColumnOrder = [...stateSnapshot.columnOrder];\n \n if (features.selection) {\n // Remove 'select' from wherever it might be\n normalizedColumnOrder = normalizedColumnOrder.filter(id => id !== 'select');\n // Always place 'select' first\n normalizedColumnOrder = ['select', ...normalizedColumnOrder];\n }\n\n // CRITICAL FIX: When manualPagination is true, TanStack Table expects data to already be paginated\n // and will NOT call getPaginationRowModel(). However, if serverSide config isn't provided,\n // we fall back to client-side data (all 10,505 rows), and we should NOT use manualPagination.\n //\n // The bug: Auto-detection sets finalPaginationMode='server' for large datasets (>10k rows),\n // which sets manualPagination=true, but if serverSide config isn't provided, we're using\n // client-side data (all rows). This causes TanStack Table to think data is already paginated\n // when it's not, resulting in getRowModel().rows returning empty.\n //\n // Solution: Only use manualPagination when we're ACTUALLY using server-side data (have serverSide config).\n // Otherwise, let TanStack Table handle client-side pagination even for large datasets.\n // \n // Key check: If hasServerSideConfig is false, we're not actually using server-side pagination,\n // even if finalPaginationMode is 'server' (it was just auto-detected). In this case, disable\n // manualPagination so TanStack Table can handle client-side pagination.\n const shouldUseManualPagination = finalPaginationMode === 'server' && hasServerSideConfig;\n const shouldUseManualFiltering = shouldUseManualPagination;\n const shouldUseManualSorting = shouldUseManualPagination;\n\n return {\n data,\n columns,\n state: {\n sorting: stateSnapshot.sorting,\n columnFilters: stateSnapshot.columnFilters,\n columnVisibility: stateSnapshot.columnVisibility,\n rowSelection: stateSnapshot.rowSelection,\n grouping: stateSnapshot.grouping,\n expanded: stateSnapshot.expanded,\n pagination: stateSnapshot.pagination,\n globalFilter: stateSnapshot.globalFilter,\n columnOrder: normalizedColumnOrder,\n },\n initialState: {\n expanded: features.grouping ? {} : undefined,\n },\n enableRowSelection: features.selection,\n enableGrouping: features.grouping,\n getRowId,\n ...handlers,\n getCoreRowModel: getCoreRowModel(),\n // Only disable client-side filtering/sorting if we're ACTUALLY using manual (server-side) mode\n getFilteredRowModel: shouldUseManualFiltering ? undefined : getFilteredRowModel(),\n getSortedRowModel: shouldUseManualSorting ? undefined : getSortedRowModel(),\n // CRITICAL: When manualPagination is true, do NOT provide getPaginationRowModel\n // TanStack Table expects data to be pre-paginated and will not paginate it again\n getPaginationRowModel: (features.pagination && !shouldUseManualPagination) ? getPaginationRowModel() : undefined,\n getGroupedRowModel: features.grouping ? getGroupedRowModel() : undefined,\n getExpandedRowModel: features.grouping ? getExpandedRowModel() : undefined,\n manualSorting: shouldUseManualSorting,\n manualFiltering: shouldUseManualFiltering,\n manualPagination: shouldUseManualPagination,\n pageCount: shouldUseManualPagination\n ? Math.ceil(finalDataCount / pageSize)\n : undefined,\n };\n }, [\n data,\n columns,\n stateSnapshot,\n handlers,\n features.selection,\n features.grouping,\n features.pagination,\n getRowId,\n finalPaginationMode,\n finalDataCount,\n pageSize,\n hasServerSideConfig,\n ]);\n}\n","/**\n * @file Card Component Suite\n * @package @jmruthers/pace-core\n * @module Components\n * @since 0.1.0\n *\n * A flexible card component suite for displaying content with consistent styling.\n * Includes Card, CardHeader, CardTitle, CardDescription, CardContent, CardFooter, CardActions, and HoverCard variants.\n * Uses semantic HTML elements for better accessibility and structure.\n *\n * Features:\n * - Semantic HTML structure (article, header, main, footer, etc.)\n * - Modular card structure (header, content, footer, actions, etc.)\n * - CardContent uses main element for primary content (accessible when nested)\n * - Consistent padding, border, and shadow\n * - Responsive and accessible\n * - HoverCard for popover-style cards\n * - Proper heading hierarchy and semantic elements\n *\n * @example\n * ```tsx\n * // Basic card with semantic HTML structure\n * <Card>\n * <CardHeader>\n * <CardTitle>Article Title</CardTitle>\n * <CardDescription>Brief description of the article content</CardDescription>\n * </CardHeader>\n * <CardContent>\n * <p>Main content goes here with proper semantic structure.</p>\n * <p>Additional paragraphs and content.</p>\n * </CardContent>\n * <CardFooter>\n * <CardActions>\n * <Button>Primary Action</Button>\n * <Button variant=\"outline\">Secondary Action</Button>\n * </CardActions>\n * </CardFooter>\n * </Card>\n *\n * // Semantic HTML structure:\n * // - Card: <article> element for self-contained content\n * // - CardHeader: <header> element for card heading area\n * // - CardContent: <main> element for primary card content\n * // - CardFooter: <footer> element for card footer area\n * // - CardActions: <nav> element for action buttons\n *\n * // HoverCard usage with semantic structure\n * <HoverCard>\n * <HoverCardTrigger>Hover me</HoverCardTrigger>\n * <HoverCardContent>\n * <p>Popover content with semantic elements</p>\n * </HoverCardContent>\n * </HoverCard>\n * ```\n *\n * @accessibility\n * - Uses semantic HTML structure (article, header, main, footer, nav)\n * - Focusable and keyboard accessible\n * - Proper heading hierarchy for screen readers\n * - HoverCard supports mouse and keyboard interaction\n * - Screen reader friendly with semantic landmarks\n */\n\nimport * as React from \"react\"\nimport { useNavigate } from \"react-router-dom\"\nimport { cn } from \"../../utils/core/cn\"\n\n/**\n * Props for the Card component.\n * Extends standard HTML attributes for semantic HTML elements.\n */\nexport interface CardProps extends React.HTMLAttributes<HTMLElement> {\n /** Visual variant of the card */\n variant?: 'default' | 'outline' | 'ghost';\n /** Size of the card */\n size?: 'default' | 'sm' | 'lg';\n /** Whether the card should appear as a clickable link with hover effects */\n isLink?: boolean;\n /** Path or URL to navigate to when the card is clicked */\n link?: string;\n}\n\n/**\n * Get card classes based on variant and size\n */\nfunction getCardClasses(variant: CardProps['variant'] = 'default', size: CardProps['size'] = 'default'): string {\n const baseClasses = \"rounded-lg border bg-card text-card-foreground shadow-sm\";\n \n const variantClasses = {\n default: \"shadow-xl\",\n outline: \"border-2\",\n ghost: \"border-0 shadow-none\"\n };\n \n const sizeClasses = {\n default: \"\",\n sm: \"text-sm\",\n lg: \"text-lg\"\n };\n \n return `${baseClasses} ${variantClasses[variant]} ${sizeClasses[size]}`;\n}\n\n// Internal component for cards with navigation (requires Router context)\nconst CardWithNavigation = React.forwardRef<\n HTMLElement,\n CardProps & { link: string }\n>(({ className, variant, size, isLink, link, onClick, ...props }, ref) => {\n const navigate = useNavigate();\n \n const handleClick = (e: React.MouseEvent<HTMLElement>) => {\n // Call the original onClick handler if provided\n onClick?.(e);\n \n // Handle navigation if link is provided and event wasn't prevented\n if (link && !e.defaultPrevented) {\n // Check if it's an external URL\n if (link.startsWith('http://') || link.startsWith('https://')) {\n window.location.href = link;\n } else {\n // Internal route - use React Router navigation\n navigate(link);\n }\n }\n };\n \n // Automatically enable link styles if link prop is provided\n const shouldShowLinkStyles = isLink || !!link;\n \n return (\n <article\n ref={ref}\n className={cn(\n \"grid grid-rows-[auto_1fr_auto] min-w-0 overflow-visible\",\n getCardClasses(variant, size),\n shouldShowLinkStyles && \"cursor-pointer hover:bg-acc-200 hover:shadow-xl/30\",\n className\n )}\n onClick={handleClick}\n role=\"link\"\n tabIndex={0}\n onKeyDown={(e) => {\n if (e.key === 'Enter' || e.key === ' ') {\n e.preventDefault();\n handleClick(e as unknown as React.MouseEvent<HTMLElement>);\n }\n }}\n {...props}\n />\n );\n});\nCardWithNavigation.displayName = \"CardWithNavigation\";\n\n// Internal component for cards without navigation (no Router context required)\nconst CardWithoutNavigation = React.forwardRef<\n HTMLElement,\n Omit<CardProps, 'link'>\n>(({ className, variant, size, isLink, onClick, ...props }, ref) => {\n // Automatically enable link styles if isLink is true\n const shouldShowLinkStyles = isLink;\n \n return (\n <article\n ref={ref}\n className={cn(\n \"grid grid-rows-[auto_1fr_auto] min-w-0 overflow-visible\",\n getCardClasses(variant, size),\n shouldShowLinkStyles && \"cursor-pointer hover:bg-acc-200 hover:shadow-xl/30\",\n className\n )}\n onClick={onClick}\n {...props}\n />\n );\n});\nCardWithoutNavigation.displayName = \"CardWithoutNavigation\";\n\n// Main Card component that conditionally renders the appropriate variant\nconst Card = React.forwardRef<\n HTMLElement,\n CardProps\n>(({ link, ...props }, ref) => {\n // Only use navigation component if link is provided\n // This prevents useNavigate() from being called when Router context is not available\n if (link) {\n return <CardWithNavigation ref={ref} link={link} {...props} />;\n }\n return <CardWithoutNavigation ref={ref} {...props} />;\n});\nCard.displayName = \"Card\"\n\nconst CardHeader = React.forwardRef<\n HTMLElement,\n React.HTMLAttributes<HTMLElement>\n>(({ className, ...props }, ref) => (\n <header\n ref={ref}\n className={cn(\"p-6 min-w-0 w-full\", className)}\n {...props}\n />\n))\nCardHeader.displayName = \"CardHeader\"\n\nconst CardTitle = React.forwardRef<\n HTMLHeadingElement,\n React.HTMLAttributes<HTMLHeadingElement>\n>(({ className, ...props }, ref) => (\n <h3\n ref={ref}\n className={cn(className)}\n {...props}\n />\n))\nCardTitle.displayName = \"CardTitle\"\n\nconst CardDescription = React.forwardRef<\n HTMLParagraphElement,\n React.HTMLAttributes<HTMLParagraphElement>\n>(({ className, ...props }, ref) => (\n <p\n ref={ref}\n className={cn(className)}\n {...props}\n />\n))\nCardDescription.displayName = \"CardDescription\"\n\nconst CardContent = React.forwardRef<\n HTMLElement,\n React.HTMLAttributes<HTMLElement>\n>(({ className, ...props }, ref) => (\n <main \n ref={ref} \n className={cn(\"p-6 pt-0 min-w-0 w-full\", className)} \n {...props} \n />\n))\nCardContent.displayName = \"CardContent\"\n\nconst CardFooter = React.forwardRef<\n HTMLElement,\n React.HTMLAttributes<HTMLElement>\n>(({ className, ...props }, ref) => (\n <footer\n ref={ref}\n className={cn(\"p-6 pt-0 min-w-0 w-full\", className)}\n {...props}\n />\n))\nCardFooter.displayName = \"CardFooter\"\n\nconst CardActions = React.forwardRef<\n HTMLElement,\n React.HTMLAttributes<HTMLElement>\n>(({ className, ...props }, ref) => (\n <nav\n ref={ref}\n className={cn(\"flex gap-2\", className)}\n role=\"group\"\n aria-label=\"Card actions\"\n {...props}\n />\n))\nCardActions.displayName = \"CardActions\"\n\n// HoverCard components - improved with semantic structure\nconst HoverCard = React.forwardRef<\n HTMLElement,\n React.HTMLAttributes<HTMLElement> & { children: React.ReactNode }\n>(({ children, className, ...props }, ref) => {\n return (\n <section\n ref={ref}\n className={cn(\"relative inline-block\", className)}\n {...props}\n >\n {children}\n </section>\n );\n});\nHoverCard.displayName = \"HoverCard\"\n\nconst HoverCardTrigger = React.forwardRef<\n HTMLButtonElement,\n React.ButtonHTMLAttributes<HTMLButtonElement> & { asChild?: boolean }\n>(({ className, asChild, children, ...props }, ref) => {\n if (asChild) {\n return (\n <span className={cn(\"cursor-pointer\", className)}>\n {children}\n </span>\n );\n }\n \n return (\n <button\n ref={ref}\n type=\"button\"\n className={cn(\n \"cursor-pointer bg-transparent border-0 p-0 m-0 font-inherit color-inherit text-left\",\n className\n )}\n {...props}\n >\n {children}\n </button>\n )\n})\nHoverCardTrigger.displayName = \"HoverCardTrigger\"\n\nconst HoverCardContent = React.forwardRef<\n HTMLElement,\n React.HTMLAttributes<HTMLElement>\n>(({ className, ...props }, ref) => (\n <aside\n ref={ref}\n className={cn(\n \"absolute z-50 min-w-[8rem] overflow-hidden rounded-md border bg-popover p-4 text-popover-foreground shadow-md\",\n className\n )}\n role=\"tooltip\"\n {...props}\n />\n))\nHoverCardContent.displayName = \"HoverCardContent\"\n\nexport { \n Card, \n CardHeader, \n CardFooter, \n CardTitle, \n CardDescription, \n CardContent,\n CardActions,\n HoverCard,\n HoverCardTrigger,\n HoverCardContent\n}\n\n// Export types with correct semantic element types\nexport type CardHeaderProps = React.HTMLAttributes<HTMLElement>;\nexport type CardTitleProps = React.HTMLAttributes<HTMLHeadingElement>;\nexport type CardDescriptionProps = React.HTMLAttributes<HTMLParagraphElement>;\nexport type CardContentProps = React.HTMLAttributes<HTMLElement>;\nexport type CardFooterProps = React.HTMLAttributes<HTMLElement>;\nexport type CardActionsProps = React.HTMLAttributes<HTMLElement>;\nexport type HoverCardProps = React.HTMLAttributes<HTMLElement>;\nexport type HoverCardTriggerProps = React.ButtonHTMLAttributes<HTMLButtonElement> & { asChild?: boolean };\nexport type HoverCardContentProps = React.HTMLAttributes<HTMLElement>;\n","/**\n * @file Access Denied Page Component\n * @package @jmruthers/pace-core\n * @module Components/DataTable/Components\n * @since 2.0.0\n *\n * A component displayed when users lack permission to access DataTable data.\n * Provides clear messaging about access restrictions and next steps.\n *\n * Features:\n * - Clear access denied messaging\n * - Resource-specific error information\n * - Consistent styling with pace-core design system\n * - Accessibility compliant\n * - Actionable next steps for users\n *\n * @example\n * ```tsx\n * <AccessDeniedPage \n * resource=\"users\" \n * operation=\"read\"\n * message=\"You don't have permission to view user data\"\n * />\n * ```\n *\n * @accessibility\n * - Proper ARIA labels and roles\n * - High contrast support\n * - Screen reader friendly\n * - Keyboard navigation support\n *\n * @dependencies\n * - Card component for layout\n * - Button component for actions\n * - Lucide React icons\n * - React 19+ hooks\n */\n\nimport React from 'react';\nimport { Card, CardContent, CardDescription, CardFooter, CardHeader, CardTitle } from '../../Card/Card';\nimport { Button } from '../../Button/Button';\nimport { ShieldX, ArrowLeft, RefreshCw } from 'lucide-react';\n\n/**\n * Props for the AccessDeniedPage component\n */\nexport interface AccessDeniedPageProps {\n /** Resource that was denied access to */\n resource: string;\n /** Operation that was denied */\n operation?: string;\n /** Custom error message */\n message?: string;\n /** Callback when retry is clicked */\n onRetry?: () => void;\n /** Callback when back is clicked */\n onBack?: () => void;\n /** Custom class names */\n className?: string;\n}\n\n/**\n * Access denied page for DataTable when users lack permissions\n * \n * This component is displayed when a user attempts to access DataTable data\n * but lacks the necessary permissions. It provides clear messaging about\n * the access restriction and offers actionable next steps.\n * \n * @param props - Component configuration\n * @returns JSX.Element - The rendered access denied page\n * \n * @example\n * ```tsx\n * <AccessDeniedPage \n * resource=\"users\" \n * operation=\"read\"\n * onRetry={() => window.location.reload()}\n * onBack={() => navigate('/dashboard')}\n * />\n * ```\n */\nexport function AccessDeniedPage({\n resource,\n operation = 'access',\n message,\n onRetry,\n onBack,\n className,\n}: AccessDeniedPageProps) {\n const defaultMessage = message || `You don't have permission to ${operation} ${resource} data`;\n \n const handleRetry = () => {\n if (onRetry) {\n onRetry();\n } else if (typeof window !== 'undefined') {\n window.location.reload();\n }\n };\n\n const handleBack = () => {\n if (onBack) {\n onBack();\n } else if (typeof window !== 'undefined') {\n window.history.back();\n }\n };\n\n return (\n <Card className={`max-w-md w-full text-center ${className || ''}`}>\n\n<CardHeader>\n <CardTitle>\n <ShieldX className=\"w-8 h-8 inline-block mr-2\" />Access Denied\n </CardTitle>\n <CardDescription>\n {defaultMessage}\n</CardDescription>\n\n {/* Resource info */}\n\n <strong>Resource:</strong> {resource}\n {operation && (\n <>\n <br />\n <strong>Operation:</strong> {operation}\n </>\n )}\n </CardHeader>\n\n {/* Actions */}\n <CardContent className=\"flex flex-col sm:flex-row gap-3 w-full\">\n {onRetry && (\n <Button\n variant=\"outline\"\n onClick={handleRetry}\n className=\"flex-1\"\n >\n <RefreshCw className=\"w-4 h-4 mr-2\" />\n Retry\n </Button>\n )}\n <Button\n variant=\"outline\"\n onClick={handleBack}\n className=\"flex-1\"\n >\n <ArrowLeft className=\"w-4 h-4 mr-2\" />\n Go Back\n </Button>\n </CardContent>\n\n {/* Help text */}\n <CardFooter>\n If you believe this is an error, please contact your administrator.\n </CardFooter>\n\n </Card>\n );\n}\n","/**\n * @file DataTable Permissions Hook\n * @package @jmruthers/pace-core\n * @module Components/DataTable/Hooks\n * @since 0.5.0\n * \n * Hook for managing RBAC permissions in DataTable components.\n * Handles scope resolution, permission checks, and secure feature configuration.\n */\n\nimport { useMemo, useRef, useState, useEffect } from 'react';\nimport { useUnifiedAuth } from '../../../providers/services/UnifiedAuthProvider';\nimport { useCan, useResolvedScope } from '../../../rbac/hooks';\nimport { createLogger } from '../../../utils/core/logger';\nimport { isSuperAdmin } from '../../../rbac/api';\nimport {\n normalizeDataTableFeatures,\n type DataTableFeatureConfig,\n type DataTableRBACConfig,\n type NormalizedDataTableFeatureConfig,\n type DataRecord,\n} from '../types';\nimport type { Permission } from '../../../rbac/types';\n\n/**\n * Return value of the useDataTablePermissions hook.\n * Contains permission checks and secure feature configuration.\n */\nexport interface UseDataTablePermissionsReturn {\n permissions: {\n canRead: ReturnType<typeof useCan>;\n canCreate: ReturnType<typeof useCan>;\n canUpdate: ReturnType<typeof useCan>;\n canDelete: ReturnType<typeof useCan>;\n canExport: ReturnType<typeof useCan>;\n canImport: ReturnType<typeof useCan>;\n };\n secureFeatures: NormalizedDataTableFeatureConfig;\n effectivePageId: string | undefined;\n}\n\n/**\n * Hook for managing RBAC permissions in DataTable components.\n * Handles scope resolution, permission checks, and secure feature configuration.\n * \n * @template TData - The type of data records in the table\n * @param rbac - RBAC configuration for the DataTable\n * @param features - Feature configuration to secure\n * @returns Permission checks and secure feature configuration\n */\nexport function useDataTablePermissions<TData extends DataRecord>(\n rbac: DataTableRBACConfig,\n features: DataTableFeatureConfig = {}\n): UseDataTablePermissionsReturn {\n const logger = createLogger('DataTablePermissions');\n const authResult = useUnifiedAuth();\n const user = authResult.user;\n\n // Super admin status - check if user has super admin privileges\n // Super admins bypass all permission checks (similar to PaceAppLayout)\n // PERFORMANCE OPTIMIZATION: Check super admin once and share with all useCan hooks to avoid duplicate queries\n // Use null to indicate \"not checked yet\" vs false which means \"checked and not super admin\"\n const [isSuperAdminUser, setIsSuperAdminUser] = useState<boolean | null>(null);\n const [isCheckingSuperAdmin, setIsCheckingSuperAdmin] = useState<boolean>(() => !!user?.id);\n const lastCheckedUserIdRef = useRef<string | null>(null);\n const isCheckingRef = useRef<boolean>(false);\n\n useEffect(() => {\n // Skip if already checked for this user ID\n if (lastCheckedUserIdRef.current === user?.id && isSuperAdminUser !== null) {\n return;\n }\n\n // Skip if already checking\n if (isCheckingRef.current) {\n return;\n }\n\n const checkSuperAdminStatus = async () => {\n if (!user?.id) {\n setIsSuperAdminUser(false); // No user = not super admin\n setIsCheckingSuperAdmin(false);\n lastCheckedUserIdRef.current = null;\n return;\n }\n\n // Mark as checking and track user ID\n isCheckingRef.current = true;\n lastCheckedUserIdRef.current = user.id;\n\n const startTime = Date.now();\n setIsCheckingSuperAdmin(true);\n \n // Add timeout to prevent infinite hanging\n const timeoutId = setTimeout(() => {\n logger.warn('useDataTablePermissions', 'Super admin check taking longer than 5 seconds', {\n userId: user?.id,\n elapsedMs: Date.now() - startTime,\n });\n }, 5000);\n\n try {\n logger.debug('useDataTablePermissions', 'Starting super admin check', { userId: user?.id });\n const superAdminStatus = await isSuperAdmin(user.id);\n const elapsed = Date.now() - startTime;\n logger.debug('useDataTablePermissions', 'Super admin check completed', {\n userId: user?.id,\n isSuperAdmin: superAdminStatus,\n elapsedMs: elapsed,\n });\n setIsSuperAdminUser(superAdminStatus);\n } catch (error) {\n const elapsed = Date.now() - startTime;\n logger.error('useDataTablePermissions', 'Error checking super admin status', {\n userId: user?.id,\n error,\n elapsedMs: elapsed,\n });\n setIsSuperAdminUser(false); // Error = assume not super admin for security\n } finally {\n clearTimeout(timeoutId);\n setIsCheckingSuperAdmin(false);\n isCheckingRef.current = false;\n }\n };\n\n checkSuperAdminStatus();\n }, [user?.id, logger]);\n\n // MANDATORY: Check all permissions upfront - ALWAYS enforce RBAC\n // Use page-based permissions exclusively\n const pageId = rbac?.pageId;\n const pageName = rbac?.pageName;\n\n // Early validation - need either pageId or pageName\n if (!pageId && !pageName) {\n throw new Error('DataTable requires either rbac.pageId or rbac.pageName for permission checking');\n }\n\n // Use pageId if provided, otherwise use pageName (will be resolved by RBAC engine)\n const effectivePageId = pageId || pageName;\n\n /**\n * RBAC Scope Resolution\n * \n * This section handles the complex task of determining the current organisational\n * and event context for permission checks. The scope (org/event/app) changes\n * dynamically based on what the user has selected in the UI.\n * \n * Key complexity: Permission hooks (useCan) must not re-run on every render,\n * but they need the latest scope. We use a ref to maintain a stable scope object\n * that only changes when the actual scope values change, preventing infinite loops\n * while ensuring permissions are always checked with current context.\n */\n\n // Use shared scope resolution hook for consistent RBAC scoping\n const { selectedOrganisation, selectedEvent, supabase } = useUnifiedAuth();\n \n const { resolvedScope: rawResolvedScope, isLoading: scopeLoading } = useResolvedScope({\n supabase,\n selectedOrganisationId: selectedOrganisation?.id || null,\n selectedEventId: selectedEvent?.event_id || null\n });\n\n /**\n * Stable scope ref to prevent permission hooks from re-running constantly.\n * \n * Without this, every permission check would trigger on every render because\n * the scope object gets a new reference on each render. By using a ref and\n * only updating it when values actually change, we:\n * 1. Prevent infinite loops in permission hooks\n * 2. Maintain performance\n * 3. Still ensure permissions check against the current scope\n */\n const stableScopeRef = useRef<{ organisationId?: string; appId?: string; eventId?: string }>({ \n organisationId: undefined, \n appId: undefined, \n eventId: undefined \n });\n\n // Only update the stable scope if the resolved scope has actually changed\n // This prevents unnecessary re-renders while maintaining up-to-date permission checks\n // Allow scope updates even when organisationId is undefined (for users without orgs, like profile pages)\n if (rawResolvedScope) {\n const newScope = {\n organisationId: rawResolvedScope.organisationId,\n appId: rawResolvedScope.appId,\n eventId: rawResolvedScope.eventId\n };\n \n // Only update if the scope has actually changed\n if (stableScopeRef.current.organisationId !== newScope.organisationId ||\n stableScopeRef.current.eventId !== newScope.eventId ||\n stableScopeRef.current.appId !== newScope.appId) {\n stableScopeRef.current = {\n organisationId: newScope.organisationId,\n appId: newScope.appId,\n eventId: newScope.eventId\n };\n }\n } else if (!rawResolvedScope && !scopeLoading) {\n // Reset to empty scope when no resolved scope and resolution is complete (e.g., user logged out)\n stableScopeRef.current = { organisationId: undefined, appId: undefined, eventId: undefined };\n }\n\n const stableScope = stableScopeRef.current;\n\n /**\n * Effective scope for permission checks.\n * \n * Use the resolved scope once scope resolution is complete, even if organisationId is undefined.\n * This allows permission checks for users without organisations (e.g., profile pages).\n * The database function rbac_check_permission_simplified can handle NULL organisation_id.\n * \n * PERFORMANCE OPTIMIZATION: For page-level permissions with pageId (UUID), we don't need to wait\n * for full scope resolution. The database function can handle page-level permissions without\n * organisationId or appId. We only need to wait if:\n * 1. We're using pageName (not UUID) and need appId to resolve it, OR\n * 2. We need organisationId for resource-level permissions (but we're using page-level here)\n * \n * This allows permission checks to proceed in parallel with scope resolution, reducing load time.\n */\n const isPageName = !pageId && !!pageName; // We're using pageName, not a UUID pageId\n const needsAppIdForResolution = isPageName; // Only need appId if we're resolving a pageName\n \n // PERFORMANCE FIX: For page-level permissions with UUID pageId, we can proceed immediately\n // The database function handles page-level permissions without requiring full scope\n // Only wait if we're using pageName (which needs appId to resolve) or if scope is critical\n // For page-level permissions, organisationId and appId are optional\n const hasPageId = !!pageId && typeof pageId === 'string';\n const canProceedWithoutFullScope = hasPageId && !isPageName; // UUID pageId doesn't need appId\n \n // Wait for scope resolution only if:\n // 1. We're using pageName and don't have appId yet (needed to resolve pageName to pageId), OR\n // 2. Scope is loading AND we don't have a UUID pageId (can't proceed without scope)\n // This allows permission checks to start earlier for UUID pageIds, reducing load time\n const shouldWaitForScope = (needsAppIdForResolution && !stableScope.appId) || \n (scopeLoading && !canProceedWithoutFullScope);\n \n // Use available scope immediately if we can proceed, otherwise wait\n // For page-level permissions, empty scope is acceptable (database handles it)\n const effectiveScope = (!shouldWaitForScope && (stableScope.organisationId || stableScope.appId || stableScope.eventId || canProceedWithoutFullScope)) \n ? stableScope \n : (canProceedWithoutFullScope ? { organisationId: undefined, eventId: undefined, appId: undefined } : null);\n\n // Always call hooks with consistent parameters to avoid React hooks order violations\n const userId = user?.id || '';\n const readPermission = `read:page.${effectivePageId}` as unknown as Permission;\n const createPermission = `create:page.${effectivePageId}` as unknown as Permission;\n const updatePermission = `update:page.${effectivePageId}` as unknown as Permission;\n const deletePermission = `delete:page.${effectivePageId}` as unknown as Permission;\n\n // Always use a consistent scope object to prevent hooks order violations\n // When scope is loading or we need appId for pageName resolution, use empty scope which will cause useCan to wait\n // When scope resolution is complete (even with undefined organisationId), use the resolved scope\n // This allows permission checks for users without organisations (e.g., profile pages)\n const consistentScope = effectiveScope || { organisationId: undefined, eventId: undefined, appId: undefined };\n\n // Check permissions using useCan hooks\n // PERFORMANCE OPTIMIZATION: Pass precomputed super admin status to avoid duplicate checks\n // Each useCan hook would normally check super admin separately (6+ queries), but we check once here\n // and share the result. Pass null if not checked yet (hooks will check), false/true if checked.\n // Note: The database function already handles super admin bypass, but we check here\n // as an additional safety layer to prevent unnecessary permission checks and ensure\n // super admins never see \"Access Denied\" even if useCan hasn't completed\n // Pass super admin status directly - null means not checked yet, false/true means checked\n // This eliminates duplicate super admin checks across all 6 permission hooks\n const canReadResult = useCan(userId, consistentScope, readPermission, effectivePageId, true, isSuperAdminUser);\n const canCreateResult = useCan(userId, consistentScope, createPermission, effectivePageId, true, isSuperAdminUser);\n const canUpdateResult = useCan(userId, consistentScope, updatePermission, effectivePageId, true, isSuperAdminUser);\n const canDeleteResult = useCan(userId, consistentScope, deletePermission, effectivePageId, true, isSuperAdminUser);\n const canExportResult = useCan(userId, consistentScope, readPermission, effectivePageId, true, isSuperAdminUser); // Use read permission for export\n const canImportResult = useCan(userId, consistentScope, createPermission, effectivePageId, true, isSuperAdminUser); // Use create permission for import\n\n // Create permission wrappers that bypass checks for super admins\n // Super admins get can: true for all permissions, but we preserve isLoading and error states\n // to maintain consistent API with useCan return type\n // React 19 fix: Read isLoading directly from result objects to ensure we get the latest state\n // instead of relying on memoized object references which may not update properly in React 19\n const permissions = useMemo(() => {\n // Helper to create a permission result that bypasses for super admins\n // If super admin check is still loading, we show loading state to prevent premature \"Access Denied\"\n // Once super admin check completes, if user is super admin, all permissions are true\n // Otherwise, use the normal permission check results\n const createSuperAdminAwarePermission = (result: ReturnType<typeof useCan>) => ({\n // If super admin check completed and user is super admin, grant all permissions\n // and mark loading as complete for DataTable gating purposes.\n // This is not a \"hack\": super admins *semantically* bypass permission checks, so the\n // table must not remain blocked behind background permission queries.\n can: isSuperAdminUser === true ? true : result.can,\n isLoading:\n isSuperAdminUser === true\n ? false\n : (isSuperAdminUser === null && isCheckingSuperAdmin) || result.isLoading,\n error: isSuperAdminUser === true ? null : result.error,\n refetch: result.refetch,\n });\n\n return {\n canRead: createSuperAdminAwarePermission(canReadResult),\n canCreate: createSuperAdminAwarePermission(canCreateResult),\n canUpdate: createSuperAdminAwarePermission(canUpdateResult),\n canDelete: createSuperAdminAwarePermission(canDeleteResult),\n canExport: createSuperAdminAwarePermission(canExportResult),\n canImport: createSuperAdminAwarePermission(canImportResult),\n };\n }, [\n isSuperAdminUser,\n isCheckingSuperAdmin,\n // React 19 fix: Include individual properties instead of entire objects to ensure proper dependency tracking\n canReadResult.can,\n canReadResult.isLoading,\n canReadResult.error,\n canCreateResult.can,\n canCreateResult.isLoading,\n canCreateResult.error,\n canUpdateResult.can,\n canUpdateResult.isLoading,\n canUpdateResult.error,\n canDeleteResult.can,\n canDeleteResult.isLoading,\n canDeleteResult.error,\n canExportResult.can,\n canExportResult.isLoading,\n canExportResult.error,\n canImportResult.can,\n canImportResult.isLoading,\n canImportResult.error,\n ]);\n\n // MANDATORY: Features are automatically filtered by permissions\n const normalizedFeatures = useMemo(\n () => normalizeDataTableFeatures(features),\n [features]\n );\n\n const secureFeatures: NormalizedDataTableFeatureConfig = useMemo(() => ({\n ...normalizedFeatures,\n creation: normalizedFeatures.creation && permissions.canCreate.can,\n editing: normalizedFeatures.editing && permissions.canUpdate.can,\n deletion: normalizedFeatures.deletion && permissions.canDelete.can,\n deleteSelected: normalizedFeatures.deleteSelected && permissions.canDelete.can,\n export: normalizedFeatures.export && permissions.canExport.can,\n import: normalizedFeatures.import && permissions.canImport.can,\n }), [normalizedFeatures, permissions.canCreate.can, permissions.canUpdate.can, permissions.canDelete.can, permissions.canExport.can, permissions.canImport.can]);\n\n return {\n permissions,\n secureFeatures,\n effectivePageId\n };\n}\n\n","/**\n * @file DataTable Type Definitions\n * @package @jmruthers/pace-core\n * @module Components/DataTable/Types\n * @since 0.2.0\n */\n\nimport React from 'react';\nimport type { \n SortingState, \n ColumnFiltersState, \n VisibilityState, \n GroupingState, \n ExpandedState,\n PaginationState,\n ColumnDef\n} from '@tanstack/react-table';\nimport type { ImportModalConfig } from './components/ImportModal';\n\n// Extend TanStack Table types to include custom meta properties\ndeclare module '@tanstack/react-table' {\n interface ColumnMeta<TData, TValue> {\n /** Text alignment for the column content */\n align?: 'left' | 'right' | 'center';\n /** Column type for styling purposes */\n type?: 'text' | 'number' | 'date' | 'boolean' | 'custom';\n }\n}\n\n// ============================================================================\n// CORE DATA TYPES\n// ============================================================================\n\n/**\n * Core value types that can exist in a data record\n */\nexport type CellValue = string | number | boolean | null | undefined | Date;\n\n/**\n * Base data record type - all DataTable data must extend this\n * This is a marker type that allows any object to be used as a data record\n * Individual implementations should define more specific types\n */\nexport interface DataRecord {\n [key: string]: unknown;\n}\n\n/**\n * Row ID type - always a string\n */\nexport type RowId = string;\n\n/**\n * Row identifier function type\n */\nexport type GetRowId<TData extends DataRecord> = (row: TData, index: number) => RowId;\n\n// ============================================================================\n// HIERARCHICAL DATA TYPES\n// ============================================================================\n\n/**\n * Hierarchical data row interface for parent/child relationships\n */\nexport interface HierarchicalDataRow extends DataRecord {\n /** Whether this row is a parent row */\n isParent: boolean;\n /** For child rows, references the parent row ID */\n parentId?: string;\n /** Unique identifier for this row */\n id: string;\n}\n\n/**\n * Hierarchical configuration for DataTable\n */\nexport interface HierarchicalConfig {\n /** Enable hierarchical functionality */\n enabled: boolean;\n /** Default expanded state - true = all expanded, false = all collapsed, array = specific IDs */\n defaultExpanded?: boolean | string[];\n /** Callback when expanded state changes */\n onExpandedChange?: (expandedIds: string[]) => void;\n /** Custom expand/collapse button component */\n expandButton?: React.ComponentType<ExpandButtonProps>;\n /** Visual indentation for child rows (in pixels) */\n indentSize?: number;\n /** Custom styling for parent rows */\n parentRowClassName?: string;\n /** Custom styling for child rows */\n childRowClassName?: string;\n}\n\n/**\n * Props for the expand/collapse button component\n */\nexport interface ExpandButtonProps {\n /** Row ID */\n rowId: string;\n /** Whether the row is currently expanded */\n isExpanded: boolean;\n /** Whether this row has children */\n hasChildren: boolean;\n /** Click handler */\n onClick: () => void;\n /** Additional CSS classes */\n className?: string;\n}\n\n// ============================================================================\n// PERFORMANCE & PAGINATION TYPES\n// ============================================================================\n\n/**\n * Pagination mode determines how data is handled\n */\nexport type PaginationMode = 'client' | 'server' | 'hybrid';\n\n/**\n * Performance configuration for large datasets\n */\nexport interface PerformanceConfig {\n /** Enable virtual scrolling */\n virtualScrolling?: boolean;\n /** Virtual scrolling overscan count */\n overscan?: number;\n /** Enable memoization of cell renderers */\n memoizeCells?: boolean;\n /** Enable debounced search */\n debounceSearch?: number;\n /** Enable data chunking for memory management */\n enableChunking?: boolean;\n /** Chunk size for data processing */\n chunkSize?: number;\n /** Enable Web Workers for heavy operations */\n enableWebWorkers?: boolean;\n /** Threshold for switching to server-side mode */\n serverSideThreshold?: number;\n}\n\n/**\n * Server-side data fetching configuration\n */\nexport interface ServerSideConfig<TData extends DataRecord> {\n /** Function to fetch data from server */\n fetchData: (params: ServerSideParams) => Promise<ServerSideResponse<TData>>;\n /** Enable server-side sorting */\n enableServerSorting?: boolean;\n /** Enable server-side filtering */\n enableServerFiltering?: boolean;\n /** Enable server-side search */\n enableServerSearch?: boolean;\n /** Enable server-side pagination */\n enableServerPagination?: boolean;\n /** Debounce delay for server requests */\n debounceMs?: number;\n /** Cache duration for server responses */\n cacheMs?: number;\n}\n\n/**\n * Parameters sent to server for data fetching\n */\nexport interface ServerSideParams {\n /** Current page index */\n pageIndex: number;\n /** Page size */\n pageSize: number;\n /** Sorting configuration */\n sorting: SortingState;\n /** Column filters */\n columnFilters: ColumnFiltersState;\n /** Global filter/search term */\n globalFilter: string;\n /** Grouping configuration */\n grouping: GroupingState;\n}\n\n/**\n * Response from server for data fetching\n */\nexport interface ServerSideResponse<TData extends DataRecord> {\n /** Array of data records */\n data: TData[];\n /** Total number of records (for pagination) */\n totalCount: number;\n /** Current page index */\n pageIndex: number;\n /** Page size */\n pageSize: number;\n /** Total number of pages */\n pageCount: number;\n /** Whether there are more pages */\n hasNextPage: boolean;\n /** Whether there are previous pages */\n hasPreviousPage: boolean;\n}\n\n/**\n * Unified pagination configuration for consistent behavior across modes\n */\nexport interface PaginationConfig {\n /** Pagination mode */\n mode: PaginationMode;\n /** Available page size options */\n pageSizeOptions?: number[];\n /** Initial page size */\n initialPageSize?: number;\n /** Show enhanced pagination controls (jump to page, etc.) */\n enhanced?: boolean;\n /** Show performance mode indicator */\n showPerformanceInfo?: boolean;\n}\n\n/**\n * Pagination callbacks for server-side and hybrid modes\n */\nexport interface PaginationCallbacks {\n /** Called when page index changes */\n onPageChange?: (pageIndex: number) => void;\n /** Called when page size changes */\n onPageSizeChange?: (pageSize: number) => void;\n}\n\n/**\n * Data chunking configuration\n */\nexport interface ChunkingConfig {\n /** Size of each data chunk */\n chunkSize: number;\n /** Number of chunks to keep in memory */\n maxChunksInMemory: number;\n /** Enable progressive loading */\n progressiveLoading?: boolean;\n}\n\n/**\n * Search index configuration for performance\n */\nexport interface SearchIndexConfig {\n /** Fields to index for search */\n indexedFields: string[];\n /** Enable fuzzy search */\n fuzzySearch?: boolean;\n /** Fuzzy search threshold */\n fuzzyThreshold?: number;\n /** Enable search highlighting */\n enableHighlighting?: boolean;\n}\n\n// ============================================================================\n// COLUMN DEFINITIONS\n// ============================================================================\n\n/**\n * Enhanced column definition that extends TanStack's ColumnDef\n */\nexport interface DataTableColumn<TData extends DataRecord = DataRecord> extends Omit<ColumnDef<TData>, 'id' | 'accessorKey'> {\n /** Column identifier */\n id?: string;\n /** Accessor key for data */\n accessorKey?: string;\n /** Alternative accessor key used while editing */\n editAccessorKey?: string;\n /** Custom header label for the column */\n header: string;\n /** Whether this column should be searchable in global filter */\n searchable?: boolean;\n /** Enable sorting */\n sortable?: boolean;\n /** Enable column filter (inherits from ColumnDef) */\n enableColumnFilter?: boolean;\n /** Enable grouping (inherits from ColumnDef) */\n enableGrouping?: boolean;\n /** Enable hiding (inherits from ColumnDef) */\n enableHiding?: boolean;\n /** Aggregate configuration for this column */\n aggregate?: AggregateConfig;\n /** Enable virtual scrolling for this column */\n virtualizable?: boolean;\n /** Custom cell renderer with memoization */\n memoizedCell?: React.ComponentType<{ row: TData }>;\n /** Field type for editing (text, select, date, etc.) */\n fieldType?: 'text' | 'select' | 'date' | 'number' | 'boolean';\n /** Options for select fields - can be simple items or grouped with labels and separators */\n fieldOptions?: Array<\n | { value: string | number; label: string } // Simple option\n | { type: 'group'; label: string; items: Array<{ value: string | number; label: string }> } // Group with label\n | { type: 'separator' } // Visual separator\n >;\n /** Enable keyboard search/filtering in select dropdowns within editable columns (default: true). When fieldType is 'select', this controls dropdown searchability, not global search. */\n selectSearchable?: boolean;\n /** Enable creating new items in select dropdowns (default: false) */\n creatable?: boolean;\n /** Callback to create a new item when user types non-matching text in select dropdown */\n onCreateNew?: (inputValue: string) => Promise<string | number> | string | number;\n /** Maximum height for select dropdown content (default: \"20rem\") */\n selectMaxHeight?: string;\n /** Custom className for select content dropdown */\n selectContentClassName?: string;\n /** Custom style for select content dropdown */\n selectContentStyle?: React.CSSProperties;\n /** Hide spinner arrows on number input fields (default: true for DataTable) */\n hideNumberSpinners?: boolean;\n /** Filter type for column filtering (text, select, number, date) */\n filterType?: 'text' | 'select' | 'number' | 'date';\n /** Options for select filters (alternative to fieldOptions) */\n filterSelectOptions?: Array<{ value: string | number; label: string }>;\n /** Whether this column is editable in edit mode (default: true) */\n editable?: boolean;\n \n // Hierarchical rendering\n /** Custom renderer for parent rows */\n renderForParent?: (row: TData) => React.ReactNode;\n /** Custom renderer for child rows */\n renderForChild?: (row: TData) => React.ReactNode;\n /** Hide this column for parent rows */\n hideForParent?: boolean;\n /** Hide this column for child rows */\n hideForChild?: boolean;\n \n // Grouped row aggregation\n /**\n * Aggregation function for grouped rows.\n * Receives all rows in the group and returns the aggregated value.\n * If not provided, grouped rows will show empty/undefined for this column.\n */\n aggregateFn?: (rows: TData[], column: DataTableColumn<TData>) => unknown;\n /**\n * Optional: Custom cell renderer for aggregated values in grouped rows.\n * If not provided, uses the column's regular cell renderer.\n */\n aggregateCell?: (value: unknown, rows: TData[], column: DataTableColumn<TData>) => React.ReactNode;\n}\n\n/**\n * Extended column definition used when rendering editable rows\n */\nexport interface EditableColumnDef<TData extends DataRecord = DataRecord> extends DataTableColumn<TData> {\n /** Whether the column can be edited */\n editable?: boolean;\n /** Field type used to determine edit control */\n fieldType?: 'text' | 'select' | 'date' | 'number' | 'boolean';\n /** Options for select based editors - can be simple items or grouped with labels and separators */\n fieldOptions?: Array<\n | { value: string | number; label: string } // Simple option\n | { type: 'group'; label: string; items: Array<{ value: string | number; label: string }> } // Group with label\n | { type: 'separator' } // Visual separator\n >;\n /** Enable keyboard search/filtering in select dropdowns (inherits from DataTableColumn.selectSearchable) */\n selectSearchable?: boolean;\n /** Enable creating new items in select dropdowns */\n creatable?: boolean;\n /** Callback to create a new item when user types non-matching text */\n onCreateNew?: (inputValue: string) => Promise<string | number> | string | number;\n /** Hide spinner arrows on number input fields */\n hideNumberSpinners?: boolean;\n}\n\n/**\n * Simple column interface for basic use cases\n */\nexport interface SimpleColumn<TData extends DataRecord = DataRecord> {\n /** Data accessor key */\n key: keyof TData | string;\n /** Display label */\n label: string;\n /** Enable sorting */\n sortable?: boolean;\n /** Enable filtering */\n filterable?: boolean;\n}\n\n// ============================================================================\n// ACTION DEFINITIONS\n// ============================================================================\n\n/**\n * Action definition for row-level operations\n */\n/**\n * Boolean condition or predicate evaluated against a row\n */\nexport type ActionCondition<TData extends DataRecord> = boolean | ((row: TData) => boolean);\n\n/**\n * Action definition for DataTable rows.\n * Defines custom actions that can be performed on table rows.\n * \n * @template TData - The type of data records in the table\n */\nexport interface DataTableAction<TData extends DataRecord> {\n /** Display label for the action */\n label: string;\n /** Icon component */\n icon?: React.ComponentType<{ className?: string }>;\n /** Action handler */\n onClick: (row: TData) => void;\n /** Visual variant */\n variant?: 'default' | 'destructive' | 'outline' | 'secondary' | 'ghost';\n /** Whether action is disabled */\n disabled?: ActionCondition<TData>;\n /** Whether action is hidden (for RBAC) */\n hidden?: boolean;\n /** Explicit visibility override */\n visible?: ActionCondition<TData>;\n /** Test ID for testing */\n testId?: string;\n /** Whether this action should only show for parent rows (hierarchical mode) */\n showForParent?: boolean;\n /** Whether this action should only show for child rows (hierarchical mode) */\n showForChild?: boolean;\n /** Icon component for parent rows (overrides icon when showForParent is true) */\n parentIcon?: React.ComponentType<{ className?: string }>;\n /** Icon component for child rows (overrides icon when showForChild is true) */\n childIcon?: React.ComponentType<{ className?: string }>;\n /** Label for parent rows (overrides label when showForParent is true) */\n parentLabel?: string;\n /** Label for child rows (overrides label when showForChild is true) */\n childLabel?: string;\n /** Whether the action should be shown while the row is in edit mode */\n showInEditMode?: boolean;\n /** Whether the action should be hidden while the row is in view mode */\n hideInViewMode?: boolean;\n /** Whether the action should explicitly render while in view mode */\n showInViewMode?: boolean;\n}\n\n/**\n * Toolbar button definition\n */\nexport interface DataTableToolbarButton {\n /** Display label */\n label: string;\n /** Icon component */\n icon?: React.ComponentType<{ className?: string }>;\n /** Click handler */\n onClick: () => void;\n /** Visual variant */\n variant?: 'default' | 'destructive' | 'outline' | 'secondary' | 'ghost';\n /** Whether button is disabled */\n disabled?: boolean;\n /** Test ID for testing */\n testId?: string;\n}\n\n// ============================================================================\n// CONFIGURATION TYPES\n// ============================================================================\n\n/**\n * Aggregate configuration\n */\nexport interface AggregateConfig {\n field: string;\n function: 'sum' | 'avg' | 'count' | 'min' | 'max';\n label: string;\n}\n\n/**\n * Empty state configuration\n */\nexport interface EmptyStateConfig {\n title?: string;\n description?: string;\n icon?: React.ComponentType<{ className?: string }>;\n action?: {\n label: string;\n onClick: () => void;\n };\n}\n\n// ============================================================================\n// FEATURE CONFIGURATION TYPES\n// ============================================================================\n\n/**\n * Unified feature configuration for DataTable\n * All features are disabled by default and must be explicitly enabled\n */\nexport interface DataTableFeatureFlags {\n // Core Features\n /** Enable global search functionality */\n search: boolean;\n /** Enable pagination controls */\n pagination: boolean;\n /** Enable column sorting */\n sorting: boolean;\n /** Enable column filtering */\n filtering: boolean;\n \n // Data Management\n /** Enable data import functionality */\n import: boolean;\n /** Enable data export functionality */\n export: boolean;\n \n // Row Operations\n /** Enable row selection for bulk operations */\n selection: boolean;\n /** Enable row creation */\n creation: boolean;\n /** Enable row editing */\n editing: boolean;\n /** Enable row deletion */\n deletion: boolean;\n /** Enable bulk deletion of selected rows */\n deleteSelected: boolean;\n \n // Table Customization\n /** Enable data grouping */\n grouping: boolean;\n /** Enable column visibility controls */\n columnVisibility: boolean;\n /** Enable column reordering */\n columnReordering: boolean;\n /** Enable hierarchical parent/child rows */\n hierarchical: boolean;\n\n // Performance\n // Virtualization is now handled automatically based on data size\n\n // Layout\n}\n\n/**\n * Consumer-facing feature configuration. All properties are optional and will be\n * merged with {@link defaultDataTableFeatures} at runtime to keep the public API\n * ergonomic while maintaining strict internal guarantees.\n */\nexport type DataTableFeatureConfig = Partial<DataTableFeatureFlags>;\n\n/** Fully normalized feature configuration used internally by the table. */\nexport type NormalizedDataTableFeatureConfig = DataTableFeatureFlags;\n\n/** Default feature configuration with every capability disabled. */\nexport const defaultDataTableFeatures: NormalizedDataTableFeatureConfig = {\n search: false,\n pagination: false,\n sorting: false,\n filtering: false,\n import: false,\n export: false,\n selection: false,\n creation: false,\n editing: false,\n deletion: false,\n deleteSelected: false,\n grouping: false,\n columnVisibility: false,\n columnReordering: false,\n hierarchical: false,\n};\n\n/**\n * Normalize a potentially partial feature configuration. This keeps the\n * rendering pipeline simple and predictable because downstream consumers can\n * rely on every flag being present.\n */\nexport function normalizeDataTableFeatures(\n features?: DataTableFeatureConfig\n): NormalizedDataTableFeatureConfig {\n return {\n ...defaultDataTableFeatures,\n ...(features ?? {}),\n };\n}\n\n\n\n// ============================================================================\n// RBAC TYPES\n// ============================================================================\n\n/**\n * RBAC configuration for DataTable - MANDATORY for all DataTables\n * \n * @example\n * ```tsx\n * <DataTable \n * data={dishes} \n * rbac={{ pageName: 'dishes' }} // Use page name (recommended)\n * features={features}\n * />\n * \n * <DataTable \n * data={dishes} \n * rbac={{ pageId: 'uuid-here' }} // Use page ID directly\n * features={features}\n * />\n * ```\n */\nexport interface DataTableRBACConfig {\n /** Page name for page-based permissions - will be resolved to page ID */\n pageName?: string;\n /** Page ID for page-based permissions - used directly if provided */\n pageId?: string;\n}\n\n/**\n * RBAC context passed to server-side requests\n */\nexport interface RBACContext {\n /** User ID for permission checking */\n userId: string;\n /** Organisation ID for scope isolation */\n organisationId: string;\n /** Event ID for event-based apps */\n eventId?: string;\n /** App ID for app-specific permissions */\n appId?: string;\n /** Page ID for granular permissions */\n pageId: string;\n}\n\n// ============================================================================\n// EXPORT TYPES\n// ============================================================================\n\n/**\n * Options provided to the onExport handler for custom export functionality\n * \n * @example\n * ```tsx\n * <DataTable\n * onExport={async (options) => {\n * // Export only specific columns\n * const customColumns = options.allColumns.filter(col => \n * ['name', 'email', 'role'].includes(col.accessorKey || '')\n * );\n * await exportToCSVWithTableRows(\n * options.tableRows,\n * customColumns,\n * options.columnIdToTableColumn,\n * 'custom-export.csv'\n * );\n * }}\n * />\n * ```\n */\nexport interface ExportOptions<TData extends DataRecord> {\n /** Filtered table rows with getValue() method for proper accessorFn evaluation */\n tableRows: Array<{\n original: TData;\n getValue: (columnId: string) => unknown;\n id: string;\n }>;\n /** All column definitions passed to the DataTable */\n allColumns: DataTableColumn<TData>[];\n /** Currently visible columns in the table */\n visibleColumns: DataTableColumn<TData>[];\n /** Mapping of column IDs to TanStack table column instances (for getValue() calls) */\n columnIdToTableColumn: Map<string, unknown>;\n /** Raw data array (unfiltered) */\n data: TData[];\n /** Default filename generated from table title */\n filename: string;\n /** TanStack table instance for advanced operations */\n table: unknown; // Using unknown to avoid tight coupling with TanStack types\n}\n\n// ============================================================================\n// MAIN COMPONENT PROPS\n// ============================================================================\n\n/**\n * Enhanced DataTable props with unified feature configuration and MANDATORY RBAC\n */\nexport interface DataTableProps<TData extends DataRecord> {\n // Core data\n /** Array of data to display */\n data: TData[];\n /** Column definitions - supports both DataTableColumn and SimpleColumn formats */\n columns: (DataTableColumn<TData> | SimpleColumn<TData>)[];\n \n // MANDATORY RBAC - NO OPTIONAL\n /** RBAC configuration - REQUIRED for all DataTables */\n rbac: DataTableRBACConfig;\n\n // Display\n /** Table title */\n title?: string;\n /** Table description */\n description?: string;\n /** Theme variant */\n variant?: 'default' | 'compact' | 'spacious';\n /** Custom CSS classes */\n className?: string;\n\n // NEW: Unified feature configuration\n /** Feature configuration - all features are disabled by default */\n features?: DataTableFeatureConfig;\n\n // Hierarchical Configuration\n /** Hierarchical parent/child row configuration */\n hierarchical?: HierarchicalConfig;\n\n // Performance Configuration\n /** Performance optimization settings */\n performance?: PerformanceConfig;\n /** Server-side data fetching configuration */\n serverSide?: ServerSideConfig<TData>;\n /** Pagination mode */\n paginationMode?: PaginationMode;\n /** Data chunking configuration */\n chunking?: ChunkingConfig;\n /** Search index configuration */\n searchIndex?: SearchIndexConfig;\n /** Initial page size for pagination */\n initialPageSize?: number;\n\n // Default state configuration\n /** Initial grouping configuration - columns to group by on load */\n defaultGrouping?: string[];\n /** Initial sorting configuration - sort state to apply on load */\n defaultSorting?: Array<{\n id: string;\n desc: boolean;\n }>;\n\n // Event handlers\n /** Row edit handler */\n onEditRow?: (row: TData, data: Partial<TData>) => void;\n /** Row deletion handler */\n onDeleteRow?: (row: TData) => void;\n /** Row creation handler */\n onCreateRow?: (data: Partial<TData>) => void;\n /** Import handler */\n onImport?: (data: TData[]) => void | Promise<void>;\n /** \n * Export handler - allows custom export logic with full control over columns and data\n * \n * If not provided, defaults to exporting all visible columns.\n * \n * @example\n * ```tsx\n * // Custom export with specific columns\n * onExport={async (options) => {\n * const exportColumns = options.allColumns.filter(col => \n * ['name', 'email'].includes(col.accessorKey || '')\n * );\n * await exportToCSVWithTableRows(\n * options.tableRows,\n * exportColumns,\n * options.columnIdToTableColumn,\n * 'users-export.csv'\n * );\n * }}\n * ```\n */\n onExport?: (options: ExportOptions<TData>) => void | Promise<void>;\n /** Row selection change handler */\n onRowSelectionChange?: (selection: Record<string, boolean>) => void;\n /** Controlled selection state */\n selection?: Record<string, boolean>;\n /** Bulk delete selected rows handler */\n onDeleteSelected?: (selectedRows: Record<string, boolean>) => void;\n\n // Utilities\n /** Function to get unique ID for each row */\n getRowId?: GetRowId<TData>;\n /** Loading state */\n isLoading?: boolean;\n /** Empty state customization */\n emptyState?: EmptyStateConfig;\n /** Aggregate configurations */\n aggregates?: AggregateConfig[];\n\n // Import Modal Configuration\n /** Import modal configuration */\n importModalConfig?: ImportModalConfig;\n}\n\n\n","/**\n * @file DataTable Table Columns Hook\n * @package @jmruthers/pace-core\n * @package @jmruthers/pace-core\n * @module Components/DataTable/Hooks\n * @since 0.5.0\n * \n * Hook for building and processing table columns with selection and actions.\n * Handles column enhancement, ordering, and integration with features.\n */\n\nimport React, { useMemo } from 'react';\nimport { Checkbox } from '../../Checkbox/Checkbox';\nimport { ColumnFactory } from '../core/ColumnFactory';\nimport type {\n NormalizedDataTableFeatureConfig,\n DataTableColumn,\n DataTableAction,\n DataRecord\n} from '../types';\nimport type { ColumnDef } from '@tanstack/react-table';\nimport type { HeaderContext, CellContext } from '@tanstack/react-table';\n\n/**\n * Options for the useTableColumns hook.\n * @template TData - The type of data records in the table\n */\nexport interface UseTableColumnsOptions<TData extends DataRecord> {\n columns: DataTableColumn<TData>[];\n features: NormalizedDataTableFeatureConfig;\n effectiveActions: DataTableAction<TData>[];\n columnOrder: string[];\n}\n\n/**\n * Return value of the useTableColumns hook.\n * @template TData - The type of data records in the table\n */\nexport interface UseTableColumnsReturn<TData extends DataRecord> {\n enhancedColumns: ColumnDef<TData>[];\n}\n\n/**\n * Hook for processing and enhancing table columns\n * \n * This hook handles:\n * - Adding selection column if enabled\n * - Adding actions column if there are actions\n * - Respecting column order\n * - Applying feature-based enhancements\n */\nexport function useTableColumns<TData extends DataRecord>({\n columns,\n features,\n effectiveActions,\n columnOrder\n}: UseTableColumnsOptions<TData>): UseTableColumnsReturn<TData> {\n\n const enhancedColumns = useMemo(() => {\n // Create enhanced base columns\n const baseColumns: ColumnDef<TData>[] = [...columns].map(column => {\n const baseColumn = {\n ...column,\n enableSorting: features.sorting && (column.enableSorting !== false),\n enableColumnFilter: features.filtering && (column.enableColumnFilter !== false),\n enableGrouping: features.grouping && (column.enableGrouping !== false),\n };\n\n // Automatically set right alignment for numeric columns\n // Check if column is numeric by:\n // 1. meta.type === 'number'\n // 2. fieldType === 'number'\n // 3. filterType === 'number'\n // Exclude dates (fieldType === 'date' or meta.type === 'date')\n const dataTableColumn = column as DataTableColumn<TData>;\n const isNumericColumn = \n column.meta?.type === 'number' ||\n dataTableColumn.fieldType === 'number' ||\n dataTableColumn.filterType === 'number';\n \n const isDateColumn = \n column.meta?.type === 'date' ||\n dataTableColumn.fieldType === 'date' ||\n dataTableColumn.filterType === 'date';\n\n // Set right alignment if numeric and not a date\n if (isNumericColumn && !isDateColumn) {\n baseColumn.meta = {\n ...baseColumn.meta,\n align: 'right',\n type: 'number',\n };\n }\n\n return baseColumn;\n });\n\n // Create selection column if enabled\n const selectionColumn: ColumnDef<TData> | null = features.selection ? {\n id: 'select',\n header: ({ table }: HeaderContext<TData, unknown>) => {\n const isAllSelected = table.getIsAllPageRowsSelected();\n const isSomeSelected = table.getIsSomePageRowsSelected();\n return React.createElement(Checkbox, {\n checked: isAllSelected ? true : isSomeSelected ? 'indeterminate' : false,\n onCheckedChange: (value: boolean | 'indeterminate') => table.toggleAllPageRowsSelected(!!value),\n 'aria-label': \"Select all\"\n });\n },\n cell: ({ row }: CellContext<TData, unknown>) => {\n return React.createElement(Checkbox, {\n checked: row.getIsSelected(),\n onCheckedChange: (value: boolean | 'indeterminate') => row.toggleSelected(!!value),\n 'aria-label': \"Select row\"\n });\n },\n enableSorting: false,\n enableColumnFilter: false,\n enableGrouping: false,\n enableHiding: false,\n size: 50,\n minSize: 50,\n maxSize: 50,\n } : null;\n\n // Create actions column if there are actions\n const actionsColumn: ColumnDef<TData> | null = effectiveActions.length > 0 ? \n ColumnFactory.createActionColumn(effectiveActions, {\n header: 'Actions',\n size: 1, // Shrink to fit content\n minSize: 0,\n maxSize: 0,\n meta: { align: 'right' },\n }) : null;\n\n // Build final columns array - selection ALWAYS first, actions ALWAYS last\n const finalColumns: ColumnDef<TData>[] = [];\n \n // ALWAYS add selection column first if it exists (regardless of columnOrder)\n if (selectionColumn) {\n finalColumns.push(selectionColumn);\n }\n \n if (columnOrder && columnOrder.length > 0) {\n // Create set of used column IDs (excluding 'select' and 'actions' which are handled separately)\n const usedColumnIds = new Set(\n columnOrder.filter(id => id !== 'select' && id !== 'actions')\n );\n \n // Process columnOrder, skipping 'select' and 'actions' (handled separately)\n for (const columnId of columnOrder) {\n if (columnId === 'select') {\n // Skip - already added first\n continue;\n } else if (columnId === 'actions' && actionsColumn) {\n // Will be added at the end\n continue;\n } else {\n // Find the data column by id or accessorKey\n const dataColumn = baseColumns.find(col => \n col.id === columnId || ('accessorKey' in col && String(col.accessorKey) === columnId)\n );\n if (dataColumn) {\n finalColumns.push(dataColumn);\n }\n }\n }\n \n // Add any remaining data columns that weren't in the columnOrder\n const remainingDataColumns = baseColumns.filter(col => {\n const colId = col.id ? String(col.id) : ('accessorKey' in col ? String(col.accessorKey) : '');\n return !usedColumnIds.has(colId);\n });\n finalColumns.push(...remainingDataColumns);\n \n // Add actions column last if it exists (regardless of columnOrder position)\n if (actionsColumn) {\n finalColumns.push(actionsColumn);\n }\n } else {\n // No columnOrder provided: selection (already added), then data columns, then actions\n finalColumns.push(...baseColumns);\n if (actionsColumn) {\n finalColumns.push(actionsColumn);\n }\n }\n\n return finalColumns;\n }, [columns, features, effectiveActions, columnOrder]);\n\n return {\n enhancedColumns\n };\n}\n\n","/**\n * @file Column Factory\n * @package @jmruthers/pace-core\n * @module Components/DataTable/Architecture/Factories\n * @since 0.3.0\n */\n\nimport { createColumnHelper, type ColumnDef } from '@tanstack/react-table';\nimport type { DataRecord, DataTableAction } from '../types';\n\n// ============================================================================\n// COLUMN OPTIONS INTERFACES\n// ============================================================================\n\n/**\n * Options for text column configuration.\n */\nexport interface TextColumnOptions {\n label?: string;\n sortable?: boolean;\n filterable?: boolean;\n groupable?: boolean;\n hideable?: boolean;\n render?: (value: unknown) => React.ReactNode;\n footer?: React.ReactNode;\n size?: number;\n minSize?: number;\n maxSize?: number;\n}\n\n/**\n * Options for number column configuration.\n * Extends TextColumnOptions with number-specific formatting.\n */\nexport interface NumberColumnOptions extends TextColumnOptions {\n format?: (value: number) => string;\n}\n\n/**\n * Options for date column configuration.\n * Extends TextColumnOptions with date-specific formatting and locale options.\n */\nexport interface DateColumnOptions extends TextColumnOptions {\n format?: (date: Date) => string;\n locale?: string;\n dateOptions?: Intl.DateTimeFormatOptions;\n}\n\n/**\n * Options for boolean column configuration.\n * Extends TextColumnOptions with boolean-specific rendering.\n */\nexport interface BooleanColumnOptions extends Omit<TextColumnOptions, 'render'> {\n render?: (value: boolean) => React.ReactNode;\n}\n\n/**\n * Options for action column configuration.\n * Defines how action buttons are rendered in table rows.\n */\nexport interface ActionColumnOptions {\n header?: string;\n render?: (row: DataRecord, actions: DataTableAction<DataRecord>[]) => React.ReactNode;\n size?: number;\n minSize?: number;\n maxSize?: number;\n meta?: {\n align?: 'left' | 'right' | 'center';\n [key: string]: unknown;\n };\n}\n\n/**\n * Options for custom column configuration.\n * Allows full control over column rendering and behavior.\n * \n * @template TData - The type of data records in the table\n */\nexport interface CustomColumnOptions<TData extends DataRecord> {\n header?: string;\n cell?: (info: unknown) => React.ReactNode;\n enableSorting?: boolean;\n enableColumnFilter?: boolean;\n enableGrouping?: boolean;\n enableHiding?: boolean;\n footer?: React.ReactNode;\n size?: number;\n minSize?: number;\n maxSize?: number;\n}\n\n/**\n * Column configuration interface.\n * Defines the structure for creating columns programmatically.\n * \n * @template TData - The type of data records in the table\n */\nexport interface ColumnConfig<TData extends DataRecord> {\n key: keyof TData | string;\n type: 'text' | 'number' | 'date' | 'boolean' | 'custom';\n options?: TextColumnOptions | NumberColumnOptions | DateColumnOptions | BooleanColumnOptions | CustomColumnOptions<TData>;\n}\n\n// ============================================================================\n// COLUMN FACTORY CLASS\n// ============================================================================\n\nexport class ColumnFactory<TData extends DataRecord = DataRecord> {\n /**\n * Create a text column\n */\n static createTextColumn<TData extends DataRecord>(\n key: keyof TData | string,\n options: TextColumnOptions = {}\n ): ColumnDef<TData> {\n return {\n id: String(key),\n accessorKey: String(key),\n header: options.label || String(key),\n enableSorting: options.sortable ?? true,\n enableColumnFilter: options.filterable ?? true,\n enableGrouping: options.groupable ?? false,\n enableHiding: options.hideable ?? true,\n cell: options.render ? ({ getValue }) => options.render!(getValue()) : undefined,\n footer: options.footer,\n size: options.size,\n minSize: options.minSize,\n maxSize: options.maxSize,\n } as ColumnDef<TData>;\n }\n\n /**\n * Create a number column\n */\n static createNumberColumn<TData extends DataRecord>(\n key: keyof TData | string,\n options: NumberColumnOptions = {}\n ): ColumnDef<TData> {\n return {\n id: String(key),\n accessorKey: String(key),\n header: options.label || String(key),\n enableSorting: options.sortable ?? true,\n enableColumnFilter: options.filterable ?? true,\n enableGrouping: options.groupable ?? true,\n enableHiding: options.hideable ?? true,\n cell: ({ getValue }) => {\n const value = getValue();\n if (options.format && typeof value === 'number') {\n return options.format(value);\n }\n return typeof value === 'number' ? value.toLocaleString() : value;\n },\n footer: options.footer,\n size: options.size,\n minSize: options.minSize,\n maxSize: options.maxSize,\n meta: {\n align: 'right' as const,\n type: 'number' as const,\n },\n } as ColumnDef<TData>;\n }\n\n /**\n * Create a date column\n */\n static createDateColumn<TData extends DataRecord>(\n key: keyof TData | string,\n options: DateColumnOptions = {}\n ): ColumnDef<TData> {\n return {\n id: String(key),\n accessorKey: String(key),\n header: options.label || String(key),\n enableSorting: options.sortable ?? true,\n enableColumnFilter: options.filterable ?? true,\n enableGrouping: options.groupable ?? true,\n enableHiding: options.hideable ?? true,\n cell: ({ getValue }) => {\n const value = getValue();\n if (!value) return '';\n \n const date = new Date(String(value));\n if (isNaN(date.getTime())) return String(value);\n \n if (options.format) {\n return options.format(date);\n }\n \n return date.toLocaleDateString(options.locale, options.dateOptions);\n },\n footer: options.footer,\n size: options.size,\n minSize: options.minSize,\n maxSize: options.maxSize,\n } as ColumnDef<TData>;\n }\n\n /**\n * Create a boolean column\n */\n static createBooleanColumn<TData extends DataRecord>(\n key: keyof TData | string,\n options: BooleanColumnOptions = {}\n ): ColumnDef<TData> {\n return {\n id: String(key),\n accessorKey: String(key),\n header: options.label || String(key),\n enableSorting: options.sortable ?? true,\n enableColumnFilter: options.filterable ?? true,\n enableGrouping: options.groupable ?? true,\n enableHiding: options.hideable ?? true,\n cell: ({ getValue }) => {\n const value = getValue();\n if (options.render && typeof value === 'boolean') {\n return options.render(value);\n }\n return value ? 'Yes' : 'No';\n },\n footer: options.footer,\n size: options.size,\n minSize: options.minSize,\n maxSize: options.maxSize,\n } as ColumnDef<TData>;\n }\n\n /**\n * Create an action column\n */\n static createActionColumn<TData extends DataRecord>(\n actions: DataTableAction<TData>[],\n options: ActionColumnOptions = {}\n ): ColumnDef<TData> {\n return {\n id: 'actions',\n header: options.header || 'Actions',\n enableSorting: false,\n enableColumnFilter: false,\n enableGrouping: false,\n enableHiding: false,\n cell: ({ row }) => {\n if (options.render) {\n return options.render(row.original, actions as DataTableAction<DataRecord>[]);\n }\n \n // Return a simple object that can be rendered by the component\n return {\n type: 'actions',\n actions,\n row: row.original,\n };\n },\n size: options.size || 150,\n minSize: options.minSize || 100,\n maxSize: options.maxSize || 200,\n meta: options.meta,\n } as ColumnDef<TData>;\n }\n\n /**\n * Create a custom column\n */\n static createCustomColumn<TData extends DataRecord>(\n key: keyof TData | string,\n options: CustomColumnOptions<TData> = {}\n ): ColumnDef<TData> {\n return {\n id: String(key),\n accessorKey: String(key),\n header: options.header || String(key),\n enableSorting: options.enableSorting ?? false,\n enableColumnFilter: options.enableColumnFilter ?? false,\n enableGrouping: options.enableGrouping ?? false,\n enableHiding: options.enableHiding ?? true,\n cell: options.cell,\n footer: options.footer,\n size: options.size,\n minSize: options.minSize,\n maxSize: options.maxSize,\n } as ColumnDef<TData>;\n }\n\n /**\n * Create columns from simple configuration\n */\n static createColumnsFromConfig<TData extends DataRecord>(\n config: ColumnConfig<TData>[]\n ): ColumnDef<TData>[] {\n return config.map(col => {\n switch (col.type) {\n case 'text':\n return this.createTextColumn(col.key, col.options as TextColumnOptions);\n case 'number':\n return this.createNumberColumn(col.key, col.options as NumberColumnOptions);\n case 'date':\n return this.createDateColumn(col.key, col.options as DateColumnOptions);\n case 'boolean':\n return this.createBooleanColumn(col.key, col.options as BooleanColumnOptions);\n case 'custom':\n return this.createCustomColumn(col.key, col.options as CustomColumnOptions<TData>);\n default:\n return this.createTextColumn(col.key, col.options as TextColumnOptions);\n }\n });\n }\n} ","/**\n * @file Keyboard Navigation Hook for DataTable\n * @package @jmruthers/pace-core\n * @module Components/DataTable/Hooks\n * @since 0.4.0\n * \n * Comprehensive keyboard navigation and focus management for DataTable.\n * Implements roving tabindex pattern for efficient keyboard navigation.\n */\n\nimport { useCallback, useEffect, useRef, useState } from 'react';\nimport { announce } from '../utils/a11yUtils';\n\nexport interface KeyboardNavigationOptions {\n /** Whether keyboard navigation is enabled */\n enabled?: boolean;\n /** Whether to announce navigation changes */\n announceNavigation?: boolean;\n /** Whether column reordering is supported */\n supportsColumnReorder?: boolean;\n /** Whether column resizing is supported */\n supportsColumnResize?: boolean;\n /** Callback when focus moves to a new cell */\n onFocusChange?: (rowIndex: number, columnIndex: number) => void;\n /** Table ref for DOM queries */\n tableRef?: React.RefObject<HTMLTableElement | null>;\n}\n\nexport interface KeyboardNavigationState {\n /** Current focused row index */\n focusedRowIndex: number;\n /** Current focused column index */\n focusedColumnIndex: number;\n /** Whether keyboard navigation is active */\n isNavigating: boolean;\n}\n\nexport interface UseKeyboardNavigationReturn {\n /** Current navigation state */\n state: KeyboardNavigationState;\n /** Focus a specific cell */\n focusCell: (rowIndex: number, columnIndex: number) => void;\n /** Move focus to next cell */\n focusNext: () => void;\n /** Move focus to previous cell */\n focusPrevious: () => void;\n /** Move focus up one row */\n focusUp: () => void;\n /** Move focus down one row */\n focusDown: () => void;\n /** Move focus to first cell in row */\n focusRowStart: () => void;\n /** Move focus to last cell in row */\n focusRowEnd: () => void;\n /** Move focus to first row */\n focusTableStart: () => void;\n /** Move focus to last row */\n focusTableEnd: () => void;\n /** Get tabindex for a cell */\n getCellTabIndex: (rowIndex: number, columnIndex: number) => number;\n /** Get keyboard event handlers for a cell */\n getCellKeyboardHandlers: (rowIndex: number, columnIndex: number) => {\n onKeyDown: (event: React.KeyboardEvent) => void;\n onFocus: (event: React.FocusEvent) => void;\n onBlur: (event: React.FocusEvent) => void;\n };\n /** Get keyboard event handlers for headers */\n getHeaderKeyboardHandlers: (columnIndex: number, onSort?: () => void) => {\n onKeyDown: (event: React.KeyboardEvent) => void;\n onFocus: (event: React.FocusEvent) => void;\n };\n /** Reset focus state */\n resetFocus: () => void;\n /** Store focus for restoration */\n storeFocus: () => void;\n /** Restore previously stored focus */\n restoreFocus: () => void;\n}\n\n/**\n * Hook for managing keyboard navigation in DataTable\n */\nexport function useKeyboardNavigation(\n rowCount: number,\n columnCount: number,\n options: KeyboardNavigationOptions = {}\n): UseKeyboardNavigationReturn {\n const {\n enabled = true,\n announceNavigation = true,\n supportsColumnReorder = false,\n supportsColumnResize = false,\n onFocusChange,\n tableRef: externalTableRef,\n } = options;\n\n // Navigation state\n const [state, setState] = useState<KeyboardNavigationState>({\n focusedRowIndex: 0,\n focusedColumnIndex: 0,\n isNavigating: false,\n });\n\n // Refs for focus management\n const internalTableRef = useRef<HTMLTableElement>(null);\n const tableRef = externalTableRef || internalTableRef;\n const storedFocusRef = useRef<{ rowIndex: number; columnIndex: number } | null>(null);\n const navigationTimeoutRef = useRef<NodeJS.Timeout>(undefined);\n\n // Helper to get cell element\n const getCellElement = useCallback((rowIndex: number, columnIndex: number): HTMLElement | null => {\n if (!tableRef.current) return null;\n \n const tbody = tableRef.current.querySelector('tbody');\n if (!tbody) return null;\n \n const rows = tbody.querySelectorAll('tr[role=\"row\"]');\n const row = rows[rowIndex];\n if (!row) return null;\n \n const cells = row.querySelectorAll('td[role=\"cell\"], th[role=\"columnheader\"]');\n return cells[columnIndex] as HTMLElement || null;\n }, []);\n\n // Helper to get header element\n const getHeaderElement = useCallback((columnIndex: number): HTMLElement | null => {\n if (!tableRef.current) return null;\n \n const thead = tableRef.current.querySelector('thead');\n if (!thead) return null;\n \n const headerRow = thead.querySelector('tr[role=\"row\"]');\n if (!headerRow) return null;\n \n const headers = headerRow.querySelectorAll('th[role=\"columnheader\"]');\n return headers[columnIndex] as HTMLElement || null;\n }, []);\n\n // Focus a specific cell\n const focusCell = useCallback((rowIndex: number, columnIndex: number) => {\n if (!enabled) return;\n \n // Clamp values to valid range\n const clampedRowIndex = Math.max(0, Math.min(rowIndex, rowCount - 1));\n const clampedColumnIndex = Math.max(0, Math.min(columnIndex, columnCount - 1));\n \n setState(prev => ({\n ...prev,\n focusedRowIndex: clampedRowIndex,\n focusedColumnIndex: clampedColumnIndex,\n isNavigating: true,\n }));\n \n // Focus the actual element\n const cellElement = getCellElement(clampedRowIndex, clampedColumnIndex);\n if (cellElement) {\n cellElement.focus();\n }\n \n // Notify callback\n onFocusChange?.(clampedRowIndex, clampedColumnIndex);\n \n // Announce navigation if enabled\n if (announceNavigation) {\n announce(`Row ${clampedRowIndex + 1}, Column ${clampedColumnIndex + 1}`);\n }\n }, [enabled, rowCount, columnCount, getCellElement, onFocusChange, announceNavigation]);\n\n // Navigation functions\n const focusNext = useCallback(() => {\n const { focusedRowIndex, focusedColumnIndex } = state;\n if (focusedColumnIndex < columnCount - 1) {\n focusCell(focusedRowIndex, focusedColumnIndex + 1);\n } else if (focusedRowIndex < rowCount - 1) {\n focusCell(focusedRowIndex + 1, 0);\n }\n }, [state, columnCount, rowCount, focusCell]);\n\n const focusPrevious = useCallback(() => {\n const { focusedRowIndex, focusedColumnIndex } = state;\n if (focusedColumnIndex > 0) {\n focusCell(focusedRowIndex, focusedColumnIndex - 1);\n } else if (focusedRowIndex > 0) {\n focusCell(focusedRowIndex - 1, columnCount - 1);\n }\n }, [state, columnCount, focusCell]);\n\n const focusUp = useCallback(() => {\n const { focusedRowIndex, focusedColumnIndex } = state;\n if (focusedRowIndex > 0) {\n focusCell(focusedRowIndex - 1, focusedColumnIndex);\n }\n }, [state, focusCell]);\n\n const focusDown = useCallback(() => {\n const { focusedRowIndex, focusedColumnIndex } = state;\n if (focusedRowIndex < rowCount - 1) {\n focusCell(focusedRowIndex + 1, focusedColumnIndex);\n }\n }, [state, rowCount, focusCell]);\n\n const focusRowStart = useCallback(() => {\n const { focusedRowIndex } = state;\n focusCell(focusedRowIndex, 0);\n }, [state, focusCell]);\n\n const focusRowEnd = useCallback(() => {\n const { focusedRowIndex } = state;\n focusCell(focusedRowIndex, columnCount - 1);\n }, [state, columnCount, focusCell]);\n\n const focusTableStart = useCallback(() => {\n focusCell(0, 0);\n }, [focusCell]);\n\n const focusTableEnd = useCallback(() => {\n focusCell(rowCount - 1, columnCount - 1);\n }, [rowCount, columnCount, focusCell]);\n\n // Get tabindex for roving tabindex pattern\n const getCellTabIndex = useCallback((rowIndex: number, columnIndex: number): number => {\n if (!enabled) return -1;\n \n // Only the focused cell should be tabbable\n return (state.focusedRowIndex === rowIndex && state.focusedColumnIndex === columnIndex) ? 0 : -1;\n }, [enabled, state.focusedRowIndex, state.focusedColumnIndex]);\n\n // Cell keyboard handlers\n const getCellKeyboardHandlers = useCallback((rowIndex: number, columnIndex: number) => {\n const onKeyDown = (event: React.KeyboardEvent) => {\n if (!enabled) return;\n \n switch (event.key) {\n case 'ArrowRight':\n event.preventDefault();\n if (event.ctrlKey || event.metaKey) {\n focusRowEnd();\n } else {\n focusNext();\n }\n break;\n \n case 'ArrowLeft':\n event.preventDefault();\n if (event.ctrlKey || event.metaKey) {\n focusRowStart();\n } else {\n focusPrevious();\n }\n break;\n \n case 'ArrowDown':\n event.preventDefault();\n if (event.ctrlKey || event.metaKey) {\n focusTableEnd();\n } else {\n focusDown();\n }\n break;\n \n case 'ArrowUp':\n event.preventDefault();\n if (event.ctrlKey || event.metaKey) {\n focusTableStart();\n } else {\n focusUp();\n }\n break;\n \n case 'Home':\n event.preventDefault();\n if (event.ctrlKey || event.metaKey) {\n focusTableStart();\n } else {\n focusRowStart();\n }\n break;\n \n case 'End':\n event.preventDefault();\n if (event.ctrlKey || event.metaKey) {\n focusTableEnd();\n } else {\n focusRowEnd();\n }\n break;\n \n case 'Tab':\n // Let Tab work normally for accessibility\n break;\n \n default:\n // Don't prevent default for other keys\n break;\n }\n };\n\n const onFocus = (event: React.FocusEvent) => {\n setState(prev => ({\n ...prev,\n focusedRowIndex: rowIndex,\n focusedColumnIndex: columnIndex,\n isNavigating: true,\n }));\n \n onFocusChange?.(rowIndex, columnIndex);\n };\n\n const onBlur = (event: React.FocusEvent) => {\n // Clear navigation state after a delay to allow for focus transitions\n if (navigationTimeoutRef.current) {\n clearTimeout(navigationTimeoutRef.current);\n }\n \n navigationTimeoutRef.current = setTimeout(() => {\n setState(prev => ({\n ...prev,\n isNavigating: false,\n }));\n }, 100);\n };\n\n return { onKeyDown, onFocus, onBlur };\n }, [enabled, focusNext, focusPrevious, focusUp, focusDown, focusRowStart, focusRowEnd, focusTableStart, focusTableEnd, onFocusChange]);\n\n // Header keyboard handlers\n const getHeaderKeyboardHandlers = useCallback((columnIndex: number, onSort?: () => void) => {\n const onKeyDown = (event: React.KeyboardEvent) => {\n if (!enabled) return;\n \n switch (event.key) {\n case 'Enter':\n case ' ':\n event.preventDefault();\n onSort?.();\n break;\n \n case 'ArrowRight':\n event.preventDefault();\n const nextHeader = getHeaderElement(columnIndex + 1);\n if (nextHeader) {\n nextHeader.focus();\n }\n break;\n \n case 'ArrowLeft':\n event.preventDefault();\n const prevHeader = getHeaderElement(columnIndex - 1);\n if (prevHeader) {\n prevHeader.focus();\n }\n break;\n \n case 'Home':\n event.preventDefault();\n const firstHeader = getHeaderElement(0);\n if (firstHeader) {\n firstHeader.focus();\n }\n break;\n \n case 'End':\n event.preventDefault();\n const lastHeader = getHeaderElement(columnCount - 1);\n if (lastHeader) {\n lastHeader.focus();\n }\n break;\n \n // Disable unsupported keyboard operations\n case 'r':\n if (!supportsColumnReorder && (event.ctrlKey || event.metaKey)) {\n event.preventDefault();\n announce('Column reordering is not supported');\n }\n break;\n \n case '=':\n case '+':\n case '-':\n if (!supportsColumnResize && (event.ctrlKey || event.metaKey)) {\n event.preventDefault();\n announce('Column resizing is not supported');\n }\n break;\n }\n };\n\n const onFocus = (event: React.FocusEvent) => {\n // Headers don't participate in cell navigation state\n };\n\n return { onKeyDown, onFocus };\n }, [enabled, getHeaderElement, columnCount, supportsColumnReorder, supportsColumnResize]);\n\n // Focus management functions\n const resetFocus = useCallback(() => {\n setState({\n focusedRowIndex: 0,\n focusedColumnIndex: 0,\n isNavigating: false,\n });\n }, []);\n\n const storeFocus = useCallback(() => {\n storedFocusRef.current = {\n rowIndex: state.focusedRowIndex,\n columnIndex: state.focusedColumnIndex,\n };\n }, [state.focusedRowIndex, state.focusedColumnIndex]);\n\n const restoreFocus = useCallback(() => {\n if (storedFocusRef.current) {\n const { rowIndex, columnIndex } = storedFocusRef.current;\n focusCell(rowIndex, columnIndex);\n storedFocusRef.current = null;\n }\n }, [focusCell]);\n\n // Cleanup on unmount\n useEffect(() => {\n return () => {\n if (navigationTimeoutRef.current) {\n clearTimeout(navigationTimeoutRef.current);\n }\n };\n }, []);\n\n return {\n state,\n focusCell,\n focusNext,\n focusPrevious,\n focusUp,\n focusDown,\n focusRowStart,\n focusRowEnd,\n focusTableStart,\n focusTableEnd,\n getCellTabIndex,\n getCellKeyboardHandlers,\n getHeaderKeyboardHandlers,\n resetFocus,\n storeFocus,\n restoreFocus,\n };\n}\n","import React from 'react';\nimport type { UseDataTablePermissionsReturn } from '../../hooks/useDataTablePermissions';\nimport type { createLogger } from '../../../../utils/core/logger';\n\ninterface PermissionTrackingParams {\n permissions: UseDataTablePermissionsReturn['permissions'];\n effectivePageId?: string;\n logger: ReturnType<typeof createLogger>;\n}\n\n/**\n * Result of permission tracking hook.\n * Provides timing information and loading state for permission checks.\n */\nexport interface PermissionTrackingResult {\n permissionElapsed: number;\n shouldAllowRenderAfterTimeout: boolean;\n isPermissionLoading: boolean;\n}\n\n/**\n * Hook for tracking permission check performance.\n * Monitors permission loading times and provides warnings for slow checks.\n * \n * @param params - Permission tracking configuration\n * @returns Permission tracking results including elapsed time and loading state\n */\nexport function usePermissionTracking({\n permissions,\n effectivePageId,\n logger,\n}: PermissionTrackingParams): PermissionTrackingResult {\n const permissionCheckStartTime = React.useRef<number | null>(null);\n const permissionTimeoutId = React.useRef<NodeJS.Timeout | null>(null);\n const permissionWarningTimeoutId = React.useRef<NodeJS.Timeout | null>(null);\n const hasStartedTracking = React.useRef<boolean>(false);\n const [permissionSlowWarning, setPermissionSlowWarning] = React.useState(false);\n\n React.useEffect(() => {\n if (permissions.canRead.isLoading && !hasStartedTracking.current) {\n hasStartedTracking.current = true;\n permissionCheckStartTime.current = Date.now();\n logger.debug('DataTable: Permission check started', {\n pageId: effectivePageId,\n timestamp: permissionCheckStartTime.current,\n });\n\n if (permissionWarningTimeoutId.current) {\n clearTimeout(permissionWarningTimeoutId.current);\n }\n if (permissionTimeoutId.current) {\n clearTimeout(permissionTimeoutId.current);\n }\n\n permissionWarningTimeoutId.current = setTimeout(() => {\n const elapsed = permissionCheckStartTime.current ? Date.now() - permissionCheckStartTime.current : 0;\n logger.warn('DataTable: Permission check taking longer than expected (>2s)', {\n pageId: effectivePageId,\n elapsedMs: elapsed,\n diagnostic: 'Permission checks should complete in <1s. This may indicate slow database queries or network issues.',\n });\n setPermissionSlowWarning(true);\n }, 2000);\n\n permissionTimeoutId.current = setTimeout(() => {\n const elapsed = permissionCheckStartTime.current ? Date.now() - permissionCheckStartTime.current : 0;\n logger.warn('DataTable: Permission check taking longer than expected (>5s)', {\n pageId: effectivePageId,\n elapsedMs: elapsed,\n permissionState: {\n isLoading: permissions.canRead.isLoading,\n can: permissions.canRead.can,\n error: permissions.canRead.error?.message,\n },\n diagnostic: 'This may indicate slow database queries or network issues. Check scope resolution and permission check performance.',\n });\n }, 5000);\n } else if (!permissions.canRead.isLoading && hasStartedTracking.current) {\n if (permissionCheckStartTime.current) {\n const elapsed = Date.now() - permissionCheckStartTime.current;\n if (elapsed > 1000) {\n logger.warn('DataTable: Permission check took longer than expected', {\n pageId: effectivePageId,\n elapsedMs: elapsed,\n can: permissions.canRead.can,\n });\n }\n permissionCheckStartTime.current = null;\n }\n\n hasStartedTracking.current = false;\n\n if (permissionWarningTimeoutId.current) {\n clearTimeout(permissionWarningTimeoutId.current);\n permissionWarningTimeoutId.current = null;\n }\n if (permissionTimeoutId.current) {\n clearTimeout(permissionTimeoutId.current);\n permissionTimeoutId.current = null;\n }\n setPermissionSlowWarning(false);\n }\n\n return () => {\n if (permissionWarningTimeoutId.current) {\n clearTimeout(permissionWarningTimeoutId.current);\n }\n if (permissionTimeoutId.current) {\n clearTimeout(permissionTimeoutId.current);\n }\n };\n }, [permissions.canRead.isLoading, effectivePageId, logger, permissions.canRead.can, permissions.canRead.error]);\n\n const permissionElapsed = permissionCheckStartTime.current ? Date.now() - permissionCheckStartTime.current : 0;\n const shouldAllowRenderAfterTimeout = permissionElapsed > 3000;\n\n if (permissionSlowWarning) {\n // state is only used for logging; keep hook returning derived values\n }\n\n return {\n permissionElapsed,\n shouldAllowRenderAfterTimeout,\n isPermissionLoading: permissions.canRead.isLoading && !shouldAllowRenderAfterTimeout,\n };\n}\n","import { useEffect, useRef } from 'react';\nimport type { UseKeyboardNavigationReturn } from '../../hooks/useKeyboardNavigation';\n\n/**\n * Hook for managing focus when the import modal opens/closes.\n * Stores and restores focus to maintain keyboard navigation flow.\n * \n * @param isImportOpen - Whether the import modal is currently open\n * @param keyboardNavigation - Keyboard navigation utilities\n * @returns Object with last focused element reference\n */\nexport function useImportModalFocus(isImportOpen: boolean, keyboardNavigation: UseKeyboardNavigationReturn) {\n const lastFocusedElementRef = useRef<HTMLElement | null>(null);\n const wasImportModalOpenRef = useRef(false);\n\n useEffect(() => {\n if (isImportOpen) {\n wasImportModalOpenRef.current = true;\n keyboardNavigation.storeFocus();\n if (document.activeElement instanceof HTMLElement) {\n lastFocusedElementRef.current = document.activeElement;\n }\n }\n }, [isImportOpen, keyboardNavigation]);\n\n useEffect(() => {\n if (isImportOpen) {\n return;\n }\n\n if (!wasImportModalOpenRef.current) {\n return;\n }\n\n wasImportModalOpenRef.current = false;\n setTimeout(() => {\n const storedElement = lastFocusedElementRef.current;\n lastFocusedElementRef.current = null;\n\n const elementToRestore = storedElement?.isConnected\n ? storedElement\n : document.querySelector<HTMLElement>('[data-restore-target=\"datatable-import-button\"]');\n\n if (elementToRestore && typeof elementToRestore.focus === 'function') {\n elementToRestore.focus();\n } else {\n keyboardNavigation.restoreFocus();\n }\n }, 100);\n }, [isImportOpen, keyboardNavigation]);\n\n return { lastFocusedElementRef };\n}\n","import type { CellValue, DataRecord } from '../types';\n\nconst isCellValue = (value: unknown): value is CellValue => {\n if (value === null || value === undefined) {\n return true;\n }\n\n if (value instanceof Date) {\n return true;\n }\n\n const valueType = typeof value;\n return valueType === 'string' || valueType === 'number' || valueType === 'boolean';\n};\n\n/**\n * Converts a data record to a cell value record.\n * Filters and converts values to valid cell values (string, number, boolean, Date, null, undefined).\n * \n * @template TData - The type of data records\n * @param row - The data record to convert\n * @returns A record with cell-compatible values\n */\nexport const toCellValueRecord = <TData extends DataRecord>(row: TData): Record<string, CellValue> => {\n if (typeof row !== 'object' || row === null) {\n return {};\n }\n\n return Object.entries(row).reduce<Record<string, CellValue>>((accumulator, [key, entryValue]) => {\n if (isCellValue(entryValue)) {\n accumulator[key] = entryValue;\n } else if (entryValue && typeof entryValue === 'object' && 'toString' in entryValue) {\n accumulator[key] = String(entryValue) as CellValue;\n } else {\n accumulator[key] = entryValue as CellValue;\n }\n\n return accumulator;\n }, {});\n};\n","/**\n * @file Bulk Operations Dropdown Component\n * @package @jmruthers/pace-core\n * @module Components/DataTable/Components\n * @since 0.4.0\n * \n * A dropdown component for bulk operations on selected rows in the DataTable.\n * Provides a clean interface for performing actions on multiple selected rows.\n * \n * Features:\n * - Dynamic operation list based on configuration\n * - Disabled state when no rows are selected\n * - Consistent styling with other toolbar components\n * - Accessible dropdown interface\n * - Clear operation feedback\n * \n * @example\n * ```tsx\n * <BulkOperationsDropdown\n * operations={['export', 'delete']}\n * selectedRows={rowSelection}\n * onOperation={(operation, rows) => {\n * switch (operation) {\n * case 'export': exportRows(rows); break;\n * case 'delete': deleteRows(rows); break;\n * }\n * }}\n * />\n * ```\n * \n * @accessibility\n * - Proper ARIA labels and descriptions\n * - Keyboard navigation support\n * - Screen reader friendly\n * - High contrast support\n * \n * @dependencies\n * - Select components (formerly DropdownMenu)\n * - Button component\n * - Lucide React icons\n * - React 19+ hooks\n */\n\nimport React from 'react';\nimport { \n Select, \n SelectContent, \n SelectItem, \n SelectTrigger \n} from '../../Select/Select';\nimport { Button } from '../../Button/Button';\nimport { \n MoreHorizontal, \n Download, \n Trash \n} from 'lucide-react';\n\n/**\n * Props for the BulkOperationsDropdown component\n */\nexport interface BulkOperationsDropdownProps {\n /** Available bulk operations */\n operations: ('delete' | 'export')[];\n /** Currently selected rows */\n selectedRows: Record<string, boolean>;\n /** Handler for bulk operations */\n onOperation?: (operation: string, selectedRows: any[]) => void;\n /** Custom class names */\n className?: string;\n}\n\n/**\n * Bulk operations dropdown for DataTable toolbar\n * \n * This component provides a dropdown menu for performing bulk operations\n * on selected rows. It automatically disables when no rows are selected\n * and provides clear visual feedback for each operation type.\n * \n * @param props - Component configuration\n * @returns JSX.Element - The rendered dropdown component\n */\nexport function BulkOperationsDropdown({\n operations,\n selectedRows = {},\n onOperation,\n className,\n}: BulkOperationsDropdownProps) {\n // Handle null/undefined selectedRows gracefully\n const safeSelectedRows = selectedRows || {};\n const hasSelection = Object.values(safeSelectedRows).some(Boolean);\n const selectedCount = Object.values(safeSelectedRows).filter(Boolean).length;\n\n // Icon mapping for operations\n const operationIcons = {\n export: Download,\n delete: Trash,\n };\n\n // Label mapping for operations\n const operationLabels = {\n export: 'Export Selected',\n delete: 'Delete',\n };\n\n // Variant mapping for operations\n const operationVariants = {\n export: 'outline',\n delete: 'destructive',\n } as const;\n\n const handleOperation = (operation: string) => {\n if (onOperation && hasSelection) {\n // Convert selectedRows to array of selected data\n const selectedData = Object.entries(selectedRows)\n .filter(([_, selected]) => selected)\n .map(([key, _]) => key);\n onOperation(operation, selectedData);\n }\n };\n\n return (\n <Select disabled={!hasSelection}>\n <SelectTrigger asChild>\n <Button \n variant=\"outline\" \n size=\"sm\"\n disabled={!hasSelection}\n className={`min-w-[140px] h-9 px-3 py-2 text-sm font-medium ${className || ''}`}\n >\n <MoreHorizontal className=\"size-4 mr-2 flex-shrink-0\" />\n <span className=\"truncate\">\n Bulk Actions ({selectedCount})\n </span>\n </Button>\n </SelectTrigger>\n <SelectContent className=\"w-48 !bg-main-50 border border-sec-200 shadow-lg z-[9999]\">\n {operations.map((operation) => {\n const Icon = operationIcons[operation];\n const label = operationLabels[operation];\n const variant = operationVariants[operation];\n\n return (\n <SelectItem\n key={operation}\n value={operation}\n onClick={() => handleOperation(operation)}\n disabled={!hasSelection}\n className={`flex items-center gap-2 ${\n variant === 'destructive' ? 'text-destructive focus:text-destructive' : ''\n }`}\n >\n <Icon className=\"size-4\" />\n <span>{label}</span>\n </SelectItem>\n );\n })}\n </SelectContent>\n </Select>\n );\n}\n","import React from 'react';\nimport { Row } from '@tanstack/react-table';\nimport { Button } from '../../Button/Button';\nimport { ChevronDown, ChevronRight } from 'lucide-react';\n\n/**\n * Props for the GroupHeader component.\n * @template TData - The type of data records in the table\n */\ninterface GroupHeaderProps<TData> {\n row: Row<TData>;\n groupByColumn: string;\n isExpanded: boolean;\n onToggle: () => void;\n subRowsCount: number;\n}\n\n/**\n * Group header component for DataTable.\n * Displays the group label and toggle button for expanding/collapsing grouped rows.\n * \n * @template TData - The type of data records in the table\n * @param props - Group header configuration\n * @returns The rendered group header\n */\nexport function GroupHeader<TData>({ \n row, \n groupByColumn, \n isExpanded, \n onToggle, \n subRowsCount \n}: GroupHeaderProps<TData>) {\n const groupValue = row.getValue(groupByColumn);\n \n return (\n <div className=\"flex items-center py-2 px-4 bg-muted/50 border-b font-medium\">\n <Button\n variant=\"ghost\"\n size=\"sm\"\n onClick={onToggle}\n className=\"p-0 h-auto mr-2\"\n >\n {isExpanded ? (\n <ChevronDown className=\"size-4\" />\n ) : (\n <ChevronRight className=\"size-4\" />\n )}\n </Button>\n <span className=\"text-sm\">\n {String(groupValue)} ({subRowsCount} items)\n </span>\n </div>\n );\n}\n","/**\n * @file Aggregation Utility Functions\n * @package @jmruthers/pace-core\n * @module Components/DataTable/Utils\n * @since 0.6.0\n * \n * Utility functions for common aggregation operations in grouped DataTable rows.\n * These functions can be used as the `aggregateFn` property in column definitions.\n */\n\nimport type { DataTableColumn, DataRecord } from '../types';\n\n/**\n * Creates a sum aggregation function for a specific field.\n * \n * @param accessorKey - The field key to sum (e.g., 'cost', 'quantity')\n * @returns An aggregation function that sums the specified field across all rows\n * \n * @example\n * ```tsx\n * {\n * accessorKey: 'cost',\n * header: 'Total Cost',\n * aggregateFn: sum('cost'),\n * }\n * ```\n */\nexport function sum<TData extends DataRecord = DataRecord>(accessorKey: keyof TData | string) {\n return <TRow extends DataRecord = TData>(rows: TRow[], column: DataTableColumn<TRow>): number => {\n return rows.reduce((total, row) => {\n const value = row[accessorKey as keyof TRow];\n const numValue = typeof value === 'number' ? value : parseFloat(String(value || 0));\n return total + (isNaN(numValue) ? 0 : numValue);\n }, 0);\n };\n}\n\n/**\n * Creates an average aggregation function for a specific field.\n * \n * @param accessorKey - The field key to average (e.g., 'price', 'rating')\n * @returns An aggregation function that calculates the average of the specified field across all rows\n * \n * @example\n * ```tsx\n * {\n * accessorKey: 'price',\n * header: 'Avg Price',\n * aggregateFn: average('price'),\n * }\n * ```\n */\nexport function average<TData extends DataRecord = DataRecord>(accessorKey: keyof TData | string) {\n return <TRow extends DataRecord = TData>(rows: TRow[], column: DataTableColumn<TRow>): number => {\n if (rows.length === 0) return 0;\n \n const validValues = rows\n .map(row => row[accessorKey as keyof TRow])\n .filter(value => value != null && value !== '')\n .map(value => {\n const numValue = typeof value === 'number' ? value : parseFloat(String(value));\n return isNaN(numValue) ? null : numValue;\n })\n .filter((value): value is number => value !== null);\n \n if (validValues.length === 0) return 0;\n \n const sum = validValues.reduce((total, value) => total + value, 0);\n return sum / validValues.length;\n };\n}\n\n/**\n * Creates a count aggregation function.\n * Returns the number of rows in the group.\n * \n * @returns An aggregation function that counts the number of rows\n * \n * @example\n * ```tsx\n * {\n * accessorKey: 'id',\n * header: 'Count',\n * aggregateFn: count(),\n * }\n * ```\n */\nexport function count<TData extends DataRecord = DataRecord>() {\n return <TRow extends DataRecord = TData>(rows: TRow[], column: DataTableColumn<TRow>): number => {\n return rows.length;\n };\n}\n\n/**\n * Creates a minimum aggregation function for a specific field.\n * \n * @param accessorKey - The field key to find the minimum of (e.g., 'price', 'date')\n * @returns An aggregation function that returns the minimum value of the specified field\n * \n * @example\n * ```tsx\n * {\n * accessorKey: 'price',\n * header: 'Min Price',\n * aggregateFn: min('price'),\n * }\n * ```\n */\nexport function min<TData extends DataRecord = DataRecord>(accessorKey: keyof TData | string) {\n return <TRow extends DataRecord = TData>(rows: TRow[], column: DataTableColumn<TRow>): number | null => {\n if (rows.length === 0) return null;\n \n const validValues = rows\n .map(row => row[accessorKey as keyof TRow])\n .filter(value => value != null && value !== '')\n .map(value => {\n const numValue = typeof value === 'number' ? value : parseFloat(String(value));\n return isNaN(numValue) ? null : numValue;\n })\n .filter((value): value is number => value !== null);\n \n if (validValues.length === 0) return null;\n \n return Math.min(...validValues);\n };\n}\n\n/**\n * Creates a maximum aggregation function for a specific field.\n * \n * @param accessorKey - The field key to find the maximum of (e.g., 'price', 'date')\n * @returns An aggregation function that returns the maximum value of the specified field\n * \n * @example\n * ```tsx\n * {\n * accessorKey: 'price',\n * header: 'Max Price',\n * aggregateFn: max('price'),\n * }\n * ```\n */\nexport function max<TData extends DataRecord = DataRecord>(accessorKey: keyof TData | string) {\n return <TRow extends DataRecord = TData>(rows: TRow[], column: DataTableColumn<TRow>): number | null => {\n if (rows.length === 0) return null;\n \n const validValues = rows\n .map(row => row[accessorKey as keyof TRow])\n .filter(value => value != null && value !== '')\n .map(value => {\n const numValue = typeof value === 'number' ? value : parseFloat(String(value));\n return isNaN(numValue) ? null : numValue;\n })\n .filter((value): value is number => value !== null);\n \n if (validValues.length === 0) return null;\n \n return Math.max(...validValues);\n };\n}\n\n"],"mappings":"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","names":["React","useMemo","useCallback","useEffect","useRef","Edit","Trash","React","ChevronDown","React","jsx","jsxs","jsx","sizeClasses","jsx","React","jsx","React","React","React","React","React","React","jsx","jsxs","jsx","jsxs","React","Check","jsx","Check","jsx","jsxs","jsx","jsxs","useEffect","useRef","Search","Plus","jsx","jsxs","Search","Plus","React","X","React","jsx","jsxs","X","jsx","React","React","useEffect","useMemo","useRef","flexRender","ChevronDown","React","useMemo","jsx","jsxs","useMemo","React","React","X","Check","jsx","jsxs","logger","React","Check","X","jsx","jsxs","useRef","logger","useEffect","useMemo","ChevronDown","flexRender","React","React","jsx","jsxs","SelectEditField","logger","React","renderEditField","jsx","jsxs","logger","useRef","useEffect","renderEditField","React","ChevronRight","Database","logger","Fragment","jsx","jsxs","Database","ChevronRight","React","useEffect","useState","useRef","useEffect","React","X","useState","useEffect","Fragment","jsx","jsxs","result","X","React","jsx","max","Upload","jsx","jsxs","logger","useState","useRef","useEffect","result","Upload","Fragment","jsx","logger","useEffect","count","logger","Fragment","jsx","jsxs","logger","visibleColumns","ChevronDown","data","React","React","React","jsx","Fragment","jsx","jsxs","useState","useEffect","useCallback","logger","useState","useEffect","useCallback","useState","useEffect","useCallback","logger","useState","useEffect","useCallback","useCallback","useMemo","useMemo","useState","useCallback","useMemo","useEffect","useMemo","useCallback","useEffect","useMemo","useCallback","useMemo","useMemo","React","jsx","sizeClasses","Fragment","jsx","jsxs","useMemo","useRef","useState","useEffect","logger","useState","useRef","useEffect","useMemo","React","useMemo","useMemo","React","useCallback","useEffect","useRef","useState","useState","useRef","useCallback","useEffect","React","logger","useEffect","useRef","jsx","logger","useMemo","useEffect","useCallback","useRef","Edit","result","Trash","jsx","logger","React","MoreHorizontal","Download","Trash","jsx","jsxs","ChevronDown","ChevronRight","jsx","jsxs","sum"]}