@jmruthers/pace-core 0.6.1 → 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 (502) hide show
  1. package/CHANGELOG.md +43 -10
  2. package/cursor-rules/00-pace-core-compliance.mdc +18 -91
  3. package/cursor-rules/01-standards-compliance.mdc +16 -47
  4. package/cursor-rules/02-project-structure.mdc +4 -4
  5. package/cursor-rules/03-solid-principles.mdc +45 -164
  6. package/cursor-rules/04-testing-standards.mdc +22 -69
  7. package/cursor-rules/05-bug-reports-and-features.mdc +2 -2
  8. package/cursor-rules/06-code-quality.mdc +42 -125
  9. package/cursor-rules/07-tech-stack-compliance.mdc +33 -128
  10. package/cursor-rules/08-markup-quality.mdc +452 -0
  11. package/cursor-rules/CHANGELOG.md +18 -0
  12. package/cursor-rules/README.md +2 -1
  13. package/dist/{AuthService-DjnJHDtC.d.ts → AuthService-BPvc3Ka0.d.ts} +54 -0
  14. package/dist/{DataTable-CH1U5Tpy.d.ts → DataTable-BMRU8a1j.d.ts} +33 -1
  15. package/dist/{DataTable-DQ7RSOHE.js → DataTable-TPTKCX4D.js} +10 -9
  16. package/dist/{PublicPageProvider-ce4xlHYA.d.ts → PublicPageProvider-DC6kCaqf.d.ts} +356 -111
  17. package/dist/{UnifiedAuthProvider-ATAP5UTR.js → UnifiedAuthProvider-CH6Z342H.js} +3 -3
  18. package/dist/{UnifiedAuthProvider-185Ih4dj.d.ts → UnifiedAuthProvider-CVcTjx-d.d.ts} +29 -0
  19. package/dist/{api-N774RPUA.js → api-MVVQZLJI.js} +2 -2
  20. package/dist/{chunk-KNC55RTG.js → chunk-24UVZUZG.js} +90 -54
  21. package/dist/chunk-24UVZUZG.js.map +1 -0
  22. package/dist/{chunk-4N5C5XZU.js → chunk-2UOI2FG5.js} +4 -4
  23. package/dist/chunk-2UOI2FG5.js.map +1 -0
  24. package/dist/{chunk-T33XF5ZC.js → chunk-3XC4CPTD.js} +4317 -3963
  25. package/dist/chunk-3XC4CPTD.js.map +1 -0
  26. package/dist/{chunk-4ZC4GX36.js → chunk-6J4GEEJR.js} +172 -45
  27. package/dist/chunk-6J4GEEJR.js.map +1 -0
  28. package/dist/{chunk-3QRJFVBR.js → chunk-6SOIHG6Z.js} +1 -1
  29. package/dist/chunk-6SOIHG6Z.js.map +1 -0
  30. package/dist/{chunk-BYFSK72L.js → chunk-EHMR7VYL.js} +4 -4
  31. package/dist/chunk-EHMR7VYL.js.map +1 -0
  32. package/dist/{chunk-I7PSE6JW.js → chunk-F2IMUDXZ.js} +2 -75
  33. package/dist/chunk-F2IMUDXZ.js.map +1 -0
  34. package/dist/{chunk-LXQLPRQ2.js → chunk-FFQEQTNW.js} +6 -8
  35. package/dist/chunk-FFQEQTNW.js.map +1 -0
  36. package/dist/chunk-FMUCXFII.js +76 -0
  37. package/dist/chunk-FMUCXFII.js.map +1 -0
  38. package/dist/{chunk-SQGMNID3.js → chunk-L4OXEN46.js} +4 -5
  39. package/dist/chunk-L4OXEN46.js.map +1 -0
  40. package/dist/{chunk-R77UEZ4E.js → chunk-M43Y4SSO.js} +1 -1
  41. package/dist/chunk-M43Y4SSO.js.map +1 -0
  42. package/dist/{chunk-3XTALGJF.js → chunk-MMZ7JXPU.js} +60 -223
  43. package/dist/chunk-MMZ7JXPU.js.map +1 -0
  44. package/dist/{chunk-GLK6VM3F.js → chunk-NECFR5MM.js} +254 -170
  45. package/dist/chunk-NECFR5MM.js.map +1 -0
  46. package/dist/{chunk-JBKQ3SAO.js → chunk-SFZUDBL5.js} +40 -4
  47. package/dist/chunk-SFZUDBL5.js.map +1 -0
  48. package/dist/{chunk-XM25TVIE.js → chunk-XWQCNGTQ.js} +724 -363
  49. package/dist/chunk-XWQCNGTQ.js.map +1 -0
  50. package/dist/components.d.ts +5 -5
  51. package/dist/components.js +14 -11
  52. package/dist/components.js.map +1 -1
  53. package/dist/{functions-D_kgHktt.d.ts → functions-DHebl8-F.d.ts} +1 -1
  54. package/dist/hooks.d.ts +55 -122
  55. package/dist/hooks.js +8 -12
  56. package/dist/hooks.js.map +1 -1
  57. package/dist/index.d.ts +60 -13
  58. package/dist/index.js +19 -19
  59. package/dist/index.js.map +1 -1
  60. package/dist/providers.d.ts +21 -3
  61. package/dist/providers.js +2 -2
  62. package/dist/rbac/index.d.ts +145 -114
  63. package/dist/rbac/index.js +8 -11
  64. package/dist/theming/runtime.d.ts +1 -13
  65. package/dist/theming/runtime.js +1 -1
  66. package/dist/{timezone-_pgH8qrY.d.ts → timezone-CHhWg6b4.d.ts} +3 -10
  67. package/dist/{types-UU913iLA.d.ts → types-BeoeWV5I.d.ts} +8 -0
  68. package/dist/{types-CEpcvwwF.d.ts → types-CkbwOr4Y.d.ts} +6 -0
  69. package/dist/types.d.ts +2 -2
  70. package/dist/{usePublicRouteParams-BJAlWfuJ.d.ts → usePublicRouteParams-1oMokgLF.d.ts} +31 -1
  71. package/dist/utils.d.ts +4 -5
  72. package/dist/utils.js +14 -14
  73. package/dist/utils.js.map +1 -1
  74. package/docs/api/README.md +7 -1
  75. package/docs/api/classes/ColumnFactory.md +8 -8
  76. package/docs/api/classes/InvalidScopeError.md +4 -4
  77. package/docs/api/classes/Logger.md +1 -1
  78. package/docs/api/classes/MissingUserContextError.md +4 -4
  79. package/docs/api/classes/OrganisationContextRequiredError.md +4 -4
  80. package/docs/api/classes/PermissionDeniedError.md +4 -4
  81. package/docs/api/classes/RBACAuditManager.md +1 -1
  82. package/docs/api/classes/RBACCache.md +1 -1
  83. package/docs/api/classes/RBACEngine.md +1 -1
  84. package/docs/api/classes/RBACError.md +4 -4
  85. package/docs/api/classes/RBACNotInitializedError.md +4 -4
  86. package/docs/api/classes/SecureSupabaseClient.md +18 -15
  87. package/docs/api/classes/StorageUtils.md +1 -1
  88. package/docs/api/enums/FileCategory.md +1 -1
  89. package/docs/api/enums/LogLevel.md +1 -1
  90. package/docs/api/enums/RBACErrorCode.md +1 -1
  91. package/docs/api/enums/RPCFunction.md +1 -1
  92. package/docs/api/interfaces/AddressFieldProps.md +1 -1
  93. package/docs/api/interfaces/AddressFieldRef.md +1 -1
  94. package/docs/api/interfaces/AggregateConfig.md +4 -4
  95. package/docs/api/interfaces/AutocompleteOptions.md +1 -1
  96. package/docs/api/interfaces/AvatarProps.md +1 -1
  97. package/docs/api/interfaces/BadgeProps.md +9 -2
  98. package/docs/api/interfaces/ButtonProps.md +7 -4
  99. package/docs/api/interfaces/CalendarProps.md +8 -5
  100. package/docs/api/interfaces/CardProps.md +8 -5
  101. package/docs/api/interfaces/ColorPalette.md +1 -1
  102. package/docs/api/interfaces/ColorShade.md +1 -1
  103. package/docs/api/interfaces/ComplianceResult.md +1 -1
  104. package/docs/api/interfaces/DataAccessRecord.md +9 -9
  105. package/docs/api/interfaces/DataRecord.md +1 -1
  106. package/docs/api/interfaces/DataTableAction.md +24 -21
  107. package/docs/api/interfaces/DataTableColumn.md +31 -31
  108. package/docs/api/interfaces/DataTableProps.md +1 -1
  109. package/docs/api/interfaces/DataTableToolbarButton.md +7 -7
  110. package/docs/api/interfaces/DatabaseComplianceResult.md +1 -1
  111. package/docs/api/interfaces/DatabaseIssue.md +1 -1
  112. package/docs/api/interfaces/EmptyStateConfig.md +5 -5
  113. package/docs/api/interfaces/EnhancedNavigationMenuProps.md +1 -1
  114. package/docs/api/interfaces/ErrorBoundaryProps.md +147 -0
  115. package/docs/api/interfaces/ErrorBoundaryProviderProps.md +36 -0
  116. package/docs/api/interfaces/ErrorBoundaryState.md +75 -0
  117. package/docs/api/interfaces/EventAppRoleData.md +1 -1
  118. package/docs/api/interfaces/ExportColumn.md +1 -1
  119. package/docs/api/interfaces/ExportOptions.md +8 -8
  120. package/docs/api/interfaces/FileDisplayProps.md +1 -1
  121. package/docs/api/interfaces/FileMetadata.md +1 -1
  122. package/docs/api/interfaces/FileReference.md +1 -1
  123. package/docs/api/interfaces/FileSizeLimits.md +1 -1
  124. package/docs/api/interfaces/FileUploadOptions.md +1 -1
  125. package/docs/api/interfaces/FileUploadProps.md +26 -23
  126. package/docs/api/interfaces/FooterProps.md +10 -8
  127. package/docs/api/interfaces/FormFieldProps.md +10 -10
  128. package/docs/api/interfaces/FormProps.md +1 -1
  129. package/docs/api/interfaces/GrantEventAppRoleParams.md +1 -1
  130. package/docs/api/interfaces/InactivityWarningModalProps.md +1 -1
  131. package/docs/api/interfaces/InputProps.md +7 -4
  132. package/docs/api/interfaces/LabelProps.md +1 -1
  133. package/docs/api/interfaces/LoggerConfig.md +1 -1
  134. package/docs/api/interfaces/LoginFormProps.md +14 -11
  135. package/docs/api/interfaces/NavigationAccessRecord.md +1 -1
  136. package/docs/api/interfaces/NavigationContextType.md +1 -1
  137. package/docs/api/interfaces/NavigationGuardProps.md +1 -1
  138. package/docs/api/interfaces/NavigationItem.md +11 -11
  139. package/docs/api/interfaces/NavigationMenuProps.md +15 -15
  140. package/docs/api/interfaces/NavigationProviderProps.md +1 -1
  141. package/docs/api/interfaces/Organisation.md +1 -1
  142. package/docs/api/interfaces/OrganisationContextType.md +1 -1
  143. package/docs/api/interfaces/OrganisationMembership.md +1 -1
  144. package/docs/api/interfaces/OrganisationProviderProps.md +1 -1
  145. package/docs/api/interfaces/OrganisationSecurityError.md +1 -1
  146. package/docs/api/interfaces/PaceAppLayoutProps.md +30 -27
  147. package/docs/api/interfaces/PaceLoginPageProps.md +6 -4
  148. package/docs/api/interfaces/PageAccessRecord.md +1 -1
  149. package/docs/api/interfaces/PagePermissionContextType.md +1 -1
  150. package/docs/api/interfaces/PagePermissionGuardProps.md +1 -1
  151. package/docs/api/interfaces/PagePermissionProviderProps.md +1 -1
  152. package/docs/api/interfaces/PaletteData.md +1 -1
  153. package/docs/api/interfaces/ParsedAddress.md +1 -1
  154. package/docs/api/interfaces/PermissionEnforcerProps.md +1 -1
  155. package/docs/api/interfaces/ProgressProps.md +1 -1
  156. package/docs/api/interfaces/ProtectedRouteProps.md +7 -26
  157. package/docs/api/interfaces/PublicPageFooterProps.md +9 -9
  158. package/docs/api/interfaces/PublicPageHeaderProps.md +10 -10
  159. package/docs/api/interfaces/PublicPageLayoutProps.md +7 -20
  160. package/docs/api/interfaces/QuickFix.md +1 -1
  161. package/docs/api/interfaces/RBACAccessValidateParams.md +1 -1
  162. package/docs/api/interfaces/RBACAccessValidateResult.md +1 -1
  163. package/docs/api/interfaces/RBACAuditLogParams.md +1 -1
  164. package/docs/api/interfaces/RBACAuditLogResult.md +1 -1
  165. package/docs/api/interfaces/RBACConfig.md +1 -1
  166. package/docs/api/interfaces/RBACContext.md +1 -1
  167. package/docs/api/interfaces/RBACLogger.md +1 -1
  168. package/docs/api/interfaces/RBACPageAccessCheckParams.md +1 -1
  169. package/docs/api/interfaces/RBACPerformanceMetrics.md +1 -1
  170. package/docs/api/interfaces/RBACPermissionCheckParams.md +1 -1
  171. package/docs/api/interfaces/RBACPermissionCheckResult.md +1 -1
  172. package/docs/api/interfaces/RBACPermissionsGetParams.md +1 -1
  173. package/docs/api/interfaces/RBACPermissionsGetResult.md +1 -1
  174. package/docs/api/interfaces/RBACResult.md +1 -1
  175. package/docs/api/interfaces/RBACRoleGrantParams.md +1 -1
  176. package/docs/api/interfaces/RBACRoleGrantResult.md +1 -1
  177. package/docs/api/interfaces/RBACRoleRevokeParams.md +1 -1
  178. package/docs/api/interfaces/RBACRoleRevokeResult.md +1 -1
  179. package/docs/api/interfaces/RBACRoleValidateParams.md +1 -1
  180. package/docs/api/interfaces/RBACRoleValidateResult.md +1 -1
  181. package/docs/api/interfaces/RBACRolesListParams.md +1 -1
  182. package/docs/api/interfaces/RBACRolesListResult.md +1 -1
  183. package/docs/api/interfaces/RBACSessionTrackParams.md +1 -1
  184. package/docs/api/interfaces/RBACSessionTrackResult.md +1 -1
  185. package/docs/api/interfaces/ResourcePermissions.md +1 -1
  186. package/docs/api/interfaces/RevokeEventAppRoleParams.md +1 -1
  187. package/docs/api/interfaces/RoleBasedRouterContextType.md +1 -1
  188. package/docs/api/interfaces/RoleBasedRouterProps.md +1 -1
  189. package/docs/api/interfaces/RoleManagementResult.md +1 -1
  190. package/docs/api/interfaces/RouteAccessRecord.md +1 -1
  191. package/docs/api/interfaces/RouteConfig.md +1 -1
  192. package/docs/api/interfaces/RuntimeComplianceResult.md +1 -1
  193. package/docs/api/interfaces/SecureDataContextType.md +9 -9
  194. package/docs/api/interfaces/SecureDataProviderProps.md +8 -8
  195. package/docs/api/interfaces/SessionRestorationLoaderProps.md +3 -3
  196. package/docs/api/interfaces/SetupIssue.md +1 -1
  197. package/docs/api/interfaces/StorageConfig.md +1 -1
  198. package/docs/api/interfaces/StorageFileInfo.md +1 -1
  199. package/docs/api/interfaces/StorageFileMetadata.md +1 -1
  200. package/docs/api/interfaces/StorageListOptions.md +1 -1
  201. package/docs/api/interfaces/StorageListResult.md +1 -1
  202. package/docs/api/interfaces/StorageUploadOptions.md +1 -1
  203. package/docs/api/interfaces/StorageUploadResult.md +1 -1
  204. package/docs/api/interfaces/StorageUrlOptions.md +1 -1
  205. package/docs/api/interfaces/StyleImport.md +1 -1
  206. package/docs/api/interfaces/SwitchProps.md +1 -1
  207. package/docs/api/interfaces/TabsContentProps.md +1 -1
  208. package/docs/api/interfaces/TabsListProps.md +1 -1
  209. package/docs/api/interfaces/TabsProps.md +1 -1
  210. package/docs/api/interfaces/TabsTriggerProps.md +3 -3
  211. package/docs/api/interfaces/TextareaProps.md +1 -1
  212. package/docs/api/interfaces/ToastActionElement.md +4 -1
  213. package/docs/api/interfaces/ToastProps.md +1 -1
  214. package/docs/api/interfaces/UnifiedAuthContextType.md +58 -55
  215. package/docs/api/interfaces/UnifiedAuthProviderProps.md +15 -13
  216. package/docs/api/interfaces/UseFormDialogOptions.md +1 -1
  217. package/docs/api/interfaces/UseFormDialogReturn.md +1 -1
  218. package/docs/api/interfaces/UseInactivityTrackerOptions.md +11 -9
  219. package/docs/api/interfaces/UseInactivityTrackerReturn.md +8 -8
  220. package/docs/api/interfaces/UsePublicEventLogoOptions.md +6 -6
  221. package/docs/api/interfaces/UsePublicEventLogoReturn.md +9 -6
  222. package/docs/api/interfaces/UsePublicEventOptions.md +3 -3
  223. package/docs/api/interfaces/UsePublicEventReturn.md +8 -5
  224. package/docs/api/interfaces/UsePublicFileDisplayOptions.md +4 -4
  225. package/docs/api/interfaces/UsePublicFileDisplayReturn.md +12 -9
  226. package/docs/api/interfaces/UsePublicRouteParamsReturn.md +10 -7
  227. package/docs/api/interfaces/UseResolvedScopeOptions.md +1 -1
  228. package/docs/api/interfaces/UseResolvedScopeReturn.md +1 -1
  229. package/docs/api/interfaces/UseResourcePermissionsOptions.md +1 -1
  230. package/docs/api/interfaces/UserEventAccess.md +14 -11
  231. package/docs/api/interfaces/UserMenuProps.md +8 -6
  232. package/docs/api/interfaces/UserProfile.md +1 -1
  233. package/docs/api/modules.md +575 -634
  234. package/docs/architecture/database-schema-requirements.md +161 -0
  235. package/docs/core-concepts/rbac-system.md +3 -3
  236. package/docs/documentation-index.md +2 -4
  237. package/docs/getting-started/cursor-rules.md +2 -1
  238. package/docs/migration/DOCUMENTATION_STRUCTURE.md +441 -0
  239. package/docs/migration/MIGRATION_GUIDE.md +2 -24
  240. package/docs/migration/README.md +52 -6
  241. package/docs/migration/V0.5.190_TO_V0.6.1_MIGRATION.md +1153 -0
  242. package/docs/migration/database-changes-december-2025.md +3 -3
  243. package/docs/rbac/event-based-apps.md +1 -1
  244. package/docs/rbac/getting-started.md +1 -1
  245. package/docs/rbac/quick-start.md +1 -1
  246. package/docs/standards/README.md +1 -0
  247. package/package.json +2 -1
  248. package/scripts/audit/core/checks/accessibility.cjs +197 -0
  249. package/scripts/audit/core/checks/api-usage.cjs +191 -0
  250. package/scripts/audit/core/checks/bundle.cjs +142 -0
  251. package/scripts/{check-pace-core-compliance.cjs → audit/core/checks/compliance.cjs} +714 -687
  252. package/scripts/audit/core/checks/config.cjs +54 -0
  253. package/scripts/audit/core/checks/coverage.cjs +84 -0
  254. package/scripts/audit/core/checks/dependencies.cjs +454 -0
  255. package/scripts/audit/core/checks/documentation.cjs +203 -0
  256. package/scripts/audit/core/checks/environment.cjs +128 -0
  257. package/scripts/audit/core/checks/error-handling.cjs +299 -0
  258. package/scripts/audit/core/checks/forms.cjs +172 -0
  259. package/scripts/audit/core/checks/heuristics.cjs +68 -0
  260. package/scripts/audit/core/checks/hooks.cjs +334 -0
  261. package/scripts/audit/core/checks/imports.cjs +244 -0
  262. package/scripts/audit/core/checks/performance.cjs +325 -0
  263. package/scripts/audit/core/checks/routes.cjs +117 -0
  264. package/scripts/audit/core/checks/state.cjs +130 -0
  265. package/scripts/audit/core/checks/structure.cjs +65 -0
  266. package/scripts/audit/core/checks/style.cjs +584 -0
  267. package/scripts/audit/core/checks/testing.cjs +122 -0
  268. package/scripts/audit/core/checks/typescript.cjs +61 -0
  269. package/scripts/audit/core/scanner.cjs +199 -0
  270. package/scripts/audit/core/utils.cjs +137 -0
  271. package/scripts/audit/index.cjs +223 -0
  272. package/scripts/audit/reporters/console.cjs +151 -0
  273. package/scripts/audit/reporters/json.cjs +54 -0
  274. package/scripts/audit/reporters/markdown.cjs +124 -0
  275. package/scripts/audit-consuming-app.cjs +61 -936
  276. package/scripts/build-docs/build-decision.js +240 -0
  277. package/scripts/build-docs/cache-utils.js +105 -0
  278. package/scripts/build-docs/content-normalization.js +150 -0
  279. package/scripts/build-docs/file-utils.js +105 -0
  280. package/scripts/build-docs/git-utils.js +86 -0
  281. package/scripts/build-docs/hash-utils.js +116 -0
  282. package/scripts/build-docs/typedoc-runner.js +220 -0
  283. package/scripts/build-docs-incremental.js +77 -913
  284. package/scripts/utils/command-runner.js +16 -11
  285. package/scripts/validate-formats.js +61 -56
  286. package/scripts/validate-master.js +74 -69
  287. package/scripts/validate-pre-publish.js +70 -65
  288. package/src/__tests__/hooks/usePermissions.test.ts +2 -2
  289. package/src/components/Alert/Alert.test.tsx +12 -18
  290. package/src/components/Alert/Alert.tsx +5 -7
  291. package/src/components/Avatar/Avatar.test.tsx +4 -4
  292. package/src/components/Badge/Badge.tsx +14 -0
  293. package/src/components/Button/Button.tsx +22 -0
  294. package/src/components/Calendar/Calendar.tsx +8 -2
  295. package/src/components/Card/Card.tsx +4 -0
  296. package/src/components/Checkbox/Checkbox.test.tsx +12 -12
  297. package/src/components/Checkbox/Checkbox.tsx +2 -2
  298. package/src/components/DataTable/DataTable.tsx +38 -4
  299. package/src/components/DataTable/__tests__/DataTableCore.test-setup.ts +5 -6
  300. package/src/components/DataTable/__tests__/pagination.modes.test.tsx +18 -4
  301. package/src/components/DataTable/__tests__/test-utils/sharedTestUtils.tsx +2 -3
  302. package/src/components/DataTable/components/AccessDeniedPage.tsx +16 -25
  303. package/src/components/DataTable/components/ActionButtons.tsx +10 -7
  304. package/src/components/DataTable/components/BulkOperationsDropdown.tsx +1 -1
  305. package/src/components/DataTable/components/ColumnFilter.tsx +10 -0
  306. package/src/components/DataTable/components/ColumnVisibilityDropdown.tsx +12 -0
  307. package/src/components/DataTable/components/DataTableBody.tsx +8 -0
  308. package/src/components/DataTable/components/DataTableCore.tsx +196 -554
  309. package/src/components/DataTable/components/DataTableErrorBoundary.tsx +11 -0
  310. package/src/components/DataTable/components/DataTableLayout.tsx +559 -0
  311. package/src/components/DataTable/components/DataTableModals.tsx +8 -0
  312. package/src/components/DataTable/components/DataTableToolbar.tsx +8 -0
  313. package/src/components/DataTable/components/DraggableColumnHeader.tsx +12 -0
  314. package/src/components/DataTable/components/EditFields.tsx +307 -0
  315. package/src/components/DataTable/components/EditableRow.tsx +8 -0
  316. package/src/components/DataTable/components/EmptyState.tsx +10 -0
  317. package/src/components/DataTable/components/FilterRow.tsx +12 -0
  318. package/src/components/DataTable/components/GroupHeader.tsx +12 -0
  319. package/src/components/DataTable/components/GroupingDropdown.tsx +12 -0
  320. package/src/components/DataTable/components/ImportModal.tsx +7 -0
  321. package/src/components/DataTable/components/LoadingState.tsx +6 -0
  322. package/src/components/DataTable/components/PaginationControls.tsx +16 -1
  323. package/src/components/DataTable/components/RowComponent.tsx +391 -0
  324. package/src/components/DataTable/components/UnifiedTableBody.tsx +61 -849
  325. package/src/components/DataTable/components/VirtualizedDataTable.tsx +16 -4
  326. package/src/components/DataTable/components/__tests__/AccessDeniedPage.test.tsx +4 -2
  327. package/src/components/DataTable/components/cellValueUtils.ts +40 -0
  328. package/src/components/DataTable/components/hooks/useImportModalFocus.ts +53 -0
  329. package/src/components/DataTable/components/hooks/usePermissionTracking.ts +126 -0
  330. package/src/components/DataTable/context/DataTableContext.tsx +50 -0
  331. package/src/components/DataTable/core/ColumnFactory.ts +31 -0
  332. package/src/components/DataTable/core/DataTableContext.tsx +32 -1
  333. package/src/components/DataTable/hooks/useColumnOrderPersistence.ts +10 -0
  334. package/src/components/DataTable/hooks/useColumnReordering.ts +12 -0
  335. package/src/components/DataTable/hooks/useColumnVisibilityPersistence.ts +10 -0
  336. package/src/components/DataTable/hooks/useDataTableDataPipeline.ts +16 -0
  337. package/src/components/DataTable/hooks/useDataTablePermissions.ts +124 -32
  338. package/src/components/DataTable/hooks/useDataTableState.ts +35 -1
  339. package/src/components/DataTable/hooks/useEffectiveColumnOrder.ts +12 -0
  340. package/src/components/DataTable/hooks/useServerSideDataEffect.ts +11 -0
  341. package/src/components/DataTable/hooks/useTableColumns.ts +8 -0
  342. package/src/components/DataTable/hooks/useTableHandlers.ts +14 -0
  343. package/src/components/DataTable/styles.ts +6 -6
  344. package/src/components/DataTable/types.ts +6 -10
  345. package/src/components/DataTable/utils/a11yUtils.ts +7 -0
  346. package/src/components/DataTable/utils/debugTools.ts +18 -113
  347. package/src/components/DataTable/utils/errorHandling.ts +12 -0
  348. package/src/components/DataTable/utils/exportUtils.ts +9 -0
  349. package/src/components/DataTable/utils/flexibleImport.ts +12 -48
  350. package/src/components/DataTable/utils/paginationUtils.ts +8 -0
  351. package/src/components/DataTable/utils/performanceUtils.ts +5 -1
  352. package/src/components/Dialog/Dialog.tsx +2 -2
  353. package/src/components/ErrorBoundary/ErrorBoundary.test.tsx +180 -1
  354. package/src/components/ErrorBoundary/ErrorBoundary.tsx +45 -5
  355. package/src/components/ErrorBoundary/ErrorBoundaryContext.tsx +129 -0
  356. package/src/components/ErrorBoundary/index.ts +27 -2
  357. package/src/components/EventSelector/EventSelector.tsx +3 -0
  358. package/src/components/FileDisplay/FileDisplay.tsx +32 -18
  359. package/src/components/FileUpload/FileUpload.tsx +22 -2
  360. package/src/components/Footer/Footer.test.tsx +16 -16
  361. package/src/components/Footer/Footer.tsx +14 -11
  362. package/src/components/Form/Form.tsx +1 -0
  363. package/src/components/Header/Header.tsx +21 -10
  364. package/src/components/Input/Input.test.tsx +2 -2
  365. package/src/components/Input/Input.tsx +8 -4
  366. package/src/components/LoadingSpinner/LoadingSpinner.test.tsx +4 -4
  367. package/src/components/LoginForm/LoginForm.tsx +4 -0
  368. package/src/components/NavigationMenu/NavigationMenu.tsx +14 -513
  369. package/src/components/NavigationMenu/types.ts +56 -0
  370. package/src/components/NavigationMenu/useNavigationFiltering.ts +390 -0
  371. package/src/components/OrganisationSelector/OrganisationSelector.tsx +3 -0
  372. package/src/components/PaceAppLayout/PaceAppLayout.test.tsx +4 -2
  373. package/src/components/PaceAppLayout/PaceAppLayout.tsx +32 -11
  374. package/src/components/PaceAppLayout/test-setup.tsx +1 -2
  375. package/src/components/PaceLoginPage/PaceLoginPage.tsx +3 -0
  376. package/src/components/PasswordChange/PasswordChangeForm.tsx +9 -0
  377. package/src/components/ProtectedRoute/ProtectedRoute.tsx +3 -9
  378. package/src/components/PublicLayout/PublicPageLayout.tsx +2 -5
  379. package/src/components/PublicLayout/PublicPageProvider.tsx +4 -0
  380. package/src/components/Select/Select.tsx +80 -434
  381. package/src/components/Select/context.ts +23 -0
  382. package/src/components/Select/hooks/useSelectEvents.ts +87 -0
  383. package/src/components/Select/hooks/useSelectSearch.ts +91 -0
  384. package/src/components/Select/hooks/useSelectState.ts +104 -0
  385. package/src/components/Select/index.ts +9 -1
  386. package/src/components/Select/types.ts +123 -0
  387. package/src/components/Select/utils/text.ts +26 -0
  388. package/src/components/SessionRestorationLoader/SessionRestorationLoader.tsx +4 -5
  389. package/src/components/Switch/Switch.tsx +4 -4
  390. package/src/components/Tabs/Tabs.tsx +1 -1
  391. package/src/components/Toast/Toast.tsx +4 -0
  392. package/src/components/Tooltip/Tooltip.tsx +2 -2
  393. package/src/components/UserMenu/UserMenu.test.tsx +24 -11
  394. package/src/components/UserMenu/UserMenu.tsx +21 -18
  395. package/src/components/index.ts +2 -2
  396. package/src/hooks/__tests__/index.unit.test.ts +2 -5
  397. package/src/hooks/index.ts +1 -2
  398. package/src/hooks/public/usePublicEvent.ts +4 -0
  399. package/src/hooks/public/usePublicEventLogo.ts +4 -0
  400. package/src/hooks/public/usePublicFileDisplay.ts +4 -0
  401. package/src/hooks/public/usePublicRouteParams.ts +4 -0
  402. package/src/hooks/services/useAuth.ts +32 -0
  403. package/src/hooks/services/useCurrentEvent.ts +6 -0
  404. package/src/hooks/services/useCurrentOrganisation.ts +6 -0
  405. package/src/hooks/useDebounce.ts +9 -0
  406. package/src/hooks/useEventTheme.ts +6 -0
  407. package/src/hooks/useFileDisplay.ts +4 -0
  408. package/src/hooks/useFileReference.ts +25 -7
  409. package/src/hooks/useFileUrl.ts +11 -1
  410. package/src/hooks/useFocusManagement.ts +14 -0
  411. package/src/hooks/useFocusTrap.ts +3 -0
  412. package/src/hooks/useInactivityTracker.ts +3 -0
  413. package/src/hooks/useKeyboardShortcuts.ts +4 -0
  414. package/src/hooks/useOrganisationPermissions.ts +4 -0
  415. package/src/hooks/useOrganisationSecurity.ts +4 -0
  416. package/src/hooks/usePerformanceMonitor.ts +4 -0
  417. package/src/hooks/usePermissionCache.ts +7 -0
  418. package/src/hooks/useQueryCache.ts +12 -1
  419. package/src/hooks/useSessionRestoration.ts +4 -0
  420. package/src/hooks/useStorage.ts +4 -0
  421. package/src/hooks/useToast.ts +1 -1
  422. package/src/index.ts +2 -1
  423. package/src/providers/__tests__/OrganisationProvider.test.tsx +92 -70
  424. package/src/providers/services/AuthServiceProvider.tsx +18 -0
  425. package/src/providers/services/EventServiceProvider.tsx +18 -0
  426. package/src/providers/services/InactivityServiceProvider.tsx +18 -0
  427. package/src/providers/services/OrganisationServiceProvider.tsx +18 -0
  428. package/src/providers/services/UnifiedAuthProvider.tsx +36 -0
  429. package/src/providers/services/__tests__/AuthServiceProvider.integration.test.tsx +29 -13
  430. package/src/rbac/README.md +1 -1
  431. package/src/rbac/__tests__/adapters.comprehensive.test.tsx +2 -2
  432. package/src/rbac/__tests__/scenarios.user-role.test.tsx +4 -5
  433. package/src/rbac/adapters.tsx +14 -5
  434. package/src/rbac/api.ts +100 -67
  435. package/src/rbac/components/NavigationProvider.tsx +4 -1
  436. package/src/rbac/components/PagePermissionGuard.tsx +157 -17
  437. package/src/rbac/components/RoleBasedRouter.tsx +5 -1
  438. package/src/rbac/components/SecureDataProvider.test.tsx +84 -49
  439. package/src/rbac/components/SecureDataProvider.tsx +20 -5
  440. package/src/rbac/components/__tests__/PagePermissionGuard.race-condition.test.tsx +24 -14
  441. package/src/rbac/components/__tests__/PagePermissionGuard.test.tsx +7 -0
  442. package/src/rbac/components/__tests__/PagePermissionGuard.verification.test.tsx +14 -6
  443. package/src/rbac/components/__tests__/RoleBasedRouter.test.tsx +15 -4
  444. package/src/rbac/components/__tests__/SecureDataProvider.fixed.test.tsx +148 -24
  445. package/src/rbac/components/__tests__/SecureDataProvider.test.tsx +81 -15
  446. package/src/rbac/engine.ts +38 -14
  447. package/src/rbac/hooks/permissions/index.ts +7 -0
  448. package/src/rbac/hooks/permissions/useAccessLevel.ts +105 -0
  449. package/src/rbac/hooks/permissions/useCachedPermissions.ts +79 -0
  450. package/src/rbac/hooks/permissions/useCan.ts +347 -0
  451. package/src/rbac/hooks/permissions/useHasAllPermissions.ts +90 -0
  452. package/src/rbac/hooks/permissions/useHasAnyPermission.ts +90 -0
  453. package/src/rbac/hooks/permissions/useMultiplePermissions.ts +93 -0
  454. package/src/rbac/hooks/permissions/usePermissions.ts +253 -0
  455. package/src/rbac/hooks/useCan.test.ts +71 -64
  456. package/src/rbac/hooks/usePermissions.ts +14 -995
  457. package/src/rbac/hooks/useResourcePermissions.test.ts +54 -18
  458. package/src/rbac/hooks/useResourcePermissions.ts +14 -4
  459. package/src/rbac/hooks/useSecureSupabase.ts +33 -13
  460. package/src/rbac/permissions.ts +0 -30
  461. package/src/rbac/secureClient.ts +200 -61
  462. package/src/rbac/types.ts +8 -0
  463. package/src/theming/__tests__/parseEventColours.test.ts +6 -9
  464. package/src/theming/parseEventColours.ts +5 -19
  465. package/src/types/vitest-globals.d.ts +51 -26
  466. package/src/utils/__mocks__/supabaseMock.ts +1 -3
  467. package/src/utils/__tests__/formatting.unit.test.ts +4 -4
  468. package/src/utils/__tests__/index.unit.test.ts +2 -2
  469. package/src/utils/audit/audit.ts +0 -3
  470. package/src/utils/core/cn.ts +1 -1
  471. package/src/utils/file-reference/index.ts +53 -1
  472. package/src/utils/formatting/formatting.ts +8 -18
  473. package/src/utils/index.ts +0 -1
  474. package/dist/chunk-3QRJFVBR.js.map +0 -1
  475. package/dist/chunk-3XTALGJF.js.map +0 -1
  476. package/dist/chunk-4N5C5XZU.js.map +0 -1
  477. package/dist/chunk-4ZC4GX36.js.map +0 -1
  478. package/dist/chunk-BYFSK72L.js.map +0 -1
  479. package/dist/chunk-EXUD6RNJ.js +0 -451
  480. package/dist/chunk-EXUD6RNJ.js.map +0 -1
  481. package/dist/chunk-GLK6VM3F.js.map +0 -1
  482. package/dist/chunk-I7PSE6JW.js.map +0 -1
  483. package/dist/chunk-JBKQ3SAO.js.map +0 -1
  484. package/dist/chunk-KNC55RTG.js.map +0 -1
  485. package/dist/chunk-LXQLPRQ2.js.map +0 -1
  486. package/dist/chunk-R77UEZ4E.js.map +0 -1
  487. package/dist/chunk-SQGMNID3.js.map +0 -1
  488. package/dist/chunk-T33XF5ZC.js.map +0 -1
  489. package/dist/chunk-XM25TVIE.js.map +0 -1
  490. package/docs/api/classes/ErrorBoundary.md +0 -144
  491. package/docs/migration/quick-migration-guide.md +0 -356
  492. package/docs/migration/service-architecture.md +0 -281
  493. package/src/hooks/__tests__/useSecureDataAccess.unit.test.tsx +0 -680
  494. package/src/hooks/useSecureDataAccess.test.ts +0 -559
  495. package/src/hooks/useSecureDataAccess.ts +0 -681
  496. /package/dist/{DataTable-DQ7RSOHE.js.map → DataTable-TPTKCX4D.js.map} +0 -0
  497. /package/dist/{UnifiedAuthProvider-ATAP5UTR.js.map → UnifiedAuthProvider-CH6Z342H.js.map} +0 -0
  498. /package/dist/{api-N774RPUA.js.map → api-MVVQZLJI.js.map} +0 -0
  499. /package/docs/migration/{organisation-context-timing-fix.md → V0.3.44_organisation-context-timing-fix.md} +0 -0
  500. /package/docs/migration/{rbac-migration.md → V0.4.0_rbac-migration.md} +0 -0
  501. /package/docs/migration/{person-scoped-profiles-migration-guide.md → V0.5.190_person-scoped-profiles-migration-guide.md} +0 -0
  502. /package/docs/migration/{REACT_19_MIGRATION.md → V0.6.0_REACT_19_MIGRATION.md} +0 -0
@@ -123,6 +123,167 @@ The RBAC system uses a **single source of truth** approach:
123
123
  - All functions use `rbac_organisation_roles` table for role management
124
124
  - Views inherit RLS policies from the underlying `rbac_organisation_roles` table
125
125
 
126
+ ## App Access Tables Architecture
127
+
128
+ The system uses three complementary tables to manage app availability and user permissions:
129
+
130
+ ### Table Relationship Overview
131
+
132
+ | Table | Purpose | Question It Answers |
133
+ |-------|---------|-------------------|
134
+ | `core_organisation_app_access` | Organisation-level app configuration | "Is this app available for this organisation?" |
135
+ | `core_event_app_access` | Event-level app availability | "Is this app available for this event?" |
136
+ | `rbac_event_app_roles` | User-specific role grants | "Who can do what for this event-app?" |
137
+
138
+ ### 1. `core_organisation_app_access`
139
+
140
+ **Purpose:** Organisation-level app configuration and feature flags.
141
+
142
+ **Schema:**
143
+ ```sql
144
+ CREATE TABLE core_organisation_app_access (
145
+ id UUID PRIMARY KEY DEFAULT gen_random_uuid(),
146
+ organisation_id UUID NOT NULL REFERENCES core_organisations(id) ON DELETE CASCADE,
147
+ app_id UUID NOT NULL REFERENCES rbac_apps(id),
148
+ is_enabled BOOLEAN DEFAULT true,
149
+ settings JSONB DEFAULT '{}',
150
+ created_at TIMESTAMPTZ DEFAULT NOW(),
151
+ updated_at TIMESTAMPTZ DEFAULT NOW(),
152
+ created_by UUID REFERENCES auth.users(id),
153
+ updated_by UUID REFERENCES auth.users(id)
154
+ );
155
+ ```
156
+
157
+ **Use Cases:**
158
+ - Enable/disable apps at the organisation level
159
+ - Store organisation-specific app settings (e.g., feature flags, configuration)
160
+ - Control which apps are available to an organisation
161
+
162
+ **Key Characteristics:**
163
+ - Organisation-scoped (one record per organisation-app combination)
164
+ - Contains `is_enabled` flag for feature toggling
165
+ - Contains `settings` JSONB field for app-specific configuration
166
+
167
+ ### 2. `core_event_app_access`
168
+
169
+ **Purpose:** Event-level app availability flag.
170
+
171
+ **Schema:**
172
+ ```sql
173
+ CREATE TABLE core_event_app_access (
174
+ id UUID PRIMARY KEY DEFAULT gen_random_uuid(),
175
+ event_id VARCHAR NOT NULL REFERENCES core_events(event_id),
176
+ app_id UUID NOT NULL REFERENCES rbac_apps(id) ON DELETE CASCADE,
177
+ organisation_id UUID NOT NULL REFERENCES core_organisations(id),
178
+ created_at TIMESTAMPTZ DEFAULT NOW() NOT NULL,
179
+ updated_at TIMESTAMPTZ DEFAULT NOW() NOT NULL,
180
+ created_by UUID REFERENCES auth.users(id),
181
+ updated_by UUID REFERENCES auth.users(id),
182
+ CONSTRAINT core_event_app_access_unique UNIQUE (event_id, app_id, organisation_id)
183
+ );
184
+ ```
185
+
186
+ **Use Cases:**
187
+ - Enable an app for a specific event
188
+ - Track which apps are available for each event
189
+ - Quick check: "Is this app enabled for this event?"
190
+
191
+ **Key Characteristics:**
192
+ - Event-scoped (one record per event-app-organisation combination)
193
+ - Unique constraint prevents duplicate entries
194
+ - Simple boolean flag (existence = enabled)
195
+
196
+ ### 3. `rbac_event_app_roles`
197
+
198
+ **Purpose:** User-specific role grants for event-app combinations.
199
+
200
+ **Schema:**
201
+ ```sql
202
+ CREATE TABLE rbac_event_app_roles (
203
+ id UUID PRIMARY KEY DEFAULT gen_random_uuid(),
204
+ user_id UUID NOT NULL REFERENCES auth.users(id) ON DELETE CASCADE,
205
+ event_id VARCHAR NOT NULL REFERENCES core_events(event_id) ON DELETE CASCADE,
206
+ app_id UUID NOT NULL REFERENCES rbac_apps(id),
207
+ organisation_id UUID NOT NULL REFERENCES core_organisations(id),
208
+ role rbac_event_app_role NOT NULL, -- ENUM: 'viewer', 'participant', 'planner', 'event_admin'
209
+ status TEXT NOT NULL DEFAULT 'active' CHECK (status IN ('active', 'inactive', 'suspended')),
210
+ granted_at TIMESTAMPTZ DEFAULT NOW(),
211
+ granted_by UUID REFERENCES auth.users(id),
212
+ valid_from TIMESTAMPTZ DEFAULT NOW(),
213
+ valid_to TIMESTAMPTZ,
214
+ CONSTRAINT rbac_event_app_roles_unique UNIQUE (user_id, event_id, app_id, role)
215
+ );
216
+ ```
217
+
218
+ **Use Cases:**
219
+ - Grant specific roles to users for event-app combinations
220
+ - Control what users can do (viewer, participant, planner, event_admin)
221
+ - Time-based role validity (valid_from, valid_to)
222
+ - Role status management (active, inactive, suspended)
223
+
224
+ **Key Characteristics:**
225
+ - User-scoped (one record per user-event-app-role combination)
226
+ - Includes role hierarchy and permissions
227
+ - Time-based validity support
228
+ - Status tracking for role lifecycle
229
+
230
+ ### Relationship Summary
231
+
232
+ **Access Tables = "Is this app available?"**
233
+ - `core_organisation_app_access`: Organisation-level availability and settings
234
+ - `core_event_app_access`: Event-level availability flag
235
+
236
+ **Roles Table = "Who can do what?"**
237
+ - `rbac_event_app_roles`: User-specific role grants with permissions
238
+
239
+ ### Important Notes
240
+
241
+ 1. **Separation of Concerns:**
242
+ - Access tables handle **configuration** (feature flags, availability)
243
+ - Roles table handles **authorization** (user permissions)
244
+
245
+ 2. **Independence:**
246
+ - Access records can exist without roles (app enabled, no users yet)
247
+ - Roles can exist without access records (legacy data or data inconsistency)
248
+ - These are intentionally independent to allow flexible configuration
249
+
250
+ 3. **Performance:**
251
+ - Access tables provide fast feature flag checks without querying user roles
252
+ - Roles table provides detailed permission information when needed
253
+
254
+ 4. **Data Integrity:**
255
+ - `core_event_app_access` has unique constraint on `(event_id, app_id, organisation_id)`
256
+ - `rbac_event_app_roles` has unique constraint on `(user_id, event_id, app_id, role)`
257
+
258
+ ### Example Usage Patterns
259
+
260
+ ```sql
261
+ -- Check if app is available for an event (configuration check)
262
+ SELECT EXISTS (
263
+ SELECT 1 FROM core_event_app_access
264
+ WHERE event_id = 'event-123'
265
+ AND app_id = 'app-456'
266
+ AND organisation_id = 'org-789'
267
+ );
268
+
269
+ -- Check if user has access to an event-app (authorization check)
270
+ SELECT EXISTS (
271
+ SELECT 1 FROM rbac_event_app_roles
272
+ WHERE user_id = 'user-abc'
273
+ AND event_id = 'event-123'
274
+ AND app_id = 'app-456'
275
+ AND status = 'active'
276
+ AND valid_from <= NOW()
277
+ AND (valid_to IS NULL OR valid_to > NOW())
278
+ );
279
+
280
+ -- Get organisation-level app settings
281
+ SELECT settings FROM core_organisation_app_access
282
+ WHERE organisation_id = 'org-789'
283
+ AND app_id = 'app-456'
284
+ AND is_enabled = true;
285
+ ```
286
+
126
287
  ## Required RPC Functions
127
288
 
128
289
  The following RPC functions are required and should be updated to use the correct tables/views:
@@ -10,7 +10,7 @@ reviewedBy: documentation-standards-audit
10
10
 
11
11
  PACE Core provides a comprehensive Role-Based Access Control (RBAC) system that manages user permissions through roles, ensuring secure and scalable access control across your application.
12
12
 
13
- > **🔄 Migrating?** If you're upgrading from the legacy RBAC system, see the [Migration Guide](../migration/rbac-migration.md) for step-by-step instructions.
13
+ > **🔄 Migrating?** If you're upgrading from the legacy RBAC system, see the [Migration Guide](../migration/V0.4.0_rbac-migration.md) for step-by-step instructions.
14
14
 
15
15
  > **⚠️ IMPORTANT**: You **must** call `setupRBAC()` before using any RBAC features. See the [Quick Start Guide](../rbac/quick-start.md) for setup instructions.
16
16
 
@@ -278,7 +278,7 @@ If you're upgrading from a system with hardcoded permissions:
278
278
  3. **Replace 'manage' Operations** - Use specific CRUD operations instead
279
279
  4. **Enable Cache Invalidation** - Ensure realtime subscriptions are active
280
280
 
281
- For detailed migration instructions, see the **[RBAC Migration Guide](../migration/rbac-migration.md)**.
281
+ For detailed migration instructions, see the **[RBAC Migration Guide](../migration/V0.4.0_rbac-migration.md)**.
282
282
 
283
283
  ## What's Next?
284
284
 
@@ -286,7 +286,7 @@ For detailed migration instructions, see the **[RBAC Migration Guide](../migrati
286
286
  - **[RBAC Quick Start](../rbac/quick-start.md)** - Build your first RBAC-enabled app
287
287
  - **[RBAC API Reference](../rbac/api-reference.md)** - Complete API documentation
288
288
  - **[RBAC Examples](../rbac/examples.md)** - Practical usage examples
289
- - **[Migration Guide](../migration/rbac-migration.md)** - Migrate from legacy RBAC
289
+ - **[Migration Guide](../migration/V0.4.0_rbac-migration.md)** - Migrate from legacy RBAC
290
290
  - **[Installation](../getting-started/installation-guide.md)** - Get PACE Core set up
291
291
  - **[Authentication](./authentication.md)** - Understand authentication system
292
292
  - **[Organisations](./organisations.md)** - Learn about multi-tenancy
@@ -96,10 +96,8 @@ This index mirrors the folder layout in `packages/core/docs/` so teams can quick
96
96
 
97
97
  - [Migration overview](./migration/README.md)
98
98
  - [Unified migration guide](./migration/MIGRATION_GUIDE.md)
99
- - [Quick migration guide](./migration/quick-migration-guide.md)
100
- - [Organisation context timing fix](./migration/organisation-context-timing-fix.md)
101
- - [Service architecture changes](./migration/service-architecture.md)
102
- - [RBAC migration](./migration/rbac-migration.md)
99
+ - [Organisation context timing fix](./migration/V0.3.44_organisation-context-timing-fix.md)
100
+ - [RBAC migration](./migration/V0.4.0_rbac-migration.md)
103
101
  - [Tailwind scanning updates](./migration/v0.4.15-tailwind-scanning.md)
104
102
  - [CSS-first migration (v0.4.16)](./migration/v0.4.16-css-first-approach.md)
105
103
  - [Source path fix (v0.4.17)](./migration/v0.4.17-source-path-fix.md)
@@ -42,7 +42,7 @@ npm run setup:cursor-rules
42
42
 
43
43
  The script will:
44
44
  - Create `.cursor/rules/` directory if it doesn't exist
45
- - Copy all pace-core rules (00-07) to your project
45
+ - Copy all pace-core rules (00-08) to your project
46
46
  - **Automatically update** pace-core rules (00-09) if they've changed
47
47
  - Preserve any existing custom rules (50+)
48
48
  - Skip files that are already up to date
@@ -67,6 +67,7 @@ The installed rules are numbered for ordering:
67
67
  - **05-bug-reports-and-features.mdc** - Templates for bug reports (guidance-only)
68
68
  - **06-code-quality.mdc** - Enforce code quality standards
69
69
  - **07-tech-stack-compliance.mdc** - Enforce tech stack versions and patterns
70
+ - **08-markup-quality.mdc** - Enforce clean markup standards, semantic HTML usage, and pace-core component patterns
70
71
 
71
72
  ## Using Rules with Cursor
72
73
 
@@ -0,0 +1,441 @@
1
+ # Documentation Structure Guidelines
2
+
3
+ **Purpose:** Define clear structure and responsibilities for CHANGELOG.md and migration documentation to prevent overlap and maintain single source of truth.
4
+
5
+ ## Documentation Hierarchy
6
+
7
+ ```
8
+ CHANGELOG.md (High-level announcements, links to detailed guides)
9
+ ├── docs/migration/README.md (Index/navigation)
10
+ ├── docs/migration/MIGRATION_GUIDE.md (General migration patterns)
11
+ ├── docs/migration/V0.X_TO_V0.Y_MIGRATION.md (Version-specific migrations)
12
+ ├── docs/migration/V0.6.0_REACT_19_MIGRATION.md (Feature-specific migrations)
13
+ ├── docs/migration/database-changes-december-2025.md (Database-specific)
14
+ └── docs/migration/V0.5.190_person-scoped-profiles-migration-guide.md (Feature-specific)
15
+ ```
16
+
17
+ ## CHANGELOG.md Responsibilities
18
+
19
+ ### ✅ What CHANGELOG.md SHOULD Include
20
+
21
+ 1. **High-Level Announcements**
22
+ - Breaking changes summary
23
+ - New features summary
24
+ - Deprecations summary
25
+ - Bug fixes summary
26
+
27
+ 2. **Brief Summaries**
28
+ - One-line descriptions of changes
29
+ - Key impact statements
30
+ - Version numbers and dates
31
+
32
+ 3. **Links to Detailed Guides**
33
+ - Links to migration guides for breaking changes
34
+ - Links to feature documentation
35
+ - Links to troubleshooting guides
36
+
37
+ 4. **Quick Migration Notes**
38
+ - Brief "what changed" statements
39
+ - Links to detailed migration guides
40
+ - Critical warnings (e.g., "⚠️ CRITICAL: Database migrations required")
41
+
42
+ ### ❌ What CHANGELOG.md SHOULD NOT Include
43
+
44
+ 1. **Detailed Migration Steps**
45
+ - Step-by-step instructions
46
+ - Code examples (unless very brief)
47
+ - Configuration file examples
48
+ - Troubleshooting details
49
+
50
+ 2. **Duplicate Content**
51
+ - Content that exists in migration guides
52
+ - Detailed explanations already in docs
53
+ - Long code blocks
54
+
55
+ 3. **Version-Specific Details**
56
+ - Detailed version upgrade paths
57
+ - Specific migration commands
58
+ - Database migration file names (unless critical)
59
+
60
+ ## Migration Documentation Responsibilities
61
+
62
+ ### ✅ What Migration Docs SHOULD Include
63
+
64
+ 1. **Step-by-Step Instructions**
65
+ - Detailed migration steps
66
+ - Code examples (before/after)
67
+ - Configuration changes
68
+ - Command-line instructions
69
+
70
+ 2. **Code Examples**
71
+ - Before/after code comparisons
72
+ - Complete working examples
73
+ - Common patterns and anti-patterns
74
+
75
+ 3. **Troubleshooting**
76
+ - Common issues and solutions
77
+ - Error messages and fixes
78
+ - Edge cases
79
+
80
+ 4. **Complete Context**
81
+ - Why changes were made
82
+ - Impact analysis
83
+ - Migration timeline
84
+ - Testing checklists
85
+
86
+ ### ❌ What Migration Docs SHOULD NOT Include
87
+
88
+ 1. **High-Level Summaries**
89
+ - Brief announcements (that's CHANGELOG's job)
90
+ - Marketing-style descriptions
91
+ - Non-actionable information
92
+
93
+ 2. **Duplicate Content**
94
+ - Content duplicated from other migration guides
95
+ - Content that should be in CHANGELOG
96
+
97
+ ## Content Strategy by Type
98
+
99
+ ### Breaking Changes
100
+
101
+ **CHANGELOG.md:**
102
+ ```markdown
103
+ ## [0.6.0] - 2025-01-28
104
+
105
+ ### Changed
106
+ - **BREAKING**: Upgraded from React 18.3.1 to React 19.2.3
107
+ - **BREAKING**: Database schema changes (table naming standardization)
108
+
109
+ ### Migration Notes
110
+ - **React 19 Upgrade**: See [React 19 Migration Guide](./docs/migration/V0.6.0_REACT_19_MIGRATION.md)
111
+ - **Database Changes**: See [v0.5.190 → v0.6.1 Migration Guide](./docs/migration/V0.5.190_TO_V0.6.1_MIGRATION.md)
112
+ ```
113
+
114
+ **Migration Doc:**
115
+ ```markdown
116
+ # React 19 Migration Guide
117
+
118
+ ## Step 1: Update Dependencies
119
+
120
+ ```bash
121
+ npm install react@^19.2.3 react-dom@^19.2.3
122
+ ```
123
+
124
+ ## Step 2: Update Vite Configuration
125
+
126
+ ```typescript
127
+ export default defineConfig({
128
+ plugins: [
129
+ react({
130
+ babel: {
131
+ plugins: ['babel-plugin-react-compiler'],
132
+ },
133
+ }),
134
+ ],
135
+ })
136
+ ```
137
+
138
+ [... detailed steps ...]
139
+ ```
140
+
141
+ ### New Features
142
+
143
+ **CHANGELOG.md:**
144
+ ```markdown
145
+ ### Added
146
+ - **useFormDialog Hook**: Generic React hook for managing form dialog state
147
+ - **DateTimeField Component**: Form input component for datetime values with automatic UTC ↔ timezone conversion
148
+ ```
149
+
150
+ **Migration Doc (if needed):**
151
+ ```markdown
152
+ # Using New Features
153
+
154
+ ## useFormDialog Hook
155
+
156
+ ```tsx
157
+ import { useFormDialog } from '@jmruthers/pace-core';
158
+
159
+ const formDialog = useFormDialog<FormData>({
160
+ defaultValues: { name: '', email: '' }
161
+ });
162
+ ```
163
+
164
+ [... usage examples ...]
165
+ ```
166
+
167
+ ### Minor Version Changes
168
+
169
+ **CHANGELOG.md:**
170
+ ```markdown
171
+ ## [0.5.109] - 2025-11-03
172
+
173
+ ### Changed
174
+ - **Session Tracking Hook API**: Removed `trackLogin()` and `trackLogout()` methods
175
+
176
+ ### Migration Guide
177
+
178
+ ### Upgrading from 0.5.108 to 0.5.109
179
+
180
+ **Breaking Change**: The `useSessionTracking` hook no longer provides `trackLogin()` and `trackLogout()` methods.
181
+
182
+ **Migration Steps:**
183
+ 1. Remove manual tracking calls
184
+ 2. Keep event switch tracking
185
+ 3. Apply database migrations
186
+
187
+ [... brief migration guide ...]
188
+ ```
189
+
190
+ **Note:** For minor versions, it's acceptable to include brief migration guides directly in CHANGELOG if they're simple. For complex migrations, create a dedicated migration guide.
191
+
192
+ ## File Naming Conventions
193
+
194
+ ### Migration Guides
195
+
196
+ All migration guides should include version or date stamps in their filenames for clarity:
197
+
198
+ - **Version-specific**: `V0.X_TO_V0.Y_MIGRATION.md`
199
+ - Example: `V0.5.190_TO_V0.6.1_MIGRATION.md`
200
+ - ✅ Already includes version numbers
201
+
202
+ - **Feature-specific**: `V{VERSION}_{FEATURE}-migration.md` or `V{VERSION}_{FEATURE}-migration-guide.md`
203
+ - Example: `V0.6.0_REACT_19_MIGRATION.md` (introduced in v0.6.0)
204
+ - Example: `V0.5.190_person-scoped-profiles-migration-guide.md` (introduced in v0.5.190)
205
+ - **Rationale**: Version at start ensures chronological sorting and makes it clear which version introduced the feature
206
+
207
+ - **Database-specific**: `database-changes-{DATE}.md` or `database-changes-{DATE}-V{VERSION}.md`
208
+ - Example: `database-changes-december-2025.md` (date-based, already in use)
209
+ - Example: `database-changes-december-2025-V0.5.190.md` (if version context needed)
210
+ - **Rationale**: Dates are clear for database changes, but version can help if needed
211
+
212
+ - **General/Topic-specific**: `V{VERSION}_{TOPIC}-migration.md` or `{DATE}_{TOPIC}-migration.md`
213
+ - Example: `V0.4.0_rbac-migration.md` (if version-specific)
214
+ - Example: `V0.3.44_organisation-context-timing-fix.md` (if version-specific)
215
+ - **Rationale**: Version at start ensures chronological sorting. Use version if tied to specific release, date if it's a fix/change
216
+
217
+ ### Naming Rules
218
+
219
+ 1. **Always include version or date** - Makes it clear when/what the migration relates to
220
+ 2. **Version at the start** - Put version number at the beginning of filename for chronological sorting
221
+ 3. **Use version for feature migrations** - Tied to specific release
222
+ 4. **Use date for database changes** - Clear chronological reference
223
+ 5. **Use version for fixes** - Tied to specific release
224
+ 6. **Be consistent** - Follow the pattern once established
225
+
226
+ ### Documentation Files (No Version Needed)
227
+
228
+ These are general documentation files that don't need version stamps:
229
+
230
+ - **Index**: `README.md`
231
+ - **General Guide**: `MIGRATION_GUIDE.md` (includes quick reference table)
232
+ - **Structure Guidelines**: `DOCUMENTATION_STRUCTURE.md`
233
+
234
+ ### Migration Guides (Version Required)
235
+
236
+ **All migration guides must include version or date stamps:**
237
+
238
+ - ✅ `V0.6.0_REACT_19_MIGRATION.md` - Feature migration with version at start
239
+ - ✅ `V0.5.190_person-scoped-profiles-migration-guide.md` - Feature migration with version at start
240
+ - ✅ `V0.3.44_organisation-context-timing-fix.md` - Fix migration with version at start
241
+ - ✅ `V0.5.190_TO_V0.6.1_MIGRATION.md` - Version-specific migration
242
+ - ✅ `database-changes-december-2025.md` - Database changes with date
243
+ - ✅ `V0.4.0_rbac-migration.md` - RBAC migration (introduced in v0.4.0)
244
+ - ✅ Service architecture documentation is in `/docs/architecture/services.md` (not a migration guide)
245
+
246
+ ## Link Strategy
247
+
248
+ ### From CHANGELOG to Migration Docs
249
+
250
+ Always use relative paths:
251
+ ```markdown
252
+ - See [React 19 Migration Guide](./docs/migration/REACT_19_MIGRATION_V0.6.0.md)
253
+ ```
254
+
255
+ ### Between Migration Docs
256
+
257
+ Use relative paths:
258
+ ```markdown
259
+ - See [Database Changes December 2025](./database-changes-december-2025.md)
260
+ - See [React 19 Migration Guide](./V0.6.0_REACT_19_MIGRATION.md)
261
+ ```
262
+
263
+ ### From Migration Docs to CHANGELOG
264
+
265
+ Use relative paths:
266
+ ```markdown
267
+ - See [CHANGELOG.md](../../CHANGELOG.md) for version history
268
+ ```
269
+
270
+ ## Version-Specific Migration Guides
271
+
272
+ ### When to Create a Version-Specific Guide
273
+
274
+ Create a dedicated migration guide when:
275
+ - ✅ Major version upgrade (e.g., 0.5.x → 0.6.x)
276
+ - ✅ Multiple breaking changes in one version
277
+ - ✅ Complex migration requiring multiple steps
278
+ - ✅ Database migrations required
279
+ - ✅ Significant API changes
280
+
281
+ ### When to Keep in CHANGELOG
282
+
283
+ Keep migration guide in CHANGELOG when:
284
+ - ✅ Minor version upgrade with simple changes
285
+ - ✅ Single breaking change that's straightforward
286
+ - ✅ No database migrations required
287
+ - ✅ Simple code updates only
288
+
289
+ ## Review Checklist
290
+
291
+ Before adding content to CHANGELOG or migration docs:
292
+
293
+ ### CHANGELOG Review
294
+
295
+ - [ ] Is this a high-level announcement?
296
+ - [ ] Is this a brief summary (not detailed steps)?
297
+ - [ ] Are detailed migration steps linked to migration docs?
298
+ - [ ] Is there duplicate content in migration docs?
299
+ - [ ] Are all links working and pointing to correct files?
300
+
301
+ ### Migration Doc Review
302
+
303
+ - [ ] Are step-by-step instructions included?
304
+ - [ ] Are code examples provided?
305
+ - [ ] Is troubleshooting information included?
306
+ - [ ] Are links to related docs included?
307
+ - [ ] Is there duplicate content from CHANGELOG?
308
+ - [ ] Is there duplicate content from other migration docs?
309
+
310
+ ## Maintenance Guidelines
311
+
312
+ ### Regular Reviews
313
+
314
+ 1. **After Each Release**
315
+ - Review CHANGELOG for duplicate content
316
+ - Verify all links work
317
+ - Check migration docs are referenced correctly
318
+
319
+ 2. **Quarterly**
320
+ - Review all migration docs for outdated content
321
+ - Consolidate overlapping guides
322
+ - Update links and references
323
+
324
+ 3. **Before Major Releases**
325
+ - Plan migration guide structure
326
+ - Identify potential overlaps
327
+ - Create clear documentation hierarchy
328
+
329
+ ### Content Updates
330
+
331
+ 1. **When Adding Breaking Changes**
332
+ - Add brief summary to CHANGELOG
333
+ - Create or update migration guide
334
+ - Link from CHANGELOG to migration guide
335
+
336
+ 2. **When Adding New Features**
337
+ - Add feature announcement to CHANGELOG
338
+ - Add usage examples to migration guide (if migration needed)
339
+ - Link from CHANGELOG if detailed guide exists
340
+
341
+ 3. **When Fixing Bugs**
342
+ - Add fix to CHANGELOG
343
+ - Add troubleshooting to migration guide (if relevant)
344
+ - Link if detailed troubleshooting needed
345
+
346
+ ## Examples
347
+
348
+ ### ✅ Good CHANGELOG Entry
349
+
350
+ ```markdown
351
+ ## [0.6.0] - 2025-01-28
352
+
353
+ ### Changed
354
+ - **BREAKING**: Upgraded from React 18.3.1 to React 19.2.3
355
+ - **BREAKING**: Database schema changes (table naming standardization)
356
+
357
+ ### Migration Notes
358
+
359
+ **⚠️ CRITICAL**: This version includes major breaking changes.
360
+
361
+ - **React 19 Upgrade**: See [React 19 Migration Guide](./docs/migration/V0.6.0_REACT_19_MIGRATION.md)
362
+ - **Complete Migration**: See [v0.5.190 → v0.6.1 Migration Guide](./docs/migration/V0.5.190_TO_V0.6.1_MIGRATION.md)
363
+ ```
364
+
365
+ ### ❌ Bad CHANGELOG Entry
366
+
367
+ ```markdown
368
+ ## [0.6.0] - 2025-01-28
369
+
370
+ ### Changed
371
+ - **BREAKING**: Upgraded from React 18.3.1 to React 19.2.3
372
+
373
+ ### Migration Steps
374
+
375
+ **Step 1: Update Dependencies**
376
+
377
+ ```bash
378
+ npm install react@^19.2.3 react-dom@^19.2.3
379
+ npm install -D @types/react@^19.2.7 @types/react-dom@^19.2.3
380
+ ```
381
+
382
+ **Step 2: Update Vite Configuration**
383
+
384
+ ```typescript
385
+ export default defineConfig({
386
+ plugins: [
387
+ react({
388
+ babel: {
389
+ plugins: ['babel-plugin-react-compiler'],
390
+ },
391
+ }),
392
+ ],
393
+ })
394
+ ```
395
+
396
+ [... many more steps ...]
397
+ ```
398
+
399
+ ### ✅ Good Migration Guide Entry
400
+
401
+ ```markdown
402
+ # React 19 Migration Guide
403
+
404
+ ## Step 1: Update Dependencies
405
+
406
+ ```bash
407
+ npm install react@^19.2.3 react-dom@^19.2.3
408
+ npm install -D @types/react@^19.2.7 @types/react-dom@^19.2.3
409
+ npm install -D @vitejs/plugin-react@^5.1.2
410
+ npm install -D babel-plugin-react-compiler@latest
411
+ ```
412
+
413
+ ## Step 2: Update Vite Configuration
414
+
415
+ [... detailed instructions ...]
416
+
417
+ ## Troubleshooting
418
+
419
+ ### Issue: TypeScript errors with child.props
420
+
421
+ [... detailed troubleshooting ...]
422
+ ```
423
+
424
+ ### ❌ Bad Migration Guide Entry
425
+
426
+ ```markdown
427
+ # React 19 Migration Guide
428
+
429
+ React 19 has been released! This is a major upgrade that includes...
430
+
431
+ [... marketing content, no actionable steps ...]
432
+ ```
433
+
434
+ ## Summary
435
+
436
+ - **CHANGELOG.md**: Announce, summarize, link
437
+ - **Migration Docs**: Instruct, demonstrate, troubleshoot
438
+ - **No Duplication**: Each piece of information lives in one place
439
+ - **Clear Links**: Easy navigation between related content
440
+ - **Regular Review**: Keep structure clean and maintainable
441
+
@@ -160,31 +160,9 @@ This breaking change was made for security reasons:
160
160
  - Provides consistent user experience across all apps
161
161
  - Improves overall security posture
162
162
 
163
- ### v2.0.0 - Service Architecture Changes
163
+ ### Service Architecture
164
164
 
165
- **Status**: ⚠️ **BREAKING CHANGE**
166
- **Date**: December 2024
167
- **Impact**: Medium - Affects apps using service architecture
168
-
169
- #### What Changed
170
-
171
- The library now uses a service-based architecture with pure TypeScript service classes and React integration through providers and hooks.
172
-
173
- #### Key Changes
174
-
175
- - ✅ **New Service Layer**: Pure TypeScript classes for business logic
176
- - ✅ **Provider Layer**: React context integration for services
177
- - ✅ **Hook Layer**: Reactive hooks for component integration
178
- - ✅ **Backward Compatible**: `UnifiedAuthProvider` maintained for compatibility
179
-
180
- #### Migration
181
-
182
- The service architecture is now the default. Existing code continues to work without changes:
183
-
184
- ```tsx
185
- // Works out of the box - uses service architecture internally
186
- import { UnifiedAuthProvider } from '@jmruthers/pace-core';
187
- ```
165
+ **Note**: Service architecture documentation is available in [Architecture Documentation](../architecture/services.md). The service-based architecture is backward compatible - existing code using `UnifiedAuthProvider` continues to work without changes as it uses the service architecture internally.
188
166
 
189
167
  ## Version-Specific Migrations
190
168