@jmruthers/pace-core 0.6.5 → 0.6.7

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 (473) hide show
  1. package/CHANGELOG.md +104 -0
  2. package/README.md +5 -403
  3. package/audit-tool/00-dependencies.cjs +394 -0
  4. package/audit-tool/audits/01-pace-core-compliance.cjs +556 -0
  5. package/audit-tool/audits/02-project-structure.cjs +255 -0
  6. package/audit-tool/audits/03-architecture.cjs +196 -0
  7. package/audit-tool/audits/04-code-quality.cjs +149 -0
  8. package/audit-tool/audits/05-styling.cjs +224 -0
  9. package/audit-tool/audits/06-security-rbac.cjs +544 -0
  10. package/audit-tool/audits/07-api-tech-stack.cjs +301 -0
  11. package/audit-tool/audits/08-testing-documentation.cjs +202 -0
  12. package/audit-tool/audits/09-operations.cjs +208 -0
  13. package/audit-tool/index.cjs +291 -0
  14. package/audit-tool/utils/code-utils.cjs +218 -0
  15. package/audit-tool/utils/file-utils.cjs +230 -0
  16. package/audit-tool/utils/report-utils.cjs +241 -0
  17. package/core-usage-manifest.json +93 -0
  18. package/cursor-rules/00-standards-overview.mdc +156 -0
  19. package/cursor-rules/01-pace-core-compliance.mdc +586 -0
  20. package/cursor-rules/02-project-structure.mdc +42 -4
  21. package/cursor-rules/{03-solid-principles.mdc → 03-architecture.mdc} +126 -10
  22. package/cursor-rules/04-code-quality.mdc +419 -0
  23. package/cursor-rules/{08-markup-quality.mdc → 05-styling.mdc} +104 -34
  24. package/cursor-rules/06-security-rbac.mdc +518 -0
  25. package/cursor-rules/07-api-tech-stack.mdc +377 -0
  26. package/cursor-rules/08-testing-documentation.mdc +324 -0
  27. package/cursor-rules/09-operations.mdc +365 -0
  28. package/dist/{AuthService-Cb34EQs3.d.ts → AuthService-DmfO5rGS.d.ts} +10 -0
  29. package/dist/DataTable-7PMH7XN7.js +15 -0
  30. package/dist/{DataTable-BMRU8a1j.d.ts → DataTable-DRUIgtUH.d.ts} +1 -1
  31. package/dist/{PublicPageProvider-QTFVrL-Z.d.ts → PublicPageProvider-DlsCaR5v.d.ts} +33 -72
  32. package/dist/UnifiedAuthProvider-ZT6TIGM7.js +7 -0
  33. package/dist/api-Y4MQWOFW.js +4 -0
  34. package/dist/audit-MYQXYZFU.js +3 -0
  35. package/dist/{chunk-DGUM43GV.js → chunk-3RG5ZIWI.js} +1 -4
  36. package/dist/{chunk-QXHPKYJV.js → chunk-4SXLQIZO.js} +1 -26
  37. package/dist/{chunk-UPPMRMYG.js → chunk-5X4QLXRG.js} +73 -151
  38. package/dist/chunk-6F3IILHI.js +62 -0
  39. package/dist/{chunk-E66EQZE6.js → chunk-6GLLNA6U.js} +3 -9
  40. package/dist/{chunk-ZSAAAMVR.js → chunk-6QYDGKQY.js} +1 -4
  41. package/dist/{chunk-FMUCXFII.js → chunk-7ILTDCL2.js} +9 -5
  42. package/dist/{chunk-M43Y4SSO.js → chunk-A3W6LW53.js} +15 -13
  43. package/dist/{chunk-63FOKYGO.js → chunk-AHU7G2R5.js} +2 -11
  44. package/dist/{chunk-HU2C6SSC.js → chunk-BM4CQ5P3.js} +606 -559
  45. package/dist/chunk-C7NSAPTL.js +1 -0
  46. package/dist/{chunk-J36DSWQK.js → chunk-FEJLJNWA.js} +7 -41
  47. package/dist/{chunk-IHB5DR3H.js → chunk-FTCRZOG2.js} +188 -387
  48. package/dist/{chunk-G37KK66H.js → chunk-FYHN4DD5.js} +60 -19
  49. package/dist/chunk-GHYHJTYV.js +994 -0
  50. package/dist/{chunk-VBXEHIUJ.js → chunk-HF6O3O37.js} +6 -88
  51. package/dist/{chunk-FFQEQTNW.js → chunk-IUBRCBSY.js} +134 -45
  52. package/dist/{chunk-6COVEUS7.js → chunk-JGWDVX64.js} +983 -1034
  53. package/dist/{chunk-RGAWHO7N.js → chunk-L4XMVJKY.js} +77 -222
  54. package/dist/chunk-MBADTM7L.js +64 -0
  55. package/dist/{chunk-M7MPQISP.js → chunk-OJ4SKRSV.js} +3 -16
  56. package/dist/{chunk-IVOFDYWT.js → chunk-Q7Q7V5NV.js} +2109 -1604
  57. package/dist/{chunk-JGRYX5UX.js → chunk-S7DKJPLT.js} +29 -58
  58. package/dist/{chunk-PWLANIRT.js → chunk-TTRFSOKR.js} +1 -7
  59. package/dist/{chunk-5DRSZLL2.js → chunk-UH3NTO3F.js} +1 -6
  60. package/dist/{chunk-NTM7ZSB6.js → chunk-VBCS3DUA.js} +261 -168
  61. package/dist/{chunk-EFN2EIMK.js → chunk-ZFYPMX46.js} +271 -87
  62. package/dist/{chunk-L4OXEN46.js → chunk-ZKAWKYT4.js} +10 -24
  63. package/dist/components.d.ts +7 -5
  64. package/dist/components.js +46 -257
  65. package/dist/{database.generated-CzIvgcPu.d.ts → database.generated-CcnC_DRc.d.ts} +4795 -3691
  66. package/dist/eslint-rules/index.cjs +35 -0
  67. package/{src/eslint-rules/pace-core-compliance.cjs → dist/eslint-rules/rules/01-pace-core-compliance.cjs} +234 -235
  68. package/dist/eslint-rules/rules/04-code-quality.cjs +290 -0
  69. package/dist/eslint-rules/rules/05-styling.cjs +61 -0
  70. package/dist/eslint-rules/rules/06-security-rbac.cjs +806 -0
  71. package/dist/eslint-rules/rules/07-api-tech-stack.cjs +263 -0
  72. package/dist/eslint-rules/rules/08-testing.cjs +94 -0
  73. package/dist/eslint-rules/utils/helpers.cjs +42 -0
  74. package/dist/eslint-rules/utils/manifest-loader.cjs +75 -0
  75. package/dist/hooks.d.ts +6 -6
  76. package/dist/hooks.js +62 -172
  77. package/dist/icons/index.d.ts +1 -0
  78. package/dist/icons/index.js +1 -0
  79. package/dist/index.d.ts +12 -11
  80. package/dist/index.js +67 -660
  81. package/dist/providers.d.ts +2 -2
  82. package/dist/providers.js +8 -35
  83. package/dist/rbac/eslint-rules.d.ts +46 -44
  84. package/dist/rbac/eslint-rules.js +7 -4
  85. package/dist/rbac/index.d.ts +109 -586
  86. package/dist/rbac/index.js +14 -207
  87. package/dist/styles/index.js +2 -12
  88. package/dist/theming/runtime.d.ts +14 -1
  89. package/dist/theming/runtime.js +3 -19
  90. package/dist/{timezone-CHhWg6b4.d.ts → timezone-BZe_eUxx.d.ts} +175 -1
  91. package/dist/{types-CkbwOr4Y.d.ts → types-DXstZpNI.d.ts} +4 -17
  92. package/dist/types-t9H8qKRw.d.ts +55 -0
  93. package/dist/types.d.ts +1 -1
  94. package/dist/types.js +7 -94
  95. package/dist/{usePublicRouteParams-ClnV4tnv.d.ts → usePublicRouteParams-MamNgwqe.d.ts} +20 -20
  96. package/dist/utils.d.ts +24 -117
  97. package/dist/utils.js +54 -392
  98. package/docs/README.md +17 -7
  99. package/docs/api/README.md +4 -402
  100. package/docs/api/modules.md +301 -871
  101. package/docs/api-reference/components.md +21 -21
  102. package/docs/api-reference/deprecated.md +31 -6
  103. package/docs/api-reference/hooks.md +80 -80
  104. package/docs/api-reference/rpc-functions.md +78 -3
  105. package/docs/api-reference/types.md +1 -1
  106. package/docs/api-reference/utilities.md +1 -1
  107. package/docs/architecture/README.md +1 -1
  108. package/docs/core-concepts/events.md +3 -3
  109. package/docs/core-concepts/organisations.md +6 -6
  110. package/docs/core-concepts/permissions.md +6 -6
  111. package/docs/documentation-index.md +12 -18
  112. package/docs/getting-started/cursor-rules.md +3 -23
  113. package/docs/getting-started/dependencies.md +650 -0
  114. package/docs/getting-started/documentation-index.md +1 -1
  115. package/docs/getting-started/examples/README.md +4 -4
  116. package/docs/getting-started/examples/full-featured-app.md +1 -1
  117. package/docs/getting-started/faq.md +2 -2
  118. package/docs/getting-started/installation-guide.md +20 -7
  119. package/docs/getting-started/quick-reference.md +4 -4
  120. package/docs/getting-started/quick-start.md +23 -12
  121. package/docs/implementation-guides/authentication.md +15 -15
  122. package/docs/implementation-guides/component-styling.md +1 -1
  123. package/docs/implementation-guides/data-tables.md +126 -33
  124. package/docs/implementation-guides/datatable-rbac-usage.md +1 -1
  125. package/docs/implementation-guides/dynamic-colors.md +3 -3
  126. package/docs/implementation-guides/file-upload-storage.md +2 -2
  127. package/docs/implementation-guides/hierarchical-datatable.md +40 -60
  128. package/docs/implementation-guides/inactivity-tracking.md +3 -3
  129. package/docs/implementation-guides/large-datasets.md +3 -2
  130. package/docs/implementation-guides/organisation-security.md +2 -2
  131. package/docs/implementation-guides/performance.md +2 -2
  132. package/docs/implementation-guides/permission-enforcement.md +5 -1
  133. package/docs/migration/V0.3.44_organisation-context-timing-fix.md +1 -1
  134. package/docs/migration/V0.4.0_rbac-migration.md +6 -6
  135. package/docs/rbac/MIGRATION_GUIDE.md +819 -0
  136. package/docs/rbac/RBAC_CONTRACT.md +724 -0
  137. package/docs/rbac/README.md +17 -8
  138. package/docs/rbac/advanced-patterns.md +6 -6
  139. package/docs/rbac/api-reference.md +20 -20
  140. package/docs/rbac/edge-functions-guide.md +376 -0
  141. package/docs/rbac/event-based-apps.md +3 -3
  142. package/docs/rbac/examples.md +41 -41
  143. package/docs/rbac/getting-started.md +37 -37
  144. package/docs/rbac/performance.md +1 -1
  145. package/docs/rbac/quick-start.md +52 -52
  146. package/docs/rbac/secure-client-protection.md +1 -35
  147. package/docs/rbac/troubleshooting.md +1 -1
  148. package/docs/security/README.md +5 -5
  149. package/docs/standards/0-standards-overview.md +220 -0
  150. package/docs/standards/1-pace-core-compliance-standards.md +986 -0
  151. package/docs/standards/2-project-structure-standards.md +949 -0
  152. package/docs/standards/3-architecture-standards.md +606 -0
  153. package/docs/standards/4-code-quality-standards.md +728 -0
  154. package/docs/standards/5-styling-standards.md +348 -0
  155. package/docs/standards/{07-rbac-and-rls-standard.md → 6-security-rbac-standards.md} +269 -66
  156. package/docs/standards/7-api-tech-stack-standards.md +662 -0
  157. package/docs/standards/8-testing-documentation-standards.md +401 -0
  158. package/docs/standards/9-operations-standards.md +1102 -0
  159. package/docs/standards/README.md +185 -57
  160. package/docs/troubleshooting/README.md +4 -4
  161. package/docs/troubleshooting/common-issues.md +2 -2
  162. package/docs/troubleshooting/debugging.md +9 -9
  163. package/docs/troubleshooting/migration.md +4 -4
  164. package/docs/troubleshooting/organisation-context-setup.md +42 -19
  165. package/eslint-config-pace-core.cjs +33 -6
  166. package/package.json +35 -23
  167. package/scripts/install-cursor-rules.cjs +25 -6
  168. package/scripts/install-eslint-config.cjs +284 -0
  169. package/src/__tests__/fixtures/supabase.ts +1 -1
  170. package/src/__tests__/helpers/__tests__/component-test-utils.test.tsx +3 -3
  171. package/src/__tests__/helpers/__tests__/optimized-test-setup.test.ts +1 -1
  172. package/src/__tests__/helpers/__tests__/supabaseMock.test.ts +1 -1
  173. package/src/__tests__/helpers/__tests__/test-providers.test.tsx +2 -2
  174. package/src/__tests__/helpers/__tests__/test-utils.test.tsx +13 -13
  175. package/src/__tests__/helpers/component-test-utils.tsx +1 -1
  176. package/src/__tests__/helpers/supabaseMock.ts +2 -2
  177. package/src/__tests__/integration/UserProfile.test.tsx +14 -14
  178. package/src/__tests__/public-recipe-view.test.ts +38 -9
  179. package/src/__tests__/rbac/PagePermissionGuard.test.tsx +6 -6
  180. package/src/__tests__/templates/accessibility.test.template.tsx +9 -9
  181. package/src/__tests__/templates/component.test.template.tsx +18 -15
  182. package/src/components/Button/Button.tsx +5 -1
  183. package/src/components/Calendar/Calendar.tsx +201 -47
  184. package/src/components/ContextSelector/ContextSelector.tsx +106 -119
  185. package/src/components/DataTable/AUDIT_REPORT.md +293 -0
  186. package/src/components/DataTable/__tests__/DataTableCore.test.tsx +10 -2
  187. package/src/components/DataTable/__tests__/a11y.basic.test.tsx +10 -4
  188. package/src/components/DataTable/__tests__/test-utils/sharedTestUtils.tsx +9 -9
  189. package/src/components/DataTable/components/ColumnFilter.tsx +63 -74
  190. package/src/components/DataTable/components/ColumnVisibilityDropdown.tsx +43 -41
  191. package/src/components/DataTable/components/DataTableCore.tsx +186 -13
  192. package/src/components/DataTable/components/DataTableErrorBoundary.tsx +9 -11
  193. package/src/components/DataTable/components/DataTableLayout.tsx +35 -21
  194. package/src/components/DataTable/components/EditFields.tsx +23 -3
  195. package/src/components/DataTable/components/EditableRow.tsx +12 -9
  196. package/src/components/DataTable/components/EmptyState.tsx +10 -9
  197. package/src/components/DataTable/components/FilterRow.tsx +2 -4
  198. package/src/components/DataTable/components/ImportModal.tsx +124 -126
  199. package/src/components/DataTable/components/LoadingState.tsx +5 -6
  200. package/src/components/DataTable/components/RowComponent.tsx +12 -0
  201. package/src/components/DataTable/components/SortIndicator.tsx +50 -0
  202. package/src/components/DataTable/components/__tests__/COVERAGE_NOTE.md +4 -4
  203. package/src/components/DataTable/components/__tests__/ColumnFilter.test.tsx +23 -82
  204. package/src/components/DataTable/components/__tests__/DataTableErrorBoundary.test.tsx +37 -9
  205. package/src/components/DataTable/components/__tests__/EmptyState.test.tsx +7 -4
  206. package/src/components/DataTable/components/__tests__/FilterRow.test.tsx +12 -4
  207. package/src/components/DataTable/components/__tests__/LoadingState.test.tsx +41 -27
  208. package/src/components/DataTable/components/hooks/usePermissionTracking.ts +0 -4
  209. package/src/components/DataTable/components/index.ts +2 -1
  210. package/src/components/DataTable/hooks/__tests__/useDataTableState.test.ts +51 -47
  211. package/src/components/DataTable/hooks/useDataTablePermissions.ts +24 -21
  212. package/src/components/DataTable/hooks/useDataTableState.ts +125 -9
  213. package/src/components/DataTable/hooks/useTableColumns.ts +40 -2
  214. package/src/components/DataTable/hooks/useTableHandlers.ts +11 -0
  215. package/src/components/DataTable/types.ts +5 -18
  216. package/src/components/DataTable/utils/a11yUtils.ts +17 -0
  217. package/src/components/DatePickerWithTimezone/DatePickerWithTimezone.test.tsx +2 -1
  218. package/src/components/DatePickerWithTimezone/DatePickerWithTimezone.tsx +11 -15
  219. package/src/components/DateTimeField/DateTimeField.tsx +10 -9
  220. package/src/components/Dialog/Dialog.test.tsx +128 -104
  221. package/src/components/Dialog/Dialog.tsx +742 -24
  222. package/src/components/ErrorBoundary/ErrorBoundary.tsx +77 -79
  223. package/src/components/FileDisplay/FileDisplay.test.tsx +4 -2
  224. package/src/components/FileDisplay/FileDisplay.tsx +23 -17
  225. package/src/components/FileUpload/FileUpload.test.tsx +52 -14
  226. package/src/components/FileUpload/FileUpload.tsx +112 -130
  227. package/src/components/Form/Form.test.tsx +6 -8
  228. package/src/components/Form/Form.tsx +365 -4
  229. package/src/components/NavigationMenu/NavigationMenu.test.tsx +14 -13
  230. package/src/components/NavigationMenu/useNavigationFiltering.ts +11 -21
  231. package/src/components/PaceAppLayout/PaceAppLayout.test.tsx +6 -4
  232. package/src/components/PaceAppLayout/PaceAppLayout.tsx +11 -15
  233. package/src/components/PaceLoginPage/PaceLoginPage.test.tsx +108 -61
  234. package/src/components/PaceLoginPage/PaceLoginPage.tsx +27 -3
  235. package/src/components/Progress/Progress.tsx +2 -4
  236. package/src/components/ProtectedRoute/ProtectedRoute.tsx +8 -8
  237. package/src/components/Select/Select.tsx +109 -98
  238. package/src/components/Select/types.ts +4 -1
  239. package/src/components/UserMenu/UserMenu.tsx +9 -6
  240. package/src/hooks/__tests__/ServiceHooks.test.tsx +16 -16
  241. package/src/hooks/__tests__/hooks.integration.test.tsx +55 -57
  242. package/src/hooks/__tests__/useAppConfig.unit.test.ts +129 -67
  243. package/src/hooks/__tests__/useFocusTrap.unit.test.tsx +97 -97
  244. package/src/hooks/__tests__/usePublicEvent.simple.test.ts +149 -67
  245. package/src/hooks/__tests__/usePublicEvent.test.ts +149 -79
  246. package/src/hooks/__tests__/usePublicEvent.unit.test.ts +158 -109
  247. package/src/hooks/__tests__/useSessionDraft.test.ts +163 -0
  248. package/src/hooks/__tests__/useSessionRestoration.unit.test.tsx +10 -5
  249. package/src/hooks/public/usePublicEvent.ts +67 -195
  250. package/src/hooks/public/usePublicEventLogo.test.ts +70 -17
  251. package/src/hooks/public/usePublicEventLogo.ts +24 -14
  252. package/src/hooks/public/usePublicFileDisplay.ts +2 -2
  253. package/src/hooks/public/usePublicRouteParams.ts +5 -5
  254. package/src/hooks/useAppConfig.ts +28 -26
  255. package/src/hooks/useEventTheme.test.ts +217 -239
  256. package/src/hooks/useEventTheme.ts +16 -28
  257. package/src/hooks/useFileDisplay.ts +2 -2
  258. package/src/hooks/useOrganisationPermissions.ts +5 -7
  259. package/src/hooks/useQueryCache.ts +0 -1
  260. package/src/hooks/useSessionDraft.ts +380 -0
  261. package/src/hooks/useSessionRestoration.ts +3 -1
  262. package/src/icons/index.ts +27 -0
  263. package/src/index.ts +5 -0
  264. package/src/providers/OrganisationProvider.tsx +23 -14
  265. package/src/providers/UnifiedAuthProvider.smoke.test.tsx +21 -21
  266. package/src/providers/__tests__/AuthProvider.test.tsx +21 -21
  267. package/src/providers/__tests__/EventProvider.test.tsx +61 -61
  268. package/src/providers/__tests__/InactivityProvider.test.tsx +56 -56
  269. package/src/providers/__tests__/OrganisationProvider.test.tsx +75 -75
  270. package/src/providers/__tests__/ProviderLifecycle.test.tsx +37 -37
  271. package/src/providers/__tests__/UnifiedAuthProvider.test.tsx +103 -103
  272. package/src/providers/services/EventServiceProvider.tsx +1 -24
  273. package/src/providers/services/UnifiedAuthProvider.tsx +5 -48
  274. package/src/providers/services/__tests__/AuthServiceProvider.integration.test.tsx +7 -7
  275. package/src/providers/services/__tests__/UnifiedAuthProvider.integration.test.tsx +13 -10
  276. package/src/rbac/__tests__/adapters.comprehensive.test.tsx +7 -457
  277. package/src/rbac/__tests__/auth-rbac.e2e.test.tsx +33 -7
  278. package/src/rbac/adapters.tsx +7 -295
  279. package/src/rbac/api.test.ts +44 -56
  280. package/src/rbac/api.ts +10 -17
  281. package/src/rbac/cache-invalidation.ts +0 -1
  282. package/src/rbac/compliance/index.ts +10 -0
  283. package/src/rbac/compliance/pattern-detector.ts +553 -0
  284. package/src/rbac/compliance/runtime-compliance.ts +22 -0
  285. package/src/rbac/components/AccessDenied.tsx +150 -0
  286. package/src/rbac/components/NavigationGuard.tsx +12 -20
  287. package/src/rbac/components/PagePermissionGuard.tsx +4 -24
  288. package/src/rbac/components/__tests__/NavigationGuard.test.tsx +21 -8
  289. package/src/rbac/components/index.ts +3 -41
  290. package/src/rbac/eslint-rules.js +1 -1
  291. package/src/rbac/hooks/index.ts +0 -3
  292. package/src/rbac/hooks/permissions/index.ts +0 -3
  293. package/src/rbac/hooks/permissions/useAccessLevel.ts +4 -8
  294. package/src/rbac/hooks/usePermissions.ts +0 -3
  295. package/src/rbac/hooks/useResolvedScope.test.ts +57 -47
  296. package/src/rbac/hooks/useResolvedScope.ts +58 -140
  297. package/src/rbac/hooks/useResourcePermissions.test.ts +124 -38
  298. package/src/rbac/hooks/useResourcePermissions.ts +139 -48
  299. package/src/rbac/hooks/useRoleManagement.test.ts +65 -22
  300. package/src/rbac/hooks/useRoleManagement.ts +147 -19
  301. package/src/rbac/hooks/useSecureSupabase.ts +4 -8
  302. package/src/rbac/index.ts +7 -9
  303. package/src/rbac/utils/contextValidator.ts +9 -7
  304. package/src/services/AuthService.ts +130 -18
  305. package/src/services/EventService.ts +4 -97
  306. package/src/services/InactivityService.ts +16 -0
  307. package/src/services/OrganisationService.ts +7 -44
  308. package/src/services/__tests__/OrganisationService.test.ts +26 -8
  309. package/src/services/base/BaseService.ts +0 -3
  310. package/src/styles/core.css +7 -0
  311. package/src/theming/__tests__/parseEventColours.test.ts +9 -3
  312. package/src/theming/parseEventColours.ts +22 -10
  313. package/src/types/database.generated.ts +4733 -3809
  314. package/src/utils/__tests__/lazyLoad.unit.test.tsx +42 -39
  315. package/src/utils/__tests__/organisationContext.unit.test.ts +9 -10
  316. package/src/utils/context/organisationContext.test.ts +13 -28
  317. package/src/utils/context/organisationContext.ts +21 -52
  318. package/src/utils/dynamic/dynamicUtils.ts +1 -1
  319. package/src/utils/file-reference/index.ts +39 -15
  320. package/src/utils/formatting/formatDateTime.test.ts +3 -2
  321. package/src/utils/google-places/loadGoogleMapsScript.ts +29 -4
  322. package/src/utils/index.ts +4 -1
  323. package/src/utils/persistence/__tests__/keyDerivation.test.ts +135 -0
  324. package/src/utils/persistence/__tests__/sensitiveFieldDetection.test.ts +123 -0
  325. package/src/utils/persistence/keyDerivation.ts +304 -0
  326. package/src/utils/persistence/sensitiveFieldDetection.ts +212 -0
  327. package/src/utils/security/secureStorage.ts +5 -5
  328. package/src/utils/storage/README.md +1 -1
  329. package/src/utils/storage/helpers.ts +3 -3
  330. package/src/utils/supabase/createBaseClient.ts +147 -0
  331. package/src/utils/timezone/timezone.test.ts +1 -2
  332. package/src/utils/timezone/timezone.ts +1 -1
  333. package/src/utils/validation/csrf.ts +4 -4
  334. package/cursor-rules/00-pace-core-compliance.mdc +0 -331
  335. package/cursor-rules/01-standards-compliance.mdc +0 -244
  336. package/cursor-rules/04-testing-standards.mdc +0 -268
  337. package/cursor-rules/05-bug-reports-and-features.mdc +0 -246
  338. package/cursor-rules/06-code-quality.mdc +0 -309
  339. package/cursor-rules/07-tech-stack-compliance.mdc +0 -214
  340. package/cursor-rules/CHANGELOG.md +0 -119
  341. package/cursor-rules/README.md +0 -192
  342. package/dist/DataTable-AOVNCPTX.js +0 -175
  343. package/dist/DataTable-AOVNCPTX.js.map +0 -1
  344. package/dist/UnifiedAuthProvider-4SBX4LU5.js +0 -18
  345. package/dist/UnifiedAuthProvider-4SBX4LU5.js.map +0 -1
  346. package/dist/api-O6HTBX5Y.js +0 -52
  347. package/dist/api-O6HTBX5Y.js.map +0 -1
  348. package/dist/audit-V53FV5AG.js +0 -17
  349. package/dist/audit-V53FV5AG.js.map +0 -1
  350. package/dist/chunk-5DRSZLL2.js.map +0 -1
  351. package/dist/chunk-63FOKYGO.js.map +0 -1
  352. package/dist/chunk-6COVEUS7.js.map +0 -1
  353. package/dist/chunk-AFVQODI2.js +0 -263
  354. package/dist/chunk-AFVQODI2.js.map +0 -1
  355. package/dist/chunk-DGUM43GV.js.map +0 -1
  356. package/dist/chunk-E66EQZE6.js.map +0 -1
  357. package/dist/chunk-EFN2EIMK.js.map +0 -1
  358. package/dist/chunk-FFQEQTNW.js.map +0 -1
  359. package/dist/chunk-FMUCXFII.js.map +0 -1
  360. package/dist/chunk-G37KK66H.js.map +0 -1
  361. package/dist/chunk-G7QEZTYQ.js +0 -2053
  362. package/dist/chunk-G7QEZTYQ.js.map +0 -1
  363. package/dist/chunk-HU2C6SSC.js.map +0 -1
  364. package/dist/chunk-IHB5DR3H.js.map +0 -1
  365. package/dist/chunk-IVOFDYWT.js.map +0 -1
  366. package/dist/chunk-J36DSWQK.js.map +0 -1
  367. package/dist/chunk-JGRYX5UX.js.map +0 -1
  368. package/dist/chunk-KQCRWDSA.js +0 -1
  369. package/dist/chunk-KQCRWDSA.js.map +0 -1
  370. package/dist/chunk-L4OXEN46.js.map +0 -1
  371. package/dist/chunk-LMC26NLJ.js +0 -84
  372. package/dist/chunk-LMC26NLJ.js.map +0 -1
  373. package/dist/chunk-M43Y4SSO.js.map +0 -1
  374. package/dist/chunk-M7MPQISP.js.map +0 -1
  375. package/dist/chunk-NTM7ZSB6.js.map +0 -1
  376. package/dist/chunk-PWLANIRT.js.map +0 -1
  377. package/dist/chunk-QXHPKYJV.js.map +0 -1
  378. package/dist/chunk-RGAWHO7N.js.map +0 -1
  379. package/dist/chunk-UPPMRMYG.js.map +0 -1
  380. package/dist/chunk-VBXEHIUJ.js.map +0 -1
  381. package/dist/chunk-ZSAAAMVR.js.map +0 -1
  382. package/dist/components.js.map +0 -1
  383. package/dist/contextValidator-5OGXSPKS.js +0 -9
  384. package/dist/contextValidator-5OGXSPKS.js.map +0 -1
  385. package/dist/eslint-rules/pace-core-compliance.cjs +0 -510
  386. package/dist/hooks.js.map +0 -1
  387. package/dist/index.js.map +0 -1
  388. package/dist/providers.js.map +0 -1
  389. package/dist/rbac/eslint-rules.js.map +0 -1
  390. package/dist/rbac/index.js.map +0 -1
  391. package/dist/styles/index.js.map +0 -1
  392. package/dist/theming/runtime.js.map +0 -1
  393. package/dist/types.js.map +0 -1
  394. package/dist/utils.js.map +0 -1
  395. package/docs/best-practices/README.md +0 -472
  396. package/docs/best-practices/accessibility.md +0 -601
  397. package/docs/best-practices/common-patterns.md +0 -516
  398. package/docs/best-practices/deployment.md +0 -1103
  399. package/docs/best-practices/performance.md +0 -1328
  400. package/docs/best-practices/security.md +0 -940
  401. package/docs/best-practices/testing.md +0 -1034
  402. package/docs/rbac/compliance/compliance-guide.md +0 -544
  403. package/docs/standards/01-architecture-standard.md +0 -44
  404. package/docs/standards/02-api-and-rpc-standard.md +0 -39
  405. package/docs/standards/03-component-standard.md +0 -32
  406. package/docs/standards/04-code-style-standard.md +0 -32
  407. package/docs/standards/05-security-standard.md +0 -44
  408. package/docs/standards/06-testing-and-docs-standard.md +0 -29
  409. package/docs/standards/pace-core-compliance.md +0 -432
  410. package/scripts/audit/core/checks/accessibility.cjs +0 -197
  411. package/scripts/audit/core/checks/api-usage.cjs +0 -191
  412. package/scripts/audit/core/checks/bundle.cjs +0 -142
  413. package/scripts/audit/core/checks/compliance.cjs +0 -2706
  414. package/scripts/audit/core/checks/config.cjs +0 -54
  415. package/scripts/audit/core/checks/coverage.cjs +0 -84
  416. package/scripts/audit/core/checks/dependencies.cjs +0 -994
  417. package/scripts/audit/core/checks/documentation.cjs +0 -268
  418. package/scripts/audit/core/checks/environment.cjs +0 -116
  419. package/scripts/audit/core/checks/error-handling.cjs +0 -340
  420. package/scripts/audit/core/checks/forms.cjs +0 -172
  421. package/scripts/audit/core/checks/heuristics.cjs +0 -68
  422. package/scripts/audit/core/checks/hooks.cjs +0 -334
  423. package/scripts/audit/core/checks/imports.cjs +0 -244
  424. package/scripts/audit/core/checks/performance.cjs +0 -325
  425. package/scripts/audit/core/checks/routes.cjs +0 -117
  426. package/scripts/audit/core/checks/state.cjs +0 -130
  427. package/scripts/audit/core/checks/structure.cjs +0 -65
  428. package/scripts/audit/core/checks/style.cjs +0 -584
  429. package/scripts/audit/core/checks/testing.cjs +0 -122
  430. package/scripts/audit/core/checks/typescript.cjs +0 -61
  431. package/scripts/audit/core/scanner.cjs +0 -199
  432. package/scripts/audit/core/utils.cjs +0 -137
  433. package/scripts/audit/index.cjs +0 -223
  434. package/scripts/audit/reporters/console.cjs +0 -151
  435. package/scripts/audit/reporters/json.cjs +0 -54
  436. package/scripts/audit/reporters/markdown.cjs +0 -124
  437. package/scripts/audit-consuming-app.cjs +0 -86
  438. package/src/components/DataTable/components/DataTableBody.tsx +0 -454
  439. package/src/components/DataTable/components/DraggableColumnHeader.tsx +0 -156
  440. package/src/components/DataTable/components/ExpandButton.tsx +0 -113
  441. package/src/components/DataTable/components/GroupHeader.tsx +0 -54
  442. package/src/components/DataTable/components/ViewRowModal.tsx +0 -68
  443. package/src/components/DataTable/components/VirtualizedDataTable.tsx +0 -525
  444. package/src/components/DataTable/components/__tests__/ExpandButton.test.tsx +0 -462
  445. package/src/components/DataTable/components/__tests__/GroupHeader.test.tsx +0 -393
  446. package/src/components/DataTable/components/__tests__/ViewRowModal.test.tsx +0 -476
  447. package/src/components/DataTable/components/__tests__/VirtualizedDataTable.test.tsx +0 -128
  448. package/src/components/DataTable/core/DataTableContext.tsx +0 -216
  449. package/src/components/DataTable/core/__tests__/DataTableContext.test.tsx +0 -136
  450. package/src/components/DataTable/hooks/__tests__/useColumnReordering.test.ts +0 -570
  451. package/src/components/DataTable/hooks/useColumnReordering.ts +0 -123
  452. package/src/components/DataTable/utils/debugTools.ts +0 -514
  453. package/src/eslint-rules/pace-core-compliance.js +0 -638
  454. package/src/rbac/components/EnhancedNavigationMenu.test.tsx +0 -555
  455. package/src/rbac/components/EnhancedNavigationMenu.tsx +0 -293
  456. package/src/rbac/components/NavigationProvider.test.tsx +0 -481
  457. package/src/rbac/components/NavigationProvider.tsx +0 -345
  458. package/src/rbac/components/PagePermissionProvider.test.tsx +0 -476
  459. package/src/rbac/components/PagePermissionProvider.tsx +0 -279
  460. package/src/rbac/components/PermissionEnforcer.tsx +0 -312
  461. package/src/rbac/components/RoleBasedRouter.tsx +0 -440
  462. package/src/rbac/components/SecureDataProvider.test.tsx +0 -543
  463. package/src/rbac/components/SecureDataProvider.tsx +0 -339
  464. package/src/rbac/components/__tests__/EnhancedNavigationMenu.test.tsx +0 -620
  465. package/src/rbac/components/__tests__/NavigationProvider.test.tsx +0 -726
  466. package/src/rbac/components/__tests__/PagePermissionProvider.test.tsx +0 -661
  467. package/src/rbac/components/__tests__/PermissionEnforcer.test.tsx +0 -881
  468. package/src/rbac/components/__tests__/RoleBasedRouter.test.tsx +0 -783
  469. package/src/rbac/components/__tests__/SecureDataProvider.fixed.test.tsx +0 -645
  470. package/src/rbac/components/__tests__/SecureDataProvider.test.tsx +0 -659
  471. package/src/rbac/hooks/permissions/useCachedPermissions.ts +0 -79
  472. package/src/rbac/hooks/permissions/useHasAllPermissions.ts +0 -90
  473. package/src/rbac/hooks/permissions/useHasAnyPermission.ts +0 -90
@@ -112,20 +112,20 @@ const columns: DataTableColumn<Dish>[] = [
112
112
  header: 'Name',
113
113
  // Different rendering for parent vs child rows
114
114
  renderForParent: (row) => (
115
- <div className="flex items-center gap-2">
115
+ <section className="flex items-center gap-2">
116
116
  <span className="font-semibold text-main-800">{row.name}</span>
117
117
  <span className="text-xs bg-main-100 text-main-700 px-2 py-1 rounded">
118
118
  {row.type}
119
119
  </span>
120
- </div>
120
+ </section>
121
121
  ),
122
122
  renderForChild: (row) => (
123
- <div className="flex items-center gap-2 ml-4">
123
+ <section className="flex items-center gap-2 ml-4">
124
124
  <span className="text-sec-700">{row.name}</span>
125
125
  <span className="text-xs bg-sec-100 text-sec-600 px-2 py-1 rounded">
126
126
  {row.type}
127
127
  </span>
128
- </div>
128
+ </section>
129
129
  ),
130
130
  },
131
131
  {
@@ -133,14 +133,14 @@ const columns: DataTableColumn<Dish>[] = [
133
133
  accessorKey: 'cost',
134
134
  header: 'Cost',
135
135
  renderForParent: (row) => (
136
- <div className="text-right font-semibold text-main-800">
136
+ <p className="text-right font-semibold text-main-800">
137
137
  ${row.cost?.toFixed(2)}
138
- </div>
138
+ </p>
139
139
  ),
140
140
  renderForChild: (row) => (
141
- <div className="text-right text-sec-600 ml-4">
141
+ <p className="text-right text-sec-600 ml-4">
142
142
  ${row.cost?.toFixed(2)}
143
- </div>
143
+ </p>
144
144
  ),
145
145
  },
146
146
  {
@@ -150,10 +150,10 @@ const columns: DataTableColumn<Dish>[] = [
150
150
  // Only show for child rows
151
151
  renderForParent: () => null,
152
152
  renderForChild: (row) => (
153
- <div className="text-sm ml-4">
153
+ <p className="text-sm ml-4">
154
154
  <span className="font-medium">{row.quantity}</span>
155
155
  {row.unit && <span className="text-sec-500 ml-1">{row.unit}</span>}
156
- </div>
156
+ </p>
157
157
  ),
158
158
  hideForParent: true, // Hide this column for parent rows
159
159
  }
@@ -193,7 +193,7 @@ hierarchical={{
193
193
  onExpandedChange: (expandedIds) => {
194
194
  console.log('Expanded rows:', expandedIds);
195
195
  },
196
- expandButton: CustomExpandButton, // Optional custom expand button
196
+ // Note: Custom expand button functionality has been removed. Expand/collapse is handled inline by RowComponent.
197
197
  indentSize: 24, // Indentation for child rows in pixels
198
198
  parentRowClassName: 'bg-main-50 font-medium', // CSS classes for parent rows
199
199
  childRowClassName: 'bg-sec-25', // CSS classes for child rows
@@ -207,7 +207,7 @@ hierarchical={{
207
207
  | `enabled` | `boolean` | `false` | Enable/disable hierarchical functionality |
208
208
  | `defaultExpanded` | `boolean \| string[]` | `false` | Initial expansion state |
209
209
  | `onExpandedChange` | `(expandedIds: string[]) => void` | `undefined` | Callback when expansion changes |
210
- | `expandButton` | `React.ComponentType` | `ExpandButton` | Custom expand/collapse button |
210
+ | `expandButton` | ~~`React.ComponentType`~~ | ~~`ExpandButton`~~ | ~~Custom expand/collapse button~~ **DEPRECATED - Removed** |
211
211
  | `indentSize` | `number` | `24` | Indentation for child rows in pixels |
212
212
  | `parentRowClassName` | `string` | `''` | CSS classes for parent rows |
213
213
  | `childRowClassName` | `string` | `''` | CSS classes for child rows |
@@ -240,16 +240,16 @@ const column: DataTableColumn<YourType> = {
240
240
  id: 'actions',
241
241
  header: 'Actions',
242
242
  renderForParent: (row) => (
243
- <div className="flex gap-2">
243
+ <section className="flex gap-2">
244
244
  <Button size="sm">Edit Recipe</Button>
245
245
  <Button size="sm" variant="outline">Add Ingredient</Button>
246
- </div>
246
+ </section>
247
247
  ),
248
248
  renderForChild: (row) => (
249
- <div className="flex gap-2">
249
+ <section className="flex gap-2">
250
250
  <Button size="sm" variant="ghost">Edit</Button>
251
251
  <Button size="sm" variant="destructive">Remove</Button>
252
- </div>
252
+ </section>
253
253
  ),
254
254
  }
255
255
  ```
@@ -277,29 +277,9 @@ The DataTable automatically adds an expand/collapse all button in the header whe
277
277
  You can provide a custom expand button component:
278
278
 
279
279
  ```tsx
280
- import { ChevronRight, ChevronDown } from 'lucide-react';
281
-
282
- const CustomExpandButton = ({ isExpanded, onClick, ...props }) => (
283
- <button
284
- onClick={onClick}
285
- className="p-1 hover:bg-sec-100 rounded"
286
- {...props}
287
- >
288
- {isExpanded ? (
289
- <ChevronDown className="h-4 w-4" />
290
- ) : (
291
- <ChevronRight className="h-4 w-4" />
292
- )}
293
- </button>
294
- );
295
-
296
- // Use in DataTable
297
- <DataTable
298
- hierarchical={{
299
- enabled: true,
300
- expandButton: CustomExpandButton,
301
- }}
302
- />
280
+ // Note: Custom expand button functionality has been removed.
281
+ // Expand/collapse buttons are now handled inline by RowComponent.
282
+ // The expandButton prop is no longer available in HierarchicalConfig.
303
283
  ```
304
284
 
305
285
  ## Hierarchical Actions
@@ -510,20 +490,20 @@ function HierarchicalDishTable() {
510
490
  enableSorting: true,
511
491
  size: 200,
512
492
  renderForParent: (row) => (
513
- <div className="flex items-center gap-2">
493
+ <section className="flex items-center gap-2">
514
494
  <span className="font-semibold text-main-800">{row.name}</span>
515
495
  <span className="text-xs bg-main-100 text-main-700 px-2 py-1 rounded">
516
496
  {row.type}
517
497
  </span>
518
- </div>
498
+ </section>
519
499
  ),
520
500
  renderForChild: (row) => (
521
- <div className="flex items-center gap-2 ml-4">
501
+ <section className="flex items-center gap-2 ml-4">
522
502
  <span className="text-sec-700">{row.name}</span>
523
503
  <span className="text-xs bg-sec-100 text-sec-600 px-2 py-1 rounded">
524
504
  {row.type}
525
505
  </span>
526
- </div>
506
+ </section>
527
507
  ),
528
508
  },
529
509
  {
@@ -533,14 +513,14 @@ function HierarchicalDishTable() {
533
513
  enableSorting: true,
534
514
  size: 250,
535
515
  renderForParent: (row) => (
536
- <div className="text-sm text-sec-600">
516
+ <p className="text-sm text-sec-600">
537
517
  {row.description}
538
- </div>
518
+ </p>
539
519
  ),
540
520
  renderForChild: (row) => (
541
- <div className="text-sm text-sec-500 ml-4">
521
+ <p className="text-sm text-sec-500 ml-4">
542
522
  {row.description}
543
- </div>
523
+ </p>
544
524
  ),
545
525
  },
546
526
  {
@@ -551,10 +531,10 @@ function HierarchicalDishTable() {
551
531
  size: 120,
552
532
  renderForParent: () => null,
553
533
  renderForChild: (row) => (
554
- <div className="text-sm ml-4">
534
+ <p className="text-sm ml-4">
555
535
  <span className="font-medium">{row.quantity}</span>
556
536
  {row.unit && <span className="text-sec-500 ml-1">{row.unit}</span>}
557
- </div>
537
+ </p>
558
538
  ),
559
539
  hideForParent: true,
560
540
  },
@@ -565,14 +545,14 @@ function HierarchicalDishTable() {
565
545
  enableSorting: true,
566
546
  size: 100,
567
547
  renderForParent: (row) => (
568
- <div className="text-right font-semibold text-main-800">
548
+ <p className="text-right font-semibold text-main-800">
569
549
  ${row.cost?.toFixed(2)}
570
- </div>
550
+ </p>
571
551
  ),
572
552
  renderForChild: (row) => (
573
- <div className="text-right text-sec-600 ml-4">
553
+ <p className="text-right text-sec-600 ml-4">
574
554
  ${row.cost?.toFixed(2)}
575
- </div>
555
+ </p>
576
556
  ),
577
557
  },
578
558
  {
@@ -583,9 +563,9 @@ function HierarchicalDishTable() {
583
563
  size: 150,
584
564
  renderForParent: () => null,
585
565
  renderForChild: (row) => (
586
- <div className="text-sm text-sec-600 ml-4">
566
+ <p className="text-sm text-sec-600 ml-4">
587
567
  {row.supplier}
588
- </div>
568
+ </p>
589
569
  ),
590
570
  hideForParent: true,
591
571
  },
@@ -596,11 +576,11 @@ function HierarchicalDishTable() {
596
576
  enableSorting: true,
597
577
  size: 100,
598
578
  renderForParent: (row) => (
599
- <div className="text-center">
579
+ <section className="text-center">
600
580
  <span className="inline-flex items-center px-2 py-1 rounded text-xs font-medium bg-sec-100 text-sec-800">
601
581
  {row.prepTime} min
602
582
  </span>
603
- </div>
583
+ </section>
604
584
  ),
605
585
  renderForChild: () => null,
606
586
  hideForChild: true,
@@ -618,11 +598,11 @@ function HierarchicalDishTable() {
618
598
  Hard: 'bg-acc-100 text-acc-800'
619
599
  };
620
600
  return (
621
- <div className="text-center">
601
+ <section className="text-center">
622
602
  <span className={`inline-flex items-center px-2 py-1 rounded text-xs font-medium ${colors[row.difficulty as keyof typeof colors] || 'bg-sec-100 text-sec-800'}`}>
623
603
  {row.difficulty}
624
604
  </span>
625
- </div>
605
+ </section>
626
606
  );
627
607
  },
628
608
  renderForChild: () => null,
@@ -812,7 +792,7 @@ interface HierarchicalConfig {
812
792
  enabled: boolean;
813
793
  defaultExpanded?: boolean | string[];
814
794
  onExpandedChange?: (expandedIds: string[]) => void;
815
- expandButton?: React.ComponentType<ExpandButtonProps>;
795
+ // expandButton prop has been removed - expand/collapse is handled inline by RowComponent
816
796
  indentSize?: number;
817
797
  parentRowClassName?: string;
818
798
  childRowClassName?: string;
@@ -449,7 +449,7 @@ function AuthenticatedApp() {
449
449
 
450
450
  // Don't track inactivity if not authenticated
451
451
  if (loading || !user) {
452
- return <div>Loading...</div>;
452
+ return <p>Loading...</p>;
453
453
  }
454
454
 
455
455
  return (
@@ -831,5 +831,5 @@ When user extends session during warning:
831
831
 
832
832
  - **[Authentication Integration](./permission-enforcement.md)** - Security patterns
833
833
  - **[Performance Optimization](./performance.md)** - Large application considerations
834
- - **[Accessibility Guidelines](../best-practices/accessibility.md)** - Accessibility best practices
835
- - **[Security Best Practices](../best-practices/security.md)** - Security considerations
834
+ - **[Accessibility Requirements](../standards/4-code-quality-standards.md#accessibility-requirements)** - Accessibility requirements
835
+ - **[Security & RBAC Standards](../standards/6-security-rbac-standards.md)** - Security considerations
@@ -10,11 +10,12 @@ This guide addresses the common issues when working with large datasets (9,000+
10
10
 
11
11
  **Problem**: Header and body columns were misaligned in virtualized mode due to separate table layouts.
12
12
 
13
- **Solution**: Enhanced `VirtualizedDataTable` component with:
13
+ **Solution**: `UnifiedTableBody` component automatically handles virtualization with:
14
14
  - Synchronized column sizing between header and body tables
15
15
  - `table-fixed` layout for consistent column widths
16
16
  - Dynamic column width calculation and synchronization
17
- - Proper `useLayoutEffect` for measuring actual column widths
17
+ - Automatic virtualization when data exceeds 1000 records
18
+ - Proper virtualization handling for optimal performance
18
19
 
19
20
  ```tsx
20
21
  // ✅ Now properly aligned
@@ -819,5 +819,5 @@ When invalid organisation IDs are provided:
819
819
 
820
820
  - **[RBAC System](../rbac/README.md)** - Role-based access control
821
821
  - **[Permission Enforcement](./permission-enforcement.md)** - UI permission patterns
822
- - **[Security Best Practices](../best-practices/security.md)** - Security guidelines
823
- - **[Audit Logging](../best-practices/audit-logging.md)** - Comprehensive audit patterns
822
+ - **[Security & RBAC Standards](../standards/6-security-rbac-standards.md)** - Security guidelines
823
+ - **[Operations Standards](../standards/9-operations-standards.md)** - Error handling and monitoring
@@ -299,9 +299,9 @@ EnhancedDataTable
299
299
  │ ├── SearchIndex
300
300
  │ ├── PerformanceMonitor
301
301
  │ └── VisibilityTracker
302
- ├── VirtualizedDataTable (when enabled)
302
+ ├── UnifiedTableBody (with automatic virtualization)
303
303
  │ ├── MemoizedRow
304
- │ └── MemoizedCell
304
+ │ └── Virtualized rows (when data > 1000 records)
305
305
  └── EnhancedPaginationControls
306
306
  ├── Performance metrics display
307
307
  ├── Jump to page functionality
@@ -49,12 +49,16 @@ setupRBAC(supabase);
49
49
 
50
50
  ## Layout-Level Permission Enforcement
51
51
 
52
+ > **📋 Contract Reference**: See [RBAC Contract](../rbac/RBAC_CONTRACT.md#enforcepermissions-configuration) for when to use `enforcePermissions={true}` vs `enforcePermissions={false}`.
53
+
52
54
  ### Why Layout-Level Enforcement?
53
55
 
54
56
  Layout-level enforcement provides a safety net that prevents consuming apps from forgetting to implement permission checks. It ensures that every route is automatically validated for permissions.
55
57
 
56
58
  **Note:** Super admins automatically bypass all permission checks in PaceAppLayout. The component checks super admin status before enforcing permissions, ensuring super admins can access any route without violations.
57
59
 
60
+ **⚠️ Important**: For event-based apps, set `enforcePermissions={false}` because pages handle their own checks via `PagePermissionGuard`. For organisation-based apps, set `enforcePermissions={true}` to enable layout-level checks.
61
+
58
62
  ### Basic Implementation
59
63
 
60
64
  ```tsx
@@ -697,7 +701,7 @@ useEffect(() => {
697
701
  ```tsx
698
702
  const { selectedOrganisationId } = useUnifiedAuth();
699
703
  if (!selectedOrganisationId) {
700
- return <div>Please select an organisation first</div>;
704
+ return <p>Please select an organisation first</p>;
701
705
  }
702
706
  ```
703
707
 
@@ -60,7 +60,7 @@ function OrganisationContextGuard({ children }) {
60
60
  }, [selectedOrganisation, supabase]);
61
61
 
62
62
  if (!contextReady) {
63
- return <div>Setting up organisation context...</div>;
63
+ return <p>Setting up organisation context...</p>;
64
64
  }
65
65
 
66
66
  return <>{children}</>;
@@ -239,7 +239,7 @@ function UserActions() {
239
239
  'delete:users'
240
240
  );
241
241
 
242
- if (isLoadingEdit || isLoadingDelete) return <div>Loading permissions...</div>;
242
+ if (isLoadingEdit || isLoadingDelete) return <p>Loading permissions...</p>;
243
243
 
244
244
  return (
245
245
  <div>
@@ -375,7 +375,7 @@ const { can: canEdit, isLoading } = useCan(
375
375
  'update:users'
376
376
  );
377
377
 
378
- if (isLoading) return <div>Loading...</div>;
378
+ if (isLoading) return <p>Loading...</p>;
379
379
  return canEdit ? <EditButton /> : null;
380
380
  ```
381
381
 
@@ -406,7 +406,7 @@ const canCreate = hasPermission('create:users');
406
406
  const canUpdate = hasPermission('update:users');
407
407
  const canDelete = hasPermission('delete:users');
408
408
 
409
- if (isLoading) return <div>Loading permissions...</div>;
409
+ if (isLoading) return <p>Loading permissions...</p>;
410
410
  ```
411
411
 
412
412
  ### Pattern 3: Component Guards
@@ -504,8 +504,8 @@ function UserActions({ userId, scope }) {
504
504
  checkPermission();
505
505
  }, [hasPermission, isLoading, userId, scope]);
506
506
 
507
- if (error) return <div>Error checking permissions</div>;
508
- if (isLoading) return <div>Loading...</div>;
507
+ if (error) return <p>Error checking permissions</p>;
508
+ if (isLoading) return <p>Loading...</p>;
509
509
 
510
510
  return (
511
511
  <div>
@@ -595,7 +595,7 @@ const canEdit = await hasPermission('update:users', { userId, scope });
595
595
  ```tsx
596
596
  const { hasPermission, isLoading } = useCan();
597
597
 
598
- if (isLoading) return <div>Loading permissions...</div>;
598
+ if (isLoading) return <p>Loading permissions...</p>;
599
599
  ```
600
600
 
601
601
  ### Getting Help