@jmruthers/pace-core 0.6.9 → 0.6.10

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 (665) hide show
  1. package/audit-tool/audits/02-project-structure.cjs +62 -0
  2. package/audit-tool/audits/03-architecture.cjs +145 -19
  3. package/audit-tool/audits/04-code-quality.cjs +86 -1
  4. package/audit-tool/audits/06-security-rbac.cjs +109 -11
  5. package/cursor-rules/02-project-structure.mdc +2 -26
  6. package/cursor-rules/05-styling.mdc +84 -6
  7. package/cursor-rules/06-security-rbac.mdc +124 -1
  8. package/dist/{DataTable-SOAFXIWY.js → DataTable-SAXFG4XI.js} +11 -13
  9. package/dist/{AuthService-DmfO5rGS.d.ts → InactivityServiceProvider-DHryoh6K.d.ts} +24 -249
  10. package/dist/UnifiedAuthProvider-BBD2PS3Q.js +7 -0
  11. package/dist/{UnifiedAuthProvider-CKvHP1MK.d.ts → UnifiedAuthProvider-CiBAl9-s.d.ts} +34 -22
  12. package/dist/{api-7P7DI652.js → api-F47QJ7FX.js} +3 -3
  13. package/dist/assets/app-icons/admin_favicon.svg +462 -0
  14. package/dist/assets/app-icons/base_favicon.svg +85 -0
  15. package/dist/assets/app-icons/cake_favicon.svg +68 -0
  16. package/dist/assets/app-icons/core_favicon.svg +256 -0
  17. package/dist/assets/app-icons/gear_favicon.svg +91 -0
  18. package/dist/assets/app-icons/medi_favicon.svg +92 -0
  19. package/dist/assets/app-icons/mint_favicon.svg +83 -0
  20. package/dist/assets/app-icons/pace_favicon.svg +49 -0
  21. package/dist/assets/app-icons/pump_favicon.svg +68 -0
  22. package/dist/assets/app-icons/seed_favicon.svg +91 -0
  23. package/dist/assets/app-icons/team_favicon.svg +67 -0
  24. package/dist/assets/app-icons/trac_favicon.svg +112 -0
  25. package/dist/assets/app-icons/trip_favicon.svg +102 -0
  26. package/dist/audit-Z6ZZBWLU.js +3 -0
  27. package/dist/chunk-3GWSPISD.js +61 -0
  28. package/dist/{chunk-4DDCYDQ3.js → chunk-66R6RLUZ.js} +12 -27
  29. package/dist/{chunk-FYHN4DD5.js → chunk-7YDC7LMU.js} +80 -8
  30. package/dist/{chunk-S7DKJPLT.js → chunk-BCTXBU6U.js} +22 -17
  31. package/dist/{chunk-TTRFSOKR.js → chunk-BTHN5MKC.js} +4 -4
  32. package/dist/{chunk-A3W6LW53.js → chunk-DDMPHZ3D.js} +6 -18
  33. package/dist/{chunk-MPBLMWVR.js → chunk-FBZ7U3ID.js} +140 -92
  34. package/dist/chunk-FN52B75D.js +246 -0
  35. package/dist/{chunk-5W2A3DRC.js → chunk-JJEYZ3DX.js} +5 -4
  36. package/dist/chunk-KPYQWGFQ.js +183 -0
  37. package/dist/{chunk-C7ZQ5O4C.js → chunk-KSNLMI7N.js} +3 -3
  38. package/dist/chunk-KYURMOQM.js +977 -0
  39. package/dist/{chunk-LX6U42O3.js → chunk-LNHFAF4X.js} +160 -58
  40. package/dist/{chunk-J2U36LHD.js → chunk-MPY44PWB.js} +620 -627
  41. package/dist/{chunk-AHU7G2R5.js → chunk-NIU6DPQV.js} +10 -6
  42. package/dist/{chunk-HF6O3O37.js → chunk-RMLY6KB5.js} +1 -1
  43. package/dist/{chunk-6GLLNA6U.js → chunk-SACF5YSM.js} +1 -1
  44. package/dist/{chunk-5HNSDQWH.js → chunk-TFIPNIPE.js} +865 -532
  45. package/dist/{chunk-OJ4SKRSV.js → chunk-UZNAFKGW.js} +25 -5
  46. package/dist/chunk-W46INAVW.js +1216 -0
  47. package/dist/chunk-X5EAU5G7.js +793 -0
  48. package/dist/{chunk-T5CVK4R3.js → chunk-Y4PF6HIM.js} +110 -64
  49. package/dist/components.d.ts +8 -86
  50. package/dist/components.js +21 -55
  51. package/dist/eslint-rules/rules/05-styling.cjs +507 -0
  52. package/dist/eslint-rules/rules/06-security-rbac.cjs +10 -0
  53. package/dist/{event-CW5YB_2p.d.ts → event-WTAQuGcq.d.ts} +1 -1
  54. package/dist/{functions-lBy5L2ry.d.ts → functions-DH45k8ec.d.ts} +1 -1
  55. package/dist/hooks.d.ts +11 -10
  56. package/dist/hooks.js +69 -44
  57. package/dist/index.d.ts +379 -31
  58. package/dist/index.js +46 -32
  59. package/dist/papaparseLoader-WG2UXQ22.js +7 -0
  60. package/dist/providers.d.ts +28 -14
  61. package/dist/providers.js +5 -5
  62. package/dist/rbac/eslint-rules.js +2 -2
  63. package/dist/rbac/index.d.ts +57 -213
  64. package/dist/rbac/index.js +11 -11
  65. package/dist/theming/runtime.d.ts +9 -3
  66. package/dist/theming/runtime.js +2 -2
  67. package/dist/{timezone-0AyangqX.d.ts → timezone-K-ptz3HO.d.ts} +21 -22
  68. package/dist/{types-t9H8qKRw.d.ts → types-BE2sEHKd.d.ts} +1 -1
  69. package/dist/{types-BeoeWV5I.d.ts → types-CvOPXWWZ.d.ts} +6 -5
  70. package/dist/{types-DXstZpNI.d.ts → types-D05dCGma.d.ts} +56 -149
  71. package/dist/types-Dr8sNhER.d.ts +50 -0
  72. package/dist/types.d.ts +4 -4
  73. package/dist/{PublicPageProvider-CIGSujI2.d.ts → usePublicPageContext-vxBlEHO9.d.ts} +294 -151
  74. package/dist/{usePublicRouteParams-DQLrDqDb.d.ts → usePublicRouteParams-G3Ks53mk.d.ts} +7 -6
  75. package/dist/utils.d.ts +300 -136
  76. package/dist/utils.js +42 -41
  77. package/dist/{validation-643vUDZW.d.ts → validation-g5n0hDkh.d.ts} +2 -2
  78. package/docs/api/modules.md +542 -549
  79. package/docs/api-reference/components.md +5 -5
  80. package/docs/implementation-guides/data-tables.md +190 -8
  81. package/docs/rbac/RBAC_CONTRACT.md +0 -12
  82. package/docs/standards/2-project-structure-standards.md +12 -74
  83. package/docs/standards/6-security-rbac-standards.md +222 -7
  84. package/docs/standards/7-api-tech-stack-standards.md +91 -3
  85. package/docs/testing/README.md +10 -0
  86. package/docs/testing/test-setup-for-consumers.md +914 -0
  87. package/eslint-config-pace-core.cjs +4 -0
  88. package/package.json +1 -1
  89. package/scripts/eslint-audit.cjs +110 -11
  90. package/src/__mocks__/lucide-react.ts +0 -2
  91. package/src/__tests__/helpers/__tests__/test-utils.test.tsx +0 -2
  92. package/src/__tests__/index.test.ts +532 -0
  93. package/src/__tests__/integration/UserProfile.test.tsx +1 -1
  94. package/src/__tests__/rbac/PagePermissionGuard.test.tsx +10 -8
  95. package/src/__tests__/rls-policies.test.ts +3 -2
  96. package/src/assets/app-icons/admin_favicon.svg +462 -0
  97. package/src/assets/app-icons/base_favicon.svg +85 -0
  98. package/src/assets/app-icons/cake_favicon.svg +68 -0
  99. package/src/assets/app-icons/core_favicon.svg +256 -0
  100. package/src/assets/app-icons/gear_favicon.svg +91 -0
  101. package/src/assets/app-icons/index.ts +83 -0
  102. package/src/assets/app-icons/medi_favicon.svg +92 -0
  103. package/src/assets/app-icons/mint_favicon.svg +83 -0
  104. package/src/assets/app-icons/pace_favicon.svg +49 -0
  105. package/src/assets/app-icons/pump_favicon.svg +68 -0
  106. package/src/assets/app-icons/seed_favicon.svg +91 -0
  107. package/src/assets/app-icons/team_favicon.svg +67 -0
  108. package/src/assets/app-icons/trac_favicon.svg +112 -0
  109. package/src/assets/app-icons/trip_favicon.svg +102 -0
  110. package/src/components/AddressField/AddressField.test.tsx +378 -3
  111. package/src/components/AddressField/AddressField.tsx +2 -2
  112. package/src/components/AddressField/types.ts +2 -2
  113. package/src/components/Alert/Alert.test.tsx +35 -25
  114. package/src/components/Alert/Alert.tsx +8 -8
  115. package/src/components/AppSwitcher/AppSwitcher.test.tsx +1250 -0
  116. package/src/components/AppSwitcher/AppSwitcher.tsx +315 -0
  117. package/src/components/Avatar/Avatar.test.tsx +11 -1
  118. package/src/components/Avatar/Avatar.tsx +3 -2
  119. package/src/components/Badge/Badge.test.tsx +11 -1
  120. package/src/components/Button/Button.test.tsx +13 -3
  121. package/src/components/Calendar/Calendar.test.tsx +523 -131
  122. package/src/components/Calendar/Calendar.tsx +107 -488
  123. package/src/components/Card/Card.test.tsx +220 -249
  124. package/src/components/Checkbox/Checkbox.test.tsx +58 -174
  125. package/src/components/ContextSelector/ContextSelector.tsx +3 -3
  126. package/src/components/ContextSelector/__tests__/ContextSelector.test.tsx +360 -0
  127. package/src/components/DataTable/DataTable.tsx +2 -2
  128. package/src/components/DataTable/__tests__/DataTable.comprehensive.test.tsx +1 -1
  129. package/src/components/DataTable/__tests__/DataTable.export.test.tsx +2 -2
  130. package/src/components/DataTable/__tests__/DataTable.grouping-aggregation.test.tsx +1 -1
  131. package/src/components/DataTable/__tests__/DataTable.select-label-display.test.tsx +16 -14
  132. package/src/components/DataTable/__tests__/DataTable.test.tsx +2 -2
  133. package/src/components/DataTable/__tests__/DataTableCore.test-setup.ts +1 -1
  134. package/src/components/DataTable/__tests__/DataTableCore.test.tsx +76 -580
  135. package/src/components/DataTable/__tests__/README.md +1 -1
  136. package/src/components/DataTable/__tests__/a11y.basic.test.tsx +1 -1
  137. package/src/components/DataTable/__tests__/keyboard.test.tsx +1 -1
  138. package/src/components/DataTable/__tests__/pagination.modes.test.tsx +1 -3
  139. package/src/components/DataTable/__tests__/ssr.strict-mode.test.tsx +0 -6
  140. package/src/components/DataTable/__tests__/test-utils/sharedTestUtils.tsx +14 -6
  141. package/src/components/DataTable/components/ActionButtons.tsx +9 -4
  142. package/src/components/DataTable/components/BulkOperationsDropdown.tsx +3 -3
  143. package/src/components/DataTable/components/ColumnFilter.tsx +2 -7
  144. package/src/components/DataTable/components/DataTableCore.tsx +44 -52
  145. package/src/components/DataTable/components/DataTableLayout.tsx +37 -26
  146. package/src/components/DataTable/components/DataTableModals.tsx +118 -30
  147. package/src/components/DataTable/components/DataTableToolbar.tsx +2 -2
  148. package/src/components/DataTable/components/EditFields.tsx +6 -47
  149. package/src/components/DataTable/components/EditableRow.tsx +8 -8
  150. package/src/components/DataTable/components/EmptyState.tsx +6 -3
  151. package/src/components/DataTable/components/FilterRow.tsx +18 -11
  152. package/src/components/DataTable/components/GroupingDropdown.tsx +0 -1
  153. package/src/components/DataTable/components/ImportModal.tsx +305 -133
  154. package/src/components/DataTable/components/LoadingState.tsx +2 -2
  155. package/src/components/DataTable/components/PaginationControls.tsx +0 -4
  156. package/src/components/DataTable/components/RowComponent.tsx +42 -22
  157. package/src/components/DataTable/components/UnifiedTableBody.tsx +52 -12
  158. package/src/components/DataTable/components/__tests__/AccessDeniedPage.test.tsx +51 -463
  159. package/src/components/DataTable/components/__tests__/ActionButtons.test.tsx +122 -116
  160. package/src/components/DataTable/components/__tests__/BulkOperationsDropdown.test.tsx +40 -68
  161. package/src/components/DataTable/components/__tests__/ColumnFilter.test.tsx +9 -137
  162. package/src/components/DataTable/components/__tests__/ColumnVisibilityDropdown.test.tsx +57 -17
  163. package/src/components/DataTable/components/__tests__/DataTableCore.test.tsx +792 -0
  164. package/src/components/DataTable/components/__tests__/DataTableErrorBoundary.test.tsx +24 -65
  165. package/src/components/DataTable/components/__tests__/DataTableLayout.test.tsx +467 -0
  166. package/src/components/DataTable/components/__tests__/DataTableModals.test.tsx +8 -125
  167. package/src/components/DataTable/components/__tests__/DataTableToolbar.test.tsx +528 -56
  168. package/src/components/DataTable/components/__tests__/EditFields.test.tsx +526 -0
  169. package/src/components/DataTable/components/__tests__/EditableRow.test.tsx +1 -68
  170. package/src/components/DataTable/components/__tests__/EmptyState.test.tsx +8 -25
  171. package/src/components/DataTable/components/__tests__/FilterRow.test.tsx +3 -62
  172. package/src/components/DataTable/components/__tests__/GroupingDropdown.test.tsx +9 -14
  173. package/src/components/DataTable/components/__tests__/ImportModal.test.tsx +50 -186
  174. package/src/components/DataTable/components/__tests__/LoadingState.test.tsx +39 -97
  175. package/src/components/DataTable/components/__tests__/PaginationControls.test.tsx +13 -103
  176. package/src/components/DataTable/components/__tests__/RowComponent.test.tsx +629 -0
  177. package/src/components/DataTable/components/__tests__/SortIndicator.test.tsx +135 -0
  178. package/src/components/DataTable/components/__tests__/UnifiedTableBody.test.tsx +31 -171
  179. package/src/components/DataTable/components/__tests__/cellValueUtils.test.ts +453 -0
  180. package/src/components/DataTable/components/hooks/useImportModalFocus.test.ts +184 -0
  181. package/src/components/DataTable/components/hooks/usePermissionTracking.test.ts +381 -0
  182. package/src/components/DataTable/context/DataTableContext.tsx +9 -10
  183. package/src/components/DataTable/context/__tests__/DataTableContext.test.tsx +12 -26
  184. package/src/components/DataTable/core/ColumnFactory.ts +3 -3
  185. package/src/components/DataTable/core/ColumnManager.ts +0 -1
  186. package/src/components/DataTable/core/DataManager.ts +4 -2
  187. package/src/components/DataTable/core/LocalDataAdapter.ts +1 -1
  188. package/src/components/DataTable/core/PluginRegistry.ts +2 -2
  189. package/src/components/DataTable/core/__tests__/ActionManager.test.ts +114 -2
  190. package/src/components/DataTable/core/__tests__/ColumnFactory.test.ts +103 -5
  191. package/src/components/DataTable/core/__tests__/ColumnManager.test.ts +57 -0
  192. package/src/components/DataTable/core/__tests__/DataManager.test.ts +63 -0
  193. package/src/components/DataTable/core/__tests__/LocalDataAdapter.test.ts +42 -9
  194. package/src/components/DataTable/core/__tests__/PluginRegistry.test.ts +29 -7
  195. package/src/components/DataTable/core/__tests__/StateManager.test.ts +58 -4
  196. package/src/components/DataTable/hooks/__tests__/useColumnOrderPersistence.test.ts +16 -21
  197. package/src/components/DataTable/hooks/__tests__/useColumnVisibilityPersistence.test.ts +93 -4
  198. package/src/components/DataTable/hooks/__tests__/useDataTableConfiguration.test.ts +227 -54
  199. package/src/components/DataTable/hooks/__tests__/useDataTableDataPipeline.test.ts +215 -62
  200. package/src/components/DataTable/hooks/__tests__/useDataTablePermissions.test.ts +217 -39
  201. package/src/components/DataTable/hooks/__tests__/useDataTableState.test.ts +101 -6
  202. package/src/components/DataTable/hooks/__tests__/useEffectiveColumnOrder.test.ts +157 -27
  203. package/src/components/DataTable/hooks/__tests__/useHierarchicalState.test.ts +80 -0
  204. package/src/components/DataTable/hooks/__tests__/useKeyboardNavigation.test.ts +787 -0
  205. package/src/components/DataTable/hooks/__tests__/useServerSideDataEffect.test.ts +258 -0
  206. package/src/components/DataTable/hooks/__tests__/useTableColumns.test.ts +128 -77
  207. package/src/components/DataTable/hooks/__tests__/useTableHandlers.test.ts +440 -0
  208. package/src/components/DataTable/hooks/useColumnOrderPersistence.ts +12 -9
  209. package/src/components/DataTable/hooks/useColumnVisibilityPersistence.ts +12 -9
  210. package/src/components/DataTable/hooks/useDataTableConfiguration.ts +1 -1
  211. package/src/components/DataTable/hooks/useDataTablePermissions.ts +11 -22
  212. package/src/components/DataTable/hooks/useDataTableState.ts +20 -24
  213. package/src/components/DataTable/hooks/useKeyboardNavigation.ts +5 -5
  214. package/src/components/DataTable/hooks/useServerSideDataEffect.ts +13 -1
  215. package/src/components/DataTable/hooks/useTableColumns.ts +15 -39
  216. package/src/components/DataTable/hooks/useTableHandlers.ts +8 -20
  217. package/src/components/DataTable/index.ts +24 -2
  218. package/src/components/DataTable/types.ts +6 -3
  219. package/src/components/DataTable/utils/__tests__/a11yUtils.test.ts +3 -67
  220. package/src/components/DataTable/utils/__tests__/aggregationUtils.test.ts +288 -0
  221. package/src/components/DataTable/utils/__tests__/errorHandling.test.ts +3 -60
  222. package/src/components/DataTable/utils/__tests__/flexibleImport.test.ts +1 -1
  223. package/src/components/DataTable/utils/__tests__/hierarchicalSorting.test.ts +9 -21
  224. package/src/components/DataTable/utils/__tests__/hierarchicalUtils.test.ts +102 -86
  225. package/src/components/DataTable/utils/__tests__/paginationUtils.test.ts +593 -0
  226. package/src/components/DataTable/utils/__tests__/rowUtils.test.ts +33 -49
  227. package/src/components/DataTable/utils/__tests__/selectFieldUtils.test.ts +1 -0
  228. package/src/components/DataTable/utils/a11yUtils.ts +1 -1
  229. package/src/components/DataTable/utils/aggregationUtils.ts +5 -5
  230. package/src/components/DataTable/utils/errorHandling.ts +3 -1
  231. package/src/components/DataTable/utils/exportUtils.ts +1 -1
  232. package/src/components/DataTable/utils/flexibleImport.ts +2 -2
  233. package/src/components/DataTable/utils/hierarchicalSorting.ts +3 -3
  234. package/src/components/DataTable/utils/paginationUtils.ts +1 -1
  235. package/src/components/DataTable/utils/performanceUtils.ts +1 -1
  236. package/src/components/DataTable/utils/selectFieldUtils.ts +0 -7
  237. package/src/components/DatePickerWithTimezone/DatePickerWithTimezone.test.tsx +17 -24
  238. package/src/components/DatePickerWithTimezone/DatePickerWithTimezone.tsx +1 -1
  239. package/src/components/DateTimeField/DateTimeField.test.tsx +2 -15
  240. package/src/components/DateTimeField/DateTimeField.tsx +1 -1
  241. package/src/components/Dialog/Dialog.test.tsx +2007 -407
  242. package/src/components/Dialog/Dialog.tsx +97 -192
  243. package/src/components/ErrorBoundary/ErrorBoundary.test.tsx +2 -62
  244. package/src/components/ErrorBoundary/ErrorBoundaryContext.context.ts +17 -0
  245. package/src/components/ErrorBoundary/ErrorBoundaryContext.tsx +2 -45
  246. package/src/components/ErrorBoundary/ErrorBoundaryContext.types.ts +41 -0
  247. package/src/components/ErrorBoundary/index.ts +3 -4
  248. package/src/components/ErrorBoundary/useErrorBoundaryContext.ts +20 -0
  249. package/src/components/FileDisplay/FileDisplay.test.tsx +454 -222
  250. package/src/components/FileDisplay/FileDisplay.tsx +14 -12
  251. package/src/components/FileDisplay/index.tsx +1 -1
  252. package/src/components/FileUpload/FileUpload.test.tsx +54 -18
  253. package/src/components/FileUpload/FileUpload.tsx +10 -7
  254. package/src/components/FileUpload/index.tsx +1 -1
  255. package/src/components/Footer/Footer.test.tsx +33 -114
  256. package/src/components/Form/Form.test.tsx +388 -68
  257. package/src/components/Form/Form.tsx +57 -42
  258. package/src/components/Header/Header.test.tsx +645 -154
  259. package/src/components/Header/Header.tsx +52 -43
  260. package/src/components/InactivityWarningModal/InactivityWarningModal.test.tsx +35 -76
  261. package/src/components/Input/Input.test.tsx +34 -120
  262. package/src/components/Label/Label.test.tsx +47 -46
  263. package/src/components/LoadingSpinner/LoadingSpinner.test.tsx +9 -12
  264. package/src/components/LoginForm/LoginForm.test.tsx +0 -1
  265. package/src/components/NavigationMenu/NavigationMenu.test.tsx +1399 -82
  266. package/src/components/NavigationMenu/NavigationMenu.tsx +2 -2
  267. package/src/components/NavigationMenu/__tests__/useNavigationFiltering.test.ts +1934 -0
  268. package/src/components/NavigationMenu/useNavigationFiltering.ts +5 -15
  269. package/src/components/PaceAppLayout/PaceAppLayout.edge-cases.test.tsx +1307 -0
  270. package/src/components/PaceAppLayout/PaceAppLayout.integration.test.tsx +47 -46
  271. package/src/components/PaceAppLayout/PaceAppLayout.performance.test.tsx +81 -38
  272. package/src/components/PaceAppLayout/PaceAppLayout.security.test.tsx +87 -66
  273. package/src/components/PaceAppLayout/PaceAppLayout.test.tsx +245 -39
  274. package/src/components/PaceAppLayout/PaceAppLayout.tsx +14 -20
  275. package/src/components/PaceAppLayout/README.md +0 -9
  276. package/src/components/PaceAppLayout/test-setup.tsx +15 -9
  277. package/src/components/PaceLoginPage/PaceLoginPage.test.tsx +759 -3
  278. package/src/components/PaceLoginPage/PaceLoginPage.tsx +2 -3
  279. package/src/components/PasswordChange/PasswordChangeForm.test.tsx +1 -1
  280. package/src/components/Progress/Progress.test.tsx +127 -1
  281. package/src/components/ProtectedRoute/ProtectedRoute.test.tsx +1196 -4
  282. package/src/components/ProtectedRoute/ProtectedRoute.tsx +24 -6
  283. package/src/components/PublicLayout/PublicLayout.test.tsx +1435 -14
  284. package/src/components/PublicLayout/PublicPageContext.ts +28 -0
  285. package/src/components/PublicLayout/PublicPageLayout.tsx +6 -6
  286. package/src/components/PublicLayout/PublicPageProvider.tsx +2 -41
  287. package/src/components/PublicLayout/usePublicPageContext.ts +36 -0
  288. package/src/components/Select/Select.test.tsx +46 -9
  289. package/src/components/Select/Select.tsx +31 -24
  290. package/src/components/Select/__tests__/context.test.tsx +56 -0
  291. package/src/components/Select/hooks/__tests__/useSelectEvents.test.ts +279 -0
  292. package/src/components/Select/hooks/__tests__/useSelectSearch.test.tsx +295 -0
  293. package/src/components/Select/hooks/__tests__/useSelectState.test.ts +254 -0
  294. package/src/components/Select/hooks/useSelectState.ts +16 -16
  295. package/src/components/Select/types.ts +3 -0
  296. package/src/components/Select/utils/__tests__/text.test.tsx +104 -0
  297. package/src/components/SessionRestorationLoader/SessionRestorationLoader.test.tsx +28 -112
  298. package/src/components/Switch/Switch.test.tsx +57 -153
  299. package/src/components/Table/Table.test.tsx +47 -317
  300. package/src/components/Tabs/Tabs.tsx +3 -3
  301. package/src/components/Textarea/Textarea.test.tsx +11 -38
  302. package/src/components/Toast/Toast.test.tsx +78 -569
  303. package/src/components/Tooltip/Tooltip.test.tsx +4 -21
  304. package/src/components/UserMenu/UserMenu.test.tsx +1 -21
  305. package/src/components/UserMenu/UserMenu.tsx +0 -1
  306. package/src/components/__tests__/index.test.ts +346 -0
  307. package/src/components/index.ts +12 -1
  308. package/src/constants/__tests__/performance.test.ts +91 -0
  309. package/src/hooks/__tests__/ServiceHooks.test.tsx +239 -129
  310. package/src/hooks/__tests__/hooks.integration.test.tsx +4 -3
  311. package/src/hooks/__tests__/useApiFetch.unit.test.ts +1 -1
  312. package/src/hooks/__tests__/useAppConfig.unit.test.ts +88 -29
  313. package/src/hooks/__tests__/useComponentPerformance.unit.test.tsx +282 -98
  314. package/src/hooks/__tests__/useDataTablePerformance.unit.test.ts +53 -109
  315. package/src/hooks/__tests__/useDataTableState.test.ts +143 -49
  316. package/src/hooks/__tests__/useDebounce.unit.test.ts +94 -19
  317. package/src/hooks/__tests__/useEvents.unit.test.ts +100 -125
  318. package/src/hooks/__tests__/useFileDisplay.test.ts +540 -0
  319. package/src/hooks/__tests__/useFileDisplay.unit.test.ts +1 -4
  320. package/src/hooks/__tests__/useFileUrl.unit.test.ts +27 -247
  321. package/src/hooks/__tests__/useFileUrlCache.test.ts +246 -56
  322. package/src/hooks/__tests__/useFocusManagement.unit.test.ts +442 -68
  323. package/src/hooks/__tests__/useFocusTrap.unit.test.tsx +345 -560
  324. package/src/hooks/__tests__/useFormDialog.test.ts +51 -222
  325. package/src/hooks/__tests__/useInactivityTracker.unit.test.ts +1 -1
  326. package/src/hooks/__tests__/useKeyboardShortcuts.unit.test.ts +1 -4
  327. package/src/hooks/__tests__/useOrganisationPermissions.unit.test.tsx +0 -1
  328. package/src/hooks/__tests__/usePerformanceMonitor.unit.test.ts +1 -1
  329. package/src/hooks/__tests__/usePermissionCache.test.ts +506 -0
  330. package/src/hooks/__tests__/usePreventTabReload.test.ts +255 -36
  331. package/src/hooks/__tests__/usePublicEvent.simple.test.ts +17 -8
  332. package/src/hooks/__tests__/usePublicEvent.test.ts +16 -24
  333. package/src/hooks/__tests__/usePublicEvent.unit.test.ts +12 -4
  334. package/src/hooks/__tests__/usePublicFileDisplay.test.ts +3 -6
  335. package/src/hooks/__tests__/usePublicRouteParams.unit.test.ts +1 -2
  336. package/src/hooks/__tests__/useQueryCache.test.ts +313 -66
  337. package/src/hooks/__tests__/useSessionDraft.test.ts +496 -103
  338. package/src/hooks/__tests__/useSessionRestoration.unit.test.tsx +2 -2
  339. package/src/hooks/__tests__/useStorage.unit.test.ts +72 -102
  340. package/src/hooks/__tests__/useToast.test.ts +413 -0
  341. package/src/hooks/__tests__/useToast.unit.test.tsx +1 -1
  342. package/src/hooks/__tests__/useZodForm.unit.test.tsx +175 -21
  343. package/src/hooks/index.ts +13 -1
  344. package/src/hooks/public/usePublicEvent.test.ts +304 -0
  345. package/src/hooks/public/usePublicEvent.ts +11 -11
  346. package/src/hooks/public/usePublicEventLogo.test.ts +655 -120
  347. package/src/hooks/public/usePublicEventLogo.ts +2 -2
  348. package/src/hooks/public/usePublicFileDisplay.test.ts +723 -0
  349. package/src/hooks/public/usePublicFileDisplay.ts +79 -49
  350. package/src/hooks/public/usePublicRouteParams.test.ts +595 -0
  351. package/src/hooks/public/usePublicRouteParams.ts +2 -2
  352. package/src/hooks/services/useAuthService.ts +1 -1
  353. package/src/hooks/services/useEventService.ts +1 -1
  354. package/src/hooks/useAccessibleApps.test.ts +400 -0
  355. package/src/hooks/useAccessibleApps.ts +264 -0
  356. package/src/hooks/useAddressAutocomplete.test.ts +165 -42
  357. package/src/hooks/useAddressAutocomplete.ts +41 -28
  358. package/src/hooks/useAppConfig.ts +13 -3
  359. package/src/hooks/useDataTablePerformance.ts +13 -12
  360. package/src/hooks/useDataTableState.ts +5 -5
  361. package/src/hooks/useEventTheme.test.ts +66 -17
  362. package/src/hooks/useEventTheme.ts +1 -1
  363. package/src/hooks/useEvents.ts +8 -1
  364. package/src/hooks/useFileDisplay.ts +66 -33
  365. package/src/hooks/useFileReference.test.ts +365 -87
  366. package/src/hooks/useFileReference.ts +2 -6
  367. package/src/hooks/useFileUrlCache.ts +4 -1
  368. package/src/hooks/useFormDialog.ts +2 -2
  369. package/src/hooks/useInactivityTracker.ts +3 -3
  370. package/src/hooks/useOrganisationPermissions.test.ts +1 -2
  371. package/src/hooks/useOrganisationPermissions.ts +1 -4
  372. package/src/hooks/useOrganisationSecurity.test.ts +1 -30
  373. package/src/hooks/useOrganisationSecurity.ts +3 -3
  374. package/src/hooks/useOrganisations.ts +1 -1
  375. package/src/hooks/usePerformanceMonitor.ts +1 -1
  376. package/src/hooks/usePermissionCache.ts +2 -6
  377. package/src/hooks/useQueryCache.ts +7 -7
  378. package/src/hooks/useSessionDraft.ts +14 -11
  379. package/src/hooks/useSessionRestoration.ts +1 -1
  380. package/src/hooks/useStorage.ts +75 -40
  381. package/src/hooks/useToast.ts +2 -2
  382. package/src/hooks/useZodForm.ts +3 -3
  383. package/src/icons/__tests__/index.test.ts +133 -0
  384. package/src/icons/index.ts +1 -1
  385. package/src/index.ts +43 -4
  386. package/src/providers/OrganisationProvider.test.tsx +40 -0
  387. package/src/providers/OrganisationProvider.tsx +5 -5
  388. package/src/providers/UnifiedAuthProvider.smoke.test.tsx +7 -12
  389. package/src/providers/__tests__/AuthProvider.test.tsx +22 -91
  390. package/src/providers/__tests__/EventProvider.test.tsx +16 -80
  391. package/src/providers/__tests__/InactivityProvider.test.tsx +29 -173
  392. package/src/providers/__tests__/OrganisationProvider.test.tsx +4 -5
  393. package/src/providers/__tests__/OrganisationProvider.wrapper.test.tsx +591 -0
  394. package/src/providers/__tests__/ProviderLifecycle.test.tsx +80 -196
  395. package/src/providers/__tests__/UnifiedAuthProvider.test.tsx +40 -133
  396. package/src/providers/__tests__/index.test.ts +138 -0
  397. package/src/providers/services/AuthServiceContext.ts +27 -0
  398. package/src/providers/services/AuthServiceProvider.tsx +81 -20
  399. package/src/providers/services/EventServiceContext.ts +25 -0
  400. package/src/providers/services/EventServiceProvider.tsx +11 -20
  401. package/src/providers/services/InactivityServiceContext.ts +25 -0
  402. package/src/providers/services/InactivityServiceProvider.tsx +7 -17
  403. package/src/providers/services/OrganisationServiceContext.ts +25 -0
  404. package/src/providers/services/OrganisationServiceProvider.tsx +7 -17
  405. package/src/providers/services/UnifiedAuthContext.ts +99 -0
  406. package/src/providers/services/UnifiedAuthProvider.test.tsx +212 -0
  407. package/src/providers/services/UnifiedAuthProvider.tsx +38 -143
  408. package/src/providers/services/__tests__/AuthServiceProvider.integration.test.tsx +61 -95
  409. package/src/providers/services/__tests__/AuthServiceProvider.test.tsx +638 -0
  410. package/src/providers/services/__tests__/EventServiceProvider.test.tsx +839 -0
  411. package/src/providers/services/__tests__/InactivityServiceProvider.test.tsx +662 -0
  412. package/src/providers/services/__tests__/OrganisationServiceProvider.test.tsx +440 -0
  413. package/src/providers/services/__tests__/UnifiedAuthProvider.advanced.test.tsx +435 -0
  414. package/src/providers/services/__tests__/UnifiedAuthProvider.appId.test.tsx +408 -0
  415. package/src/providers/services/__tests__/UnifiedAuthProvider.integration.test.tsx +55 -48
  416. package/src/providers/services/__tests__/contexts.test.tsx +281 -0
  417. package/src/providers/services/__tests__/useUnifiedAuth.test.tsx +251 -0
  418. package/src/providers/services/useUnifiedAuth.ts +29 -0
  419. package/src/rbac/README.md +5 -5
  420. package/src/rbac/__tests__/adapters.comprehensive.test.tsx +9 -14
  421. package/src/rbac/__tests__/audit-batched.test.ts +550 -0
  422. package/src/rbac/__tests__/auth-rbac-security.integration.test.tsx +1 -14
  423. package/src/rbac/__tests__/auth-rbac.e2e.test.tsx +43 -12
  424. package/src/rbac/__tests__/cache-invalidation.test.ts +8 -14
  425. package/src/rbac/__tests__/engine.comprehensive.test.ts +2 -7
  426. package/src/rbac/__tests__/index.test.ts +107 -0
  427. package/src/rbac/__tests__/performance.test.ts +451 -0
  428. package/src/rbac/__tests__/rbac-core.test.tsx +2 -2
  429. package/src/rbac/__tests__/rbac-engine-core-logic.test.ts +0 -5
  430. package/src/rbac/__tests__/rbac-engine-simplified.test.ts +1 -7
  431. package/src/rbac/__tests__/rbac-functions.test.ts +0 -1
  432. package/src/rbac/__tests__/rbac-integration.test.ts +0 -1
  433. package/src/rbac/__tests__/scenarios.user-role.test.tsx +21 -32
  434. package/src/rbac/adapters.test.tsx +654 -0
  435. package/src/rbac/adapters.tsx +24 -9
  436. package/src/rbac/api.test.ts +13 -217
  437. package/src/rbac/api.ts +85 -16
  438. package/src/rbac/audit-batched.ts +5 -4
  439. package/src/rbac/audit.test.ts +225 -28
  440. package/src/rbac/audit.ts +22 -17
  441. package/src/rbac/cache-invalidation.ts +18 -15
  442. package/src/rbac/cache.test.ts +123 -63
  443. package/src/rbac/cache.ts +3 -4
  444. package/src/rbac/components/AccessDenied.tsx +20 -18
  445. package/src/rbac/components/NavigationGuard.tsx +10 -8
  446. package/src/rbac/components/PagePermissionGuard.tsx +27 -25
  447. package/src/rbac/components/__tests__/AccessDenied.test.tsx +324 -0
  448. package/src/rbac/components/__tests__/NavigationGuard.test.tsx +242 -71
  449. package/src/rbac/components/__tests__/PagePermissionGuard.performance.test.tsx +20 -37
  450. package/src/rbac/components/__tests__/PagePermissionGuard.race-condition.test.tsx +18 -17
  451. package/src/rbac/components/__tests__/PagePermissionGuard.test.tsx +452 -129
  452. package/src/rbac/components/__tests__/PagePermissionGuard.verification.test.tsx +14 -13
  453. package/src/rbac/config.test.ts +131 -48
  454. package/src/rbac/config.ts +11 -8
  455. package/src/rbac/docs/event-based-apps.md +26 -13
  456. package/src/rbac/engine.test.ts +496 -146
  457. package/src/rbac/engine.ts +53 -13
  458. package/src/rbac/errors.test.ts +99 -87
  459. package/src/rbac/eslint-rules.js +2 -2
  460. package/src/rbac/hooks/__tests__/usePermissions.integration.test.ts +0 -5
  461. package/src/rbac/hooks/__tests__/useSecureSupabase.test.ts +601 -1
  462. package/src/rbac/hooks/permissions/__tests__/useAccessLevel.test.ts +622 -0
  463. package/src/rbac/hooks/permissions/__tests__/useCan.test.ts +798 -0
  464. package/src/rbac/hooks/permissions/__tests__/useMultiplePermissions.test.ts +843 -0
  465. package/src/rbac/hooks/permissions/__tests__/usePermissions.test.ts +545 -0
  466. package/src/rbac/hooks/permissions/useAccessLevel.ts +7 -8
  467. package/src/rbac/hooks/permissions/useCan.ts +12 -10
  468. package/src/rbac/hooks/permissions/useMultiplePermissions.ts +57 -8
  469. package/src/rbac/hooks/permissions/usePermissions.ts +15 -14
  470. package/src/rbac/hooks/useCan.test.ts +319 -3
  471. package/src/rbac/hooks/usePermissions.test.ts +426 -0
  472. package/src/rbac/hooks/usePermissions.ts +5 -7
  473. package/src/rbac/hooks/useRBAC.test.ts +1669 -2
  474. package/src/rbac/hooks/useRBAC.ts +7 -11
  475. package/src/rbac/hooks/useResolvedScope.test.ts +442 -5
  476. package/src/rbac/hooks/useResolvedScope.ts +4 -1
  477. package/src/rbac/hooks/useResourcePermissions.test.ts +538 -1
  478. package/src/rbac/hooks/useResourcePermissions.ts +9 -7
  479. package/src/rbac/hooks/useRoleManagement.test.ts +659 -1
  480. package/src/rbac/hooks/useRoleManagement.ts +16 -12
  481. package/src/rbac/hooks/useSecureSupabase.ts +11 -12
  482. package/src/rbac/index.ts +32 -32
  483. package/src/rbac/permissions.test.ts +149 -68
  484. package/src/rbac/permissions.ts +0 -3
  485. package/src/rbac/request-deduplication.test.ts +347 -0
  486. package/src/rbac/secureClient.test.ts +112 -159
  487. package/src/rbac/secureClient.ts +46 -26
  488. package/src/rbac/security.test.ts +125 -44
  489. package/src/rbac/security.ts +7 -6
  490. package/src/rbac/types.test.ts +236 -0
  491. package/src/rbac/types.ts +7 -5
  492. package/src/rbac/utils/__tests__/clientSecurity.test.ts +192 -0
  493. package/src/rbac/utils/__tests__/contextValidator.test.ts +1 -3
  494. package/src/rbac/utils/__tests__/deep-equal.test.ts +23 -0
  495. package/src/rbac/utils/__tests__/eventContext.test.ts +10 -57
  496. package/src/rbac/utils/clientSecurity.ts +6 -4
  497. package/src/rbac/utils/contextValidator.ts +1 -2
  498. package/src/rbac/utils/eventContext.ts +2 -2
  499. package/src/services/AuthService.ts +13 -11
  500. package/src/services/EventService.ts +4 -5
  501. package/src/services/OrganisationService.ts +13 -30
  502. package/src/services/__tests__/AuthService.edge-cases.test.ts +746 -0
  503. package/src/services/__tests__/AuthService.restoreSession.test.ts +23 -3
  504. package/src/services/__tests__/AuthService.test.ts +4 -8
  505. package/src/services/__tests__/BaseService.edge-cases.test.ts +506 -0
  506. package/src/services/__tests__/BaseService.test.ts +49 -0
  507. package/src/services/__tests__/EventService.edge-cases.test.ts +633 -0
  508. package/src/services/__tests__/EventService.eventColours.test.ts +0 -12
  509. package/src/services/__tests__/EventService.test.ts +0 -7
  510. package/src/services/__tests__/InactivityService.edge-cases.test.ts +492 -0
  511. package/src/services/__tests__/InactivityService.lifecycle.test.ts +0 -5
  512. package/src/services/__tests__/OrganisationService.edge-cases.test.ts +633 -0
  513. package/src/services/base/BaseService.test.ts +214 -0
  514. package/src/services/interfaces/IOrganisationService.ts +0 -1
  515. package/src/services/interfaces/__tests__/IAuthService.test.ts +190 -0
  516. package/src/services/interfaces/__tests__/IEventService.test.ts +176 -0
  517. package/src/services/interfaces/__tests__/IInactivityService.test.ts +183 -0
  518. package/src/services/interfaces/__tests__/IOrganisationService.test.ts +207 -0
  519. package/src/styles/core.css +1 -0
  520. package/src/theming/__tests__/runtime.test.ts +29 -94
  521. package/src/theming/parseEventColours.ts +18 -9
  522. package/src/theming/runtime.ts +1 -5
  523. package/src/types/__tests__/core.test.ts +397 -0
  524. package/src/types/__tests__/database-generated.test.ts +78 -0
  525. package/src/types/__tests__/file-reference.test.ts +270 -366
  526. package/src/types/__tests__/guards.test.ts +26 -26
  527. package/src/types/__tests__/index.test.ts +265 -0
  528. package/src/types/__tests__/type-validation.test.ts +3 -3
  529. package/src/types/__tests__/validation.test.ts +0 -2
  530. package/src/types/auth.ts +0 -1
  531. package/src/types/event.ts +1 -1
  532. package/src/types/rpc-responses.ts +33 -0
  533. package/src/types/supabase.ts +1 -2
  534. package/src/types/vitest-globals.d.ts +1 -1
  535. package/src/utils/__tests__/bundleAnalysis.unit.test.ts +64 -77
  536. package/src/utils/__tests__/dynamicUtils.unit.test.ts +13 -0
  537. package/src/utils/__tests__/formatDate.unit.test.ts +1 -1
  538. package/src/utils/__tests__/lazyLoad.unit.test.tsx +0 -1
  539. package/src/utils/__tests__/logger.unit.test.ts +1 -1
  540. package/src/utils/__tests__/performanceBenchmark.test.ts +1 -2
  541. package/src/utils/__tests__/performanceBudgets.unit.test.ts +48 -13
  542. package/src/utils/__tests__/request-deduplication.test.ts +349 -0
  543. package/src/utils/__tests__/secureDataAccess.unit.test.ts +0 -1
  544. package/src/utils/__tests__/timezone.test.ts +1 -1
  545. package/src/utils/__tests__/validation.unit.test.ts +1 -2
  546. package/src/utils/__tests__/validationUtils.unit.test.ts +1 -1
  547. package/src/utils/app/appConfig.test.ts +235 -0
  548. package/src/utils/app/appIdResolver.test.ts +188 -20
  549. package/src/utils/app/appNameResolver.test.ts +18 -10
  550. package/src/utils/app/appNameResolver.ts +11 -9
  551. package/src/utils/app/appPortMap.test.ts +125 -0
  552. package/src/utils/app/appPortMap.ts +51 -0
  553. package/src/utils/app/buildAppUrl.test.ts +273 -0
  554. package/src/utils/app/buildAppUrl.ts +114 -0
  555. package/src/utils/audit/audit.test.ts +354 -39
  556. package/src/utils/context/organisationContext.test.ts +10 -4
  557. package/src/utils/context/organisationContext.ts +5 -5
  558. package/src/utils/context/sessionTracking.test.ts +354 -0
  559. package/src/utils/core/__tests__/cn.test.ts +66 -0
  560. package/src/utils/core/__tests__/debugLogger.test.ts +113 -0
  561. package/src/utils/core/__tests__/logger.test.ts +217 -0
  562. package/src/utils/core/debugLogger.ts +15 -8
  563. package/src/utils/core/logger.ts +20 -16
  564. package/src/utils/device/deviceFingerprint.test.ts +8 -5
  565. package/src/utils/device/deviceFingerprint.ts +3 -3
  566. package/src/utils/dynamic/__tests__/dynamicUtils.test.ts +185 -0
  567. package/src/utils/dynamic/__tests__/lazyLoad.test.tsx +156 -0
  568. package/src/utils/dynamic/createLazyComponent.tsx +38 -0
  569. package/src/utils/dynamic/dynamicUtils.ts +6 -6
  570. package/src/utils/dynamic/lazyLoad.tsx +8 -36
  571. package/src/utils/dynamic/papaparseLoader.ts +7 -0
  572. package/src/utils/file-reference/__tests__/file-reference.test.ts +583 -145
  573. package/src/utils/file-reference/index.ts +0 -1
  574. package/src/utils/formatting/formatDate.test.ts +22 -148
  575. package/src/utils/formatting/formatDateTime.test.ts +41 -119
  576. package/src/utils/formatting/formatDateTimeTimezone.test.ts +40 -84
  577. package/src/utils/formatting/formatNumber.test.ts +259 -0
  578. package/src/utils/formatting/formatTime.test.ts +36 -128
  579. package/src/utils/formatting/formatting.ts +1 -1
  580. package/src/utils/google-places/googlePlacesUtils.test.ts +72 -3
  581. package/src/utils/google-places/googlePlacesUtils.ts +15 -2
  582. package/src/utils/google-places/loadGoogleMapsScript.test.ts +58 -1
  583. package/src/utils/google-places/loadGoogleMapsScript.ts +2 -1
  584. package/src/utils/index.ts +52 -11
  585. package/src/utils/location/location.test.ts +18 -115
  586. package/src/utils/performance/__tests__/bundleAnalysis.test.ts +148 -0
  587. package/src/utils/performance/__tests__/performanceBenchmark.test.ts +251 -0
  588. package/src/utils/performance/__tests__/performanceBudgets.test.ts +241 -0
  589. package/src/utils/performance/bundleAnalysis.ts +16 -22
  590. package/src/utils/performance/performanceBenchmark.ts +12 -4
  591. package/src/utils/performance/performanceBudgets.ts +9 -6
  592. package/src/utils/permissions/__tests__/permissionTypes.test.ts +149 -0
  593. package/src/utils/permissions/permissionUtils.test.ts +20 -42
  594. package/src/utils/persistence/__tests__/keyDerivation.test.ts +180 -9
  595. package/src/utils/persistence/__tests__/sensitiveFieldDetection.test.ts +164 -16
  596. package/src/utils/persistence/sensitiveFieldDetection.ts +2 -2
  597. package/src/utils/request-deduplication.ts +6 -4
  598. package/src/utils/security/auth-utils.ts +7 -7
  599. package/src/utils/security/secureDataAccess.test.ts +22 -191
  600. package/src/utils/security/secureErrors.test.ts +163 -0
  601. package/src/utils/security/secureStorage.test.ts +156 -0
  602. package/src/utils/security/secureStorage.ts +1 -1
  603. package/src/utils/security/security.test.ts +204 -0
  604. package/src/utils/security/securityMonitor.test.ts +90 -0
  605. package/src/utils/security/securityMonitor.ts +1 -1
  606. package/src/utils/storage/__tests__/config.unit.test.ts +239 -0
  607. package/src/utils/storage/__tests__/index.unit.test.ts +64 -12
  608. package/src/utils/storage/helpers.test.ts +757 -430
  609. package/src/utils/storage/helpers.ts +1 -2
  610. package/src/utils/storage/{index.ts → storageUtils.ts} +1 -36
  611. package/src/utils/storage/types.ts +2 -2
  612. package/src/utils/supabase/createBaseClient.test.ts +201 -0
  613. package/src/utils/supabase/createBaseClient.ts +2 -1
  614. package/src/utils/timezone/timezone.test.ts +25 -43
  615. package/src/utils/validation/__tests__/common.test.ts +115 -0
  616. package/src/utils/validation/__tests__/csrf.test.ts +65 -0
  617. package/src/utils/validation/__tests__/htmlSanitization.unit.test.ts +27 -7
  618. package/src/utils/validation/__tests__/passwordSchema.test.ts +164 -0
  619. package/src/utils/validation/__tests__/schema.test.ts +127 -0
  620. package/src/utils/validation/__tests__/sqlInjectionProtection.test.ts +76 -3
  621. package/src/utils/validation/__tests__/user.test.ts +173 -0
  622. package/src/utils/validation/__tests__/validation.test.ts +197 -0
  623. package/src/utils/validation/__tests__/validationUtils.test.ts +265 -43
  624. package/src/utils/validation/htmlSanitization.ts +27 -31
  625. package/src/utils/validation/schema.ts +6 -3
  626. package/src/utils/validation/sqlInjectionProtection.ts +2 -2
  627. package/src/vite-env.d.ts +6 -0
  628. package/dist/DataTable-DRUIgtUH.d.ts +0 -166
  629. package/dist/UnifiedAuthProvider-7SNDOWYD.js +0 -7
  630. package/dist/audit-MYQXYZFU.js +0 -3
  631. package/dist/chunk-7ILTDCL2.js +0 -80
  632. package/dist/chunk-EF2UGZWY.js +0 -611
  633. package/dist/chunk-FEJLJNWA.js +0 -181
  634. package/dist/chunk-GS5672WG.js +0 -2003
  635. package/dist/chunk-S6ZQKDY6.js +0 -62
  636. package/dist/chunk-Z2FNRKF3.js +0 -994
  637. package/dist/useToast-AyaT-x7p.d.ts +0 -68
  638. package/src/components/DataTable/components/index.ts +0 -16
  639. package/src/components/DataTable/core/index.ts +0 -1
  640. package/src/components/DataTable/hooks/index.ts +0 -13
  641. package/src/components/DataTable/utils/index.ts +0 -10
  642. package/src/components/PublicLayout/index.ts +0 -32
  643. package/src/hooks/__tests__/usePermissionCache.simple.test.ts +0 -192
  644. package/src/hooks/__tests__/usePermissionCache.unit.test.ts +0 -741
  645. package/src/hooks/public/index.ts +0 -36
  646. package/src/hooks/usePermissionCache.test.ts +0 -536
  647. package/src/rbac/__tests__/isSuperAdmin.real.test.ts +0 -82
  648. package/src/rbac/audit-enhanced.ts +0 -384
  649. package/src/rbac/compliance/database-validator.ts +0 -165
  650. package/src/rbac/compliance/index.ts +0 -48
  651. package/src/rbac/compliance/pattern-detector.ts +0 -553
  652. package/src/rbac/compliance/quick-fix-suggestions.ts +0 -209
  653. package/src/rbac/compliance/runtime-compliance.ts +0 -99
  654. package/src/rbac/compliance/setup-validator.ts +0 -131
  655. package/src/rbac/components/index.ts +0 -26
  656. package/src/rbac/hooks/index.ts +0 -34
  657. package/src/rbac/hooks/permissions/index.ts +0 -4
  658. package/src/rbac/hooks/useRBAC.simple.test.ts +0 -95
  659. package/src/rbac/utils/__tests__/eventContext.unit.test.ts +0 -490
  660. package/src/utils/app/appNameResolver.simple.test.ts +0 -212
  661. package/src/utils/google-places/index.ts +0 -26
  662. package/src/utils/location/index.ts +0 -16
  663. package/src/utils/storage/__tests__/helpers.unit.test.ts +0 -332
  664. package/src/utils/timezone/index.ts +0 -17
  665. package/src/utils/validation/index.ts +0 -73
@@ -33,10 +33,8 @@ export type { DataRecord, CellValue, RowId };
33
33
  /**
34
34
  * DataTable state interface.
35
35
  * Contains all state for table operations including sorting, filtering, pagination, and editing.
36
- *
37
- * @template TData - The type of data records in the table
38
36
  */
39
- export interface DataTableState<TData extends DataRecord> {
37
+ export interface DataTableState {
40
38
  // Table state
41
39
  sorting: SortingState;
42
40
  columnFilters: ColumnFiltersState;
@@ -66,10 +64,8 @@ export interface DataTableState<TData extends DataRecord> {
66
64
  /**
67
65
  * Actions interface for DataTable state management.
68
66
  * Provides functions to update all aspects of table state.
69
- *
70
- * @template TData - The type of data records in the table
71
67
  */
72
- export interface DataTableStateActions<TData extends DataRecord> {
68
+ export interface DataTableStateActions {
73
69
  setSorting: (sorting: SortingState) => void;
74
70
  setColumnFilters: (filters: ColumnFiltersState) => void;
75
71
  setColumnVisibility: (visibility: VisibilityState) => void;
@@ -91,7 +87,7 @@ export interface DataTableStateActions<TData extends DataRecord> {
91
87
  setFilterRow: (show: boolean) => void;
92
88
  setSearchQuery: (query: string) => void;
93
89
  resetState: () => void;
94
- initializeState: (partialState: Partial<DataTableState<TData>>) => void;
90
+ initializeState: (partialState: Partial<DataTableState>) => void;
95
91
  }
96
92
 
97
93
  /**
@@ -111,7 +107,7 @@ export interface DataTableComputed {
111
107
  // ACTION TYPES
112
108
  // ============================================================================
113
109
 
114
- export type DataTableAction<TData extends DataRecord> =
110
+ export type DataTableAction =
115
111
  | { type: 'SET_SORTING'; payload: SortingState }
116
112
  | { type: 'SET_COLUMN_FILTERS'; payload: ColumnFiltersState }
117
113
  | { type: 'SET_COLUMN_VISIBILITY'; payload: VisibilityState }
@@ -131,7 +127,7 @@ export type DataTableAction<TData extends DataRecord> =
131
127
  | { type: 'SET_FILTER_ROW'; payload: boolean }
132
128
  | { type: 'SET_SEARCH_QUERY'; payload: string }
133
129
  | { type: 'RESET_STATE' }
134
- | { type: 'INITIALIZE_STATE'; payload: Partial<DataTableState<TData>> };
130
+ | { type: 'INITIALIZE_STATE'; payload: Partial<DataTableState> };
135
131
 
136
132
  // ============================================================================
137
133
  // REDUCER
@@ -146,10 +142,10 @@ export type DataTableAction<TData extends DataRecord> =
146
142
  * @param action - Action to perform
147
143
  * @returns New table state
148
144
  */
149
- export function dataTableReducer<TData extends DataRecord>(
150
- state: DataTableState<TData>,
151
- action: DataTableAction<TData>
152
- ): DataTableState<TData> {
145
+ export function dataTableReducer(
146
+ state: DataTableState,
147
+ action: DataTableAction
148
+ ): DataTableState {
153
149
  switch (action.type) {
154
150
  case 'SET_SORTING':
155
151
  return { ...state, sorting: action.payload };
@@ -216,7 +212,7 @@ export function dataTableReducer<TData extends DataRecord>(
216
212
  return { ...state, searchQuery: action.payload };
217
213
 
218
214
  case 'RESET_STATE':
219
- return createInitialState<TData>();
215
+ return createInitialState();
220
216
 
221
217
  case 'INITIALIZE_STATE':
222
218
  return { ...state, ...action.payload };
@@ -230,12 +226,12 @@ export function dataTableReducer<TData extends DataRecord>(
230
226
  // INITIAL STATE
231
227
  // ============================================================================
232
228
 
233
- export function createInitialState<TData extends DataRecord>(
229
+ export function createInitialState(
234
230
  initialPageSize: number = 10,
235
231
  columnIds: string[] = [],
236
232
  defaultSorting?: SortingState,
237
233
  defaultGrouping?: GroupingState
238
- ): DataTableState<TData> {
234
+ ): DataTableState {
239
235
  return {
240
236
  sorting: defaultSorting || [],
241
237
  columnFilters: [],
@@ -262,7 +258,7 @@ export function createInitialState<TData extends DataRecord>(
262
258
  // HOOK
263
259
  // ============================================================================
264
260
 
265
- export interface UseDataTableStateOptions<TData extends DataRecord> {
261
+ export interface UseDataTableStateOptions {
266
262
  initialPageSize?: number;
267
263
  columnIds?: string[];
268
264
  initialRowSelection?: Record<string, boolean>;
@@ -276,7 +272,7 @@ export interface UseDataTableStateOptions<TData extends DataRecord> {
276
272
  columnFieldNames?: string[]; // Field names for sensitive field filtering
277
273
  }
278
274
 
279
- export function useDataTableState<TData extends DataRecord>({
275
+ export function useDataTableState<_TData extends DataRecord = DataRecord>({
280
276
  initialPageSize = 10,
281
277
  columnIds = [],
282
278
  initialRowSelection = {},
@@ -287,7 +283,7 @@ export function useDataTableState<TData extends DataRecord>({
287
283
  title,
288
284
  location,
289
285
  columnFieldNames = [],
290
- }: UseDataTableStateOptions<TData> = {}) {
286
+ }: UseDataTableStateOptions = {}) {
291
287
 
292
288
  // Call all hooks unconditionally at the top level
293
289
  // Hooks must be called in the same order on every render
@@ -310,12 +306,12 @@ export function useDataTableState<TData extends DataRecord>({
310
306
 
311
307
  // Create initial state
312
308
  const baseInitialState = useMemo(() =>
313
- createInitialState<TData>(initialPageSize, columnIds, defaultSorting, defaultGrouping),
309
+ createInitialState(initialPageSize, columnIds, defaultSorting, defaultGrouping),
314
310
  [initialPageSize, columnIds, defaultSorting, defaultGrouping]
315
311
  );
316
312
 
317
313
  // Define state subset to persist (excluding sensitive fields from editing/creation data)
318
- type PersistedState = Omit<DataTableState<TData>, 'editingData' | 'creationData'> & {
314
+ type PersistedState = Omit<DataTableState, 'editingData' | 'creationData'> & {
319
315
  editingData: Partial<Record<string, CellValue>>;
320
316
  creationData: Partial<Record<string, CellValue>>;
321
317
  };
@@ -353,13 +349,13 @@ export function useDataTableState<TData extends DataRecord>({
353
349
  };
354
350
  }, [baseInitialState, persistedState, initialRowSelection, persistenceKey]);
355
351
 
356
- const [state, dispatch] = useReducer(dataTableReducer<TData>, initialState);
352
+ const [state, dispatch] = useReducer(dataTableReducer, initialState);
357
353
 
358
354
  // ============================================================================
359
355
  // ACTION CREATORS
360
356
  // ============================================================================
361
357
 
362
- const actions = useMemo<DataTableStateActions<TData>>(() => ({
358
+ const actions = useMemo<DataTableStateActions>(() => ({
363
359
  setSorting: (sorting: SortingState) =>
364
360
  dispatch({ type: 'SET_SORTING', payload: sorting }),
365
361
 
@@ -425,7 +421,7 @@ export function useDataTableState<TData extends DataRecord>({
425
421
  resetState: () =>
426
422
  dispatch({ type: 'RESET_STATE' }),
427
423
 
428
- initializeState: (partialState: Partial<DataTableState<TData>>) =>
424
+ initializeState: (partialState: Partial<DataTableState>) =>
429
425
  dispatch({ type: 'INITIALIZE_STATE', payload: partialState })
430
426
  }), [state.rowSelection, onRowSelectionChange]);
431
427
 
@@ -120,7 +120,7 @@ export function useKeyboardNavigation(
120
120
 
121
121
  const cells = row.querySelectorAll('td[role="cell"], th[role="columnheader"]');
122
122
  return cells[columnIndex] as HTMLElement || null;
123
- }, []);
123
+ }, [tableRef]);
124
124
 
125
125
  // Helper to get header element
126
126
  const getHeaderElement = useCallback((columnIndex: number): HTMLElement | null => {
@@ -134,7 +134,7 @@ export function useKeyboardNavigation(
134
134
 
135
135
  const headers = headerRow.querySelectorAll('th[role="columnheader"]');
136
136
  return headers[columnIndex] as HTMLElement || null;
137
- }, []);
137
+ }, [tableRef]);
138
138
 
139
139
  // Focus a specific cell
140
140
  const focusCell = useCallback((rowIndex: number, columnIndex: number) => {
@@ -295,7 +295,7 @@ export function useKeyboardNavigation(
295
295
  }
296
296
  };
297
297
 
298
- const onFocus = (event: React.FocusEvent) => {
298
+ const onFocus = (_event: React.FocusEvent) => {
299
299
  setState(prev => ({
300
300
  ...prev,
301
301
  focusedRowIndex: rowIndex,
@@ -306,7 +306,7 @@ export function useKeyboardNavigation(
306
306
  onFocusChange?.(rowIndex, columnIndex);
307
307
  };
308
308
 
309
- const onBlur = (event: React.FocusEvent) => {
309
+ const onBlur = (_event: React.FocusEvent) => {
310
310
  // Clear navigation state after a delay to allow for focus transitions
311
311
  if (navigationTimeoutRef.current) {
312
312
  clearTimeout(navigationTimeoutRef.current);
@@ -386,7 +386,7 @@ export function useKeyboardNavigation(
386
386
  }
387
387
  };
388
388
 
389
- const onFocus = (event: React.FocusEvent) => {
389
+ const onFocus = (_event: React.FocusEvent) => {
390
390
  // Headers don't participate in cell navigation state
391
391
  };
392
392
 
@@ -3,6 +3,9 @@
3
3
  */
4
4
 
5
5
  import { useCallback, useEffect } from 'react';
6
+ import { createLogger } from '../../../utils/core/logger';
7
+
8
+ const logger = createLogger('useServerSideDataEffect');
6
9
  import type {
7
10
  DataRecord,
8
11
  PaginationMode,
@@ -66,7 +69,16 @@ export function useServerSideDataEffect<TData extends DataRecord>({
66
69
  grouping,
67
70
  };
68
71
 
69
- await fetchServerData(params);
72
+ try {
73
+ await fetchServerData(params);
74
+ } catch (error) {
75
+ // Errors from fetchServerData are handled gracefully
76
+ // The error is caught to prevent unhandled promise rejections
77
+ // Error handling/display should be implemented in the fetchServerData function itself
78
+ if (import.meta.env.DEV) {
79
+ logger.error('Error fetching server data', error);
80
+ }
81
+ }
70
82
  }, [
71
83
  finalPaginationMode,
72
84
  serverSide,
@@ -19,8 +19,7 @@ import type {
19
19
  DataTableAction,
20
20
  DataRecord
21
21
  } from '../types';
22
- import type { ColumnDef } from '@tanstack/react-table';
23
- import type { HeaderContext, CellContext } from '@tanstack/react-table';
22
+ import type { ColumnDef, HeaderContext, CellContext } from '@tanstack/react-table';
24
23
 
25
24
  /**
26
25
  * Options for the useTableColumns hook.
@@ -61,7 +60,7 @@ export function useTableColumns<TData extends DataRecord>({
61
60
  // Create enhanced base columns
62
61
  const baseColumns: ColumnDef<TData>[] = [...columns].map(column => {
63
62
  const dataTableColumn = column as DataTableColumn<TData>;
64
- const baseColumn = {
63
+ const baseColumn: ColumnDef<TData> = {
65
64
  ...column,
66
65
  enableSorting: features.sorting && (column.enableSorting !== false),
67
66
  enableColumnFilter: features.filtering && (column.enableColumnFilter !== false),
@@ -79,9 +78,9 @@ export function useTableColumns<TData extends DataRecord>({
79
78
  !baseColumn.cell
80
79
  ) {
81
80
  // Inject automatic cell renderer that displays labels in read mode
82
- baseColumn.cell = ({ getValue, row, column: col }) => {
81
+ baseColumn.cell = ({ getValue }: { getValue: () => unknown }) => {
83
82
  const value = getValue();
84
- const label = findSelectLabel(value as any, dataTableColumn.fieldOptions);
83
+ const label = findSelectLabel(value as string | number | null, dataTableColumn.fieldOptions);
85
84
 
86
85
  // Display label if found, otherwise fall back to raw value (backward compatibility)
87
86
  // In edit mode, EditableRow will handle rendering the Select component
@@ -123,18 +122,6 @@ export function useTableColumns<TData extends DataRecord>({
123
122
  header: ({ table }: HeaderContext<TData, unknown>) => {
124
123
  const isAllSelected = table.getIsAllPageRowsSelected();
125
124
  const isSomeSelected = table.getIsSomePageRowsSelected();
126
- const pageRows = table.getRowModel().rows;
127
- const selectedCount = Object.values(table.getState().rowSelection || {}).filter(Boolean).length;
128
-
129
- // Always log - remove NODE_ENV check for debugging
130
- console.log('[DataTable Selection] Header checkbox state:', {
131
- isAllSelected,
132
- isSomeSelected,
133
- pageRowCount: pageRows.length,
134
- totalSelectedCount: selectedCount,
135
- rowSelection: table.getState().rowSelection,
136
- pageRowIds: pageRows.map(row => row.id),
137
- });
138
125
 
139
126
  return React.createElement(Checkbox, {
140
127
  checked: isAllSelected,
@@ -142,34 +129,23 @@ export function useTableColumns<TData extends DataRecord>({
142
129
  onCheckedChange: (checked: boolean | 'indeterminate') => {
143
130
  // Ensure we pass a boolean value
144
131
  const shouldSelect = checked === true || checked === 'indeterminate';
145
-
146
- // Always log - remove NODE_ENV check for debugging
147
- console.log('[DataTable Selection] Header checkbox clicked:', {
148
- checked,
149
- shouldSelect,
150
- pageRowCount: pageRows.length,
151
- pageRowIds: pageRows.map(row => row.id),
152
- currentSelection: table.getState().rowSelection,
153
- });
154
-
155
132
  table.toggleAllPageRowsSelected(shouldSelect);
156
-
157
- // Log after toggle to see what changed
158
- setTimeout(() => {
159
- console.log('[DataTable Selection] After toggleAllPageRowsSelected:', {
160
- newSelection: table.getState().rowSelection,
161
- isAllSelected: table.getIsAllPageRowsSelected(),
162
- isSomeSelected: table.getIsSomePageRowsSelected(),
163
- pageRowIds: table.getRowModel().rows.map(row => row.id),
164
- });
165
- }, 0);
166
133
  },
167
134
  'aria-label': "Select all"
168
135
  });
169
136
  },
170
- cell: ({ row }: CellContext<TData, unknown>) => {
137
+ cell: ({ row, table }: CellContext<TData, unknown>) => {
138
+ // CRITICAL FIX: Read selection state directly from table.getState().rowSelection
139
+ // instead of relying solely on row.getIsSelected() which may not trigger re-renders
140
+ // when the row object reference doesn't change
141
+ const rowSelection = table.getState().rowSelection;
142
+ const rowId = row.id;
143
+ // Read directly from rowSelection state to ensure reactivity
144
+ // This ensures the cell re-renders when the rowSelection object reference changes
145
+ const isSelected = rowSelection[rowId] === true;
146
+
171
147
  return React.createElement(Checkbox, {
172
- checked: row.getIsSelected(),
148
+ checked: isSelected,
173
149
  onCheckedChange: (value: boolean | 'indeterminate') => row.toggleSelected(!!value),
174
150
  'aria-label': "Select row"
175
151
  });
@@ -26,10 +26,8 @@ export interface TableLayoutChange {
26
26
  /**
27
27
  * Snapshot of table state at a point in time.
28
28
  * Used for state persistence and restoration.
29
- *
30
- * @template TData - The type of data records in the table
31
29
  */
32
- export interface TableStateSnapshot<TData extends DataRecord> {
30
+ export interface TableStateSnapshot {
33
31
  sorting: SortingState;
34
32
  columnFilters: ColumnFiltersState;
35
33
  columnVisibility: VisibilityState;
@@ -56,10 +54,10 @@ export interface TableHandlers {
56
54
  onColumnOrderChange: (updaterOrValue: unknown) => void;
57
55
  }
58
56
 
59
- interface UseTableHandlersOptions<TData extends DataRecord> {
60
- state: DataTableState<TData>;
61
- stateSnapshot: TableStateSnapshot<TData>;
62
- actions: DataTableStateActions<TData>;
57
+ interface UseTableHandlersOptions {
58
+ state: DataTableState;
59
+ stateSnapshot: TableStateSnapshot;
60
+ actions: DataTableStateActions;
63
61
  selection?: Record<string, boolean>;
64
62
  onRowSelectionChange?: (selection: Record<string, boolean>) => void;
65
63
  effectiveColumnOrder: string[];
@@ -70,7 +68,7 @@ interface UseTableHandlersOptions<TData extends DataRecord> {
70
68
  onLayoutChange?: (layout: TableLayoutChange) => void;
71
69
  }
72
70
 
73
- export function useTableHandlers<TData extends DataRecord>({
71
+ export function useTableHandlers<_TData extends DataRecord = DataRecord>({
74
72
  state,
75
73
  stateSnapshot,
76
74
  actions,
@@ -82,7 +80,8 @@ export function useTableHandlers<TData extends DataRecord>({
82
80
  updateSavedColumnVisibility,
83
81
  updateColumnOrder,
84
82
  onLayoutChange,
85
- }: UseTableHandlersOptions<TData>): TableHandlers {
83
+ }: UseTableHandlersOptions): TableHandlers {
84
+
86
85
  const handleSortingChange = useCallback((updaterOrValue: unknown) => {
87
86
  const nextValue = typeof updaterOrValue === 'function'
88
87
  ? (updaterOrValue as (prev: SortingState) => SortingState)(stateSnapshot.sorting)
@@ -120,17 +119,6 @@ export function useTableHandlers<TData extends DataRecord>({
120
119
  ? (updaterOrValue as (prev: Record<string, boolean>) => Record<string, boolean>)(currentSelection)
121
120
  : updaterOrValue as Record<string, boolean>;
122
121
 
123
- // Always log - remove NODE_ENV check for debugging
124
- console.log('[DataTable Selection] handleRowSelectionChange called:', {
125
- isControlled: selection !== undefined,
126
- currentSelectionCount: Object.values(currentSelection).filter(Boolean).length,
127
- nextSelectionCount: Object.values(nextSelection).filter(Boolean).length,
128
- currentSelectionKeys: Object.keys(currentSelection).filter(key => currentSelection[key]),
129
- nextSelectionKeys: Object.keys(nextSelection).filter(key => nextSelection[key]),
130
- added: Object.keys(nextSelection).filter(key => nextSelection[key] && !currentSelection[key]),
131
- removed: Object.keys(currentSelection).filter(key => currentSelection[key] && !nextSelection[key]),
132
- });
133
-
134
122
  if (selection === undefined) {
135
123
  // Uncontrolled mode - update internal state
136
124
  actions.setRowSelection(nextSelection);
@@ -62,10 +62,32 @@ export type { ColumnDef, SortingState, ColumnFiltersState } from '@tanstack/reac
62
62
  export { ColumnFactory } from './core/ColumnFactory';
63
63
 
64
64
  // Components
65
- export * from './components';
65
+ export { ActionButtons } from './components/ActionButtons';
66
+ export { BulkOperationsDropdown } from './components/BulkOperationsDropdown';
67
+ export { ColumnVisibilityDropdown } from './components/ColumnVisibilityDropdown';
68
+ export { UnifiedTableBody } from './components/UnifiedTableBody';
69
+ export { EditableRow } from './components/EditableRow';
70
+ export { DataTableToolbar } from './components/DataTableToolbar';
71
+ export { DataTableModals } from './components/DataTableModals';
72
+ export { ImportModal } from './components/ImportModal';
73
+ export type { ImportModalConfig } from './components/ImportModal';
74
+ export { GroupingDropdown } from './components/GroupingDropdown';
75
+ export { LoadingState } from './components/LoadingState';
76
+ export { EmptyState } from './components/EmptyState';
77
+ export { SortIndicator } from './components/SortIndicator';
78
+ export type { SortIndicatorProps } from './components/SortIndicator';
66
79
 
67
80
  // Utility functions
68
- export * from './utils';
81
+ export * from './utils/aggregationUtils';
82
+ export * from './utils/exportUtils';
83
+ export * from './utils/rowUtils';
84
+ export * from './utils/hierarchicalUtils';
85
+ export * from './utils/hierarchicalSorting';
86
+ export * from './utils/a11yUtils';
87
+ export * from './utils/paginationUtils';
88
+ export * from './utils/columnUtils';
89
+ export * from './utils/errorHandling';
90
+ export * from './utils/selectFieldUtils';
69
91
 
70
92
  // Aggregation utilities (explicitly exported for convenience)
71
93
  export { sum, average, count, min, max } from './utils/aggregationUtils';
@@ -9,16 +9,14 @@ import React from 'react';
9
9
  import type {
10
10
  SortingState,
11
11
  ColumnFiltersState,
12
- VisibilityState,
13
12
  GroupingState,
14
- ExpandedState,
15
- PaginationState,
16
13
  ColumnDef
17
14
  } from '@tanstack/react-table';
18
15
  import type { ImportModalConfig } from './components/ImportModal';
19
16
 
20
17
  // Extend TanStack Table types to include custom meta properties
21
18
  declare module '@tanstack/react-table' {
19
+ // eslint-disable-next-line @typescript-eslint/no-unused-vars
22
20
  interface ColumnMeta<TData, TValue> {
23
21
  /** Text alignment for the column content */
24
22
  align?: 'left' | 'right' | 'center';
@@ -26,6 +24,7 @@ declare module '@tanstack/react-table' {
26
24
  type?: 'text' | 'number' | 'date' | 'boolean' | 'custom';
27
25
  }
28
26
 
27
+ // eslint-disable-next-line @typescript-eslint/no-unused-vars
29
28
  interface ColumnDefBase<TData, TValue> {
30
29
  /** Alternative accessor key used while editing */
31
30
  editAccessorKey?: string;
@@ -295,6 +294,8 @@ export interface DataTableColumn<TData extends DataRecord = DataRecord> extends
295
294
  filterSelectOptions?: Array<{ value: string | number; label: string }>;
296
295
  /** Whether this column is editable in edit mode (default: true) */
297
296
  editable?: boolean;
297
+ /** Alternative CSV headers that should map to this column during import */
298
+ importAliases?: string[];
298
299
 
299
300
  // Hierarchical rendering
300
301
  /** Custom renderer for parent rows */
@@ -704,6 +705,8 @@ export interface DataTableProps<TData extends DataRecord> {
704
705
  id: string;
705
706
  desc: boolean;
706
707
  }>;
708
+ /** Initial column visibility state - columns with value `false` will be hidden by default. Keys should match column `id` or `accessorKey`. */
709
+ initialColumnVisibility?: Record<string, boolean>;
707
710
 
708
711
  // Event handlers
709
712
  /** Row edit handler */
@@ -42,19 +42,13 @@ describe('[unit] a11yUtils', () => {
42
42
  });
43
43
 
44
44
  describe('initializeLiveRegion', () => {
45
- it('creates live region element when none exists', () => {
45
+ it('creates live region element with correct accessibility attributes', () => {
46
46
  const region = initializeLiveRegion();
47
47
 
48
48
  expect(region).not.toBeNull();
49
49
  expect(region).toBeInstanceOf(HTMLElement);
50
50
  expect(region?.getAttribute('aria-live')).toBe('polite');
51
51
  expect(region?.getAttribute('aria-atomic')).toBe('true');
52
- expect(region?.getAttribute('class')).toBe('sr-only');
53
- expect(region?.style.position).toBe('absolute');
54
- expect(region?.style.left).toBe('-10000px');
55
- expect(region?.style.width).toBe('1px');
56
- expect(region?.style.height).toBe('1px');
57
- expect(region?.style.overflow).toBe('hidden');
58
52
  expect(document.body.contains(region!)).toBe(true);
59
53
  });
60
54
 
@@ -75,16 +69,6 @@ describe('[unit] a11yUtils', () => {
75
69
  expect(document.body.contains(secondRegion!)).toBe(true);
76
70
  });
77
71
 
78
- it('returns null in SSR environment', () => {
79
- const originalWindow = global.window;
80
- // @ts-expect-error - Testing SSR scenario
81
- delete global.window;
82
-
83
- const region = initializeLiveRegion();
84
- expect(region).toBeNull();
85
-
86
- global.window = originalWindow;
87
- });
88
72
  });
89
73
 
90
74
  describe('cleanupLiveRegion', () => {
@@ -96,12 +80,12 @@ describe('[unit] a11yUtils', () => {
96
80
  expect(document.body.contains(region!)).toBe(false);
97
81
  });
98
82
 
99
- it('sets live region to null after cleanup', () => {
83
+ it('handles multiple cleanup calls gracefully', () => {
100
84
  initializeLiveRegion();
101
85
  cleanupLiveRegion();
102
86
 
103
87
  // Second call should not throw
104
- cleanupLiveRegion();
88
+ expect(() => cleanupLiveRegion()).not.toThrow();
105
89
  expect(document.body.querySelector('.sr-only[aria-live]')).toBeNull();
106
90
  });
107
91
 
@@ -109,22 +93,7 @@ describe('[unit] a11yUtils', () => {
109
93
  expect(() => cleanupLiveRegion()).not.toThrow();
110
94
  });
111
95
 
112
- it('handles cleanup when region is not in document', () => {
113
- const region = initializeLiveRegion();
114
- document.body.removeChild(region!);
115
-
116
- expect(() => cleanupLiveRegion()).not.toThrow();
117
- });
118
-
119
- it('returns early in SSR environment', () => {
120
- const originalWindow = global.window;
121
- // @ts-expect-error - Testing SSR scenario
122
- delete global.window;
123
96
 
124
- expect(() => cleanupLiveRegion()).not.toThrow();
125
-
126
- global.window = originalWindow;
127
- });
128
97
  });
129
98
 
130
99
  describe('announce', () => {
@@ -172,30 +141,6 @@ describe('[unit] a11yUtils', () => {
172
141
  expect(region.textContent).toBe('');
173
142
  });
174
143
 
175
- it('does not clear message if content changed during delay', () => {
176
- initializeLiveRegion();
177
- announce('First message');
178
- vi.advanceTimersByTime(100);
179
-
180
- const region = document.body.querySelector('.sr-only[aria-live]') as HTMLElement;
181
- expect(region.textContent).toBe('First message');
182
-
183
- // Announce new message before first timeout clears
184
- announce('Second message');
185
- vi.advanceTimersByTime(100);
186
- expect(region.textContent).toBe('Second message');
187
-
188
- // First timeout should not clear since content changed (it was 'Second message', not 'First message')
189
- vi.advanceTimersByTime(900);
190
- // The second timeout should clear it after 1000ms, but we need to advance past the first timeout
191
- // The first timeout (1000ms after first announce) checks if textContent === 'First message'
192
- // Since it's now 'Second message', it won't clear
193
- // Then we advance to the second timeout (1000ms after second announce)
194
- vi.advanceTimersByTime(100);
195
- // Now the second timeout should check if textContent === 'Second message' and clear it
196
- expect(region.textContent).toBe('');
197
- });
198
-
199
144
  it('does not announce empty or whitespace-only messages', () => {
200
145
  initializeLiveRegion();
201
146
  const region = document.body.querySelector('.sr-only[aria-live]') as HTMLElement;
@@ -208,15 +153,6 @@ describe('[unit] a11yUtils', () => {
208
153
  expect(region.textContent).toBe('');
209
154
  });
210
155
 
211
- it('returns early in SSR environment', () => {
212
- const originalWindow = global.window;
213
- // @ts-expect-error - Testing SSR scenario
214
- delete global.window;
215
-
216
- expect(() => announce('Test message')).not.toThrow();
217
-
218
- global.window = originalWindow;
219
- });
220
156
 
221
157
  it('initializes live region if not already initialized', () => {
222
158
  announce('Auto-init message');