@jmruthers/pace-core 0.6.6 → 0.6.8

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 (292) hide show
  1. package/{scripts/audit/audit-dependencies.cjs → audit-tool/00-dependencies.cjs} +227 -22
  2. package/audit-tool/audits/01-pace-core-compliance.cjs +556 -0
  3. package/audit-tool/audits/02-project-structure.cjs +240 -0
  4. package/audit-tool/audits/03-architecture.cjs +224 -0
  5. package/audit-tool/audits/04-code-quality.cjs +149 -0
  6. package/audit-tool/audits/05-styling.cjs +224 -0
  7. package/audit-tool/audits/06-security-rbac.cjs +554 -0
  8. package/audit-tool/audits/07-api-tech-stack.cjs +355 -0
  9. package/audit-tool/audits/08-testing-documentation.cjs +202 -0
  10. package/audit-tool/audits/09-operations.cjs +208 -0
  11. package/audit-tool/index.cjs +295 -0
  12. package/audit-tool/utils/code-utils.cjs +218 -0
  13. package/audit-tool/utils/file-utils.cjs +230 -0
  14. package/audit-tool/utils/report-utils.cjs +380 -0
  15. package/cursor-rules/00-standards-overview.mdc +156 -0
  16. package/cursor-rules/{00-pace-core-compliance.mdc → 01-pace-core-compliance.mdc} +187 -34
  17. package/cursor-rules/02-project-structure.mdc +37 -5
  18. package/cursor-rules/{03-solid-principles.mdc → 03-architecture.mdc} +125 -11
  19. package/cursor-rules/04-code-quality.mdc +419 -0
  20. package/cursor-rules/{08-markup-quality.mdc → 05-styling.mdc} +55 -10
  21. package/cursor-rules/{09-rbac-compliance.mdc → 06-security-rbac.mdc} +62 -6
  22. package/cursor-rules/07-api-tech-stack.mdc +377 -0
  23. package/cursor-rules/08-testing-documentation.mdc +324 -0
  24. package/cursor-rules/09-operations.mdc +365 -0
  25. package/dist/DataTable-6RMSCQJ6.js +15 -0
  26. package/dist/{DataTable-2N_tqbfq.d.ts → DataTable-DRUIgtUH.d.ts} +1 -1
  27. package/dist/{PublicPageProvider-BBH6Vqg7.d.ts → PublicPageProvider-CIGSujI2.d.ts} +40 -24
  28. package/dist/{UnifiedAuthProvider-ZT6TIGM7.js → UnifiedAuthProvider-7SNDOWYD.js} +2 -2
  29. package/dist/{api-Y4MQWOFW.js → api-7P7DI652.js} +1 -1
  30. package/dist/{chunk-MAGBIDNS.js → chunk-4DDCYDQ3.js} +8 -7
  31. package/dist/{chunk-BVP2BCJF.js → chunk-5W2A3DRC.js} +10 -9
  32. package/dist/{chunk-SD6WQY43.js → chunk-7ILTDCL2.js} +9 -1
  33. package/dist/{chunk-3QC3KRHK.js → chunk-A3W6LW53.js} +16 -1
  34. package/dist/{chunk-3O3WHILE.js → chunk-EF2UGZWY.js} +239 -63
  35. package/dist/{chunk-LAZMKTTF.js → chunk-EURB7QFZ.js} +341 -337
  36. package/dist/{chunk-2HGJFNAH.js → chunk-FEJLJNWA.js} +1 -15
  37. package/dist/{chunk-7TYHROIV.js → chunk-GS5672WG.js} +55 -13
  38. package/dist/{chunk-UIYSCEV7.js → chunk-IUBRCBSY.js} +1 -1
  39. package/dist/{chunk-ZFYPMX46.js → chunk-LX6U42O3.js} +1 -1
  40. package/dist/{chunk-FENMYN2U.js → chunk-MPBLMWVR.js} +3 -3
  41. package/dist/{chunk-ZS5VO5JB.js → chunk-NKHKXPI4.js} +408 -453
  42. package/dist/{chunk-A55DK444.js → chunk-OJ4SKRSV.js} +1 -7
  43. package/dist/{chunk-4T7OBVTU.js → chunk-S6ZQKDY6.js} +1 -1
  44. package/dist/{chunk-FTCRZOG2.js → chunk-T5CVK4R3.js} +5 -5
  45. package/dist/{chunk-OHIK3MIO.js → chunk-Z2FNRKF3.js} +13 -13
  46. package/dist/components.d.ts +5 -4
  47. package/dist/components.js +29 -34
  48. package/dist/eslint-rules/index.cjs +22 -9
  49. package/{src/eslint-rules/rules/compliance.cjs → dist/eslint-rules/rules/01-pace-core-compliance.cjs} +184 -23
  50. package/dist/eslint-rules/rules/04-code-quality.cjs +346 -0
  51. package/dist/eslint-rules/rules/05-styling.cjs +61 -0
  52. package/dist/eslint-rules/rules/{rbac.cjs → 06-security-rbac.cjs} +34 -13
  53. package/dist/eslint-rules/rules/07-api-tech-stack.cjs +385 -0
  54. package/dist/eslint-rules/rules/08-testing.cjs +94 -0
  55. package/dist/{functions-DHebl8-F.d.ts → functions-lBy5L2ry.d.ts} +1 -1
  56. package/dist/hooks.d.ts +5 -5
  57. package/dist/hooks.js +8 -8
  58. package/dist/index.d.ts +7 -7
  59. package/dist/index.js +21 -20
  60. package/dist/providers.js +2 -2
  61. package/dist/rbac/index.d.ts +1 -1
  62. package/dist/rbac/index.js +8 -8
  63. package/dist/theming/runtime.d.ts +61 -1
  64. package/dist/theming/runtime.js +1 -1
  65. package/dist/{types-B-K_5VnO.d.ts → types-DXstZpNI.d.ts} +0 -17
  66. package/dist/types.d.ts +2 -2
  67. package/dist/{usePublicRouteParams-COZ28Mvq.d.ts → usePublicRouteParams-MamNgwqe.d.ts} +19 -19
  68. package/dist/utils.d.ts +2 -2
  69. package/dist/utils.js +8 -8
  70. package/docs/README.md +1 -1
  71. package/docs/api/modules.md +106 -41
  72. package/docs/api-reference/components.md +18 -20
  73. package/docs/api-reference/hooks.md +80 -80
  74. package/docs/api-reference/types.md +1 -1
  75. package/docs/api-reference/utilities.md +1 -1
  76. package/docs/architecture/README.md +1 -1
  77. package/docs/core-concepts/events.md +3 -3
  78. package/docs/core-concepts/organisations.md +6 -6
  79. package/docs/core-concepts/permissions.md +6 -6
  80. package/docs/documentation-index.md +12 -18
  81. package/docs/getting-started/dependencies.md +23 -0
  82. package/docs/getting-started/documentation-index.md +1 -1
  83. package/docs/getting-started/examples/README.md +4 -4
  84. package/docs/getting-started/examples/full-featured-app.md +1 -1
  85. package/docs/getting-started/faq.md +2 -2
  86. package/docs/getting-started/quick-reference.md +4 -4
  87. package/docs/implementation-guides/app-layout.md +1 -1
  88. package/docs/implementation-guides/authentication.md +15 -15
  89. package/docs/implementation-guides/component-styling.md +1 -1
  90. package/docs/implementation-guides/data-tables.md +127 -34
  91. package/docs/implementation-guides/datatable-rbac-usage.md +1 -1
  92. package/docs/implementation-guides/dynamic-colors.md +3 -3
  93. package/docs/implementation-guides/file-upload-storage.md +2 -2
  94. package/docs/implementation-guides/hierarchical-datatable.md +40 -60
  95. package/docs/implementation-guides/inactivity-tracking.md +3 -3
  96. package/docs/implementation-guides/large-datasets.md +3 -2
  97. package/docs/implementation-guides/organisation-security.md +2 -2
  98. package/docs/implementation-guides/performance.md +2 -2
  99. package/docs/implementation-guides/permission-enforcement.md +1 -1
  100. package/docs/migration/V0.3.44_organisation-context-timing-fix.md +1 -1
  101. package/docs/migration/V0.4.0_rbac-migration.md +6 -6
  102. package/docs/rbac/README.md +5 -5
  103. package/docs/rbac/advanced-patterns.md +6 -6
  104. package/docs/rbac/api-reference.md +20 -20
  105. package/docs/rbac/event-based-apps.md +3 -3
  106. package/docs/rbac/examples.md +41 -41
  107. package/docs/rbac/getting-started.md +37 -37
  108. package/docs/rbac/performance.md +1 -1
  109. package/docs/rbac/quick-start.md +52 -52
  110. package/docs/rbac/secure-client-protection.md +1 -1
  111. package/docs/rbac/troubleshooting.md +1 -1
  112. package/docs/security/README.md +5 -5
  113. package/docs/standards/0-standards-overview.md +220 -0
  114. package/docs/standards/{00-pace-core-compliance.md → 1-pace-core-compliance-standards.md} +241 -185
  115. package/docs/standards/{02-project-structure.md → 2-project-structure-standards.md} +11 -47
  116. package/docs/standards/3-architecture-standards.md +606 -0
  117. package/docs/standards/4-code-quality-standards.md +728 -0
  118. package/docs/standards/{08-markup-quality.md → 5-styling-standards.md} +12 -9
  119. package/docs/standards/{09-rbac-compliance.md → 6-security-rbac-standards.md} +126 -18
  120. package/docs/standards/7-api-tech-stack-standards.md +662 -0
  121. package/docs/standards/8-testing-documentation-standards.md +401 -0
  122. package/docs/standards/9-operations-standards.md +1102 -0
  123. package/docs/standards/README.md +203 -104
  124. package/docs/troubleshooting/README.md +4 -4
  125. package/docs/troubleshooting/common-issues.md +2 -2
  126. package/docs/troubleshooting/debugging.md +9 -9
  127. package/docs/troubleshooting/migration.md +4 -4
  128. package/eslint-config-pace-core.cjs +50 -20
  129. package/package.json +50 -19
  130. package/scripts/eslint-audit.cjs +123 -0
  131. package/scripts/install-cursor-rules.cjs +11 -243
  132. package/scripts/install-eslint-config.cjs +349 -0
  133. package/scripts/validate-dependencies.cjs +248 -0
  134. package/src/__tests__/helpers/__tests__/component-test-utils.test.tsx +2 -2
  135. package/src/__tests__/helpers/__tests__/test-providers.test.tsx +2 -2
  136. package/src/__tests__/helpers/__tests__/test-utils.test.tsx +30 -18
  137. package/src/__tests__/integration/UserProfile.test.tsx +14 -14
  138. package/src/__tests__/rbac/PagePermissionGuard.test.tsx +6 -6
  139. package/src/__tests__/templates/accessibility.test.template.tsx +10 -9
  140. package/src/__tests__/templates/component.test.template.tsx +18 -15
  141. package/src/components/AddressField/AddressField.tsx +26 -1
  142. package/src/components/Alert/Alert.test.tsx +86 -22
  143. package/src/components/Alert/Alert.tsx +19 -11
  144. package/src/components/Badge/Badge.tsx +1 -1
  145. package/src/components/Calendar/Calendar.tsx +201 -47
  146. package/src/components/Checkbox/Checkbox.test.tsx +2 -1
  147. package/src/components/ContextSelector/ContextSelector.tsx +108 -126
  148. package/src/components/DataTable/AUDIT_REPORT.md +293 -0
  149. package/src/components/DataTable/DataTable.tsx +1 -19
  150. package/src/components/DataTable/__tests__/DataTableCore.test.tsx +6 -2
  151. package/src/components/DataTable/__tests__/a11y.basic.test.tsx +21 -6
  152. package/src/components/DataTable/__tests__/pagination.modes.test.tsx +3 -2
  153. package/src/components/DataTable/__tests__/test-utils/sharedTestUtils.tsx +9 -9
  154. package/src/components/DataTable/components/ColumnFilter.tsx +63 -74
  155. package/src/components/DataTable/components/ColumnVisibilityDropdown.tsx +43 -41
  156. package/src/components/DataTable/components/DataTableErrorBoundary.tsx +9 -11
  157. package/src/components/DataTable/components/DataTableLayout.tsx +5 -16
  158. package/src/components/DataTable/components/EditableRow.tsx +5 -7
  159. package/src/components/DataTable/components/EmptyState.tsx +11 -10
  160. package/src/components/DataTable/components/FilterRow.tsx +2 -4
  161. package/src/components/DataTable/components/ImportModal.tsx +124 -126
  162. package/src/components/DataTable/components/LoadingState.tsx +5 -6
  163. package/src/components/DataTable/components/SortIndicator.tsx +50 -0
  164. package/src/components/DataTable/components/__tests__/COVERAGE_NOTE.md +4 -4
  165. package/src/components/DataTable/components/__tests__/ColumnFilter.test.tsx +23 -82
  166. package/src/components/DataTable/components/__tests__/DataTableErrorBoundary.test.tsx +37 -9
  167. package/src/components/DataTable/components/__tests__/EmptyState.test.tsx +7 -4
  168. package/src/components/DataTable/components/__tests__/FilterRow.test.tsx +12 -4
  169. package/src/components/DataTable/components/__tests__/LoadingState.test.tsx +45 -27
  170. package/src/components/DataTable/components/index.ts +2 -1
  171. package/src/components/DataTable/types.ts +0 -18
  172. package/src/components/DataTable/utils/a11yUtils.ts +17 -0
  173. package/src/components/DatePickerWithTimezone/DatePickerWithTimezone.test.tsx +1 -1
  174. package/src/components/DatePickerWithTimezone/DatePickerWithTimezone.tsx +11 -15
  175. package/src/components/DateTimeField/DateTimeField.tsx +7 -8
  176. package/src/components/Dialog/Dialog.test.tsx +1 -0
  177. package/src/components/Dialog/Dialog.tsx +25 -8
  178. package/src/components/ErrorBoundary/ErrorBoundary.tsx +77 -79
  179. package/src/components/FileUpload/FileUpload.test.tsx +45 -16
  180. package/src/components/FileUpload/FileUpload.tsx +141 -130
  181. package/src/components/NavigationMenu/NavigationMenu.test.tsx +48 -12
  182. package/src/components/PaceAppLayout/PaceAppLayout.performance.test.tsx +9 -9
  183. package/src/components/PaceAppLayout/PaceAppLayout.security.test.tsx +30 -30
  184. package/src/components/PaceAppLayout/PaceAppLayout.test.tsx +4 -4
  185. package/src/components/PaceLoginPage/PaceLoginPage.test.tsx +7 -1
  186. package/src/components/Progress/Progress.tsx +2 -4
  187. package/src/components/ProtectedRoute/ProtectedRoute.tsx +8 -8
  188. package/src/components/Select/Select.tsx +86 -77
  189. package/src/components/Select/types.ts +3 -0
  190. package/src/hooks/__tests__/ServiceHooks.test.tsx +16 -16
  191. package/src/hooks/__tests__/hooks.integration.test.tsx +49 -49
  192. package/src/hooks/__tests__/useDataTablePerformance.unit.test.ts +8 -5
  193. package/src/hooks/__tests__/useFileUrl.unit.test.ts +4 -0
  194. package/src/hooks/__tests__/useFocusTrap.unit.test.tsx +99 -99
  195. package/src/hooks/__tests__/useInactivityTracker.unit.test.ts +45 -8
  196. package/src/hooks/__tests__/usePerformanceMonitor.unit.test.ts +22 -2
  197. package/src/hooks/public/usePublicEvent.ts +5 -5
  198. package/src/hooks/public/usePublicEventLogo.ts +5 -5
  199. package/src/hooks/public/usePublicFileDisplay.ts +2 -2
  200. package/src/hooks/public/usePublicRouteParams.ts +13 -9
  201. package/src/hooks/useAddressAutocomplete.test.ts +18 -18
  202. package/src/hooks/useAppConfig.ts +2 -2
  203. package/src/hooks/useEventTheme.test.ts +7 -7
  204. package/src/hooks/useEventTheme.ts +2 -1
  205. package/src/hooks/useFileDisplay.ts +2 -2
  206. package/src/hooks/useFileUrl.ts +52 -8
  207. package/src/hooks/useOrganisationSecurity.test.ts +2 -1
  208. package/src/providers/UnifiedAuthProvider.smoke.test.tsx +21 -21
  209. package/src/providers/__tests__/AuthProvider.test.tsx +21 -21
  210. package/src/providers/__tests__/EventProvider.test.tsx +61 -61
  211. package/src/providers/__tests__/InactivityProvider.test.tsx +56 -56
  212. package/src/providers/__tests__/OrganisationProvider.test.tsx +75 -75
  213. package/src/providers/__tests__/ProviderLifecycle.test.tsx +38 -38
  214. package/src/providers/__tests__/UnifiedAuthProvider.test.tsx +103 -103
  215. package/src/providers/services/__tests__/AuthServiceProvider.integration.test.tsx +7 -7
  216. package/src/providers/services/__tests__/UnifiedAuthProvider.integration.test.tsx +10 -10
  217. package/src/rbac/__tests__/auth-rbac.e2e.test.tsx +15 -6
  218. package/src/rbac/__tests__/rbac-functions.test.ts +3 -3
  219. package/src/rbac/api.test.ts +104 -0
  220. package/src/rbac/engine.ts +1 -1
  221. package/src/rbac/hooks/useCan.test.ts +2 -2
  222. package/src/rbac/secureClient.ts +1 -1
  223. package/src/rbac/types/functions.ts +1 -1
  224. package/src/styles/core.css +7 -0
  225. package/src/theming/__tests__/parseEventColours.test.ts +118 -3
  226. package/src/theming/parseEventColours.ts +77 -11
  227. package/src/types/supabase.ts +2 -3
  228. package/src/utils/__tests__/bundleAnalysis.unit.test.ts +9 -9
  229. package/src/utils/__tests__/lazyLoad.unit.test.tsx +42 -39
  230. package/src/utils/file-reference/__tests__/file-reference.test.ts +4 -0
  231. package/src/utils/formatting/formatDate.test.ts +3 -2
  232. package/src/utils/formatting/formatDateTime.test.ts +2 -2
  233. package/src/utils/google-places/googlePlacesUtils.test.ts +36 -24
  234. package/src/utils/storage/README.md +1 -1
  235. package/src/utils/storage/__tests__/helpers.unit.test.ts +19 -12
  236. package/src/utils/storage/helpers.test.ts +69 -3
  237. package/cursor-rules/01-standards-compliance.mdc +0 -285
  238. package/cursor-rules/04-testing-standards.mdc +0 -270
  239. package/cursor-rules/05-bug-reports-and-features.mdc +0 -248
  240. package/cursor-rules/06-code-quality.mdc +0 -311
  241. package/cursor-rules/07-tech-stack-compliance.mdc +0 -216
  242. package/cursor-rules/10-error-handling-patterns.mdc +0 -179
  243. package/cursor-rules/11-performance-optimization.mdc +0 -169
  244. package/cursor-rules/12-ci-cd-integration.mdc +0 -150
  245. package/dist/DataTable-LRJL4IRV.js +0 -15
  246. package/dist/eslint-rules/rules/compliance.cjs +0 -348
  247. package/dist/eslint-rules/rules/components.cjs +0 -113
  248. package/dist/eslint-rules/rules/imports.cjs +0 -102
  249. package/docs/best-practices/README.md +0 -472
  250. package/docs/best-practices/accessibility.md +0 -604
  251. package/docs/best-practices/common-patterns.md +0 -516
  252. package/docs/best-practices/deployment.md +0 -1103
  253. package/docs/best-practices/performance.md +0 -1328
  254. package/docs/best-practices/security.md +0 -940
  255. package/docs/best-practices/testing.md +0 -1034
  256. package/docs/rbac/compliance/compliance-guide.md +0 -544
  257. package/docs/standards/01-standards-compliance.md +0 -188
  258. package/docs/standards/03-solid-principles.md +0 -39
  259. package/docs/standards/04-testing-standards.md +0 -36
  260. package/docs/standards/05-bug-reports-and-features.md +0 -27
  261. package/docs/standards/06-code-quality.md +0 -34
  262. package/docs/standards/07-tech-stack-compliance.md +0 -30
  263. package/docs/standards/10-error-handling-patterns.md +0 -401
  264. package/docs/standards/11-performance-optimization.md +0 -348
  265. package/docs/standards/12-ci-cd-integration.md +0 -370
  266. package/docs/standards/ALIGNMENT_REVIEW_SUMMARY.md +0 -192
  267. package/scripts/audit/audit-compliance.cjs +0 -1295
  268. package/scripts/audit/audit-components.cjs +0 -260
  269. package/scripts/audit/audit-rbac.cjs +0 -954
  270. package/scripts/audit/audit-standards.cjs +0 -1268
  271. package/scripts/audit/index.cjs +0 -1927
  272. package/src/components/DataTable/components/DataTableBody.tsx +0 -478
  273. package/src/components/DataTable/components/DraggableColumnHeader.tsx +0 -156
  274. package/src/components/DataTable/components/ExpandButton.tsx +0 -113
  275. package/src/components/DataTable/components/GroupHeader.tsx +0 -54
  276. package/src/components/DataTable/components/ViewRowModal.tsx +0 -68
  277. package/src/components/DataTable/components/VirtualizedDataTable.tsx +0 -525
  278. package/src/components/DataTable/components/__tests__/ExpandButton.test.tsx +0 -462
  279. package/src/components/DataTable/components/__tests__/GroupHeader.test.tsx +0 -393
  280. package/src/components/DataTable/components/__tests__/ViewRowModal.test.tsx +0 -476
  281. package/src/components/DataTable/components/__tests__/VirtualizedDataTable.test.tsx +0 -128
  282. package/src/components/DataTable/core/DataTableContext.tsx +0 -216
  283. package/src/components/DataTable/core/__tests__/DataTableContext.test.tsx +0 -136
  284. package/src/components/DataTable/hooks/__tests__/useColumnReordering.test.ts +0 -570
  285. package/src/components/DataTable/hooks/useColumnReordering.ts +0 -123
  286. package/src/components/DataTable/utils/debugTools.ts +0 -514
  287. package/src/eslint-rules/index.cjs +0 -22
  288. package/src/eslint-rules/rules/components.cjs +0 -113
  289. package/src/eslint-rules/rules/imports.cjs +0 -102
  290. package/src/eslint-rules/rules/rbac.cjs +0 -790
  291. package/src/eslint-rules/utils/helpers.cjs +0 -42
  292. package/src/eslint-rules/utils/manifest-loader.cjs +0 -75
@@ -17,7 +17,7 @@ import { PagePermissionGuard } from '@jmruthers/pace-core/rbac';
17
17
 
18
18
  function UserProfile() {
19
19
  return (
20
- <div>
20
+ <section>
21
21
  <h1>User Profile</h1>
22
22
  <PagePermissionGuard
23
23
  pageName="profile"
@@ -26,7 +26,7 @@ function UserProfile() {
26
26
  >
27
27
  <EditButton />
28
28
  </PagePermissionGuard>
29
- </div>
29
+ </section>
30
30
  );
31
31
  }
32
32
  ```
@@ -86,7 +86,7 @@ import { PagePermissionGuard } from '@jmruthers/pace-core/rbac';
86
86
 
87
87
  function AdminPanel() {
88
88
  return (
89
- <div>
89
+ <section>
90
90
  <h1>Admin Panel</h1>
91
91
 
92
92
  <PagePermissionGuard
@@ -100,11 +100,11 @@ function AdminPanel() {
100
100
  <PagePermissionGuard
101
101
  pageName="system"
102
102
  operation="manage"
103
- fallback={<div>System management access required</div>}
103
+ fallback={<p>System management access required</p>}
104
104
  >
105
105
  <SystemSettings />
106
106
  </PagePermissionGuard>
107
- </div>
107
+ </section>
108
108
  );
109
109
  }
110
110
  ```
@@ -116,14 +116,14 @@ import { AccessLevelGuard } from '@jmruthers/pace-core/rbac';
116
116
 
117
117
  function EventManagement({ userId, scope }) {
118
118
  return (
119
- <div>
119
+ <section>
120
120
  <h1>Event Management</h1>
121
121
 
122
122
  <AccessLevelGuard
123
123
  userId={userId}
124
124
  scope={scope}
125
125
  requiredLevel="planner"
126
- fallback={<div>Planner access required</div>}
126
+ fallback={<p>Planner access required</p>}
127
127
  >
128
128
  <EventPlanning />
129
129
  </AccessLevelGuard>
@@ -132,11 +132,11 @@ function EventManagement({ userId, scope }) {
132
132
  userId={userId}
133
133
  scope={scope}
134
134
  requiredLevel="admin"
135
- fallback={<div>Admin access required</div>}
135
+ fallback={<p>Admin access required</p>}
136
136
  >
137
137
  <EventAdminPanel />
138
138
  </AccessLevelGuard>
139
- </div>
139
+ </section>
140
140
  );
141
141
  }
142
142
  ```
@@ -185,7 +185,7 @@ function UsersTable({ users, userId, scope }) {
185
185
  id: 'actions',
186
186
  header: 'Actions',
187
187
  cell: ({ row }) => (
188
- <div className="flex space-x-2">
188
+ <section className="flex space-x-2">
189
189
  {permissions.canEdit && (
190
190
  <button onClick={() => editUser(row.original.id)}>
191
191
  Edit
@@ -196,7 +196,7 @@ function UsersTable({ users, userId, scope }) {
196
196
  Delete
197
197
  </button>
198
198
  )}
199
- </div>
199
+ </section>
200
200
  ),
201
201
  },
202
202
  ];
@@ -246,31 +246,31 @@ function UserForm({ userId, scope, userData }) {
246
246
 
247
247
  return (
248
248
  <form>
249
- <div>
249
+ <section>
250
250
  <label>Name</label>
251
251
  <input defaultValue={userData.name} />
252
- </div>
252
+ </section>
253
253
 
254
- <div>
254
+ <section>
255
255
  <label>Email</label>
256
256
  <input defaultValue={userData.email} />
257
- </div>
257
+ </section>
258
258
 
259
259
  {permissions.canEditRole && (
260
- <div>
260
+ <section>
261
261
  <label>Role</label>
262
262
  <select defaultValue={userData.role}>
263
263
  <option value="user">User</option>
264
264
  <option value="admin">Admin</option>
265
265
  </select>
266
- </div>
266
+ </section>
267
267
  )}
268
268
 
269
269
  {permissions.canEditPermissions && (
270
- <div>
270
+ <section>
271
271
  <label>Permissions</label>
272
272
  <PermissionSelector defaultValue={userData.permissions} />
273
- </div>
273
+ </section>
274
274
  )}
275
275
 
276
276
  <button type="submit">Save</button>
@@ -318,7 +318,7 @@ function Navigation({ userId, scope }) {
318
318
  checkNavigationPermissions();
319
319
  }, [hasPermission, isLoading, userId, scope]);
320
320
 
321
- if (isLoading) return <div>Loading navigation...</div>;
321
+ if (isLoading) return <p>Loading navigation...</p>;
322
322
 
323
323
  return (
324
324
  <nav>
@@ -449,12 +449,12 @@ function OptimizedUserList({ userId, scope }) {
449
449
  }, [hasPermission, isLoading, userId, scope]);
450
450
 
451
451
  return (
452
- <div>
452
+ <section>
453
453
  {permissions.canRead && <UserList />}
454
454
  {permissions.canCreate && <CreateUserButton />}
455
455
  {permissions.canUpdate && <EditUserButton />}
456
456
  {permissions.canDelete && <DeleteUserButton />}
457
- </div>
457
+ </section>
458
458
  );
459
459
  }
460
460
  ```
@@ -477,11 +477,11 @@ function UserActions({ userId, scope }) {
477
477
  };
478
478
 
479
479
  return (
480
- <div>
480
+ <section>
481
481
  <button onClick={() => handleUserUpdate(userData)}>
482
482
  Update User
483
483
  </button>
484
- </div>
484
+ </section>
485
485
  );
486
486
  }
487
487
  ```
@@ -525,18 +525,18 @@ function UserManagement({ userId, scope }) {
525
525
  }, [hasPermission, isLoading, userId, scope]);
526
526
 
527
527
  if (error) {
528
- return <div>Error: {error.message}</div>;
528
+ return <p>Error: {error.message}</p>;
529
529
  }
530
530
 
531
531
  if (isLoading) {
532
- return <div>Checking permissions...</div>;
532
+ return <p>Checking permissions...</p>;
533
533
  }
534
534
 
535
535
  return (
536
- <div>
537
- {errorMessage && <div className="error">{errorMessage}</div>}
536
+ <section>
537
+ {errorMessage && <p className="error">{errorMessage}</p>}
538
538
  {canEdit && <EditUserButton />}
539
- </div>
539
+ </section>
540
540
  );
541
541
  }
542
542
  ```
@@ -571,9 +571,9 @@ function CustomUserActions({ userId, scope, user }) {
571
571
  }, [hasPermission, userId, scope, user]);
572
572
 
573
573
  return (
574
- <div>
574
+ <section>
575
575
  {canEdit && <EditUserButton userId={user.id} />}
576
- </div>
576
+ </section>
577
577
  );
578
578
  }
579
579
  ```
@@ -610,11 +610,11 @@ function ProtectedRoute({ children, requiredPermission, userId, scope }) {
610
610
  }, [hasPermission, isLoading, requiredPermission, userId, scope, navigate]);
611
611
 
612
612
  if (isLoading) {
613
- return <div>Checking access...</div>;
613
+ return <p>Checking access...</p>;
614
614
  }
615
615
 
616
616
  if (!hasAccess) {
617
- return <div>Access denied</div>;
617
+ return <p>Access denied</p>;
618
618
  }
619
619
 
620
620
  return children;
@@ -679,9 +679,9 @@ test('renders fallback when user lacks permission', () => {
679
679
  userId="user-123"
680
680
  scope={{ organisationId: "org-456" }}
681
681
  permission="read:users"
682
- fallback={<div>Access Denied</div>}
682
+ fallback={<p>Access Denied</p>}
683
683
  >
684
- <div>User List</div>
684
+ <section>User List</section>
685
685
  </PermissionGuard>
686
686
  );
687
687
 
@@ -739,7 +739,7 @@ function UserManagement() {
739
739
  >
740
740
  <CreateUserButton />
741
741
  </PermissionEnforcer>
742
- </div>
742
+ </section>
743
743
  );
744
744
  }
745
745
  ```
@@ -771,7 +771,7 @@ function EventDashboard() {
771
771
  >
772
772
  <ParticipantManagement />
773
773
  </PermissionEnforcer>
774
- </div>
774
+ </section>
775
775
  );
776
776
  }
777
777
  ```
@@ -795,7 +795,7 @@ function AdaptiveComponent({ appId }) {
795
795
  loadAppConfig();
796
796
  }, [appId]);
797
797
 
798
- if (!appConfig) return <div>Loading app configuration...</div>;
798
+ if (!appConfig) return <p>Loading app configuration...</p>;
799
799
 
800
800
  // Determine required context based on app type
801
801
  const scope = appConfig.requires_event
@@ -858,15 +858,15 @@ function ContextAwareComponent({ appId }) {
858
858
  getAppConfig(appId).then(setAppConfig);
859
859
  }, [appId]);
860
860
 
861
- if (!appConfig) return <div>Loading...</div>;
861
+ if (!appConfig) return <p>Loading...</p>;
862
862
 
863
863
  const getContextError = () => {
864
864
  if (appConfig.requires_event) {
865
865
  return (
866
- <div>
866
+ <section>
867
867
  <p>Access denied</p>
868
868
  <p>This app requires event context</p>
869
- </div>
869
+ </section>
870
870
  );
871
871
  } else {
872
872
  return (
@@ -158,12 +158,12 @@ function Dashboard() {
158
158
  <PagePermissionGuard
159
159
  pageName="dashboard"
160
160
  operation="read"
161
- fallback={<div>Access Denied</div>}
161
+ fallback={<p>Access Denied</p>}
162
162
  >
163
- <div>
163
+ <section>
164
164
  <h1>Dashboard</h1>
165
165
  <EventContent />
166
- </div>
166
+ </section>
167
167
  </PagePermissionGuard>
168
168
  );
169
169
  }
@@ -193,14 +193,14 @@ function UserActions() {
193
193
  }
194
194
  );
195
195
 
196
- if (isLoading) return <div>Loading permissions...</div>;
197
- if (error) return <div>Error: {error.message}</div>;
196
+ if (isLoading) return <p>Loading permissions...</p>;
197
+ if (error) return <p>Error: {error.message}</p>;
198
198
 
199
199
  return (
200
- <div>
200
+ <section>
201
201
  {permissions['page-1']?.includes('read') && <ReadButton />}
202
202
  {permissions['page-1']?.includes('manage') && <ManageButton />}
203
- </div>
203
+ </section>
204
204
  );
205
205
  }
206
206
  ```
@@ -229,13 +229,13 @@ function UserActions() {
229
229
  'page-123' // optional pageId
230
230
  );
231
231
 
232
- if (isLoading) return <div>Checking permission...</div>;
233
- if (error) return <div>Error: {error.message}</div>;
232
+ if (isLoading) return <p>Checking permission...</p>;
233
+ if (error) return <p>Error: {error.message}</p>;
234
234
 
235
235
  return (
236
- <div>
236
+ <section>
237
237
  {can ? <AdminPanel /> : <AccessDenied />}
238
- </div>
238
+ </section>
239
239
  );
240
240
  }
241
241
  ```
@@ -298,17 +298,17 @@ function Dashboard() {
298
298
 
299
299
  // Pattern 1: PermissionEnforcer (automatic scope resolution)
300
300
  return (
301
- <div>
301
+ <main>
302
302
  <h1>Dashboard</h1>
303
303
 
304
304
  {/* Always visible */}
305
- <div>Welcome to the dashboard!</div>
305
+ <p>Welcome to the dashboard!</p>
306
306
 
307
307
  {/* Pattern 1: PermissionEnforcer - automatic scope resolution */}
308
308
  <PermissionEnforcer
309
309
  permissions={['read:admin']}
310
310
  operation="admin-panel"
311
- fallback={<div>Admin access required</div>}
311
+ fallback={<p>Admin access required</p>}
312
312
  >
313
313
  <AdminPanel />
314
314
  </PermissionEnforcer>
@@ -318,7 +318,7 @@ function Dashboard() {
318
318
 
319
319
  {/* Pattern 3: usePermissions - for custom logic */}
320
320
  <CustomPermissionLogic userId={user?.id} organisationId={selectedOrganisationId} />
321
- </div>
321
+ </main>
322
322
  );
323
323
  }
324
324
 
@@ -330,20 +330,20 @@ function UserManagement({ userId, organisationId }) {
330
330
  'update:users'
331
331
  );
332
332
 
333
- if (isLoading) return <div>Checking permissions...</div>;
334
- if (error) return <div>Error: {error.message}</div>;
333
+ if (isLoading) return <p>Checking permissions...</p>;
334
+ if (error) return <p>Error: {error.message}</p>;
335
335
 
336
336
  return (
337
- <div>
337
+ <section>
338
338
  {can ? (
339
- <div>
339
+ <section>
340
340
  <h2>User Management</h2>
341
341
  <UserList />
342
- </div>
342
+ </section>
343
343
  ) : (
344
- <div>You need user management permissions</div>
344
+ <p>You need user management permissions</p>
345
345
  )}
346
- </div>
346
+ </section>
347
347
  );
348
348
  }
349
349
 
@@ -354,27 +354,27 @@ function CustomPermissionLogic({ userId, organisationId }) {
354
354
  { organisationId: organisationId || '' }
355
355
  );
356
356
 
357
- if (isLoading) return <div>Loading permissions...</div>;
358
- if (error) return <div>Error: {error.message}</div>;
357
+ if (isLoading) return <p>Loading permissions...</p>;
358
+ if (error) return <p>Error: {error.message}</p>;
359
359
 
360
360
  return (
361
- <div>
361
+ <section>
362
362
  <h2>Your Permissions</h2>
363
363
  {Object.entries(permissions).map(([pageId, operations]) => (
364
- <div key={pageId}>
364
+ <p key={pageId}>
365
365
  <strong>{pageId}:</strong> {operations.join(', ')}
366
- </div>
366
+ </p>
367
367
  ))}
368
- </div>
368
+ </section>
369
369
  );
370
370
  }
371
371
 
372
372
  function AdminPanel() {
373
- return <div>Admin Panel Content</div>;
373
+ return <section>Admin Panel Content</section>;
374
374
  }
375
375
 
376
376
  function UserList() {
377
- return <div>User List</div>;
377
+ return <section>User List</section>;
378
378
  }
379
379
  ```
380
380
 
@@ -391,7 +391,7 @@ export default function AdminPage() {
391
391
  <PermissionGuard
392
392
  permission="admin:read"
393
393
  scope={{ organisationId: 'org-123' }}
394
- fallback={<div>Access Denied</div>}
394
+ fallback={<p>Access Denied</p>}
395
395
  >
396
396
  <AdminPageContent />
397
397
  </PermissionGuard>
@@ -407,7 +407,7 @@ import { PermissionGuard } from '@jmruthers/pace-core/rbac';
407
407
 
408
408
  function UserCard({ user, organisationId }) {
409
409
  return (
410
- <div className="user-card">
410
+ <section className="user-card">
411
411
  <h3>{user.name}</h3>
412
412
 
413
413
  <PermissionGuard
@@ -538,7 +538,7 @@ function Navigation({ userId, organisationId }) {
538
538
  ```tsx
539
539
  const { selectedOrganisationId } = useUnifiedAuth();
540
540
  if (!selectedOrganisationId) {
541
- return <div>Please select an organisation first</div>;
541
+ return <p>Please select an organisation first</p>;
542
542
  }
543
543
  ```
544
544
 
@@ -622,9 +622,9 @@ function MyComponent() {
622
622
  'update:users'
623
623
  );
624
624
 
625
- if (isLoading) return <div>Checking permissions...</div>;
626
- if (error) return <div>Error: {error.message}</div>;
627
- if (!can) return <div>Access denied</div>;
625
+ if (isLoading) return <p>Checking permissions...</p>;
626
+ if (error) return <p>Error: {error.message}</p>;
627
+ if (!can) return <p>Access denied</p>;
628
628
 
629
629
  return <AdminContent />;
630
630
  }
@@ -818,7 +818,7 @@ function AdaptiveComponent({ appId }) {
818
818
  loadAppConfig();
819
819
  }, [appId]);
820
820
 
821
- if (!appConfig) return <div>Loading app configuration...</div>;
821
+ if (!appConfig) return <p>Loading app configuration...</p>;
822
822
 
823
823
  // Determine required context based on app type
824
824
  const scope = appConfig.requires_event
@@ -315,6 +315,6 @@ If performance monitoring isn't showing data:
315
315
 
316
316
  - [PagePermissionGuard API Reference](./api-reference.md#pagepermissionguard) - Component API
317
317
  - [RBAC Configuration](./api-reference.md#configuration) - Configuration options
318
- - [Performance Best Practices](../best-practices/performance.md) - General performance guide
318
+ - [Performance Optimization](../standards/9-operations-standards.md#performance-optimization) - General performance guide
319
319
  - [RBAC Getting Started](./getting-started.md) - Getting started guide
320
320