@jmruthers/pace-core 0.5.181 → 0.5.182

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 (750) 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/usePublicRouteParams.ts +1 -1
  470. package/src/hooks/services/useAuth.ts +2 -4
  471. package/src/hooks/services/useCurrentEvent.ts +1 -1
  472. package/src/hooks/useAppConfig.ts +1 -1
  473. package/src/hooks/useDataTablePerformance.ts +2 -2
  474. package/src/hooks/useEventTheme.ts +1 -1
  475. package/src/hooks/useEvents.ts +51 -10
  476. package/src/hooks/useOrganisationPermissions.test.ts +3 -3
  477. package/src/hooks/useOrganisationPermissions.ts +1 -1
  478. package/src/hooks/useOrganisationSecurity.ts +2 -2
  479. package/src/hooks/usePermissionCache.test.ts +9 -9
  480. package/src/hooks/usePermissionCache.ts +2 -2
  481. package/src/index.ts +19 -12
  482. package/src/providers/OrganisationProvider.tsx +73 -9
  483. package/src/providers/UnifiedAuthProvider.smoke.test.tsx +113 -13
  484. package/src/providers/__tests__/AuthProvider.test.tsx +2 -1
  485. package/src/providers/__tests__/EventProvider.test.tsx +24 -15
  486. package/src/providers/__tests__/OrganisationProvider.test.tsx +87 -36
  487. package/src/providers/__tests__/UnifiedAuthProvider.test.tsx +80 -24
  488. package/src/providers/index.ts +0 -3
  489. package/src/providers/services/AuthServiceProvider.tsx +2 -17
  490. package/src/providers/services/EventServiceProvider.tsx +11 -16
  491. package/src/providers/services/InactivityServiceProvider.tsx +9 -12
  492. package/src/providers/services/OrganisationServiceProvider.tsx +9 -12
  493. package/src/providers/services/UnifiedAuthProvider.tsx +85 -18
  494. package/src/providers/services/__tests__/AuthServiceProvider.integration.test.tsx +11 -4
  495. package/src/rbac/__tests__/scenarios.user-role.test.tsx +105 -21
  496. package/src/rbac/adapters.tsx +1 -1
  497. package/src/rbac/api.ts +20 -4
  498. package/src/rbac/audit-enhanced.ts +47 -2
  499. package/src/rbac/audit.ts +47 -2
  500. package/src/rbac/components/NavigationGuard.tsx +1 -1
  501. package/src/rbac/components/NavigationProvider.test.tsx +7 -6
  502. package/src/rbac/components/NavigationProvider.tsx +1 -1
  503. package/src/rbac/components/PagePermissionGuard.tsx +1 -1
  504. package/src/rbac/components/PagePermissionProvider.test.tsx +7 -6
  505. package/src/rbac/components/PagePermissionProvider.tsx +1 -1
  506. package/src/rbac/components/PermissionEnforcer.tsx +1 -1
  507. package/src/rbac/components/RoleBasedRouter.tsx +1 -1
  508. package/src/rbac/components/SecureDataProvider.test.tsx +7 -6
  509. package/src/rbac/components/SecureDataProvider.tsx +1 -1
  510. package/src/rbac/components/__tests__/EnhancedNavigationMenu.test.tsx +6 -6
  511. package/src/rbac/components/__tests__/NavigationGuard.test.tsx +11 -10
  512. package/src/rbac/components/__tests__/NavigationProvider.test.tsx +10 -11
  513. package/src/rbac/components/__tests__/PagePermissionGuard.race-condition.test.tsx +19 -15
  514. package/src/rbac/components/__tests__/PagePermissionGuard.test.tsx +13 -12
  515. package/src/rbac/components/__tests__/PagePermissionGuard.verification.test.tsx +19 -15
  516. package/src/rbac/components/__tests__/PagePermissionProvider.test.tsx +18 -18
  517. package/src/rbac/components/__tests__/PermissionEnforcer.test.tsx +11 -10
  518. package/src/rbac/components/__tests__/RoleBasedRouter.test.tsx +8 -7
  519. package/src/rbac/components/__tests__/SecureDataProvider.fixed.test.tsx +10 -11
  520. package/src/rbac/components/__tests__/SecureDataProvider.test.tsx +48 -19
  521. package/src/rbac/hooks/__tests__/useSecureSupabase.test.ts +476 -0
  522. package/src/rbac/hooks/index.ts +3 -0
  523. package/src/rbac/hooks/usePermissions.ts +31 -85
  524. package/src/rbac/hooks/useRBAC.test.ts +13 -1
  525. package/src/rbac/hooks/useRBAC.ts +13 -67
  526. package/src/rbac/hooks/useResolvedScope.ts +11 -0
  527. package/src/rbac/hooks/useSecureSupabase.ts +308 -0
  528. package/src/rbac/index.ts +3 -0
  529. package/src/rbac/secureClient.ts +53 -6
  530. package/src/rbac/security.ts +37 -1
  531. package/src/{types/rbac-functions.ts → rbac/types/functions.ts} +30 -30
  532. package/src/rbac/types.ts +3 -2
  533. package/src/services/AuthService.ts +33 -25
  534. package/src/services/EventService.ts +56 -44
  535. package/src/services/InactivityService.ts +33 -53
  536. package/src/services/OrganisationService.ts +36 -40
  537. package/src/services/__tests__/AuthService.restoreSession.test.ts +6 -2
  538. package/src/services/__tests__/EventService.test.ts +67 -33
  539. package/src/services/interfaces/IEventService.ts +1 -1
  540. package/src/styles/core.css +2 -2
  541. package/src/styles/index.ts +1 -5
  542. package/src/types/__tests__/guards.test.ts +1 -1
  543. package/src/types/__tests__/type-validation.test.ts +0 -1
  544. package/src/types/auth.ts +42 -2
  545. package/src/types/core.ts +251 -0
  546. package/src/types/database.ts +11 -496
  547. package/src/types/event.ts +102 -0
  548. package/src/types/file-reference.ts +6 -4
  549. package/src/types/guards.ts +2 -1
  550. package/src/types/index.ts +48 -14
  551. package/src/types/lodash.debounce.d.ts +15 -0
  552. package/src/types/organisation.ts +14 -10
  553. package/src/types/supabase.ts +15 -17
  554. package/src/utils/__tests__/secureErrors.unit.test.ts +1 -1
  555. package/src/utils/__tests__/validationUtils.unit.test.ts +0 -29
  556. package/src/utils/app/appNameResolver.ts +1 -1
  557. package/src/utils/dynamic/dynamicUtils.ts +3 -2
  558. package/src/utils/file-reference/index.ts +25 -6
  559. package/src/utils/security/secureErrors.ts +1 -1
  560. package/src/utils/validation/index.ts +6 -12
  561. package/src/utils/validation/validationUtils.ts +0 -13
  562. package/dist/UnifiedAuthProvider-B37ATQHE.js +0 -16
  563. package/dist/auth-DReDSLq9.d.ts +0 -16
  564. package/dist/chunk-3JI76CYK.js +0 -2444
  565. package/dist/chunk-3JI76CYK.js.map +0 -1
  566. package/dist/chunk-56XJ3TU6.js +0 -11
  567. package/dist/chunk-56XJ3TU6.js.map +0 -1
  568. package/dist/chunk-5MT24GKJ.js.map +0 -1
  569. package/dist/chunk-7QCC6MCP.js +0 -288
  570. package/dist/chunk-BESYRHQM.js.map +0 -1
  571. package/dist/chunk-BJPBT3CU.js +0 -21
  572. package/dist/chunk-BJPBT3CU.js.map +0 -1
  573. package/dist/chunk-BVYWGZVV.js.map +0 -1
  574. package/dist/chunk-CX5M4ZAG.js.map +0 -1
  575. package/dist/chunk-D7LCGMVS.js.map +0 -1
  576. package/dist/chunk-EGI6MUL6.js +0 -27
  577. package/dist/chunk-EGI6MUL6.js.map +0 -1
  578. package/dist/chunk-ERISIBYU.js.map +0 -1
  579. package/dist/chunk-HRO5HWN2.js.map +0 -1
  580. package/dist/chunk-HZLDFOE4.js.map +0 -1
  581. package/dist/chunk-JISYG63F.js +0 -70
  582. package/dist/chunk-JISYG63F.js.map +0 -1
  583. package/dist/chunk-LIMSTKYD.js +0 -61
  584. package/dist/chunk-LIMSTKYD.js.map +0 -1
  585. package/dist/chunk-OWAG3GSU.js.map +0 -1
  586. package/dist/chunk-PPMP5J6T.js.map +0 -1
  587. package/dist/chunk-Q5QRDWKI.js.map +0 -1
  588. package/dist/chunk-S5OFRT4M.js.map +0 -1
  589. package/dist/chunk-SBVILCCA.js.map +0 -1
  590. package/dist/chunk-TUMEWN34.js +0 -15
  591. package/dist/chunk-TUMEWN34.js.map +0 -1
  592. package/dist/chunk-XDNLUEXI.js +0 -138
  593. package/dist/chunk-XJ2HZOBU.js.map +0 -1
  594. package/dist/chunk-ZYTYSTO5.js.map +0 -1
  595. package/dist/chunk-ZZ2SS7NI.js +0 -237
  596. package/dist/chunk-ZZ2SS7NI.js.map +0 -1
  597. package/dist/database-C6jy7EOu.d.ts +0 -500
  598. package/dist/organisation-D6qRDtbF.d.ts +0 -93
  599. package/dist/schema-DTDZQe2u.d.ts +0 -28
  600. package/dist/unified-DQ4VcT7H.d.ts +0 -198
  601. package/dist/useInactivityTracker-TO6ZOF35.js +0 -11
  602. package/dist/validation.d.ts +0 -47
  603. package/dist/validation.js +0 -24
  604. package/dist/validation.js.map +0 -1
  605. package/docs/DOCUMENTATION_AUDIT.md +0 -172
  606. package/docs/DOCUMENTATION_STANDARD.md +0 -137
  607. package/docs/api/classes/PublicErrorBoundary.md +0 -132
  608. package/docs/api/interfaces/EventLogoProps.md +0 -152
  609. package/docs/api/interfaces/PublicErrorBoundaryProps.md +0 -94
  610. package/docs/api/interfaces/PublicErrorBoundaryState.md +0 -68
  611. package/docs/api/interfaces/PublicLoadingSpinnerProps.md +0 -86
  612. package/docs/architecture/rpc-function-standards.md +0 -1106
  613. package/docs/getting-started/consuming-app-vite-config.md +0 -239
  614. package/docs/implementation-guides/event-theming-summary.md +0 -226
  615. package/docs/implementation-guides/public-pages-advanced.md +0 -1038
  616. package/docs/migration/v0.4.15-tailwind-scanning.md +0 -278
  617. package/docs/migration/v0.4.16-css-first-approach.md +0 -312
  618. package/docs/migration/v0.4.17-source-path-fix.md +0 -235
  619. package/docs/rbac/RBAC_EVENT_CONTEXT_LOADING.md +0 -222
  620. package/docs/rbac/RBAC_LOGIN_SAFETY_FIX.md +0 -95
  621. package/docs/rbac/RBAC_V0.5.147_FIX.md +0 -117
  622. package/docs/rbac/README-rbac-rls-integration.md +0 -374
  623. package/docs/styles/usage.md +0 -227
  624. package/docs/testing/visual-testing.md +0 -120
  625. package/docs/troubleshooting/DEBUG_NETWORK_ERROR.md +0 -152
  626. package/docs/troubleshooting/FIX_SUPABASE_CORS.md +0 -184
  627. package/docs/troubleshooting/cake-page-permission-guard-issue-summary.md +0 -193
  628. package/docs/troubleshooting/database-view-compatibility.md +0 -125
  629. package/docs/troubleshooting/react-hooks-issue-analysis.md +0 -172
  630. package/docs/troubleshooting/tailwind-content-scanning.md +0 -219
  631. package/examples/RBAC/EventBasedApp.tsx +0 -239
  632. package/examples/RBAC/PermissionExample.tsx +0 -151
  633. package/examples/STRUCTURE.md +0 -125
  634. package/examples/components 2/DataTable/HierarchicalExample.tsx +0 -475
  635. package/examples/components 2/Dialog/BasicHtmlTest.tsx +0 -55
  636. package/examples/components 2/Dialog/DebugHtmlExample.tsx +0 -68
  637. package/examples/components 2/Dialog/HtmlDialogExample.tsx +0 -202
  638. package/examples/components 2/Dialog/SimpleHtmlTest.tsx +0 -61
  639. package/examples/components 2/Dialog/SmartDialogExample.tsx +0 -322
  640. package/examples/components 2/index.ts +0 -11
  641. package/examples/features/index.ts +0 -12
  642. package/examples/features/rbac/CompleteRBACExample.tsx +0 -324
  643. package/examples/features/rbac/index.ts +0 -13
  644. package/examples/public-pages/CorrectPublicPageImplementation.tsx +0 -301
  645. package/examples/public-pages/PublicEventPage.tsx +0 -274
  646. package/examples/public-pages/PublicPageApp.tsx +0 -308
  647. package/examples/public-pages/PublicPageUsageExample.tsx +0 -216
  648. package/examples/public-pages/index.ts +0 -14
  649. package/src/__tests__/TEST_STANDARD.md +0 -1008
  650. package/src/components/Checkbox/__mocks__/Checkbox.tsx +0 -2
  651. package/src/components/DataTable/examples/HierarchicalActionsExample.tsx +0 -421
  652. package/src/components/DataTable/examples/InitialPageSizeExample.tsx +0 -177
  653. package/src/components/DataTable/examples/PerformanceExample.tsx +0 -506
  654. package/src/components/DataTable/examples/__tests__/HierarchicalActionsExample.test.tsx +0 -316
  655. package/src/components/DataTable/examples/__tests__/HierarchicalExample.test.tsx +0 -45
  656. package/src/components/DataTable/examples/__tests__/InitialPageSizeExample.test.tsx +0 -211
  657. package/src/components/DataTable/examples/__tests__/PerformanceExample.test.tsx +0 -126
  658. package/src/components/Dialog/README.md +0 -804
  659. package/src/components/Dialog/examples/BasicHtmlTest.tsx +0 -55
  660. package/src/components/Dialog/examples/DebugHtmlExample.tsx +0 -68
  661. package/src/components/Dialog/examples/ScrollableDialogExample.tsx +0 -290
  662. package/src/components/Dialog/examples/SimpleHtmlTest.tsx +0 -61
  663. package/src/components/Dialog/examples/__tests__/HtmlDialogExample.test.tsx +0 -71
  664. package/src/components/Dialog/examples/__tests__/SimpleHtmlTest.test.tsx +0 -122
  665. package/src/components/Dialog/examples/__tests__/SmartDialogExample.unit.test.tsx +0 -147
  666. package/src/components/Dialog/utils/__tests__/safeHtml.unit.test.ts +0 -611
  667. package/src/components/Dialog/utils/safeHtml.ts +0 -185
  668. package/src/components/EventSelector/types.ts +0 -79
  669. package/src/components/Form/FormErrorSummary.tsx +0 -113
  670. package/src/components/Form/FormField.tsx +0 -249
  671. package/src/components/Form/FormFieldset.tsx +0 -127
  672. package/src/components/Form/FormLiveRegion.tsx +0 -198
  673. package/src/components/Input/__mocks__/Input.tsx +0 -2
  674. package/src/components/NavigationMenu/types.ts +0 -85
  675. package/src/components/PaceAppLayout/__tests__/PaceAppLayout.accessibility.test.tsx +0 -326
  676. package/src/components/PaceAppLayout/__tests__/PaceAppLayout.unit.test.tsx +0 -1078
  677. package/src/components/PasswordReset/PasswordResetForm.test.tsx +0 -597
  678. package/src/components/PasswordReset/PasswordResetForm.tsx +0 -201
  679. package/src/components/PasswordReset/index.ts +0 -2
  680. package/src/components/ProtectedRoute/README.md +0 -164
  681. package/src/components/PublicLayout/EventLogo.tsx +0 -175
  682. package/src/components/PublicLayout/PublicErrorBoundary.tsx +0 -282
  683. package/src/components/PublicLayout/PublicLoadingSpinner.tsx +0 -216
  684. package/src/components/PublicLayout/PublicPageContextChecker.tsx +0 -131
  685. package/src/components/PublicLayout/PublicPageDebugger.tsx +0 -104
  686. package/src/components/PublicLayout/PublicPageDiagnostic.tsx +0 -162
  687. package/src/components/PublicLayout/PublicPageFooter.tsx +0 -124
  688. package/src/components/PublicLayout/PublicPageHeader.tsx +0 -209
  689. package/src/components/PublicLayout/__tests__/PublicErrorBoundary.test.tsx +0 -449
  690. package/src/components/PublicLayout/__tests__/PublicLoadingSpinner.test.tsx +0 -393
  691. package/src/components/PublicLayout/__tests__/PublicPageContextChecker.test.tsx +0 -192
  692. package/src/components/PublicLayout/__tests__/PublicPageFooter.test.tsx +0 -351
  693. package/src/components/PublicLayout/__tests__/PublicPageHeader.test.tsx +0 -402
  694. package/src/components/PublicLayout/__tests__/PublicPageLayout.test.tsx +0 -460
  695. package/src/components/PublicLayout/__tests__/PublicPageProvider.test.tsx +0 -313
  696. package/src/components/Select/hooks.ts +0 -289
  697. package/src/hooks/useCounter.test.ts +0 -131
  698. package/src/hooks/useDebounce.test.ts +0 -375
  699. package/src/providers/AuthProvider.tsx +0 -15
  700. package/src/providers/EventProvider.tsx +0 -16
  701. package/src/providers/InactivityProvider.tsx +0 -15
  702. package/src/providers/OrganisationProvider.context.test.tsx +0 -169
  703. package/src/providers/UnifiedAuthProvider.tsx +0 -15
  704. package/src/types/theme.ts +0 -6
  705. package/src/types/unified.ts +0 -265
  706. package/src/utils/appConfig.ts +0 -47
  707. package/src/utils/appIdResolver.test.ts +0 -499
  708. package/src/utils/appIdResolver.ts +0 -130
  709. package/src/utils/appNameResolver.simple.test.ts +0 -212
  710. package/src/utils/appNameResolver.test.ts +0 -121
  711. package/src/utils/appNameResolver.ts +0 -191
  712. package/src/utils/audit.ts +0 -127
  713. package/src/utils/auth-utils.ts +0 -96
  714. package/src/utils/bundleAnalysis.ts +0 -129
  715. package/src/utils/debugLogger.ts +0 -67
  716. package/src/utils/deviceFingerprint.ts +0 -215
  717. package/src/utils/dynamicUtils.ts +0 -105
  718. package/src/utils/file-reference.test.ts +0 -788
  719. package/src/utils/file-reference.ts +0 -519
  720. package/src/utils/formatDate.test.ts +0 -237
  721. package/src/utils/formatting.ts +0 -170
  722. package/src/utils/lazyLoad.tsx +0 -44
  723. package/src/utils/logger.ts +0 -179
  724. package/src/utils/organisationContext.test.ts +0 -322
  725. package/src/utils/organisationContext.ts +0 -153
  726. package/src/utils/performanceBenchmark.ts +0 -64
  727. package/src/utils/performanceBudgets.ts +0 -110
  728. package/src/utils/permissionTypes.ts +0 -37
  729. package/src/utils/permissionUtils.test.ts +0 -393
  730. package/src/utils/permissionUtils.ts +0 -34
  731. package/src/utils/sanitization.ts +0 -264
  732. package/src/utils/schemaUtils.ts +0 -37
  733. package/src/utils/secureDataAccess.test.ts +0 -711
  734. package/src/utils/secureDataAccess.ts +0 -377
  735. package/src/utils/secureErrors.ts +0 -79
  736. package/src/utils/security.ts +0 -156
  737. package/src/utils/securityMonitor.ts +0 -45
  738. package/src/utils/sessionTracking.ts +0 -126
  739. package/src/utils/validation.ts +0 -111
  740. package/src/utils/validationUtils.ts +0 -120
  741. package/src/validation/index.ts +0 -12
  742. /package/dist/{DataTable-UA6CL4JI.js.map → DataTable-QAB34V6K.js.map} +0 -0
  743. /package/dist/{UnifiedAuthProvider-B37ATQHE.js.map → UnifiedAuthProvider-7F6T4B6K.js.map} +0 -0
  744. /package/dist/{api-45XYYO2A.js.map → api-ROMBCNKU.js.map} +0 -0
  745. /package/dist/{audit-64X3VJXB.js.map → audit-WRS3KJKI.js.map} +0 -0
  746. /package/dist/{chunk-PLDDJCW6.js.map → chunk-7D4SUZUM.js.map} +0 -0
  747. /package/dist/{useInactivityTracker-TO6ZOF35.js.map → chunk-KQCRWDSA.js.map} +0 -0
  748. /package/examples/{components 2/DataTable → DataTable}/InitialPageSizeExample.tsx +0 -0
  749. /package/examples/{features/public-pages → PublicPages}/index.ts +0 -0
  750. /package/examples/{RBAC → rbac}/index.ts +0 -0
@@ -7,9 +7,12 @@ import React from 'react';
7
7
  import { screen, waitFor } from '@testing-library/react';
8
8
  import userEvent from '@testing-library/user-event';
9
9
  import { describe, it, expect, vi, beforeEach, afterEach } from 'vitest';
10
+ import type { AuthError } from '@supabase/supabase-js';
10
11
  import { PaceLoginPage } from './PaceLoginPage';
11
12
  import { renderWithProviders } from '../../__tests__/helpers/test-utils';
12
13
  import { Logger, LogLevel } from '../../utils/core/logger';
14
+ import { clearPalette } from '../../theming/runtime';
15
+ import { EventServiceContext } from '../../providers/services/EventServiceProvider';
13
16
 
14
17
  // Mock React Router
15
18
  const mockNavigate = vi.fn();
@@ -73,6 +76,10 @@ vi.mock('../../providers', () => ({
73
76
  UnifiedAuthProvider: ({ children }: { children: React.ReactNode }) => <>{children}</>,
74
77
  }));
75
78
 
79
+ vi.mock('../../theming/runtime', () => ({
80
+ clearPalette: vi.fn(),
81
+ }));
82
+
76
83
  // Mock isSuperAdmin from RBAC API
77
84
  vi.mock('../../rbac/api', () => ({
78
85
  isSuperAdmin: vi.fn().mockResolvedValue(false)
@@ -83,14 +90,31 @@ import { isSuperAdmin } from '../../rbac/api';
83
90
  // Mock console methods to avoid noise in tests
84
91
  const originalConsoleError = console.error;
85
92
 
93
+ const resetAuthContext = () => {
94
+ mockAuthContext.user = null;
95
+ mockAuthContext.isAuthenticated = false;
96
+ mockAuthContext.isLoading = false;
97
+ mockAuthContext.authError = null;
98
+ mockAuthContext.hasRole = vi.fn();
99
+ mockAuthContext.getUserRole = vi.fn();
100
+ mockAuthContext.signIn = vi.fn();
101
+ mockAuthContext.signOut = vi.fn();
102
+ mockAuthContext.refreshSession = vi.fn();
103
+ mockAuthContext.supabase = mockSupabase;
104
+ };
105
+
86
106
  describe('PaceLoginPage Component', () => {
87
107
  let originalMode: string | undefined;
88
108
 
89
109
  beforeEach(() => {
110
+ resetAuthContext();
111
+ mockNavigate.mockReset();
112
+ vi.mocked(clearPalette).mockClear();
113
+ vi.mocked(isSuperAdmin).mockClear();
90
114
  // Ensure logger is enabled by setting MODE to development
91
115
  originalMode = import.meta.env.MODE;
92
116
  (import.meta.env as any).MODE = 'development';
93
-
117
+
94
118
  // Configure logger to ensure it logs in test environment
95
119
  Logger.configure({
96
120
  level: LogLevel.DEBUG,
@@ -109,16 +133,39 @@ describe('PaceLoginPage Component', () => {
109
133
  }
110
134
  });
111
135
 
136
+ describe('Side Effects', () => {
137
+ it('clears theme palette on mount and when login route is active', () => {
138
+ renderWithProviders(<PaceLoginPage appName="Test App" />, { withRouter: false });
139
+
140
+ expect(clearPalette).toHaveBeenCalled();
141
+ });
142
+
143
+ it('restores persisted events when event service context is provided', async () => {
144
+ const restorePersistedEvent = vi.fn().mockResolvedValue(undefined);
145
+ window.history.pushState({}, '', '/login');
146
+
147
+ renderWithProviders(
148
+ <EventServiceContext.Provider value={{ eventService: { restorePersistedEvent } as any }}>
149
+ <PaceLoginPage appName="Test App" />
150
+ </EventServiceContext.Provider>
151
+ );
152
+
153
+ await waitFor(() => {
154
+ expect(restorePersistedEvent).toHaveBeenCalled();
155
+ }, { timeout: 2000 });
156
+ });
157
+ });
158
+
112
159
  // Basic rendering tests
113
160
  describe('Rendering', () => {
114
161
  it('renders with default props', () => {
115
- renderWithProviders(<PaceLoginPage appName="Test App" />);
162
+ renderWithProviders(<PaceLoginPage appName="Test App" />, { withRouter: false });
116
163
 
117
164
  expect(screen.getByLabelText('Test App Login Page')).toBeInTheDocument();
118
165
  });
119
166
 
120
167
  it('renders with custom app name', () => {
121
- renderWithProviders(<PaceLoginPage appName="My Application" />);
168
+ renderWithProviders(<PaceLoginPage appName="My Application" />, { withRouter: false });
122
169
 
123
170
  expect(screen.getByLabelText('My Application Login Page')).toBeInTheDocument();
124
171
  });
@@ -135,7 +182,7 @@ describe('PaceLoginPage Component', () => {
135
182
  });
136
183
 
137
184
  it('renders app logo with correct attributes', () => {
138
- renderWithProviders(<PaceLoginPage appName="TestApp" />);
185
+ renderWithProviders(<PaceLoginPage appName="TestApp" />, { withRouter: false });
139
186
 
140
187
  const logo = screen.getByAltText('TestApp logo');
141
188
  expect(logo).toBeInTheDocument();
@@ -144,13 +191,13 @@ describe('PaceLoginPage Component', () => {
144
191
  });
145
192
 
146
193
  it('renders LoginForm component', () => {
147
- renderWithProviders(<PaceLoginPage appName="Test App" />);
194
+ renderWithProviders(<PaceLoginPage appName="Test App" />, { withRouter: false });
148
195
 
149
196
  expect(screen.getByTestId('login-form')).toBeInTheDocument();
150
197
  });
151
198
 
152
199
  it('passes correct props to LoginForm', () => {
153
- renderWithProviders(<PaceLoginPage appName="Test App" />);
200
+ renderWithProviders(<PaceLoginPage appName="Test App" />, { withRouter: false });
154
201
 
155
202
  // Check that LoginForm receives the app name
156
203
  expect(screen.getByText('Sign in to Test App')).toBeInTheDocument();
@@ -162,7 +209,7 @@ describe('PaceLoginPage Component', () => {
162
209
  it('handles loading state', () => {
163
210
  mockAuthContext.isLoading = true;
164
211
 
165
- renderWithProviders(<PaceLoginPage appName="Test App" />);
212
+ renderWithProviders(<PaceLoginPage appName="Test App" />, { withRouter: false });
166
213
 
167
214
  expect(screen.getByLabelText('Test App Login Page')).toBeInTheDocument();
168
215
  });
@@ -172,7 +219,7 @@ describe('PaceLoginPage Component', () => {
172
219
  mockAuthContext.isLoading = false;
173
220
  mockAuthContext.hasRole.mockReturnValue(false);
174
221
 
175
- renderWithProviders(<PaceLoginPage appName="Test App" />);
222
+ renderWithProviders(<PaceLoginPage appName="Test App" />, { withRouter: false });
176
223
 
177
224
  expect(screen.getByLabelText('Test App Login Page')).toBeInTheDocument();
178
225
  });
@@ -180,7 +227,7 @@ describe('PaceLoginPage Component', () => {
180
227
  it('handles authentication error', () => {
181
228
  mockAuthContext.authError = new Error('Authentication failed');
182
229
 
183
- renderWithProviders(<PaceLoginPage appName="Test App" />);
230
+ renderWithProviders(<PaceLoginPage appName="Test App" />, { withRouter: false });
184
231
 
185
232
  expect(screen.getByText('Authentication failed')).toBeInTheDocument();
186
233
  expect(screen.getByText('Authentication failed')).toHaveClass('text-destructive');
@@ -190,7 +237,7 @@ describe('PaceLoginPage Component', () => {
190
237
  const errorMessage = 'Invalid credentials';
191
238
  mockAuthContext.authError = new Error(errorMessage);
192
239
 
193
- renderWithProviders(<PaceLoginPage appName="Test App" />);
240
+ renderWithProviders(<PaceLoginPage appName="Test App" />, { withRouter: false });
194
241
 
195
242
  const errorElement = screen.getByText(errorMessage);
196
243
  expect(errorElement).toBeInTheDocument();
@@ -199,11 +246,14 @@ describe('PaceLoginPage Component', () => {
199
246
  });
200
247
 
201
248
  it('does not show benign AuthSessionMissingError on login page', () => {
202
- const authErr = new Error('Auth session missing!');
203
- authErr.name = 'AuthSessionMissingError';
204
- mockAuthContext.authError = authErr as any;
249
+ const authErr: AuthError = {
250
+ name: 'AuthSessionMissingError',
251
+ message: 'Auth session missing!',
252
+ status: 400
253
+ };
254
+ mockAuthContext.authError = authErr;
205
255
 
206
- renderWithProviders(<PaceLoginPage appName="Test App" />);
256
+ renderWithProviders(<PaceLoginPage appName="Test App" />, { withRouter: false });
207
257
 
208
258
  expect(screen.queryByText(/Auth session missing/i)).toBeNull();
209
259
  });
@@ -238,7 +288,7 @@ describe('PaceLoginPage Component', () => {
238
288
  mockAuthContext.isLoading = false;
239
289
  mockAuthContext.hasRole.mockReturnValue(false);
240
290
 
241
- renderWithProviders(<PaceLoginPage appName="Test App" />);
291
+ renderWithProviders(<PaceLoginPage appName="Test App" />, { withRouter: false });
242
292
 
243
293
  await waitFor(() => {
244
294
  expect(mockNavigate).not.toHaveBeenCalled();
@@ -312,7 +362,7 @@ describe('PaceLoginPage Component', () => {
312
362
  const signInError = new Error('Invalid credentials');
313
363
  mockAuthContext.signIn.mockResolvedValue({ error: signInError });
314
364
 
315
- renderWithProviders(<PaceLoginPage appName="Test App" />);
365
+ renderWithProviders(<PaceLoginPage appName="Test App" />, { withRouter: false });
316
366
 
317
367
  const emailInput = screen.getByLabelText('Email');
318
368
  const passwordInput = screen.getByLabelText('Password');
@@ -340,7 +390,7 @@ describe('PaceLoginPage Component', () => {
340
390
  throw new Error('Navigation failed');
341
391
  });
342
392
 
343
- renderWithProviders(<PaceLoginPage appName="Test App" />);
393
+ renderWithProviders(<PaceLoginPage appName="Test App" />, { withRouter: false });
344
394
 
345
395
  const emailInput = screen.getByLabelText('Email');
346
396
  const passwordInput = screen.getByLabelText('Password');
@@ -361,13 +411,13 @@ describe('PaceLoginPage Component', () => {
361
411
 
362
412
  it('manages loading state during form submission', async () => {
363
413
  const user = userEvent.setup();
364
- let resolveSignIn: (value: any) => void;
365
- const signInPromise = new Promise((resolve) => {
414
+ let resolveSignIn: (value: { error: AuthError | null }) => void;
415
+ const signInPromise = new Promise<{ error: AuthError | null }>((resolve) => {
366
416
  resolveSignIn = resolve;
367
417
  });
368
418
  mockAuthContext.signIn.mockReturnValue(signInPromise);
369
419
 
370
- renderWithProviders(<PaceLoginPage appName="Test App" />);
420
+ renderWithProviders(<PaceLoginPage appName="Test App" />, { withRouter: false });
371
421
 
372
422
  const emailInput = screen.getByLabelText('Email');
373
423
  const passwordInput = screen.getByLabelText('Password');
@@ -396,14 +446,14 @@ describe('PaceLoginPage Component', () => {
396
446
  // Error handling tests
397
447
  describe('Error Handling', () => {
398
448
  it('handles missing app name gracefully', () => {
399
- renderWithProviders(<PaceLoginPage appName="" />);
449
+ renderWithProviders(<PaceLoginPage appName="" />, { withRouter: false });
400
450
 
401
451
  // Check that the component renders even with empty app name
402
452
  expect(screen.getByTestId('login-form')).toBeInTheDocument();
403
453
  });
404
454
 
405
455
  it('handles undefined redirect path', () => {
406
- renderWithProviders(<PaceLoginPage appName="Test App" onSuccessRedirectPath={undefined} />);
456
+ renderWithProviders(<PaceLoginPage appName="Test App" onSuccessRedirectPath={undefined} />, { withRouter: false });
407
457
 
408
458
  expect(screen.getByLabelText('Test App Login Page')).toBeInTheDocument();
409
459
  });
@@ -415,7 +465,7 @@ describe('PaceLoginPage Component', () => {
415
465
  // Mock console.error to catch the error
416
466
  console.error = vi.fn();
417
467
 
418
- renderWithProviders(<PaceLoginPage appName="Test App" />);
468
+ renderWithProviders(<PaceLoginPage appName="Test App" />, { withRouter: false });
419
469
 
420
470
  const emailInput = screen.getByLabelText('Email');
421
471
  const passwordInput = screen.getByLabelText('Password');
@@ -438,14 +488,14 @@ describe('PaceLoginPage Component', () => {
438
488
  // Accessibility tests
439
489
  describe('Accessibility', () => {
440
490
  it('has proper ARIA attributes', () => {
441
- renderWithProviders(<PaceLoginPage appName="Test App" />);
491
+ renderWithProviders(<PaceLoginPage appName="Test App" />, { withRouter: false });
442
492
 
443
493
  const main = screen.getByLabelText('Test App Login Page');
444
494
  expect(main).toHaveAttribute('aria-label', 'Test App Login Page');
445
495
  });
446
496
 
447
497
  it('has proper semantic structure', () => {
448
- renderWithProviders(<PaceLoginPage appName="Test App" />);
498
+ renderWithProviders(<PaceLoginPage appName="Test App" />, { withRouter: false });
449
499
 
450
500
  expect(screen.getByLabelText('Test App Login Page')).toBeInTheDocument();
451
501
  expect(screen.getByRole('img')).toBeInTheDocument();
@@ -453,7 +503,7 @@ describe('PaceLoginPage Component', () => {
453
503
  });
454
504
 
455
505
  it('has accessible form elements', () => {
456
- renderWithProviders(<PaceLoginPage appName="Test App" />);
506
+ renderWithProviders(<PaceLoginPage appName="Test App" />, { withRouter: false });
457
507
 
458
508
  expect(screen.getByLabelText('Email')).toBeInTheDocument();
459
509
  expect(screen.getByLabelText('Password')).toBeInTheDocument();
@@ -463,7 +513,7 @@ describe('PaceLoginPage Component', () => {
463
513
  it('announces errors to screen readers', () => {
464
514
  mockAuthContext.authError = new Error('Authentication failed');
465
515
 
466
- renderWithProviders(<PaceLoginPage appName="Test App" />);
516
+ renderWithProviders(<PaceLoginPage appName="Test App" />, { withRouter: false });
467
517
 
468
518
  const errorElement = screen.getByText('Authentication failed');
469
519
  expect(errorElement).toBeInTheDocument();
@@ -473,7 +523,7 @@ describe('PaceLoginPage Component', () => {
473
523
  // Integration tests
474
524
  describe('Integration', () => {
475
525
  it('integrates with LoginForm component', () => {
476
- renderWithProviders(<PaceLoginPage appName="Test App" />);
526
+ renderWithProviders(<PaceLoginPage appName="Test App" />, { withRouter: false });
477
527
 
478
528
  // Check that LoginForm is rendered with correct props
479
529
  expect(screen.getByTestId('login-form')).toBeInTheDocument();
@@ -482,13 +532,13 @@ describe('PaceLoginPage Component', () => {
482
532
 
483
533
  it('passes loading state to LoginForm', async () => {
484
534
  const user = userEvent.setup();
485
- let resolveSignIn: (value: any) => void;
486
- const signInPromise = new Promise((resolve) => {
535
+ let resolveSignIn: (value: { error: AuthError | null }) => void;
536
+ const signInPromise = new Promise<{ error: AuthError | null }>((resolve) => {
487
537
  resolveSignIn = resolve;
488
538
  });
489
539
  mockAuthContext.signIn.mockReturnValue(signInPromise);
490
540
 
491
- renderWithProviders(<PaceLoginPage appName="Test App" />);
541
+ renderWithProviders(<PaceLoginPage appName="Test App" />, { withRouter: false });
492
542
 
493
543
  const emailInput = screen.getByLabelText('Email');
494
544
  const passwordInput = screen.getByLabelText('Password');
@@ -510,21 +560,21 @@ describe('PaceLoginPage Component', () => {
510
560
  // Layout and styling tests
511
561
  describe('Layout and Styling', () => {
512
562
  it('has correct main container classes', () => {
513
- renderWithProviders(<PaceLoginPage appName="Test App" />);
563
+ renderWithProviders(<PaceLoginPage appName="Test App" />, { withRouter: false });
514
564
 
515
565
  const main = screen.getByLabelText('Test App Login Page');
516
566
  expect(main).toHaveClass('min-h-screen', 'grid', 'mx-auto', 'w-fit', 'content-center', 'justify-items-center', 'gap-y-8');
517
567
  });
518
568
 
519
569
  it('renders logo with correct styling', () => {
520
- renderWithProviders(<PaceLoginPage appName="TestApp" />);
570
+ renderWithProviders(<PaceLoginPage appName="TestApp" />, { withRouter: false });
521
571
 
522
572
  const logo = screen.getByAltText('TestApp logo');
523
573
  expect(logo).toHaveClass('h-48');
524
574
  });
525
575
 
526
576
  it('renders LoginForm with correct width class', () => {
527
- renderWithProviders(<PaceLoginPage appName="Test App" />);
577
+ renderWithProviders(<PaceLoginPage appName="Test App" />, { withRouter: false });
528
578
 
529
579
  const form = screen.getByTestId('login-form');
530
580
  expect(form.closest('.w-md')).toBeInTheDocument();
@@ -536,7 +586,7 @@ describe('PaceLoginPage Component', () => {
536
586
  it('handles empty form submission', async () => {
537
587
  const user = userEvent.setup();
538
588
 
539
- renderWithProviders(<PaceLoginPage appName="Test App" />);
589
+ renderWithProviders(<PaceLoginPage appName="Test App" />, { withRouter: false });
540
590
 
541
591
  const submitButton = screen.getByRole('button', { name: /sign in/i });
542
592
  await user.click(submitButton);
@@ -548,17 +598,121 @@ describe('PaceLoginPage Component', () => {
548
598
  it('handles very long app names', () => {
549
599
  const longAppName = 'A'.repeat(100);
550
600
 
551
- renderWithProviders(<PaceLoginPage appName={longAppName} />);
601
+ renderWithProviders(<PaceLoginPage appName={longAppName} />, { withRouter: false });
552
602
 
553
603
  expect(screen.getByLabelText(`${longAppName} Login Page`)).toBeInTheDocument();
554
604
  });
555
605
 
556
606
  it('handles special characters in app name', () => {
557
607
  const specialAppName = 'Test & Co. (Ltd.)';
558
-
559
- renderWithProviders(<PaceLoginPage appName={specialAppName} />);
560
-
608
+
609
+ renderWithProviders(<PaceLoginPage appName={specialAppName} />, { withRouter: false });
610
+
561
611
  expect(screen.getByLabelText(`${specialAppName} Login Page`)).toBeInTheDocument();
562
612
  });
613
+
614
+ it('shows access error when required app configuration is missing', async () => {
615
+ mockAuthContext.isAuthenticated = true;
616
+ mockAuthContext.user = { id: 'user-1' };
617
+ const missingAppSupabase = {
618
+ from: vi.fn((table: string) => {
619
+ if (table === 'rbac_apps') {
620
+ return {
621
+ select: vi.fn(() => ({
622
+ eq: vi.fn(() => ({
623
+ eq: vi.fn(() => ({
624
+ single: vi.fn(() => Promise.resolve({ data: null, error: new Error('missing') })),
625
+ })),
626
+ })),
627
+ })),
628
+ };
629
+ }
630
+ return {
631
+ select: vi.fn(() => ({
632
+ eq: vi.fn(() => ({
633
+ eq: vi.fn(() => ({
634
+ single: vi.fn(() => Promise.resolve({ data: null, error: null })),
635
+ })),
636
+ })),
637
+ })),
638
+ };
639
+ }),
640
+ rpc: vi.fn(() => Promise.resolve({ data: false, error: null })),
641
+ };
642
+ mockAuthContext.supabase = missingAppSupabase as any;
643
+
644
+ renderWithProviders(
645
+ <PaceLoginPage appName="Test App" requireAppAccess />
646
+ );
647
+
648
+ await waitFor(() => {
649
+ expect(screen.getByText(/is not configured/i)).toBeInTheDocument();
650
+ });
651
+ });
652
+
653
+ it('shows organisation access error when user lacks active organisations', async () => {
654
+ mockAuthContext.isAuthenticated = true;
655
+ mockAuthContext.user = { id: 'user-2' };
656
+ const supabaseWithNoOrg = {
657
+ from: vi.fn((table: string) => {
658
+ if (table === 'rbac_apps') {
659
+ return {
660
+ select: vi.fn(() => ({
661
+ eq: vi.fn(() => ({
662
+ eq: vi.fn(() => ({
663
+ single: vi.fn(() => Promise.resolve({ data: { id: 'app-1', name: 'Test App' }, error: null })),
664
+ })),
665
+ })),
666
+ })),
667
+ };
668
+ }
669
+
670
+ if (table === 'rbac_app_pages') {
671
+ return {
672
+ select: vi.fn(() => ({
673
+ eq: vi.fn(() => Promise.resolve({ data: [{ id: 'page-1', page_name: 'dashboard' }], error: null })),
674
+ })),
675
+ };
676
+ }
677
+
678
+ if (table === 'rbac_organisation_roles') {
679
+ return {
680
+ select: vi.fn(() => ({
681
+ eq: vi.fn(() => ({
682
+ eq: vi.fn(() => ({
683
+ is: vi.fn(() => ({
684
+ limit: vi.fn(() => ({
685
+ single: vi.fn(() => Promise.resolve({ data: null, error: null })),
686
+ })),
687
+ })),
688
+ })),
689
+ })),
690
+ })),
691
+ };
692
+ }
693
+
694
+ return {
695
+ select: vi.fn(() => ({
696
+ eq: vi.fn(() => ({
697
+ eq: vi.fn(() => ({
698
+ single: vi.fn(() => Promise.resolve({ data: null, error: null })),
699
+ })),
700
+ })),
701
+ })),
702
+ };
703
+ }),
704
+ rpc: vi.fn(() => Promise.resolve({ data: false, error: null })),
705
+ };
706
+
707
+ mockAuthContext.supabase = supabaseWithNoOrg as any;
708
+
709
+ renderWithProviders(
710
+ <PaceLoginPage appName="Test App" requireAppAccess />
711
+ );
712
+
713
+ await waitFor(() => {
714
+ expect(screen.getByText(/not assigned to any organisation/i)).toBeInTheDocument();
715
+ });
716
+ });
563
717
  });
564
718
  });
@@ -1,7 +1,7 @@
1
1
  /**
2
2
  * @file PasswordChangeForm Component Tests
3
3
  * @package @jmruthers/pace-core
4
- * @module Components/PasswordReset
4
+ * @module Components/PasswordChange
5
5
  * @since 0.1.0
6
6
  *
7
7
  * Comprehensive test suite for the PasswordChangeForm component.
@@ -404,7 +404,7 @@ describe('PasswordChangeForm', () => {
404
404
  await user.click(submitButton);
405
405
 
406
406
  await waitFor(() => {
407
- expect(screen.getByText('An unexpected error occurred.')).toBeInTheDocument();
407
+ expect(screen.getByText('An unexpected error occurred')).toBeInTheDocument();
408
408
  });
409
409
  });
410
410
 
@@ -1,7 +1,7 @@
1
1
  /**
2
2
  * @file Password Change Form Component
3
3
  * @package @jmruthers/pace-core
4
- * @module Components/PasswordReset
4
+ * @module Components/PasswordChange
5
5
  * @since 0.1.0
6
6
  *
7
7
  * A secure password change form component with validation, confirmation matching,
@@ -108,8 +108,13 @@ export interface PasswordChangeFormValues {
108
108
  confirmPassword: string;
109
109
  }
110
110
 
111
+ export interface PasswordChangeFormError {
112
+ message?: string;
113
+ code?: string;
114
+ }
115
+
111
116
  export interface PasswordChangeFormProps {
112
- onSubmit: (values: PasswordChangeFormValues) => Promise<{ error?: any }>;
117
+ onSubmit: (values: PasswordChangeFormValues) => Promise<{ error?: PasswordChangeFormError }>;
113
118
  className?: string;
114
119
  }
115
120
 
@@ -138,8 +143,9 @@ export function PasswordChangeForm({ onSubmit, className }: PasswordChangeFormPr
138
143
  if (result && result.error) {
139
144
  setError(result.error.message || 'Failed to change password.');
140
145
  }
141
- } catch (err: any) {
142
- setError(err?.message || 'An unexpected error occurred.');
146
+ } catch (err) {
147
+ const errorObj = err instanceof Error ? err : new Error('An unexpected error occurred');
148
+ setError(errorObj.message);
143
149
  } finally {
144
150
  setIsSubmitting(false);
145
151
  }
@@ -0,0 +1,2 @@
1
+ export { PasswordChangeForm } from './PasswordChangeForm';
2
+ export type { PasswordChangeFormProps, PasswordChangeFormValues, PasswordChangeFormError } from './PasswordChangeForm';
@@ -28,6 +28,17 @@ describe('[component] Progress', () => {
28
28
  expect(indicator.style.transform).toContain('translateX(-20%)');
29
29
  });
30
30
 
31
+ it('calculates transform correctly with custom max value', () => {
32
+ const { rerender } = renderWithProviders(<Progress value={40} max={200} />);
33
+ // 40/200 = 20%, so transform should be translateX(-80%)
34
+ const indicator = screen.getByRole('progressbar').firstElementChild as HTMLElement;
35
+ expect(indicator.style.transform).toContain('translateX(-80%)');
36
+
37
+ rerender(<Progress value={150} max={200} />);
38
+ // 150/200 = 75%, so transform should be translateX(-25%)
39
+ expect(indicator.style.transform).toContain('translateX(-25%)');
40
+ });
41
+
31
42
  it('supports indeterminate state when no value is provided (no aria-valuenow)', () => {
32
43
  renderWithProviders(<Progress />);
33
44
  const progressbar = screen.getByRole('progressbar');
@@ -106,7 +106,7 @@ const Progress = React.forwardRef<
106
106
  >
107
107
  <ProgressPrimitive.Indicator
108
108
  className="h-full w-full flex-1 bg-primary transition-all"
109
- style={{ transform: `translateX(-${100 - (value || 0)}%)` }}
109
+ style={{ transform: `translateX(-${100 - ((value || 0) / max * 100)}%)` }}
110
110
  />
111
111
  </ProgressPrimitive.Root>
112
112
  ));
@@ -0,0 +1,10 @@
1
+ /**
2
+ * @file Progress component exports
3
+ * @package @jmruthers/pace-core
4
+ * @module Progress
5
+ * @since 0.1.0
6
+ */
7
+
8
+ export { Progress } from './Progress';
9
+ export type { ProgressProps } from './Progress';
10
+
@@ -458,7 +458,8 @@ describe('ProtectedRoute Component', () => {
458
458
  it('handles null events array', () => {
459
459
  mockUseEvents.mockReturnValue({
460
460
  selectedEvent: null,
461
- events: null as any,
461
+ // @ts-expect-error - Testing runtime null case that component handles
462
+ events: null,
462
463
  isLoading: false,
463
464
  });
464
465