@jmruthers/pace-core 0.5.193 → 0.6.2

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 (577) hide show
  1. package/CHANGELOG.md +62 -0
  2. package/README.md +7 -1
  3. package/cursor-rules/00-pace-core-compliance.mdc +299 -0
  4. package/cursor-rules/01-standards-compliance.mdc +244 -0
  5. package/cursor-rules/02-project-structure.mdc +200 -0
  6. package/cursor-rules/03-solid-principles.mdc +222 -0
  7. package/cursor-rules/04-testing-standards.mdc +268 -0
  8. package/cursor-rules/05-bug-reports-and-features.mdc +246 -0
  9. package/cursor-rules/06-code-quality.mdc +309 -0
  10. package/cursor-rules/07-tech-stack-compliance.mdc +214 -0
  11. package/cursor-rules/08-markup-quality.mdc +452 -0
  12. package/cursor-rules/CHANGELOG.md +119 -0
  13. package/cursor-rules/README.md +192 -0
  14. package/dist/{AuthService-DjnJHDtC.d.ts → AuthService-BPvc3Ka0.d.ts} +54 -0
  15. package/dist/{DataTable-Be6dH_dR.d.ts → DataTable-BMRU8a1j.d.ts} +34 -2
  16. package/dist/{DataTable-5FU7IESH.js → DataTable-TPTKCX4D.js} +10 -9
  17. package/dist/{PublicPageProvider-C0Sm_e5k.d.ts → PublicPageProvider-DC6kCaqf.d.ts} +385 -261
  18. package/dist/{UnifiedAuthProvider-RGJTDE2C.js → UnifiedAuthProvider-CH6Z342H.js} +3 -3
  19. package/dist/{UnifiedAuthProvider-185Ih4dj.d.ts → UnifiedAuthProvider-CVcTjx-d.d.ts} +29 -0
  20. package/dist/{api-N774RPUA.js → api-MVVQZLJI.js} +2 -2
  21. package/dist/{chunk-KNC55RTG.js → chunk-24UVZUZG.js} +90 -54
  22. package/dist/chunk-24UVZUZG.js.map +1 -0
  23. package/dist/{chunk-HWIIPPNI.js → chunk-2UOI2FG5.js} +20 -20
  24. package/dist/chunk-2UOI2FG5.js.map +1 -0
  25. package/dist/{chunk-E3SPN4VZ 5.js → chunk-3XC4CPTD.js} +4345 -3986
  26. package/dist/chunk-3XC4CPTD.js.map +1 -0
  27. package/dist/{chunk-7EQTDTTJ.js → chunk-6J4GEEJR.js} +172 -45
  28. package/dist/chunk-6J4GEEJR.js.map +1 -0
  29. package/dist/{chunk-6C4YBBJM 5.js → chunk-6SOIHG6Z.js} +1 -1
  30. package/dist/chunk-6SOIHG6Z.js.map +1 -0
  31. package/dist/{chunk-7FLMSG37.js → chunk-EHMR7VYL.js} +25 -25
  32. package/dist/chunk-EHMR7VYL.js.map +1 -0
  33. package/dist/{chunk-I7PSE6JW.js → chunk-F2IMUDXZ.js} +2 -75
  34. package/dist/chunk-F2IMUDXZ.js.map +1 -0
  35. package/dist/{chunk-QWWZ5CAQ.js → chunk-FFQEQTNW.js} +7 -9
  36. package/dist/chunk-FFQEQTNW.js.map +1 -0
  37. package/dist/chunk-FMUCXFII.js +76 -0
  38. package/dist/chunk-FMUCXFII.js.map +1 -0
  39. package/dist/{chunk-HW3OVDUF.js → chunk-J36DSWQK.js} +1 -1
  40. package/dist/{chunk-HW3OVDUF.js.map → chunk-J36DSWQK.js.map} +1 -1
  41. package/dist/{chunk-SQGMNID3.js → chunk-L4OXEN46.js} +4 -5
  42. package/dist/chunk-L4OXEN46.js.map +1 -0
  43. package/dist/{chunk-R77UEZ4E 3.js → chunk-M43Y4SSO.js} +1 -1
  44. package/dist/chunk-M43Y4SSO.js.map +1 -0
  45. package/dist/{chunk-IIELH4DL.js → chunk-MMZ7JXPU.js} +60 -223
  46. package/dist/chunk-MMZ7JXPU.js.map +1 -0
  47. package/dist/{chunk-NOAYCWCX 5.js → chunk-NECFR5MM.js} +394 -312
  48. package/dist/chunk-NECFR5MM.js.map +1 -0
  49. package/dist/{chunk-BC4IJKSL.js → chunk-SFZUDBL5.js} +40 -4
  50. package/dist/chunk-SFZUDBL5.js.map +1 -0
  51. package/dist/{chunk-XNXXZ43G.js → chunk-XWQCNGTQ.js} +748 -364
  52. package/dist/chunk-XWQCNGTQ.js.map +1 -0
  53. package/dist/components.d.ts +6 -6
  54. package/dist/components.js +15 -12
  55. package/dist/components.js.map +1 -1
  56. package/dist/{functions-D_kgHktt.d.ts → functions-DHebl8-F.d.ts} +1 -1
  57. package/dist/hooks.d.ts +59 -126
  58. package/dist/hooks.js +19 -28
  59. package/dist/hooks.js.map +1 -1
  60. package/dist/index.d.ts +63 -16
  61. package/dist/index.js +23 -24
  62. package/dist/index.js.map +1 -1
  63. package/dist/providers.d.ts +21 -3
  64. package/dist/providers.js +2 -2
  65. package/dist/rbac/index.d.ts +146 -115
  66. package/dist/rbac/index.js +8 -11
  67. package/dist/theming/runtime.d.ts +1 -13
  68. package/dist/theming/runtime.js +1 -1
  69. package/dist/{timezone-_pgH8qrY.d.ts → timezone-CHhWg6b4.d.ts} +3 -10
  70. package/dist/{types-UU913iLA.d.ts → types-BeoeWV5I.d.ts} +8 -0
  71. package/dist/{types-CEpcvwwF.d.ts → types-CkbwOr4Y.d.ts} +6 -0
  72. package/dist/types.d.ts +2 -2
  73. package/dist/{usePublicRouteParams-TZe0gy-4.d.ts → usePublicRouteParams-1oMokgLF.d.ts} +34 -4
  74. package/dist/{useToast-C8gR5ir4.d.ts → useToast-AyaT-x7p.d.ts} +2 -2
  75. package/dist/utils.d.ts +4 -5
  76. package/dist/utils.js +15 -15
  77. package/dist/utils.js.map +1 -1
  78. package/docs/api/README.md +7 -1
  79. package/docs/api/classes/ColumnFactory.md +8 -8
  80. package/docs/api/classes/InvalidScopeError.md +4 -4
  81. package/docs/api/classes/Logger.md +1 -1
  82. package/docs/api/classes/MissingUserContextError.md +4 -4
  83. package/docs/api/classes/OrganisationContextRequiredError.md +4 -4
  84. package/docs/api/classes/PermissionDeniedError.md +4 -4
  85. package/docs/api/classes/RBACAuditManager.md +1 -1
  86. package/docs/api/classes/RBACCache.md +1 -1
  87. package/docs/api/classes/RBACEngine.md +1 -1
  88. package/docs/api/classes/RBACError.md +4 -4
  89. package/docs/api/classes/RBACNotInitializedError.md +4 -4
  90. package/docs/api/classes/SecureSupabaseClient.md +18 -15
  91. package/docs/api/classes/StorageUtils.md +1 -1
  92. package/docs/api/enums/FileCategory.md +1 -1
  93. package/docs/api/enums/LogLevel.md +1 -1
  94. package/docs/api/enums/RBACErrorCode.md +1 -1
  95. package/docs/api/enums/RPCFunction.md +1 -1
  96. package/docs/api/interfaces/AddressFieldProps.md +1 -1
  97. package/docs/api/interfaces/AddressFieldRef.md +1 -1
  98. package/docs/api/interfaces/AggregateConfig.md +4 -4
  99. package/docs/api/interfaces/AutocompleteOptions.md +1 -1
  100. package/docs/api/interfaces/AvatarProps.md +1 -1
  101. package/docs/api/interfaces/BadgeProps.md +9 -2
  102. package/docs/api/interfaces/ButtonProps.md +7 -4
  103. package/docs/api/interfaces/CalendarProps.md +8 -5
  104. package/docs/api/interfaces/CardProps.md +8 -5
  105. package/docs/api/interfaces/ColorPalette.md +1 -1
  106. package/docs/api/interfaces/ColorShade.md +1 -1
  107. package/docs/api/interfaces/ComplianceResult.md +1 -1
  108. package/docs/api/interfaces/DataAccessRecord.md +9 -9
  109. package/docs/api/interfaces/DataRecord.md +1 -1
  110. package/docs/api/interfaces/DataTableAction.md +24 -21
  111. package/docs/api/interfaces/DataTableColumn.md +31 -31
  112. package/docs/api/interfaces/DataTableProps.md +1 -1
  113. package/docs/api/interfaces/DataTableToolbarButton.md +7 -7
  114. package/docs/api/interfaces/DatabaseComplianceResult.md +1 -1
  115. package/docs/api/interfaces/DatabaseIssue.md +1 -1
  116. package/docs/api/interfaces/EmptyStateConfig.md +5 -5
  117. package/docs/api/interfaces/EnhancedNavigationMenuProps.md +1 -1
  118. package/docs/api/interfaces/ErrorBoundaryProps.md +147 -0
  119. package/docs/api/interfaces/ErrorBoundaryProviderProps.md +36 -0
  120. package/docs/api/interfaces/ErrorBoundaryState.md +75 -0
  121. package/docs/api/interfaces/EventAppRoleData.md +1 -1
  122. package/docs/api/interfaces/ExportColumn.md +1 -1
  123. package/docs/api/interfaces/ExportOptions.md +8 -8
  124. package/docs/api/interfaces/FileDisplayProps.md +1 -1
  125. package/docs/api/interfaces/FileMetadata.md +1 -1
  126. package/docs/api/interfaces/FileReference.md +1 -1
  127. package/docs/api/interfaces/FileSizeLimits.md +1 -1
  128. package/docs/api/interfaces/FileUploadOptions.md +1 -1
  129. package/docs/api/interfaces/FileUploadProps.md +26 -23
  130. package/docs/api/interfaces/FooterProps.md +10 -8
  131. package/docs/api/interfaces/FormFieldProps.md +10 -10
  132. package/docs/api/interfaces/FormProps.md +1 -1
  133. package/docs/api/interfaces/GrantEventAppRoleParams.md +1 -1
  134. package/docs/api/interfaces/InactivityWarningModalProps.md +1 -1
  135. package/docs/api/interfaces/InputProps.md +7 -4
  136. package/docs/api/interfaces/LabelProps.md +1 -1
  137. package/docs/api/interfaces/LoggerConfig.md +1 -1
  138. package/docs/api/interfaces/LoginFormProps.md +14 -11
  139. package/docs/api/interfaces/NavigationAccessRecord.md +1 -1
  140. package/docs/api/interfaces/NavigationContextType.md +1 -1
  141. package/docs/api/interfaces/NavigationGuardProps.md +1 -1
  142. package/docs/api/interfaces/NavigationItem.md +11 -11
  143. package/docs/api/interfaces/NavigationMenuProps.md +15 -15
  144. package/docs/api/interfaces/NavigationProviderProps.md +1 -1
  145. package/docs/api/interfaces/Organisation.md +1 -1
  146. package/docs/api/interfaces/OrganisationContextType.md +1 -1
  147. package/docs/api/interfaces/OrganisationMembership.md +1 -1
  148. package/docs/api/interfaces/OrganisationProviderProps.md +1 -1
  149. package/docs/api/interfaces/OrganisationSecurityError.md +1 -1
  150. package/docs/api/interfaces/PaceAppLayoutProps.md +30 -27
  151. package/docs/api/interfaces/PaceLoginPageProps.md +6 -4
  152. package/docs/api/interfaces/PageAccessRecord.md +1 -1
  153. package/docs/api/interfaces/PagePermissionContextType.md +1 -1
  154. package/docs/api/interfaces/PagePermissionGuardProps.md +1 -1
  155. package/docs/api/interfaces/PagePermissionProviderProps.md +1 -1
  156. package/docs/api/interfaces/PaletteData.md +1 -1
  157. package/docs/api/interfaces/ParsedAddress.md +1 -1
  158. package/docs/api/interfaces/PermissionEnforcerProps.md +1 -1
  159. package/docs/api/interfaces/ProgressProps.md +1 -1
  160. package/docs/api/interfaces/ProtectedRouteProps.md +7 -26
  161. package/docs/api/interfaces/PublicPageFooterProps.md +9 -9
  162. package/docs/api/interfaces/PublicPageHeaderProps.md +10 -10
  163. package/docs/api/interfaces/PublicPageLayoutProps.md +7 -20
  164. package/docs/api/interfaces/QuickFix.md +1 -1
  165. package/docs/api/interfaces/RBACAccessValidateParams.md +1 -1
  166. package/docs/api/interfaces/RBACAccessValidateResult.md +1 -1
  167. package/docs/api/interfaces/RBACAuditLogParams.md +1 -1
  168. package/docs/api/interfaces/RBACAuditLogResult.md +1 -1
  169. package/docs/api/interfaces/RBACConfig.md +1 -1
  170. package/docs/api/interfaces/RBACContext.md +1 -1
  171. package/docs/api/interfaces/RBACLogger.md +1 -1
  172. package/docs/api/interfaces/RBACPageAccessCheckParams.md +1 -1
  173. package/docs/api/interfaces/RBACPerformanceMetrics.md +1 -1
  174. package/docs/api/interfaces/RBACPermissionCheckParams.md +1 -1
  175. package/docs/api/interfaces/RBACPermissionCheckResult.md +1 -1
  176. package/docs/api/interfaces/RBACPermissionsGetParams.md +1 -1
  177. package/docs/api/interfaces/RBACPermissionsGetResult.md +1 -1
  178. package/docs/api/interfaces/RBACResult.md +1 -1
  179. package/docs/api/interfaces/RBACRoleGrantParams.md +1 -1
  180. package/docs/api/interfaces/RBACRoleGrantResult.md +1 -1
  181. package/docs/api/interfaces/RBACRoleRevokeParams.md +1 -1
  182. package/docs/api/interfaces/RBACRoleRevokeResult.md +1 -1
  183. package/docs/api/interfaces/RBACRoleValidateParams.md +1 -1
  184. package/docs/api/interfaces/RBACRoleValidateResult.md +1 -1
  185. package/docs/api/interfaces/RBACRolesListParams.md +1 -1
  186. package/docs/api/interfaces/RBACRolesListResult.md +1 -1
  187. package/docs/api/interfaces/RBACSessionTrackParams.md +1 -1
  188. package/docs/api/interfaces/RBACSessionTrackResult.md +1 -1
  189. package/docs/api/interfaces/ResourcePermissions.md +1 -1
  190. package/docs/api/interfaces/RevokeEventAppRoleParams.md +1 -1
  191. package/docs/api/interfaces/RoleBasedRouterContextType.md +1 -1
  192. package/docs/api/interfaces/RoleBasedRouterProps.md +1 -1
  193. package/docs/api/interfaces/RoleManagementResult.md +1 -1
  194. package/docs/api/interfaces/RouteAccessRecord.md +1 -1
  195. package/docs/api/interfaces/RouteConfig.md +1 -1
  196. package/docs/api/interfaces/RuntimeComplianceResult.md +1 -1
  197. package/docs/api/interfaces/SecureDataContextType.md +9 -9
  198. package/docs/api/interfaces/SecureDataProviderProps.md +8 -8
  199. package/docs/api/interfaces/SessionRestorationLoaderProps.md +3 -3
  200. package/docs/api/interfaces/SetupIssue.md +1 -1
  201. package/docs/api/interfaces/StorageConfig.md +1 -1
  202. package/docs/api/interfaces/StorageFileInfo.md +1 -1
  203. package/docs/api/interfaces/StorageFileMetadata.md +1 -1
  204. package/docs/api/interfaces/StorageListOptions.md +1 -1
  205. package/docs/api/interfaces/StorageListResult.md +1 -1
  206. package/docs/api/interfaces/StorageUploadOptions.md +1 -1
  207. package/docs/api/interfaces/StorageUploadResult.md +1 -1
  208. package/docs/api/interfaces/StorageUrlOptions.md +1 -1
  209. package/docs/api/interfaces/StyleImport.md +1 -1
  210. package/docs/api/interfaces/SwitchProps.md +1 -1
  211. package/docs/api/interfaces/TabsContentProps.md +1 -1
  212. package/docs/api/interfaces/TabsListProps.md +1 -1
  213. package/docs/api/interfaces/TabsProps.md +1 -1
  214. package/docs/api/interfaces/TabsTriggerProps.md +3 -3
  215. package/docs/api/interfaces/TextareaProps.md +1 -1
  216. package/docs/api/interfaces/ToastActionElement.md +4 -1
  217. package/docs/api/interfaces/ToastProps.md +1 -1
  218. package/docs/api/interfaces/UnifiedAuthContextType.md +58 -55
  219. package/docs/api/interfaces/UnifiedAuthProviderProps.md +15 -13
  220. package/docs/api/interfaces/UseFormDialogOptions.md +1 -1
  221. package/docs/api/interfaces/UseFormDialogReturn.md +1 -1
  222. package/docs/api/interfaces/UseInactivityTrackerOptions.md +11 -9
  223. package/docs/api/interfaces/UseInactivityTrackerReturn.md +8 -8
  224. package/docs/api/interfaces/UsePublicEventLogoOptions.md +6 -6
  225. package/docs/api/interfaces/UsePublicEventLogoReturn.md +9 -6
  226. package/docs/api/interfaces/UsePublicEventOptions.md +3 -3
  227. package/docs/api/interfaces/UsePublicEventReturn.md +8 -5
  228. package/docs/api/interfaces/UsePublicFileDisplayOptions.md +4 -4
  229. package/docs/api/interfaces/UsePublicFileDisplayReturn.md +12 -9
  230. package/docs/api/interfaces/UsePublicRouteParamsReturn.md +10 -7
  231. package/docs/api/interfaces/UseResolvedScopeOptions.md +1 -1
  232. package/docs/api/interfaces/UseResolvedScopeReturn.md +1 -1
  233. package/docs/api/interfaces/UseResourcePermissionsOptions.md +1 -1
  234. package/docs/api/interfaces/UserEventAccess.md +14 -11
  235. package/docs/api/interfaces/UserMenuProps.md +8 -6
  236. package/docs/api/interfaces/UserProfile.md +1 -1
  237. package/docs/api/modules.md +575 -634
  238. package/docs/architecture/database-schema-requirements.md +161 -0
  239. package/docs/core-concepts/rbac-system.md +3 -3
  240. package/docs/documentation-index.md +2 -4
  241. package/docs/getting-started/cursor-rules.md +263 -0
  242. package/docs/getting-started/installation-guide.md +6 -1
  243. package/docs/getting-started/quick-start.md +6 -1
  244. package/docs/migration/DOCUMENTATION_STRUCTURE.md +441 -0
  245. package/docs/migration/MIGRATION_GUIDE.md +6 -28
  246. package/docs/migration/README.md +52 -6
  247. package/docs/migration/V0.5.190_TO_V0.6.1_MIGRATION.md +1153 -0
  248. package/docs/migration/V0.6.0_REACT_19_MIGRATION.md +227 -0
  249. package/docs/migration/database-changes-december-2025.md +3 -3
  250. package/docs/rbac/event-based-apps.md +1 -1
  251. package/docs/rbac/getting-started.md +1 -1
  252. package/docs/rbac/quick-start.md +1 -1
  253. package/docs/standards/README.md +40 -0
  254. package/docs/troubleshooting/migration.md +4 -4
  255. package/examples/PublicPages/PublicEventPage.tsx +1 -1
  256. package/package.json +12 -6
  257. package/scripts/audit/core/checks/accessibility.cjs +197 -0
  258. package/scripts/audit/core/checks/api-usage.cjs +191 -0
  259. package/scripts/audit/core/checks/bundle.cjs +142 -0
  260. package/scripts/{check-pace-core-compliance.cjs → audit/core/checks/compliance.cjs} +737 -691
  261. package/scripts/audit/core/checks/config.cjs +54 -0
  262. package/scripts/audit/core/checks/coverage.cjs +84 -0
  263. package/scripts/audit/core/checks/dependencies.cjs +454 -0
  264. package/scripts/audit/core/checks/documentation.cjs +203 -0
  265. package/scripts/audit/core/checks/environment.cjs +128 -0
  266. package/scripts/audit/core/checks/error-handling.cjs +299 -0
  267. package/scripts/audit/core/checks/forms.cjs +172 -0
  268. package/scripts/audit/core/checks/heuristics.cjs +68 -0
  269. package/scripts/audit/core/checks/hooks.cjs +334 -0
  270. package/scripts/audit/core/checks/imports.cjs +244 -0
  271. package/scripts/audit/core/checks/performance.cjs +325 -0
  272. package/scripts/audit/core/checks/routes.cjs +117 -0
  273. package/scripts/audit/core/checks/state.cjs +130 -0
  274. package/scripts/audit/core/checks/structure.cjs +65 -0
  275. package/scripts/audit/core/checks/style.cjs +584 -0
  276. package/scripts/audit/core/checks/testing.cjs +122 -0
  277. package/scripts/audit/core/checks/typescript.cjs +61 -0
  278. package/scripts/audit/core/scanner.cjs +199 -0
  279. package/scripts/audit/core/utils.cjs +137 -0
  280. package/scripts/audit/index.cjs +223 -0
  281. package/scripts/audit/reporters/console.cjs +151 -0
  282. package/scripts/audit/reporters/json.cjs +54 -0
  283. package/scripts/audit/reporters/markdown.cjs +124 -0
  284. package/scripts/audit-consuming-app.cjs +86 -0
  285. package/scripts/build-docs/build-decision.js +240 -0
  286. package/scripts/build-docs/cache-utils.js +105 -0
  287. package/scripts/build-docs/content-normalization.js +150 -0
  288. package/scripts/build-docs/file-utils.js +105 -0
  289. package/scripts/build-docs/git-utils.js +86 -0
  290. package/scripts/build-docs/hash-utils.js +116 -0
  291. package/scripts/build-docs/typedoc-runner.js +220 -0
  292. package/scripts/build-docs-incremental.js +77 -913
  293. package/scripts/install-cursor-rules.cjs +236 -0
  294. package/scripts/utils/command-runner.js +16 -11
  295. package/scripts/validate-formats.js +61 -56
  296. package/scripts/validate-master.js +74 -69
  297. package/scripts/validate-pre-publish.js +70 -65
  298. package/src/__tests__/helpers/test-providers.tsx +1 -1
  299. package/src/__tests__/helpers/test-utils.tsx +1 -1
  300. package/src/__tests__/hooks/usePermissions.test.ts +2 -2
  301. package/src/components/Alert/Alert.test.tsx +12 -18
  302. package/src/components/Alert/Alert.tsx +5 -7
  303. package/src/components/Avatar/Avatar.test.tsx +4 -4
  304. package/src/components/Badge/Badge.tsx +16 -4
  305. package/src/components/Button/Button.tsx +27 -4
  306. package/src/components/Calendar/Calendar.tsx +9 -3
  307. package/src/components/Card/Card.tsx +4 -0
  308. package/src/components/Checkbox/Checkbox.test.tsx +12 -12
  309. package/src/components/Checkbox/Checkbox.tsx +2 -2
  310. package/src/components/DataTable/DataTable.test.tsx +57 -93
  311. package/src/components/DataTable/DataTable.tsx +40 -6
  312. package/src/components/DataTable/__tests__/DataTableCore.test-setup.ts +5 -6
  313. package/src/components/DataTable/__tests__/pagination.modes.test.tsx +29 -7
  314. package/src/components/DataTable/__tests__/ssr.strict-mode.test.tsx +12 -12
  315. package/src/components/DataTable/__tests__/test-utils/sharedTestUtils.tsx +2 -3
  316. package/src/components/DataTable/components/AccessDeniedPage.tsx +17 -26
  317. package/src/components/DataTable/components/ActionButtons.tsx +10 -7
  318. package/src/components/DataTable/components/BulkOperationsDropdown.tsx +2 -2
  319. package/src/components/DataTable/components/ColumnFilter.tsx +10 -0
  320. package/src/components/DataTable/components/ColumnVisibilityDropdown.tsx +12 -0
  321. package/src/components/DataTable/components/DataTableBody.tsx +8 -0
  322. package/src/components/DataTable/components/DataTableCore.tsx +200 -561
  323. package/src/components/DataTable/components/DataTableErrorBoundary.tsx +11 -0
  324. package/src/components/DataTable/components/DataTableLayout.tsx +559 -0
  325. package/src/components/DataTable/components/DataTableModals.tsx +9 -1
  326. package/src/components/DataTable/components/DataTableToolbar.tsx +8 -0
  327. package/src/components/DataTable/components/DraggableColumnHeader.tsx +12 -0
  328. package/src/components/DataTable/components/EditFields.tsx +307 -0
  329. package/src/components/DataTable/components/EditableRow.tsx +9 -1
  330. package/src/components/DataTable/components/EmptyState.tsx +10 -0
  331. package/src/components/DataTable/components/FilterRow.tsx +12 -0
  332. package/src/components/DataTable/components/GroupHeader.tsx +12 -0
  333. package/src/components/DataTable/components/GroupingDropdown.tsx +12 -0
  334. package/src/components/DataTable/components/ImportModal.tsx +7 -0
  335. package/src/components/DataTable/components/LoadingState.tsx +6 -0
  336. package/src/components/DataTable/components/PaginationControls.tsx +16 -1
  337. package/src/components/DataTable/components/RowComponent.tsx +391 -0
  338. package/src/components/DataTable/components/UnifiedTableBody.tsx +62 -852
  339. package/src/components/DataTable/components/VirtualizedDataTable.tsx +16 -4
  340. package/src/components/DataTable/components/__tests__/AccessDeniedPage.test.tsx +4 -2
  341. package/src/components/DataTable/components/__tests__/DataTableModals.test.tsx +23 -23
  342. package/src/components/DataTable/components/__tests__/EditableRow.test.tsx +11 -11
  343. package/src/components/DataTable/components/__tests__/ExpandButton.test.tsx +36 -36
  344. package/src/components/DataTable/components/__tests__/GroupHeader.test.tsx +27 -27
  345. package/src/components/DataTable/components/__tests__/ImportModal.test.tsx +39 -39
  346. package/src/components/DataTable/components/__tests__/UnifiedTableBody.test.tsx +33 -33
  347. package/src/components/DataTable/components/__tests__/ViewRowModal.test.tsx +29 -29
  348. package/src/components/DataTable/components/cellValueUtils.ts +40 -0
  349. package/src/components/DataTable/components/hooks/useImportModalFocus.ts +53 -0
  350. package/src/components/DataTable/components/hooks/usePermissionTracking.ts +126 -0
  351. package/src/components/DataTable/context/DataTableContext.tsx +50 -0
  352. package/src/components/DataTable/core/ColumnFactory.ts +31 -0
  353. package/src/components/DataTable/core/DataTableContext.tsx +32 -1
  354. package/src/components/DataTable/hooks/useColumnOrderPersistence.ts +10 -0
  355. package/src/components/DataTable/hooks/useColumnReordering.ts +14 -2
  356. package/src/components/DataTable/hooks/useColumnVisibilityPersistence.ts +10 -0
  357. package/src/components/DataTable/hooks/useDataTableDataPipeline.ts +16 -0
  358. package/src/components/DataTable/hooks/useDataTablePermissions.ts +124 -32
  359. package/src/components/DataTable/hooks/useDataTableState.ts +35 -1
  360. package/src/components/DataTable/hooks/useEffectiveColumnOrder.ts +12 -0
  361. package/src/components/DataTable/hooks/useKeyboardNavigation.ts +2 -2
  362. package/src/components/DataTable/hooks/useServerSideDataEffect.ts +11 -0
  363. package/src/components/DataTable/hooks/useTableColumns.ts +8 -0
  364. package/src/components/DataTable/hooks/useTableHandlers.ts +14 -0
  365. package/src/components/DataTable/styles.ts +6 -6
  366. package/src/components/DataTable/types.ts +6 -10
  367. package/src/components/DataTable/utils/a11yUtils.ts +7 -0
  368. package/src/components/DataTable/utils/debugTools.ts +18 -113
  369. package/src/components/DataTable/utils/errorHandling.ts +12 -0
  370. package/src/components/DataTable/utils/exportUtils.ts +9 -0
  371. package/src/components/DataTable/utils/flexibleImport.ts +12 -48
  372. package/src/components/DataTable/utils/paginationUtils.ts +8 -0
  373. package/src/components/DataTable/utils/performanceUtils.ts +5 -1
  374. package/src/components/DatePickerWithTimezone/DatePickerWithTimezone.test.tsx +8 -14
  375. package/src/components/Dialog/Dialog.tsx +8 -7
  376. package/src/components/ErrorBoundary/ErrorBoundary.test.tsx +180 -1
  377. package/src/components/ErrorBoundary/ErrorBoundary.tsx +46 -6
  378. package/src/components/ErrorBoundary/ErrorBoundaryContext.tsx +129 -0
  379. package/src/components/ErrorBoundary/index.ts +27 -2
  380. package/src/components/EventSelector/EventSelector.tsx +4 -1
  381. package/src/components/FileDisplay/FileDisplay.test.tsx +2 -2
  382. package/src/components/FileDisplay/FileDisplay.tsx +32 -18
  383. package/src/components/FileUpload/FileUpload.tsx +22 -2
  384. package/src/components/Footer/Footer.test.tsx +16 -16
  385. package/src/components/Footer/Footer.tsx +15 -12
  386. package/src/components/Form/Form.test.tsx +36 -15
  387. package/src/components/Form/Form.tsx +31 -26
  388. package/src/components/Header/Header.tsx +22 -11
  389. package/src/components/InactivityWarningModal/InactivityWarningModal.test.tsx +40 -40
  390. package/src/components/InactivityWarningModal/InactivityWarningModal.tsx +1 -1
  391. package/src/components/Input/Input.test.tsx +2 -2
  392. package/src/components/Input/Input.tsx +36 -34
  393. package/src/components/Label/Label.tsx +1 -1
  394. package/src/components/LoadingSpinner/LoadingSpinner.test.tsx +4 -4
  395. package/src/components/LoadingSpinner/LoadingSpinner.tsx +1 -1
  396. package/src/components/LoginForm/LoginForm.test.tsx +42 -42
  397. package/src/components/LoginForm/LoginForm.tsx +12 -8
  398. package/src/components/NavigationMenu/NavigationMenu.tsx +15 -514
  399. package/src/components/NavigationMenu/types.ts +56 -0
  400. package/src/components/NavigationMenu/useNavigationFiltering.ts +390 -0
  401. package/src/components/OrganisationSelector/OrganisationSelector.tsx +3 -0
  402. package/src/components/PaceAppLayout/PaceAppLayout.performance.test.tsx +1 -1
  403. package/src/components/PaceAppLayout/PaceAppLayout.test.tsx +54 -52
  404. package/src/components/PaceAppLayout/PaceAppLayout.tsx +33 -12
  405. package/src/components/PaceAppLayout/README.md +1 -1
  406. package/src/components/PaceAppLayout/test-setup.tsx +1 -2
  407. package/src/components/PaceLoginPage/PaceLoginPage.tsx +4 -1
  408. package/src/components/PasswordChange/PasswordChangeForm.test.tsx +33 -33
  409. package/src/components/PasswordChange/PasswordChangeForm.tsx +10 -1
  410. package/src/components/Progress/Progress.tsx +1 -1
  411. package/src/components/ProtectedRoute/ProtectedRoute.tsx +3 -9
  412. package/src/components/PublicLayout/PublicPageLayout.tsx +3 -6
  413. package/src/components/PublicLayout/PublicPageProvider.tsx +4 -0
  414. package/src/components/Select/Select.tsx +95 -438
  415. package/src/components/Select/context.ts +23 -0
  416. package/src/components/Select/hooks/useSelectEvents.ts +87 -0
  417. package/src/components/Select/hooks/useSelectSearch.ts +91 -0
  418. package/src/components/Select/hooks/useSelectState.ts +104 -0
  419. package/src/components/Select/index.ts +9 -1
  420. package/src/components/Select/types.ts +123 -0
  421. package/src/components/Select/utils/text.ts +26 -0
  422. package/src/components/SessionRestorationLoader/SessionRestorationLoader.tsx +5 -6
  423. package/src/components/Switch/Switch.tsx +4 -4
  424. package/src/components/Table/Table.tsx +1 -1
  425. package/src/components/Tabs/Tabs.tsx +1 -1
  426. package/src/components/Textarea/Textarea.tsx +27 -29
  427. package/src/components/Toast/Toast.tsx +5 -1
  428. package/src/components/Tooltip/Tooltip.tsx +3 -3
  429. package/src/components/UserMenu/UserMenu.test.tsx +24 -11
  430. package/src/components/UserMenu/UserMenu.tsx +22 -19
  431. package/src/components/index.ts +2 -2
  432. package/src/hooks/__tests__/hooks.integration.test.tsx +80 -55
  433. package/src/hooks/__tests__/index.unit.test.ts +2 -5
  434. package/src/hooks/__tests__/useStorage.unit.test.ts +36 -36
  435. package/src/hooks/index.ts +1 -2
  436. package/src/hooks/public/usePublicEvent.ts +5 -1
  437. package/src/hooks/public/usePublicEventLogo.ts +5 -1
  438. package/src/hooks/public/usePublicFileDisplay.ts +4 -0
  439. package/src/hooks/public/usePublicRouteParams.ts +5 -1
  440. package/src/hooks/services/useAuth.ts +32 -0
  441. package/src/hooks/services/useCurrentEvent.ts +6 -0
  442. package/src/hooks/services/useCurrentOrganisation.ts +6 -0
  443. package/src/hooks/useDataTableState.ts +8 -18
  444. package/src/hooks/useDebounce.ts +9 -0
  445. package/src/hooks/useEventTheme.ts +6 -0
  446. package/src/hooks/useFileDisplay.ts +4 -0
  447. package/src/hooks/useFileReference.ts +25 -7
  448. package/src/hooks/useFileUrl.ts +11 -1
  449. package/src/hooks/useFocusManagement.ts +16 -2
  450. package/src/hooks/useFocusTrap.ts +7 -4
  451. package/src/hooks/useFormDialog.ts +8 -7
  452. package/src/hooks/useInactivityTracker.ts +4 -1
  453. package/src/hooks/useKeyboardShortcuts.ts +4 -0
  454. package/src/hooks/useOrganisationPermissions.ts +4 -0
  455. package/src/hooks/useOrganisationSecurity.ts +4 -0
  456. package/src/hooks/usePerformanceMonitor.ts +4 -0
  457. package/src/hooks/usePermissionCache.ts +8 -1
  458. package/src/hooks/useQueryCache.ts +12 -1
  459. package/src/hooks/useSessionRestoration.ts +4 -0
  460. package/src/hooks/useStorage.ts +4 -0
  461. package/src/hooks/useToast.ts +3 -3
  462. package/src/index.ts +2 -1
  463. package/src/providers/__tests__/OrganisationProvider.test.tsx +115 -49
  464. package/src/providers/__tests__/ProviderLifecycle.test.tsx +21 -6
  465. package/src/providers/__tests__/UnifiedAuthProvider.test.tsx +10 -10
  466. package/src/providers/services/AuthServiceProvider.tsx +18 -0
  467. package/src/providers/services/EventServiceProvider.tsx +18 -0
  468. package/src/providers/services/InactivityServiceProvider.tsx +18 -0
  469. package/src/providers/services/OrganisationServiceProvider.tsx +18 -0
  470. package/src/providers/services/UnifiedAuthProvider.tsx +58 -22
  471. package/src/providers/services/__tests__/AuthServiceProvider.integration.test.tsx +33 -7
  472. package/src/rbac/README.md +1 -1
  473. package/src/rbac/__tests__/adapters.comprehensive.test.tsx +26 -26
  474. package/src/rbac/__tests__/scenarios.user-role.test.tsx +4 -5
  475. package/src/rbac/adapters.tsx +14 -5
  476. package/src/rbac/api.ts +100 -67
  477. package/src/rbac/components/EnhancedNavigationMenu.tsx +1 -1
  478. package/src/rbac/components/NavigationGuard.tsx +1 -1
  479. package/src/rbac/components/NavigationProvider.tsx +5 -2
  480. package/src/rbac/components/PagePermissionGuard.tsx +158 -18
  481. package/src/rbac/components/PagePermissionProvider.tsx +1 -1
  482. package/src/rbac/components/PermissionEnforcer.tsx +1 -1
  483. package/src/rbac/components/RoleBasedRouter.tsx +6 -2
  484. package/src/rbac/components/SecureDataProvider.test.tsx +84 -49
  485. package/src/rbac/components/SecureDataProvider.tsx +21 -6
  486. package/src/rbac/components/__tests__/PagePermissionGuard.race-condition.test.tsx +24 -14
  487. package/src/rbac/components/__tests__/PagePermissionGuard.test.tsx +7 -0
  488. package/src/rbac/components/__tests__/PagePermissionGuard.verification.test.tsx +14 -6
  489. package/src/rbac/components/__tests__/RoleBasedRouter.test.tsx +15 -4
  490. package/src/rbac/components/__tests__/SecureDataProvider.fixed.test.tsx +148 -24
  491. package/src/rbac/components/__tests__/SecureDataProvider.test.tsx +81 -15
  492. package/src/rbac/engine.ts +38 -14
  493. package/src/rbac/hooks/permissions/index.ts +7 -0
  494. package/src/rbac/hooks/permissions/useAccessLevel.ts +105 -0
  495. package/src/rbac/hooks/permissions/useCachedPermissions.ts +79 -0
  496. package/src/rbac/hooks/permissions/useCan.ts +347 -0
  497. package/src/rbac/hooks/permissions/useHasAllPermissions.ts +90 -0
  498. package/src/rbac/hooks/permissions/useHasAnyPermission.ts +90 -0
  499. package/src/rbac/hooks/permissions/useMultiplePermissions.ts +93 -0
  500. package/src/rbac/hooks/permissions/usePermissions.ts +253 -0
  501. package/src/rbac/hooks/useCan.test.ts +71 -64
  502. package/src/rbac/hooks/usePermissions.ts +14 -995
  503. package/src/rbac/hooks/useResourcePermissions.test.ts +54 -18
  504. package/src/rbac/hooks/useResourcePermissions.ts +14 -4
  505. package/src/rbac/hooks/useSecureSupabase.ts +33 -13
  506. package/src/rbac/permissions.ts +0 -30
  507. package/src/rbac/secureClient.ts +212 -61
  508. package/src/rbac/types.ts +8 -0
  509. package/src/theming/__tests__/parseEventColours.test.ts +6 -9
  510. package/src/theming/parseEventColours.ts +5 -19
  511. package/src/types/vitest-globals.d.ts +51 -26
  512. package/src/utils/__mocks__/supabaseMock.ts +1 -3
  513. package/src/utils/__tests__/formatting.unit.test.ts +4 -4
  514. package/src/utils/__tests__/index.unit.test.ts +2 -2
  515. package/src/utils/audit/audit.ts +0 -3
  516. package/src/utils/core/cn.ts +1 -1
  517. package/src/utils/file-reference/index.ts +53 -1
  518. package/src/utils/formatting/formatting.ts +8 -18
  519. package/src/utils/index.ts +0 -1
  520. package/src/utils/security/secureDataAccess.test.ts +31 -20
  521. package/src/utils/security/secureDataAccess.ts +4 -3
  522. package/dist/chunk-6C4YBBJM.js +0 -628
  523. package/dist/chunk-6C4YBBJM.js.map +0 -1
  524. package/dist/chunk-7D4SUZUM.js 2.map +0 -1
  525. package/dist/chunk-7EQTDTTJ.js 2.map +0 -1
  526. package/dist/chunk-7EQTDTTJ.js.map +0 -1
  527. package/dist/chunk-7FLMSG37.js 2.map +0 -1
  528. package/dist/chunk-7FLMSG37.js.map +0 -1
  529. package/dist/chunk-BC4IJKSL.js.map +0 -1
  530. package/dist/chunk-E3SPN4VZ.js +0 -12917
  531. package/dist/chunk-E3SPN4VZ.js.map +0 -1
  532. package/dist/chunk-E66EQZE6 5.js +0 -37
  533. package/dist/chunk-E66EQZE6.js 2.map +0 -1
  534. package/dist/chunk-HWIIPPNI.js.map +0 -1
  535. package/dist/chunk-I7PSE6JW 5.js +0 -191
  536. package/dist/chunk-I7PSE6JW.js 2.map +0 -1
  537. package/dist/chunk-I7PSE6JW.js.map +0 -1
  538. package/dist/chunk-IIELH4DL.js.map +0 -1
  539. package/dist/chunk-KNC55RTG.js 5.map +0 -1
  540. package/dist/chunk-KNC55RTG.js.map +0 -1
  541. package/dist/chunk-KQCRWDSA.js 5.map +0 -1
  542. package/dist/chunk-LFNCN2SP.js +0 -412
  543. package/dist/chunk-LFNCN2SP.js 2.map +0 -1
  544. package/dist/chunk-LFNCN2SP.js.map +0 -1
  545. package/dist/chunk-LMC26NLJ 2.js +0 -84
  546. package/dist/chunk-NOAYCWCX.js +0 -4993
  547. package/dist/chunk-NOAYCWCX.js.map +0 -1
  548. package/dist/chunk-QWWZ5CAQ.js 3.map +0 -1
  549. package/dist/chunk-QWWZ5CAQ.js.map +0 -1
  550. package/dist/chunk-QXHPKYJV 3.js +0 -113
  551. package/dist/chunk-R77UEZ4E.js +0 -68
  552. package/dist/chunk-R77UEZ4E.js.map +0 -1
  553. package/dist/chunk-SQGMNID3.js.map +0 -1
  554. package/dist/chunk-VBXEHIUJ.js 6.map +0 -1
  555. package/dist/chunk-XNXXZ43G.js.map +0 -1
  556. package/dist/chunk-ZSAAAMVR 6.js +0 -25
  557. package/dist/components.js 5.map +0 -1
  558. package/dist/styles/index 2.js +0 -12
  559. package/dist/styles/index.js 5.map +0 -1
  560. package/dist/theming/runtime 5.js +0 -19
  561. package/dist/theming/runtime.js 5.map +0 -1
  562. package/docs/api/classes/ErrorBoundary.md +0 -144
  563. package/docs/migration/quick-migration-guide.md +0 -356
  564. package/docs/migration/service-architecture.md +0 -281
  565. package/src/hooks/__tests__/useSecureDataAccess.unit.test.tsx +0 -680
  566. package/src/hooks/useSecureDataAccess.test.ts +0 -559
  567. package/src/hooks/useSecureDataAccess.ts +0 -666
  568. /package/dist/{DataTable-5FU7IESH.js.map → DataTable-TPTKCX4D.js.map} +0 -0
  569. /package/dist/{UnifiedAuthProvider-RGJTDE2C.js.map → UnifiedAuthProvider-CH6Z342H.js.map} +0 -0
  570. /package/dist/{api-N774RPUA.js.map → api-MVVQZLJI.js.map} +0 -0
  571. /package/docs/migration/{organisation-context-timing-fix.md → V0.3.44_organisation-context-timing-fix.md} +0 -0
  572. /package/docs/migration/{rbac-migration.md → V0.4.0_rbac-migration.md} +0 -0
  573. /package/docs/migration/{person-scoped-profiles-migration-guide.md → V0.5.190_person-scoped-profiles-migration-guide.md} +0 -0
  574. /package/examples/{rbac → RBAC}/CompleteRBACExample.tsx +0 -0
  575. /package/examples/{rbac → RBAC}/EventBasedApp.tsx +0 -0
  576. /package/examples/{rbac → RBAC}/PermissionExample.tsx +0 -0
  577. /package/examples/{rbac → RBAC}/index.ts +0 -0
@@ -0,0 +1,214 @@
1
+ ---
2
+ description: Enforce tech stack compliance including Tailwind v4, React 19+, Supabase, and other required technologies
3
+ globs: ["src/**/*.{ts,tsx,js,jsx,css}", "*.config.{ts,js}"]
4
+ alwaysApply: false
5
+ paceCoreVersion: "0.6.x"
6
+ rulesVersion: "2025-01-28"
7
+ ---
8
+ # Tech Stack Compliance Guide
9
+
10
+ This guide ensures consuming apps use the correct versions and patterns for all technologies in the PACE stack.
11
+
12
+ ## Tailwind CSS v4
13
+
14
+ ### MUST: Use Tailwind v4 CSS-First Approach
15
+
16
+ **MUST use Tailwind v4 CSS-first syntax, NOT v3 patterns:**
17
+
18
+ ```css
19
+ /* ✅ CORRECT: Tailwind v4 CSS-first (@import 'tailwindcss'; @theme { ... }) */
20
+ /* ❌ WRONG: Tailwind v3 (@tailwind base/components/utilities directives) */
21
+ ```
22
+
23
+ ### MUST NOT: Use Bracket Syntax
24
+
25
+ **MUST NOT use bracket syntax like `bg-[oklch(...)]`. Map everything through theme variables:**
26
+
27
+ ```tsx
28
+ // ❌ WRONG: Bracket syntax (bg-[oklch(...)])
29
+ // ✅ CORRECT: Theme variable (bg-main-500)
30
+ ```
31
+
32
+ ### MUST: Use Custom Color Namespaces
33
+
34
+ **MUST use custom color namespaces:**
35
+ - `main-*` for primary colors (green, emerald, teal, cyan, sky, blue)
36
+ - `sec-*` for secondary colors (indigo, violet, purple, fuchsia, slate, gray, zinc, neutral, stone)
37
+ - `acc-*` for accent colors (red, orange, amber, yellow, lime, pink, rose)
38
+
39
+ ```tsx
40
+ // ✅ CORRECT: Custom namespaces (main-*, sec-*, acc-*)
41
+ // ❌ WRONG: Standard Tailwind colors (blue-*, gray-*, red-*)
42
+ ```
43
+
44
+ ### MUST: Use Semantic Classes
45
+
46
+ **MUST use semantic classes mapped in index.css:**
47
+
48
+ ```tsx
49
+ // ✅ CORRECT - Semantic classes
50
+ <div className="bg-background text-foreground">
51
+
52
+ // ❌ WRONG - Direct color classes (unless necessary)
53
+ <div className="bg-main-50 text-main-950">
54
+ ```
55
+
56
+ ## React 19+
57
+
58
+ ### MUST: Use React 19+ Features
59
+
60
+ **MUST use React 19+ patterns:**
61
+
62
+ ```tsx
63
+ // ✅ CORRECT: React 19+ features (Suspense, useTransition, etc.)
64
+ import { Suspense, useTransition } from 'react';
65
+ function App() {
66
+ const [isPending, startTransition] = useTransition();
67
+ return <Suspense fallback={<Loading />}><Component /></Suspense>;
68
+ }
69
+ ```
70
+
71
+ ### MUST: Use Functional Components
72
+
73
+ **MUST use functional components with hooks exclusively:**
74
+
75
+ ```tsx
76
+ // ✅ CORRECT: Functional components with hooks
77
+ function MyComponent() { const [state, setState] = useState(); return <div>...</div>; }
78
+
79
+ // ❌ WRONG: Class components
80
+ ```
81
+
82
+ ## Supabase
83
+
84
+ ### MUST: Use Secure Supabase Client
85
+
86
+ **MUST use `useSecureSupabase()` for all database operations:**
87
+
88
+ ```tsx
89
+ // ✅ CORRECT: useSecureSupabase() from '@jmruthers/pace-core/rbac'
90
+ // ❌ WRONG: createClient() from '@supabase/supabase-js' (base client)
91
+ ```
92
+
93
+ ### MUST: Enforce RLS
94
+
95
+ **MUST ensure RLS is enabled on all tables. Never bypass RLS.**
96
+
97
+ ### SHOULD: Use RPC Functions
98
+
99
+ **SHOULD use RPC functions for complex queries:**
100
+
101
+ ```tsx
102
+ // ✅ CORRECT: RPC functions for complex queries
103
+ const { data } = await secureSupabase.rpc('data_events_list', { organisation_id: orgId });
104
+
105
+ // ❌ AVOID: Complex client-side queries with many joins
106
+ ```
107
+
108
+ ## TanStack Query
109
+
110
+ ### MUST: Use TanStack Query for Server State
111
+
112
+ **MUST use TanStack Query for all server state management:**
113
+
114
+ ```tsx
115
+ // ✅ CORRECT: TanStack Query for server state
116
+ import { useQuery, useMutation } from '@tanstack/react-query';
117
+ const { data, isLoading } = useQuery({ queryKey: ['events', orgId], queryFn: () => fetchEvents(orgId) });
118
+
119
+ // ❌ WRONG: useState + useEffect for server state
120
+ ```
121
+
122
+ ### SHOULD: Configure Query Client
123
+
124
+ **SHOULD configure QueryClient with appropriate defaults:**
125
+
126
+ ```tsx
127
+ // ✅ CORRECT: Configure QueryClient with appropriate defaults (staleTime, cacheTime, retry)
128
+ const queryClient = new QueryClient({ defaultOptions: { queries: { staleTime: 5 * 60 * 1000, cacheTime: 10 * 60 * 1000, retry: 1 } } });
129
+ ```
130
+
131
+ ## React Hook Form + Zod
132
+
133
+ ### MUST: Use React Hook Form with Zod
134
+
135
+ **MUST use React Hook Form with Zod for all forms:**
136
+
137
+ ```tsx
138
+ // ✅ CORRECT: React Hook Form + Zod (useZodForm from pace-core)
139
+ import { useZodForm } from '@jmruthers/pace-core';
140
+ const schema = z.object({ email: z.string().email(), name: z.string().min(1) });
141
+ const form = useZodForm(schema);
142
+
143
+ // ❌ WRONG: Manual form handling (useState for form state)
144
+ ```
145
+
146
+ ## Vite
147
+
148
+ ### MUST: Use Vite for Build Tooling
149
+
150
+ **MUST use Vite for all build tooling:**
151
+
152
+ ```typescript
153
+ // ✅ CORRECT: Vite for build tooling
154
+ import { defineConfig } from 'vite';
155
+ import react from '@vitejs/plugin-react';
156
+ export default defineConfig({ plugins: [react()] });
157
+ ```
158
+
159
+ ### MUST: Use Environment Variables Correctly
160
+
161
+ **MUST use `import.meta.env` for environment variables:**
162
+
163
+ ```tsx
164
+ // ✅ CORRECT: import.meta.env.VITE_API_URL (Vite env vars)
165
+ // ❌ WRONG: process.env.VITE_API_URL (Node.js env vars)
166
+ ```
167
+
168
+ ## TypeScript
169
+
170
+ ### MUST: Use TypeScript 5+
171
+
172
+ **MUST use TypeScript 5+ with strict mode:**
173
+
174
+ ```json
175
+ // ✅ CORRECT: TypeScript 5+ with strict mode
176
+ { "compilerOptions": { "target": "ES2022", "module": "ESNext", "strict": true } }
177
+ ```
178
+
179
+ ## Version Requirements
180
+
181
+ ### MUST: Use Required Versions
182
+
183
+ **MUST use compatible versions:**
184
+
185
+ - React: `^19.0.0`
186
+ - TypeScript: `^5.0.0`
187
+ - Tailwind CSS: `^4.0.0`
188
+ - Vite: `^6.0.0`
189
+ - Supabase: `^2.49.0+`
190
+
191
+ **Check `package.json` for exact versions required by pace-core.**
192
+
193
+ ## Tech Stack Checklist
194
+
195
+ Before committing, verify:
196
+ - [ ] Tailwind v4 CSS-first syntax (no @tailwind directives)
197
+ - [ ] No bracket syntax for colors (use theme variables)
198
+ - [ ] Custom color namespaces (main-*, sec-*, acc-*)
199
+ - [ ] React 19+ functional components
200
+ - [ ] Secure Supabase client (useSecureSupabase)
201
+ - [ ] TanStack Query for server state
202
+ - [ ] React Hook Form + Zod for forms
203
+ - [ ] Vite for build tooling
204
+ - [ ] TypeScript 5+ with strict mode
205
+ - [ ] All versions compatible with pace-core
206
+
207
+ ## Reference
208
+
209
+ - Tailwind v4: https://tailwindcss.com/blog/tailwindcss-v4
210
+ - React 19: https://react.dev/blog/2024/04/25/react-19-upgrade-guide
211
+ - Supabase: https://supabase.com/docs
212
+ - TanStack Query: https://tanstack.com/query
213
+ - React Hook Form: https://react-hook-form.com
214
+ - Vite: https://vitejs.dev
@@ -0,0 +1,452 @@
1
+ ---
2
+ description: Enforce clean markup standards, semantic HTML usage, and pace-core component patterns
3
+ globs: ["src/**/*.{ts,tsx,js,jsx}"]
4
+ alwaysApply: true
5
+ paceCoreVersion: "0.6.x"
6
+ rulesVersion: "2025-01-28"
7
+ ---
8
+ # Markup Quality Guide
9
+
10
+ This guide enforces clean markup standards, semantic HTML usage, and proper pace-core component patterns to ensure maintainable, accessible, and consistent code.
11
+
12
+ ## pace-core First
13
+
14
+ ### MUST: Use pace-core Components
15
+
16
+ **MUST use pace-core components wherever possible:**
17
+
18
+ ```tsx
19
+ // ❌ WRONG: Custom button or native HTML element
20
+ <button className="btn-primary">Click me</button>
21
+ <input type="text" className="form-input" />
22
+
23
+ // ✅ CORRECT: Use pace-core components
24
+ import { Button, Input } from '@jmruthers/pace-core';
25
+ <Button>Click me</Button>
26
+ <Input type="text" />
27
+ ```
28
+
29
+ ### MUST NOT: Add Custom Styles to pace-core Components
30
+
31
+ **MUST NOT add custom styles when pace-core components already provide styling:**
32
+
33
+ ```tsx
34
+ // ❌ WRONG: Overriding pace-core component styles
35
+ <Button className="custom-button-style">Click me</Button>
36
+ <Card className="custom-card-layout">Content</Card>
37
+
38
+ // ✅ CORRECT: Use pace-core component variants/props
39
+ <Button variant="default">Click me</Button>
40
+ <Card>Content</Card>
41
+ ```
42
+
43
+ ### MUST: Rely on pace-core core.css
44
+
45
+ **MUST rely on pace-core `core.css` for typography, spacing, and visual presentation:**
46
+
47
+ ```tsx
48
+ // ❌ WRONG: Custom typography classes
49
+ <h1 className="text-2xl font-bold">Title</h1>
50
+ <p className="text-gray-500 mb-4">Description</p>
51
+
52
+ // ✅ CORRECT: Typography defined in pace-core core.css
53
+ <h1>Title</h1>
54
+ <p>Description</p>
55
+ ```
56
+
57
+ ### SHOULD: Fall Back to Semantic HTML
58
+
59
+ **SHOULD only use plain semantic HTML when no suitable pace-core component exists:**
60
+
61
+ ```tsx
62
+ // ✅ CORRECT: Use semantic HTML when pace-core doesn't provide component
63
+ <main>
64
+ <section>
65
+ <article>
66
+ <h2>Article Title</h2>
67
+ <p>Article content</p>
68
+ </article>
69
+ </section>
70
+ </main>
71
+ ```
72
+
73
+ ## Semantic HTML Only
74
+
75
+ ### MUST: Use Semantic HTML Elements
76
+
77
+ **MUST use semantic HTML elements for their intended purpose:**
78
+
79
+ ```tsx
80
+ // ❌ WRONG: Non-semantic elements
81
+ <div onClick={handleClick}>Click me</div>
82
+ <div className="header">Header</div>
83
+ <div className="footer">Footer</div>
84
+
85
+ // ✅ CORRECT: Semantic HTML elements
86
+ <button onClick={handleClick}>Click me</button>
87
+ <header>Header</header>
88
+ <footer>Footer</footer>
89
+ ```
90
+
91
+ ### MUST NOT: Use `<div>` Elements
92
+
93
+ **MUST NOT use `<div>` elements (except for the first child of `<body>` in `index.html`, React portals, or when required by third-party libraries that mandate specific DOM structure):**
94
+
95
+ ```tsx
96
+ // ❌ WRONG: Using div elements
97
+ <div className="container">
98
+ <div className="content">Content</div>
99
+ </div>
100
+
101
+ // ✅ CORRECT: Use semantic elements or React Fragments
102
+ <main>
103
+ <section>Content</section>
104
+ </main>
105
+ // Or for grouping without semantic meaning:
106
+ <>
107
+ <Component1 />
108
+ <Component2 />
109
+ </>
110
+ ```
111
+
112
+ ### MUST: Choose Most Semantic Element
113
+
114
+ **MUST choose the most semantically accurate element for the content:**
115
+
116
+ ```tsx
117
+ // ✅ CORRECT: Choose appropriate semantic elements
118
+ <main>Main content</main>
119
+ <section>Section of content</section>
120
+ <article>Article content</article>
121
+ <header>Header content</header>
122
+ <footer>Footer content</footer>
123
+ <nav>Navigation</nav>
124
+ <ul><li>List items</li></ul>
125
+ <p>Paragraph text</p>
126
+ ```
127
+
128
+ ## Typography & Styling
129
+
130
+ ### MUST NOT: Apply Typography Styles Directly
131
+
132
+ **MUST NOT apply typography styles directly to elements:**
133
+
134
+ ```tsx
135
+ // ❌ WRONG: Direct typography styling
136
+ <h1 className="text-2xl font-bold">Title</h1>
137
+ <p className="text-gray-500 leading-relaxed">Description</p>
138
+ <label className="text-sm uppercase">Label</label>
139
+
140
+ // ✅ CORRECT: Typography defined in pace-core core.css
141
+ <h1>Title</h1>
142
+ <p>Description</p>
143
+ <label>Label</label>
144
+ ```
145
+
146
+ ### MUST: Use pace-core Typography
147
+
148
+ **MUST rely on typography defined exclusively in `pace-core core.css`:**
149
+
150
+ ```tsx
151
+ // ✅ CORRECT: Typography comes from pace-core core.css
152
+ <h1>Heading 1</h1>
153
+ <h2>Heading 2</h2>
154
+ <h3>Heading 3</h3>
155
+ <p>Paragraph text</p>
156
+ <label>Form label</label>
157
+ ```
158
+
159
+ ### MUST NOT: Add Typography Utilities
160
+
161
+ **MUST NOT add utility classes, inline styles, or custom CSS for typography:**
162
+
163
+ ```tsx
164
+ // ❌ WRONG: Typography utilities or inline styles
165
+ <h1 className="text-3xl font-bold mb-4">Title</h1>
166
+ <p style={{ fontSize: '14px', color: 'gray' }}>Text</p>
167
+ <label className="uppercase tracking-wide">Label</label>
168
+
169
+ // ✅ CORRECT: No typography styling - pace-core handles it
170
+ <h1>Title</h1>
171
+ <p>Text</p>
172
+ <label>Label</label>
173
+ ```
174
+
175
+ ## React Structure Rules
176
+
177
+ ### MUST NOT: Add Wrapper Elements for Single Root
178
+
179
+ **MUST NOT add wrapper elements solely to satisfy React's single-root requirement:**
180
+
181
+ ```tsx
182
+ // ❌ WRONG: Unnecessary wrapper for single root
183
+ function Component() {
184
+ return (
185
+ <div>
186
+ <Header />
187
+ <Main />
188
+ <Footer />
189
+ </div>
190
+ );
191
+ }
192
+
193
+ // ✅ CORRECT: Use React Fragment
194
+ function Component() {
195
+ return (
196
+ <>
197
+ <Header />
198
+ <Main />
199
+ <Footer />
200
+ </>
201
+ );
202
+ }
203
+ ```
204
+
205
+ ### MUST: Use React Fragments
206
+
207
+ **MUST use React Fragments for grouping without adding DOM elements:**
208
+
209
+ ```tsx
210
+ // ✅ CORRECT: Use React Fragments
211
+ function Component() {
212
+ return (
213
+ <>
214
+ <Component1 />
215
+ <Component2 />
216
+ <Component3 />
217
+ </>
218
+ );
219
+ }
220
+ ```
221
+
222
+ ### MUST NOT: Add Extra Elements
223
+
224
+ **MUST NOT introduce extra elements that provide no semantic or functional value:**
225
+
226
+ ```tsx
227
+ // ❌ WRONG: Extra wrapper with no purpose
228
+ <article>
229
+ <div>
230
+ <h2>Title</h2>
231
+ <p>Content</p>
232
+ </div>
233
+ </article>
234
+
235
+ // ✅ CORRECT: Direct semantic structure
236
+ <article>
237
+ <h2>Title</h2>
238
+ <p>Content</p>
239
+ </article>
240
+ ```
241
+
242
+ ## Styling & Layout Discipline
243
+
244
+ ### MUST NOT: Add Wrappers for Styling
245
+
246
+ **MUST NOT add wrapper elements just to apply styles:**
247
+
248
+ ```tsx
249
+ // ❌ WRONG: Wrapper element for styling only
250
+ <div className="flex gap-4">
251
+ <Button>Button 1</Button>
252
+ <Button>Button 2</Button>
253
+ </div>
254
+
255
+ // ✅ CORRECT: Apply styles to existing parent or use pace-core components
256
+ <section className="flex gap-4">
257
+ <Button>Button 1</Button>
258
+ <Button>Button 2</Button>
259
+ </section>
260
+ // Or if no semantic parent exists, leave unstyled or use pace-core layout components
261
+ ```
262
+
263
+ ### SHOULD: Apply Styles to Existing Elements
264
+
265
+ **SHOULD apply styles to existing parent components:**
266
+
267
+ ```tsx
268
+ // ✅ CORRECT: Apply styles to semantic parent
269
+ <main className="flex flex-col gap-4">
270
+ <section>Content 1</section>
271
+ <section>Content 2</section>
272
+ </main>
273
+ ```
274
+
275
+ ### SHOULD: Leave Unstyled When Appropriate
276
+
277
+ **SHOULD leave elements unstyled if styles aren't necessary:**
278
+
279
+ ```tsx
280
+ // ✅ CORRECT: Unstyled semantic structure
281
+ <article>
282
+ <h2>Title</h2>
283
+ <p>Content</p>
284
+ </article>
285
+ ```
286
+
287
+ ### MUST: Use pace-core for Layout
288
+
289
+ **MUST assume most layout and styling will be handled by pace-core, not ad-hoc wrappers:**
290
+
291
+ ```tsx
292
+ // ❌ WRONG: Custom layout wrapper
293
+ <div className="grid grid-cols-2 gap-4">
294
+ <Card>Card 1</Card>
295
+ <Card>Card 2</Card>
296
+ </div>
297
+
298
+ // ✅ CORRECT: Use pace-core layout components or apply to semantic parent
299
+ <section className="grid grid-cols-2 gap-4">
300
+ <Card>Card 1</Card>
301
+ <Card>Card 2</Card>
302
+ </section>
303
+ ```
304
+
305
+ ## Element Minimisation
306
+
307
+ ### MUST: Use Fewest Elements Possible
308
+
309
+ **MUST use the fewest elements possible to achieve the desired structure:**
310
+
311
+ ```tsx
312
+ // ❌ WRONG: Unnecessary nesting
313
+ <main>
314
+ <div>
315
+ <section>
316
+ <div>
317
+ <article>Content</article>
318
+ </div>
319
+ </section>
320
+ </div>
321
+ </main>
322
+
323
+ // ✅ CORRECT: Minimal structure
324
+ <main>
325
+ <section>
326
+ <article>Content</article>
327
+ </section>
328
+ </main>
329
+ ```
330
+
331
+ ### MUST NOT: Create Redundant Nesting
332
+
333
+ **MUST NOT create redundant nesting:**
334
+
335
+ ```tsx
336
+ // ❌ WRONG: Redundant wrapper
337
+ <article>
338
+ <div>
339
+ <h2>Title</h2>
340
+ </div>
341
+ <div>
342
+ <p>Content</p>
343
+ </div>
344
+ </article>
345
+
346
+ // ✅ CORRECT: Direct structure
347
+ <article>
348
+ <h2>Title</h2>
349
+ <p>Content</p>
350
+ </article>
351
+ ```
352
+
353
+ ### MUST: Clear Semantic Purpose
354
+
355
+ **MUST ensure every element has a clear semantic purpose:**
356
+
357
+ ```tsx
358
+ // ❌ WRONG: Element without semantic purpose
359
+ <div>
360
+ <Component1 />
361
+ <Component2 />
362
+ </div>
363
+
364
+ // ✅ CORRECT: Semantic purpose or Fragment
365
+ <section>
366
+ <Component1 />
367
+ <Component2 />
368
+ </section>
369
+ // Or if no semantic grouping needed:
370
+ <>
371
+ <Component1 />
372
+ <Component2 />
373
+ </>
374
+ ```
375
+
376
+ ## Prohibited Patterns
377
+
378
+ ### MUST NOT: Use These Patterns
379
+
380
+ **MUST NOT use the following patterns:**
381
+
382
+ 1. **`<div>` elements** - Use semantic HTML or React Fragments instead
383
+ 2. **Wrapper elements for styling only** - Apply styles to existing elements or use pace-core components
384
+ 3. **Wrapper elements as sole child** - Use React Fragments instead
385
+ 4. **Custom typography classes** - Typography is defined in pace-core core.css
386
+ 5. **Inline styles for typography** - Use pace-core typography
387
+ 6. **Duplicating pace-core layout/visuals** - Use pace-core components instead
388
+
389
+ ```tsx
390
+ // ❌ WRONG: All prohibited patterns
391
+ <div className="wrapper">
392
+ <div className="content">
393
+ <h1 className="text-2xl font-bold">Title</h1>
394
+ <p style={{ color: 'gray' }}>Text</p>
395
+ </div>
396
+ </div>
397
+
398
+ // ✅ CORRECT: Clean, semantic markup
399
+ <main>
400
+ <section>
401
+ <h1>Title</h1>
402
+ <p>Text</p>
403
+ </section>
404
+ </main>
405
+ ```
406
+
407
+ ## Expected Outcome
408
+
409
+ ### Code Quality Goals
410
+
411
+ Code produced under these rules SHOULD:
412
+
413
+ - **Be semantically correct** - Use appropriate HTML elements for their purpose
414
+ - **Be visually consistent** - Rely on pace-core for styling and typography
415
+ - **Contain minimal markup** - Use fewest elements necessary
416
+ - **Avoid unnecessary abstraction** - No wrappers without purpose
417
+ - **Remain easy to reason about** - Clear structure and purpose
418
+ - **Be easy to refactor** - Minimal coupling and dependencies
419
+
420
+ ### Decision Tree
421
+
422
+ **When in doubt, follow this decision tree:**
423
+
424
+ 1. **Does pace-core provide a component?** → Use pace-core component
425
+ 2. **Is a semantic HTML element appropriate?** → Use semantic element (`<main>`, `<section>`, `<article>`, etc.)
426
+ 3. **Do I need to group elements without semantic meaning?** → Use React Fragment (`<>...</>`)
427
+ 4. **Do I need styling?** → Apply to existing semantic parent or use pace-core layout components
428
+ 5. **Still unsure?** → Remove the element, remove the style, and rely on pace-core or semantic HTML
429
+
430
+ ## Markup Quality Checklist
431
+
432
+ Before committing code, verify:
433
+
434
+ - [ ] No `<div>` elements (except first child of `<body>` in `index.html`)
435
+ - [ ] pace-core components used where available
436
+ - [ ] Semantic HTML elements used appropriately
437
+ - [ ] No typography styling applied directly
438
+ - [ ] No wrapper elements for styling only
439
+ - [ ] React Fragments used instead of unnecessary wrappers
440
+ - [ ] Minimal element nesting
441
+ - [ ] Every element has clear semantic purpose
442
+ - [ ] No custom styles overriding pace-core components
443
+ - [ ] Layout handled by pace-core or semantic parents
444
+ - [ ] Code is semantically correct and accessible
445
+
446
+ ## Reference
447
+
448
+ - **pace-core Components**: See `00-pace-core-compliance.mdc` for component usage
449
+ - **Semantic HTML**: https://developer.mozilla.org/en-US/docs/Glossary/Semantics
450
+ - **React Fragments**: https://react.dev/reference/react/Fragment
451
+ - **Accessibility**: See `06-code-quality.mdc` for accessibility requirements
452
+ - **When in doubt**: Remove the element, remove the style, and rely on pace-core or semantic HTML