@jmruthers/pace-core 0.6.4 → 0.6.6

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 (387) hide show
  1. package/CHANGELOG.md +104 -0
  2. package/README.md +5 -403
  3. package/core-usage-manifest.json +93 -0
  4. package/cursor-rules/00-pace-core-compliance.mdc +128 -26
  5. package/cursor-rules/01-standards-compliance.mdc +49 -8
  6. package/cursor-rules/02-project-structure.mdc +6 -0
  7. package/cursor-rules/03-solid-principles.mdc +2 -0
  8. package/cursor-rules/04-testing-standards.mdc +2 -0
  9. package/cursor-rules/05-bug-reports-and-features.mdc +2 -0
  10. package/cursor-rules/06-code-quality.mdc +2 -0
  11. package/cursor-rules/07-tech-stack-compliance.mdc +2 -0
  12. package/cursor-rules/08-markup-quality.mdc +52 -27
  13. package/cursor-rules/09-rbac-compliance.mdc +462 -0
  14. package/cursor-rules/10-error-handling-patterns.mdc +179 -0
  15. package/cursor-rules/11-performance-optimization.mdc +169 -0
  16. package/cursor-rules/12-ci-cd-integration.mdc +150 -0
  17. package/dist/{AuthService-Cb34EQs3.d.ts → AuthService-DmfO5rGS.d.ts} +10 -0
  18. package/dist/{DataTable-BMRU8a1j.d.ts → DataTable-2N_tqbfq.d.ts} +1 -1
  19. package/dist/DataTable-LRJL4IRV.js +15 -0
  20. package/dist/{PublicPageProvider-DEMpysFR.d.ts → PublicPageProvider-BBH6Vqg7.d.ts} +72 -139
  21. package/dist/UnifiedAuthProvider-ZT6TIGM7.js +7 -0
  22. package/dist/api-Y4MQWOFW.js +4 -0
  23. package/dist/audit-MYQXYZFU.js +3 -0
  24. package/dist/{chunk-J36DSWQK.js → chunk-2HGJFNAH.js} +8 -28
  25. package/dist/{chunk-OEWDTMG7.js → chunk-3O3WHILE.js} +38 -121
  26. package/dist/{chunk-M43Y4SSO.js → chunk-3QC3KRHK.js} +1 -14
  27. package/dist/{chunk-DGUM43GV.js → chunk-3RG5ZIWI.js} +1 -4
  28. package/dist/{chunk-QXHPKYJV.js → chunk-4SXLQIZO.js} +1 -26
  29. package/dist/chunk-4T7OBVTU.js +62 -0
  30. package/dist/{chunk-E66EQZE6.js → chunk-6GLLNA6U.js} +3 -9
  31. package/dist/{chunk-ZSAAAMVR.js → chunk-6QYDGKQY.js} +1 -4
  32. package/dist/{chunk-NN6WWZ5U.js → chunk-7TYHROIV.js} +579 -563
  33. package/dist/{chunk-M7MPQISP.js → chunk-A55DK444.js} +9 -16
  34. package/dist/{chunk-63FOKYGO.js → chunk-AHU7G2R5.js} +2 -11
  35. package/dist/{chunk-L4OXEN46.js → chunk-BVP2BCJF.js} +2 -16
  36. package/dist/chunk-C7NSAPTL.js +1 -0
  37. package/dist/{chunk-YKRAFF5K.js → chunk-FENMYN2U.js} +73 -149
  38. package/dist/{chunk-AVMLPIM7.js → chunk-FTCRZOG2.js} +284 -432
  39. package/dist/{chunk-G37KK66H.js → chunk-FYHN4DD5.js} +60 -19
  40. package/dist/{chunk-VBXEHIUJ.js → chunk-HF6O3O37.js} +6 -88
  41. package/dist/{chunk-I6DAQMWX.js → chunk-LAZMKTTF.js} +930 -891
  42. package/dist/{chunk-5EC5MEWX.js → chunk-MAGBIDNS.js} +77 -222
  43. package/dist/chunk-MBADTM7L.js +64 -0
  44. package/dist/chunk-OHIK3MIO.js +994 -0
  45. package/dist/{chunk-6SOIHG6Z.js → chunk-S7DKJPLT.js} +115 -44
  46. package/dist/{chunk-FMUCXFII.js → chunk-SD6WQY43.js} +1 -5
  47. package/dist/{chunk-PWLANIRT.js → chunk-TTRFSOKR.js} +1 -7
  48. package/dist/{chunk-5DRSZLL2.js → chunk-UH3NTO3F.js} +1 -6
  49. package/dist/{chunk-FFQEQTNW.js → chunk-UIYSCEV7.js} +134 -45
  50. package/dist/{chunk-3LPHPB62.js → chunk-ZFYPMX46.js} +271 -87
  51. package/dist/{chunk-7JPAB3T5.js → chunk-ZS5VO5JB.js} +1989 -1283
  52. package/dist/components.d.ts +6 -6
  53. package/dist/components.js +57 -267
  54. package/dist/{database.generated-CzIvgcPu.d.ts → database.generated-CcnC_DRc.d.ts} +4795 -3691
  55. package/dist/eslint-rules/index.cjs +22 -0
  56. package/dist/eslint-rules/rules/compliance.cjs +348 -0
  57. package/dist/eslint-rules/rules/components.cjs +113 -0
  58. package/dist/eslint-rules/rules/imports.cjs +102 -0
  59. package/dist/eslint-rules/rules/rbac.cjs +790 -0
  60. package/dist/eslint-rules/utils/helpers.cjs +42 -0
  61. package/dist/eslint-rules/utils/manifest-loader.cjs +75 -0
  62. package/dist/hooks.d.ts +5 -5
  63. package/dist/hooks.js +62 -270
  64. package/dist/icons/index.d.ts +1 -0
  65. package/dist/icons/index.js +1 -0
  66. package/dist/index.d.ts +36 -26
  67. package/dist/index.js +87 -690
  68. package/dist/providers.d.ts +2 -2
  69. package/dist/providers.js +8 -35
  70. package/dist/rbac/eslint-rules.d.ts +46 -44
  71. package/dist/rbac/eslint-rules.js +7 -4
  72. package/dist/rbac/index.d.ts +124 -594
  73. package/dist/rbac/index.js +14 -207
  74. package/dist/styles/index.js +2 -12
  75. package/dist/theming/runtime.js +3 -19
  76. package/dist/{timezone-CHhWg6b4.d.ts → timezone-BZe_eUxx.d.ts} +175 -1
  77. package/dist/{types-CkbwOr4Y.d.ts → types-B-K_5VnO.d.ts} +4 -0
  78. package/dist/types-t9H8qKRw.d.ts +55 -0
  79. package/dist/types.d.ts +1 -1
  80. package/dist/types.js +7 -94
  81. package/dist/{usePublicRouteParams-i3qtoBgg.d.ts → usePublicRouteParams-COZ28Mvq.d.ts} +9 -9
  82. package/dist/utils.d.ts +24 -117
  83. package/dist/utils.js +54 -392
  84. package/docs/README.md +16 -6
  85. package/docs/api/README.md +4 -402
  86. package/docs/api/modules.md +454 -930
  87. package/docs/api-reference/components.md +3 -1
  88. package/docs/api-reference/deprecated.md +31 -6
  89. package/docs/api-reference/rpc-functions.md +78 -3
  90. package/docs/best-practices/accessibility.md +6 -3
  91. package/docs/getting-started/cursor-rules.md +3 -23
  92. package/docs/getting-started/dependencies.md +650 -0
  93. package/docs/getting-started/installation-guide.md +20 -7
  94. package/docs/getting-started/quick-start.md +23 -12
  95. package/docs/implementation-guides/permission-enforcement.md +4 -0
  96. package/docs/rbac/MIGRATION_GUIDE.md +819 -0
  97. package/docs/rbac/RBAC_CONTRACT.md +724 -0
  98. package/docs/rbac/README.md +12 -3
  99. package/docs/rbac/edge-functions-guide.md +376 -0
  100. package/docs/rbac/secure-client-protection.md +0 -34
  101. package/docs/standards/00-pace-core-compliance.md +967 -0
  102. package/docs/standards/01-standards-compliance.md +188 -0
  103. package/docs/standards/02-project-structure.md +985 -0
  104. package/docs/standards/03-solid-principles.md +39 -0
  105. package/docs/standards/04-testing-standards.md +36 -0
  106. package/docs/standards/05-bug-reports-and-features.md +27 -0
  107. package/docs/standards/{04-code-style-standard.md → 06-code-quality.md} +2 -0
  108. package/docs/standards/07-tech-stack-compliance.md +30 -0
  109. package/docs/standards/08-markup-quality.md +345 -0
  110. package/docs/standards/{07-rbac-and-rls-standard.md → 09-rbac-compliance.md} +149 -54
  111. package/docs/standards/10-error-handling-patterns.md +401 -0
  112. package/docs/standards/11-performance-optimization.md +348 -0
  113. package/docs/standards/12-ci-cd-integration.md +370 -0
  114. package/docs/standards/ALIGNMENT_REVIEW_SUMMARY.md +192 -0
  115. package/docs/standards/README.md +62 -33
  116. package/docs/troubleshooting/organisation-context-setup.md +42 -19
  117. package/eslint-config-pace-core.cjs +20 -4
  118. package/package.json +31 -21
  119. package/scripts/audit/audit-compliance.cjs +1295 -0
  120. package/scripts/audit/audit-components.cjs +260 -0
  121. package/scripts/audit/audit-dependencies.cjs +395 -0
  122. package/scripts/audit/audit-rbac.cjs +954 -0
  123. package/scripts/audit/audit-standards.cjs +1268 -0
  124. package/scripts/audit/index.cjs +1898 -194
  125. package/scripts/install-cursor-rules.cjs +259 -8
  126. package/scripts/validate-master.js +1 -1
  127. package/src/__tests__/fixtures/supabase.ts +1 -1
  128. package/src/__tests__/helpers/__tests__/component-test-utils.test.tsx +1 -1
  129. package/src/__tests__/helpers/__tests__/optimized-test-setup.test.ts +1 -1
  130. package/src/__tests__/helpers/__tests__/supabaseMock.test.ts +1 -1
  131. package/src/__tests__/helpers/__tests__/test-utils.test.tsx +3 -3
  132. package/src/__tests__/helpers/component-test-utils.tsx +1 -1
  133. package/src/__tests__/helpers/supabaseMock.ts +2 -2
  134. package/src/__tests__/public-recipe-view.test.ts +38 -9
  135. package/src/components/Button/Button.tsx +5 -1
  136. package/src/components/ContextSelector/ContextSelector.tsx +42 -39
  137. package/src/components/DataTable/__tests__/keyboard.test.tsx +15 -2
  138. package/src/components/DataTable/components/DataTableBody.tsx +55 -31
  139. package/src/components/DataTable/components/DataTableCore.tsx +186 -13
  140. package/src/components/DataTable/components/DataTableLayout.tsx +30 -5
  141. package/src/components/DataTable/components/EditFields.tsx +23 -3
  142. package/src/components/DataTable/components/EditableRow.tsx +7 -2
  143. package/src/components/DataTable/components/ImportModal.tsx +4 -6
  144. package/src/components/DataTable/components/RowComponent.tsx +12 -0
  145. package/src/components/DataTable/components/ViewRowModal.tsx +4 -4
  146. package/src/components/DataTable/components/__tests__/ImportModal.test.tsx +455 -96
  147. package/src/components/DataTable/components/__tests__/ViewRowModal.test.tsx +122 -58
  148. package/src/components/DataTable/components/hooks/usePermissionTracking.ts +0 -4
  149. package/src/components/DataTable/core/DataTableContext.tsx +1 -1
  150. package/src/components/DataTable/hooks/__tests__/useDataTableState.test.ts +51 -47
  151. package/src/components/DataTable/hooks/useDataTablePermissions.ts +24 -21
  152. package/src/components/DataTable/hooks/useDataTableState.ts +125 -9
  153. package/src/components/DataTable/hooks/useTableColumns.ts +40 -2
  154. package/src/components/DataTable/hooks/useTableHandlers.ts +11 -0
  155. package/src/components/DataTable/types.ts +5 -0
  156. package/src/components/DateTimeField/DateTimeField.tsx +20 -20
  157. package/src/components/DateTimeField/README.md +5 -2
  158. package/src/components/Dialog/Dialog.test.tsx +361 -318
  159. package/src/components/Dialog/Dialog.tsx +1154 -323
  160. package/src/components/Dialog/index.ts +3 -3
  161. package/src/components/FileDisplay/FileDisplay.test.tsx +45 -2
  162. package/src/components/FileDisplay/FileDisplay.tsx +28 -22
  163. package/src/components/Form/Form.test.tsx +9 -10
  164. package/src/components/Form/Form.tsx +369 -9
  165. package/src/components/InactivityWarningModal/InactivityWarningModal.test.tsx +28 -28
  166. package/src/components/InactivityWarningModal/InactivityWarningModal.tsx +40 -54
  167. package/src/components/LoginForm/LoginForm.tsx +2 -2
  168. package/src/components/NavigationMenu/NavigationMenu.test.tsx +14 -13
  169. package/src/components/NavigationMenu/NavigationMenu.tsx +2 -2
  170. package/src/components/NavigationMenu/useNavigationFiltering.ts +11 -21
  171. package/src/components/PaceAppLayout/PaceAppLayout.test.tsx +6 -4
  172. package/src/components/PaceAppLayout/PaceAppLayout.tsx +30 -41
  173. package/src/components/PaceAppLayout/README.md +10 -9
  174. package/src/components/PaceAppLayout/test-setup.tsx +40 -31
  175. package/src/components/PaceLoginPage/PaceLoginPage.test.tsx +108 -61
  176. package/src/components/PaceLoginPage/PaceLoginPage.tsx +27 -3
  177. package/src/components/PasswordChange/PasswordChangeForm.test.tsx +61 -0
  178. package/src/components/PasswordChange/PasswordChangeForm.tsx +20 -13
  179. package/src/components/PublicLayout/PublicLayout.test.tsx +7 -3
  180. package/src/components/PublicLayout/PublicPageLayout.tsx +5 -8
  181. package/src/components/Select/Select.tsx +23 -21
  182. package/src/components/Select/types.ts +1 -1
  183. package/src/components/UserMenu/UserMenu.test.tsx +38 -6
  184. package/src/components/UserMenu/UserMenu.tsx +39 -34
  185. package/src/components/index.ts +3 -4
  186. package/src/eslint-rules/index.cjs +22 -0
  187. package/src/eslint-rules/rules/compliance.cjs +348 -0
  188. package/src/eslint-rules/rules/components.cjs +113 -0
  189. package/src/eslint-rules/rules/imports.cjs +102 -0
  190. package/src/eslint-rules/rules/rbac.cjs +790 -0
  191. package/src/eslint-rules/utils/helpers.cjs +42 -0
  192. package/src/eslint-rules/utils/manifest-loader.cjs +75 -0
  193. package/src/hooks/__tests__/hooks.integration.test.tsx +6 -8
  194. package/src/hooks/__tests__/useAppConfig.unit.test.ts +129 -67
  195. package/src/hooks/__tests__/usePublicEvent.simple.test.ts +149 -67
  196. package/src/hooks/__tests__/usePublicEvent.test.ts +149 -79
  197. package/src/hooks/__tests__/usePublicEvent.unit.test.ts +158 -109
  198. package/src/hooks/__tests__/useSessionDraft.test.ts +163 -0
  199. package/src/hooks/__tests__/useSessionRestoration.unit.test.tsx +10 -5
  200. package/src/hooks/public/usePublicEvent.ts +62 -190
  201. package/src/hooks/public/usePublicEventLogo.test.ts +70 -17
  202. package/src/hooks/public/usePublicEventLogo.ts +19 -9
  203. package/src/hooks/useAppConfig.ts +26 -24
  204. package/src/hooks/useEventTheme.test.ts +211 -233
  205. package/src/hooks/useEventTheme.ts +19 -28
  206. package/src/hooks/useEvents.ts +11 -7
  207. package/src/hooks/useKeyboardShortcuts.ts +1 -1
  208. package/src/hooks/useOrganisationPermissions.ts +9 -11
  209. package/src/hooks/useOrganisations.ts +13 -7
  210. package/src/hooks/useQueryCache.ts +0 -1
  211. package/src/hooks/useSessionDraft.ts +380 -0
  212. package/src/hooks/useSessionRestoration.ts +3 -1
  213. package/src/icons/index.ts +27 -0
  214. package/src/index.ts +16 -1
  215. package/src/providers/OrganisationProvider.tsx +23 -14
  216. package/src/providers/services/EventServiceProvider.tsx +1 -24
  217. package/src/providers/services/UnifiedAuthProvider.tsx +5 -48
  218. package/src/providers/services/__tests__/UnifiedAuthProvider.integration.test.tsx +3 -0
  219. package/src/rbac/README.md +20 -20
  220. package/src/rbac/__tests__/adapters.comprehensive.test.tsx +7 -457
  221. package/src/rbac/__tests__/auth-rbac.e2e.test.tsx +33 -7
  222. package/src/rbac/adapters.tsx +7 -295
  223. package/src/rbac/api.test.ts +44 -56
  224. package/src/rbac/api.ts +10 -17
  225. package/src/rbac/cache-invalidation.ts +0 -1
  226. package/src/rbac/compliance/index.ts +10 -0
  227. package/src/rbac/compliance/pattern-detector.ts +553 -0
  228. package/src/rbac/compliance/runtime-compliance.ts +22 -0
  229. package/src/rbac/components/AccessDenied.tsx +150 -0
  230. package/src/rbac/components/NavigationGuard.tsx +12 -20
  231. package/src/rbac/components/PagePermissionGuard.tsx +4 -24
  232. package/src/rbac/components/__tests__/NavigationGuard.test.tsx +21 -8
  233. package/src/rbac/components/index.ts +3 -41
  234. package/src/rbac/eslint-rules.js +1 -1
  235. package/src/rbac/hooks/index.ts +0 -3
  236. package/src/rbac/hooks/permissions/index.ts +0 -3
  237. package/src/rbac/hooks/permissions/useAccessLevel.ts +4 -8
  238. package/src/rbac/hooks/usePermissions.ts +0 -3
  239. package/src/rbac/hooks/useRBAC.test.ts +21 -3
  240. package/src/rbac/hooks/useRBAC.ts +4 -3
  241. package/src/rbac/hooks/useResolvedScope.test.ts +57 -47
  242. package/src/rbac/hooks/useResolvedScope.ts +58 -140
  243. package/src/rbac/hooks/useResourcePermissions.test.ts +241 -60
  244. package/src/rbac/hooks/useResourcePermissions.ts +182 -63
  245. package/src/rbac/hooks/useRoleManagement.test.ts +65 -22
  246. package/src/rbac/hooks/useRoleManagement.ts +147 -19
  247. package/src/rbac/hooks/useSecureSupabase.ts +4 -8
  248. package/src/rbac/index.ts +7 -9
  249. package/src/rbac/permissions.ts +17 -17
  250. package/src/rbac/utils/contextValidator.ts +45 -7
  251. package/src/services/AuthService.ts +132 -23
  252. package/src/services/EventService.ts +4 -97
  253. package/src/services/InactivityService.ts +155 -58
  254. package/src/services/OrganisationService.ts +7 -44
  255. package/src/services/__tests__/OrganisationService.test.ts +26 -8
  256. package/src/services/base/BaseService.ts +0 -3
  257. package/src/styles/core.css +4 -0
  258. package/src/types/database.generated.ts +4733 -3809
  259. package/src/utils/__tests__/organisationContext.unit.test.ts +9 -10
  260. package/src/utils/context/organisationContext.test.ts +13 -28
  261. package/src/utils/context/organisationContext.ts +21 -52
  262. package/src/utils/dynamic/dynamicUtils.ts +1 -1
  263. package/src/utils/file-reference/index.ts +39 -15
  264. package/src/utils/formatting/formatDateTime.test.ts +3 -2
  265. package/src/utils/formatting/formatTime.test.ts +3 -2
  266. package/src/utils/google-places/loadGoogleMapsScript.ts +29 -4
  267. package/src/utils/index.ts +4 -1
  268. package/src/utils/persistence/__tests__/keyDerivation.test.ts +135 -0
  269. package/src/utils/persistence/__tests__/sensitiveFieldDetection.test.ts +123 -0
  270. package/src/utils/persistence/keyDerivation.ts +304 -0
  271. package/src/utils/persistence/sensitiveFieldDetection.ts +212 -0
  272. package/src/utils/security/secureStorage.ts +5 -5
  273. package/src/utils/storage/helpers.ts +3 -3
  274. package/src/utils/supabase/createBaseClient.ts +147 -0
  275. package/src/utils/timezone/timezone.test.ts +1 -2
  276. package/src/utils/timezone/timezone.ts +1 -1
  277. package/src/utils/validation/csrf.ts +4 -4
  278. package/cursor-rules/CHANGELOG.md +0 -119
  279. package/cursor-rules/README.md +0 -192
  280. package/dist/DataTable-E7YQZD7D.js +0 -175
  281. package/dist/DataTable-E7YQZD7D.js.map +0 -1
  282. package/dist/UnifiedAuthProvider-QPXO24B4.js +0 -18
  283. package/dist/UnifiedAuthProvider-QPXO24B4.js.map +0 -1
  284. package/dist/api-6LVZTHDS.js +0 -52
  285. package/dist/api-6LVZTHDS.js.map +0 -1
  286. package/dist/audit-V53FV5AG.js +0 -17
  287. package/dist/audit-V53FV5AG.js.map +0 -1
  288. package/dist/chunk-36LVWXB2.js +0 -227
  289. package/dist/chunk-36LVWXB2.js.map +0 -1
  290. package/dist/chunk-3LPHPB62.js.map +0 -1
  291. package/dist/chunk-5DRSZLL2.js.map +0 -1
  292. package/dist/chunk-5EC5MEWX.js.map +0 -1
  293. package/dist/chunk-63FOKYGO.js.map +0 -1
  294. package/dist/chunk-6SOIHG6Z.js.map +0 -1
  295. package/dist/chunk-7JPAB3T5.js.map +0 -1
  296. package/dist/chunk-ATKZM7RX.js +0 -2053
  297. package/dist/chunk-ATKZM7RX.js.map +0 -1
  298. package/dist/chunk-AVMLPIM7.js.map +0 -1
  299. package/dist/chunk-DGUM43GV.js.map +0 -1
  300. package/dist/chunk-E66EQZE6.js.map +0 -1
  301. package/dist/chunk-FFQEQTNW.js.map +0 -1
  302. package/dist/chunk-FMUCXFII.js.map +0 -1
  303. package/dist/chunk-G37KK66H.js.map +0 -1
  304. package/dist/chunk-I6DAQMWX.js.map +0 -1
  305. package/dist/chunk-J36DSWQK.js.map +0 -1
  306. package/dist/chunk-KQCRWDSA.js +0 -1
  307. package/dist/chunk-KQCRWDSA.js.map +0 -1
  308. package/dist/chunk-L4OXEN46.js.map +0 -1
  309. package/dist/chunk-LMC26NLJ.js +0 -84
  310. package/dist/chunk-LMC26NLJ.js.map +0 -1
  311. package/dist/chunk-M43Y4SSO.js.map +0 -1
  312. package/dist/chunk-M7MPQISP.js.map +0 -1
  313. package/dist/chunk-NN6WWZ5U.js.map +0 -1
  314. package/dist/chunk-OEWDTMG7.js.map +0 -1
  315. package/dist/chunk-PWLANIRT.js.map +0 -1
  316. package/dist/chunk-QXHPKYJV.js.map +0 -1
  317. package/dist/chunk-VBXEHIUJ.js.map +0 -1
  318. package/dist/chunk-YKRAFF5K.js.map +0 -1
  319. package/dist/chunk-ZSAAAMVR.js.map +0 -1
  320. package/dist/components.js.map +0 -1
  321. package/dist/contextValidator-OOPCLPZW.js +0 -9
  322. package/dist/contextValidator-OOPCLPZW.js.map +0 -1
  323. package/dist/eslint-rules/pace-core-compliance.cjs +0 -510
  324. package/dist/hooks.js.map +0 -1
  325. package/dist/index.js.map +0 -1
  326. package/dist/providers.js.map +0 -1
  327. package/dist/rbac/eslint-rules.js.map +0 -1
  328. package/dist/rbac/index.js.map +0 -1
  329. package/dist/styles/index.js.map +0 -1
  330. package/dist/theming/runtime.js.map +0 -1
  331. package/dist/types.js.map +0 -1
  332. package/dist/utils.js.map +0 -1
  333. package/docs/standards/01-architecture-standard.md +0 -44
  334. package/docs/standards/02-api-and-rpc-standard.md +0 -39
  335. package/docs/standards/03-component-standard.md +0 -32
  336. package/docs/standards/05-security-standard.md +0 -44
  337. package/docs/standards/06-testing-and-docs-standard.md +0 -29
  338. package/docs/standards/pace-core-compliance.md +0 -432
  339. package/scripts/audit/core/checks/accessibility.cjs +0 -197
  340. package/scripts/audit/core/checks/api-usage.cjs +0 -191
  341. package/scripts/audit/core/checks/bundle.cjs +0 -142
  342. package/scripts/audit/core/checks/compliance.cjs +0 -2706
  343. package/scripts/audit/core/checks/config.cjs +0 -54
  344. package/scripts/audit/core/checks/coverage.cjs +0 -84
  345. package/scripts/audit/core/checks/dependencies.cjs +0 -994
  346. package/scripts/audit/core/checks/documentation.cjs +0 -268
  347. package/scripts/audit/core/checks/environment.cjs +0 -116
  348. package/scripts/audit/core/checks/error-handling.cjs +0 -340
  349. package/scripts/audit/core/checks/forms.cjs +0 -172
  350. package/scripts/audit/core/checks/heuristics.cjs +0 -68
  351. package/scripts/audit/core/checks/hooks.cjs +0 -334
  352. package/scripts/audit/core/checks/imports.cjs +0 -244
  353. package/scripts/audit/core/checks/performance.cjs +0 -325
  354. package/scripts/audit/core/checks/routes.cjs +0 -117
  355. package/scripts/audit/core/checks/state.cjs +0 -130
  356. package/scripts/audit/core/checks/structure.cjs +0 -65
  357. package/scripts/audit/core/checks/style.cjs +0 -584
  358. package/scripts/audit/core/checks/testing.cjs +0 -122
  359. package/scripts/audit/core/checks/typescript.cjs +0 -61
  360. package/scripts/audit/core/scanner.cjs +0 -199
  361. package/scripts/audit/core/utils.cjs +0 -137
  362. package/scripts/audit/reporters/console.cjs +0 -151
  363. package/scripts/audit/reporters/json.cjs +0 -54
  364. package/scripts/audit/reporters/markdown.cjs +0 -124
  365. package/scripts/audit-consuming-app.cjs +0 -86
  366. package/src/eslint-rules/pace-core-compliance.cjs +0 -510
  367. package/src/eslint-rules/pace-core-compliance.js +0 -638
  368. package/src/rbac/components/EnhancedNavigationMenu.test.tsx +0 -555
  369. package/src/rbac/components/EnhancedNavigationMenu.tsx +0 -293
  370. package/src/rbac/components/NavigationProvider.test.tsx +0 -481
  371. package/src/rbac/components/NavigationProvider.tsx +0 -345
  372. package/src/rbac/components/PagePermissionProvider.test.tsx +0 -476
  373. package/src/rbac/components/PagePermissionProvider.tsx +0 -279
  374. package/src/rbac/components/PermissionEnforcer.tsx +0 -312
  375. package/src/rbac/components/RoleBasedRouter.tsx +0 -440
  376. package/src/rbac/components/SecureDataProvider.test.tsx +0 -543
  377. package/src/rbac/components/SecureDataProvider.tsx +0 -339
  378. package/src/rbac/components/__tests__/EnhancedNavigationMenu.test.tsx +0 -620
  379. package/src/rbac/components/__tests__/NavigationProvider.test.tsx +0 -726
  380. package/src/rbac/components/__tests__/PagePermissionProvider.test.tsx +0 -661
  381. package/src/rbac/components/__tests__/PermissionEnforcer.test.tsx +0 -881
  382. package/src/rbac/components/__tests__/RoleBasedRouter.test.tsx +0 -783
  383. package/src/rbac/components/__tests__/SecureDataProvider.fixed.test.tsx +0 -645
  384. package/src/rbac/components/__tests__/SecureDataProvider.test.tsx +0 -659
  385. package/src/rbac/hooks/permissions/useCachedPermissions.ts +0 -79
  386. package/src/rbac/hooks/permissions/useHasAllPermissions.ts +0 -90
  387. package/src/rbac/hooks/permissions/useHasAnyPermission.ts +0 -90
@@ -7,6 +7,10 @@ rulesVersion: "2025-01-28"
7
7
  ---
8
8
  # pace-core Compliance Guide
9
9
 
10
+ **📚 Human-Readable Standard**: See [00-pace-core-compliance.md](../../packages/core/docs/standards/00-pace-core-compliance.md) for complete documentation.
11
+
12
+ This guide ensures consuming apps use pace-core components, hooks, and utilities correctly, preventing duplication and maintaining consistency across the PACE suite.
13
+
10
14
  This guide ensures consuming apps use pace-core components, hooks, and utilities correctly, preventing duplication and maintaining consistency across the PACE suite.
11
15
 
12
16
  ## MUST: Use pace-core Instead of Custom Solutions
@@ -27,7 +31,7 @@ This guide ensures consuming apps use pace-core components, hooks, and utilities
27
31
  - Create custom button components when `Button` from pace-core exists
28
32
  - Use native HTML elements (`<button>`, `<input>`) when pace-core provides components
29
33
  - Import directly from `@radix-ui/*` - Use pace-core wrappers instead
30
- - Import directly from `lucide-react` - Use pace-core components that include icons
34
+ - Import directly from `lucide-react` - Import icons from `@jmruthers/pace-core/icons` instead
31
35
 
32
36
  **Example:**
33
37
  ```tsx
@@ -77,45 +81,106 @@ This guide ensures consuming apps use pace-core components, hooks, and utilities
77
81
 
78
82
  ## MUST: Use Secure Supabase Client
79
83
 
80
- **You MUST use `useSecureSupabase()` for all database operations.** Never use the base Supabase client directly.
84
+ **All database operations MUST use `useSecureSupabase()` (or the contract-approved pace-core secure client wrapper).**
85
+ Consuming apps **MUST NOT** use the base Supabase client directly for queries.
86
+
87
+ ### Hard Requirements
88
+
89
+ - **MUST NOT** import or call `createClient()` from `@supabase/supabase-js` in consuming app code **except** for creating the base client passed to `UnifiedAuthProvider`.
90
+ - **MUST NOT** export, pass, or store an insecure Supabase client instance for general use.
91
+ - **MUST** perform all `.from(...)`, `.rpc(...)`, `.auth.*`, and storage operations via the secure client returned by `useSecureSupabase()` (or the approved pace-core equivalent).
92
+ - **MUST** create the base Supabase client ONCE and pass it to `UnifiedAuthProvider` as `supabaseClient` prop.
93
+ - **MUST** call `useSecureSupabase()` without parameters - it automatically uses the base client from `useUnifiedAuth()` provider layer.
94
+ - **MUST NOT** pass a base client directly to `useSecureSupabase()` - the hook gets it from the provider automatically.
81
95
 
82
- **CRITICAL SECURITY REQUIREMENT:** Using `createClient()` from `@supabase/supabase-js` directly bypasses organisation context enforcement and RLS policies, which can lead to:
96
+ ### Why this is critical
97
+
98
+ Using `createClient()` directly for queries can bypass organisation context enforcement and RLS policies, leading to:
83
99
  - Cross-organisation data access
84
- - Security vulnerabilities
100
+ - Security vulnerabilities
85
101
  - Data leakage between organisations
86
102
 
103
+ ### Correct Pattern
104
+
87
105
  ```tsx
88
- // WRONG: Direct Supabase client creation
106
+ // CORRECT: Create base client ONCE for UnifiedAuthProvider
107
+ // main.tsx or App.tsx
89
108
  import { createClient } from '@supabase/supabase-js';
90
- const supabase = createClient(url, key);
91
- // This bypasses organisation context and RLS policies!
109
+ import { UnifiedAuthProvider } from '@jmruthers/pace-core';
110
+
111
+ const supabase = createClient(
112
+ import.meta.env.VITE_SUPABASE_URL,
113
+ import.meta.env.VITE_SUPABASE_PUBLISHABLE_KEY
114
+ );
115
+
116
+ function App() {
117
+ return (
118
+ <UnifiedAuthProvider
119
+ supabaseClient={supabase} // Pass base client to provider
120
+ appName="YourApp"
121
+ // ... other props
122
+ >
123
+ <YourApp />
124
+ </UnifiedAuthProvider>
125
+ );
126
+ }
92
127
 
93
- // ✅ CORRECT: Use secure Supabase client
128
+ // ✅ CORRECT: Use secure client in components (no parameters needed)
129
+ // YourComponent.tsx
94
130
  import { useSecureSupabase } from '@jmruthers/pace-core/rbac';
95
- const secureSupabase = useSecureSupabase();
96
- // Organisation context is automatically enforced
97
- ```
98
131
 
99
- ### Detection and Enforcement
100
-
101
- pace-core provides multiple layers of protection:
132
+ function YourComponent() {
133
+ const secureSupabase = useSecureSupabase(); // Gets client from provider automatically
134
+
135
+ if (!secureSupabase) {
136
+ return <div>Loading...</div>;
137
+ }
138
+
139
+ // Use secureSupabase for all queries
140
+ const { data } = await secureSupabase.from('users').select('*');
141
+ }
142
+ ```
102
143
 
103
- 1. **ESLint Rule**: The `no-direct-supabase-client` rule detects `createClient` calls and reports errors
104
- 2. **Runtime Warnings**: Development mode warnings when insecure clients are detected
105
- 3. **Type Safety**: Use `isSecureClient()` to verify clients are secure
144
+ ### Incorrect Patterns
106
145
 
107
146
  ```tsx
108
- // Verify client is secure (optional, but recommended)
109
- import { isSecureClient, warnIfInsecureClient } from '@jmruthers/pace-core/rbac/utils/clientSecurity';
147
+ // FORBIDDEN: Creating client in component or service
148
+ import { createClient } from '@supabase/supabase-js';
149
+ const supabase = createClient(url, key); // Don't do this for queries
110
150
 
111
- const supabase = useSecureSupabase();
112
- warnIfInsecureClient(supabase, 'MyComponent'); // Warns in dev if insecure
151
+ // FORBIDDEN: Passing base client to useSecureSupabase
152
+ import { useSecureSupabase } from '@jmruthers/pace-core/rbac';
153
+ import { supabase } from './supabase'; // Don't export base client
154
+ const secureSupabase = useSecureSupabase(supabase); // Don't pass it
113
155
 
114
- if (isSecureClient(supabase)) {
115
- // Client is secure, safe to use
116
- }
156
+ // FORBIDDEN: Using base client directly for queries
157
+ const { data } = await supabase.from('users').select('*'); // Bypasses RLS
117
158
  ```
118
159
 
160
+ ### Acceptable Exceptions
161
+
162
+ **The ONLY acceptable use of `createClient()` in consuming app code is:**
163
+
164
+ 1. **Creating the base client for `UnifiedAuthProvider`** - This MUST be in one of these files:
165
+ - `src/main.tsx` (or `main.jsx`)
166
+ - `src/App.tsx` (or `App.jsx`)
167
+ - `src/lib/supabase.ts` (or `supabase.js`) - ONLY if this file is ONLY used to create the base client for the provider
168
+
169
+ **The file containing the base client creation MUST:**
170
+ - Be clearly named (e.g., `supabase.ts`, `main.tsx`)
171
+ - Only create the client once
172
+ - Pass it directly to `UnifiedAuthProvider` (not export it for general use)
173
+ - Include a comment explaining it's the base client for the provider
174
+
175
+ **NO OTHER EXCEPTIONS ARE PERMITTED** - All other uses of `createClient()` are security violations and MUST be fixed.
176
+
177
+ ### Detection / Audit
178
+
179
+ - `rg "createClient\(" src` must return **exactly ONE match** in the file that creates the base client for `UnifiedAuthProvider`.
180
+ - That file MUST be one of: `main.tsx`, `App.tsx`, or `lib/supabase.ts` (or `.jsx`/`.js` equivalents).
181
+ - No `.from(` / `.rpc(` calls may be performed on an insecure client reference.
182
+ - All `useSecureSupabase()` calls should be without parameters.
183
+
119
184
  ## MUST: Setup RBAC Before Use
120
185
 
121
186
  **You MUST call `setupRBAC()` before any RBAC usage.** This is non-negotiable.
@@ -240,13 +305,29 @@ import { UnifiedAuthProvider, OrganisationProvider } from '@jmruthers/pace-core'
240
305
 
241
306
  ## MUST: Import Core Styles
242
307
 
243
- **You MUST import pace-core styles:**
308
+ **You MUST import pace-core styles via app.css:**
309
+
310
+ The correct pattern is a two-file CSS architecture:
311
+ 1. `src/app.css` - Contains `@import "@jmruthers/pace-core/styles/core.css";` (CSS @import)
312
+ 2. `src/main.tsx` - Imports `./app.css` (JavaScript import)
244
313
 
245
314
  ```tsx
246
315
  // main.tsx or App.tsx
247
- import '@jmruthers/pace-core/styles/core.css';
316
+ import './app.css'; // ✅ CORRECT - app.css imports core.css
248
317
  ```
249
318
 
319
+ ```css
320
+ /* src/app.css */
321
+ @import "tailwindcss";
322
+ @import "@jmruthers/pace-core/styles/core.css"; // CSS @import, not JavaScript import
323
+ ```
324
+
325
+ **MUST NOT:**
326
+ - Import `core.css` directly in `main.tsx` or `App.tsx` - This causes duplicate imports
327
+ - Use JavaScript import for `core.css` - Use CSS `@import` in `app.css` instead
328
+
329
+ **See [08-markup-quality.md](../../packages/core/docs/standards/08-markup-quality.md) for complete CSS setup instructions.**
330
+
250
331
  ## MUST NOT: Use Inline Styles
251
332
 
252
333
  **You MUST NOT use inline styles (`style={{...}}`).** All styling MUST come from pace-core components and Tailwind classes.
@@ -320,6 +401,27 @@ Before adding any styling:
320
401
  7. **Missing styles** - Always import core.css
321
402
  8. **Direct library imports** - Use pace-core wrappers instead
322
403
 
404
+ ## Compliance Exceptions
405
+
406
+ **In general, pace-core compliance rules do NOT allow exceptions.** The rules are designed to ensure security, consistency, and maintainability across the PACE suite.
407
+
408
+ ### When Exceptions Are NOT Allowed
409
+
410
+ - **Security rules** (e.g., `createClient()` usage) - NO exceptions except the one documented above
411
+ - **RBAC rules** - NO exceptions
412
+ - **Component usage** - NO exceptions (use pace-core components)
413
+ - **Hook usage** - NO exceptions (use pace-core hooks)
414
+
415
+ ### Documenting Legitimate Edge Cases
416
+
417
+ If you encounter a situation where a rule seems to conflict with a legitimate requirement:
418
+
419
+ 1. **First**: Verify that pace-core doesn't provide a solution
420
+ 2. **Second**: Check if the requirement should be added to pace-core
421
+ 3. **Third**: If truly unavoidable, document the case clearly with a comment explaining why
422
+
423
+ **Note**: Even with documentation, exceptions should be temporary, rare, reviewed, and tracked for eventual removal.
424
+
323
425
  ## Reference
324
426
 
325
427
  - **pace-core Exports**: See `pace-core-exports.mdc` for complete export reference
@@ -9,6 +9,25 @@ rulesVersion: "2025-01-28"
9
9
 
10
10
  This guide ensures consuming apps comply with all pace-core standards. Follow these standards to maintain quality, security, and consistency.
11
11
 
12
+ ## MUST: Include Complete Cursor Ruleset
13
+
14
+ Consuming apps **MUST** include the complete pace-core ruleset in the repository so audits are deterministic and repeatable.
15
+
16
+ - **MUST** include these files under `.cursor/rules/` (exact filenames):
17
+ - `00-pace-core-compliance.mdc`
18
+ - `01-standards-compliance.mdc`
19
+ - `02-project-structure.mdc`
20
+ - `03-solid-principles.mdc`
21
+ - `06-code-quality.mdc`
22
+ - `07-tech-stack-compliance.mdc`
23
+ - `08-markup-quality.mdc`
24
+ - `09-rbac-compliance.mdc`
25
+ - `10-error-handling-patterns.mdc`
26
+ - `11-performance-optimization.mdc`
27
+ - **MUST NOT** rename or partially copy rules files.
28
+ - If a rule does not apply to a given app, document the exception and the reason, but keep the rule file present.
29
+
30
+
12
31
  ## Architecture Standard
13
32
 
14
33
  ### MUST: Follow Architecture Principles
@@ -171,6 +190,21 @@ type ApiError = { code: string; message: string; details?: object };
171
190
  - ≥90% coverage for utils & hooks
172
191
  - ≥70% coverage for components
173
192
 
193
+
194
+ ### MUST: Enforce Coverage Thresholds in Tooling
195
+
196
+ Coverage requirements must be **machine-enforced**, not aspirational:
197
+
198
+ - **MUST** provide a script: `npm run test:coverage`
199
+ - **MUST** configure the test runner (Vitest/Jest) to enforce the thresholds:
200
+ - ≥90% for utils & hooks
201
+ - ≥70% for components
202
+ - **MUST** fail the command when thresholds are not met (CI or local execution).
203
+
204
+ **Verification:**
205
+ - `npm run test:coverage` exits non-zero when below threshold.
206
+ - A coverage summary artifact is produced (e.g., `coverage/coverage-summary.json` or equivalent).
207
+
174
208
  ### MUST: Use React Testing Library
175
209
 
176
210
  **MUST use React Testing Library + userEvent for component tests.**
@@ -234,11 +268,18 @@ Before committing code, verify:
234
268
 
235
269
  ## Reference
236
270
 
237
- See `packages/core/docs/standards/` for complete standards documentation:
238
- - 01-architecture-standard.md
239
- - 02-api-and-rpc-standard.md
240
- - 03-component-standard.md
241
- - 04-code-style-standard.md
242
- - 05-security-standard.md
243
- - 06-testing-and-docs-standard.md
244
- - 07-rbac-and-rls-standard.md
271
+ **📚 Human-Readable Standard**: See [01-standards-compliance.md](../../packages/core/docs/standards/01-standards-compliance.md) for complete documentation.
272
+
273
+ **Related Standards** (all have corresponding cursor rules):
274
+ - **00-pace-core-compliance.mdc** - pace-core usage patterns
275
+ - **02-project-structure.mdc** - Project structure and organization
276
+ - **03-solid-principles.mdc** - SOLID architecture principles
277
+ - **04-testing-standards.mdc** - Testing framework standards
278
+ - **05-bug-reports-and-features.mdc** - Issue reporting templates
279
+ - **06-code-quality.mdc** - Code quality and TypeScript standards
280
+ - **07-tech-stack-compliance.mdc** - Tech stack and API/RPC standards
281
+ - **08-markup-quality.mdc** - Markup and styling standards
282
+ - **09-rbac-compliance.mdc** - RBAC and RLS standards
283
+ - **10-error-handling-patterns.mdc** - Error handling patterns
284
+ - **11-performance-optimization.mdc** - Performance optimization
285
+ - **12-ci-cd-integration.mdc** - CI/CD integration patterns
@@ -7,6 +7,8 @@ rulesVersion: "2025-01-28"
7
7
  ---
8
8
  # Project Structure Standard
9
9
 
10
+ **📚 Human-Readable Standard**: See [02-project-structure.md](../../packages/core/docs/standards/02-project-structure.md) for complete documentation including migration guides and detailed examples.
11
+
10
12
  This guide defines the standard folder structure and file organization for consuming apps in the PACE suite.
11
13
 
12
14
  ## MUST: Follow Standard Directory Structure
@@ -98,6 +100,10 @@ src/
98
100
  - Format: `YYYYMMDDHHMMSS_description.sql`
99
101
  - Example: `20250115143022_add_user_preferences.sql`
100
102
 
103
+ - If this app **intentionally has no app-owned migrations** (e.g., relies on shared DB managed elsewhere), you MUST add `supabase/README.md` explaining:
104
+ - where migrations/RLS policies are managed
105
+ - whether the app is expected to add migrations in the future
106
+
101
107
  ## SHOULD: Organize by Domain
102
108
 
103
109
  **For larger apps, SHOULD organize by domain/feature:**
@@ -7,6 +7,8 @@ rulesVersion: "2025-01-28"
7
7
  ---
8
8
  # SOLID Principles Guide
9
9
 
10
+ **📚 Human-Readable Standard**: See [03-solid-principles.md](../../packages/core/docs/standards/03-solid-principles.md) for complete documentation.
11
+
10
12
  This guide enforces SOLID architecture principles to ensure maintainable, extensible, and testable code.
11
13
 
12
14
  ## Single Responsibility Principle (SRP)
@@ -7,6 +7,8 @@ rulesVersion: "2025-01-28"
7
7
  ---
8
8
  # Testing Standards Guide
9
9
 
10
+ **📚 Human-Readable Standard**: See [04-testing-standards.md](../../packages/core/docs/standards/04-testing-standards.md) for complete documentation.
11
+
10
12
  This guide ensures consistent, high-quality testing across consuming apps in the PACE suite.
11
13
 
12
14
  ## MUST: Meet Coverage Requirements
@@ -7,6 +7,8 @@ rulesVersion: "2025-01-28"
7
7
  ---
8
8
  # Bug Reports and Feature Requests Guide
9
9
 
10
+ **📚 Human-Readable Standard**: See [05-bug-reports-and-features.md](../../packages/core/docs/standards/05-bug-reports-and-features.md) for complete documentation.
11
+
10
12
  This guide provides standardized templates for reporting bugs and requesting features in pace-core. This is a reference guide - Cursor will use this for context when helping with issue reporting.
11
13
 
12
14
  ## Identifying Issues
@@ -7,6 +7,8 @@ rulesVersion: "2025-01-28"
7
7
  ---
8
8
  # Code Quality Guide
9
9
 
10
+ **📚 Human-Readable Standard**: See [06-code-quality.md](../../packages/core/docs/standards/06-code-quality.md) for complete documentation.
11
+
10
12
  This guide enforces code quality standards to ensure maintainable, performant, and accessible code.
11
13
 
12
14
  ## TypeScript Standards
@@ -7,6 +7,8 @@ rulesVersion: "2025-01-28"
7
7
  ---
8
8
  # Tech Stack Compliance Guide
9
9
 
10
+ **📚 Human-Readable Standard**: See [07-tech-stack-compliance.md](../../packages/core/docs/standards/07-tech-stack-compliance.md) for complete documentation.
11
+
10
12
  This guide ensures consuming apps use the correct versions and patterns for all technologies in the PACE stack.
11
13
 
12
14
  ## Tailwind CSS v4
@@ -7,6 +7,27 @@ rulesVersion: "2025-01-28"
7
7
  ---
8
8
  # Markup Quality Guide
9
9
 
10
+ **📚 Human-Readable Standard**: See [08-markup-quality.md](../../packages/core/docs/standards/08-markup-quality.md) for complete documentation including **CRITICAL CSS configuration requirements**.
11
+
12
+ **⚠️ IMPORTANT**: This rule is ALWAYS APPLIED. The standard includes required CSS setup that MUST be followed for pace-core components to render correctly.
13
+
14
+ ## ⚠️ CRITICAL: CSS Configuration Required
15
+
16
+ **Before using pace-core components, you MUST configure CSS correctly.** Without proper configuration, pace-core components will appear unstyled or with incorrect styling.
17
+
18
+ **MUST read the standard for complete CSS setup instructions**: [08-markup-quality.md](../../packages/core/docs/standards/08-markup-quality.md)
19
+
20
+ **Quick checklist:**
21
+ - [ ] `src/app.css` exists with `@import "tailwindcss";`
22
+ - [ ] `@source` directives configured correctly (relative to CSS file location)
23
+ - [ ] `@import "@jmruthers/pace-core/styles/core.css";` in `app.css`
24
+ - [ ] All three color palettes defined (main, sec, acc) with all shades (50-950)
25
+ - [ ] `app.css` imported in `main.tsx` (NOT `core.css` directly)
26
+
27
+ **See the standard for detailed setup instructions and troubleshooting.**
28
+
29
+ ---
30
+
10
31
  This guide enforces clean markup standards, semantic HTML usage, and proper pace-core component patterns to ensure maintainable, accessible, and consistent code.
11
32
 
12
33
  ## pace-core First
@@ -88,41 +109,45 @@ import { Button, Input } from '@jmruthers/pace-core';
88
109
  <footer>Footer</footer>
89
110
  ```
90
111
 
91
- ### MUST NOT: Use `<div>` Elements
112
+ ### MUST: Prefer Semantic HTML (Limit `<div>`)
113
+
114
+ **You MUST prefer semantic HTML elements** (`<main>`, `<section>`, `<article>`, `<header>`, `<footer>`, `<nav>`, lists, etc.).
115
+ Using semantic elements improves accessibility, maintainability, and consistency.
116
+
117
+ #### `<div>` usage policy
118
+
119
+ - **MUST NOT** use `<div>` when a clear semantic element exists.
120
+ - `<div>` is **allowed only** for:
121
+ - purely presentational layout wrappers (flex/grid grouping) when no semantic element fits, OR
122
+ - React portal roots / app shell roots, OR
123
+ - third-party libraries that require specific DOM structure (document the reason in a short comment).
124
+
125
+ #### Severity guidance (for audits)
92
126
 
93
- **MUST NOT use `<div>` elements (except for the first child of `<body>` in `index.html`, React portals, or when required by third-party libraries that mandate specific DOM structure):**
127
+ - **HIGH/BLOCKER**: `<div>` used in place of landmark/semantic structure (e.g., main page wrapper that should be `<main>`, navigation that should be `<nav>`, lists that should be `<ul>/<ol>`).
128
+ - **MEDIUM**: `<div>` used as a generic wrapper inside semantic structure where it could be a fragment or semantic element.
129
+ - **LOW**: `<div>` used for unavoidable third-party structure with a comment justifying it.
130
+
131
+ **Examples:**
94
132
 
95
133
  ```tsx
96
- // ❌ WRONG: Using div elements
97
- <div className="container">
98
- <div className="content">Content</div>
134
+ // ❌ WRONG: Non-semantic page structure
135
+ <div className="page">
136
+ <div className="nav">...</div>
137
+ <div className="content">...</div>
99
138
  </div>
100
139
 
101
- // ✅ CORRECT: Use semantic elements or React Fragments
140
+ // ✅ CORRECT: Semantic structure
102
141
  <main>
103
- <section>Content</section>
142
+ <nav>...</nav>
143
+ <section>...</section>
104
144
  </main>
105
- // Or for grouping without semantic meaning:
106
- <>
107
- <Component1 />
108
- <Component2 />
109
- </>
110
- ```
111
145
 
112
- ### MUST: Choose Most Semantic Element
113
-
114
- **MUST choose the most semantically accurate element for the content:**
115
-
116
- ```tsx
117
- // ✅ CORRECT: Choose appropriate semantic elements
118
- <main>Main content</main>
119
- <section>Section of content</section>
120
- <article>Article content</article>
121
- <header>Header content</header>
122
- <footer>Footer content</footer>
123
- <nav>Navigation</nav>
124
- <ul><li>List items</li></ul>
125
- <p>Paragraph text</p>
146
+ // ✅ ACCEPTABLE: Layout-only wrapper (no semantic fit)
147
+ // (Prefer fragments where possible)
148
+ <section>
149
+ <div className="flex gap-2">...</div>
150
+ </section>
126
151
  ```
127
152
 
128
153
  ## Typography & Styling