@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
package/CHANGELOG.md CHANGED
@@ -7,7 +7,111 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0
7
7
 
8
8
  ## [Unreleased]
9
9
 
10
+ ### Breaking Changes
11
+ - **@supabase/supabase-js is now an included dependency (security enforcement)**: Moved from peer dependency to included dependency to enforce security rules. Consuming apps can no longer import `createClient` directly.
12
+ - **Action Required**:
13
+ - Remove `@supabase/supabase-js` from your `package.json` if installed
14
+ - Replace `createClient` imports with `createBaseClient()` from `@jmruthers/pace-core`
15
+ - **Migration**:
16
+ ```tsx
17
+ // ❌ OLD: Direct import
18
+ import { createClient } from '@supabase/supabase-js';
19
+ const supabase = createClient(url, key);
20
+
21
+ // ✅ NEW: Use pace-core wrapper
22
+ import { createBaseClient } from '@jmruthers/pace-core';
23
+ const supabase = createBaseClient(url, key);
24
+ ```
25
+ - **Why**: Enforces security rules - prevents insecure client usage
26
+ - See [Dependencies Guide](./docs/getting-started/dependencies.md) for details
27
+
28
+ - **@radix-ui/* packages are now included dependencies (consistency enforcement)**: Moved from peer dependencies to included dependencies to enforce consistency. Consuming apps can no longer import Radix UI primitives directly.
29
+ - **Action Required**:
30
+ - Remove all `@radix-ui/*` packages from your `package.json` if installed
31
+ - Replace Radix UI imports with pace-core components
32
+ - **Migration**:
33
+ ```tsx
34
+ // ❌ OLD: Direct Radix UI import
35
+ import { Checkbox } from '@radix-ui/react-checkbox';
36
+
37
+ // ✅ NEW: Use pace-core component
38
+ import { Checkbox } from '@jmruthers/pace-core';
39
+ ```
40
+ - **Why**: Enforces consistency - prevents bypassing pace-core components
41
+ - See [Dependencies Guide](./docs/getting-started/dependencies.md) for details
42
+
43
+ - **lucide-react is now an included dependency (consistency enforcement)**: Moved from peer dependency to included dependency to enforce consistency. Consuming apps can no longer import icons directly from `lucide-react`.
44
+ - **Action Required**:
45
+ - Remove `lucide-react` from your `package.json` if installed
46
+ - Replace `lucide-react` imports with `@jmruthers/pace-core/icons`
47
+ - **Migration**:
48
+ ```tsx
49
+ // ❌ OLD: Direct lucide-react import
50
+ import { ChevronDown, Edit } from 'lucide-react';
51
+
52
+ // ✅ NEW: Use pace-core icon exports
53
+ import { ChevronDown, Edit } from '@jmruthers/pace-core/icons';
54
+ ```
55
+ - **Why**: Enforces consistency - all icons available through pace-core
56
+ - **Note**: All lucide-react icons are now exported from `@jmruthers/pace-core/icons`
57
+ - See [Dependencies Guide](./docs/getting-started/dependencies.md) for details
58
+
59
+ - **@tanstack/react-query is a peer dependency**: Consuming apps need direct access to `QueryClient`, `QueryClientProvider`, and React Query hooks for configuration.
60
+ - **Action Required**: Install `@tanstack/react-query@^5.90.0` in your consuming app
61
+ - See [Dependencies Guide](./docs/getting-started/dependencies.md) for details
62
+
63
+ - **date-fns and date-fns-tz are peer dependencies**: Consuming apps may need direct access to date-fns functions that pace-core doesn't export.
64
+ - **Action Required**: Install `date-fns@^3.0.0` and `date-fns-tz@^3.0.0` in your consuming app
65
+ - See [Dependencies Guide](./docs/getting-started/dependencies.md) for details
66
+
67
+ ### Breaking Changes
68
+ - **RBAC Package Surface Area Reduction**: Removed redundant and overlapping RBAC exports to enforce a single correct pattern
69
+ - **Components Removed**:
70
+ - `PermissionEnforcer` → Use `PagePermissionGuard` instead
71
+ - `PermissionGuard` (from adapters) → Use `PagePermissionGuard` instead
72
+ - `AccessLevelGuard` → Use `useAccessLevel` hook + conditional rendering instead
73
+ - `RoleBasedRouter` → Use `PagePermissionGuard` + React Router instead
74
+ - `EnhancedNavigationMenu` → Use `NavigationMenu` + `NavigationGuard` instead
75
+ - `PagePermissionProvider` → Use `PagePermissionGuard` directly instead
76
+ - `SecureDataProvider` → Use `useSecureSupabase` hook directly instead
77
+ - `NavigationProvider` → Use `NavigationGuard` directly instead
78
+ - **Hooks Removed**:
79
+ - `useHasAnyPermission` → Use `useMultiplePermissions` with appropriate logic instead
80
+ - `useHasAllPermissions` → Use `useMultiplePermissions` with appropriate logic instead
81
+ - `useCachedPermissions` → Caching is automatic in all hooks
82
+ - **API Functions Removed**:
83
+ - `hasPermission` → Use `isPermitted` instead
84
+ - `hasPermissionCached` (from adapters) → Use `isPermittedCached` or hooks (automatic caching) instead
85
+ - `hasAnyPermissionCached` (from adapters) → Use `hasAnyPermission` or hooks (automatic caching) instead
86
+ - **Internal Exports Marked**: The following exports are now marked as `@internal` and should not be used by consuming apps:
87
+ - `RBACEngine`, `createRBACEngine` → Use `isPermitted` API instead
88
+ - `RBACCache`, `rbacCache`, `CACHE_PATTERNS` → Caching is automatic
89
+ - `SecureSupabaseClient`, `createSecureClient`, `fromSupabaseClient` → Use `useSecureSupabase` hook instead
90
+ - **Server Adapters**: Server-side adapters (`withPermissionGuard`, `withAccessLevelGuard`, `withRoleGuard`, `createRBACMiddleware`, `createRBACExpressMiddleware`) remain available for server-side route protection but are optional utilities.
91
+
92
+ **Migration Required**: See [RBAC Migration Guide](./docs/rbac/MIGRATION_GUIDE.md) for detailed migration instructions.
93
+
94
+ - **RBAC Contract v2.0.0**: Enforced RBAC contract with strict compliance rules
95
+ - **ESLint Rules**: All RBAC compliance rules are now **ERROR** severity (not warnings)
96
+ - **EventPageGuard Removed**: Wrapper components around `PagePermissionGuard` are forbidden. Use `PagePermissionGuard` directly and handle event context validation in page components.
97
+ - **Custom AccessDenied Forbidden**: Custom access denied components are forbidden. Use `AccessDenied` from `@jmruthers/pace-core/rbac` instead.
98
+ - **Direct RBAC Queries Forbidden**: Direct queries to RBAC tables are forbidden. Use `useSecureSupabase` hook instead.
99
+ - **Direct RPC Calls Forbidden**: Direct calls to `rbac_check_permission_simplified` are forbidden. Use `isPermitted` from pace-core instead.
100
+ - **enforcePermissions Clarified**: For event-based apps, `enforcePermissions` must be `false`. For organisation-based apps, it must be `true`.
101
+
102
+ **Migration Required**: See [RBAC Migration Guide](./docs/rbac/MIGRATION_GUIDE.md) for detailed migration instructions.
103
+
10
104
  ### Added
105
+ - **Standard AccessDenied Component**: New `AccessDenied` component exported from `@jmruthers/pace-core/rbac` for consistent access denied UX across all apps
106
+ - **RBAC Contract Documentation**: New `RBAC_CONTRACT.md` defining the mandatory contract between pace-core and consuming apps
107
+ - **RBAC Migration Guide**: New `MIGRATION_GUIDE.md` with step-by-step migration instructions
108
+ - **Enhanced ESLint Rules**: New rules for RBAC compliance:
109
+ - `no-direct-rbac-rpc`: Detects direct RPC calls to `rbac_check_permission_simplified`
110
+ - `no-direct-rbac-tables`: Detects direct queries to RBAC tables
111
+ - `no-bypass-page-guard`: Detects routes without `PagePermissionGuard`
112
+ - `no-custom-access-denied`: Detects custom access denied components
113
+ - **Pattern Detection**: New `pattern-detector.ts` for static and runtime RBAC violation detection
114
+ - **Enhanced Compliance Tools**: Updated `runtime-compliance.ts` with pattern detection capabilities
11
115
  - **Unified Context Selector**: New `ContextSelector` component that intelligently shows all accessible organisations and events in a single dropdown. Replaces the need for separate `OrganisationSelector`, `EventSelector`, and `HybridContextSelector` components.
12
116
  - Automatically determines what to show based on user's roles and permissions
13
117
  - Shows superset of all accessible orgs and events
package/README.md CHANGED
@@ -1,415 +1,17 @@
1
1
  # @jmruthers/pace-core
2
2
 
3
- Clean, modern React component library with Tailwind v4 styling and native utilities.
3
+ React component library with Tailwind v4.
4
4
 
5
- ## ⚠️ Breaking Changes
6
-
7
- ### Version 0.5.65+ - Mandatory Inactivity Timeouts
8
-
9
- The `UnifiedAuthProvider` now requires mandatory inactivity timeout configuration for security:
10
-
11
- ```tsx
12
- // ❌ Before (will cause TypeScript errors)
13
- <UnifiedAuthProvider supabaseClient={supabase} appName="my-app">
14
- <AppContent />
15
- </UnifiedAuthProvider>
16
-
17
- // ✅ After (required configuration)
18
- <UnifiedAuthProvider
19
- supabaseClient={supabase}
20
- appName="my-app"
21
- idleTimeoutMs={30 * 60 * 1000} // Required
22
- warnBeforeMs={5 * 60 * 1000} // Required
23
- onIdleLogout={() => navigate('/login')} // Required
24
- >
25
- <AppContent />
26
- </UnifiedAuthProvider>
27
- ```
28
-
29
- [📖 Migration Guide](./docs/migration-guides/unified-auth-provider-mandatory-timeouts.md)
30
-
31
- ## 🚀 PaceAppLayout Usage
32
-
33
- **PaceAppLayout uses React Router's nested routing pattern for optimal performance and scalability.**
34
-
35
- ```tsx
36
- // ✅ Correct usage with React Router
37
- <Router>
38
- <Routes>
39
- <Route path="/" element={<PaceAppLayout appName="My App" />}>
40
- <Route path="dashboard" element={<Dashboard />} />
41
- <Route path="settings" element={<Settings />} />
42
- </Route>
43
- </Routes>
44
- </Router>
45
- ```
46
-
47
- ## 📦 Type System
48
-
49
- PACE Core uses a domain-driven type organization for better maintainability and discoverability:
50
-
51
- ```typescript
52
- // Import from domain-specific modules
53
- import type { Event } from '@jmruthers/pace-core/types/event';
54
- import type { Organisation } from '@jmruthers/pace-core/types/organisation';
55
- import type { User, Session } from '@jmruthers/pace-core/types/auth';
56
- import type { UserId, AppId, PageId } from '@jmruthers/pace-core/types/core';
57
- import type { RBACPermissionCheckParams } from '@jmruthers/pace-core/rbac/types/functions';
58
- ```
59
-
60
- See the [Types API Reference](./docs/api-reference/types.md) for complete type documentation.
61
-
62
- ## 🚀 Complete Installation Guide
63
-
64
- ### 1. Install Dependencies
5
+ ## Installation
65
6
 
66
7
  ```bash
67
- # Install pace-core and required peer dependencies
68
- npm install @jmruthers/pace-core @tanstack/react-table @radix-ui/react-checkbox @radix-ui/react-dialog @radix-ui/react-dropdown-menu @radix-ui/react-label @radix-ui/react-slot lucide-react class-variance-authority clsx tailwind-merge
69
-
70
- # Install Tailwind CSS v4 and Vite plugin
71
- npm install -D @tailwindcss/vite tailwindcss@^4.0.0
72
- ```
73
-
74
- ### 2. Import Core Styles
75
-
76
- ```tsx
77
- // src/main.tsx (or your app's entry point)
78
- import '@jmruthers/pace-core/src/styles/core.css';
79
- import React from 'react';
80
- import ReactDOM from 'react-dom/client';
81
- import App from './App';
82
-
83
- // React 19+ with createRoot
84
- const root = ReactDOM.createRoot(document.getElementById('root') as HTMLElement);
85
- root.render(
86
- <React.StrictMode>
87
- <App />
88
- </React.StrictMode>
89
- );
90
- ```
91
-
92
- ### 3. Configure Vite with Tailwind v4
93
-
94
- **⚠️ CRITICAL**: This configuration is required for:
95
- 1. **Tailwind CSS scanning** - Ensures components are styled
96
- 2. **React context consistency** - Prevents "useUnifiedAuth must be used within a UnifiedAuthProvider" errors
97
- 3. **Router context availability** - Prevents "useNavigate() may be used only in the context of a <Router>" errors
98
-
99
- ```typescript
100
- // vite.config.ts
101
- import { defineConfig } from 'vite'
102
- import react from '@vitejs/plugin-react'
103
- import tailwindcss from '@tailwindcss/vite'
104
- import path from 'path'
105
-
106
- export default defineConfig({
107
- plugins: [
108
- react({
109
- // React Compiler for automatic optimizations (React 19+)
110
- babel: {
111
- plugins: ['babel-plugin-react-compiler'],
112
- },
113
- }),
114
- tailwindcss({
115
- // Only need to scan your app's source files
116
- // pace-core source files are automatically scanned via @source directives
117
- content: [
118
- './src/**/*.{js,ts,jsx,tsx}'
119
- ]
120
- })
121
- ],
122
- resolve: {
123
- alias: {
124
- "@": path.resolve(__dirname, "./src"),
125
- },
126
- // CRITICAL: Dedupe React and React Router to ensure single instances
127
- // This prevents Router context issues when pace-core uses react-router-dom
128
- dedupe: ['react', 'react-dom', 'react-router-dom']
129
- },
130
- // CRITICAL: Exclude pace-core from pre-bundling to prevent React context mismatches
131
- // Pre-bundling creates separate React instances, causing context errors
132
- optimizeDeps: {
133
- include: [
134
- 'react',
135
- 'react-dom',
136
- 'react/jsx-runtime',
137
- '@radix-ui/react-slot'
138
- ],
139
- // CRITICAL: Exclude pace-core from pre-bundling
140
- // This ensures pace-core uses the same React instance as your app
141
- // NOTE: react-router-dom should be INCLUDED, not excluded (excluding causes "module is not defined" errors)
142
- exclude: ['@jmruthers/pace-core']
143
- },
144
- server: {
145
- port: 3000,
146
- open: true,
147
- },
148
- build: {
149
- outDir: 'dist',
150
- sourcemap: true,
151
- },
152
- })
153
- ```
154
-
155
- **Fallback Configuration:** If the CSS-first approach doesn't work, you can explicitly include pace-core source files:
156
-
157
- ```typescript
158
- // vite.config.ts - Fallback configuration
159
- export default defineConfig({
160
- plugins: [
161
- react(),
162
- tailwindcss({
163
- content: [
164
- './src/**/*.{js,ts,jsx,tsx}',
165
- './node_modules/@jmruthers/pace-core/src/**/*.{js,ts,jsx,tsx}'
166
- ]
167
- })
168
- ],
169
- // ... rest of config
170
- })
171
- ```
172
-
173
- ### 4. Verify Installation
174
-
175
- Create a test component to ensure everything works:
176
-
177
- ```tsx
178
- // src/App.tsx
179
- import { Button, Card, Input } from '@jmruthers/pace-core';
180
-
181
- function App() {
182
- return (
183
- <div className="p-8 space-y-4">
184
- <h1 className="text-2xl font-bold text-main-900">PACE Core Test</h1>
185
-
186
- <Card className="p-4">
187
- <h2 className="text-lg font-semibold text-sec-800 mb-2">Components Test</h2>
188
- <div className="space-y-2">
189
- <Button variant="primary" className="bg-main-600 text-main-50">
190
- Primary Button
191
- </Button>
192
- <Button variant="secondary" className="bg-sec-500 text-main-50">
193
- Secondary Button
194
- </Button>
195
- <Input placeholder="Test input field" className="border-main-300" />
196
- </div>
197
- </Card>
198
- </div>
199
- );
200
- }
201
-
202
- export default App;
203
- ```
204
-
205
- **Expected Result:** You should see properly styled components with PACE Core's design system colors and typography.
206
-
207
- ## ⚠️ Critical Configuration Notes
208
-
209
- ### Why Source File Scanning is Required
210
-
211
- Pace-core v0.4.15+ includes source files in the published package because:
212
-
213
- - Tailwind v4 needs to scan original TypeScript/JSX files to detect utility classes
214
- - Compiled JavaScript files don't contain the class names Tailwind needs
215
- - Without proper scanning, only ~292 CSS rules are generated instead of 800+ needed
216
-
217
- ### Alternative Configuration (if source files don't work)
218
-
219
- If you're still having issues with component scanning:
220
-
221
- ```typescript
222
- // vite.config.ts
223
- import { defineConfig } from 'vite'
224
- import react from '@vitejs/plugin-react'
225
- import tailwindcss from '@tailwindcss/vite'
226
-
227
- export default defineConfig({
228
- plugins: [
229
- react(),
230
- tailwindcss({
231
- content: [
232
- './src/**/*.{js,ts,jsx,tsx}',
233
- // Try source files first
234
- './node_modules/@jmruthers/pace-core/src/**/*.{js,ts,jsx,tsx}',
235
- // Fallback: also scan dist files
236
- './node_modules/@jmruthers/pace-core/dist/**/*.{js,ts,jsx,tsx}'
237
- ]
238
- })
239
- ],
240
- })
241
- ```
242
-
243
- ### Legacy Configuration (v0.4.14 and below)
244
-
245
- For older versions, use this configuration:
246
-
247
- ```typescript
248
- // vite.config.ts
249
- export default defineConfig({
250
- plugins: [
251
- react(),
252
- tailwindcss({
253
- content: [
254
- './src/**/*.{js,ts,jsx,tsx}',
255
- './node_modules/@jmruthers/pace-core/**/*.{js,ts,jsx,tsx}'
256
- ]
257
- })
258
- ],
259
- })
260
- ```
261
-
262
- ## 🔍 Troubleshooting
263
-
264
- ### Issue: "useUnifiedAuth must be used within a UnifiedAuthProvider"
265
-
266
- **Cause**: Vite is pre-bundling `@jmruthers/pace-core`, creating separate React instances
267
-
268
- **Solution**:
269
- 1. Add to `vite.config.ts`:
270
- ```typescript
271
- optimizeDeps: {
272
- exclude: ['@jmruthers/pace-core', 'react-router-dom']
273
- }
274
- ```
275
- 2. Clear Vite cache: `rm -rf node_modules/.vite`
276
- 3. Restart dev server
277
-
278
- ### Issue: "useNavigate() may be used only in the context of a <Router> component"
279
-
280
- **Cause**: Incorrect provider nesting - BrowserRouter should wrap UnifiedAuthProvider
281
-
282
- **Solution**:
283
- 1. Ensure correct nesting order in `main.tsx`:
284
- ```tsx
285
- <QueryClientProvider>
286
- <BrowserRouter>
287
- <UnifiedAuthProvider>
288
- <OrganisationProvider>
289
- <App />
290
- </OrganisationProvider>
291
- </UnifiedAuthProvider>
292
- </BrowserRouter>
293
- </QueryClientProvider>
294
- ```
295
- 2. Do NOT put BrowserRouter inside UnifiedAuthProvider
296
- 3. Add to `vite.config.ts`:
297
- ```typescript
298
- resolve: {
299
- dedupe: ['react', 'react-dom', 'react-router-dom']
300
- }
301
- ```
302
-
303
- ### Issue: Only 292 CSS rules instead of 800+
304
-
305
- **Solution**:
306
- 1. Update to pace-core v0.4.15+
307
- 2. Use source file paths: `./node_modules/@jmruthers/pace-core/src/**/*.{js,ts,jsx,tsx}`
308
- 3. Clear build cache: `rm -rf dist .vite node_modules && npm install`
309
-
310
- ### Issue: Components appear unstyled
311
-
312
- **Solution**:
313
- 1. Check your Vite configuration includes pace-core source files
314
- 2. Ensure CSS file is imported: `import '@jmruthers/pace-core/src/styles/core.css'`
315
- 3. Restart dev server after configuration changes
316
-
317
- ### Issue: Build errors with source files
318
-
319
- **Solution**: Add TypeScript configuration for node_modules:
320
-
321
- ```json
322
- // tsconfig.json
323
- {
324
- "compilerOptions": {
325
- "skipLibCheck": true
326
- }
327
- }
8
+ npm install @jmruthers/pace-core
328
9
  ```
329
10
 
330
- ### Issue: "Access Denied" errors with valid permissions
331
-
332
- **Problem**: Users with valid permissions see "Access Denied" when loading pages with DataTable components.
333
-
334
- **Root Cause**: Race condition in permission checking - `useCan` hook was being called with invalid scopes before scope resolution completed.
335
-
336
- **Solution**: Fixed in v0.5.7+ - the `useCan` hook now properly handles invalid scopes and shows loading state until valid scope is available.
337
-
338
- **What was fixed**:
339
- - `useCan` hook skips API calls when `organisationId` is empty
340
- - `PagePermissionGuard` shows loading state during scope resolution
341
- - Eliminates race condition between scope resolution and permission checking
342
-
343
- **No action needed** - this is automatically fixed in v0.5.7+
344
-
345
- ## Features
346
-
347
- - 🎨 **Complete Design System** - Colors, typography, spacing, shadows
348
- - 🧩 **React Components** - Buttons, inputs, cards, data tables, and more
349
- - 🔐 **RBAC System** - Role-based access control with Supabase
350
- - 🎨 **Tailwind v4** - CSS-first approach with design tokens
351
- - 📱 **Responsive** - Mobile-first design patterns
352
- - ♿ **Accessible** - WCAG compliant components
353
- - 🚀 **Performance** - Tree-shakeable, optimized bundle
354
-
355
11
  ## Documentation
356
12
 
357
- - [Quick Start Guide](./docs/getting-started/quick-start.md) - Complete step-by-step tutorial
358
- - [Installation Guide](./docs/getting-started/installation.md) - Detailed setup instructions
359
- - [Vite Configuration](./docs/consuming-app-vite-config.md) - **CRITICAL** Tailwind scanning setup
360
- - [Component API](./docs/api/README.md) - All available components and hooks
361
- - [Styling Guide](./docs/styles/README.md) - Understanding the design system
362
- - [Troubleshooting](./docs/troubleshooting/styling-issues.md) - Fix common styling problems
363
- - [Tailwind Content Scanning](./docs/troubleshooting/tailwind-content-scanning.md) - **NEW** Comprehensive scanning solutions
364
-
365
- ## Import Strategy
366
-
367
- PACE Core provides two import paths to optimize for different use cases:
368
-
369
- ### Main Export (Recommended for Common Components)
370
-
371
- Use the main export for frequently used components and utilities:
372
-
373
- ```typescript
374
- import {
375
- Button,
376
- Card,
377
- Input,
378
- DropdownMenu,
379
- Select,
380
- Dialog,
381
- useUnifiedAuth
382
- } from '@jmruthers/pace-core';
383
- ```
384
-
385
- **Available from main export:**
386
- - **Basic UI**: Button, Card, Input, Textarea, Label, Alert, Avatar, Checkbox, Progress
387
- - **Advanced UI**: Dialog (with HTML content), DropdownMenu, Select, Toast, Tooltip, Tabs, Calendar
388
- - **Data Display**: DataTable (with hierarchical actions & expand/collapse all), Table
389
- - **Forms**: Form, LoginForm
390
- - **Layout**: PaceAppLayout, Header, Footer, NavigationMenu
391
- - **Providers**: UnifiedAuthProvider, OrganisationProvider, EventProvider
392
- - **Hooks**: useUnifiedAuth, useOrganisations, useEvents
393
-
394
- ### Component Documentation
395
-
396
- - **[DataTable Component](docs/implementation-guides/data-tables.md)** - Enterprise-grade data table with hierarchical rows, expand/collapse all, actions, sorting, filtering, and performance optimization
397
- - **[Hierarchical DataTable Guide](docs/implementation-guides/hierarchical-datatable.md)** - Complete guide for implementing parent/child rows with expand/collapse all and smart sorting
398
- - **[Dialog Component](src/components/Dialog/README.md)** - Comprehensive dialog system with smart height management, scrolling, HTML content rendering, and accessibility features
399
- - **[Storage System](src/utils/storage/README.md)** - File storage utilities with organization-scoped access control
400
-
401
- ### Complete Components Export (For Specialized Components)
402
-
403
- Use the complete export for specialized or advanced components:
404
-
405
- ```typescript
406
- import {
407
- DataTable,
408
- NavigationMenu,
409
- FormField
410
- } from '@jmruthers/pace-core/components';
411
- ```
13
+ See [Documentation](./docs/README.md) for complete setup and usage guides.
412
14
 
413
15
  ## License
414
16
 
415
- MIT License - see [LICENSE](./LICENSE) for details.
17
+ MIT License - see [LICENSE](./LICENSE) for details.
@@ -163,6 +163,7 @@
163
163
  "securityMonitor",
164
164
  "sanitizeUserInput",
165
165
  "sanitizeFormData",
166
+ "sanitizeHtml",
166
167
  "validateUserInput",
167
168
  "usernameSchema",
168
169
  "emailSchema",
@@ -194,6 +195,86 @@
194
195
  "formatDateTimeForTable",
195
196
  "formatDateTimeForMap"
196
197
  ],
198
+ "icons": [
199
+ "ChevronDown",
200
+ "ChevronUp",
201
+ "ChevronLeft",
202
+ "ChevronRight",
203
+ "ChevronsUp",
204
+ "ChevronsDown",
205
+ "ChevronsLeft",
206
+ "ChevronsRight",
207
+ "ChevronsUpDown",
208
+ "ArrowUp",
209
+ "ArrowDown",
210
+ "ArrowLeft",
211
+ "ArrowRight",
212
+ "ArrowUpDown",
213
+ "Edit",
214
+ "Trash",
215
+ "Trash2",
216
+ "Plus",
217
+ "Minus",
218
+ "X",
219
+ "Check",
220
+ "Copy",
221
+ "Save",
222
+ "Upload",
223
+ "Download",
224
+ "Search",
225
+ "Filter",
226
+ "Settings",
227
+ "Settings2",
228
+ "MoreHorizontal",
229
+ "MoreVertical",
230
+ "AlertCircle",
231
+ "AlertTriangle",
232
+ "CheckCircle",
233
+ "Info",
234
+ "ShieldX",
235
+ "Eye",
236
+ "EyeOff",
237
+ "Lock",
238
+ "Unlock",
239
+ "Clock",
240
+ "Calendar",
241
+ "Database",
242
+ "File",
243
+ "FileText",
244
+ "ExternalLink",
245
+ "User",
246
+ "Users",
247
+ "Group",
248
+ "Building2",
249
+ "RefreshCw",
250
+ "RotateCcw",
251
+ "RotateCw",
252
+ "LogOut",
253
+ "KeyRound",
254
+ "Menu",
255
+ "Home",
256
+ "Server",
257
+ "Zap",
258
+ "Globe",
259
+ "HardDrive",
260
+ "Image",
261
+ "Link",
262
+ "Mail",
263
+ "MapPin",
264
+ "Phone",
265
+ "PieChart",
266
+ "Play",
267
+ "Share",
268
+ "Star",
269
+ "Tag",
270
+ "Target",
271
+ "TrendingUp",
272
+ "Volume2",
273
+ "Wifi",
274
+ "Circle",
275
+ "ChevronRightIcon",
276
+ "ChevronDownIcon"
277
+ ],
197
278
  "restrictedImports": [
198
279
  {
199
280
  "module": "@radix-ui/react-avatar",
@@ -297,6 +378,18 @@
297
378
  },
298
379
  "importExample": "import { formatInTimeZone, toZonedTime, fromZonedTime, getUserTimeZone } from '@jmruthers/pace-core/utils/timezone';",
299
380
  "usageExample": "const formatted = formatInTimeZone(date, 'America/New_York', 'MMM dd, yyyy HH:mm');"
381
+ },
382
+ {
383
+ "module": "lucide-react",
384
+ "reason": "Import icons from '@jmruthers/pace-core/icons' instead of 'lucide-react' directly. pace-core provides a curated set of icons that are version-controlled and consistent across the PACE suite.",
385
+ "replacements": {
386
+ "ChevronDown": "ChevronDown (from '@jmruthers/pace-core/icons')",
387
+ "Edit": "Edit (from '@jmruthers/pace-core/icons')",
388
+ "Trash": "Trash (from '@jmruthers/pace-core/icons')",
389
+ "*": "All icons should be imported from '@jmruthers/pace-core/icons'"
390
+ },
391
+ "importExample": "import { ChevronDown, Edit, Trash, Plus, Search } from '@jmruthers/pace-core/icons';",
392
+ "usageExample": "<Button><ChevronDown className=\"w-4 h-4\" /> Click me</Button>"
300
393
  }
301
394
  ],
302
395
  "notes": [