@jmruthers/pace-core 0.5.191 → 0.6.1

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 (380) hide show
  1. package/CHANGELOG.md +29 -0
  2. package/README.md +7 -1
  3. package/cursor-rules/00-pace-core-compliance.mdc +372 -0
  4. package/cursor-rules/01-standards-compliance.mdc +275 -0
  5. package/cursor-rules/02-project-structure.mdc +200 -0
  6. package/cursor-rules/03-solid-principles.mdc +341 -0
  7. package/cursor-rules/04-testing-standards.mdc +315 -0
  8. package/cursor-rules/05-bug-reports-and-features.mdc +246 -0
  9. package/cursor-rules/06-code-quality.mdc +392 -0
  10. package/cursor-rules/07-tech-stack-compliance.mdc +309 -0
  11. package/cursor-rules/CHANGELOG.md +101 -0
  12. package/cursor-rules/README.md +191 -0
  13. package/dist/{AuthService-CbP_utw2.d.ts → AuthService-DjnJHDtC.d.ts} +1 -0
  14. package/dist/{DataTable-Be6dH_dR.d.ts → DataTable-CH1U5Tpy.d.ts} +1 -1
  15. package/dist/{DataTable-WKRZD47S.js → DataTable-DQ7RSOHE.js} +8 -7
  16. package/dist/{PublicPageProvider-ULXC_u6U.d.ts → PublicPageProvider-ce4xlHYA.d.ts} +37 -156
  17. package/dist/{UnifiedAuthProvider-BYA9qB-o.d.ts → UnifiedAuthProvider-185Ih4dj.d.ts} +2 -0
  18. package/dist/{UnifiedAuthProvider-FTSG5XH7.js → UnifiedAuthProvider-ATAP5UTR.js} +3 -3
  19. package/dist/{api-IHKALJZD.js → api-N774RPUA.js} +2 -2
  20. package/dist/{chunk-6C4YBBJM.js → chunk-3QRJFVBR.js} +1 -1
  21. package/dist/chunk-3QRJFVBR.js.map +1 -0
  22. package/dist/{chunk-OETXORNB.js → chunk-3XTALGJF.js} +211 -136
  23. package/dist/chunk-3XTALGJF.js.map +1 -0
  24. package/dist/{chunk-6TQDD426.js → chunk-4N5C5XZU.js} +47 -228
  25. package/dist/chunk-4N5C5XZU.js.map +1 -0
  26. package/dist/{chunk-LOMZXPSN.js → chunk-4ZC4GX36.js} +47 -74
  27. package/dist/chunk-4ZC4GX36.js.map +1 -0
  28. package/dist/{chunk-6LTQQAT6.js → chunk-BYFSK72L.js} +357 -158
  29. package/dist/chunk-BYFSK72L.js.map +1 -0
  30. package/dist/{chunk-XYXSXPUK.js → chunk-EXUD6RNJ.js} +50 -10
  31. package/dist/chunk-EXUD6RNJ.js.map +1 -0
  32. package/dist/{chunk-VKB2CO4Z.js → chunk-GLK6VM3F.js} +244 -249
  33. package/dist/chunk-GLK6VM3F.js.map +1 -0
  34. package/dist/{chunk-HW3OVDUF.js → chunk-J36DSWQK.js} +1 -1
  35. package/dist/{chunk-HW3OVDUF.js.map → chunk-J36DSWQK.js.map} +1 -1
  36. package/dist/{chunk-XNYQOL3Z.js → chunk-JBKQ3SAO.js} +9 -18
  37. package/dist/chunk-JBKQ3SAO.js.map +1 -0
  38. package/dist/{chunk-ROXMHMY2.js → chunk-KNC55RTG.js} +13 -3
  39. package/dist/{chunk-ROXMHMY2.js.map → chunk-KNC55RTG.js.map} +1 -1
  40. package/dist/{chunk-QWWZ5CAQ.js → chunk-LXQLPRQ2.js} +2 -2
  41. package/dist/{chunk-ULHIJK66.js → chunk-T33XF5ZC.js} +255 -140
  42. package/dist/chunk-T33XF5ZC.js.map +1 -0
  43. package/dist/{chunk-VRGWKHDB.js → chunk-XM25TVIE.js} +100 -33
  44. package/dist/chunk-XM25TVIE.js.map +1 -0
  45. package/dist/components.d.ts +4 -4
  46. package/dist/components.js +9 -9
  47. package/dist/hooks.d.ts +6 -6
  48. package/dist/hooks.js +20 -25
  49. package/dist/hooks.js.map +1 -1
  50. package/dist/index.d.ts +11 -11
  51. package/dist/index.js +18 -21
  52. package/dist/index.js.map +1 -1
  53. package/dist/providers.d.ts +3 -3
  54. package/dist/providers.js +2 -2
  55. package/dist/rbac/index.d.ts +2 -20
  56. package/dist/rbac/index.js +7 -9
  57. package/dist/{usePublicRouteParams-TZe0gy-4.d.ts → usePublicRouteParams-BJAlWfuJ.d.ts} +3 -3
  58. package/dist/{useToast-C8gR5ir4.d.ts → useToast-AyaT-x7p.d.ts} +2 -2
  59. package/dist/utils.d.ts +1 -1
  60. package/dist/utils.js +3 -3
  61. package/docs/api/classes/ColumnFactory.md +1 -1
  62. package/docs/api/classes/ErrorBoundary.md +1 -1
  63. package/docs/api/classes/InvalidScopeError.md +1 -1
  64. package/docs/api/classes/Logger.md +1 -1
  65. package/docs/api/classes/MissingUserContextError.md +1 -1
  66. package/docs/api/classes/OrganisationContextRequiredError.md +1 -1
  67. package/docs/api/classes/PermissionDeniedError.md +2 -2
  68. package/docs/api/classes/RBACAuditManager.md +2 -2
  69. package/docs/api/classes/RBACCache.md +1 -1
  70. package/docs/api/classes/RBACEngine.md +2 -2
  71. package/docs/api/classes/RBACError.md +1 -1
  72. package/docs/api/classes/RBACNotInitializedError.md +1 -1
  73. package/docs/api/classes/SecureSupabaseClient.md +10 -10
  74. package/docs/api/classes/StorageUtils.md +1 -1
  75. package/docs/api/enums/FileCategory.md +1 -1
  76. package/docs/api/enums/LogLevel.md +1 -1
  77. package/docs/api/enums/RBACErrorCode.md +1 -1
  78. package/docs/api/enums/RPCFunction.md +1 -1
  79. package/docs/api/interfaces/AddressFieldProps.md +1 -1
  80. package/docs/api/interfaces/AddressFieldRef.md +1 -1
  81. package/docs/api/interfaces/AggregateConfig.md +1 -1
  82. package/docs/api/interfaces/AutocompleteOptions.md +1 -1
  83. package/docs/api/interfaces/AvatarProps.md +1 -1
  84. package/docs/api/interfaces/BadgeProps.md +1 -1
  85. package/docs/api/interfaces/ButtonProps.md +1 -1
  86. package/docs/api/interfaces/CalendarProps.md +1 -1
  87. package/docs/api/interfaces/CardProps.md +1 -1
  88. package/docs/api/interfaces/ColorPalette.md +1 -1
  89. package/docs/api/interfaces/ColorShade.md +1 -1
  90. package/docs/api/interfaces/ComplianceResult.md +1 -1
  91. package/docs/api/interfaces/DataAccessRecord.md +1 -1
  92. package/docs/api/interfaces/DataRecord.md +1 -1
  93. package/docs/api/interfaces/DataTableAction.md +1 -1
  94. package/docs/api/interfaces/DataTableColumn.md +1 -1
  95. package/docs/api/interfaces/DataTableProps.md +1 -1
  96. package/docs/api/interfaces/DataTableToolbarButton.md +1 -1
  97. package/docs/api/interfaces/DatabaseComplianceResult.md +1 -1
  98. package/docs/api/interfaces/DatabaseIssue.md +1 -1
  99. package/docs/api/interfaces/EmptyStateConfig.md +1 -1
  100. package/docs/api/interfaces/EnhancedNavigationMenuProps.md +1 -1
  101. package/docs/api/interfaces/EventAppRoleData.md +1 -1
  102. package/docs/api/interfaces/ExportColumn.md +1 -1
  103. package/docs/api/interfaces/ExportOptions.md +1 -1
  104. package/docs/api/interfaces/FileDisplayProps.md +24 -11
  105. package/docs/api/interfaces/FileMetadata.md +1 -1
  106. package/docs/api/interfaces/FileReference.md +1 -1
  107. package/docs/api/interfaces/FileSizeLimits.md +1 -1
  108. package/docs/api/interfaces/FileUploadOptions.md +1 -1
  109. package/docs/api/interfaces/FileUploadProps.md +1 -1
  110. package/docs/api/interfaces/FooterProps.md +1 -1
  111. package/docs/api/interfaces/FormFieldProps.md +1 -1
  112. package/docs/api/interfaces/FormProps.md +1 -1
  113. package/docs/api/interfaces/GrantEventAppRoleParams.md +1 -1
  114. package/docs/api/interfaces/InactivityWarningModalProps.md +1 -1
  115. package/docs/api/interfaces/InputProps.md +1 -1
  116. package/docs/api/interfaces/LabelProps.md +1 -1
  117. package/docs/api/interfaces/LoggerConfig.md +1 -1
  118. package/docs/api/interfaces/LoginFormProps.md +1 -1
  119. package/docs/api/interfaces/NavigationAccessRecord.md +2 -2
  120. package/docs/api/interfaces/NavigationContextType.md +1 -1
  121. package/docs/api/interfaces/NavigationGuardProps.md +1 -1
  122. package/docs/api/interfaces/NavigationItem.md +1 -1
  123. package/docs/api/interfaces/NavigationMenuProps.md +1 -1
  124. package/docs/api/interfaces/NavigationProviderProps.md +1 -1
  125. package/docs/api/interfaces/Organisation.md +1 -1
  126. package/docs/api/interfaces/OrganisationContextType.md +1 -1
  127. package/docs/api/interfaces/OrganisationMembership.md +1 -1
  128. package/docs/api/interfaces/OrganisationProviderProps.md +1 -1
  129. package/docs/api/interfaces/OrganisationSecurityError.md +1 -1
  130. package/docs/api/interfaces/PaceAppLayoutProps.md +1 -1
  131. package/docs/api/interfaces/PaceLoginPageProps.md +1 -1
  132. package/docs/api/interfaces/PageAccessRecord.md +1 -1
  133. package/docs/api/interfaces/PagePermissionContextType.md +1 -1
  134. package/docs/api/interfaces/PagePermissionGuardProps.md +2 -2
  135. package/docs/api/interfaces/PagePermissionProviderProps.md +1 -1
  136. package/docs/api/interfaces/PaletteData.md +1 -1
  137. package/docs/api/interfaces/ParsedAddress.md +1 -1
  138. package/docs/api/interfaces/PermissionEnforcerProps.md +4 -4
  139. package/docs/api/interfaces/ProgressProps.md +1 -1
  140. package/docs/api/interfaces/ProtectedRouteProps.md +1 -1
  141. package/docs/api/interfaces/PublicPageFooterProps.md +1 -1
  142. package/docs/api/interfaces/PublicPageHeaderProps.md +1 -1
  143. package/docs/api/interfaces/PublicPageLayoutProps.md +1 -1
  144. package/docs/api/interfaces/QuickFix.md +1 -1
  145. package/docs/api/interfaces/RBACAccessValidateParams.md +1 -1
  146. package/docs/api/interfaces/RBACAccessValidateResult.md +1 -1
  147. package/docs/api/interfaces/RBACAuditLogParams.md +1 -1
  148. package/docs/api/interfaces/RBACAuditLogResult.md +1 -1
  149. package/docs/api/interfaces/RBACConfig.md +2 -2
  150. package/docs/api/interfaces/RBACContext.md +1 -1
  151. package/docs/api/interfaces/RBACLogger.md +1 -1
  152. package/docs/api/interfaces/RBACPageAccessCheckParams.md +1 -1
  153. package/docs/api/interfaces/RBACPerformanceMetrics.md +1 -1
  154. package/docs/api/interfaces/RBACPermissionCheckParams.md +1 -1
  155. package/docs/api/interfaces/RBACPermissionCheckResult.md +2 -2
  156. package/docs/api/interfaces/RBACPermissionsGetParams.md +1 -1
  157. package/docs/api/interfaces/RBACPermissionsGetResult.md +1 -1
  158. package/docs/api/interfaces/RBACResult.md +1 -1
  159. package/docs/api/interfaces/RBACRoleGrantParams.md +2 -2
  160. package/docs/api/interfaces/RBACRoleGrantResult.md +1 -1
  161. package/docs/api/interfaces/RBACRoleRevokeParams.md +2 -2
  162. package/docs/api/interfaces/RBACRoleRevokeResult.md +1 -1
  163. package/docs/api/interfaces/RBACRoleValidateParams.md +2 -2
  164. package/docs/api/interfaces/RBACRoleValidateResult.md +1 -1
  165. package/docs/api/interfaces/RBACRolesListParams.md +1 -1
  166. package/docs/api/interfaces/RBACRolesListResult.md +2 -2
  167. package/docs/api/interfaces/RBACSessionTrackParams.md +1 -1
  168. package/docs/api/interfaces/RBACSessionTrackResult.md +1 -1
  169. package/docs/api/interfaces/ResourcePermissions.md +1 -1
  170. package/docs/api/interfaces/RevokeEventAppRoleParams.md +1 -1
  171. package/docs/api/interfaces/RoleBasedRouterContextType.md +1 -1
  172. package/docs/api/interfaces/RoleBasedRouterProps.md +1 -1
  173. package/docs/api/interfaces/RoleManagementResult.md +1 -1
  174. package/docs/api/interfaces/RouteAccessRecord.md +2 -2
  175. package/docs/api/interfaces/RouteConfig.md +2 -2
  176. package/docs/api/interfaces/RuntimeComplianceResult.md +1 -1
  177. package/docs/api/interfaces/SecureDataContextType.md +1 -1
  178. package/docs/api/interfaces/SecureDataProviderProps.md +1 -1
  179. package/docs/api/interfaces/SessionRestorationLoaderProps.md +1 -1
  180. package/docs/api/interfaces/SetupIssue.md +1 -1
  181. package/docs/api/interfaces/StorageConfig.md +1 -1
  182. package/docs/api/interfaces/StorageFileInfo.md +1 -1
  183. package/docs/api/interfaces/StorageFileMetadata.md +1 -1
  184. package/docs/api/interfaces/StorageListOptions.md +1 -1
  185. package/docs/api/interfaces/StorageListResult.md +1 -1
  186. package/docs/api/interfaces/StorageUploadOptions.md +1 -1
  187. package/docs/api/interfaces/StorageUploadResult.md +1 -1
  188. package/docs/api/interfaces/StorageUrlOptions.md +1 -1
  189. package/docs/api/interfaces/StyleImport.md +1 -1
  190. package/docs/api/interfaces/SwitchProps.md +1 -1
  191. package/docs/api/interfaces/TabsContentProps.md +1 -1
  192. package/docs/api/interfaces/TabsListProps.md +1 -1
  193. package/docs/api/interfaces/TabsProps.md +1 -1
  194. package/docs/api/interfaces/TabsTriggerProps.md +1 -1
  195. package/docs/api/interfaces/TextareaProps.md +1 -1
  196. package/docs/api/interfaces/ToastActionElement.md +1 -1
  197. package/docs/api/interfaces/ToastProps.md +1 -1
  198. package/docs/api/interfaces/UnifiedAuthContextType.md +60 -38
  199. package/docs/api/interfaces/UnifiedAuthProviderProps.md +13 -13
  200. package/docs/api/interfaces/UseFormDialogOptions.md +1 -1
  201. package/docs/api/interfaces/UseFormDialogReturn.md +1 -1
  202. package/docs/api/interfaces/UseInactivityTrackerOptions.md +1 -1
  203. package/docs/api/interfaces/UseInactivityTrackerReturn.md +1 -1
  204. package/docs/api/interfaces/UsePublicEventLogoOptions.md +2 -2
  205. package/docs/api/interfaces/UsePublicEventLogoReturn.md +1 -1
  206. package/docs/api/interfaces/UsePublicEventOptions.md +1 -1
  207. package/docs/api/interfaces/UsePublicEventReturn.md +1 -1
  208. package/docs/api/interfaces/UsePublicFileDisplayOptions.md +2 -2
  209. package/docs/api/interfaces/UsePublicFileDisplayReturn.md +1 -1
  210. package/docs/api/interfaces/UsePublicRouteParamsReturn.md +1 -1
  211. package/docs/api/interfaces/UseResolvedScopeOptions.md +2 -2
  212. package/docs/api/interfaces/UseResolvedScopeReturn.md +1 -1
  213. package/docs/api/interfaces/UseResourcePermissionsOptions.md +1 -1
  214. package/docs/api/interfaces/UserEventAccess.md +1 -1
  215. package/docs/api/interfaces/UserMenuProps.md +1 -1
  216. package/docs/api/interfaces/UserProfile.md +1 -1
  217. package/docs/api/modules.md +194 -209
  218. package/docs/getting-started/cursor-rules.md +262 -0
  219. package/docs/getting-started/installation-guide.md +6 -1
  220. package/docs/getting-started/quick-start.md +6 -1
  221. package/docs/migration/MIGRATION_GUIDE.md +4 -4
  222. package/docs/migration/REACT_19_MIGRATION.md +227 -0
  223. package/docs/migration/database-changes-december-2025.md +2 -1
  224. package/docs/rbac/event-based-apps.md +124 -6
  225. package/docs/standards/README.md +39 -0
  226. package/docs/troubleshooting/migration.md +4 -4
  227. package/examples/PublicPages/PublicEventPage.tsx +1 -1
  228. package/package.json +11 -6
  229. package/scripts/audit-consuming-app.cjs +961 -0
  230. package/scripts/check-pace-core-compliance.cjs +315 -61
  231. package/scripts/install-cursor-rules.cjs +236 -0
  232. package/src/__tests__/helpers/test-providers.tsx +1 -1
  233. package/src/__tests__/helpers/test-utils.tsx +1 -1
  234. package/src/__tests__/rls-policies.test.ts +3 -1
  235. package/src/components/Badge/Badge.tsx +2 -4
  236. package/src/components/Button/Button.tsx +5 -4
  237. package/src/components/Calendar/Calendar.tsx +1 -1
  238. package/src/components/DataTable/DataTable.test.tsx +57 -93
  239. package/src/components/DataTable/DataTable.tsx +2 -2
  240. package/src/components/DataTable/__tests__/DataTable.default-state.test.tsx +172 -45
  241. package/src/components/DataTable/__tests__/DataTable.grouping-aggregation.test.tsx +121 -28
  242. package/src/components/DataTable/__tests__/DataTableCore.test-setup.ts +9 -8
  243. package/src/components/DataTable/__tests__/DataTableCore.test.tsx +20 -52
  244. package/src/components/DataTable/__tests__/a11y.basic.test.tsx +170 -34
  245. package/src/components/DataTable/__tests__/keyboard.test.tsx +75 -12
  246. package/src/components/DataTable/__tests__/pagination.modes.test.tsx +88 -16
  247. package/src/components/DataTable/__tests__/ssr.strict-mode.test.tsx +12 -12
  248. package/src/components/DataTable/components/AccessDeniedPage.tsx +1 -1
  249. package/src/components/DataTable/components/BulkOperationsDropdown.tsx +1 -1
  250. package/src/components/DataTable/components/DataTableCore.tsx +4 -7
  251. package/src/components/DataTable/components/DataTableModals.tsx +1 -1
  252. package/src/components/DataTable/components/EditableRow.tsx +1 -1
  253. package/src/components/DataTable/components/UnifiedTableBody.tsx +86 -17
  254. package/src/components/DataTable/components/__tests__/DataTableModals.test.tsx +23 -23
  255. package/src/components/DataTable/components/__tests__/EditableRow.test.tsx +11 -11
  256. package/src/components/DataTable/components/__tests__/ExpandButton.test.tsx +36 -36
  257. package/src/components/DataTable/components/__tests__/GroupHeader.test.tsx +27 -27
  258. package/src/components/DataTable/components/__tests__/ImportModal.test.tsx +39 -39
  259. package/src/components/DataTable/components/__tests__/UnifiedTableBody.test.tsx +33 -33
  260. package/src/components/DataTable/components/__tests__/ViewRowModal.test.tsx +29 -29
  261. package/src/components/DataTable/hooks/useColumnReordering.ts +2 -2
  262. package/src/components/DataTable/hooks/useDataTablePermissions.ts +75 -10
  263. package/src/components/DataTable/hooks/useKeyboardNavigation.ts +2 -2
  264. package/src/components/DatePickerWithTimezone/DatePickerWithTimezone.test.tsx +8 -14
  265. package/src/components/Dialog/Dialog.tsx +6 -5
  266. package/src/components/ErrorBoundary/ErrorBoundary.tsx +1 -1
  267. package/src/components/EventSelector/EventSelector.tsx +1 -1
  268. package/src/components/FileDisplay/FileDisplay.test.tsx +4 -3
  269. package/src/components/FileDisplay/FileDisplay.tsx +16 -4
  270. package/src/components/Footer/Footer.tsx +1 -1
  271. package/src/components/Form/Form.test.tsx +36 -15
  272. package/src/components/Form/Form.tsx +30 -26
  273. package/src/components/Header/Header.tsx +1 -1
  274. package/src/components/InactivityWarningModal/InactivityWarningModal.test.tsx +40 -40
  275. package/src/components/InactivityWarningModal/InactivityWarningModal.tsx +1 -1
  276. package/src/components/Input/Input.tsx +28 -30
  277. package/src/components/Label/Label.tsx +1 -1
  278. package/src/components/LoadingSpinner/LoadingSpinner.tsx +1 -1
  279. package/src/components/LoginForm/LoginForm.test.tsx +42 -42
  280. package/src/components/LoginForm/LoginForm.tsx +8 -8
  281. package/src/components/NavigationMenu/NavigationMenu.test.tsx +6 -4
  282. package/src/components/NavigationMenu/NavigationMenu.tsx +2 -11
  283. package/src/components/OrganisationSelector/OrganisationSelector.tsx +0 -1
  284. package/src/components/PaceAppLayout/PaceAppLayout.performance.test.tsx +1 -1
  285. package/src/components/PaceAppLayout/PaceAppLayout.test.tsx +75 -52
  286. package/src/components/PaceAppLayout/PaceAppLayout.tsx +98 -69
  287. package/src/components/PaceAppLayout/README.md +1 -1
  288. package/src/components/PaceLoginPage/PaceLoginPage.tsx +1 -8
  289. package/src/components/PasswordChange/PasswordChangeForm.test.tsx +33 -33
  290. package/src/components/PasswordChange/PasswordChangeForm.tsx +1 -1
  291. package/src/components/Progress/Progress.tsx +1 -1
  292. package/src/components/ProtectedRoute/ProtectedRoute.test.tsx +5 -9
  293. package/src/components/ProtectedRoute/ProtectedRoute.tsx +0 -1
  294. package/src/components/PublicLayout/PublicPageLayout.tsx +1 -1
  295. package/src/components/PublicLayout/PublicPageProvider.tsx +0 -1
  296. package/src/components/Select/Select.tsx +33 -22
  297. package/src/components/SessionRestorationLoader/SessionRestorationLoader.tsx +1 -1
  298. package/src/components/Table/Table.tsx +1 -1
  299. package/src/components/Textarea/Textarea.tsx +27 -29
  300. package/src/components/Toast/Toast.tsx +1 -1
  301. package/src/components/Tooltip/Tooltip.tsx +1 -1
  302. package/src/components/UserMenu/UserMenu.tsx +1 -1
  303. package/src/hooks/__tests__/hooks.integration.test.tsx +80 -55
  304. package/src/hooks/__tests__/useSecureDataAccess.unit.test.tsx +14 -7
  305. package/src/hooks/__tests__/useStorage.unit.test.ts +36 -36
  306. package/src/hooks/public/usePublicEvent.ts +1 -1
  307. package/src/hooks/public/usePublicEventLogo.ts +1 -1
  308. package/src/hooks/public/usePublicRouteParams.ts +1 -1
  309. package/src/hooks/services/useAuthService.ts +21 -3
  310. package/src/hooks/services/useEventService.ts +21 -3
  311. package/src/hooks/services/useInactivityService.ts +21 -3
  312. package/src/hooks/services/useOrganisationService.ts +21 -3
  313. package/src/hooks/useDataTableState.ts +8 -18
  314. package/src/hooks/useFileDisplay.ts +10 -17
  315. package/src/hooks/useFocusManagement.ts +2 -2
  316. package/src/hooks/useFocusTrap.ts +4 -4
  317. package/src/hooks/useFormDialog.ts +8 -7
  318. package/src/hooks/useInactivityTracker.ts +1 -1
  319. package/src/hooks/usePermissionCache.ts +1 -1
  320. package/src/hooks/useSecureDataAccess.test.ts +16 -9
  321. package/src/hooks/useSecureDataAccess.ts +22 -6
  322. package/src/hooks/useToast.ts +2 -2
  323. package/src/providers/__tests__/OrganisationProvider.test.tsx +57 -13
  324. package/src/providers/__tests__/ProviderLifecycle.test.tsx +21 -6
  325. package/src/providers/__tests__/UnifiedAuthProvider.test.tsx +10 -10
  326. package/src/providers/services/EventServiceProvider.tsx +0 -8
  327. package/src/providers/services/UnifiedAuthProvider.tsx +196 -46
  328. package/src/providers/services/__tests__/AuthServiceProvider.integration.test.tsx +13 -3
  329. package/src/rbac/__tests__/adapters.comprehensive.test.tsx +34 -40
  330. package/src/rbac/__tests__/isSuperAdmin.real.test.ts +82 -0
  331. package/src/rbac/adapters.tsx +3 -22
  332. package/src/rbac/api.test.ts +2 -2
  333. package/src/rbac/api.ts +7 -1
  334. package/src/rbac/components/EnhancedNavigationMenu.tsx +3 -16
  335. package/src/rbac/components/NavigationGuard.tsx +2 -11
  336. package/src/rbac/components/NavigationProvider.tsx +1 -2
  337. package/src/rbac/components/PagePermissionGuard.tsx +1 -1
  338. package/src/rbac/components/PagePermissionProvider.tsx +1 -1
  339. package/src/rbac/components/PermissionEnforcer.tsx +46 -13
  340. package/src/rbac/components/RoleBasedRouter.tsx +1 -1
  341. package/src/rbac/components/SecureDataProvider.tsx +1 -2
  342. package/src/rbac/components/__tests__/EnhancedNavigationMenu.test.tsx +7 -43
  343. package/src/rbac/components/__tests__/NavigationGuard.test.tsx +4 -11
  344. package/src/rbac/components/__tests__/NavigationProvider.test.tsx +3 -3
  345. package/src/rbac/components/__tests__/SecureDataProvider.fixed.test.tsx +1 -1
  346. package/src/rbac/components/__tests__/SecureDataProvider.test.tsx +1 -1
  347. package/src/rbac/engine.ts +14 -2
  348. package/src/rbac/hooks/index.ts +0 -3
  349. package/src/rbac/hooks/usePermissions.ts +51 -11
  350. package/src/rbac/hooks/useRBAC.ts +3 -13
  351. package/src/rbac/hooks/useResolvedScope.test.ts +75 -54
  352. package/src/rbac/hooks/useResolvedScope.ts +58 -33
  353. package/src/rbac/hooks/useSecureSupabase.ts +4 -9
  354. package/src/rbac/secureClient.ts +43 -0
  355. package/src/services/EventService.ts +4 -57
  356. package/src/services/InactivityService.ts +127 -34
  357. package/src/services/OrganisationService.ts +68 -10
  358. package/src/utils/security/secureDataAccess.test.ts +31 -20
  359. package/src/utils/security/secureDataAccess.ts +4 -3
  360. package/dist/chunk-6C4YBBJM.js.map +0 -1
  361. package/dist/chunk-6LTQQAT6.js.map +0 -1
  362. package/dist/chunk-6TQDD426.js.map +0 -1
  363. package/dist/chunk-LOMZXPSN.js.map +0 -1
  364. package/dist/chunk-OETXORNB.js.map +0 -1
  365. package/dist/chunk-ULHIJK66.js.map +0 -1
  366. package/dist/chunk-VKB2CO4Z.js.map +0 -1
  367. package/dist/chunk-VRGWKHDB.js.map +0 -1
  368. package/dist/chunk-XNYQOL3Z.js.map +0 -1
  369. package/dist/chunk-XYXSXPUK.js.map +0 -1
  370. package/scripts/check-pace-core-compliance.js +0 -512
  371. package/src/rbac/hooks/useSuperAdminBypass.ts +0 -126
  372. package/src/utils/context/superAdminOverride.ts +0 -58
  373. /package/dist/{DataTable-WKRZD47S.js.map → DataTable-DQ7RSOHE.js.map} +0 -0
  374. /package/dist/{UnifiedAuthProvider-FTSG5XH7.js.map → UnifiedAuthProvider-ATAP5UTR.js.map} +0 -0
  375. /package/dist/{api-IHKALJZD.js.map → api-N774RPUA.js.map} +0 -0
  376. /package/dist/{chunk-QWWZ5CAQ.js.map → chunk-LXQLPRQ2.js.map} +0 -0
  377. /package/examples/{rbac → RBAC}/CompleteRBACExample.tsx +0 -0
  378. /package/examples/{rbac → RBAC}/EventBasedApp.tsx +0 -0
  379. /package/examples/{rbac → RBAC}/PermissionExample.tsx +0 -0
  380. /package/examples/{rbac → RBAC}/index.ts +0 -0
@@ -62,7 +62,7 @@ interface TestData extends Record<string, unknown> {
62
62
  }
63
63
 
64
64
  describe('[component] DataTableModals', () => {
65
- const defaultProps = {
65
+ const baseProps = {
66
66
  showImportModal: false,
67
67
  onCloseImportModal: vi.fn(),
68
68
  onImport: vi.fn(),
@@ -78,14 +78,14 @@ describe('[component] DataTableModals', () => {
78
78
 
79
79
  describe('Rendering', () => {
80
80
  it('renders nothing when no modals are open', () => {
81
- const { container } = render(<DataTableModals {...defaultProps} />);
81
+ const { container } = render(<DataTableModals {...baseProps} />);
82
82
  expect(container.firstChild).toBeNull();
83
83
  });
84
84
 
85
85
  it('renders ImportModal when showImportModal is true', () => {
86
86
  render(
87
87
  <DataTableModals
88
- {...defaultProps}
88
+ {...baseProps}
89
89
  showImportModal={true}
90
90
  />
91
91
  );
@@ -94,7 +94,7 @@ describe('[component] DataTableModals', () => {
94
94
  });
95
95
 
96
96
  it('does not render ImportModal when showImportModal is false', () => {
97
- render(<DataTableModals {...defaultProps} />);
97
+ render(<DataTableModals {...baseProps} />);
98
98
 
99
99
  expect(screen.queryByTestId('import-modal')).not.toBeInTheDocument();
100
100
  });
@@ -104,7 +104,7 @@ describe('[component] DataTableModals', () => {
104
104
  it('passes isOpen prop to ImportModal', () => {
105
105
  render(
106
106
  <DataTableModals
107
- {...defaultProps}
107
+ {...baseProps}
108
108
  showImportModal={true}
109
109
  />
110
110
  );
@@ -118,7 +118,7 @@ describe('[component] DataTableModals', () => {
118
118
 
119
119
  render(
120
120
  <DataTableModals
121
- {...defaultProps}
121
+ {...baseProps}
122
122
  showImportModal={true}
123
123
  onCloseImportModal={onCloseImportModal}
124
124
  />
@@ -138,7 +138,7 @@ describe('[component] DataTableModals', () => {
138
138
 
139
139
  render(
140
140
  <DataTableModals
141
- {...defaultProps}
141
+ {...baseProps}
142
142
  showImportModal={true}
143
143
  importModalConfig={config}
144
144
  />
@@ -159,7 +159,7 @@ describe('[component] DataTableModals', () => {
159
159
 
160
160
  render(
161
161
  <DataTableModals
162
- {...defaultProps}
162
+ {...baseProps}
163
163
  showImportModal={true}
164
164
  onImport={onImport}
165
165
  columns={columns}
@@ -188,7 +188,7 @@ describe('[component] DataTableModals', () => {
188
188
 
189
189
  render(
190
190
  <DataTableModals
191
- {...defaultProps}
191
+ {...baseProps}
192
192
  showImportModal={true}
193
193
  onImport={onImport}
194
194
  columns={columns}
@@ -209,7 +209,7 @@ describe('[component] DataTableModals', () => {
209
209
 
210
210
  render(
211
211
  <DataTableModals
212
- {...defaultProps}
212
+ {...baseProps}
213
213
  showImportModal={true}
214
214
  onImport={onImport}
215
215
  />
@@ -230,7 +230,7 @@ describe('[component] DataTableModals', () => {
230
230
 
231
231
  const { rerender } = render(
232
232
  <DataTableModals
233
- {...defaultProps}
233
+ {...baseProps}
234
234
  showImportModal={false}
235
235
  onStoreFocus={onStoreFocus}
236
236
  />
@@ -238,7 +238,7 @@ describe('[component] DataTableModals', () => {
238
238
 
239
239
  rerender(
240
240
  <DataTableModals
241
- {...defaultProps}
241
+ {...baseProps}
242
242
  showImportModal={true}
243
243
  onStoreFocus={onStoreFocus}
244
244
  />
@@ -252,7 +252,7 @@ describe('[component] DataTableModals', () => {
252
252
 
253
253
  const { rerender } = render(
254
254
  <DataTableModals
255
- {...defaultProps}
255
+ {...baseProps}
256
256
  showImportModal={true}
257
257
  onRestoreFocus={onRestoreFocus}
258
258
  />
@@ -260,7 +260,7 @@ describe('[component] DataTableModals', () => {
260
260
 
261
261
  rerender(
262
262
  <DataTableModals
263
- {...defaultProps}
263
+ {...baseProps}
264
264
  showImportModal={false}
265
265
  onRestoreFocus={onRestoreFocus}
266
266
  />
@@ -274,7 +274,7 @@ describe('[component] DataTableModals', () => {
274
274
  it('does not call focus handlers when not provided', () => {
275
275
  const { rerender } = render(
276
276
  <DataTableModals
277
- {...defaultProps}
277
+ {...baseProps}
278
278
  showImportModal={false}
279
279
  />
280
280
  );
@@ -282,7 +282,7 @@ describe('[component] DataTableModals', () => {
282
282
  expect(() => {
283
283
  rerender(
284
284
  <DataTableModals
285
- {...defaultProps}
285
+ {...baseProps}
286
286
  showImportModal={true}
287
287
  />
288
288
  );
@@ -300,7 +300,7 @@ describe('[component] DataTableModals', () => {
300
300
 
301
301
  render(
302
302
  <DataTableModals
303
- {...defaultProps}
303
+ {...baseProps}
304
304
  showImportModal={true}
305
305
  onImport={onImport}
306
306
  />
@@ -330,7 +330,7 @@ describe('[component] DataTableModals', () => {
330
330
 
331
331
  render(
332
332
  <DataTableModals
333
- {...defaultProps}
333
+ {...baseProps}
334
334
  showImportModal={true}
335
335
  onImport={onImport}
336
336
  />
@@ -361,7 +361,7 @@ describe('[component] DataTableModals', () => {
361
361
 
362
362
  render(
363
363
  <DataTableModals
364
- {...defaultProps}
364
+ {...baseProps}
365
365
  showImportModal={true}
366
366
  onImport={onImport}
367
367
  columns={[]}
@@ -386,7 +386,7 @@ describe('[component] DataTableModals', () => {
386
386
 
387
387
  render(
388
388
  <DataTableModals
389
- {...defaultProps}
389
+ {...baseProps}
390
390
  showImportModal={true}
391
391
  onImport={onImport}
392
392
  columns={columns}
@@ -406,7 +406,7 @@ describe('[component] DataTableModals', () => {
406
406
 
407
407
  render(
408
408
  <DataTableModals
409
- {...defaultProps}
409
+ {...baseProps}
410
410
  showImportModal={true}
411
411
  onImport={undefined as any}
412
412
  />
@@ -432,7 +432,7 @@ describe('[component] DataTableModals', () => {
432
432
 
433
433
  render(
434
434
  <DataTableModals
435
- {...defaultProps}
435
+ {...baseProps}
436
436
  showImportModal={true}
437
437
  onImport={onImport}
438
438
  columns={columns}
@@ -456,7 +456,7 @@ describe('[component] DataTableModals', () => {
456
456
 
457
457
  render(
458
458
  <DataTableModals
459
- {...defaultProps}
459
+ {...baseProps}
460
460
  showImportModal={true}
461
461
  onImport={onImport}
462
462
  columns={columns}
@@ -179,7 +179,7 @@ describe('[component] EditableRow', () => {
179
179
  actions: [],
180
180
  });
181
181
 
182
- const defaultProps = getDefaultProps();
182
+ const baseProps = getDefaultProps();
183
183
 
184
184
  beforeEach(() => {
185
185
  vi.clearAllMocks();
@@ -191,7 +191,7 @@ describe('[component] EditableRow', () => {
191
191
 
192
192
  describe('Rendering', () => {
193
193
  it('renders editable row with table row structure', () => {
194
- render(<EditableRow {...defaultProps} />);
194
+ render(<EditableRow {...baseProps} />);
195
195
 
196
196
  const row = screen.getByRole('row');
197
197
  expect(row).toBeInTheDocument();
@@ -234,7 +234,7 @@ describe('[component] EditableRow', () => {
234
234
  });
235
235
 
236
236
  it('renders save and cancel buttons', () => {
237
- render(<EditableRow {...defaultProps} />);
237
+ render(<EditableRow {...baseProps} />);
238
238
 
239
239
  expect(screen.getByRole('button', { name: /save changes/i })).toBeInTheDocument();
240
240
  expect(screen.getByRole('button', { name: /cancel editing/i })).toBeInTheDocument();
@@ -271,7 +271,7 @@ describe('[component] EditableRow', () => {
271
271
  const user = userEvent.setup();
272
272
  const onSave = vi.fn();
273
273
 
274
- render(<EditableRow {...defaultProps} onSave={onSave} />);
274
+ render(<EditableRow {...baseProps} onSave={onSave} />);
275
275
 
276
276
  const saveButton = screen.getByRole('button', { name: /save changes/i });
277
277
  await user.click(saveButton);
@@ -437,7 +437,7 @@ describe('[component] EditableRow', () => {
437
437
 
438
438
  render(
439
439
  <EditableRow
440
- {...defaultProps}
440
+ {...baseProps}
441
441
  editingData={editingData}
442
442
  />
443
443
  );
@@ -447,7 +447,7 @@ describe('[component] EditableRow', () => {
447
447
  });
448
448
 
449
449
  it('falls back to original row values when editingData is empty', () => {
450
- render(<EditableRow {...defaultProps} editingData={{}} />);
450
+ render(<EditableRow {...baseProps} editingData={{}} />);
451
451
 
452
452
  expect(screen.getByDisplayValue('John Doe')).toBeInTheDocument();
453
453
  expect(screen.getByDisplayValue('john@example.com')).toBeInTheDocument();
@@ -468,21 +468,21 @@ describe('[component] EditableRow', () => {
468
468
 
469
469
  describe('Accessibility', () => {
470
470
  it('provides proper ARIA attributes for row', () => {
471
- render(<EditableRow {...defaultProps} />);
471
+ render(<EditableRow {...baseProps} />);
472
472
 
473
473
  const row = screen.getByRole('row');
474
474
  expect(row).toHaveAttribute('role', 'row');
475
475
  });
476
476
 
477
477
  it('provides aria-label for save button', () => {
478
- render(<EditableRow {...defaultProps} />);
478
+ render(<EditableRow {...baseProps} />);
479
479
 
480
480
  const saveButton = screen.getByRole('button', { name: /save changes/i });
481
481
  expect(saveButton).toHaveAttribute('aria-label', 'Save changes');
482
482
  });
483
483
 
484
484
  it('provides aria-label for cancel button', () => {
485
- render(<EditableRow {...defaultProps} />);
485
+ render(<EditableRow {...baseProps} />);
486
486
 
487
487
  const cancelButton = screen.getByRole('button', { name: /cancel editing/i });
488
488
  expect(cancelButton).toHaveAttribute('aria-label', 'Cancel editing');
@@ -491,7 +491,7 @@ describe('[component] EditableRow', () => {
491
491
 
492
492
  describe('Edge Cases', () => {
493
493
  it('handles empty editingData gracefully', () => {
494
- render(<EditableRow {...defaultProps} editingData={{}} />);
494
+ render(<EditableRow {...baseProps} editingData={{}} />);
495
495
 
496
496
  expect(screen.getByRole('row')).toBeInTheDocument();
497
497
  });
@@ -512,7 +512,7 @@ describe('[component] EditableRow', () => {
512
512
  const row = createMockRow();
513
513
 
514
514
  expect(() => {
515
- render(<EditableRow {...defaultProps} row={row} />);
515
+ render(<EditableRow {...baseProps} row={row} />);
516
516
  }).not.toThrow();
517
517
  });
518
518
  });
@@ -25,7 +25,7 @@ vi.mock('lucide-react', () => ({
25
25
  }));
26
26
 
27
27
  describe('[component] ExpandButton', () => {
28
- const defaultProps = {
28
+ const baseProps = {
29
29
  rowId: 'row-1',
30
30
  isExpanded: false,
31
31
  hasChildren: true,
@@ -44,7 +44,7 @@ describe('[component] ExpandButton', () => {
44
44
  it('returns null when hasChildren is false', () => {
45
45
  const { container } = render(
46
46
  <ExpandButton
47
- {...defaultProps}
47
+ {...baseProps}
48
48
  hasChildren={false}
49
49
  />
50
50
  );
@@ -53,27 +53,27 @@ describe('[component] ExpandButton', () => {
53
53
  });
54
54
 
55
55
  it('renders button when hasChildren is true', () => {
56
- render(<ExpandButton {...defaultProps} />);
56
+ render(<ExpandButton {...baseProps} />);
57
57
 
58
58
  expect(screen.getByRole('button')).toBeInTheDocument();
59
59
  });
60
60
 
61
61
  it('renders ChevronRight icon when not expanded', () => {
62
- render(<ExpandButton {...defaultProps} isExpanded={false} />);
62
+ render(<ExpandButton {...baseProps} isExpanded={false} />);
63
63
 
64
64
  expect(screen.getByTestId('chevron-right-icon')).toBeInTheDocument();
65
65
  expect(screen.queryByTestId('chevron-down-icon')).not.toBeInTheDocument();
66
66
  });
67
67
 
68
68
  it('renders ChevronDown icon when expanded', () => {
69
- render(<ExpandButton {...defaultProps} isExpanded={true} />);
69
+ render(<ExpandButton {...baseProps} isExpanded={true} />);
70
70
 
71
71
  expect(screen.getByTestId('chevron-down-icon')).toBeInTheDocument();
72
72
  expect(screen.queryByTestId('chevron-right-icon')).not.toBeInTheDocument();
73
73
  });
74
74
 
75
75
  it('has correct testId attribute', () => {
76
- render(<ExpandButton {...defaultProps} rowId="test-row-123" />);
76
+ render(<ExpandButton {...baseProps} rowId="test-row-123" />);
77
77
 
78
78
  const button = screen.getByRole('button');
79
79
  expect(button).toHaveAttribute('data-testid', 'expand-button-test-row-123');
@@ -87,7 +87,7 @@ describe('[component] ExpandButton', () => {
87
87
 
88
88
  render(
89
89
  <ExpandButton
90
- {...defaultProps}
90
+ {...baseProps}
91
91
  onClick={handleClick}
92
92
  />
93
93
  );
@@ -104,7 +104,7 @@ describe('[component] ExpandButton', () => {
104
104
 
105
105
  render(
106
106
  <ExpandButton
107
- {...defaultProps}
107
+ {...baseProps}
108
108
  onClick={handleClick}
109
109
  />
110
110
  );
@@ -122,7 +122,7 @@ describe('[component] ExpandButton', () => {
122
122
 
123
123
  render(
124
124
  <ExpandButton
125
- {...defaultProps}
125
+ {...baseProps}
126
126
  onClick={handleClick}
127
127
  />
128
128
  );
@@ -142,7 +142,7 @@ describe('[component] ExpandButton', () => {
142
142
  render(
143
143
  <div onClick={handleParentClick}>
144
144
  <ExpandButton
145
- {...defaultProps}
145
+ {...baseProps}
146
146
  onClick={handleClick}
147
147
  />
148
148
  </div>
@@ -163,7 +163,7 @@ describe('[component] ExpandButton', () => {
163
163
  render(
164
164
  <div onKeyDown={handleParentKeyDown}>
165
165
  <ExpandButton
166
- {...defaultProps}
166
+ {...baseProps}
167
167
  onClick={handleClick}
168
168
  />
169
169
  </div>
@@ -180,33 +180,33 @@ describe('[component] ExpandButton', () => {
180
180
 
181
181
  describe('Accessibility', () => {
182
182
  it('has aria-label for collapsed state', () => {
183
- render(<ExpandButton {...defaultProps} isExpanded={false} />);
183
+ render(<ExpandButton {...baseProps} isExpanded={false} />);
184
184
 
185
185
  const button = screen.getByRole('button');
186
186
  expect(button).toHaveAttribute('aria-label', 'Expand row');
187
187
  });
188
188
 
189
189
  it('has aria-label for expanded state', () => {
190
- render(<ExpandButton {...defaultProps} isExpanded={true} />);
190
+ render(<ExpandButton {...baseProps} isExpanded={true} />);
191
191
 
192
192
  const button = screen.getByRole('button');
193
193
  expect(button).toHaveAttribute('aria-label', 'Collapse row');
194
194
  });
195
195
 
196
196
  it('has aria-expanded attribute', () => {
197
- render(<ExpandButton {...defaultProps} isExpanded={false} />);
197
+ render(<ExpandButton {...baseProps} isExpanded={false} />);
198
198
 
199
199
  const button = screen.getByRole('button');
200
200
  expect(button).toHaveAttribute('aria-expanded', 'false');
201
201
  });
202
202
 
203
203
  it('updates aria-expanded when state changes', () => {
204
- const { rerender } = render(<ExpandButton {...defaultProps} isExpanded={false} />);
204
+ const { rerender } = render(<ExpandButton {...baseProps} isExpanded={false} />);
205
205
 
206
206
  let button = screen.getByRole('button');
207
207
  expect(button).toHaveAttribute('aria-expanded', 'false');
208
208
 
209
- rerender(<ExpandButton {...defaultProps} isExpanded={true} />);
209
+ rerender(<ExpandButton {...baseProps} isExpanded={true} />);
210
210
 
211
211
  button = screen.getByRole('button');
212
212
  expect(button).toHaveAttribute('aria-expanded', 'true');
@@ -217,7 +217,7 @@ describe('[component] ExpandButton', () => {
217
217
  it('applies custom className', () => {
218
218
  render(
219
219
  <ExpandButton
220
- {...defaultProps}
220
+ {...baseProps}
221
221
  className="custom-class"
222
222
  />
223
223
  );
@@ -227,7 +227,7 @@ describe('[component] ExpandButton', () => {
227
227
  });
228
228
 
229
229
  it('has proper button styling classes', () => {
230
- render(<ExpandButton {...defaultProps} />);
230
+ render(<ExpandButton {...baseProps} />);
231
231
 
232
232
  const button = screen.getByRole('button');
233
233
  expect(button.className).toContain('inline-flex');
@@ -243,7 +243,7 @@ describe('[component] ExpandButton', () => {
243
243
 
244
244
  render(
245
245
  <ExpandButton
246
- {...defaultProps}
246
+ {...baseProps}
247
247
  onClick={handleClick}
248
248
  />
249
249
  );
@@ -260,7 +260,7 @@ describe('[component] ExpandButton', () => {
260
260
  expect(() => {
261
261
  render(
262
262
  <ExpandButton
263
- {...defaultProps}
263
+ {...baseProps}
264
264
  onClick={undefined as any}
265
265
  />
266
266
  );
@@ -270,7 +270,7 @@ describe('[component] ExpandButton', () => {
270
270
  it('handles empty rowId', () => {
271
271
  render(
272
272
  <ExpandButton
273
- {...defaultProps}
273
+ {...baseProps}
274
274
  rowId=""
275
275
  />
276
276
  );
@@ -282,7 +282,7 @@ describe('[component] ExpandButton', () => {
282
282
  });
283
283
 
284
284
  describe('[component] ExpandButtonMinimal', () => {
285
- const defaultProps = {
285
+ const baseProps = {
286
286
  rowId: 'row-1',
287
287
  isExpanded: false,
288
288
  hasChildren: true,
@@ -301,7 +301,7 @@ describe('[component] ExpandButtonMinimal', () => {
301
301
  it('returns null when hasChildren is false', () => {
302
302
  const { container } = render(
303
303
  <ExpandButtonMinimal
304
- {...defaultProps}
304
+ {...baseProps}
305
305
  hasChildren={false}
306
306
  />
307
307
  );
@@ -310,27 +310,27 @@ describe('[component] ExpandButtonMinimal', () => {
310
310
  });
311
311
 
312
312
  it('renders button when hasChildren is true', () => {
313
- render(<ExpandButtonMinimal {...defaultProps} />);
313
+ render(<ExpandButtonMinimal {...baseProps} />);
314
314
 
315
315
  expect(screen.getByRole('button')).toBeInTheDocument();
316
316
  });
317
317
 
318
318
  it('renders minus sign when expanded', () => {
319
- render(<ExpandButtonMinimal {...defaultProps} isExpanded={true} />);
319
+ render(<ExpandButtonMinimal {...baseProps} isExpanded={true} />);
320
320
 
321
321
  expect(screen.getByText('−')).toBeInTheDocument();
322
322
  expect(screen.queryByText('+')).not.toBeInTheDocument();
323
323
  });
324
324
 
325
325
  it('renders plus sign when not expanded', () => {
326
- render(<ExpandButtonMinimal {...defaultProps} isExpanded={false} />);
326
+ render(<ExpandButtonMinimal {...baseProps} isExpanded={false} />);
327
327
 
328
328
  expect(screen.getByText('+')).toBeInTheDocument();
329
329
  expect(screen.queryByText('−')).not.toBeInTheDocument();
330
330
  });
331
331
 
332
332
  it('has correct testId attribute', () => {
333
- render(<ExpandButtonMinimal {...defaultProps} rowId="test-row-456" />);
333
+ render(<ExpandButtonMinimal {...baseProps} rowId="test-row-456" />);
334
334
 
335
335
  const button = screen.getByRole('button');
336
336
  expect(button).toHaveAttribute('data-testid', 'expand-button-minimal-test-row-456');
@@ -344,7 +344,7 @@ describe('[component] ExpandButtonMinimal', () => {
344
344
 
345
345
  render(
346
346
  <ExpandButtonMinimal
347
- {...defaultProps}
347
+ {...baseProps}
348
348
  onClick={handleClick}
349
349
  />
350
350
  );
@@ -361,7 +361,7 @@ describe('[component] ExpandButtonMinimal', () => {
361
361
 
362
362
  render(
363
363
  <ExpandButtonMinimal
364
- {...defaultProps}
364
+ {...baseProps}
365
365
  onClick={handleClick}
366
366
  />
367
367
  );
@@ -379,7 +379,7 @@ describe('[component] ExpandButtonMinimal', () => {
379
379
 
380
380
  render(
381
381
  <ExpandButtonMinimal
382
- {...defaultProps}
382
+ {...baseProps}
383
383
  onClick={handleClick}
384
384
  />
385
385
  );
@@ -399,7 +399,7 @@ describe('[component] ExpandButtonMinimal', () => {
399
399
  render(
400
400
  <div onClick={handleParentClick}>
401
401
  <ExpandButtonMinimal
402
- {...defaultProps}
402
+ {...baseProps}
403
403
  onClick={handleClick}
404
404
  />
405
405
  </div>
@@ -415,21 +415,21 @@ describe('[component] ExpandButtonMinimal', () => {
415
415
 
416
416
  describe('Accessibility', () => {
417
417
  it('has aria-label for collapsed state', () => {
418
- render(<ExpandButtonMinimal {...defaultProps} isExpanded={false} />);
418
+ render(<ExpandButtonMinimal {...baseProps} isExpanded={false} />);
419
419
 
420
420
  const button = screen.getByRole('button');
421
421
  expect(button).toHaveAttribute('aria-label', 'Expand row');
422
422
  });
423
423
 
424
424
  it('has aria-label for expanded state', () => {
425
- render(<ExpandButtonMinimal {...defaultProps} isExpanded={true} />);
425
+ render(<ExpandButtonMinimal {...baseProps} isExpanded={true} />);
426
426
 
427
427
  const button = screen.getByRole('button');
428
428
  expect(button).toHaveAttribute('aria-label', 'Collapse row');
429
429
  });
430
430
 
431
431
  it('has aria-expanded attribute', () => {
432
- render(<ExpandButtonMinimal {...defaultProps} isExpanded={false} />);
432
+ render(<ExpandButtonMinimal {...baseProps} isExpanded={false} />);
433
433
 
434
434
  const button = screen.getByRole('button');
435
435
  expect(button).toHaveAttribute('aria-expanded', 'false');
@@ -440,7 +440,7 @@ describe('[component] ExpandButtonMinimal', () => {
440
440
  it('applies custom className', () => {
441
441
  render(
442
442
  <ExpandButtonMinimal
443
- {...defaultProps}
443
+ {...baseProps}
444
444
  className="custom-class"
445
445
  />
446
446
  );
@@ -450,7 +450,7 @@ describe('[component] ExpandButtonMinimal', () => {
450
450
  });
451
451
 
452
452
  it('has proper button styling classes', () => {
453
- render(<ExpandButtonMinimal {...defaultProps} />);
453
+ render(<ExpandButtonMinimal {...baseProps} />);
454
454
 
455
455
  const button = screen.getByRole('button');
456
456
  expect(button.className).toContain('inline-flex');