@jmruthers/pace-core 0.6.5 → 0.6.7

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (473) hide show
  1. package/CHANGELOG.md +104 -0
  2. package/README.md +5 -403
  3. package/audit-tool/00-dependencies.cjs +394 -0
  4. package/audit-tool/audits/01-pace-core-compliance.cjs +556 -0
  5. package/audit-tool/audits/02-project-structure.cjs +255 -0
  6. package/audit-tool/audits/03-architecture.cjs +196 -0
  7. package/audit-tool/audits/04-code-quality.cjs +149 -0
  8. package/audit-tool/audits/05-styling.cjs +224 -0
  9. package/audit-tool/audits/06-security-rbac.cjs +544 -0
  10. package/audit-tool/audits/07-api-tech-stack.cjs +301 -0
  11. package/audit-tool/audits/08-testing-documentation.cjs +202 -0
  12. package/audit-tool/audits/09-operations.cjs +208 -0
  13. package/audit-tool/index.cjs +291 -0
  14. package/audit-tool/utils/code-utils.cjs +218 -0
  15. package/audit-tool/utils/file-utils.cjs +230 -0
  16. package/audit-tool/utils/report-utils.cjs +241 -0
  17. package/core-usage-manifest.json +93 -0
  18. package/cursor-rules/00-standards-overview.mdc +156 -0
  19. package/cursor-rules/01-pace-core-compliance.mdc +586 -0
  20. package/cursor-rules/02-project-structure.mdc +42 -4
  21. package/cursor-rules/{03-solid-principles.mdc → 03-architecture.mdc} +126 -10
  22. package/cursor-rules/04-code-quality.mdc +419 -0
  23. package/cursor-rules/{08-markup-quality.mdc → 05-styling.mdc} +104 -34
  24. package/cursor-rules/06-security-rbac.mdc +518 -0
  25. package/cursor-rules/07-api-tech-stack.mdc +377 -0
  26. package/cursor-rules/08-testing-documentation.mdc +324 -0
  27. package/cursor-rules/09-operations.mdc +365 -0
  28. package/dist/{AuthService-Cb34EQs3.d.ts → AuthService-DmfO5rGS.d.ts} +10 -0
  29. package/dist/DataTable-7PMH7XN7.js +15 -0
  30. package/dist/{DataTable-BMRU8a1j.d.ts → DataTable-DRUIgtUH.d.ts} +1 -1
  31. package/dist/{PublicPageProvider-QTFVrL-Z.d.ts → PublicPageProvider-DlsCaR5v.d.ts} +33 -72
  32. package/dist/UnifiedAuthProvider-ZT6TIGM7.js +7 -0
  33. package/dist/api-Y4MQWOFW.js +4 -0
  34. package/dist/audit-MYQXYZFU.js +3 -0
  35. package/dist/{chunk-DGUM43GV.js → chunk-3RG5ZIWI.js} +1 -4
  36. package/dist/{chunk-QXHPKYJV.js → chunk-4SXLQIZO.js} +1 -26
  37. package/dist/{chunk-UPPMRMYG.js → chunk-5X4QLXRG.js} +73 -151
  38. package/dist/chunk-6F3IILHI.js +62 -0
  39. package/dist/{chunk-E66EQZE6.js → chunk-6GLLNA6U.js} +3 -9
  40. package/dist/{chunk-ZSAAAMVR.js → chunk-6QYDGKQY.js} +1 -4
  41. package/dist/{chunk-FMUCXFII.js → chunk-7ILTDCL2.js} +9 -5
  42. package/dist/{chunk-M43Y4SSO.js → chunk-A3W6LW53.js} +15 -13
  43. package/dist/{chunk-63FOKYGO.js → chunk-AHU7G2R5.js} +2 -11
  44. package/dist/{chunk-HU2C6SSC.js → chunk-BM4CQ5P3.js} +606 -559
  45. package/dist/chunk-C7NSAPTL.js +1 -0
  46. package/dist/{chunk-J36DSWQK.js → chunk-FEJLJNWA.js} +7 -41
  47. package/dist/{chunk-IHB5DR3H.js → chunk-FTCRZOG2.js} +188 -387
  48. package/dist/{chunk-G37KK66H.js → chunk-FYHN4DD5.js} +60 -19
  49. package/dist/chunk-GHYHJTYV.js +994 -0
  50. package/dist/{chunk-VBXEHIUJ.js → chunk-HF6O3O37.js} +6 -88
  51. package/dist/{chunk-FFQEQTNW.js → chunk-IUBRCBSY.js} +134 -45
  52. package/dist/{chunk-6COVEUS7.js → chunk-JGWDVX64.js} +983 -1034
  53. package/dist/{chunk-RGAWHO7N.js → chunk-L4XMVJKY.js} +77 -222
  54. package/dist/chunk-MBADTM7L.js +64 -0
  55. package/dist/{chunk-M7MPQISP.js → chunk-OJ4SKRSV.js} +3 -16
  56. package/dist/{chunk-IVOFDYWT.js → chunk-Q7Q7V5NV.js} +2109 -1604
  57. package/dist/{chunk-JGRYX5UX.js → chunk-S7DKJPLT.js} +29 -58
  58. package/dist/{chunk-PWLANIRT.js → chunk-TTRFSOKR.js} +1 -7
  59. package/dist/{chunk-5DRSZLL2.js → chunk-UH3NTO3F.js} +1 -6
  60. package/dist/{chunk-NTM7ZSB6.js → chunk-VBCS3DUA.js} +261 -168
  61. package/dist/{chunk-EFN2EIMK.js → chunk-ZFYPMX46.js} +271 -87
  62. package/dist/{chunk-L4OXEN46.js → chunk-ZKAWKYT4.js} +10 -24
  63. package/dist/components.d.ts +7 -5
  64. package/dist/components.js +46 -257
  65. package/dist/{database.generated-CzIvgcPu.d.ts → database.generated-CcnC_DRc.d.ts} +4795 -3691
  66. package/dist/eslint-rules/index.cjs +35 -0
  67. package/{src/eslint-rules/pace-core-compliance.cjs → dist/eslint-rules/rules/01-pace-core-compliance.cjs} +234 -235
  68. package/dist/eslint-rules/rules/04-code-quality.cjs +290 -0
  69. package/dist/eslint-rules/rules/05-styling.cjs +61 -0
  70. package/dist/eslint-rules/rules/06-security-rbac.cjs +806 -0
  71. package/dist/eslint-rules/rules/07-api-tech-stack.cjs +263 -0
  72. package/dist/eslint-rules/rules/08-testing.cjs +94 -0
  73. package/dist/eslint-rules/utils/helpers.cjs +42 -0
  74. package/dist/eslint-rules/utils/manifest-loader.cjs +75 -0
  75. package/dist/hooks.d.ts +6 -6
  76. package/dist/hooks.js +62 -172
  77. package/dist/icons/index.d.ts +1 -0
  78. package/dist/icons/index.js +1 -0
  79. package/dist/index.d.ts +12 -11
  80. package/dist/index.js +67 -660
  81. package/dist/providers.d.ts +2 -2
  82. package/dist/providers.js +8 -35
  83. package/dist/rbac/eslint-rules.d.ts +46 -44
  84. package/dist/rbac/eslint-rules.js +7 -4
  85. package/dist/rbac/index.d.ts +109 -586
  86. package/dist/rbac/index.js +14 -207
  87. package/dist/styles/index.js +2 -12
  88. package/dist/theming/runtime.d.ts +14 -1
  89. package/dist/theming/runtime.js +3 -19
  90. package/dist/{timezone-CHhWg6b4.d.ts → timezone-BZe_eUxx.d.ts} +175 -1
  91. package/dist/{types-CkbwOr4Y.d.ts → types-DXstZpNI.d.ts} +4 -17
  92. package/dist/types-t9H8qKRw.d.ts +55 -0
  93. package/dist/types.d.ts +1 -1
  94. package/dist/types.js +7 -94
  95. package/dist/{usePublicRouteParams-ClnV4tnv.d.ts → usePublicRouteParams-MamNgwqe.d.ts} +20 -20
  96. package/dist/utils.d.ts +24 -117
  97. package/dist/utils.js +54 -392
  98. package/docs/README.md +17 -7
  99. package/docs/api/README.md +4 -402
  100. package/docs/api/modules.md +301 -871
  101. package/docs/api-reference/components.md +21 -21
  102. package/docs/api-reference/deprecated.md +31 -6
  103. package/docs/api-reference/hooks.md +80 -80
  104. package/docs/api-reference/rpc-functions.md +78 -3
  105. package/docs/api-reference/types.md +1 -1
  106. package/docs/api-reference/utilities.md +1 -1
  107. package/docs/architecture/README.md +1 -1
  108. package/docs/core-concepts/events.md +3 -3
  109. package/docs/core-concepts/organisations.md +6 -6
  110. package/docs/core-concepts/permissions.md +6 -6
  111. package/docs/documentation-index.md +12 -18
  112. package/docs/getting-started/cursor-rules.md +3 -23
  113. package/docs/getting-started/dependencies.md +650 -0
  114. package/docs/getting-started/documentation-index.md +1 -1
  115. package/docs/getting-started/examples/README.md +4 -4
  116. package/docs/getting-started/examples/full-featured-app.md +1 -1
  117. package/docs/getting-started/faq.md +2 -2
  118. package/docs/getting-started/installation-guide.md +20 -7
  119. package/docs/getting-started/quick-reference.md +4 -4
  120. package/docs/getting-started/quick-start.md +23 -12
  121. package/docs/implementation-guides/authentication.md +15 -15
  122. package/docs/implementation-guides/component-styling.md +1 -1
  123. package/docs/implementation-guides/data-tables.md +126 -33
  124. package/docs/implementation-guides/datatable-rbac-usage.md +1 -1
  125. package/docs/implementation-guides/dynamic-colors.md +3 -3
  126. package/docs/implementation-guides/file-upload-storage.md +2 -2
  127. package/docs/implementation-guides/hierarchical-datatable.md +40 -60
  128. package/docs/implementation-guides/inactivity-tracking.md +3 -3
  129. package/docs/implementation-guides/large-datasets.md +3 -2
  130. package/docs/implementation-guides/organisation-security.md +2 -2
  131. package/docs/implementation-guides/performance.md +2 -2
  132. package/docs/implementation-guides/permission-enforcement.md +5 -1
  133. package/docs/migration/V0.3.44_organisation-context-timing-fix.md +1 -1
  134. package/docs/migration/V0.4.0_rbac-migration.md +6 -6
  135. package/docs/rbac/MIGRATION_GUIDE.md +819 -0
  136. package/docs/rbac/RBAC_CONTRACT.md +724 -0
  137. package/docs/rbac/README.md +17 -8
  138. package/docs/rbac/advanced-patterns.md +6 -6
  139. package/docs/rbac/api-reference.md +20 -20
  140. package/docs/rbac/edge-functions-guide.md +376 -0
  141. package/docs/rbac/event-based-apps.md +3 -3
  142. package/docs/rbac/examples.md +41 -41
  143. package/docs/rbac/getting-started.md +37 -37
  144. package/docs/rbac/performance.md +1 -1
  145. package/docs/rbac/quick-start.md +52 -52
  146. package/docs/rbac/secure-client-protection.md +1 -35
  147. package/docs/rbac/troubleshooting.md +1 -1
  148. package/docs/security/README.md +5 -5
  149. package/docs/standards/0-standards-overview.md +220 -0
  150. package/docs/standards/1-pace-core-compliance-standards.md +986 -0
  151. package/docs/standards/2-project-structure-standards.md +949 -0
  152. package/docs/standards/3-architecture-standards.md +606 -0
  153. package/docs/standards/4-code-quality-standards.md +728 -0
  154. package/docs/standards/5-styling-standards.md +348 -0
  155. package/docs/standards/{07-rbac-and-rls-standard.md → 6-security-rbac-standards.md} +269 -66
  156. package/docs/standards/7-api-tech-stack-standards.md +662 -0
  157. package/docs/standards/8-testing-documentation-standards.md +401 -0
  158. package/docs/standards/9-operations-standards.md +1102 -0
  159. package/docs/standards/README.md +185 -57
  160. package/docs/troubleshooting/README.md +4 -4
  161. package/docs/troubleshooting/common-issues.md +2 -2
  162. package/docs/troubleshooting/debugging.md +9 -9
  163. package/docs/troubleshooting/migration.md +4 -4
  164. package/docs/troubleshooting/organisation-context-setup.md +42 -19
  165. package/eslint-config-pace-core.cjs +33 -6
  166. package/package.json +35 -23
  167. package/scripts/install-cursor-rules.cjs +25 -6
  168. package/scripts/install-eslint-config.cjs +284 -0
  169. package/src/__tests__/fixtures/supabase.ts +1 -1
  170. package/src/__tests__/helpers/__tests__/component-test-utils.test.tsx +3 -3
  171. package/src/__tests__/helpers/__tests__/optimized-test-setup.test.ts +1 -1
  172. package/src/__tests__/helpers/__tests__/supabaseMock.test.ts +1 -1
  173. package/src/__tests__/helpers/__tests__/test-providers.test.tsx +2 -2
  174. package/src/__tests__/helpers/__tests__/test-utils.test.tsx +13 -13
  175. package/src/__tests__/helpers/component-test-utils.tsx +1 -1
  176. package/src/__tests__/helpers/supabaseMock.ts +2 -2
  177. package/src/__tests__/integration/UserProfile.test.tsx +14 -14
  178. package/src/__tests__/public-recipe-view.test.ts +38 -9
  179. package/src/__tests__/rbac/PagePermissionGuard.test.tsx +6 -6
  180. package/src/__tests__/templates/accessibility.test.template.tsx +9 -9
  181. package/src/__tests__/templates/component.test.template.tsx +18 -15
  182. package/src/components/Button/Button.tsx +5 -1
  183. package/src/components/Calendar/Calendar.tsx +201 -47
  184. package/src/components/ContextSelector/ContextSelector.tsx +106 -119
  185. package/src/components/DataTable/AUDIT_REPORT.md +293 -0
  186. package/src/components/DataTable/__tests__/DataTableCore.test.tsx +10 -2
  187. package/src/components/DataTable/__tests__/a11y.basic.test.tsx +10 -4
  188. package/src/components/DataTable/__tests__/test-utils/sharedTestUtils.tsx +9 -9
  189. package/src/components/DataTable/components/ColumnFilter.tsx +63 -74
  190. package/src/components/DataTable/components/ColumnVisibilityDropdown.tsx +43 -41
  191. package/src/components/DataTable/components/DataTableCore.tsx +186 -13
  192. package/src/components/DataTable/components/DataTableErrorBoundary.tsx +9 -11
  193. package/src/components/DataTable/components/DataTableLayout.tsx +35 -21
  194. package/src/components/DataTable/components/EditFields.tsx +23 -3
  195. package/src/components/DataTable/components/EditableRow.tsx +12 -9
  196. package/src/components/DataTable/components/EmptyState.tsx +10 -9
  197. package/src/components/DataTable/components/FilterRow.tsx +2 -4
  198. package/src/components/DataTable/components/ImportModal.tsx +124 -126
  199. package/src/components/DataTable/components/LoadingState.tsx +5 -6
  200. package/src/components/DataTable/components/RowComponent.tsx +12 -0
  201. package/src/components/DataTable/components/SortIndicator.tsx +50 -0
  202. package/src/components/DataTable/components/__tests__/COVERAGE_NOTE.md +4 -4
  203. package/src/components/DataTable/components/__tests__/ColumnFilter.test.tsx +23 -82
  204. package/src/components/DataTable/components/__tests__/DataTableErrorBoundary.test.tsx +37 -9
  205. package/src/components/DataTable/components/__tests__/EmptyState.test.tsx +7 -4
  206. package/src/components/DataTable/components/__tests__/FilterRow.test.tsx +12 -4
  207. package/src/components/DataTable/components/__tests__/LoadingState.test.tsx +41 -27
  208. package/src/components/DataTable/components/hooks/usePermissionTracking.ts +0 -4
  209. package/src/components/DataTable/components/index.ts +2 -1
  210. package/src/components/DataTable/hooks/__tests__/useDataTableState.test.ts +51 -47
  211. package/src/components/DataTable/hooks/useDataTablePermissions.ts +24 -21
  212. package/src/components/DataTable/hooks/useDataTableState.ts +125 -9
  213. package/src/components/DataTable/hooks/useTableColumns.ts +40 -2
  214. package/src/components/DataTable/hooks/useTableHandlers.ts +11 -0
  215. package/src/components/DataTable/types.ts +5 -18
  216. package/src/components/DataTable/utils/a11yUtils.ts +17 -0
  217. package/src/components/DatePickerWithTimezone/DatePickerWithTimezone.test.tsx +2 -1
  218. package/src/components/DatePickerWithTimezone/DatePickerWithTimezone.tsx +11 -15
  219. package/src/components/DateTimeField/DateTimeField.tsx +10 -9
  220. package/src/components/Dialog/Dialog.test.tsx +128 -104
  221. package/src/components/Dialog/Dialog.tsx +742 -24
  222. package/src/components/ErrorBoundary/ErrorBoundary.tsx +77 -79
  223. package/src/components/FileDisplay/FileDisplay.test.tsx +4 -2
  224. package/src/components/FileDisplay/FileDisplay.tsx +23 -17
  225. package/src/components/FileUpload/FileUpload.test.tsx +52 -14
  226. package/src/components/FileUpload/FileUpload.tsx +112 -130
  227. package/src/components/Form/Form.test.tsx +6 -8
  228. package/src/components/Form/Form.tsx +365 -4
  229. package/src/components/NavigationMenu/NavigationMenu.test.tsx +14 -13
  230. package/src/components/NavigationMenu/useNavigationFiltering.ts +11 -21
  231. package/src/components/PaceAppLayout/PaceAppLayout.test.tsx +6 -4
  232. package/src/components/PaceAppLayout/PaceAppLayout.tsx +11 -15
  233. package/src/components/PaceLoginPage/PaceLoginPage.test.tsx +108 -61
  234. package/src/components/PaceLoginPage/PaceLoginPage.tsx +27 -3
  235. package/src/components/Progress/Progress.tsx +2 -4
  236. package/src/components/ProtectedRoute/ProtectedRoute.tsx +8 -8
  237. package/src/components/Select/Select.tsx +109 -98
  238. package/src/components/Select/types.ts +4 -1
  239. package/src/components/UserMenu/UserMenu.tsx +9 -6
  240. package/src/hooks/__tests__/ServiceHooks.test.tsx +16 -16
  241. package/src/hooks/__tests__/hooks.integration.test.tsx +55 -57
  242. package/src/hooks/__tests__/useAppConfig.unit.test.ts +129 -67
  243. package/src/hooks/__tests__/useFocusTrap.unit.test.tsx +97 -97
  244. package/src/hooks/__tests__/usePublicEvent.simple.test.ts +149 -67
  245. package/src/hooks/__tests__/usePublicEvent.test.ts +149 -79
  246. package/src/hooks/__tests__/usePublicEvent.unit.test.ts +158 -109
  247. package/src/hooks/__tests__/useSessionDraft.test.ts +163 -0
  248. package/src/hooks/__tests__/useSessionRestoration.unit.test.tsx +10 -5
  249. package/src/hooks/public/usePublicEvent.ts +67 -195
  250. package/src/hooks/public/usePublicEventLogo.test.ts +70 -17
  251. package/src/hooks/public/usePublicEventLogo.ts +24 -14
  252. package/src/hooks/public/usePublicFileDisplay.ts +2 -2
  253. package/src/hooks/public/usePublicRouteParams.ts +5 -5
  254. package/src/hooks/useAppConfig.ts +28 -26
  255. package/src/hooks/useEventTheme.test.ts +217 -239
  256. package/src/hooks/useEventTheme.ts +16 -28
  257. package/src/hooks/useFileDisplay.ts +2 -2
  258. package/src/hooks/useOrganisationPermissions.ts +5 -7
  259. package/src/hooks/useQueryCache.ts +0 -1
  260. package/src/hooks/useSessionDraft.ts +380 -0
  261. package/src/hooks/useSessionRestoration.ts +3 -1
  262. package/src/icons/index.ts +27 -0
  263. package/src/index.ts +5 -0
  264. package/src/providers/OrganisationProvider.tsx +23 -14
  265. package/src/providers/UnifiedAuthProvider.smoke.test.tsx +21 -21
  266. package/src/providers/__tests__/AuthProvider.test.tsx +21 -21
  267. package/src/providers/__tests__/EventProvider.test.tsx +61 -61
  268. package/src/providers/__tests__/InactivityProvider.test.tsx +56 -56
  269. package/src/providers/__tests__/OrganisationProvider.test.tsx +75 -75
  270. package/src/providers/__tests__/ProviderLifecycle.test.tsx +37 -37
  271. package/src/providers/__tests__/UnifiedAuthProvider.test.tsx +103 -103
  272. package/src/providers/services/EventServiceProvider.tsx +1 -24
  273. package/src/providers/services/UnifiedAuthProvider.tsx +5 -48
  274. package/src/providers/services/__tests__/AuthServiceProvider.integration.test.tsx +7 -7
  275. package/src/providers/services/__tests__/UnifiedAuthProvider.integration.test.tsx +13 -10
  276. package/src/rbac/__tests__/adapters.comprehensive.test.tsx +7 -457
  277. package/src/rbac/__tests__/auth-rbac.e2e.test.tsx +33 -7
  278. package/src/rbac/adapters.tsx +7 -295
  279. package/src/rbac/api.test.ts +44 -56
  280. package/src/rbac/api.ts +10 -17
  281. package/src/rbac/cache-invalidation.ts +0 -1
  282. package/src/rbac/compliance/index.ts +10 -0
  283. package/src/rbac/compliance/pattern-detector.ts +553 -0
  284. package/src/rbac/compliance/runtime-compliance.ts +22 -0
  285. package/src/rbac/components/AccessDenied.tsx +150 -0
  286. package/src/rbac/components/NavigationGuard.tsx +12 -20
  287. package/src/rbac/components/PagePermissionGuard.tsx +4 -24
  288. package/src/rbac/components/__tests__/NavigationGuard.test.tsx +21 -8
  289. package/src/rbac/components/index.ts +3 -41
  290. package/src/rbac/eslint-rules.js +1 -1
  291. package/src/rbac/hooks/index.ts +0 -3
  292. package/src/rbac/hooks/permissions/index.ts +0 -3
  293. package/src/rbac/hooks/permissions/useAccessLevel.ts +4 -8
  294. package/src/rbac/hooks/usePermissions.ts +0 -3
  295. package/src/rbac/hooks/useResolvedScope.test.ts +57 -47
  296. package/src/rbac/hooks/useResolvedScope.ts +58 -140
  297. package/src/rbac/hooks/useResourcePermissions.test.ts +124 -38
  298. package/src/rbac/hooks/useResourcePermissions.ts +139 -48
  299. package/src/rbac/hooks/useRoleManagement.test.ts +65 -22
  300. package/src/rbac/hooks/useRoleManagement.ts +147 -19
  301. package/src/rbac/hooks/useSecureSupabase.ts +4 -8
  302. package/src/rbac/index.ts +7 -9
  303. package/src/rbac/utils/contextValidator.ts +9 -7
  304. package/src/services/AuthService.ts +130 -18
  305. package/src/services/EventService.ts +4 -97
  306. package/src/services/InactivityService.ts +16 -0
  307. package/src/services/OrganisationService.ts +7 -44
  308. package/src/services/__tests__/OrganisationService.test.ts +26 -8
  309. package/src/services/base/BaseService.ts +0 -3
  310. package/src/styles/core.css +7 -0
  311. package/src/theming/__tests__/parseEventColours.test.ts +9 -3
  312. package/src/theming/parseEventColours.ts +22 -10
  313. package/src/types/database.generated.ts +4733 -3809
  314. package/src/utils/__tests__/lazyLoad.unit.test.tsx +42 -39
  315. package/src/utils/__tests__/organisationContext.unit.test.ts +9 -10
  316. package/src/utils/context/organisationContext.test.ts +13 -28
  317. package/src/utils/context/organisationContext.ts +21 -52
  318. package/src/utils/dynamic/dynamicUtils.ts +1 -1
  319. package/src/utils/file-reference/index.ts +39 -15
  320. package/src/utils/formatting/formatDateTime.test.ts +3 -2
  321. package/src/utils/google-places/loadGoogleMapsScript.ts +29 -4
  322. package/src/utils/index.ts +4 -1
  323. package/src/utils/persistence/__tests__/keyDerivation.test.ts +135 -0
  324. package/src/utils/persistence/__tests__/sensitiveFieldDetection.test.ts +123 -0
  325. package/src/utils/persistence/keyDerivation.ts +304 -0
  326. package/src/utils/persistence/sensitiveFieldDetection.ts +212 -0
  327. package/src/utils/security/secureStorage.ts +5 -5
  328. package/src/utils/storage/README.md +1 -1
  329. package/src/utils/storage/helpers.ts +3 -3
  330. package/src/utils/supabase/createBaseClient.ts +147 -0
  331. package/src/utils/timezone/timezone.test.ts +1 -2
  332. package/src/utils/timezone/timezone.ts +1 -1
  333. package/src/utils/validation/csrf.ts +4 -4
  334. package/cursor-rules/00-pace-core-compliance.mdc +0 -331
  335. package/cursor-rules/01-standards-compliance.mdc +0 -244
  336. package/cursor-rules/04-testing-standards.mdc +0 -268
  337. package/cursor-rules/05-bug-reports-and-features.mdc +0 -246
  338. package/cursor-rules/06-code-quality.mdc +0 -309
  339. package/cursor-rules/07-tech-stack-compliance.mdc +0 -214
  340. package/cursor-rules/CHANGELOG.md +0 -119
  341. package/cursor-rules/README.md +0 -192
  342. package/dist/DataTable-AOVNCPTX.js +0 -175
  343. package/dist/DataTable-AOVNCPTX.js.map +0 -1
  344. package/dist/UnifiedAuthProvider-4SBX4LU5.js +0 -18
  345. package/dist/UnifiedAuthProvider-4SBX4LU5.js.map +0 -1
  346. package/dist/api-O6HTBX5Y.js +0 -52
  347. package/dist/api-O6HTBX5Y.js.map +0 -1
  348. package/dist/audit-V53FV5AG.js +0 -17
  349. package/dist/audit-V53FV5AG.js.map +0 -1
  350. package/dist/chunk-5DRSZLL2.js.map +0 -1
  351. package/dist/chunk-63FOKYGO.js.map +0 -1
  352. package/dist/chunk-6COVEUS7.js.map +0 -1
  353. package/dist/chunk-AFVQODI2.js +0 -263
  354. package/dist/chunk-AFVQODI2.js.map +0 -1
  355. package/dist/chunk-DGUM43GV.js.map +0 -1
  356. package/dist/chunk-E66EQZE6.js.map +0 -1
  357. package/dist/chunk-EFN2EIMK.js.map +0 -1
  358. package/dist/chunk-FFQEQTNW.js.map +0 -1
  359. package/dist/chunk-FMUCXFII.js.map +0 -1
  360. package/dist/chunk-G37KK66H.js.map +0 -1
  361. package/dist/chunk-G7QEZTYQ.js +0 -2053
  362. package/dist/chunk-G7QEZTYQ.js.map +0 -1
  363. package/dist/chunk-HU2C6SSC.js.map +0 -1
  364. package/dist/chunk-IHB5DR3H.js.map +0 -1
  365. package/dist/chunk-IVOFDYWT.js.map +0 -1
  366. package/dist/chunk-J36DSWQK.js.map +0 -1
  367. package/dist/chunk-JGRYX5UX.js.map +0 -1
  368. package/dist/chunk-KQCRWDSA.js +0 -1
  369. package/dist/chunk-KQCRWDSA.js.map +0 -1
  370. package/dist/chunk-L4OXEN46.js.map +0 -1
  371. package/dist/chunk-LMC26NLJ.js +0 -84
  372. package/dist/chunk-LMC26NLJ.js.map +0 -1
  373. package/dist/chunk-M43Y4SSO.js.map +0 -1
  374. package/dist/chunk-M7MPQISP.js.map +0 -1
  375. package/dist/chunk-NTM7ZSB6.js.map +0 -1
  376. package/dist/chunk-PWLANIRT.js.map +0 -1
  377. package/dist/chunk-QXHPKYJV.js.map +0 -1
  378. package/dist/chunk-RGAWHO7N.js.map +0 -1
  379. package/dist/chunk-UPPMRMYG.js.map +0 -1
  380. package/dist/chunk-VBXEHIUJ.js.map +0 -1
  381. package/dist/chunk-ZSAAAMVR.js.map +0 -1
  382. package/dist/components.js.map +0 -1
  383. package/dist/contextValidator-5OGXSPKS.js +0 -9
  384. package/dist/contextValidator-5OGXSPKS.js.map +0 -1
  385. package/dist/eslint-rules/pace-core-compliance.cjs +0 -510
  386. package/dist/hooks.js.map +0 -1
  387. package/dist/index.js.map +0 -1
  388. package/dist/providers.js.map +0 -1
  389. package/dist/rbac/eslint-rules.js.map +0 -1
  390. package/dist/rbac/index.js.map +0 -1
  391. package/dist/styles/index.js.map +0 -1
  392. package/dist/theming/runtime.js.map +0 -1
  393. package/dist/types.js.map +0 -1
  394. package/dist/utils.js.map +0 -1
  395. package/docs/best-practices/README.md +0 -472
  396. package/docs/best-practices/accessibility.md +0 -601
  397. package/docs/best-practices/common-patterns.md +0 -516
  398. package/docs/best-practices/deployment.md +0 -1103
  399. package/docs/best-practices/performance.md +0 -1328
  400. package/docs/best-practices/security.md +0 -940
  401. package/docs/best-practices/testing.md +0 -1034
  402. package/docs/rbac/compliance/compliance-guide.md +0 -544
  403. package/docs/standards/01-architecture-standard.md +0 -44
  404. package/docs/standards/02-api-and-rpc-standard.md +0 -39
  405. package/docs/standards/03-component-standard.md +0 -32
  406. package/docs/standards/04-code-style-standard.md +0 -32
  407. package/docs/standards/05-security-standard.md +0 -44
  408. package/docs/standards/06-testing-and-docs-standard.md +0 -29
  409. package/docs/standards/pace-core-compliance.md +0 -432
  410. package/scripts/audit/core/checks/accessibility.cjs +0 -197
  411. package/scripts/audit/core/checks/api-usage.cjs +0 -191
  412. package/scripts/audit/core/checks/bundle.cjs +0 -142
  413. package/scripts/audit/core/checks/compliance.cjs +0 -2706
  414. package/scripts/audit/core/checks/config.cjs +0 -54
  415. package/scripts/audit/core/checks/coverage.cjs +0 -84
  416. package/scripts/audit/core/checks/dependencies.cjs +0 -994
  417. package/scripts/audit/core/checks/documentation.cjs +0 -268
  418. package/scripts/audit/core/checks/environment.cjs +0 -116
  419. package/scripts/audit/core/checks/error-handling.cjs +0 -340
  420. package/scripts/audit/core/checks/forms.cjs +0 -172
  421. package/scripts/audit/core/checks/heuristics.cjs +0 -68
  422. package/scripts/audit/core/checks/hooks.cjs +0 -334
  423. package/scripts/audit/core/checks/imports.cjs +0 -244
  424. package/scripts/audit/core/checks/performance.cjs +0 -325
  425. package/scripts/audit/core/checks/routes.cjs +0 -117
  426. package/scripts/audit/core/checks/state.cjs +0 -130
  427. package/scripts/audit/core/checks/structure.cjs +0 -65
  428. package/scripts/audit/core/checks/style.cjs +0 -584
  429. package/scripts/audit/core/checks/testing.cjs +0 -122
  430. package/scripts/audit/core/checks/typescript.cjs +0 -61
  431. package/scripts/audit/core/scanner.cjs +0 -199
  432. package/scripts/audit/core/utils.cjs +0 -137
  433. package/scripts/audit/index.cjs +0 -223
  434. package/scripts/audit/reporters/console.cjs +0 -151
  435. package/scripts/audit/reporters/json.cjs +0 -54
  436. package/scripts/audit/reporters/markdown.cjs +0 -124
  437. package/scripts/audit-consuming-app.cjs +0 -86
  438. package/src/components/DataTable/components/DataTableBody.tsx +0 -454
  439. package/src/components/DataTable/components/DraggableColumnHeader.tsx +0 -156
  440. package/src/components/DataTable/components/ExpandButton.tsx +0 -113
  441. package/src/components/DataTable/components/GroupHeader.tsx +0 -54
  442. package/src/components/DataTable/components/ViewRowModal.tsx +0 -68
  443. package/src/components/DataTable/components/VirtualizedDataTable.tsx +0 -525
  444. package/src/components/DataTable/components/__tests__/ExpandButton.test.tsx +0 -462
  445. package/src/components/DataTable/components/__tests__/GroupHeader.test.tsx +0 -393
  446. package/src/components/DataTable/components/__tests__/ViewRowModal.test.tsx +0 -476
  447. package/src/components/DataTable/components/__tests__/VirtualizedDataTable.test.tsx +0 -128
  448. package/src/components/DataTable/core/DataTableContext.tsx +0 -216
  449. package/src/components/DataTable/core/__tests__/DataTableContext.test.tsx +0 -136
  450. package/src/components/DataTable/hooks/__tests__/useColumnReordering.test.ts +0 -570
  451. package/src/components/DataTable/hooks/useColumnReordering.ts +0 -123
  452. package/src/components/DataTable/utils/debugTools.ts +0 -514
  453. package/src/eslint-rules/pace-core-compliance.js +0 -638
  454. package/src/rbac/components/EnhancedNavigationMenu.test.tsx +0 -555
  455. package/src/rbac/components/EnhancedNavigationMenu.tsx +0 -293
  456. package/src/rbac/components/NavigationProvider.test.tsx +0 -481
  457. package/src/rbac/components/NavigationProvider.tsx +0 -345
  458. package/src/rbac/components/PagePermissionProvider.test.tsx +0 -476
  459. package/src/rbac/components/PagePermissionProvider.tsx +0 -279
  460. package/src/rbac/components/PermissionEnforcer.tsx +0 -312
  461. package/src/rbac/components/RoleBasedRouter.tsx +0 -440
  462. package/src/rbac/components/SecureDataProvider.test.tsx +0 -543
  463. package/src/rbac/components/SecureDataProvider.tsx +0 -339
  464. package/src/rbac/components/__tests__/EnhancedNavigationMenu.test.tsx +0 -620
  465. package/src/rbac/components/__tests__/NavigationProvider.test.tsx +0 -726
  466. package/src/rbac/components/__tests__/PagePermissionProvider.test.tsx +0 -661
  467. package/src/rbac/components/__tests__/PermissionEnforcer.test.tsx +0 -881
  468. package/src/rbac/components/__tests__/RoleBasedRouter.test.tsx +0 -783
  469. package/src/rbac/components/__tests__/SecureDataProvider.fixed.test.tsx +0 -645
  470. package/src/rbac/components/__tests__/SecureDataProvider.test.tsx +0 -659
  471. package/src/rbac/hooks/permissions/useCachedPermissions.ts +0 -79
  472. package/src/rbac/hooks/permissions/useHasAllPermissions.ts +0 -90
  473. package/src/rbac/hooks/permissions/useHasAnyPermission.ts +0 -90
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.