@jmruthers/pace-core 0.5.181 → 0.5.183

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 (756) hide show
  1. package/CHANGELOG.md +1 -1
  2. package/README.md +16 -2
  3. package/dist/{AuthService-DYuQPJj6.d.ts → AuthService-B-cd2MA4.d.ts} +9 -11
  4. package/dist/{DataTable-CWAZZcXC.d.ts → DataTable-Bz8ffqyA.d.ts} +1 -1
  5. package/dist/{DataTable-UA6CL4JI.js → DataTable-QAB34V6K.js} +14 -15
  6. package/dist/UnifiedAuthProvider-7F6T4B6K.js +13 -0
  7. package/dist/{UnifiedAuthProvider-DJxGTftH.d.ts → UnifiedAuthProvider-F86d7dSi.d.ts} +5 -6
  8. package/dist/{api-45XYYO2A.js → api-ROMBCNKU.js} +5 -5
  9. package/dist/{audit-64X3VJXB.js → audit-WRS3KJKI.js} +4 -4
  10. package/dist/auth-BZOJqrdd.d.ts +49 -0
  11. package/dist/{chunk-CX5M4ZAG.js → chunk-5DRSZLL2.js} +1 -1
  12. package/dist/chunk-5DRSZLL2.js.map +1 -0
  13. package/dist/{chunk-BESYRHQM.js → chunk-6C4YBBJM.js} +10 -7
  14. package/dist/chunk-6C4YBBJM.js.map +1 -0
  15. package/dist/{chunk-PLDDJCW6.js → chunk-7D4SUZUM.js} +2 -13
  16. package/dist/{chunk-HRO5HWN2.js → chunk-CSOFYHAG.js} +55 -162
  17. package/dist/chunk-CSOFYHAG.js.map +1 -0
  18. package/dist/{chunk-ANBQRTPX.js → chunk-E66EQZE6.js} +3 -5
  19. package/dist/{chunk-ANBQRTPX.js.map → chunk-E66EQZE6.js.map} +1 -1
  20. package/dist/{chunk-Q5QRDWKI.js → chunk-F2IMUDXZ.js} +4 -6
  21. package/dist/chunk-F2IMUDXZ.js.map +1 -0
  22. package/dist/{chunk-SBVILCCA.js → chunk-FSFQFJCU.js} +28 -6
  23. package/dist/chunk-FSFQFJCU.js.map +1 -0
  24. package/dist/chunk-FUEYYMX5.js +2296 -0
  25. package/dist/chunk-FUEYYMX5.js.map +1 -0
  26. package/dist/{chunk-FFKNH6U5.js → chunk-HKIT6O7W.js} +3 -5
  27. package/dist/{chunk-FFKNH6U5.js.map → chunk-HKIT6O7W.js.map} +1 -1
  28. package/dist/chunk-KQCRWDSA.js +1 -0
  29. package/dist/{chunk-S5OFRT4M.js → chunk-KUEN3HFB.js} +6 -6
  30. package/dist/chunk-KUEN3HFB.js.map +1 -0
  31. package/dist/chunk-LMC26NLJ.js +84 -0
  32. package/dist/chunk-LMC26NLJ.js.map +1 -0
  33. package/dist/{chunk-BVYWGZVV.js → chunk-M7W4CP3M.js} +52 -19
  34. package/dist/chunk-M7W4CP3M.js.map +1 -0
  35. package/dist/{chunk-HZLDFOE4.js → chunk-MI7HBHN3.js} +164 -243
  36. package/dist/chunk-MI7HBHN3.js.map +1 -0
  37. package/dist/{chunk-PPMP5J6T.js → chunk-PWAHJW4G.js} +180 -29
  38. package/dist/chunk-PWAHJW4G.js.map +1 -0
  39. package/dist/chunk-PWLANIRT.js +127 -0
  40. package/dist/{chunk-XDNLUEXI.js.map → chunk-PWLANIRT.js.map} +1 -1
  41. package/dist/chunk-QCDXODCA.js +75 -0
  42. package/dist/chunk-QCDXODCA.js.map +1 -0
  43. package/dist/{chunk-D7LCGMVS.js → chunk-QETLRQI6.js} +526 -887
  44. package/dist/chunk-QETLRQI6.js.map +1 -0
  45. package/dist/{chunk-5MT24GKJ.js → chunk-QUVSNGIP.js} +264 -262
  46. package/dist/chunk-QUVSNGIP.js.map +1 -0
  47. package/dist/chunk-QXHPKYJV.js +113 -0
  48. package/dist/chunk-QXHPKYJV.js.map +1 -0
  49. package/dist/{chunk-OWAG3GSU.js → chunk-R77UEZ4E.js} +11 -1
  50. package/dist/chunk-R77UEZ4E.js.map +1 -0
  51. package/dist/{chunk-ZYTYSTO5.js → chunk-RA3JUFMW.js} +314 -161
  52. package/dist/chunk-RA3JUFMW.js.map +1 -0
  53. package/dist/{chunk-ERISIBYU.js → chunk-SQGMNID3.js} +3 -8
  54. package/dist/chunk-SQGMNID3.js.map +1 -0
  55. package/dist/{chunk-XJ2HZOBU.js → chunk-UHNYIBXL.js} +1 -1
  56. package/dist/chunk-UHNYIBXL.js.map +1 -0
  57. package/{src/utils/secureStorage.ts → dist/chunk-VBXEHIUJ.js} +113 -88
  58. package/dist/{chunk-7QCC6MCP.js.map → chunk-VBXEHIUJ.js.map} +1 -1
  59. package/dist/{chunk-VZ4VDGTB.js → chunk-W22JP75J.js} +5 -13
  60. package/dist/{chunk-VZ4VDGTB.js.map → chunk-W22JP75J.js.map} +1 -1
  61. package/dist/components.d.ts +12 -93
  62. package/dist/components.js +23 -106
  63. package/dist/components.js.map +1 -1
  64. package/dist/core-CUElvH_C.d.ts +164 -0
  65. package/dist/database.generated-CBmg2950.d.ts +8284 -0
  66. package/dist/event-CW5YB_2p.d.ts +239 -0
  67. package/dist/{file-reference-C6Gkn77H.d.ts → file-reference-D06mEEWW.d.ts} +7 -5
  68. package/dist/functions-D_kgHktt.d.ts +208 -0
  69. package/dist/hooks.d.ts +54 -7
  70. package/dist/hooks.js +204 -17
  71. package/dist/hooks.js.map +1 -1
  72. package/dist/{EventLogo-B3V3otev.d.ts → index-Bl--n7-T.d.ts} +387 -397
  73. package/dist/index.d.ts +94 -261
  74. package/dist/index.js +314 -126
  75. package/dist/index.js.map +1 -1
  76. package/dist/providers.d.ts +7 -8
  77. package/dist/providers.js +6 -13
  78. package/dist/rbac/index.d.ts +171 -101
  79. package/dist/rbac/index.js +23 -17
  80. package/dist/styles/index.d.ts +1 -3
  81. package/dist/styles/index.js +2 -17
  82. package/dist/theming/runtime.js +3 -3
  83. package/dist/types-UU913iLA.d.ts +102 -0
  84. package/dist/{types-Dfz9dmVH.d.ts → types-_x1f4QBF.d.ts} +6 -6
  85. package/dist/types.d.ts +88 -227
  86. package/dist/types.js +64 -112
  87. package/dist/types.js.map +1 -1
  88. package/dist/{usePublicRouteParams-B7PabvuH.d.ts → usePublicRouteParams-JJczomYq.d.ts} +203 -6
  89. package/dist/utils.d.ts +299 -13
  90. package/dist/utils.js +481 -55
  91. package/dist/utils.js.map +1 -1
  92. package/dist/validation-643vUDZW.d.ts +177 -0
  93. package/docs/DOCUMENTATION_REVIEW_TRACKER.md +511 -0
  94. package/docs/README.md +9 -8
  95. package/docs/api/README.md +16 -2
  96. package/docs/api/classes/ColumnFactory.md +1 -1
  97. package/docs/api/classes/ErrorBoundary.md +1 -1
  98. package/docs/api/classes/InvalidScopeError.md +4 -4
  99. package/docs/api/classes/MissingUserContextError.md +4 -4
  100. package/docs/api/classes/OrganisationContextRequiredError.md +4 -4
  101. package/docs/api/classes/PermissionDeniedError.md +4 -4
  102. package/docs/api/classes/RBACAuditManager.md +14 -14
  103. package/docs/api/classes/RBACCache.md +1 -1
  104. package/docs/api/classes/RBACEngine.md +2 -2
  105. package/docs/api/classes/RBACError.md +4 -4
  106. package/docs/api/classes/RBACNotInitializedError.md +4 -4
  107. package/docs/api/classes/SecureSupabaseClient.md +29 -9
  108. package/docs/api/classes/StorageUtils.md +1 -1
  109. package/docs/api/enums/FileCategory.md +17 -17
  110. package/docs/api/enums/RBACErrorCode.md +228 -0
  111. package/docs/api/enums/RPCFunction.md +118 -0
  112. package/docs/api/interfaces/AggregateConfig.md +1 -1
  113. package/docs/api/interfaces/BadgeProps.md +1 -1
  114. package/docs/api/interfaces/ButtonProps.md +2 -2
  115. package/docs/api/interfaces/CalendarProps.md +1 -1
  116. package/docs/api/interfaces/CardProps.md +29 -3
  117. package/docs/api/interfaces/ColorPalette.md +1 -1
  118. package/docs/api/interfaces/ColorShade.md +1 -1
  119. package/docs/api/interfaces/DataAccessRecord.md +1 -1
  120. package/docs/api/interfaces/DataRecord.md +1 -1
  121. package/docs/api/interfaces/DataTableAction.md +2 -2
  122. package/docs/api/interfaces/DataTableColumn.md +6 -6
  123. package/docs/api/interfaces/DataTableProps.md +1 -1
  124. package/docs/api/interfaces/DataTableToolbarButton.md +2 -2
  125. package/docs/api/interfaces/EmptyStateConfig.md +1 -1
  126. package/docs/api/interfaces/EnhancedNavigationMenuProps.md +1 -1
  127. package/docs/api/interfaces/EventAppRoleData.md +1 -1
  128. package/docs/api/interfaces/ExportColumn.md +5 -5
  129. package/docs/api/interfaces/ExportOptions.md +4 -4
  130. package/docs/api/interfaces/FileDisplayProps.md +1 -1
  131. package/docs/api/interfaces/FileMetadata.md +13 -13
  132. package/docs/api/interfaces/FileReference.md +12 -12
  133. package/docs/api/interfaces/FileSizeLimits.md +1 -1
  134. package/docs/api/interfaces/FileUploadOptions.md +10 -10
  135. package/docs/api/interfaces/FileUploadProps.md +19 -19
  136. package/docs/api/interfaces/FooterProps.md +1 -1
  137. package/docs/api/interfaces/FormFieldProps.md +166 -0
  138. package/docs/api/interfaces/FormProps.md +113 -0
  139. package/docs/api/interfaces/GrantEventAppRoleParams.md +1 -1
  140. package/docs/api/interfaces/InactivityWarningModalProps.md +8 -8
  141. package/docs/api/interfaces/InputProps.md +2 -2
  142. package/docs/api/interfaces/LabelProps.md +8 -8
  143. package/docs/api/interfaces/LoginFormProps.md +1 -1
  144. package/docs/api/interfaces/NavigationAccessRecord.md +1 -1
  145. package/docs/api/interfaces/NavigationContextType.md +1 -1
  146. package/docs/api/interfaces/NavigationGuardProps.md +1 -1
  147. package/docs/api/interfaces/NavigationItem.md +17 -73
  148. package/docs/api/interfaces/NavigationMenuProps.md +38 -53
  149. package/docs/api/interfaces/NavigationProviderProps.md +1 -1
  150. package/docs/api/interfaces/Organisation.md +13 -13
  151. package/docs/api/interfaces/OrganisationContextType.md +21 -21
  152. package/docs/api/interfaces/OrganisationMembership.md +15 -15
  153. package/docs/api/interfaces/OrganisationProviderProps.md +59 -2
  154. package/docs/api/interfaces/OrganisationSecurityError.md +5 -5
  155. package/docs/api/interfaces/PaceAppLayoutProps.md +26 -39
  156. package/docs/api/interfaces/PaceLoginPageProps.md +1 -1
  157. package/docs/api/interfaces/PageAccessRecord.md +1 -1
  158. package/docs/api/interfaces/PagePermissionContextType.md +1 -1
  159. package/docs/api/interfaces/PagePermissionGuardProps.md +1 -1
  160. package/docs/api/interfaces/PagePermissionProviderProps.md +1 -1
  161. package/docs/api/interfaces/PaletteData.md +1 -1
  162. package/docs/api/interfaces/PermissionEnforcerProps.md +1 -1
  163. package/docs/api/interfaces/ProgressProps.md +50 -0
  164. package/docs/api/interfaces/ProtectedRouteProps.md +1 -1
  165. package/docs/api/interfaces/PublicPageFooterProps.md +9 -9
  166. package/docs/api/interfaces/PublicPageHeaderProps.md +10 -10
  167. package/docs/api/interfaces/PublicPageLayoutProps.md +15 -15
  168. package/docs/api/interfaces/RBACAccessValidateParams.md +52 -0
  169. package/docs/api/interfaces/RBACAccessValidateResult.md +41 -0
  170. package/docs/api/interfaces/RBACAuditLogParams.md +85 -0
  171. package/docs/api/interfaces/RBACAuditLogResult.md +52 -0
  172. package/docs/api/interfaces/RBACConfig.md +2 -2
  173. package/docs/api/interfaces/RBACContext.md +52 -0
  174. package/docs/api/interfaces/RBACLogger.md +1 -1
  175. package/docs/api/interfaces/RBACPageAccessCheckParams.md +74 -0
  176. package/docs/api/interfaces/RBACPermissionCheckParams.md +74 -0
  177. package/docs/api/interfaces/RBACPermissionCheckResult.md +52 -0
  178. package/docs/api/interfaces/RBACPermissionsGetParams.md +63 -0
  179. package/docs/api/interfaces/RBACPermissionsGetResult.md +63 -0
  180. package/docs/api/interfaces/RBACResult.md +58 -0
  181. package/docs/api/interfaces/RBACRoleGrantParams.md +63 -0
  182. package/docs/api/interfaces/RBACRoleGrantResult.md +52 -0
  183. package/docs/api/interfaces/RBACRoleRevokeParams.md +63 -0
  184. package/docs/api/interfaces/RBACRoleRevokeResult.md +52 -0
  185. package/docs/api/interfaces/RBACRoleValidateParams.md +52 -0
  186. package/docs/api/interfaces/RBACRoleValidateResult.md +63 -0
  187. package/docs/api/interfaces/RBACRolesListParams.md +52 -0
  188. package/docs/api/interfaces/RBACRolesListResult.md +74 -0
  189. package/docs/api/interfaces/RBACSessionTrackParams.md +74 -0
  190. package/docs/api/interfaces/RBACSessionTrackResult.md +52 -0
  191. package/docs/api/interfaces/ResourcePermissions.md +1 -1
  192. package/docs/api/interfaces/RevokeEventAppRoleParams.md +1 -1
  193. package/docs/api/interfaces/RoleBasedRouterContextType.md +1 -1
  194. package/docs/api/interfaces/RoleBasedRouterProps.md +1 -1
  195. package/docs/api/interfaces/RoleManagementResult.md +1 -1
  196. package/docs/api/interfaces/RouteAccessRecord.md +1 -1
  197. package/docs/api/interfaces/RouteConfig.md +1 -1
  198. package/docs/api/interfaces/SecureDataContextType.md +1 -1
  199. package/docs/api/interfaces/SecureDataProviderProps.md +1 -1
  200. package/docs/api/interfaces/SessionRestorationLoaderProps.md +15 -2
  201. package/docs/api/interfaces/StorageConfig.md +1 -1
  202. package/docs/api/interfaces/StorageFileInfo.md +1 -1
  203. package/docs/api/interfaces/StorageFileMetadata.md +1 -1
  204. package/docs/api/interfaces/StorageListOptions.md +1 -1
  205. package/docs/api/interfaces/StorageListResult.md +1 -1
  206. package/docs/api/interfaces/StorageUploadOptions.md +1 -1
  207. package/docs/api/interfaces/StorageUploadResult.md +1 -1
  208. package/docs/api/interfaces/StorageUrlOptions.md +1 -1
  209. package/docs/api/interfaces/StyleImport.md +1 -1
  210. package/docs/api/interfaces/SwitchProps.md +1 -1
  211. package/docs/api/interfaces/TabsContentProps.md +1 -1
  212. package/docs/api/interfaces/TabsListProps.md +1 -1
  213. package/docs/api/interfaces/TabsProps.md +1 -1
  214. package/docs/api/interfaces/TabsTriggerProps.md +43 -2
  215. package/docs/api/interfaces/TextareaProps.md +2 -2
  216. package/docs/api/interfaces/ToastActionElement.md +1 -1
  217. package/docs/api/interfaces/ToastProps.md +1 -1
  218. package/docs/api/interfaces/UnifiedAuthContextType.md +61 -61
  219. package/docs/api/interfaces/UnifiedAuthProviderProps.md +13 -13
  220. package/docs/api/interfaces/UseInactivityTrackerOptions.md +1 -1
  221. package/docs/api/interfaces/UseInactivityTrackerReturn.md +1 -1
  222. package/docs/api/interfaces/UsePublicEventLogoOptions.md +87 -0
  223. package/docs/api/interfaces/UsePublicEventLogoReturn.md +81 -0
  224. package/docs/api/interfaces/UsePublicEventOptions.md +3 -3
  225. package/docs/api/interfaces/UsePublicEventReturn.md +5 -5
  226. package/docs/api/interfaces/UsePublicFileDisplayOptions.md +2 -2
  227. package/docs/api/interfaces/UsePublicFileDisplayReturn.md +1 -1
  228. package/docs/api/interfaces/UsePublicRouteParamsReturn.md +1 -1
  229. package/docs/api/interfaces/UseResolvedScopeOptions.md +2 -2
  230. package/docs/api/interfaces/UseResolvedScopeReturn.md +1 -1
  231. package/docs/api/interfaces/UseResourcePermissionsOptions.md +1 -1
  232. package/docs/api/interfaces/UserEventAccess.md +1 -1
  233. package/docs/api/interfaces/UserMenuProps.md +4 -4
  234. package/docs/api/interfaces/UserProfile.md +7 -7
  235. package/docs/api/modules.md +484 -462
  236. package/docs/api-reference/components.md +186 -15
  237. package/docs/api-reference/deprecated.md +376 -0
  238. package/docs/api-reference/hooks.md +149 -19
  239. package/docs/api-reference/providers.md +61 -6
  240. package/docs/api-reference/rpc-functions.md +397 -0
  241. package/docs/api-reference/types.md +135 -78
  242. package/docs/api-reference/utilities.md +51 -380
  243. package/docs/architecture/README.md +49 -3
  244. package/docs/architecture/database-schema-requirements.md +40 -3
  245. package/docs/architecture/rbac-security-architecture.md +41 -4
  246. package/docs/architecture/services.md +127 -42
  247. package/docs/best-practices/README.md +51 -5
  248. package/docs/best-practices/accessibility.md +32 -3
  249. package/docs/best-practices/common-patterns.md +50 -3
  250. package/docs/best-practices/deployment.md +50 -4
  251. package/docs/best-practices/performance.md +50 -3
  252. package/docs/best-practices/security.md +94 -41
  253. package/docs/best-practices/testing.md +33 -4
  254. package/docs/core-concepts/authentication.md +5 -5
  255. package/docs/core-concepts/events.md +3 -3
  256. package/docs/core-concepts/organisations.md +3 -3
  257. package/docs/core-concepts/permissions.md +3 -3
  258. package/docs/core-concepts/rbac-system.md +5 -5
  259. package/docs/documentation-index.md +30 -8
  260. package/docs/getting-started/documentation-index.md +1 -1
  261. package/docs/getting-started/examples/README.md +7 -5
  262. package/docs/getting-started/examples/basic-auth-app.md +3 -0
  263. package/docs/getting-started/examples/full-featured-app.md +5 -3
  264. package/docs/getting-started/faq.md +6 -6
  265. package/docs/getting-started/installation-guide.md +192 -13
  266. package/docs/getting-started/local-development.md +303 -0
  267. package/docs/getting-started/quick-reference.md +3 -3
  268. package/docs/getting-started/quick-start.md +517 -0
  269. package/docs/implementation-guides/app-layout.md +45 -3
  270. package/docs/implementation-guides/authentication.md +66 -7
  271. package/docs/implementation-guides/component-styling.md +53 -3
  272. package/docs/implementation-guides/data-tables.md +76 -7
  273. package/docs/implementation-guides/datatable-filtering.md +1 -2
  274. package/docs/implementation-guides/datatable-rbac-usage.md +0 -1
  275. package/docs/implementation-guides/dynamic-colors.md +155 -4
  276. package/docs/implementation-guides/file-reference-system.md +72 -3
  277. package/docs/implementation-guides/file-upload-storage.md +72 -3
  278. package/docs/implementation-guides/forms.md +53 -3
  279. package/docs/implementation-guides/inactivity-tracking.md +53 -3
  280. package/docs/implementation-guides/large-datasets.md +1 -1
  281. package/docs/implementation-guides/navigation.md +55 -5
  282. package/docs/implementation-guides/organisation-security.md +72 -3
  283. package/docs/implementation-guides/performance.md +57 -1
  284. package/docs/implementation-guides/permission-enforcement.md +81 -8
  285. package/docs/implementation-guides/public-pages.md +560 -14
  286. package/docs/migration/MIGRATION_GUIDE.md +409 -50
  287. package/docs/migration/README.md +37 -3
  288. package/docs/migration/organisation-context-timing-fix.md +39 -4
  289. package/docs/migration/quick-migration-guide.md +41 -5
  290. package/docs/migration/rbac-migration.md +59 -3
  291. package/docs/migration/service-architecture.md +77 -14
  292. package/docs/rbac/README.md +79 -3
  293. package/docs/rbac/advanced-patterns.md +47 -3
  294. package/docs/rbac/api-reference.md +77 -8
  295. package/docs/rbac/event-based-apps.md +50 -5
  296. package/docs/rbac/examples/rbac-rls-integration-example.md +3 -3
  297. package/docs/rbac/examples.md +39 -3
  298. package/docs/rbac/getting-started.md +63 -4
  299. package/docs/rbac/quick-start.md +57 -5
  300. package/docs/rbac/rbac-rls-integration.md +68 -6
  301. package/docs/rbac/super-admin-guide.md +47 -3
  302. package/docs/rbac/troubleshooting.md +3 -3
  303. package/docs/security/README.md +68 -3
  304. package/docs/security/checklist.md +50 -3
  305. package/docs/standards/01-architecture-standard.md +39 -0
  306. package/docs/standards/02-api-and-rpc-standard.md +39 -0
  307. package/docs/standards/03-component-standard.md +32 -0
  308. package/docs/standards/04-code-style-standard.md +32 -0
  309. package/docs/standards/05-security-standard.md +30 -0
  310. package/docs/standards/06-testing-and-docs-standard.md +29 -0
  311. package/docs/standards/README.md +35 -0
  312. package/docs/styles/README.md +89 -8
  313. package/docs/testing/README.md +175 -24
  314. package/docs/troubleshooting/README.md +50 -3
  315. package/docs/troubleshooting/common-issues.md +271 -5
  316. package/docs/troubleshooting/debugging.md +54 -1
  317. package/docs/troubleshooting/migration.md +54 -1
  318. package/docs/troubleshooting/organisation-context-setup.md +29 -3
  319. package/docs/troubleshooting/styling-issues.md +246 -4
  320. package/{src/components/DataTable/examples → examples/DataTable}/GroupingAggregationExample.tsx +1 -1
  321. package/examples/{components 2/DataTable/HierarchicalActionsExample.tsx → DataTable/HierarchicalActionsExample.tsx} +7 -6
  322. package/{src/components/DataTable/examples → examples/DataTable}/HierarchicalExample.tsx +8 -6
  323. package/examples/{components 2/DataTable/PerformanceExample.tsx → DataTable/PerformanceExample.tsx} +2 -2
  324. package/examples/{components 2/DataTable/index.ts → DataTable/index.ts} +1 -0
  325. package/{src/components/Dialog/examples → examples/Dialog}/HtmlDialogExample.tsx +3 -3
  326. package/examples/{components 2/Dialog/ScrollableDialogExample.tsx → Dialog/ScrollableDialogExample.tsx} +1 -1
  327. package/{src/components/Dialog/examples → examples/Dialog}/SmartDialogExample.tsx +1 -1
  328. package/examples/{components 2/Dialog/index.ts → Dialog/index.ts} +0 -3
  329. package/examples/{features/public-pages → PublicPages}/CorrectPublicPageImplementation.tsx +52 -17
  330. package/examples/{features/public-pages → PublicPages}/PublicEventPage.tsx +65 -35
  331. package/examples/{features/public-pages → PublicPages}/PublicPageApp.tsx +52 -18
  332. package/examples/{features/public-pages → PublicPages}/PublicPageUsageExample.tsx +28 -15
  333. package/examples/README.md +81 -33
  334. package/examples/index.ts +14 -12
  335. package/examples/{RBAC → rbac}/CompleteRBACExample.tsx +1 -1
  336. package/examples/{features/rbac → rbac}/EventBasedApp.tsx +4 -4
  337. package/examples/{features/rbac → rbac}/PermissionExample.tsx +5 -3
  338. package/package.json +21 -27
  339. package/src/__tests__/helpers/test-utils.tsx +29 -3
  340. package/src/__tests__/rbac/PagePermissionGuard.test.tsx +7 -5
  341. package/src/components/Alert/Alert.test.tsx +2 -2
  342. package/src/components/Alert/Alert.tsx +4 -4
  343. package/src/components/Avatar/Avatar.test.tsx +17 -6
  344. package/src/components/Badge/Badge.test.tsx +1 -1
  345. package/src/components/Badge/Badge.tsx +2 -2
  346. package/src/components/Button/Button.test.tsx +2 -2
  347. package/src/components/Button/Button.tsx +11 -7
  348. package/src/components/Calendar/Calendar.test.tsx +41 -8
  349. package/src/components/Calendar/Calendar.tsx +39 -36
  350. package/src/components/Card/Card.tsx +51 -13
  351. package/src/components/Checkbox/Checkbox.test.tsx +36 -12
  352. package/src/components/DataTable/DataTable.test.tsx +1 -1
  353. package/src/components/DataTable/__tests__/DataTable.comprehensive.test.tsx +13 -7
  354. package/src/components/DataTable/__tests__/DataTable.default-state.test.tsx +14 -42
  355. package/src/components/DataTable/__tests__/DataTable.export.test.tsx +13 -10
  356. package/src/components/DataTable/__tests__/DataTable.grouping-aggregation.test.tsx +14 -11
  357. package/src/components/DataTable/__tests__/DataTable.hooks.test.tsx +4 -2
  358. package/src/components/DataTable/__tests__/DataTable.test.tsx +13 -7
  359. package/src/components/DataTable/__tests__/DataTableCore.test-setup.ts +13 -10
  360. package/src/components/DataTable/__tests__/DataTableCore.test.tsx +15 -11
  361. package/src/components/DataTable/__tests__/a11y.basic.test.tsx +12 -6
  362. package/src/components/DataTable/__tests__/keyboard.test.tsx +12 -6
  363. package/src/components/DataTable/__tests__/pagination.modes.test.tsx +10 -6
  364. package/src/components/DataTable/__tests__/test-utils/sharedTestUtils.tsx +1 -1
  365. package/src/components/DataTable/components/DataTableBody.tsx +10 -25
  366. package/src/components/DataTable/components/DataTableCore.tsx +1 -1
  367. package/src/components/DataTable/components/FilterRow.tsx +3 -1
  368. package/src/components/DataTable/components/ImportModal.tsx +1 -1
  369. package/src/components/DataTable/components/VirtualizedDataTable.tsx +9 -9
  370. package/src/components/DataTable/core/ColumnFactory.ts +6 -6
  371. package/src/components/DataTable/core/DataTableContext.tsx +14 -10
  372. package/src/components/DataTable/core/LocalDataAdapter.ts +2 -1
  373. package/src/components/DataTable/core/PluginRegistry.ts +3 -3
  374. package/src/components/DataTable/core/StateManager.ts +12 -11
  375. package/src/components/DataTable/core/__tests__/ActionManager.test.ts +104 -0
  376. package/src/components/DataTable/core/__tests__/DataManager.test.ts +101 -0
  377. package/src/components/DataTable/core/__tests__/LocalDataAdapter.test.ts +84 -0
  378. package/src/components/DataTable/core/__tests__/PluginRegistry.test.ts +102 -0
  379. package/src/components/DataTable/core/__tests__/StateManager.test.ts +104 -0
  380. package/src/components/DataTable/core/interfaces.ts +17 -17
  381. package/src/components/DataTable/hooks/__tests__/useDataTableConfiguration.test.ts +124 -0
  382. package/src/components/DataTable/hooks/__tests__/useDataTableDataPipeline.test.ts +117 -0
  383. package/src/components/DataTable/hooks/__tests__/useDataTablePermissions.test.ts +102 -0
  384. package/src/components/DataTable/hooks/__tests__/useEffectiveColumnOrder.test.ts +53 -0
  385. package/src/components/DataTable/hooks/useColumnOrderPersistence.ts +0 -2
  386. package/src/components/DataTable/hooks/useDataTablePermissions.ts +9 -8
  387. package/src/components/DataTable/types.ts +5 -5
  388. package/src/components/DataTable/utils/aggregationUtils.ts +4 -4
  389. package/src/components/DataTable/utils/columnUtils.ts +3 -2
  390. package/src/components/DataTable/utils/debugTools.ts +1 -1
  391. package/src/components/DataTable/utils/exportUtils.ts +6 -6
  392. package/src/components/DataTable/utils/hierarchicalSorting.ts +6 -6
  393. package/src/components/DataTable/utils/hierarchicalUtils.ts +0 -8
  394. package/src/components/DataTable/utils/index.ts +0 -1
  395. package/src/components/DataTable/utils/performanceUtils.ts +9 -4
  396. package/src/components/Dialog/Dialog.test.tsx +49 -27
  397. package/src/components/ErrorBoundary/ErrorBoundary.test.tsx +13 -8
  398. package/src/components/EventSelector/EventSelector.test.tsx +60 -12
  399. package/src/components/EventSelector/EventSelector.tsx +38 -15
  400. package/src/components/EventSelector/index.ts +2 -2
  401. package/src/components/FileDisplay/FileDisplay.test.tsx +143 -85
  402. package/src/components/FileDisplay/FileDisplay.tsx +1 -0
  403. package/src/components/FileUpload/FileUpload.test.tsx +532 -152
  404. package/src/components/FileUpload/FileUpload.tsx +43 -8
  405. package/src/components/Footer/Footer.test.tsx +19 -14
  406. package/src/components/Form/Form.test.tsx +96 -14
  407. package/src/components/Form/Form.tsx +210 -1
  408. package/src/components/Form/index.ts +3 -7
  409. package/src/components/Header/Header.test.tsx +24 -17
  410. package/src/components/Header/Header.tsx +3 -1
  411. package/src/components/InactivityWarningModal/InactivityWarningModal.tsx +2 -4
  412. package/src/components/Input/Input.test.tsx +61 -36
  413. package/src/components/Label/{__tests__/Label.test.tsx → Label.test.tsx} +2 -2
  414. package/src/components/Label/Label.tsx +2 -3
  415. package/src/components/LoadingSpinner/LoadingSpinner.test.tsx +6 -5
  416. package/src/components/LoadingSpinner/LoadingSpinner.tsx +6 -2
  417. package/src/components/LoginForm/LoginForm.test.tsx +14 -13
  418. package/src/components/LoginForm/LoginForm.tsx +1 -1
  419. package/src/components/LoginForm/index.ts +7 -0
  420. package/src/components/NavigationMenu/NavigationMenu.test.tsx +233 -20
  421. package/src/components/NavigationMenu/NavigationMenu.tsx +191 -55
  422. package/src/components/NavigationMenu/index.ts +1 -1
  423. package/src/components/OrganisationSelector/OrganisationSelector.test.tsx +20 -11
  424. package/src/components/OrganisationSelector/OrganisationSelector.tsx +1 -1
  425. package/src/components/PaceAppLayout/{__tests__/PaceAppLayout.integration.test.tsx → PaceAppLayout.integration.test.tsx} +272 -79
  426. package/src/components/PaceAppLayout/{__tests__/PaceAppLayout.performance.test.tsx → PaceAppLayout.performance.test.tsx} +155 -32
  427. package/src/components/PaceAppLayout/{__tests__/PaceAppLayout.security.test.tsx → PaceAppLayout.security.test.tsx} +211 -65
  428. package/src/components/PaceAppLayout/PaceAppLayout.test.tsx +498 -210
  429. package/src/components/PaceAppLayout/PaceAppLayout.tsx +63 -64
  430. package/src/components/PaceAppLayout/test-setup.tsx +192 -0
  431. package/src/components/PaceLoginPage/PaceLoginPage.test.tsx +193 -39
  432. package/src/components/{PasswordReset → PasswordChange}/PasswordChangeForm.test.tsx +2 -2
  433. package/src/components/{PasswordReset → PasswordChange}/PasswordChangeForm.tsx +10 -4
  434. package/src/components/PasswordChange/index.ts +2 -0
  435. package/src/components/Progress/Progress.test.tsx +11 -0
  436. package/src/components/Progress/Progress.tsx +1 -1
  437. package/src/components/Progress/index.ts +10 -0
  438. package/src/components/ProtectedRoute/ProtectedRoute.test.tsx +2 -1
  439. package/src/components/PublicLayout/PublicLayout.test.tsx +1210 -0
  440. package/src/components/PublicLayout/PublicPageLayout.tsx +190 -36
  441. package/src/components/PublicLayout/PublicPageProvider.tsx +8 -7
  442. package/src/components/PublicLayout/index.ts +10 -28
  443. package/src/components/Select/Select.test.tsx +7 -7
  444. package/src/components/Select/Select.tsx +277 -11
  445. package/src/components/Select/index.ts +1 -2
  446. package/src/components/SessionRestorationLoader/SessionRestorationLoader.test.tsx +232 -0
  447. package/src/components/SessionRestorationLoader/SessionRestorationLoader.tsx +40 -19
  448. package/src/components/Table/{__tests__/Table.test.tsx → Table.test.tsx} +94 -41
  449. package/src/components/Tabs/Tabs.test.tsx +10 -9
  450. package/src/components/Tabs/Tabs.tsx +61 -33
  451. package/src/components/Textarea/Textarea.test.tsx +31 -18
  452. package/src/components/Toast/Toast.tsx +2 -2
  453. package/src/components/Tooltip/Tooltip.test.tsx +1 -1
  454. package/src/components/UserMenu/UserMenu.test.tsx +7 -6
  455. package/src/components/UserMenu/UserMenu.tsx +2 -2
  456. package/src/components/index.ts +5 -4
  457. package/src/constants/performance.ts +19 -8
  458. package/src/hooks/__tests__/useAppConfig.unit.test.ts +21 -22
  459. package/src/hooks/__tests__/useEvents.unit.test.ts +5 -4
  460. package/src/hooks/__tests__/useOrganisationPermissions.unit.test.tsx +2 -2
  461. package/src/hooks/__tests__/usePermissionCache.simple.test.ts +17 -0
  462. package/src/hooks/__tests__/usePermissionCache.unit.test.ts +16 -11
  463. package/src/hooks/__tests__/usePublicEvent.simple.test.ts +1 -3
  464. package/src/hooks/__tests__/usePublicEvent.unit.test.ts +1 -3
  465. package/src/hooks/__tests__/useRBAC.unit.test.ts +24 -2
  466. package/src/hooks/index.ts +4 -0
  467. package/src/hooks/public/index.ts +2 -0
  468. package/src/hooks/public/usePublicEvent.ts +4 -6
  469. package/src/hooks/public/usePublicEventLogo.test.ts +147 -0
  470. package/src/hooks/public/usePublicRouteParams.ts +1 -1
  471. package/src/hooks/services/useAuth.ts +2 -4
  472. package/src/hooks/services/useCurrentEvent.ts +1 -1
  473. package/src/hooks/useAppConfig.ts +1 -1
  474. package/src/hooks/useDataTablePerformance.ts +2 -2
  475. package/src/hooks/useEventTheme.ts +1 -1
  476. package/src/hooks/useEvents.ts +51 -10
  477. package/src/hooks/useOrganisationPermissions.test.ts +3 -3
  478. package/src/hooks/useOrganisationPermissions.ts +1 -1
  479. package/src/hooks/useOrganisationSecurity.ts +2 -2
  480. package/src/hooks/usePermissionCache.test.ts +9 -9
  481. package/src/hooks/usePermissionCache.ts +2 -2
  482. package/src/index.ts +19 -12
  483. package/src/providers/OrganisationProvider.tsx +73 -9
  484. package/src/providers/UnifiedAuthProvider.smoke.test.tsx +113 -13
  485. package/src/providers/__tests__/AuthProvider.test.tsx +2 -1
  486. package/src/providers/__tests__/EventProvider.test.tsx +24 -15
  487. package/src/providers/__tests__/OrganisationProvider.test.tsx +87 -36
  488. package/src/providers/__tests__/UnifiedAuthProvider.test.tsx +80 -24
  489. package/src/providers/index.ts +0 -3
  490. package/src/providers/services/AuthServiceProvider.tsx +2 -17
  491. package/src/providers/services/EventServiceProvider.tsx +11 -16
  492. package/src/providers/services/InactivityServiceProvider.tsx +9 -12
  493. package/src/providers/services/OrganisationServiceProvider.tsx +9 -12
  494. package/src/providers/services/UnifiedAuthProvider.tsx +85 -18
  495. package/src/providers/services/__tests__/AuthServiceProvider.integration.test.tsx +11 -4
  496. package/src/rbac/__tests__/scenarios.user-role.test.tsx +105 -21
  497. package/src/rbac/adapters.tsx +1 -1
  498. package/src/rbac/api.ts +20 -4
  499. package/src/rbac/audit-enhanced.ts +47 -2
  500. package/src/rbac/audit.ts +47 -2
  501. package/src/rbac/components/NavigationGuard.tsx +1 -1
  502. package/src/rbac/components/NavigationProvider.test.tsx +7 -6
  503. package/src/rbac/components/NavigationProvider.tsx +1 -1
  504. package/src/rbac/components/PagePermissionGuard.tsx +1 -1
  505. package/src/rbac/components/PagePermissionProvider.test.tsx +7 -6
  506. package/src/rbac/components/PagePermissionProvider.tsx +1 -1
  507. package/src/rbac/components/PermissionEnforcer.tsx +1 -1
  508. package/src/rbac/components/RoleBasedRouter.tsx +1 -1
  509. package/src/rbac/components/SecureDataProvider.test.tsx +7 -6
  510. package/src/rbac/components/SecureDataProvider.tsx +1 -1
  511. package/src/rbac/components/__tests__/EnhancedNavigationMenu.test.tsx +6 -6
  512. package/src/rbac/components/__tests__/NavigationGuard.test.tsx +11 -10
  513. package/src/rbac/components/__tests__/NavigationProvider.test.tsx +10 -11
  514. package/src/rbac/components/__tests__/PagePermissionGuard.race-condition.test.tsx +19 -15
  515. package/src/rbac/components/__tests__/PagePermissionGuard.test.tsx +13 -12
  516. package/src/rbac/components/__tests__/PagePermissionGuard.verification.test.tsx +19 -15
  517. package/src/rbac/components/__tests__/PagePermissionProvider.test.tsx +18 -18
  518. package/src/rbac/components/__tests__/PermissionEnforcer.test.tsx +11 -10
  519. package/src/rbac/components/__tests__/RoleBasedRouter.test.tsx +8 -7
  520. package/src/rbac/components/__tests__/SecureDataProvider.fixed.test.tsx +10 -11
  521. package/src/rbac/components/__tests__/SecureDataProvider.test.tsx +48 -19
  522. package/src/rbac/hooks/__tests__/useSecureSupabase.test.ts +476 -0
  523. package/src/rbac/hooks/index.ts +3 -0
  524. package/src/rbac/hooks/usePermissions.ts +31 -85
  525. package/src/rbac/hooks/useRBAC.test.ts +13 -1
  526. package/src/rbac/hooks/useRBAC.ts +13 -67
  527. package/src/rbac/hooks/useResolvedScope.ts +11 -0
  528. package/src/rbac/hooks/useSecureSupabase.ts +308 -0
  529. package/src/rbac/index.ts +3 -0
  530. package/src/rbac/secureClient.ts +53 -6
  531. package/src/rbac/security.ts +37 -1
  532. package/src/{types/rbac-functions.ts → rbac/types/functions.ts} +30 -30
  533. package/src/rbac/types.ts +3 -2
  534. package/src/services/AuthService.ts +33 -25
  535. package/src/services/EventService.ts +56 -44
  536. package/src/services/InactivityService.ts +33 -53
  537. package/src/services/OrganisationService.ts +36 -40
  538. package/src/services/__tests__/AuthService.restoreSession.test.ts +6 -2
  539. package/src/services/__tests__/EventService.test.ts +67 -33
  540. package/src/services/interfaces/IEventService.ts +1 -1
  541. package/src/styles/core.css +2 -2
  542. package/src/styles/index.test.ts +21 -0
  543. package/src/styles/index.ts +1 -5
  544. package/src/types/__tests__/guards.test.ts +1 -1
  545. package/src/types/__tests__/organisation.roles.test.ts +55 -0
  546. package/src/types/__tests__/type-validation.test.ts +0 -1
  547. package/src/types/auth.ts +42 -2
  548. package/src/types/core.ts +251 -0
  549. package/src/types/database.ts +11 -496
  550. package/src/types/event.ts +102 -0
  551. package/src/types/file-reference.ts +6 -4
  552. package/src/types/guards.ts +2 -1
  553. package/src/types/index.ts +48 -14
  554. package/src/types/lodash.debounce.d.ts +15 -0
  555. package/src/types/organisation.ts +14 -10
  556. package/src/types/supabase.ts +15 -17
  557. package/src/utils/__tests__/secureErrors.unit.test.ts +1 -1
  558. package/src/utils/__tests__/validationUtils.unit.test.ts +0 -29
  559. package/src/utils/app/appNameResolver.ts +1 -1
  560. package/src/utils/audit/audit.test.ts +65 -0
  561. package/src/utils/device/deviceFingerprint.test.ts +171 -0
  562. package/src/utils/dynamic/dynamicUtils.ts +3 -2
  563. package/src/utils/file-reference/index.ts +25 -6
  564. package/src/utils/security/secureErrors.ts +1 -1
  565. package/src/utils/validation/__tests__/validationUtils.test.ts +72 -0
  566. package/src/utils/validation/index.ts +6 -12
  567. package/src/utils/validation/validationUtils.ts +0 -13
  568. package/dist/UnifiedAuthProvider-B37ATQHE.js +0 -16
  569. package/dist/auth-DReDSLq9.d.ts +0 -16
  570. package/dist/chunk-3JI76CYK.js +0 -2444
  571. package/dist/chunk-3JI76CYK.js.map +0 -1
  572. package/dist/chunk-56XJ3TU6.js +0 -11
  573. package/dist/chunk-56XJ3TU6.js.map +0 -1
  574. package/dist/chunk-5MT24GKJ.js.map +0 -1
  575. package/dist/chunk-7QCC6MCP.js +0 -288
  576. package/dist/chunk-BESYRHQM.js.map +0 -1
  577. package/dist/chunk-BJPBT3CU.js +0 -21
  578. package/dist/chunk-BJPBT3CU.js.map +0 -1
  579. package/dist/chunk-BVYWGZVV.js.map +0 -1
  580. package/dist/chunk-CX5M4ZAG.js.map +0 -1
  581. package/dist/chunk-D7LCGMVS.js.map +0 -1
  582. package/dist/chunk-EGI6MUL6.js +0 -27
  583. package/dist/chunk-EGI6MUL6.js.map +0 -1
  584. package/dist/chunk-ERISIBYU.js.map +0 -1
  585. package/dist/chunk-HRO5HWN2.js.map +0 -1
  586. package/dist/chunk-HZLDFOE4.js.map +0 -1
  587. package/dist/chunk-JISYG63F.js +0 -70
  588. package/dist/chunk-JISYG63F.js.map +0 -1
  589. package/dist/chunk-LIMSTKYD.js +0 -61
  590. package/dist/chunk-LIMSTKYD.js.map +0 -1
  591. package/dist/chunk-OWAG3GSU.js.map +0 -1
  592. package/dist/chunk-PPMP5J6T.js.map +0 -1
  593. package/dist/chunk-Q5QRDWKI.js.map +0 -1
  594. package/dist/chunk-S5OFRT4M.js.map +0 -1
  595. package/dist/chunk-SBVILCCA.js.map +0 -1
  596. package/dist/chunk-TUMEWN34.js +0 -15
  597. package/dist/chunk-TUMEWN34.js.map +0 -1
  598. package/dist/chunk-XDNLUEXI.js +0 -138
  599. package/dist/chunk-XJ2HZOBU.js.map +0 -1
  600. package/dist/chunk-ZYTYSTO5.js.map +0 -1
  601. package/dist/chunk-ZZ2SS7NI.js +0 -237
  602. package/dist/chunk-ZZ2SS7NI.js.map +0 -1
  603. package/dist/database-C6jy7EOu.d.ts +0 -500
  604. package/dist/organisation-D6qRDtbF.d.ts +0 -93
  605. package/dist/schema-DTDZQe2u.d.ts +0 -28
  606. package/dist/unified-DQ4VcT7H.d.ts +0 -198
  607. package/dist/useInactivityTracker-TO6ZOF35.js +0 -11
  608. package/dist/validation.d.ts +0 -47
  609. package/dist/validation.js +0 -24
  610. package/dist/validation.js.map +0 -1
  611. package/docs/DOCUMENTATION_AUDIT.md +0 -172
  612. package/docs/DOCUMENTATION_STANDARD.md +0 -137
  613. package/docs/api/classes/PublicErrorBoundary.md +0 -132
  614. package/docs/api/interfaces/EventLogoProps.md +0 -152
  615. package/docs/api/interfaces/PublicErrorBoundaryProps.md +0 -94
  616. package/docs/api/interfaces/PublicErrorBoundaryState.md +0 -68
  617. package/docs/api/interfaces/PublicLoadingSpinnerProps.md +0 -86
  618. package/docs/architecture/rpc-function-standards.md +0 -1106
  619. package/docs/getting-started/consuming-app-vite-config.md +0 -239
  620. package/docs/implementation-guides/event-theming-summary.md +0 -226
  621. package/docs/implementation-guides/public-pages-advanced.md +0 -1038
  622. package/docs/migration/v0.4.15-tailwind-scanning.md +0 -278
  623. package/docs/migration/v0.4.16-css-first-approach.md +0 -312
  624. package/docs/migration/v0.4.17-source-path-fix.md +0 -235
  625. package/docs/rbac/RBAC_EVENT_CONTEXT_LOADING.md +0 -222
  626. package/docs/rbac/RBAC_LOGIN_SAFETY_FIX.md +0 -95
  627. package/docs/rbac/RBAC_V0.5.147_FIX.md +0 -117
  628. package/docs/rbac/README-rbac-rls-integration.md +0 -374
  629. package/docs/styles/usage.md +0 -227
  630. package/docs/testing/visual-testing.md +0 -120
  631. package/docs/troubleshooting/DEBUG_NETWORK_ERROR.md +0 -152
  632. package/docs/troubleshooting/FIX_SUPABASE_CORS.md +0 -184
  633. package/docs/troubleshooting/cake-page-permission-guard-issue-summary.md +0 -193
  634. package/docs/troubleshooting/database-view-compatibility.md +0 -125
  635. package/docs/troubleshooting/react-hooks-issue-analysis.md +0 -172
  636. package/docs/troubleshooting/tailwind-content-scanning.md +0 -219
  637. package/examples/RBAC/EventBasedApp.tsx +0 -239
  638. package/examples/RBAC/PermissionExample.tsx +0 -151
  639. package/examples/STRUCTURE.md +0 -125
  640. package/examples/components 2/DataTable/HierarchicalExample.tsx +0 -475
  641. package/examples/components 2/Dialog/BasicHtmlTest.tsx +0 -55
  642. package/examples/components 2/Dialog/DebugHtmlExample.tsx +0 -68
  643. package/examples/components 2/Dialog/HtmlDialogExample.tsx +0 -202
  644. package/examples/components 2/Dialog/SimpleHtmlTest.tsx +0 -61
  645. package/examples/components 2/Dialog/SmartDialogExample.tsx +0 -322
  646. package/examples/components 2/index.ts +0 -11
  647. package/examples/features/index.ts +0 -12
  648. package/examples/features/rbac/CompleteRBACExample.tsx +0 -324
  649. package/examples/features/rbac/index.ts +0 -13
  650. package/examples/public-pages/CorrectPublicPageImplementation.tsx +0 -301
  651. package/examples/public-pages/PublicEventPage.tsx +0 -274
  652. package/examples/public-pages/PublicPageApp.tsx +0 -308
  653. package/examples/public-pages/PublicPageUsageExample.tsx +0 -216
  654. package/examples/public-pages/index.ts +0 -14
  655. package/src/__tests__/TEST_STANDARD.md +0 -1008
  656. package/src/components/Checkbox/__mocks__/Checkbox.tsx +0 -2
  657. package/src/components/DataTable/examples/HierarchicalActionsExample.tsx +0 -421
  658. package/src/components/DataTable/examples/InitialPageSizeExample.tsx +0 -177
  659. package/src/components/DataTable/examples/PerformanceExample.tsx +0 -506
  660. package/src/components/DataTable/examples/__tests__/HierarchicalActionsExample.test.tsx +0 -316
  661. package/src/components/DataTable/examples/__tests__/HierarchicalExample.test.tsx +0 -45
  662. package/src/components/DataTable/examples/__tests__/InitialPageSizeExample.test.tsx +0 -211
  663. package/src/components/DataTable/examples/__tests__/PerformanceExample.test.tsx +0 -126
  664. package/src/components/Dialog/README.md +0 -804
  665. package/src/components/Dialog/examples/BasicHtmlTest.tsx +0 -55
  666. package/src/components/Dialog/examples/DebugHtmlExample.tsx +0 -68
  667. package/src/components/Dialog/examples/ScrollableDialogExample.tsx +0 -290
  668. package/src/components/Dialog/examples/SimpleHtmlTest.tsx +0 -61
  669. package/src/components/Dialog/examples/__tests__/HtmlDialogExample.test.tsx +0 -71
  670. package/src/components/Dialog/examples/__tests__/SimpleHtmlTest.test.tsx +0 -122
  671. package/src/components/Dialog/examples/__tests__/SmartDialogExample.unit.test.tsx +0 -147
  672. package/src/components/Dialog/utils/__tests__/safeHtml.unit.test.ts +0 -611
  673. package/src/components/Dialog/utils/safeHtml.ts +0 -185
  674. package/src/components/EventSelector/types.ts +0 -79
  675. package/src/components/Form/FormErrorSummary.tsx +0 -113
  676. package/src/components/Form/FormField.tsx +0 -249
  677. package/src/components/Form/FormFieldset.tsx +0 -127
  678. package/src/components/Form/FormLiveRegion.tsx +0 -198
  679. package/src/components/Input/__mocks__/Input.tsx +0 -2
  680. package/src/components/NavigationMenu/types.ts +0 -85
  681. package/src/components/PaceAppLayout/__tests__/PaceAppLayout.accessibility.test.tsx +0 -326
  682. package/src/components/PaceAppLayout/__tests__/PaceAppLayout.unit.test.tsx +0 -1078
  683. package/src/components/PasswordReset/PasswordResetForm.test.tsx +0 -597
  684. package/src/components/PasswordReset/PasswordResetForm.tsx +0 -201
  685. package/src/components/PasswordReset/index.ts +0 -2
  686. package/src/components/ProtectedRoute/README.md +0 -164
  687. package/src/components/PublicLayout/EventLogo.tsx +0 -175
  688. package/src/components/PublicLayout/PublicErrorBoundary.tsx +0 -282
  689. package/src/components/PublicLayout/PublicLoadingSpinner.tsx +0 -216
  690. package/src/components/PublicLayout/PublicPageContextChecker.tsx +0 -131
  691. package/src/components/PublicLayout/PublicPageDebugger.tsx +0 -104
  692. package/src/components/PublicLayout/PublicPageDiagnostic.tsx +0 -162
  693. package/src/components/PublicLayout/PublicPageFooter.tsx +0 -124
  694. package/src/components/PublicLayout/PublicPageHeader.tsx +0 -209
  695. package/src/components/PublicLayout/__tests__/PublicErrorBoundary.test.tsx +0 -449
  696. package/src/components/PublicLayout/__tests__/PublicLoadingSpinner.test.tsx +0 -393
  697. package/src/components/PublicLayout/__tests__/PublicPageContextChecker.test.tsx +0 -192
  698. package/src/components/PublicLayout/__tests__/PublicPageFooter.test.tsx +0 -351
  699. package/src/components/PublicLayout/__tests__/PublicPageHeader.test.tsx +0 -402
  700. package/src/components/PublicLayout/__tests__/PublicPageLayout.test.tsx +0 -460
  701. package/src/components/PublicLayout/__tests__/PublicPageProvider.test.tsx +0 -313
  702. package/src/components/Select/hooks.ts +0 -289
  703. package/src/hooks/useCounter.test.ts +0 -131
  704. package/src/hooks/useDebounce.test.ts +0 -375
  705. package/src/providers/AuthProvider.tsx +0 -15
  706. package/src/providers/EventProvider.tsx +0 -16
  707. package/src/providers/InactivityProvider.tsx +0 -15
  708. package/src/providers/OrganisationProvider.context.test.tsx +0 -169
  709. package/src/providers/UnifiedAuthProvider.tsx +0 -15
  710. package/src/types/theme.ts +0 -6
  711. package/src/types/unified.ts +0 -265
  712. package/src/utils/appConfig.ts +0 -47
  713. package/src/utils/appIdResolver.test.ts +0 -499
  714. package/src/utils/appIdResolver.ts +0 -130
  715. package/src/utils/appNameResolver.simple.test.ts +0 -212
  716. package/src/utils/appNameResolver.test.ts +0 -121
  717. package/src/utils/appNameResolver.ts +0 -191
  718. package/src/utils/audit.ts +0 -127
  719. package/src/utils/auth-utils.ts +0 -96
  720. package/src/utils/bundleAnalysis.ts +0 -129
  721. package/src/utils/debugLogger.ts +0 -67
  722. package/src/utils/deviceFingerprint.ts +0 -215
  723. package/src/utils/dynamicUtils.ts +0 -105
  724. package/src/utils/file-reference.test.ts +0 -788
  725. package/src/utils/file-reference.ts +0 -519
  726. package/src/utils/formatDate.test.ts +0 -237
  727. package/src/utils/formatting.ts +0 -170
  728. package/src/utils/lazyLoad.tsx +0 -44
  729. package/src/utils/logger.ts +0 -179
  730. package/src/utils/organisationContext.test.ts +0 -322
  731. package/src/utils/organisationContext.ts +0 -153
  732. package/src/utils/performanceBenchmark.ts +0 -64
  733. package/src/utils/performanceBudgets.ts +0 -110
  734. package/src/utils/permissionTypes.ts +0 -37
  735. package/src/utils/permissionUtils.test.ts +0 -393
  736. package/src/utils/permissionUtils.ts +0 -34
  737. package/src/utils/sanitization.ts +0 -264
  738. package/src/utils/schemaUtils.ts +0 -37
  739. package/src/utils/secureDataAccess.test.ts +0 -711
  740. package/src/utils/secureDataAccess.ts +0 -377
  741. package/src/utils/secureErrors.ts +0 -79
  742. package/src/utils/security.ts +0 -156
  743. package/src/utils/securityMonitor.ts +0 -45
  744. package/src/utils/sessionTracking.ts +0 -126
  745. package/src/utils/validation.ts +0 -111
  746. package/src/utils/validationUtils.ts +0 -120
  747. package/src/validation/index.ts +0 -12
  748. /package/dist/{DataTable-UA6CL4JI.js.map → DataTable-QAB34V6K.js.map} +0 -0
  749. /package/dist/{UnifiedAuthProvider-B37ATQHE.js.map → UnifiedAuthProvider-7F6T4B6K.js.map} +0 -0
  750. /package/dist/{api-45XYYO2A.js.map → api-ROMBCNKU.js.map} +0 -0
  751. /package/dist/{audit-64X3VJXB.js.map → audit-WRS3KJKI.js.map} +0 -0
  752. /package/dist/{chunk-PLDDJCW6.js.map → chunk-7D4SUZUM.js.map} +0 -0
  753. /package/dist/{useInactivityTracker-TO6ZOF35.js.map → chunk-KQCRWDSA.js.map} +0 -0
  754. /package/examples/{components 2/DataTable → DataTable}/InitialPageSizeExample.tsx +0 -0
  755. /package/examples/{features/public-pages → PublicPages}/index.ts +0 -0
  756. /package/examples/{RBAC → rbac}/index.ts +0 -0
@@ -123,6 +123,8 @@ describe('useRBAC (unit)', () => {
123
123
  selectedEvent: null,
124
124
  eventLoading: false,
125
125
  });
126
+ mockResolveAppContext.mockResolvedValue({ appId: 'app-1' as any, hasAccess: true });
127
+ mockGetPermissionMap.mockResolvedValue({});
126
128
  mockGetRoleContext.mockResolvedValue({
127
129
  globalRole: null,
128
130
  organisationRole: null,
@@ -132,7 +134,15 @@ describe('useRBAC (unit)', () => {
132
134
 
133
135
  const { result } = renderHook(() => useRBAC());
134
136
 
135
- await waitFor(() => expect(result.current.isLoading).toBe(false));
137
+ await waitFor(() => {
138
+ expect(mockResolveAppContext).toHaveBeenCalled();
139
+ expect(mockGetAccessLevel).toHaveBeenCalled();
140
+ });
141
+
142
+ await waitFor(() => {
143
+ expect(result.current.isLoading).toBe(false);
144
+ expect(result.current.eventAppRole).toBe('planner');
145
+ });
136
146
 
137
147
  expect(result.current.eventAppRole).toBe('planner');
138
148
  });
@@ -175,6 +185,9 @@ describe('useRBAC (unit)', () => {
175
185
  selectedEvent: null,
176
186
  eventLoading: false,
177
187
  });
188
+ mockResolveAppContext.mockResolvedValue({ appId: 'app-1' as any, hasAccess: true });
189
+ mockGetPermissionMap.mockResolvedValue({});
190
+ mockGetAccessLevel.mockResolvedValue('viewer');
178
191
  mockGetRoleContext.mockResolvedValue({
179
192
  globalRole: null,
180
193
  organisationRole: 'org_admin',
@@ -183,8 +196,17 @@ describe('useRBAC (unit)', () => {
183
196
 
184
197
  const { result } = renderHook(() => useRBAC());
185
198
 
186
- await waitFor(() => expect(result.current.isLoading).toBe(false));
199
+ await waitFor(() => {
200
+ expect(mockResolveAppContext).toHaveBeenCalled();
201
+ expect(mockGetRoleContext).toHaveBeenCalled();
202
+ });
187
203
 
204
+ await waitFor(() => {
205
+ expect(result.current.isLoading).toBe(false);
206
+ expect(result.current.organisationRole).toBe('org_admin');
207
+ });
208
+
209
+ expect(result.current.organisationRole).toBe('org_admin');
188
210
  expect(result.current.hasGlobalPermission('org_admin')).toBe(true);
189
211
  expect(result.current.hasGlobalPermission('super_admin')).toBe(false);
190
212
  });
@@ -55,6 +55,10 @@ export type { UseDataTablePerformanceOptions, UseDataTablePerformanceReturn } fr
55
55
  export { useFileDisplay, clearFileDisplayCache, getFileDisplayCacheStats, invalidateFileDisplayCache } from './useFileDisplay';
56
56
  export type { UseFileDisplayReturn, UseFileDisplayOptions } from './useFileDisplay';
57
57
 
58
+ // === STORAGE HOOKS ===
59
+ export { useStorage, useFileUpload } from './useStorage';
60
+ export type { UseStorageOptions, UseStorageReturn } from './useStorage';
61
+
58
62
  // === PUBLIC DATA ACCESS HOOKS ===
59
63
  export * from './public';
60
64
 
@@ -19,6 +19,7 @@
19
19
  // === PUBLIC DATA ACCESS HOOKS ===
20
20
  export { usePublicEvent, clearPublicEventCache, getPublicEventCacheStats } from './usePublicEvent';
21
21
  export { usePublicFileDisplay, clearPublicFileDisplayCache, getPublicFileDisplayCacheStats } from './usePublicFileDisplay';
22
+ export { usePublicEventLogo, clearPublicLogoCache, getPublicLogoCacheStats } from './usePublicEventLogo';
22
23
 
23
24
  // === PUBLIC ROUTE HOOKS ===
24
25
  export {
@@ -31,4 +32,5 @@ export {
31
32
  // === PUBLIC TYPES ===
32
33
  export type { UsePublicEventReturn, UsePublicEventOptions } from './usePublicEvent';
33
34
  export type { UsePublicFileDisplayReturn, UsePublicFileDisplayOptions } from './usePublicFileDisplay';
35
+ export type { UsePublicEventLogoReturn, UsePublicEventLogoOptions } from './usePublicEventLogo';
34
36
  export type { UsePublicRouteParamsReturn } from './usePublicRouteParams';
@@ -61,8 +61,9 @@
61
61
 
62
62
  import { useState, useEffect, useCallback, useMemo } from 'react';
63
63
  import { createClient } from '@supabase/supabase-js';
64
- import type { Event } from '../../types/unified';
64
+ import type { Event } from '../../types/event';
65
65
  import type { Database } from '../../types/database';
66
+ import { assertOrganisationId } from '../../types/core';
66
67
  import { usePublicPageContext } from '../../components/PublicLayout/PublicPageProvider';
67
68
  import { logger } from '../../utils/core/logger';
68
69
 
@@ -352,13 +353,10 @@ export function usePublicEvent(
352
353
  event_participants: eventData.event_participants,
353
354
  event_logo: eventData.event_logo,
354
355
  event_colours: eventData.event_colours,
355
- organisation_id: eventData.organisation_id,
356
+ organisation_id: assertOrganisationId(eventData.organisation_id),
356
357
  is_visible: true,
357
358
  created_at: new Date().toISOString(),
358
- updated_at: new Date().toISOString(),
359
- // Legacy compatibility
360
- name: eventData.event_name,
361
- start_date: eventData.event_date
359
+ updated_at: new Date().toISOString()
362
360
  };
363
361
 
364
362
  setEvent(transformedEvent);
@@ -0,0 +1,147 @@
1
+ import { renderHook, waitFor, act } from '@testing-library/react';
2
+ import { describe, it, expect, vi, beforeEach, afterEach, afterAll } from 'vitest';
3
+ import {
4
+ usePublicEventLogo,
5
+ clearPublicLogoCache,
6
+ getPublicLogoCacheStats
7
+ } from './usePublicEventLogo';
8
+ import { createMockSupabaseClient } from '../../__tests__/helpers/supabaseMock';
9
+ import type { SupabaseClient } from '@supabase/supabase-js';
10
+ import type { Database } from '../../types/database';
11
+
12
+ vi.mock('../../utils/core/logger', () => {
13
+ const logger = {
14
+ debug: vi.fn(),
15
+ info: vi.fn(),
16
+ warn: vi.fn(),
17
+ error: vi.fn()
18
+ };
19
+ return {
20
+ createLogger: vi.fn(() => logger)
21
+ };
22
+ });
23
+
24
+ const VALID_ORG_ID = '123e4567-e89b-12d3-a456-426614174000';
25
+ const originalFetch = globalThis.fetch;
26
+
27
+ describe('usePublicEventLogo', () => {
28
+ let mockSupabase: SupabaseClient<Database>;
29
+ let fetchMock: ReturnType<typeof vi.fn>;
30
+
31
+ beforeEach(() => {
32
+ mockSupabase = createMockSupabaseClient() as unknown as SupabaseClient<Database>;
33
+ fetchMock = vi.fn().mockResolvedValue({ ok: true });
34
+ (globalThis as any).fetch = fetchMock;
35
+ clearPublicLogoCache();
36
+ });
37
+
38
+ afterEach(() => {
39
+ vi.clearAllMocks();
40
+ clearPublicLogoCache();
41
+ });
42
+
43
+ afterAll(() => {
44
+ (globalThis as any).fetch = originalFetch;
45
+ });
46
+
47
+ it('fetches and caches the logo when RPC succeeds', async () => {
48
+ const logoUrl = 'https://cdn.example.com/logo.png';
49
+ (mockSupabase.rpc as any).mockResolvedValue({ data: [{ logo_url: logoUrl }], error: null });
50
+
51
+ const { result } = renderHook(() =>
52
+ usePublicEventLogo('event-123', 'Big Event', VALID_ORG_ID, {
53
+ supabase: mockSupabase
54
+ })
55
+ );
56
+
57
+ await waitFor(() => expect(result.current.logoUrl).toBe(logoUrl));
58
+ expect(result.current.fallbackText).toBe('BE');
59
+ expect(fetchMock).toHaveBeenCalledWith(logoUrl, { method: 'HEAD' });
60
+
61
+ const stats = getPublicLogoCacheStats();
62
+ expect(stats.size).toBe(1);
63
+ expect(stats.keys[0]).toContain('event-123');
64
+ });
65
+
66
+ it('refetch clears cache and requests fresh data', async () => {
67
+ const firstUrl = 'https://cdn.example.com/logo.png';
68
+ const secondUrl = 'https://cdn.example.com/logo-2.png';
69
+ (mockSupabase.rpc as any)
70
+ .mockResolvedValueOnce({ data: [{ logo_url: firstUrl }], error: null })
71
+ .mockResolvedValueOnce({ data: [{ logo_url: secondUrl }], error: null });
72
+
73
+ const { result } = renderHook(() =>
74
+ usePublicEventLogo('event-123', 'Big Event', VALID_ORG_ID, {
75
+ supabase: mockSupabase
76
+ })
77
+ );
78
+
79
+ await waitFor(() => expect(result.current.logoUrl).toBe(firstUrl));
80
+
81
+ await act(async () => {
82
+ await result.current.refetch();
83
+ });
84
+
85
+ await waitFor(() => expect(result.current.logoUrl).toBe(secondUrl));
86
+ expect((mockSupabase.rpc as any)).toHaveBeenCalledTimes(2);
87
+ });
88
+
89
+ it('exposes error state when RPC fails', async () => {
90
+ (mockSupabase.rpc as any).mockResolvedValue({ data: null, error: { message: 'RPC failed' } });
91
+
92
+ const { result } = renderHook(() =>
93
+ usePublicEventLogo('event-123', 'Big Event', VALID_ORG_ID, {
94
+ supabase: mockSupabase
95
+ })
96
+ );
97
+
98
+ await waitFor(() => expect(result.current.isLoading).toBe(false));
99
+ expect(result.current.logoUrl).toBeNull();
100
+ expect(result.current.error).toEqual(new Error('RPC failed'));
101
+ expect(fetchMock).not.toHaveBeenCalled();
102
+ });
103
+
104
+ it('skips image validation when disabled', async () => {
105
+ const logoUrl = 'https://cdn.example.com/logo.png';
106
+ (mockSupabase.rpc as any).mockResolvedValue({ data: [{ logo_url: logoUrl }], error: null });
107
+
108
+ const { result } = renderHook(() =>
109
+ usePublicEventLogo('event-123', 'Big Event', VALID_ORG_ID, {
110
+ supabase: mockSupabase,
111
+ validateImage: false
112
+ })
113
+ );
114
+
115
+ await waitFor(() => expect(result.current.logoUrl).toBe(logoUrl));
116
+ expect(fetchMock).not.toHaveBeenCalled();
117
+ });
118
+
119
+ it('uses custom fallback text generator', () => {
120
+ const { result } = renderHook(() =>
121
+ usePublicEventLogo(undefined, 'Public Event', VALID_ORG_ID, {
122
+ supabase: mockSupabase,
123
+ generateFallbackText: () => 'CSTM'
124
+ })
125
+ );
126
+
127
+ expect(result.current.fallbackText).toBe('CSTM');
128
+ expect(result.current.logoUrl).toBeNull();
129
+ });
130
+
131
+ it('clears cached logo entries when clearPublicLogoCache is called', async () => {
132
+ const logoUrl = 'https://cdn.example.com/logo.png';
133
+ (mockSupabase.rpc as any).mockResolvedValue({ data: [{ logo_url: logoUrl }], error: null });
134
+
135
+ const { result } = renderHook(() =>
136
+ usePublicEventLogo('event-123', 'Big Event', VALID_ORG_ID, {
137
+ supabase: mockSupabase
138
+ })
139
+ );
140
+
141
+ await waitFor(() => expect(result.current.logoUrl).toBe(logoUrl));
142
+ expect(getPublicLogoCacheStats().size).toBe(1);
143
+
144
+ clearPublicLogoCache();
145
+ expect(getPublicLogoCacheStats().size).toBe(0);
146
+ });
147
+ });
@@ -58,7 +58,7 @@
58
58
 
59
59
  import { useState, useEffect, useCallback, useMemo } from 'react';
60
60
  import { useParams, useLocation } from 'react-router-dom';
61
- import type { Event } from '../../types/unified';
61
+ import type { Event } from '../../types/event';
62
62
  import { usePublicEvent } from './usePublicEvent';
63
63
 
64
64
  export interface UsePublicRouteParamsReturn {
@@ -9,7 +9,7 @@
9
9
  */
10
10
 
11
11
  import { useAuthService } from './useAuthService';
12
- import { type User, type Session, AuthError } from '@supabase/supabase-js';
12
+ import { type User, type Session, type SupabaseClient, AuthError } from '@supabase/supabase-js';
13
13
 
14
14
  export interface AuthState {
15
15
  user: User | null;
@@ -17,8 +17,7 @@ export interface AuthState {
17
17
  isAuthenticated: boolean;
18
18
  authLoading: boolean;
19
19
  authError: AuthError | null;
20
- error: AuthError | null; // Alias for authError for backward compatibility
21
- supabase: any | null;
20
+ supabase: SupabaseClient | null;
22
21
 
23
22
  // Auth methods
24
23
  signIn: (email: string, password?: string) => Promise<{ error: AuthError | null }>;
@@ -38,7 +37,6 @@ export function useAuth(): AuthState {
38
37
  isAuthenticated: authService.isAuthenticated(),
39
38
  authLoading: authService.isLoading(),
40
39
  authError: authService.getError(),
41
- error: authService.getError(), // Alias for backward compatibility
42
40
  supabase: authService.getSupabaseClient(),
43
41
  signIn: authService.signIn.bind(authService),
44
42
  signUp: authService.signUp.bind(authService),
@@ -9,7 +9,7 @@
9
9
  */
10
10
 
11
11
  import { useEventService } from './useEventService';
12
- import { Event } from '../../types/unified';
12
+ import { Event } from '../../types/event';
13
13
 
14
14
  export interface CurrentEventState {
15
15
  events: Event[];
@@ -29,7 +29,7 @@
29
29
  */
30
30
 
31
31
  import { useMemo, useContext } from 'react';
32
- import { useUnifiedAuth } from '../providers/UnifiedAuthProvider';
32
+ import { useUnifiedAuth } from '../providers/services/UnifiedAuthProvider';
33
33
  import { useIsPublicPage, PublicPageContext } from '../components/PublicLayout/PublicPageProvider';
34
34
 
35
35
  export interface UseAppConfigReturn {
@@ -206,7 +206,7 @@ export function useDataTablePerformance<TData extends DataRecord>({
206
206
 
207
207
  // Debounced search function
208
208
  const debouncedSearch = useCallback(
209
- debounce((query: string) => {
209
+ debounce(((query: string) => {
210
210
  if (!searchIndexRef.current) return;
211
211
 
212
212
  if (!query.trim()) {
@@ -216,7 +216,7 @@ export function useDataTablePerformance<TData extends DataRecord>({
216
216
 
217
217
  const results = searchIndexRef.current.search(query);
218
218
  setSearchResults(results);
219
- }, performance.debounceSearch ?? 300),
219
+ }) as unknown as (...args: unknown[]) => unknown, performance.debounceSearch ?? 300) as (query: string) => void,
220
220
  [performance.debounceSearch]
221
221
  );
222
222
 
@@ -43,7 +43,7 @@ import { useLocation } from 'react-router-dom';
43
43
  import { useEvents } from './useEvents';
44
44
  import { applyPalette, clearPalette } from '../theming/runtime';
45
45
  import { parseAndNormalizeEventColours } from '../theming/parseEventColours';
46
- import type { Event } from '../types/unified';
46
+ import type { Event } from '../types/event';
47
47
  import { createLogger } from '../utils/core/logger';
48
48
 
49
49
  const log = createLogger('useEventTheme');
@@ -11,8 +11,9 @@
11
11
  * For better performance, consider using useEventService directly.
12
12
  */
13
13
 
14
+ import { useMemo, useRef } from 'react';
14
15
  import { useEventService } from './services/useEventService';
15
- import { Event } from '../types/unified';
16
+ import { Event } from '../types/event';
16
17
 
17
18
  export interface EventContextType {
18
19
  events: Event[];
@@ -50,16 +51,56 @@ export interface EventContextType {
50
51
  export function useEvents(): EventContextType {
51
52
  const eventService = useEventService();
52
53
 
53
- const events = eventService.getEvents();
54
+ // Get current state - service subscription will trigger re-renders when state changes
55
+ const rawEvents = eventService.getEvents();
56
+ const selectedEvent = eventService.getSelectedEvent();
57
+ const isLoading = eventService.isLoading();
58
+ const error = eventService.getError();
54
59
 
55
- return {
60
+ // Use refs to track previous values and only create new array reference when events actually change
61
+ const prevEventsRef = useRef<Event[]>([]);
62
+ const prevEventsIdsRef = useRef<string>('');
63
+
64
+ // Compare event IDs to detect actual changes (more efficient than deep comparison)
65
+ // Do this outside useMemo to avoid dependency on rawEvents array
66
+ const currentEventsIds = rawEvents.map(e => e.event_id || e.id).join(',');
67
+ const eventsChanged = currentEventsIds !== prevEventsIdsRef.current;
68
+
69
+ // Only create new array reference when events actually changed
70
+ // Update refs synchronously, then memoize based on the ID string
71
+ if (eventsChanged) {
72
+ prevEventsRef.current = rawEvents;
73
+ prevEventsIdsRef.current = currentEventsIds;
74
+ }
75
+
76
+ // Return stable array reference - only changes when event IDs change
77
+ const events = useMemo(() => {
78
+ return prevEventsRef.current;
79
+ }, [currentEventsIds]);
80
+
81
+ // Memoize callbacks to prevent unnecessary re-renders in child components
82
+ const setSelectedEventCallback = useMemo(
83
+ () => (event: Event | null) => eventService.setSelectedEvent(event),
84
+ [eventService]
85
+ );
86
+ const refreshEventsCallback = useMemo(
87
+ () => () => eventService.refreshEvents(),
88
+ [eventService]
89
+ );
90
+ const clearEventSelectionCallback = useMemo(
91
+ () => () => eventService.clearEventSelection(),
92
+ [eventService]
93
+ );
94
+
95
+ // Memoize the return object - only recreate when actual values change
96
+ return useMemo(() => ({
56
97
  events,
57
- selectedEvent: eventService.getSelectedEvent(),
58
- isLoading: eventService.isLoading(),
59
- error: eventService.getError(),
60
- setSelectedEvent: (event: Event | null) => eventService.setSelectedEvent(event),
61
- refreshEvents: () => eventService.refreshEvents(),
62
- clearEventSelection: () => eventService.clearEventSelection(),
63
- };
98
+ selectedEvent,
99
+ isLoading,
100
+ error,
101
+ setSelectedEvent: setSelectedEventCallback,
102
+ refreshEvents: refreshEventsCallback,
103
+ clearEventSelection: clearEventSelectionCallback,
104
+ }), [events, selectedEvent?.event_id, isLoading, error?.message, setSelectedEventCallback, refreshEventsCallback, clearEventSelectionCallback]);
64
105
  }
65
106
 
@@ -11,10 +11,10 @@ import React from 'react';
11
11
  import { renderHook, waitFor } from '@testing-library/react';
12
12
  import { vi, describe, it, expect, beforeEach, afterEach } from 'vitest';
13
13
  import { useOrganisationPermissions } from './useOrganisationPermissions';
14
- import { useOrganisations } from '../providers/OrganisationProvider';
14
+ import { useOrganisations } from './useOrganisations';
15
15
 
16
- // Mock the organisation provider
17
- vi.mock('../providers/OrganisationProvider', () => ({
16
+ // Mock the organisation hook
17
+ vi.mock('./useOrganisations', () => ({
18
18
  useOrganisations: vi.fn()
19
19
  }));
20
20
 
@@ -46,7 +46,7 @@
46
46
  */
47
47
 
48
48
  import { useMemo } from 'react';
49
- import { useOrganisations } from '../providers/OrganisationProvider';
49
+ import { useOrganisations } from './useOrganisations';
50
50
  import { useOrganisationSecurity } from './useOrganisationSecurity';
51
51
  import type { OrganisationRole, OrganisationPermission } from '../types/organisation';
52
52
 
@@ -30,7 +30,7 @@ export interface OrganisationSecurityHook {
30
30
  getUserPermissions: (orgId?: string) => Promise<string[]>;
31
31
 
32
32
  // Audit logging
33
- logOrganisationAccess: (action: string, details?: any) => Promise<void>;
33
+ logOrganisationAccess: (action: string, details?: Record<string, unknown>) => Promise<void>;
34
34
 
35
35
  // Security utilities
36
36
  ensureOrganisationAccess: (orgId: string) => Promise<void>;
@@ -220,7 +220,7 @@ export const useOrganisationSecurity = (): OrganisationSecurityHook => {
220
220
  }, [selectedOrganisation, user, getUserRole, superAdminContext.isSuperAdmin]);
221
221
 
222
222
  // Log organisation access for audit using the new RBAC audit system
223
- const logOrganisationAccess = useCallback(async (action: string, details?: any): Promise<void> => {
223
+ const logOrganisationAccess = useCallback(async (action: string, details?: Record<string, unknown>): Promise<void> => {
224
224
  if (!user || !selectedOrganisation) return;
225
225
 
226
226
  try {
@@ -12,8 +12,9 @@ import { vi, describe, it, expect, beforeEach, afterEach } from 'vitest';
12
12
  import { usePermissionCache } from './usePermissionCache';
13
13
 
14
14
  // Mock the dependencies
15
- vi.mock('../providers/UnifiedAuthProvider', () => ({
16
- useUnifiedAuth: vi.fn()
15
+ const mockUseUnifiedAuthFn = vi.fn();
16
+ vi.mock('../providers/services/UnifiedAuthProvider', () => ({
17
+ useUnifiedAuth: () => mockUseUnifiedAuthFn(),
17
18
  }));
18
19
 
19
20
  vi.mock('./useOrganisations', () => ({
@@ -28,12 +29,11 @@ vi.mock('../rbac/api', () => ({
28
29
  isPermittedCached: vi.fn()
29
30
  }));
30
31
 
31
- import { useUnifiedAuth } from '../providers/UnifiedAuthProvider';
32
+ import { useUnifiedAuth } from '../providers/services/UnifiedAuthProvider';
32
33
  import { useOrganisations } from './useOrganisations';
33
34
  import { useEvents } from './useEvents';
34
35
  import { isPermittedCached } from '../rbac/api';
35
36
 
36
- const mockUseUnifiedAuth = vi.mocked(useUnifiedAuth);
37
37
  const mockUseOrganisations = vi.mocked(useOrganisations);
38
38
  const mockUseEvents = vi.mocked(useEvents);
39
39
  const mockIsPermittedCached = vi.mocked(isPermittedCached);
@@ -43,7 +43,7 @@ describe('usePermissionCache', () => {
43
43
  vi.clearAllMocks();
44
44
 
45
45
  // Setup default mocks
46
- mockUseUnifiedAuth.mockReturnValue({
46
+ mockUseUnifiedAuthFn.mockReturnValue({
47
47
  user: { id: 'user-123' },
48
48
  session: null,
49
49
  appName: 'test-app',
@@ -90,7 +90,7 @@ describe('usePermissionCache', () => {
90
90
 
91
91
  it('depends on auth and organisation hooks', () => {
92
92
  renderHook(() => usePermissionCache());
93
- expect(mockUseUnifiedAuth).toHaveBeenCalled();
93
+ expect(mockUseUnifiedAuthFn).toHaveBeenCalled();
94
94
  expect(mockUseOrganisations).toHaveBeenCalled();
95
95
  });
96
96
  });
@@ -140,7 +140,7 @@ describe('usePermissionCache', () => {
140
140
  });
141
141
 
142
142
  it('handles missing user context gracefully', () => {
143
- mockUseUnifiedAuth.mockReturnValueOnce({
143
+ mockUseUnifiedAuthFn.mockReturnValueOnce({
144
144
  user: null,
145
145
  session: null,
146
146
  appName: 'test-app',
@@ -404,7 +404,7 @@ describe('usePermissionCache', () => {
404
404
  describe('Integration with RBAC API', () => {
405
405
  it('integrates with auth and organisation hooks correctly', () => {
406
406
  renderHook(() => usePermissionCache());
407
- expect(mockUseUnifiedAuth).toHaveBeenCalled();
407
+ expect(mockUseUnifiedAuthFn).toHaveBeenCalled();
408
408
  expect(mockUseOrganisations).toHaveBeenCalled();
409
409
  });
410
410
 
@@ -425,7 +425,7 @@ describe('usePermissionCache', () => {
425
425
 
426
426
  it('handles permission API state changes', async () => {
427
427
  mockIsPermittedCached.mockResolvedValueOnce(true);
428
- mockUseUnifiedAuth.mockReturnValueOnce({
428
+ mockUseUnifiedAuthFn.mockReturnValueOnce({
429
429
  user: { id: 'user-456' },
430
430
  session: null,
431
431
  appName: 'test-app',
@@ -50,12 +50,12 @@
50
50
  * - RBAC API functions - isPermittedCached for permission checking
51
51
  * - RBAC types - Type definitions
52
52
  *
53
- * @deprecated Consider using useCan() or usePermissions() hooks directly instead.
54
53
  * This hook provides additional caching on top of the built-in caching in useCan/usePermissions.
54
+ * Consider using useCan() or usePermissions() hooks directly for simpler use cases.
55
55
  */
56
56
 
57
57
  import { useState, useCallback, useMemo, useEffect, useRef } from 'react';
58
- import { useUnifiedAuth } from '../providers/UnifiedAuthProvider';
58
+ import { useUnifiedAuth } from '../providers/services/UnifiedAuthProvider';
59
59
  import { useOrganisations } from './useOrganisations';
60
60
  import { useEvents } from './useEvents';
61
61
  import { isPermittedCached } from '../rbac/api';
package/src/index.ts CHANGED
@@ -17,18 +17,22 @@
17
17
 
18
18
  // AUTHENTICATION & AUTHORIZATION
19
19
  // Note: Providers are now service-based architecture for better testability and maintainability
20
- export { UnifiedAuthProvider, useUnifiedAuth } from './providers/UnifiedAuthProvider';
21
- export type { UnifiedAuthProviderProps, UnifiedAuthContextType, UserEventAccess } from './providers/UnifiedAuthProvider';
20
+ export { UnifiedAuthProvider, useUnifiedAuth } from './providers/services/UnifiedAuthProvider';
21
+ export type { UnifiedAuthProviderProps, UnifiedAuthContextType, UserEventAccess } from './providers/services/UnifiedAuthProvider';
22
22
 
23
23
  // Session tracking utility (for manual use if needed)
24
24
  export { useSessionTracking } from './utils/context/sessionTracking';
25
25
 
26
26
  // Provider components (using service architecture)
27
- export { EventProvider } from './providers/EventProvider';
27
+ export { EventServiceProvider } from './providers/services/EventServiceProvider';
28
+ export { OrganisationServiceProvider } from './providers/services/OrganisationServiceProvider';
29
+ export { InactivityServiceProvider } from './providers/services/InactivityServiceProvider';
30
+
31
+ // Convenience provider wrapper (backward compatibility)
28
32
  export { OrganisationProvider } from './providers/OrganisationProvider';
29
- export { InactivityProvider } from './providers/InactivityProvider';
33
+ export type { OrganisationProviderProps } from './providers/OrganisationProvider';
30
34
 
31
- // Convenience hooks for backward compatibility
35
+ // Convenience hooks
32
36
  export { useEvents } from './hooks/useEvents';
33
37
  export { useOrganisations } from './hooks/useOrganisations';
34
38
 
@@ -43,7 +47,6 @@ export type {
43
47
  Organisation,
44
48
  OrganisationMembership,
45
49
  OrganisationContextType,
46
- OrganisationProviderProps,
47
50
  OrganisationSecurityError
48
51
  } from './types/organisation';
49
52
 
@@ -88,7 +91,8 @@ export type { BadgeProps, BadgeVariant } from './components/Badge/Badge';
88
91
  export { Checkbox } from './components/Checkbox/Checkbox';
89
92
  export { Switch } from './components/Switch/Switch';
90
93
  export type { SwitchProps } from './components/Switch/Switch';
91
- export { Progress } from './components/Progress/Progress';
94
+ export { Progress } from './components/Progress';
95
+ export type { ProgressProps } from './components/Progress';
92
96
 
93
97
  // ADVANCED UI COMPONENTS
94
98
  export {
@@ -180,9 +184,10 @@ export {
180
184
  } from './components/DataTable/utils/aggregationUtils';
181
185
 
182
186
  // FORM COMPONENTS
183
- export { Form } from './components/Form/Form';
184
- export { LoginForm } from './components/LoginForm/LoginForm';
185
- export type { LoginFormProps } from './components/LoginForm/LoginForm';
187
+ export { Form, FormField } from './components/Form/Form';
188
+ export type { FormProps, FormFieldProps } from './components/Form/Form';
189
+ export { LoginForm } from './components/LoginForm';
190
+ export type { LoginFormProps } from './components/LoginForm';
186
191
 
187
192
  // LAYOUT COMPONENTS
188
193
  export { Header } from './components/Header/Header';
@@ -191,7 +196,7 @@ export type { FooterProps } from './components/Footer/Footer';
191
196
 
192
197
  // NAVIGATION COMPONENTS
193
198
  export { NavigationMenu } from './components/NavigationMenu/NavigationMenu';
194
- export type { NavigationMenuProps, NavigationItem } from './components/NavigationMenu/types';
199
+ export type { NavigationMenuProps, NavigationItem, NavigationMode } from './components/NavigationMenu/NavigationMenu';
195
200
  export { UserMenu } from './components/UserMenu/UserMenu';
196
201
  export type { UserMenuProps } from './components/UserMenu/UserMenu';
197
202
 
@@ -223,7 +228,7 @@ export { createSecureDataAccess } from './utils/security/secureDataAccess';
223
228
  export type { UserProfile } from './types/organisation';
224
229
 
225
230
  // AUTHENTICATION FORMS
226
- export { PasswordChangeForm } from './components/PasswordReset/PasswordChangeForm';
231
+ export { PasswordChangeForm } from './components/PasswordChange/PasswordChangeForm';
227
232
 
228
233
  // UTILS & HOOKS
229
234
  export { useAppConfig } from './hooks/useAppConfig';
@@ -279,6 +284,8 @@ export {
279
284
  export * from './styles';
280
285
  // Direct export of theming utilities for convenience
281
286
  export { parseAndNormalizeEventColours } from './theming/parseEventColours';
287
+ export { applyPalette, clearPalette } from './theming/runtime';
288
+ export type { PaletteData, ColorPalette, ColorShade } from './theming/runtime';
282
289
 
283
290
  // PUBLIC PAGES
284
291
  export * from './hooks/public';