@jmruthers/pace-core 0.5.193 → 0.6.2

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 (577) hide show
  1. package/CHANGELOG.md +62 -0
  2. package/README.md +7 -1
  3. package/cursor-rules/00-pace-core-compliance.mdc +299 -0
  4. package/cursor-rules/01-standards-compliance.mdc +244 -0
  5. package/cursor-rules/02-project-structure.mdc +200 -0
  6. package/cursor-rules/03-solid-principles.mdc +222 -0
  7. package/cursor-rules/04-testing-standards.mdc +268 -0
  8. package/cursor-rules/05-bug-reports-and-features.mdc +246 -0
  9. package/cursor-rules/06-code-quality.mdc +309 -0
  10. package/cursor-rules/07-tech-stack-compliance.mdc +214 -0
  11. package/cursor-rules/08-markup-quality.mdc +452 -0
  12. package/cursor-rules/CHANGELOG.md +119 -0
  13. package/cursor-rules/README.md +192 -0
  14. package/dist/{AuthService-DjnJHDtC.d.ts → AuthService-BPvc3Ka0.d.ts} +54 -0
  15. package/dist/{DataTable-Be6dH_dR.d.ts → DataTable-BMRU8a1j.d.ts} +34 -2
  16. package/dist/{DataTable-5FU7IESH.js → DataTable-TPTKCX4D.js} +10 -9
  17. package/dist/{PublicPageProvider-C0Sm_e5k.d.ts → PublicPageProvider-DC6kCaqf.d.ts} +385 -261
  18. package/dist/{UnifiedAuthProvider-RGJTDE2C.js → UnifiedAuthProvider-CH6Z342H.js} +3 -3
  19. package/dist/{UnifiedAuthProvider-185Ih4dj.d.ts → UnifiedAuthProvider-CVcTjx-d.d.ts} +29 -0
  20. package/dist/{api-N774RPUA.js → api-MVVQZLJI.js} +2 -2
  21. package/dist/{chunk-KNC55RTG.js → chunk-24UVZUZG.js} +90 -54
  22. package/dist/chunk-24UVZUZG.js.map +1 -0
  23. package/dist/{chunk-HWIIPPNI.js → chunk-2UOI2FG5.js} +20 -20
  24. package/dist/chunk-2UOI2FG5.js.map +1 -0
  25. package/dist/{chunk-E3SPN4VZ 5.js → chunk-3XC4CPTD.js} +4345 -3986
  26. package/dist/chunk-3XC4CPTD.js.map +1 -0
  27. package/dist/{chunk-7EQTDTTJ.js → chunk-6J4GEEJR.js} +172 -45
  28. package/dist/chunk-6J4GEEJR.js.map +1 -0
  29. package/dist/{chunk-6C4YBBJM 5.js → chunk-6SOIHG6Z.js} +1 -1
  30. package/dist/chunk-6SOIHG6Z.js.map +1 -0
  31. package/dist/{chunk-7FLMSG37.js → chunk-EHMR7VYL.js} +25 -25
  32. package/dist/chunk-EHMR7VYL.js.map +1 -0
  33. package/dist/{chunk-I7PSE6JW.js → chunk-F2IMUDXZ.js} +2 -75
  34. package/dist/chunk-F2IMUDXZ.js.map +1 -0
  35. package/dist/{chunk-QWWZ5CAQ.js → chunk-FFQEQTNW.js} +7 -9
  36. package/dist/chunk-FFQEQTNW.js.map +1 -0
  37. package/dist/chunk-FMUCXFII.js +76 -0
  38. package/dist/chunk-FMUCXFII.js.map +1 -0
  39. package/dist/{chunk-HW3OVDUF.js → chunk-J36DSWQK.js} +1 -1
  40. package/dist/{chunk-HW3OVDUF.js.map → chunk-J36DSWQK.js.map} +1 -1
  41. package/dist/{chunk-SQGMNID3.js → chunk-L4OXEN46.js} +4 -5
  42. package/dist/chunk-L4OXEN46.js.map +1 -0
  43. package/dist/{chunk-R77UEZ4E 3.js → chunk-M43Y4SSO.js} +1 -1
  44. package/dist/chunk-M43Y4SSO.js.map +1 -0
  45. package/dist/{chunk-IIELH4DL.js → chunk-MMZ7JXPU.js} +60 -223
  46. package/dist/chunk-MMZ7JXPU.js.map +1 -0
  47. package/dist/{chunk-NOAYCWCX 5.js → chunk-NECFR5MM.js} +394 -312
  48. package/dist/chunk-NECFR5MM.js.map +1 -0
  49. package/dist/{chunk-BC4IJKSL.js → chunk-SFZUDBL5.js} +40 -4
  50. package/dist/chunk-SFZUDBL5.js.map +1 -0
  51. package/dist/{chunk-XNXXZ43G.js → chunk-XWQCNGTQ.js} +748 -364
  52. package/dist/chunk-XWQCNGTQ.js.map +1 -0
  53. package/dist/components.d.ts +6 -6
  54. package/dist/components.js +15 -12
  55. package/dist/components.js.map +1 -1
  56. package/dist/{functions-D_kgHktt.d.ts → functions-DHebl8-F.d.ts} +1 -1
  57. package/dist/hooks.d.ts +59 -126
  58. package/dist/hooks.js +19 -28
  59. package/dist/hooks.js.map +1 -1
  60. package/dist/index.d.ts +63 -16
  61. package/dist/index.js +23 -24
  62. package/dist/index.js.map +1 -1
  63. package/dist/providers.d.ts +21 -3
  64. package/dist/providers.js +2 -2
  65. package/dist/rbac/index.d.ts +146 -115
  66. package/dist/rbac/index.js +8 -11
  67. package/dist/theming/runtime.d.ts +1 -13
  68. package/dist/theming/runtime.js +1 -1
  69. package/dist/{timezone-_pgH8qrY.d.ts → timezone-CHhWg6b4.d.ts} +3 -10
  70. package/dist/{types-UU913iLA.d.ts → types-BeoeWV5I.d.ts} +8 -0
  71. package/dist/{types-CEpcvwwF.d.ts → types-CkbwOr4Y.d.ts} +6 -0
  72. package/dist/types.d.ts +2 -2
  73. package/dist/{usePublicRouteParams-TZe0gy-4.d.ts → usePublicRouteParams-1oMokgLF.d.ts} +34 -4
  74. package/dist/{useToast-C8gR5ir4.d.ts → useToast-AyaT-x7p.d.ts} +2 -2
  75. package/dist/utils.d.ts +4 -5
  76. package/dist/utils.js +15 -15
  77. package/dist/utils.js.map +1 -1
  78. package/docs/api/README.md +7 -1
  79. package/docs/api/classes/ColumnFactory.md +8 -8
  80. package/docs/api/classes/InvalidScopeError.md +4 -4
  81. package/docs/api/classes/Logger.md +1 -1
  82. package/docs/api/classes/MissingUserContextError.md +4 -4
  83. package/docs/api/classes/OrganisationContextRequiredError.md +4 -4
  84. package/docs/api/classes/PermissionDeniedError.md +4 -4
  85. package/docs/api/classes/RBACAuditManager.md +1 -1
  86. package/docs/api/classes/RBACCache.md +1 -1
  87. package/docs/api/classes/RBACEngine.md +1 -1
  88. package/docs/api/classes/RBACError.md +4 -4
  89. package/docs/api/classes/RBACNotInitializedError.md +4 -4
  90. package/docs/api/classes/SecureSupabaseClient.md +18 -15
  91. package/docs/api/classes/StorageUtils.md +1 -1
  92. package/docs/api/enums/FileCategory.md +1 -1
  93. package/docs/api/enums/LogLevel.md +1 -1
  94. package/docs/api/enums/RBACErrorCode.md +1 -1
  95. package/docs/api/enums/RPCFunction.md +1 -1
  96. package/docs/api/interfaces/AddressFieldProps.md +1 -1
  97. package/docs/api/interfaces/AddressFieldRef.md +1 -1
  98. package/docs/api/interfaces/AggregateConfig.md +4 -4
  99. package/docs/api/interfaces/AutocompleteOptions.md +1 -1
  100. package/docs/api/interfaces/AvatarProps.md +1 -1
  101. package/docs/api/interfaces/BadgeProps.md +9 -2
  102. package/docs/api/interfaces/ButtonProps.md +7 -4
  103. package/docs/api/interfaces/CalendarProps.md +8 -5
  104. package/docs/api/interfaces/CardProps.md +8 -5
  105. package/docs/api/interfaces/ColorPalette.md +1 -1
  106. package/docs/api/interfaces/ColorShade.md +1 -1
  107. package/docs/api/interfaces/ComplianceResult.md +1 -1
  108. package/docs/api/interfaces/DataAccessRecord.md +9 -9
  109. package/docs/api/interfaces/DataRecord.md +1 -1
  110. package/docs/api/interfaces/DataTableAction.md +24 -21
  111. package/docs/api/interfaces/DataTableColumn.md +31 -31
  112. package/docs/api/interfaces/DataTableProps.md +1 -1
  113. package/docs/api/interfaces/DataTableToolbarButton.md +7 -7
  114. package/docs/api/interfaces/DatabaseComplianceResult.md +1 -1
  115. package/docs/api/interfaces/DatabaseIssue.md +1 -1
  116. package/docs/api/interfaces/EmptyStateConfig.md +5 -5
  117. package/docs/api/interfaces/EnhancedNavigationMenuProps.md +1 -1
  118. package/docs/api/interfaces/ErrorBoundaryProps.md +147 -0
  119. package/docs/api/interfaces/ErrorBoundaryProviderProps.md +36 -0
  120. package/docs/api/interfaces/ErrorBoundaryState.md +75 -0
  121. package/docs/api/interfaces/EventAppRoleData.md +1 -1
  122. package/docs/api/interfaces/ExportColumn.md +1 -1
  123. package/docs/api/interfaces/ExportOptions.md +8 -8
  124. package/docs/api/interfaces/FileDisplayProps.md +1 -1
  125. package/docs/api/interfaces/FileMetadata.md +1 -1
  126. package/docs/api/interfaces/FileReference.md +1 -1
  127. package/docs/api/interfaces/FileSizeLimits.md +1 -1
  128. package/docs/api/interfaces/FileUploadOptions.md +1 -1
  129. package/docs/api/interfaces/FileUploadProps.md +26 -23
  130. package/docs/api/interfaces/FooterProps.md +10 -8
  131. package/docs/api/interfaces/FormFieldProps.md +10 -10
  132. package/docs/api/interfaces/FormProps.md +1 -1
  133. package/docs/api/interfaces/GrantEventAppRoleParams.md +1 -1
  134. package/docs/api/interfaces/InactivityWarningModalProps.md +1 -1
  135. package/docs/api/interfaces/InputProps.md +7 -4
  136. package/docs/api/interfaces/LabelProps.md +1 -1
  137. package/docs/api/interfaces/LoggerConfig.md +1 -1
  138. package/docs/api/interfaces/LoginFormProps.md +14 -11
  139. package/docs/api/interfaces/NavigationAccessRecord.md +1 -1
  140. package/docs/api/interfaces/NavigationContextType.md +1 -1
  141. package/docs/api/interfaces/NavigationGuardProps.md +1 -1
  142. package/docs/api/interfaces/NavigationItem.md +11 -11
  143. package/docs/api/interfaces/NavigationMenuProps.md +15 -15
  144. package/docs/api/interfaces/NavigationProviderProps.md +1 -1
  145. package/docs/api/interfaces/Organisation.md +1 -1
  146. package/docs/api/interfaces/OrganisationContextType.md +1 -1
  147. package/docs/api/interfaces/OrganisationMembership.md +1 -1
  148. package/docs/api/interfaces/OrganisationProviderProps.md +1 -1
  149. package/docs/api/interfaces/OrganisationSecurityError.md +1 -1
  150. package/docs/api/interfaces/PaceAppLayoutProps.md +30 -27
  151. package/docs/api/interfaces/PaceLoginPageProps.md +6 -4
  152. package/docs/api/interfaces/PageAccessRecord.md +1 -1
  153. package/docs/api/interfaces/PagePermissionContextType.md +1 -1
  154. package/docs/api/interfaces/PagePermissionGuardProps.md +1 -1
  155. package/docs/api/interfaces/PagePermissionProviderProps.md +1 -1
  156. package/docs/api/interfaces/PaletteData.md +1 -1
  157. package/docs/api/interfaces/ParsedAddress.md +1 -1
  158. package/docs/api/interfaces/PermissionEnforcerProps.md +1 -1
  159. package/docs/api/interfaces/ProgressProps.md +1 -1
  160. package/docs/api/interfaces/ProtectedRouteProps.md +7 -26
  161. package/docs/api/interfaces/PublicPageFooterProps.md +9 -9
  162. package/docs/api/interfaces/PublicPageHeaderProps.md +10 -10
  163. package/docs/api/interfaces/PublicPageLayoutProps.md +7 -20
  164. package/docs/api/interfaces/QuickFix.md +1 -1
  165. package/docs/api/interfaces/RBACAccessValidateParams.md +1 -1
  166. package/docs/api/interfaces/RBACAccessValidateResult.md +1 -1
  167. package/docs/api/interfaces/RBACAuditLogParams.md +1 -1
  168. package/docs/api/interfaces/RBACAuditLogResult.md +1 -1
  169. package/docs/api/interfaces/RBACConfig.md +1 -1
  170. package/docs/api/interfaces/RBACContext.md +1 -1
  171. package/docs/api/interfaces/RBACLogger.md +1 -1
  172. package/docs/api/interfaces/RBACPageAccessCheckParams.md +1 -1
  173. package/docs/api/interfaces/RBACPerformanceMetrics.md +1 -1
  174. package/docs/api/interfaces/RBACPermissionCheckParams.md +1 -1
  175. package/docs/api/interfaces/RBACPermissionCheckResult.md +1 -1
  176. package/docs/api/interfaces/RBACPermissionsGetParams.md +1 -1
  177. package/docs/api/interfaces/RBACPermissionsGetResult.md +1 -1
  178. package/docs/api/interfaces/RBACResult.md +1 -1
  179. package/docs/api/interfaces/RBACRoleGrantParams.md +1 -1
  180. package/docs/api/interfaces/RBACRoleGrantResult.md +1 -1
  181. package/docs/api/interfaces/RBACRoleRevokeParams.md +1 -1
  182. package/docs/api/interfaces/RBACRoleRevokeResult.md +1 -1
  183. package/docs/api/interfaces/RBACRoleValidateParams.md +1 -1
  184. package/docs/api/interfaces/RBACRoleValidateResult.md +1 -1
  185. package/docs/api/interfaces/RBACRolesListParams.md +1 -1
  186. package/docs/api/interfaces/RBACRolesListResult.md +1 -1
  187. package/docs/api/interfaces/RBACSessionTrackParams.md +1 -1
  188. package/docs/api/interfaces/RBACSessionTrackResult.md +1 -1
  189. package/docs/api/interfaces/ResourcePermissions.md +1 -1
  190. package/docs/api/interfaces/RevokeEventAppRoleParams.md +1 -1
  191. package/docs/api/interfaces/RoleBasedRouterContextType.md +1 -1
  192. package/docs/api/interfaces/RoleBasedRouterProps.md +1 -1
  193. package/docs/api/interfaces/RoleManagementResult.md +1 -1
  194. package/docs/api/interfaces/RouteAccessRecord.md +1 -1
  195. package/docs/api/interfaces/RouteConfig.md +1 -1
  196. package/docs/api/interfaces/RuntimeComplianceResult.md +1 -1
  197. package/docs/api/interfaces/SecureDataContextType.md +9 -9
  198. package/docs/api/interfaces/SecureDataProviderProps.md +8 -8
  199. package/docs/api/interfaces/SessionRestorationLoaderProps.md +3 -3
  200. package/docs/api/interfaces/SetupIssue.md +1 -1
  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 +3 -3
  215. package/docs/api/interfaces/TextareaProps.md +1 -1
  216. package/docs/api/interfaces/ToastActionElement.md +4 -1
  217. package/docs/api/interfaces/ToastProps.md +1 -1
  218. package/docs/api/interfaces/UnifiedAuthContextType.md +58 -55
  219. package/docs/api/interfaces/UnifiedAuthProviderProps.md +15 -13
  220. package/docs/api/interfaces/UseFormDialogOptions.md +1 -1
  221. package/docs/api/interfaces/UseFormDialogReturn.md +1 -1
  222. package/docs/api/interfaces/UseInactivityTrackerOptions.md +11 -9
  223. package/docs/api/interfaces/UseInactivityTrackerReturn.md +8 -8
  224. package/docs/api/interfaces/UsePublicEventLogoOptions.md +6 -6
  225. package/docs/api/interfaces/UsePublicEventLogoReturn.md +9 -6
  226. package/docs/api/interfaces/UsePublicEventOptions.md +3 -3
  227. package/docs/api/interfaces/UsePublicEventReturn.md +8 -5
  228. package/docs/api/interfaces/UsePublicFileDisplayOptions.md +4 -4
  229. package/docs/api/interfaces/UsePublicFileDisplayReturn.md +12 -9
  230. package/docs/api/interfaces/UsePublicRouteParamsReturn.md +10 -7
  231. package/docs/api/interfaces/UseResolvedScopeOptions.md +1 -1
  232. package/docs/api/interfaces/UseResolvedScopeReturn.md +1 -1
  233. package/docs/api/interfaces/UseResourcePermissionsOptions.md +1 -1
  234. package/docs/api/interfaces/UserEventAccess.md +14 -11
  235. package/docs/api/interfaces/UserMenuProps.md +8 -6
  236. package/docs/api/interfaces/UserProfile.md +1 -1
  237. package/docs/api/modules.md +575 -634
  238. package/docs/architecture/database-schema-requirements.md +161 -0
  239. package/docs/core-concepts/rbac-system.md +3 -3
  240. package/docs/documentation-index.md +2 -4
  241. package/docs/getting-started/cursor-rules.md +263 -0
  242. package/docs/getting-started/installation-guide.md +6 -1
  243. package/docs/getting-started/quick-start.md +6 -1
  244. package/docs/migration/DOCUMENTATION_STRUCTURE.md +441 -0
  245. package/docs/migration/MIGRATION_GUIDE.md +6 -28
  246. package/docs/migration/README.md +52 -6
  247. package/docs/migration/V0.5.190_TO_V0.6.1_MIGRATION.md +1153 -0
  248. package/docs/migration/V0.6.0_REACT_19_MIGRATION.md +227 -0
  249. package/docs/migration/database-changes-december-2025.md +3 -3
  250. package/docs/rbac/event-based-apps.md +1 -1
  251. package/docs/rbac/getting-started.md +1 -1
  252. package/docs/rbac/quick-start.md +1 -1
  253. package/docs/standards/README.md +40 -0
  254. package/docs/troubleshooting/migration.md +4 -4
  255. package/examples/PublicPages/PublicEventPage.tsx +1 -1
  256. package/package.json +12 -6
  257. package/scripts/audit/core/checks/accessibility.cjs +197 -0
  258. package/scripts/audit/core/checks/api-usage.cjs +191 -0
  259. package/scripts/audit/core/checks/bundle.cjs +142 -0
  260. package/scripts/{check-pace-core-compliance.cjs → audit/core/checks/compliance.cjs} +737 -691
  261. package/scripts/audit/core/checks/config.cjs +54 -0
  262. package/scripts/audit/core/checks/coverage.cjs +84 -0
  263. package/scripts/audit/core/checks/dependencies.cjs +454 -0
  264. package/scripts/audit/core/checks/documentation.cjs +203 -0
  265. package/scripts/audit/core/checks/environment.cjs +128 -0
  266. package/scripts/audit/core/checks/error-handling.cjs +299 -0
  267. package/scripts/audit/core/checks/forms.cjs +172 -0
  268. package/scripts/audit/core/checks/heuristics.cjs +68 -0
  269. package/scripts/audit/core/checks/hooks.cjs +334 -0
  270. package/scripts/audit/core/checks/imports.cjs +244 -0
  271. package/scripts/audit/core/checks/performance.cjs +325 -0
  272. package/scripts/audit/core/checks/routes.cjs +117 -0
  273. package/scripts/audit/core/checks/state.cjs +130 -0
  274. package/scripts/audit/core/checks/structure.cjs +65 -0
  275. package/scripts/audit/core/checks/style.cjs +584 -0
  276. package/scripts/audit/core/checks/testing.cjs +122 -0
  277. package/scripts/audit/core/checks/typescript.cjs +61 -0
  278. package/scripts/audit/core/scanner.cjs +199 -0
  279. package/scripts/audit/core/utils.cjs +137 -0
  280. package/scripts/audit/index.cjs +223 -0
  281. package/scripts/audit/reporters/console.cjs +151 -0
  282. package/scripts/audit/reporters/json.cjs +54 -0
  283. package/scripts/audit/reporters/markdown.cjs +124 -0
  284. package/scripts/audit-consuming-app.cjs +86 -0
  285. package/scripts/build-docs/build-decision.js +240 -0
  286. package/scripts/build-docs/cache-utils.js +105 -0
  287. package/scripts/build-docs/content-normalization.js +150 -0
  288. package/scripts/build-docs/file-utils.js +105 -0
  289. package/scripts/build-docs/git-utils.js +86 -0
  290. package/scripts/build-docs/hash-utils.js +116 -0
  291. package/scripts/build-docs/typedoc-runner.js +220 -0
  292. package/scripts/build-docs-incremental.js +77 -913
  293. package/scripts/install-cursor-rules.cjs +236 -0
  294. package/scripts/utils/command-runner.js +16 -11
  295. package/scripts/validate-formats.js +61 -56
  296. package/scripts/validate-master.js +74 -69
  297. package/scripts/validate-pre-publish.js +70 -65
  298. package/src/__tests__/helpers/test-providers.tsx +1 -1
  299. package/src/__tests__/helpers/test-utils.tsx +1 -1
  300. package/src/__tests__/hooks/usePermissions.test.ts +2 -2
  301. package/src/components/Alert/Alert.test.tsx +12 -18
  302. package/src/components/Alert/Alert.tsx +5 -7
  303. package/src/components/Avatar/Avatar.test.tsx +4 -4
  304. package/src/components/Badge/Badge.tsx +16 -4
  305. package/src/components/Button/Button.tsx +27 -4
  306. package/src/components/Calendar/Calendar.tsx +9 -3
  307. package/src/components/Card/Card.tsx +4 -0
  308. package/src/components/Checkbox/Checkbox.test.tsx +12 -12
  309. package/src/components/Checkbox/Checkbox.tsx +2 -2
  310. package/src/components/DataTable/DataTable.test.tsx +57 -93
  311. package/src/components/DataTable/DataTable.tsx +40 -6
  312. package/src/components/DataTable/__tests__/DataTableCore.test-setup.ts +5 -6
  313. package/src/components/DataTable/__tests__/pagination.modes.test.tsx +29 -7
  314. package/src/components/DataTable/__tests__/ssr.strict-mode.test.tsx +12 -12
  315. package/src/components/DataTable/__tests__/test-utils/sharedTestUtils.tsx +2 -3
  316. package/src/components/DataTable/components/AccessDeniedPage.tsx +17 -26
  317. package/src/components/DataTable/components/ActionButtons.tsx +10 -7
  318. package/src/components/DataTable/components/BulkOperationsDropdown.tsx +2 -2
  319. package/src/components/DataTable/components/ColumnFilter.tsx +10 -0
  320. package/src/components/DataTable/components/ColumnVisibilityDropdown.tsx +12 -0
  321. package/src/components/DataTable/components/DataTableBody.tsx +8 -0
  322. package/src/components/DataTable/components/DataTableCore.tsx +200 -561
  323. package/src/components/DataTable/components/DataTableErrorBoundary.tsx +11 -0
  324. package/src/components/DataTable/components/DataTableLayout.tsx +559 -0
  325. package/src/components/DataTable/components/DataTableModals.tsx +9 -1
  326. package/src/components/DataTable/components/DataTableToolbar.tsx +8 -0
  327. package/src/components/DataTable/components/DraggableColumnHeader.tsx +12 -0
  328. package/src/components/DataTable/components/EditFields.tsx +307 -0
  329. package/src/components/DataTable/components/EditableRow.tsx +9 -1
  330. package/src/components/DataTable/components/EmptyState.tsx +10 -0
  331. package/src/components/DataTable/components/FilterRow.tsx +12 -0
  332. package/src/components/DataTable/components/GroupHeader.tsx +12 -0
  333. package/src/components/DataTable/components/GroupingDropdown.tsx +12 -0
  334. package/src/components/DataTable/components/ImportModal.tsx +7 -0
  335. package/src/components/DataTable/components/LoadingState.tsx +6 -0
  336. package/src/components/DataTable/components/PaginationControls.tsx +16 -1
  337. package/src/components/DataTable/components/RowComponent.tsx +391 -0
  338. package/src/components/DataTable/components/UnifiedTableBody.tsx +62 -852
  339. package/src/components/DataTable/components/VirtualizedDataTable.tsx +16 -4
  340. package/src/components/DataTable/components/__tests__/AccessDeniedPage.test.tsx +4 -2
  341. package/src/components/DataTable/components/__tests__/DataTableModals.test.tsx +23 -23
  342. package/src/components/DataTable/components/__tests__/EditableRow.test.tsx +11 -11
  343. package/src/components/DataTable/components/__tests__/ExpandButton.test.tsx +36 -36
  344. package/src/components/DataTable/components/__tests__/GroupHeader.test.tsx +27 -27
  345. package/src/components/DataTable/components/__tests__/ImportModal.test.tsx +39 -39
  346. package/src/components/DataTable/components/__tests__/UnifiedTableBody.test.tsx +33 -33
  347. package/src/components/DataTable/components/__tests__/ViewRowModal.test.tsx +29 -29
  348. package/src/components/DataTable/components/cellValueUtils.ts +40 -0
  349. package/src/components/DataTable/components/hooks/useImportModalFocus.ts +53 -0
  350. package/src/components/DataTable/components/hooks/usePermissionTracking.ts +126 -0
  351. package/src/components/DataTable/context/DataTableContext.tsx +50 -0
  352. package/src/components/DataTable/core/ColumnFactory.ts +31 -0
  353. package/src/components/DataTable/core/DataTableContext.tsx +32 -1
  354. package/src/components/DataTable/hooks/useColumnOrderPersistence.ts +10 -0
  355. package/src/components/DataTable/hooks/useColumnReordering.ts +14 -2
  356. package/src/components/DataTable/hooks/useColumnVisibilityPersistence.ts +10 -0
  357. package/src/components/DataTable/hooks/useDataTableDataPipeline.ts +16 -0
  358. package/src/components/DataTable/hooks/useDataTablePermissions.ts +124 -32
  359. package/src/components/DataTable/hooks/useDataTableState.ts +35 -1
  360. package/src/components/DataTable/hooks/useEffectiveColumnOrder.ts +12 -0
  361. package/src/components/DataTable/hooks/useKeyboardNavigation.ts +2 -2
  362. package/src/components/DataTable/hooks/useServerSideDataEffect.ts +11 -0
  363. package/src/components/DataTable/hooks/useTableColumns.ts +8 -0
  364. package/src/components/DataTable/hooks/useTableHandlers.ts +14 -0
  365. package/src/components/DataTable/styles.ts +6 -6
  366. package/src/components/DataTable/types.ts +6 -10
  367. package/src/components/DataTable/utils/a11yUtils.ts +7 -0
  368. package/src/components/DataTable/utils/debugTools.ts +18 -113
  369. package/src/components/DataTable/utils/errorHandling.ts +12 -0
  370. package/src/components/DataTable/utils/exportUtils.ts +9 -0
  371. package/src/components/DataTable/utils/flexibleImport.ts +12 -48
  372. package/src/components/DataTable/utils/paginationUtils.ts +8 -0
  373. package/src/components/DataTable/utils/performanceUtils.ts +5 -1
  374. package/src/components/DatePickerWithTimezone/DatePickerWithTimezone.test.tsx +8 -14
  375. package/src/components/Dialog/Dialog.tsx +8 -7
  376. package/src/components/ErrorBoundary/ErrorBoundary.test.tsx +180 -1
  377. package/src/components/ErrorBoundary/ErrorBoundary.tsx +46 -6
  378. package/src/components/ErrorBoundary/ErrorBoundaryContext.tsx +129 -0
  379. package/src/components/ErrorBoundary/index.ts +27 -2
  380. package/src/components/EventSelector/EventSelector.tsx +4 -1
  381. package/src/components/FileDisplay/FileDisplay.test.tsx +2 -2
  382. package/src/components/FileDisplay/FileDisplay.tsx +32 -18
  383. package/src/components/FileUpload/FileUpload.tsx +22 -2
  384. package/src/components/Footer/Footer.test.tsx +16 -16
  385. package/src/components/Footer/Footer.tsx +15 -12
  386. package/src/components/Form/Form.test.tsx +36 -15
  387. package/src/components/Form/Form.tsx +31 -26
  388. package/src/components/Header/Header.tsx +22 -11
  389. package/src/components/InactivityWarningModal/InactivityWarningModal.test.tsx +40 -40
  390. package/src/components/InactivityWarningModal/InactivityWarningModal.tsx +1 -1
  391. package/src/components/Input/Input.test.tsx +2 -2
  392. package/src/components/Input/Input.tsx +36 -34
  393. package/src/components/Label/Label.tsx +1 -1
  394. package/src/components/LoadingSpinner/LoadingSpinner.test.tsx +4 -4
  395. package/src/components/LoadingSpinner/LoadingSpinner.tsx +1 -1
  396. package/src/components/LoginForm/LoginForm.test.tsx +42 -42
  397. package/src/components/LoginForm/LoginForm.tsx +12 -8
  398. package/src/components/NavigationMenu/NavigationMenu.tsx +15 -514
  399. package/src/components/NavigationMenu/types.ts +56 -0
  400. package/src/components/NavigationMenu/useNavigationFiltering.ts +390 -0
  401. package/src/components/OrganisationSelector/OrganisationSelector.tsx +3 -0
  402. package/src/components/PaceAppLayout/PaceAppLayout.performance.test.tsx +1 -1
  403. package/src/components/PaceAppLayout/PaceAppLayout.test.tsx +54 -52
  404. package/src/components/PaceAppLayout/PaceAppLayout.tsx +33 -12
  405. package/src/components/PaceAppLayout/README.md +1 -1
  406. package/src/components/PaceAppLayout/test-setup.tsx +1 -2
  407. package/src/components/PaceLoginPage/PaceLoginPage.tsx +4 -1
  408. package/src/components/PasswordChange/PasswordChangeForm.test.tsx +33 -33
  409. package/src/components/PasswordChange/PasswordChangeForm.tsx +10 -1
  410. package/src/components/Progress/Progress.tsx +1 -1
  411. package/src/components/ProtectedRoute/ProtectedRoute.tsx +3 -9
  412. package/src/components/PublicLayout/PublicPageLayout.tsx +3 -6
  413. package/src/components/PublicLayout/PublicPageProvider.tsx +4 -0
  414. package/src/components/Select/Select.tsx +95 -438
  415. package/src/components/Select/context.ts +23 -0
  416. package/src/components/Select/hooks/useSelectEvents.ts +87 -0
  417. package/src/components/Select/hooks/useSelectSearch.ts +91 -0
  418. package/src/components/Select/hooks/useSelectState.ts +104 -0
  419. package/src/components/Select/index.ts +9 -1
  420. package/src/components/Select/types.ts +123 -0
  421. package/src/components/Select/utils/text.ts +26 -0
  422. package/src/components/SessionRestorationLoader/SessionRestorationLoader.tsx +5 -6
  423. package/src/components/Switch/Switch.tsx +4 -4
  424. package/src/components/Table/Table.tsx +1 -1
  425. package/src/components/Tabs/Tabs.tsx +1 -1
  426. package/src/components/Textarea/Textarea.tsx +27 -29
  427. package/src/components/Toast/Toast.tsx +5 -1
  428. package/src/components/Tooltip/Tooltip.tsx +3 -3
  429. package/src/components/UserMenu/UserMenu.test.tsx +24 -11
  430. package/src/components/UserMenu/UserMenu.tsx +22 -19
  431. package/src/components/index.ts +2 -2
  432. package/src/hooks/__tests__/hooks.integration.test.tsx +80 -55
  433. package/src/hooks/__tests__/index.unit.test.ts +2 -5
  434. package/src/hooks/__tests__/useStorage.unit.test.ts +36 -36
  435. package/src/hooks/index.ts +1 -2
  436. package/src/hooks/public/usePublicEvent.ts +5 -1
  437. package/src/hooks/public/usePublicEventLogo.ts +5 -1
  438. package/src/hooks/public/usePublicFileDisplay.ts +4 -0
  439. package/src/hooks/public/usePublicRouteParams.ts +5 -1
  440. package/src/hooks/services/useAuth.ts +32 -0
  441. package/src/hooks/services/useCurrentEvent.ts +6 -0
  442. package/src/hooks/services/useCurrentOrganisation.ts +6 -0
  443. package/src/hooks/useDataTableState.ts +8 -18
  444. package/src/hooks/useDebounce.ts +9 -0
  445. package/src/hooks/useEventTheme.ts +6 -0
  446. package/src/hooks/useFileDisplay.ts +4 -0
  447. package/src/hooks/useFileReference.ts +25 -7
  448. package/src/hooks/useFileUrl.ts +11 -1
  449. package/src/hooks/useFocusManagement.ts +16 -2
  450. package/src/hooks/useFocusTrap.ts +7 -4
  451. package/src/hooks/useFormDialog.ts +8 -7
  452. package/src/hooks/useInactivityTracker.ts +4 -1
  453. package/src/hooks/useKeyboardShortcuts.ts +4 -0
  454. package/src/hooks/useOrganisationPermissions.ts +4 -0
  455. package/src/hooks/useOrganisationSecurity.ts +4 -0
  456. package/src/hooks/usePerformanceMonitor.ts +4 -0
  457. package/src/hooks/usePermissionCache.ts +8 -1
  458. package/src/hooks/useQueryCache.ts +12 -1
  459. package/src/hooks/useSessionRestoration.ts +4 -0
  460. package/src/hooks/useStorage.ts +4 -0
  461. package/src/hooks/useToast.ts +3 -3
  462. package/src/index.ts +2 -1
  463. package/src/providers/__tests__/OrganisationProvider.test.tsx +115 -49
  464. package/src/providers/__tests__/ProviderLifecycle.test.tsx +21 -6
  465. package/src/providers/__tests__/UnifiedAuthProvider.test.tsx +10 -10
  466. package/src/providers/services/AuthServiceProvider.tsx +18 -0
  467. package/src/providers/services/EventServiceProvider.tsx +18 -0
  468. package/src/providers/services/InactivityServiceProvider.tsx +18 -0
  469. package/src/providers/services/OrganisationServiceProvider.tsx +18 -0
  470. package/src/providers/services/UnifiedAuthProvider.tsx +58 -22
  471. package/src/providers/services/__tests__/AuthServiceProvider.integration.test.tsx +33 -7
  472. package/src/rbac/README.md +1 -1
  473. package/src/rbac/__tests__/adapters.comprehensive.test.tsx +26 -26
  474. package/src/rbac/__tests__/scenarios.user-role.test.tsx +4 -5
  475. package/src/rbac/adapters.tsx +14 -5
  476. package/src/rbac/api.ts +100 -67
  477. package/src/rbac/components/EnhancedNavigationMenu.tsx +1 -1
  478. package/src/rbac/components/NavigationGuard.tsx +1 -1
  479. package/src/rbac/components/NavigationProvider.tsx +5 -2
  480. package/src/rbac/components/PagePermissionGuard.tsx +158 -18
  481. package/src/rbac/components/PagePermissionProvider.tsx +1 -1
  482. package/src/rbac/components/PermissionEnforcer.tsx +1 -1
  483. package/src/rbac/components/RoleBasedRouter.tsx +6 -2
  484. package/src/rbac/components/SecureDataProvider.test.tsx +84 -49
  485. package/src/rbac/components/SecureDataProvider.tsx +21 -6
  486. package/src/rbac/components/__tests__/PagePermissionGuard.race-condition.test.tsx +24 -14
  487. package/src/rbac/components/__tests__/PagePermissionGuard.test.tsx +7 -0
  488. package/src/rbac/components/__tests__/PagePermissionGuard.verification.test.tsx +14 -6
  489. package/src/rbac/components/__tests__/RoleBasedRouter.test.tsx +15 -4
  490. package/src/rbac/components/__tests__/SecureDataProvider.fixed.test.tsx +148 -24
  491. package/src/rbac/components/__tests__/SecureDataProvider.test.tsx +81 -15
  492. package/src/rbac/engine.ts +38 -14
  493. package/src/rbac/hooks/permissions/index.ts +7 -0
  494. package/src/rbac/hooks/permissions/useAccessLevel.ts +105 -0
  495. package/src/rbac/hooks/permissions/useCachedPermissions.ts +79 -0
  496. package/src/rbac/hooks/permissions/useCan.ts +347 -0
  497. package/src/rbac/hooks/permissions/useHasAllPermissions.ts +90 -0
  498. package/src/rbac/hooks/permissions/useHasAnyPermission.ts +90 -0
  499. package/src/rbac/hooks/permissions/useMultiplePermissions.ts +93 -0
  500. package/src/rbac/hooks/permissions/usePermissions.ts +253 -0
  501. package/src/rbac/hooks/useCan.test.ts +71 -64
  502. package/src/rbac/hooks/usePermissions.ts +14 -995
  503. package/src/rbac/hooks/useResourcePermissions.test.ts +54 -18
  504. package/src/rbac/hooks/useResourcePermissions.ts +14 -4
  505. package/src/rbac/hooks/useSecureSupabase.ts +33 -13
  506. package/src/rbac/permissions.ts +0 -30
  507. package/src/rbac/secureClient.ts +212 -61
  508. package/src/rbac/types.ts +8 -0
  509. package/src/theming/__tests__/parseEventColours.test.ts +6 -9
  510. package/src/theming/parseEventColours.ts +5 -19
  511. package/src/types/vitest-globals.d.ts +51 -26
  512. package/src/utils/__mocks__/supabaseMock.ts +1 -3
  513. package/src/utils/__tests__/formatting.unit.test.ts +4 -4
  514. package/src/utils/__tests__/index.unit.test.ts +2 -2
  515. package/src/utils/audit/audit.ts +0 -3
  516. package/src/utils/core/cn.ts +1 -1
  517. package/src/utils/file-reference/index.ts +53 -1
  518. package/src/utils/formatting/formatting.ts +8 -18
  519. package/src/utils/index.ts +0 -1
  520. package/src/utils/security/secureDataAccess.test.ts +31 -20
  521. package/src/utils/security/secureDataAccess.ts +4 -3
  522. package/dist/chunk-6C4YBBJM.js +0 -628
  523. package/dist/chunk-6C4YBBJM.js.map +0 -1
  524. package/dist/chunk-7D4SUZUM.js 2.map +0 -1
  525. package/dist/chunk-7EQTDTTJ.js 2.map +0 -1
  526. package/dist/chunk-7EQTDTTJ.js.map +0 -1
  527. package/dist/chunk-7FLMSG37.js 2.map +0 -1
  528. package/dist/chunk-7FLMSG37.js.map +0 -1
  529. package/dist/chunk-BC4IJKSL.js.map +0 -1
  530. package/dist/chunk-E3SPN4VZ.js +0 -12917
  531. package/dist/chunk-E3SPN4VZ.js.map +0 -1
  532. package/dist/chunk-E66EQZE6 5.js +0 -37
  533. package/dist/chunk-E66EQZE6.js 2.map +0 -1
  534. package/dist/chunk-HWIIPPNI.js.map +0 -1
  535. package/dist/chunk-I7PSE6JW 5.js +0 -191
  536. package/dist/chunk-I7PSE6JW.js 2.map +0 -1
  537. package/dist/chunk-I7PSE6JW.js.map +0 -1
  538. package/dist/chunk-IIELH4DL.js.map +0 -1
  539. package/dist/chunk-KNC55RTG.js 5.map +0 -1
  540. package/dist/chunk-KNC55RTG.js.map +0 -1
  541. package/dist/chunk-KQCRWDSA.js 5.map +0 -1
  542. package/dist/chunk-LFNCN2SP.js +0 -412
  543. package/dist/chunk-LFNCN2SP.js 2.map +0 -1
  544. package/dist/chunk-LFNCN2SP.js.map +0 -1
  545. package/dist/chunk-LMC26NLJ 2.js +0 -84
  546. package/dist/chunk-NOAYCWCX.js +0 -4993
  547. package/dist/chunk-NOAYCWCX.js.map +0 -1
  548. package/dist/chunk-QWWZ5CAQ.js 3.map +0 -1
  549. package/dist/chunk-QWWZ5CAQ.js.map +0 -1
  550. package/dist/chunk-QXHPKYJV 3.js +0 -113
  551. package/dist/chunk-R77UEZ4E.js +0 -68
  552. package/dist/chunk-R77UEZ4E.js.map +0 -1
  553. package/dist/chunk-SQGMNID3.js.map +0 -1
  554. package/dist/chunk-VBXEHIUJ.js 6.map +0 -1
  555. package/dist/chunk-XNXXZ43G.js.map +0 -1
  556. package/dist/chunk-ZSAAAMVR 6.js +0 -25
  557. package/dist/components.js 5.map +0 -1
  558. package/dist/styles/index 2.js +0 -12
  559. package/dist/styles/index.js 5.map +0 -1
  560. package/dist/theming/runtime 5.js +0 -19
  561. package/dist/theming/runtime.js 5.map +0 -1
  562. package/docs/api/classes/ErrorBoundary.md +0 -144
  563. package/docs/migration/quick-migration-guide.md +0 -356
  564. package/docs/migration/service-architecture.md +0 -281
  565. package/src/hooks/__tests__/useSecureDataAccess.unit.test.tsx +0 -680
  566. package/src/hooks/useSecureDataAccess.test.ts +0 -559
  567. package/src/hooks/useSecureDataAccess.ts +0 -666
  568. /package/dist/{DataTable-5FU7IESH.js.map → DataTable-TPTKCX4D.js.map} +0 -0
  569. /package/dist/{UnifiedAuthProvider-RGJTDE2C.js.map → UnifiedAuthProvider-CH6Z342H.js.map} +0 -0
  570. /package/dist/{api-N774RPUA.js.map → api-MVVQZLJI.js.map} +0 -0
  571. /package/docs/migration/{organisation-context-timing-fix.md → V0.3.44_organisation-context-timing-fix.md} +0 -0
  572. /package/docs/migration/{rbac-migration.md → V0.4.0_rbac-migration.md} +0 -0
  573. /package/docs/migration/{person-scoped-profiles-migration-guide.md → V0.5.190_person-scoped-profiles-migration-guide.md} +0 -0
  574. /package/examples/{rbac → RBAC}/CompleteRBACExample.tsx +0 -0
  575. /package/examples/{rbac → RBAC}/EventBasedApp.tsx +0 -0
  576. /package/examples/{rbac → RBAC}/PermissionExample.tsx +0 -0
  577. /package/examples/{rbac → RBAC}/index.ts +0 -0
@@ -0,0 +1,227 @@
1
+ ---
2
+ lastUpdated: 2025-01-28T00:00:00+11:00
3
+ version: 0.5.193
4
+ reviewedBy: react-19-upgrade
5
+ ---
6
+
7
+ # React 19 Migration Guide
8
+
9
+ This guide documents the React 19 upgrade for `@jmruthers/pace-core` and provides migration instructions for consuming apps.
10
+
11
+ ## Overview
12
+
13
+ PACE Core has been upgraded from React 18.3.1 to React 19.2.3, including the React Compiler for automatic optimizations. This upgrade provides improved performance, better type safety, and new features.
14
+
15
+ ## What Changed
16
+
17
+ ### Core Upgrades
18
+
19
+ - **React**: `^18.3.1` → `^19.2.3`
20
+ - **React DOM**: `^18.3.1` → `^19.2.3`
21
+ - **@types/react**: `^18.3.17` → `^19.2.7`
22
+ - **@types/react-dom**: `^18.3.5` → `^19.2.3`
23
+ - **@vitejs/plugin-react**: `^4.5.1` → `^5.1.2`
24
+ - **React Compiler**: Added `babel-plugin-react-compiler@^1.0.0`
25
+
26
+ ### React Compiler
27
+
28
+ The React Compiler is now configured in pace-core's build setup. It automatically optimizes React components by:
29
+ - Automatically memoizing components and values
30
+ - Reducing the need for manual `useMemo` and `useCallback`
31
+ - Optimizing re-renders based on actual dependencies
32
+
33
+ ## Breaking Changes
34
+
35
+ ### TypeScript Type Stricter
36
+
37
+ React 19 has stricter TypeScript types. The main change affects accessing `child.props` in React elements:
38
+
39
+ **Before (React 18)**:
40
+ ```tsx
41
+ React.Children.map(children, (child) => {
42
+ if (React.isValidElement(child)) {
43
+ const variant = child.props.variant; // Works
44
+ }
45
+ });
46
+ ```
47
+
48
+ **After (React 19)**:
49
+ ```tsx
50
+ React.Children.map(children, (child) => {
51
+ if (React.isValidElement(child)) {
52
+ const props = child.props as { variant?: string; [key: string]: unknown };
53
+ const variant = props.variant; // Type-safe
54
+ }
55
+ });
56
+ ```
57
+
58
+ ### Error Handling
59
+
60
+ React 19 changes how errors are handled:
61
+ - Errors during render are no longer re-thrown
62
+ - Uncaught errors are reported to `window.reportError`
63
+ - Error boundaries continue to work as before
64
+
65
+ ### StrictMode Behavior
66
+
67
+ React 19 StrictMode changes:
68
+ - `useMemo` and `useCallback` reuse results from first render during second render
69
+ - Ref callbacks are double-invoked on initial mount
70
+
71
+ ## Migration Steps for Consuming Apps
72
+
73
+ ### Step 1: Update React Dependencies
74
+
75
+ ```bash
76
+ npm install react@^19.2.3 react-dom@^19.2.3
77
+ npm install -D @types/react@^19.2.7 @types/react-dom@^19.2.3
78
+ ```
79
+
80
+ ### Step 2: Update Vite Plugin
81
+
82
+ ```bash
83
+ npm install -D @vitejs/plugin-react@^5.1.2
84
+ ```
85
+
86
+ ### Step 3: Install React Compiler (Recommended)
87
+
88
+ ```bash
89
+ npm install -D babel-plugin-react-compiler@latest
90
+ ```
91
+
92
+ ### Step 4: Configure React Compiler in Vite
93
+
94
+ Update your `vite.config.ts`:
95
+
96
+ ```typescript
97
+ import { defineConfig } from 'vite'
98
+ import react from '@vitejs/plugin-react'
99
+ import tailwindcss from '@tailwindcss/vite'
100
+
101
+ export default defineConfig({
102
+ plugins: [
103
+ react({
104
+ babel: {
105
+ plugins: ['babel-plugin-react-compiler'],
106
+ },
107
+ }),
108
+ tailwindcss()
109
+ ],
110
+ // ... rest of config
111
+ })
112
+ ```
113
+
114
+ ### Step 5: Update TypeScript Types
115
+
116
+ If you have custom components that access `child.props`, update them:
117
+
118
+ ```tsx
119
+ // Before
120
+ const props = child.props;
121
+
122
+ // After
123
+ const props = child.props as { [key: string]: unknown };
124
+ // Or with specific types
125
+ const props = child.props as { variant?: string; size?: string; [key: string]: unknown };
126
+ ```
127
+
128
+ ### Step 6: Test Your Application
129
+
130
+ 1. Run your test suite
131
+ 2. Check for TypeScript errors
132
+ 3. Verify components render correctly
133
+ 4. Test error boundaries
134
+ 5. Use React DevTools to verify React Compiler is working (look for "Memo ✨" badge)
135
+
136
+ ## React Compiler Benefits
137
+
138
+ The React Compiler automatically:
139
+ - Memoizes components that don't need to re-render
140
+ - Optimizes `useMemo` and `useCallback` usage
141
+ - Reduces unnecessary re-renders
142
+ - Improves performance without manual optimization
143
+
144
+ ### When to Keep Manual Optimizations
145
+
146
+ You can still use manual `useMemo`/`useCallback` for:
147
+ - Complex dependencies that the compiler can't analyze
148
+ - Performance-critical code where you want explicit control
149
+ - Cases where the compiler optimization doesn't match your needs
150
+
151
+ The compiler will work alongside your manual optimizations.
152
+
153
+ ## Verification
154
+
155
+ ### Check React Compiler is Working
156
+
157
+ 1. Install React DevTools browser extension
158
+ 2. Open your app in development mode
159
+ 3. Open React DevTools
160
+ 4. Look for components with "Memo ✨" badge - these are optimized by the compiler
161
+
162
+ ### Build Verification
163
+
164
+ ```bash
165
+ # Type checking
166
+ npm run type-check
167
+
168
+ # Build
169
+ npm run build
170
+
171
+ # Tests
172
+ npm run test
173
+ ```
174
+
175
+ ## Troubleshooting
176
+
177
+ ### TypeScript Errors with child.props
178
+
179
+ If you see errors like `'child.props' is of type 'unknown'`, add type assertions:
180
+
181
+ ```tsx
182
+ const props = child.props as { [key: string]: unknown };
183
+ ```
184
+
185
+ ### React Compiler Not Working
186
+
187
+ 1. Verify `babel-plugin-react-compiler` is installed
188
+ 2. Check `vite.config.ts` has the compiler configured
189
+ 3. Restart your dev server
190
+ 4. Check React DevTools for "Memo ✨" badges
191
+
192
+ ### Test Failures
193
+
194
+ If tests fail after upgrading:
195
+ 1. Update `@testing-library/react` to latest version
196
+ 2. Check for StrictMode-related test issues
197
+ 3. Verify error boundaries still work correctly
198
+
199
+ ## Rollback Plan
200
+
201
+ If you encounter issues:
202
+
203
+ 1. **Disable React Compiler**: Remove from `vite.config.ts`:
204
+ ```typescript
205
+ react() // Remove babel config
206
+ ```
207
+
208
+ 2. **Downgrade React**: Temporarily downgrade to React 18.3.1 if needed
209
+ 3. **Report Issues**: Open an issue with details about the problem
210
+
211
+ ## Additional Resources
212
+
213
+ - [React 19 Upgrade Guide](https://react.dev/blog/2024/04/25/react-19-upgrade-guide)
214
+ - [React Compiler Documentation](https://react.dev/learn/react-compiler)
215
+ - [PACE Core Installation Guide](../getting-started/installation-guide.md)
216
+
217
+ ## Support
218
+
219
+ If you encounter issues migrating to React 19:
220
+ 1. Check this guide first
221
+ 2. Review [Troubleshooting](../troubleshooting/README.md)
222
+ 3. Open an issue on GitHub with:
223
+ - Package version
224
+ - React version
225
+ - Error messages
226
+ - Migration attempt details
227
+
@@ -427,7 +427,7 @@ const { data: files } = await supabase
427
427
 
428
428
  **Migration:** `20251205211120_migrate_profiles_to_person_scoped.sql` + related migrations
429
429
  **Date:** 2025-12-05
430
- **Documentation:** See [Person-Scoped Profiles Migration Guide](./person-scoped-profiles-migration-guide.md)
430
+ **Documentation:** See [Person-Scoped Profiles Migration Guide](./V0.5.190_person-scoped-profiles-migration-guide.md)
431
431
 
432
432
  ### Quick Summary
433
433
 
@@ -501,7 +501,7 @@ const { data } = await supabase
501
501
  - [ ] Update `pace_contact` queries to use `person_id` instead of `member_id`
502
502
  - [ ] Update profile creation logic (no `organisation_id` needed)
503
503
  - [ ] Review profile access patterns (person-scoped, not org-scoped)
504
- - [ ] See [Person-Scoped Profiles Migration Guide](./person-scoped-profiles-migration-guide.md) for detailed checklist
504
+ - [ ] See [Person-Scoped Profiles Migration Guide](./V0.5.190_person-scoped-profiles-migration-guide.md) for detailed checklist
505
505
 
506
506
  ### Phase 3: Testing
507
507
 
@@ -708,7 +708,7 @@ All migration files are located in:
708
708
 
709
709
  ### Documentation
710
710
 
711
- - [Person-Scoped Profiles Migration Guide](./person-scoped-profiles-migration-guide.md)
711
+ - [Person-Scoped Profiles Migration Guide](./V0.5.190_person-scoped-profiles-migration-guide.md)
712
712
  - [API & RPC Standard](../standards/02-api-and-rpc-standard.md)
713
713
  - [Database Schema Requirements](../architecture/database-schema-requirements.md)
714
714
 
@@ -973,7 +973,7 @@ VALUES (
973
973
  - **[API Reference](./api-reference.md)** - Complete API documentation
974
974
  - **[Examples](./examples.md)** - More complex usage patterns
975
975
  - **[Troubleshooting](./troubleshooting.md)** - Advanced troubleshooting
976
- - **[Migration Guide](../migration/rbac-migration.md)** - If migrating from legacy RBAC
976
+ - **[Migration Guide](../migration/V0.4.0_rbac-migration.md)** - If migrating from legacy RBAC
977
977
 
978
978
  ## 🆘 Still Having Issues?
979
979
 
@@ -843,7 +843,7 @@ function AdaptiveComponent({ appId }) {
843
843
  - [Examples](./examples.md) - More complex examples
844
844
  - [Event-Based Apps](./event-based-apps.md) - Guide for event-based applications
845
845
  - [Troubleshooting](./troubleshooting.md) - Common issues and solutions
846
- - [Migration Guide](../migration/rbac-migration.md) - Migrating from legacy RBAC
846
+ - [Migration Guide](../migration/V0.4.0_rbac-migration.md) - Migrating from legacy RBAC
847
847
 
848
848
  ## ♿ Accessibility
849
849
 
@@ -740,7 +740,7 @@ The system will automatically resolve the organisation ID from the event context
740
740
  - **[API Reference](./api-reference.md)** - Complete API documentation
741
741
  - **[Examples](./examples.md)** - More complex usage patterns
742
742
  - **[Troubleshooting](./troubleshooting.md)** - Advanced troubleshooting
743
- - **[Migration Guide](../migration/rbac-migration.md)** - If migrating from legacy RBAC
743
+ - **[Migration Guide](../migration/V0.4.0_rbac-migration.md)** - If migrating from legacy RBAC
744
744
 
745
745
  ## 🆘 Still Having Issues?
746
746
 
@@ -33,3 +33,43 @@ This document is the single source of truth for all engineering standards for pa
33
33
  - Apply Cursor Checklists
34
34
  - Prefer pace-core for reusable logic
35
35
  - Update docs on API changes
36
+
37
+ ## Cursor Rules
38
+
39
+ pace-core provides comprehensive Cursor rules that automatically enforce these standards in consuming apps.
40
+
41
+ ### Installation
42
+
43
+ Install cursor rules in your consuming app:
44
+
45
+ ```bash
46
+ node node_modules/@jmruthers/pace-core/scripts/install-cursor-rules.cjs
47
+ ```
48
+
49
+ ### Rule Files
50
+
51
+ The cursor rules cover:
52
+ - **00-pace-core-compliance** - Enforce pace-core usage patterns
53
+ - **01-standards-compliance** - Enforce all standards (this document)
54
+ - **02-project-structure** - Define standard folder structure
55
+ - **03-solid-principles** - Enforce SOLID architecture
56
+ - **04-testing-standards** - Enforce testing consistency
57
+ - **05-bug-reports-and-features** - Templates for issue reporting
58
+ - **06-code-quality** - Enforce code quality standards
59
+ - **07-tech-stack-compliance** - Enforce tech stack versions
60
+ - **08-markup-quality** - Enforce clean markup standards, semantic HTML usage, and pace-core component patterns
61
+
62
+ ### Audit Tool
63
+
64
+ Run comprehensive audits to check compliance:
65
+
66
+ ```bash
67
+ node node_modules/@jmruthers/pace-core/scripts/audit-consuming-app.cjs
68
+ ```
69
+
70
+ This generates timestamped markdown reports in `audit/` directory.
71
+
72
+ ### Documentation
73
+
74
+ - [Cursor Rules Quick Start](../getting-started/cursor-rules.md)
75
+ - [Cursor Rules README](../../cursor-rules/README.md)
@@ -506,8 +506,8 @@ export default defineConfig({
506
506
 
507
507
  // New dependencies
508
508
  "@jmruthers/pace-core": "^2.0.0",
509
- "react": "^18.2.0",
510
- "react-dom": "^18.2.0",
509
+ "react": "^19.2.3",
510
+ "react-dom": "^19.2.3",
511
511
  "@supabase/supabase-js": "^2.38.0",
512
512
  "zod": "^3.22.0"
513
513
  },
@@ -517,8 +517,8 @@ export default defineConfig({
517
517
  "@types/react-dom": "^17.0.0",
518
518
 
519
519
  // New dev dependencies
520
- "@types/react": "^18.2.0",
521
- "@types/react-dom": "^18.2.0",
520
+ "@types/react": "^19.2.7",
521
+ "@types/react-dom": "^19.2.3",
522
522
  "@vitejs/plugin-react": "^4.0.0",
523
523
  "vite": "^4.4.0",
524
524
  "typescript": "^5.0.0"
@@ -23,7 +23,7 @@
23
23
  * ```
24
24
  *
25
25
  * @dependencies
26
- * - React 18+ - Component framework
26
+ * - React 19+ - Component framework
27
27
  * - React Router - Routing
28
28
  * - Public pages components - Layout and data access
29
29
  * - Tailwind CSS - Styling
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@jmruthers/pace-core",
3
- "version": "0.5.193",
3
+ "version": "0.6.2",
4
4
  "description": "Clean, modern React component library with Tailwind v4 styling and native utilities",
5
5
  "private": false,
6
6
  "publishConfig": {
@@ -71,6 +71,10 @@
71
71
  "./docs": "./docs/README.md",
72
72
  "./package.json": "./package.json",
73
73
  "./core-usage-manifest.json": "./core-usage-manifest.json",
74
+ "./cursor-rules": "./cursor-rules",
75
+ "./scripts/install-cursor-rules": "./scripts/install-cursor-rules.cjs",
76
+ "./scripts/audit": "./scripts/audit/index.cjs",
77
+ "./scripts/audit-consuming-app": "./scripts/audit-consuming-app.cjs",
74
78
  "./source": {
75
79
  "import": "./src/index.ts",
76
80
  "default": "./src/index.ts"
@@ -138,7 +142,8 @@
138
142
  "docs",
139
143
  "core-usage-manifest.json",
140
144
  "eslint-config-pace-core.cjs",
141
- "scripts"
145
+ "scripts",
146
+ "cursor-rules"
142
147
  ],
143
148
  "scripts": {
144
149
  "_comment_build": "Build package and documentation",
@@ -207,9 +212,9 @@
207
212
  "@tanstack/react-table": "^8.0.0",
208
213
  "clsx": "^2.0.0",
209
214
  "lucide-react": "^0.400.0",
210
- "react": "^18.0.0",
211
- "react-dom": "^18.0.0",
215
+ "react": "^19.0.0",
212
216
  "react-day-picker": "^9.0.0",
217
+ "react-dom": "^19.0.0",
213
218
  "react-hook-form": "^7.0.0",
214
219
  "react-router-dom": "^6.0.0",
215
220
  "tailwind-merge": "^2.0.0",
@@ -222,8 +227,8 @@
222
227
  "@testing-library/react": "^16.1.0",
223
228
  "@testing-library/user-event": "^14.5.2",
224
229
  "@types/papaparse": "^5.3.16",
225
- "@types/react": "^18.3.17",
226
- "@types/react-dom": "^18.3.5",
230
+ "@types/react": "^19.0.0",
231
+ "@types/react-dom": "^19.0.0",
227
232
  "@types/react-window": "^1.8.8",
228
233
  "@vitejs/plugin-react": "^4.5.1",
229
234
  "@vitest/coverage-v8": "^3.2.3",
@@ -236,6 +241,7 @@
236
241
  "typedoc": "^0.25.13",
237
242
  "typedoc-plugin-markdown": "^3.17.1",
238
243
  "typedoc-plugin-merge-modules": "^5.1.0",
244
+ "tsup": "^8.5.0",
239
245
  "typescript": "^5.4.0",
240
246
  "typescript-eslint": "^8.39.0",
241
247
  "vite": "^6.0.3"
@@ -0,0 +1,197 @@
1
+ #!/usr/bin/env node
2
+
3
+ /**
4
+ * Accessibility Check Module
5
+ * @package @jmruthers/pace-core
6
+ * @module Audit/Checks/Accessibility
7
+ *
8
+ * Checks for:
9
+ * - Missing aria-* attributes
10
+ * - Missing keyboard navigation
11
+ * - Missing focus management
12
+ * - Missing alt text on images
13
+ */
14
+
15
+ const fs = require('fs');
16
+ const { getRelativePath, getLineNumber } = require('../utils.cjs');
17
+
18
+ const accessibilityCheck = {
19
+ name: 'accessibility',
20
+ description: 'Accessibility checks (aria attributes, keyboard navigation, alt text)',
21
+ severity: 'warning',
22
+
23
+ async run(context) {
24
+ const { projectRoot, files } = context;
25
+ const issues = [];
26
+ const warnings = [];
27
+ const suggestions = [];
28
+
29
+ if (!files || files.length === 0) {
30
+ return { issues, warnings, suggestions };
31
+ }
32
+
33
+ for (const filePath of files) {
34
+ try {
35
+ // Only check React component files
36
+ if (!filePath.match(/\.(tsx|jsx)$/)) {
37
+ continue;
38
+ }
39
+
40
+ const content = fs.readFileSync(filePath, 'utf8');
41
+ const relativePath = getRelativePath(filePath, projectRoot);
42
+ const normalizedPath = relativePath.replace(/\\/g, '/');
43
+
44
+ // Skip root-level src directory - in pace-core repository, this is a demo/showcase app
45
+ // Note: We DO check packages/core/ files because accessibility issues (missing alt attributes, missing form labels) are real issues that should be fixed
46
+ const isRootSrc = normalizedPath.startsWith('src/') && !normalizedPath.includes('packages/');
47
+ if (isRootSrc) {
48
+ continue; // Skip demo app files
49
+ }
50
+
51
+ // Skip scripts directory - utility scripts don't need accessibility validation
52
+ const isScript = normalizedPath.startsWith('scripts/') || normalizedPath.includes('/scripts/');
53
+ if (isScript) {
54
+ continue; // Skip script files
55
+ }
56
+
57
+ // Skip pace-core library components and examples - these are designed to accept accessibility props
58
+ // Library components accept id, aria-label, etc. via props spread
59
+ // Examples are demonstration code, not production code
60
+ const isPaceCorePackage = normalizedPath.includes('packages/core/') || normalizedPath.startsWith('packages/core/');
61
+ const isExample = normalizedPath.includes('/examples/');
62
+ const isLibraryComponent = isPaceCorePackage && !isExample;
63
+
64
+ // Check for images without alt text
65
+ // Skip library components - they accept alt as a prop
66
+ if (!isLibraryComponent) {
67
+ const imgPattern = /<img[^>]*>/g;
68
+ let imgMatch;
69
+ while ((imgMatch = imgPattern.exec(content)) !== null) {
70
+ const imgTag = imgMatch[0];
71
+ // Check for alt attribute, including React props (alt=, alt =, alt={)
72
+ const hasAlt = imgTag.includes('alt=') || imgTag.includes('alt =') || imgTag.includes('alt={');
73
+ if (!hasAlt) {
74
+ warnings.push({
75
+ type: 'missing-alt-text',
76
+ file: relativePath,
77
+ line: getLineNumber(content, imgMatch.index),
78
+ message: 'Image element missing alt attribute',
79
+ recommendation: 'Add alt text to all images for accessibility: <img alt="description" ... />'
80
+ });
81
+ }
82
+ }
83
+ }
84
+
85
+ // Check for buttons/clickable elements without aria-label or accessible text
86
+ const buttonPattern = /<(button|a|div)\s+[^>]*(onClick|role=["']button["'])[^>]*>/g;
87
+ let buttonMatch;
88
+ while ((buttonMatch = buttonPattern.exec(content)) !== null) {
89
+ const buttonTag = buttonMatch[0];
90
+ const hasAriaLabel = buttonTag.includes('aria-label=') || buttonTag.includes('ariaLabel=');
91
+ const hasAccessibleText = buttonTag.includes('>') && content.substring(buttonMatch.index).match(/<[^>]*>([^<]+)</);
92
+
93
+ if (!hasAriaLabel && !hasAccessibleText) {
94
+ warnings.push({
95
+ type: 'missing-aria-label',
96
+ file: relativePath,
97
+ line: getLineNumber(content, buttonMatch.index),
98
+ message: 'Interactive element missing accessible label',
99
+ recommendation: 'Add aria-label or ensure element contains accessible text content'
100
+ });
101
+ }
102
+ }
103
+
104
+ // Check for form inputs without labels
105
+ // Skip library components - they accept id, aria-label, etc. via props spread
106
+ // Skip examples - they're demonstration code
107
+ if (!isLibraryComponent && !isExample) {
108
+ const inputPattern = /<input[^>]*>/g;
109
+ let inputMatch;
110
+ while ((inputMatch = inputPattern.exec(content)) !== null) {
111
+ // Get the full input tag including multi-line attributes
112
+ const inputStart = inputMatch.index;
113
+ const afterInput = content.substring(inputStart, Math.min(content.length, inputStart + 500));
114
+ const inputTagEnd = afterInput.indexOf('>');
115
+ const fullInputTag = inputTagEnd !== -1 ? afterInput.substring(0, inputTagEnd + 1) : inputMatch[0];
116
+
117
+ // Check for id (including React props)
118
+ const hasId = /id=["']([^"']+)["']|id=\{/.test(fullInputTag);
119
+ // Check for aria-label (including React props)
120
+ const hasAriaLabel = /aria-label=["']|ariaLabel=|aria-label=\{/.test(fullInputTag);
121
+
122
+ if (hasId) {
123
+ const idMatch = fullInputTag.match(/id=["']([^"']+)["']/);
124
+ if (idMatch) {
125
+ const id = idMatch[1];
126
+ // Check if there's a corresponding label
127
+ const beforeInput = content.substring(Math.max(0, inputMatch.index - 200), inputMatch.index);
128
+ const hasLabel = new RegExp(`<label[^>]*for=["']${id}["']`, 'i').test(beforeInput);
129
+
130
+ if (!hasLabel && !hasAriaLabel) {
131
+ warnings.push({
132
+ type: 'missing-input-label',
133
+ file: relativePath,
134
+ line: getLineNumber(content, inputMatch.index),
135
+ message: 'Form input missing associated label',
136
+ recommendation: 'Add a <label> element with for attribute matching input id, or use aria-label'
137
+ });
138
+ }
139
+ }
140
+ } else if (!hasAriaLabel) {
141
+ warnings.push({
142
+ type: 'missing-input-label',
143
+ file: relativePath,
144
+ line: getLineNumber(content, inputMatch.index),
145
+ message: 'Form input missing id and label',
146
+ recommendation: 'Add id to input and corresponding label, or use aria-label'
147
+ });
148
+ }
149
+ }
150
+ }
151
+
152
+ // Check for missing focus management in modals/dialogs
153
+ const dialogPattern = /<Dialog|<dialog/gi;
154
+ if (dialogPattern.test(content)) {
155
+ // Skip Dialog.tsx itself - it IS the Dialog component
156
+ if (normalizedPath.includes('/Dialog/Dialog.tsx') || normalizedPath.includes('/Dialog/Dialog.jsx')) {
157
+ continue; // Skip the Dialog component file itself
158
+ }
159
+
160
+ // Check if Dialog from pace-core is used (which handles focus automatically)
161
+ // Check for both published package import and relative imports (within pace-core repo)
162
+ const usesPaceCoreDialog = content.includes('from \'@jmruthers/pace-core\'') ||
163
+ content.includes('from "@jmruthers/pace-core"') ||
164
+ content.includes('from \'../Dialog') ||
165
+ content.includes('from "../Dialog') ||
166
+ content.includes('from \'../../Dialog') ||
167
+ content.includes('from "../../Dialog') ||
168
+ content.includes('from \'../../../Dialog') ||
169
+ content.includes('from "../../../Dialog') ||
170
+ content.includes('from \'./Dialog') ||
171
+ content.includes('from "./Dialog');
172
+
173
+ if (!usesPaceCoreDialog) {
174
+ suggestions.push({
175
+ type: 'dialog-focus-management',
176
+ file: relativePath,
177
+ message: 'Custom dialog implementation detected',
178
+ recommendation: 'Use Dialog component from @jmruthers/pace-core which handles focus management automatically'
179
+ });
180
+ }
181
+ }
182
+
183
+ // Check for color contrast issues (heuristic - check for color props without sufficient contrast)
184
+ const colorPattern = /(?:color|bg-|text-)=["']([^"']+)["']/g;
185
+ // This is a simplified check - full implementation would need color contrast calculation
186
+ // For now, just suggest using pace-core components which handle contrast
187
+
188
+ } catch (error) {
189
+ // Skip files with errors
190
+ }
191
+ }
192
+
193
+ return { issues, warnings, suggestions };
194
+ }
195
+ };
196
+
197
+ module.exports = accessibilityCheck;