@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
@@ -65,7 +65,7 @@ vi.mock('lucide-react', () => ({
65
65
  }));
66
66
 
67
67
  describe('InactivityWarningModal Component', () => {
68
- const defaultProps = {
68
+ const baseProps = {
69
69
  isOpen: true,
70
70
  timeRemaining: 45,
71
71
  onStaySignedIn: vi.fn(),
@@ -74,20 +74,20 @@ describe('InactivityWarningModal Component', () => {
74
74
 
75
75
  describe('Rendering', () => {
76
76
  it('renders when isOpen is true', () => {
77
- renderWithProviders(<InactivityWarningModal {...defaultProps} />);
77
+ renderWithProviders(<InactivityWarningModal {...baseProps} />);
78
78
 
79
79
  expect(screen.getByTestId('dialog')).toBeInTheDocument();
80
80
  expect(screen.getByTestId('inactivity-warning-modal')).toBeInTheDocument();
81
81
  });
82
82
 
83
83
  it('does not render when isOpen is false', () => {
84
- renderWithProviders(<InactivityWarningModal {...defaultProps} isOpen={false} />);
84
+ renderWithProviders(<InactivityWarningModal {...baseProps} isOpen={false} />);
85
85
 
86
86
  expect(screen.queryByTestId('dialog')).not.toBeInTheDocument();
87
87
  });
88
88
 
89
89
  it('renders with default title and description', () => {
90
- renderWithProviders(<InactivityWarningModal {...defaultProps} />);
90
+ renderWithProviders(<InactivityWarningModal {...baseProps} />);
91
91
 
92
92
  expect(screen.getByText('Session Timeout Warning')).toBeInTheDocument();
93
93
  expect(screen.getByText("You've been inactive for a while. Your session will expire soon for security reasons.")).toBeInTheDocument();
@@ -95,7 +95,7 @@ describe('InactivityWarningModal Component', () => {
95
95
 
96
96
  it('renders with custom title and description', () => {
97
97
  const customProps = {
98
- ...defaultProps,
98
+ ...baseProps,
99
99
  title: 'Custom Warning',
100
100
  description: 'Custom description text',
101
101
  };
@@ -107,58 +107,58 @@ describe('InactivityWarningModal Component', () => {
107
107
  });
108
108
 
109
109
  it('renders with custom className', () => {
110
- renderWithProviders(<InactivityWarningModal {...defaultProps} className="custom-modal" />);
110
+ renderWithProviders(<InactivityWarningModal {...baseProps} className="custom-modal" />);
111
111
 
112
112
  const modal = screen.getByTestId('inactivity-warning-modal');
113
113
  expect(modal).toHaveClass('custom-modal');
114
114
  });
115
115
 
116
116
  it('renders countdown timer with correct time format', () => {
117
- renderWithProviders(<InactivityWarningModal {...defaultProps} timeRemaining={125} />);
117
+ renderWithProviders(<InactivityWarningModal {...baseProps} timeRemaining={125} />);
118
118
 
119
119
  expect(screen.getByText('02:05')).toBeInTheDocument();
120
120
  });
121
121
 
122
122
  it('renders countdown timer with single digit minutes', () => {
123
- renderWithProviders(<InactivityWarningModal {...defaultProps} timeRemaining={65} />);
123
+ renderWithProviders(<InactivityWarningModal {...baseProps} timeRemaining={65} />);
124
124
 
125
125
  expect(screen.getByText('01:05')).toBeInTheDocument();
126
126
  });
127
127
 
128
128
  it('renders countdown timer with zero seconds', () => {
129
- renderWithProviders(<InactivityWarningModal {...defaultProps} timeRemaining={60} />);
129
+ renderWithProviders(<InactivityWarningModal {...baseProps} timeRemaining={60} />);
130
130
 
131
131
  expect(screen.getByText('01:00')).toBeInTheDocument();
132
132
  });
133
133
 
134
134
  it('renders countdown timer with single digit seconds', () => {
135
- renderWithProviders(<InactivityWarningModal {...defaultProps} timeRemaining={5} />);
135
+ renderWithProviders(<InactivityWarningModal {...baseProps} timeRemaining={5} />);
136
136
 
137
137
  expect(screen.getByText('00:05')).toBeInTheDocument();
138
138
  });
139
139
 
140
140
  it('renders countdown timer with zero time', () => {
141
- renderWithProviders(<InactivityWarningModal {...defaultProps} timeRemaining={0} />);
141
+ renderWithProviders(<InactivityWarningModal {...baseProps} timeRemaining={0} />);
142
142
 
143
143
  expect(screen.getByText('00:00')).toBeInTheDocument();
144
144
  });
145
145
 
146
146
  it('renders action buttons with correct text', () => {
147
- renderWithProviders(<InactivityWarningModal {...defaultProps} />);
147
+ renderWithProviders(<InactivityWarningModal {...baseProps} />);
148
148
 
149
149
  expect(screen.getByRole('button', { name: 'Stay Signed In' })).toBeInTheDocument();
150
150
  expect(screen.getByRole('button', { name: 'Sign Out Now' })).toBeInTheDocument();
151
151
  });
152
152
 
153
153
  it('renders icons correctly', () => {
154
- renderWithProviders(<InactivityWarningModal {...defaultProps} />);
154
+ renderWithProviders(<InactivityWarningModal {...baseProps} />);
155
155
 
156
156
  expect(screen.getByTestId('alert-triangle-icon')).toBeInTheDocument();
157
157
  expect(screen.getByTestId('clock-icon')).toBeInTheDocument();
158
158
  });
159
159
 
160
160
  it('renders additional security information', () => {
161
- renderWithProviders(<InactivityWarningModal {...defaultProps} />);
161
+ renderWithProviders(<InactivityWarningModal {...baseProps} />);
162
162
 
163
163
  expect(screen.getByText("For security reasons, you'll be automatically signed out after 30 minutes of inactivity.")).toBeInTheDocument();
164
164
  });
@@ -178,7 +178,7 @@ describe('InactivityWarningModal Component', () => {
178
178
 
179
179
  testCases.forEach(({ input, expected }) => {
180
180
  const { unmount } = renderWithProviders(
181
- <InactivityWarningModal {...defaultProps} timeRemaining={input} />
181
+ <InactivityWarningModal {...baseProps} timeRemaining={input} />
182
182
  );
183
183
 
184
184
  expect(screen.getByText(expected)).toBeInTheDocument();
@@ -188,12 +188,12 @@ describe('InactivityWarningModal Component', () => {
188
188
 
189
189
  it('updates display time when timeRemaining prop changes', () => {
190
190
  const { rerender } = renderWithProviders(
191
- <InactivityWarningModal {...defaultProps} timeRemaining={60} />
191
+ <InactivityWarningModal {...baseProps} timeRemaining={60} />
192
192
  );
193
193
 
194
194
  expect(screen.getByText('01:00')).toBeInTheDocument();
195
195
 
196
- rerender(<InactivityWarningModal {...defaultProps} timeRemaining={30} />);
196
+ rerender(<InactivityWarningModal {...baseProps} timeRemaining={30} />);
197
197
 
198
198
  expect(screen.getByText('00:30')).toBeInTheDocument();
199
199
  });
@@ -205,7 +205,7 @@ describe('InactivityWarningModal Component', () => {
205
205
  const onStaySignedIn = vi.fn();
206
206
 
207
207
  renderWithProviders(
208
- <InactivityWarningModal {...defaultProps} onStaySignedIn={onStaySignedIn} />
208
+ <InactivityWarningModal {...baseProps} onStaySignedIn={onStaySignedIn} />
209
209
  );
210
210
 
211
211
  await user.click(screen.getByRole('button', { name: 'Stay Signed In' }));
@@ -218,7 +218,7 @@ describe('InactivityWarningModal Component', () => {
218
218
  const onSignOutNow = vi.fn();
219
219
 
220
220
  renderWithProviders(
221
- <InactivityWarningModal {...defaultProps} onSignOutNow={onSignOutNow} />
221
+ <InactivityWarningModal {...baseProps} onSignOutNow={onSignOutNow} />
222
222
  );
223
223
 
224
224
  await user.click(screen.getByRole('button', { name: 'Sign Out Now' }));
@@ -231,7 +231,7 @@ describe('InactivityWarningModal Component', () => {
231
231
  const onStaySignedIn = vi.fn();
232
232
 
233
233
  renderWithProviders(
234
- <InactivityWarningModal {...defaultProps} onStaySignedIn={onStaySignedIn} />
234
+ <InactivityWarningModal {...baseProps} onStaySignedIn={onStaySignedIn} />
235
235
  );
236
236
 
237
237
  // Simulate dialog close (this would normally happen via the Dialog component)
@@ -244,7 +244,7 @@ describe('InactivityWarningModal Component', () => {
244
244
 
245
245
  describe('Button Styling and Props', () => {
246
246
  it('applies correct styling to Stay Signed In button', () => {
247
- renderWithProviders(<InactivityWarningModal {...defaultProps} />);
247
+ renderWithProviders(<InactivityWarningModal {...baseProps} />);
248
248
 
249
249
  const stayButton = screen.getByRole('button', { name: 'Stay Signed In' });
250
250
  expect(stayButton).toHaveClass('bg-main-600', 'hover:bg-main-700', 'text-main-50');
@@ -252,7 +252,7 @@ describe('InactivityWarningModal Component', () => {
252
252
  });
253
253
 
254
254
  it('applies correct styling to Sign Out Now button', () => {
255
- renderWithProviders(<InactivityWarningModal {...defaultProps} />);
255
+ renderWithProviders(<InactivityWarningModal {...baseProps} />);
256
256
 
257
257
  const signOutButton = screen.getByRole('button', { name: 'Sign Out Now' });
258
258
  expect(signOutButton).toHaveAttribute('data-variant', 'outline');
@@ -263,7 +263,7 @@ describe('InactivityWarningModal Component', () => {
263
263
 
264
264
  describe('Accessibility', () => {
265
265
  it('has proper ARIA attributes', () => {
266
- renderWithProviders(<InactivityWarningModal {...defaultProps} />);
266
+ renderWithProviders(<InactivityWarningModal {...baseProps} />);
267
267
 
268
268
  const dialog = screen.getByTestId('dialog');
269
269
  expect(dialog).toHaveAttribute('role', 'dialog');
@@ -277,14 +277,14 @@ describe('InactivityWarningModal Component', () => {
277
277
  });
278
278
 
279
279
  it('has accessible button labels', () => {
280
- renderWithProviders(<InactivityWarningModal {...defaultProps} />);
280
+ renderWithProviders(<InactivityWarningModal {...baseProps} />);
281
281
 
282
282
  expect(screen.getByRole('button', { name: 'Stay Signed In' })).toBeInTheDocument();
283
283
  expect(screen.getByRole('button', { name: 'Sign Out Now' })).toBeInTheDocument();
284
284
  });
285
285
 
286
286
  it('has proper heading structure', () => {
287
- renderWithProviders(<InactivityWarningModal {...defaultProps} />);
287
+ renderWithProviders(<InactivityWarningModal {...baseProps} />);
288
288
 
289
289
  const title = screen.getByRole('heading', { level: 2 });
290
290
  expect(title).toBeInTheDocument();
@@ -292,7 +292,7 @@ describe('InactivityWarningModal Component', () => {
292
292
  });
293
293
 
294
294
  it('provides descriptive text for screen readers', () => {
295
- renderWithProviders(<InactivityWarningModal {...defaultProps} />);
295
+ renderWithProviders(<InactivityWarningModal {...baseProps} />);
296
296
 
297
297
  expect(screen.getByText('Time remaining before automatic logout')).toBeInTheDocument();
298
298
  expect(screen.getByText("For security reasons, you'll be automatically signed out after 30 minutes of inactivity.")).toBeInTheDocument();
@@ -301,7 +301,7 @@ describe('InactivityWarningModal Component', () => {
301
301
 
302
302
  describe('Dialog Configuration', () => {
303
303
  it('configures dialog with correct props', () => {
304
- renderWithProviders(<InactivityWarningModal {...defaultProps} />);
304
+ renderWithProviders(<InactivityWarningModal {...baseProps} />);
305
305
 
306
306
  const modal = screen.getByTestId('inactivity-warning-modal');
307
307
  expect(modal).toHaveClass('sm:max-w-md');
@@ -311,7 +311,7 @@ describe('InactivityWarningModal Component', () => {
311
311
 
312
312
  it('applies custom className to dialog content', () => {
313
313
  renderWithProviders(
314
- <InactivityWarningModal {...defaultProps} className="custom-dialog-class" />
314
+ <InactivityWarningModal {...baseProps} className="custom-dialog-class" />
315
315
  );
316
316
 
317
317
  const modal = screen.getByTestId('inactivity-warning-modal');
@@ -321,14 +321,14 @@ describe('InactivityWarningModal Component', () => {
321
321
 
322
322
  describe('Edge Cases', () => {
323
323
  it('handles negative time values gracefully', () => {
324
- renderWithProviders(<InactivityWarningModal {...defaultProps} timeRemaining={-5} />);
324
+ renderWithProviders(<InactivityWarningModal {...baseProps} timeRemaining={-5} />);
325
325
 
326
326
  // Should still render, but with negative time formatted as the component actually does it
327
327
  expect(screen.getByText('-1:-5')).toBeInTheDocument();
328
328
  });
329
329
 
330
330
  it('handles very large time values', () => {
331
- renderWithProviders(<InactivityWarningModal {...defaultProps} timeRemaining={999999} />);
331
+ renderWithProviders(<InactivityWarningModal {...baseProps} timeRemaining={999999} />);
332
332
 
333
333
  expect(screen.getByText('16666:39')).toBeInTheDocument();
334
334
  });
@@ -353,7 +353,7 @@ describe('InactivityWarningModal Component', () => {
353
353
  it('handles empty string title and description', () => {
354
354
  renderWithProviders(
355
355
  <InactivityWarningModal
356
- {...defaultProps}
356
+ {...baseProps}
357
357
  title=""
358
358
  description=""
359
359
  />
@@ -370,19 +370,19 @@ describe('InactivityWarningModal Component', () => {
370
370
  describe('Integration', () => {
371
371
  it('works with rapid prop changes', () => {
372
372
  const { rerender } = renderWithProviders(
373
- <InactivityWarningModal {...defaultProps} timeRemaining={60} />
373
+ <InactivityWarningModal {...baseProps} timeRemaining={60} />
374
374
  );
375
375
 
376
376
  expect(screen.getByText('01:00')).toBeInTheDocument();
377
377
 
378
378
  // Rapid changes
379
- rerender(<InactivityWarningModal {...defaultProps} timeRemaining={30} />);
379
+ rerender(<InactivityWarningModal {...baseProps} timeRemaining={30} />);
380
380
  expect(screen.getByText('00:30')).toBeInTheDocument();
381
381
 
382
- rerender(<InactivityWarningModal {...defaultProps} timeRemaining={15} />);
382
+ rerender(<InactivityWarningModal {...baseProps} timeRemaining={15} />);
383
383
  expect(screen.getByText('00:15')).toBeInTheDocument();
384
384
 
385
- rerender(<InactivityWarningModal {...defaultProps} timeRemaining={0} />);
385
+ rerender(<InactivityWarningModal {...baseProps} timeRemaining={0} />);
386
386
  expect(screen.getByText('00:00')).toBeInTheDocument();
387
387
  });
388
388
 
@@ -393,7 +393,7 @@ describe('InactivityWarningModal Component', () => {
393
393
 
394
394
  renderWithProviders(
395
395
  <InactivityWarningModal
396
- {...defaultProps}
396
+ {...baseProps}
397
397
  onStaySignedIn={onStaySignedIn}
398
398
  onSignOutNow={onSignOutNow}
399
399
  />
@@ -413,17 +413,17 @@ describe('InactivityWarningModal Component', () => {
413
413
 
414
414
  it('maintains state consistency during re-renders', () => {
415
415
  const { rerender } = renderWithProviders(
416
- <InactivityWarningModal {...defaultProps} timeRemaining={45} />
416
+ <InactivityWarningModal {...baseProps} timeRemaining={45} />
417
417
  );
418
418
 
419
419
  expect(screen.getByText('00:45')).toBeInTheDocument();
420
420
 
421
421
  // Re-render with same props
422
- rerender(<InactivityWarningModal {...defaultProps} timeRemaining={45} />);
422
+ rerender(<InactivityWarningModal {...baseProps} timeRemaining={45} />);
423
423
  expect(screen.getByText('00:45')).toBeInTheDocument();
424
424
 
425
425
  // Re-render with different props
426
- rerender(<InactivityWarningModal {...defaultProps} timeRemaining={30} />);
426
+ rerender(<InactivityWarningModal {...baseProps} timeRemaining={30} />);
427
427
  expect(screen.getByText('00:30')).toBeInTheDocument();
428
428
  });
429
429
  });
@@ -447,7 +447,7 @@ describe('InactivityWarningModal Component', () => {
447
447
 
448
448
  it('handles invalid timeRemaining values', () => {
449
449
  const invalidTimeProps = {
450
- ...defaultProps,
450
+ ...baseProps,
451
451
  timeRemaining: NaN,
452
452
  };
453
453
 
@@ -41,7 +41,7 @@
41
41
  * - Optimized timer management
42
42
  *
43
43
  * @dependencies
44
- * - React 18+ - Hooks and effects
44
+ * - React 19+ - Hooks and effects
45
45
  * - Dialog components - Modal functionality
46
46
  * - Tailwind CSS v4 - Styling
47
47
  */
@@ -101,36 +101,34 @@ export interface InputProps
101
101
  * />
102
102
  * ```
103
103
  */
104
- const Input = React.forwardRef<HTMLInputElement, InputProps>(
105
- ({ className, variant = 'default', size = 'md', error, type, ...props }, ref) => {
106
- return (
107
- <input
108
- type={type}
109
- className={cn(
110
- // Base styles
111
- 'flex w-full rounded-md border border-input bg-background px-3 py-2 text-sm ring-offset-background file:border-0 file:bg-transparent file:text-sm file:font-medium placeholder:text-muted-foreground focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring focus-visible:ring-offset-2 disabled:cursor-not-allowed disabled:opacity-50',
112
-
113
- // Variant styles
114
- {
115
- 'border-input': variant === 'default' && !error,
116
- 'border-destructive focus-visible:ring-destructive': variant === 'destructive' || error,
117
- },
118
-
119
- // Size styles
120
- {
121
- 'h-8 px-2 py-1 text-xs': size === 'sm',
122
- 'h-9 px-3 py-2 text-sm': size === 'md',
123
- 'h-10 px-4 py-3 text-base': size === 'lg',
124
- },
125
-
126
- className
127
- )}
128
- ref={ref}
129
- {...props}
130
- />
131
- );
132
- }
133
- );
104
+ function Input({ className, variant = 'default', size = 'md', error, type, ref, ...props }: InputProps & { ref?: React.Ref<HTMLInputElement> }) {
105
+ return (
106
+ <input
107
+ type={type}
108
+ className={cn(
109
+ // Base styles
110
+ 'flex w-full rounded-md border border-input bg-background px-3 py-2 text-sm ring-offset-background file:border-0 file:bg-transparent file:text-sm file:font-medium placeholder:text-muted-foreground focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring focus-visible:ring-offset-2 disabled:cursor-not-allowed disabled:opacity-50',
111
+
112
+ // Variant styles
113
+ {
114
+ 'border-input': variant === 'default' && !error,
115
+ 'border-destructive focus-visible:ring-destructive': variant === 'destructive' || error,
116
+ },
117
+
118
+ // Size styles
119
+ {
120
+ 'h-8 px-2 py-1 text-xs': size === 'sm',
121
+ 'h-9 px-3 py-2 text-sm': size === 'md',
122
+ 'h-10 px-4 py-3 text-base': size === 'lg',
123
+ },
124
+
125
+ className
126
+ )}
127
+ ref={ref}
128
+ {...props}
129
+ />
130
+ );
131
+ }
134
132
 
135
133
  Input.displayName = 'Input';
136
134
 
@@ -68,7 +68,7 @@
68
68
  *
69
69
  * @dependencies
70
70
  * - @radix-ui/react-label - Core label functionality
71
- * - React 18+ - Hooks and refs
71
+ * - React 19+ - Hooks and refs
72
72
  * - Tailwind CSS - Styling
73
73
  */
74
74
 
@@ -52,7 +52,7 @@
52
52
  * - Efficient rendering
53
53
  *
54
54
  * @dependencies
55
- * - React 18+ - Component framework
55
+ * - React 19+ - Component framework
56
56
  * - Tailwind CSS - Styling and animations
57
57
  */
58
58