@jmruthers/pace-core 0.5.76 → 0.5.78

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 (447) hide show
  1. package/CHANGELOG.md +8 -0
  2. package/dist/{RBACService-C4udt_Zp.d.ts → AuthService-Df3IozMG.d.ts} +10 -118
  3. package/dist/{DataTable-ntgmhO2W.d.ts → DataTable-BE0OXZKQ.d.ts} +9 -2
  4. package/dist/{DataTable-4GAVPIEG.js → DataTable-ETGVF4Y5.js} +50 -13
  5. package/dist/{PublicLoadingSpinner-BiNER8F5.d.ts → PublicLoadingSpinner-CnUaz0vG.d.ts} +5 -2
  6. package/dist/{UnifiedAuthProvider-Bj6YCf7c.d.ts → UnifiedAuthProvider-B391Aqum.d.ts} +42 -45
  7. package/dist/{UnifiedAuthProvider-3NKDOSOK.js → UnifiedAuthProvider-P5SOJAQ6.js} +4 -5
  8. package/dist/{api-DDMUKIUD.js → api-KG4A2X7P.js} +9 -3
  9. package/dist/{audit-6TOCAMKO.js → audit-65VNHEV2.js} +2 -2
  10. package/dist/{chunk-K34IM5CT.js → chunk-2OGV6IRV.js} +196 -626
  11. package/dist/chunk-2OGV6IRV.js.map +1 -0
  12. package/dist/{chunk-NTNILOBC.js → chunk-5BO3MI5Y.js} +4 -4
  13. package/dist/{chunk-XLZ7U46Z.js → chunk-CVMVPYAL.js} +9 -60
  14. package/dist/chunk-CVMVPYAL.js.map +1 -0
  15. package/dist/{chunk-URUTVZ7N.js → chunk-FL4ZCQLD.js} +2 -2
  16. package/dist/{chunk-LW7MMEAQ.js → chunk-FT2M4R4F.js} +2 -2
  17. package/dist/{chunk-5BSLGBYI.js → chunk-JCQZ6LA7.js} +2 -8
  18. package/dist/{chunk-5BSLGBYI.js.map → chunk-JCQZ6LA7.js.map} +1 -1
  19. package/dist/{chunk-KHJS6VIA.js → chunk-LRQ6RBJC.js} +157 -112
  20. package/dist/chunk-LRQ6RBJC.js.map +1 -0
  21. package/dist/{chunk-WN6XJWOS.js → chunk-MNJXXD6C.js} +274 -743
  22. package/dist/chunk-MNJXXD6C.js.map +1 -0
  23. package/dist/{chunk-KK73ZB4E.js → chunk-PTR5PMPE.js} +153 -132
  24. package/dist/chunk-PTR5PMPE.js.map +1 -0
  25. package/dist/{chunk-B2WTCLCV.js → chunk-Q7APDV6H.js} +18 -8
  26. package/dist/chunk-Q7APDV6H.js.map +1 -0
  27. package/dist/{chunk-A4FUBC7B.js → chunk-QGVSOUJ2.js} +2 -4
  28. package/dist/{chunk-A4FUBC7B.js.map → chunk-QGVSOUJ2.js.map} +1 -1
  29. package/dist/{chunk-FGMFQSHX.js → chunk-S63MFSY6.js} +500 -551
  30. package/dist/chunk-S63MFSY6.js.map +1 -0
  31. package/dist/{chunk-AFGTSUAD.js → chunk-VSOKOFRF.js} +4 -4
  32. package/dist/chunk-WUXCWRL6.js +20 -0
  33. package/dist/chunk-WUXCWRL6.js.map +1 -0
  34. package/dist/{chunk-Y6TXWPJO.js → chunk-YVVGHRGI.js} +105 -31
  35. package/dist/chunk-YVVGHRGI.js.map +1 -0
  36. package/dist/{chunk-M5IWZRBT.js → chunk-ZMNXIJP4.js} +2187 -981
  37. package/dist/chunk-ZMNXIJP4.js.map +1 -0
  38. package/dist/components.d.ts +6 -6
  39. package/dist/components.js +14 -18
  40. package/dist/components.js.map +1 -1
  41. package/dist/{database-C3Szpi5J.d.ts → database-BXAfr2Y_.d.ts} +18 -0
  42. package/dist/hooks.d.ts +5 -5
  43. package/dist/hooks.js +8 -9
  44. package/dist/hooks.js.map +1 -1
  45. package/dist/index.d.ts +19 -27
  46. package/dist/index.js +21 -29
  47. package/dist/index.js.map +1 -1
  48. package/dist/{organisation-BtshODVF.d.ts → organisation-D6qRDtbF.d.ts} +1 -1
  49. package/dist/providers.d.ts +7 -21
  50. package/dist/providers.js +3 -10
  51. package/dist/rbac/index.d.ts +71 -221
  52. package/dist/rbac/index.js +15 -16
  53. package/dist/{types-CGX9Vyf5.d.ts → types-BDg1mAGG.d.ts} +36 -6
  54. package/dist/types.d.ts +3 -3
  55. package/dist/types.js +61 -18
  56. package/dist/types.js.map +1 -1
  57. package/dist/{unified-CM7T0aTK.d.ts → unified-DQ4VcT7H.d.ts} +1 -1
  58. package/dist/{usePublicRouteParams-B-CumWRc.d.ts → usePublicRouteParams-BlgwXweB.d.ts} +3 -3
  59. package/dist/utils.d.ts +2 -2
  60. package/dist/utils.js +52 -9
  61. package/dist/utils.js.map +1 -1
  62. package/docs/CONTENT_AUDIT_REPORT.md +253 -0
  63. package/docs/DOCUMENTATION_AUDIT.md +172 -0
  64. package/docs/README.md +142 -147
  65. package/docs/STYLE_GUIDE.md +37 -0
  66. package/docs/api/classes/ColumnFactory.md +17 -17
  67. package/docs/api/classes/ErrorBoundary.md +1 -1
  68. package/docs/api/classes/InvalidScopeError.md +4 -4
  69. package/docs/api/classes/MissingUserContextError.md +4 -4
  70. package/docs/api/classes/OrganisationContextRequiredError.md +4 -4
  71. package/docs/api/classes/PermissionDeniedError.md +5 -5
  72. package/docs/api/classes/PublicErrorBoundary.md +1 -1
  73. package/docs/api/classes/RBACAuditManager.md +8 -8
  74. package/docs/api/classes/RBACCache.md +35 -5
  75. package/docs/api/classes/RBACEngine.md +49 -20
  76. package/docs/api/classes/RBACError.md +4 -4
  77. package/docs/api/classes/RBACNotInitializedError.md +4 -4
  78. package/docs/api/classes/SecureSupabaseClient.md +1 -1
  79. package/docs/api/classes/StorageUtils.md +1 -1
  80. package/docs/api/enums/FileCategory.md +1 -1
  81. package/docs/api/interfaces/AggregateConfig.md +4 -4
  82. package/docs/api/interfaces/ButtonProps.md +1 -1
  83. package/docs/api/interfaces/CardProps.md +1 -1
  84. package/docs/api/interfaces/ColorPalette.md +1 -1
  85. package/docs/api/interfaces/ColorShade.md +1 -1
  86. package/docs/api/interfaces/DataAccessRecord.md +1 -1
  87. package/docs/api/interfaces/DataRecord.md +11 -0
  88. package/docs/api/interfaces/DataTableAction.md +65 -29
  89. package/docs/api/interfaces/DataTableColumn.md +36 -23
  90. package/docs/api/interfaces/DataTableProps.md +80 -38
  91. package/docs/api/interfaces/DataTableToolbarButton.md +7 -7
  92. package/docs/api/interfaces/EmptyStateConfig.md +5 -5
  93. package/docs/api/interfaces/EnhancedNavigationMenuProps.md +1 -1
  94. package/docs/api/interfaces/EventLogoProps.md +1 -1
  95. package/docs/api/interfaces/FileDisplayProps.md +1 -1
  96. package/docs/api/interfaces/FileMetadata.md +1 -1
  97. package/docs/api/interfaces/FileReference.md +1 -1
  98. package/docs/api/interfaces/FileSizeLimits.md +1 -1
  99. package/docs/api/interfaces/FileUploadOptions.md +1 -1
  100. package/docs/api/interfaces/FileUploadProps.md +1 -1
  101. package/docs/api/interfaces/FooterProps.md +1 -1
  102. package/docs/api/interfaces/InactivityWarningModalProps.md +1 -1
  103. package/docs/api/interfaces/InputProps.md +1 -1
  104. package/docs/api/interfaces/LabelProps.md +1 -1
  105. package/docs/api/interfaces/LoginFormProps.md +1 -1
  106. package/docs/api/interfaces/NavigationAccessRecord.md +11 -11
  107. package/docs/api/interfaces/NavigationContextType.md +9 -9
  108. package/docs/api/interfaces/NavigationGuardProps.md +1 -1
  109. package/docs/api/interfaces/NavigationItem.md +1 -1
  110. package/docs/api/interfaces/NavigationMenuProps.md +1 -1
  111. package/docs/api/interfaces/NavigationProviderProps.md +7 -7
  112. package/docs/api/interfaces/Organisation.md +1 -1
  113. package/docs/api/interfaces/OrganisationContextType.md +1 -1
  114. package/docs/api/interfaces/OrganisationMembership.md +1 -1
  115. package/docs/api/interfaces/OrganisationProviderProps.md +1 -1
  116. package/docs/api/interfaces/OrganisationSecurityError.md +1 -1
  117. package/docs/api/interfaces/PaceAppLayoutProps.md +1 -1
  118. package/docs/api/interfaces/PaceLoginPageProps.md +16 -3
  119. package/docs/api/interfaces/PageAccessRecord.md +1 -1
  120. package/docs/api/interfaces/PagePermissionContextType.md +1 -1
  121. package/docs/api/interfaces/PagePermissionGuardProps.md +2 -2
  122. package/docs/api/interfaces/PagePermissionProviderProps.md +1 -1
  123. package/docs/api/interfaces/PaletteData.md +1 -1
  124. package/docs/api/interfaces/PermissionEnforcerProps.md +4 -4
  125. package/docs/api/interfaces/PublicErrorBoundaryProps.md +1 -1
  126. package/docs/api/interfaces/PublicErrorBoundaryState.md +1 -1
  127. package/docs/api/interfaces/PublicLoadingSpinnerProps.md +1 -1
  128. package/docs/api/interfaces/PublicPageFooterProps.md +1 -1
  129. package/docs/api/interfaces/PublicPageHeaderProps.md +1 -1
  130. package/docs/api/interfaces/PublicPageLayoutProps.md +1 -1
  131. package/docs/api/interfaces/RBACConfig.md +1 -1
  132. package/docs/api/interfaces/RBACLogger.md +1 -1
  133. package/docs/api/interfaces/RoleBasedRouterContextType.md +1 -1
  134. package/docs/api/interfaces/RoleBasedRouterProps.md +1 -1
  135. package/docs/api/interfaces/RouteAccessRecord.md +2 -2
  136. package/docs/api/interfaces/RouteConfig.md +2 -2
  137. package/docs/api/interfaces/SecureDataContextType.md +1 -1
  138. package/docs/api/interfaces/SecureDataProviderProps.md +1 -1
  139. package/docs/api/interfaces/StorageConfig.md +1 -1
  140. package/docs/api/interfaces/StorageFileInfo.md +1 -1
  141. package/docs/api/interfaces/StorageFileMetadata.md +1 -1
  142. package/docs/api/interfaces/StorageListOptions.md +1 -1
  143. package/docs/api/interfaces/StorageListResult.md +1 -1
  144. package/docs/api/interfaces/StorageUploadOptions.md +1 -1
  145. package/docs/api/interfaces/StorageUploadResult.md +1 -1
  146. package/docs/api/interfaces/StorageUrlOptions.md +1 -1
  147. package/docs/api/interfaces/StyleImport.md +1 -1
  148. package/docs/api/interfaces/SwitchProps.md +1 -1
  149. package/docs/api/interfaces/ToastActionElement.md +1 -1
  150. package/docs/api/interfaces/ToastProps.md +1 -1
  151. package/docs/api/interfaces/UnifiedAuthContextType.md +94 -521
  152. package/docs/api/interfaces/UnifiedAuthProviderProps.md +16 -16
  153. package/docs/api/interfaces/UseInactivityTrackerOptions.md +1 -1
  154. package/docs/api/interfaces/UseInactivityTrackerReturn.md +1 -1
  155. package/docs/api/interfaces/UsePublicEventLogoOptions.md +1 -1
  156. package/docs/api/interfaces/UsePublicEventLogoReturn.md +1 -1
  157. package/docs/api/interfaces/UsePublicEventOptions.md +1 -1
  158. package/docs/api/interfaces/UsePublicEventReturn.md +1 -1
  159. package/docs/api/interfaces/UsePublicRouteParamsReturn.md +1 -1
  160. package/docs/api/interfaces/UseResolvedScopeOptions.md +1 -1
  161. package/docs/api/interfaces/UseResolvedScopeReturn.md +1 -1
  162. package/docs/api/interfaces/UserEventAccess.md +11 -11
  163. package/docs/api/interfaces/UserMenuProps.md +1 -1
  164. package/docs/api/interfaces/UserProfile.md +1 -1
  165. package/docs/api/modules.md +251 -269
  166. package/docs/api-reference/components.md +193 -0
  167. package/docs/api-reference/hooks.md +265 -0
  168. package/docs/api-reference/providers.md +6 -0
  169. package/docs/api-reference/types.md +6 -0
  170. package/docs/api-reference/utilities.md +207 -0
  171. package/docs/architecture/README.md +6 -0
  172. package/docs/{database-schema-requirements.md → architecture/database-schema-requirements.md} +6 -0
  173. package/docs/architecture/rbac-security-architecture.md +258 -0
  174. package/docs/architecture/services.md +9 -1
  175. package/docs/best-practices/README.md +6 -0
  176. package/docs/best-practices/accessibility.md +6 -0
  177. package/docs/{common-patterns.md → best-practices/common-patterns.md} +6 -0
  178. package/docs/best-practices/deployment.md +6 -0
  179. package/docs/best-practices/performance.md +475 -2
  180. package/docs/best-practices/security.md +6 -0
  181. package/docs/best-practices/testing.md +6 -0
  182. package/docs/core-concepts/authentication.md +6 -0
  183. package/docs/core-concepts/events.md +6 -0
  184. package/docs/core-concepts/organisations.md +6 -0
  185. package/docs/core-concepts/permissions.md +6 -0
  186. package/docs/core-concepts/rbac-system.md +8 -0
  187. package/docs/documentation-index.md +121 -182
  188. package/docs/{consuming-app-vite-config.md → getting-started/consuming-app-vite-config.md} +6 -0
  189. package/docs/getting-started/documentation-index.md +40 -0
  190. package/docs/getting-started/examples/README.md +878 -35
  191. package/docs/{faq.md → getting-started/faq.md} +7 -1
  192. package/docs/getting-started/installation-guide.md +6 -0
  193. package/docs/{quick-reference.md → getting-started/quick-reference.md} +6 -0
  194. package/docs/implementation-guides/app-layout.md +6 -0
  195. package/docs/implementation-guides/authentication.md +1021 -0
  196. package/docs/implementation-guides/component-styling.md +6 -0
  197. package/docs/implementation-guides/data-tables.md +1264 -2076
  198. package/docs/implementation-guides/dynamic-colors.md +6 -0
  199. package/docs/implementation-guides/event-theming-summary.md +6 -0
  200. package/docs/{file-reference-system.md → implementation-guides/file-reference-system.md} +6 -0
  201. package/docs/implementation-guides/file-upload-storage.md +6 -0
  202. package/docs/implementation-guides/forms.md +6 -0
  203. package/docs/implementation-guides/inactivity-tracking.md +6 -0
  204. package/docs/implementation-guides/navigation.md +6 -0
  205. package/docs/implementation-guides/organisation-security.md +6 -0
  206. package/docs/implementation-guides/permission-enforcement.md +6 -0
  207. package/docs/implementation-guides/public-pages-advanced.md +6 -0
  208. package/docs/implementation-guides/public-pages.md +6 -0
  209. package/docs/migration/MIGRATION_GUIDE.md +827 -351
  210. package/docs/migration/README.md +7 -1
  211. package/docs/migration/organisation-context-timing-fix.md +6 -0
  212. package/docs/migration/rbac-migration.md +44 -1
  213. package/docs/migration/service-architecture.md +6 -0
  214. package/docs/migration/v0.4.15-tailwind-scanning.md +6 -0
  215. package/docs/migration/v0.4.16-css-first-approach.md +6 -0
  216. package/docs/migration/v0.4.17-source-path-fix.md +6 -0
  217. package/docs/rbac/README-rbac-rls-integration.md +6 -0
  218. package/docs/rbac/README.md +6 -0
  219. package/docs/rbac/advanced-patterns.md +6 -0
  220. package/docs/rbac/api-reference.md +7 -1
  221. package/docs/rbac/breaking-changes-v3.md +222 -0
  222. package/docs/rbac/examples/rbac-rls-integration-example.md +6 -0
  223. package/docs/rbac/examples.md +6 -0
  224. package/docs/rbac/getting-started.md +6 -0
  225. package/docs/rbac/migration-guide.md +260 -0
  226. package/docs/rbac/quick-start.md +70 -13
  227. package/docs/rbac/rbac-rls-integration.md +6 -0
  228. package/docs/rbac/super-admin-guide.md +6 -0
  229. package/docs/rbac/troubleshooting.md +6 -0
  230. package/docs/security/README.md +6 -0
  231. package/docs/security/checklist.md +6 -0
  232. package/docs/styles/README.md +7 -1
  233. package/docs/{usage.md → styles/usage.md} +6 -0
  234. package/docs/testing/README.md +6 -0
  235. package/docs/{visual-testing.md → testing/visual-testing.md} +6 -0
  236. package/docs/troubleshooting/README.md +387 -5
  237. package/docs/troubleshooting/cake-page-permission-guard-issue-summary.md +6 -0
  238. package/docs/troubleshooting/common-issues.md +6 -0
  239. package/docs/troubleshooting/database-view-compatibility.md +6 -0
  240. package/docs/troubleshooting/organisation-context-setup.md +6 -0
  241. package/docs/troubleshooting/react-hooks-issue-analysis.md +6 -0
  242. package/docs/troubleshooting/styling-issues.md +6 -0
  243. package/docs/troubleshooting/tailwind-content-scanning.md +6 -0
  244. package/package.json +1 -1
  245. package/src/__tests__/helpers/__tests__/test-providers.test.tsx +2 -1
  246. package/src/__tests__/helpers/test-providers.tsx +3 -53
  247. package/src/components/DataTable/DataTable.test.tsx +319 -0
  248. package/src/components/DataTable/DataTable.tsx +32 -11
  249. package/src/components/DataTable/__tests__/{DataTable.comprehensive.test.tsx → DataTable.comprehensive.test.tsx.skip} +6 -4
  250. package/src/components/DataTable/__tests__/{DataTable.test.tsx → DataTable.test.tsx.skip} +6 -4
  251. package/src/components/DataTable/__tests__/DataTableCore.test.tsx +31 -9
  252. package/src/components/DataTable/__tests__/a11y.basic.test.tsx +601 -0
  253. package/src/components/DataTable/__tests__/keyboard.test.tsx +615 -0
  254. package/src/components/DataTable/__tests__/pagination.modes.test.tsx +639 -0
  255. package/src/components/DataTable/__tests__/ssr.strict-mode.test.tsx.skip +330 -0
  256. package/src/components/DataTable/components/AccessDeniedPage.tsx +2 -2
  257. package/src/components/DataTable/components/ActionButtons.tsx +88 -104
  258. package/src/components/DataTable/components/DataTableCore.tsx +309 -337
  259. package/src/components/DataTable/components/DataTableErrorBoundary.tsx +4 -2
  260. package/src/components/DataTable/components/DataTableModals.tsx +22 -1
  261. package/src/components/DataTable/components/EditableRow.tsx +69 -84
  262. package/src/components/DataTable/components/EmptyState.tsx +5 -1
  263. package/src/components/DataTable/components/ImportModal.tsx +65 -36
  264. package/src/components/DataTable/components/PaginationControls.tsx +40 -100
  265. package/src/components/DataTable/components/UnifiedTableBody.tsx +125 -148
  266. package/src/components/DataTable/context/DataTableContext.tsx +1 -1
  267. package/src/components/DataTable/core/ColumnFactory.ts +5 -0
  268. package/src/components/DataTable/examples/HierarchicalActionsExample.tsx +12 -10
  269. package/src/components/DataTable/examples/HierarchicalExample.tsx +1 -1
  270. package/src/components/DataTable/examples/InitialPageSizeExample.tsx +1 -0
  271. package/src/components/DataTable/examples/PerformanceExample.tsx +1 -0
  272. package/src/components/DataTable/hooks/__tests__/useColumnOrderPersistence.test.ts +1 -5
  273. package/src/components/DataTable/hooks/__tests__/useColumnVisibilityPersistence.test.ts +167 -0
  274. package/src/components/DataTable/hooks/index.ts +7 -0
  275. package/src/components/DataTable/hooks/useColumnOrderPersistence.ts +32 -15
  276. package/src/components/DataTable/hooks/useColumnVisibilityPersistence.ts +102 -0
  277. package/src/components/DataTable/hooks/useDataTableConfiguration.ts +89 -0
  278. package/src/components/DataTable/hooks/useDataTableDataPipeline.ts +117 -0
  279. package/src/components/DataTable/hooks/useDataTablePermissions.ts +71 -27
  280. package/src/components/DataTable/hooks/useDataTableState.ts +39 -11
  281. package/src/components/DataTable/hooks/useEffectiveColumnOrder.ts +33 -0
  282. package/src/components/DataTable/hooks/useHierarchicalState.ts +15 -1
  283. package/src/components/DataTable/hooks/useKeyboardNavigation.ts +447 -0
  284. package/src/components/DataTable/hooks/useServerSideDataEffect.ts +94 -0
  285. package/src/components/DataTable/hooks/useTableColumns.ts +10 -7
  286. package/src/components/DataTable/hooks/useTableHandlers.ts +174 -0
  287. package/src/components/DataTable/index.ts +12 -3
  288. package/src/components/DataTable/types.ts +129 -9
  289. package/src/components/DataTable/utils/__tests__/exportUtils.test.ts +159 -22
  290. package/src/components/DataTable/utils/__tests__/flexibleImport.test.ts +111 -0
  291. package/src/components/DataTable/utils/__tests__/rowUtils.test.ts +15 -29
  292. package/src/components/DataTable/utils/a11yUtils.ts +244 -0
  293. package/src/components/DataTable/utils/debugTools.ts +609 -0
  294. package/src/components/DataTable/utils/exportUtils.ts +114 -16
  295. package/src/components/DataTable/utils/flexibleImport.ts +202 -32
  296. package/src/components/DataTable/utils/hierarchicalUtils.ts +1 -1
  297. package/src/components/DataTable/utils/index.ts +2 -0
  298. package/src/components/DataTable/utils/paginationUtils.ts +350 -0
  299. package/src/components/DataTable/utils/rowUtils.ts +6 -5
  300. package/src/components/NavigationMenu/NavigationMenu.test.tsx +19 -24
  301. package/src/components/NavigationMenu/NavigationMenu.tsx +19 -8
  302. package/src/components/PaceAppLayout/__tests__/PaceAppLayout.security.test.tsx +1 -23
  303. package/src/components/PaceLoginPage/PaceLoginPage.test.tsx +56 -6
  304. package/src/components/PaceLoginPage/PaceLoginPage.tsx +137 -13
  305. package/src/components/PublicLayout/__tests__/PublicPageHeader.test.tsx +1 -1
  306. package/src/components/Select/Select.tsx +1 -0
  307. package/src/components/examples/PermissionExample.tsx +173 -0
  308. package/src/examples/CorrectPublicPageImplementation.tsx +301 -0
  309. package/src/examples/PublicEventPage.tsx +274 -0
  310. package/src/examples/PublicPageApp.tsx +308 -0
  311. package/src/examples/PublicPageUsageExample.tsx +216 -0
  312. package/src/hooks/__tests__/useOrganisationPermissions.unit.test.tsx +12 -1
  313. package/src/hooks/__tests__/useOrganisationSecurity.unit.test.tsx +129 -17
  314. package/src/hooks/__tests__/useRBAC.unit.test.ts +151 -846
  315. package/src/hooks/useOrganisationPermissions.test.ts +42 -18
  316. package/src/hooks/useOrganisationPermissions.ts +12 -6
  317. package/src/hooks/useOrganisationSecurity.test.ts +138 -85
  318. package/src/hooks/useOrganisationSecurity.ts +41 -10
  319. package/src/index.ts +0 -1
  320. package/src/providers/AuthProvider.simplified.tsx +880 -0
  321. package/src/providers/UnifiedAuthProvider.test.simple.tsx +8 -8
  322. package/src/providers/__tests__/UnifiedAuthProvider.test.tsx +29 -19
  323. package/src/providers/index.ts +0 -1
  324. package/src/providers/services/EventServiceProvider.tsx +19 -15
  325. package/src/providers/services/InactivityServiceProvider.tsx +19 -15
  326. package/src/providers/services/OrganisationServiceProvider.tsx +19 -15
  327. package/src/providers/services/UnifiedAuthProvider.tsx +156 -127
  328. package/src/providers/services/__tests__/AuthServiceProvider.integration.test.tsx +1 -1
  329. package/src/providers/services/__tests__/UnifiedAuthProvider.integration.test.tsx +3 -3
  330. package/src/rbac/README.md +1 -1
  331. package/src/rbac/__tests__/adapters.comprehensive.test.tsx +25 -27
  332. package/src/rbac/__tests__/auth-rbac-security.integration.test.tsx +313 -0
  333. package/src/rbac/__tests__/engine.comprehensive.test.ts +114 -348
  334. package/src/rbac/__tests__/rbac-engine-core-logic.test.ts +28 -110
  335. package/src/rbac/__tests__/rbac-engine-simplified.test.ts +33 -85
  336. package/src/rbac/__tests__/scenarios.user-role.test.tsx +2 -2
  337. package/src/rbac/adapters.tsx +26 -69
  338. package/src/rbac/api.test.ts +90 -27
  339. package/src/rbac/api.ts +61 -10
  340. package/src/rbac/audit.test.ts +33 -38
  341. package/src/rbac/audit.ts +21 -6
  342. package/src/rbac/cache.ts +33 -1
  343. package/src/rbac/components/NavigationGuard.tsx +11 -11
  344. package/src/rbac/components/NavigationProvider.test.tsx +11 -5
  345. package/src/rbac/components/NavigationProvider.tsx +37 -13
  346. package/src/rbac/components/PagePermissionGuard.tsx +111 -50
  347. package/src/rbac/components/PagePermissionProvider.tsx +5 -5
  348. package/src/rbac/components/PermissionEnforcer.tsx +11 -11
  349. package/src/rbac/components/RoleBasedRouter.tsx +5 -5
  350. package/src/rbac/components/SecureDataProvider.tsx +5 -5
  351. package/src/rbac/components/__tests__/NavigationGuard.test.tsx +8 -8
  352. package/src/rbac/components/__tests__/PagePermissionGuard.test.tsx +14 -14
  353. package/src/rbac/components/__tests__/PermissionEnforcer.test.tsx +12 -12
  354. package/src/rbac/components/__tests__/RoleBasedRouter.test.tsx +6 -6
  355. package/src/rbac/engine.test.simple.ts +19 -13
  356. package/src/rbac/engine.test.ts +1 -0
  357. package/src/rbac/engine.ts +330 -766
  358. package/src/rbac/errors.ts +156 -0
  359. package/src/rbac/hooks/usePermissions.ts +32 -10
  360. package/src/rbac/hooks/useRBAC.test.ts +126 -512
  361. package/src/rbac/hooks/useRBAC.ts +147 -193
  362. package/src/rbac/hooks/useResolvedScope.ts +12 -0
  363. package/src/rbac/index.ts +7 -4
  364. package/src/rbac/security.ts +109 -18
  365. package/src/rbac/types.ts +12 -1
  366. package/src/services/AuthService.ts +2 -15
  367. package/src/services/EventService.ts +43 -46
  368. package/src/services/OrganisationService.ts +51 -31
  369. package/src/services/__tests__/AuthService.test.ts +1 -1
  370. package/src/services/__tests__/EventService.test.ts +1 -1
  371. package/src/services/__tests__/OrganisationService.test.ts +1 -1
  372. package/src/services/base/BaseService.ts +8 -0
  373. package/src/styles/base.css +208 -0
  374. package/src/styles/semantic.css +24 -0
  375. package/src/types/database.generated.ts +7347 -0
  376. package/src/types/database.ts +20 -0
  377. package/src/utils/logger.ts +179 -0
  378. package/src/utils/organisationContext.ts +11 -4
  379. package/src/utils/storage/__tests__/helpers.unit.test.ts +6 -2
  380. package/dist/appNameResolver-UURKN7NF.js +0 -22
  381. package/dist/audit-6TOCAMKO.js.map +0 -1
  382. package/dist/chunk-B2WTCLCV.js.map +0 -1
  383. package/dist/chunk-FGMFQSHX.js.map +0 -1
  384. package/dist/chunk-K34IM5CT.js.map +0 -1
  385. package/dist/chunk-KHJS6VIA.js.map +0 -1
  386. package/dist/chunk-KK73ZB4E.js.map +0 -1
  387. package/dist/chunk-M5IWZRBT.js.map +0 -1
  388. package/dist/chunk-ULBI5JGB.js +0 -109
  389. package/dist/chunk-ULBI5JGB.js.map +0 -1
  390. package/dist/chunk-WN6XJWOS.js.map +0 -1
  391. package/dist/chunk-XLZ7U46Z.js.map +0 -1
  392. package/dist/chunk-Y6TXWPJO.js.map +0 -1
  393. package/docs/DOCUMENTATION_CHECKLIST.md +0 -281
  394. package/docs/TERMINOLOGY.md +0 -231
  395. package/docs/api/interfaces/RBACContextType.md +0 -468
  396. package/docs/api/interfaces/RBACProviderProps.md +0 -107
  397. package/docs/best-practices/performance-expansion.md +0 -473
  398. package/docs/breaking-changes.md +0 -179
  399. package/docs/consuming-app-example.md +0 -290
  400. package/docs/documentation-templates.md +0 -539
  401. package/docs/examples/navigation-menu-auth-fix.md +0 -344
  402. package/docs/getting-started/examples/basic-auth-app.md +0 -520
  403. package/docs/getting-started/examples/full-featured-app.md +0 -616
  404. package/docs/getting-started/quick-start.md +0 -376
  405. package/docs/implementation-guides/datatable-filtering.md +0 -313
  406. package/docs/implementation-guides/datatable-rbac-usage.md +0 -317
  407. package/docs/implementation-guides/hierarchical-datatable.md +0 -850
  408. package/docs/implementation-guides/large-datasets.md +0 -281
  409. package/docs/implementation-guides/performance.md +0 -403
  410. package/docs/migration/quick-migration-guide.md +0 -320
  411. package/docs/migration-guide.md +0 -193
  412. package/docs/migration-guides/unified-auth-provider-mandatory-timeouts.md +0 -226
  413. package/docs/performance/README.md +0 -551
  414. package/docs/style-guide.md +0 -964
  415. package/docs/troubleshooting/authentication-issues.md +0 -334
  416. package/docs/troubleshooting/debugging.md +0 -1117
  417. package/docs/troubleshooting/migration.md +0 -918
  418. package/src/__tests__/hooks/usePermissions.test.ts +0 -261
  419. package/src/components/PaceAppLayout/__tests__/PaceAppLayout.rbac.test.tsx +0 -574
  420. package/src/hooks/__tests__/ServiceHooks.test.tsx +0 -613
  421. package/src/hooks/services/__tests__/useServiceHooks.test.tsx +0 -137
  422. package/src/hooks/services/usePermissions.ts +0 -70
  423. package/src/hooks/services/useRBACService.ts +0 -30
  424. package/src/hooks/usePermissionCheck.ts +0 -150
  425. package/src/providers/__tests__/ServiceProviders.test.tsx +0 -477
  426. package/src/providers/services/RBACServiceProvider.tsx +0 -79
  427. package/src/rbac/__tests__/integration.authflow.test.tsx +0 -119
  428. package/src/rbac/__tests__/integration.navigation.test.tsx +0 -69
  429. package/src/rbac/__tests__/integration.securedata.test.tsx +0 -92
  430. package/src/rbac/__tests__/integration.smoke.test.tsx +0 -73
  431. package/src/rbac/providers/RBACProvider.tsx +0 -645
  432. package/src/rbac/providers/__tests__/RBACProvider.integration.test.tsx +0 -688
  433. package/src/rbac/providers/__tests__/RBACProvider.test.tsx +0 -1186
  434. package/src/rbac/providers/index.ts +0 -11
  435. package/src/services/RBACService.ts +0 -522
  436. package/src/services/__tests__/RBACService.test.ts +0 -492
  437. package/src/services/interfaces/IRBACService.ts +0 -62
  438. package/src/utils/appNameResolver.test 2.ts +0 -494
  439. /package/dist/{DataTable-4GAVPIEG.js.map → DataTable-ETGVF4Y5.js.map} +0 -0
  440. /package/dist/{UnifiedAuthProvider-3NKDOSOK.js.map → UnifiedAuthProvider-P5SOJAQ6.js.map} +0 -0
  441. /package/dist/{api-DDMUKIUD.js.map → api-KG4A2X7P.js.map} +0 -0
  442. /package/dist/{appNameResolver-UURKN7NF.js.map → audit-65VNHEV2.js.map} +0 -0
  443. /package/dist/{chunk-NTNILOBC.js.map → chunk-5BO3MI5Y.js.map} +0 -0
  444. /package/dist/{chunk-URUTVZ7N.js.map → chunk-FL4ZCQLD.js.map} +0 -0
  445. /package/dist/{chunk-LW7MMEAQ.js.map → chunk-FT2M4R4F.js.map} +0 -0
  446. /package/dist/{chunk-AFGTSUAD.js.map → chunk-VSOKOFRF.js.map} +0 -0
  447. /package/docs/{app.css.example → styles/app.css.example} +0 -0
@@ -1,551 +0,0 @@
1
- # Performance Best Practices
2
-
3
- > **⚡ Optimize Your App** | [Bundle Optimization](#bundle-optimization) | [Runtime Performance](#runtime-performance) | [Monitoring](#monitoring)
4
-
5
- [← Back to Documentation](../README.md) | [↑ Table of Contents](#table-of-contents) | [Next: Security Checklist →](../security/checklist.md)
6
-
7
- Complete guide to optimizing PACE Core applications for maximum performance.
8
-
9
- ## 📋 Table of Contents
10
-
11
- - [Performance Overview](#-performance-overview)
12
- - [Quick Performance Checklist](#-quick-performance-checklist)
13
- - [Bundle Optimization](#-bundle-optimization)
14
- - [Runtime Performance](#-runtime-performance)
15
- - [Caching Strategies](#-caching-strategies)
16
- - [Monitoring](#-monitoring)
17
- - [Performance Best Practices](#-performance-best-practices)
18
- - [Performance Tools](#-performance-tools)
19
- - [Additional Resources](#-additional-resources)
20
- - [Troubleshooting](#-troubleshooting)
21
-
22
- ## 📊 Performance Overview
23
-
24
- This guide covers:
25
- - **Bundle Optimization** - Reducing bundle size and load time
26
- - **Runtime Performance** - Optimizing component rendering and state management
27
- - **Caching Strategies** - Implementing effective caching
28
- - **Monitoring** - Measuring and tracking performance
29
-
30
- ## 🚀 Quick Performance Checklist
31
-
32
- ### Before You Start
33
- - [ ] **Measure baseline** - Use React DevTools Profiler
34
- - [ ] **Check bundle size** - Use webpack-bundle-analyzer
35
- - [ ] **Audit dependencies** - Remove unused packages
36
- - [ ] **Enable production mode** - Ensure optimizations are enabled
37
-
38
- ### Performance Targets
39
- - [ ] **Bundle size** - < 500KB gzipped
40
- - [ ] **First Contentful Paint** - < 1.5s
41
- - [ ] **Time to Interactive** - < 3s
42
- - [ ] **Largest Contentful Paint** - < 2.5s
43
-
44
- ## 📦 Bundle Optimization
45
-
46
- ### Tree Shaking
47
-
48
- **Enable Tree Shaking**
49
- ```js
50
- // webpack.config.js
51
- module.exports = {
52
- mode: 'production',
53
- optimization: {
54
- usedExports: true,
55
- sideEffects: false,
56
- },
57
- };
58
- ```
59
-
60
- **Import Only What You Need**
61
- ```tsx
62
- // ❌ Bad - imports entire library
63
- import * as PACE from '@jmruthers/pace-core';
64
-
65
- // ✅ Good - imports only what you need
66
- import { Button, DataTable } from '@jmruthers/pace-core';
67
- ```
68
-
69
- **Use Dynamic Imports**
70
- ```tsx
71
- // Lazy load heavy components
72
- const HeavyComponent = React.lazy(() => import('./HeavyComponent'));
73
-
74
- function App() {
75
- return (
76
- <Suspense fallback={<div>Loading...</div>}>
77
- <HeavyComponent />
78
- </Suspense>
79
- );
80
- }
81
- ```
82
-
83
- ### Code Splitting
84
-
85
- **Route-based Code Splitting**
86
- ```tsx
87
- import { lazy, Suspense } from 'react';
88
- import { BrowserRouter, Routes, Route } from 'react-router-dom';
89
-
90
- const Dashboard = lazy(() => import('./pages/Dashboard'));
91
- const Users = lazy(() => import('./pages/Users'));
92
- const Settings = lazy(() => import('./pages/Settings'));
93
-
94
- function App() {
95
- return (
96
- <BrowserRouter>
97
- <Suspense fallback={<div>Loading...</div>}>
98
- <Routes>
99
- <Route path="/" element={<Dashboard />} />
100
- <Route path="/users" element={<Users />} />
101
- <Route path="/settings" element={<Settings />} />
102
- </Routes>
103
- </Suspense>
104
- </BrowserRouter>
105
- );
106
- }
107
- ```
108
-
109
- **Component-based Code Splitting**
110
- ```tsx
111
- import { lazy, Suspense } from 'react';
112
-
113
- const DataTable = lazy(() => import('@jmruthers/pace-core').then(module => ({
114
- default: module.DataTable
115
- })));
116
-
117
- function MyComponent() {
118
- return (
119
- <Suspense fallback={<div>Loading table...</div>}>
120
- <DataTable data={data} columns={columns} />
121
- </Suspense>
122
- );
123
- }
124
- ```
125
-
126
- ### Bundle Analysis
127
-
128
- **Analyze Bundle Size**
129
- ```bash
130
- # Install analyzer
131
- npm install -D webpack-bundle-analyzer
132
-
133
- # Add to package.json
134
- {
135
- "scripts": {
136
- "analyze": "webpack-bundle-analyzer build/static/js/*.js"
137
- }
138
- }
139
-
140
- # Run analysis
141
- npm run build
142
- npm run analyze
143
- ```
144
-
145
- **Optimize Dependencies**
146
- ```bash
147
- # Check for duplicate dependencies
148
- npm ls --depth=0
149
-
150
- # Check bundle size
151
- npx bundlephobia @jmruthers/pace-core
152
-
153
- # Find unused dependencies
154
- npx depcheck
155
- ```
156
-
157
- ## ⚡ Runtime Performance
158
-
159
- ### Component Optimization
160
-
161
- **Use React.memo for Expensive Components**
162
- ```tsx
163
- import React, { memo } from 'react';
164
- import { DataTable } from '@jmruthers/pace-core';
165
-
166
- const ExpensiveTable = memo(({ data, columns }) => {
167
- return <DataTable data={data} columns={columns} />;
168
- });
169
-
170
- // Only re-renders when data or columns change
171
- function App() {
172
- const [data, setData] = useState([]);
173
- const [otherState, setOtherState] = useState('');
174
-
175
- return (
176
- <div>
177
- <ExpensiveTable data={data} columns={columns} />
178
- <button onClick={() => setOtherState('new value')}>
179
- Update Other State
180
- </button>
181
- </div>
182
- );
183
- }
184
- ```
185
-
186
- **Optimize Callbacks with useCallback**
187
- ```tsx
188
- import { useCallback, useState } from 'react';
189
- import { DataTable } from '@jmruthers/pace-core';
190
-
191
- function MyComponent() {
192
- const [data, setData] = useState([]);
193
-
194
- // Memoize expensive callbacks
195
- const handleDataChange = useCallback((newData) => {
196
- setData(newData);
197
- }, []);
198
-
199
- const handleSort = useCallback((column, direction) => {
200
- // Expensive sorting logic
201
- const sorted = [...data].sort((a, b) => {
202
- // Sorting logic
203
- });
204
- setData(sorted);
205
- }, [data]);
206
-
207
- return (
208
- <DataTable
209
- data={data}
210
- columns={columns}
211
- onDataChange={handleDataChange}
212
- onSort={handleSort}
213
- />
214
- );
215
- }
216
- ```
217
-
218
- **Optimize Expensive Calculations with useMemo**
219
- ```tsx
220
- import { useMemo } from 'react';
221
- import { DataTable } from '@jmruthers/pace-core';
222
-
223
- function MyComponent() {
224
- const [data, setData] = useState([]);
225
- const [filter, setFilter] = useState('');
226
-
227
- // Memoize expensive calculations
228
- const filteredData = useMemo(() => {
229
- return data.filter(item =>
230
- item.name.toLowerCase().includes(filter.toLowerCase())
231
- );
232
- }, [data, filter]);
233
-
234
- const sortedData = useMemo(() => {
235
- return [...filteredData].sort((a, b) => a.name.localeCompare(b.name));
236
- }, [filteredData]);
237
-
238
- return (
239
- <DataTable data={sortedData} columns={columns} />
240
- );
241
- }
242
- ```
243
-
244
- ### State Management Optimization
245
-
246
- **Avoid Unnecessary Re-renders**
247
- ```tsx
248
- // ❌ Bad - causes re-render on every state change
249
- function App() {
250
- const [user, setUser] = useState(null);
251
- const [theme, setTheme] = useState('light');
252
-
253
- return (
254
- <div>
255
- <UserProfile user={user} />
256
- <ThemeToggle theme={theme} onThemeChange={setTheme} />
257
- </div>
258
- );
259
- }
260
-
261
- // ✅ Good - separate concerns
262
- function App() {
263
- return (
264
- <UserProvider>
265
- <UserProfile />
266
- </UserProvider>
267
- );
268
- }
269
- ```
270
-
271
- **Use Context Selectors**
272
- ```tsx
273
- import { useContext, useMemo } from 'react';
274
- import { UserContext } from '@jmruthers/pace-core';
275
-
276
- function UserProfile() {
277
- // Only re-renders when user changes, not when other context values change
278
- const user = useContext(UserContext, (state) => state.user);
279
-
280
- return <div>{user?.name}</div>;
281
- }
282
- ```
283
-
284
- ### Data Table Performance
285
-
286
- **Optimize Large Datasets**
287
- ```tsx
288
- import { DataTable, useVirtualization } from '@jmruthers/pace-core';
289
-
290
- function LargeDataTable() {
291
- const [data, setData] = useState([]);
292
-
293
- return (
294
- <DataTable
295
- data={data}
296
- columns={columns}
297
- // Enable virtualization for large datasets
298
- enableVirtualization
299
- // Set reasonable page size
300
- pageSize={50}
301
- // Enable server-side pagination
302
- serverSidePagination
303
- // Optimize rendering
304
- enableRowSelection={false}
305
- enableColumnResizing={false}
306
- />
307
- );
308
- }
309
- ```
310
-
311
- **Implement Pagination**
312
- ```tsx
313
- import { DataTable } from '@jmruthers/pace-core';
314
-
315
- function PaginatedTable() {
316
- const [data, setData] = useState([]);
317
- const [currentPage, setCurrentPage] = useState(1);
318
- const [pageSize, setPageSize] = useState(50);
319
-
320
- const paginatedData = useMemo(() => {
321
- const start = (currentPage - 1) * pageSize;
322
- const end = start + pageSize;
323
- return data.slice(start, end);
324
- }, [data, currentPage, pageSize]);
325
-
326
- return (
327
- <DataTable
328
- data={paginatedData}
329
- columns={columns}
330
- pagination={{
331
- currentPage,
332
- pageSize,
333
- totalItems: data.length,
334
- onPageChange: setCurrentPage,
335
- onPageSizeChange: setPageSize,
336
- }}
337
- />
338
- );
339
- }
340
- ```
341
-
342
- ## 💾 Caching Strategies
343
-
344
- ### API Response Caching
345
-
346
- **Implement React Query**
347
- ```tsx
348
- import { useQuery } from '@tanstack/react-query';
349
- import { DataTable } from '@jmruthers/pace-core';
350
-
351
- function UsersTable() {
352
- const { data, isLoading, error } = useQuery({
353
- queryKey: ['users'],
354
- queryFn: fetchUsers,
355
- staleTime: 5 * 60 * 1000, // 5 minutes
356
- cacheTime: 10 * 60 * 1000, // 10 minutes
357
- });
358
-
359
- if (isLoading) return <div>Loading...</div>;
360
- if (error) return <div>Error: {error.message}</div>;
361
-
362
- return <DataTable data={data} columns={columns} />;
363
- }
364
- ```
365
-
366
- **Implement SWR**
367
- ```tsx
368
- import useSWR from 'swr';
369
- import { DataTable } from '@jmruthers/pace-core';
370
-
371
- function UsersTable() {
372
- const { data, error } = useSWR('/api/users', fetcher, {
373
- revalidateOnFocus: false,
374
- revalidateOnReconnect: true,
375
- dedupingInterval: 60000, // 1 minute
376
- });
377
-
378
- if (error) return <div>Error: {error.message}</div>;
379
- if (!data) return <div>Loading...</div>;
380
-
381
- return <DataTable data={data} columns={columns} />;
382
- }
383
- ```
384
-
385
- ### Component Caching
386
-
387
- **Cache Expensive Components**
388
- ```tsx
389
- import { memo, useMemo } from 'react';
390
- import { DataTable } from '@jmruthers/pace-core';
391
-
392
- const CachedDataTable = memo(({ data, columns, filters }) => {
393
- const filteredData = useMemo(() => {
394
- return data.filter(item =>
395
- filters.every(filter => filter.predicate(item))
396
- );
397
- }, [data, filters]);
398
-
399
- return <DataTable data={filteredData} columns={columns} />;
400
- });
401
- ```
402
-
403
- ## 📊 Monitoring
404
-
405
- ### Performance Monitoring
406
-
407
- **Use React DevTools Profiler**
408
- ```tsx
409
- import { Profiler } from 'react';
410
-
411
- function onRenderCallback(id, phase, actualDuration) {
412
- console.log('Render:', { id, phase, actualDuration });
413
- }
414
-
415
- function App() {
416
- return (
417
- <Profiler id="App" onRender={onRenderCallback}>
418
- <YourApp />
419
- </Profiler>
420
- );
421
- }
422
- ```
423
-
424
- **Implement Performance Metrics**
425
- ```tsx
426
- import { useEffect } from 'react';
427
-
428
- function usePerformanceMetrics() {
429
- useEffect(() => {
430
- // Measure First Contentful Paint
431
- const observer = new PerformanceObserver((list) => {
432
- for (const entry of list.getEntries()) {
433
- if (entry.name === 'first-contentful-paint') {
434
- console.log('FCP:', entry.startTime);
435
- }
436
- }
437
- });
438
- observer.observe({ entryTypes: ['paint'] });
439
-
440
- return () => observer.disconnect();
441
- }, []);
442
- }
443
- ```
444
-
445
- **Monitor Bundle Size**
446
- ```tsx
447
- // Add to your build process
448
- const BundleAnalyzerPlugin = require('webpack-bundle-analyzer').BundleAnalyzerPlugin;
449
-
450
- module.exports = {
451
- plugins: [
452
- new BundleAnalyzerPlugin({
453
- analyzerMode: 'static',
454
- openAnalyzer: false,
455
- }),
456
- ],
457
- };
458
- ```
459
-
460
- ### Real User Monitoring
461
-
462
- **Implement RUM**
463
- ```tsx
464
- import { useEffect } from 'react';
465
-
466
- function useRUM() {
467
- useEffect(() => {
468
- // Send performance data to your analytics
469
- const sendMetrics = () => {
470
- const navigation = performance.getEntriesByType('navigation')[0];
471
- const metrics = {
472
- loadTime: navigation.loadEventEnd - navigation.loadEventStart,
473
- domContentLoaded: navigation.domContentLoadedEventEnd - navigation.domContentLoadedEventStart,
474
- firstPaint: performance.getEntriesByName('first-paint')[0]?.startTime,
475
- firstContentfulPaint: performance.getEntriesByName('first-contentful-paint')[0]?.startTime,
476
- };
477
-
478
- // Send to your analytics service
479
- analytics.track('performance', metrics);
480
- };
481
-
482
- window.addEventListener('load', sendMetrics);
483
- return () => window.removeEventListener('load', sendMetrics);
484
- }, []);
485
- }
486
- ```
487
-
488
- ## 🎯 Performance Best Practices
489
-
490
- ### General Guidelines
491
-
492
- 1. **Measure First** - Always measure before optimizing
493
- 2. **Optimize Bottlenecks** - Focus on the biggest performance issues
494
- 3. **Test on Real Devices** - Use actual devices, not just desktop
495
- 4. **Monitor Continuously** - Set up performance monitoring
496
- 5. **Keep Dependencies Updated** - Regular updates often include performance improvements
497
-
498
- ### PACE Core Specific
499
-
500
- 1. **Use Design Tokens** - Import only the tokens you need
501
- 2. **Lazy Load Components** - Use dynamic imports for heavy components
502
- 3. **Optimize Data Tables** - Use virtualization for large datasets
503
- 4. **Cache API Responses** - Implement proper caching strategies
504
- 5. **Minimize Re-renders** - Use React.memo and useCallback appropriately
505
-
506
- ## 🛠️ Performance Tools
507
-
508
- ### Development Tools
509
- - **React DevTools Profiler** - Component performance analysis
510
- - **Chrome DevTools** - Network and performance analysis
511
- - **webpack-bundle-analyzer** - Bundle size analysis
512
- - **Lighthouse** - Performance auditing
513
-
514
- ### Production Tools
515
- - **Web Vitals** - Core web vitals monitoring
516
- - **Sentry** - Error and performance monitoring
517
- - **DataDog** - Application performance monitoring
518
- - **New Relic** - Full-stack performance monitoring
519
-
520
- ## 📚 Additional Resources
521
-
522
- - **[Bundle Optimization Guide](./bundle-optimization.md)** - Detailed bundle optimization
523
- - **[Runtime Performance Guide](./runtime-performance.md)** - Component optimization
524
- - **[Caching Strategies](./caching-strategies.md)** - Advanced caching techniques
525
- - **[Monitoring Guide](./monitoring.md)** - Performance monitoring setup
526
-
527
- ## 🆘 Troubleshooting
528
-
529
- ### Common Performance Issues
530
-
531
- **Issue 1: Large Bundle Size**
532
- - Use tree shaking
533
- - Implement code splitting
534
- - Remove unused dependencies
535
-
536
- **Issue 2: Slow Rendering**
537
- - Use React.memo
538
- - Optimize callbacks with useCallback
539
- - Implement virtualization
540
-
541
- **Issue 3: Memory Leaks**
542
- - Clean up event listeners
543
- - Cancel API requests
544
- - Clear timers and intervals
545
-
546
- **Issue 4: Slow API Responses**
547
- - Implement caching
548
- - Use pagination
549
- - Optimize database queries
550
-
551
- Remember: **Performance is a feature, not an afterthought!**