@jmruthers/pace-core 0.2.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 (1009) hide show
  1. package/CHANGELOG.md +202 -0
  2. package/README.md +299 -0
  3. package/dist/DataTable-BHlzyKZP.d.ts +116 -0
  4. package/dist/DataTable-GEY5U7OI.js +100 -0
  5. package/dist/DataTable-GEY5U7OI.js.map +1 -0
  6. package/dist/PublicLoadingSpinner-DztrzuJr.d.ts +3430 -0
  7. package/dist/UnifiedAuthProvider-w66zSCUf.d.ts +160 -0
  8. package/dist/api-GZHIDA4X.js +41 -0
  9. package/dist/api-GZHIDA4X.js.map +1 -0
  10. package/dist/appConfig-BVGyuvI7.d.ts +71 -0
  11. package/dist/appNameResolver-7GHF5ED2.js +22 -0
  12. package/dist/appNameResolver-7GHF5ED2.js.map +1 -0
  13. package/dist/audit-BUW3LMJB.js +16 -0
  14. package/dist/audit-BUW3LMJB.js.map +1 -0
  15. package/dist/chunk-22KLBHPS.js +29 -0
  16. package/dist/chunk-22KLBHPS.js.map +1 -0
  17. package/dist/chunk-24MKLB7U.js +81 -0
  18. package/dist/chunk-24MKLB7U.js.map +1 -0
  19. package/dist/chunk-2MKP6IYD.js +388 -0
  20. package/dist/chunk-2MKP6IYD.js.map +1 -0
  21. package/dist/chunk-2V3Y6YBC.js +114 -0
  22. package/dist/chunk-2V3Y6YBC.js.map +1 -0
  23. package/dist/chunk-5CDJCTOO.js +190 -0
  24. package/dist/chunk-5CDJCTOO.js.map +1 -0
  25. package/dist/chunk-6ZQVSHKL.js +1345 -0
  26. package/dist/chunk-6ZQVSHKL.js.map +1 -0
  27. package/dist/chunk-74C6SNEC.js +77 -0
  28. package/dist/chunk-74C6SNEC.js.map +1 -0
  29. package/dist/chunk-7BNPOCLL.js +178 -0
  30. package/dist/chunk-7BNPOCLL.js.map +1 -0
  31. package/dist/chunk-7JL3T7BO.js +3344 -0
  32. package/dist/chunk-7JL3T7BO.js.map +1 -0
  33. package/dist/chunk-CDQ3PX7L.js +18 -0
  34. package/dist/chunk-CDQ3PX7L.js.map +1 -0
  35. package/dist/chunk-DY5E3AT7.js +1734 -0
  36. package/dist/chunk-DY5E3AT7.js.map +1 -0
  37. package/dist/chunk-ETEJVKYK.js +6032 -0
  38. package/dist/chunk-ETEJVKYK.js.map +1 -0
  39. package/dist/chunk-I5Z3QH5X.js +32 -0
  40. package/dist/chunk-I5Z3QH5X.js.map +1 -0
  41. package/dist/chunk-MZBUOP4P.js +119 -0
  42. package/dist/chunk-MZBUOP4P.js.map +1 -0
  43. package/dist/chunk-N2EUGZRW.js +98 -0
  44. package/dist/chunk-N2EUGZRW.js.map +1 -0
  45. package/dist/chunk-NQ4TOOO6.js +20 -0
  46. package/dist/chunk-NQ4TOOO6.js.map +1 -0
  47. package/dist/chunk-OHXGNT3K.js +21 -0
  48. package/dist/chunk-OHXGNT3K.js.map +1 -0
  49. package/dist/chunk-OKXMUYIB.js +522 -0
  50. package/dist/chunk-OKXMUYIB.js.map +1 -0
  51. package/dist/chunk-PFRRIDYA.js +382 -0
  52. package/dist/chunk-PFRRIDYA.js.map +1 -0
  53. package/dist/chunk-PLDDJCW6.js +49 -0
  54. package/dist/chunk-PLDDJCW6.js.map +1 -0
  55. package/dist/chunk-SS3E6QLB.js +695 -0
  56. package/dist/chunk-SS3E6QLB.js.map +1 -0
  57. package/dist/chunk-TMRLB2LA.js +326 -0
  58. package/dist/chunk-TMRLB2LA.js.map +1 -0
  59. package/dist/chunk-WYB6MBZA.js +5533 -0
  60. package/dist/chunk-WYB6MBZA.js.map +1 -0
  61. package/dist/chunk-YDJW5XTN.js +84 -0
  62. package/dist/chunk-YDJW5XTN.js.map +1 -0
  63. package/dist/components.d.ts +1308 -0
  64. package/dist/components.js +3759 -0
  65. package/dist/components.js.map +1 -0
  66. package/dist/database-C3Szpi5J.d.ts +470 -0
  67. package/dist/hooks.d.ts +449 -0
  68. package/dist/hooks.js +612 -0
  69. package/dist/hooks.js.map +1 -0
  70. package/dist/index.d.ts +385 -0
  71. package/dist/index.js +569 -0
  72. package/dist/index.js.map +1 -0
  73. package/dist/organisation-CO3Sh3_D.d.ts +99 -0
  74. package/dist/providers.d.ts +45 -0
  75. package/dist/providers.js +36 -0
  76. package/dist/providers.js.map +1 -0
  77. package/dist/rbac/eslint-rules.d.ts +52 -0
  78. package/dist/rbac/eslint-rules.js +252 -0
  79. package/dist/rbac/eslint-rules.js.map +1 -0
  80. package/dist/rbac/index.d.ts +1918 -0
  81. package/dist/rbac/index.js +2212 -0
  82. package/dist/rbac/index.js.map +1 -0
  83. package/dist/styles/core.css +401 -0
  84. package/dist/styles/fonts/georama-italic.woff2 +0 -0
  85. package/dist/styles/fonts/georama.woff2 +0 -0
  86. package/dist/styles/fonts/open-sans-italic.woff2 +0 -0
  87. package/dist/styles/fonts/open-sans.woff2 +0 -0
  88. package/dist/styles/fonts/reddit-mono.woff2 +0 -0
  89. package/dist/styles/index.d.ts +36 -0
  90. package/dist/styles/index.js +24 -0
  91. package/dist/styles/index.js.map +1 -0
  92. package/dist/theming/runtime.d.ts +73 -0
  93. package/dist/theming/runtime.js +16 -0
  94. package/dist/theming/runtime.js.map +1 -0
  95. package/dist/types-CInEi-ng.d.ts +316 -0
  96. package/dist/types.d.ts +196 -0
  97. package/dist/types.js +83 -0
  98. package/dist/types.js.map +1 -0
  99. package/dist/unified-CM7T0aTK.d.ts +198 -0
  100. package/dist/useComponentPerformance-DE9l5RkL.d.ts +11 -0
  101. package/dist/usePublicRouteParams-B6i0KtXW.d.ts +477 -0
  102. package/dist/utils.d.ts +639 -0
  103. package/dist/utils.js +1103 -0
  104. package/dist/utils.js.map +1 -0
  105. package/dist/validation-PM_iOaTI.d.ts +159 -0
  106. package/dist/validation.d.ts +138 -0
  107. package/dist/validation.js +477 -0
  108. package/dist/validation.js.map +1 -0
  109. package/docs/INDEX.md +192 -0
  110. package/docs/README.md +165 -0
  111. package/docs/api/.nojekyll +1 -0
  112. package/docs/api/README.md +301 -0
  113. package/docs/api/classes/ErrorBoundary.md +144 -0
  114. package/docs/api/classes/PublicErrorBoundary.md +132 -0
  115. package/docs/api/interfaces/AggregateConfig.md +43 -0
  116. package/docs/api/interfaces/ButtonProps.md +53 -0
  117. package/docs/api/interfaces/CardProps.md +40 -0
  118. package/docs/api/interfaces/ColorPalette.md +7 -0
  119. package/docs/api/interfaces/ColorShade.md +41 -0
  120. package/docs/api/interfaces/DataTableAction.md +200 -0
  121. package/docs/api/interfaces/DataTableColumn.md +300 -0
  122. package/docs/api/interfaces/DataTableProps.md +517 -0
  123. package/docs/api/interfaces/DataTableToolbarButton.md +96 -0
  124. package/docs/api/interfaces/EmptyStateConfig.md +61 -0
  125. package/docs/api/interfaces/EventContextType.md +96 -0
  126. package/docs/api/interfaces/EventLogoProps.md +152 -0
  127. package/docs/api/interfaces/EventProviderProps.md +19 -0
  128. package/docs/api/interfaces/FileSizeLimits.md +7 -0
  129. package/docs/api/interfaces/FileUploadProps.md +154 -0
  130. package/docs/api/interfaces/FooterProps.md +105 -0
  131. package/docs/api/interfaces/InactivityWarningModalProps.md +115 -0
  132. package/docs/api/interfaces/InputProps.md +53 -0
  133. package/docs/api/interfaces/LabelProps.md +107 -0
  134. package/docs/api/interfaces/LoginFormProps.md +184 -0
  135. package/docs/api/interfaces/NavigationItem.md +176 -0
  136. package/docs/api/interfaces/NavigationMenuProps.md +236 -0
  137. package/docs/api/interfaces/Organisation.md +140 -0
  138. package/docs/api/interfaces/OrganisationContextType.md +377 -0
  139. package/docs/api/interfaces/OrganisationMembership.md +140 -0
  140. package/docs/api/interfaces/OrganisationProviderProps.md +19 -0
  141. package/docs/api/interfaces/OrganisationSecurityError.md +62 -0
  142. package/docs/api/interfaces/PaceAppLayoutProps.md +393 -0
  143. package/docs/api/interfaces/PaceLoginPageProps.md +34 -0
  144. package/docs/api/interfaces/PaletteData.md +41 -0
  145. package/docs/api/interfaces/PublicErrorBoundaryProps.md +94 -0
  146. package/docs/api/interfaces/PublicErrorBoundaryState.md +68 -0
  147. package/docs/api/interfaces/PublicLoadingSpinnerProps.md +86 -0
  148. package/docs/api/interfaces/PublicPageFooterProps.md +112 -0
  149. package/docs/api/interfaces/PublicPageHeaderProps.md +138 -0
  150. package/docs/api/interfaces/PublicPageLayoutProps.md +138 -0
  151. package/docs/api/interfaces/StorageConfig.md +41 -0
  152. package/docs/api/interfaces/StorageFileInfo.md +74 -0
  153. package/docs/api/interfaces/StorageFileMetadata.md +140 -0
  154. package/docs/api/interfaces/StorageListOptions.md +86 -0
  155. package/docs/api/interfaces/StorageListResult.md +41 -0
  156. package/docs/api/interfaces/StorageUploadOptions.md +88 -0
  157. package/docs/api/interfaces/StorageUploadResult.md +63 -0
  158. package/docs/api/interfaces/StorageUrlOptions.md +47 -0
  159. package/docs/api/interfaces/StyleImport.md +19 -0
  160. package/docs/api/interfaces/ToastActionElement.md +9 -0
  161. package/docs/api/interfaces/ToastProps.md +9 -0
  162. package/docs/api/interfaces/UnifiedAuthContextType.md +1108 -0
  163. package/docs/api/interfaces/UnifiedAuthProviderProps.md +171 -0
  164. package/docs/api/interfaces/UseInactivityTrackerOptions.md +136 -0
  165. package/docs/api/interfaces/UseInactivityTrackerReturn.md +123 -0
  166. package/docs/api/interfaces/UsePublicEventLogoOptions.md +87 -0
  167. package/docs/api/interfaces/UsePublicEventLogoReturn.md +81 -0
  168. package/docs/api/interfaces/UsePublicEventOptions.md +34 -0
  169. package/docs/api/interfaces/UsePublicEventReturn.md +68 -0
  170. package/docs/api/interfaces/UsePublicRouteParamsReturn.md +94 -0
  171. package/docs/api/interfaces/UserEventAccess.md +118 -0
  172. package/docs/api/interfaces/UserMenuProps.md +86 -0
  173. package/docs/api/interfaces/UserProfile.md +63 -0
  174. package/docs/api/modules.md +4153 -0
  175. package/docs/api-reference/components.md +1623 -0
  176. package/docs/api-reference/hooks.md +627 -0
  177. package/docs/api-reference/providers.md +487 -0
  178. package/docs/api-reference/types.md +1005 -0
  179. package/docs/api-reference/utilities.md +1104 -0
  180. package/docs/app.css.example +53 -0
  181. package/docs/architecture/README.md +577 -0
  182. package/docs/best-practices/README.md +400 -0
  183. package/docs/best-practices/deployment.md +1042 -0
  184. package/docs/best-practices/performance.md +789 -0
  185. package/docs/best-practices/security.md +881 -0
  186. package/docs/best-practices/testing.md +981 -0
  187. package/docs/consuming-app-example.md +290 -0
  188. package/docs/consuming-app-vite-config.md +233 -0
  189. package/docs/core-concepts/authentication.md +98 -0
  190. package/docs/core-concepts/events.md +756 -0
  191. package/docs/core-concepts/organisations.md +790 -0
  192. package/docs/core-concepts/permissions.md +729 -0
  193. package/docs/core-concepts/rbac-system.md +233 -0
  194. package/docs/database-schema-requirements.md +172 -0
  195. package/docs/documentation-style-checklist.md +294 -0
  196. package/docs/examples/navigation-menu-auth-fix.md +344 -0
  197. package/docs/getting-started/examples/README.md +106 -0
  198. package/docs/getting-started/examples/basic-auth-app.md +521 -0
  199. package/docs/getting-started/examples/full-featured-app.md +616 -0
  200. package/docs/getting-started/installation.md +269 -0
  201. package/docs/getting-started/quick-start.md +401 -0
  202. package/docs/implementation-guides/app-layout.md +983 -0
  203. package/docs/implementation-guides/data-tables.md +1898 -0
  204. package/docs/implementation-guides/dynamic-colors.md +195 -0
  205. package/docs/implementation-guides/forms.md +578 -0
  206. package/docs/implementation-guides/hierarchical-datatable.md +850 -0
  207. package/docs/implementation-guides/large-datasets.md +281 -0
  208. package/docs/implementation-guides/navigation.md +844 -0
  209. package/docs/implementation-guides/performance.md +403 -0
  210. package/docs/implementation-guides/permission-enforcement.md +764 -0
  211. package/docs/implementation-guides/public-pages.md +752 -0
  212. package/docs/migration/README.md +493 -0
  213. package/docs/migration/organisation-context-timing-fix.md +217 -0
  214. package/docs/migration/quick-migration-guide.md +320 -0
  215. package/docs/migration/rbac-migration.md +571 -0
  216. package/docs/migration/v0.4.15-tailwind-scanning.md +272 -0
  217. package/docs/migration/v0.4.16-css-first-approach.md +306 -0
  218. package/docs/migration/v0.4.17-source-path-fix.md +229 -0
  219. package/docs/migration-guide.md +168 -0
  220. package/docs/performance/README.md +551 -0
  221. package/docs/print-components/README.md +258 -0
  222. package/docs/print-components/api-reference.md +636 -0
  223. package/docs/print-components/examples/README.md +204 -0
  224. package/docs/print-components/examples/basic-report.tsx +92 -0
  225. package/docs/print-components/examples/card-catalog.tsx +149 -0
  226. package/docs/print-components/examples/cover-page-report.tsx +163 -0
  227. package/docs/print-components/quick-start.md +363 -0
  228. package/docs/quick-reference.md +576 -0
  229. package/docs/rbac/README.md +265 -0
  230. package/docs/rbac/advanced-patterns.md +776 -0
  231. package/docs/rbac/api-reference.md +1033 -0
  232. package/docs/rbac/examples.md +883 -0
  233. package/docs/rbac/getting-started.md +679 -0
  234. package/docs/rbac/quick-start.md +619 -0
  235. package/docs/rbac/super-admin-guide.md +592 -0
  236. package/docs/rbac/troubleshooting.md +316 -0
  237. package/docs/security/README.md +680 -0
  238. package/docs/security/checklist.md +343 -0
  239. package/docs/style-guide.md +522 -0
  240. package/docs/styles/README.md +319 -0
  241. package/docs/testing/README.md +874 -0
  242. package/docs/troubleshooting/README.md +497 -0
  243. package/docs/troubleshooting/common-issues.md +1563 -0
  244. package/docs/troubleshooting/database-view-compatibility.md +119 -0
  245. package/docs/troubleshooting/debugging.md +1117 -0
  246. package/docs/troubleshooting/migration.md +918 -0
  247. package/docs/troubleshooting/organisation-context-setup.md +277 -0
  248. package/docs/troubleshooting/react-hooks-issue-analysis.md +166 -0
  249. package/docs/troubleshooting/styling-issues.md +219 -0
  250. package/docs/troubleshooting/tailwind-content-scanning.md +213 -0
  251. package/docs/usage.md +175 -0
  252. package/docs/visual-testing.md +114 -0
  253. package/package.json +211 -0
  254. package/src/__mocks__/lucide-react.ts +181 -0
  255. package/src/__tests__/README.md +404 -0
  256. package/src/__tests__/debug-provider.unit.test.tsx +67 -0
  257. package/src/__tests__/e2e/workflows.test.tsx +373 -0
  258. package/src/__tests__/hybridPermissions.unit.test.tsx +474 -0
  259. package/src/__tests__/index.integration.test.ts +491 -0
  260. package/src/__tests__/mocks/MockAuthProvider-standalone.tsx +47 -0
  261. package/src/__tests__/mocks/MockAuthProvider.tsx +63 -0
  262. package/src/__tests__/mocks/enhancedSupabaseMock.ts +252 -0
  263. package/src/__tests__/mocks/index.test.ts +23 -0
  264. package/src/__tests__/mocks/index.ts +16 -0
  265. package/src/__tests__/mocks/mockAuth.ts +155 -0
  266. package/src/__tests__/mocks/mockSupabase.ts +83 -0
  267. package/src/__tests__/mocks/mockSupabaseClient.ts +63 -0
  268. package/src/__tests__/mocks/providers.tsx +22 -0
  269. package/src/__tests__/patterns/__tests__/testPatterns.test.ts +394 -0
  270. package/src/__tests__/patterns/testPatterns.ts +124 -0
  271. package/src/__tests__/performance/componentPerformance.performance.test.ts +27 -0
  272. package/src/__tests__/performance/index.ts +24 -0
  273. package/src/__tests__/performance/performanceValidation.performance.test.ts +15 -0
  274. package/src/__tests__/security/security.unit.test.tsx +7 -0
  275. package/src/__tests__/security/securityValidation.security.test.tsx +153 -0
  276. package/src/__tests__/setup.ts +259 -0
  277. package/src/__tests__/setupTests.d.ts +1 -0
  278. package/src/__tests__/shared/componentTestUtils.tsx +475 -0
  279. package/src/__tests__/shared/errorHandlingTestUtils.ts +107 -0
  280. package/src/__tests__/shared/index.ts +81 -0
  281. package/src/__tests__/shared/integrationTestUtils.tsx +375 -0
  282. package/src/__tests__/shared/performanceTestUtils.tsx +476 -0
  283. package/src/__tests__/shared/testUtils.optimized.tsx +627 -0
  284. package/src/__tests__/simple.test.tsx +20 -0
  285. package/src/__tests__/templates/accessibility.test.template.tsx +279 -0
  286. package/src/__tests__/templates/component.test.template.tsx +122 -0
  287. package/src/__tests__/templates/integration.test.template.tsx +199 -0
  288. package/src/__tests__/test-utils/dataFactories.ts +60 -0
  289. package/src/__tests__/test-utils/index.ts +6 -0
  290. package/src/__tests__/typeSafety.unit.test.ts +65 -0
  291. package/src/__tests__/unifiedAuth.unit.test.tsx +151 -0
  292. package/src/__tests__/utils/accessibilityHelpers.ts +254 -0
  293. package/src/__tests__/utils/assertions.ts +50 -0
  294. package/src/__tests__/utils/deterministicHelpers.ts +31 -0
  295. package/src/__tests__/utils/edgeCaseConfig.test.ts +75 -0
  296. package/src/__tests__/utils/edgeCaseConfig.ts +98 -0
  297. package/src/__tests__/utils/mockHelpers.ts +149 -0
  298. package/src/__tests__/utils/mockLoader.ts +101 -0
  299. package/src/__tests__/utils/performanceHelpers.ts +55 -0
  300. package/src/__tests__/utils/performanceTestHelpers.ts +68 -0
  301. package/src/__tests__/utils/testDataFactories.ts +28 -0
  302. package/src/__tests__/utils/testIsolation.ts +67 -0
  303. package/src/__tests__/utils/visualTestHelpers.ts +20 -0
  304. package/src/__tests__/visual/__snapshots__/componentSnapshots.visual.test.tsx.snap +68 -0
  305. package/src/__tests__/visual/__snapshots__/componentVisuals.visual.test.tsx.snap +14 -0
  306. package/src/__tests__/visual/__snapshots__/visualRegression.test.tsx.snap +217 -0
  307. package/src/__tests__/visual/__snapshots__/visualRegression.visual.test.tsx.snap +24 -0
  308. package/src/__tests__/visual/componentSnapshots.visual.test.tsx +33 -0
  309. package/src/__tests__/visual/componentVisuals.visual.test.tsx +12 -0
  310. package/src/__tests__/visual/visualRegression.visual.test.tsx +20 -0
  311. package/src/components/Alert/Alert.tsx +134 -0
  312. package/src/components/Alert/__tests__/Alert.unit.test.tsx +381 -0
  313. package/src/components/Alert/index.ts +2 -0
  314. package/src/components/Avatar/Avatar.tsx +84 -0
  315. package/src/components/Avatar/__tests__/Avatar.unit.test.tsx +232 -0
  316. package/src/components/Avatar/index.ts +2 -0
  317. package/src/components/Button/Button.tsx +270 -0
  318. package/src/components/Button/__tests__/Button.accessibility.test.tsx +131 -0
  319. package/src/components/Button/__tests__/Button.comprehensive.test.tsx +721 -0
  320. package/src/components/Button/__tests__/Button.unit.test.tsx +189 -0
  321. package/src/components/Button/__tests__/EventSelector.integration.test.tsx +285 -0
  322. package/src/components/Button/index.ts +2 -0
  323. package/src/components/Card/Card.tsx +271 -0
  324. package/src/components/Card/__tests__/Card.accessibility.test.tsx +394 -0
  325. package/src/components/Card/__tests__/Card.comprehensive.test.tsx +599 -0
  326. package/src/components/Card/__tests__/Card.integration.test.tsx +673 -0
  327. package/src/components/Card/__tests__/Card.performance.test.tsx +546 -0
  328. package/src/components/Card/__tests__/Card.unit.test.tsx +330 -0
  329. package/src/components/Card/__tests__/Card.visual.test.tsx +599 -0
  330. package/src/components/Card/__tests__/README.md +211 -0
  331. package/src/components/Card/index.ts +1 -0
  332. package/src/components/Checkbox/Checkbox.tsx +75 -0
  333. package/src/components/Checkbox/__mocks__/Checkbox.tsx +2 -0
  334. package/src/components/Checkbox/__tests__/Checkbox.unit.test.tsx +520 -0
  335. package/src/components/Checkbox/index.ts +2 -0
  336. package/src/components/DataTable/DataTable.tsx +440 -0
  337. package/src/components/DataTable/__tests__/DataTable.autoSizing.test.tsx +526 -0
  338. package/src/components/DataTable/__tests__/DataTable.errorHandling.test.tsx +259 -0
  339. package/src/components/DataTable/__tests__/DataTable.hierarchical.test.tsx +675 -0
  340. package/src/components/DataTable/__tests__/DataTable.infinite-loop.test.tsx +324 -0
  341. package/src/components/DataTable/__tests__/DataTable.integration.test.tsx +724 -0
  342. package/src/components/DataTable/__tests__/DataTable.performance.test.tsx +597 -0
  343. package/src/components/DataTable/__tests__/DataTable.permissions.test.tsx +306 -0
  344. package/src/components/DataTable/__tests__/DataTable.regressionFixes.test.tsx +546 -0
  345. package/src/components/DataTable/__tests__/DataTable.selection.controlled.test.tsx +386 -0
  346. package/src/components/DataTable/__tests__/DataTable.selection.test.tsx +338 -0
  347. package/src/components/DataTable/__tests__/DataTable.userWorkflows.test.tsx +310 -0
  348. package/src/components/DataTable/__tests__/DataTable.workflowValidation.test.tsx +489 -0
  349. package/src/components/DataTable/__tests__/DataTable.workflows.test.tsx +701 -0
  350. package/src/components/DataTable/__tests__/README.md +136 -0
  351. package/src/components/DataTable/__tests__/mocks/MockRBACProvider.tsx +66 -0
  352. package/src/components/DataTable/__tests__/performance-regression.test.tsx +788 -0
  353. package/src/components/DataTable/__tests__/performance.test.tsx +365 -0
  354. package/src/components/DataTable/__tests__/test-utils/dataFactories.ts +103 -0
  355. package/src/components/DataTable/__tests__/test-utils/sharedTestUtils.tsx +382 -0
  356. package/src/components/DataTable/__tests__/test-utils.ts +94 -0
  357. package/src/components/DataTable/components/ActionButtons.tsx +177 -0
  358. package/src/components/DataTable/components/BulkOperationsDropdown.tsx +160 -0
  359. package/src/components/DataTable/components/ColumnFilter.tsx +114 -0
  360. package/src/components/DataTable/components/ColumnVisibilityDropdown.tsx +100 -0
  361. package/src/components/DataTable/components/DataTableBody.tsx +462 -0
  362. package/src/components/DataTable/components/DataTableCore.tsx +869 -0
  363. package/src/components/DataTable/components/DataTableErrorBoundary.tsx +214 -0
  364. package/src/components/DataTable/components/DataTableHeader.tsx +31 -0
  365. package/src/components/DataTable/components/DataTableModals.tsx +87 -0
  366. package/src/components/DataTable/components/DataTableToolbar.tsx +251 -0
  367. package/src/components/DataTable/components/DraggableColumnHeader.tsx +148 -0
  368. package/src/components/DataTable/components/EditableRow.tsx +160 -0
  369. package/src/components/DataTable/components/EmptyState.tsx +64 -0
  370. package/src/components/DataTable/components/ExpandButton.tsx +113 -0
  371. package/src/components/DataTable/components/FilterRow.tsx +101 -0
  372. package/src/components/DataTable/components/GroupHeader.tsx +42 -0
  373. package/src/components/DataTable/components/GroupingDropdown.tsx +96 -0
  374. package/src/components/DataTable/components/ImportModal.tsx +345 -0
  375. package/src/components/DataTable/components/LoadingState.tsx +12 -0
  376. package/src/components/DataTable/components/PaginationControls.tsx +332 -0
  377. package/src/components/DataTable/components/UnifiedTableBody.tsx +911 -0
  378. package/src/components/DataTable/components/ViewRowModal.tsx +68 -0
  379. package/src/components/DataTable/components/VirtualizedDataTable.tsx +593 -0
  380. package/src/components/DataTable/components/__tests__/ActionButtons.unit.test.tsx +150 -0
  381. package/src/components/DataTable/components/__tests__/BulkOperationsDropdown.test.tsx +224 -0
  382. package/src/components/DataTable/components/__tests__/ColumnVisibilityDropdown.unit.test.tsx +244 -0
  383. package/src/components/DataTable/components/__tests__/DataTable.accessibility.test.tsx +523 -0
  384. package/src/components/DataTable/components/__tests__/DataTable.integration.test.tsx +401 -0
  385. package/src/components/DataTable/components/__tests__/DataTable.performance.test.tsx +161 -0
  386. package/src/components/DataTable/components/__tests__/DataTable.real.test.tsx +251 -0
  387. package/src/components/DataTable/components/__tests__/DataTable.security.test.tsx +172 -0
  388. package/src/components/DataTable/components/__tests__/DataTable.unit.test.tsx +290 -0
  389. package/src/components/DataTable/components/__tests__/DataTableBody.unit.test.tsx +147 -0
  390. package/src/components/DataTable/components/__tests__/DataTableErrorBoundary.unit.test.tsx +182 -0
  391. package/src/components/DataTable/components/__tests__/DataTableHeader.unit.test.tsx +143 -0
  392. package/src/components/DataTable/components/__tests__/DataTableModals.unit.test.tsx +123 -0
  393. package/src/components/DataTable/components/__tests__/EditableRow.unit.test.tsx +660 -0
  394. package/src/components/DataTable/components/__tests__/EmptyState.unit.test.tsx +256 -0
  395. package/src/components/DataTable/components/__tests__/ExpandButton.test.tsx +498 -0
  396. package/src/components/DataTable/components/__tests__/FilterRow.unit.test.tsx +112 -0
  397. package/src/components/DataTable/components/__tests__/FilteringToggle.unit.test.tsx +130 -0
  398. package/src/components/DataTable/components/__tests__/GroupHeader.unit.test.tsx +172 -0
  399. package/src/components/DataTable/components/__tests__/GroupingDropdown.unit.test.tsx +222 -0
  400. package/src/components/DataTable/components/__tests__/ImportModal.unit.test.tsx +780 -0
  401. package/src/components/DataTable/components/__tests__/LoadingState.unit.test.tsx +65 -0
  402. package/src/components/DataTable/components/__tests__/PaginationControls.unit.test.tsx +634 -0
  403. package/src/components/DataTable/components/__tests__/StateComponents.unit.test.tsx +48 -0
  404. package/src/components/DataTable/components/__tests__/UnifiedTableBody.hierarchical.test.tsx +541 -0
  405. package/src/components/DataTable/components/__tests__/ViewRowModal.unit.test.tsx +228 -0
  406. package/src/components/DataTable/components/__tests__/VirtualizedDataTable.unit.test.tsx +568 -0
  407. package/src/components/DataTable/components/index.ts +17 -0
  408. package/src/components/DataTable/context/DataTableContext.tsx +97 -0
  409. package/src/components/DataTable/core/ActionManager.ts +235 -0
  410. package/src/components/DataTable/core/ColumnFactory.ts +268 -0
  411. package/src/components/DataTable/core/ColumnManager.ts +205 -0
  412. package/src/components/DataTable/core/DataManager.ts +188 -0
  413. package/src/components/DataTable/core/DataTableContext.tsx +182 -0
  414. package/src/components/DataTable/core/LocalDataAdapter.ts +264 -0
  415. package/src/components/DataTable/core/PluginRegistry.ts +229 -0
  416. package/src/components/DataTable/core/StateManager.ts +311 -0
  417. package/src/components/DataTable/core/__tests__/ActionManager.unit.test.ts +405 -0
  418. package/src/components/DataTable/core/__tests__/ArchitectureIntegration.unit.test.tsx +445 -0
  419. package/src/components/DataTable/core/__tests__/ColumnFactory.unit.test.ts +288 -0
  420. package/src/components/DataTable/core/__tests__/ColumnManager.unit.test.ts +623 -0
  421. package/src/components/DataTable/core/__tests__/DataManager.unit.test.ts +431 -0
  422. package/src/components/DataTable/core/__tests__/DataTableContext.unit.test.tsx +433 -0
  423. package/src/components/DataTable/core/__tests__/LocalDataAdapter.unit.test.ts +422 -0
  424. package/src/components/DataTable/core/__tests__/PluginRegistry.unit.test.tsx +207 -0
  425. package/src/components/DataTable/core/__tests__/StateManager.unit.test.ts +278 -0
  426. package/src/components/DataTable/core/index.ts +8 -0
  427. package/src/components/DataTable/core/interfaces.ts +338 -0
  428. package/src/components/DataTable/examples/AutoSizingExample.tsx +180 -0
  429. package/src/components/DataTable/examples/ColumnSizingComparison.tsx +235 -0
  430. package/src/components/DataTable/examples/HierarchicalActionsExample.tsx +418 -0
  431. package/src/components/DataTable/examples/HierarchicalExample.tsx +472 -0
  432. package/src/components/DataTable/examples/InitialPageSizeExample.tsx +173 -0
  433. package/src/components/DataTable/examples/PerformanceExample.tsx +502 -0
  434. package/src/components/DataTable/examples/__tests__/PerformanceExample.unit.test.tsx +281 -0
  435. package/src/components/DataTable/hooks/__tests__/useColumnOrderPersistence.unit.test.ts +407 -0
  436. package/src/components/DataTable/hooks/__tests__/useColumnReordering.unit.test.ts +679 -0
  437. package/src/components/DataTable/hooks/useColumnOrderPersistence.ts +95 -0
  438. package/src/components/DataTable/hooks/useColumnReordering.ts +110 -0
  439. package/src/components/DataTable/hooks/useDataTableState.ts +325 -0
  440. package/src/components/DataTable/hooks/useHierarchicalState.ts +174 -0
  441. package/src/components/DataTable/index.ts +70 -0
  442. package/src/components/DataTable/styles.ts +171 -0
  443. package/src/components/DataTable/types.ts +475 -0
  444. package/src/components/DataTable/utils/__tests__/columnSizing.test.ts +237 -0
  445. package/src/components/DataTable/utils/__tests__/debugTools.unit.test.ts +267 -0
  446. package/src/components/DataTable/utils/__tests__/errorHandling.unit.test.ts +467 -0
  447. package/src/components/DataTable/utils/__tests__/exportUtils.unit.test.ts +380 -0
  448. package/src/components/DataTable/utils/__tests__/flexibleImport.unit.test.ts +233 -0
  449. package/src/components/DataTable/utils/__tests__/performanceUtils.unit.test.ts +414 -0
  450. package/src/components/DataTable/utils/columnSizing.ts +125 -0
  451. package/src/components/DataTable/utils/debugTools.ts +583 -0
  452. package/src/components/DataTable/utils/errorHandling.ts +494 -0
  453. package/src/components/DataTable/utils/exportUtils.ts +126 -0
  454. package/src/components/DataTable/utils/flexibleImport.ts +510 -0
  455. package/src/components/DataTable/utils/hierarchicalSorting.ts +151 -0
  456. package/src/components/DataTable/utils/hierarchicalUtils.ts +218 -0
  457. package/src/components/DataTable/utils/index.ts +1 -0
  458. package/src/components/DataTable/utils/performanceUtils.ts +351 -0
  459. package/src/components/Dialog/Dialog.tsx +782 -0
  460. package/src/components/Dialog/README.md +804 -0
  461. package/src/components/Dialog/__tests__/Dialog.accessibility.test.tsx +521 -0
  462. package/src/components/Dialog/__tests__/Dialog.auto-size.example.tsx +157 -0
  463. package/src/components/Dialog/__tests__/Dialog.enhanced.test.tsx +538 -0
  464. package/src/components/Dialog/__tests__/Dialog.unit.test.tsx +1373 -0
  465. package/src/components/Dialog/examples/BasicHtmlTest.tsx +55 -0
  466. package/src/components/Dialog/examples/DebugHtmlExample.tsx +68 -0
  467. package/src/components/Dialog/examples/HtmlDialogExample.tsx +202 -0
  468. package/src/components/Dialog/examples/SimpleHtmlTest.tsx +61 -0
  469. package/src/components/Dialog/examples/SmartDialogExample.tsx +322 -0
  470. package/src/components/Dialog/examples/__tests__/SmartDialogExample.unit.test.tsx +151 -0
  471. package/src/components/Dialog/index.ts +12 -0
  472. package/src/components/Dialog/utils/__tests__/safeHtml.unit.test.ts +611 -0
  473. package/src/components/Dialog/utils/safeHtml.ts +185 -0
  474. package/src/components/ErrorBoundary/ErrorBoundary.tsx +312 -0
  475. package/src/components/ErrorBoundary/__tests__/ErrorBoundary.accessibility.test.tsx +517 -0
  476. package/src/components/ErrorBoundary/__tests__/ErrorBoundary.integration.test.tsx +572 -0
  477. package/src/components/ErrorBoundary/__tests__/ErrorBoundary.unit.test.tsx +579 -0
  478. package/src/components/ErrorBoundary/index.ts +8 -0
  479. package/src/components/EventSelector/EventSelector.tsx +360 -0
  480. package/src/components/EventSelector/__tests__/EventSelector.test.tsx +528 -0
  481. package/src/components/EventSelector/index.ts +3 -0
  482. package/src/components/EventSelector/types.ts +79 -0
  483. package/src/components/FileUpload/FileUpload.example.tsx +218 -0
  484. package/src/components/FileUpload/FileUpload.tsx +237 -0
  485. package/src/components/FileUpload/__tests__/FileUpload.integration.test.tsx +992 -0
  486. package/src/components/FileUpload/__tests__/FileUpload.real.test.tsx +927 -0
  487. package/src/components/FileUpload/__tests__/FileUpload.test.tsx +855 -0
  488. package/src/components/FileUpload/__tests__/FileUpload.unit.test.tsx +1311 -0
  489. package/src/components/FileUpload/__tests__/FileUpload.unmocked.test.tsx +937 -0
  490. package/src/components/FileUpload/index.ts +6 -0
  491. package/src/components/Footer/Footer.tsx +197 -0
  492. package/src/components/Footer/__tests__/Footer.accessibility.test.tsx +359 -0
  493. package/src/components/Footer/__tests__/Footer.integration.test.tsx +353 -0
  494. package/src/components/Footer/__tests__/Footer.performance.test.tsx +309 -0
  495. package/src/components/Footer/__tests__/Footer.unit.test.tsx +309 -0
  496. package/src/components/Footer/__tests__/Footer.visual.test.tsx +335 -0
  497. package/src/components/Footer/index.ts +17 -0
  498. package/src/components/Form/Form.tsx +166 -0
  499. package/src/components/Form/FormErrorSummary.tsx +113 -0
  500. package/src/components/Form/FormField.tsx +249 -0
  501. package/src/components/Form/FormFieldset.tsx +127 -0
  502. package/src/components/Form/FormLiveRegion.tsx +198 -0
  503. package/src/components/Form/__tests__/Form.accessibility.test.tsx +820 -0
  504. package/src/components/Form/__tests__/Form.unit.test.tsx +305 -0
  505. package/src/components/Form/__tests__/FormErrorSummary.unit.test.tsx +285 -0
  506. package/src/components/Form/__tests__/FormFieldset.unit.test.tsx +241 -0
  507. package/src/components/Form/index.ts +26 -0
  508. package/src/components/Header/Header.tsx +301 -0
  509. package/src/components/Header/__tests__/Header.accessibility.test.tsx +382 -0
  510. package/src/components/Header/__tests__/Header.comprehensive.test.tsx +509 -0
  511. package/src/components/Header/__tests__/Header.unit.test.tsx +335 -0
  512. package/src/components/Header/index.ts +4 -0
  513. package/src/components/InactivityWarningModal/InactivityWarningModal.test.tsx +196 -0
  514. package/src/components/InactivityWarningModal/InactivityWarningModal.tsx +164 -0
  515. package/src/components/InactivityWarningModal/__tests__/InactivityWarningModal.unit.test.tsx +224 -0
  516. package/src/components/InactivityWarningModal/index.ts +9 -0
  517. package/src/components/Input/Input.tsx +201 -0
  518. package/src/components/Input/__mocks__/Input.tsx +2 -0
  519. package/src/components/Input/__tests__/Input.accessibility.test.tsx +632 -0
  520. package/src/components/Input/__tests__/Input.unit.test.tsx +1121 -0
  521. package/src/components/Input/index.ts +9 -0
  522. package/src/components/Label/Label.tsx +186 -0
  523. package/src/components/Label/__tests__/Label.accessibility.test.tsx +239 -0
  524. package/src/components/Label/__tests__/Label.unit.test.tsx +331 -0
  525. package/src/components/Label/index.ts +2 -0
  526. package/src/components/LoadingSpinner/LoadingSpinner.tsx +98 -0
  527. package/src/components/LoadingSpinner/__tests__/LoadingSpinner.accessibility.test.tsx +116 -0
  528. package/src/components/LoadingSpinner/__tests__/LoadingSpinner.unit.test.tsx +144 -0
  529. package/src/components/LoadingSpinner/index.ts +3 -0
  530. package/src/components/LoginForm/LoginForm.tsx +273 -0
  531. package/src/components/LoginForm/__tests__/LoginForm.accessibility.test.tsx +201 -0
  532. package/src/components/LoginForm/__tests__/LoginForm.unit.test.tsx +119 -0
  533. package/src/components/LoginForm/index.ts +3 -0
  534. package/src/components/NavigationMenu/NavigationMenu.tsx +698 -0
  535. package/src/components/NavigationMenu/__tests__/NavigationMenu.accessibility.test.tsx +378 -0
  536. package/src/components/NavigationMenu/__tests__/NavigationMenu.enhanced.test.tsx +768 -0
  537. package/src/components/NavigationMenu/__tests__/NavigationMenu.integration.test.tsx +576 -0
  538. package/src/components/NavigationMenu/__tests__/NavigationMenu.performance.test.tsx +585 -0
  539. package/src/components/NavigationMenu/__tests__/NavigationMenu.real.component.test.tsx +783 -0
  540. package/src/components/NavigationMenu/__tests__/NavigationMenu.security.enhanced.test.tsx +810 -0
  541. package/src/components/NavigationMenu/__tests__/NavigationMenu.security.test.tsx +494 -0
  542. package/src/components/NavigationMenu/__tests__/NavigationMenu.unit.test.tsx +331 -0
  543. package/src/components/NavigationMenu/__tests__/NavigationMenu.userWorkflows.test.tsx +347 -0
  544. package/src/components/NavigationMenu/__tests__/NavigationMenu.workflows.test.tsx +584 -0
  545. package/src/components/NavigationMenu/index.ts +10 -0
  546. package/src/components/NavigationMenu/types.ts +85 -0
  547. package/src/components/OrganisationSelector/OrganisationSelector.tsx +304 -0
  548. package/src/components/OrganisationSelector/__tests__/OrganisationSelector.unit.test.tsx +664 -0
  549. package/src/components/OrganisationSelector/index.ts +9 -0
  550. package/src/components/PaceAppLayout/PaceAppLayout.tsx +699 -0
  551. package/src/components/PaceAppLayout/README.md +278 -0
  552. package/src/components/PaceAppLayout/__tests__/PaceAppLayout.accessibility.test.tsx +288 -0
  553. package/src/components/PaceAppLayout/__tests__/PaceAppLayout.integration.test.tsx +889 -0
  554. package/src/components/PaceAppLayout/__tests__/PaceAppLayout.performance.test.tsx +629 -0
  555. package/src/components/PaceAppLayout/__tests__/PaceAppLayout.security.test.tsx +782 -0
  556. package/src/components/PaceAppLayout/__tests__/PaceAppLayout.unit.test.tsx +904 -0
  557. package/src/components/PaceAppLayout/index.ts +1 -0
  558. package/src/components/PaceLoginPage/PaceLoginPage.tsx +221 -0
  559. package/src/components/PaceLoginPage/__tests__/PaceLoginPage.accessibility.test.tsx +463 -0
  560. package/src/components/PaceLoginPage/__tests__/PaceLoginPage.integration.test.tsx +586 -0
  561. package/src/components/PaceLoginPage/__tests__/PaceLoginPage.unit.test.tsx +533 -0
  562. package/src/components/PaceLoginPage/index.ts +1 -0
  563. package/src/components/PasswordReset/PasswordChangeForm.tsx +186 -0
  564. package/src/components/PasswordReset/PasswordResetForm.tsx +201 -0
  565. package/src/components/PasswordReset/__tests__/PasswordChangeForm.accessibility.test.tsx +408 -0
  566. package/src/components/PasswordReset/__tests__/PasswordChangeForm.unit.test.tsx +561 -0
  567. package/src/components/PasswordReset/__tests__/PasswordReset.integration.test.tsx +304 -0
  568. package/src/components/PasswordReset/__tests__/PasswordResetForm.accessibility.test.tsx +20 -0
  569. package/src/components/PasswordReset/__tests__/PasswordResetForm.unit.test.tsx +523 -0
  570. package/src/components/PasswordReset/__tests__/__mocks__/UnifiedAuthProvider.ts +29 -0
  571. package/src/components/PasswordReset/index.ts +4 -0
  572. package/src/components/Print/__tests__/Print.comprehensive.test.tsx +331 -0
  573. package/src/components/PrintButton/PrintButton.tsx +321 -0
  574. package/src/components/PrintButton/PrintButtonGroup.tsx +84 -0
  575. package/src/components/PrintButton/PrintToolbar.tsx +94 -0
  576. package/src/components/PrintButton/__tests__/PrintButton.unit.test.tsx +429 -0
  577. package/src/components/PrintButton/__tests__/PrintButtonGroup.unit.test.tsx +277 -0
  578. package/src/components/PrintButton/__tests__/PrintToolbar.unit.test.tsx +264 -0
  579. package/src/components/PrintButton/examples/PrintButtonShowcase.tsx +438 -0
  580. package/src/components/PrintButton/index.ts +33 -0
  581. package/src/components/PrintButton/types.ts +173 -0
  582. package/src/components/PrintCard/PrintCard.tsx +154 -0
  583. package/src/components/PrintCard/PrintCardContent.tsx +57 -0
  584. package/src/components/PrintCard/PrintCardFooter.tsx +60 -0
  585. package/src/components/PrintCard/PrintCardGrid.tsx +91 -0
  586. package/src/components/PrintCard/PrintCardHeader.tsx +78 -0
  587. package/src/components/PrintCard/PrintCardImage.tsx +81 -0
  588. package/src/components/PrintCard/__tests__/PrintCard.unit.test.tsx +233 -0
  589. package/src/components/PrintCard/__tests__/PrintCardContent.test.tsx +284 -0
  590. package/src/components/PrintCard/__tests__/PrintCardGrid.unit.test.tsx +214 -0
  591. package/src/components/PrintCard/__tests__/PrintCardImage.unit.test.tsx +264 -0
  592. package/src/components/PrintCard/examples/PrintCardShowcase.tsx +239 -0
  593. package/src/components/PrintCard/index.ts +34 -0
  594. package/src/components/PrintCard/types.ts +171 -0
  595. package/src/components/PrintDataTable/PrintDataTable.tsx +215 -0
  596. package/src/components/PrintDataTable/PrintTableGroup.tsx +90 -0
  597. package/src/components/PrintDataTable/PrintTableRow.tsx +76 -0
  598. package/src/components/PrintDataTable/__tests__/PrintDataTable.unit.test.tsx +361 -0
  599. package/src/components/PrintDataTable/__tests__/PrintTableGroup.unit.test.tsx +314 -0
  600. package/src/components/PrintDataTable/__tests__/PrintTableRow.unit.test.tsx +362 -0
  601. package/src/components/PrintDataTable/index.ts +25 -0
  602. package/src/components/PrintDataTable/types.ts +67 -0
  603. package/src/components/PrintFooter/PrintFooter.tsx +183 -0
  604. package/src/components/PrintFooter/PrintFooterContent.tsx +71 -0
  605. package/src/components/PrintFooter/PrintFooterInfo.tsx +86 -0
  606. package/src/components/PrintFooter/PrintPageNumber.tsx +90 -0
  607. package/src/components/PrintFooter/__tests__/PrintFooter.unit.test.tsx +500 -0
  608. package/src/components/PrintFooter/__tests__/PrintFooterContent.unit.test.tsx +321 -0
  609. package/src/components/PrintFooter/__tests__/PrintFooterInfo.unit.test.tsx +335 -0
  610. package/src/components/PrintFooter/__tests__/PrintPageNumber.unit.test.tsx +340 -0
  611. package/src/components/PrintFooter/examples/PrintFooterShowcase.tsx +390 -0
  612. package/src/components/PrintFooter/index.ts +30 -0
  613. package/src/components/PrintFooter/types.ts +149 -0
  614. package/src/components/PrintGrid/PrintGrid.tsx +180 -0
  615. package/src/components/PrintGrid/PrintGridBreakpoint.tsx +109 -0
  616. package/src/components/PrintGrid/PrintGridContainer.tsx +128 -0
  617. package/src/components/PrintGrid/PrintGridItem.tsx +220 -0
  618. package/src/components/PrintGrid/__tests__/PrintGrid.unit.test.tsx +340 -0
  619. package/src/components/PrintGrid/__tests__/PrintGridBreakpoint.unit.test.tsx +261 -0
  620. package/src/components/PrintGrid/__tests__/PrintGridContainer.unit.test.tsx +338 -0
  621. package/src/components/PrintGrid/__tests__/PrintGridItem.unit.test.tsx +338 -0
  622. package/src/components/PrintGrid/examples/PrintGridShowcase.tsx +359 -0
  623. package/src/components/PrintGrid/index.ts +31 -0
  624. package/src/components/PrintGrid/types.ts +159 -0
  625. package/src/components/PrintHeader/PrintCoverHeader.tsx +230 -0
  626. package/src/components/PrintHeader/PrintHeader.tsx +150 -0
  627. package/src/components/PrintHeader/__tests__/PrintCoverHeader.unit.test.tsx +309 -0
  628. package/src/components/PrintHeader/__tests__/PrintHeader.unit.test.tsx +202 -0
  629. package/src/components/PrintHeader/index.ts +17 -0
  630. package/src/components/PrintHeader/types.ts +42 -0
  631. package/src/components/PrintLayout/PrintLayout.tsx +122 -0
  632. package/src/components/PrintLayout/PrintLayoutContext.tsx +66 -0
  633. package/src/components/PrintLayout/PrintPageBreak.tsx +52 -0
  634. package/src/components/PrintLayout/__tests__/PrintLayout.unit.test.tsx +238 -0
  635. package/src/components/PrintLayout/examples/PrintShowcase.tsx +230 -0
  636. package/src/components/PrintLayout/index.ts +19 -0
  637. package/src/components/PrintLayout/types.ts +37 -0
  638. package/src/components/PrintPageBreak/PrintPageBreak.tsx +120 -0
  639. package/src/components/PrintPageBreak/PrintPageBreakGroup.tsx +90 -0
  640. package/src/components/PrintPageBreak/PrintPageBreakIndicator.tsx +112 -0
  641. package/src/components/PrintPageBreak/__tests__/PrintPageBreak.unit.test.tsx +263 -0
  642. package/src/components/PrintPageBreak/__tests__/PrintPageBreakGroup.unit.test.tsx +239 -0
  643. package/src/components/PrintPageBreak/__tests__/PrintPageBreakIndicator.unit.test.tsx +235 -0
  644. package/src/components/PrintPageBreak/examples/PrintPageBreakShowcase.tsx +279 -0
  645. package/src/components/PrintPageBreak/index.ts +23 -0
  646. package/src/components/PrintPageBreak/types.ts +94 -0
  647. package/src/components/PrintSection/PrintColumn.tsx +104 -0
  648. package/src/components/PrintSection/PrintDivider.tsx +101 -0
  649. package/src/components/PrintSection/PrintSection.tsx +129 -0
  650. package/src/components/PrintSection/PrintSectionContent.tsx +75 -0
  651. package/src/components/PrintSection/PrintSectionHeader.tsx +97 -0
  652. package/src/components/PrintSection/__tests__/PrintColumn.unit.test.tsx +385 -0
  653. package/src/components/PrintSection/__tests__/PrintDivider.unit.test.tsx +373 -0
  654. package/src/components/PrintSection/__tests__/PrintSection.unit.test.tsx +390 -0
  655. package/src/components/PrintSection/__tests__/PrintSectionContent.unit.test.tsx +321 -0
  656. package/src/components/PrintSection/__tests__/PrintSectionHeader.unit.test.tsx +334 -0
  657. package/src/components/PrintSection/examples/PrintSectionShowcase.tsx +258 -0
  658. package/src/components/PrintSection/index.ts +33 -0
  659. package/src/components/PrintSection/types.ts +155 -0
  660. package/src/components/PrintText/PrintText.tsx +116 -0
  661. package/src/components/PrintText/__tests__/PrintText.unit.test.tsx +351 -0
  662. package/src/components/PrintText/index.ts +16 -0
  663. package/src/components/PrintText/types.ts +24 -0
  664. package/src/components/Progress/Progress.tsx +116 -0
  665. package/src/components/Progress/__tests__/Progress.accessibility.test.tsx +240 -0
  666. package/src/components/Progress/__tests__/Progress.unit.test.tsx +242 -0
  667. package/src/components/Progress/index.ts +3 -0
  668. package/src/components/PublicLayout/EventLogo.tsx +287 -0
  669. package/src/components/PublicLayout/PublicErrorBoundary.tsx +279 -0
  670. package/src/components/PublicLayout/PublicLoadingSpinner.tsx +208 -0
  671. package/src/components/PublicLayout/PublicPageContextChecker.tsx +130 -0
  672. package/src/components/PublicLayout/PublicPageDebugger.tsx +104 -0
  673. package/src/components/PublicLayout/PublicPageDiagnostic.tsx +162 -0
  674. package/src/components/PublicLayout/PublicPageFooter.tsx +124 -0
  675. package/src/components/PublicLayout/PublicPageHeader.tsx +178 -0
  676. package/src/components/PublicLayout/PublicPageLayout.tsx +232 -0
  677. package/src/components/PublicLayout/PublicPageProvider.tsx +137 -0
  678. package/src/components/PublicLayout/__tests__/EventLogo.test.tsx +761 -0
  679. package/src/components/PublicLayout/__tests__/PublicErrorBoundary.simplified.test.tsx +228 -0
  680. package/src/components/PublicLayout/__tests__/PublicErrorBoundary.test.tsx +228 -0
  681. package/src/components/PublicLayout/__tests__/PublicLoadingSpinner.test.tsx +459 -0
  682. package/src/components/PublicLayout/__tests__/PublicPageFooter.test.tsx +362 -0
  683. package/src/components/PublicLayout/__tests__/PublicPageHeader.test.tsx +522 -0
  684. package/src/components/PublicLayout/__tests__/PublicPageLayout.test.tsx +599 -0
  685. package/src/components/PublicLayout/__tests__/PublicPageProvider.test.tsx +513 -0
  686. package/src/components/PublicLayout/index.ts +51 -0
  687. package/src/components/RBAC/PagePermissionGuard.tsx +274 -0
  688. package/src/components/RBAC/RBACGuard.tsx +143 -0
  689. package/src/components/RBAC/RBACProvider.tsx +186 -0
  690. package/src/components/RBAC/RoleBasedContent.tsx +129 -0
  691. package/src/components/RBAC/__tests__/PagePermissionGuard.unit.test.tsx +674 -0
  692. package/src/components/RBAC/__tests__/RBAC.integration.test.tsx +573 -0
  693. package/src/components/RBAC/__tests__/RBACGuard.unit.test.tsx +467 -0
  694. package/src/components/RBAC/__tests__/RBACProvider.accessibility.test.tsx +475 -0
  695. package/src/components/RBAC/__tests__/RBACProvider.advanced.test.tsx +569 -0
  696. package/src/components/RBAC/__tests__/RBACProvider.integration.test.tsx +352 -0
  697. package/src/components/RBAC/__tests__/RBACProvider.unit.test.tsx +128 -0
  698. package/src/components/RBAC/__tests__/RoleBasedContent.unit.test.tsx +657 -0
  699. package/src/components/RBAC/index.ts +23 -0
  700. package/src/components/Select/Select.tsx +654 -0
  701. package/src/components/Select/__tests__/SearchableSelect.unit.test.tsx +437 -0
  702. package/src/components/Select/__tests__/Select.accessibility.test.tsx +1202 -0
  703. package/src/components/Select/__tests__/Select.actual.test.tsx +774 -0
  704. package/src/components/Select/__tests__/Select.comprehensive.test.tsx +837 -0
  705. package/src/components/Select/__tests__/Select.enhanced.test.tsx +1101 -0
  706. package/src/components/Select/__tests__/Select.integration.test.tsx +772 -0
  707. package/src/components/Select/__tests__/Select.performance.test.tsx +695 -0
  708. package/src/components/Select/__tests__/Select.real-world.test.tsx +1046 -0
  709. package/src/components/Select/__tests__/Select.search-algorithms.test.tsx +968 -0
  710. package/src/components/Select/__tests__/Select.unit.test.tsx +647 -0
  711. package/src/components/Select/__tests__/Select.utils.test.tsx +890 -0
  712. package/src/components/Select/index.ts +1 -0
  713. package/src/components/SuperAdminGuard.tsx +116 -0
  714. package/src/components/Table/Table.tsx +222 -0
  715. package/src/components/Table/__tests__/Table.accessibility.test.tsx +233 -0
  716. package/src/components/Table/__tests__/Table.unit.test.tsx +235 -0
  717. package/src/components/Table/index.ts +11 -0
  718. package/src/components/Toast/Toast.tsx +339 -0
  719. package/src/components/Toast/__tests__/Toast.accessibility.test.tsx +238 -0
  720. package/src/components/Toast/__tests__/Toast.integration.test.tsx +699 -0
  721. package/src/components/Toast/__tests__/Toast.unit.test.tsx +750 -0
  722. package/src/components/Toast/index.ts +14 -0
  723. package/src/components/Tooltip/Tooltip.tsx +167 -0
  724. package/src/components/Tooltip/__tests__/Tooltip.accessibility.test.tsx +121 -0
  725. package/src/components/Tooltip/__tests__/Tooltip.unit.test.tsx +185 -0
  726. package/src/components/Tooltip/index.ts +7 -0
  727. package/src/components/UserMenu/UserMenu.tsx +243 -0
  728. package/src/components/UserMenu/__tests__/UserMenu.accessibility.test.tsx +139 -0
  729. package/src/components/UserMenu/__tests__/UserMenu.integration.test.tsx +188 -0
  730. package/src/components/UserMenu/__tests__/UserMenu.unit.test.tsx +458 -0
  731. package/src/components/UserMenu/index.ts +3 -0
  732. package/src/components/__tests__/EdgeCaseTesting.enhanced.test.tsx +523 -0
  733. package/src/components/__tests__/ErrorTesting.enhanced.test.tsx +455 -0
  734. package/src/components/__tests__/SuperAdminGuard.test.tsx +456 -0
  735. package/src/components/__tests__/SuperAdminGuard.unit.test.tsx +456 -0
  736. package/src/components/examples/PermissionExample.tsx +150 -0
  737. package/src/components/examples/__tests__/PermissionExample.unit.test.tsx +360 -0
  738. package/src/components/index.ts +434 -0
  739. package/src/components.ts +19 -0
  740. package/src/constants/performance.ts +14 -0
  741. package/src/examples/CorrectPublicPageImplementation.tsx +301 -0
  742. package/src/examples/PublicEventPage.tsx +274 -0
  743. package/src/examples/PublicPageApp.tsx +308 -0
  744. package/src/examples/PublicPageUsageExample.tsx +216 -0
  745. package/src/fonts/georama-italic.woff2 +0 -0
  746. package/src/fonts/georama.woff2 +0 -0
  747. package/src/fonts/open-sans-italic.woff2 +0 -0
  748. package/src/fonts/open-sans.woff2 +0 -0
  749. package/src/fonts/reddit-mono.woff2 +0 -0
  750. package/src/hooks/__tests__/hooks.integration.test.tsx +575 -0
  751. package/src/hooks/__tests__/useApiFetch.unit.test.ts +115 -0
  752. package/src/hooks/__tests__/useComponentPerformance.unit.test.tsx +133 -0
  753. package/src/hooks/__tests__/useDebounce.unit.test.ts +82 -0
  754. package/src/hooks/__tests__/useFocusTrap.unit.test.tsx +293 -0
  755. package/src/hooks/__tests__/useInactivityTracker.unit.test.ts +385 -0
  756. package/src/hooks/__tests__/useOrganisationPermissions.unit.test.tsx +286 -0
  757. package/src/hooks/__tests__/useOrganisationSecurity.unit.test.tsx +838 -0
  758. package/src/hooks/__tests__/usePermissionCache.unit.test.ts +627 -0
  759. package/src/hooks/__tests__/useRBAC.unit.test.ts +903 -0
  760. package/src/hooks/__tests__/useSecureDataAccess.unit.test.tsx +537 -0
  761. package/src/hooks/__tests__/useToast.unit.test.tsx +62 -0
  762. package/src/hooks/__tests__/useZodForm.unit.test.tsx +37 -0
  763. package/src/hooks/index.ts +56 -0
  764. package/src/hooks/public/__tests__/usePublicEvent.test.tsx +397 -0
  765. package/src/hooks/public/__tests__/usePublicEventLogo.test.tsx +690 -0
  766. package/src/hooks/public/__tests__/usePublicRouteParams.test.tsx +449 -0
  767. package/src/hooks/public/index.ts +34 -0
  768. package/src/hooks/public/usePublicEvent.ts +261 -0
  769. package/src/hooks/public/usePublicEventLogo.ts +285 -0
  770. package/src/hooks/public/usePublicRouteParams.ts +259 -0
  771. package/src/hooks/useAppConfig.ts +94 -0
  772. package/src/hooks/useComponentPerformance.ts +39 -0
  773. package/src/hooks/useDataTablePerformance.ts +387 -0
  774. package/src/hooks/useDataTableState.ts +110 -0
  775. package/src/hooks/useDebounce.ts +18 -0
  776. package/src/hooks/useFocusManagement.ts +161 -0
  777. package/src/hooks/useFocusTrap.ts +155 -0
  778. package/src/hooks/useInactivityTracker.ts +372 -0
  779. package/src/hooks/useIsMobile.ts +42 -0
  780. package/src/hooks/useKeyboardShortcuts.ts +237 -0
  781. package/src/hooks/useOrganisationPermissions.ts +208 -0
  782. package/src/hooks/useOrganisationSecurity.ts +262 -0
  783. package/src/hooks/usePerformanceMonitor.ts +128 -0
  784. package/src/hooks/usePermissionCache.ts +455 -0
  785. package/src/hooks/useRBAC.ts +262 -0
  786. package/src/hooks/useSecureDataAccess.ts +586 -0
  787. package/src/hooks/useStorage.ts +274 -0
  788. package/src/hooks/useToast.ts +242 -0
  789. package/src/hooks/useZodForm.ts +28 -0
  790. package/src/index.ts +200 -0
  791. package/src/providers/AuthProvider.tsx +369 -0
  792. package/src/providers/EventProvider.tsx +324 -0
  793. package/src/providers/InactivityProvider.tsx +238 -0
  794. package/src/providers/OrganisationProvider.tsx +588 -0
  795. package/src/providers/RBACProvider.tsx +622 -0
  796. package/src/providers/UnifiedAuthProvider.tsx +327 -0
  797. package/src/providers/__tests__/EventProvider.unit.test.tsx +768 -0
  798. package/src/providers/__tests__/OrganisationProvider.basic.test.tsx +116 -0
  799. package/src/providers/__tests__/OrganisationProvider.unit.test.tsx +1312 -0
  800. package/src/providers/__tests__/UnifiedAuthProvider.inactivity.test.tsx +601 -0
  801. package/src/providers/__tests__/UnifiedAuthProvider.unit.test.tsx +675 -0
  802. package/src/providers/__tests__/index.unit.test.ts +78 -0
  803. package/src/providers/index.ts +15 -0
  804. package/src/rbac/README.md +885 -0
  805. package/src/rbac/__tests__/PagePermissionGuard.test.tsx +673 -0
  806. package/src/rbac/__tests__/README.md +170 -0
  807. package/src/rbac/__tests__/RoleBasedRouter.test.tsx +709 -0
  808. package/src/rbac/__tests__/TestContext.tsx +72 -0
  809. package/src/rbac/__tests__/__mocks__/cache.ts +144 -0
  810. package/src/rbac/__tests__/__mocks__/supabase.ts +152 -0
  811. package/src/rbac/__tests__/adapters-hooks-comprehensive.test.tsx +782 -0
  812. package/src/rbac/__tests__/adapters-hooks.test.tsx +561 -0
  813. package/src/rbac/__tests__/adapters.comprehensive.test.tsx +963 -0
  814. package/src/rbac/__tests__/adapters.test.tsx +444 -0
  815. package/src/rbac/__tests__/api.test.ts +620 -0
  816. package/src/rbac/__tests__/audit-observability-comprehensive.test.ts +792 -0
  817. package/src/rbac/__tests__/audit-observability.test.ts +549 -0
  818. package/src/rbac/__tests__/audit.test.ts +616 -0
  819. package/src/rbac/__tests__/build-contract-compliance-simple.test.ts +230 -0
  820. package/src/rbac/__tests__/cache-invalidation-comprehensive.test.ts +889 -0
  821. package/src/rbac/__tests__/cache-invalidation.test.ts +457 -0
  822. package/src/rbac/__tests__/cache.test.ts +458 -0
  823. package/src/rbac/__tests__/components-navigation-guard.enhanced.test.tsx +859 -0
  824. package/src/rbac/__tests__/components-navigation-guard.test.tsx +895 -0
  825. package/src/rbac/__tests__/components-navigation-provider.test.tsx +692 -0
  826. package/src/rbac/__tests__/components-page-permission-guard.test.tsx +673 -0
  827. package/src/rbac/__tests__/components-page-permission-provider.test.tsx +614 -0
  828. package/src/rbac/__tests__/components-permission-enforcer.enhanced.fixed.test.tsx +836 -0
  829. package/src/rbac/__tests__/components-permission-enforcer.enhanced.test.tsx +837 -0
  830. package/src/rbac/__tests__/components-permission-enforcer.test.tsx +825 -0
  831. package/src/rbac/__tests__/components-role-based-router.test.tsx +709 -0
  832. package/src/rbac/__tests__/components-secure-data-provider.test.tsx +607 -0
  833. package/src/rbac/__tests__/config.test.ts +583 -0
  834. package/src/rbac/__tests__/core-logic-unit.test.ts +190 -0
  835. package/src/rbac/__tests__/core-permission-logic-comprehensive.test.ts +1467 -0
  836. package/src/rbac/__tests__/core-permission-logic-fixed.test.ts +151 -0
  837. package/src/rbac/__tests__/core-permission-logic-simple.test.ts +968 -0
  838. package/src/rbac/__tests__/core-permission-logic.test.ts +966 -0
  839. package/src/rbac/__tests__/edge-cases-comprehensive.test.ts +988 -0
  840. package/src/rbac/__tests__/edge-cases.test.ts +654 -0
  841. package/src/rbac/__tests__/engine.test.ts +361 -0
  842. package/src/rbac/__tests__/engine.unit.test.ts +361 -0
  843. package/src/rbac/__tests__/hooks.enhanced.test.tsx +979 -0
  844. package/src/rbac/__tests__/hooks.fixed.test.tsx +475 -0
  845. package/src/rbac/__tests__/hooks.test.tsx +385 -0
  846. package/src/rbac/__tests__/index.test.ts +269 -0
  847. package/src/rbac/__tests__/integration.enhanced.test.tsx +824 -0
  848. package/src/rbac/__tests__/page-permission-guard-super-admin.test.tsx +261 -0
  849. package/src/rbac/__tests__/performance.enhanced.test.tsx +724 -0
  850. package/src/rbac/__tests__/permissions.test.ts +383 -0
  851. package/src/rbac/__tests__/requires-event.test.ts +330 -0
  852. package/src/rbac/__tests__/scope-isolation-comprehensive.test.ts +1349 -0
  853. package/src/rbac/__tests__/scope-isolation.test.ts +755 -0
  854. package/src/rbac/__tests__/secure-client-rls-comprehensive.test.ts +592 -0
  855. package/src/rbac/__tests__/secure-client-rls.test.ts +377 -0
  856. package/src/rbac/__tests__/security.test.ts +296 -0
  857. package/src/rbac/__tests__/setup.ts +228 -0
  858. package/src/rbac/__tests__/test-utils-enhanced.tsx +400 -0
  859. package/src/rbac/__tests__/types.test.ts +685 -0
  860. package/src/rbac/adapters.tsx +726 -0
  861. package/src/rbac/api.ts +337 -0
  862. package/src/rbac/audit-enhanced.ts +339 -0
  863. package/src/rbac/audit.ts +338 -0
  864. package/src/rbac/cache.ts +213 -0
  865. package/src/rbac/components/EnhancedNavigationMenu.tsx +294 -0
  866. package/src/rbac/components/NavigationGuard.tsx +294 -0
  867. package/src/rbac/components/NavigationProvider.tsx +314 -0
  868. package/src/rbac/components/PagePermissionGuard.tsx +430 -0
  869. package/src/rbac/components/PagePermissionProvider.tsx +274 -0
  870. package/src/rbac/components/PermissionEnforcer.tsx +307 -0
  871. package/src/rbac/components/RoleBasedRouter.tsx +425 -0
  872. package/src/rbac/components/SecureDataProvider.tsx +319 -0
  873. package/src/rbac/components/__tests__/EnhancedNavigationMenu.test.tsx +631 -0
  874. package/src/rbac/components/__tests__/NavigationProvider.test.tsx +667 -0
  875. package/src/rbac/components/__tests__/PagePermissionProvider.test.tsx +647 -0
  876. package/src/rbac/components/__tests__/SecureDataProvider.test.tsx +496 -0
  877. package/src/rbac/components/index.ts +64 -0
  878. package/src/rbac/config.ts +133 -0
  879. package/src/rbac/docs/event-based-apps.md +285 -0
  880. package/src/rbac/engine.ts +1026 -0
  881. package/src/rbac/eslint-rules.js +285 -0
  882. package/src/rbac/examples/CompleteRBACExample.tsx +323 -0
  883. package/src/rbac/examples/EventBasedApp.tsx +238 -0
  884. package/src/rbac/hooks.ts +555 -0
  885. package/src/rbac/index.ts +114 -0
  886. package/src/rbac/permissions.ts +293 -0
  887. package/src/rbac/secureClient.ts +244 -0
  888. package/src/rbac/security.ts +346 -0
  889. package/src/rbac/testing/__tests__/index.test.tsx +342 -0
  890. package/src/rbac/testing/index.tsx +340 -0
  891. package/src/rbac/types.ts +341 -0
  892. package/src/rbac/utils/__tests__/eventContext.test.ts +428 -0
  893. package/src/rbac/utils/__tests__/eventContext.unit.test.ts +428 -0
  894. package/src/rbac/utils/eventContext.ts +83 -0
  895. package/src/styles/__tests__/styles.unit.test.ts +164 -0
  896. package/src/styles/core.css +401 -0
  897. package/src/styles/index.ts +51 -0
  898. package/src/test-dom-cleanup.test.tsx +38 -0
  899. package/src/theming/__tests__/README.md +335 -0
  900. package/src/theming/__tests__/runtime.accessibility.test.ts +474 -0
  901. package/src/theming/__tests__/runtime.error.test.ts +616 -0
  902. package/src/theming/__tests__/runtime.integration.test.ts +376 -0
  903. package/src/theming/__tests__/runtime.performance.test.ts +411 -0
  904. package/src/theming/__tests__/runtime.unit.test.ts +470 -0
  905. package/src/theming/runtime.ts +187 -0
  906. package/src/types/__tests__/database.unit.test.ts +489 -0
  907. package/src/types/__tests__/guards.unit.test.ts +146 -0
  908. package/src/types/__tests__/index.unit.test.ts +77 -0
  909. package/src/types/__tests__/organisation.unit.test.ts +713 -0
  910. package/src/types/__tests__/rbac.unit.test.ts +621 -0
  911. package/src/types/__tests__/security.unit.test.ts +347 -0
  912. package/src/types/__tests__/supabase.unit.test.ts +658 -0
  913. package/src/types/__tests__/theme.unit.test.ts +218 -0
  914. package/src/types/__tests__/unified.unit.test.ts +537 -0
  915. package/src/types/__tests__/validation.unit.test.ts +616 -0
  916. package/src/types/database.ts +472 -0
  917. package/src/types/guards.ts +30 -0
  918. package/src/types/index.ts +25 -0
  919. package/src/types/organisation.ts +184 -0
  920. package/src/types/security.ts +70 -0
  921. package/src/types/supabase.ts +166 -0
  922. package/src/types/theme.ts +6 -0
  923. package/src/types/unified.ts +262 -0
  924. package/src/types/validation.ts +164 -0
  925. package/src/types/vitest-globals.d.ts +43 -0
  926. package/src/utils/__mocks__/supabaseMock.ts +75 -0
  927. package/src/utils/__mocks__/supabaseMock.tsx +198 -0
  928. package/src/utils/__tests__/appConfig.unit.test.ts +55 -0
  929. package/src/utils/__tests__/appNameResolver.unit.test.ts +137 -0
  930. package/src/utils/__tests__/audit.unit.test.ts +69 -0
  931. package/src/utils/__tests__/auth-utils.unit.test.ts +70 -0
  932. package/src/utils/__tests__/bundleAnalysis.unit.test.ts +317 -0
  933. package/src/utils/__tests__/cn.unit.test.ts +34 -0
  934. package/src/utils/__tests__/deviceFingerprint.unit.test.ts +480 -0
  935. package/src/utils/__tests__/dynamicUtils.unit.test.ts +322 -0
  936. package/src/utils/__tests__/formatDate.unit.test.ts +109 -0
  937. package/src/utils/__tests__/formatting.unit.test.ts +66 -0
  938. package/src/utils/__tests__/index.unit.test.ts +251 -0
  939. package/src/utils/__tests__/lazyLoad.unit.test.tsx +309 -0
  940. package/src/utils/__tests__/organisationContext.unit.test.ts +192 -0
  941. package/src/utils/__tests__/performanceBudgets.unit.test.ts +259 -0
  942. package/src/utils/__tests__/permissionTypes.unit.test.ts +250 -0
  943. package/src/utils/__tests__/permissionUtils.unit.test.ts +362 -0
  944. package/src/utils/__tests__/sanitization.unit.test.ts +346 -0
  945. package/src/utils/__tests__/schemaUtils.unit.test.ts +441 -0
  946. package/src/utils/__tests__/secureDataAccess.unit.test.ts +334 -0
  947. package/src/utils/__tests__/secureErrors.unit.test.ts +377 -0
  948. package/src/utils/__tests__/secureStorage.unit.test.ts +293 -0
  949. package/src/utils/__tests__/security.unit.test.ts +127 -0
  950. package/src/utils/__tests__/securityMonitor.unit.test.ts +280 -0
  951. package/src/utils/__tests__/sessionTracking.unit.test.ts +370 -0
  952. package/src/utils/__tests__/validation.unit.test.ts +84 -0
  953. package/src/utils/__tests__/validationUtils.unit.test.ts +571 -0
  954. package/src/utils/appConfig.ts +47 -0
  955. package/src/utils/appIdResolver.ts +130 -0
  956. package/src/utils/appNameResolver.ts +190 -0
  957. package/src/utils/audit.ts +127 -0
  958. package/src/utils/auth-utils.ts +96 -0
  959. package/src/utils/bundleAnalysis.ts +129 -0
  960. package/src/utils/cn.ts +7 -0
  961. package/src/utils/debugLogger.ts +46 -0
  962. package/src/utils/deviceFingerprint.ts +215 -0
  963. package/src/utils/dynamicUtils.ts +105 -0
  964. package/src/utils/formatting.ts +77 -0
  965. package/src/utils/index.ts +145 -0
  966. package/src/utils/lazyLoad.tsx +44 -0
  967. package/src/utils/organisationContext.ts +135 -0
  968. package/src/utils/performanceBenchmark.ts +64 -0
  969. package/src/utils/performanceBudgets.ts +111 -0
  970. package/src/utils/permissionTypes.ts +37 -0
  971. package/src/utils/permissionUtils.ts +31 -0
  972. package/src/utils/print/PrintDataProcessor.ts +390 -0
  973. package/src/utils/print/__tests__/PrintDataProcessor.unit.test.ts +219 -0
  974. package/src/utils/print/__tests__/usePrintOptimization.unit.test.tsx +353 -0
  975. package/src/utils/print/examples/PrintUtilitiesShowcase.tsx +397 -0
  976. package/src/utils/print/index.ts +29 -0
  977. package/src/utils/print/types.ts +196 -0
  978. package/src/utils/print/usePrintOptimization.ts +272 -0
  979. package/src/utils/sanitization.ts +264 -0
  980. package/src/utils/schemaUtils.ts +37 -0
  981. package/src/utils/secureDataAccess.ts +361 -0
  982. package/src/utils/secureErrors.ts +79 -0
  983. package/src/utils/secureStorage.ts +244 -0
  984. package/src/utils/security.ts +156 -0
  985. package/src/utils/securityMonitor.ts +45 -0
  986. package/src/utils/sessionTracking.ts +170 -0
  987. package/src/utils/storage/README.md +348 -0
  988. package/src/utils/storage/__tests__/config.unit.test.ts +206 -0
  989. package/src/utils/storage/__tests__/helpers.unit.test.ts +646 -0
  990. package/src/utils/storage/__tests__/index.unit.test.ts +167 -0
  991. package/src/utils/storage/__tests__/types.unit.test.ts +441 -0
  992. package/src/utils/storage/config.ts +100 -0
  993. package/src/utils/storage/helpers.ts +359 -0
  994. package/src/utils/storage/index.ts +36 -0
  995. package/src/utils/storage/types.ts +90 -0
  996. package/src/utils/validation.ts +111 -0
  997. package/src/utils/validationUtils.ts +120 -0
  998. package/src/validation/__tests__/common.unit.test.ts +101 -0
  999. package/src/validation/__tests__/csrf.unit.test.ts +302 -0
  1000. package/src/validation/__tests__/passwordSchema.unit.test.ts +98 -0
  1001. package/src/validation/__tests__/sqlInjectionProtection.unit.test.ts +466 -0
  1002. package/src/validation/common.ts +53 -0
  1003. package/src/validation/csrf.ts +214 -0
  1004. package/src/validation/index.ts +43 -0
  1005. package/src/validation/passwordSchema.ts +125 -0
  1006. package/src/validation/sanitization.ts +96 -0
  1007. package/src/validation/schemaUtils.ts +42 -0
  1008. package/src/validation/sqlInjectionProtection.ts +242 -0
  1009. package/src/validation/user.ts +34 -0
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/components/DataTable/DataTable.tsx","../src/components/DataTable/components/DataTableCore.tsx","../src/components/Checkbox/Checkbox.tsx","../src/components/DataTable/styles.ts","../src/components/DataTable/components/DataTableHeader.tsx","../src/components/Input/Input.tsx","../src/components/DataTable/components/DataTableToolbar.tsx","../src/components/DataTable/components/GroupingDropdown.tsx","../src/components/Select/Select.tsx","../src/components/DataTable/components/ColumnVisibilityDropdown.tsx","../src/components/DataTable/components/UnifiedTableBody.tsx","../src/components/Table/Table.tsx","../src/components/DataTable/components/EmptyState.tsx","../src/components/DataTable/components/ColumnFilter.tsx","../src/components/DataTable/components/FilterRow.tsx","../src/components/DataTable/components/ActionButtons.tsx","../src/components/DataTable/components/DraggableColumnHeader.tsx","../src/components/DataTable/utils/hierarchicalUtils.ts","../src/components/DataTable/components/PaginationControls.tsx","../src/components/DataTable/components/LoadingState.tsx","../src/components/DataTable/components/ImportModal.tsx","../src/components/DataTable/components/DataTableModals.tsx","../src/components/DataTable/components/DataTableErrorBoundary.tsx","../src/components/Alert/Alert.tsx","../src/components/DataTable/hooks/useColumnOrderPersistence.ts","../src/components/DataTable/hooks/useHierarchicalState.ts","../src/components/DataTable/hooks/useDataTableState.ts","../src/components/DataTable/utils/hierarchicalSorting.ts","../src/components/DataTable/utils/columnSizing.ts","../src/components/DataTable/core/ColumnFactory.ts","../src/components/DataTable/core/DataManager.ts","../src/components/DataTable/core/ColumnManager.ts","../src/components/DataTable/core/ActionManager.ts","../src/components/DataTable/core/StateManager.ts","../src/components/DataTable/core/PluginRegistry.ts","../src/components/DataTable/utils/exportUtils.ts","../src/components/DataTable/core/LocalDataAdapter.ts","../src/components/DataTable/core/DataTableContext.tsx","../src/components/DataTable/components/BulkOperationsDropdown.tsx","../src/components/DataTable/components/GroupHeader.tsx","../src/components/DataTable/components/EditableRow.tsx"],"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\n * - ✅ **Filtering** - Column-specific filtering with multiple input types\n * - ✅ **Export/Import** - CSV and JSON data export/import\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 * - ✅ **Auto Column Sizing** - Automatic column width adjustment based on content\n * - ✅ **Intelligent Virtual Scrolling** - Automatic performance optimization for large datasets\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 * 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 * autoColumnSizing: true, // Enable automatic column width adjustment\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 * 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 * 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 * 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 * 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 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} 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 // 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 /** 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 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;\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// ============================================================================\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 */\nexport function DataTable<TData extends DataRecord>(props: DataTableProps<TData>) {\n // Validate required features\n if (!props.features) {\n throw new Error('DataTable: features configuration is required');\n }\n\n // Validate feature dependencies\n if (props.features.deleteSelected && !props.features.deletion) {\n console.warn('DataTable: deleteSelected requires deletion to be enabled');\n }\n\n return <DataTableCore {...props} />;\n}\n\n// ============================================================================\n// EXPORT WITH PERFORMANCE OPTIMIZATIONS\n// ============================================================================\n\n/**\n * DataTable component with React.memo for performance optimization\n */\nconst DataTableComponent = React.memo(DataTable) as typeof DataTable;\n\nexport { DataTableComponent 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, useState, useRef } from 'react';\nimport { \n useReactTable, \n getCoreRowModel, \n getFilteredRowModel, \n getSortedRowModel, \n getPaginationRowModel, \n getGroupedRowModel, \n getExpandedRowModel,\n type SortingState,\n type ColumnDef,\n type ColumnFiltersState,\n type VisibilityState,\n type GroupingState,\n type ExpandedState,\n type PaginationState,\n type HeaderContext,\n type CellContext,\n} from '@tanstack/react-table';\nimport { Edit, Trash } from 'lucide-react';\nimport { cn } from '../../../utils/cn';\nimport { Checkbox } from '../../Checkbox/Checkbox';\nimport { getTableClasses, getMainContainerClasses } from '../styles';\nimport { useDataTablePerformance } from '../../../hooks/useDataTablePerformance';\nimport { DataTableHeader } from './DataTableHeader';\nimport { DataTableToolbar } from './DataTableToolbar';\nimport { UnifiedTableBody } from './UnifiedTableBody';\nimport { PaginationControls, EnhancedPaginationControls } from './PaginationControls';\nimport { LoadingState } from './LoadingState';\nimport { DataTableModals } from './DataTableModals';\nimport { DataTableErrorBoundary } from './DataTableErrorBoundary';\nimport { useColumnOrderPersistence } from '../hooks/useColumnOrderPersistence';\nimport { useHierarchicalState } from '../hooks/useHierarchicalState';\nimport { useDataTableState } from '../hooks/useDataTableState';\nimport { validateHierarchicalData, sortHierarchicalData } from '../utils/hierarchicalUtils';\nimport { sortHierarchicalData as sortHierarchicalDataWithSorting } from '../utils/hierarchicalSorting';\nimport { calculateColumnWidths, getColumnSizingConfig } from '../utils/columnSizing';\nimport { ColumnFactory } from '../core/ColumnFactory';\n\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 HierarchicalDataRow\n} from '../types';\nimport type { ImportModalConfig } from './ImportModal';\n\n// ============================================================================\n// CORE COMPONENT PROPS\n// ============================================================================\n\nexport interface DataTableCoreProps<TData extends DataRecord> {\n // Core data\n data: TData[];\n columns: DataTableColumn<TData>[];\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 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;\n aggregates?: AggregateConfig[];\n importModalConfig?: ImportModalConfig;\n actions?: DataTableAction<TData>[];\n columnOrder?: string[];\n}\n\n// ============================================================================\n// INTERNAL COMPONENT (USES CONTEXT)\n// ============================================================================\n\nfunction DataTableInternal<TData extends DataRecord>({\n data,\n columns,\n title,\n description,\n variant = 'default',\n className,\n features,\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 onRowSelectionChange,\n selection,\n onDeleteSelected,\n getRowId,\n isLoading: externalIsLoading = false,\n emptyState,\n aggregates = [],\n importModalConfig,\n actions = [],\n columnOrder: externalColumnOrder,\n}: DataTableCoreProps<TData>) {\n \n // ============================================================================\n // TABLE STATE MANAGEMENT (Single State Source)\n // ============================================================================\n \n const [sorting, setSorting] = useState<SortingState>([]);\n const [columnFilters, setColumnFilters] = useState<ColumnFiltersState>([]);\n const [columnVisibility, setColumnVisibility] = useState<VisibilityState>({});\n const [internalRowSelection, setInternalRowSelection] = useState<Record<string, boolean>>({});\n const rowSelection = selection !== undefined ? selection : internalRowSelection;\n const [columnOrder, setColumnOrder] = useState<string[]>(() => {\n // Use external columnOrder if provided, otherwise derive from columns\n if (externalColumnOrder && externalColumnOrder.length > 0) {\n return externalColumnOrder;\n }\n return columns.map(col => col.id || col.accessorKey || '').filter(Boolean);\n });\n\n // Update columnOrder to include selection column if it's not already included\n const effectiveColumnOrder = useMemo(() => {\n if (features.selection && !columnOrder.includes('select')) {\n return ['select', ...columnOrder];\n }\n return columnOrder;\n }, [columnOrder, features.selection]);\n const [grouping, setGrouping] = useState<GroupingState>([]);\n const [expanded, setExpanded] = useState<ExpandedState>({});\n \n // ============================================================================\n // PAGINATION STATE MANAGEMENT\n // ============================================================================\n \n const [pagination, setPagination] = useState<PaginationState>({\n pageIndex: 0,\n pageSize: initialPageSize,\n });\n \n // ============================================================================\n // EDITING STATE MANAGEMENT\n // ============================================================================\n \n // Use the centralized state management hook\n const { state: tableState, actions: tableActions } = useDataTableState<TData>({\n initialPageSize,\n columnIds: effectiveColumnOrder,\n initialRowSelection: selection,\n onRowSelectionChange\n });\n \n // Extract editing state from the centralized state\n const isCreating = tableState.isCreating;\n const creationData = tableState.creationData;\n const editingRowId = tableState.editingRowId;\n const editingData = tableState.editingData;\n \n // ============================================================================\n // IMPORT MODAL STATE MANAGEMENT\n // ============================================================================\n \n const [showImportModal, setShowImportModal] = useState(false);\n \n // ============================================================================\n // FILTER ROW VISIBILITY STATE MANAGEMENT\n // ============================================================================\n \n const [showFilterRow, setShowFilterRow] = useState(false);\n \n // ============================================================================\n // PERFORMANCE 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 processedData,\n totalCount,\n isLoading: performanceLoading,\n searchQuery,\n setSearchQuery,\n fetchServerData,\n serverData,\n cleanup,\n } = performanceHook;\n\n // ============================================================================\n // HIERARCHICAL DATA VALIDATION AND PROCESSING\n // ============================================================================\n \n const hierarchicalValidation = useMemo(() => {\n if (features.hierarchical && hierarchical?.enabled) {\n return validateHierarchicalData(data as unknown as HierarchicalDataRow[]);\n }\n return { isValid: true, errors: [] };\n }, [features.hierarchical, hierarchical?.enabled, data]);\n\n const processedHierarchicalData = useMemo(() => {\n if (features.hierarchical && hierarchical?.enabled && hierarchicalValidation.isValid) {\n return sortHierarchicalData(data as unknown as HierarchicalDataRow[]);\n }\n return data;\n }, [features.hierarchical, hierarchical?.enabled, hierarchicalValidation.isValid, data]);\n\n // ============================================================================\n // HIERARCHICAL STATE MANAGEMENT\n // ============================================================================\n \n const hierarchicalState = useHierarchicalState(\n processedHierarchicalData as unknown as HierarchicalDataRow[],\n hierarchical\n );\n\n // ============================================================================\n // COLUMN ORDER PERSISTENCE\n // ============================================================================\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: features.columnReordering,\n });\n\n // ============================================================================\n // CONFIGURATION RESOLUTION\n // ============================================================================\n \n const finalPaginationMode = paginationMode || detectedMode;\n const finalPageSizeOptions = optimizedPageSizeOptions;\n \n const validatedInitialPageSize = useMemo(() => {\n if (!features.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 console.warn(\n `DataTable: initialPageSize ${initialPageSize} is not available in page size options [${finalPageSizeOptions.join(', ')}]. Using closest option: ${closestOption}`\n );\n \n return closestOption;\n }, [initialPageSize, finalPageSizeOptions, features.pagination]);\n \n const isLoading = externalIsLoading || performanceLoading;\n \n // ============================================================================\n // DATA PROCESSING\n // ============================================================================\n \n // Data comparison utility to prevent unnecessary re-renders\n const dataComparisonRef = useRef<TData[]>([]);\n const renderCountRef = useRef(0);\n const lastDataRef = useRef<TData[]>([]);\n \n const isDataEqual = useCallback((newData: TData[], oldData: TData[]) => {\n if (newData.length !== oldData.length) return false;\n return newData.every((item, index) => {\n const oldItem = oldData[index];\n if (!oldItem) return false;\n // Shallow comparison of object keys\n const newKeys = Object.keys(item);\n const oldKeys = Object.keys(oldItem);\n if (newKeys.length !== oldKeys.length) return false;\n return newKeys.every(key => item[key] === oldItem[key]);\n });\n }, []);\n \n // Infinite loop detection and prevention\n const preventInfiniteLoop = useCallback((newData: TData[]) => {\n renderCountRef.current += 1;\n \n // If we've rendered too many times with the same data, return the last stable data\n if (renderCountRef.current > 10 && isDataEqual(newData, lastDataRef.current)) {\n console.warn('DataTable: Detected potential infinite loop, using last stable data');\n return lastDataRef.current;\n }\n \n // Reset counter if data actually changed\n if (!isDataEqual(newData, lastDataRef.current)) {\n renderCountRef.current = 0;\n lastDataRef.current = newData;\n }\n \n return newData;\n }, [isDataEqual]);\n \n // Stabilize data references to prevent infinite loops\n const baseData = useMemo(() => {\n const newData = finalPaginationMode === 'server' ? (serverData?.data || []) : (processedHierarchicalData as TData[]);\n \n // Apply infinite loop prevention\n const stableData = preventInfiniteLoop(newData);\n \n // Only update if data has actually changed\n if (!isDataEqual(stableData, dataComparisonRef.current)) {\n dataComparisonRef.current = stableData;\n }\n \n return dataComparisonRef.current;\n }, [finalPaginationMode, serverData?.data, processedHierarchicalData, preventInfiniteLoop, isDataEqual]);\n \n const tableData = useMemo(() => {\n return features.hierarchical && hierarchical?.enabled \n ? hierarchicalState.visibleRows as unknown as TData[]\n : baseData;\n }, [features.hierarchical, hierarchical?.enabled, hierarchicalState.visibleRows, baseData]);\n \n const dataCount = useMemo(() => {\n return finalPaginationMode === 'server' ? (serverData?.totalCount || 0) : data?.length || 0;\n }, [finalPaginationMode, serverData?.totalCount, data?.length]);\n\n // ============================================================================\n // HIERARCHICAL SORTING\n // ============================================================================\n \n const sortedTableData = useMemo(() => {\n if (features.hierarchical && hierarchical?.enabled && sorting.length > 0) {\n const hierarchicalVisibleRows = hierarchicalState.visibleRows as unknown as HierarchicalDataRow[];\n return sortHierarchicalDataWithSorting(hierarchicalVisibleRows, sorting) as unknown as TData[];\n }\n return tableData;\n }, [features.hierarchical, hierarchical?.enabled, hierarchicalState.visibleRows, sorting, tableData]);\n \n const finalTableData = useMemo(() => {\n return features.hierarchical && hierarchical?.enabled && sorting.length > 0 \n ? sortedTableData \n : tableData;\n }, [features.hierarchical, hierarchical?.enabled, sorting.length, sortedTableData, tableData]);\n \n const finalDataCount = finalPaginationMode === 'server' ? (serverData?.totalCount || 0) : finalTableData?.length || 0;\n\n // ============================================================================\n // ACTIONS PROCESSING\n // ============================================================================\n\n const effectiveActions = useMemo(() => {\n // Create a new array to avoid mutating the original\n const result = [...actions];\n \n // Add actions from event handlers if features are enabled\n if (features.editing && onEditRow && !result.some(a => a.label === 'Edit')) {\n result.push({\n label: 'Edit',\n onClick: (row: TData) => {\n // Get the row ID using the provided getRowId function or fallback to row.id\n const rowId = getRowId ? getRowId(row, 0) : (row as any).id || String(0);\n // Set the row into editing mode with the current row data\n tableActions.setEditingRow(rowId, { ...row });\n },\n icon: Edit,\n testId: 'edit',\n });\n }\n \n if (features.deletion && onDeleteRow && !result.some(a => a.label === 'Delete')) {\n result.push({\n label: 'Delete',\n onClick: onDeleteRow,\n icon: Trash,\n testId: 'delete',\n variant: 'destructive' as const,\n });\n }\n\n return result;\n }, [actions, features.editing, features.deletion, onEditRow, onDeleteRow, getRowId, tableActions]);\n\n // ============================================================================\n // COLUMN PROCESSING\n // ============================================================================\n \n const enhancedColumns = useMemo(() => {\n // Create enhanced base columns\n const baseColumns: ColumnDef<TData>[] = [...columns].map(column => ({\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 // 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 (\n <Checkbox\n checked={isAllSelected ? true : isSomeSelected ? 'indeterminate' : false}\n onCheckedChange={(value) => table.toggleAllPageRowsSelected(!!value)}\n aria-label=\"Select all\"\n />\n );\n },\n cell: ({ row }: CellContext<TData, unknown>) => (\n <Checkbox\n checked={row.getIsSelected()}\n onCheckedChange={(value) => 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: 120,\n }) : null;\n\n // Build final columns array respecting columnOrder\n const finalColumns: ColumnDef<TData>[] = [];\n \n if (columnOrder && columnOrder.length > 0) {\n // Create set of used column IDs for remaining columns check\n const usedColumnIds = new Set(columnOrder);\n \n // Add selection column first if it wasn't in the order\n if (selectionColumn && !usedColumnIds.has('select')) {\n finalColumns.unshift(selectionColumn);\n }\n \n // Use provided columnOrder to arrange columns\n for (const columnId of columnOrder) {\n if (columnId === 'select' && selectionColumn) {\n finalColumns.push(selectionColumn);\n } else if (columnId === 'actions' && actionsColumn) {\n finalColumns.push(actionsColumn);\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 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 if it wasn't in the order\n if (actionsColumn && !usedColumnIds.has('actions')) {\n finalColumns.push(actionsColumn);\n }\n } else {\n // No columnOrder provided, use default behavior\n if (selectionColumn) {\n finalColumns.push(selectionColumn);\n }\n finalColumns.push(...baseColumns);\n if (actionsColumn) {\n finalColumns.push(actionsColumn);\n }\n }\n\n return finalColumns;\n }, [columns, features, effectiveActions, columnOrder]);\n\n // ============================================================================\n // COLUMN WIDTHS\n // ============================================================================\n \n const columnWidths = useMemo(() => {\n if (features.autoColumnSizing) {\n return calculateColumnWidths(data, enhancedColumns, {\n minWidth: 80,\n maxWidth: 400,\n padding: 32,\n sampleSize: Math.min(100, data.length)\n });\n }\n return undefined;\n }, [data, enhancedColumns, features.autoColumnSizing]);\n\n // ============================================================================\n // TABLE CONFIGURATION\n // ============================================================================\n \n // Memoize table configuration to prevent unnecessary re-creation\n const tableConfig = useMemo(() => ({\n data: finalTableData as TData[],\n columns: enhancedColumns,\n state: {\n sorting,\n columnFilters,\n columnVisibility,\n rowSelection,\n grouping,\n expanded,\n pagination,\n globalFilter: searchQuery,\n columnOrder: effectiveColumnOrder,\n },\n initialState: {\n expanded: features.grouping ? {} : undefined,\n },\n enableRowSelection: features.selection,\n enableGrouping: features.grouping,\n getRowId: getRowId || ((row: TData) => row?.id || row?.toString() || 'unknown'),\n onSortingChange: setSorting,\n onColumnFiltersChange: setColumnFilters,\n onColumnVisibilityChange: setColumnVisibility,\n onRowSelectionChange: (updaterOrValue: any) => {\n const newSelection = typeof updaterOrValue === 'function' ? updaterOrValue(rowSelection) : updaterOrValue;\n setInternalRowSelection(newSelection);\n onRowSelectionChange?.(newSelection);\n },\n onGroupingChange: setGrouping,\n onExpandedChange: setExpanded,\n onPaginationChange: setPagination,\n onColumnOrderChange: setColumnOrder,\n getCoreRowModel: getCoreRowModel(),\n getFilteredRowModel: finalPaginationMode === 'client' ? getFilteredRowModel() : undefined,\n getSortedRowModel: finalPaginationMode === 'client' ? getSortedRowModel() : undefined,\n getPaginationRowModel: features.pagination ? getPaginationRowModel() : undefined,\n getGroupedRowModel: features.grouping ? getGroupedRowModel() : undefined,\n getExpandedRowModel: features.grouping ? getExpandedRowModel() : undefined,\n manualSorting: finalPaginationMode === 'server',\n manualFiltering: finalPaginationMode === 'server',\n manualPagination: finalPaginationMode === 'server',\n pageCount: finalPaginationMode === 'server' ? Math.ceil(dataCount / pagination.pageSize) : undefined,\n ...getColumnSizingConfig(features.autoColumnSizing || false, columnWidths),\n }), [\n finalTableData,\n enhancedColumns,\n sorting,\n columnFilters,\n columnVisibility,\n rowSelection,\n grouping,\n expanded,\n pagination,\n searchQuery,\n effectiveColumnOrder,\n features.selection,\n features.grouping,\n getRowId,\n onRowSelectionChange,\n finalPaginationMode,\n features.pagination,\n features.autoColumnSizing,\n columnWidths,\n dataCount,\n pagination.pageSize\n ]);\n \n const table = useReactTable(tableConfig);\n\n // ============================================================================\n // SEARCH HANDLERS\n // ============================================================================\n \n const handleSearch = useCallback((value: string) => {\n setSearchQuery(value);\n \n if (features.pagination) {\n setPagination(prev => ({ ...prev, pageIndex: 0 }));\n }\n }, [setSearchQuery, features.pagination]);\n\n // ============================================================================\n // SERVER-SIDE DATA FETCHING\n // ============================================================================\n \n const handleServerSideChange = useCallback(async () => {\n if (finalPaginationMode !== 'server' || !serverSide) return;\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,\n sorting,\n columnFilters,\n searchQuery,\n grouping,\n fetchServerData,\n ]);\n\n // ============================================================================\n // EFFECTS\n // ============================================================================\n \n useEffect(() => {\n if ((tableData?.length || 0) > 0 || finalPaginationMode === 'server') {\n handleServerSideChange();\n }\n }, [handleServerSideChange, tableData?.length, finalPaginationMode]);\n\n useEffect(() => {\n return () => {\n if (typeof cleanup === 'function') {\n cleanup();\n }\n };\n }, [cleanup]);\n\n // ============================================================================\n // RENDER\n // ============================================================================\n \n if (isLoading) {\n return <LoadingComponent />;\n }\n\n const PaginationComponent = enhancedPagination || finalPaginationMode !== 'client' \n ? EnhancedPaginationControls \n : PaginationControls;\n\n return (\n <>\n {/* Header */}\n {(title || description) && (\n <DataTableHeader\n title={title}\n description={description}\n />\n )}\n\n {/* Toolbar */}\n <DataTableToolbar\n features={features}\n globalFilter={searchQuery}\n onGlobalFilterChange={handleSearch}\n columns={columns}\n grouping={grouping}\n onGroupByChange={(columnId) => {\n setGrouping(columnId ? [columnId] : []);\n }}\n tableColumns={table?.getAllColumns() || []}\n onColumnVisibilityChange={(columnId, visible) => {\n setColumnVisibility(prev => ({ ...prev, [columnId]: visible }));\n }}\n onCreateRow={features.creation && onCreateRow ? () => tableActions.setCreating(true) : undefined}\n onImportClick={() => setShowImportModal(true)}\n onExport={() => {\n // Export logic here\n }}\n rowSelection={rowSelection}\n onDeleteSelected={onDeleteSelected}\n onToggleFilterRow={() => setShowFilterRow(!showFilterRow)}\n showFilterRow={showFilterRow}\n />\n\n {/* Table */}\n <table className={getTableClasses({\n isFixed: !features.autoColumnSizing,\n variant,\n className: cn('border-collapse relative w-full', className)\n })} style={{ \n tableLayout: features.autoColumnSizing ? 'auto' : 'fixed', \n width: '100%' \n }}>\n <UnifiedTableBody\n table={table}\n isCreating={isCreating}\n creationData={creationData}\n onCreationDataChange={tableActions.setCreationData}\n onSaveCreation={() => {\n if (onCreateRow) {\n onCreateRow(creationData as Partial<TData>);\n tableActions.clearCreationData();\n tableActions.setCreating(false);\n }\n }}\n onCancelCreation={() => {\n tableActions.clearCreationData();\n tableActions.setCreating(false);\n }}\n editingRowId={editingRowId}\n editingData={editingData}\n onEditingDataChange={(data) => {\n // Update the editing data in the centralized state\n if (editingRowId) {\n tableActions.setEditingRow(editingRowId, data);\n }\n }}\n onSaveEditing={() => {\n if (onEditRow && editingRowId) {\n // Find the original row data\n const originalRow = data.find(row => {\n const rowId = getRowId ? getRowId(row, 0) : (row as any).id || String(0);\n return rowId === editingRowId;\n });\n if (originalRow) {\n onEditRow(originalRow, editingData as Partial<TData>);\n }\n }\n tableActions.clearEditing();\n }}\n onCancelEditing={() => {\n tableActions.clearEditing();\n }}\n grouping={grouping}\n aggregates={aggregates}\n getRowId={getRowId}\n emptyState={React.isValidElement(emptyState) ? undefined : emptyState as any}\n isFiltered={searchQuery !== '' || columnFilters.length > 0}\n onClearFilters={() => {\n setSearchQuery('');\n setColumnFilters([]);\n }}\n enableFiltering={features.filtering}\n showFilterRow={showFilterRow}\n enableColumnReordering={features.columnReordering}\n onColumnOrderChange={setColumnOrder}\n onColumnDrop={(draggedColumnId, targetColumnId) => {\n // Handle column drop\n }}\n savedColumnOrder={savedColumnOrder}\n enablePersistence={features.columnReordering}\n tableId={title ? `datatable-${title.toLowerCase().replace(/\\s+/g, '-')}` : undefined}\n dataLength={finalTableData?.length || 0}\n virtualHeight={virtualHeight}\n forceVirtualization={false}\n hierarchical={features.hierarchical && hierarchical?.enabled ? {\n ...hierarchical,\n state: hierarchicalState,\n expandAll: hierarchicalState.expandAll,\n collapseAll: hierarchicalState.collapseAll,\n isAllExpanded: hierarchicalState.getExpandedIds().length > 0 && \n hierarchicalState.getExpandedIds().length === (finalTableData as any[]).filter(row => row.isParent).length,\n hasAnyChildren: (finalTableData as any[]).some(row => row.isParent),\n } : undefined}\n actions={effectiveActions}\n />\n </table>\n\n {/* Pagination */}\n {features.pagination && (\n <PaginationComponent\n table={table}\n pageSizeOptions={finalPageSizeOptions}\n paginationMode={finalPaginationMode}\n totalCount={finalDataCount}\n isLoading={isLoading}\n />\n )}\n\n {/* Modal Dialogs */}\n <DataTableModals\n showImportModal={showImportModal}\n onCloseImportModal={() => setShowImportModal(false)}\n onImport={async (data) => {\n if (onImport) {\n const result = onImport(data);\n if (result && typeof result.then === 'function') {\n await result;\n }\n }\n setShowImportModal(false);\n }}\n importModalConfig={importModalConfig}\n />\n </>\n );\n}\n\n// ============================================================================\n// MAIN COMPONENT\n// ============================================================================\n\nexport function DataTableCore<TData extends DataRecord>(props: DataTableCoreProps<TData>) {\n return (\n <DataTableErrorBoundary>\n <DataTableInternal {...props} />\n </DataTableErrorBoundary>\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 * <div className=\"flex items-center space-x-2\">\n * <Checkbox id=\"terms\" />\n * <label htmlFor=\"terms\">Accept terms and conditions</label>\n * </div>\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/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 h-4 w-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=\"h-4 w-4\" />\n </CheckboxPrimitive.Indicator>\n </CheckboxPrimitive.Root>\n))\nCheckbox.displayName = CheckboxPrimitive.Root.displayName\n\nexport { Checkbox }\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/cn';\n\n// ============================================================================\n// TABLE BASE STYLES\n// ============================================================================\n\nexport const tableStyles = {\n // Main table container\n table: 'w-full caption-bottom 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} = {}) => {\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} = {}) => {\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} = {}) => {\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} = {}) => {\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} = {}) => {\n const { isFixed = false, variant = 'default', className } = options;\n \n return cn(\n isFixed ? tableStyles.tableFixed : tableStyles.table,\n variant === 'compact' && 'text-sm',\n variant === 'spacious' && 'text-base',\n className\n );\n};\n\n/**\n * Get main DataTable container classes\n */\nexport const getMainContainerClasses = (options: {\n className?: string;\n} = {}) => {\n const { className } = options;\n \n return cn(\n tableStyles.mainContainer,\n className\n );\n};\n","/**\n * @file DataTable Header Component\n * @package @jmruthers/pace-core\n * @module Components/DataTable/Components\n * @since 0.2.0\n */\n\nimport React from 'react';\nimport { cn } from '../../../utils/cn';\n\nexport interface DataTableHeaderProps {\n title?: string;\n description?: string;\n}\n\nexport function DataTableHeader({ title, description }: DataTableHeaderProps) {\n const hasTitle = !!title && title.trim().length > 0;\n const hasDescription = !!description && description.trim().length > 0;\n if (!hasTitle && !hasDescription) return null;\n\n return (\n <div className=\"pb-4\">\n {hasTitle && (\n <h2 className=\"text-2xl font-bold tracking-tight break-words\">{title}</h2>\n )}\n {hasDescription && (\n <p className=\"text-muted-foreground mt-2 break-words\">{description}</p>\n )}\n </div>\n );\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/cn';\n\n// ============================================================================\n// BASE INPUT COMPONENT\n// ============================================================================\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 */\nconst Input = React.forwardRef<HTMLInputElement, InputProps>(\n ({ className, variant = 'default', size = 'md', error, type, ...props }, ref) => {\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-10 px-3 py-2 text-sm': size === 'md',\n 'h-12 px-4 py-3 text-base': size === 'lg',\n },\n \n className\n )}\n ref={ref}\n {...props}\n />\n );\n }\n);\n\nInput.displayName = 'Input';\n\n// ============================================================================\n// INPUT GROUP COMPONENT\n// ============================================================================\n\nexport interface InputGroupProps extends React.HTMLAttributes<HTMLDivElement> {\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<HTMLDivElement, 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 <div\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 </div>\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 } 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 // 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 */\nexport function DataTableToolbar<TData extends DataRecord>({\n features,\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 <nav className=\"flex flex-col sm:flex-row items-stretch sm:items-center gap-4 p-4 border-b bg-sec-50\">\n {/* Left side - Search only */}\n {features.search && (\n <div className=\"flex items-center gap-2 w-full sm:min-w-[200px] sm:max-w-[300px]\">\n <Search className=\"h-4 w-4 text-sec-500 flex-shrink-0\" />\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=\"flex-1\"\n />\n </div>\n )}\n\n {/* Right side - All Buttons in specified order */}\n <div className=\"flex items-center gap-2 flex-wrap justify-end sm:justify-end min-w-0\">\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=\"h-4 w-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 */}\n {features.creation && onCreateRow && (\n <Button \n variant=\"outline\" \n onClick={onCreateRow}\n >\n <Plus className=\"h-4 w-4 mr-2 flex-shrink-0\" />\n <span className=\"truncate\">Add Row</span>\n </Button>\n )}\n\n {/* Import */}\n {features.import && (\n <Button \n variant=\"outline\" \n onClick={onImportClick}\n >\n <Upload className=\"h-4 w-4 mr-2 flex-shrink-0\" />\n <span className=\"truncate\">Import</span>\n </Button>\n )}\n\n {/* Export */}\n {features.export && (\n <Button \n variant=\"outline\" \n onClick={onExport}\n >\n <Download className=\"h-4 w-4 mr-2 flex-shrink-0\" />\n <span className=\"truncate\">Export</span>\n </Button>\n )}\n\n\n {/* Delete - Only when both deletion and selection are enabled */}\n {features.deleteSelected && features.deletion && features.selection && (\n <Button\n variant=\"destructive\"\n onClick={() => onDeleteSelected?.(rowSelection)}\n disabled={Object.values(rowSelection).filter(Boolean).length === 0}\n >\n <Trash2 className=\"h-4 w-4 mr-2 flex-shrink-0\" />\n <span className=\"truncate\">Delete</span>\n </Button>\n )}\n\n </div>\n </nav>\n );\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\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\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>\n <SelectTrigger asChild>\n <Button \n variant=\"outline\" \n className={className || ''}\n >\n <Group className=\"h-4 w-4 mr-2 flex-shrink-0\" />\n <span className=\"truncate\">Grouping</span>\n </Button>\n </SelectTrigger>\n <SelectContent className=\"w-48 !bg-main-50 border border-sec-200 shadow-lg z-[9999]\" style={{ backgroundColor: 'white' }}>\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 Select Component - Simple HTML Structure\n * @package @jmruthers/pace-core\n * @module Components/Select\n * @since 0.3.0\n *\n * A simple select component using semantic HTML structure\n * with proper DOM nesting and accessibility.\n *\n * Features:\n * - Semantic HTML with <form> + <button> + <ul> + <li>\n * - Proper DOM nesting (no button inside select)\n * - Built on pace-core Button component for consistency\n * - Simple positioning and styling\n * - Better accessibility and SEO\n * - Backward compatible API\n */\n\nimport * as React from \"react\";\nimport { Search, X, ChevronDown, Check } from \"lucide-react\";\nimport { Button, type ButtonProps } from \"../Button/Button\";\nimport { cn } from \"../../utils/cn\";\n\n// ============================================================================\n// TYPES AND INTERFACES\n// ============================================================================\n\nexport interface SelectContextValue {\n value: string;\n selectedText: string;\n onValueChange: (value: string, text: string) => void;\n open: boolean;\n onOpenChange: (open: boolean) => void;\n placeholder?: string;\n disabled?: boolean;\n}\n\nexport interface SelectProps extends Omit<React.HTMLAttributes<HTMLFormElement>, 'onChange' | 'onKeyDown' | 'onFocus' | 'onBlur'> {\n value?: string;\n defaultValue?: string;\n selectedText?: string;\n onValueChange?: (value: string) => void;\n open?: boolean;\n defaultOpen?: boolean;\n onOpenChange?: (open: boolean) => void;\n disabled?: boolean;\n children: React.ReactNode;\n className?: string;\n}\n\nexport interface SelectTriggerProps extends Omit<ButtonProps, 'onClick' | 'onKeyDown'> {\n children: React.ReactNode;\n asChild?: boolean;\n}\n\nexport interface SelectValueProps {\n placeholder?: string;\n children?: React.ReactNode;\n}\n\nexport interface SelectContentProps {\n children: React.ReactNode;\n className?: string;\n searchable?: boolean;\n searchPlaceholder?: string;\n maxHeight?: string;\n style?: React.CSSProperties;\n}\n\nexport interface SelectItemProps {\n value: string;\n children: React.ReactNode;\n disabled?: boolean;\n className?: string;\n onClick?: (e: React.MouseEvent) => void;\n}\n\n// ============================================================================\n// CONTEXT\n// ============================================================================\n\nconst SelectContext = React.createContext<SelectContextValue | null>(null);\n\nconst 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\n// ============================================================================\n// ROOT COMPONENT\n// ============================================================================\n\nexport const Select = React.forwardRef<HTMLFormElement, SelectProps>(\n ({ \n value: controlledValue, \n defaultValue, \n selectedText: controlledSelectedText,\n onValueChange, \n open: controlledOpen, \n defaultOpen = false, \n onOpenChange,\n disabled = false,\n children,\n className,\n ...restProps\n }, ref) => {\n const [internalValue, setInternalValue] = React.useState(defaultValue || '');\n const [internalSelectedText, setInternalSelectedText] = React.useState('');\n const [internalOpen, setInternalOpen] = React.useState(defaultOpen);\n const [isSelecting, setIsSelecting] = React.useState(false);\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>;\n }\n return internalRef;\n }, [ref]);\n\n const value = controlledValue !== undefined ? controlledValue : internalValue;\n const open = controlledOpen !== undefined ? controlledOpen : internalOpen;\n\n const handleValueChange = React.useCallback((newValue: string, newText: string) => {\n if (controlledValue === undefined) {\n setInternalValue(newValue);\n setInternalSelectedText(newText);\n }\n onValueChange?.(newValue);\n // Close dropdown after selection\n if (controlledOpen === undefined) {\n setInternalOpen(false);\n }\n onOpenChange?.(false);\n }, [controlledValue, onValueChange, controlledOpen, onOpenChange]);\n\n const handleOpenChange = React.useCallback((newOpen: boolean) => {\n if (disabled) return;\n \n // Close all other select dropdowns when opening this one\n if (newOpen) {\n const allTriggers = document.querySelectorAll('[data-testid=\"select-trigger\"]');\n allTriggers.forEach(trigger => {\n if (trigger.getAttribute('aria-expanded') === 'true') {\n const selectRoot = trigger.closest('[data-testid=\"select-root\"]');\n if (selectRoot && selectRoot !== selectRef.current) {\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 }, [controlledOpen, onOpenChange, disabled, selectRef]);\n\n // Listen for close events from other selects\n React.useEffect(() => {\n const handleCloseSelect = () => {\n if (controlledOpen === undefined) {\n setInternalOpen(false);\n }\n onOpenChange?.(false);\n };\n\n const selectElement = selectRef.current;\n if (selectElement) {\n selectElement.addEventListener('closeSelect', handleCloseSelect);\n return () => {\n selectElement.removeEventListener('closeSelect', handleCloseSelect);\n };\n }\n }, [controlledOpen, onOpenChange, selectRef]);\n\n // Listen for SelectItem mousedown events to set selecting flag\n React.useEffect(() => {\n let timeoutId: NodeJS.Timeout | null = null;\n \n const handleSelectItemMouseDown = () => {\n setIsSelecting(true);\n timeoutId = setTimeout(() => {\n setIsSelecting(false);\n }, 150);\n };\n\n document.addEventListener('selectItemMouseDown', handleSelectItemMouseDown as EventListener);\n return () => {\n document.removeEventListener('selectItemMouseDown', handleSelectItemMouseDown as EventListener);\n if (timeoutId) {\n clearTimeout(timeoutId);\n }\n };\n }, []);\n\n // Global click handler to close dropdown when clicking outside\n React.useEffect(() => {\n const handleClickOutside = (event: MouseEvent) => {\n const selectElement = selectRef.current;\n const clickedElement = event.target as Element;\n const isSelectItem = clickedElement?.closest('[data-testid=\"select-item\"]');\n \n if (open && selectElement && !selectElement.contains(event.target as Node) && !isSelectItem && !isSelecting) {\n if (controlledOpen === undefined) {\n setInternalOpen(false);\n }\n onOpenChange?.(false);\n }\n };\n\n if (open) {\n document.addEventListener('mousedown', handleClickOutside);\n return () => {\n document.removeEventListener('mousedown', handleClickOutside);\n };\n }\n }, [open, controlledOpen, onOpenChange, selectRef, isSelecting]);\n\n // Find selected text when value changes\n React.useEffect(() => {\n if (value && !internalSelectedText) {\n // Find the SelectItem with the matching value and extract its text\n const selectElement = selectRef.current;\n if (selectElement) {\n const selectItem = selectElement.querySelector(`[data-value=\"${value}\"]`);\n if (selectItem) {\n const textContent = selectItem.textContent?.trim() || '';\n if (textContent) {\n setInternalSelectedText(textContent);\n }\n }\n }\n }\n }, [value, internalSelectedText, selectRef]);\n\n const contextValue = React.useMemo<SelectContextValue>(() => ({\n value,\n selectedText: controlledSelectedText || internalSelectedText,\n onValueChange: handleValueChange,\n open,\n onOpenChange: handleOpenChange,\n disabled,\n }), [value, controlledSelectedText, internalSelectedText, handleValueChange, open, handleOpenChange, disabled]);\n\n return (\n <form\n ref={selectRef}\n className={cn(\"relative\", className)}\n data-value={value}\n data-testid=\"select-root\"\n {...restProps}\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\nexport const SelectTrigger = React.forwardRef<HTMLButtonElement, SelectTriggerProps>(\n ({ children, className, variant = \"outline\", size = \"default\", asChild = false, ...props }, ref) => {\n const { open, onOpenChange, disabled, value } = useSelectContext();\n\n const handleClick = () => {\n onOpenChange(!open);\n };\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 onOpenChange(true);\n break;\n case 'Escape':\n if (open) {\n e.preventDefault();\n onOpenChange(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 && \"!rounded-b-none !border-b-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 childChildren = React.Children.toArray((children as React.ReactElement).props.children);\n const hasChevron = childChildren.some(child => \n React.isValidElement(child) && \n (child.type === ChevronDown || \n (child.type === 'svg' && child.props['data-testid'] === 'chevron-down') ||\n (typeof child === 'object' && 'type' in child && typeof child.type === 'function' && child.type.name === 'ChevronDown'))\n );\n\n return React.cloneElement(children as React.ReactElement, {\n ...triggerProps,\n children: hasChevron ? childChildren : [\n ...childChildren,\n <ChevronDown \n key=\"chevron-down\"\n className={cn(\n \"h-4 w-4 opacity-50 transition-transform pointer-events-none float-right\",\n open && \"rotate-180\"\n )} \n />\n ]\n });\n }\n\n return (\n <Button\n ref={ref}\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 && \"!rounded-b-none !border-b-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 {children}\n <ChevronDown \n className={cn(\n \"h-4 w-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\nexport const SelectValue = React.forwardRef<HTMLSpanElement, SelectValueProps>(\n ({ placeholder = \"Select an option...\", children }, ref) => {\n const { selectedText } = useSelectContext();\n\n return (\n <span ref={ref} data-testid=\"select-value\">\n {children || (selectedText ? selectedText : placeholder)}\n </span>\n );\n }\n);\nSelectValue.displayName = \"SelectValue\";\n\n// ============================================================================\n// CONTENT COMPONENT\n// ============================================================================\n\nexport const SelectContent = React.forwardRef<HTMLUListElement, SelectContentProps>(\n ({ \n children, \n className, \n searchable = false,\n searchPlaceholder = \"Search...\",\n maxHeight = \"20rem\",\n style\n }, ref) => {\n const { open, onOpenChange, onValueChange } = useSelectContext();\n const [searchTerm, setSearchTerm] = React.useState('');\n const [filteredChildren, setFilteredChildren] = React.useState<React.ReactNode>(children);\n const searchInputRef = React.useRef<HTMLInputElement>(null);\n\n // Filter children based on search term\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 if (child.type === SelectItem) {\n const childText = React.Children.toArray(child.props.children).join(' ').toLowerCase();\n const searchLower = searchTerm.toLowerCase();\n \n if (childText.includes(searchLower)) {\n return child;\n }\n return null;\n }\n\n if (child.props.children) {\n const filteredChildChildren = filterChildren(child.props.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 // 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 if (!open) {\n return null;\n }\n\n return (\n <ul\n ref={ref}\n className={cn(\n \"absolute z-[99999] w-full overflow-y-auto rounded-b-md border border-t-0 border-main-300 bg-main-50 shadow-lg\",\n \"list-none p-0 m-0\",\n className\n )}\n style={{ \n 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 h-4 w-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=\"h-4 w-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\nexport const SelectItem = React.forwardRef<HTMLLIElement, SelectItemProps>(\n ({ value, children, disabled = false, className, onClick }, ref) => {\n const { value: selectedValue, onValueChange } = useSelectContext();\n const isSelected = selectedValue === value;\n \n // Extract text content from children for display\n 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) && children.props.children) {\n return getTextContent(children.props.children);\n }\n if (Array.isArray(children)) {\n return children.map(getTextContent).join('');\n }\n return '';\n };\n \n const itemText = getTextContent(children);\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 onValueChange(value, itemText);\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 onClick(e as any);\n }\n onValueChange(value, itemText);\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 >\n {children}\n {isSelected && (\n <Check className=\"absolute right-2 h-4 w-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\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\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\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\";","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\ninterface ColumnVisibilityDropdownProps<TData> {\n columns: Column<TData, unknown>[];\n onColumnVisibilityChange: (columnId: string, visible: boolean) => void;\n}\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>\n <SelectTrigger asChild>\n <Button \n variant=\"outline\" \n >\n <Settings2 className=\"h-4 w-4 mr-2 flex-shrink-0\" />\n <span className=\"truncate\">Columns</span>\n </Button>\n </SelectTrigger>\n <SelectContent className=\"w-56 !bg-main-50 border border-sec-200 shadow-lg z-[9999]\" style={{ backgroundColor: 'white' }}>\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=\"h-3 w-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=\"h-3 w-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, { useLayoutEffect, useState, useRef, useMemo } from 'react';\nimport { type Table, flexRender } from '@tanstack/react-table';\nimport { useVirtualizer } from '@tanstack/react-virtual';\nimport { TableBody, TableHead, TableHeader, TableRow, TableCell } from '../../Table/Table';\nimport { Button } from '../../Button/Button';\nimport { ChevronUp, ChevronDown, ChevronRight } from 'lucide-react';\nimport { EmptyState } from './EmptyState';\nimport { FilterRow } from './FilterRow';\nimport { ActionButtons } from './ActionButtons';\nimport { DraggableColumnHeader } from './DraggableColumnHeader';\nimport { getTableCellClasses, getTableHeadClasses, getTableRowClasses } from '../styles';\nimport { Input } from '../../Input/Input';\nimport { Select, SelectContent, SelectItem, SelectTrigger, SelectValue } from '../../Select/Select';\nimport type { AggregateConfig, HierarchicalConfig, HierarchicalDataRow } from '../types';\nimport { calculateIndentation } from '../utils/hierarchicalUtils';\n\n// Performance thresholds\nconst VIRTUALIZATION_THRESHOLD = 1000;\nconst CHUNKING_THRESHOLD = 10000;\nconst MEMORY_OPTIMIZATION_THRESHOLD = 100000;\n\n/**\n * Props for the unified table body component\n */\ninterface UnifiedTableBodyProps<TData extends Record<string, any>> {\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, any>;\n /** Callback when creation data changes */\n onCreationDataChange: (data: Record<string, any>) => 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, any>;\n /** Callback when editing data changes */\n onEditingDataChange: (data: Record<string, any>) => 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?: {\n title?: string;\n description?: string;\n icon?: React.ComponentType<{ className?: string }>;\n action?: {\n label: string;\n onClick: () => void;\n };\n };\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 /** Whether column reordering is enabled */\n enableColumnReordering?: boolean;\n /** Callback when column order changes */\n onColumnOrderChange?: (columnOrder: string[]) => void;\n /** Callback when a column is dropped on another column */\n onColumnDrop?: (draggedColumnId: string, targetColumnId: string) => void;\n /** Saved column order from persistence */\n savedColumnOrder?: string[];\n /** Whether persistence is enabled */\n enablePersistence?: 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?: 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}\n\n// Helper function to render the appropriate input type based on column configuration\nconst renderEditField = (\n column: any,\n value: any,\n onChange: (value: any) => void,\n editingData: Record<string, any> = {},\n placeholder?: string\n) => {\n const columnDef = column.columnDef;\n \n // Check for custom field type\n if (columnDef.fieldType === 'select' && columnDef.fieldOptions) {\n // Use editAccessorKey if specified, otherwise use the column id\n const accessorKey = columnDef.editAccessorKey || column.id;\n const currentValue = editingData[accessorKey] || value || '';\n \n return (\n <Select\n value={currentValue}\n onValueChange={(newValue) => onChange({ [accessorKey]: newValue })}\n >\n <SelectTrigger className=\"h-8\">\n <SelectValue placeholder={placeholder || `Select ${columnDef.header || column.id}...`} />\n </SelectTrigger>\n <SelectContent>\n {columnDef.fieldOptions.map((option: any) => (\n <SelectItem key={option.value} value={option.value}>\n {option.label}\n </SelectItem>\n ))}\n </SelectContent>\n </Select>\n );\n }\n \n // Check for number type\n if (columnDef.fieldType === 'number') {\n return (\n <Input\n type=\"number\"\n value={value || ''}\n onChange={(e) => onChange(e.target.value)}\n placeholder={placeholder || `Enter ${columnDef.header || column.id}...`}\n className=\"h-8\"\n />\n );\n }\n \n // Check for date type\n if (columnDef.fieldType === 'date') {\n return (\n <Input\n type=\"date\"\n value={value || ''}\n onChange={(e) => onChange(e.target.value)}\n className=\"h-8\"\n />\n );\n }\n \n // Default to text input\n return (\n <Input\n type=\"text\"\n value={value || ''}\n onChange={(e) => onChange(e.target.value)}\n placeholder={placeholder || `Enter ${columnDef.header || column.id}...`}\n className=\"h-8\"\n />\n );\n};\n\n// Row component without memoization to ensure column visibility works\nconst MemoizedRow = ({ \n row, \n style, \n columnSizes, \n isEditing, \n editingData, \n onEditingDataChange,\n onSaveEditing,\n onCancelEditing,\n getRowId,\n grouping,\n editingRowId,\n hierarchical,\n actions\n}: { \n row: any; \n style?: React.CSSProperties;\n columnSizes: Record<string, number>;\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?: 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 actions?: 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}) => {\n const rowId = getRowId ? getRowId(row.original, row.index) : String(row.index);\n \n // Handle grouped rows\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 return (\n <React.Fragment>\n {/* Group Header Row */}\n <TableRow className=\"bg-sec-50 hover:bg-sec-100\" style={style}>\n <TableCell \n className={getTableCellClasses({\n isCompact: true,\n className: \"px-3 py-2 flex items-center font-medium\"\n })} \n colSpan={row.getAllCells().length}\n style={{\n width: '100%',\n minWidth: '100%',\n }}\n >\n <Button\n variant=\"ghost\"\n size=\"sm\"\n onClick={() => row.toggleExpanded()}\n className=\"p-0 h-auto mr-2\"\n >\n {isExpanded ? (\n <ChevronDown className=\"h-4 w-4\" />\n ) : (\n <ChevronRight className=\"h-4 w-4\" />\n )}\n </Button>\n <span className=\"text-sm\">\n {String(groupValue)} ({subRowsCount} items)\n </span>\n </TableCell>\n </TableRow>\n \n {/* Render sub-rows if expanded */}\n {isExpanded && row.subRows?.map((subRow: any) => {\n const subRowId = getRowId ? getRowId(subRow.original, subRow.index) : String(subRow.index);\n const isSubRowEditing = editingRowId === subRowId;\n \n return (\n <TableRow key={subRow.id} className=\"border-l-2 border-l-blue-200\" style={style}>\n {subRow.getVisibleCells().map((cell: any) => (\n <TableCell \n key={cell.id} \n className={getTableCellClasses({\n isCompact: true,\n className: \"px-3 py-2 pl-8 whitespace-normal break-words\"\n })}\n style={{\n width: columnSizes[cell.column.id] || (cell.column?.getSize ? cell.column.getSize() : 120),\n }}\n >\n {isSubRowEditing && cell.column.id !== 'actions' ? (\n renderEditField(cell.column, editingData?.[cell.column.id], (value) => {\n if (typeof value === 'object' && value !== null) {\n onEditingDataChange?.({ ...editingData, ...value });\n } else {\n onEditingDataChange?.({ ...editingData, [cell.column.id]: value });\n }\n }, editingData)\n ) : cell.column.id === 'actions' ? (\n <ActionButtons \n row={row} \n actions={actions} \n isEditing={isEditing}\n isParent={isParent}\n hierarchical={!!hierarchical}\n />\n ) : (\n flexRender(cell.column.columnDef.cell, {\n ...cell.getContext(),\n hierarchical: hierarchical,\n isParent: false,\n isChild: true,\n isHierarchical: false,\n rowId: subRowId,\n isExpanded: false,\n hasChildren: false\n })\n )}\n </TableCell>\n ))}\n </TableRow>\n );\n })}\n </React.Fragment>\n );\n }\n \n // Skip leaf rows when grouping is enabled\n if (grouping.length > 0 && typeof row.getParentRow === 'function' && row.getParentRow() && (!row.getIsGrouped || !row.getIsGrouped())) {\n return null;\n }\n \n // Regular row\n const visibleCells = row.getVisibleCells();\n const allCells = row.getAllCells ? row.getAllCells() : [];\n \n // Hierarchical row styling\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 // Calculate indentation for child rows\n const indentSize = hierarchical?.indentSize || 24;\n const indentation = isChild && hierarchical?.state ? \n calculateIndentation(hierarchicalRow, [], indentSize) : 0;\n \n // Apply hierarchical row classes\n const rowClassName = isHierarchical ? (\n isParent \n ? hierarchical?.parentRowClassName || 'bg-main-50 hover:bg-main-100 font-medium'\n : hierarchical?.childRowClassName || 'bg-sec-25 hover:bg-sec-50'\n ) : '';\n \n return (\n <TableRow \n key={row.id} \n style={{\n ...style,\n ...(isChild && indentation > 0 ? { paddingLeft: `${indentation}px` } : {})\n }}\n className={rowClassName}\n >\n {visibleCells.map((cell: any, cellIndex: number) => {\n // For hierarchical parent rows, add expansion button to the first cell\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 // Debug logging for expander button conditions (development only)\n if (process.env.NODE_ENV === 'development' && isParent && isFirstCell) {\n console.log('🔍 Expander Button Debug:', {\n rowId,\n isHierarchical,\n isParent,\n isFirstCell,\n hasHierarchicalState: !!hierarchical?.state,\n shouldShowExpansionButton,\n hasChildren,\n isExpanded\n });\n }\n \n \n return (\n <TableCell \n key={cell.id} \n className={getTableCellClasses({\n isCompact: true,\n className: \"px-3 py-2 whitespace-normal break-words\"\n })}\n style={{\n width: columnSizes[cell.column.id] || (cell.column?.getSize ? cell.column.getSize() : 120),\n minWidth: columnSizes[cell.column.id] ? undefined : 120,\n }}\n >\n <div className=\"flex items-center gap-2\">\n {/* Individual expansion button for hierarchical parent rows */}\n {shouldShowExpansionButton && hasChildren && (\n <Button\n variant=\"ghost\"\n size=\"sm\"\n onClick={() => hierarchical?.state?.toggleRow(rowId)}\n className=\"h-6 w-6 p-0 flex-shrink-0\"\n aria-label={isExpanded ? 'Collapse row' : 'Expand row'}\n title={isExpanded ? 'Collapse row' : 'Expand row'}\n >\n {isExpanded ? (\n <ChevronDown className=\"h-4 w-4\" />\n ) : (\n <ChevronRight className=\"h-4 w-4\" />\n )}\n </Button>\n )}\n \n {/* Cell content */}\n <div className=\"flex-1\">\n {isEditing && cell.column.id !== 'actions' ? (\n renderEditField(cell.column, editingData?.[cell.column.id], (value) => {\n if (typeof value === 'object' && value !== null) {\n onEditingDataChange?.({ ...editingData, ...value });\n } else {\n onEditingDataChange?.({ ...editingData, [cell.column.id]: value });\n }\n }, editingData)\n ) : cell.column.id === 'actions' ? (\n isEditing ? (\n <div className=\"flex gap-1\">\n <button\n onClick={onSaveEditing}\n className=\"h-8 w-8 p-0 hover:bg-muted/50 flex items-center justify-center\"\n title=\"Save changes\"\n >\n <svg className=\"h-4 w-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={onCancelEditing}\n className=\"h-8 w-8 p-0 hover:bg-muted/50 flex items-center justify-center\"\n title=\"Cancel changes\"\n >\n <svg className=\"h-4 w-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 </div>\n ) : (\n <ActionButtons \n row={row} \n actions={actions} \n isEditing={isEditing}\n isParent={isParent}\n hierarchical={!!hierarchical}\n />\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 </div>\n </div>\n </TableCell>\n );\n })}\n </TableRow>\n );\n};\n\nMemoizedRow.displayName = 'MemoizedRow';\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,\n getRowId,\n emptyState,\n isFiltered,\n onClearFilters,\n enableFiltering = false,\n showFilterRow = false,\n enableColumnReordering = false,\n onColumnOrderChange,\n onColumnDrop,\n savedColumnOrder,\n enablePersistence = false,\n tableId,\n dataLength,\n virtualHeight = 600,\n forceVirtualization = false,\n hierarchical,\n actions = []\n}: UnifiedTableBodyProps<TData>) {\n \n \n const headerRef = useRef<HTMLTableSectionElement>(null);\n const bodyRef = useRef<HTMLTableSectionElement>(null);\n const parentRef = useRef<HTMLDivElement>(null);\n const [columnSizes, setColumnSizes] = useState<Record<string, number>>({});\n\n // Determine if virtualization should be used\n const shouldVirtualize = forceVirtualization || dataLength > VIRTUALIZATION_THRESHOLD;\n \n // Get table data\n const rows = table.getRowModel().rows;\n const headerGroups = table.getHeaderGroups();\n\n // Virtual scrolling setup\n const virtualizer = useVirtualizer({\n count: rows.length,\n getScrollElement: () => parentRef.current,\n estimateSize: () => 40,\n overscan: 5,\n });\n\n const virtualRows = virtualizer.getVirtualItems();\n const totalSize = virtualizer.getTotalSize();\n\n // Calculate column sizes and sync between header and body\n useLayoutEffect(() => {\n if (headerRef.current && bodyRef.current) {\n const headerCells = headerRef.current.querySelectorAll('th');\n const newColumnSizes: Record<string, number> = {};\n const tableWidth = headerRef.current.closest('table')?.getBoundingClientRect().width || 0;\n const totalColumns = table.getHeaderGroups()[0]?.headers.length || 0;\n \n // Calculate column sizes with proper distribution\n table.getHeaderGroups()[0]?.headers.forEach((header, index) => {\n const headerCell = headerCells[index];\n if (headerCell) {\n const columnSize = header.column?.getSize ? header.column.getSize() : 150;\n const computedWidth = headerCell.getBoundingClientRect().width;\n \n // For fewer columns, ensure proper width distribution\n if (totalColumns > 0) {\n const availableWidth = tableWidth / totalColumns;\n const minWidth = Math.max(columnSize, 80); // Reduced minimum column width\n newColumnSizes[header.id] = Math.max(computedWidth, availableWidth, minWidth);\n } else {\n newColumnSizes[header.id] = Math.max(computedWidth, columnSize);\n }\n }\n });\n \n // Only update if sizes have actually changed\n const hasChanged = Object.keys(newColumnSizes).some(\n key => newColumnSizes[key] !== columnSizes[key]\n ) || Object.keys(columnSizes).length !== Object.keys(newColumnSizes).length;\n \n if (hasChanged) {\n setColumnSizes(newColumnSizes);\n }\n }\n }, [table, columnSizes]);\n\n // Render table content\n const renderTableContent = () => {\n if (rows.length === 0) {\n return (\n <TableRow>\n <TableCell \n colSpan={table.getVisibleFlatColumns().length} \n className=\"px-3 py-2\" \n role=\"status\"\n style={{\n width: '100%',\n minWidth: '100%',\n }}\n >\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 </TableCell>\n </TableRow>\n );\n }\n\n if (shouldVirtualize) {\n // Virtualized rendering\n return virtualRows.map((virtualRow) => {\n const row = rows[virtualRow.index];\n if (!row) return null;\n \n const rowId = getRowId ? getRowId(row.original, row.index) : String(row.index);\n const isEditing = editingRowId === rowId;\n \n return (\n <MemoizedRow\n key={row.id}\n row={row}\n columnSizes={columnSizes}\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 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 } else {\n // Standard rendering\n return rows.map((row) => {\n const rowId = getRowId ? getRowId(row.original, row.index) : String(row.index);\n const isEditing = editingRowId === rowId;\n \n return (\n <MemoizedRow\n key={row.id}\n row={row}\n columnSizes={columnSizes}\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 />\n );\n });\n }\n };\n\n return (\n <>\n {/* Table Header */}\n <TableHeader ref={headerRef}>\n {headerGroups.map((headerGroup) => (\n <TableRow key={headerGroup.id}>\n {/* Expand/Collapse All Button - Only show for hierarchical tables */}\n {hierarchical?.enabled && hierarchical?.hasAnyChildren && (\n <TableHead className=\"w-12\">\n <Button\n variant=\"ghost\"\n size=\"sm\"\n onClick={hierarchical.isAllExpanded ? hierarchical.collapseAll : hierarchical.expandAll}\n className=\"h-8 w-8 p-0\"\n aria-label={hierarchical.isAllExpanded ? 'Collapse all' : 'Expand all'}\n title={hierarchical.isAllExpanded ? 'Collapse all' : 'Expand all'}\n >\n {hierarchical.isAllExpanded ? (\n <ChevronDown className=\"h-4 w-4\" />\n ) : (\n <ChevronRight className=\"h-4 w-4\" />\n )}\n </Button>\n </TableHead>\n )}\n \n {headerGroup.headers\n .filter(header => {\n // Check if getIsVisible method exists and call it, otherwise assume visible\n return typeof header.column.getIsVisible === 'function' \n ? header.column.getIsVisible() \n : true;\n })\n .map((header) => (\n <DraggableColumnHeader\n key={header.id}\n header={header}\n enableReordering={enableColumnReordering}\n onColumnDrop={onColumnDrop}\n />\n ))}\n </TableRow>\n ))}\n </TableHeader>\n\n {/* Filter Row */}\n {enableFiltering && showFilterRow && (\n <TableHeader>\n <FilterRow\n table={table}\n visibleColumns={headerGroups[0]?.headers?.filter(header => {\n // Check if getIsVisible method exists and call it, otherwise assume visible\n return typeof header.column.getIsVisible === 'function' \n ? header.column.getIsVisible() \n : true;\n }) || []}\n />\n </TableHeader>\n )}\n\n {/* Unified Table Body - Same structure for both virtualized and standard */}\n {shouldVirtualize ? (\n <div\n ref={parentRef}\n className=\"overflow-auto\"\n style={{ height: `${virtualHeight}px` }}\n >\n <div\n style={{\n height: `${totalSize}px`,\n width: '100%',\n position: 'relative',\n }}\n >\n <table className=\"w-full\" style={{ tableLayout: 'fixed', width: '100%' }}>\n <TableBody ref={bodyRef}>\n {/* Creation Row */}\n {isCreating && (\n <TableRow>\n {headerGroups[0]?.headers\n ?.filter(header => {\n // Check if getIsVisible method exists and call it, otherwise assume visible\n return typeof header.column.getIsVisible === 'function' \n ? header.column.getIsVisible() \n : true;\n })\n ?.filter(header => header.column.id !== 'actions' && header.column.id !== 'select')\n ?.map((header) => (\n <TableCell \n key={header.column.id} \n className={getTableCellClasses({\n isCompact: true,\n className: \"px-3 py-2\"\n })}\n style={{\n width: columnSizes[header.column.id] || (header.column?.getSize ? header.column.getSize() : 120),\n }}\n >\n {renderEditField(header.column, creationData[header.column.id], (value) => {\n if (typeof value === 'object' && value !== null) {\n onCreationDataChange({ ...creationData, ...value });\n } else {\n onCreationDataChange({ ...creationData, [header.column.id]: value });\n }\n }, creationData)}\n </TableCell>\n ))}\n <TableCell \n className={getTableCellClasses({\n isCompact: true,\n className: \"px-3 py-2 flex gap-1\"\n })}\n style={{\n width: columnSizes['actions'] || 100,\n }}\n >\n <button\n onClick={onSaveCreation}\n className=\"h-8 w-8 p-0 hover:bg-muted/50 flex items-center justify-center\"\n title=\"Save new row\"\n >\n <svg className=\"h-4 w-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=\"h-8 w-8 p-0 hover:bg-muted/50 flex items-center justify-center\"\n title=\"Cancel new row\"\n >\n <svg className=\"h-4 w-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 </TableCell>\n </TableRow>\n )}\n \n {renderTableContent()}\n </TableBody>\n </table>\n </div>\n </div>\n ) : (\n <TableBody ref={bodyRef}>\n {/* Creation Row */}\n {isCreating && (\n <TableRow>\n {headerGroups[0]?.headers\n ?.filter(header => {\n // Check if getIsVisible method exists and call it, otherwise assume visible\n return typeof header.column.getIsVisible === 'function' \n ? header.column.getIsVisible() \n : true;\n })\n ?.filter(header => header.column.id !== 'actions' && header.column.id !== 'select')\n ?.map((header) => (\n <TableCell \n key={header.column.id} \n className={getTableCellClasses({\n isCompact: true,\n className: \"px-3 py-2\"\n })}\n style={{\n width: columnSizes[header.column.id] || (header.column?.getSize ? header.column.getSize() : 120),\n }}\n >\n {renderEditField(header.column, creationData[header.column.id], (value) => {\n if (typeof value === 'object' && value !== null) {\n onCreationDataChange({ ...creationData, ...value });\n } else {\n onCreationDataChange({ ...creationData, [header.column.id]: value });\n }\n }, creationData)}\n </TableCell>\n ))}\n <TableCell \n className={getTableCellClasses({\n isCompact: true,\n className: \"px-3 py-2 flex gap-1\"\n })}\n style={{\n width: columnSizes['actions'] || 100,\n }}\n >\n <button\n onClick={onSaveCreation}\n className=\"h-8 w-8 p-0 hover:bg-muted/50 flex items-center justify-center\"\n title=\"Save new row\"\n >\n <svg className=\"h-4 w-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=\"h-8 w-8 p-0 hover:bg-muted/50 flex items-center justify-center\"\n title=\"Cancel new row\"\n >\n <svg className=\"h-4 w-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 </TableCell>\n </TableRow>\n )}\n \n {renderTableContent()}\n </TableBody>\n )}\n\n </>\n );\n}\n","/**\n * @file Table Component System\n * @package @jmruthers/pace-core\n * @module Components/Table\n * @since 0.1.0\n *\n * A comprehensive table component system for displaying tabular data.\n * Provides accessible table components with consistent styling and behavior.\n *\n * Features:\n * - Semantic HTML table structure\n * - Consistent styling and spacing\n * - Hover states and transitions\n * - Responsive design\n * - Accessibility compliant\n * - Customizable styling\n * - Checkbox support\n * - Caption support\n *\n * @example\n * ```tsx\n * // Basic table\n * <Table>\n * <TableCaption>A list of your recent invoices.</TableCaption>\n * <TableHeader>\n * <TableRow>\n * <TableHead>Invoice</TableHead>\n * <TableHead>Status</TableHead>\n * <TableHead>Method</TableHead>\n * <TableHead>Amount</TableHead>\n * </TableRow>\n * </TableHeader>\n * <TableBody>\n * <TableRow>\n * <TableCell>INV001</TableCell>\n * <TableCell>Paid</TableCell>\n * <TableCell>Credit Card</TableCell>\n * <TableCell>$250.00</TableCell>\n * </TableRow>\n * <TableRow>\n * <TableCell>INV002</TableCell>\n * <TableCell>Pending</TableCell>\n * <TableCell>PayPal</TableCell>\n * <TableCell>$150.00</TableCell>\n * </TableRow>\n * </TableBody>\n * <TableFooter>\n * <TableRow>\n * <TableCell colSpan={3}>Total</TableCell>\n * <TableCell>$400.00</TableCell>\n * </TableRow>\n * </TableFooter>\n * </Table>\n * \n * // Table with checkboxes\n * <Table>\n * <TableHeader>\n * <TableRow>\n * <TableHead className=\"w-12\">\n * <Checkbox />\n * </TableHead>\n * <TableHead>Name</TableHead>\n * <TableHead>Email</TableHead>\n * </TableRow>\n * </TableHeader>\n * <TableBody>\n * <TableRow>\n * <TableCell>\n * <Checkbox />\n * </TableCell>\n * <TableCell>John Doe</TableCell>\n * <TableCell>john@example.com</TableCell>\n * </TableRow>\n * </TableBody>\n * </Table>\n * ```\n *\n * @accessibility\n * - WCAG 2.1 AA compliant\n * - Proper table semantics\n * - Screen reader support\n * - Keyboard navigation\n * - Focus management\n * - High contrast support\n * - Caption for table description\n *\n * @dependencies\n * - React 18+ - Hooks and refs\n * - Tailwind CSS - Styling\n */\n\nimport * as React from \"react\"\n\nimport { cn } from \"../../utils/cn\"\n\n/**\n * Table component\n * The main table container with semantic HTML structure\n * \n * @param props - Table configuration and styling\n * @param ref - Forwarded ref to the table element\n * @returns JSX.Element - The rendered table element\n * \n * @example\n * ```tsx\n * <Table>\n * <TableHeader>...</TableHeader>\n * <TableBody>...</TableBody>\n * </Table>\n * ```\n */\nconst Table = React.forwardRef<\n HTMLTableElement,\n React.HTMLAttributes<HTMLTableElement>\n>(({ className, ...props }, ref) => (\n <table\n ref={ref}\n className={cn(\"w-full caption-bottom text-sm\", className)}\n {...props}\n />\n))\nTable.displayName = \"Table\"\n\nconst TableHeader = React.forwardRef<\n HTMLTableSectionElement,\n React.HTMLAttributes<HTMLTableSectionElement>\n>(({ className, ...props }, ref) => (\n <thead ref={ref} className={cn(\"[&_tr]:border-b\", className)} {...props} />\n))\nTableHeader.displayName = \"TableHeader\"\n\nconst TableBody = React.forwardRef<\n HTMLTableSectionElement,\n React.HTMLAttributes<HTMLTableSectionElement>\n>(({ className, ...props }, ref) => (\n <tbody\n ref={ref}\n className={cn(\"[&_tr:last-child]:border-0\", className)}\n {...props}\n />\n))\nTableBody.displayName = \"TableBody\"\n\nconst TableFooter = React.forwardRef<\n HTMLTableSectionElement,\n React.HTMLAttributes<HTMLTableSectionElement>\n>(({ className, ...props }, ref) => (\n <tfoot\n ref={ref}\n className={cn(\n \"border-t bg-muted/50 font-medium [&>tr]:last:border-b-0\",\n className\n )}\n {...props}\n />\n))\nTableFooter.displayName = \"TableFooter\"\n\nconst TableRow = React.forwardRef<\n HTMLTableRowElement,\n React.HTMLAttributes<HTMLTableRowElement>\n>(({ className, ...props }, ref) => (\n <tr\n ref={ref}\n className={cn(\n \"border-b transition-colors hover:bg-muted/50 data-[state=selected]:bg-muted\",\n className\n )}\n {...props}\n />\n))\nTableRow.displayName = \"TableRow\"\n\nconst TableHead = React.forwardRef<\n HTMLTableCellElement,\n React.ThHTMLAttributes<HTMLTableCellElement>\n>(({ className, ...props }, ref) => (\n <th\n ref={ref}\n className={cn(\n \"h-12 px-4 text-left align-middle font-medium text-muted-foreground [&:has([role=checkbox])]:pr-0\",\n className\n )}\n {...props}\n />\n))\nTableHead.displayName = \"TableHead\"\n\nconst TableCell = React.forwardRef<\n HTMLTableCellElement,\n React.TdHTMLAttributes<HTMLTableCellElement>\n>(({ className, ...props }, ref) => (\n <td\n ref={ref}\n className={cn(\"p-4 align-middle [&:has([role=checkbox])]:pr-0\", className)}\n {...props}\n />\n))\nTableCell.displayName = \"TableCell\"\n\nconst TableCaption = React.forwardRef<\n HTMLTableCaptionElement,\n React.HTMLAttributes<HTMLTableCaptionElement>\n>(({ className, ...props }, ref) => (\n <caption\n ref={ref}\n className={cn(\"mt-4 text-sm text-muted-foreground\", className)}\n {...props}\n />\n))\nTableCaption.displayName = \"TableCaption\"\n\nexport {\n Table,\n TableHeader,\n TableBody,\n TableCaption,\n TableCell,\n TableFooter,\n TableHead,\n TableRow,\n}\n","import React from 'react';\nimport { Database, Search, Plus, User } from 'lucide-react';\nimport { Button } from '../../Button/Button';\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\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 className=\"flex flex-col items-center justify-center p-8 text-center\">\n <Icon \n role=\"img\" \n aria-hidden=\"true\" \n className=\"h-12 w-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=\"h-4 w-4 mr-2\" />\n Clear filters\n </Button>\n )}\n \n {action && (\n <Button onClick={action.onClick}>\n <Plus className=\"h-4 w-4 mr-2\" />\n {action.label}\n </Button>\n )}\n </div>\n ) : null}\n </div>\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';\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\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 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 || `Filter ${column.id}...`} />\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 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 || `Filter ${column.id}...`}\n className=\"h-8\"\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 || `Filter ${column.id}...`}\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 || `Filter ${column.id}...`}\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=\"h-3 w-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 { ColumnFilter } from './ColumnFilter';\nimport type { Header, Table } from '@tanstack/react-table';\n\ninterface FilterRowProps<TData> {\n table: Table<TData>;\n visibleColumns: Header<TData, unknown>[];\n}\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 = (columnId: string) => {\n const column = table.getColumn(columnId);\n if (!column) return [];\n\n // Check if column has explicit field options\n const columnDef = column.columnDef as any;\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 };\n\n // Determine filter type based on column data\n const getFilterType = (columnId: string) => {\n const column = table.getColumn(columnId);\n if (!column) return 'text';\n\n // Check if column has explicit filter type configuration\n const columnDef = column.columnDef as any;\n if (columnDef.filterType) {\n return columnDef.filterType;\n }\n\n // Check if it's a date column\n if (columnId.toLowerCase().includes('date') || columnId.toLowerCase().includes('time')) {\n return 'date';\n }\n\n // Check if it's a number column\n const firstValue = table.getRowModel().rows[0]?.getValue(columnId);\n if (typeof firstValue === 'number') {\n return 'number';\n }\n\n // Check if it has limited unique values (good for select)\n const uniqueValues = getColumnOptions(columnId);\n if (uniqueValues.length <= 10 && uniqueValues.length > 1) {\n return 'select';\n }\n\n return 'text';\n };\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 style={{ width: header.getSize() }}\n >\n {canFilter ? (\n <ColumnFilter\n column={column}\n filterType={filterType}\n options={options}\n placeholder={`Filter ${column.id}...`}\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 { Button } from '../../Button/Button';\nimport { MoreHorizontal } from 'lucide-react';\nimport {\n Select,\n SelectContent,\n SelectItem,\n SelectTrigger,\n SelectValue,\n} from '../../Select/Select';\n\ninterface ActionButtonsProps {\n row: any;\n rowId?: string;\n index?: number;\n actions?: 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 // Hierarchical action properties\n showForParent?: boolean;\n showForChild?: boolean;\n parentIcon?: any;\n childIcon?: any;\n parentLabel?: string;\n childLabel?: string;\n }>;\n isEditing?: boolean;\n className?: string;\n // Hierarchical context\n isParent?: boolean;\n hierarchical?: boolean;\n}\n\nexport function ActionButtons({ \n row, \n actions = [],\n isEditing = false,\n isParent = false,\n hierarchical = false,\n}: ActionButtonsProps) {\n // Return null if no actions are provided\n if (actions.length === 0) {\n return null;\n }\n\n // Use provided actions\n const allActions = actions;\n\n // Filter actions based on current mode, visibility, and hierarchical context\n const visibleActions = allActions.filter(action => {\n if (action.hidden) return false;\n \n // Check hierarchical visibility\n if (hierarchical) {\n if (action.showForParent && !isParent) return false;\n if (action.showForChild && isParent) return false;\n }\n \n // Check visible function/boolean if provided\n if (typeof action.visible === 'function') {\n return action.visible(row);\n } else if (typeof action.visible === 'boolean') {\n return action.visible;\n }\n \n if (isEditing) {\n return action.showInEditMode !== false;\n } else {\n return action.hideInViewMode !== true && action.showInViewMode !== false;\n }\n });\n\n // Return null if no visible actions\n if (visibleActions.length === 0) {\n return null;\n }\n\n // If only a few actions, render them as individual icon-only buttons\n if (visibleActions.length <= 6) {\n return (\n <>\n {visibleActions.map((action, actionIndex) => {\n // Determine the appropriate icon and label based on hierarchical context\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 const isDisabled = typeof action.disabled === 'function' ? action.disabled(row) : action.disabled;\n \n return (\n <Button\n key={actionIndex}\n variant={action.variant === 'destructive' ? 'destructive' : 'ghost'}\n size=\"sm\"\n onClick={() => action.onClick(row.original)}\n disabled={isDisabled}\n aria-disabled={isDisabled}\n data-testid={action.testId}\n aria-label={label}\n className=\"h-8 w-8 p-0\"\n >\n {Icon && <Icon className=\"h-4 w-4\" />}\n </Button>\n );\n })}\n </>\n );\n }\n\n // For many actions, use dropdown menu\n return (\n <Select>\n <SelectTrigger asChild>\n <Button variant=\"ghost\" className=\"h-8 w-8 p-0\">\n <span className=\"sr-only\">Open menu</span>\n <MoreHorizontal className=\"h-4 w-4\" />\n </Button>\n </SelectTrigger>\n <SelectContent className=\"!bg-main-50 border border-sec-200 shadow-lg z-[9999]\" style={{ backgroundColor: 'white' }}>\n {visibleActions.map((action, actionIndex) => {\n // Determine the appropriate icon and label based on hierarchical context\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 (\n <SelectItem\n key={actionIndex}\n value={`action-${actionIndex}`}\n onClick={() => action.onClick(row.original)}\n className={action.variant === 'destructive' ? 'text-acc-600' : ''}\n >\n {Icon && <Icon className=\"mr-2 h-4 w-4\" />}\n {label}\n </SelectItem>\n );\n })}\n </SelectContent>\n </Select>\n );\n}\n\n","import React, { useState } from 'react';\nimport { Button } from '../../Button/Button';\nimport { TableHead } from '../../Table/Table';\nimport { ChevronUp, ChevronDown,ChevronsUpDown } from 'lucide-react';\nimport { cn } from '../../../utils/cn';\nimport type { Header } from '@tanstack/react-table';\n\ninterface DraggableColumnHeaderProps<TData> {\n header: Header<TData, unknown>;\n onMoveLeft?: () => void;\n onMoveRight?: () => void;\n canMoveLeft?: boolean;\n canMoveRight?: boolean;\n enableReordering?: boolean;\n onColumnDrop?: (draggedColumnId: string, targetColumnId: string) => void;\n}\n\nexport function DraggableColumnHeader<TData>({\n header,\n onMoveLeft,\n onMoveRight,\n canMoveLeft = false,\n canMoveRight = false,\n enableReordering = false,\n onColumnDrop,\n}: DraggableColumnHeaderProps<TData>) {\n const [isDragging, setIsDragging] = useState(false);\n const [dragOver, setDragOver] = useState(false);\n\n const isSortable = header.column.getCanSort ? header.column.getCanSort() : false;\n const ariaSort = isSortable\n ? (header.column.getIsSorted ? (header.column.getIsSorted() === 'asc'\n ? 'ascending'\n : header.column.getIsSorted() === 'desc'\n ? 'descending'\n : 'none') : 'none')\n : undefined;\n\n const handleDragStart = (e: React.DragEvent) => {\n if (!enableReordering) return;\n \n setIsDragging(true);\n e.dataTransfer.setData('text/plain', header.id);\n e.dataTransfer.effectAllowed = 'move';\n \n // Add visual feedback\n if (e.currentTarget instanceof HTMLElement) {\n e.currentTarget.style.opacity = '0.5';\n }\n };\n\n const handleDragEnd = (e: React.DragEvent) => {\n setIsDragging(false);\n setDragOver(false);\n \n // Reset visual feedback\n if (e.currentTarget instanceof HTMLElement) {\n e.currentTarget.style.opacity = '1';\n }\n };\n\n const handleDragOver = (e: React.DragEvent) => {\n if (!enableReordering) return;\n \n e.preventDefault();\n e.dataTransfer.dropEffect = 'move';\n setDragOver(true);\n };\n\n const handleDragLeave = (e: React.DragEvent) => {\n if (!enableReordering) return;\n \n // Only set dragOver to false if we're leaving the element entirely\n if (!e.currentTarget.contains(e.relatedTarget as Node)) {\n setDragOver(false);\n }\n };\n\n const handleDrop = (e: React.DragEvent) => {\n if (!enableReordering) return;\n \n e.preventDefault();\n setDragOver(false);\n \n const draggedHeaderId = e.dataTransfer.getData('text/plain');\n if (draggedHeaderId && draggedHeaderId !== header.id && onColumnDrop) {\n onColumnDrop(draggedHeaderId, header.id);\n }\n };\n\n return (\n <TableHead\n className={cn(\n 'px-3 py-2 text-sm font-medium text-left relative group',\n isSortable && 'cursor-pointer hover:bg-sec-50',\n isDragging && 'opacity-50',\n dragOver && 'bg-main-50 border-main-200',\n enableReordering && 'cursor-move'\n )}\n style={{\n width: header.getSize ? header.getSize() : 150,\n minWidth: header.getSize ? header.getSize() : 150,\n }}\n draggable={enableReordering}\n onDragStart={handleDragStart}\n onDragEnd={handleDragEnd}\n onDragOver={handleDragOver}\n onDragLeave={handleDragLeave}\n onDrop={handleDrop}\n {...(isSortable ? { 'aria-sort': ariaSort } : {})}\n >\n <div className=\"flex items-center justify-between\">\n <div className=\"flex items-center gap-1 flex-1\">\n {header.isPlaceholder ? null : (\n isSortable ? (\n <Button\n variant=\"ghost\"\n className=\"h-auto p-0 font-medium hover:bg-transparent flex-1 justify-start\"\n onClick={header.column.getToggleSortingHandler()}\n aria-label={`Sort by ${typeof header.column.columnDef.header === 'string' ? header.column.columnDef.header : 'column'}`}\n tabIndex={0}\n >\n <div className=\"flex items-center gap-1\">\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=\"h-4 w-4\" />\n ) : header.column.getIsSorted() === 'desc' ? (\n <ChevronDown className=\"h-4 w-4\" />\n ) : (\n <ChevronsUpDown className=\"h-4 w-4\" />\n )}\n </div>\n </Button>\n ) : (\n <div className=\"flex-1\">\n {typeof header.column.columnDef.header === 'function'\n ? header.column.columnDef.header(header.getContext())\n : header.column.columnDef.header}\n </div>\n )\n )}\n </div>\n </div>\n </TableHead>\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';\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 * Sorts hierarchical data to ensure parent rows come before their children\n */\nexport function sortHierarchicalData<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 * 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 * Gets the depth level of a row in the hierarchy\n */\nexport function getRowDepth<TData extends HierarchicalDataRow>(\n row: TData,\n allData: TData[]\n): number {\n if (row.isParent) {\n return 0;\n }\n \n if (!row.parentId) {\n return 0;\n }\n \n // Find parent and calculate depth\n const parent = allData.find(p => p.id === row.parentId);\n if (!parent) {\n return 0;\n }\n \n return 1 + getRowDepth(parent, allData);\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 */\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 * 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","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/cn';\nimport { Select, SelectContent, SelectItem, SelectTrigger, SelectValue } from '../../Select/Select';\nimport type { PaginationMode, ServerSideResponse, DataRecord } from '../types';\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\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 // Get pagination state based on mode\n const getPaginationState = () => {\n if (paginationMode === 'server' && serverData) {\n return {\n currentPageSize: serverData.pageSize,\n currentPageIndex: serverData.pageIndex,\n pageCount: serverData.pageCount,\n totalRows: serverData.totalCount,\n canPreviousPage: serverData.hasPreviousPage,\n canNextPage: serverData.hasNextPage,\n };\n }\n\n // Client or hybrid mode\n const state = table.getState().pagination;\n return {\n currentPageSize: state.pageSize,\n currentPageIndex: state.pageIndex,\n pageCount: table.getPageCount(),\n totalRows: totalCount ?? table.getRowCount(),\n canPreviousPage: table.getCanPreviousPage(),\n canNextPage: table.getCanNextPage(),\n };\n };\n\n const {\n currentPageSize,\n currentPageIndex,\n pageCount,\n totalRows,\n canPreviousPage,\n canNextPage,\n } = getPaginationState();\n\n // Handle page size changes\n const handlePageSizeChange = (newPageSize: number) => {\n if (paginationMode === 'server') {\n onPageSizeChange?.(newPageSize);\n } else {\n table.setPageSize(newPageSize);\n }\n };\n\n // Handle page navigation\n const handleFirstPage = () => {\n if (paginationMode === 'server') {\n onPageChange?.(0);\n } else {\n table.setPageIndex(0);\n }\n };\n\n const handlePreviousPage = () => {\n if (paginationMode === 'server') {\n onPageChange?.(Math.max(0, currentPageIndex - 1));\n } else {\n table.previousPage();\n }\n };\n\n const handleNextPage = () => {\n if (paginationMode === 'server') {\n onPageChange?.(Math.min(pageCount - 1, currentPageIndex + 1));\n } else {\n table.nextPage();\n }\n };\n\n const handleLastPage = () => {\n if (paginationMode === 'server') {\n onPageChange?.(pageCount - 1);\n } else {\n table.setPageIndex(pageCount - 1);\n }\n };\n\n // Calculate display range\n const startRow = currentPageIndex * currentPageSize + 1;\n const endRow = Math.min((currentPageIndex + 1) * currentPageSize, totalRows);\n\n // Get mode-specific page size options\n const getPageSizeOptions = () => {\n switch (paginationMode) {\n case 'server':\n return pageSizeOptions.filter(size => size <= 250); // Limit server-side page sizes\n case 'hybrid':\n return pageSizeOptions.filter(size => size >= 50); // Hybrid mode prefers larger pages\n default:\n return pageSizeOptions;\n }\n };\n\n const availablePageSizes = getPageSizeOptions();\n\n // Performance mode indicator\n const getModeIcon = () => {\n switch (paginationMode) {\n case 'server':\n return <Server className=\"h-3 w-3\" />;\n case 'hybrid':\n return <Database className=\"h-3 w-3\" />;\n default:\n return <Zap className=\"h-3 w-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\n return (\n <footer\n aria-label=\"pagination\"\n className=\"mx-auto grid grid-cols-[auto_auto_1fr_auto_auto_auto_auto] gap-4\"\n >\n {/* Left side - Page Size Selector */}\n \n <p className=\"text-sm text-sec-600\">Rows per page</p>\n <Select\n value={currentPageSize?.toString() || '10'}\n selectedText={currentPageSize?.toString() || '10'}\n onValueChange={(value) => handlePageSizeChange(Number(value))}\n disabled={isLoading}\n className=\"w-36 h-8\"\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 {pageSizeOptions.map((pageSize) => (\n <SelectItem key={pageSize} value={pageSize?.toString() || '10'}>\n {pageSize}\n </SelectItem>\n ))}\n </SelectContent>\n </Select>\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\">\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=\"h-8 w-8 p-0\"\n onClick={handleFirstPage}\n disabled={!canPreviousPage || isLoading}\n aria-label=\"Go to first page\"\n tabIndex={0}\n >\n <ChevronsLeft className=\"h-4 w-4\" />\n </Button>\n\n <Button\n variant=\"outline\"\n size=\"sm\"\n className=\"h-8 w-8 p-0\"\n onClick={handlePreviousPage}\n disabled={!canPreviousPage || isLoading}\n aria-label=\"Go to previous page\"\n tabIndex={0}\n >\n <ChevronLeft className=\"h-4 w-4\" />\n </Button>\n\n <Button\n variant=\"outline\"\n size=\"sm\"\n className=\"h-8 w-8 p-0\"\n onClick={handleNextPage}\n disabled={!canNextPage || isLoading}\n aria-label=\"Go to next page\"\n tabIndex={0}\n >\n <ChevronRight className=\"h-4 w-4\" />\n </Button>\n\n <Button\n variant=\"outline\"\n size=\"sm\"\n className=\"h-8 w-8 p-0\"\n onClick={handleLastPage}\n disabled={!canNextPage || isLoading}\n aria-label=\"Go to last page\"\n tabIndex={0}\n >\n <ChevronsRight className=\"h-4 w-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 } = props;\n\n const { pageCount } = (() => {\n if (paginationMode === 'server' && serverData) {\n return { pageCount: serverData.pageCount };\n }\n return { pageCount: table.getPageCount() };\n })();\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 if (paginationMode === 'server') {\n onPageChange?.(pageIndex);\n } else {\n table.setPageIndex(pageIndex);\n }\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 <span>Jump to page:</span>\n <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\"\n placeholder=\"1\"\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","import React from 'react';\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 h-6 w-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","/**\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 { Upload, FileText, AlertCircle } from 'lucide-react';\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: any[]) => 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 */\nexport function ImportModal({ isOpen, onClose, onImport, config = {} }: ImportModalProps) {\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<any[] | null>(null);\n const [totalCount, setTotalCount] = useState<number>(0);\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 // 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 const handleFileSelect = async (event: React.ChangeEvent<HTMLInputElement>) => {\n const selectedFile = event.target.files?.[0];\n console.log('📁 File selected:', selectedFile?.name);\n if (selectedFile) {\n setFile(selectedFile);\n setError(null);\n \n // Generate preview\n try {\n const text = await selectedFile.text();\n console.log('📄 File content length:', text.length);\n const data = processCSV(text);\n console.log('📊 Parsed CSV data:', data.length, 'rows');\n console.log('👀 Setting preview data:', data.slice(0, 5));\n setPreviewData(data.slice(0, 5)); // Show first 5 rows as preview\n setTotalCount(data.length); // Store total count\n console.log('👀 Preview data state should be updated');\n } catch (err) {\n console.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 const processCSV = (csvText: string): any[] => {\n console.log('📄 Raw CSV text:', csvText.substring(0, 200) + '...');\n \n const lines = csvText.split('\\n').filter(line => line.trim());\n console.log('📄 CSV lines count:', lines.length);\n console.log('📄 First few lines:', lines.slice(0, 3));\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 console.log('📄 Parsed headers:', headers);\n \n const data = lines.slice(1).map((line, index) => {\n const values = parseCSVLine(line).map(v => v.replace(/\"/g, '').trim());\n const row: any = {};\n headers.forEach((header, colIndex) => {\n row[header] = values[colIndex] || '';\n });\n console.log(`📄 Row ${index + 1}:`, row);\n return row;\n });\n\n console.log('📄 Final parsed data:', data);\n return data;\n };\n\n const handleImport = async () => {\n if (!file) return;\n\n setIsProcessing(true);\n setError(null);\n\n try {\n const text = await file.text();\n const data = processCSV(text);\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 await result;\n }\n \n onClose();\n setFile(null);\n } catch (err) {\n setError(err instanceof Error ? err.message : 'Failed to process file');\n } finally {\n if (isMountedRef.current) {\n setIsProcessing(false);\n }\n }\n };\n\n const handleClose = () => {\n setFile(null);\n setError(null);\n setPreviewData(null);\n setTotalCount(0);\n onClose();\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=\"h-8 w-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=\"h-4 w-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=\"h-4 w-4\" />\n <span className=\"text-sm\">{error}</span>\n </div>\n )}\n\n\n {previewData && previewData.length > 0 && (\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: any, 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 )}\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 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 from 'react';\nimport { ImportModal, type ImportModalConfig } from './ImportModal';\n\n/**\n * Props interface for the DataTableModals component\n * @public\n */\nexport interface DataTableModalsProps {\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: any[]) => void | Promise<void>;\n /** Configuration object for customizing import modal text content */\n importModalConfig?: ImportModalConfig;\n \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 */\nexport function DataTableModals({\n showImportModal,\n onCloseImportModal,\n onImport,\n importModalConfig,\n}: DataTableModalsProps) {\n return (\n <>\n <ImportModal\n isOpen={showImportModal}\n onClose={onCloseImportModal}\n onImport={onImport}\n config={importModalConfig}\n />\n\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';\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\nexport class DataTableErrorBoundary extends Component<\n DataTableErrorBoundaryProps,\n ErrorBoundaryState\n> {\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 console.error('DataTable 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 console.warn('DataTable 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\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 * - 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\n * <Alert>\n * <AlertTitle>Success</AlertTitle>\n * <AlertDescription>Your changes have been saved.</AlertDescription>\n * </Alert>\n *\n * // Destructive alert with icon\n * <Alert variant=\"destructive\">\n * <ErrorIcon />\n * <div>\n * <AlertTitle>Error</AlertTitle>\n * <AlertDescription>Something went wrong.</AlertDescription>\n * </div>\n * </Alert>\n *\n * // Inline alert (renders as fragment with strong/span)\n * <Alert variant=\"inline\">\n * <AlertTitle>Note:</AlertTitle>\n * <AlertDescription>This is an inline message.</AlertDescription>\n * </Alert>\n * ```\n *\n * @accessibility\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/cn\"\n\n// Context to share variant with child components\nconst AlertContext = React.createContext<{ variant?: \"default\" | \"destructive\" | \"inline\" | null }>({ 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 HTMLDivElement,\n React.HTMLAttributes<HTMLDivElement> & { 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 <div\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 HTMLParagraphElement,\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';\n\ninterface UseColumnOrderPersistenceProps {\n tableId?: string;\n defaultOrder?: string[];\n enablePersistence?: boolean;\n}\n\nexport function useColumnOrderPersistence({\n tableId,\n defaultOrder = [],\n enablePersistence = false,\n}: UseColumnOrderPersistenceProps) {\n const [columnOrder, setColumnOrder] = useState<string[]>(defaultOrder);\n const [isLoaded, setIsLoaded] = useState(false);\n\n // Generate a unique key for this table\n const storageKey = tableId ? `datatable-column-order-${tableId}` : 'datatable-column-order';\n\n // Load column order from localStorage on mount\n useEffect(() => {\n if (!enablePersistence || !tableId) {\n setIsLoaded(true);\n return;\n }\n\n try {\n const savedOrder = localStorage.getItem(storageKey);\n if (savedOrder) {\n const parsedOrder = JSON.parse(savedOrder);\n if (Array.isArray(parsedOrder)) {\n setColumnOrder(parsedOrder);\n }\n }\n } catch (error) {\n console.warn('Failed to load column order from localStorage:', error);\n } finally {\n setIsLoaded(true);\n }\n }, [enablePersistence, tableId, storageKey]);\n\n // Save column order to localStorage\n const saveColumnOrder = useCallback((newOrder: string[]) => {\n if (!enablePersistence || !tableId) return;\n\n try {\n localStorage.setItem(storageKey, JSON.stringify(newOrder));\n } catch (error) {\n console.warn('Failed to save column order to localStorage:', error);\n }\n }, [enablePersistence, tableId, storageKey]);\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 && tableId) {\n try {\n localStorage.removeItem(storageKey);\n } catch (error) {\n console.warn('Failed to remove column order from localStorage:', error);\n }\n }\n }, [defaultOrder, enablePersistence, tableId, storageKey]);\n\n // Clear all saved preferences\n const clearAllPreferences = useCallback(() => {\n if (!enablePersistence) 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 console.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","/**\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\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) {\n // Initialize expanded state based on defaultExpanded config\n const getInitialExpandedState = useCallback((): Set<string> => {\n if (!config?.defaultExpanded) {\n return new Set();\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();\n }, [data, config?.defaultExpanded]);\n\n const [expandedRows, setExpandedRows] = useState<Set<string>>(getInitialExpandedState);\n\n // Reset expanded state when data changes\n useEffect(() => {\n setExpandedRows(getInitialExpandedState());\n }, [getInitialExpandedState]);\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 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 } from '../types';\n\n// ============================================================================\n// STATE INTERFACE\n// ============================================================================\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, any>;\n editingRowId: string | null;\n editingData: Record<string, any>;\n \n // UI state\n showImportModal: boolean;\n showFilterRow: boolean;\n \n // Search state\n searchQuery: string;\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, any> }\n | { type: 'CLEAR_CREATION_DATA' }\n | { type: 'SET_EDITING_ROW'; payload: { rowId: string | null; data: Record<string, any> } }\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\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): DataTableState<TData> {\n return {\n sorting: [],\n columnFilters: [],\n columnVisibility: {},\n grouping: [],\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}\n\nexport function useDataTableState<TData extends DataRecord>({\n initialPageSize = 10,\n columnIds = [],\n initialRowSelection = {},\n onRowSelectionChange\n}: UseDataTableStateOptions<TData> = {}) {\n \n const initialState = useMemo(() => \n createInitialState<TData>(initialPageSize, columnIds),\n [initialPageSize, columnIds]\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(() => ({\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, any>) => \n dispatch({ type: 'SET_CREATION_DATA', payload: data }),\n \n clearCreationData: () => \n dispatch({ type: 'CLEAR_CREATION_DATA' }),\n \n setEditingRow: (rowId: string | null, data: Record<string, any>) => \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(() => ({\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 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 while preserving parent-child relationships\n * Parent rows maintain their order, child rows are sorted within their parent groups\n */\nexport function sortHierarchicalData<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): any {\n // Handle nested property access (e.g., \"user.name\")\n const keys = columnId.split('.');\n let value: any = row;\n \n for (const key of keys) {\n if (value && typeof value === 'object' && key in value) {\n value = value[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: any, b: any): 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: any[]\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: any[]\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 * Utility functions for automatic column sizing based on content\n */\n\n/**\n * Calculate optimal column width based on content\n * @param content - The text content to measure\n * @param minWidth - Minimum width in pixels\n * @param maxWidth - Maximum width in pixels\n * @param padding - Additional padding to add\n * @returns Calculated width in pixels\n */\nexport function calculateContentWidth(\n content: string,\n minWidth: number = 80,\n maxWidth: number = 400,\n padding: number = 32\n): number {\n if (!content || typeof content !== 'string') {\n return minWidth;\n }\n\n // Rough estimation: average character width is ~8px for most fonts\n const estimatedWidth = content.length * 8 + padding;\n \n // Apply min/max constraints\n return Math.max(minWidth, Math.min(maxWidth, estimatedWidth));\n}\n\n/**\n * Calculate optimal column widths for all columns based on their content\n * @param data - Array of data records\n * @param columns - Column definitions\n * @param options - Sizing options\n * @returns Object mapping column IDs to calculated widths\n */\nexport function calculateColumnWidths<TData extends Record<string, any>>(\n data: TData[],\n columns: any[],\n options: {\n minWidth?: number;\n maxWidth?: number;\n padding?: number;\n sampleSize?: number;\n } = {}\n): Record<string, number> {\n const {\n minWidth = 80,\n maxWidth = 400,\n padding = 32,\n sampleSize = 100\n } = options;\n\n const columnWidths: Record<string, number> = {};\n \n // Sample data for performance (don't analyze all rows for large datasets)\n const sampleData = data.slice(0, sampleSize);\n \n columns.forEach((column) => {\n const columnId = column.id || column.accessorKey;\n if (!columnId) return;\n \n let maxContentWidth = minWidth;\n \n // Check header width\n const headerWidth = calculateContentWidth(\n column.header || column.accessorKey || '',\n minWidth,\n maxWidth,\n padding\n );\n maxContentWidth = Math.max(maxContentWidth, headerWidth);\n \n // Check data content width\n sampleData.forEach((row) => {\n const cellValue = column.accessorFn \n ? column.accessorFn(row, 0)\n : row[column.accessorKey];\n \n if (cellValue !== null && cellValue !== undefined) {\n const content = String(cellValue);\n const contentWidth = calculateContentWidth(\n content,\n minWidth,\n maxWidth,\n padding\n );\n maxContentWidth = Math.max(maxContentWidth, contentWidth);\n }\n });\n \n columnWidths[columnId] = Math.min(maxContentWidth, maxWidth);\n });\n \n return columnWidths;\n}\n\n/**\n * Get column sizing configuration for TanStack Table\n * @param autoSizing - Whether auto-sizing is enabled\n * @param columnWidths - Pre-calculated column widths\n * @returns TanStack Table column sizing configuration\n */\nexport function getColumnSizingConfig(\n autoSizing: boolean,\n columnWidths?: Record<string, number>\n) {\n if (!autoSizing) {\n return {\n columnResizeMode: 'onChange' as const,\n };\n }\n \n return {\n columnResizeMode: 'onChange' as const,\n enableColumnResizing: true,\n columnResizeDirection: 'ltr' as const,\n // Set initial column sizes if provided\n ...(columnWidths && {\n initialState: {\n columnSizing: columnWidths,\n },\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\nexport interface TextColumnOptions {\n label?: string;\n sortable?: boolean;\n filterable?: boolean;\n groupable?: boolean;\n hideable?: boolean;\n render?: (value: any) => React.ReactNode;\n footer?: React.ReactNode;\n size?: number;\n minSize?: number;\n maxSize?: number;\n}\n\nexport interface NumberColumnOptions extends TextColumnOptions {\n format?: (value: number) => string;\n}\n\nexport interface DateColumnOptions extends TextColumnOptions {\n format?: (date: Date) => string;\n locale?: string;\n dateOptions?: Intl.DateTimeFormatOptions;\n}\n\nexport interface BooleanColumnOptions extends TextColumnOptions {\n render?: (value: boolean) => React.ReactNode;\n}\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}\n\nexport interface CustomColumnOptions<TData extends DataRecord> {\n header?: string;\n cell?: (info: any) => 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\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 } 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(value as any);\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 any);\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 } 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 DataTable Data Manager\n * @package @jmruthers/pace-core\n * @module Components/DataTable/Architecture/Managers\n * @since 0.3.0\n */\n\nimport type { DataTableDataManager, DataAdapter, FetchOptions } from './interfaces';\nimport type { DataRecord } from '../types';\n\n/**\n * Data manager implementation following SRP\n * Responsible only for data operations\n */\nexport class DataManager<TData extends DataRecord> implements DataTableDataManager<TData> {\n private data: TData[] = [];\n private _isLoading = false;\n private error: Error | null = null;\n private adapter: DataAdapter<TData>;\n private cache = new Map<string, { data: TData[]; timestamp: number }>();\n private cacheTimeout: number;\n\n constructor(adapter: DataAdapter<TData>, cacheTimeout = 5 * 60 * 1000) {\n this.adapter = adapter;\n this.cacheTimeout = cacheTimeout;\n }\n\n /**\n * Get current data\n */\n getData(): TData[] {\n return this.data;\n }\n\n /**\n * Update a data item\n */\n async updateData(id: string, data: Partial<TData>): Promise<void> {\n try {\n this.setLoading(true);\n this.setError(null);\n \n await this.adapter.updateData(id, data);\n \n // Update local data\n const index = this.data.findIndex(item => this.getRowId(item) === id);\n if (index !== -1) {\n this.data[index] = { ...this.data[index], ...data };\n }\n \n this.clearCache();\n } catch (error) {\n this.setError(error as Error);\n throw error;\n } finally {\n this.setLoading(false);\n }\n }\n\n /**\n * Delete a data item\n */\n async deleteData(id: string): Promise<void> {\n try {\n this.setLoading(true);\n this.setError(null);\n \n await this.adapter.deleteData(id);\n \n // Remove from local data\n this.data = this.data.filter(item => this.getRowId(item) !== id);\n \n this.clearCache();\n } catch (error) {\n this.setError(error as Error);\n throw error;\n } finally {\n this.setLoading(false);\n }\n }\n\n /**\n * Create a new data item\n */\n async createData(data: Partial<TData>): Promise<TData> {\n try {\n this.setLoading(true);\n this.setError(null);\n \n const newItem = await this.adapter.createData(data);\n \n // Add to local data\n this.data.push(newItem);\n \n this.clearCache();\n return newItem;\n } catch (error) {\n this.setError(error as Error);\n throw error;\n } finally {\n this.setLoading(false);\n }\n }\n\n\n /**\n * Get cached data if available\n */\n async getCachedData(cacheKey: string): Promise<TData[] | null> {\n const cached = this.cache.get(cacheKey);\n if (!cached) return null;\n \n const isExpired = Date.now() - cached.timestamp > this.cacheTimeout;\n if (isExpired) {\n this.cache.delete(cacheKey);\n return null;\n }\n \n return cached.data;\n }\n\n /**\n * Set cached data\n */\n setCachedData(cacheKey: string, data: TData[]): void {\n this.cache.set(cacheKey, {\n data,\n timestamp: Date.now(),\n });\n }\n\n /**\n * Clear all cached data\n */\n clearCache(): void {\n this.cache.clear();\n }\n\n /**\n * Check if currently loading\n */\n isLoading(): boolean {\n return this._isLoading;\n }\n\n /**\n * Get current error\n */\n getError(): Error | null {\n return this.error;\n }\n\n /**\n * Set loading state\n */\n private setLoading(loading: boolean): void {\n this._isLoading = loading;\n }\n\n /**\n * Set error state\n */\n private setError(error: Error | null): void {\n this.error = error;\n }\n\n /**\n * Get row ID from data item\n */\n private getRowId(item: TData): string {\n return (item as any).id || (item as any).key || JSON.stringify(item);\n }\n\n /**\n * Set adapter\n */\n setAdapter(adapter: DataAdapter<TData>): void {\n this.adapter = adapter;\n this.clearCache();\n }\n\n /**\n * Get adapter\n */\n getAdapter(): DataAdapter<TData> {\n return this.adapter;\n }\n} ","/**\n * @file DataTable Column Manager\n * @package @jmruthers/pace-core\n * @module Components/DataTable/Architecture/Managers\n * @since 0.3.0\n */\n\nimport type { ColumnManager } from './interfaces';\nimport type { ColumnDef } from '@tanstack/react-table';\nimport type { DataRecord } from '../types';\n\n/**\n * Column manager implementation following SRP\n * Responsible only for column operations\n */\nexport class ColumnManagerImpl<TData extends DataRecord> implements ColumnManager<TData> {\n private columns: ColumnDef<TData>[] = [];\n private columnMap = new Map<string, ColumnDef<TData>>();\n\n constructor(initialColumns: ColumnDef<TData>[] = []) {\n this.setColumns(initialColumns);\n }\n\n /**\n * Get all columns\n */\n getColumns(): ColumnDef<TData>[] {\n return [...this.columns];\n }\n\n /**\n * Add a new column\n */\n addColumn(column: ColumnDef<TData>): void {\n const columnId = this.getColumnId(column);\n \n // Remove existing column with same ID if it exists\n this.removeColumn(columnId);\n \n // Add new column\n this.columns.push(column);\n this.columnMap.set(columnId, column);\n }\n\n /**\n * Remove a column by ID\n */\n removeColumn(id: string): void {\n const index = this.columns.findIndex(col => this.getColumnId(col) === id);\n if (index !== -1) {\n this.columns.splice(index, 1);\n this.columnMap.delete(id);\n }\n }\n\n /**\n * Update an existing column\n */\n updateColumn(id: string, updates: Partial<ColumnDef<TData>>): void {\n const existingColumn = this.columnMap.get(id);\n if (!existingColumn) {\n throw new Error(`Column with ID \"${id}\" not found`);\n }\n\n const updatedColumn = { ...existingColumn, ...updates } as ColumnDef<TData>;\n const index = this.columns.findIndex(col => this.getColumnId(col) === id);\n \n if (index !== -1) {\n this.columns[index] = updatedColumn;\n this.columnMap.set(id, updatedColumn);\n }\n }\n\n /**\n * Get a specific column by ID\n */\n getColumn(id: string): ColumnDef<TData> | undefined {\n return this.columnMap.get(id);\n }\n\n /**\n * Check if a column exists\n */\n hasColumn(id: string): boolean {\n return this.columnMap.has(id);\n }\n\n /**\n * Get column IDs\n */\n getColumnIds(): string[] {\n return Array.from(this.columnMap.keys());\n }\n\n /**\n * Get visible columns\n */\n getVisibleColumns(): ColumnDef<TData>[] {\n return this.columns.filter(column => {\n const id = this.getColumnId(column);\n return column.enableHiding !== false;\n });\n }\n\n /**\n * Get sortable columns\n */\n getSortableColumns(): ColumnDef<TData>[] {\n return this.columns.filter(column => column.enableSorting === true);\n }\n\n /**\n * Get filterable columns\n */\n getFilterableColumns(): ColumnDef<TData>[] {\n return this.columns.filter(column => column.enableColumnFilter === true);\n }\n\n /**\n * Get groupable columns\n */\n getGroupableColumns(): ColumnDef<TData>[] {\n return this.columns.filter(column => column.enableGrouping === true);\n }\n\n /**\n * Set all columns at once\n */\n setColumns(columns: ColumnDef<TData>[]): void {\n this.columns = [...columns];\n this.columnMap.clear();\n \n columns.forEach(column => {\n const id = this.getColumnId(column);\n this.columnMap.set(id, column);\n });\n }\n\n /**\n * Clear all columns\n */\n clearColumns(): void {\n this.columns = [];\n this.columnMap.clear();\n }\n\n /**\n * Get column count\n */\n getColumnCount(): number {\n return this.columns.length;\n }\n\n /**\n * Get column by index\n */\n getColumnByIndex(index: number): ColumnDef<TData> | undefined {\n return this.columns[index];\n }\n\n /**\n * Get column index by ID\n */\n getColumnIndex(id: string): number {\n return this.columns.findIndex(col => this.getColumnId(col) === id);\n }\n\n /**\n * Move column to new position\n */\n moveColumn(id: string, newIndex: number): void {\n const currentIndex = this.getColumnIndex(id);\n if (currentIndex === -1) {\n throw new Error(`Column with ID \"${id}\" not found`);\n }\n\n if (newIndex < 0 || newIndex >= this.columns.length) {\n throw new Error(`Invalid index: ${newIndex}`);\n }\n\n const column = this.columns[currentIndex];\n this.columns.splice(currentIndex, 1);\n this.columns.splice(newIndex, 0, column);\n }\n\n /**\n * Get column ID from column definition\n */\n private getColumnId(column: ColumnDef<TData>): string {\n // Handle different column types\n if ('id' in column && column.id) {\n return column.id;\n }\n \n if ('accessorKey' in column && column.accessorKey) {\n return String(column.accessorKey);\n }\n \n if ('accessorFn' in column && typeof column.accessorFn === 'function') {\n return `fn-${Math.random().toString(36).substr(2, 9)}`;\n }\n \n return `fn-${Math.random().toString(36).substr(2, 9)}`;\n }\n} ","/**\n * @file DataTable Action Manager\n * @package @jmruthers/pace-core\n * @module Components/DataTable/Architecture/Managers\n * @since 0.3.0\n */\n\nimport type { ActionManager } from './interfaces';\nimport type { DataTableAction, DataRecord } from '../types';\n\n/**\n * Action manager implementation following SRP\n * Responsible only for action operations\n */\nexport class ActionManagerImpl<TData extends DataRecord> implements ActionManager<TData> {\n private actions: DataTableAction<TData>[] = [];\n private actionMap = new Map<string, DataTableAction<TData>>();\n\n constructor(initialActions: DataTableAction<TData>[] = []) {\n this.setActions(initialActions);\n }\n\n /**\n * Get all actions\n */\n getActions(): DataTableAction<TData>[] {\n return [...this.actions];\n }\n\n /**\n * Add a new action\n */\n addAction(action: DataTableAction<TData>): void {\n const actionId = this.getActionId(action);\n \n // Remove existing action with same ID if it exists\n this.removeAction(actionId);\n \n // Add new action\n this.actions.push(action);\n this.actionMap.set(actionId, action);\n }\n\n /**\n * Remove an action by ID\n */\n removeAction(id: string): void {\n const index = this.actions.findIndex(action => this.getActionId(action) === id);\n if (index !== -1) {\n this.actions.splice(index, 1);\n this.actionMap.delete(id);\n }\n }\n\n /**\n * Update an existing action\n */\n updateAction(id: string, updates: Partial<DataTableAction<TData>>): void {\n const existingAction = this.actionMap.get(id);\n if (!existingAction) {\n throw new Error(`Action with ID \"${id}\" not found`);\n }\n\n const updatedAction = { ...existingAction, ...updates };\n const index = this.actions.findIndex(action => this.getActionId(action) === id);\n \n if (index !== -1) {\n this.actions[index] = updatedAction;\n this.actionMap.set(id, updatedAction);\n }\n }\n\n /**\n * Get action by ID\n */\n getAction(id: string): DataTableAction<TData> | undefined {\n return this.actionMap.get(id);\n }\n\n /**\n * Check if action exists\n */\n hasAction(id: string): boolean {\n return this.actionMap.has(id);\n }\n\n /**\n * Get action IDs\n */\n getActionIds(): string[] {\n return Array.from(this.actionMap.keys());\n }\n\n /**\n * Get enabled actions\n */\n getEnabledActions(): DataTableAction<TData>[] {\n return this.actions.filter(action => {\n if (!action.disabled) return true;\n if (typeof action.disabled === 'function') {\n // For function-based disabled, we need a row to check against\n // Since we don't have a specific row here, we'll create a mock row\n // This is not ideal but allows the method to work\n const mockRow = {} as TData;\n return !action.disabled(mockRow);\n }\n return !action.disabled;\n });\n }\n\n /**\n * Get actions by variant\n */\n getActionsByVariant(variant: DataTableAction<TData>['variant']): DataTableAction<TData>[] {\n return this.actions.filter(action => action.variant === variant);\n }\n\n /**\n * Get destructive actions\n */\n getDestructiveActions(): DataTableAction<TData>[] {\n return this.getActionsByVariant('destructive');\n }\n\n /**\n * Get primary actions\n */\n getPrimaryActions(): DataTableAction<TData>[] {\n return this.getActionsByVariant('default');\n }\n\n /**\n * Get secondary actions\n */\n getSecondaryActions(): DataTableAction<TData>[] {\n return this.getActionsByVariant('secondary');\n }\n\n /**\n * Set all actions at once\n */\n setActions(actions: DataTableAction<TData>[]): void {\n this.actions = [...actions];\n this.actionMap.clear();\n \n actions.forEach(action => {\n const id = this.getActionId(action);\n this.actionMap.set(id, action);\n });\n }\n\n /**\n * Clear all actions\n */\n clearActions(): void {\n this.actions = [];\n this.actionMap.clear();\n }\n\n /**\n * Get action count\n */\n getActionCount(): number {\n return this.actions.length;\n }\n\n /**\n * Get action by index\n */\n getActionByIndex(index: number): DataTableAction<TData> | undefined {\n return this.actions[index];\n }\n\n /**\n * Get action index by ID\n */\n getActionIndex(id: string): number {\n return this.actions.findIndex(action => this.getActionId(action) === id);\n }\n\n /**\n * Move action to new position\n */\n moveAction(id: string, newIndex: number): void {\n const currentIndex = this.getActionIndex(id);\n if (currentIndex === -1) {\n throw new Error(`Action with ID \"${id}\" not found`);\n }\n\n if (newIndex < 0 || newIndex >= this.actions.length) {\n throw new Error(`Invalid index: ${newIndex}`);\n }\n\n const action = this.actions[currentIndex];\n this.actions.splice(currentIndex, 1);\n this.actions.splice(newIndex, 0, action);\n }\n\n /**\n * Execute an action\n */\n executeAction(id: string, row: TData): void {\n const action = this.actionMap.get(id);\n if (!action) {\n throw new Error(`Action with ID \"${id}\" not found`);\n }\n\n if (action.disabled && typeof action.disabled === 'function' && action.disabled(row)) {\n throw new Error(`Action \"${id}\" is disabled for this row`);\n }\n\n action.onClick(row);\n }\n\n /**\n * Check if action is disabled for a specific row\n */\n isActionDisabled(id: string, row: TData): boolean {\n const action = this.actionMap.get(id);\n if (!action) return true;\n\n if (typeof action.disabled === 'function') {\n return action.disabled(row);\n }\n\n return !!action.disabled;\n }\n\n /**\n * Get action ID from action definition\n */\n private getActionId(action: DataTableAction<TData>): string {\n return action.testId || action.label.toLowerCase().replace(/\\s+/g, '-') || `action-${Math.random().toString(36).substr(2, 9)}`;\n }\n} ","/**\n * @file DataTable State Manager\n * @package @jmruthers/pace-core\n * @module Components/DataTable/Architecture/Managers\n * @since 0.3.0\n */\n\nimport type { StateManager, DataTableState, DataTableObserver, Observable, UIState } from './interfaces';\nimport type { DataRecord } from '../types';\n\n/**\n * State manager implementation with observer pattern\n * Responsible only for state management\n */\nexport class StateManagerImpl<TData extends DataRecord> implements StateManager<TData>, Observable<TData> {\n private state: DataTableState<TData>;\n private observers: Map<string, DataTableObserver<TData>> = new Map();\n private observerIdCounter = 0;\n\n constructor(initialState?: Partial<DataTableState<TData>>) {\n this.state = this.createInitialState(initialState);\n }\n\n /**\n * Get current state\n */\n getState(): DataTableState<TData> {\n return { ...this.state };\n }\n\n /**\n * Set state with updater function\n */\n setState(updater: (state: DataTableState<TData>) => DataTableState<TData>): void {\n const newState = updater(this.getState());\n const oldState = this.state;\n this.state = newState;\n\n // Notify observers of state changes\n this.notifyStateChange(oldState, newState);\n }\n\n /**\n * Subscribe to state changes\n */\n subscribe(observer: DataTableObserver<TData> | ((state: DataTableState<TData>) => void)): () => void {\n const observerId = `observer-${++this.observerIdCounter}`;\n \n let dataTableObserver: DataTableObserver<TData>;\n \n if (typeof observer === 'function') {\n dataTableObserver = {\n id: observerId,\n onStateChange: observer,\n };\n } else {\n dataTableObserver = observer;\n }\n\n this.observers.set(observerId, dataTableObserver);\n \n // Return unsubscribe function\n return () => this.unsubscribe(observerId);\n }\n\n /**\n * Subscribe to specific state changes\n */\n subscribeToObserver(observer: DataTableObserver<TData>): () => void {\n this.observers.set(observer.id, observer);\n return () => this.unsubscribe(observer.id);\n }\n\n /**\n * Unsubscribe observer\n */\n unsubscribe(observerId: string): void {\n this.observers.delete(observerId);\n }\n\n /**\n * Notify all observers of an event\n */\n notify(event: string, data: any): void {\n this.observers.forEach(observer => {\n switch (event) {\n case 'dataChange':\n observer.onDataChange?.(data);\n break;\n case 'columnChange':\n observer.onColumnChange?.(data);\n break;\n case 'stateChange':\n observer.onStateChange?.(data);\n break;\n case 'error':\n observer.onError?.(data);\n break;\n }\n });\n }\n\n /**\n * Update data and notify observers\n */\n updateData(data: TData[]): void {\n const oldData = this.state.data;\n this.setState(state => ({ ...state, data }));\n \n if (oldData !== data) {\n this.notify('dataChange', data);\n }\n }\n\n /**\n * Update columns and notify observers\n */\n updateColumns(columns: any[]): void {\n const oldColumns = this.state.columns;\n this.setState(state => ({ ...state, columns }));\n \n if (oldColumns !== columns) {\n this.notify('columnChange', columns);\n }\n }\n\n /**\n * Update actions and notify observers\n */\n updateActions(actions: any[]): void {\n this.setState(state => ({ ...state, actions }));\n }\n\n /**\n * Update UI state\n */\n updateUI(uiUpdates: Partial<UIState>): void {\n this.setState(state => ({\n ...state,\n ui: { ...state.ui, ...uiUpdates }\n }));\n }\n\n /**\n * Update global filter\n */\n updateGlobalFilter(filter: string): void {\n this.updateUI({ globalFilter: filter });\n }\n\n /**\n * Update column filters\n */\n updateColumnFilters(filters: Array<{ id: string; value: any }>): void {\n this.updateUI({ columnFilters: filters });\n }\n\n /**\n * Update sorting\n */\n updateSorting(sorting: Array<{ id: string; desc: boolean }>): void {\n this.updateUI({ sorting });\n }\n\n /**\n * Update grouping\n */\n updateGrouping(grouping: string[]): void {\n this.updateUI({ grouping });\n }\n\n /**\n * Update pagination\n */\n updatePagination(pagination: { pageIndex: number; pageSize: number }): void {\n this.updateUI({ pagination });\n }\n\n /**\n * Update row selection\n */\n updateRowSelection(selection: Record<string, boolean>): void {\n this.updateUI({ rowSelection: selection });\n }\n\n /**\n * Update editing state\n */\n updateEditing(editing: DataTableState<TData>['ui']['editing']): void {\n this.updateUI({ editing });\n }\n\n /**\n * Update modal state\n */\n updateModals(modals: DataTableState<TData>['ui']['modals']): void {\n this.updateUI({ modals });\n }\n\n /**\n * Update feature state\n */\n updateFeatureState(featureName: string, state: any): void {\n this.setState(currentState => ({\n ...currentState,\n features: new Map(currentState.features).set(featureName, state)\n }));\n }\n\n /**\n * Update plugin state\n */\n updatePluginState(pluginName: string, state: any): void {\n this.setState(currentState => ({\n ...currentState,\n plugins: new Map(currentState.plugins).set(pluginName, state)\n }));\n }\n\n /**\n * Set loading state\n */\n setLoading(loading: boolean): void {\n this.setState(state => ({ ...state, isLoading: loading }));\n }\n\n /**\n * Set error state\n */\n setError(error: Error | null): void {\n this.setState(state => ({ ...state, error }));\n \n if (error) {\n this.notify('error', error);\n }\n }\n\n /**\n * Reset state to initial values\n */\n reset(): void {\n this.state = this.createInitialState();\n this.notify('stateChange', this.state);\n }\n\n /**\n * Get observer count\n */\n getObserverCount(): number {\n return this.observers.size;\n }\n\n /**\n * Create initial state\n */\n private createInitialState(overrides?: Partial<DataTableState<TData>>): DataTableState<TData> {\n const defaultState: DataTableState<TData> = {\n data: [],\n isLoading: false,\n error: null,\n columns: [],\n columnVisibility: {},\n actions: [],\n ui: {\n globalFilter: '',\n columnFilters: [],\n sorting: [],\n grouping: [],\n expanded: {},\n pagination: {\n pageIndex: 0,\n pageSize: 10,\n },\n rowSelection: {},\n editing: {\n rowId: null,\n data: {},\n isCreating: false,\n creationData: {},\n },\n modals: {\n import: false,\n export: false,\n view: false,\n viewData: null,\n },\n },\n features: new Map(),\n plugins: new Map(),\n };\n\n return { ...defaultState, ...overrides };\n }\n\n /**\n * Notify observers of state changes\n */\n private notifyStateChange(oldState: DataTableState<TData>, newState: DataTableState<TData>): void {\n // Check for specific changes and notify accordingly\n if (oldState.data !== newState.data) {\n this.notify('dataChange', newState.data);\n }\n \n if (oldState.columns !== newState.columns) {\n this.notify('columnChange', newState.columns);\n }\n \n // Always notify of state change\n this.notify('stateChange', newState);\n }\n} ","/**\n * @file DataTable Plugin Registry\n * @package @jmruthers/pace-core\n * @module Components/DataTable/Architecture\n * @since 0.3.0\n */\n\nimport type { PluginRegistry, DataTablePlugin, DataTableContext } from './interfaces';\nimport type { DataRecord } from '../types';\n\n/**\n * Plugin registry implementation\n * Manages plugin registration, dependency resolution, and lifecycle\n */\nexport class PluginRegistryImpl<TData extends DataRecord = DataRecord> implements PluginRegistry<TData> {\n private plugins = new Map<string, DataTablePlugin<TData>>();\n private initializedPlugins = new Set<string>();\n\n /**\n * Register a plugin\n */\n register(plugin: DataTablePlugin<TData>): void {\n if (this.plugins.has(plugin.name)) {\n throw new Error(`Plugin \"${plugin.name}\" is already registered`);\n }\n\n this.plugins.set(plugin.name, plugin);\n }\n\n /**\n * Unregister a plugin\n */\n unregister(name: string): void {\n const plugin = this.plugins.get(name);\n if (!plugin) {\n throw new Error(`Plugin \"${name}\" is not registered`);\n }\n\n // Cleanup if initialized\n if (this.initializedPlugins.has(name)) {\n plugin.cleanup().catch(error => {\n console.error(`Error cleaning up plugin \"${name}\":`, error);\n });\n this.initializedPlugins.delete(name);\n }\n\n this.plugins.delete(name);\n }\n\n /**\n * Get a plugin by name\n */\n getPlugin(name: string): DataTablePlugin<TData> | undefined {\n return this.plugins.get(name);\n }\n\n /**\n * Get all enabled plugins\n */\n getEnabledPlugins(): DataTablePlugin<TData>[] {\n return Array.from(this.plugins.values());\n }\n\n /**\n * Get plugins in dependency order\n */\n getDependencyOrder(): DataTablePlugin<TData>[] {\n const sorted: DataTablePlugin<TData>[] = [];\n const visited = new Set<string>();\n const visiting = new Set<string>();\n\n const visit = (pluginName: string) => {\n if (visiting.has(pluginName)) {\n throw new Error(`Circular dependency detected: ${pluginName}`);\n }\n\n if (visited.has(pluginName)) {\n return;\n }\n\n const plugin = this.plugins.get(pluginName);\n if (!plugin) {\n throw new Error(`Plugin \"${pluginName}\" not found`);\n }\n\n visiting.add(pluginName);\n\n // Visit dependencies first\n if (plugin.dependencies) {\n for (const dependency of plugin.dependencies) {\n visit(dependency);\n }\n }\n\n visiting.delete(pluginName);\n visited.add(pluginName);\n sorted.push(plugin);\n };\n\n // Visit all plugins\n for (const pluginName of this.plugins.keys()) {\n if (!visited.has(pluginName)) {\n visit(pluginName);\n }\n }\n\n return sorted;\n }\n\n /**\n * Initialize all plugins\n */\n async initializePlugins(context: DataTableContext<TData>): Promise<void> {\n const plugins = this.getDependencyOrder();\n\n for (const plugin of plugins) {\n try {\n await plugin.initialize(context);\n this.initializedPlugins.add(plugin.name);\n } catch (error) {\n console.error(`Failed to initialize plugin \"${plugin.name}\":`, error);\n throw error;\n }\n }\n }\n\n /**\n * Cleanup all plugins\n */\n async cleanupPlugins(): Promise<void> {\n const plugins = this.getDependencyOrder().reverse(); // Reverse for cleanup order\n\n for (const plugin of plugins) {\n if (this.initializedPlugins.has(plugin.name)) {\n try {\n await plugin.cleanup();\n this.initializedPlugins.delete(plugin.name);\n } catch (error) {\n console.error(`Error cleaning up plugin \"${plugin.name}\":`, error);\n }\n }\n }\n }\n\n /**\n * Render all plugins\n */\n renderPlugins(): React.ReactNode[] {\n return this.getEnabledPlugins()\n .filter(plugin => this.initializedPlugins.has(plugin.name))\n .map(plugin => plugin.render());\n }\n\n /**\n * Check if plugin is initialized\n */\n isPluginInitialized(name: string): boolean {\n return this.initializedPlugins.has(name);\n }\n\n /**\n * Get plugin count\n */\n getPluginCount(): number {\n return this.plugins.size;\n }\n\n /**\n * Get initialized plugin count\n */\n getInitializedPluginCount(): number {\n return this.initializedPlugins.size;\n }\n\n /**\n * Check if plugin has dependencies\n */\n hasDependencies(name: string): boolean {\n const plugin = this.plugins.get(name);\n return plugin ? !!(plugin.dependencies && plugin.dependencies.length > 0) : false;\n }\n\n /**\n * Get plugin dependencies\n */\n getPluginDependencies(name: string): string[] {\n const plugin = this.plugins.get(name);\n return plugin?.dependencies || [];\n }\n\n /**\n * Check if all dependencies are satisfied\n */\n areDependenciesSatisfied(name: string): boolean {\n const dependencies = this.getPluginDependencies(name);\n return dependencies.every(dep => this.plugins.has(dep));\n }\n\n /**\n * Get plugins that depend on a specific plugin\n */\n getDependents(name: string): DataTablePlugin<TData>[] {\n return Array.from(this.plugins.values()).filter(plugin => \n plugin.dependencies?.includes(name)\n );\n }\n\n /**\n * Validate plugin dependencies\n */\n validateDependencies(): { valid: boolean; errors: string[] } {\n const errors: string[] = [];\n\n for (const [name, plugin] of this.plugins) {\n if (plugin.dependencies) {\n for (const dependency of plugin.dependencies) {\n if (!this.plugins.has(dependency)) {\n errors.push(`Plugin \"${name}\" depends on \"${dependency}\" which is not registered`);\n }\n }\n }\n }\n\n return {\n valid: errors.length === 0,\n errors\n };\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 * @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 * 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>(\n data: TData[],\n columns: any[],\n options: { includeHeaders?: boolean } = {}\n): string {\n if (!data.length) return '';\n\n const { includeHeaders = true } = options;\n\n // Create CSV header row\n const headers = columns.map(col => col.header || col.id || \"Column\");\n \n // Format data into CSV rows\n const csvData = data.map(row => {\n return columns.map(col => {\n const key = col.accessorKey || col.id;\n const value = (row as any)[key];\n // Escape commas and quotes\n const escapedValue = String(value || '').replace(/\"/g, '\"\"');\n return `\"${escapedValue}\"`;\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 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 * \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 * exportToCSV(users, columns, 'users.csv');\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 */\nexport function exportToCSV<TData>(\n data: TData[],\n columns: any[],\n filename: string = \"download.csv\"\n): void {\n const csvContent = generateCSVContent(data, columns);\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 document.body.appendChild(link);\n link.click();\n document.body.removeChild(link);\n}\n","/**\n * @file Local Data Adapter\n * @package @jmruthers/pace-core\n * @module Components/DataTable/Architecture/Adapters\n * @since 0.3.0\n */\n\nimport type { DataAdapter, FetchOptions, ExportFormat, ExportOptions } from './interfaces';\nimport type { DataRecord } from '../types';\nimport { generateCSVContent } from '../utils/exportUtils';\n\n/**\n * Local data adapter for in-memory data operations\n * Implements DataAdapter interface for local data management\n */\nexport class LocalDataAdapter<TData extends DataRecord = DataRecord> implements DataAdapter<TData> {\n public name = 'local';\n private data: TData[] = [];\n private error: Error | null = null;\n\n constructor(initialData: TData[] = []) {\n this.data = [...initialData];\n }\n\n /**\n * Fetch data with filtering, sorting, and pagination\n */\n async fetchData(options: FetchOptions = {}): Promise<TData[]> {\n try {\n this.error = null;\n let result = [...this.data];\n\n // Apply search filter\n if (options.search) {\n const searchTerm = options.search.toLowerCase();\n result = result.filter(item =>\n Object.values(item).some(value =>\n String(value).toLowerCase().includes(searchTerm)\n )\n );\n }\n\n // Apply column filters\n if (options.filters) {\n result = result.filter(item => {\n return Object.entries(options.filters!).every(([key, value]) => {\n const itemValue = item[key];\n if (value === null || value === undefined) return true;\n if (typeof value === 'string') {\n return String(itemValue).toLowerCase().includes(value.toLowerCase());\n }\n return itemValue === value;\n });\n });\n }\n\n // Apply sorting\n if (options.sortBy) {\n result.sort((a, b) => {\n const aValue = a[options.sortBy!];\n const bValue = b[options.sortBy!];\n \n if (aValue < bValue) return options.sortDirection === 'desc' ? 1 : -1;\n if (aValue > bValue) return options.sortDirection === 'desc' ? -1 : 1;\n return 0;\n });\n }\n\n // Apply pagination\n if (options.page !== undefined && options.pageSize) {\n const start = options.page * options.pageSize;\n const end = start + options.pageSize;\n result = result.slice(start, end);\n }\n\n return result;\n } catch (error) {\n this.error = error as Error;\n throw error;\n }\n }\n\n /**\n * Update a data item\n */\n async updateData(id: string, data: Partial<TData>): Promise<void> {\n try {\n this.error = null;\n const index = this.data.findIndex(item => this.getRowId(item) === id);\n \n if (index === -1) {\n throw new Error(`Item with ID \"${id}\" not found`);\n }\n\n this.data[index] = { ...this.data[index], ...data };\n } catch (error) {\n this.error = error as Error;\n throw error;\n }\n }\n\n /**\n * Delete a data item\n */\n async deleteData(id: string): Promise<void> {\n try {\n this.error = null;\n const index = this.data.findIndex(item => this.getRowId(item) === id);\n \n if (index === -1) {\n throw new Error(`Item with ID \"${id}\" not found`);\n }\n\n this.data.splice(index, 1);\n } catch (error) {\n this.error = error as Error;\n throw error;\n }\n }\n\n /**\n * Create a new data item\n */\n async createData(data: Partial<TData>): Promise<TData> {\n try {\n this.error = null;\n const newItem = {\n id: this.generateId(),\n ...data,\n } as unknown as TData;\n\n this.data.push(newItem);\n return newItem;\n } catch (error) {\n this.error = error as Error;\n throw error;\n }\n }\n\n /**\n * Export data in specified format\n */\n async exportData(format: ExportFormat, options: ExportOptions = {}): Promise<string> {\n try {\n this.error = null;\n \n switch (format) {\n case 'csv':\n return this.exportToCSV(options);\n case 'json':\n return this.exportToJSON(options);\n case 'xlsx':\n return this.exportToXLSX(options);\n default:\n throw new Error(`Unsupported export format: ${format}`);\n }\n } catch (error) {\n this.error = error as Error;\n throw error;\n }\n }\n\n /**\n * Import data\n */\n async importData(data: TData[]): Promise<void> {\n try {\n this.error = null;\n this.data = [...data];\n } catch (error) {\n this.error = error as Error;\n throw error;\n }\n }\n\n /**\n * Check if adapter is connected\n */\n isConnected(): boolean {\n return true; // Local adapter is always connected\n }\n\n /**\n * Get current error\n */\n getError(): Error | null {\n return this.error;\n }\n\n /**\n * Set data directly\n */\n setData(data: TData[]): void {\n this.data = [...data];\n }\n\n /**\n * Get all data without filtering\n */\n getAllData(): TData[] {\n return [...this.data];\n }\n\n /**\n * Get data count\n */\n getDataCount(): number {\n return this.data.length;\n }\n\n /**\n * Clear all data\n */\n clearData(): void {\n this.data = [];\n }\n\n /**\n * Get row ID from data item\n */\n private getRowId(item: TData): string {\n return (item as any).id || (item as any).key || JSON.stringify(item);\n }\n\n /**\n * Generate unique ID\n */\n private generateId(): string {\n return `id-${Date.now()}-${Math.random().toString(36).substr(2, 9)}`;\n }\n\n /**\n * Export to CSV format\n */\n private exportToCSV(options: ExportOptions): string {\n if (this.data.length === 0) return '';\n\n // Create column definitions from data keys\n const columns = Object.keys(this.data[0]).map(key => ({\n accessorKey: key,\n header: key\n }));\n\n return generateCSVContent(this.data, columns, {\n includeHeaders: options.includeHeaders\n });\n }\n\n /**\n * Export to JSON format\n */\n private exportToJSON(options: ExportOptions): string {\n return JSON.stringify(this.data, null, 2);\n }\n\n /**\n * Export to XLSX format (simplified - returns JSON for now)\n */\n private exportToXLSX(options: ExportOptions): string {\n // In a real implementation, you would use a library like xlsx\n // For now, return JSON format\n return this.exportToJSON(options);\n }\n} ","/**\n * @file DataTable Context\n * @package @jmruthers/pace-core\n * @module Components/DataTable/Architecture\n * @since 0.3.0\n */\n\nimport React, { createContext, useContext, useMemo, useCallback, useRef, useEffect } from 'react';\nimport { useReactTable, getCoreRowModel, getFilteredRowModel, getSortedRowModel, getPaginationRowModel } from '@tanstack/react-table';\nimport { ChevronDown, ChevronUp, ChevronsUpDown, Filter, MoreHorizontal, Plus, Search, Settings, Trash2, Upload, Download, Eye, Edit, Copy } from 'lucide-react';\nimport { Button } from '../../Button/Button';\nimport { Input } from '../../Input/Input';\nimport { Checkbox } from '../../Checkbox/Checkbox';\nimport { Table, TableBody, TableCell, TableHead, TableHeader, TableRow } from '../../Table/Table';\n// DropdownMenu components have been merged into Select components\nimport { Dialog, DialogContent, DialogDescription, DialogHeader, DialogTitle, DialogTrigger } from '../../Dialog/Dialog';\nimport type { DataTableContext as IDataTableContext, DataTableConfig, DataTableUtils } from './interfaces';\nimport type { DataRecord } from '../types';\nimport { DataManager } from './DataManager';\nimport { ColumnManagerImpl } from './ColumnManager';\nimport { ActionManagerImpl } from './ActionManager';\nimport { StateManagerImpl } from './StateManager';\nimport { PluginRegistryImpl } from './PluginRegistry';\nimport { LocalDataAdapter } from './LocalDataAdapter';\n\n// Create the context\nconst DataTableContext = createContext<IDataTableContext<any> | null>(null);\n\n/**\n * DataTable provider component\n */\nexport interface DataTableProviderProps<TData extends DataRecord> {\n children: React.ReactNode;\n config: DataTableConfig<TData>;\n data?: TData[];\n columns?: any[];\n actions?: any[];\n pageSize?: number;\n}\n\nexport function DataTableProvider<TData extends DataRecord>({\n children,\n config,\n data = [],\n columns = [],\n actions = [],\n pageSize = 10,\n}: DataTableProviderProps<TData>) {\n // Create managers\n const adapter = useMemo(() => new LocalDataAdapter<TData>(data), [data]);\n const dataManager = useMemo(() => new DataManager<TData>(adapter), [adapter]);\n const columnManager = useMemo(() => new ColumnManagerImpl<TData>(columns), [columns]);\n const actionManager = useMemo(() => new ActionManagerImpl<TData>(actions), [actions]);\n const stateManager = useMemo(() => new StateManagerImpl<TData>({\n ui: {\n globalFilter: '',\n columnFilters: [],\n sorting: [],\n grouping: [],\n expanded: {},\n pagination: {\n pageIndex: 0,\n pageSize: pageSize,\n },\n rowSelection: {},\n editing: {\n rowId: null,\n data: {},\n isCreating: false,\n creationData: {},\n },\n modals: {\n import: false,\n export: false,\n view: false,\n viewData: null,\n },\n }\n }), [pageSize]);\n const pluginRegistry = useMemo(() => new PluginRegistryImpl<TData>(), []);\n\n // Create utilities\n const utils: DataTableUtils<TData> = useMemo(() => ({\n getRowId: (row: TData, index: number) => (row as any).id || String(index),\n formatValue: (value: any, column: any) => String(value),\n validateData: (data: Partial<TData>) => null,\n debounce: <T extends (...args: any[]) => any>(func: T, delay: number) => {\n let timeoutId: NodeJS.Timeout;\n return ((...args: any[]) => {\n clearTimeout(timeoutId);\n timeoutId = setTimeout(() => func(...args), delay);\n }) as T;\n },\n }), []);\n\n // Create context value\n const contextValue: IDataTableContext<TData> = useMemo(() => ({\n dataManager,\n columnManager,\n actionManager,\n stateManager,\n pluginRegistry,\n adapter,\n observable: stateManager,\n config,\n utils,\n }), [dataManager, columnManager, actionManager, stateManager, pluginRegistry, adapter, config, utils]);\n\n // Initialize data\n useEffect(() => {\n // Update the adapter with new data\n adapter.setData(data);\n \n if (data.length > 0) {\n stateManager.updateData(data);\n } else {\n // Handle empty data case\n stateManager.updateData([]);\n }\n }, [data, dataManager, stateManager, adapter]);\n\n // Initialize columns\n useEffect(() => {\n if (columns.length > 0) {\n columnManager.setColumns(columns);\n stateManager.updateColumns(columns);\n }\n }, [columns, columnManager, stateManager]);\n\n // Initialize actions\n useEffect(() => {\n if (actions.length > 0) {\n actionManager.setActions(actions);\n stateManager.updateActions(actions);\n }\n }, [actions, actionManager, stateManager]);\n\n return (\n <DataTableContext.Provider value={contextValue}>\n {children}\n </DataTableContext.Provider>\n );\n}\n\n/**\n * Hook to use DataTable context\n */\nexport function useDataTableContext<TData extends DataRecord = DataRecord>(): IDataTableContext<TData> {\n const context = useContext(DataTableContext);\n if (!context) {\n throw new Error('useDataTableContext must be used within a DataTableProvider');\n }\n return context as IDataTableContext<TData>;\n}\n\n/**\n * Hook to use specific managers\n */\nexport function useDataManager<TData extends DataRecord = DataRecord>() {\n const context = useDataTableContext<TData>();\n return context.dataManager;\n}\n\nexport function useColumnManager<TData extends DataRecord = DataRecord>() {\n const context = useDataTableContext<TData>();\n return context.columnManager;\n}\n\nexport function useActionManager<TData extends DataRecord = DataRecord>() {\n const context = useDataTableContext<TData>();\n return context.actionManager;\n}\n\nexport function useStateManager<TData extends DataRecord = DataRecord>() {\n const context = useDataTableContext<TData>();\n return context.stateManager;\n}\n\nexport function usePluginRegistry<TData extends DataRecord = DataRecord>() {\n const context = useDataTableContext<TData>();\n return context.pluginRegistry;\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 18+ 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=\"h-4 w-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]\" style={{ backgroundColor: 'white' }}>\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=\"h-4 w-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\ninterface GroupHeaderProps<TData> {\n row: Row<TData>;\n groupByColumn: string;\n isExpanded: boolean;\n onToggle: () => void;\n subRowsCount: number;\n}\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=\"h-4 w-4\" />\n ) : (\n <ChevronRight className=\"h-4 w-4\" />\n )}\n </Button>\n <span className=\"text-sm\">\n {String(groupValue)} ({subRowsCount} items)\n </span>\n </div>\n );\n}\n","import React from 'react';\nimport { flexRender } from '@tanstack/react-table';\nimport { TableRow, TableCell } from '../../Table/Table';\nimport { ActionButtons } from './ActionButtons';\nimport { Input } from '../../Input/Input';\nimport { Select, SelectContent, SelectItem, SelectTrigger, SelectValue } from '../../Select/Select';\nimport { Button } from '../../Button/Button';\nimport type { DataTableAction, DataRecord } from '../types';\n\ninterface EditableRowProps<TData extends DataRecord> {\n row: any;\n editingData: Record<string, any>;\n onEditingDataChange: (data: Record<string, any>) => 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// Helper function to render the appropriate input type based on column configuration\nconst renderEditField = (\n column: any,\n value: any,\n onChange: (value: any) => void,\n editingData: Record<string, any> = {},\n placeholder?: string\n) => {\n const columnDef = column.columnDef;\n \n // Check for custom field type\n if (columnDef.fieldType === 'select' && columnDef.fieldOptions) {\n // Use editAccessorKey if specified, otherwise use the column id\n const editKey = columnDef.editAccessorKey || column.id;\n const editValue = editingData[editKey] || value;\n \n return (\n <Select\n value={String(editValue || '')}\n onValueChange={(newValue) => {\n // If editAccessorKey is specified, update that field instead\n if (columnDef.editAccessorKey) {\n onChange({ [columnDef.editAccessorKey]: Number(newValue) });\n } else {\n onChange(newValue);\n }\n }}\n >\n <SelectTrigger className=\"w-full h-7\">\n <SelectValue placeholder={placeholder || `Select ${column.id}`} />\n </SelectTrigger>\n <SelectContent>\n {columnDef.fieldOptions.map((option: any) => (\n <SelectItem key={option.value} value={String(option.value)}>\n {option.label}\n </SelectItem>\n ))}\n </SelectContent>\n </Select>\n );\n }\n \n if (columnDef.fieldType === 'date') {\n return (\n <Input\n type=\"date\"\n value={value || ''}\n onChange={(e) => onChange(e.target.value)}\n className=\"w-full h-7\"\n />\n );\n }\n \n // Default to text input\n return (\n <Input\n type=\"text\"\n value={value || ''}\n onChange={(e) => onChange(e.target.value)}\n className=\"w-full h-7\"\n placeholder={placeholder || `Enter ${column.id}`}\n />\n );\n};\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\n // Convert DataTableAction to ActionButtons format with proper disabled handling\n const convertedActions = actions.map(action => ({\n label: action.label,\n onClick: action.onClick,\n icon: action.icon,\n variant: action.variant === 'destructive' ? 'destructive' as const : 'default' as const,\n disabled: action.disabled ? ((row?: any) => action.disabled!(row)) : false,\n testId: action.testId || `action-${action.label.toLowerCase().replace(/\\s+/g, '-')}-${rowId}`,\n visible: true,\n }));\n\n return (\n <TableRow>\n {row.getVisibleCells().map((cell: any) => (\n <TableCell key={cell.id}>\n {cell.column.id !== 'actions' ? (\n renderEditField(cell.column, editingData[cell.column.id], (value) => {\n if (typeof value === 'object' && value !== null) {\n // Handle editAccessorKey case\n onEditingDataChange({ ...editingData, ...value });\n } else {\n // Handle simple value case\n onEditingDataChange({ ...editingData, [cell.column.id]: value });\n }\n }, editingData)\n ) : (\n <div className=\"flex gap-1\">\n <Button\n onClick={onSave}\n size=\"sm\"\n variant=\"default\"\n >\n Save\n </Button>\n <Button\n onClick={onCancel}\n size=\"sm\"\n variant=\"outline\"\n >\n Cancel\n </Button>\n </div>\n )}\n </TableCell>\n ))}\n {actions.length > 0 && (\n <TableCell>\n <ActionButtons\n row={row.original}\n rowId={rowId}\n index={row.index}\n actions={convertedActions}\n isEditing={true}\n isParent={isParent}\n hierarchical={hierarchical}\n />\n </TableCell>\n )}\n </TableRow>\n );\n}\n"],"mappings":"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","names":["React","React","useMemo","useCallback","useEffect","useState","useRef","jsx","React","jsx","Search","React","Check","jsx","jsxs","children","jsx","jsxs","jsx","jsxs","jsx","jsxs","Search","React","useState","useRef","React","jsx","ChevronDown","Search","Plus","jsx","jsxs","X","jsx","jsxs","jsx","jsx","jsxs","useState","ChevronDown","jsx","jsxs","useState","Fragment","jsx","jsxs","jsxs","jsx","React","ChevronDown","useRef","useState","Fragment","React","ChevronRight","Database","Fragment","jsx","jsxs","Database","ChevronRight","React","jsx","jsxs","useState","useRef","useEffect","Upload","jsx","jsxs","useState","useRef","useEffect","Fragment","jsx","React","React","jsx","Fragment","jsx","jsxs","useState","useEffect","useCallback","useState","useCallback","useMemo","useEffect","useCallback","useMemo","sortHierarchicalData","Fragment","jsx","jsxs","useState","useMemo","useRef","useCallback","sortHierarchicalData","table","useEffect","data","React","jsx","React","createContext","useContext","useMemo","useEffect","jsx","createContext","useMemo","data","useEffect","useContext","MoreHorizontal","Download","Trash","jsx","jsxs","ChevronDown","ChevronRight","jsx","jsxs","jsx","jsxs","renderEditField","row"]}