@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
@@ -357,15 +357,15 @@ export function Login() {
357
357
  }
358
358
 
359
359
  return (
360
- <div className="min-h-screen flex items-center justify-center bg-sec-50">
361
- <div className="max-w-md w-full space-y-8">
362
- <div>
360
+ <main className="min-h-screen flex items-center justify-center bg-sec-50">
361
+ <section className="max-w-md w-full space-y-8">
362
+ <section>
363
363
  <h2 className="mt-6 text-center text-3xl font-extrabold text-sec-900">
364
364
  Sign in to your account
365
365
  </h2>
366
- </div>
366
+ </section>
367
367
  <form className="mt-8 space-y-6" onSubmit={handleLogin}>
368
- <div>
368
+ <section>
369
369
  <label htmlFor="email" className="sr-only">
370
370
  Email address
371
371
  </label>
@@ -379,8 +379,8 @@ export function Login() {
379
379
  value={email}
380
380
  onChange={(e) => setEmail(e.target.value)}
381
381
  />
382
- </div>
383
- <div>
382
+ </section>
383
+ <section>
384
384
  <label htmlFor="password" className="sr-only">
385
385
  Password
386
386
  </label>
@@ -394,8 +394,8 @@ export function Login() {
394
394
  value={password}
395
395
  onChange={(e) => setPassword(e.target.value)}
396
396
  />
397
- </div>
398
- <div>
397
+ </section>
398
+ <section>
399
399
  <button
400
400
  type="submit"
401
401
  disabled={loading}
@@ -403,10 +403,10 @@ export function Login() {
403
403
  >
404
404
  {loading ? 'Signing in...' : 'Sign in'}
405
405
  </button>
406
- </div>
406
+ </section>
407
407
  </form>
408
- </div>
409
- </div>
408
+ </section>
409
+ </main>
410
410
  )
411
411
  }
412
412
  ```
@@ -427,18 +427,18 @@ export function Dashboard() {
427
427
  const { user, selectedOrganisationId } = useUnifiedAuth()
428
428
 
429
429
  if (!user) {
430
- return <div>Please log in</div>
430
+ return <p>Please log in</p>
431
431
  }
432
432
 
433
433
  return (
434
- <div className="min-h-screen bg-sec-50">
434
+ <main className="min-h-screen bg-sec-50">
435
435
  <nav className="bg-background shadow">
436
- <div className="max-w-7xl mx-auto px-4 sm:px-6 lg:px-8">
437
- <div className="flex justify-between h-16">
438
- <div className="flex items-center">
436
+ <section className="max-w-7xl mx-auto px-4 sm:px-6 lg:px-8">
437
+ <section className="flex justify-between h-16">
438
+ <section className="flex items-center">
439
439
  <h1 className="text-xl font-semibold">Dashboard</h1>
440
- </div>
441
- <div className="flex items-center space-x-4">
440
+ </section>
441
+ <section className="flex items-center space-x-4">
442
442
  <span className="text-sm text-sec-700">
443
443
  {user.email} | Org: {selectedOrganisationId}
444
444
  </span>
@@ -448,39 +448,39 @@ export function Dashboard() {
448
448
  >
449
449
  Sign out
450
450
  </button>
451
- </div>
452
- </div>
453
- </div>
451
+ </section>
452
+ </section>
453
+ </section>
454
454
  </nav>
455
455
 
456
456
  <main className="max-w-7xl mx-auto py-6 sm:px-6 lg:px-8">
457
- <div className="px-4 py-6 sm:px-0">
458
- <div className="border-4 border-dashed border-sec-200 rounded-lg h-96 p-8">
457
+ <section className="px-4 py-6 sm:px-0">
458
+ <section className="border-4 border-dashed border-sec-200 rounded-lg h-96 p-8">
459
459
  <h2 className="text-2xl font-bold mb-4">Welcome to your Dashboard</h2>
460
460
 
461
461
  {/* CRITICAL: Use PagePermissionGuard for page-level permissions */}
462
462
  <PagePermissionGuard
463
463
  pageName="dashboard"
464
464
  operation="read"
465
- fallback={<div>You don't have permission to view the dashboard</div>}
465
+ fallback={<p>You don't have permission to view the dashboard</p>}
466
466
  >
467
- <div className="space-y-4">
467
+ <section className="space-y-4">
468
468
  <p>You have access to the dashboard!</p>
469
469
 
470
- <div className="space-x-4">
470
+ <section className="space-x-4">
471
471
  <Link
472
472
  to="/users"
473
473
  className="bg-main-500 text-main-50 px-4 py-2 rounded hover:bg-main-600"
474
474
  >
475
475
  View Users
476
476
  </Link>
477
- </div>
478
- </div>
477
+ </section>
478
+ </section>
479
479
  </PagePermissionGuard>
480
- </div>
481
- </div>
480
+ </section>
481
+ </section>
482
482
  </main>
483
- </div>
483
+ </main>
484
484
  )
485
485
  }
486
486
  ```
@@ -501,21 +501,21 @@ export function Users() {
501
501
  const { user, selectedOrganisationId } = useUnifiedAuth()
502
502
 
503
503
  if (!user) {
504
- return <div>Please log in</div>
504
+ return <p>Please log in</p>
505
505
  }
506
506
 
507
507
  return (
508
- <div className="min-h-screen bg-sec-50">
508
+ <main className="min-h-screen bg-sec-50">
509
509
  <nav className="bg-background shadow">
510
- <div className="max-w-7xl mx-auto px-4 sm:px-6 lg:px-8">
511
- <div className="flex justify-between h-16">
512
- <div className="flex items-center">
510
+ <section className="max-w-7xl mx-auto px-4 sm:px-6 lg:px-8">
511
+ <section className="flex justify-between h-16">
512
+ <section className="flex items-center">
513
513
  <Link to="/" className="text-main-600 hover:text-main-800 mr-4">
514
514
  ← Back to Dashboard
515
515
  </Link>
516
516
  <h1 className="text-xl font-semibold">Users</h1>
517
- </div>
518
- <div className="flex items-center space-x-4">
517
+ </section>
518
+ <section className="flex items-center space-x-4">
519
519
  <span className="text-sm text-sec-700">
520
520
  {user.email} | Org: {selectedOrganisationId}
521
521
  </span>
@@ -525,35 +525,35 @@ export function Users() {
525
525
  >
526
526
  Sign out
527
527
  </button>
528
- </div>
529
- </div>
530
- </div>
528
+ </section>
529
+ </section>
530
+ </section>
531
531
  </nav>
532
532
 
533
533
  <main className="max-w-7xl mx-auto py-6 sm:px-6 lg:px-8">
534
- <div className="px-4 py-6 sm:px-0">
535
- <div className="border-4 border-dashed border-sec-200 rounded-lg h-96 p-8">
534
+ <section className="px-4 py-6 sm:px-0">
535
+ <section className="border-4 border-dashed border-sec-200 rounded-lg h-96 p-8">
536
536
  <h2 className="text-2xl font-bold mb-4">User Management</h2>
537
537
 
538
538
  {/* CRITICAL: Use PagePermissionGuard for page-level permissions */}
539
539
  <PagePermissionGuard
540
540
  pageName="users"
541
541
  operation="read"
542
- fallback={<div>You don't have permission to view users</div>}
542
+ fallback={<p>You don't have permission to view users</p>}
543
543
  >
544
- <div className="space-y-4">
544
+ <section className="space-y-4">
545
545
  <p>You have access to the users page!</p>
546
546
  <p>This means your RBAC system is working correctly.</p>
547
547
 
548
- <div className="bg-main-100 border border-main-400 text-main-700 px-4 py-3 rounded">
548
+ <section className="bg-main-100 border border-main-400 text-main-700 px-4 py-3 rounded">
549
549
  <strong>Success!</strong> Your RBAC setup is working correctly.
550
- </div>
551
- </div>
550
+ </section>
551
+ </section>
552
552
  </PagePermissionGuard>
553
- </div>
554
- </div>
553
+ </section>
554
+ </section>
555
555
  </main>
556
- </div>
556
+ </main>
557
557
  )
558
558
  }
559
559
  ```
@@ -134,7 +134,7 @@ function MyComponent() {
134
134
  const supabase = useSecureSupabase();
135
135
 
136
136
  if (!supabase) {
137
- return <div>Loading...</div>;
137
+ return <p>Loading...</p>;
138
138
  }
139
139
 
140
140
  // Organisation context is automatically enforced
@@ -192,7 +192,7 @@ function App() {
192
192
  <PagePermissionGuard
193
193
  pageName="dashboard"
194
194
  operation="read"
195
- fallback={<div>Access Denied</div>}
195
+ fallback={<p>Access Denied</p>}
196
196
  >
197
197
  <Dashboard />
198
198
  </PagePermissionGuard>
@@ -126,14 +126,14 @@ function ProtectedComponent() {
126
126
  const { user, session, isLoading } = useUnifiedAuth();
127
127
 
128
128
  if (isLoading) {
129
- return <div>Loading...</div>;
129
+ return <p>Loading...</p>;
130
130
  }
131
131
 
132
132
  if (!user || !session) {
133
- return <div>Please log in</div>;
133
+ return <p>Please log in</p>;
134
134
  }
135
135
 
136
- return <div>Welcome, {user.email}!</div>;
136
+ return <p>Welcome, {user.email}!</p>;
137
137
  }
138
138
  ```
139
139
 
@@ -672,9 +672,9 @@ test('hides content when user lacks permission', () => {
672
672
  <PermissionEnforcer
673
673
  operation="read"
674
674
  resource="users"
675
- fallback={<div>Access denied</div>}
675
+ fallback={<p>Access denied</p>}
676
676
  >
677
- <div>User data</div>
677
+ <section>User data</section>
678
678
  </PermissionEnforcer>
679
679
  );
680
680
 
@@ -0,0 +1,220 @@
1
+ # Standards Overview
2
+
3
+ **🤖 Cursor Rule**: See [00-standards-overview.mdc](../../cursor-rules/00-standards-overview.mdc) for AI-optimized directives that automatically enforce these standards.
4
+
5
+ ## Purpose
6
+
7
+ This document provides an overview of the pace-core standards system, how it works, and how to use it. These standards are the **canonical development standards** for **pace-core** and **all consuming applications** in the pace-suite.
8
+
9
+ These standards are **human-readable first**, but are deliberately structured so they can be **enforced by automation**, including Cursor rules, ESLint, and custom audit tooling.
10
+
11
+ They are the **single source of truth**.
12
+ All other quality tools must align *to these standards*, not reinterpret them.
13
+
14
+ ---
15
+
16
+ ## How to Use These Standards
17
+
18
+ ### pace-core
19
+
20
+ - Treat these standards as **hard constraints**
21
+ - pace-core sets the bar and defines the contracts
22
+ - Any deviation must be explicitly documented here
23
+
24
+ ### Consuming Applications
25
+
26
+ - Inherit these standards by default
27
+ - Only diverge where a documented exception exists
28
+ - Consuming apps should never weaken standards silently
29
+
30
+ ### AI Agents (Cursor, Codex, etc.)
31
+
32
+ - Follow these standards **strictly**
33
+ - Do **not** silence rules to "make things pass"
34
+ - If compliance is unclear, stop and report rather than guessing
35
+
36
+ ---
37
+
38
+ ## The Four Layers of Quality Enforcement
39
+
40
+ The pace-suite uses **four complementary quality layers**, each with a distinct responsibility.
41
+ They are intentionally overlapping in *coverage*, but **not duplicative in purpose**.
42
+
43
+ Think of this as *defence in depth*, not redundancy.
44
+
45
+ ### 1. Standards Documents (Source of Truth)
46
+
47
+ **What they are**
48
+ - Human-readable `.md` documents
49
+ - Describe *intent*, *principles*, and *expectations*
50
+ - Technology-agnostic where possible
51
+
52
+ **What they are used for**
53
+ - Defining *what "good" looks like*
54
+ - Onboarding humans and AI agents
55
+ - Resolving ambiguity when tools disagree
56
+ - Designing new rules, lint checks, and audits
57
+
58
+ **What they are NOT**
59
+ - They are not executable
60
+ - They do not enforce anything by themselves
61
+ - They should not contain implementation hacks
62
+
63
+ ➡️ **If there is a conflict, the standards win.**
64
+
65
+ ### 2. Cursor Rules (Real-time Guidance)
66
+
67
+ **What they are**
68
+ - AI-optimised interpretations of the standards
69
+ - Applied while code is being written or modified
70
+ - Prevent mistakes *before* they land
71
+
72
+ **What they are used for**
73
+ - Steering AI agents toward correct patterns
74
+ - Enforcing architectural intent during development
75
+ - Reducing rework later in linting or audits
76
+
77
+ **What they are NOT**
78
+ - They are not a replacement for lint or audits
79
+ - They should not invent new standards
80
+ - They should not silence problems "to move on"
81
+
82
+ ➡️ Cursor rules **translate standards into behaviour**, but do not redefine them.
83
+
84
+ ### 3. ESLint (Fast, Local Static Analysis)
85
+
86
+ **What it is**
87
+ - Deterministic, file-level static analysis
88
+ - Runs locally and in CI
89
+ - Focused on correctness, safety, and consistency
90
+
91
+ **What it is used for**
92
+ - Catching obvious issues early (types, hooks, imports, patterns)
93
+ - Enforcing mechanically checkable rules
94
+ - Preventing regressions during refactors
95
+
96
+ **What it is NOT**
97
+ - ESLint should not encode complex business rules
98
+ - It should not contain subjective or architectural debates
99
+ - It should not be silenced to "get green builds"
100
+
101
+ ➡️ ESLint enforces *how code is written*, not *whether the system is correct*.
102
+
103
+ ### 4. Audit Tool (Deep, System-Level Analysis)
104
+
105
+ **What it is**
106
+ - A custom static analysis tool
107
+ - Operates across files, folders, and systems
108
+ - Understands pace-core contracts and invariants
109
+ - Organized by the 10-file standards structure
110
+
111
+ **What it is used for**
112
+ - Validating architectural compliance (RBAC, data access, boundaries)
113
+ - Catching issues ESLint cannot see (cross-file analysis, configuration validation)
114
+ - Providing actionable remediation plans
115
+ - System-level checks (provider nesting, RLS policies in SQL, project structure)
116
+
117
+ **What it is NOT**
118
+ - It is not a linter replacement
119
+ - It should not report stylistic issues (handled by ESLint)
120
+ - It should not duplicate ESLint checks (file-level AST analysis)
121
+ - It should not contradict the standards
122
+
123
+ ➡️ The audit tool answers: *"Is this system actually compliant?"*
124
+
125
+ **Usage**: Run `npm run audit:pace-core` in your consuming app to generate a comprehensive audit report organized by standard.
126
+
127
+ ---
128
+
129
+ ## How the Layers Work Together
130
+
131
+ | Layer | Strength | Timing |
132
+ |--------------|----------------------------------|-----------------|
133
+ | Standards | Intent & clarity | Design time |
134
+ | Cursor rules | Preventive guidance | Write time |
135
+ | ESLint | Fast mechanical enforcement | Dev / CI |
136
+ | Audit tool | Deep architectural verification | Review / CI |
137
+
138
+ No single layer is sufficient on its own.
139
+ Together, they create a **repeatable, scalable quality system** for both humans and AI.
140
+
141
+ ---
142
+
143
+ ## Precedence Order
144
+
145
+ When standards conflict, apply this precedence order:
146
+
147
+ 1. **Security** - Security and RBAC standards take highest priority
148
+ 2. **API/RPC** - API contracts and RPC standards
149
+ 3. **Components & Markup** - Component usage and markup quality
150
+ 4. **Code Quality/Style** - TypeScript, naming, code style
151
+ 5. **Testing & Documentation** - Testing and documentation requirements
152
+ 6. **Consuming App Structure** - Project structure and organization
153
+
154
+ **Example:** If a component pattern conflicts with a security requirement, security wins.
155
+
156
+ ---
157
+
158
+ ## Standards File Mapping
159
+
160
+ The standards are organized into 10 files, each covering a specific domain:
161
+
162
+ | File | Standard | Cursor Rule | Purpose |
163
+ |------|----------|------------|---------|
164
+ | `0-standards-overview.md` | Overview | `00-standards-overview.mdc` | This file - entry point and system overview |
165
+ | `1-pace-core-compliance-standards.md` | pace-core Compliance | `01-pace-core-compliance.mdc` | Enforce pace-core usage patterns |
166
+ | `2-project-structure-standards.md` | Project Structure | `02-project-structure.mdc` | Define standard folder structure |
167
+ | `3-architecture-standards.md` | Architecture | `03-architecture.mdc` | Enforce SOLID architecture principles |
168
+ | `4-code-quality-standards.md` | Code Quality | `04-code-quality.mdc` | Enforce code quality standards |
169
+ | `5-styling-standards.md` | Styling | `05-styling.mdc` | Enforce clean markup and styling standards |
170
+ | `6-security-rbac-standards.md` | Security & RBAC | `06-security-rbac.mdc` | Enforce RBAC contract and security |
171
+ | `7-api-tech-stack-standards.md` | API & Tech Stack | `07-api-tech-stack.mdc` | Enforce tech stack versions and API standards |
172
+ | `8-testing-documentation-standards.md` | Testing & Documentation | `08-testing-documentation.mdc` | Enforce testing and documentation standards |
173
+ | `9-operations-standards.md` | Operations | `09-operations.mdc` | Enforce error handling, performance, and CI/CD |
174
+
175
+ ---
176
+
177
+ ## Quick Reference Guide
178
+
179
+ **New to pace-core?** Start here:
180
+ 1. Read [Standards Overview](./0-standards-overview.md) (this file) - Understand the system
181
+ 2. Read [Styling Standards](./5-styling-standards.md) - **CRITICAL:** Required CSS setup
182
+ 3. Read [pace-core Compliance](./1-pace-core-compliance-standards.md) - How to use pace-core
183
+ 4. Read [Project Structure](./2-project-structure-standards.md) - Organize your code
184
+
185
+ **Common Tasks:**
186
+ - **Setting up a new app?** → [Project Structure](./2-project-structure-standards.md) + [Styling Standards](./5-styling-standards.md)
187
+ - **Writing components?** → [Architecture](./3-architecture-standards.md) + [Code Quality](./4-code-quality-standards.md)
188
+ - **Working with RBAC?** → [Security & RBAC](./6-security-rbac-standards.md)
189
+ - **Creating APIs/RPCs?** → [API & Tech Stack](./7-api-tech-stack-standards.md)
190
+ - **Handling errors?** → [Operations](./9-operations-standards.md)
191
+ - **Writing tests?** → [Testing & Documentation](./8-testing-documentation-standards.md)
192
+
193
+ ---
194
+
195
+ ## Key Principles
196
+
197
+ - **Do not silence tools** — fix the underlying issue
198
+ - **Do not duplicate rules** — each layer has a purpose
199
+ - **Do not diverge silently** — document exceptions explicitly
200
+ - **Standards always win** — tools must align to them
201
+
202
+ ---
203
+
204
+ ## Related Documentation
205
+
206
+ - [pace-core Compliance](./1-pace-core-compliance-standards.md) - pace-core usage patterns
207
+ - [Project Structure](./2-project-structure-standards.md) - Project structure and organization
208
+ - [Architecture](./3-architecture-standards.md) - SOLID architecture principles
209
+ - [Code Quality](./4-code-quality-standards.md) - Code quality and TypeScript standards
210
+ - [Styling](./5-styling-standards.md) - Markup and styling standards
211
+ - [Security & RBAC](./6-security-rbac-standards.md) - RBAC and RLS standards
212
+ - [API & Tech Stack](./7-api-tech-stack-standards.md) - Tech stack and API/RPC standards
213
+ - [Testing & Documentation](./8-testing-documentation-standards.md) - Testing and documentation standards
214
+ - [Operations](./9-operations-standards.md) - Error handling, performance, and CI/CD
215
+
216
+ ---
217
+
218
+ **Last Updated:** 2025-01-28
219
+ **Version:** 2.0.0
220
+ **Applies to:** All pace-core and consuming apps