@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
@@ -51,75 +51,80 @@ function checkTypedocInstallation() {
51
51
 
52
52
  // Main validation function
53
53
  async function runPrePublishValidation() {
54
- logger.info('Running validation steps...');
55
- logger.newline();
56
-
57
- // Step 1: Type check
58
- logger.step('Step 1: Type check');
59
- const typeCheck = await runCommand('npm', ['run', 'type-check'], {
60
- cwd: packageRoot,
61
- timeout: DEFAULT_TIMEOUT,
62
- });
63
- if (!typeCheck.success) {
64
- logger.error('Type check failed');
65
- return false;
66
- }
67
-
68
- // Step 2: Build validation
69
- logger.newline();
70
- logger.step('Step 2: Build validation');
71
- const build = await runCommand('npm', ['run', 'build'], {
72
- cwd: packageRoot,
73
- timeout: getDefaultTimeout(60000, 180000),
74
- });
75
- if (!build.success) {
76
- logger.error('Build failed');
77
- return false;
78
- }
79
-
80
- // Step 3: Test validation - now uses standardized test execution
81
- logger.newline();
82
- logger.step('Step 3: Test validation');
83
- const tests = await runStandardizedTests(packageRoot, repoRoot, TEST_TIMEOUT);
84
- if (!tests.success) {
85
- logger.error('Tests failed');
86
- return false;
87
- }
88
-
89
- // Step 4: Documentation generation
90
- logger.newline();
91
- logger.step('Step 4: Documentation generation');
92
- if (!checkTypedocInstallation()) {
93
- logger.error('TypeDoc validation failed');
94
- return false;
95
- }
54
+ try {
55
+ logger.info('Running validation steps...');
56
+ logger.newline();
96
57
 
97
- const docs = await runCommand('npm', ['run', 'build:docs'], {
98
- cwd: packageRoot,
99
- timeout: getDefaultTimeout(120000, 240000),
100
- });
101
- if (!docs.success) {
102
- logger.error('Documentation generation failed');
103
- return false;
104
- }
58
+ // Step 1: Type check
59
+ logger.step('Step 1: Type check');
60
+ const typeCheck = await runCommand('npm', ['run', 'type-check'], {
61
+ cwd: packageRoot,
62
+ timeout: DEFAULT_TIMEOUT,
63
+ });
64
+ if (!typeCheck.success) {
65
+ logger.error('Type check failed');
66
+ return false;
67
+ }
68
+
69
+ // Step 2: Build validation
70
+ logger.newline();
71
+ logger.step('Step 2: Build validation');
72
+ const build = await runCommand('npm', ['run', 'build'], {
73
+ cwd: packageRoot,
74
+ timeout: getDefaultTimeout(60000, 180000),
75
+ });
76
+ if (!build.success) {
77
+ logger.error('Build failed');
78
+ return false;
79
+ }
80
+
81
+ // Step 3: Test validation - now uses standardized test execution
82
+ logger.newline();
83
+ logger.step('Step 3: Test validation');
84
+ const tests = await runStandardizedTests(packageRoot, repoRoot, TEST_TIMEOUT);
85
+ if (!tests.success) {
86
+ logger.error('Tests failed');
87
+ return false;
88
+ }
89
+
90
+ // Step 4: Documentation generation
91
+ logger.newline();
92
+ logger.step('Step 4: Documentation generation');
93
+ if (!checkTypedocInstallation()) {
94
+ logger.error('TypeDoc validation failed');
95
+ return false;
96
+ }
97
+
98
+ const docs = await runCommand('npm', ['run', 'build:docs'], {
99
+ cwd: packageRoot,
100
+ timeout: getDefaultTimeout(120000, 240000),
101
+ });
102
+ if (!docs.success) {
103
+ logger.error('Documentation generation failed');
104
+ return false;
105
+ }
106
+
107
+ // Step 5: Format validation
108
+ logger.newline();
109
+ logger.step('Step 5: Format validation');
110
+ const format = await runCommand('npm', ['run', 'format:check'], {
111
+ cwd: packageRoot,
112
+ timeout: DEFAULT_TIMEOUT,
113
+ });
114
+ if (!format.success) {
115
+ logger.error('Format validation failed');
116
+ return false;
117
+ }
105
118
 
106
- // Step 5: Format validation
107
- logger.newline();
108
- logger.step('Step 5: Format validation');
109
- const format = await runCommand('npm', ['run', 'format:check'], {
110
- cwd: packageRoot,
111
- timeout: DEFAULT_TIMEOUT,
112
- });
113
- if (!format.success) {
114
- logger.error('Format validation failed');
119
+ logger.newline();
120
+ logger.header('PRE-PUBLISH VALIDATION SUMMARY');
121
+ logger.success('All validation steps passed successfully!');
122
+ logger.success('Package meets publication requirements');
123
+ return true;
124
+ } catch (error) {
125
+ logger.error(`Pre-publish validation error: ${error.message}`);
115
126
  return false;
116
127
  }
117
-
118
- logger.newline();
119
- logger.header('PRE-PUBLISH VALIDATION SUMMARY');
120
- logger.success('All validation steps passed successfully!');
121
- logger.success('Package meets publication requirements');
122
- return true;
123
128
  }
124
129
 
125
130
  // Run the validation
@@ -246,7 +246,7 @@ interface CustomRenderOptions extends Omit<RenderOptions, 'wrapper'> {
246
246
  }
247
247
 
248
248
  export function renderWithProviders(
249
- ui: React.ReactElement,
249
+ ui: React.ReactElement<any>,
250
250
  options: CustomRenderOptions = {}
251
251
  ) {
252
252
  const {
@@ -48,7 +48,7 @@ interface CustomRenderOptions extends Omit<RenderOptions, 'wrapper'> {
48
48
  }
49
49
 
50
50
  export function renderWithProviders(
51
- ui: ReactElement,
51
+ ui: ReactElement<any>,
52
52
  options: CustomRenderOptions = {}
53
53
  ): ReturnType<typeof render> {
54
54
  const {
@@ -143,7 +143,7 @@ describe('usePermissions Hook Stability', () => {
143
143
  mockIsPermittedCached.mockResolvedValue(true);
144
144
 
145
145
  const { result, rerender } = renderHook(() =>
146
- useCan(mockUserId, mockScope, 'read:users', 'page-123', true)
146
+ useCan(mockUserId, mockScope, 'read:users', 'page-123', true, false)
147
147
  );
148
148
 
149
149
  // Wait for initial load
@@ -171,7 +171,7 @@ describe('usePermissions Hook Stability', () => {
171
171
  .mockResolvedValueOnce(true);
172
172
 
173
173
  const { result, rerender } = renderHook(() =>
174
- useCan(mockUserId, mockScope, 'read:users', 'page-123', true)
174
+ useCan(mockUserId, mockScope, 'read:users', 'page-123', true, false)
175
175
  );
176
176
 
177
177
  // Wait for initial load
@@ -80,7 +80,7 @@ describe('Alert Component', () => {
80
80
  it('renders with children content', () => {
81
81
  renderWithProviders(
82
82
  <Alert>
83
- <div data-testid="custom-content">Custom content</div>
83
+ <span data-testid="custom-content">Custom content</span>
84
84
  </Alert>
85
85
  );
86
86
 
@@ -330,14 +330,10 @@ describe('Alert Component', () => {
330
330
  it('works with icons and actions', () => {
331
331
  renderWithProviders(
332
332
  <Alert>
333
- <div className="flex items-center gap-2">
334
- <span>⚠️</span>
335
- <div>
336
- <AlertTitle>Warning</AlertTitle>
337
- <AlertDescription>Please check your input</AlertDescription>
338
- </div>
339
- <button>Dismiss</button>
340
- </div>
333
+ <span>⚠️</span>
334
+ <AlertTitle>Warning</AlertTitle>
335
+ <AlertDescription>Please check your input</AlertDescription>
336
+ <button>Dismiss</button>
341
337
  </Alert>
342
338
  );
343
339
 
@@ -484,7 +480,7 @@ describe('Alert Component', () => {
484
480
 
485
481
  it('works with multiple alerts', () => {
486
482
  renderWithProviders(
487
- <div>
483
+ <>
488
484
  <Alert variant="default">
489
485
  <AlertTitle>Info</AlertTitle>
490
486
  <AlertDescription>Information message</AlertDescription>
@@ -493,7 +489,7 @@ describe('Alert Component', () => {
493
489
  <AlertTitle>Error</AlertTitle>
494
490
  <AlertDescription>Error message</AlertDescription>
495
491
  </Alert>
496
- </div>
492
+ </>
497
493
  );
498
494
 
499
495
  const alerts = screen.getAllByRole('alert');
@@ -509,13 +505,11 @@ describe('Alert Component', () => {
509
505
  <Alert>
510
506
  <AlertTitle>Complex Alert</AlertTitle>
511
507
  <AlertDescription>
512
- <div>
513
- <p>This is a complex description with</p>
514
- <ul>
515
- <li>Multiple elements</li>
516
- <li>Nested content</li>
517
- </ul>
518
- </div>
508
+ This is a complex description with
509
+ <ul>
510
+ <li>Multiple elements</li>
511
+ <li>Nested content</li>
512
+ </ul>
519
513
  </AlertDescription>
520
514
  </Alert>
521
515
  );
@@ -18,22 +18,20 @@
18
18
  *
19
19
  * @example
20
20
  * ```tsx
21
- * // Basic alert
21
+ * // Basic alert (renders as <aside> with <h5> title and <p> description)
22
22
  * <Alert>
23
23
  * <AlertTitle>Success</AlertTitle>
24
24
  * <AlertDescription>Your changes have been saved.</AlertDescription>
25
25
  * </Alert>
26
26
  *
27
- * // Destructive alert with icon
27
+ * // Destructive alert with icon (renders as <aside> with <h5> title and <p> description)
28
28
  * <Alert variant="destructive">
29
29
  * <ErrorIcon />
30
- * <div>
31
- * <AlertTitle>Error</AlertTitle>
32
- * <AlertDescription>Something went wrong.</AlertDescription>
33
- * </div>
30
+ * <AlertTitle>Error</AlertTitle>
31
+ * <AlertDescription>Something went wrong.</AlertDescription>
34
32
  * </Alert>
35
33
  *
36
- * // Inline alert (renders as fragment with strong/span)
34
+ * // Inline alert (renders as React.Fragment with <strong> title and <span> description)
37
35
  * <Alert variant="inline">
38
36
  * <AlertTitle>Note:</AlertTitle>
39
37
  * <AlertDescription>This is an inline message.</AlertDescription>
@@ -409,13 +409,13 @@ describe('Avatar Component', () => {
409
409
  describe('Integration', () => {
410
410
  it('works within user profile components', () => {
411
411
  renderWithProviders(
412
- <div className="user-profile">
412
+ <section className="user-profile">
413
413
  <Avatar src="/user.jpg" alt="Profile" fallback="UP" />
414
- <div>
414
+ <section>
415
415
  <h3>User Name</h3>
416
416
  <p>User description</p>
417
- </div>
418
- </div>
417
+ </section>
418
+ </section>
419
419
  );
420
420
 
421
421
  expect(screen.getByAltText('Profile')).toBeInTheDocument();
@@ -49,6 +49,14 @@ import { cn } from '../../utils/core/cn';
49
49
  // TYPE DEFINITIONS
50
50
  // ============================================================================
51
51
 
52
+ /**
53
+ * Badge variant type
54
+ * Defines the visual style, color palette, and shade intensity of the badge.
55
+ * Format: {style}-{color}-{shade}
56
+ * - style: 'solid' | 'outline' | 'soft'
57
+ * - color: 'main' | 'sec' | 'acc'
58
+ * - shade: 'muted' | 'normal' | 'strong'
59
+ */
52
60
  export type BadgeVariant =
53
61
  | 'solid-main-muted' | 'solid-main-normal' | 'solid-main-strong'
54
62
  | 'solid-sec-muted' | 'solid-sec-normal' | 'solid-sec-strong'
@@ -60,6 +68,12 @@ export type BadgeVariant =
60
68
  | 'soft-sec-muted' | 'soft-sec-normal' | 'soft-sec-strong'
61
69
  | 'soft-acc-muted' | 'soft-acc-normal' | 'soft-acc-strong';
62
70
 
71
+ /**
72
+ * Badge component props
73
+ * Extends standard HTML span attributes with badge-specific styling options.
74
+ *
75
+ * @interface BadgeProps
76
+ */
63
77
  export interface BadgeProps extends React.HTMLAttributes<HTMLSpanElement> {
64
78
  /** Visual variant of the badge (style-color-shade) */
65
79
  variant?: BadgeVariant;
@@ -251,8 +265,7 @@ function getBadgeClasses(variant: BadgeVariant = 'solid-main-normal'): string {
251
265
  * <Badge variant="soft-acc-strong">Featured</Badge>
252
266
  * ```
253
267
  */
254
- const Badge = React.forwardRef<HTMLSpanElement, BadgeProps>(
255
- ({ className, variant = 'solid-main-normal', ...props }, ref) => {
268
+ function Badge({ className, variant = 'solid-main-normal', ref, ...props }: BadgeProps & { ref?: React.Ref<HTMLSpanElement> }) {
256
269
  const isSoftVariant = variant.startsWith('soft-');
257
270
 
258
271
  if (isSoftVariant) {
@@ -291,8 +304,7 @@ const Badge = React.forwardRef<HTMLSpanElement, BadgeProps>(
291
304
  {...props}
292
305
  />
293
306
  );
294
- }
295
- );
307
+ }
296
308
 
297
309
  Badge.displayName = 'Badge';
298
310
 
@@ -53,6 +53,16 @@ import { Tooltip } from '../Tooltip';
53
53
  // BASE BUTTON COMPONENT
54
54
  // ============================================================================
55
55
 
56
+ /**
57
+ * Button component props
58
+ * Extends standard HTML button attributes with button-specific styling and behavior options.
59
+ *
60
+ * @interface ButtonProps
61
+ */
62
+ /**
63
+ * Props for the Button component.
64
+ * Extends standard button HTML attributes.
65
+ */
56
66
  export interface ButtonProps extends React.ButtonHTMLAttributes<HTMLButtonElement> {
57
67
  /** Visual variant of the button */
58
68
  variant?: 'default' | 'destructive' | 'outline' | 'secondary' | 'ghost' | 'link';
@@ -127,6 +137,12 @@ Button.displayName = 'Button';
127
137
  // BUTTON GROUP COMPONENT
128
138
  // ============================================================================
129
139
 
140
+ /**
141
+ * ButtonGroup component props
142
+ * Configuration for grouping multiple buttons with consistent styling and spacing.
143
+ *
144
+ * @interface ButtonGroupProps
145
+ */
130
146
  export type ButtonGroupProps = {
131
147
  /** Child elements to be rendered in the group */
132
148
  children: React.ReactNode;
@@ -198,11 +214,12 @@ export function ButtonGroup({
198
214
  // Type assertion needed because React.ComponentType doesn't guarantee displayName
199
215
  const componentType = child.type as React.ComponentType<unknown> & { displayName?: string };
200
216
  if (componentType.displayName === 'Button') {
217
+ const childProps = child.props as { variant?: string; size?: string; [key: string]: unknown };
201
218
  return React.cloneElement(child, {
202
- variant: child.props.variant || variant,
203
- size: child.props.size || size,
204
- ...child.props
205
- });
219
+ variant: childProps.variant || variant,
220
+ size: childProps.size || size,
221
+ ...childProps
222
+ } as typeof childProps);
206
223
  }
207
224
  }
208
225
  return child;
@@ -215,6 +232,12 @@ export function ButtonGroup({
215
232
  // ICON BUTTON COMPONENT
216
233
  // ============================================================================
217
234
 
235
+ /**
236
+ * IconButton component props
237
+ * Extends ButtonProps but requires an icon and aria-label instead of children.
238
+ *
239
+ * @interface IconButtonProps
240
+ */
218
241
  export type IconButtonProps = Omit<ButtonProps, 'children'> & {
219
242
  /** The icon element to display in the button */
220
243
  icon: React.ReactNode;
@@ -89,6 +89,10 @@ type RootProps = {
89
89
  // CALENDAR COMPONENT
90
90
  // ============================================================================
91
91
 
92
+ /**
93
+ * Props for the Calendar component.
94
+ * Extends DayPickerProps with pace-core specific customizations.
95
+ */
92
96
  export interface CalendarProps extends Omit<DayPickerProps, 'className' | 'classNames' | 'styles' | 'onSelect'> {
93
97
  /**
94
98
  * Additional CSS classes to apply to the calendar table
@@ -350,7 +354,7 @@ const Calendar = React.forwardRef<HTMLTableElement, CalendarProps>(
350
354
  goToMonth(nextMonth);
351
355
  };
352
356
 
353
- const monthGridElement = monthGridChild as React.ReactElement & {
357
+ const monthGridElement = monthGridChild as React.ReactElement<any> & {
354
358
  ref?: React.Ref<HTMLTableElement | null>;
355
359
  };
356
360
  const mergedRef =
@@ -416,8 +420,10 @@ const Calendar = React.forwardRef<HTMLTableElement, CalendarProps>(
416
420
  </>
417
421
  );
418
422
  }
419
-
420
- return child;
423
+
424
+ return React.isValidElement(child)
425
+ ? React.cloneElement(child, { key: child.key ?? `calendar-child-${index}` })
426
+ : child;
421
427
  })}
422
428
  </>
423
429
  );
@@ -65,6 +65,10 @@ import * as React from "react"
65
65
  import { useNavigate } from "react-router-dom"
66
66
  import { cn } from "../../utils/core/cn"
67
67
 
68
+ /**
69
+ * Props for the Card component.
70
+ * Extends standard HTML attributes for semantic HTML elements.
71
+ */
68
72
  export interface CardProps extends React.HTMLAttributes<HTMLElement> {
69
73
  /** Visual variant of the card */
70
74
  variant?: 'default' | 'outline' | 'ghost';
@@ -235,10 +235,10 @@ describe('Checkbox Component', () => {
235
235
 
236
236
  it('supports aria-labelledby', () => {
237
237
  renderWithProviders(
238
- <div>
238
+ <>
239
239
  <label id="terms-label">Accept terms and conditions</label>
240
240
  <Checkbox aria-labelledby="terms-label" />
241
- </div>
241
+ </>
242
242
  );
243
243
  const checkbox = screen.getByRole('checkbox', { name: 'Accept terms and conditions' });
244
244
  expect(checkbox).toBeInTheDocument();
@@ -246,10 +246,10 @@ describe('Checkbox Component', () => {
246
246
 
247
247
  it('supports aria-describedby', () => {
248
248
  renderWithProviders(
249
- <div>
249
+ <>
250
250
  <Checkbox aria-describedby="terms-help" />
251
- <div id="terms-help">Please read the terms carefully</div>
252
- </div>
251
+ <span id="terms-help">Please read the terms carefully</span>
252
+ </>
253
253
  );
254
254
  const checkbox = screen.getByRole('checkbox');
255
255
  expect(checkbox).toHaveAttribute('aria-describedby', 'terms-help');
@@ -319,10 +319,10 @@ describe('Checkbox Component', () => {
319
319
  describe('Form Integration', () => {
320
320
  it('works with form labels', () => {
321
321
  renderWithProviders(
322
- <div>
322
+ <>
323
323
  <label htmlFor="terms-checkbox">Accept terms and conditions</label>
324
324
  <Checkbox id="terms-checkbox" />
325
- </div>
325
+ </>
326
326
  );
327
327
 
328
328
  const checkbox = screen.getByRole('checkbox');
@@ -388,11 +388,11 @@ describe('Checkbox Component', () => {
388
388
  describe('Integration', () => {
389
389
  it('works with multiple checkboxes', () => {
390
390
  renderWithProviders(
391
- <div>
391
+ <>
392
392
  <Checkbox id="option1" />
393
393
  <Checkbox id="option2" />
394
394
  <Checkbox id="option3" />
395
- </div>
395
+ </>
396
396
  );
397
397
 
398
398
  expect(screen.getAllByRole('checkbox')).toHaveLength(3);
@@ -420,13 +420,13 @@ describe('Checkbox Component', () => {
420
420
  const TestComponent = () => {
421
421
  const [checked, setChecked] = React.useState(false);
422
422
  return (
423
- <div>
423
+ <>
424
424
  <Checkbox
425
425
  checked={checked}
426
426
  onCheckedChange={setChecked}
427
427
  />
428
428
  <span data-testid="status">{checked ? 'checked' : 'unchecked'}</span>
429
- </div>
429
+ </>
430
430
  );
431
431
  };
432
432
 
@@ -470,7 +470,7 @@ describe('Checkbox Component', () => {
470
470
  ));
471
471
 
472
472
  const startTime = performance.now();
473
- renderWithProviders(<div>{checkboxes}</div>);
473
+ renderWithProviders(<>{checkboxes}</>);
474
474
  const endTime = performance.now();
475
475
 
476
476
  // Performance test: verify rendering completes in reasonable time
@@ -21,10 +21,10 @@
21
21
  * <Checkbox />
22
22
  *
23
23
  * // With label
24
- * <div className="flex items-center space-x-2">
24
+ * <>
25
25
  * <Checkbox id="terms" />
26
26
  * <label htmlFor="terms">Accept terms and conditions</label>
27
- * </div>
27
+ * </>
28
28
  *
29
29
  * // Disabled state
30
30
  * <Checkbox disabled />